diff --git a/seed/release/eole-2.7.yml b/seed/release/eole-2.7.yml new file mode 100644 index 0000000000000000000000000000000000000000..a8666ad104cdcd79291211691b9eda9ffc5922b9 --- /dev/null +++ b/seed/release/eole-2.7.yml @@ -0,0 +1,5 @@ +VersionName: "2.7" +VersionDistribution: EOLE +VersionLabel: "EOLE 2.7" +Release: + - ReleaseName: "2.7.1" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/creole_funcs/cron_schedule.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/creole_funcs/cron_schedule.py new file mode 100644 index 0000000000000000000000000000000000000000..3d8a736b870ce0ff2c98acfedfb7cfcec152b7c4 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/creole_funcs/cron_schedule.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- + +def interval_to_cron_schedule(interval): + """Return cron scheduling information given an interval. + :param interval: interval between two execution of a command + :type interval: int + """ + from random import randint, choice + interval = int(interval) + cron_schedule = "{minutes} {hours} {days} {months} {weekdays}" + minutes = randint(0, 59) + hours = "*" + days = '*' + months = '*' + weekdays = '0-7' + if interval < 24 and interval > 1: + hours = '*/{}'.format(interval) + elif interval == 24: + hours = choice([i for i in range(0, 24) if i not in range(6, 19)]) + elif interval > 24: + hours = choice([i for i in range(0, 24) if i not in range(6, 19)]) + days = '*/{}'.format(interval/24) + cron_schedule = cron_schedule.format(minutes=minutes, + hours=hours, + days=days, + months=months, + weekdays=weekdays) + return cron_schedule diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/dictionaries/25_smb_ad.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/dictionaries/25_smb_ad.xml new file mode 100644 index 0000000000000000000000000000000000000000..ba90a46ba9ed0b77b18dad8390a73ad272f1f95d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/dictionaries/25_smb_ad.xml @@ -0,0 +1,622 @@ +<?xml version="1.0" encoding="utf-8"?> +<creole> + + <files> + <file filelist='ad-files' name='/etc/logrotate.d/samba' + source='samba.logrotate'/> + <file filelist='ad-recycle-files' name='/etc/samba/recycle.conf' rm='True'/> + <file filelist='ad_share_clamscan' name='/etc/eole/avscan.d/samba.yaml' source='avscan-samba.yaml' mkdir='True' rm='True'/> + <file filelist='ad-files' name='/etc/samba/smb.conf' + source='smb-ad.conf' mkdir='True' rm='True'/> + <file filelist='ad-files' name='/etc/eole/samba4-vars.conf' + rm='True'/> + <file filelist='ad-files' name='/etc/krb5.conf' mkdir='True' rm='True'/> + <file filelist='ad-dc-files' name='/var/lib/samba/private/krb5.conf' mkdir='True' rm='True'/> + <file filelist='ad-dc-files' name='/usr/share/samba/setup/krb5.conf' mkdir='True' rm='True'/> + <file filelist='ad-files' + name='/usr/share/eole/bastion/data/90-samba_dynamic_rules' + mode='0755' + rm='True'/> + <file name='/etc/nsswitch.conf'/> + <file filelist='bind9' name='/etc/bind/named.conf' rm='True'/> + <file filelist='bind9' name='/etc/bind/named.conf.options' rm='True'/> + <file name='/etc/apparmor.d/local/usr.sbin.named' source='named.apparmor.conf'/> + <service servicelist='samba' >samba-ad-dc</service> + <service servicelist='samba-membre' >smbd</service> + <service servicelist='samba-membre' >nmbd</service> + <service servicelist='samba-membre' >winbind</service> + <service_restriction service='sshd'> + <ip interface='auto' netmask='255.255.255.255' ip_type='SymLinkOption'>ad_additional_dc_ip</ip> + </service_restriction> + <service servicelist='bind9'>bind9</service> + </files> + + <variables> + + <family name='Interface-0'> + <variable name='eth0_method' hidden='True' redefine='True'/> + <!-- + <variable name='adresse_ip_eth0' auto_freeze='True' redefine='True'/> + <variable name='adresse_netmask_eth0' auto_freeze='True' redefine='True'/> + --> + </family> + + <family name='général'> + <variable name='nom_machine' auto_freeze='True' redefine='True'/> + <variable name='nom_domaine_local' auto_freeze='True' redefine='True'/> + </family> + + <family name='services'> + <variable name='activer_ad_smb' type='oui/non' description='Activer Samba Active Directory' hidden='True'> + <value>oui</value> + </variable> + <variable name='activer_clam' redefine='True'> + <value>non</value> + </variable> + + </family> + + <family name='Active Directory' icon='group'> + + <!-- Rôle du serveur --> + + <variable name='ad_server_netbios_name' type='netbios' description="Nom NetBIOS du serveur" auto_freeze='True' mandatory='True'/> + + <variable name="ad_realm" type="domain_strict" description="Nom complet du domaine racine de la forêt" + mandatory='True'/> + + <variable name="ad_domain" type="string" description="Nom du domaine" + mandatory="True" /> + + <variable name="ad_server_role" type="string" + description="Rôle du serveur" + auto_freeze="True"> + <value>controleur de domaine</value> + </variable> + + <variable name="ad_additional_dc" type="oui/non" + description="Définir le contrôleur de domaine comme additionnel" mode="basic" > + <value>non</value> + </variable> + + <variable name='ad_force_domain_sid' type='oui/non' description="Imposer le SID du domaine AD à son initialisation" auto_freeze='True'> + <value>non</value> + </variable> + <variable name="ad_domain_sid" type="string" description='SID du domaine AD' auto_freeze='True' mandatory='True'/> + + <variable name="ad_ro_dc" type="oui/non" mode="expert" auto_freeze='True' description="Paramétrer le contrôleur de domaine en lecture seule (RODC)"> + <value>non</value> + </variable> + + <variable name="ad_additional_dc_force_site" type="oui/non" description="Forcer le positionnement de ce contrôleur de domaine dans un site existant" auto_freeze='True'> + <value>non</value> + </variable> + <variable name="ad_additional_dc_site" type="string" description="Site de destination de ce contrôleur de domaine" mandatory='True' auto_freeze='True'/> + + <variable name='ad_idmap_config_auto' type='oui/non' description='Utiliser la méthode par défaut de calcul des uid-gid' mode='expert'> + <value>oui</value> + </variable> + <variable name='ad_idmap_config_domain' type='string' description='Domaine cible' mode='expert' multi='True' mandatory='True'/> + <variable name='ad_idmap_config_backend' type='string' description='Méthode de calcul des uid-gid' mode='expert' mandatory='True'/> + <variable name='ad_idmap_config_low' type='number' description='Limite basse de la plage d’id' mode='expert' mandatory='True'/> + <variable name='ad_idmap_config_high' type='number' description='Limite haute de la plage d’id' mode='expert' mandatory='True'/> + <variable name='ad_idmap_config_tdb_low' type='number' description='Limite basse de la plage d’id pour le backend tdb' mode='expert' mandatory='True'/> + <variable name='ad_idmap_config_tdb_high' type='number' description='Limite haute de la plage d’id pour le backend tdb' mode='expert' mandatory='True'/> + + <!-- Services --> + <variable name='ad_internal_dns_backend' type='oui/non' description='Utiliser le service DNS interne de Samba' mode='expert'> + <value>oui</value> + </variable> + <variable name='ad_allow_transfer_network' type='network' description='Réseau autorisé à transférer la zone' mode='expert' multi='True'/> + <variable name='ad_allow_transfer_netmask' type='netmask' description='Masque du réseau' mode='expert' multi='True'/> + + <!-- Gestion des empreintes python --> + <variable name='ad_hash_sha_256' type='oui/non' description='Générer une empreinte de mot de passe de type SHA256' mode='expert'> + <value>non</value> + </variable> + <variable name='ad_hash_sha_256_rounds' type='number' description='Nombre d’itération de la fonction de hash' mode='expert'/> + <variable name='ad_hash_sha_512' type='oui/non' description='Générer une empreinte de mot de passe de type SHA512' mode='expert'> + <value>non</value> + </variable> + <variable name='ad_hash_sha_512_rounds' type='number' description='Nombre d’itération de la fonction de hash' mode='expert'/> + <!-- Environnement --> + + <variable name='ad_additional_dc_ip' type='ip' + description="Adresse IP des contrôleurs de domaine en relation avec ce contrôleur de domaine Active Directory" + multi='True'> + </variable> + <variable name='ad_additional_dc_kdc' type='oui/non' description='Le contrôleur a le rôle de kdc'> + <value>oui</value> + </variable> + <variable name='ad_additional_dc_dns' type='oui/non' description='Le contrôleur a le rôle de DNS'> + <value>oui</value> + </variable> + <variable name='ad_dc_sysvol_ref' type='ip' + description="Adresse IP du contrôleur de référence pour le volume SYSVOL" /> + <variable name='ad_dc_sysvol_type' type="string" + description="Type du contrôleur de référence pour le volume SYSVOL" mode='expert' > + <value>seth</value> + </variable> + <variable name='ad_dc_sysvol_post_join_cmd' type="filename" + description="Script distant à exécuter après la jonction sur le contrôleur de référence" mode='expert' > + </variable> + + <variable name='ad_filter_network' type='oui/non' description='Restreindre aux adresses réseau renseignées les accès aux services du serveur' mode='expert'> + <value>non</value> + </variable> + <variable name='ad_peer_ip' type='ip' description='Adresses IP autorisées à se connecter aux services de l’AD' mandatory='True' multi='True' mode='expert' /> + <variable name='ad_peer_netmask' type='netmask' description='Masque de sous-réseau' mandatory='True' mode='expert' /> + + <variable name='ad_ldap_clients_ip' type='ip' description='Adresses IP autorisées à se connecter uniquement au service LDAP' multi='True' mode='expert'/> + <variable name='ad_ldap_clients_netmask' type='netmask' description='Masque de sous-réseau' mode='expert'/> + + <variable name='autoriser_netbios_ports' type='oui/non' description='Autoriser la connexion pour les protocoles NetBIOS' mode='expert' > + <value>non</value> + </variable> + + <variable name='ad_custom_rpc_port' type='number' description='Port personnalisé pour RPC' mode='expert'/> + <variable name='ad_custom_netlogon_port' type='number' description='Port personnalisé pour NetLogon' mode='expert'/> + + <!-- Partages --> + + <variable name='ad_recycle_bin' type='oui/non' description='Charger le module recycle pour la prise en charge des corbeilles' mode='expert'> + <value>non</value> + </variable> + <variable name='ad_recycle_bin_dir' type='filename' description='Nom du répertoire corbeille' mode='expert'> + <value>.corbeille</value> + </variable> + <variable name='ad_recycle_bin_purge' type='number' description='Durée de conservation des fichiers dans la corbeille' mode='expert' mandatory='True'> + <value>8</value> + </variable> + + <variable name="activer_ad_homes_share" type="oui/non" description='Créer localement le partage "homes" ("\\serveur\< login>)' mode="basic"> + <value>oui</value> + </variable> + <variable name='ad_homes_share_host' type='hostname' description='Nom de l’hôte hébergeant les répertoires utilisateurs'/> + <variable name='ad_home_share_path' type='filename' + description="Chemin des répertoires personnels des utilisateurs" mode='expert'> + <value>/home/adhomes</value> + </variable> + <variable name='ad_homes_share_recycle' type='oui/non' description='Activer la corbeille pour le partage "homes"' mode='expert'> + <value>non</value> + </variable> + + <variable name="activer_ad_profiles_share" type="oui/non" description='Créer localement le partage "profiles" ("\\serveur\profiles")' mode="basic"> + <value>oui</value> + </variable> + <variable name='ad_profiles_share_host' type='hostname' description='Nom de l’hôte hébergeant les profils utilisateurs'/> + <variable name='ad_profile_share_path' type='filename' + description="Chemin des répertoires contenant les profils des utilisateurs" mode='expert'> + <value>/home/adprofiles</value> + </variable> + + <variable name='ad_additional_share' type='oui/non' description='Configurer des répertoires partagés' mode='expert'> + <value>non</value> + </variable> + <variable name='ad_additional_share_name' type='string' description='Nom du répertoire partagé' mandatory='True' mode='expert' multi='True'/> + <variable name='ad_additional_share_path' type='string' description='Chemin du partage' mandatory='True' mode='expert'/> + <variable name='ad_additional_share_comment' type='string' description='Description du partage' mode='expert'/> + <variable name='ad_additional_share_writeable' type='oui/non' description='Le partage peut être écrit' mode='expert'> + <value>non</value> + </variable> + <variable name='ad_additional_share_browseable' type='oui/non' description='Le partage peut être parcouru' mode='expert'> + <value>non</value> + </variable> + <variable name='ad_additional_share_create_mask' type='string' description='Masque de permissions pour les fichiers' mode='expert'/> + <variable name='ad_additional_share_directory_mask' type='string' description='Masque de permissions pour les répertoires' mode='expert'/> + <variable name='ad_additional_share_recycle' type='oui/non' description='Activer la corbeille pour le partage' mode='expert'> + <value>non</value> + </variable> + + <variable name='activer_ad_share_scan' type='oui/non' description='Activer l’analyse antivirale des répertoires partagés' mode='expert'> + <value>non</value> + </variable> + <variable name='ad_share_scan_when' type='string' description="Périodicité de l'analyse (Lancement tous les ...)" mode='expert'> + <value>jours</value> + </variable> + <variable name='ad_share_scan_hour' type='string' description="Heure du lancement (format HH:MM)" mode='expert'> + <value>1:00</value> + </variable> + <variable name='ad_share_scan_min' type='number' description="Minute du lancement" mode='expert'> + <value>10</value> + </variable> + <variable name='ad_share_scan_week_day' type='string' description="Jour du lancement" mode='expert'> + <value>samedi</value> + </variable> + <variable name='ad_share_scan_monthday' type='number' description="Numéro du jour du lancement dans le mois" mode='expert'> + <value>1</value> + </variable> + <variable name='ad_share_scan_when_custom' type='string' description="Configuration brute format CRONTAB" mode='expert' mandatory='True'/> + + <!-- Options de journalisation --> + <variable name='ad_log_global_level' type='number' description='Niveau de journalisation global' mode='expert'> + <value>0</value> + </variable> + <variable name='ad_log_specific_event' type='string' description='Catégorie d’événements à journaliser' mode='expert' multi='True'/> + <variable name='ad_log_specific_level' type='number' description='Niveau de journalisation de la catégorie d’événements' mode='expert' multi='True'/> + + <!-- Options avancées --> + <variable name='ad_backend_store' type='string' description='Format de la base interne de Samba' mode='expert' auto_freeze='True'> + <value>tdb</value> + </variable> + <variable name='ad_plaintext_secrets' type='oui/non' description='Désactiver le chiffrement des mots de passe' mode='expert' auto_freeze='True'> + <value>non</value> + </variable> + + </family> + + <separators> + <separator name='ad_server_role'>Rôle du serveur Active Directory</separator> + <separator name='ad_internal_dns_backend'>Gestion des services de Samba</separator> + <separator name='ad_additional_dc_ip'>Environnement réseau</separator> + <separator name='ad_recycle_bin'>Partages</separator> + <separator name='ad_log_global_level'>Options de journalisation</separator> + <separator name='ad_backend_store'>Options avancées</separator> + </separators> + + </variables> + + <constraints> + + <fill name='calc_val' target='ad_server_netbios_name'> + <param type='eole'>nom_machine</param> + </fill> + + <!-- + par défaut, le realm est initialisé avec le nom de domaine local de l'onglet général + --> + <auto name='calc_val' target='ad_realm'> + <param type='eole' name='valeur'>nom_domaine_local</param> + </auto> + + <auto name='extract_ad_domain_from_realm' target='ad_domain'> + <param type='eole' name='realm'>ad_realm</param> + </auto> + + <check name="valid_enum" target="ad_server_role"> + <param>["controleur de domaine", "membre"]</param> + </check> + + <check name="valid_enum" target="ad_dc_sysvol_type"> + <param>["seth", "samba", "windows" ]</param> + </check> + + <check name='valid_enum' target='ad_idmap_config_backend'> + <param>['rid', 'autorid', 'ad', 'ldap', 'tdb', 'nss']</param> + </check> + + <check name='valid_enum' target='ad_backend_store'> + <param>['tdb', 'mdb']</param> + </check> + + <check name='valid_regexp' target='ad_home_share_path'> + <param>^/</param> + <param name='err_msg'>Le chemin doit être absolu</param> + </check> + + <check name='valid_regexp' target='ad_profile_share_path'> + <param>^/</param> + <param name='err_msg'>Le chemin doit être absolu</param> + </check> + + <condition name='disabled_if_in' source='ad_filter_network'> + <param>non</param> + <target type='variable'>ad_peer_ip</target> + <target type='variable'>ad_ldap_clients_ip</target> + </condition> + <group master='ad_peer_ip'> + <slave>ad_peer_netmask</slave> + </group> + <group master='ad_additional_dc_ip'> + <slave>ad_additional_dc_kdc</slave> + <slave>ad_additional_dc_dns</slave> + </group> + + <condition name='disabled_if_not_in' source='ad_hash_sha_256'> + <param>oui</param> + <target type='variable'>ad_hash_sha_256_rounds</target> + </condition> + <condition name='disabled_if_not_in' source='ad_hash_sha_512'> + <param>oui</param> + <target type='variable'>ad_hash_sha_512_rounds</target> + </condition> + + <check name='valid_entier' target='ad_hash_sha_256_rounds'> + <param name="mini">1000</param> + <param name="maxi">999999999</param> + </check> + <check name='valid_entier' target='ad_hash_sha_512_rounds'> + <param name="mini">1000</param> + <param name="maxi">999999999</param> + </check> + <check name='valid_networknetmask' target='ad_peer_netmask'> + <param type='eole'>ad_peer_ip</param> + </check> + + <group master='ad_ldap_clients_ip'> + <slave>ad_ldap_clients_netmask</slave> + </group> + + <check name='valid_networknetmask' target='ad_ldap_clients_netmask'> + <param type='eole'>ad_ldap_clients_ip</param> + </check> + + <group master='ad_additional_share_name'> + <slave>ad_additional_share_path</slave> + <slave>ad_additional_share_comment</slave> + <slave>ad_additional_share_browseable</slave> + <slave>ad_additional_share_writeable</slave> + <slave>ad_additional_share_create_mask</slave> + <slave>ad_additional_share_directory_mask</slave> + <slave>ad_additional_share_recycle</slave> + </group> + + <condition name='disabled_if_in' source='activer_clam' fallback='True'> + <param>non</param> + <target type='variable'>activer_ad_share_scan</target> + </condition> + + <condition name='disabled_if_in' source='activer_ad_share_scan'> + <param>non</param> + <target type='filelist'>ad_share_clamscan</target> + <target type='variable'>ad_share_scan_when</target> + <target type='variable'>ad_share_scan_hour</target> + <target type='variable'>ad_share_scan_min</target> + <target type='variable'>ad_share_scan_week_day</target> + <target type='variable'>ad_share_scan_monthday</target> + <target type='variable'>ad_share_scan_when_custom</target> + </condition> + <check name='valid_enum' target='ad_share_scan_when'> + <param>['heures','jours', 'semaines', 'mois', 'personnalisé']</param> + </check> + <condition name='disabled_if_in' source='ad_share_scan_when'> + <param>personnalisé</param> + <target>ad_share_scan_hour</target> + <target>ad_share_scan_min</target> + <target>ad_share_scan_week_day</target> + <target>ad_share_scan_monthday</target> + </condition> + <condition name='disabled_if_in' source='ad_share_scan_when'> + <param>heures</param> + <target>ad_share_scan_hour</target> + <target>ad_share_scan_week_day</target> + <target>ad_share_scan_monthday</target> + <target>ad_share_scan_when_custom</target> + </condition> + <condition name='disabled_if_in' source='ad_share_scan_when'> + <param>jours</param> + <target>ad_share_scan_week_day</target> + <target>ad_share_scan_min</target> + <target>ad_share_scan_monthday</target> + <target>ad_share_scan_when_custom</target> + </condition> + <condition name='disabled_if_in' source='ad_share_scan_when'> + <param>semaines</param> + <target>ad_share_scan_min</target> + <target>ad_share_scan_monthday</target> + <target>ad_share_scan_when_custom</target> + </condition> + <condition name='disabled_if_in' source='ad_share_scan_when'> + <param>mois</param> + <target>ad_share_scan_week_day</target> + <target>ad_share_scan_min</target> + <target>ad_share_scan_when_custom</target> + </condition> + <check name='valid_regexp' target='ad_share_scan_when_custom'> + <param>^\s*((((\*/[0-9]+)|([0-9]+-[0-9]+/[0-9]+)|([0-9]+-[0-9]+)|([0-9]+(,[0-9]+)*)|(\*))(\s+(((\*/[0-9]+)|([0-9]+-[0-9]+/[0-9]+)|([0-9]+-[0-9]+)|([0-9]+(,[0-9]+)*)|(\*)))){4})|(@(reboot)|(yearly)|(annually)|(monthly)|(weekly)|(daily)|(midnight)|(hourly)))$</param> + <param name='err_msg'>La programmation ne respecte pas le format accepté par cron</param> + </check> + + <group master='ad_idmap_config_domain'> + <slave>ad_idmap_config_backend</slave> + <slave>ad_idmap_config_low</slave> + <slave>ad_idmap_config_high</slave> + </group> + + <group master='ad_allow_transfer_network'> + <slave>ad_allow_transfer_netmask</slave> + </group> + + <condition name='disabled_if_in' source='activer_ad_smb'> + <param>non</param> + <target type='filelist'>ad-files</target> + <target type='filelist'>ad-dc-files</target> + <target type='servicelist'>samba</target> + <target type='family'>Active Directory</target> + </condition> + + <!-- + Si serveur est n'est pas un DC alors les options additionnel (dc, ip, rodc, site) doivent être cachée. + --> + <condition name='disabled_if_not_in' source='ad_server_role'> + <param>controleur de domaine</param> + <target type='filelist'>ad-dc-files</target> + <target type='variable'>ad_additional_dc</target> + <target type='variable'>ad_additional_dc_ip</target> + </condition> + + <condition name='disabled_if_in' source='ad_server_role'> + <param>membre</param> + <target type='servicelist'>samba</target> + <target type='variable'>ad_internal_dns_backend</target> + <target type='variable'>ad_backend_store</target> + <target type='variable'>ad_plaintext_secrets</target> + </condition> + + <condition name='disabled_if_in' source='ad_server_role'> + <param>controleur de domaine</param> + <target type='servicelist'>samba-membre</target> + <target type='variable'>ad_idmap_config_auto</target> + </condition> + + <condition name='disabled_if_in' source='ad_idmap_config_auto'> + <param>oui</param> + <target type='variable'>ad_idmap_config_domain</target> + <target type='variable'>ad_idmap_config_tdb_low</target> + <target type='variable'>ad_idmap_config_tdb_high</target> + </condition> + + <condition name='disabled_if_in' source='ad_internal_dns_backend'> + <param>oui</param> + <target type='variable'>ad_allow_transfer_network</target> + </condition> + + <fill name='extract_ad_domain_from_realm' target='ad_idmap_config_domain'> + <param type='eole' name='realm'>ad_realm</param> + </fill> + <check name='valid_enum' target='ad_idmap_config_backend'> + <param>['rid', 'autorid', 'ad', 'ldap', 'tdb', 'nss']</param> + </check> + + <!-- + Si serveur additionnel alors on doit saisir un serveur de référence pour Sysvol. + Il est nécessaire de connaitre le type de serveur distant + --> + <condition name='disabled_if_in' source="ad_additional_dc"> + <param>non</param> + <target type='variable'>ad_dc_sysvol_ref</target> + <target type='variable'>ad_dc_sysvol_type</target> + <target type='variable'>ad_additional_dc_force_site</target> + <target type='variable'>ad_ro_dc</target> + </condition> + + <condition name='disabled_if_in' source="ad_additional_dc"> + <param>oui</param> + <target type='variable'>ad_force_domain_sid</target> + </condition> + + <condition name='disabled_if_in' source='ad_force_domain_sid'> + <param>non</param> + <target type='variable'>ad_domain_sid</target> + </condition> + + <condition name='disabled_if_in' source='ad_internal_dns_backend'> + <param>oui</param> + <target type='servicelist'>bind9</target> + <target type='filelist'>bind9</target> + </condition> + + <condition name='disabled_if_in' source="ad_additional_dc_force_site"> + <param>non</param> + <target type='variable'>ad_additional_dc_site</target> + </condition> + <fill name='calc_val' target='ad_additional_dc_site'> + <param type='eole' name='valeur'>libelle_etab</param> + </fill> + + <!-- + Si serveur additionnel et de type 'samba' (non eole) alors l'admin peut saisir une commande à executer sur le DC de référence (ad_dc_sysvol_post_join_cmd) + --> + <condition name='disabled_if_not_in' source="ad_dc_sysvol_type"> + <param>samba</param> + <target type='variable'>ad_dc_sysvol_post_join_cmd</target> + </condition> + + <fill name='calc_multi_condition' target='global_adresse_ip_dns_dhcp'> + <param>membre</param> + <param type="eole" name="condition_1" optional="True">ad_server_role</param> + <param name='default_match'>None</param> + <param type='eole' name='mismatch'>adresse_ip_eth0</param> + </fill> + + <condition name='disabled_if_in' source='activer_ad_homes_share' fallback='True'> + <param>non</param> + <target type='variable'>ad_home_share_path</target> + <target type='variable'>ad_homes_share_recycle</target> + </condition> + <condition name='disabled_if_in' source='activer_ad_homes_share'> + <param>oui</param> + <target type='variable'>ad_homes_share_host</target> + </condition> + + <condition name='disabled_if_in' source='activer_ad_profiles_share' fallback='True'> + <param>non</param> + <target type='variable'>ad_profile_share_path</target> + </condition> + <condition name='disabled_if_in' source='activer_ad_profiles_share'> + <param>oui</param> + <target type='variable'>ad_profiles_share_host</target> + </condition> + + <condition name='disabled_if_in' source='ad_additional_share' fallback='True'> + <param>non</param> + <target type='variable'>ad_additional_share_name</target> + </condition> + + <condition name='disabled_if_in' source='ad_recycle_bin'> + <param>non</param> + <target type='filelist'>ad-recycle-files</target> + <target type='variable'>ad_recycle_bin_dir</target> + <target type='variable'>ad_recycle_bin_purge</target> + <target type='variable'>ad_homes_share_recycle</target> + <target type='variable'>ad_additional_share_recycle</target> + </condition> + + <check name='valid_entier' target='ad_log_global_level'> + <param name='mini'>0</param> + <param name='maxi'>9</param> + </check> + <check name='valid_enum' target='ad_log_specific_event'> + <param>['all','tdb','printdrivers','lanman','smb','smb2','mb2_credits','rpc_parse','rpc_srv','rpc_cli','passdb','sam','auth','winbind','vfs','idmap','quota','acls','locking','msdfs','dmapi','registry','scavenger','dns','ldb','tevent','auth_audit','auth_json_audit','kerberos','dsdb_json_audit','dsdb_password_json_audit','dsdb_transaction_audit','dsdb_transaction_json_audit']</param> + </check> + <check name='valid_entier' target='ad_log_specific_level'> + <param name='mini'>0</param> + <param name='maxi'>9</param> + </check> + <group master='ad_log_specific_event'> + <slave>ad_log_specific_level</slave> + </group> + + </constraints> + + <help> + <family name='Active Directory'>Configuration du serveur Active Directory</family> + <variable name='activer_ad_smb'>Faire de votre serveur un contrôleur de domaine ou un membre d'un domaine Active Directory</variable> + <variable name="ad_realm">Nom complètement qualifié de la racine de la forêt Active Directory</variable> + <variable name="ad_domain">Nom du domaine Active Directory</variable> + <variable name="ad_server_netbios_name">Le nom NetBIOS est de type alphanumérique, excepté le premier caractère qui doit être de type alphabétique. Il doit comprendre entre 2 et 15 caractères</variable> + <variable name="ad_server_role">Rôle du serveur (contrôleur de domain, serveur membre)</variable> + <variable name="ad_additional_dc">Le serveur est un contrôleur de domaine qui sera joint à un domaine existant</variable> + <variable name='ad_additional_dc_ip'>Selon la topologie de l'architecture AD, citer un ou deux contrôleurs de domaine qui auront des relations privilégiées avec ce contrôleur dans le cadre de la résolution DNS, du fonctionnent Kerberos et de la réplication AD.</variable> + <variable name='ad_additional_dc_kdc'>Si le contrôleur identifié par l’adresse IP joue le rôle de serveur d’authentification, il servira dans le configuration de Kerberos.</variable> + <variable name='ad_additional_dc_dns'>Si le contrôleur identifié par l’adresse IP joue le rôle de serveur DNS, il servira dans le configuration du service DNS.</variable> + <variable name='ad_internal_dns_backend'>Utiliser le service interne de résolution de nom. Utiliser BIND sinon.</variable> + <variable name='ad_allow_transfer_network'>Renseigner des IP ou sous-réseaux pour restreindre les machines autorisées à demander un transfert de zone auprès du serveur DNS BIND.</variable> + <variable name='ad_additional_dc_force_site'>Forcer le positionnement dans un site Active Directory déclaré au préalable dans le contrôleur de domaine principal</variable> + <variable name='ad_additional_dc_site'>Si cette variable est renseignée, alors ce contrôleur de domain sera placé dans le site correspondant. Ce site doit exister dans l'AD.</variable> + <variable name='ad_filter_network'>Passer à oui pour permettre l’accès aux services AD aux seules IP déclarées (sinon, l’accès aux services AD n’est pas restreint).</variable> + <variable name='ad_peer_ip'>Adresses réseau identifiant les clients et serveurs autorisées à se connecter aux services principaux de l’AD (LDAP excepté).</variable> + <variable name='ad_ldap_clients_ip'>Le service LDAP peut être accessible à des postes autres que les serveurs et postes clients du domaine. Leur adresse IP est nécessaire pour ouvrir le pare-feu.</variable> + <variable name='ad_custom_rpc_port'>Si aucun port n’est spécifié, le premier port libre de la plage 1024-5000 est utilisé.</variable> + <variable name='ad_custom_netlogon_port'>Si aucun port n’est spécifié, le premier port libre de la plage 1024-5000 est utilisé.</variable> + <variable name='ad_dc_sysvol_ref'>Adresse IP d’un contrôleur de domaine utilisé comme référence SYSVOL</variable> + <variable name='ad_dc_sysvol_type'>Type de contrôleur de domaine utilisé comme référence SYSVOL</variable> + <variable name='ad_dc_sysvol_post_join_cmd'>Saisir le chemin complet du script 'distant' à exécuter aprés la jonction sur le DC de référence</variable> + <variable name='ad_idmap_config_auto'>Utiliser la configuration par défaut du calcul des identifiants à partir du rid (idmap config *:backend = autorid)</variable> + <variable name='ad_idmap_config_domain'>Domaine pour lequel configurer la méthode de calcul des identifiants</variable> + <variable name='ad_idmap_config_backend'>Méthode de calcul des identifiants</variable> + <variable name='ad_idmap_config_low'>Limite basse de la plage des ID réservés pour le domaine</variable> + <variable name='ad_idmap_config_high'>Limite haute de la plage des ID réservés pour le domaine</variable> + <variable name='ad_idmap_config_tdb_low'>Limite basse de la plage des ID réservés pour le backend idmap tdb</variable> + <variable name='ad_idmap_config_tdb_high'>Limite haute de la plage des ID réservés pour le backend idmap tdb</variable> + <variable name='ad_force_domain_sid'>Forcer le SID est utile dans le cas d’une migration Samba NT vers AD</variable> + <variable name='ad_domain_sid'>Dans le cas d'une migration Samba NT, cette valeur permet d'initialiser l'AD avec le SID choisi</variable> + <variable name='ad_home_share_path'>Répertoire de destination des dossiers personnels des utilisateurs de l'AD</variable> + <variable name="activer_ad_homes_share">Créer le partage hébergeant les dossiers personnels (Home Directory) des utilisateurs</variable> + <variable name="activer_ad_profiles_share">Créer les partages hébergeant le dossiers contenant les profils Windows (Profile Path) des utilisateurs</variable> + <variable name="ad_recycle_bin">Charger le module VFS recycle pour permettre d’utiliser les fonctionnalités de corbeilles dans les partages (activées au cas par cas)</variable> + <variable name='activer_ad_share_scan'>L’activation de l’analyse antivirale des répertoires partagés configure ClamAV pour l’analyse programmée de tous les répertoires partagés par Samba.</variable> + <variable name='ad_share_scan_when'>Périodicité de l’analyse anti-virus des répertoires partagés (horaire, quotidien, hebdomadaire, mensuel, personnalisée)</variable> + <variable name='ad_share_scan_hour'>Heure de début de l’analyse anti-virus des répertoires partagés au format H:MM</variable> + <variable name='ad_share_scan_min'>Minute de début des analyses anti-virus des répertoires partagés</variable> + <variable name='ad_share_scan_week_day'>Jour de la semaine pendant lequel l'analyse anti-virus des répertoires partagés doit être lancée</variable> + <variable name='ad_share_scan_monthday'>Jour du mois pendant lequel l'analyse anti-virus des répertoires partagés doit être lancée</variable> + <variable name='ad_share_scan_when_custom'>Configuration crontab brute (attention si la configuration n'est pas valide la ligne ne sera pas écrite)</variable> + <variable name='ad_hash_sha_256'>Les empreintes seront générées après le prochain changement de mot de passe</variable> + <variable name='ad_hash_sha_512'>Les empreintes seront générées après le prochain changement de mot de passe</variable> + <variable name='ad_backend_store'>Le backend TDB est le format par défaut de Samba. Le backend MDB est expérimental mais permet de gérer plus d'objets dans l’AD</variable> + <variable name='ad_plaintext_secrets'>Les attributs sensibles doivent être chiffrés. Cependant, certains outils externes (synchronisation) nécessitent des mots de passe en clair.</variable> + + </help> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/dictionaries/30_samba_backup.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/dictionaries/30_samba_backup.xml new file mode 100644 index 0000000000000000000000000000000000000000..f85d4422a677bce2db62895d167ef9966ee86951 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/dictionaries/30_samba_backup.xml @@ -0,0 +1,88 @@ +<?xml version="1.0" encoding="utf-8"?> +<creole> + <files> + <file filelist='samba-backup' name='/etc/samba/samba_backup.conf' rm='True'/> + <file name='/etc/bareos/bareosfichiers.d/samba.conf' source='bareos-samba.conf' filelist='samba-backup-bareos' mkdir='True' rm='True'/> + + <file filelist='samba-backup-standalone' name='/etc/cron.d/samba-backup' source='samba-backup.cron' rm='True'/> + </files> + <variables> + <family name='Active Directory' icon='group'> + <variable name='activer_samba_backup' type='oui/non' description='Archiver les données du DC'/> + <variable name='ad_backup_disable' type='oui/non' description='Variable intermédiaire pour l’activation des sauvegardes des données du DC'/> + <variable name='samba_backup_bareos' type='oui/non' description='Sauvegarder les archives avec Bareos'> + <value>oui</value> + </variable> + <variable name='calc_samba_backup_bareos' type='oui/non' description='Valeur par défaut pour pallier l’absence de Bareos'/> + <variable name="samba_backup_dest_dir" type="filename" description="Destination de la sauvegarde" mandatory="True"> + <value>/home/backup/samba</value> + </variable> + <variable name="samba_backup_retention" type="number" mode="expert" description="Durée de rétention (jours)"> + <value>7</value> + </variable> + <variable name='samba_backup_interval' type='string' mode='expert' description='Intervalle de lancement de la sauvegarde (en heures)'> + <value>24</value> + </variable> + </family> + <separators> + <separator name='activer_samba_backup'>Archivage des données du contrôleur de domaine</separator> + </separators> + </variables> + <constraints> + <check name='valid_enum' target='samba_backup_interval'> + <param>['1', '2', '4', '8', '12', '24', '48']</param> + </check> + + <auto name='calc_val_first_value' target='ad_backup_disable'> + <param type='eole' optional='True' hidden='False'>ad_additional_dc</param> + <param>non</param> + </auto> + <condition name='disabled_if_in' source='ad_server_role'> + <param>membre</param> + <target type='variable'>ad_backup_disable</target> + </condition> + <condition name='disabled_if_in' source='ad_backup_disable'> + <param>oui</param> + <target>activer_samba_backup</target> + </condition> + + <condition name='disabled_if_in' source='activer_bareos_dir' fallback='True'> + <param>non</param> + <target type='variable'>samba_backup_bareos</target> + </condition> + <condition name='disabled_if_in' source='activer_samba_backup'> + <param>non</param> + <target type='filelist'>samba-backup</target> + <target type='filelist'>samba-backup-standalone</target> + <target type='filelist' optional='True'>samba-backup-bareos</target> + <target type='variable' optional='True'>samba_backup_bareos</target> + <target type='variable'>samba_backup_dest_dir</target> + <target type='variable'>samba_backup_retention</target> + <target type='variable'>samba_backup_interval</target> + </condition> + <fill name='calc_val_first_value' target='activer_samba_backup'> + <param type='eole' optional='True'>activer_bareos_dir</param> + <param>non</param> + </fill> + <auto name='calc_val_first_value' target='calc_samba_backup_bareos'> + <param type='eole' hidden='False'>samba_backup_bareos</param> + <param>non</param> + </auto> + <condition name='disabled_if_in' source='calc_samba_backup_bareos' fallback='True'> + <param>oui</param> + <target type='filelist'>samba-backup-standalone</target> + <target type='variable'>samba_backup_interval</target> + </condition> + <condition name='disabled_if_in' source='samba_backup_bareos' fallback='True'> + <param>non</param> + <target type='filelist'>samba-backup-bareos</target> + </condition> + </constraints> + <help> + <variable name='activer_samba_backup'>Activer l’archivage des données du service Samba dans un répertoire local.</variable> + <variable name='samba_backup_bareos'>Sauvegarder les archives grâce aux mécanismes Bareos (disponible uniquement si eole-bareos est installé et le service bareos-director activé).</variable> + <variable name='samba_backup_dest_dir'>Répertoire dans lequel les archives seront écrites (dossier créé automatiquement si nécessaire et ajouté à la sauvegarde Bareos si ce mode est utilisé)</variable> + <variable name="samba_backup_retention">Durée de conservation des archives en jours utilisé par le script de sauvegarde lui-même pour effacer les archives non modifiées depuis la durée indiquée.</variable> + <variable name='samba_backup_interval'>Intervalle de lancement de la sauvegarde en heures, l’heure et le jour du premier lancement étant déterminé aléatoirement dans la plage horaire nocturne pour les fréquences de l’ordre du jour.</variable> + </help> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/extra_dictionaries/schedule/01_samba.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/extra_dictionaries/schedule/01_samba.xml new file mode 100644 index 0000000000000000000000000000000000000000..b08b7126338bcfbd385172332763fdcdcc4c5b48 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/extra_dictionaries/schedule/01_samba.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + <variables> + <family name='samba_backup' description="Créer une archive de sauvegarde Samba"> + <variable name="description" type="string" hidden="True"><value>Créer une archive de sauvegarde Samba</value></variable> + <variable name="day" type="schedule" description="Périodicité d'exécution" mandatory="True"></variable> + <variable name="mode" type="schedulemod" hidden="True"><value>pre</value></variable> + </family> + </variables> + <constraints> + <fill name='calc_multi_condition' target='schedule.samba_backup.day'> + <param>oui</param> + <param type='eole' name='condition_1'>calc_samba_backup_bareos</param> + <param name='match'>daily</param> + <param name='mismatch'>none</param> + </fill> + </constraints> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/files/usr/lib/eole/iptablesLogger b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/files/usr/lib/eole/iptablesLogger new file mode 100644 index 0000000000000000000000000000000000000000..64c17acd5fcdeea30a04891011394381f0484d47 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/files/usr/lib/eole/iptablesLogger @@ -0,0 +1,44 @@ +#!/bin/sh + +iptables -N LOGGER + +iptables -I INPUT 1 -s 192.168.0.0/24 -j LOGGER + +iptables -I LOGGER -p tcp --dport 53 -j LOG --log-prefix="DNS :" +iptables -I LOGGER -p udp --dport 53 -j LOG --log-prefix="DNS: " + +iptables -I LOGGER -p udp --dport 67 -j LOG --log-prefix="DHCP: " + +iptables -I LOGGER -p tcp --dport 88 -j LOG --log-prefix="Kerberos: " +iptables -I LOGGER -p udp --dport 88 -j LOG --log-prefix="Kerberos: " + +iptables -I LOGGER -p tcp --dport 135 -j LOG --log-prefix="RPC: " + +iptables -I LOGGER -p udp --dport 137 -j LOG --log-prefix="NetBIOS: " + +iptables -I LOGGER -p udp --dport 138 -j LOG --log-prefix="Group Policy: " + +iptables -I LOGGER -p tcp --dport 139 -j LOG --log-prefix="NetLogon: " + +iptables -I LOGGER -p tcp --dport 389 -j LOG --log-prefix="LDAP: " +iptables -I LOGGER -p udp --dport 389 -j LOG --log-prefix="LDAP: " + +iptables -I LOGGER -p tcp --dport 445 -j LOG --log-prefix="SMB: " +iptables -I LOGGER -p udp --dport 445 -j LOG --log-prefix="SMB :" + +iptables -I LOGGER -p tcp --dport 464 -j LOG --log-prefix="Kerberos pswd: " +iptables -I LOGGER -p udp --dport 464 -j LOG --log-prefix="Kerberos pswd: " + +iptables -I LOGGER -p udp --dport 2535 -j LOG --log-prefix="DHCP: " + +iptables -I LOGGER -p tcp --dport 5722 -j LOG --log-prefix="SYSVOL: " + +iptables -I LOGGER -p tcp --dport 9389 -j LOG --log-prefix="SOAP: " + + +iptables -D eth0-root -j DROP +iptables -N LOGGER_DROP +iptables -I LOGGER_DROP -j DROP +iptables -I LOGGER_DROP -j LOG --log-prefix="DROPPED: " +iptables -A eth0-root -j LOGGER_DROP + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/files/usr/lib/eole/samba4.sh b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/files/usr/lib/eole/samba4.sh new file mode 100644 index 0000000000000000000000000000000000000000..bb67e7da5d839a30aebeee743b94c79481cbc219 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/files/usr/lib/eole/samba4.sh @@ -0,0 +1,686 @@ +#!/bin/bash +# -*- shell-script -*- + +# shellchek disable=SC1091 +. /usr/lib/eole/ihm.sh + +# +# affecte une valeur à la variable TEMP_PASSWORD +# + +function getValidPassword() +{ + local prompt="${1:-Saisie du mot de passe}" + local confirm="${2:-true}" + local password + local validated="False" + local confirm_password + + while [ ${validated} != "True" ] + do + read -r -s -p "${prompt} : " password + result=$(validSambaPassword "$password") + echo + + if [ "${result}" -ne 0 ] + then + validated="False" + else + break + fi + done + + if [ "${confirm}" = 'false' ];then + TEMP_PASSWORD="${password}" + return 0 + fi + + read -r -s -p "Confirmation du mot de passe : " confirm_password + echo + + if [ "${confirm_password}" = "${password}" ] + then + TEMP_PASSWORD=$password + return 0 + else + echo "Les mots de passe ne correspondent pas." + echo "Veuillez recommencer" + getValidPassword "$1" + fi +} + +# +# genere une clef SSH si elle manque +# +function check_ssh_key() +{ + [ ! -d /root/.ssh ] && mkdir -p /root/.ssh + + if [ ! -f /root/.ssh/id_rsa ] + then + echo "Generation de la clef SSH pour les echanges entre DC" + ssh-keygen -b 2048 -t rsa -f /root/.ssh/id_rsa -q -N "" + fi +} + +# +# Echange la clef SSH root DC1/DC2 +# +function echange_ssh_key() +{ + retval=0 + if [ -n "${AD_DC_SYSVOL_REF}" ] + then + if [ "${AD_DC_SYSVOL_TYPE}" = "windows" ] + then + echo "Le DC ${AD_DC_SYSVOL_REF} est déclaré comme 'windows', donc pas d'échange SSH !" + else + echo "Envoi de la clef SSH ${AD_HOST_NAME} vers le DC ${AD_DC_SYSVOL_REF}" + ssh-copy-id "root@${AD_DC_SYSVOL_REF}" || retval=$? + if [ $retval -ne 0 ] + then + return $retval + fi + scp "root@${AD_DC_SYSVOL_REF}:/root/.ssh/id_rsa.pub" /tmp/id_rsa.pub + cat /tmp/id_rsa.pub >> /root/.ssh/authorized_keys + fi + fi +} + +# +# Echange la clef SSH root DC1/DC2 +# +function ssh_on_dc() +{ + echo "ssh_on_dc ${AD_DC_SYSVOL_REF} : $*" + ssh root@"${AD_DC_SYSVOL_REF}" "$@" +} + + +# Arrête tous les services liés à Samba +function stop_samba() +{ + echo "Redémarrage service" + service samba-ad-dc stop &> /dev/null + service smbd stop &> /dev/null + service nmbd stop &> /dev/null + service winbind stop &> /dev/null + pgrep ^samba$ > /dev/null && killall samba -9 + pgrep ^smbd$ > /dev/null && killall smbd -9 + pgrep ^nmbd$ > /dev/null && killall nmbd -9 + pgrep ^winbind$ > /dev/null && killall winbind -9 + pgrep ^winbindd$ > /dev/null && killall winbindd -9 + return 0 +} + +# Le démarrage de Samba peut prendre quelques instants +# attendre que le démon ait complètement démarré +function wait_samba_start() +{ + echo "Waiting Samba 127.0.0.1:445 to be alive" + for i in {1..600} + do + if tcpcheck 1 127.0.0.1:445 |grep -q alive; then + echo "Samba started after $i s" + PORT445OK=ok + break + fi + done + if [ "$PORT445OK" != "ok" ]; then + EchoRouge "Le service samba-ad-dc n'a pas démarré dans le temps imparti" + exit 1 + fi +} + +# +# Creation d'un site, subnet et site-link +# +# Voir : https://technet.microsoft.com/fr-fr/library/cc754697.aspx +# +function samba_update_site() +{ + local site + local subnet + local ConfigurationLdb + + site="${1}" + subnet="${2}" + + ConfigurationLdb=$(ls /var/lib/samba/private/sam.ldb.d/CN%3DCONFIGURATION*.ldb ) + if [ ! -f "$ConfigurationLdb" ] + then + echo "Erreur, le fichier $ConfigurationLdb n'existe pas" + exit 1 + fi + + ObjectGUID_Site=$(ldbsearch -H "$ConfigurationLdb" "(&(objectclass=site)(name=$site))" | grep objectGUID: | cut -d" " -f2) + if [ -z "$ObjectGUID_Site" ] + then + samba-tool sites create "$site" + echo "* Site $site créé" + else + echo "* Vérification site $site : OK, existe" + fi + + ObjectGUID_Subnet=$(ldbsearch -H "$ConfigurationLdb" "(&(objectclass=subnet)(name=$subnet))" | grep objectGUID: | cut -d" " -f2) + if [ -z "$ObjectGUID_Subnet" ] + then + samba-tool sites subnet create "$subnet" "$site" + echo "* Subnet $subnet du site $site créé" + else + echo "* Vérification subnet $subnet du site $site : OK, existe" + fi + + + #entree="_ldap._tcp.${site}._sites.dc._msdcs.${AD_REALM}" + #if ! host -t SRV "$entree" >/dev/null + #then + # echo "* ERREUR: l'entré DNS '$entree' n'existe pas" + # #DO_UPDATE_DNS=1 + #fi + #entree="_kerberos._tcp.${site}._sites.dc._msdcs.${AD_REALM}" + #if ! host -t SRV "$entree" >/dev/null + #then + # echo "* ERREUR: l'entré DNS '$entree' n'existe pas" + # #DO_UPDATE_DNS=1 + #fi +} + +# +# calcul mask réseau => nb bit +# ex: 255.255.252.0 => 9 +# +function mask2cdr() +{ + # Assumes there's no "255." after a non-255 byte in the mask + local x=${1##*255.} + set -- 0^^^128^192^224^240^248^252^254^ $(( (${#1} - ${#x})*2 )) "${x%%.*}" + x=${1%%$3*} + echo $(( $2 + (${#x}/4) )) +} + + +# +# calcul nb bit => mask réseau +# ex: 9 ==> 255.255.252.0 +# +function cdr2mask() +{ + # Number of args to shift, 255..255, first non-255 byte, zeroes + set -- $(( 5 - ($1 / 8) )) 255 255 255 255 $(( (255 << (8 - ($1 % 8))) & 255 )) 0 0 0 + if [ "$1" -gt 1 ] ; + then + shift "$1" + else + shift + fi + echo "${1-0}.${2-0}.${3-0}.${4-0}" +} + +# +# AIM: Initialise the AD databases +# +function samba_init_ad() +{ + echo "Initialisation DC" + + check_ssh_key + + TEMP_PASSWORD='' + if getValidPassword 'Création du mot de passe "Administrator" Active Directory' + then + AD_ADMIN_PASSWORD="${TEMP_PASSWORD}" + else + EchoRouge "Impossible d’initialiser le DC." + exit 1 + fi + + # Updating hostname + hostnamectl set-hostname "$(cat /etc/hostname)" + + kdestroy + + # Initialisation of the AD + stop_samba + + # --use-rfc2307 : this argument adds POSIX attributes (UID/GID) to + # the AD Schema. This will be necessary if you + # intend to authenticate Linux, BSD, or OS X + # clients (including the local machine) in + # addition to Microsoft Windows. + # + + mkdir -p "/var/lib/samba/private/tls" + local ARGUMENT_DOMAIN_SID + local ARGUMENT_BACKEND_STORE + local ARGUMENT_PLAINTEXT_SECRETS + if [ -n "$AD_DOMAIN_SID" ] + then + ARGUMENT_DOMAIN_SID="--domain-sid=${AD_DOMAIN_SID}" + echo "Attention: positionnement du SID à l'initialisation avec ${AD_DOMAIN_SID}" + fi + + if [ "$AD_BACKEND_STORE" != "tdb" ] + then + ARGUMENT_BACKEND_STORE="--backend-store=${AD_BACKEND_STORE}" + echo "Attention: Activation backend Store avec ${AD_BACKEND_STORE}" + fi + + if [ "$AD_PLAINTEXT_SECRETS" == "oui" ] + then + ARGUMENT_PLAINTEXT_SECRETS="--plaintext-secrets" + echo "Attention: Activation Plaintext Secrets" + fi + + mkdir -p "/var/lib/samba/private/tls" + samba-tool domain provision --use-rfc2307 \ + ${ARGUMENT_DOMAIN_SID} \ + ${ARGUMENT_BACKEND_STORE} \ + ${ARGUMENT_PLAINTEXT_SECRETS} \ + --realm="${AD_REALM^^}" \ + --domain="${AD_DOMAIN^^}" \ + --adminpass="${AD_ADMIN_PASSWORD}" \ + --server-role=dc \ + --host-ip="${AD_HOST_IP}" \ + --option="bind interfaces only=yes" \ + --option=interfaces="lo ${NOM_CARTE_NIC1}" + + if [[ "$?" -ne 0 ]] + then + echo "Impossible de initialiser l'annuaire Active Directory" + exit 1 + fi + + samba_migrate_dns instance + + # export keytab Administrator + [[ -f "${AD_HOST_KEYTAB_FILE}" ]] && rm "${AD_HOST_KEYTAB_FILE}" + samba-tool domain exportkeytab "${AD_HOST_KEYTAB_FILE}" --principal="${AD_HOST_NAME^^}@${AD_REALM^^}" + if [[ "$?" -ne 0 ]] + then + echo "Impossible de générer le keytab ${AD_HOST_NAME}" + exit 1 + fi + + echo "Redémarrage service" + service samba-ad-dc restart + wait_samba_start + + echo "Test connection kerberos/AD" + sleep 5 + kinit "${AD_HOST_NAME^^}@${AD_REALM^^}" -k -t "${AD_HOST_KEYTAB_FILE}" + if [[ "$?" -ne 0 ]] + then + echo "Connection kerberos/AD impossible" + exit 1 + fi + + echo "Set Administrator password never expire" + samba-tool user setexpiry "${AD_ADMIN}" --noexpiry + if [[ "$?" -ne 0 ]] + then + echo "Impossible de déactiver l'expiration de mot de passe de l'Administrator" + exit 1 + fi + + echo "Ajout SeDiskOperatorPrivilege au groupe 'Domain Admins'" + net rpc rights grant "${AD_DOMAIN^^}\Domain Admins" SeDiskOperatorPrivilege -U"${AD_ADMIN}%${AD_ADMIN_PASSWORD}" + if [[ "$?" -ne 0 ]] + then + echo "Impossible d'attribuer le privilège SeDiskOperatorPrivilege au groupe Domain Admins" + exit 1 + fi + + #TODO : create reverse zone pour PEDAGO, ADMIN,DMZ ! + #samba-tool dns zonecreate pedago.eole.lan 2.1.10.in-addr.arpa --username=${AD_ADMIN} + #samba-tool dns zonecreate admin.eole.lan 1.1.10.in-addr.arpa --username=${AD_ADMIN} + #samba-tool dns zonecreate dmz.eole.lan 3.1.10.in-addr.arpa --username=${AD_ADMIN} + + #samba-tool dns zonecreate dc1.eole.lan 0.168.192.in-addr.arpa --username=${AD_ADMIN} + #samba-tool dns add dc1.eole.lan.tld 0.168.192.in-addr.arpa 17 PTR dc1.eole.lan.tld --username=${AD_ADMIN} + + echo "Creation utilisateur 'admin'" + TEMP_PASSWORD='' + if getValidPassword 'Création du mot de passe "admin" Active Directory' + then + ADMIN_PASSWORD="${TEMP_PASSWORD}" + unset TEMP_PASSWORD + else + EchoRouge "Impossible de créer l'utilisateur \"admin\"." + exit 1 + fi + + samba-tool user create admin "$ADMIN_PASSWORD" + if [[ "$?" -ne 0 ]] + then + echo "Impossible de créer l'utilisateur admin" + exit 1 + fi + samba_create_homes_dir + samba_create_profiles_dir + + samba-tool group addmembers "Domain Admins" admin + if [[ "$?" -ne 0 ]] + then + echo "Impossible d'inscire admin dans le groupe Domain Admins" + exit 1 + fi + + touch "${AD_INSTANCE_LOCK_FILE}" +} + +# +# AIM: Initialise the Additional DC +# +function samba_init_additional() +{ + echo "Initialisation DC Secondaire" + + check_ssh_key + + if [ -n "${AD_DC_SYSVOL_REF}" ] + then + if ! grep -q "${AD_DC_SYSVOL_REF}" /etc/resolv.conf + then + echo "nameserver ${AD_DC_SYSVOL_REF}" >>/etc/resolv.conf + else + sed -i "/nameserver\s\+${AD_DC_SYSVOL_REF}/b; /nameserver\s\+/d" /etc/resolv.conf + fi + fi + + # Updating hostname + hostnamectl set-hostname "$(cat /etc/hostname)" + + echange_ssh_key || retval=$? + if [ $retval -ne 0 ] + then + EchoRouge "Erreur lors de l'échange des clés SSH. Relancez 'instance'" + return $retval + fi + + echo "Jonction au domaine" + read -r -p "Compte pour joindre le serveur au domaine [${AD_ADMIN}] : " AD_DELEGATION + echo + if [ -z "${AD_DELEGATION}" ] + then + AD_DELEGATION="${AD_ADMIN}" + fi + + TEMP_PASSWORD='' + if getValidPassword 'Mot de passe de jonction au domaine' false + then + AD_DELEGATION_PASSWORD="${TEMP_PASSWORD}" + unset TEMP_PASSWORD + else + EchoRouge "Impossible de joindre le domaine." + exit 1 + fi + + stop_samba + + # Find primary DC to force join target + AD_RID_MASTER="$(ssh_on_dc "samba-tool fsmo show" | perl -n -e '/RidAllocationMasterRole owner: CN=NTDS Settings,CN=(\w+),/ && print $1')" + # Initialisation of the AD + if [[ "${AD_ADDITIONAL_DC_FORCE_SITE}" = oui ]]; then + samba-tool domain join "${AD_REALM}" "${AD_SERVER_MODE}DC" \ + --dns-backend="${AD_DNS_BACKEND}" \ + -U"${AD_DELEGATION}%${AD_DELEGATION_PASSWORD}" \ + --realm="${AD_REALM}" \ + --server="$AD_RID_MASTER" \ + -W "${AD_DOMAIN}" \ + --site="${DC_SITE}" + else + samba-tool domain join "${AD_REALM}" "${AD_SERVER_MODE}DC" \ + --dns-backend="${AD_DNS_BACKEND}" \ + -U"${AD_DELEGATION}%${AD_DELEGATION_PASSWORD}" \ + --server="$AD_RID_MASTER" \ + --realm="${AD_REALM}" \ + -W "${AD_DOMAIN}" + fi + + if [[ "$?" -ne 0 ]] + then + echo "Impossible de joindre le DC à l'annuaire existant" + exit 1 + fi + + samba_migrate_dns instance + + # export keytab ${AD_HOST_NAME} + [[ -f "${AD_HOST_KEYTAB_FILE}" ]] && rm "${AD_HOST_KEYTAB_FILE}" + samba-tool domain exportkeytab "${AD_HOST_KEYTAB_FILE}" --principal="${AD_HOST_NAME^^}@${AD_REALM^^}" + if [[ "$?" -ne 0 ]] + then + echo "Impossible de générer le keytab ${AD_HOST_NAME^^}" + exit 1 + fi + + mkdir -p /var/lib/samba/private + if [ "${AD_DC_SYSVOL_TYPE}" = "windows" ] + then + echo "Le DC ${AD_DC_SYSVOL_REF} est déclaré comme 'windows' : pas de workaround à éxecuter." + else + # si version 4.7 : cela doit être corrigé !!! A suivre + # https://wiki.samba.org/index.php/Verifying_and_Creating_a_DC_DNS_Record + if [ "${AD_DC_SYSVOL_TYPE}" = "samba" ] + then + if [ -z "${AD_DC_SYSVOL_POST_JOIN_CMD}" ] + then + echo "Le DC ${AD_DC_SYSVOL_REF} est déclaré comme 'samba'. " + echo "Il faut vérifier les entrées DNS suivant 'https://wiki.samba.org/index.php/Verifying_and_Creating_a_DC_DNS_Record' " + echo "Executer sur le DC distant : " + echo " samba-tool dns add \$(hostname) ${AD_REALM} ${AD_HOST_NAME} ${AD_HOST_NAME}.${AD_REALM} A ${AD_HOST_IP} " + echo " ldbsearch -H /usr/local/samba/private/sam.ldb '(invocationId=*)' --cross-ncs objectguid" + echo "Identifier le 'objectGuid' à utiliser" + echo " samba-tool dns add \$(hostname) _msdcs.${AD_REALM} <objectGuid> CNAME ${AD_HOST_NAME}.${AD_REALM} " + echo " tdbbackup -s .bak /var/lib/samba/private/idmap.ldb" + echo "Copier /var/lib/samba/private/idmap.ldb.bak sur le serveur additionel dans /var/lib/samba/private/idmap.ldb" + read -r -p "Taper 'entrée' une fois que les commandes ont été executées sur le DC de référence: " + else + ssh_on_dc "${AD_DC_SYSVOL_POST_JOIN_CMD}" "${AD_HOST_NAME}" "${AD_HOST_IP}" + ssh_on_dc tdbbackup -s .bak /var/lib/samba/private/idmap.ldb + scp "root@${AD_DC_SYSVOL_REF}:/var/lib/samba/private/idmap.ldb.bak" /var/lib/samba/private/idmap.ldb + fi + else + # comportement par défault ==> c'est un Seth ! + # workaround samba < 4.2.0 pour https://bugzilla.samba.org/show_bug.cgi?id=10928 + ssh_on_dc /usr/share/eole/sbin/createDnsRecord "${AD_HOST_NAME}" "${AD_HOST_IP}" "${DC_SITE}" "${AD_SERVER_MODE}DC" + # Apparemment, toujours nécessaire en 4.3 + # https://wiki.samba.org/index.php/Join_an_additional_Samba_DC_to_an_existing_Active_Directory#GID_mappings_of_built-in_groups + ssh_on_dc tdbbackup -s .bak /var/lib/samba/private/idmap.ldb + scp "root@${AD_DC_SYSVOL_REF}:/var/lib/samba/private/idmap.ldb.bak" /var/lib/samba/private/idmap.ldb + fi + fi + [ -f /var/lib/samba/private/idmap.ldb ] && chmod 600 /var/lib/samba/private/idmap.ldb + + echo "Redémarrage service" + service samba-ad-dc restart + wait_samba_start + + echo "Execute Synchro Sysvol" + JobSynchroSysvol + + # Samba 4.1 : replication of the SysVol share isn't implemented. If you make any changes on that share, + # you have to keep them in sync on all your Domain Controllers. An example, how to achieve + # this automatically, is provided in the SysVol Replication documentation. + # https://wiki.samba.org/index.php/Rsync_based_SysVol_replication_workaround + ## we need rsync to create the directory structure with extended attributes + echo "Install SysVol Replication Workaround " + if [ ! -f /etc/cron.d/sysvol-sync ] + then + cat >/etc/cron.d/sysvol-sync <<EOF +*/5 * * * * root /usr/share/eole/sbin/JobSynchroSysvol >/dev/null +EOF + fi + + samba_create_homes_dir + samba_create_profiles_dir + CreoleCat -t resolv.conf + touch "${AD_INSTANCE_LOCK_FILE}" +} + +# +# AIM: Initialise a Member Server +# +function samba_init_member() +{ + echo "Initialisation Server Membre" + stop_samba + # Attention : https://wiki.samba.org/index.php/Setup_a_Samba_AD_Member_Server + + echo "Jonction au domaine" + read -r -p "Compte pour joindre le serveur au domaine [${AD_ADMIN}] : " AD_DELEGATION + echo + if [ -z "${AD_DELEGATION}" ] + then + AD_DELEGATION="${AD_ADMIN}" + fi + + TEMP_PASSWORD='' + if getValidPassword 'Mot de passe de jonction au domaine' false + then + AD_DELEGATION_PASSWORD="${TEMP_PASSWORD}" + unset TEMP_PASSWORD + else + EchoRouge "Impossible de joindre le domaine." + exit 1 + fi + + net ads join -U"${AD_DELEGATION}%${AD_DELEGATION_PASSWORD}" + + echo "Redémarrage service" + service nmbd restart + service smbd restart + service winbind restart + + echo "Nettoyage Cache" + net cache flush + + samba_create_homes_dir + samba_create_profiles_dir + touch "${AD_INSTANCE_LOCK_FILE}" +} + +function samba_create_homes_dir() +{ + if [ "${ACTIVER_AD_HOMES_SHARE}" == "oui" ]; then + mkdir -p "${AD_HOME_SHARE_PATH}" + if [ "${AD_SERVER_ROLE}" == "controleur de domaine" ] && \ + [ "${AD_ADDITIONAL_DC=}" == "non" ]; then + pdbedit -h "\\\\${AD_HOST_NAME}.${AD_REALM}\\admin" -D 'U:' admin > /dev/null + fi + else + if [ "${AD_SERVER_ROLE}" == "controleur de domaine" ] && \ + [ "${AD_ADDITIONAL_DC=}" == "non" ] && \ + [ -n "${AD_HOMES_SHARE_HOST_NAME}" ]; then + pdbedit -h "\\\\${AD_HOMES_SHARE_HOST_NAME}.${AD_REALM}\\admin" -D 'U:' admin > /dev/null + fi + fi +} + +function samba_migrate_dns() +{ + # switch dns backend and restart bind if interaction with Samba is needed + if [[ "${AD_SERVER_ROLE}" = "controleur de domaine" ]]; then + if [[ "$1" = "reconfigure" ]] && [[ -z "${AD_SERVER_MODE}" ]]; then + echo "* Mise à jour du backend DNS" + samba_upgradedns --dns-backend="${AD_DNS_BACKEND}" + else + echo "No DNS dynamic update on RODC" + fi + if [[ "${AD_DNS_BACKEND}" = "BIND9_DLZ" ]]; then + systemctl restart bind9 + fi + fi +} + +function samba_create_profiles_dir() +{ + if [ "${ACTIVER_AD_PROFILES_SHARE}" == "oui" ]; then + mkdir -p "${AD_PROFILE_SHARE_PATH}" + setfacl -Rbk "${AD_PROFILE_SHARE_PATH}" + setfacl -m g:"${AD_REALM}/domain users":rwx "${AD_PROFILE_SHARE_PATH}" + if [ "${AD_SERVER_ROLE}" == "controleur de domaine" ] && \ + [ "${AD_ADDITIONAL_DC=}" == "non" ]; then + pdbedit -p "\\\\${AD_HOST_NAME}.${AD_REALM}\\profiles\\admin" admin > /dev/null + fi + else + if [ "${AD_SERVER_ROLE}" == "controleur de domaine" ] && \ + [ "${AD_ADDITIONAL_DC=}" == "non" ] && \ + [ -n "${AD_PROFILES_SHARE_HOST_NAME}" ]; then + pdbedit -p "\\\\${AD_PROFILES_SHARE_HOST_NAME}.${AD_REALM}\\profiles\\admin" admin > /dev/null + fi + fi +} + +# +# AIM: Initialise a standalone host +# +function samba_init_standalone() +{ + echo "Initialisation Standalone Server" + + #TODO + + touch "${AD_INSTANCE_LOCK_FILE}" +} + +function samba_init_pre() +{ + mkdir -p /etc/samba/conf.d/ +} + +# +# AIM: Initialise AD +# +function samba_instance() +{ + if [ -e "${AD_INSTANCE_LOCK_FILE}" ] + then + EchoOrange "L’Active Directory est déjà initialisé" + exit 0 + fi + + samba_init_pre + case "${AD_SERVER_ROLE}" in + "controleur de domaine") + if [ "${AD_ADDITIONAL_DC}" == 'non' ] + then + samba_init_ad + else + samba_init_additional + fi + ;; + + "membre") + samba_init_member + ;; + + *) + EchoRouge "Server Role inconnu : '${AD_SERVER_ROLE}'" + exit 1 + ;; + esac +# samba_init_post +} + + +# +# AIM: Initialise the AD databases +# +function samba_reconfigure() +{ + if [ ! -e "${AD_INSTANCE_LOCK_FILE}" ] + then + EchoRouge "Vous devez exécuter instance pour peupler l’Active Directory" + exit 1 + fi + + echo "Samba/Seth reconfigure" + echo "* Active Directory est initialisé, reload la configuration" + smbcontrol all reload-config + samba_migrate_dns reconfigure + + echo "Samba/Seth reconfigure end" +} + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/files/usr/lib/eole/samba_backup b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/files/usr/lib/eole/samba_backup new file mode 100644 index 0000000000000000000000000000000000000000..5fdf46851dfc2fda5d34cbf1c8c7d6d802b2fb00 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/files/usr/lib/eole/samba_backup @@ -0,0 +1,48 @@ +#!/usr/bin/env python +from shutil import copytree, rmtree +import logging +from os.path import isdir +from optparse import OptionParser +import samba.getopt as options +from samba.netcmd import domain_backup +from sys import argv + +LOG = argv[1] +WHERE = argv[2] +SERVER = argv[3] + +if len(argv) == 5 and argv[4] == 'cron': + BAREOS_MODE = False +else: + BAREOS_MODE = True + + +parse = OptionParser() + + +def fake_create_backup_tar(logger, tmpdir, backup_filepath): + # do not tar file, just copy it + logger.info("Copy backup file") + dest_dir = WHERE + '/bareos' + if isdir(dest_dir): + rmtree(dest_dir) + copytree(tmpdir, dest_dir) + + +class cmd_domain_backup_online(domain_backup.cmd_domain_backup_online): + def get_logger(self): + logFormatter = logging.Formatter("%(asctime)s [%(levelname)-5.5s] %(message)s") + logger = logging.getLogger('samba_backup') + fhlogger = logging.FileHandler(LOG) + fhlogger.setFormatter(logFormatter) + logger.addHandler(fhlogger) + return logger + + +if BAREOS_MODE: + domain_backup.create_backup_tar = fake_create_backup_tar +backup = cmd_domain_backup_online() +backup.run(sambaopts=options.SambaOptions(parse), + credopts=options.CredentialsOptions(parse), + server=SERVER, + targetdir=WHERE) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/files/usr/share/eole/diagnose/151-AD b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/files/usr/share/eole/diagnose/151-AD new file mode 100644 index 0000000000000000000000000000000000000000..669f612f312c1fb329cba897ca059e8701495e83 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/files/usr/share/eole/diagnose/151-AD @@ -0,0 +1,161 @@ +#!/bin/bash +. /usr/lib/eole/diagnose.sh + +SAMBA4_VARS=/etc/eole/samba4-vars.conf +if [ -f "${SAMBA4_VARS}" ] +then + . "${SAMBA4_VARS}" +else + # Template is disabled => samba is disabled + echo "Samba is disabled" + exit 0 +fi + +SAMBA_LIB_PRIVATE_DIR="/var/lib/samba/private" + +EchoGras "*** Serveur Active Directory" +echo +echo "Fichier de configuration :" +printf ". %${len_pf}s => " "Syntaxe" +CreoleRun "testparm -s >/dev/null 2>&1" +if [[ $? -eq 0 ]] +then + EchoVert "Ok" +else + EchoRouge "Erreur" +fi +echo + +echo "DNS AD :" +printf ". %${len_pf}s => " "Enregistrements SRV" +CDU=NOK +if host -t SRV _ldap._tcp.dc._msdcs.${AD_REALM}. >/dev/null 2>&1 +then + DNS_LDAP_SCE=$(mktemp) + host -t SRV _ldap._tcp.${AD_REALM}. > $DNS_LDAP_SCE + if [ $? -eq 0 ] + then + # Hostname des controleurs de domaine dans le tableau DCS + read -a DCS <<< $(sed -e 's/.* \([^ ].*\)./\1/' ${DNS_LDAP_SCE}) + if host -t SRV _kerberos._udp.${AD_REALM}. >/dev/null 2>&1 + then + CDU=OK + fi + fi + rm -rf $DNS_LDAP_SCE +fi +if [ "$CDU" = "OK" ] +then + EchoVert "Ok" +else + EchoRouge "Erreur (Vérifier 'Nom DNS du réseau local')" +fi + +if [ "${AD_SERVER_ROLE}" == "controleur de domaine" ] && [ -z "${AD_SERVER_MODE}" ]; then + # Attention au é qui compte 2 caractères + printf ". %${len_pf}s => " "Résolution ${AD_HOST_NAME}.${AD_REALM}" + dig @localhost ${AD_HOST_NAME}.${AD_REALM} >/dev/null 2>&1 + if [ $? = 0 ] + then + EchoVert "Ok" + else + EchoRouge "Erreur" + fi + echo + + echo "Réplication :" + printf ". %${len_pf}s => " "Statut" + TestService "Port de réplication" localhost:135 > /dev/null + if [ $? -eq 0 ] + then + samba-tool drs bind |grep -qe "DRSUAPI_SUPPORTED_EXTENSION_BASE.* Yes" + if [ $? -eq 0 ] + then + EchoVert "Supportée" + LOCAL_DC=$(hostname -f) + # DN of the Naming Context dans la variable NC + IFS='.' read -a DN <<<$AD_REALM + NC="DC=${DN[0]}" + for ((i=1;i<${#DN[@]};i++)) + do + NC="${NC},DC=${DN[$i]}" + done + + # Etat de la replication entre chaque DC + declare -a ONLINE_DCS + for ((i=0; i<${#DCS[@]}; i++)) + do + DC=${DCS[$i]} + if [ "${DC}" != "${LOCAL_DC}" ] + then + /usr/bin/tcpcheck 2 ${DC}:135 >> /dev/null 2>&1 + if [ $? -eq 0 ] + then + ONLINE_DCS[$i]="0" + else + ONLINE_DCS[$i]="1" + fi + fi + done + TMP_SHOWREPL=$(mktemp) + samba-tool drs showrepl > $TMP_SHOWREPL + IN_REPL=$(sed -n '/==== INBOUND NEIGHBORS ====/,/==== OUTBOUND NEIGHBORS ====/p' $TMP_SHOWREPL) + OUT_REPL=$(IFS="\n" sed -n '/==== OUTBOUND NEIGHBORS ====/,/==== KCC CONNECTION OBJECTS ====/p' $TMP_SHOWREPL) + rm -rf $TMP_SHOWREPL + for ((i=0; i<${#DCS[@]}; i++)) + do + DC=${DCS[$i]} + if [ "${DC}" != "${LOCAL_DC}" ] + then + if [ "${ONLINE_DCS[$i]}" == "0" ] + then + printf ". %${len_pf}s => " "Depuis ${DC}" + DC_INFO=$(grep -ie "$(cut -d'.' -f1 <<< $DC)" -A2 <<< $IN_REPL) + if [ $? -eq 0 ] + then + grep -qe "Last attempt.*was successful" <<< $DC_INFO + if [ $? -eq 0 ] + then + EchoVert "OK" + else + EchoRouge "Erreur" + fi + else + EchoOrange "Inconnu" + fi + printf ". %${len_pf}s => " "Vers ${DC}" + DC_INFO=$(grep -ie "$(cut -d'.' -f1 <<< $DC)" -A2 <<< $OUT_REPL) + if [ $? -eq 0 ] + then + grep -qe "Last attempt.*was successful" <<< $DC_INFO + if [ $? -eq 0 ] + then + EchoVert "OK" + else + EchoRouge "Erreur" + fi + else + EchoOrange "Inconnu" + fi + else + printf ". %${len_pf}s => " "Avec ${DC}" + if [ "${ONLINE_DCS[$i]}" == "1" ] + then + EchoRouge "Erreur" + else + EchoRouge "Injoignable" + fi + fi + fi + done + else + EchoRouge "Non supportée" + fi + else + EchoRouge "Port de réplication 135 non accessible" + fi + echo +else + echo +fi +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/files/usr/share/eole/sbin/JobSynchroSysvol b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/files/usr/share/eole/sbin/JobSynchroSysvol new file mode 100644 index 0000000000000000000000000000000000000000..add372e7a45a2243fd0a1acc49087429df4d91ff --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/files/usr/share/eole/sbin/JobSynchroSysvol @@ -0,0 +1,60 @@ +#!/bin/bash + +# see : https://wiki.samba.org/index.php/Rsync_based_SysVol_replication_workaround + +set -e + +SAMBA4_VARS=/etc/eole/samba4-vars.conf + +if [ -f "${SAMBA4_VARS}" ] +then + . "${SAMBA4_VARS}" +else + # Template is disabled => samba is disabled + exit 0 +fi + +#rsync +# -A : --acls preserve ACLs (implies --perms) +# -X : --xattrs preserve extended attributes +# -a : --archive archive mode; equals -rlptgoD (no -H,-A,-X) +# -v : --verbose increase verbosity +# -z : --compress compress file data during the transfer +# --delete-after receiver deletes after transfer, not during +# --ignore-times don't skip files that match size and time +# --force force deletion of dirs even if not empty +#rsync -XAavz --delete-after --password-file=/var/lib/samba/rsyncd-sysvol.secret rsync://sysvol-replication@192.168.0.5/SysVol/ /var/lib/samba/sysvol + +if [ -n "${AD_DC_SYSVOL_REF}" ] +then + if [ "${AD_DC_SYSVOL_TYPE}" = "windows" ] + then + echo "FIXME: a faire" + # si le distant est windows, alors on utilise le partage sysvol + # info: https://wiki.samba.org/index.php/Enabling_the_Sysvol_Share_on_a_Windows_DC + #mkdir -p /media/sysvol + #kinit -V -5 -k -t "${AD_ADMIN_KEYTAB_FILE}" + #umount //${AD_DC_SYSVOL_REF}/SYSVOL/ + #mount -t cifs -o user=${AD_ADMIN}@${AD_REALM^^},sec=krb5 //${AD_DC_SYSVOL_REF}/SYSVOL /media/sysvol + #if [ $? -eq 0 ] + #then + # #rsync --verbose -a /media/sysvol /home/sysvol + # umount //${AD_DC_SYSVOL_REF}/sysvol\$/ + #fi + else + # Warning: Make sure that the destination folder is really your SysVol folder, because the command + # will replicate to the given directory and removes everything in it that isn't also on the source! + # You could damage your system! So check the output carefully to see if the replication is doing what + # you expect! + tcpcheck 2 ${AD_DC_SYSVOL_REF}:22 &>/dev/null || { echo "Impossible de joindre le serveur sysvol"; exit 0; } + rsync --rsh='ssh' \ + --compress --verbose \ + --acls --xattrs \ + --archive --ignore-times \ + --delete-after --force \ + --stats root@${AD_DC_SYSVOL_REF}:/home/sysvol/ /home/sysvol/ + + #samba-tool ntacl sysvolcheck + #samba-tool ntacl sysvolreset + fi +fi diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/files/usr/share/eole/sbin/createDnsRecord b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/files/usr/share/eole/sbin/createDnsRecord new file mode 100644 index 0000000000000000000000000000000000000000..575950f3b7e1c6ed3c65bf14353fca74b24894b9 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/files/usr/share/eole/sbin/createDnsRecord @@ -0,0 +1,95 @@ +#!/bin/bash + +#set -e ==> attention aux tests ! + +SAMBA4_VARS=/etc/eole/samba4-vars.conf + +if [ -f "${SAMBA4_VARS}" ] +then + . "${SAMBA4_VARS}" +else + # Template is disabled => samba is disabled + echo "Samba is disabled" + exit 0 +fi + +function usage +{ + echo "Usage :" + [[ -n $1 ]] && echo -e "\n${@}\n" + echo " $(basename $0) <nom_serveur> [<ip>]" + exit 2 +} + +function set_dns_srv_entry () +{ + zone="${1}" + entry="${2}.${zone}" + server="${3}" + shift 3 + data="${server} $@" + dig +noall +answer -t SRV @${DNS_DC1} ${entry} | grep -qi ${server} + res=$? + if [[ ${res} -eq 0 ]] + then + echo "Entry ${entry} already set for server ${server}" + else + echo "Create missing DNS entry ${entry} for server ${server}" + samba-tool dns add "${AD_HOST_NAME}" "${zone}" "${entry}" SRV "${data}" -k 1 + fi +} + +[[ -z $1 ]] && usage "Missing nom_serveur" +[[ -z $2 ]] && usage "Missing ip" + +NAME=$1 +IP=$2 +SITE=$3 +MODE=$4 + +DNS_DC1=${AD_HOST_NAME}.${AD_REALM} +DNS_DC2=${NAME}.${AD_REALM} +BASEDN="$(echo DC=${AD_REALM//./,DC=})" + + +# export keytab Administrator +[[ -f "${AD_HOST_KEYTAB_FILE}" ]] && rm "${AD_HOST_KEYTAB_FILE}" +samba-tool domain exportkeytab "${AD_HOST_KEYTAB_FILE}" --principal="${AD_HOST_NAME^^}@${AD_REALM^^}" +if [[ "$?" -ne 0 ]] +then +echo "Impossible de générer le keytab ${AD_HOST_NAME}" +exit 1 +fi +kinit "${AD_HOST_NAME^^}@${AD_REALM^^}" -k -t "${AD_HOST_KEYTAB_FILE}" + +host -t A "${DNS_DC2}." +RES=$? +if [ $RES -ne 0 ] +then + samba-tool dns add "${AD_HOST_NAME}" "${AD_REALM}" "${NAME}" A "${IP}" -k 1 +else + echo "${IP} : Déjà inscrit!" +fi + +if [ "$MODE" = "RODC" ] +then + set_dns_srv_entry "${AD_REALM}" "_ldap._tcp.${SITE}._sites" "${DNS_DC2}" 389 0 100 + set_dns_srv_entry "${AD_REALM}" "_kerberos._tcp.${SITE}._sites" "${DNS_DC2}" 88 0 100 + set_dns_srv_entry "${AD_REALM}" "_gc._tcp.${SITE}._sites" "${DNS_DC2}" 3268 0 100 + set_dns_srv_entry "_msdcs.${AD_REALM}" "_ldap._tcp.${SITE}._sites.dc" "${DNS_DC2}" 389 0 100 + set_dns_srv_entry "_msdcs.${AD_REALM}" "_kerberos._tcp.${SITE}._sites.dc" "${DNS_DC2}" 88 0 100 + set_dns_srv_entry "_msdcs.${AD_REALM}" "_ldap._tcp.${SITE}._sites.gc" "${DNS_DC2}" 3268 0 100 +fi + +objectGuidRecord=$(ldbsearch -H /var/lib/samba/private/sam.ldb -b "CN=NTDS Settings,CN=${NAME^^},CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,${BASEDN}" '(invocationId=*)' --cross-ncs objectGuid | grep -i "objectGuid:") +objectGuid=$(echo "$objectGuidRecord" | awk '{print $2}') +if [ -n "$objectGuid" ] +then + host -t CNAME "$objectGuid._msdcs.${AD_REALM}." + RES=$? + if [ $RES -ne 0 ] + then + samba-tool dns add "${AD_HOST_NAME}" "_msdcs.${AD_REALM}" "$objectGuid" CNAME "${DNS_DC2}" -k 1 + fi +fi + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/files/usr/share/eole/sbin/create_adhome.sh b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/files/usr/share/eole/sbin/create_adhome.sh new file mode 100644 index 0000000000000000000000000000000000000000..1fd08df0fc7a8e7c22c034c0a85ede8c8cd5a346 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/files/usr/share/eole/sbin/create_adhome.sh @@ -0,0 +1,10 @@ +#!/bin/bash +login=${1} +homebasedir=${2} +userdir="${homebasedir}/${login}" +[ -d "${userdir}" ] && exit 0 +mkdir -p "${userdir}" +setfacl -Rbk "${userdir}" +chmod 700 "${userdir}" +setfacl -m u:${login}:rwx "${userdir}" +setfacl -dm u:${login}:rwx "${userdir}" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/files/usr/share/eole/sbin/getADAdminPassword b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/files/usr/share/eole/sbin/getADAdminPassword new file mode 100644 index 0000000000000000000000000000000000000000..23058b1a479cc88a74e1220f8521844e51284ea7 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/files/usr/share/eole/sbin/getADAdminPassword @@ -0,0 +1,105 @@ +#!/usr/bin/python -u +# -*- coding: utf-8 -*- + +"""Apply configuration of EOLE servers. +Demande le mot de passe de l'utilisateur "Administrator" et le stocke dans le fichier +/var/lib/samba/.eole-ad-dc +Fichier utilisé par les autres eole-ad-dc joints au domaine +""" + +import os +import sys +import getpass +import traceback + +def checkPassword( pw ): + """ See https://wiki.samba.org/index.php/Samba_AD_DC_HOWTO + Containing at least three of the following five character groups + Uppercase characters of European languages (A through Z, with diacritic marks, Greek and Cyrillic characters) + Lowercase characters of European languages (a through z, sharp-s, with diacritic marks, Greek and Cyrillic characters) + Base 10 digits (0 through 9) + Nonalphanumeric characters: ~!@#$%^&*_-+=`|\(){}[]:;"'<>,.?/ + Any Unicode character that is categorized as an alphabetic character but is not uppercase or lowercase. This includes Unicode characters from Asian languages. + + If the password doesn't fulfil the complexity requirements, the provisioning will fail and you will have to start over (remove the generated new "smb.conf" in that case). + """ + s_lc = set(['a', 'c', 'b', 'e', 'd', 'g', 'f', 'i', 'h', 'k', 'j', 'm', 'l', 'o', 'n', 'q', 'p', 's', 'r', 'u', 't', 'w', 'v', 'y', 'x', 'z']) + s_uc = set(['A', 'C', 'B', 'E', 'D', 'G', 'F', 'I', 'H', 'K', 'J', 'M', 'L', 'O', 'N', 'Q', 'P', 'S', 'R', 'U', 'T', 'W', 'V', 'Y', 'X', 'Z']) + s_dg = set(['1', '0', '3', '2', '5', '4', '7', '6', '9', '8']) + s_sp = set([ '~', '!', '@','#','$','%','^','&','*',"'",'_','-','+','=','`','|','\\','(',')','{','}','[',']',':',';','"',"'",'<','>',',','.','?','/',',','.']) + s_pw = set(pw) + pw_l = len(pw) + + c_lc = len(s_pw & s_lc) + c_uc = len(s_pw & s_uc) + c_dg = len(s_pw & s_dg) + c_sp = len(s_pw & s_sp) + + forbidden = s_pw - s_lc - s_uc - s_dg - s_sp + + if (forbidden): + print("Forbidden chracter{}: {}".format('s' * (len(forbidden) > 1), + list(forbidden))) + return False + + if ( c_lc == 0 ) : + print( "Password must have at least one lower case char") + return False + + if ( c_uc == 0 ): + print( "Password must have at least one upper case char") + return False + + if ( c_dg == 0 ): + print( "Password must have at least one digit char") + return False + + if ( c_sp == 0 ): + print( "Password must have at least one char in : ~!@#$%^&*_-+=`|\\(){}[]:;""''<>,.?/ " ) + return False + + if ( pw_l < 8 ): + print ('password must have more than 8 characters') + return False + + return True + +def getADPwd(verify=True): + """ + Check exist /root/.eole-ac-dc + even get pwd and write file + """ + passordFile = '/var/lib/samba/.eole-ad-dc' + try: + if os.path.isfile(passordFile): + print(u"Active Directory Administrator password has been initialized") + print(passordFile) + sys.exit(0) + + print (u'Active Directory "Administrator" password') + for attempt in range(1, 15): + passwd = getpass.getpass(u"Enter password :") + if checkPassword( passwd ): + if verify: + confirm_pass = getpass.getpass(u"Retype password :") + if passwd != confirm_pass: + print (u"Passwords mismatch.") + continue + with file( passordFile ,"w") as fh: + fh.write( passwd + "\n" ); + os.chmod( passordFile, 0600) + sys.exit(0) + + print (u"Too many try, Cancel." ) + sys.exit(1) + except Exception, err: + traceback.print_exc() + print (u"Exception in get AD Administrator password" ) + sys.exit(2) + +if __name__ == '__main__': + if len(sys.argv) > 1 and 'noverify' == sys.argv[1].lower(): + # Ne pas demander confirmation du mot de passe sur le "member" + getADPwd(False) + else: + getADPwd() diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/files/usr/share/eole/sbin/getAdminPassword b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/files/usr/share/eole/sbin/getAdminPassword new file mode 100644 index 0000000000000000000000000000000000000000..19900a652f4badb4bfa369528475b5f19657cda7 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/files/usr/share/eole/sbin/getAdminPassword @@ -0,0 +1,99 @@ +#!/usr/bin/python -u +# -*- coding: utf-8 -*- + +"""Apply configuration of EOLE servers. +Demande le mot de passe de l'utilisateur "admin" et le stocke dans le fichier +/var/lib/samba/.admin-ad-dc +""" + +import os +import sys +import getpass +import traceback + +def checkPassword( pw ): + """ See https://wiki.samba.org/index.php/Samba_AD_DC_HOWTO + Containing at least three of the following five character groups + Uppercase characters of European languages (A through Z, with diacritic marks, Greek and Cyrillic characters) + Lowercase characters of European languages (a through z, sharp-s, with diacritic marks, Greek and Cyrillic characters) + Base 10 digits (0 through 9) + Nonalphanumeric characters: ~!@#$%^&*_-+=`|\(){}[]:;"'<>,.?/ + Any Unicode character that is categorized as an alphabetic character but is not uppercase or lowercase. This includes Unicode characters from Asian languages. + + If the password doesn't fulfil the complexity requirements, the provisioning will fail and you will have to start over (remove the generated new "smb.conf" in that case). + """ + s_lc = set(['a', 'c', 'b', 'e', 'd', 'g', 'f', 'i', 'h', 'k', 'j', 'm', 'l', 'o', 'n', 'q', 'p', 's', 'r', 'u', 't', 'w', 'v', 'y', 'x', 'z']) + s_uc = set(['A', 'C', 'B', 'E', 'D', 'G', 'F', 'I', 'H', 'K', 'J', 'M', 'L', 'O', 'N', 'Q', 'P', 'S', 'R', 'U', 'T', 'W', 'V', 'Y', 'X', 'Z']) + s_dg = set(['1', '0', '3', '2', '5', '4', '7', '6', '9', '8']) + s_sp = set([ '~', '!', '@','#','$','%','^','&','*',"'",'_','-','+','=','`','|','\\','(',')','{','}','[',']',':',';','"',"'",'<','>',',','.','?','/',',','.']) + s_pw = set(pw) + pw_l = len(pw) + + c_lc = len(s_pw & s_lc) + c_uc = len(s_pw & s_uc) + c_dg = len(s_pw & s_dg) + c_sp = len(s_pw & s_sp) + + forbidden = s_pw - s_lc - s_uc - s_dg - s_sp + + if (forbidden): + print("Forbidden chracter{}: {}".format('s' * (len(forbidden) > 1), + list(forbidden))) + return False + + if ( c_lc == 0 ) : + print( "Password must have at least one lower case char") + return False + + if ( c_uc == 0 ): + print( "Password must have at least one upper case char") + return False + + if ( c_dg == 0 ): + print( "Password must have at least one digit char") + return False + + if ( c_sp == 0 ): + print( "Password must have at least one char in : ~!@#$%^&*_-+=`|\\(){}[]:;""''<>,.?/ " ) + return False + + if ( pw_l < 8 ): + print ('password must have more than 8 characters') + return False + + return True + +def getAdminPwd(): + """ + Check exist /var/lib/samba/.admin-ad-dc + even get pwd and write file + """ + passordFile = '/var/lib/samba/.admin-ad-dc' + try: + if os.path.isfile(passordFile): + print(u"'admin' password has been initialized") + print(passordFile) + sys.exit(0) + + print (u"Active Directory 'admin' password") + for attempt in range(1, 15): + passwd = getpass.getpass(u"Enter password :") + if checkPassword( passwd ): + confirm_pass = getpass.getpass(u"Retype password :") + if passwd == confirm_pass: + with file( passordFile ,"w") as fh: + fh.write( passwd + "\n" ); + os.chmod( passordFile, 0600) + sys.exit(0) + else: + print (u"Passwords mismatch.") + + print (u"Too many try, Cancel." ) + sys.exit(1) + except Exception, err: + traceback.print_exc() + print (u"Exception in getAdminPassword" ) + sys.exit(2) + +if __name__ == '__main__': + getAdminPwd() diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/files/usr/share/eole/sbin/join-ad b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/files/usr/share/eole/sbin/join-ad new file mode 100644 index 0000000000000000000000000000000000000000..350a4caded944102549ca8cac9d5f24c2aae3919 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/files/usr/share/eole/sbin/join-ad @@ -0,0 +1,180 @@ +#!/bin/bash +# Join une machine Windows distante au domaine Active directory + +set -e + +die() { echo "$@" >&2 ; exit ${EXIT_CODE:-1}; } + +SAMBA4_VARS=/etc/eole/samba4-vars.conf + +[ -f "${SAMBA4_VARS}" ] && . "${SAMBA4_VARS}" + +function usage +{ + echo "Usage :" + echo " $(basename $0) -U <domain admin> -u <host admin> [-p ] -m <machine> [-m <machine>...]" + echo " -U : Domain administrator account" + echo " -P : Domain administrator password" + echo " -u : host administrator account" + echo " -p : host administrator password" + echo " -m : windows Machines you need to join" + echo " -r : reboot the machine after joining to the domain" + echo " -n : dry-run mode" + echo " -f : do not ask question" + exit 0 +} + +TEMP=$(getopt -o U:P:u:p:m:rfnhvcls --long force,dry-run,help,version,copyright,licence,changes,sources -- "$@") + +test $? = 0 || exit 1 +eval set -- "${TEMP}" + +while true +do + case "${1}" in + # Default options for utilities + -h|--help) + usage + exit 0 + ;; + -v|--version) + licence | head -n 2 + exit 0 + ;; + -c|--copyright) + licence | tail -n +2 + exit 0 + ;; + -l|--licence) + licence + exit 0 + ;; + --changes) + changes + exit 0 + ;; + -s|--sources) + sources + exit 0 + ;; + + # Program options + -f|--force) + FORCE=true + shift + ;; + + -n|--dry-run) + DRY_RUN=: + DRY_RUN_MSG="Dry run mode: " + shift + ;; + + -U) + [ -n "${2}" ] || die "Domain administrator account must not be empty" + AD_ADMIN="${2}" + shift 2 + ;; + + -P) + [ -n "${2}" ] || die "Domain administrator password file must not be empty" + [ -r "${2}" ] || die "Domain administrator password file is not readable" + AD_ADMIN_PASSWORD_FILE="${2}" + shift 2 + ;; + + -u) + [ -n "${2}" ] || die "Host administrator account must not be empty" + HOST_ADMIN="${2}" + shift 2 + ;; + + -p) + [ -n "${2}" ] || die "Host administrator password file must not be empty" + [ -r "${2}" ] || die "Host administrator password file is not readable" + HOST_ADMIN_PASSWORD_FILE="${2}" + shift 2 + ;; + + -r) + REBOOT=REBOOT + shift + ;; + + -m|--machine) + [ -n "${2}" ] || die "Machine must not be empty" + MACHINES="${MACHINES:+${MACHINES} } ${2}" + shift 2 + ;; + + # End of options + --) + shift + break + ;; + *) + die "Error: unknown argument '${1}'" + ;; + esac +done + +[ ! -z "${AD_ADMIN+x}" ] || die "Undefined domain administrator account" +[ ! -z "${HOST_ADMIN+x}" ] || die "Undefined host administrator account" +[ ! -z "${MACHINES+x}" ] || die "No machine specified" + + +if ! [[ "${AD_ADMIN}" =~ "\\" ]] +then + AD_ADMIN="${AD_DOMAIN}\\${AD_ADMIN}" +fi + +# Check for unset password +# See https://stackoverflow.com/questions/874389/bash-test-for-a-variable-unset-using-a-function +if [ -z "${AD_ADMIN_PASSWORD_FILE}" ] +then + read -s -p "Password of domain account “${AD_ADMIN}â€: " AD_ADMIN_PASSWORD + echo +fi + +if [ -z "${HOST_ADMIN_PASSWORD_FILE}" ] +then + read -s -p "Password of host account “${HOST_ADMIN}â€: " HOST_ADMIN_PASSWORD + echo +fi + +for machine in ${MACHINES} +do + if ! [[ "${HOST_LOGIN}" =~ "\\" ]] + then + HOST_ADMIN="${machine}\\${HOST_ADMIN}" + fi + + echo "Domain administrator account: “${AD_ADMIN}â€" + echo "Host administrator account: “${HOST_ADMIN}â€" + + if [ -z "${FORCE+x}" ] + then + unset JOIN_MACHINE + read -e -p "Join computer “${machine}†to domain “${AD_DOMAIN}â€? [Yes/No/Quit]: " JOIN_MACHINE + [[ "${JOIN_MACHINE}" =~ ^q(uit)?$ ]] && echo "Abort" && exit 0 + + [[ "${JOIN_MACHINE}" =~ ^([yY]([eE][sS])?|[nN][oO]?)$ ]] \ + || die "Bad answer: “$JOIN_MACHINEâ€" + + [[ "${JOIN_MACHINE}" =~ ^[yY]([eE][sS])?$ ]] \ + || (echo && continue) + fi + + echo "${DRY_RUN_MSG}Integrating “${machine}â€..." + ${DRY_RUN} net -S "${machine}" -U "${HOST_ADMIN}" \ + dom join DOMAIN="${REALM}" ACCOUNT="${AD_ADMIN}" PASSWORD="${AD_ADMIN_PASSWORD}" \ + <<<"${HOST_ADMIN_PASSWORD}" + + if [ $? -eq 0 -a -n "${REBOOT}" ] + then + echo "${DRY_RUN_MSG}Rebooting “${machine}â€..." + ${DRY_RUN} net -S "${machine}" -U "${HOST_ADMIN}" RPC SHUTDOWN -r -f -t 5 \ + <<<"${HOST_ADMIN_PASSWORD}" + fi + echo +done diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/files/usr/share/eole/sbin/validSambaPassword b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/files/usr/share/eole/sbin/validSambaPassword new file mode 100644 index 0000000000000000000000000000000000000000..e7a5155403882054f99ef51b424b5c7750fa9172 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/files/usr/share/eole/sbin/validSambaPassword @@ -0,0 +1,241 @@ +#!/usr/bin/python -u +# -*- coding: utf-8 -*- + +"""Apply configuration of EOLE servers. +Password sanity check +""" + +import sys +import re +import unicodedata + + + +# a bug in samba-tool does not permit using full range of unicode characters +# http://www.unicode.org/reports/tr44/#General_Category_Values +unicode_categories = set(['Lu', 'Ll', 'Lt', 'LC', 'Lm', 'Lo', 'L', # Letter + 'Mn', 'Mc', 'Me', 'M', # Mark + 'Nd', 'Nl', 'No', 'N', # Number + 'Pc', 'Pd', 'Ps', 'Pe', 'Pi', 'Pf', 'Po', 'P', # Punctuation + 'Sm', 'Sc', 'Sk', 'So', 'S', # Symbol + 'Zs', 'Zl', 'Zp', 'Z', # Separator + 'Cc', 'Cf', 'Cs', 'Co', 'Cn', 'C', # Other + ]) + +non_alphanumeric_categories = set(['Ps', 'Sm', 'Sk', 'Pc', 'Pd', 'Pe', 'Sc', 'Po']) +unicode_alphabetic_categories = set(['Lu', 'Ll', 'Lt', 'LC', 'Lm', 'Lo', 'L']) +digit_categories = set(['Nd']) +authorized_categories = unicode_alphabetic_categories.union(digit_categories).union(non_alphanumeric_categories) + +forbidden_categories = unicode_categories - authorized_categories + +european_uppercase_categories = set(['Lu', 'Lt']) +european_lowercase_categories = set(['Ll']) +non_cased_alphabetic_categories = set(['Lo']) + +# Character sets +non_alphanumeric = [u'(', u'{', u'[', # Ds + u')', u'}', u']', # Pe + u'~', u'+', u'=', u'|', u'<', u'>', # Sm + u'^', u'`', # Sk + u'_', # Pc + u'-', # Pd + u'$', # Sc + u'!', u'@', u'#', u'%', u'&', u'*', u"'", u'\\', u':', u';', u'"', u"'", u',', u'.', u'?', u'/', u',', u'.', # Po + ] + +uppercase_ascii_re = re.compile(r'[A-Z]') +lowercase_ascii_re = re.compile(r'[a-z]') +digits_re = re.compile(r'[0-9]') + + +def is_non_alphanumeric(c): + """Return True if character c is valid non-alphanumeric character + :param c: character to check + :type c: unicode + """ + return c in non_alphanumeric + + +def is_european_uppercase_letter(c): + """Return True if character c is a european uppercase letter + :param c: letter to check + :type c: unicode + """ + # a bug in samba does not permit full range of european letters + return (unicodedata.category(c) in european_uppercase_categories and + uppercase_ascii_re.match(c) is not None) + + +def is_european_lowercase_letter(c): + """Return True if character c is a european lowercase letter + :param c: letter to check + :type c: unicode + """ + # a bug in samba does not permit full range of european letters + return (unicodedata.category(c) in european_lowercase_categories and + lowercase_ascii_re.match(c) is not None) + + +def is_digit(c): + """Return True if character c is a digit + :param c: letter to check + :type c: unicode + """ + return digits_re.match(c) is not None + + +def is_unicode_alphabetic_character(c): + """Return True if character c is valid unicode alphabetic_character + :param c: letter to check + :type c: unicode + """ + return unicodedata.category(c) in unicode_alphabetic_categories + + +def is_non_cased_alphabetic_character(c): + """Return True if character c is valid unicode alphabetic_character + :param c: letter to check + :type c: unicode + """ + return unicodedata.category(c) in non_cased_alphabetic_categories + + +# Rule list to use in validation process +valid_character_rules = [is_non_alphanumeric, + is_european_uppercase_letter, + is_european_lowercase_letter, + is_digit, + #is_non_cased_alphabetic_character, + ] + + +def validated_rules_count(validated_rules): + """Return number of unique validated rules (number of column with at least + one True value. + :param validated_rules: 2-dimensional table with boolean values for each rule, for each character + :type validated_rules: list of list of boolean + """ + validated_rules = [any(list(l)) for l in zip(*validated_rules)] + return validated_rules.count(True) + + +def forbidden_characters_in(word, validated_rules): + """Return list of forbidden characters found in word + :param word: characters to check + :type word: unicode + :param validated_rules: 2-dimensional table with boolean values for each rule, for each character + :type validated_rules: list of list of boolean + """ + is_forbidden = [not any(t) for t in validated_rules] + forbidden_characters = [el for el, t in zip (word, is_forbidden) + if t is True] + return forbidden_characters + + +def original_checkPassword( pw ): + """ See https://wiki.samba.org/index.php/Samba_AD_DC_HOWTO + Containing at least three of the following five character groups + Uppercase characters of European languages (A through Z, with diacritic marks, Greek and Cyrillic characters) + Lowercase characters of European languages (a through z, sharp-s, with diacritic marks, Greek and Cyrillic characters) + Base 10 digits (0 through 9) + Nonalphanumeric characters: ~!@#$%^&*_-+=`|\(){}[]:;"'<>,.?/ + Any Unicode character that is categorized as an alphabetic character but is not uppercase or lowercase. This includes Unicode characters from Asian languages. + + If the password doesn't fulfil the complexity requirements, the provisioning will fail and you will have to start over (remove the generated new "smb.conf" in that case). + + Some modifications made to match restrictions applied in code and ldap tree : 4 groups and ASCII mandatory. + :param pw: password to check + :type pw: str (utf-8 encoded) + """ + + pw = pw.decode('utf-8') + if len(pw) < 8: + sys.stderr.write(u"Password must contain at least height characters from four different groups\n") + sys.stderr.write(u'\n'.join([u'Uppercase ASCII literals', + u'Lowercase ASCII literals', + u'Base 10 digits (0 through 9)', + u'Non alphanumeric character ~!@#$%^&*_-+=`|\\(){}[]:;"\'<>,.?/ '])) + return False + validated_rules = [[func(c) for func in valid_character_rules] for c in pw] + if all([any(vr) for vr in validated_rules]): + if validated_rules_count(validated_rules) >= 4: # 4 instead of 3 as stated in wiki to match applied rules + return True + else: + sys.stderr.write(u"Password must contain at least height characters from four different groups\n") + sys.stderr.write(u'\n'.join([u'Uppercase ASCII literals', + u'Lowercase ASCII literals', + u'Base 10 digits (0 through 9)', + u'Non alphanumeric character ~!@#$%^&*_-+=`|\\(){}[]:;"\'<>,.?/ '])) + return False + else: + forbidden_characters = forbidden_characters_in(pw, validated_rules) + sys.stderr.write(u"Forbidden character{}: {}\n".format(u's' * (len(forbidden_characters) > 1), + ', '.join(forbidden_characters))) + return False + +def checkPassword( pw ): + """ See https://wiki.samba.org/index.php/Samba_AD_DC_HOWTO + Containing at least three of the following five character groups + Uppercase characters of European languages (A through Z, with diacritic marks, Greek and Cyrillic characters) + Lowercase characters of European languages (a through z, sharp-s, with diacritic marks, Greek and Cyrillic characters) + Base 10 digits (0 through 9) + Nonalphanumeric characters: ~!@#$%^&*_-+=`|\(){}[]:;"'<>,.?/ + Any Unicode character that is categorized as an alphabetic character but is not uppercase or lowercase. This includes Unicode characters from Asian languages. + + If the password doesn't fulfil the complexity requirements, the provisioning will fail and you will have to start over (remove the generated new "smb.conf" in that case). + + Some modifications made to match restrictions applied in code and ldap tree : 4 groups and ASCII mandatory. + :param pw: password to check + :type pw: str (utf-8 encoded) + """ + + pw = pw.decode('utf-8') + if len(pw) < 8: + #sys.stderr.write(u"Le mot de passe doit contenir au moins 8 caractères de 4 classes différentes\n") + #sys.stderr.write(u'\n'.join([u'Caractères ASCII majuscules', + # u'Caractères ASCII minuscules', + # u'Caractères numériques (0 à 9)', + # u'Caractères non alphanumeriques ~!@#$%^&*_-+=`|\\(){}[]:;"\'<>,.?/ '])) + printPasswordRules() + return False + validated_rules = [[func(c) for func in valid_character_rules] for c in pw] + if all([any(vr) for vr in validated_rules]): + if validated_rules_count(validated_rules) >= 4: # 4 instead of 3 as stated in wiki to match applied rules + return True + else: + #sys.stderr.write(u"Le mot de passe doit contenir au moins 8 caractères de 4 classes différentes\n") + #sys.stderr.write(u'\n'.join([u'Caractères ASCII majuscules', + # u'Caractères ASCII minuscules', + # u'Caractères numériques (0 à 9)', + # u'Caractères non alphanumeriques ~!@#$%^&*_-+=`|\\(){}[]:;"\'<>,.?/ '])) + printPasswordRules() + return False + else: + forbidden_characters = forbidden_characters_in(pw, validated_rules) + sys.stderr.write(u"\nCaractère interdit{}: {}\n".format(u's' * (len(forbidden_characters) > 1), + ', '.join(set(forbidden_characters)))) + return False + +def printPasswordRules(): + sys.stderr.write(u"\nLe mot de passe doit contenir au moins 8 caractères de 4 classes différentes\n") + sys.stderr.write(u'\n'.join([u'Caractères ASCII majuscules', + u'Caractères ASCII minuscules', + u'Caractères numériques (0 à 9)', + u'Caractères non alphanumeriques ~!@#$%^&*_-+=`|\\(){}[]:;"\'<>,.?/ '])) + + +if __name__ == '__main__': + try: + password = sys.argv[1] + except: + sys.stderr.write(u'Aucun mot de passe fourni\n') + print 1 + sys.exit(0) + valid = checkPassword(password) + if valid is True: + print 0 + sys.exit(0) + else: + print 1 + sys.exit(0) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/files/usr/share/eole/schedule/scripts/samba_backup b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/files/usr/share/eole/schedule/scripts/samba_backup new file mode 100644 index 0000000000000000000000000000000000000000..9b3e3d00834fe07235f6dd27ad7d81a257621d9c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/files/usr/share/eole/schedule/scripts/samba_backup @@ -0,0 +1,41 @@ +#!/bin/bash + +set -e + +. /etc/eole/samba4-vars.conf +. /etc/samba/samba_backup.conf +WHEN=`date ${WHEN_FORMAT}` + +if [ -n "$1" ] && [ "$1" = "cron" ]; then + bareos_mode=0 + REPORT="${WHERE%/}/samba_backup_${WHEN}.report" +else + bareos_mode=1 + REPORT="${WHERE%/}/samba_backup.report" +fi + +# create backup folder if necessary +if [ ! -e "${WHERE}" ]; then + mkdir -p "${WHERE}" +fi + +# get keytab to backup server without password +USER="$AD_ADMIN@"$(echo $AD_REALM | tr a-z A-Z) +KEYFILE="/tmp/backup.keytab" +samba-tool domain exportkeytab "$KEYFILE" --principal="$USER" 2> /dev/null +kinit "$USER" -k -t "$KEYFILE" + +# do backup +/usr/lib/eole/samba_backup "$REPORT" "$WHERE" "$SERVER" "$1" > /dev/null 2> /dev/null + +# remove keytab +kdestroy +rm -f "$KEYFILE" + +if [ "$bareos_mode" = "0" ]; then + old_archives=$(find $WHERE -name "samba-backup*bz2" -mtime +$DAYS) + [ -n "${old_archives}" ] && rm ${old_archives} + echo "Removed $(echo ${old_archives} | wc -w) archives older than $DAYS days." >> $REPORT +fi +exit 0 + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/postservices/24-test-synchro-with-time-reference b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/postservices/24-test-synchro-with-time-reference new file mode 100644 index 0000000000000000000000000000000000000000..4765c3e8f6cb2785a706ad61d20f4003d6822288 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/postservices/24-test-synchro-with-time-reference @@ -0,0 +1,92 @@ +#!/bin/bash + +. /etc/eole/samba4-vars.conf + +TIMEOUT=120 +SLEEP_TIME=10 +MAX_ATTEMPT=`expr $TIMEOUT / $SLEEP_TIME` + +if [ "$1" = "instance" ] && ([ "${AD_ADDITIONAL_DC}" = 'oui' ] || [ "${AD_SERVER_ROLE}" = 'membre' ]) +then + attempt=0 + is_sync=false + wanted_peer=false + + while ! $is_sync # on attend la synchronisation avec une sortie (break) si le nombre de tentatives est épuisé + do + for assid in $(ntpq -c "as" | sed -e '1,3d' -e 's/\s\+/ /g' -e 's/^\s\+//' | cut -f2 -d ' ') + do + for ntp_server in $NTP_SERVERS # liste des serveurs NTP avec lesquels on veut être synchronisé + do + if ! [[ ${ntp_server} =~ ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ ]] + then + ntp_server_ips="$(host $ntp_server | awk '/has address/ {print $4}')" + else + ntp_server_ips="$ntp_server" + fi + for ntp_server_ip in $ntp_server_ips + do + # le serveur NTP est déclaré avec une IP, on récupère les informations de ntp sans résolution de nom + sync_data=$(ntpq -n -c "rv $assid reach srcadr offset" | awk -v pat="$ntp_server_ip" '$0~pat {print $0}') + if [ -n "${sync_data}" ] # le service ntp a retourné des informations pour ce pair donné + then + break + fi + done + if [ -n "${sync_data}" ] # le service ntp a retourné des informations pour ce pair donné + then + wanted_peer=true + srcadr=$(echo $sync_data | sed 's/.*srcadr=\([a-zA-Z0-9.]\+\)\(,.*\)\?$/\1/') + reach=$(echo $sync_data | sed 's/.*reach=\([0-9]\+\).*/\1/') + offset=$(echo $sync_data | sed -e 's/.*offset=\(-\?[0-9]\+\(\.[0-9]\+\)\?\).*/\1/') + if [ "${reach}" = "177" ] || [ "${reach}" = "377" ] # le service NTP atteste la synchronisation + then + is_sync=true + echo "Horloge synchronisée sur ${srcadr} (avec un offset de ${offset}s)" + elif [ "${reach}" -gt 0 ] && [ "$(echo ${offset#-} | sed 's/\.//')" -lt "300000" ] # le service NTP n’atteste pas la synchronisation mais le serveur de référence est joignable et l’offset est en deça de la limite admise pour les échanges kerberos (5 minutes exprimées en millisecondes) + then + is_sync=true + echo "Horloge synchronisée sur ${srcadr} (avec un offset non attesté de ${offset}s)" + fi + fi + done + done + if ! $is_sync + then + if [ $attempt -lt $MAX_ATTEMPT ] # si on n’a pas épuisé le nombre de tentatives permises, on boucle après avoir affiché, une fois, qu’on attend la synchronisation + then + if [ $attempt -eq 0 ] + then + echo -n "En attente de synchronisation " + else + echo -n "." + fi + attempt=`expr $attempt + 1` + sleep $SLEEP_TIME + else + echo + echo "Délai d'attente dépassé" + break + echo + fi + fi + done + + if $is_sync + then + exit 0 + elif $wanted_peer + then + . /usr/lib/eole/diagnose.sh + echo "Diagnostique de la configuration NTP :" + TestNTP "$(CreoleGet serveur_ntp)" + EchoRouge "Impossible de synchroniser l'horloge du serveur" + exit 1 + else + . /usr/lib/eole/ihm.sh + EchoRouge "Le serveur NTP local ne se met pas à l'heure sur les serveurs NTP configurés" + exit 1 + fi +else + exit 0 +fi diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/postservices/25-manage-samba b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/postservices/25-manage-samba new file mode 100644 index 0000000000000000000000000000000000000000..7de8100e647fd4acb9609858b5993619056bd261 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/postservices/25-manage-samba @@ -0,0 +1,49 @@ +#!/bin/bash + +set -e + +. /usr/lib/eole/ihm.sh +. /usr/lib/eole/samba4.sh + +SAMBA4_VARS=/etc/eole/samba4-vars.conf + +if [ -f "${SAMBA4_VARS}" ] +then + . "${SAMBA4_VARS}" +else + # Template is disabled => samba is disabled + exit 0 +fi + +case "$1" in + instance) + # If Samba installed version is not the one pointed by source-list or no network available, exit instance process. + if [[ ! -e /etc/apt/sources.list.d/seth-samba.list ]] + then + EchoRouge "Le dépôt de paquet pour la dernière version de Samba n’est pas renseigné" + EchoRouge "Lancer la commande Maj-Auto pour renseigner le dépôt et mettre à jour la version de Samba." + exit 1 + fi + samba_pkg="$(apt-cache policy samba | awk '/Install/ {print $NF}')" + samba_source="$(apt-cache madison samba | awk -v sp=" $samba_pkg " -F"|" '$2 == sp {print $3}' | cut -d' ' -f2,3)" + source_list=$(sed 's/\[ arch=amd64 \] //' /etc/apt/sources.list.d/seth-samba.list | awk '/deb / {print $2, $3"/"$4}') + samba_installed_version="$(apt-cache policy samba | awk -F" " '/Install/ {print $2}')" + samba_samba_list_version="$(apt-cache madison samba | awk -F"|" '/\/samba / {print $2}' |cut -d " " -f2)" + if [[ "${samba_source}" != "${source_list}" ]] && dpkg --compare-versions "$samba_installed_version" lt "$samba_samba_list_version" + then + EchoRouge "La version de Samba installée n’est pas celle requise." + EchoRouge "Lancer la commande Maj-Auto pour mettre à jour la version de Samba." + exit 1 + fi + samba_instance + ;; + + reconfigure) + samba_reconfigure + ;; + + *) + EchoRouge "Paramètre inconnu: ${1}" + exit 1 + ;; +esac diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/postservices/26-partages b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/postservices/26-partages new file mode 100644 index 0000000000000000000000000000000000000000..91eb53cfa26b1620b2950d1c7ccaeb582665d5d0 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/postservices/26-partages @@ -0,0 +1,10 @@ +#!/bin/bash + +# partages multiples +ad_domain="$(CreoleGet ad_domain)" +if [ "$(CreoleGet ad_additional_share non)" = "oui" ]; then + for path in $(CreoleGet ad_additional_share_path); do + chown :"${ad_domain^^}/domain users" $path + done +fi +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/posttemplates/01-bind-apparmor b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/posttemplates/01-bind-apparmor new file mode 100644 index 0000000000000000000000000000000000000000..eed289a72c0940abe65f847c678650abcbf9c9de --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/posttemplates/01-bind-apparmor @@ -0,0 +1,6 @@ +#!/bin/bash + +# rechargement du profil apparmor pour bind9 +apparmor_parser -r /etc/apparmor.d/usr.sbin.named + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/posttemplates/02-partages b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/posttemplates/02-partages new file mode 100644 index 0000000000000000000000000000000000000000..7afa402cb37edb8241f8360ad74c72caacef9a8a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/posttemplates/02-partages @@ -0,0 +1,12 @@ +#!/bin/bash + +# partages multiples +if [ "$(CreoleGet ad_additional_share non)" = "oui" ]; then + for path in $(CreoleGet ad_additional_share_path); do + if [ ! -d $path ]; then + /bin/mkdir -p $path + chmod g+ws $path + fi + done +fi +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/pretemplates/01-quota b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/pretemplates/01-quota new file mode 100644 index 0000000000000000000000000000000000000000..f93ce90f248b36b11db8a3cfc3900debde98937e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/pretemplates/01-quota @@ -0,0 +1,50 @@ +#! /usr/bin/env python +# -*- coding: utf-8 -*- +"""verify quota +original code: eole-fichier/common/pretemplate/00-fix-home-fstab +""" + +import os +import sys +from pyeole.process import system_out + + +def enable_quota(): + """ + Enable quota on call + """ + os.system('quotacheck -aug') + #le service ne doit pas être en erreur + os.system('systemctl reset-failed quotaon.service 2>/dev/null') + os.system('quotaon -aug') + + +def check_quota(): + """ + Check quota if they are disabled during "instance" time + """ + cmd = ['quotaon', '-pa'] + eni = {"LC_ALL": "C", "LANG": 'C', "PATH": '/sbin'} + _, out, _ = system_out(cmd, env=eni) + status = out.strip().split('\n') + for elm in status: + if not elm.endswith('on'): + return False + return True + + +def main(): + """ + Main program, call quota enable. + """ + #seulement à l'instance + if sys.argv[-1] != 'instance': + sys.exit(0) + + if not check_quota(): + enable_quota() + + +if __name__ == "__main__": + main() + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..a27121c3d572aa753c477aeb1900604e4a1f911e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/service.yml @@ -0,0 +1,98 @@ +format: '0.1' +name: eole-ad-dc +version: |- + 2.7.1-15 +description: |- + configuration du service Samba AD-DC + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: + - eole-server +packages: [] +dictionaries: + - 25_smb_ad.xml + - 30_samba_backup.xml +extra_dictionaries: + schedule: + - 01_samba.xml +templates: + - 90-samba_dynamic_rules + - avscan-samba.yaml + - bareos-samba.conf + - krb5.conf + - named.apparmor.conf + - named.conf + - named.conf.default-zones + - named.conf.local + - named.conf.options + - nsswitch.conf + - recycle.conf + - samba-backup.cron + - samba.logrotate + - samba4-vars.conf + - samba_backup.conf + - seth-samba.list + - smb-ad.conf +creole_funcs: + - cron_schedule.py +preservices: [] +postservices: + - 24-test-synchro-with-time-reference + - 25-manage-samba + - 26-partages +pretemplates: + - 01-quota +posttemplates: + - 01-bind-apparmor + - 02-partages +files: + /usr/lib/eole/iptablesLogger: + owner: root + group: root + mode: '0644' + /usr/lib/eole/samba4.sh: + owner: root + group: root + mode: '0644' + /usr/lib/eole/samba_backup: + owner: root + group: root + mode: '0644' + /usr/share/eole/diagnose/151-AD: + owner: root + group: root + mode: '0755' + /usr/share/eole/sbin/JobSynchroSysvol: + owner: root + group: root + mode: '0755' + /usr/share/eole/sbin/createDnsRecord: + owner: root + group: root + mode: '0755' + /usr/share/eole/sbin/create_adhome.sh: + owner: root + group: root + mode: '0755' + /usr/share/eole/sbin/getADAdminPassword: + owner: root + group: root + mode: '0755' + /usr/share/eole/sbin/getAdminPassword: + owner: root + group: root + mode: '0755' + /usr/share/eole/sbin/join-ad: + owner: root + group: root + mode: '0755' + /usr/share/eole/sbin/validSambaPassword: + owner: root + group: root + mode: '0755' + /usr/share/eole/schedule/scripts/samba_backup: + owner: root + group: root + mode: '0755' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/templates/90-samba_dynamic_rules b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/templates/90-samba_dynamic_rules new file mode 100644 index 0000000000000000000000000000000000000000..613786768e33abe77aec7fbe6eea646da6e60ee6 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/templates/90-samba_dynamic_rules @@ -0,0 +1,59 @@ +#!/bin/sh +%from IPy import IP, IPSet +%if %%getVar('ad_filter_network', 'non') == 'oui' +%set %%peers = IPSet([IP('{}/{}'.format(ip,ip.ad_peer_netmask)) for ip in %%getVar('ad_peer_ip', [])]) +%set %%ldap_clients = IPSet([IP('{}/{}'.format(ip, ip.ad_ldap_clients_netmask)) for ip in %%getVar('ad_ldap_clients_ip', [])]) + %%peers +%else +%set %%peers = IPSet([IP('0.0.0.0/0.0.0.0')]) +%set %%ldap_clients = IPSet([IP('0.0.0.0/0.0.0.0')]) +%end if +%set %%rpc_port = %%getVar('ad_custom_rpc_port', None) +%set %%rpc_port = %%rpc_port if %%rpc_port else '49152:65535' +%set %%netlogon_port = %%getVar('ad_custom_netlogon_port', None) +%set %%netlogon_port = %%netlogon_port if %%netlogon_port else '49152:65535' + +# Ports accessibles pour les serveurs pairs et les clients : +# 53 (DNS), 5353 (broadcast DNS), 123 (NTP), 88 (Kerberos), 445 (SMB CIFS), 135 (MSRPC), 3268 (Global Catalog), 3269 (Global Catalog), [5722 (Microsoft DFS Replication Service)] + +# Ports supplémentaires accessibles pour les clients seulement : +# 464 (kpasswd) + +# Accès étendu pour le ldap +# 389 (ldap), 389 (ldap), 636 (ldaps) + +%for %%int_idx in %%range(0, %%int(%%nombre_interfaces)) +%for %%ip in %%peers +/sbin/iptables -A eth%%{int_idx}-root -s %%ip -p tcp -m tcp --dport 445 --tcp-flags FIN,SYN,RST,ACK SYN -j ACCEPT +/sbin/iptables -A eth%%{int_idx}-root -s %%ip -p tcp -m tcp --dport 135 --tcp-flags FIN,SYN,RST,ACK SYN -j ACCEPT +/sbin/iptables -A eth%%{int_idx}-root -s %%ip -p tcp --syn -m multiport --dports %%rpc_port -j ACCEPT +/sbin/iptables -A eth%%{int_idx}-root -s %%ip -p udp -m multiport --dports %%rpc_port -j ACCEPT +%if %%rpc_port != %%netlogon_port +/sbin/iptables -A eth%%{int_idx}-root -s %%ip -p tcp --syn -m multiport --dports %%netlogon_port -j ACCEPT +/sbin/iptables -A eth%%{int_idx}-root -s %%ip -p udp -m multiport --dports %%netlogon_port -j ACCEPT +%end if +%if %%getVar('ad_server_role', 'membre') == 'controleur de domaine' +/sbin/iptables -A eth%%{int_idx}-root -s %%ip -p udp -m udp --dport 53 -j ACCEPT +/sbin/iptables -A eth%%{int_idx}-root -s %%ip -p tcp -m tcp --dport 53 --tcp-flags FIN,SYN,RST,ACK SYN -j ACCEPT +/sbin/iptables -A eth%%{int_idx}-root -s %%ip -p udp -m udp --dport 5353 -j ACCEPT +/sbin/iptables -A eth%%{int_idx}-root -s %%ip -p tcp -m tcp --dport 5353 --tcp-flags FIN,SYN,RST,ACK SYN -j ACCEPT +/sbin/iptables -A eth%%{int_idx}-root -s %%ip -p udp -m udp --dport 88 -j ACCEPT +/sbin/iptables -A eth%%{int_idx}-root -s %%ip -p tcp -m tcp --dport 88 --tcp-flags FIN,SYN,RST,ACK SYN -j ACCEPT +/sbin/iptables -A eth%%{int_idx}-root -s %%ip -p udp -m udp --dport 5722 -j ACCEPT +/sbin/iptables -A eth%%{int_idx}-root -s %%ip -p tcp -m tcp --dport 5722 --tcp-flags FIN,SYN,RST,ACK SYN -j ACCEPT +/sbin/iptables -A eth%%{int_idx}-root -s %%ip -p tcp -m tcp --dport 3268 --tcp-flags FIN,SYN,RST,ACK SYN -j ACCEPT +/sbin/iptables -A eth%%{int_idx}-root -s %%ip -p tcp -m tcp --dport 3269 --tcp-flags FIN,SYN,RST,ACK SYN -j ACCEPT +%end if +/sbin/iptables -A eth%%{int_idx}-root -s %%ip -p tcp -m tcp --dport 464 --tcp-flags FIN,SYN,RST,ACK SYN -j ACCEPT +/sbin/iptables -A eth%%{int_idx}-root -s %%ip -p udp -m udp --dport 464 -j ACCEPT +%if %%getVar('autoriser_netbios_ports', 'non') == 'oui' +/sbin/iptables -A eth%%{int_idx}-root -s %%ip -p udp -m udp --dport 137 -j ACCEPT +/sbin/iptables -A eth%%{int_idx}-root -s %%ip -p udp -m udp --dport 138 -j ACCEPT +/sbin/iptables -A eth%%{int_idx}-root -s %%ip -p tcp -m tcp --dport 139 --tcp-flags FIN,SYN,RST,ACK SYN -j ACCEPT +%end if +%end for +%for %%ip in %%ldap_clients +/sbin/iptables -A eth%%{int_idx}-root -s %%ip -p udp -m udp --dport 389 -j ACCEPT +/sbin/iptables -A eth%%{int_idx}-root -s %%ip -p tcp -m tcp --dport 389 --tcp-flags FIN,SYN,RST,ACK SYN -j ACCEPT +/sbin/iptables -A eth%%{int_idx}-root -s %%ip -p tcp -m tcp --dport 636 --tcp-flags FIN,SYN,RST,ACK SYN -j ACCEPT +%end for +%end for diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/templates/avscan-samba.yaml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/templates/avscan-samba.yaml new file mode 100644 index 0000000000000000000000000000000000000000..55a27690c156a1871ee878fdb618bb73f899affc --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/templates/avscan-samba.yaml @@ -0,0 +1,23 @@ +--- +type: share +frequency: %%ad_share_scan_when +%if %%ad_share_scan_when == u'heures' +minute: %%ad_share_scan_min +%elif %%ad_share_scan_when == u'jours' +%set %%hour, %%minute = %%ad_share_scan_hour.split(':') +hour: %%hour +minute: %%minute +%elif %%ad_share_scan_when == u'semaines' +%set %%hour, %%minute = %%ad_share_scan_hour.split(':') +hour: %%hour +minute: %%minute +day: %%ad_share_scan_week_day +%elif %%ad_share_scan_when == u'mois' +%set %%hour, %%minute = %%ad_share_scan_hour.split(':') +hour: %%hour +minute: %%minute +day: %%ad_share_scan_monthday +%elif %%ad_share_scan_when == u'personnalisé' +custom: %%ad_share_scan_when_custom +%end if +... diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/templates/bareos-samba.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/templates/bareos-samba.conf new file mode 100644 index 0000000000000000000000000000000000000000..88746b7c1d32eaeea3e26850c6b1433fc2ce1736 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/templates/bareos-samba.conf @@ -0,0 +1,14 @@ +Include { + Options { + aclsupport = yes + signature = md5 + @/etc/bareos/include-options.conf + } + File = /home/sysvol + File = /etc/samba + File = %%samba_backup_dest_dir/bareos +} + +Exclude { + File = %%samba_backup_dest_dir +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/templates/krb5.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/templates/krb5.conf new file mode 100644 index 0000000000000000000000000000000000000000..78534d05d55e4efda4915eb6b9818146d1423502 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/templates/krb5.conf @@ -0,0 +1,21 @@ +[libdefaults] +default_realm = %%ad_realm.upper() +%if %%getVar('ad_server_role') == 'membre' +dns_lookup_realm = true +dns_lookup_kdc = true +%else +dns_lookup_realm = false +dns_lookup_kdc = false + +[realms] +%%ad_realm.upper() = { +kdc = %%adresse_ip_eth0 +%for %%additional_dc in [add_dc for add_dc in %%getVar('ad_additional_dc_ip', []) if add_dc.ad_additional_dc_kdc == 'oui'] +kdc = %%additional_dc +%end for +} + +[domain_realms] +.%%ad_realm = %%ad_realm.upper() +%%ad_realm = %%ad_realm.upper() +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/templates/named.apparmor.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/templates/named.apparmor.conf new file mode 100644 index 0000000000000000000000000000000000000000..6d3f9c59ce454433f530d1a5bb7634931e9be313 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/templates/named.apparmor.conf @@ -0,0 +1,11 @@ +# original file superseded by creole +%if %%getVar('ad_internal_dns_backend', 'oui') == 'non' +/run/samba/winbindd/pipe rw, +/var/lib/samba/bind-dns/dns.keytab r, +/var/lib/samba/bind-dns/named.conf r, +/var/lib/samba/bind-dns/dns/** wrk, +/usr/lib/x86_64-linux-gnu/samba/bind9/dlz_bind9_11.so m, +/usr/lib/x86_64-linux-gnu/samba/gensec/** m, +/usr/lib/x86_64-linux-gnu/samba/ldb/** m, +/usr/lib/x86_64-linux-gnu/ldb/modules/ldb/** m, +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/templates/named.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/templates/named.conf new file mode 100644 index 0000000000000000000000000000000000000000..e0c59ffeacec93e8ec2c5d0bc270641f191a73bb --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/templates/named.conf @@ -0,0 +1,13 @@ +// This is the primary configuration file for the BIND DNS server named. +// +// Please read /usr/share/doc/bind9/README.Debian.gz for information on the +// structure of BIND configuration files in Debian, *BEFORE* you customize +// this configuration file. +// +// If you are just adding zones, please do that in /etc/bind/named.conf.local +include "/etc/bind/named.conf.options"; +include "/etc/bind/named.conf.local"; +include "/etc/bind/named.conf.default-zones"; +%if %%getVar('ad_ro_dc', 'non') == 'non' +include "/var/lib/samba/bind-dns/named.conf"; +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/templates/named.conf.default-zones b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/templates/named.conf.default-zones new file mode 100644 index 0000000000000000000000000000000000000000..355338bdaa5884d4d0a6bbbd24ada842435f9044 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/templates/named.conf.default-zones @@ -0,0 +1,30 @@ +// prime the server with knowledge of the root servers +zone "." { + type hint; + file "/etc/bind/db.root"; +}; + +// be authoritative for the localhost forward and reverse zones, and for +// broadcast zones as per RFC 1912 + +zone "localhost" { + type master; + file "/etc/bind/db.local"; +}; + +zone "127.in-addr.arpa" { + type master; + file "/etc/bind/db.127"; +}; + +zone "0.in-addr.arpa" { + type master; + file "/etc/bind/db.0"; +}; + +zone "255.in-addr.arpa" { + type master; + file "/etc/bind/db.255"; +}; + + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/templates/named.conf.local b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/templates/named.conf.local new file mode 100644 index 0000000000000000000000000000000000000000..7a57b10196ec182fb6bdc9f7d89c772447c69502 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/templates/named.conf.local @@ -0,0 +1,8 @@ +// +// Do any local configuration here +// + +// Consider adding the 1918 zones here, if they are not used in your +// organization +//include "/etc/bind/zones.rfc1918"; + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/templates/named.conf.options b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/templates/named.conf.options new file mode 100644 index 0000000000000000000000000000000000000000..2980dae1a2109718d5cb5a63833e4e3c21c1a2c0 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/templates/named.conf.options @@ -0,0 +1,48 @@ +acl transfer_acl { +%if %%getVar('ad_allow_transfer_network') + %import IPy + %set %%allowed_network = [IPy.IP('{}/{}'.format(ip, ip.ad_allow_transfer_netmask), make_net=True) for ip in %%getVar('ad_allow_transfer_network')] + %if IPy.IP('0.0.0.0/0.0.0.0', make_net=True) in %%allowed_network + any; + %else + %%custom_join(%%allowed_network, ';\n '); + %end if +%else + none; +%end if +}; + +options { + directory "/var/cache/bind"; + + // If there is a firewall between you and nameservers you want + // to talk to, you may need to fix the firewall to allow multiple + // ports to talk. See http://www.kb.cert.org/vuls/id/800113 + + // If your ISP provided one or more IP addresses for stable + // nameservers, you probably want to use them as forwarders. + // Uncomment the following block, and insert the addresses replacing + // the all-0's placeholder. +%if not %%is_empty(%%adresse_ip_dns) + forwarders { +%for %%variable_iter in %%adresse_ip_dns + %%variable_iter; +%end for + }; + forward only; +%end if + + dnssec-enable no; + dnssec-validation no; + + allow-query {any;}; + + allow-transfer {transfer_acl;}; + + auth-nxdomain no; # conform to RFC1035 + listen-on-v6 { any; }; +%if %%getVar('ad_ro_dc', 'non') == 'non' + tkey-gssapi-keytab "/var/lib/samba/bind-dns/dns.keytab"; +%end if +}; + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/templates/nsswitch.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/templates/nsswitch.conf new file mode 100644 index 0000000000000000000000000000000000000000..5076d6ee8442a03aa9f618ecec5e71807c7b2e67 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/templates/nsswitch.conf @@ -0,0 +1,20 @@ +# /etc/nsswitch.conf +# +# Example configuration of GNU Name Service Switch functionality. +# If you have the `glibc-doc-reference' and `info' packages installed, try: +# `info libc "Name Service Switch"' for information about this file. + +passwd: compat winbind +group: compat winbind +shadow: compat +gshadow: files + +hosts: files dns +networks: files + +protocols: db files +services: db files +ethers: db files +rpc: db files + +netgroup: nis diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/templates/recycle.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/templates/recycle.conf new file mode 100644 index 0000000000000000000000000000000000000000..75baba3c88edd0c6aa83e92f092ba75de17a6bf7 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/templates/recycle.conf @@ -0,0 +1,30 @@ +##Recycle Bin Configuration File## +#http://samba.org/samba/docs/man/Samba-HOWTO-Collection/VFS.html#id409802 +#http://ubuntuforums.org/showthread.php?t=155763 +#http://www.redhat.com/advice/tips/sambatrash.html +#recycle:name = Recycle Bin +#recycle:mode = KEEP_DIRECTORIES|VERSIONS|TOUCH +recycle:repository = %%ad_recycle_bin_dir + +# Files that are larger than the number of bytes specified by this parameter will not be put into the recycle bin. +recycle:maxsize = 5000000 + +# Specifies whether the directory structure should be kept +# or if the files in the directory that is being deleted should be kept separately in the recycle bin. +recycle:keeptree = Yes + +# Specifies whether a file's access date should be touched when the file is moved to the recycle bin. +recycle:touch = Yes + +# If this option is set, two files with the same name that are deleted will both be kept in the recycle bin +# Newer deleted versions of a file will be called “Copy #x of filenameâ€. +recycle:versions = No + +# List of files that should not be put into the recycle bin when deleted, but deleted in the regular way. +recycle:exclude = *.tmp,*.temp,*.o,*.obj,~$*,*.~??,*.avi,*.mp2,*.mp3,*.mp4,*.mpg,*.mpeg,*.asf,*.mov,*.wav,*.rm,*.iso,*.cue,*.bin,*.nrg,*.ccd,*.vob,*.mkv,*.wmv,*.wma,.scanned:* + +# Contains a list of directories. When files from these directories are deleted, they are not put into the recycle bin but are deleted in the regular way. +recycle:exclude_dir = %%os.path.basename(%%ad_recycle_bin_dir) + +# Specifies a list of paths (wildcards such as * and ? are supported) for which no versioning should be used. Only useful when recycle:versions is enabled. +#noversions = *.doc|*.ppt|*.dat|*.ini diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/templates/samba-backup.cron b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/templates/samba-backup.cron new file mode 100644 index 0000000000000000000000000000000000000000..20f681001e2a54000eeaec704439af7d3e0d2cde --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/templates/samba-backup.cron @@ -0,0 +1,3 @@ +%if %%getVar('activer_samba_backup', 'non') == 'oui' and %%getVar('samba_backup_bareos', 'non') == 'non' +%%interval_to_cron_schedule(%%samba_backup_interval) root /usr/share/eole/schedule/scripts/samba_backup cron +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/templates/samba.logrotate b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/templates/samba.logrotate new file mode 100644 index 0000000000000000000000000000000000000000..032f55d8c53d54acf7b6165a29cd3cbe2efe4fcf --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/templates/samba.logrotate @@ -0,0 +1,22 @@ +%if %%ad_server_role == 'controleur de domaine' +/var/log/samba/log.smbd +/var/log/samba/log.samba { +%else +/var/log/samba/log.nmbd +/var/log/samba/log.smbd { +%end if + weekly + missingok + rotate 7 + sharedscripts + postrotate +%if %%ad_server_role == 'controleur de domaine' + service samba-ad-dc force-reload +%else + service nmbd reload > /dev/null + service smbd reload > /dev/null +%end if + endscript + compress + notifempty +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/templates/samba4-vars.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/templates/samba4-vars.conf new file mode 100644 index 0000000000000000000000000000000000000000..3105bf616bef39ba1173293ef1b41d6cbb22f5de --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/templates/samba4-vars.conf @@ -0,0 +1,70 @@ +AD_REALM='%%ad_realm' +AD_DOMAIN='%%ad_domain' +AD_HOST_NAME='%%nom_machine' +AD_HOST_IP='%%adresse_ip_eth0' +NOM_CARTE_NIC1='%%nom_zone_eth0' +AD_SERVER_ROLE='%%ad_server_role' +BASEDN="DC=%echo ',DC='.join(%%ad_realm.split('.')) + '"' + +NTP_SERVERS='%%custom_join(%%serveur_ntp, " ")' + +%if %%is_defined('ad_additional_dc_ip') and not %%is_empty(%%ad_additional_dc_ip) +# Sur les contrôleurs de domaine donner la liste des autres contrôleurs du même domaine +AD_ADDITIONAL_DC_IP='%slurp + %for %%variable_iter in %%ad_additional_dc_ip +%%variable_iter %slurp + %end for +' +%end if + +# Only if role is domain controler +%if %%getVar('ad_force_domain_sid', 'non') == 'oui' +AD_DOMAIN_SID='%%getVar("ad_domain_sid")' +%else +AD_DOMAIN_SID='' +%end if +AD_ADDITIONAL_DC='%%getVar("ad_additional_dc", "non")' +%if %%getVar('ad_internal_dns_backend', 'oui') == 'oui' +AD_DNS_BACKEND='SAMBA_INTERNAL' +%else +AD_DNS_BACKEND='BIND9_DLZ' +%end if + +# Only if role is domain controler and is additionnal DC +%if %%getVar('ad_additional_dc', 'non') == 'oui' + %if %%getVar('ad_ro_dc', 'non') == 'oui' +AD_SERVER_MODE='RO' + %else +unset AD_SERVER_MODE + %end if +AD_ADDITIONAL_DC_FORCE_SITE='%%ad_additional_dc_force_site' + %if %%ad_additional_dc_force_site == 'oui' +DC_SITE='%%ad_additional_dc_site' + %else +DC_SITE='Default-First-Site-Name' + %end if +# Pour les contrôleurs de domaine additionnels donner l'IP du contrôleur de référence +AD_DC_SYSVOL_REF='%%ad_dc_sysvol_ref' +AD_DC_SYSVOL_TYPE='%%ad_dc_sysvol_type' + %if %%getVar('ad_dc_sysvol_type', 'seth') == 'samba' +AD_DC_SYSVOL_POST_JOIN_CMD='%%ad_dc_sysvol_post_join_cmd' + %end if +%end if + +AD_ADMIN='Administrator' +AD_ADMIN_PASSWORD_FILE='/var/lib/samba/.eole-ad-dc' +AD_HOST_KEYTAB_FILE='/var/lib/samba/eole-ad-dc.keytab' + +ACTIVER_AD_HOMES_SHARE='%%activer_ad_homes_share' +ACTIVER_AD_PROFILES_SHARE='%%activer_ad_profiles_share' +AD_HOMES_SHARE_HOST_NAME='%%getVar("ad_homes_share_host", "")' +AD_PROFILES_SHARE_HOST_NAME='%%getVar("ad_profiles_share_host", "")' +AD_HOME_SHARE_PATH='%%getVar("ad_home_share_path","/home/adhomes")' +AD_PROFILE_SHARE_PATH='%%getVar("ad_profile_share_path","/home/adprofiles")' + +AD_INSTANCE_LOCK_FILE='/var/lib/samba/.instance_ok' + +%if %%getVar("ad_server_role", 'non') == 'controleur de domaine' +AD_BACKEND_STORE='%%ad_backend_store' +AD_PLAINTEXT_SECRETS='%%ad_plaintext_secrets' +%end if \ No newline at end of file diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/templates/samba_backup.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/templates/samba_backup.conf new file mode 100644 index 0000000000000000000000000000000000000000..a302969b456ef52381cd119b0156be6f63a24f33 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/templates/samba_backup.conf @@ -0,0 +1,19 @@ +#!/bin/bash +%if %%getVar('activer_samba_backup', 'non') == 'oui' +# configuration variables for samba_backup script + %if %%getVar('samba_backup_bareos', 'non') == 'oui' +# export only ldb (using tdbbackup) +WHEN_FORMAT="--iso-8601" + %else + %if %%int(%%samba_backup_interval) < 24 +WHEN_FORMAT="--iso-8601=minutes" + %else +WHEN_FORMAT="--iso-8601" + %end if + %end if +WHERE=%%samba_backup_dest_dir +DAYS=%%samba_backup_retention +SERVER=%%nom_domaine_machine + %else +# Pas d’archivage configuré sur ce serveur. +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/templates/seth-samba.list b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/templates/seth-samba.list new file mode 100644 index 0000000000000000000000000000000000000000..e3941d4de645391ab4966ff709fe194691c2dc2d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/templates/seth-samba.list @@ -0,0 +1,2 @@ +%set %%_eole_serveur = %%_mirror_eole.rstrip('/eole') + '/samba' +deb [ arch=amd64 ] %%_eole_serveur samba-4.9 main diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/templates/smb-ad.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/templates/smb-ad.conf new file mode 100644 index 0000000000000000000000000000000000000000..29b0d9b6f03065fea9cca771f01d7ae9481b2423 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad-dc/templates/smb-ad.conf @@ -0,0 +1,196 @@ +%from pyeole.process import system_out +%from distutils.version import StrictVersion +%import re +%def samba_more_recent_than(%%version) + %set %%samba_version = %%system_out(['samba', '-V'])[1] + %set %%samba_version = %%StrictVersion(re.search(r'version (?P<version>[0-9]+\.[0-9]+\.[0-9]+).*', samba_version, re.I).group('version')) + %set %%version = %%StrictVersion(%%version) + %return %%samba_version >= %%version +%end def +%set global %%transcript_ouinon = {'oui': 'yes', 'non': 'no'} +%def get_slave(%%slave, %%iterator, %%default) +%if %%hasattr(%%iterator, %%slave) +%set %%value = %%getattr(%%iterator, %%slave) +%else +%set %%value = %%default +%end if +%return %%value +%end def +%def print_option(%%option, %%slave, %%iterator) +%if %%hasattr(%%iterator, %%slave) +%set %%value = %%getattr(%%iterator, %%slave) +%if %%value != None +%if %%transcript_ouinon.has_key(%%value) +%set %%value = %%transcript_ouinon[%%value] +%end if +%return ' {} = {}'.format(%%option, %%value) +%end if +%end if +%end def + +# Global parameters +[global] + realm = %%ad_realm.upper() + workgroup = %%ad_domain.upper() + netbios name = %%ad_server_netbios_name.upper() + +%if %%getVar('autoriser_netbios_ports', 'non') == 'oui' + disable netbios = no + smb ports = 445 139 +%else + # disable netbios legacy protocol, only port 445 ! + disable netbios = yes + smb ports = 445 +%end if + +%set %%samba_minimal_version = '4.6.0' +%if %%samba_more_recent_than(%%samba_minimal_version) == True +%if %%getVar('ad_custom_rpc_port', None) is not None + rpc server port = %%ad_custom_rpc_port +%end if +%if %%getVar('ad_custom_netlogon_port', None) is not None + rpc server port:netlogon = %%ad_custom_netlogon_port +%end if +%end if + + vfs objects = acl_xattr + map acl inherit = Yes + store dos attributes = Yes + winbind separator = / + +%if %%ad_server_role == 'controleur de domaine' + %set %%excluded_services = [] + server role = active directory domain controller +%if %%getVar('ad_ro_dc', 'non') == 'oui' +%silent %%excluded_services.append('-kcc') +%end if +%if %%getVar('ad_internal_dns_backend', 'oui') == 'non' +%silent %%excluded_services.append('-dns') +%import IPy +%set %%allowed_networks = [IPy.IP('{}/{}'.format(ip, ip.ad_allow_transfer_netmask), make_net=True) for ip in %%getVar('ad_allow_transfer_network')] +%set %%allowed_ips = [ip for nw in %%allowed_networks for ip in nw] + dns zone transfer clients = %%custom_join(%%allowed_ips, ',') +%else +%if not %%is_empty(%%adresse_ip_dns) +%set %%samba_minimal_version = '4.5.0' +%if %%samba_more_recent_than(%%samba_minimal_version) == True + dns forwarder = %%custom_join(%%adresse_ip_dns, ' ') +%else + dns forwarder = %%adresse_ip_dns[0] +%end if +%end if +%end if + %if %%excluded_services + server services = %%custom_join(%%excluded_services) + %end if + + # active TLS (pour LDAPS et la maj des mot de passe ! + tls enabled = yes + tls keyfile = /var/lib/samba/private/tls/key.pem + tls certfile = /var/lib/samba/private/tls/cert.pem + tls cafile = /var/lib/samba/private/tls/ca.pem +%if %%ad_hash_sha_256 == 'oui' or %%ad_hash_sha_512 == 'oui' + password hash userPassword schemes = %slurp + %if %%ad_hash_sha_256 == 'oui' +CryptSHA256%slurp + %if not %%is_empty(%%ad_hash_sha_256_rounds) +:rounds=%%ad_hash_sha_256_rounds%slurp + %end if + %end if + %if %%ad_hash_sha_512 == 'oui' + CryptSHA512%slurp + %if not %%is_empty(%%ad_hash_sha_512_rounds) +:rounds=%%ad_hash_sha_512_rounds%slurp + %end if + %end if + +%end if + +%set %%log_level = [%%ad_log_global_level] +%silent %%log_level.extend(['{}:{}'.format(ll, ll.ad_log_specific_level) for ll in %%ad_log_specific_event]) + log level = %%custom_join(%%log_level, ' ') + +[netlogon] + comment = Network Logon Service + path = /home/sysvol/%%ad_realm/scripts + read only = No + guest ok = yes + +[sysvol] + comment = Sysvol Service + path = /home/sysvol + read only = No + guest ok = yes + +%elif %%ad_server_role == 'membre' + # serveur membre, pas de server role ! + security = ADS + #dedicated keytab file = /etc/krb5.keytab + #kerberos method = secrets and keytab + +%if %%getVar('ad_idmap_config_auto', 'oui') == 'non' + idmap config * : backend = tdb + idmap config * : range = %%{ad_idmap_config_tdb_low}-%%{ad_idmap_config_tdb_high} +%for %%idmap_config_domain in %%ad_idmap_config_domain + + idmap config %%idmap_config_domain:backend = %%idmap_config_domain.ad_idmap_config_backend + idmap config %%idmap_config_domain:range = %%{idmap_config_domain.ad_idmap_config_low}-%%{idmap_config_domain.ad_idmap_config_high} +%end for +%else + idmap config *:backend = autorid + idmap config *:range = 1000000-19999999 +%end if + + winbind enum users = yes + winbind enum groups = yes + winbind refresh tickets = Yes +%end if + +%if %%activer_ad_homes_share == 'oui' +[homes] +%if %%getVar('ad_recycle_bin', 'non') == 'oui' +%if %%getVar('ad_homes_share_recycle', 'non') == 'oui' +%set vfs_objects = ['acl_xattr', ] +%%vfs_objects.append('recycle') + vfs objects = %%custom_join(%%vfs_objects, ' ') + include = /etc/samba/recycle.conf +%end if +%end if + path = "%%ad_home_share_path/%u" + root preexec = /usr/share/eole/sbin/create_adhome.sh "%u" "%%ad_home_share_path" + comment = Home Directories + read only = no + invalid users = nobody guest +%end if + +%if %%activer_ad_profiles_share == 'oui' +[profiles] + comment = Profiles + path = "%%ad_profile_share_path" + read only = No + invalid users = nobody guest +%end if + +%if %%ad_additional_share == 'oui' +%for %%share in %%ad_additional_share_name +[%%share] +%if %%getVar('ad_recycle_bin', 'non') == 'oui' +%if %%get_slave('ad_additional_share_recycle', %%share, 'non') == 'oui' +%set vfs_objects = ['acl_xattr', ] +%%vfs_objects.append('recycle') + vfs objects = %%custom_join(%%vfs_objects, ' ') + include = /etc/samba/recycle.conf +%end if +%end if + path = %%share.ad_additional_share_path +%%print_option('comment', 'ad_additional_share_comment', %%share) +%%print_option('writeable', 'ad_additional_share_writeable', %%share) +%%print_option('browseable', 'ad_additional_share_browseable', %%share) +%%print_option('create mask', 'ad_additional_share_create_mask', %%share) +%%print_option('directory mask', 'ad_additional_share_directory_mask', %%share) +%end for +%end if + +%for %%i in %%list_files('/etc/samba/conf.d/', '*.conf', basename=False) +include = %%i +%end for diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/dictionaries/00_eole-ad_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/dictionaries/00_eole-ad_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..95bce6c3b351348d646a2ab33e36fd99be40f30a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/dictionaries/00_eole-ad_packages.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>krb5-config</package> + <package>krb5-user</package> + <package>lsc</package> + <package>openjdk-8-jre</package> + <package>libcrypt-saltedhash-perl</package> + <package>recode</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/dictionaries/26_eolead.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/dictionaries/26_eolead.xml new file mode 100644 index 0000000000000000000000000000000000000000..66a57fb64ba789823998fa0c84ad49f388a8b8eb --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/dictionaries/26_eolead.xml @@ -0,0 +1,102 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + <file filelist='eolead' name='/etc/krb5.conf'/> + <file filelist='eolead' name='/etc/default/lsc' source='lsc.default'/> + <file filelist='eolead' name='/etc/default/eole-lsc' source='eole-lsc.default'/> + <file filelist='eolead' name='/etc/eole/lsc.xml'/> + <file filelist='eolead' name='/etc/samba/smb.conf' source='global_smb_ad.tmpl'/> + </files> + + <containers> + <container name='fichier'> + <file filelist='eolead' name='/etc/resolv.conf' source='ad-resolv.conf'/> + </container> + </containers> + + <variables> + <family name='général'> + <variable name='adresse_ip_dns' redefine="True" mandatory="True"/> + <variable name='nom_domaine_local' redefine="True" auto_freeze='True' description='Nom DNS du réseau local et du Realm'/> + </family> + <family name='Interface-0'> + <variable name='adresse_ip_gw' redefine="True" mandatory="True"/> + </family> + <family name='services'> + <variable name='activer_ad' description="Activer EoleAD" hidden='True'> + <value>oui</value> + </variable> + </family> + <family name='Mots de passe'> + <variable name='smb_min_password_length' redefine='True'> + <value>8</value> + </variable> + <variable name='smb_min_password_class' redefine='True'> + <value>3</value> + </variable> + </family> + <family name='EoleAD' icon='group'> + <variable name='ad_server' type='string' description="Nom du serveur Active Directory" mandatory='True'/> + <variable name='ad_domain' type='string' description="Nom complet du domaine Active Directory" /> + <variable name='ad_workgroup' type='string' description="Nom du domaine Active Directory" mandatory='True'/> + <variable name='ad_address' type='ip' description="Adresse IP du serveur Active Directory" mandatory='True'/> + <variable name='ad_rescue' type='ip' description="Adresse IP du serveur DNS de secours"/> + <variable name='ad_user' type='string' description="Compte administrateur du domaine AD"> + <value>Administrateur</value> + </variable> + <variable name='ad_container' type='string' description="Conteneur Active Directory hébergeant les comptes du module EOLE"> + <value>CN=Users</value> + </variable> + <variable name='ad_ou_users_etab' type='string' description="UO hébergeant les comptes des utilisateurs et groupes dans un établissement"> + <value>OU=Utilisateurs</value> + </variable> + <variable name='ad_ldaps' type='oui/non' description="Synchroniser l'annuaire en LDAPS"> + <value>non</value> + </variable> + </family> + <family name='samba'> + <variable name='smb_os_level' redefine='True' hidden='True'> + <value>0</value> + </variable> + <variable name='smb_workgroup' redefine='True' hidden='True'/> + </family> + <family name='openldap' mode='expert'> + <!-- réplication LDAP forcée pour lsc --> + <variable name='ldap_replication' redefine='True' hidden='True'> + <value>oui</value> + </variable> + </family> + </variables> + + <constraints> + <check name='valid_name' target='ad_server'/> + <check name='valid_domaine' target='ad_domain'/> + <fill name='calc_val' target='ad_domain'> + <param type='eole' name='valeur'>nom_domaine_local</param> + </fill> + <auto name='extract_ad_domain_from_realm' target='ad_workgroup'> + <param type='eole'>ad_domain</param> + </auto> + <fill name='calc_val' target='smb_workgroup'> + <param type='eole'>ad_workgroup</param> + </fill> + <condition name='disabled_if_in' source='ead_support_multietab' fallback='True'> + <param>non</param> + <target type='variable'>ad_ou_users_etab</target> + </condition> + </constraints> + + <help> + <family name='EoleAD'>Configuration de l'intégration EOLE - Active Directory</family> + <variable name='ad_domain'>Saisir le nom de domaine complet (realm)</variable> + <variable name='ad_workgroup'>Nom de domaine (anciennement Workgroup)</variable> + <variable name='ad_rescue'>Serveur Active Directory de secours</variable> + <variable name='ad_ou_users_etab'>En mode multi-établissement, définit le nom de l'unité organisationnelle Active Directory dans laquelle sont stockés les comptes de chacun des établissements ajoutés</variable> + <variable name='ad_ldaps'>La synchronisation des comptes en LDAPS est plus sécurisée mais nécessite l’enregistrement des certificats d'autorité du serveur AD dans un fichier Java keystore</variable> + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/extra_dictionaries/schedule/01_eolead.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/extra_dictionaries/schedule/01_eolead.xml new file mode 100644 index 0000000000000000000000000000000000000000..085cec163858a461d9f5fb86946a288b350b685b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/extra_dictionaries/schedule/01_eolead.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + <variables> + <family name='eolead'> + <variable name="description" type="string"><value>Synchronisation LSC</value></variable> + <variable name="day" type="schedule"><value>daily</value></variable> + <variable name="mode" type="schedulemod"><value>post</value></variable> + </family> + </variables> + <constraints> + </constraints> +</creole> + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/files/lib/systemd/system/eole-lsc.service b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/files/lib/systemd/system/eole-lsc.service new file mode 100644 index 0000000000000000000000000000000000000000..e9426e96f62274fdb158c5ef13d4d84c181d1aef --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/files/lib/systemd/system/eole-lsc.service @@ -0,0 +1,13 @@ +[Unit] +Description=Eole LSC +After=lxc.service + +[Service] +Type=oneshot +RemainAfterExit=yes +ExecStart=/usr/sbin/eolelsc start +ExecStop=/usr/sbin/eolelsc stop +StandardOutput=journal + +[Install] +WantedBy=multi-user.target diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/files/usr/sbin/changepasswordeole.pl b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/files/usr/sbin/changepasswordeole.pl new file mode 100644 index 0000000000000000000000000000000000000000..9b7497a0cb136e9ded81fb2872dfe10bf67047f8 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/files/usr/sbin/changepasswordeole.pl @@ -0,0 +1,149 @@ +#!/usr/bin/perl -w +#====================================================== +# Change password script for EOLE +# +# AUTHOR Clement OUDOT AT linagora DOT com +#====================================================== + +use strict; +use Net::LDAP; +use Crypt::SmbHash qw(lmhash nthash); +use Crypt::SaltedHash; +use Unicode::String qw(utf8); +use smbldap_tools; + +## PARAMETERS +my ( $user, $password, $changePwd ) = splice @ARGV; +unless ( $user && $password ) { + print STDERR "Usage: $0 [user] [password] [changePwd]\n"; + exit 1; +} + +## CONFIG +# OpenLDAP/Samba (use $config from smbldap-tools) +my $openldap_server = $config{masterLDAP}; +my $openldap_binddn = $config{masterDN}; +my $openldap_bindpw = $config{masterPw}; +my $openldap_base = "ou=education,$config{suffix}"; +my $openldap_filter = "(&(objectClass=inetOrgPerson)(uid=$user))"; +my $openldap_scope = "sub"; +my $openldap_attrs = ['1.1']; +my $openldap_use_ssha = 1; + +# Active Directory +my $ad_server = "$config{adserver}"; +my $ad_binddn = "$config{aduser}"; +my $ad_bindpw = "$config{adpassword}"; +my $ad_base = "$config{adbase}"; +my $ad_filter = "(&(objectClass=person)(sAMAccountName=$user))"; +my $ad_scope = "sub"; +my $ad_attrs = ['1.1']; + +## INIT CHECKS +unless ( defined $openldap_server ) { + print STDERR "OpenLDAP configuration missing\n"; + exit 1; +} + +## SUBROUTINES +sub connect { + my ( $server, $binddn, $bindpw ) = splice @_; + + my $ldap = Net::LDAP->new( $server, version => 3 ); + + if ($@) { + print STDERR "Unable to connect to $server ($@)\n"; + exit 1; + } + + my $bind = $ldap->bind( $binddn, password => $bindpw ); + + if ( $bind->is_error ) { + print STDERR "Unable to bind to $server with $binddn (" + . $bind->error . ")\n"; + exit 1; + } + + return $ldap; +} + +sub get_user { + my ( $ldap, $base, $filter, $scope, $attrs ) = splice @_; + + my $search = $ldap->search( + base => $base, + filter => $filter, + scope => $scope, + attrs => $attrs + ); + + if ( $search->is_error ) { + print STDERR "Unable to search user $user (" . $search->error . ")\n"; + exit 1; + } + + if ( $search->count > 1 ) { + print STDERR "More than one user $user found\n"; + exit 1; + } + + if ( $search->count < 1 ) { + print STDERR "User $user not found\n"; + exit 3; + } + + my $entry = $search->shift_entry; + + return $entry; +} + +sub modify_password { + my ( $ldap, $dn, $attr, $value ) = splice @_; + + my $modify = $ldap->modify( $dn, replace => { $attr => $value } ); + + if ( $modify->is_error ) { + print STDERR "Unable to modify $attr for $dn (" + . $modify->error . ")\n"; + exit 1; + } + + return 1; +} + +## MAIN +# Change password in OpenLDAP +my $openldap = &connect( $openldap_server, $openldap_binddn, $openldap_bindpw ); +my $openldap_entry = &get_user( + $openldap, $openldap_base, $openldap_filter, + $openldap_scope, $openldap_attrs +); + +my $userpassword = $password; +if ($openldap_use_ssha) { + my $csh = Crypt::SaltedHash->new( algorithm => 'SHA-1' ); + $csh->add($password); + my $salted = $csh->generate; + $userpassword = $salted; +} + +&modify_password( $openldap, $openldap_entry->dn, 'userPassword', + $userpassword ); +&modify_password( $openldap, $openldap_entry->dn, 'sambaLMPassword', + lmhash $password ); +&modify_password( $openldap, $openldap_entry->dn, 'sambaNTPassword', + nthash $password ); + +# Change passord in AD if configured +if ($ad_server) { + my $ad = &connect( $ad_server, $ad_binddn, $ad_bindpw ); + my $ad_entry = &get_user( $ad, $ad_base, $ad_filter, $ad_scope, $ad_attrs ); + &modify_password( $ad, $ad_entry->dn, 'unicodePwd', utf8( chr(34) . ${password} . chr(34) )->utf16le() ); + if( defined $changePwd && $changePwd == 1 ) { + &modify_password( $ad, $ad_entry->dn, 'pwdLastSet', '0' ); + } +} + +## END +print "Password changed\n"; +exit 0; diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/files/usr/sbin/eolelsc b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/files/usr/sbin/eolelsc new file mode 100644 index 0000000000000000000000000000000000000000..e2cc148720ba0b40ac3cb5936edbe5722223b988 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/files/usr/sbin/eolelsc @@ -0,0 +1,39 @@ +#!/bin/bash + +DEFAULT="/etc/default/eole-lsc" + +if [ ! -f $DEFAULT ];then + echo "Le fichier $DEFAULT est absent" + exit 1 +fi + +. $DEFAULT + +waitsmb() { + echo "Attente du lancement du service samba-ad-dc" + while [ !$samba_up ]; do + tcpcheck 3 $AD_ADDRESS:636 > /dev/null + if [ "$?" = "0" ]; then + samba_up=true + break + else + echo "Le serveur samba-ad-dc ne répond pas" + sleep 1 + fi + done +} + +case $1 in + start) + waitsmb + /etc/init.d/lsc start + ;; + stop) + /etc/init.d/lsc stop + ;; + *) + exit 1 + ;; +esac + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/files/usr/sbin/get_list_etablissement.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/files/usr/sbin/get_list_etablissement.py new file mode 100644 index 0000000000000000000000000000000000000000..62cec0667b4c92ad36bae31a22eacf574df89213 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/files/usr/sbin/get_list_etablissement.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +from scribe.eoleldap import Ldap +from ldap import SCOPE_ONELEVEL, modlist +from scribe.ldapconf import SUFFIX, acad, num_etab + +def get_liste_etabs_with_rne(): + conn = Ldap() + conn.connect() + suffix = "ou=%s,ou=education,%s" % (acad, SUFFIX) + etabs = conn.connexion.search_s(suffix, SCOPE_ONELEVEL,'(ou=*)', ['ou']) + conn.close() + if etabs == None: + raise Exception('Impossible de récuperer des établissements dans %s' % suffix) + list_etabs = [] + for etab in etabs: + list_etabs.extend(etab[1]['ou']) + return list_etabs + +if __name__ == '__main__': + print ('\n'.join( get_liste_etabs_with_rne() ) ) \ No newline at end of file diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/files/usr/sbin/lsc-keygen b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/files/usr/sbin/lsc-keygen new file mode 100644 index 0000000000000000000000000000000000000000..21946eaaec164b358e2505c69f41434ceab7a453 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/files/usr/sbin/lsc-keygen @@ -0,0 +1,184 @@ +#!/bin/bash + +#==================================================================== +# Script for LDAP Synchronization Connector +# +# Launch synchronize task with correct classpath +# +# ==LICENSE NOTICE== +# +# Copyright (c) 2008-2010, LSC Project +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: + +#  * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +#   * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +#   * Neither the name of the LSC Project nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +# IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER +# OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# ==LICENSE NOTICE== +# +# (C) 2008-2010 LSC Project +# Clement OUDOT <clem@lsc-project.org> +# Jonathan CLARKE <jon@lsc-project.org> +# +#==================================================================== +# Possible exit codes: +# - 0: success, LSC finished running +# - 1: LSC seems to be already running, aborting +# - 2: 'java' executable not found on PATH or in JAVA_HOME, aborting +#==================================================================== + +# work out where LSC lives +LSC_HOME=$(dirname "${BASH_SOURCE}")/.. +if [ ${LSC_HOME:0:1} != "/" ] ; then + LSC_HOME="${PWD}/${LSC_HOME}" +fi + +#==================================================================== +# Configuration +#==================================================================== + +CFG_DIR="$LSC_HOME/etc" +LIB_DIR="$LSC_HOME/lib" +LOG_DIR="/tmp" +LOG_FILE="$LOG_DIR/lsc.log" + +mkdir -p "$LOG_DIR" + +PARAMETERS="$*" + +#==================================================================== +# Functions +#==================================================================== +function log() { + echo "$(date "+${DATE_FORMAT:-%Y/%m/%d %T}") [lsc] $1" >> "$LOG_FILE" +} + +function fatal() { + log $1 + echo "$(date "+${DATE_FORMAT:-%Y/%m/%d %T}") [lsc] $1" 1>&2 +} + +# Determine where the java exectuable is +function get_java() { + # Do we have a JAVA_HOME environment variable? + if [ "z" != "z${JAVA_HOME}" ]; then + JAVA_COMMAND="${JAVA_HOME}/bin/java" + return + fi + + # Try java command on PATH as an alternative + JAVA_COMMAND="$(which java 2>/dev/null)" + if [ -e "$JAVA_COMMAND" ]; then return; fi + + # Nothing seems approprite, warn and exit + fatal "No java executable found on PATH or in JAVA_HOME! Aborting." + fatal "Define JAVA_HOME or adjust your PATH variable to include java." + exit 2 +} + +function build_classpath() { + # Force SLF4J API library before anything else ! + CLASSPATH="$CLASSPATH:.:$(ls $LIB_DIR/slf4j-api*.jar)" + for jar in "$LIB_DIR"/*.jar + do + CLASSPATH="$CLASSPATH:$jar" + done + + # is this Cygwin? if so, convert path to Windows format for the JVM + CYGPATH_COMMAND="$(which cygpath 2>/dev/null)" + if [ -e "$CYGPATH_COMMAND" ]; then + CLASSPATH=$(cygpath -p -w "$CLASSPATH") + fi + + export CLASSPATH +} + +function build_parameters() { + # Force configuration directory if no -f option + echo "$PARAMETERS" | grep '\-f ' > /dev/null + if [ $? != 0 ]; then + PARAMETERS="$PARAMETERS -f $CFG_DIR" + fi + + export PARAMETERS +} + +# Function to know if the command will run a task +function is_run_command() { + echo "$PARAMETERS" | grep '\-c \|\-s \|\-a ' > /dev/null + if [ $? -eq 0 ] + then + return 1 + else + return 0 + fi +} + +#==================================================================== +# Main +#==================================================================== + +# check if we have java executable +get_java + +# Do we reaaly run a task? +is_run_command +run_status=$? + +# LSC start message +if [ $run_status -eq 1 ] +then + log "Starting LSC" +fi + +# JMX +for param in $PARAMETERS; do + if [ "$param" == "-a" ]; then + if [ -n "$LSC_JMXPORT" ]; then + export JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=$LSC_JMXPORT -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false" + log "Using JMX port $LSC_JMXPORT" + else + echo "LSC: to control your asynchronous task(s), consider setting the LSC_JMXPORT " + echo "environment variable to a positive value to bind the JMX interface to that " + echo "TCP port." + log "JMX not activated" + fi + fi +done + +build_classpath +build_parameters +"${JAVA_COMMAND}" $JAVA_OPTS -cp "$CLASSPATH" org.lsc.utils.security.SymmetricEncryption $PARAMETERS + +status=$? + +# LSC stop message +if [ $run_status -eq 1 ] +then + log "LSC finished running" +fi + +#==================================================================== +# Exit +#==================================================================== +exit $status diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/files/usr/share/eole/annuaire/password_files/eolead.ini b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/files/usr/share/eole/annuaire/password_files/eolead.ini new file mode 100644 index 0000000000000000000000000000000000000000..a12c99ec60d3f9bbd354bfad8113b61d39eb1a1a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/files/usr/share/eole/annuaire/password_files/eolead.ini @@ -0,0 +1,8 @@ +# fichiers nécessitant mot de passe ldap +# pour la fonctionnalité eole-ad + +[lsc.xml] +path='/etc/eole' +string=' <password>' +rights='lsc:root' +mode='0600' diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/files/usr/share/eole/diagnose/151-fichier-ad b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/files/usr/share/eole/diagnose/151-fichier-ad new file mode 100644 index 0000000000000000000000000000000000000000..652418f7e3a3b2e03497bd6bf004f688ea9cbce8 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/files/usr/share/eole/diagnose/151-fichier-ad @@ -0,0 +1,21 @@ +#!/bin/bash +. /usr/lib/eole/diagnose.sh + +if [ $(CreoleGet activer_ad) == 'oui' ];then + [ -f /root/.eolead ] || EchoRouge "Erreur : mot de passe Active Directory inconnu !" + printf ". %${len_pf}s => " "Ticket kerberos" + klist &>/dev/null + RETCODE=$? + if [ $RETCODE -ne 0 -a -f /root/.eolead ];then + ad_user=$(CreoleGet ad_user) + ad_domain=$(CreoleGet ad_domain) + DOMAIN=`echo $ad_domain | tr 'a-z' 'A-Z'` + cat /root/.eolead | kinit $ad_user@$DOMAIN &>/dev/null + RETCODE=$? + fi + [ $RETCODE -eq 0 ] && EchoVert "Ok" || EchoRouge "Erreur" + TestService "Synchronisation LSC" $(CreoleGet adresse_ip_eth0):1099 + echo +fi + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/files/usr/share/eole/schedule/scripts/eolead b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/files/usr/share/eole/schedule/scripts/eolead new file mode 100644 index 0000000000000000000000000000000000000000..f785ca07e3465ede8453c25febd1c20232b6cb7a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/files/usr/share/eole/schedule/scripts/eolead @@ -0,0 +1,5 @@ +#!/bin/bash +DESC="Synchronisation LSC" +service eole-lsc stop +/usr/bin/lsc -f /etc/lsc -s all -c all -t 1 | grep ERROR +service eole-lsc start diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/postservices/05-eolead-join-and-sync-ldap b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/postservices/05-eolead-join-and-sync-ldap new file mode 100644 index 0000000000000000000000000000000000000000..fd674edfec895f264a2ff72c0c0baf344da80f08 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/postservices/05-eolead-join-and-sync-ldap @@ -0,0 +1,102 @@ +#!/bin/bash + +activer_ad=$(CreoleGet activer_ad) +if [ $activer_ad != 'oui' ];then + exit 0 +fi +. /usr/lib/eole/ihm.sh +ad_user=$(CreoleGet ad_user) +ad_domain=$(CreoleGet ad_domain) +ad_server=$(CreoleGet ad_server) +ad_address=$(CreoleGet ad_address) +ead_support_multietab=$(CreoleGet ead_support_multietab) + +sync=1 +initkrb() +{ + DOMAIN=`echo $ad_domain | tr 'a-z' 'A-Z'` + echo $1 | kinit $ad_user@$DOMAIN >/dev/null + if [ "$?" == "0" ]; then + net ads join -U $ad_user%$passwd -S $ad_server.$ad_domain + if [ "$?" == "0" ]; then + sync=0 + else + echo "Ticket Kerberos valide, la jonction au serveur Samba a échoué" + return 4 + fi + else + echo "Mauvais mot de passe administrateur du domaine" + return 1 + fi +} + +pwdfile=/root/.eolead +if [ "$1" == 'instance' ];then + tcpcheck 3 $ad_address:88 > /dev/null + if [ "$?" != "0" ]; then + echo + EchoRouge "Impossible de joindre le serveur Kerberos" + echo + exit 1 + fi + for (( i=1; i<=3 ; i++ )); do + echo + EchoCyan "Intégration au domaine Active Directory" + echo -n "Mot de passe de l'utilisateur $ad_user pour le domaine ${ad_domain^^} : " + read -s passwd + echo + echo $passwd > $pwdfile + initkrb $passwd + case $? in + 0) break;; + 4) i=3;; + esac + done + if [ $i -eq 4 ];then + echo + EchoRouge "Impossible d'effectuer l'intégration au domaine" + echo + exit 1 + fi +else + tcpcheck 3 $ad_address:88 > /dev/null + if [ "$?" != "0" ]; then + EchoOrange "Serveur Kerberos impossible à joindre" + elif [ -f $pwdfile ];then + passwd=$(cat $pwdfile) + klist &>/dev/null + if [ $? -ne 0 ];then + initkrb $passwd + if [ $? -ne 0 ];then + echo + EchoRouge "Erreur de récupération du ticket Kerberos" + echo "Il est nécessaire de relancer la procédure d'instanciation" + echo + exit 1 + fi + fi + else + echo + EchoRouge "Le mot de passe Active Directory n'est pas paramétré" + echo "Il est nécessaire de relancer la procédure d'instanciation" + echo + exit 1 + fi +fi + +# Mise à jour du mot de passe AD dans /etc/lsc/lsc.xml et smbldap_bind.conf +echo "Mise à jour du mot de passe dans les fichiers de configuration" +service eole-lsc stop +passwdrecode=$(echo $passwd | recode ascii..html) +sed "22c\ <password>$passwdrecode</password>" </etc/eole/lsc.xml >/etc/lsc/lsc.xml +sed -i "15c\adpassword = \"$passwd\";" /etc/smbldap-tools/smbldap_bind.conf + +if [ $sync -eq 0 ];then + echo + EchoCyan "Synchronisation ldap" + lsc -f /etc/lsc -s all -t1 + echo +fi +service eole-lsc start + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..f5931d0c9e96a01d6747ce02d75c59ed99b50a79 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/service.yml @@ -0,0 +1,72 @@ +format: '0.1' +name: eole-ad +version: |- + 2.7.1-7 +description: |- + Intégration d'un module EOLE à un domaine Active Directory + Cette fonctionnalité est le fruit d'une contribution de + la Région Rhône-Alpes + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: [] +packages: + - krb5-config + - krb5-user + - lsc + - openjdk-8-jre + - libcrypt-saltedhash-perl + - recode +dictionaries: + - 26_eolead.xml +extra_dictionaries: + schedule: + - 01_eolead.xml +templates: + - ad-resolv.conf + - eole-lsc.default + - global_smb_ad.tmpl + - krb5.conf + - lsc.default + - lsc.xml +creole_funcs: [] +preservices: [] +postservices: + - 05-eolead-join-and-sync-ldap +pretemplates: [] +posttemplates: [] +files: + /lib/systemd/system/eole-lsc.service: + owner: root + group: root + mode: '0644' + /usr/sbin/changepasswordeole.pl: + owner: root + group: root + mode: '0755' + /usr/sbin/eolelsc: + owner: root + group: root + mode: '0755' + /usr/sbin/get_list_etablissement.py: + owner: root + group: root + mode: '0755' + /usr/sbin/lsc-keygen: + owner: root + group: root + mode: '0755' + /usr/share/eole/annuaire/password_files/eolead.ini: + owner: root + group: root + mode: '0644' + /usr/share/eole/diagnose/151-fichier-ad: + owner: root + group: root + mode: '0755' + /usr/share/eole/schedule/scripts/eolead: + owner: root + group: root + mode: '0755' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/templates/ad-resolv.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/templates/ad-resolv.conf new file mode 100644 index 0000000000000000000000000000000000000000..0305c4befdfa426677a335da0df6cae25131c52a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/templates/ad-resolv.conf @@ -0,0 +1,6 @@ +%set global %%adresse_ip_dns = %%adresse_ip_dns[:] +%if %%ad_rescue + %silent %%adresse_ip_dns.insert(0, %%ad_rescue) +%end if +%silent %%adresse_ip_dns.insert(0, %%ad_address) +%include '/var/lib/creole/resolv.conf' diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/templates/eole-lsc.default b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/templates/eole-lsc.default new file mode 100644 index 0000000000000000000000000000000000000000..c83307e22172f9b95f7ae8ba8c4d3cea2cc9e010 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/templates/eole-lsc.default @@ -0,0 +1,2 @@ +# defaults file for eole-lsc service +AD_ADDRESS=%%ad_address diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/templates/global_smb_ad.tmpl b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/templates/global_smb_ad.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..dba0a4b57e40dce6a7368aeba20a2c05d3cdd605 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/templates/global_smb_ad.tmpl @@ -0,0 +1,240 @@ +######################################## +# +# Fichier de configuration de SAMBA +# +# Definition du Template pour EOLE +# +# Eole Dijon +# +# copie modifiée pour eole-ad +# +######################################### +# Global parameters +[global] + # configuration du serveur + netbios name = %%smb_netbios_name + workgroup = %%smb_workgroup + server string = %%smb_server_string + smb ports = %%smb_ports + # journalisation + logging = syslog@0 + log level = 0 vfs:%%smb_log_level + vfs objects = full_audit + full_audit:prefix = %u|%I|%m|%S + full_audit:success = connect disconnect + full_audit:failure = none + full_audit:priority = NOTICE + max log size = 0 + wins support = %%smb_wins_support +%if %%smb_wins_support == 'no' + wins server = %%custom_join(%%smb_wins_server) +%end if + dns proxy = %%smb_dns_proxy + # exploration + #AD: Les paramètres preferred master et domain master sont désactivés + # pour que samba ne soit pas considéré comme DC + preferred master = no + domain master = no + #AD: os level passe à 0 pour que samba ne soit pas considéré comme DC + os level = %%smb_os_level + #AD: désactivation de la directiver admin users, valable uniquement + # lorsque samba a le role de DC + #admin users = @DomainAdmins + # authentification des clients + #AD: security passe de "user" à ADS = samba passe du rôle DC à membre du domaine AD + security = ADS + #AD: ajout du paramètre "realm" pour identifier le royaume kerberos + realm = %%upper(%%ad_domain) + # mots de passe + encrypt passwords = yes + +%if %%is_defined('adresse_ip_ldap') + # smbldap-tools (#27104) + %if int(%%smb_min_password_class) > 1 + check password script = /usr/share/eole/fichier/checkpassword + %end if + add user script = /usr/sbin/smbldap-useradd -a -m "%u" + add group script = /usr/sbin/smbldap-groupadd -p -a -t 2 "%g" + add machine script = /usr/sbin/smbldap-useradd -w -a -d /dev/null -s /bin/false %u + add user to group script = /usr/sbin/smbldap-groupmod -m "%u" "%g" + delete user from group script = /usr/sbin/smbldap-groupmod -x "%u" "%g" + set primary group script = /usr/sbin/smbldap-usermod -g "%g" "%u" + rename user script = /usr/sbin/smbldap-usermod -J -r "%unew" "%uold" + ldap passwd sync = yes + %if %%getVar('activer_annuaire_secours', 'non') == 'oui' + passdb backend = ldapsam:"ldaps://%%adresse_ip_ldap:636" + %else + passdb backend = ldapsam:ldap://%%adresse_ip_ldap:389 + %end if + ldap suffix = %%smb_ldap_suffix + ldap admin dn = %%smb_ldap_admin_dn + %if %%activer_client_ldap == "distant" and %%ldap_tls == "oui" + ldap ssl = start tls + %else + ldap ssl = no + %end if + %if not %%is_empty(%%smb_ldap_page_size) + ldap page size = %%smb_ldap_page_size + %end if + %if not %%is_empty(%%smb_ldap_machine_suffix) + ldap machine suffix = %%smb_ldap_machine_suffix + %end if + %if not %%is_empty(%%smb_ldap_connection_timeout) + ldap connection timeout = %%smb_ldap_connection_timeout + %end if + %if not %%is_empty(%%smb_ldap_group_suffix) + ldap group suffix = %%smb_ldap_group_suffix + %end if + %if not %%is_empty(%%smb_ldap_replication_sleep) + ldap replication sleep = %%smb_ldap_replication_sleep + %end if +%end if + + idmap config %%upper(%%smb_workgroup):backend = ad + idmap config %%upper(%%smb_workgroup):schema_mode = rfc2307 + idmap config %%upper(%%smb_workgroup):range = 10000-39999 + idmap config %%upper(%%smb_workgroup):unix_nss_info = yes + + idmap config *:backend = tdb + idmap config *:range = 40000-49999 + + winbind trusted domains only = no + winbind use default domain = yes + winbind enum users = yes + winbind enum groups = yes + winbind refresh tickets = yes + + kerberos method = system keytab + + # impression +%if %%getVar('activer_cups','non') == 'oui' + printing = cups + printcap name = cups + load printers = yes + show add printer wizard = yes + cups server = /var/run/cups/cups.sock:631 +%if %%smb_spoolss_x64 == 'oui' + spoolss: architecture = Windows x64 +%end if +%else + load printers = no +%end if + # synchronisation temporelle + time server = yes + # divers + deadtime = %%smb_deadtime + #FIXME HORUS + #logon script = %U.bat +%if not %%is_empty(%%smb_socket_options) + socket options = %%smb_socket_options +%end if + #FIXME: #179 + #unix extensions = %%smb_unixextensions + #8251 pour l'authentification du proxy + lanman auth = %%smb_lanman_auth +%if not %%is_empty(%%smb_usershare_max_shares) + usershare max shares = %%smb_usershare_max_shares +%end if + unix extensions = no + nt acl support = %%smb_nt_acl_support + wide links = yes +%if %%getVar('smb_activer_hide_files', 'non') == 'oui' + hide files = %%smb_hide_files +%end if + delete veto files = yes +%if %%activer_clam == 'non' or %%smb_vscan == 'non' + veto files = /$RECYCLE.BIN/.scanned:*/ +%else + veto files = /$RECYCLE.BIN/ +%end if + oplocks = %%smb_oplocks + level2 oplocks = %%smb_oplocks + #name resolve order = %%smb_name_resolve_order +%if %%activer_clam == 'oui' and %%smb_vscan == 'oui' and %%smb_trash == 'oui' + vfs objects = scannedonly recycle +%elif %%activer_clam == 'oui' and %%smb_vscan == 'oui' + vfs objects = scannedonly +%elif %%smb_trash == 'oui' + vfs objects = recycle +%end if +%if %%smb_trash == 'oui' + # Corbeille Samba + include = /etc/samba/recycle.conf +%end if +%if %%activer_clam == 'oui' and %%smb_vscan == 'oui' + scannedonly:allow_nonscanned_files=True +%end if +%if %%smb_guest == 'oui' + # Support du mode guest + guest account = nobody + map to guest = Bad User +%end if + # Désactiver le support des Attributs DOS en global + store dos attributes = no + +%if %%mode_conteneur_actif == 'non' + interfaces = %%nom_zone_eth0 +%else + #ne pas écouter sur eth0 en mode conteneur (#2506) + interfaces = eth1 +%end if +%if %%smb_max_proto != 'default' + server max protocol = %%smb_max_proto +%end if + # REF #22902 + acl allow execute always = True + + + +[printers] + comment = All Printers + path = /var/spool/samba + #desactivation (#2522) + #print command = lpr-cups -P %p -o raw %s -r # Utilise le Driver de la station + printable = yes + browseable = yes + available = yes + +[print$] + browseable = yes + # fixes #1104 + vfs objects = + path = %%smb_printers_drivers_path +%if %%smb_control_print_access_with_acl == 'oui' + read only = no +%else + read only = yes + valid users = @PrintOperators @DomainUsers + write list = @PrintOperators + create mask = 0664 + directory mask = 0775 + force group = PrintOperators +%end if + +%if %%is_file('/var/lib/creole/smb-include_shares.conf') + %include '/var/lib/creole/smb-include_shares.conf' +%end if + + +## partages multiples +%if %%smb_activer_partages == 'oui' +%for %%valeur in %%smb_partage_nom +[%%valeur] + path = %%valeur.smb_partage_path + %if %%valeur.smb_partage_visibilite == 'oui' + browseable = yes + %else + browseable = no + %end if + %if %%valeur.smb_partage_ecriture == 'oui' + writeable = yes + %else + writeable = no + %end if +%end for +%end if + +# +# Debut des partages LDAP +# + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/templates/krb5.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/templates/krb5.conf new file mode 100644 index 0000000000000000000000000000000000000000..b7dcace66bdd548095eaed0cabbb3bd92bc4da1d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/templates/krb5.conf @@ -0,0 +1,21 @@ +default = FILE:/var/log/krb5libs.log +kdc = FILE:/var/log/krb5kdc.log +admin_server = FILE:/var/log/kadmind.log + +[libdefaults] + default_realm = %%upper(%%ad_domain) + dns_lookup_realm = false + dns_lookup_kdc = false + ticket_lifetime = 24h + forwardable = yes + +[realms] + %%upper(%%ad_domain) = { + kdc = %%ad_server.%%ad_domain:88 + admin_server = %%ad_server.%%ad_domain:749 + default_domain = %%ad_domain + } + +[domain_realm] + .%%ad_domain = %%upper(%%ad_domain) + %%ad_domain = %%upper(%%ad_domain) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/templates/lsc.default b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/templates/lsc.default new file mode 100644 index 0000000000000000000000000000000000000000..55105f0780e3b33015010e2b4fc8d152a3de4e6e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/templates/lsc.default @@ -0,0 +1,20 @@ +#==================================================================== +# Configuration for LSC init script +# (http://www.lsc-project.org). +#==================================================================== + +# LSC installation +LSC_BIN="/usr/bin/lsc" +LSC_CFG_DIR="/etc/lsc" +LSC_USER="lsc" +LSC_GROUP="lsc" +LSC_PID_FILE="/var/run/lsc.pid" +LSC_TASKS="all" +LSC_PARAMS="" + +# JMX +LSC_JMXPORT="1099" + +# JAVA +JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/jre +JAVA_OPTS= diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/templates/lsc.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/templates/lsc.xml new file mode 100644 index 0000000000000000000000000000000000000000..aa6182ddddbd0a4bf86a1e9dfc2906ff0f83ef53 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ad/templates/lsc.xml @@ -0,0 +1,523 @@ +<?xml version="1.0" ?> +<lsc xmlns="http://lsc-project.org/XSD/lsc-core-2.1.xsd" revision="0"> +%set %%destdn = 'DC='+',DC='.join(%%ad_domain.split('.')) + <connections> + <ldapConnection> + <name>ldap-src-conn</name> + <url>ldap://localhost:389/o=gouv,c=fr</url> + <username>cn=admin,o=gouv,c=fr</username> + <password>password</password> + <authentication>SIMPLE</authentication> + <referral>IGNORE</referral> + <derefAliases>NEVER</derefAliases> + <version>VERSION_3</version> + <pageSize>-1</pageSize> + <factory>com.sun.jndi.ldap.LdapCtxFactory</factory> + <tlsActivated>false</tlsActivated> + </ldapConnection> + + <ldapConnection> + <name>ldap-dst-conn</name> +%if %%ad_ldaps == 'oui' + <url>ldaps://%%ad_server.%%ad_domain:636/%%destdn</url> +%else + <url>ldap://%%ad_server.%%ad_domain/%%destdn</url> +%end if + <username>CN=%%ad_user,CN=Users,%%destdn</username> + [ad_password] + <authentication>SIMPLE</authentication> + <referral>IGNORE</referral> + <derefAliases>NEVER</derefAliases> + <version>VERSION_3</version> + <pageSize>1000</pageSize> + <factory>com.sun.jndi.ldap.LdapCtxFactory</factory> + <tlsActivated>false</tlsActivated> + </ldapConnection> + </connections> + + <tasks> + + <task> + <name>t1users-create</name> + <bean>org.lsc.beans.SimpleBean</bean> + + <asyncLdapSourceService> + <name>openldap-src-service-users-create</name> + <connection reference="ldap-src-conn" /> + <baseDn>ou=education,o=gouv,c=fr</baseDn> + <pivotAttributes> + <string>uid</string> + </pivotAttributes> + <fetchedAttributes> + <string>cn</string> + <string>sn</string> + <string>uid</string> + <string>mail</string> + <string>givenName</string> + <string>displayName</string> + <string>uidNumber</string> + <string>gidNumber</string> + <string>personalTitle</string> + <string>homeDirectory</string> + <string>sambaHomePath</string> + <string>sambaHomeDrive</string> + <!--<string>sambaLogonTime</string>--> + <!--<string>sambaLogoffTime</string>--> + <!--<string>sambaProfilePath</string>--> + <string>ENTPersonLogin</string> + <string>ENTPersonJointure</string> + <string>ENTPersonProfils</string> + <string>ENTPersonNomPatro</string> + <string>ENTPersonSexe</string> + <string>ENTPersonDateNaissance</string> + <string>codecivilite</string> + <string>dateNaissance</string> + <string>intid</string> + <string>typeadmin</string> + <string>Divcod</string> + <string>Ine</string> + </fetchedAttributes> + <getAllFilter>(&(objectClass=inetOrgPerson)(objectClass=posixAccount))</getAllFilter> + <getOneFilter>(&(objectClass=inetOrgPerson)(objectClass=posixAccount)(uid={uid}))</getOneFilter> + <cleanFilter>(&(objectClass=inetOrgPerson)(objectClass=posixAccount)(uid={sAMAccountName}))</cleanFilter> + <serverType>OpenLDAP</serverType> + </asyncLdapSourceService> + <ldapDestinationService> + <name>ldap-dst-service-users-create</name> + <connection reference="ldap-dst-conn" /> + <baseDn>%%destdn</baseDn> + <pivotAttributes> + <string>sAMAccountName</string> + </pivotAttributes> + <fetchedAttributes> + <string>sAMAccountName</string> + <string>cn</string> + <string>sn</string> + <string>objectClass</string> + <string>mail</string> + <string>givenName</string> + <string>displayName</string> + <string>personalTitle</string> + <string>homeDirectory</string> + <string>homeDrive</string> + <!--<string>lastLogon</string>--> + <!--<string>lastLogoff</string>--> + <!--<string>profilePath</string>--> + <string>ou</string> + <string>userAccountControl</string> + </fetchedAttributes> + <getAllFilter>(&(objectClass=user)(!(objectClass=computer))(!(isCriticalSystemObject=TRUE))(!(cn=eole-workstation*)))</getAllFilter> + <getOneFilter>(&(objectClass=user)(!(objectClass=computer))(!(isCriticalSystemObject=TRUE))(!(cn=eole-workstation*))(sAMAccountName={uid}))</getOneFilter> + </ldapDestinationService> + <propertiesBasedSyncOptions> +%if %%ead_support_multietab == 'non' + <mainIdentifier>"CN=" + srcBean.getDatasetFirstValueById("uid") + ",%%ad_container,%%destdn"</mainIdentifier> +%else + <mainIdentifier> + <![CDATA[ + var srcdn = srcBean.getMainIdentifier(); + var etab = srcdn.split(',ou=')[4]; + var dstdn; + if ( etab == '%%numero_etab' ) { + dstdn = "CN=" + srcBean.getDatasetFirstValueById("uid") + ",%%ad_container,%%destdn"; + } else { + dstdn = "CN=" + srcBean.getDatasetFirstValueById("uid") + ",%%ad_ou_users_etab,OU=" + etab + ",%%destdn"; + } + dstdn; + ]]> + </mainIdentifier> +%end if + <defaultDelimiter>;</defaultDelimiter> + <defaultPolicy>FORCE</defaultPolicy> + <conditions> + <create>true</create> + <update>false</update> + <delete>true</delete> + <changeId>false</changeId> + </conditions> + <dataset> + <name>objectClass</name> + <policy>KEEP</policy> + <defaultValues></defaultValues> + <forceValues></forceValues> + <createValues> + <string>"top"</string> + <string>"person"</string> + <string>"organizationalPerson"</string> + <string>"user"</string> + </createValues> + </dataset> + <dataset> + <name>cn</name> + <policy>FORCE</policy> + <defaultValues></defaultValues> + <forceValues> + <string>srcBean.getDatasetFirstValueById("uid")</string> + </forceValues> + <createValues></createValues> + </dataset> + <dataset> + <name>sAMAccountName</name> + <policy>FORCE</policy> + <defaultValues></defaultValues> + <forceValues> + <string>srcBean.getDatasetFirstValueById("uid")</string> + </forceValues> + <createValues></createValues> + </dataset> + <dataset> + <name>unixHomeDirectory</name> + <policy>FORCE</policy> + <defaultValues></defaultValues> + <forceValues> + <string>srcBean.getDatasetFirstValueById("homeDirectory")</string> + </forceValues> + <createValues></createValues> + </dataset> + <dataset> + <name>homeDirectory</name> + <policy>FORCE</policy> + <defaultValues></defaultValues> + <forceValues> + <string>srcBean.getDatasetFirstValueById("sambaHomePath")</string> + </forceValues> + <createValues></createValues> + </dataset> + <dataset> + <name>homeDrive</name> + <policy>FORCE</policy> + <defaultValues></defaultValues> + <forceValues> + <string>srcBean.getDatasetFirstValueById("sambaHomeDrive")</string> + </forceValues> + <createValues></createValues> + </dataset> + <!--<dataset> + <name>lastLogon</name> + <policy>FORCE</policy> + <defaultValues></defaultValues> + <forceValues> + <string>srcBean.getDatasetFirstValueById("sambaLogonTime")</string> + </forceValues> + <createValues></createValues> + </dataset>--> + <!--<dataset> + <name>lastLogoff</name> + <policy>FORCE</policy> + <defaultValues></defaultValues> + <forceValues> + <string>srcBean.getDatasetFirstValueById("sambaLogoffTime")</string> + </forceValues> + <createValues></createValues> + </dataset>--> + <!--<dataset> + <name>profilePath</name> + <policy>FORCE</policy> + <defaultValues></defaultValues> + <forceValues> + <string>srcBean.getDatasetFirstValueById("sambaProfilePath")</string> + </forceValues> + <createValues></createValues> + </dataset>--> + <dataset> + <name>ou</name> + <policy>FORCE</policy> + <defaultValues></defaultValues> + <forceValues> + <string>"ENTPersonLogin;"+srcBean.getDatasetFirstValueById("ENTPersonLogin")</string> + <string>"ENTPersonJointure;"+srcBean.getDatasetFirstValueById("ENTPersonJointure")</string> + <string>"ENTPersonProfils;"+srcBean.getDatasetFirstValueById("ENTPersonProfils")</string> + <string>"ENTPersonNomPatro;"+srcBean.getDatasetFirstValueById("ENTPersonNomPatro")</string> + <string>"ENTPersonSexe;"+srcBean.getDatasetFirstValueById("ENTPersonSexe")</string> + <string>"ENTPersonDateNaissance;"+srcBean.getDatasetFirstValueById("ENTPersonDateNaissance")</string> + <string>"codecivilite;"+srcBean.getDatasetFirstValueById("codeCivilite")</string> + <string>"dateNaissance;"+srcBean.getDatasetFirstValueById("dateNaissance")</string> + <string>"intid;"+srcBean.getDatasetFirstValueById("intid")</string> + <string>"typeadmin;"+srcBean.getDatasetFirstValueById("typeadmin")</string> + <string>"Divcod;"+srcBean.getDatasetFirstValueById("Divcod")</string> + <string>"Ine;"+srcBean.getDatasetFirstValueById("Ine")</string> + </forceValues> + <createValues></createValues> + <delimiter>$</delimiter> + </dataset> + <dataset> + <name>userAccountControl</name> + <policy>FORCE</policy> + <defaultValues></defaultValues> + <forceValues> + <string>"544"</string> + </forceValues> + <createValues></createValues> + </dataset> + </propertiesBasedSyncOptions> + </task> + + <task> + <name>t2users-update</name> + <bean>org.lsc.beans.SimpleBean</bean> + + <asyncLdapSourceService> + <name>openldap-src-service-users-update</name> + <connection reference="ldap-src-conn" /> + <baseDn>ou=education,o=gouv,c=fr</baseDn> + <pivotAttributes> + <string>uid</string> + </pivotAttributes> + <fetchedAttributes> + <string>sn</string> + <string>mail</string> + <string>givenName</string> + <string>displayName</string> + <string>uidNumber</string> + <string>gidNumber</string> + <string>personalTitle</string> + <string>homeDirectory</string> + <string>sambaHomePath</string> + <string>sambaHomeDrive</string> + <!--<string>sambaLogonTime</string>--> + <!--<string>sambaLogoffTime</string>--> + <!--<string>sambaProfilePath</string>--> + <string>ENTPersonLogin</string> + <string>ENTPersonJointure</string> + <string>ENTPersonProfils</string> + <string>ENTPersonNomPatro</string> + <string>ENTPersonSexe</string> + <string>ENTPersonDateNaissance</string> + <string>codecivilite</string> + <string>dateNaissance</string> + <string>intid</string> + <string>typeadmin</string> + <string>Divcod</string> + <string>Ine</string> + </fetchedAttributes> + <getAllFilter>(&(objectClass=inetOrgPerson)(objectClass=posixAccount))</getAllFilter> + <getOneFilter>(&(objectClass=inetOrgPerson)(objectClass=posixAccount)(uid={uid}))</getOneFilter> + <cleanFilter>(&(objectClass=inetOrgPerson)(objectClass=posixAccount)(uid={sAMAccountName}))</cleanFilter> + <serverType>OpenLDAP</serverType> + </asyncLdapSourceService> + <ldapDestinationService> + <name>ldap-dst-service-users-update</name> + <connection reference="ldap-dst-conn" /> + <baseDn>%%destdn</baseDn> + <pivotAttributes> + <string>sAMAccountName</string> + </pivotAttributes> + <fetchedAttributes> + <string>sn</string> + <string>mail</string> + <string>givenName</string> + <string>displayName</string> + <string>personalTitle</string> + <string>homeDirectory</string> + <string>homeDrive</string> + <!--<string>lastLogon</string>--> + <!--<string>lastLogoff</string>--> + <!--<string>profilePath</string>--> + <string>ou</string> + <!--<string>userAccountControl</string>--> + </fetchedAttributes> + <getAllFilter>(&(objectClass=user)(!(objectClass=computer))(!(isCriticalSystemObject=TRUE))(!(cn=eole-workstation*)))</getAllFilter> + <getOneFilter>(&(objectClass=user)(!(objectClass=computer))(!(isCriticalSystemObject=TRUE))(!(cn=eole-workstation*))(sAMAccountName={uid}))</getOneFilter> + </ldapDestinationService> + <propertiesBasedSyncOptions> + <mainIdentifier>""</mainIdentifier> + <defaultDelimiter>;</defaultDelimiter> + <defaultPolicy>FORCE</defaultPolicy> + <conditions> + <create>false</create> + <update>true</update> + <delete>false</delete> + <changeId>false</changeId> + </conditions> + + <dataset> + <name>unixHomeDirectory</name> + <policy>FORCE</policy> + <defaultValues></defaultValues> + <forceValues> + <string>srcBean.getDatasetFirstValueById("homeDirectory")</string> + </forceValues> + <createValues></createValues> + </dataset> + <dataset> + <name>homeDirectory</name> + <policy>FORCE</policy> + <defaultValues></defaultValues> + <forceValues> + <string>srcBean.getDatasetFirstValueById("sambaHomePath")</string> + </forceValues> + <createValues></createValues> + </dataset> + <dataset> + <name>homeDrive</name> + <policy>FORCE</policy> + <defaultValues></defaultValues> + <forceValues> + <string>srcBean.getDatasetFirstValueById("sambaHomeDrive")</string> + </forceValues> + <createValues></createValues> + </dataset> + <!--<dataset> + <name>profilePath</name> + <policy>FORCE</policy> + <defaultValues></defaultValues> + <forceValues> + <string>srcBean.getDatasetFirstValueById("sambaProfilePath")</string> + </forceValues> + <createValues></createValues> + </dataset>--> + <dataset> + <name>ou</name> + <policy>FORCE</policy> + <defaultValues></defaultValues> + <forceValues> + <string>"ENTPersonLogin;"+srcBean.getDatasetFirstValueById("ENTPersonLogin")</string> + <string>"ENTPersonJointure;"+srcBean.getDatasetFirstValueById("ENTPersonJointure")</string> + <string>"ENTPersonProfils;"+srcBean.getDatasetFirstValueById("ENTPersonProfils")</string> + <string>"ENTPersonNomPatro;"+srcBean.getDatasetFirstValueById("ENTPersonNomPatro")</string> + <string>"ENTPersonSexe;"+srcBean.getDatasetFirstValueById("ENTPersonSexe")</string> + <string>"ENTPersonDateNaissance;"+srcBean.getDatasetFirstValueById("ENTPersonDateNaissance")</string> + <string>"codecivilite;"+srcBean.getDatasetFirstValueById("codeCivilite")</string> + <string>"dateNaissance;"+srcBean.getDatasetFirstValueById("dateNaissance")</string> + <string>"intid;"+srcBean.getDatasetFirstValueById("intid")</string> + <string>"typeadmin;"+srcBean.getDatasetFirstValueById("typeadmin")</string> + <string>"Divcod;"+srcBean.getDatasetFirstValueById("Divcod")</string> + <string>"Ine;"+srcBean.getDatasetFirstValueById("Ine")</string> + </forceValues> + <createValues></createValues> + <delimiter>$</delimiter> + </dataset> + </propertiesBasedSyncOptions> + </task> + + <task> + <name>t3-groups</name> + <bean>org.lsc.beans.SimpleBean</bean> + + <asyncLdapSourceService> + <name>openldap-src-service-groups</name> + <connection reference="ldap-src-conn" /> + <baseDn>ou=education,o=gouv,c=fr</baseDn> + <pivotAttributes> + <string>cn</string> + </pivotAttributes> + <fetchedAttributes> + <string>cn</string> + <string>memberUid</string> + <string>description</string> + <string>displayName</string> + <string>mail</string> + <string>gidNumber</string> + <string>niveau</string> + <string>type</string> + </fetchedAttributes> + <getAllFilter>(&(objectClass=posixGroup)(!(type=Etablissement))(!(cn=Domain*))(!(cn=PrintOperators)))</getAllFilter> + <getOneFilter>(&(objectClass=posixGroup)(!(type=Etablissement))(!(cn=Domain*))(!(cn=PrintOperators))(cn={cn}))</getOneFilter> + <cleanFilter>(&(objectClass=posixGroup)(cn={sAMAccountName}))</cleanFilter> + <serverType>OpenLDAP</serverType> + </asyncLdapSourceService> + <ldapDestinationService> + <name>ldap-dst-service-groups</name> + <connection reference="ldap-dst-conn" /> + <baseDn>%%destdn</baseDn> + <pivotAttributes> + <string>sAMAccountName</string> + </pivotAttributes> + <fetchedAttributes> + <string>sAMAccountName</string> + <string>objectClass</string> + <string>cn</string> + <string>member</string> + <string>description</string> + <string>displayName</string> + <string>mail</string> + <string>extensionName</string> + </fetchedAttributes> + <getAllFilter>(&(objectClass=group)(!(isCriticalSystemObject=TRUE))(!(cn=DnsAdmins))(!(cn=DnsUpdateProxy)))</getAllFilter> + <getOneFilter>(&(objectClass=group)(!(isCriticalSystemObject=TRUE))(!(cn=DnsAdmins))(!(cn=DnsUpdateProxy))(sAMAccountName={cn}))</getOneFilter> + </ldapDestinationService> + <propertiesBasedSyncOptions> +%if %%ead_support_multietab == 'non' + <mainIdentifier>"CN=" + srcBean.getDatasetFirstValueById("cn") + ",%%ad_container,%%destdn"</mainIdentifier> +%else + <mainIdentifier> + <![CDATA[ + var srcdn = srcBean.getMainIdentifier(); + var etab = srcdn.split(',ou=')[3]; + var dstdn; + if ( etab == '%%numero_etab' ) { + dstdn = "CN=" + srcBean.getDatasetFirstValueById("cn") + ",%%ad_container,%%destdn"; + } else { + dstdn = "CN=" + srcBean.getDatasetFirstValueById("cn") + ",%%ad_ou_users_etab,OU=" + etab + ",%%destdn"; + } + dstdn; + ]]> + </mainIdentifier> +%end if + <defaultDelimiter>;</defaultDelimiter> + <defaultPolicy>FORCE</defaultPolicy> + <conditions> + <create>true</create> + <update>true</update> + <delete>true</delete> + <changeId>false</changeId> + </conditions> + <dataset> + <name>objectClass</name> + <policy>KEEP</policy> + <defaultValues></defaultValues> + <forceValues></forceValues> + <createValues> + <string>"top"</string> + <string>"group"</string> + </createValues> + </dataset> + <dataset> + <name>sAMAccountName</name> + <policy>FORCE</policy> + <defaultValues></defaultValues> + <forceValues> + <string>srcBean.getDatasetFirstValueById("cn")</string> + </forceValues> + <createValues></createValues> + </dataset> + <dataset> + <name>member</name> + <policy>FORCE</policy> + <defaultValues></defaultValues> + <forceValues> + <string> + <![CDATA[ + var mymembers = srcBean.getDatasetValuesById("memberUid").toArray(); + var mydns = []; + for ( var i=0; i<mymembers.length; i++ ) { + var filter = "(sAMAccountName="+mymembers[i]+")"; + var mydn = ldap.search("", filter); + if ( mydn != null && mydn.length > 0 ) { + mydns.push(mydn.get(0) + "," + ldap.getContextDn()); + } else { + java.lang.System.out.println("Member "+mymembers[i]+" not found for group "+srcBean.getDatasetFirstValueById("cn")); + } + } + mydns + ]]> + </string> + </forceValues> + <createValues></createValues> + <delimiter>;</delimiter> + </dataset> + <dataset> + <name>extensionName</name> + <policy>FORCE</policy> + <defaultValues></defaultValues> + <forceValues> + <string>"niveau;"+srcBean.getDatasetFirstValueById("niveau")</string> + <string>"type;"+srcBean.getDatasetFirstValueById("type")</string> + </forceValues> + <createValues></createValues> + <delimiter>$</delimiter> + </dataset> + </propertiesBasedSyncOptions> + </task> + </tasks> +</lsc> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-adminer/dictionaries/23_adminer.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-adminer/dictionaries/23_adminer.xml new file mode 100644 index 0000000000000000000000000000000000000000..56af8fb47b9e2ebf84a48493108fe3e53e41b657 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-adminer/dictionaries/23_adminer.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <containers> + <container name='web'> + <package>eole-adminer-pkg</package> + <file name='/etc/apache2/conf-available/adminer.conf' source='apache-adminer.conf'/> + </container> + </containers> + + <variables> + <family name='applications web'> + <variable name='activer_adminer' type='oui/non' description="Activer Adminer (administration de bases de données)"> + <value>non</value> + </variable> + </family> + </variables> + + <constraints> + <!--<condition name='disabled_if_in' source='activer_mysql'> + <param>non</param> + <target type='variable'>activer_adminer</target> + </condition>--> + </constraints> + + <help> + <variable name='activer_adminer'>Adminer est une application Web offrant une interface graphique pour plusieurs systèmes de gestion de base de données</variable> + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-adminer/posttemplates/06-adminer b/seed/release/eole-2.7/2.7.1/applicationservice/eole-adminer/posttemplates/06-adminer new file mode 100644 index 0000000000000000000000000000000000000000..e52783e6c4375a3743afef97afa27f0f12ee1d2d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-adminer/posttemplates/06-adminer @@ -0,0 +1,9 @@ +#!/bin/bash + +if [ "$(CreoleGet activer_adminer non)" = "oui" ];then + CreoleRun "a2enconf adminer >/dev/null" web +else + CreoleRun "a2disconf adminer >/dev/null" web +fi + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-adminer/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-adminer/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..88dc5ece1c85bb1af64ef1de6dcd9dcb5da205d7 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-adminer/service.yml @@ -0,0 +1,25 @@ +format: '0.1' +name: eole-adminer +version: |- + 2.6.2-2 +description: |- + Templates et dictionnaires pour l'application Adminer + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: + - eole-web +packages: [] +dictionaries: + - 23_adminer.xml +extra_dictionaries: {} +templates: + - apache-adminer.conf +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: + - 06-adminer +files: {} +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-adminer/templates/apache-adminer.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-adminer/templates/apache-adminer.conf new file mode 100644 index 0000000000000000000000000000000000000000..6dc1190be8241d6b9bbc70d1e30b2ba765491ca2 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-adminer/templates/apache-adminer.conf @@ -0,0 +1,54 @@ +#Apache configuration +%if %%activer_firewall == 'oui' + %set %%require = %%set() + %for %%num in xrange(0, %%int(%%nombre_interfaces)) + %if %%getVar('admin_eth{}'.format(%%num), 'non') == 'oui' + %for %%ip_admin in %%getVar('ip_admin_eth{}'.format(%%num)) +%%require.add(%%ip_admin+'/'+%%getattr(%%ip_admin, 'netmask_admin_eth{}'.format(%%num))) %slurp + %end for + %end if + %end for + %if %%len(%%require) == 0 +%set require_line = 'Require all denied' + %elif '0.0.0.0/0.0.0.0' in %%require +%set require_line = 'Require all granted' + %else +%set require_line = 'Require ip '+%%custom_join(%%require) + %end if +%else +%set require_line = 'Require all granted' +%end if + +Alias /adminer /usr/share/adminer/adminer + +<Directory /usr/share/adminer/adminer> + Options FollowSymLinks + DirectoryIndex index.php + %%require_line + + <IfModule mod_php.c> + AddType application/x-httpd-php .php + + php_flag magic_quotes_gpc Off + php_flag track_vars On + php_flag register_globals Off + php_value include_path . + </IfModule> +</Directory> + +Alias /adminer-editor /usr/share/adminer/editor + +<Directory /usr/share/adminer/editor> + Options FollowSymLinks + DirectoryIndex index.php + %%require_line + + <IfModule mod_php.c> + AddType application/x-httpd-php .php + + php_flag magic_quotes_gpc Off + php_flag track_vars On + php_flag register_globals Off + php_value include_path . + </IfModule> +</Directory> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-amon/dictionaries/00_eole-amon_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-amon/dictionaries/00_eole-amon_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..b800f3dbb373eaf705c99e71bbf4282c6ce177e9 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-amon/dictionaries/00_eole-amon_packages.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>conntrack</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-amon/dictionaries/14_agregation.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-amon/dictionaries/14_agregation.xml new file mode 100644 index 0000000000000000000000000000000000000000..b6c8a1deb9edbd75365a459f7724fbd40cd803cd --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-amon/dictionaries/14_agregation.xml @@ -0,0 +1,124 @@ +<?xml version='1.0' encoding='utf-8'?> + +<creole> + + <files> + <file name='/etc/iproute2/rt_tables'/> + <file filelist='agregation' name='/etc/agregation.conf' rm='True'/> + <file filelist='agregation' name='/etc/logrotate.d/agregation' source='agregation.logrotate'/> + </files> + + <variables> + + <family name='Interface-0'> + <variable name='alias_gw_eth0' redefine='True' mandatory='True'/> + <variable name='activer_agregation' type='oui/non' description='Répartition de charge entre 2 lignes Internet'> + <value>non</value> + </variable> + </family> + + <family name='agrégation'> + + <variable name='ag_mode' type='string' description='Mode load balancing ou fail-over'> + <value>mode_lb</value> + </variable> + <!-- lien 1 --> + <variable name='ag_force_eth0' type='ip' description='Destination forcée sur le lien 1' multi='True'/> + <variable name='ag_force_netmask_eth0' type='netmask' description='Masque pour destination forcée sur le lien 1'/> + <variable name='ag_dns_eth0' type='ip' description='Adresse du DNS sur le lien 1' multi='True' mandatory='True'/> + <variable name='ag_fo_etat_eth0' type='string' description='Etat actif ou passif pour fail-over lien 1'/> + <variable name='ag_weight_eth0' type='number' description='Débit mesuré sur le lien 1 (entier en Mbps)' mandatory='True'/> + <!-- lien 2 --> + <variable name='ag_force_eth0_0' type='ip' description='Destination forcée sur le lien 2' multi='True'/> + <variable name='ag_force_netmask_eth0_0' type='netmask' description='Masque pour destination forcée sur le lien 2'/> + <variable name='ag_dns_eth0_0' type='ip' description='Adresse du DNS sur le lien 2' multi='True' mandatory='True'/> + <variable name='ag_fo_etat_eth0_0' type='string' description='Etat actif ou passif pour fail-over lien 2'/> + <variable name='ag_weight_eth0_0' type='number' description='Débit mesuré sur le lien 2 (entier en Mbps)' mandatory='True'/> + <!-- divers --> + <variable name='ag_pause' type='number' description="Délai entre les tests d'état (en secondes)" > + <value>10</value> + </variable> + <variable name='ag_timeout' type='number' description='Timeout de la requête DNS (en secondes)' > + <value>1</value> + </variable> + <variable name='ag_testdns' type='domain_strict' description='Adresse DNS testée' multi='True' > + <value>www.google.com</value> + </variable> + <variable name='ag_nbsucces' type='number' description="Nombre de succès avant changement d'état"> + <value>4</value> + </variable> + <variable name='ag_nbechecs' type='number' description="Nombre d'échecs avant changement d'état"> + <value>1</value> + </variable> + <!-- mail --> + <variable name='ag_active_mail' type='oui/non' description='Activation des alertes mail'> + <value>non</value> + </variable> + <variable name='ag_mail_dest' type='mail' description="Adresse mail d'alerte" multi='True' mandatory='True'/> + </family> + + <separators> + <separator name='activer_agregation'>Agrégation de liens</separator> + <separator name='ag_mode'>Mode d'agrégation</separator> + <separator name='ag_force_eth0'>Lien 1</separator> + <separator name='ag_force_eth0_0'>Lien 2</separator> + <separator name='ag_pause'>Divers</separator> + <separator name='ag_active_mail'>Alerte mail</separator> + </separators> + + </variables> + + <constraints> + <!-- FIXME: l'agrégation nécessite un alias sur eth0 --> + <condition name='disabled_if_in' source='alias_eth0'> + <param>non</param> + <target type='variable'>activer_agregation</target> + </condition> + <condition name='disabled_if_in' source='activer_agregation'> + <param>non</param> + <target type='variable'>alias_gw_eth0</target> + <target type='family'>agregation</target> + <target type='filelist'>agregation</target> + </condition> + <check name="valid_enum" target='ag_mode'> + <param>['mode_lb','mode_fo']</param> + </check> + <condition name='disabled_if_in' source='ag_mode'> + <param>mode_fo</param> + <target type='variable'>ag_weight_eth0</target> + <target type='variable'>ag_weight_eth0_0</target> + </condition> + <condition name='disabled_if_in' source='ag_mode'> + <param>mode_lb</param> + <target type='variable'>ag_fo_etat_eth0</target> + <target type='variable'>ag_fo_etat_eth0_0</target> + </condition> + <check name="valid_enum" target='ag_fo_etat_eth0'> + <param>['actif','passif']</param> + </check> + <check name="valid_enum" target='ag_fo_etat_eth0_0'> + <param>['actif','passif']</param> + </check> + <group master='ag_force_eth0'> + <slave>ag_force_netmask_eth0</slave> + </group> + <group master='ag_force_eth0_0'> + <slave>ag_force_netmask_eth0_0</slave> + </group> + <fill name='calc_multi_val' target='ag_mail_dest'> + <param type='eole'>system_mail_to</param> + </fill> + <condition name='disabled_if_in' source='ag_active_mail'> + <param>non</param> + <target type='variable'>ag_mail_dest</target> + </condition> + </constraints> + + <help> + <family name='agrégation'>Paramétrage de la répartition de charge ou de la haute disponibilité pour les sorties Internet</family> + <variable name='activer_agregation'>L'agrégation de liens permet la mise en place d'une répartition de charge ou d'une haute disponibilité pour les sorties Internet</variable> + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-amon/dictionaries/20_vpn_amon.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-amon/dictionaries/20_vpn_amon.xml new file mode 100644 index 0000000000000000000000000000000000000000..d283bd3745f1f65e6a8e82a595f57938150894e2 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-amon/dictionaries/20_vpn_amon.xml @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + <files> + </files> + <variables> + <family name='services'> + <variable name='install_rvp' redefine='True' hidden='False' > + <value>non</value> + </variable> + </family> + <family name='rvp'> + <variable name='sw_install_vpn_route' redefine='True' mode='expert' > + <value>non</value> + </variable> + <variable name='sw_force_ip_src' redefine='True' mode='expert' > + <value>1</value> + </variable> + <variable name='acces_proxy_zone_rvp' type='oui/non' description="Accès RVP par le proxy" > + <value>non</value> + </variable> + <variable name='adresse_network_zone_rvp' type='ip' description='Adresse réseau de la zone RVP' multi='True' mandatory='True' /> + <variable name='adresse_netmask_zone_rvp' type='netmask' description='Masque de sous-réseau de la zone RVP' mandatory='True' /> + <variable name='autoriser_rvp_autres' type='oui/non' description="Autoriser d'autres zones que l'interface 1 à accéder à ce réseau"> + <value>non</value> + </variable> + <variable name='agriates_member' type='oui/non' description='Serveur membre du réseau AGRIATES' > + <value>non</value> + </variable> + </family> + <separators> + <!--<separator name='install_rvp'>Réseau Virtuel Privé (RVP)</separator>--> + <separator name='acces_proxy_zone_rvp'>Accès RVP par le proxy</separator> + <separator name='agriates_member'>AGRIATES</separator> + </separators> + </variables> + <constraints> + <condition name='disabled_if_in' source='install_rvp'> + <param>non</param> + <target type='family'>rvp</target> + <target type='filelist'>rvp</target> + </condition> + <condition name='disabled_if_in' source='acces_proxy_zone_rvp'> + <param>non</param> + <target type='variable'>adresse_network_zone_rvp</target> + </condition> + <group master='adresse_network_zone_rvp'> + <slave>adresse_netmask_zone_rvp</slave> + <slave>autoriser_rvp_autres</slave> + </group> + </constraints> + <help> + <variable name='acces_proxy_zone_rvp'>Autoriser les réseaux locaux à accéder à des zones RVP via le proxy</variable> + </help> +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-amon/dictionaries/30_amon.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-amon/dictionaries/30_amon.xml new file mode 100644 index 0000000000000000000000000000000000000000..b34019a091a10bbc21ce34b4eb3c6b6df2f93912 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-amon/dictionaries/30_amon.xml @@ -0,0 +1,86 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + <file name='/etc/host.conf'/> + <file name='/etc/sudoers.d/amon' source='amon.sudo' mode="0440"/> + <file name='/etc/cron.d/amon-firewall' source='cron-root'/> + </files> + + <variables> + + <family name='general'> + <variable name='nombre_interfaces' redefine='True' mode='basic'> + <value>2</value> + </variable> + <variable name='eole_module' redefine='True'> + <value>amon</value> + </variable> + </family> + + <family name='services'> + <variable name='activer_clam' redefine='True'> + <value>non</value> + </variable> + </family> + + <family name='système'> + + <!-- We need to recalculate the variables --> + <variable name='eole_lv_names' redefine='True' remove_check='True' /> + <variable name='eole_lv_standard_extends' redefine='True' remove_check='True' /> + + </family> + + <family name='Interface-0'> + <variable name='activer_dns_eth0' redefine='True' mode='expert'> + <value>non</value> + </variable> + <variable name='dns_master_eth0' redefine='True' mode='expert'/> + </family> + + <family name='réseau avancé' mode='expert'> + <variable name='activer_routage_ipv4' redefine='True' hidden='True'> + <value>oui</value> + </variable> + </family> + + <separators/> + + </variables> + + <constraints> + + <!-- Amon >= 2 cartes réseau --> + <check name="valid_enum" target="nombre_interfaces"> + <param>['2','3','4','5']</param> + </check> + + <!-- Default AmonEcole* logical volumes --> + <auto name='calc_multi_val' target='eole_lv_names'> + <param>root</param> + <param>tmp</param> + <param>var</param> + <param>var+spool</param> + <param>var+log</param> + <param>home</param> + </auto> + + <!-- Default AmonEcole* logical volumes extension: 100% /home --> + <auto name='calc_multi_val' target='eole_lv_standard_extends'> + <param type='number'>0</param> + <param type='number'>0</param> + <param type='number'>0</param> + <param type='number'>0</param> + <param type='number'>100</param> + <param type='number'>0</param> + </auto> + + </constraints> + + <help/> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-amon/dictionaries/40_amon_conteneurs.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-amon/dictionaries/40_amon_conteneurs.xml new file mode 100644 index 0000000000000000000000000000000000000000..d46b4175c48e922699429e7f84e1adb8207962d3 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-amon/dictionaries/40_amon_conteneurs.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + <containers> + <container name="internet" id="53"/> + <container name="proxy" group="internet"/> + <container name="dns" group="internet"/> + </containers> + <variables/> + + <constraints/> + + <help/> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-amon/files/usr/sbin/agregation.sh b/seed/release/eole-2.7/2.7.1/applicationservice/eole-amon/files/usr/sbin/agregation.sh new file mode 100644 index 0000000000000000000000000000000000000000..570804ec5d4fe56cd603053dd95ba4537f1418bc --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-amon/files/usr/sbin/agregation.sh @@ -0,0 +1,444 @@ +#!/bin/bash +############################## +# Script Agregation de lien # +# Gabriel CORGNE # +############################## + +# Ajout marquage de packet pour SNAT +# ac-creteil.fr Olivier Sauzet - Rachid Bouhassoun +# le 10 Juin 2009 + +[ -e /etc/agregation.conf ] || { + # Pas de fichier de configuration + echo "Fichier de configuration /etc/agregation.conf non trouvé" + exit 1 +} +. /etc/agregation.conf +. /usr/lib/eole/zephir.sh + +#Initialisation des variables d'etat +# Dernier etat du lien (0: OK, 1: NOK) +LLS1=0 +LLS2=0 +# Dernier etat du host +LHS1=0 +LHS2=0 +# Etat actuel du host +CHS1=0 +CHS2=0 +# Le lien doit changer (O:oui , 1:non) +CLS1=1 +CLS2=1 +# Nombre de changement d'etat +COUNT1=0 +COUNT2=0 +# Nombre de serveurs DNS a tester +ID1_C=${#DNS1[@]} +ID2_C=${#DNS2[@]} +# Nombre de mires a tester +IM_C=${#MIRE[@]} +# Calcul du coefficient pour iptables +if [ -n "$W1" -a -n "$W2" ];then +WCO=$[$[$W2*1000]/$[$W1+$W2]] +fi + +# Fonction explicitant les messages d'etat +expl() { + if [ $1 -eq 0 ];then + echo "actif" + else + echo "inactif" + fi +} + +# Fonction de Log dans /var/log/agregation.log + Zephir +# $1 : message +# $2 : Zephir +# $3 : envoyer le message par mail +Aecho () { + if [ -z "$2" ];then + level="ERR" + else + level=$2 + fi + DATE=`date +%Y-%m-%d_%H:%M:%S` + echo "$DATE $1" >> /var/log/agregation.log + [ "$level" != 'ERR' ] && echo "$1" + Zephir "$level" "$1" agregation + # Si demande d'envoi d'un mail + if [ "$3" = "oui" ] && [ "$ag_active_mail" = "oui" ]; then + SubJ="Liaison $nom_domaine_local_supp ($numero_etab)" + if [ -z "${CC[@]}" ] ; then + echo "$MssG"|mutt -s "$SubJ" "$DEST" + else + echo "$MssG"|mutt -s "$SubJ" "$DEST" -c "${CC[@]}" + fi + fi +} + +#Mise à jour des routes $1=T1 +ipruleclear () { + for r in `ip rule list|grep $1|awk '{print $2"-"$3"-"$4"-"$5"-"$6"-"$7}'` + do ip rule del `echo $r|sed "s/-/ /g"` + done +} + +#Vidage des règles iptables de SNAT +iptablessnatclear () { + i=1 + while [ $i -le `/sbin/iptables -t nat -S POSTROUTING|wc -l` ] + do + if [ -n "`/sbin/iptables -t nat -S POSTROUTING $i|grep SNAT|grep "o $nom_zone_eth0"`" ];then + /sbin/iptables -t nat -D POSTROUTING $i + else + let i++ + fi + done +} + +#Vidage des règles iptables de MANGLE $1 = nom de la carte +iptablesmangleclear () { + i=1 + while [ "$i" -le `/sbin/iptables -t mangle -S PREROUTING|wc -l` ]; do + if [ -n "`/sbin/iptables -t mangle -S PREROUTING $i|grep " -i $1 "`" ]; then + /sbin/iptables -t mangle -D PREROUTING $i + else + let i++ + fi + done +} + +#Definition de la repartition par interface $1 = nom de la carte +_active_balancing_to() { + interface=$1 + network=$2 + #Si non NEW + /sbin/iptables -t mangle -A PREROUTING -i $interface -s $network -m state ! --state NEW -j RESTOREMARK + /sbin/iptables -t mangle -A PREROUTING -i $interface -s $network -m state ! --state NEW -j RETURN + #Routes forcees + for ip_force1 in ${FORCE1[@]}; do + /sbin/iptables -t mangle -A PREROUTING -i $interface -s $network -d $ip_force1 -m state --state NEW -j T1 + /sbin/iptables -t mangle -A PREROUTING -i $interface -s $network -d $ip_force1 -m state --state NEW -j RETURN + done + for ip_force2 in ${FORCE2[@]}; do + /sbin/iptables -t mangle -A PREROUTING -i $interface -s $network -d $ip_force2 -m state --state NEW -j T2 + /sbin/iptables -t mangle -A PREROUTING -i $interface -s $network -d $ip_force2 -m state --state NEW -j RETURN + done + #Si NEW et recent alors Tag puis RETURN + /sbin/iptables -t mangle -A PREROUTING -i $interface -s $network -m state --state NEW -m recent --name T1 --update --rdest --seconds 3600 -j T1 + /sbin/iptables -t mangle -A PREROUTING -i $interface -s $network -m state --state NEW -m recent --name T1 --update --rdest --seconds 3600 -j RETURN + /sbin/iptables -t mangle -A PREROUTING -i $interface -s $network -m state --state NEW -m recent --name T2 --update --rdest --seconds 3600 -j T2 + /sbin/iptables -t mangle -A PREROUTING -i $interface -s $network -m state --state NEW -m recent --name T2 --update --rdest --seconds 3600 -j RETURN + #Si NEW sans recent alors Tag puis RETURN + #FIXME pas compris a quoi ca sert + /sbin/iptables -t mangle -A PREROUTING -i $interface -s $network -m state --state NEW -j T2 + #repertition entre lien 1 et 2 + /sbin/iptables -t mangle -A PREROUTING -i $interface -s $network -m state --state NEW -m statistic --mode random --probability 0.$WCO -m recent --name T2 --set --rdest -j RETURN + /sbin/iptables -t mangle -A PREROUTING -i $interface -s $network -m state --state NEW -m recent --name T1 --set --rdest -j T1 +} +active_balancing_to() { + ointerface=$(CreoleGet nom_carte_eth${1}) + network=$(CreoleGet adresse_network_eth${1})/$(CreoleGet adresse_netmask_eth${1}) + iptablesmangleclear $ointerface + _active_balancing_to $ointerface $network + if [ "$(CreoleGet vlan_eth${1})" = "oui" ]; then + VLAN_ID=($(CreoleGet vlan_id_eth${1})) + VLAN_Network=($(CreoleGet vlan_network_eth${1})) + VLAN_Netmask=($(CreoleGet vlan_netmask_eth${1})) + NB_VLAN=${#VLAN_ID[*]} + for ((id=0; id < $NB_VLAN; id+=1)) + do + interface_vlan="$ointerface.${VLAN_ID[id]}" + iptablesmangleclear $interface_vlan + network_vlan="${VLAN_Network[id]}/${VLAN_Netmask[id]}" + _active_balancing_to $interface_vlan $network_vlan + done + fi + if [ "$(CreoleGet alias_eth${1})" = "oui" ]; then + ALIAS_IP=($(CreoleGet alias_ip_eth${1})) + ALIAS_Network=($(CreoleGet alias_network_eth${1})) + ALIAS_Netmask=($(CreoleGet alias_netmask_eth${1})) + NB_ALIAS=${#ALIAS_IP[*]} + for ((id=0; id < $NB_ALIAS; id+=1)) + do + interface_alias="$ointerface" + network_alias="${ALIAS_Network[id]}/${ALIAS_Netmask[id]}" + _active_balancing_to $interface_alias $network_alias + done + fi +} + +#Definition du flux par interface +#$1 = numero de la carte (0, 1, 2, ...) +#$2 = T1 ou T2 + +_active_link_to() { + interface=$1 + network=$2 + link=$3 + #Si non NEW + /sbin/iptables -t mangle -A PREROUTING -i $interface -s $network -m state ! --state NEW -j RESTOREMARK + /sbin/iptables -t mangle -A PREROUTING -i $interface -s $network -m state ! --state NEW -j RETURN + #Marques sur $2 + /sbin/iptables -t mangle -A PREROUTING -i $interface -s $network -m state --state NEW -j $link +} +active_link_to() { + ointerface=$(CreoleGet nom_carte_eth${1}) + network=$(CreoleGet adresse_network_eth${1})/$(CreoleGet adresse_netmask_eth${1}) + link=$2 + iptablesmangleclear $ointerface + _active_link_to $ointerface $network $link + if [ "$(CreoleGet vlan_eth${1})" = "oui" ]; then + VLAN_ID=($(CreoleGet vlan_id_eth${1})) + VLAN_Network=($(CreoleGet vlan_network_eth${1})) + VLAN_Netmask=($(CreoleGet vlan_netmask_eth${1})) + NB_VLAN=${#VLAN_ID[*]} + for ((id=0; id < $NB_VLAN; id+=1)) + do + interface_vlan="$ointerface.${VLAN_ID[id]}" + iptablesmangleclear $interface_vlan + network_vlan="${VLAN_Network[id]}/${VLAN_Netmask[id]}" + _active_link_to $interface_vlan $network_vlan $link + done + fi + if [ "$(CreoleGet alias_eth${1})" = "oui" ]; then + ALIAS_IP=($(CreoleGet alias_ip_eth${1})) + ALIAS_Network=($(CreoleGet alias_network_eth${1})) + ALIAS_Netmask=($(CreoleGet alias_netmask_eth${1})) + NB_ALIAS=${#ALIAS_IP[*]} + for ((id=0; id < $NB_ALIAS; id+=1)) + do + interface_alias="$ointerface" + network_alias="${ALIAS_Network[id]}/${ALIAS_Netmask[id]}" + _active_link_to $interface_alias $network_alias + done + fi + +} +## Initialisation +# Large recent table +/sbin/modprobe ipt_recent ip_list_tot=4000 + +# Vidage du cache et des regles de routage +/sbin/ip route flush cache +/sbin/ip route del default +/sbin/ip route delete default via $GW1 dev $nom_zone_eth0 +/sbin/ip route delete default via $GW2 dev $nom_zone_eth0 +ipruleclear T1 +ipruleclear T2 + +# Chargement des regles de routage +/sbin/ip rule add from $WAN1 table T1 +/sbin/ip route add $NET1 dev $nom_zone_eth0 src $WAN1 table T1 +/sbin/ip route add default via $GW1 table T1 +/sbin/ip rule add fwmark 1 table T1 + +/sbin/ip rule add from $WAN2 table T2 +/sbin/ip route add $NET2 dev $nom_zone_eth0 src $WAN2 table T2 +/sbin/ip route add default via $GW2 table T2 +/sbin/ip rule add fwmark 2 table T2 + +#for ip_force1 in ${FORCE1[@]}; do +# /sbin/ip route add $ip_force1 via $GW1 table main +#done +#for ip_force2 in ${FORCE2[@]}; do +# /sbin/ip route add $ip_force2 via $GW2 table main +#done + +for ip_dns1 in ${DNS1[@]}; do + /sbin/ip route add $ip_dns1 via $GW1 table main +done +for ip_dns2 in ${DNS2[@]}; do + /sbin/ip route add $ip_dns2 via $GW2 table main +done + + +#################### + +# Vidage des chaines MANGLE +check_T1=$(iptables-save |grep "T1" |wc -l) +check_T2=$(iptables-save |grep "T2" | wc -l) +check_RESTOREMARK=$(iptables-save |grep "RESTOREMARK" |wc -l) +check_PREROUTING=$(iptables-save |grep "PREROUTING" |wc -l) +if [ "$check_PREROUTING" -gt "1" ] ; then + /sbin/iptables -t mangle -F PREROUTING +fi +if [ "$check_T1" -gt "1" ] ; then + /sbin/iptables -t mangle -F T1 +fi +if [ "$check_T2" -gt "1" ] ; then + /sbin/iptables -t mangle -F T2 +fi +if [ "$check_RESTOREMARK" -gt "1" ] ; then + /sbin/iptables -t mangle -F RESTOREMARK +fi + +## creation de la chaine marquage pour agregation de lien +chaine_T1=$(iptables-save | grep ":T1") +if [ -z "$chaine_T1" ] ; then + /sbin/iptables -t mangle -N T1 + /sbin/iptables -t mangle -A T1 -d 10.0.0.0/8 -j RETURN + /sbin/iptables -t mangle -A T1 -d 172.16.0.0/12 -j RETURN + /sbin/iptables -t mangle -A T1 -d 192.168.0.0/16 -j RETURN + /sbin/iptables -t mangle -A T1 -d 161.48.0.0/19 -j RETURN + /sbin/iptables -t mangle -A T1 -j MARK --set-mark 1 + /sbin/iptables -t mangle -A T1 -j CONNMARK --save-mark +fi +chaine_T2=$(iptables-save | grep ":T2") +if [ -z "$chaine_T2" ] ; then + /sbin/iptables -t mangle -N T2 + /sbin/iptables -t mangle -A T2 -d 10.0.0.0/8 -j RETURN + /sbin/iptables -t mangle -A T2 -d 172.16.0.0/12 -j RETURN + /sbin/iptables -t mangle -A T2 -d 192.168.0.0/16 -j RETURN + /sbin/iptables -t mangle -A T2 -d 161.48.0.0/19 -j RETURN + /sbin/iptables -t mangle -A T2 -j MARK --set-mark 2 + /sbin/iptables -t mangle -A T2 -j CONNMARK --save-mark +fi +chaine_RESTOREMARK=$(iptables-save | grep ":RESTOREMARK") +if [ -z "$chaine_RESTOREMARK" ] ; then + /sbin/iptables -t mangle -N RESTOREMARK + /sbin/iptables -t mangle -A RESTOREMARK -d 10.0.0.0/8 -j RETURN + /sbin/iptables -t mangle -A RESTOREMARK -d 172.16.0.0/12 -j RETURN + /sbin/iptables -t mangle -A RESTOREMARK -d 192.168.0.0/16 -j RETURN + /sbin/iptables -t mangle -A RESTOREMARK -d 161.48.0.0/19 -j RETURN + /sbin/iptables -t mangle -A RESTOREMARK -j CONNMARK --restore-mark +fi + +## Mise a jour des règles de SNAT +iptablessnatclear +/sbin/iptables -t nat -A POSTROUTING -o $nom_zone_eth0 -m mark --mark 1 -j SNAT --to-source $WAN1 +/sbin/iptables -t nat -A POSTROUTING -o $nom_zone_eth0 -m mark --mark 2 -j SNAT --to-source $WAN2 + + +# Test vers $MIRE sur le lien $L +Checkstate() { + L=$1 + ID=0 + IM=0 + SUCCES=1 + while [ $IM -lt $IM_C ] && [ $SUCCES -eq 1 ]; do + while [ "$ID" -lt $(eval echo \$ID$L\_C) ] && [ $SUCCES -eq 1 ]; do + host -W $TIMEOUT ${MIRE[$IM]} $(eval echo \${DNS$L[$ID]})> /dev/null 2>&1 + if [ $? -ne 0 ]; then + [ $(eval echo \$LLS$L) -eq 0 ] && Aecho "Erreur de resolution de $(eval echo \${MIRE[$IM]}) sur le dns $(eval echo \${DNS$L[$ID]}) du lien $L" + ID=$(( $ID + 1 )) + else + SUCCES=0 + fi + done + IM=$(( $IM + 1 )) + ID=0 + done + + if [ $SUCCES -eq 1 ]; then + Aecho "Le lien $L est tombe" + eval CHS$L=1 + else + eval CHS$L=0 + fi + essai=$(eval echo \$COUNT$L) + if [ $(eval echo \$LHS$L) -ne $(eval echo \$CHS$L) ]; then + if [ $(eval echo \$LLS$L) -eq 1 ]; then + msg=" (essai $essai/$NBSUCCES)" + fi + Aecho "L'etat du lien $L a change de $(expl $(eval echo \$LHS$L)) a $(expl $(eval echo \$CHS$L))$msg" + eval COUNT$L=1 + elif [ $(eval echo \$LHS$L) -ne $(eval echo \$LLS$L) ]; then + Aecho "L'etat du lien $L est bien change (essai $essai/$NBSUCCES)" + eval COUNT$L=$(( $(eval echo \$COUNT$L) + 1 )) + fi + if [[ $(eval echo \$COUNT$L) -ge $NBSUCCES || ($(eval echo \$LLS$L) -eq 0 && $(eval echo \$COUNT$L) -ge $NBECHECS) ]]; then + Aecho "Le lien $L n'est plus $(expl $(eval echo \$LLS$L))" + eval CLS$L=0 + eval COUNT$L=0 + if [ $(eval echo \$LLS$L) -eq "1" ]; then + eval LLS$L=0 + else + eval LLS$L=1 + fi + else + eval CLS$L=1 + fi + + eval LHS$L=$(eval echo \$CHS$L) +} + +# redirection de tous les flux vers un lien +# $1 : numero du lien (1 ou 2) vers lequel on bascule +# $2 : numero du lien (1 ou 2) inactif +active_link () { + link=$1 + oldlink=$2 + GW=$(eval echo \$GW$link) + Aecho "Seul le lien $link est actif, redirection des flux sur ce lien" "" "oui" + # Iproute2 sur le lien $link + /sbin/ip route replace default via $GW dev $nom_zone_eth0 + # bascule des destinations forcées de $oldlink vers le lien $link + for ip_force in $(eval echo \${FORCE$oldlink\[@\]\}); do + /sbin/ip route replace $ip_force via $GW dev $nom_zone_eth0 + done + # Mangle sur le lien $link + for num in `seq 1 $((a-1))`; do + active_link_to $num T$link + done +} + +active_forced_links () { + # retablit les destination forcees lien 1 + for ip_force in ${FORCE1[@]}; do + /sbin/ip route replace $ip_force via $GW1 dev $nom_zone_eth0 + done + # retablit les destination forcees lien 2 + for ip_force in ${FORCE2[@]}; do + /sbin/ip route replace $ip_force via $GW2 dev $nom_zone_eth0 + done +} + +activate() { + if [ $ag_mode == "mode_lb" ] ; then + # load balancing + # Iproute2 sur les 2 liens + /sbin/ip route replace default proto static nexthop via $GW1 dev $nom_zone_eth0 weight $W1 nexthop via $GW2 dev $nom_zone_eth0 weight $W2 + active_forced_links + # Mangle sur les 2 liens + active_balancing_to 1 + [ $nombre_interfaces -ge 3 ] && active_balancing_to 2 + [ $nombre_interfaces -ge 4 ] && active_link_to 3 T1 + [ $nombre_interfaces -eq 5 ] && active_link_to 4 T2 + else + #mode fail-over + active_forced_links + if [ $ag_fo_etat_eth0 == "actif" ] && [ $ag_fo_etat_eth0_0 == "passif" ] ; then + /sbin/ip route replace default via $GW1 dev $nom_zone_eth0 + elif [ $ag_fo_etat_eth0 == "passif" ] && [ $ag_fo_etat_eth0_0 == "actif" ] ; then + /sbin/ip route replace default via $GW2 dev $nom_zone_eth0 + fi + fi +} + +# Log du démarrage +Aecho "Initialisation de l'agregation de liens" 'MSG' +activate + +#Boucle infini pour tester les liens +while : ; do + Checkstate 1 + Checkstate 2 + + # Si au moins un lien doit changer + if [[ $CLS1 -eq 0 || $CLS2 -eq 0 ]]; then + # Dernier état du lien 1 NOK et du lien 2 OK + if [[ $LLS1 -eq 1 && $LLS2 -eq 0 ]]; then + active_link 2 1 + # Dernier état du lien 1 OK et du lien 2 NOK + elif [[ $LLS1 -eq 0 && $LLS2 -eq 1 ]]; then + active_link 1 2 + # Dernier état du lien 1 OK et du lien 2 OK + elif [[ $LLS1 -eq 0 && $LLS2 -eq 0 ]]; then + Aecho "Rechargement de la repartition sur les 2 liens" 'MSG' 'oui' + activate + fi + fi + + sleep $PAUSE +done diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-amon/files/usr/share/ead2/backend/config/actions/actions_amon.cfg b/seed/release/eole-2.7/2.7.1/applicationservice/eole-amon/files/usr/share/ead2/backend/config/actions/actions_amon.cfg new file mode 100644 index 0000000000000000000000000000000000000000..54c2b2742f698ed01a2d4d8fc93db18ad9d03e0f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-amon/files/usr/share/ead2/backend/config/actions/actions_amon.cfg @@ -0,0 +1,6 @@ +amon/regles_admin +amon/regles_pedago +amon/regles_generales +amon/securite +amon/groupe_machine_admin +amon/groupe_machine_pedago diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-amon/files/usr/share/ead2/backend/config/perms/perm_amon.ini b/seed/release/eole-2.7/2.7.1/applicationservice/eole-amon/files/usr/share/ead2/backend/config/perms/perm_amon.ini new file mode 100644 index 0000000000000000000000000000000000000000..1211d85eaadf7bc1a219ffe4cfc6a79a78ced4f3 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-amon/files/usr/share/ead2/backend/config/perms/perm_amon.ini @@ -0,0 +1,27 @@ +[roles] +admin=Administrateur +admin_pedago=Administrateur du reseau peda +admin_amon=Administrateur de l'Amon + +[permissions] +horaire=admin,admin_amon +#commun +help=admin_pedago,admin_amon +update_ead=admin_pedago,admin_amon +journal=admin_pedago,admin_amon +main_status=admin_pedago,admin_amon +asimple_services=admin_pedago,admin_amon +server-configure=admin_amon +server-reboot=admin_amon +server-stop=admin_amon +lshw=admin_amon +maj=admin_amon +daemon=admin_amon +asimple_services=admin_amon +esimple_services_editor=admin_amon +role_editor=admin_amon +role_manager=admin_amon +role_association=admin_amon +bande_passante=admin_amon +rapport_maj=admin_amon +cmd_console=admin_amon diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-amon/files/usr/share/ead2/backend/config/roles/roles_amon.ini b/seed/release/eole-2.7/2.7.1/applicationservice/eole-amon/files/usr/share/ead2/backend/config/roles/roles_amon.ini new file mode 100644 index 0000000000000000000000000000000000000000..3e058ec9cde5676f680ce318ab233b3a2ed9f5b0 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-amon/files/usr/share/ead2/backend/config/roles/roles_amon.ini @@ -0,0 +1,2 @@ +[pam] +eole2=admin_pedago diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-amon/files/usr/share/eole/sbin/agregation b/seed/release/eole-2.7/2.7.1/applicationservice/eole-amon/files/usr/share/eole/sbin/agregation new file mode 100644 index 0000000000000000000000000000000000000000..305c3d389035b1b705ebd0b69b6ead3894373084 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-amon/files/usr/share/eole/sbin/agregation @@ -0,0 +1,80 @@ +#! /bin/bash +################################# +# Script d'Agregation de lien # +# by GC (ac-nantes) # +################################# + +RETVAL=0 + +. /lib/lsb/init-functions + +prog="agregation" + +start() { + if [ -e /var/lock/agregation ]; then + echo "Le service Agregation est déjà démarré" + exit 1 + fi + if [ -e /etc/agregation.conf ] + then + . /etc/agregation.conf + if [ -n "$PAUSE" ]; then + log_daemon_msg "Démarrage du service Agregation" + /usr/sbin/agregation.sh &>/dev/null & + RETVAL=$? + log_end_msg $RETVAL + [ $RETVAL -eq 0 ] && touch /var/lock/agregation + return $RETVAL + else + exit 1 + fi + fi +} + +stop() { + if [ -e /etc/agregation.conf ] + then + log_daemon_msg "Arret du service Agregation" + rm -f /var/lock/agregation + [ "`ps ax|grep agregation.sh|grep /bin/bash| awk '{print $1}'`" != "" ] && /bin/kill -9 "`ps ax|grep agregation.sh|grep /bin/bash| awk '{print $1}'`" 2>&1 >/dev/null + RETVAL=$? + log_end_msg $RETVAL + return $RETVAL + else + exit 1 + fi +} + + +restart() { + stop + sleep 1 + start +} +status() { + if [ -z "`ps ax|grep agregation.sh|grep /bin/bash| awk '{print $1}'`" ]; then + echo "le service Agregation n'est pas démarré" + else + echo "le service Agregation est démarré" + fi +} + +case "$1" in + start) + start + ;; + stop) + stop + ;; + status) + status + ;; + restart) + [ -f /var/lock/agregation ] && restart || start : + ;; + *) + printf "Usage: %s {start|stop|status|restart}\n" "$0" + exit 1 +esac + +exit $? diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-amon/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-amon/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..050270402037c2187072f17bf1de2700c9967bd0 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-amon/service.yml @@ -0,0 +1,63 @@ +format: '0.1' +name: eole-amon +version: |- + 2.7.0-4 +description: |- + configuration du module EOLE : Amon + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: + - eole-antivirus + - eole-dhcrelay + - eole-dns + - eole-era + - eole-proxy + - eole-radius + - eole-reverseproxy + - eole-sso + - eole-vpn + - eole-wpad + - eole-server +packages: + - conntrack +dictionaries: + - 14_agregation.xml + - 20_vpn_amon.xml + - 30_amon.xml + - 40_amon_conteneurs.xml +extra_dictionaries: {} +templates: + - agregation.conf + - agregation.logrotate + - amon.sudo + - cron-root + - host.conf + - rt_tables +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: [] +files: + /usr/sbin/agregation.sh: + owner: root + group: root + mode: '0755' + /usr/share/ead2/backend/config/actions/actions_amon.cfg: + owner: root + group: root + mode: '0644' + /usr/share/ead2/backend/config/perms/perm_amon.ini: + owner: root + group: root + mode: '0644' + /usr/share/ead2/backend/config/roles/roles_amon.ini: + owner: root + group: root + mode: '0644' + /usr/share/eole/sbin/agregation: + owner: root + group: root + mode: '0755' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-amon/templates/agregation.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-amon/templates/agregation.conf new file mode 100644 index 0000000000000000000000000000000000000000..15b851a9916ac548c0dc762ee47b4fe967fd211c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-amon/templates/agregation.conf @@ -0,0 +1,81 @@ +# Delai entre les tests d'etat (minimum 5) +PAUSE=%%max(5, %%int(%%ag_pause)) + +# Timout de la requete DNS +TIMEOUT=%%ag_timeout + +# Adresse DNS testee +# Adresse(s) DNS testee +%for %%idx, %%test_dns in %%enumerate(%%ag_testdns) +MIRE[%%idx]=%%test_dns +%end for + +# Nombre de succes ou d'echecs avant changement d'etat +NBSUCCES=%%ag_nbsucces +NBECHECS=%%ag_nbechecs + +# Interface 1 +# Adresse IP +WAN1=%%adresse_ip_eth0 +# Adresse reseau +NET1=%%adresse_network_eth0 +# Adresse de la passerelle +GW1=%%adresse_ip_gw +# Poid de la ligne (entier) +W1=%%getVar('ag_weight_eth0', 0) +# Adresse du(des) serveur(s) dns +%for %%idx, %%ag_dns_eth0_ip in %%enumerate(%%ag_dns_eth0) +DNS1[%%idx]=%%ag_dns_eth0_ip +%end for +# Adresse(s) forcees sur le lien 1 +%for %%idx, %%ag_force_eth0_ip in %%enumerate(%%ag_force_eth0) + %if %%ag_force_eth0_ip.ag_force_netmask_eth0 == "255.255.255.255" +FORCE1[%%idx]=%%ag_force_eth0_ip + %else +FORCE1[%%idx]=%%ag_force_eth0_ip/%%ag_force_eth0_ip.ag_force_netmask_eth0 + %end if +%end for + +# Interface 2 +# Adresse IP +# FIXME : crash si pas d'alias définis sur eth1 ! +WAN2=%%alias_ip_eth0[0] +# Adresse reseau +NET2=%%alias_ip_eth0[0].alias_network_eth0 +# Adresse de la passerelle +GW2=%%alias_ip_eth0[0].alias_gw_eth0 +# Poid de la ligne (entier) +W2=%%getVar('ag_weight_eth0_0', 0) +# Adresse du(des) serveur(s) dns (separes par un espace) +%for %%idx, %%ag_dns_eth0_0_ip in %%enumerate(%%ag_dns_eth0_0) +DNS2[%%idx]=%%ag_dns_eth0_0_ip +%end for +# Adresse(s) forcees sur le lien 2 +%for %%idx, %%ag_force_eth0_0_ip in %%enumerate(%%ag_force_eth0_0) + %if %%ag_force_eth0_0_ip.ag_force_netmask_eth0_0 == "255.255.255.255" +FORCE2[%%idx]=%%ag_force_eth0_0_ip + %else +FORCE2[%%idx]=%%ag_force_eth0_0_ip/%%ag_force_eth0_0_ip.ag_force_netmask_eth0_0 + %end if +%end for + +# Adresse(s) envoi des mails +%if %%ag_active_mail == 'oui' + %for %%idx, %%adresse in %%enumerate(%%ag_mail_dest) + %if %%idx == 0: +DEST=%%adresse + %else +CC[%%idx]=%%adresse + %end if + %end for +%end if + +# Autre variable +nombre_interfaces="%%nombre_interfaces" +ag_mode="%%ag_mode" +ag_fo_etat_eth0="%%getVar('ag_fo_etat_eth0', '')" +ag_fo_etat_eth0_0="%%getVar('ag_fo_etat_eth0_0', '')" +ag_active_mail="%%ag_active_mail" +nom_domaine_local_supp="%%nom_domaine_local_supp" +numero_etab="%%numero_etab" +nom_zone_eth0="%%nom_zone_eth0" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-amon/templates/agregation.logrotate b/seed/release/eole-2.7/2.7.1/applicationservice/eole-amon/templates/agregation.logrotate new file mode 100644 index 0000000000000000000000000000000000000000..2f0c148878d69dcddfa48d9d696dd91fa9bd94ae --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-amon/templates/agregation.logrotate @@ -0,0 +1,9 @@ +/var/log/agregation.log { + weekly + rotate 8 + copytruncate + compress + notifempty + missingok +} + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-amon/templates/amon.sudo b/seed/release/eole-2.7/2.7.1/applicationservice/eole-amon/templates/amon.sudo new file mode 100644 index 0000000000000000000000000000000000000000..49567b98ef31f838e2c67e60c2b384b972c48564 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-amon/templates/amon.sudo @@ -0,0 +1,17 @@ +#------------------------------------------------------------------------------- +## sudoers pour Eole/Amon version 2.2 +## Eole <eole@ac-dijon.fr> +#------------------------------------------------------------------------------- +# sudoers file. +# +# This file MUST be edited with the 'visudo' command as root. +# +# See the sudoers man page for the details on how to write a sudoers file. +# + +# Host alias specification + +# User alias specification +GRPADM ALL=NOPASSWD : /usr/bin/fping +GRPADM ALL=NOPASSWD : /usr/share/eole/test-rvp +GRPADM ALL=NOPASSWD : /usr/share/eole/Maj-blacklist.sh diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-amon/templates/cron-root b/seed/release/eole-2.7/2.7.1/applicationservice/eole-amon/templates/cron-root new file mode 100644 index 0000000000000000000000000000000000000000..0ade960a91795353023bf7425e9fd3bd737e9909 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-amon/templates/cron-root @@ -0,0 +1,13 @@ +0 7 * * 1 root [ -x /sbin/matin.firewall ] && /sbin/matin.firewall +0 19 * * 1 root [ -x /sbin/soir.firewall ] && /sbin/soir.firewall +0 7 * * 2 root [ -x /sbin/matin.firewall ] && /sbin/matin.firewall +0 19 * * 2 root [ -x /sbin/soir.firewall ] && /sbin/soir.firewall +0 7 * * 3 root [ -x /sbin/matin.firewall ] && /sbin/matin.firewall +0 19 * * 3 root [ -x /sbin/soir.firewall ] && /sbin/soir.firewall +0 7 * * 4 root [ -x /sbin/matin.firewall ] && /sbin/matin.firewall +0 19 * * 4 root [ -x /sbin/soir.firewall ] && /sbin/soir.firewall +0 7 * * 5 root [ -x /sbin/matin.firewall ] && /sbin/matin.firewall +0 19 * * 5 root [ -x /sbin/soir.firewall ] && /sbin/soir.firewall +0 7 * * 6 root [ -x /sbin/matin.firewall ] && /sbin/matin.firewall +0 14 * * 6 root [ -x /sbin/soir.firewall ] && /sbin/soir.firewall + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-amon/templates/host.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-amon/templates/host.conf new file mode 100644 index 0000000000000000000000000000000000000000..3b6cf4cc4d841232795f6e8d95bf5be5612ce638 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-amon/templates/host.conf @@ -0,0 +1,7 @@ +#-------------------------------------------------------------------- +## host.conf pour Eole/Sphynx +#par samuel morin <samuel.morin@ac-dijon.fr> +#------------------------------------------------------------------- +order hosts,bind +multi on + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-amon/templates/rt_tables b/seed/release/eole-2.7/2.7.1/applicationservice/eole-amon/templates/rt_tables new file mode 100644 index 0000000000000000000000000000000000000000..138fa8d4f74c99422b2402304e7f427782476bfb --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-amon/templates/rt_tables @@ -0,0 +1,13 @@ +# +# reserved values +# +255 local +254 main +253 default +0 unspec +# +# local +%if %%getVar('activer_agregation', 'non') == 'oui' +2 T2 +1 T1 +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-amonecole-eclair/dictionaries/55_amonecole-eclair.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-amonecole-eclair/dictionaries/55_amonecole-eclair.xml new file mode 100644 index 0000000000000000000000000000000000000000..46226fa7c46e3a165f5e4fcb3f126d10854d0fb9 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-amonecole-eclair/dictionaries/55_amonecole-eclair.xml @@ -0,0 +1,135 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <containers> + + <container name='ltspserver'> + <interface linkto="eth1" ip="adresse_ip_eclair_link" mask="adresse_mask_eclair_link" bcast="adresse_bcast_eclair_link">eth0</interface> + <fstab name='tftp_path' mount_point='/var/lib/tftpboot' name_type='SymLinkOption' /> + <fstab name='home_path' name_type='SymLinkOption' /> + </container> + + <container name='dhcp'> + <fstab name='tftp_path' mount_point='/var/lib/tftpboot' name_type='SymLinkOption' /> + </container> + + <container name='gaspacho-agent' group='ltspserver' /> + + </containers> + + <variables> + + <family name='Général'> + + <variable name='eole_module' redefine='True'> + <value>amonecoleeclair</value> + </variable> + + <variable name='eclair_link_interface' hidden='True'> + <value>eth1</value> + </variable> + + </family> + + <family name='Services'> + + <!-- Override 30_ltsp.xml --> + <variable name='activer_client_ldap' redefine='True' hidden='True'> + <value>local</value> + </variable> + + <!-- Override 30_ltsp.xml --> + <variable name='activer_dhcp' redefine='True' mode='expert'> + <value>oui</value> + </variable> + + <!-- Override 30_ltsp.xml --> + <variable name='activer_tftp' redefine='True' mode='expert'> + <value>oui</value> + </variable> + + <variable name='activer_gaspacho' redefine='True'> + <value>oui</value> + </variable> + + </family> + + <family name='ltsp'> + + <variable name='adresse_serveur_nfs' redefine='True' disabled='True'/> + + <variable name="ltsp_client_type" redefine='True'> + <value>fat</value> + </variable> + + </family> + + <family name='tftp'> + + <variable name='tftp_path' type='filename' description='Chemin de base vers le répertoire TFTP' hidden='True'> + <value>/opt/tftpboot</value> + </variable> + + <variable name='chemin_fichier_pxe' redefine='True' mode='expert' hidden='False'> + <value>/default/pxelinux.0</value> + </variable> + + </family> + + <family name='Interface-1'> + + <variable name='adresse_ip_eclair_link' type='ip' description="Adresse IP pour le serveur Eclair" mandatory='True' /> + <variable name='adresse_mask_eclair_link' type='netmask' description="Masque de sous réseau pour le serveur Eclair" mandatory='True' mode='expert' /> + <variable name='adresse_bcast_eclair_link' type='broadcast' description="Broadcast pour le serveur Eclair" mandatory='True' mode='expert' /> + + </family> + + <family name='gaspacho-agent'> + <variable name='adresse_ip_gaspacho' redefine='True' /> + </family> + + <separators> + <separator name="adresse_ip_eclair_link">Adresse pour le serveur Eclair</separator> + </separators> + + </variables> + + <constraints> + + <check name="valid_in_network" target="adresse_ip_eclair_link" level="warning"> + <param type='eole'>adresse_network_eth1</param> + <param type='eole'>adresse_netmask_eth1</param> + </check> + + <check name="valid_differ" target="adresse_ip_eclair_link"> + <param type='eole'>adresse_ip_eth1</param> + </check> + + <check name="valid_differ" target="adresse_ip_eclair_link"> + <param type='eole'>adresse_ip_fichier_link</param> + </check> + + <check name="valid_differ" target="adresse_ip_eclair_link"> + <param type='eole'>adresse_ip_eth1_proxy_link</param> + </check> + + <fill name='calc_val' target='adresse_bcast_eclair_link'> + <param type='eole' name='valeur'>adresse_broadcast_eth1</param> + </fill> + + <fill name='calc_val' target='adresse_mask_eclair_link'> + <param type='eole' name='valeur'>adresse_netmask_eth1</param> + </fill> + + <fill name='calc_val' target='activer_gaspacho_agent'> + <param type='eole' name='valeur'>activer_gaspacho</param> + </fill> + + <fill name='calc_val' target='adresse_ip_gaspacho'> + <param type='eole'>web_url</param> + </fill> + + </constraints> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-amonecole-eclair/files/etc/apparmor.d/lxc/lxc-default-for-eclair b/seed/release/eole-2.7/2.7.1/applicationservice/eole-amonecole-eclair/files/etc/apparmor.d/lxc/lxc-default-for-eclair new file mode 100644 index 0000000000000000000000000000000000000000..94a0779b3783a21ad8be75dbbc3c95c6aff186a7 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-amonecole-eclair/files/etc/apparmor.d/lxc/lxc-default-for-eclair @@ -0,0 +1,25 @@ +# Do not load this file. Rather, load /etc/apparmor.d/lxc-containers, which +# will source all profiles under /etc/apparmor.d/lxc + +profile lxc-container-for-eclair flags=(attach_disconnected,mediate_deleted) { + #include <abstractions/lxc/container-base> + + # the container may never be allowed to mount devpts. If it does, it + # will remount the host's devpts. We could allow it to do it with + # the newinstance option (but, right now, we don't). + deny mount fstype=devpts, + + # allow standard blockdevtypes. + # The concern here is in-kernel superblock parsers bringing down the + # host with bad data. However, we continue to disallow proc, sys, securityfs, + # etc to nonstandard locations. + mount fstype=iso9660, + + # Enable systemd cgroup mount in container + mount fstype=cgroup -> /sys/fs/cgroup/**, + + # Allow chroot + mount fstype=proc, + mount fstype=sysfs, + mount options=(bind), +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-amonecole-eclair/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-amonecole-eclair/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..986df6fd99a73a0f56cd1dbadeb6d4334ec38ef4 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-amonecole-eclair/service.yml @@ -0,0 +1,30 @@ +format: '0.1' +name: eole-amonecole-eclair +version: |- + 2.7.0-3 +description: |- + configuration du module EOLE : AmonEcole + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: + - eole-ltsp-server + - eole-gaspacho + - eole-gaspacho-agent + - eole-amonecole +packages: [] +dictionaries: + - 55_amonecole-eclair.xml +extra_dictionaries: {} +templates: [] +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: [] +files: + /etc/apparmor.d/lxc/lxc-default-for-eclair: + owner: root + group: root + mode: '0644' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-amonecole/dictionaries/50_amonecole.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-amonecole/dictionaries/50_amonecole.xml new file mode 100644 index 0000000000000000000000000000000000000000..c56c15e79cbc3c3edd9e600946ea9cc759059e86 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-amonecole/dictionaries/50_amonecole.xml @@ -0,0 +1,214 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + <containers> + <container name='fichier'> + <interface linkto="eth1" ip="adresse_ip_fichier_link" mask="adresse_mask_fichier_link" bcast="adresse_bcast_fichier_link" redefine='True'>eth1</interface> + </container> + </containers> + + <variables> + <family name='general'> + <variable name='nombre_interfaces' redefine='True' mode='normal'/> + <variable name='eole_module' redefine='True'> + <value>amonecole</value> + </variable> + <variable name='fichier_link_interface' redefine='True' hidden='True'> + <value>eth1</value> + </variable> + </family> + <family name='services'> + <variable name='activer_dhcprelay' redefine='True' hidden='True'/> + <variable name='activer_clam' redefine='True'> + <value>oui</value> + </variable> + </family> + + <family name='système'> + + <!-- We need to recalculate the variables --> + <variable name='eole_lv_names' redefine='True' remove_check='True' /> + <variable name='eole_lv_standard_extends' redefine='True' remove_check='True' /> + + </family> + + <family name='firewall'> + <variable name='type_amon' redefine='True'> + <value>2zones-amonecole</value> + </variable> + <variable name='install_scribe_dmz' redefine='True' hidden='True'/> + <variable name='use_iptables_restore' redefine='True' hidden='True'/> + </family> + <family name='Interface-0'> + <variable name='eth0_method' redefine='True' hidden='False'/> + </family> + <family name='Interface-1'> + <!--change les variables de famille--> + <variable name='adresse_ip_fichier_link' remove_check="True" redefine="True"/> + <variable name='adresse_mask_fichier_link' redefine="True" /> + <variable name='adresse_bcast_fichier_link' redefine="True" /> + </family> + <family name='tftp'> + <variable name='adresse_ip_tftp' redefine="True" /> + </family> + <family name='Reverse proxy'> + <variable name='activer_revprox_ead' redefine='True' hidden='True'/> + </family> + <family name='esu'> + <!-- proxy ESU activé par défaut sur AmonEcole #1964 --> + <variable name='esu_proxy' redefine='True'> + <value>oui</value> + </variable> + <variable name='esu_proxy_bypass' redefine='True'/> + <variable name='tmp_esu_proxy_bypass' type='string' description="Valeur temporaire pour le calcul de esu_proxy_bypass" hidden='True'/> + <variable name='tmp_esu_proxy_bypass2' type='string' description="Valeur temporaire pour le calcul de esu_proxy_bypass2" hidden='True'/> + </family> + <family name='ead-web' mode='expert'> + <!-- mis à oui dans 30_scribe.xml --> + <variable name='activer_ead_reverseproxy' redefine='True'> + <value>non</value> + </variable> + </family> + <family name='authentification'> + <!-- authentification web activée par défaut sur AmonEcole #1965 --> + <variable name='activer_squid_auth' redefine='True' mode='normal'> + <value>oui</value> + </variable> + </family> + <family name='applications web'> + <variable name='activer_web_behind_revproxy' redefine='True' hidden='True'> + <value>oui</value> + </variable> + </family> + <family name='mysql'> + <variable name='mysql_open_firewall' redefine='True' hidden='True'/> + </family> + <family name='proxy authentifié'> + <variable name='type_squid_auth' redefine='True' mode='normal'/> + <variable name='ip_serveur_ldap1' redefine='True'/> + </family> + <family name='dhcp'> + <variable name='adresse_network_dhcp' redefine='True' mode='basic'/> + <variable name='adresse_netmask_dhcp' redefine='True' mode='basic'/> + </family> + </variables> + + <constraints> + <!-- Adresse IP du serveur LDAP sur eth1 --> + <!--<auto name='calc_val' target='adresse_ip_ldap_exterieur'> + <param type='eole' name='valeur'>adresse_ip_eth1</param> + </auto>--> + <check name="valid_in_network" target="adresse_ip_fichier_link" level="warning"> + <param type='eole'>adresse_network_eth1</param> + <param type='eole'>adresse_netmask_eth1</param> + </check> + <check name="valid_differ" target="adresse_ip_fichier_link"> + <param type='eole'>adresse_ip_eth1</param> + </check> + <check name="valid_differ" target="adresse_ip_fichier_link"> + <param type='eole'>adresse_ip_eth1_proxy_link</param> + </check> + <check name="valid_differ" target="nom_machine" level="warning"> + <param type='eole'>smb_netbios_name</param> + </check> + <check name="valid_differ" target="web_url" level="warning"> + <param type='eole'>smb_netbios_name</param> + </check> + <fill name='calc_val' target='adresse_ip_tftp'> + <param type='eole' name='valeur'>adresse_ip_fichier_link</param> + </fill> + <!-- AmonEcole >= 2 cartes réseau --> + <check name="valid_enum" target="nombre_interfaces"> + <param>['2','3','4','5']</param> + </check> + <check name="valid_enum" target="eth0_method"> + <param>['statique','dhcp','pppoe']</param> + </check> + <!-- Configuration automatique du proxy sur eth1 --> + <fill name='calc_val' target='adresse_network_dhcp'> + <param type='eole' name='valeur'>adresse_network_eth1</param> + </fill> + <fill name='calc_val' target='adresse_netmask_dhcp'> + <param type='eole' name='valeur'>adresse_netmask_eth1</param> + </fill> + <fill name='calc_val' target='global_adresse_ip_gw_dhcp'> + <param type='eole' name='valeur'>adresse_ip_eth1</param> + </fill> + <fill name='calc_val' target='global_adresse_ip_dns_dhcp'> + <param type='eole' name='valeur'>adresse_ip_eth1_proxy_link</param> + </fill> + <!-- déjà calculé sur 2.4 :) + <fill name='calc_val' target='adresse_bcast_fichier_link'> + <param type='eole' name='valeur'>adresse_broadcast_eth1</param> + </fill> + <fill name='calc_val' target='adresse_mask_fichier_link'> + <param type='eole' name='valeur'>adresse_netmask_eth1</param> + </fill>--> + <!-- Configuration automatique de l'authentification du proxy --> + <fill name='calc_val' target='nom_serveur_smb'> + <param type='eole' name='valeur'>smb_netbios_name</param> + </fill> + <fill name='calc_val' target='nom_domaine_smb'> + <param type='eole' name='valeur'>smb_workgroup</param> + </fill> + <fill name='calc_container' target='ip_serveur_smb'> + <param type='eole'>mode_conteneur_actif</param> + <param type='container'>fichier</param> + <param type='eole' optional='True'>mode_zephir</param> + </fill> + <fill name='calc_container' target='ip_serveur_ldap1'> + <param type='eole'>mode_conteneur_actif</param> + <param type='container'>annuaire</param> + <param type='eole' optional='True'>mode_zephir</param> + </fill> + <fill name='calc_val' target='esu_proxy_server'> + <param type='eole' name='valeur'>adresse_ip_eth1_proxy_link</param> + </fill> + <fill name='calc_classe' target='tmp_esu_proxy_bypass'> + <param type='eole'>adresse_netmask_eth1</param> + </fill> + <fill name='concat' target='tmp_esu_proxy_bypass2'> + <param type='eole' name='valeur1'>adresse_network_eth1</param> + <param name='valeur2'>/</param> + <param type='eole' name='valeur3'>tmp_esu_proxy_bypass</param> + </fill> + <fill name='calc_multi_val' target='esu_proxy_bypass'> + <param>127.0.0.1</param> + <param type='eole'>tmp_esu_proxy_bypass2</param> + </fill> + <fill name='calc_val' target='activer_revprox'> + <param type='eole' name='valeur'>activer_apache</param> + </fill> + <auto name='calc_val' target='web_behind_revproxy_ip'> + <param type='eole'>adresse_ip_br0</param> + </auto> + <fill name='calc_multi_condition' target='revprox_auto_config_local_web'> + <param>oui</param> + <param type='eole' name='condition_1'>activer_apache</param> + <param type='eole' name='condition_2'>activer_revprox</param> + <param name='match'>oui</param> + <param name='mismatch'>non</param> + </fill> + + <!-- Default AmonEcole* logical volumes --> + <auto name='calc_multi_val' target='eole_lv_names'> + <param>root</param> + <param>tmp</param> + <param>var</param> + <param>opt</param> + <param>home</param> + </auto> + + <!-- Default AmonEcole* logical volumes extension: 100% /home --> + <auto name='calc_multi_val' target='eole_lv_standard_extends'> + <param type='number'>0</param> + <param type='number'>0</param> + <param type='number'>0</param> + <param type='number'>0</param> + <param type='number'>100</param> + </auto> + </constraints> + <help/> +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-amonecole/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-amonecole/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..0644309c328da1dfd75ee7568cb87b6be04af5a0 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-amonecole/service.yml @@ -0,0 +1,25 @@ +format: '0.1' +name: eole-amonecole +version: |- + 2.7.0-3 +description: |- + configuration du module EOLE : AmonEcole + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: + - eole-lxc-controller + - eole-amon + - eole-scribe +packages: [] +dictionaries: + - 50_amonecole.xml +extra_dictionaries: {} +templates: [] +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: [] +files: {} +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/dictionaries/20_annuaire.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/dictionaries/20_annuaire.xml new file mode 100644 index 0000000000000000000000000000000000000000..393bf68f623afef380ece9d534c5a2bfabbba55b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/dictionaries/20_annuaire.xml @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + <containers> + <container name="annuaire" id="10"> + <service servicelist='slapd'>slapd</service> + <service_access service='slapd'> + <port service_accesslist='slapd'>389</port> + <port service_accesslist='slapd_ssl'>636</port> + <tcpwrapper service_accesslist='tcpw_slapd'>slapd</tcpwrapper> + </service_access> + </container> + </containers> + + <variables/> + <constraints> + <condition name='disabled_if_not_in' source='ldap_restrict_access'> + <param>tous</param> + <param>authentifié</param> + <target type='service_accesslist'>slapd</target> + <target type='service_accesslist'>slapd_ssl</target> + <target type='service_accesslist'>tcpw_slapd</target> + </condition> + <condition name='disabled_if_not_in' source='ldap_ssl'> + <param>non</param> + <param>oui</param> + <target type='service_accesslist'>slapd</target> + </condition> + <condition name='disabled_if_not_in' source='ldap_ssl'> + <param>oui</param> + <param>uniquement</param> + <target type='service_accesslist'>slapd_ssl</target> + </condition> + </constraints> + <help/> +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/dictionaries/23_annuaire.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/dictionaries/23_annuaire.xml new file mode 100644 index 0000000000000000000000000000000000000000..b13dd6edc8ce0a5180d9f5acd7286f79f151bf12 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/dictionaries/23_annuaire.xml @@ -0,0 +1,107 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + <file name='/etc/eole/eoleldap.conf'/> + <file filelist='slapd' name='/tmp/DB_CONFIG'/> + </files> + <containers> + <container name="annuaire"> + <package>eole-annuaire-pkg</package> + <file filelist='slapd' name='/etc/ldap/slapd.conf' group="openldap" mode="0640"/> + <file filelist='slapd' name='/etc/default/slapd' source='default.slapd'/> + <!-- /!\ c'est le /var/lib/eole du conteneur annuaire /!\ --> + <file filelist='slapd' name='/var/lib/eole/00_annuaire.ldif' mkdir='True'/> + <!--<file name='/etc/ldap/ldap.conf'/> + <file name='/etc/ldap.conf'/>--> + </container> + </containers> + + <variables> + <family name='services'> + <variable name='activer_client_ldap' redefine='True' description="Emplacement du serveur LDAP"> + <value>local</value> + </variable> + </family> + <family name='annuaire'> + <variable name='ldap_tls' redefine='True'> + <value>non</value> + </variable> + </family> + <family name='openldap' mode='expert' icon='book'> + <variable name='ldap_schema' type='filename' description='Schéma LDAP utilisé' hidden='True'> + <value>eole</value> + </variable> + <variable name='ldap_replication' type='oui/non' description='Activer la réplication LDAP (fournisseur)'> + <value>non</value> + </variable> + <variable name='ldap_replication_client' type='oui/non' description='Activer la réplication LDAP (client)' hidden='True'> + <value>non</value> + </variable> + <variable name='ldap_loglevel' type='number' description='Niveau de log'> + <value>0</value> + </variable> + <variable name='ldap_sizelimit' type='number' description="Nombre maximum d'entrées à retourner lors d'une requête"> + <value>5000</value> + </variable> + <variable name='ldap_timelimit' type='number' description='Temps de réponse maximum à une requête (en secondes)'> + <value>3600</value> + </variable> + <variable name='ldap_cachesize' type='number' description="Taille du cache (en nombre d'entrées)"> + <value>1000</value> + </variable> + <variable name='ldap_ssl' type="string" description="Activer LDAP sur le port SSL"> + <value>non</value> + </variable> + <variable name='ldap_restrict_access' type="string" description="Utilisateur autorisé à accéder à distance au serveur LDAP"> + <value>tous</value> + </variable> + </family> + </variables> + + <constraints> + <check name='valid_enum' target='ldap_schema'> + <param>['eole', 'sdet', 'zephir']</param> + </check> + <check name='valid_enum' target='ldap_restrict_access'> + <param>['tous', 'authentifié', 'aucun']</param> + </check> + <check name='valid_enum' target='activer_client_ldap'> + <param>['local', 'distant']</param> + </check> + <check name='valid_enum' target='ldap_ssl'> + <param>['non', 'oui', 'uniquement']</param> + </check> + <fill name='calc_multi_condition' target='adresse_ip_ldap'> + <param>local</param> + <param type='eole' name='condition_1'>activer_client_ldap</param> + <param name='match' type='eole'>container_ip_annuaire</param> + <param name='default_mismatch'>None</param> + </fill> + + <!-- slapd est activé si client_ldap est configuré sur local --> + <condition name='disabled_if_not_in' source='activer_client_ldap'> + <param>local</param> + <target type='servicelist'>slapd</target> + <target type='filelist'>slapd</target> + <target type='family'>openldap</target> + </condition> + + <condition name='frozen_if_in' source='activer_client_ldap'> + <param>local</param> + <target>ldap_reader</target> + <target>ldap_reader_passfile</target> + <target>adresse_ip_ldap</target> + </condition> + + </constraints> + + <help> + <family name='openldap'>Paramétrage de l'annuaire OpenLDAP local</family> + <variable name='ldap_ssl'>Permet d'activer LDAP sur le port SSL (636). Si 'uniquement' est choisi, le firewall ne rend accessible que ce port. Le service reste néanmoins accessible en local sur le port 389.</variable> + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/extra_dictionaries/schedule/01_annuaire.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/extra_dictionaries/schedule/01_annuaire.xml new file mode 100644 index 0000000000000000000000000000000000000000..72fd06a5234e8d769553bd377081c38a274d50c6 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/extra_dictionaries/schedule/01_annuaire.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + <variables> + <family name="annuaire" description="Exportation de l'annuaire LDAP"> + <variable name="description" type="string" hidden="True"><value>Exportation de l'annuaire LDAP</value></variable> + <variable name="day" type="schedule" description="Périodicité d'exécution"></variable> + <variable name="mode" type="schedulemod" hidden ="True"><value>pre</value></variable> + </family> + </variables> + <constraints> + <fill name='calc_multi_condition' target='schedule.annuaire.day'> + <param>local</param> + <param type='eole' name='condition_1'>activer_client_ldap</param> + <param name='match'>daily</param> + <param name='mismatch'>none</param> + </fill> + </constraints> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/files/etc/bareos/bareosfichiers.d/annuaire.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/files/etc/bareos/bareosfichiers.d/annuaire.conf new file mode 100644 index 0000000000000000000000000000000000000000..82c2bec056427a35f2493c8f8c6149d7b6c265f6 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/files/etc/bareos/bareosfichiers.d/annuaire.conf @@ -0,0 +1,8 @@ +Include { + Options { + aclsupport = no + signature = md5 + @/etc/bareos/include-options.conf + } + File = /root/.reader +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/files/usr/share/eole/annuaire/password_files/annuaire.ini b/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/files/usr/share/eole/annuaire/password_files/annuaire.ini new file mode 100644 index 0000000000000000000000000000000000000000..a2289f0040ccdd388a1454810311a03859508a28 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/files/usr/share/eole/annuaire/password_files/annuaire.ini @@ -0,0 +1,16 @@ +# fichiers nécessitant mot de passe ldap +# pour les services annuaire + +[slapd.conf] +container='annuaire' +path='/etc/ldap/' +string='rootpw ' +rights='root:openldap' +mode='0640' + +[eoleldap.conf] +path='/etc/eole' +string='ldap_passwd = "' +rights='root:root' +mode='0600' + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/files/usr/share/eole/bareos/restore/ldap.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/files/usr/share/eole/bareos/restore/ldap.py new file mode 100644 index 0000000000000000000000000000000000000000..50ee6b53b7e5d06fdb9e77403fdc41d8c21e6736 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/files/usr/share/eole/bareos/restore/ldap.py @@ -0,0 +1,61 @@ +#!/usr/bin/env python +"""Module ldap""" +import sys +from glob import glob +from shutil import copyfile +from os import unlink, makedirs, stat +from os.path import dirname, isdir, isfile +from creole.client import CreoleClient +from pyeole.process import system_code +from pyeole.service import manage_service +from pyeole.bareosrestore import bareos_restore_one_file, exit_if_running_jobs + +LDAPFILE = '/home/backup/sauv_ldap.ldif' + +def execute(option, opt_str, value, parser, jobid, test_jobs=True): + """ldap helper""" + if len(parser.rargs) > 0: + option = parser.rargs[0] + if option == 'pre': + pre() + elif option == 'post': + post() + else: + if test_jobs: + exit_if_running_jobs() + job(jobid) + +def pre(): + print "pre ldap" + +def post(): + print "post ldap" + if not isfile(LDAPFILE): + print "Il manque le fichier {0}".format(LDAPFILE) + sys.exit(1) + if stat(LDAPFILE).st_size == 0: + print "Le fichier {0} est vide".format(LDAPFILE) + sys.exit(1) + path = CreoleClient().get_creole('container_path_annuaire') + if path != '': + # copie du ldif dans le conteneur + destdir = path + dirname(LDAPFILE) + if not isdir(destdir): + makedirs(destdir) + copyfile(LDAPFILE, path + LDAPFILE) + manage_service('stop', 'slapd', 'annuaire') + system_code(["sleep", "5"]) + for files in glob("{0}/var/lib/ldap/*.*".format(path)): + unlink(files) + slapadd_cmd = ['/usr/sbin/slapadd', '-f', '/etc/ldap/slapd.conf', + '-l', LDAPFILE] + system_code(slapadd_cmd , container='annuaire') + system_code(["chown", "-R", "openldap:openldap", "/var/lib/ldap"], + container='annuaire') + manage_service('start', 'slapd', 'annuaire') + +def job(jobid): + print "Restauration de l'annuaire LDAP" + bareos_restore_one_file(LDAPFILE, jobid) + +priority = 20 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/files/usr/share/eole/sbin/active_replication.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/files/usr/share/eole/sbin/active_replication.py new file mode 100644 index 0000000000000000000000000000000000000000..97bd2cef0241498d57ef5120b07cb6cc42529d80 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/files/usr/share/eole/sbin/active_replication.py @@ -0,0 +1,207 @@ +#! /usr/bin/env python +# -*- coding: utf-8 -*- +########################################################################### +# +# Eole NG +# Copyright Pole de Competence Eole (Ministere Education - Academie Dijon) +# Licence CeCill http://www.cecill.info/licences/Licence_CeCILL_V2-fr.html +# eole@ac-dijon.fr +# +########################################################################### +import sys +from os.path import isfile +from pyeole.ihm import question_ouinon +from creole.client import CreoleClient +from creole.utils import print_red, print_green, print_orange +from zephir import lib_zephir + +def format_current_date(format="%Y%m%d"): + """ + renvoie la date du jour formatée + repris de scribe/eoletools.py + """ + from datetime import datetime + now = datetime.today() + return datetime.strftime(now, format) + +def err_msg(message): + """ + Sortie avec message d'erreur + """ + print_red("Erreur : ", newline=False) + print message + print + sys.exit(1) + +def readdefault(message, valeur): + """ + Question avec valeur proposée + """ + print message + res = raw_input('[%s] : ' % valeur) + if not res: + return valeur + else: + return res + +def get_protocole(ldap_ssl): + """ + Définition du protocole à utiliser + ldap vs ldaps + """ + if ldap_ssl == 'non': + print_orange("LDAP n'est pas activé sur le port SSL : utilisation du protocole ldap (port 389)") + proto = ('ldap', '389') + elif ldap_ssl == 'uniquement': + print_orange("LDAP est activé uniquement sur le port SSL : utilisation du protocole ldaps (port 636)") + proto = ('ldaps', '636') + elif question_ouinon("Utiliser le protole ldaps (port 636) pour la réplication", default='oui') == 'oui': + proto = ('ldaps', '636') + else: + proto = ('ldap', '389') + return proto + +def send_zephir(conf_data): + """ + Envoi de la configuration à Zephir pour prise en compte par le serveur de réplication + """ + from zephir.zephir_conf.zephir_conf import id_serveur, adresse_zephir + print_green("\nEnvoi de la configuration sur Zephir") + import xmlrpclib, getpass, base64 + try: + login = "" + con_ok = False + zephir_proxy = None + while not con_ok: + # saisie des informations de connexion + login = raw_input("\nVeuillez saisir votre identifiant Zéphir (rien pour annuler l'envoi) : ") + if login == "": + return False + passwd = getpass.getpass('Mot de passe pour %s : ' % login) + zephir_proxy = xmlrpclib.ServerProxy("https://%s:%s@%s:7080" % (login, passwd, adresse_zephir), transport=lib_zephir.TransportEole()) + # test des identifiants + try: + res = lib_zephir.convert(zephir_proxy.get_permissions(login)) + assert res[0] == 1 + con_ok = True + except: + print_red('Erreur de connexion au serveur ou indentifiants incorrects') + # saisie du serveur de réplication + num_serv = "" + serv_ok = False + while not serv_ok: + num_serv = raw_input("\nIdentifiant Zéphir du serveur de réplication (rien pour annuler l'envoi) : ") + if num_serv == "": + return False + # vérification des données + try: + res = lib_zephir.convert(zephir_proxy.uucp.add_replication(int(num_serv), id_serveur, base64.encodestring(conf_data))) + # Envoi des données de configuration + if res[0] != 1: + print_red("Erreur lors de l'envoi à zephir : %s" % str(res[1])) + else: + serv_ok = True + print_green("""Cette configuration sera prise en compte par le serveur +de réplication lors de sa prochaine connexion à Zéphir""") + + except xmlrpclib.ProtocolError: + print_red('Serveur %s non retrouvé ou permissions insuffisantes' % num_serv) + except Exception, e: + print_red("Erreur lors de l'envoi de la configuration à Zéphir : %s" % str(e)) + except: + # erreur de récupération + sys.exit("Erreur d'envoi de la configuration sur zephir") + +dico = CreoleClient().get_creole() +ldif = "/root/annuaire-%s.ldif" % format_current_date() +conf = "/root/replication-%(numero_etab)s.conf" % dico +replicator = "/root/.reader" +module = dico['eole_module'] +print +## test de la vestion d'openldap +#cmd = "dpkg-query -W -f='${Version}' 'slapd'" +#slapd = Popen(cmd, shell=True, stdout=PIPE).stdout.read() +#if 'eole' not in slapd: +# err_msg("Mise à jour du paquet slapd nécessaire") + +# test du dictionnaire +if dico.get('ldap_replication', '') != 'oui': + err_msg("""Vous devez d'abord activer la réplication ldap +dans l'interface de configuration du module (mode expert) +et reconfigurer votre serveur""") + +# test de la configuration réelle +if file('/etc/ldap/slapd.conf').read().find('syncprov') == -1: + err_msg("""Votre serveur est mal paramétré, lancez la commande reconfigure""") + +if not isfile(replicator): + replicator_pwd = '' +else: + replicator_pwd = file(replicator).read().strip() +if replicator_pwd != '': + print_green("Utilisation du compte de réplication existant") + print +else: + err_msg("impossible de récupérer le mot de passe du compte de réplication") + +print_green("Génération de la configuration client") + +# objectClass concernées par la réplication +if module == 'scribe': + group = 'ENTGroupe' + person = 'ENTPerson' +else: + group = 'posixGroup' + person = 'inetOrgPerson' +if question_ouinon("Répliquer également les groupes", default='non') == 'oui': + group_filter = '(|(objectClass={0})(objectClass={1}))'.format(person, group) +else: + group_filter = '(objectClass={0})'.format(person) + +# uid concernées par la réplication +user_filter = '(!(uid=admin))' +if question_ouinon("Ajouter des uid à exclure de la réplication", default='non') == 'oui': + while True: + user = raw_input("uid à exclure (entrée pour terminer la saisie) : ") + if user == '': + break + user_filter += '(!(uid=%s))' % user + +msg = "Adresse utilisée pour accéder au module {0} depuis le client" +adresse_scribe = readdefault(msg.format(module.capitalize()), dico['adresse_ip_eth0']) +protocole, port = get_protocole(dico['ldap_ssl']) +libelle = dico['libelle_etab'] +numero = dico['numero_etab'] +acad = dico['nom_academie'] +dn = dico['ldap_base_dn'] +search_filter = "(&%s%s)" % (group_filter, user_filter) +if protocole == 'ldaps': + tls_reqcert = "\n tls_reqcert=never" +else: + tls_reqcert = "" +print +print_green("Ecriture du fichier %s" % conf) +tmpl = """# {0} ({1}) +syncrepl rid=%i + provider={2}://{3}:{4}{9} + type=refreshAndPersist + interval=00:01:00:00 + retry="60 10 300 +" + searchbase="ou={1},ou={5},ou=education,{6}" + filter="{8}" + scope=sub + schemachecking=off + bindmethod=simple + binddn="cn=reader,{6}" + credentials={7} + +""".format(libelle, numero, protocole, adresse_scribe, port, + acad, dn, replicator_pwd, search_filter, tls_reqcert) +fic = file(conf, 'w') +fic.write(tmpl) +fic.close() +# La configuration est générée localement, on l'envoie via zephir si possible +if lib_zephir.registered == 1: + send_zephir(tmpl) +print +print "fin" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/files/usr/share/eole/sbin/ldap_pwd.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/files/usr/share/eole/sbin/ldap_pwd.py new file mode 100644 index 0000000000000000000000000000000000000000..9519a5560972278d569ce6ab3560128ee49dbfa8 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/files/usr/share/eole/sbin/ldap_pwd.py @@ -0,0 +1,135 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# Mise à jour du mot de passe LDAP +# Equipe Eole eole@ac-dijon.fr + +import sys +from glob import glob +from os.path import join +from pyeole.process import system_code +from creole.client import CreoleClient +from pyeole.service import service_code +from pyeole.ssha import ssha_encode +from pyeole.dict4ini import DictIni + +dico = CreoleClient() + +no_restart = False +# on demande le nouveau mot de passe +# si il n'est pas passé comme paramètre +if len(sys.argv) > 1: + new_pass = sys.argv[1] + if len(sys.argv) > 2: + no_restart = True +else: + new_pass = "" + while len(new_pass) < 5: + if new_pass != "": + print "le mot de passe est trop court (5 caractères au moins)" + new_pass = raw_input("\nNouveau mot de passe pour l'admin LDAP ? ") + +# récupération du mot de passe chiffré +crypt_pwd = ssha_encode(new_pass) + +container_mode = dico.get_creole('mode_conteneur_actif', 'non') == 'oui' + +# recupération de la liste des fichiers à modifier +modifs = {} +password_files = glob("/usr/share/eole/annuaire/password_files/*.ini") +for fic in password_files: + for cle, opts in DictIni(fic): + # Work on container group + container = opts.get('container', 'root') + group = dico.get_container(container)['group'] + opts['container'] = group + if cle not in modifs: + modifs[cle] = opts + modifs[cle]['container'] = [opts['container']] + elif container_mode: + # hack pour les fichier multi-conteneurs + if group not in modifs[cle]['container']: + modifs[cle]['container'].append(group) + +samba = False +# parcours du dictionnaire des fichiers +for name, option in modifs.items(): + + # lecture des options + chaines_recherche = option['string'] + container_list = option.get('container', ['root']) + short_path = join(option['path'], name) + if not isinstance(chaines_recherche, list): + chaines_recherche = [chaines_recherche] + + smb = dico.get_creole('smb_netbios_name', False) + if smb: + samba = True + + for container in container_list: + prefix = dico.get_creole('container_path_{0}'.format(container)) + file_path = prefix+short_path + + print "\nMise à jour du fichier %s..." % str(file_path) + for chaine_recherche in chaines_recherche: + + # lecture du fichier de conf + conf_file = open(file_path) + buffer_in = conf_file.readlines() + conf_file.close() + + buffer_out = "" + # on parcourt le fichier + for line in buffer_in: + # si la ligne actuelle contient la chaine recherchée + if line.startswith(chaine_recherche): + print "définition du mot de passe trouvée : %s" % line.strip() + # on ajoute les possibles tabulations ou espaces en début de ligne + buffer_out += line[0:line.index(chaine_recherche)] + buffer_out += chaine_recherche + if name == 'slapd.conf': + buffer_out += crypt_pwd + else: + buffer_out += new_pass + if chaine_recherche.endswith('"'): + # si le mot de passe est entre guillemets, on ajoute le guillemet fermant + buffer_out += '"' + if name.endswith('.pl') or name.endswith('.pm') or name.endswith('.php'): + buffer_out += ';' + elif name == 'lsc.xml': + #FIXME: hack for lsc.xml (eole-ad) + buffer_out += '</password>' + buffer_out += "\n" + else: + # sinon, on recopie la ligne d'origine + buffer_out += line + + # sauvegarde du fichier de conf + conf_file = open(file_path,"w") + conf_file.write(buffer_out) + conf_file.close() + + rights = option.get('rights') + if rights: + cmd = ['chown', rights, short_path] + system_code(cmd, container=container) + mode = option.get('mode') + if mode: + system_code(['chmod', mode, file_path]) + +# mise à jour du mot de passe LDAP pour samba +if samba: + print "\nMise à jour de Samba .." + cmd = ["smbpasswd", '-w', new_pass] + ret = system_code(cmd, container='fichier') + if ret != 0: + raise Exception, 'Erreur à la mise à jour Samba : %s' % str(ret[1:]) + +if not no_restart: + print "\nredémarrage des services, veuillez patienter ..." + # visiblement il vaut mieux le faire à chaque fois surtout pour ldap ! + service_code('slapd', 'restart', 'annuaire') + if samba: + service_code('smbd', 'restart', 'fichier') + if dico.get_creole('activer_courier', 'non') != 'non': + service_code('courier-authdaemon', 'restart', 'mail') diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/files/usr/share/eole/schedule/scripts/annuaire b/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/files/usr/share/eole/schedule/scripts/annuaire new file mode 100644 index 0000000000000000000000000000000000000000..7da09d28c1c0f5a6e1f89ca31ba3e0eb2563d4aa --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/files/usr/share/eole/schedule/scripts/annuaire @@ -0,0 +1,19 @@ +#!/bin/bash + +DESC="Exportation de l'annuaire LDAP" + +. /usr/share/eole/schedule/config.sh + +LDAPSAVDIR=$SAVDIR +LDAPSAVFILE=$LDAPSAVDIR/sauv_ldap.ldif + +rm -f $LDAPSAVFILE +mkdir -p $LDAPSAVDIR + +CreoleService slapd stop -c annuaire +CreoleRun "slapcat -v -f /etc/ldap/slapd.conf -o ldif-wrap=no" annuaire > $LDAPSAVFILE +slapd_error=$? +CreoleService slapd start -c annuaire +[ $slapd_error -ne 0 ] && exit 1 + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/files/usr/share/zephir/monitor/configs/services/20_ldap.srv b/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/files/usr/share/zephir/monitor/configs/services/20_ldap.srv new file mode 100644 index 0000000000000000000000000000000000000000..0fb19684dfd2b9eceb5e0afdcd37b9b02bb7cab8 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/files/usr/share/zephir/monitor/configs/services/20_ldap.srv @@ -0,0 +1,14 @@ +# -*- coding: UTF-8 -*- +""" +Surveillance d'OpenLdap +""" + +from zephir.monitor.agents.services import TCPServices +from zephir.monitor.agentmanager.config import ACTIVER_CLIENT_LDAP_LOCAL, ADRESSE_IP_ANNUAIRE + +if ACTIVER_CLIENT_LDAP_LOCAL: + adresse = ADRESSE_IP_ANNUAIRE + test = '%s:389' % adresse + data = {test : "Annuaire d'authentification (LDAP)"} + AGENTS.append(TCPServices('ldap', data, period=115, + description="Etat de l'annuaire LDAP")) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/posttemplates/00-annuaire b/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/posttemplates/00-annuaire new file mode 100644 index 0000000000000000000000000000000000000000..f91c6ff9a5fe38bc9ae506321ad2572d2efd286a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/posttemplates/00-annuaire @@ -0,0 +1,33 @@ +#!/bin/bash + +# arrêt en cas d'erreur #5665 +set -e + +. /usr/lib/eole/utils.sh + +# initialisation du fichier des fournisseurs ldap +touch $(CreoleGet container_path_annuaire)/etc/ldap/replication.conf + +if [ $(CreoleGet activer_client_ldap) = "local" ];then + # Mise en place de l'arborescence SSL - ref #23389 + container_path_annuaire=$(CreoleGet container_path_annuaire) + . ${container_path_annuaire}/etc/default/slapd + ldap_conf_dir=$(dirname ${SLAPD_CONF}) + InstallSSLFiles openldap $SLAPD_USER $SLAPD_GROUP ${ldap_conf_dir}/ssl annuaire + + #Copie du fichier DB_CONFIG que si le fichier est différent (#16862) + SRC=/tmp/DB_CONFIG + DST=$(CreoleGet container_path_annuaire)/var/lib/ldap/DB_CONFIG + if [ -f $SRC ]; then + diff -q $SRC $DST &> /dev/null || cp -af $SRC $DST + fi + + if [ $(CreoleGet activer_admin_passfile) = 'oui' ]; then + ldap_admin_passfile=$(CreoleGet ldap_admin_passfile) + pass=$(cat $ldap_admin_passfile) + else + pass=$(/usr/bin/pwgen -cn1 12) + fi + /usr/share/eole/sbin/ldap_pwd.py $pass norestart > /dev/null +fi +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/posttemplates/02-annuaire b/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/posttemplates/02-annuaire new file mode 100644 index 0000000000000000000000000000000000000000..bcd548cdda586476de77a39e8aecf8ca2be59c81 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/posttemplates/02-annuaire @@ -0,0 +1,102 @@ +#!/bin/bash +############################################# +# Création/Mise à niveau de l'annuaire ldap # +############################################# +. /usr/lib/eole/ihm.sh +option=$1 +other_option=$2 +container_path_annuaire=$(CreoleGet container_path_annuaire) +base_dn=$(CreoleGet ldap_base_dn) +reader="cn=reader,$base_dn" + +GenReader() { + # génération/modification du compte ldap en lecteur seule + if [ ! -f /root/.reader ];then + echo "Erreur : fichier /root/.reader introuvable !" + exit 1 + fi + pass=`cat /root/.reader` + if [ "$1" = "create" ];then + READER=/var/lib/ldap/reader.ldif + C_READER=$container_path_annuaire/$READER + cpass=`CreoleRun "slappasswd -s \"$pass\"" annuaire` + echo "dn: $reader" > $C_READER + echo "objectClass: person" >> $C_READER + echo "cn: reader" >> $C_READER + echo "sn: Compte en lecture seule" >> $C_READER + echo "userPassword: $cpass" >> $C_READER + $CHROOT su openldap -s /bin/bash -c "slapadd -l $READER -f /etc/ldap/slapd.conf" + rm -f $C_READER + else + pwd=`grep ldap_passwd /etc/eole/eoleldap.conf | cut -d '"' -f 2` + ldappasswd -D "cn=admin,$base_dn" -w "$pwd" -s "$pass" "$reader" + if [ ! $? = 0 ]; then + EchoRouge "Une erreur est survenue au changement de mot de passe de l'utilisateur \"reader\"" + echo + exit 1 + fi + fi +} + +if [ $(CreoleGet activer_client_ldap) = "local" ];then + Regen="1" + CHROOT='' + [ ! "$container_path_annuaire" = "" ] && CHROOT="chroot $container_path_annuaire" + if [ "$option" = "instance" ];then + CreoleService slapd stop -c annuaire + #Il est possible de lancer le script "/usr/share/eole/posttemplate instance force" + #pour forcer la regeneration de l'annuaire sans poser des questions + #utile pour AAF + if [ -e $container_path_annuaire/var/lib/ldap/cn.bdb ] && [ ! "$other_option" = "force" ] + then + echo + Question_ouinon "Voulez vous re-générer l'annuaire LDAP (attention, cela detruira l'existant !) ?" "True" "non" "warn" + Regen=$? + else + Regen="0" + fi + if [ "$Regen" = "0" ] + then + echo -e "\n## Initialisation de l'annuaire ##" + rm -f $container_path_annuaire/var/lib/ldap/alock + rm -f $container_path_annuaire/var/lib/ldap/*.* + # création de l'arborescence LDAP et des entrées de base + unset DISPLAY + cd $container_path_annuaire/var/lib/eole/ + # test si le SID a bien été réappliqué (si est différent de [sambasid]) + grep -q ^"sambaSID: \[sambasid\]" *.ldif + if [ $? = 1 ]; then + for ldif in `ls *.ldif`;do + $CHROOT su openldap -s /bin/bash -c "slapadd -l /var/lib/eole/${ldif} -f /etc/ldap/slapd.conf" > /dev/null + done + GenReader "create" + else + need_exit='yes' + fi + cd - > /dev/null + [ "$need_exit" = "yes" ] && EchoRouge "Le SID n'a pas été modifié dans le fichier LDIF" && exit 1 + [ ! "$other_option" = "force" ] && CreoleService slapd restart -c 'annuaire' + fi + elif [ ! -e $container_path_annuaire/var/lib/ldap/cn.bdb ];then + # reconfigure sans annuaire (#6053) + echo + EchoRouge "L'annuaire n'est pas créé correctement." + EchoRouge "Pour générer l'annuaire, il est nécessaire d'utiliser la commande \"instance\"". + echo + exit 1 + fi + if [ "$Regen" != "0" ] + then + # vérification du reader + $CHROOT slapcat -f /etc/ldap/slapd.conf -a cn=reader | grep "dn: $reader" >/dev/null + if [ $? -ne 0 ];then + echo "Création de l'utilisateur ldap en lecture seule" + GenReader "create" + else + CreoleService slapd start -c 'annuaire' + GenReader "modify" + fi + fi +fi + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/pretemplates/00-annuaire b/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/pretemplates/00-annuaire new file mode 100644 index 0000000000000000000000000000000000000000..9b2c8579873e468428eac645435f7cc37ce8c54c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/pretemplates/00-annuaire @@ -0,0 +1,25 @@ +#!/bin/bash + +if [ $(CreoleGet activer_client_ldap) = "local" ];then + echo -e "\n## Gestion du mot de passe LDAP ##" + ldap_reader_passfile=$(CreoleGet ldap_reader_passfile) + if [ ! -f $ldap_reader_passfile ];then + touch $ldap_reader_passfile + chmod 600 $ldap_reader_passfile + pwgen -cn1 56 >> $ldap_reader_passfile + fi + + # si le mot de passe admin doit être placé dans un fichier + # généré le mot de passe si le fichier n'existe pas + if [ $(CreoleGet activer_admin_passfile) = 'oui' ]; then + ldap_admin_passfile=$(CreoleGet ldap_admin_passfile) + if [ ! -f $ldap_admin_passfile ]; then + touch $ldap_admin_passfile + chmod 600 $ldap_admin_passfile + pwgen -cn1 56 >> $ldap_admin_passfile + fi + fi +fi + +exit 0 + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..e8984920ed1fbea38395782f50dba3b8f0c289e1 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/service.yml @@ -0,0 +1,63 @@ +format: '0.1' +name: eole-annuaire +version: |- + 2.7.0-3 +description: |- + Templates et dictionnaires pour le service Annuaire EOLE + Configuration du serveur slapd pour EOLE + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: + - eole-client-annuaire +packages: [] +dictionaries: + - 20_annuaire.xml + - 23_annuaire.xml +extra_dictionaries: + schedule: + - 01_annuaire.xml +templates: + - 00_annuaire.ldif + - DB_CONFIG + - default.slapd + - slapd.conf +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: + - 00-annuaire +posttemplates: + - 00-annuaire + - 02-annuaire +files: + /etc/bareos/bareosfichiers.d/annuaire.conf: + owner: root + group: root + mode: '0644' + /usr/share/eole/annuaire/password_files/annuaire.ini: + owner: root + group: root + mode: '0644' + /usr/share/eole/bareos/restore/ldap.py: + owner: root + group: root + mode: '0644' + /usr/share/eole/sbin/active_replication.py: + owner: root + group: root + mode: '0755' + /usr/share/eole/sbin/ldap_pwd.py: + owner: root + group: root + mode: '0755' + /usr/share/eole/schedule/scripts/annuaire: + owner: root + group: root + mode: '0755' + /usr/share/zephir/monitor/configs/services/20_ldap.srv: + owner: root + group: root + mode: '0644' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/templates/00_annuaire.ldif b/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/templates/00_annuaire.ldif new file mode 100644 index 0000000000000000000000000000000000000000..51202f5d1e9dbbc36b5cb6a900e6e31e55d90746 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/templates/00_annuaire.ldif @@ -0,0 +1,19 @@ +####################################################### +# +## DIT.ldif +# +## Equipe Eole eole@ac-dijon.fr +# +######################################################## + +#Entrée racine (basedn) +%def %%get_organization() +%return %%ldap_base_dn.split(',')[0].split('=')[1] +%end def +dn: %%ldap_base_dn +objectClass: organization +%if %%ldap_base_dn.startswith('dc') +objectClass: dcObject +dc: %%get_organization() +%end if +o: %%get_organization() diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/templates/DB_CONFIG b/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/templates/DB_CONFIG new file mode 100644 index 0000000000000000000000000000000000000000..df99aef672807e00280ae85f4e7373516bb815a0 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/templates/DB_CONFIG @@ -0,0 +1,81 @@ +# WARNING: Before tuning the following parameters, _PLEASE READ_ +# /usr/share/doc/slapd/README.DB_CONFIG.gz + +# Set the database in memory cache size. +# +# set_cachesize <gbytes> <bytes> <ncache> +# Sets the database in memory cache size. +# Database entries and indexes will be stored in this cache to +# avoid disk access during database read and write operations. +# Tuning this value can greatly effect your database performance. +# The parameters are: +# <gbytes>: The number of gigabytes of memory to allocate to the cache. +# <bytes>: The number of bytes of memory to allocate to the cache. +# <ncache>: The number of cache segments to use. If this value is set to +# 0 or 1 then Berkeley DB will try to allocate one contiguous section +# of memory for the cache. If this value is greater than 1, the cache +# will be split into that number of segments. +%if %%is_defined('import_slapadd') +set_cachesize 2 0 1 +%else +set_cachesize 0 52428800 0 +%end if + + +# Sets the database startup flags. +# +# set_flags <flag> +# There are various flag options that may be set. The DB_TXN_NOSYNC flag +# tells the database not to immediately flush transaction buffers to disk. +# Setting this flag can help speed up database access during periods of +# database write activity BUT at expense of data safety. Enable it only +# to load data with slapadd, while slapd is not running. +%if %%is_defined('import_slapadd') +set_flags DB_TXN_NOSYNC +%end if + + +# Set the maximum in memory cache in <bytes> for database file name caching. +# +# set_lg_regionmax <bytes> +# This value should be increased as the number of database files increases +# (tables and indexes). +#set_lg_regionmax 1048576 + +# Set the maximum size of log files in <bytes>. +# +# set_lg_max <bytes> +# Logs will be rotated when <bytes> amount of data have been written to +# one log file. This value should be at least four times the size of +# set_lg_bsize. +#set_lg_max 10485760 + +# Set the in memory cache for log information. +# +# set_lg_bsize <bytes> +# When <bytes> amount of logging information have been written to this +# cache it will be flushed to disk. +set_lg_bsize 2097152 + +# Set the log file directory to <directory>. +# +# set_lg_dir /usr/local/var/openldap-logs +# Log files should preferably be on a different disk than the +# database files. This both improves reliability (for disastrous +# recovery) and speed of the database. +#set_lg_dir <directory> + + +# Sven Hartge reported that he had to set this value incredibly high +# to get slapd running at all. See http://bugs.debian.org/303057 +# for more information. + +# Number of objects that can be locked at the same time. +set_lk_max_objects 5000 +# Number of locks (both requested and granted) +set_lk_max_locks 5000 +# Number of lockers +set_lk_max_lockers 5000 + +# Purge automatique des logs +set_flags DB_LOG_AUTOREMOVE diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/templates/default.slapd b/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/templates/default.slapd new file mode 100644 index 0000000000000000000000000000000000000000..1eea3ebd8502809ca72ed74d005b4d5e34e7eb2e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/templates/default.slapd @@ -0,0 +1,52 @@ +# Location of the slapd configuration to use. If using the cn=config +# backend to store configuration in LDIF, set this variable to the +# directory containing the cn=config data; otherwise set it to the location +# of your slapd.conf file. If empty, use the compiled-in default +# (/etc/ldap/slapd.d). +SLAPD_CONF="/etc/ldap/slapd.conf" + +# System account to run the slapd server under. If empty the server +# will run as root. +SLAPD_USER="openldap" + +# System group to run the slapd server under. If empty the server will +# run in the primary group of its user. +SLAPD_GROUP="openldap" + +# Path to the pid file of the slapd server. If not set the init.d script +# will try to figure it out from $SLAPD_CONF (/etc/ldap/slapd.d by +# default) +SLAPD_PIDFILE= + +# slapd normally serves ldap only on all TCP-ports 389. slapd can also +# service requests on TCP-port 636 (ldaps) and requests via unix +# sockets. +# Example usage: +# SLAPD_SERVICES="ldap://127.0.0.1:389/ ldaps:/// ldapi:///" +%if %%ldap_ssl == 'non' +SLAPD_SERVICES="ldap:/// ldapi:///" +%else +SLAPD_SERVICES="ldap:/// ldaps:/// ldapi:///" +%end if + +# If SLAPD_NO_START is set, the init script will not start or restart +# slapd (but stop will still work). Uncomment this if you are +# starting slapd via some other means or if you don't want slapd normally +# started at boot. +#SLAPD_NO_START=1 + +# If SLAPD_SENTINEL_FILE is set to path to a file and that file exists, +# the init script will not start or restart slapd (but stop will still +# work). Use this for temporarily disabling startup of slapd (when doing +# maintenance, for example, or through a configuration management system) +# when you don't want to edit a configuration file. +SLAPD_SENTINEL_FILE=/etc/ldap/noslapd + +# For Kerberos authentication (via SASL), slapd by default uses the system +# keytab file (/etc/krb5.keytab). To use a different keytab file, +# uncomment this line and change the path. +#export KRB5_KTNAME=/etc/krb5.keytab + +# Additional options to pass to slapd +SLAPD_OPTIONS="" + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/templates/slapd.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/templates/slapd.conf new file mode 100644 index 0000000000000000000000000000000000000000..56237234ecbf37e0c7660d26711609fa269dcafd --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-annuaire/templates/slapd.conf @@ -0,0 +1,221 @@ +# +# configuration ldap pour Eole-2.3 +# +# Equipe Eole <eole@ac-dijon.fr> +# + +# +# See slapd.conf(5) for details on configuration options. +# This file should NOT be world readable. +# +include /etc/ldap/schema/core.schema +include /etc/ldap/schema/cosine.schema +include /etc/ldap/schema/inetorgperson.schema +%if %%ldap_schema == 'eole' +include /etc/ldap/schema/nis.schema +include /etc/ldap/schema/eole/samba.schema +include /etc/ldap/schema/eole/eole.schema +include /etc/ldap/schema/eole/eoleshare.schema +include /etc/ldap/schema/eole/radius.schema +include /etc/ldap/schema/eole/ent.schema +%elif %%ldap_schema == 'sdet' +include /etc/ldap/schema/eole/ent4.schema +%elif %%ldap_schema == 'zephir' +include /etc/ldap/schema/openldap.schema +%end if + +## Support du TLS +TLSCertificateFile /etc/ldap/ssl/certs/openldap.crt +TLSCertificateKeyFile /etc/ldap/ssl/private/openldap.key +TLSCACertificateFile /etc/ssl/certs/ca.crt +TLSVerifyClient never +TLSCipherSuite SECURE256:+SIGN-ALL:-VERS-SSL3.0:!AES-128-CBC:!3DES-CBC:!DES-CBC:!ARCFOUR-128:!ARCFOUR-40:!RC2-40:!CAMELLIA-128-CBC:!NULL + +# Define global ACLs to disable default read access. + +# Do not enable referrals until AFTER you have a working directory +# service AND an understanding of referrals. +#referral ldap://root.openldap.org + +pidfile /var/run/slapd/slapd.pid +argsfile /var/run/slapd/slapd.args + +# Where the dynamically loaded modules are stored +modulepath /usr/lib/ldap +moduleload back_bdb +%if %%ldap_replication == 'oui' or %%ldap_replication_client == 'oui' +moduleload syncprov +%end if + +# Sample security restrictions +# Require integrity protection (prevent hijacking) +# Require 112-bit (3DES or better) encryption for updates +# Require 63-bit encryption for simple bind +# security ssf=1 update_ssf=112 simple_bind=64 + +# Sample access control policy: +# Root DSE: allow anyone to read it +# Subschema (sub)entry DSE: allow anyone to read it +# Other DSEs: +# Allow self write access +# Allow authenticated users read access +# Allow anonymous users to authenticate +# Directives needed to implement policy: +# access to dn.base="" by * read +# access to dn.base="cn=Subschema" by * read +# access to * +# by self write +# by users read +# by anonymous auth +# +# if no access controls are present, the default policy +# allows anyone and everyone to read anything but restricts +# updates to rootdn. (e.g., "access to * by * read") +# +# rootdn can always read and write EVERYTHING! + +####################################################################### +# BDB database definitions +####################################################################### + +# compatibilite EAD1 et appli PHP +allow bind_v2 + +database bdb +# The base of your directory +suffix "%%ldap_base_dn" +rootdn "cn=admin,%%ldap_base_dn" + +# Cleartext passwords, especially for the rootdn, should +# be avoid. See slappasswd(8) and slapd.conf(5) for details. +# Use of strong authentication encouraged. +rootpw {CRYPT}dyJWGdOe6Pgec + +# The database directory MUST exist prior to running slapd AND +# should only be accessible by the slapd and slap tools. +# Mode 700 recommended. +directory /var/lib/ldap + +# Indices to maintain +index objectClass eq +index uid,cn,sn eq,subinitial +%if %%ldap_schema == 'eole' +index ENTPersonLogin eq +index FederationKey eq +index ENTEleveStructRattachId eq +# Samba +index memberuid eq +index gidnumber,uidnumber eq +index sambaSID eq,sub +index sambaPrimaryGroupSID eq +index sambaDomainName eq +index sambaGroupType eq +index sambaSIDList eq +index uniqueMember eq +index sambaShareGroup eq +# recherches diverses +index displayName eq,subinitial +index description eq,subinitial +index type eq +index eleve eq +%elif %%ldap_schema == 'sdet' +index ENTEleveMEF eq +%end if +index mail eq +# réplication +index entryCSN,entryUUID eq +index contextCSN eq + +# Basic ACL +access to attrs=userPassword + by self write + by anonymous auth +%if %%getVar('activer_ad', 'non') == 'oui' + by dn="cn=reader,%%ldap_base_dn" write +%else + by dn="cn=reader,%%ldap_base_dn" read +%end if + by * none + +%if %%ldap_schema == 'eole' +access to attrs=sambaLMPassword,sambaNTPassword + by self write + by anonymous auth +%if %%getVar('activer_ad', 'non') == 'oui' + by dn="cn=reader,%%ldap_base_dn" write +%else + by dn="cn=reader,%%ldap_base_dn" read +%end if + by * none + +# ACL pour Scribe +access to attrs=employeeNumber,Ine,dateNaissance,ENTPersonDateNaissance,ENTPersonAdresse,ENTPersonCodePostal,ENTPersonVille,ENTPersonPays,telephoneNumber,mobile,homePhone,eleve,ENTAuxPersRelEleveEleve,ENTEleveStructRattachId + by self read + by dn="cn=reader,%%ldap_base_dn" read + by * none +%end if + +# ACL par défaut +access to * +%if %%ldap_restrict_access == 'tous' + by * read +%else + %if %%mode_conteneur_actif == 'oui' + %set %%separator='%' + by peername.ip=%%adresse_network_br0%%separator%%adresse_netmask_br0 read + %end if + by peername.ip=127.0.0.1 read + %if %%ldap_restrict_access != 'aucun' + by users read + %end if + by * none +%end if + +%if %%ldap_replication == 'oui' +# recherches illimitées pour le reader +limits dn.exact="cn=reader,%%ldap_base_dn" size=unlimited time=unlimited +%end if + +# logging +loglevel %%ldap_loglevel + +# Specify the maximum number of entries to return from a search operation +sizelimit %%ldap_sizelimit + +# Specify the maximum number of seconds (in real time) +# slapd will spend answering a search request +timelimit %%ldap_timelimit + +# Controls whether slapd will automatically maintain +# the modifiersName, modifyTimestamp, creatorsName, and createTimestamp attributes for entries. +lastmod on + + +####################################################################### +# These slapd.conf options apply to the bdb and hdb backend database +####################################################################### + +# Specify the size in entries of the in-memory entry cache +cachesize %%ldap_cachesize +idlcachesize %%ldap_cachesize + +%if %%is_defined('import_slapadd') +dbnosync +dirtyread +%end if + +## dbcachesize est une specifique au backend ldbm => ne pas l'utiliser + +%if %%ldap_replication == 'oui' +overlay syncprov +# création d'un checkpoint +# toutes les 100 opérations +# ou toutes les 10 minutes +syncprov-checkpoint 100 10 +# nombre maximum de sessions à conserver +syncprov-sessionlog 100 +%end if + +%if %%ldap_replication_client == 'oui' +include /etc/ldap/replication.conf +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-antivirus/dictionaries/00_eole-antivirus_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-antivirus/dictionaries/00_eole-antivirus_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..a58fe7d66cbcdde55e3ecf79ffac8446c44d11ec --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-antivirus/dictionaries/00_eole-antivirus_packages.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>clamav-freshclam</package> + <package>clamav</package> + <package>python-yaml</package> + <package>python-crontab</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-antivirus/dictionaries/20_antivirus.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-antivirus/dictionaries/20_antivirus.xml new file mode 100644 index 0000000000000000000000000000000000000000..9baa21dbb1d583a82a38ca50677d921e44e4ad76 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-antivirus/dictionaries/20_antivirus.xml @@ -0,0 +1,252 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + <service servicelist='clamav'>clamav-freshclam</service> + <!--<service servicelist='clamav'>clamav-daemon</service>--> + <service servicelist='force_clamav'>clamav-daemon</service> + <file filelist='force_clamav' name='/etc/clamav/clamd.conf'/> + <file filelist='clamav' name='/etc/clamav/freshclam.conf'/> + <file filelist='clam_container' name='/etc/sudoers.d/clamav' source="clamav.sudoers" mode="0440" rm='True'/> + <file filelist='clam_folder' name='/etc/eole/avscan.d/generic.yaml' source='avscan-folders.yaml' mkdir='True' rm='True'/> + <file filelist='clamav' name='/etc/eole/clamd-reload.cnf' rm='True'/> + <file filelist='clamav' name='/etc/apparmor.d/local/usr.sbin.clamd' /> + <file filelist='clamav' name='/etc/apparmor.d/local/usr.bin.freshclam' source="freshclam.apparmor.conf"/> + </files> + + <containers> + <container name='mail'> + <!-- le conteneur 'mail' est présent sur tous les modules #8702 & #9213 --> + <package instance_mode='when_no_container'>eole-antivirus-pkg</package> + <package instance_mode='when_container'>eole-antivirus-container-pkg</package> + <package>python-crontab</package> + <service servicelist='clamav_mail'>clamav-daemon</service> + </container> + + </containers> + + <variables> + <family name='services'> + <variable name='activer_clam' type='oui/non' description="Activer l'anti-virus ClamAV"> + <value>oui</value> + </variable> + </family> + <family name='clamav' icon='shield'> + <variable name='activer_scandir' type='oui/non' description='Ajouter des répertoires à analyser automatiquement ?'> + <value>non</value> + </variable> + + <!-- Analyse de répertoires --> + <variable name='clam_scan_dir' type='string' description='Répertoire à analyser' multi='True'/> + <variable name='clam_scan_recurs' type='oui/non' description='Analyse récursive ?' hidden='True'> + <value>oui</value> + </variable> + <variable name='clam_scan_when' type='string' description="Périodicité de l'analyse (Lancement tous les ...)"> + <value>jours</value> + </variable> + <variable name='clam_scan_hour' type='string' description="Heure du lancement (format HH:MM)"> + <value>1:00</value> + </variable> + <variable name='clam_scan_min' type='number' description="Minute du lancement"> + <value>10</value> + </variable> + <variable name='clam_scan_week_day' type='string' description="Jour du lancement"> + <value>samedi</value> + </variable> + <variable name='clam_scan_monthday' type='number' description="Numéro du jour du lancement dans le mois"> + <value>1</value> + </variable> + <variable name='clam_scan_when_custom' type='string' description="Configuration brute format CRONTAB" mandatory='True'/> + + <variable name='clam_max_file_size' type='number' description='Taille maximale pour un fichier à analyser (en Mo)' mode='expert'> + <value>10</value> + </variable> + <variable name='clam_max_scan_size' type='number' description='Quantité de données maximale à analyser pour une archive (en Mo)' mode='expert'> + <value>50</value> + </variable> + <variable name='clam_max_recursion' type='number' description='Profondeur maximale pour l’analyse des archives' mode='expert'> + <value>16</value> + </variable> + <variable name='clam_max_directory_recursion' type='number' description="Profondeur maximale pour l’analyse des répertoires" mode='expert'> + <value>15</value> + </variable> + <variable name='clam_max_files' type='number' description='Nombre maximal de fichiers à analyser dans une archive' mode='expert'> + <value>5000</value> + </variable> + <variable name='clam_exit_on_oom' type='yes/no' description='Arrêter le démon en cas de surcharge mémoire' mode='expert'> + <value>no</value> + </variable> + <variable name='clam_detect_pua' type='yes/no' description='Détection des applications indésirables' mode='expert'> + <value>no</value> + </variable> + <variable name='clam_scan_elf' type='yes/no' description='Analyse du contenu des fichiers ELF' mode='expert'> + <value>no</value> + </variable> + <variable name='clam_scan_pdf' type='yes/no' description='Analyse du contenu des fichiers PDF' mode='expert'> + <value>yes</value> + </variable> + <variable name='clam_scan_mail' type='yes/no' description='Analyse des fichiers courriels' mode='expert'> + <value>no</value> + </variable> + <variable name='clam_broken_exe' type='yes/no' description='Détection des fichiers exécutables corrompus' mode='expert'> + <value>no</value> + </variable> + <variable name='clam_dns_database_info' type='domain' description='Nom de domaine du serveur DNS de mise à jour' mode='expert'> + <value>current.cvd.clamav.net</value> + </variable> + <variable name='clam_forcer_mirror_database' type='oui/non' description='Forcer un serveur de mise à jour freshclam' mode='expert'> + <value>non</value> + </variable> + <variable name='clam_mirror_database' type='domain' description='Nom de domaine du serveur de mise à jour' mode='expert' multi='True' mandatory='True'/> + <variable name='clam_iana' type='hostname_strict' description='Code IANA pour la mise à jour de la base de signature' mode='expert'> + <value>fr</value> + </variable> + <variable name='clam_max_attempts' type='number' description='Nombre de tentatives de mise à jour par miroir' mode='expert'> + <value>5</value> + </variable> + <variable name='clam_checks' type='number' description='Nombre de mises à jour quotidiennes' mode='expert'> + <value>24</value> + </variable> + <variable name='clam_forcer_daemon' type='oui/non' description="Forcer l'activation du démon clam sur le serveur" mode='expert'> + <value>non</value> + </variable> + </family> + <separators> + <separator name='activer_scandir'>Analyse anti-virus</separator> + <separator name='clam_max_file_size'>ClamAV</separator> + <separator name='clam_dns_database_info'>Freshclam</separator> + <separator name='clam_forcer_daemon'>Services utilisant ClamAV</separator> + </separators> + </variables> + + <constraints> + <condition name='disabled_if_in' source='activer_clam'> + <param>non</param> + <target type='family'>clamav</target> + <target type='filelist'>clamav</target> + <target type='filelist'>clam_container</target> + <target type='servicelist'>clamav</target> + </condition> + <condition name='disabled_if_in' source='activer_clam'> + <param>non</param> + <target type='servicelist'>force_clamav</target> + <target type='filelist'>force_clamav</target> + </condition> + <condition name='disabled_if_in' source='clam_forcer_daemon'> + <param>non</param> + <target type='servicelist'>force_clamav</target> + <target type='filelist'>force_clamav</target> + </condition> + <condition name='disabled_if_in' source='clam_forcer_mirror_database'> + <param>non</param> + <target>clam_mirror_database</target> + </condition> + <condition name='disabled_if_in' source='clam_forcer_mirror_database'> + <param>oui</param> + <target>clam_iana</target> + </condition> + <condition name='disabled_if_in' source='mode_conteneur_actif'> + <param>non</param> + <target type='filelist'>clam_container</target> + </condition> + <condition name='disabled_if_in' source='mode_conteneur_actif'> + <param>oui</param> + <target>clam_forcer_daemon</target> + </condition> + + <condition name='disabled_if_in' source='activer_scandir'> + <param>non</param> + <target type='variable'>clam_scan_dir</target> + <target type='variable'>clam_scan_when</target> + <target type='variable'>clam_scan_when_custom</target> + <target type='variable'>clam_scan_hour</target> + <target type='variable'>clam_scan_min</target> + <target type='variable'>clam_scan_week_day</target> + <target type='variable'>clam_scan_monthday</target> + <target type='filelist'>clam_folder</target> + </condition> + + <group master='clam_scan_dir'> + <slave>clam_scan_recurs</slave> + <slave>clam_scan_when</slave> + <slave>clam_scan_hour</slave> + <slave>clam_scan_min</slave> + <slave>clam_scan_week_day</slave> + <slave>clam_scan_when_custom</slave> + <slave>clam_scan_monthday</slave> + </group> + + <check name='valid_enum' target='clam_scan_week_day'> + <param>['lundi','mardi','mercredi','jeudi', 'vendredi', 'samedi', 'dimanche']</param> + </check> + + <check name='valid_enum' target='clam_scan_when'> + <param>['heures','jours', 'semaines', 'mois', 'personnalisé']</param> + </check> + <check name='valid_regexp' target='clam_scan_when_custom'> + <param>^\s*((((\*/[0-9]+)|([0-9]+-[0-9]+/[0-9]+)|([0-9]+-[0-9]+)|([0-9]+(,[0-9]+)*)|(\*))(\s+(((\*/[0-9]+)|([0-9]+-[0-9]+/[0-9]+)|([0-9]+-[0-9]+)|([0-9]+(,[0-9]+)*)|(\*)))){4})|(@(reboot)|(yearly)|(annually)|(monthly)|(weekly)|(daily)|(midnight)|(hourly)))$</param> + <param name='err_msg'>La programmation ne respecte pas le format accepté par cron</param> + </check> + + <!-- Manage Custom mode for antivirus analyse config --> + <condition name='disabled_if_in' source='clam_scan_when'> + <param>personnalisé</param> + <target>clam_scan_hour</target> + <target>clam_scan_min</target> + <target>clam_scan_week_day</target> + <target>clam_scan_monthday</target> + </condition> + + <!-- Manage "evry hour mode" --> + <condition name='disabled_if_in' source='clam_scan_when'> + <param>heures</param> + <target>clam_scan_hour</target> + <target>clam_scan_week_day</target> + <target>clam_scan_monthday</target> + <target>clam_scan_when_custom</target> + </condition> + + <!-- Manage "evry day mode" --> + <condition name='disabled_if_in' source='clam_scan_when'> + <param>jours</param> + <target>clam_scan_week_day</target> + <target>clam_scan_min</target> + <target>clam_scan_monthday</target> + <target>clam_scan_when_custom</target> + </condition> + + <!-- Manage "evry week mode" --> + <condition name='disabled_if_in' source='clam_scan_when'> + <param>semaines</param> + <target>clam_scan_min</target> + <target>clam_scan_monthday</target> + <target>clam_scan_when_custom</target> + </condition> + + <!-- Manage "evry month mode" --> + <condition name='disabled_if_in' source='clam_scan_when'> + <param>mois</param> + <target>clam_scan_week_day</target> + <target>clam_scan_min</target> + <target>clam_scan_when_custom</target> + </condition> + + </constraints> + + <help> + <variable name='activer_clam'>ClamAV est un logiciel anti-virus pour Unix</variable> + <variable name='clam_scan_elf'>ELF (Executable and Linkable Format) est un format de fichier binaire utilisé pour l'enregistrement de code compilé</variable> + <variable name='clam_forcer_daemon'>Permet d'activer le service ClamAV même s'il n'y a pas de analyse temps réel activé</variable> + <variable name='clam_scan_dir'>Chemin du répertoire a analysener</variable> + <variable name='clam_scan_when'>Périodicité du analyse anti-virus (horaire, quotidien, hebdomadaire, mensuel, personnalisée)</variable> + <variable name='clam_scan_hour'>Heure de début de analyse anti-virus au format H:MM</variable> + <variable name='clam_scan_min'>Minute de début des analyses horaires</variable> + <variable name='clam_scan_week_day'>Quel jour de la semaine l'analyse anti-virus doit être lancée</variable> + <variable name='clam_scan_monthday'>Quel jour du mois l'analyse anti-virus doit être lancée</variable> + <variable name='clam_scan_when_custom'>Configuration crontab brute (attention si la configuration n'est pas valide la ligne ne sera pas écrite)</variable> + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-antivirus/files/usr/share/eole/diagnose/151-antivirus b/seed/release/eole-2.7/2.7.1/applicationservice/eole-antivirus/files/usr/share/eole/diagnose/151-antivirus new file mode 100644 index 0000000000000000000000000000000000000000..3664ef79c9e390c885d38f413aead19df3fb5770 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-antivirus/files/usr/share/eole/diagnose/151-antivirus @@ -0,0 +1,48 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +######################################################################### +# pyeole.service - manage EOLE services +# Copyright © 2014 Pôle de Compétence EOLE <eole@ac-dijon.fr> +# +# License CeCILL: +# * in french: http://www.cecill.info/licences/Licence_CeCILL_V2-fr.html +# * in english http://www.cecill.info/licences/Licence_CeCILL_V2-en.html +######################################################################### +from os.path import isfile +from commands import getstatusoutput +from pyeole.diagnose import test_clamd, test_freshclam +from pyeole.diagnose.diagnose import CLAMD_CONTAINER +from creole.client import CreoleClient + +if __name__ == "__main__": + #clamd + client = CreoleClient() + if client.get_creole('activer_clam') == 'oui': + cmd = [". /usr/lib/eole/diagnose.sh"] + cmd.append('EchoGras "*** Anti-virus"') + cmd.append('printf ". %${len_pf}s => " "Anti-virus"') + if isfile(CLAMD_CONTAINER): + ret = test_clamd() + if ret == '': + cmd.append('EchoOrange "Non configuré"') + elif ret == 0: + cmd.append('EchoVert "Ok"') + else: + cmd.append('EchoRouge "Erreur"') + else: + cmd.append('Inactif "Anti-virus"') + #freshclam + + cmd.append('TestPid "Service de maj" freshclam') + cmd.append('printf ". %$((len_pf+1))s => " "Dernière maj"') + ret = test_freshclam() + if ret['status'] == 'On': + cmd.append('EchoVert "OK ({0})"'.format(ret['msg'])) + elif ret['status'] == 'Off': + cmd.append('EchoRouge "Erreur ({0})"'.format(ret['msg'])) + else: + cmd.append('EchoOrange "{0}"'.format(ret['msg'])) + cmd_string = "\n".join(cmd) + err, ret = getstatusoutput(cmd_string) + print ret diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-antivirus/files/usr/share/eole/sbin/avscan b/seed/release/eole-2.7/2.7.1/applicationservice/eole-antivirus/files/usr/share/eole/sbin/avscan new file mode 100644 index 0000000000000000000000000000000000000000..6eb005320f3d53913a5ce0d48e7ee3a951264300 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-antivirus/files/usr/share/eole/sbin/avscan @@ -0,0 +1,96 @@ +#!/bin/bash + +# +# Anti-virus Scanner ! +# +function die() +{ + RETCODE=${1} + MSG=${2} + + echo "${MSG}" + exit ${RETCODE} +} + +function log() +{ + logger -t "eole-antivirus" "$@" +} + +function showHelp() +{ + echo "$(basename ${0}): Lancer une analyse anti-virus" + echo " -e : mode EOLE Analayse les répertoires configurés dans l'onglet Clamav de Gen_Config" + echo " -s : mode Samba analyse les partages samba" + echo " -d : mode manuel analyse le répertoire passé en paramètre" + echo + echo "Scan EOLE : $(basename ${0}) -e" + echo "Scan Samba : $(basename ${0}) -s" + echo "Scan Manuel : $(basename ${0}) -d /tmp -d /etc" + echo "Scan mixte : $(basename ${0}) -e -s -d /tmp -d /etc -d /usr/share" + echo "Attention les répertoires spécifiés avec -d doivent être accècibles par le démon clamd (y compris au niveau apparmor)" + echo "" + echo "Fichier de logs disponible ici : /var/log/rsyslog/local/eole-antivirus" + die 3 "" +} + +MODE="DEFAULT" +TARGETS="" + +while getopts ":esfhd:" opt; do + case ${opt} in + e) MODE="eole" ;; + s) MODE="samba" ;; + d) + MODE="custom" + TARGETS="${TARGETS} ${OPTARG}" + ;; + h) showHelp ;; + \?) + echo "Invalid option: -$OPTARG" >&2 + exit 1 + ;; + :) + echo "Option -$OPTARG requires an argument." >&2 + exit 1 + ;; + esac +done + + +if [[ ${MODE} == "samba" ]] || [[ ${MODE} == "full" ]] +then + # Manage Samba shares scan !! + if [[ $(CreoleGet ad_av_scan non) == "oui" ]] + then + TARGETS="${TARGETS} /home $(CreoleGet ad_additional_share_path "")" + fi +elif [[ ${MODE} == "eole" ]] || [[ ${MODE} == "full" ]] +then + # Manage directories from anti-virus familly + TARGETS="${TARGETS} $(CreoleGet clam_scan_dir "")" +elif [[ ${MODE} == "custom" ]] +then + # The user can set Custom Targets + TARGETS="${TARGETS}" +else + # Unsupported modes + showHelp +fi + +ENABLED=$(CreoleGet activer_scandir non) +if [[ ${ENABLED} == "non" ]] +then + [[ -z ${TARGETS} ]] && die 0 "No directory configured for automatic scan" + # Manage Active Directory homes +fi + +SCAN="clamdscan" +OPTS="" + +if [[ ${TARGETS} != "" ]] +then + log '============ SCAN REPORT ============' + ${SCAN} ${OPTS} ${TARGETS} | log + log '=====================================' +fi diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-antivirus/files/usr/share/eole/sbin/clamd-reload.sh b/seed/release/eole-2.7/2.7.1/applicationservice/eole-antivirus/files/usr/share/eole/sbin/clamd-reload.sh new file mode 100644 index 0000000000000000000000000000000000000000..4216ee331deae7f9172d67c8a2d535178cd6b2ee --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-antivirus/files/usr/share/eole/sbin/clamd-reload.sh @@ -0,0 +1,47 @@ +#!/bin/bash +. /usr/lib/eole/ihm.sh + +if [ ! -f /etc/eole/clamd-reload.cnf ]; then + EchoRouge "Reload clam n'est pas configuré" + exit 1 +fi +OPTION=$1 +. /etc/eole/clamd-reload.cnf +if [ "$OPTION" = "noreload" ]; then + RELOAD=1 +else + RELOAD=0 +fi + +CODE=0 +if [ $(CreoleGet mode_conteneur_actif) = "oui" ]; then + for container in $CLAMD_CONTAINER; do + container_path=$(CreoleGet container_path_$container) + if [ ! "$container_path" = "" ]; then + /usr/bin/rsync -a --delete /var/lib/clamav $container_path/var/lib + fi + if [ "$RELOAD" = "0" ]; then + CreoleRun /usr/bin/clamd-eole $container + if [ ! "$?" = "0" ]; then + EchoRouge "Impossible de recharger clamd sur le conteneur $container" + CODE=2 + else + EchoVert "Clamd est rechargé sur $container" + fi + fi + done +else + if [ "$RELOAD" = "0" ]; then + /usr/bin/clamd-eole + if [ ! "$?" = "0" ]; then + EchoRouge "Impossible de recharger clamd" + CODE=2 + else + EchoVert "Clamd est rechargé" + fi + fi +fi + +/usr/share/eole/sbin/freshclam-status.sh "$CODE" + +exit $CODE diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-antivirus/files/usr/share/eole/sbin/freshclam-status.sh b/seed/release/eole-2.7/2.7.1/applicationservice/eole-antivirus/files/usr/share/eole/sbin/freshclam-status.sh new file mode 100644 index 0000000000000000000000000000000000000000..336a4f39a6d3cb056056bc6cab403ecd215e5fbe --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-antivirus/files/usr/share/eole/sbin/freshclam-status.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +STATUS=$1 + +echo "# -*- coding: UTF-8 -*- +DATE=\"`date +%s`\" +STATUS=\"$STATUS\"" > /var/log/clamav/freshclam-status.log diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-antivirus/files/usr/share/zephir/monitor/configs/freshclam.agent b/seed/release/eole-2.7/2.7.1/applicationservice/eole-antivirus/files/usr/share/zephir/monitor/configs/freshclam.agent new file mode 100644 index 0000000000000000000000000000000000000000..610749dcb53eb0a4962553d185db8a43115fd92d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-antivirus/files/usr/share/zephir/monitor/configs/freshclam.agent @@ -0,0 +1,17 @@ +# -*- coding: UTF-8 -*- +""" +Antivirus temps réél +""" +from zephir.monitor.agentmanager.config import ACTIVER_CLAM + +if ACTIVER_CLAM: + from zephir.monitor.agents.freshclam import Freshclam + fresh = Freshclam("fresh", + period = 3600, + description = """Mise à jour antivirus Clam""", + section="""Utilisation""", + ) + AGENTS = [fresh] +else: + AGENTS = [] + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-antivirus/posttemplates/00-antivirus b/seed/release/eole-2.7/2.7.1/applicationservice/eole-antivirus/posttemplates/00-antivirus new file mode 100644 index 0000000000000000000000000000000000000000..f773b1ec5a2348151904b722dfe82d4310f20aeb --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-antivirus/posttemplates/00-antivirus @@ -0,0 +1,23 @@ +#!/bin/bash + +LOG_ROOT_DIR="/var/log/clamav" +FRESH_STATUS_LOG_FILE="${LOG_ROOT_DIR}/freshclam-status.log" + +[ "$(CreoleGet activer_clam non)" = 'oui' ] || exit 0 + +# Reload apparmor profile with new capabilities #7063 +APPARMOR_CONF=/etc/apparmor.d/usr.sbin.clamd +[ -f ${APPARMOR_CONF} ] && apparmor_parser -r ${APPARMOR_CONF} +APPARMOR_CONF=/etc/apparmor.d/usr.bin.freshclam +apparmor_parser -r ${APPARMOR_CONF} + +if [ ! -e "${FRESH_STATUS_LOG_FILE}" ]; then + mkdir -p "$LOG_ROOT_DIR" + touch ${FRESH_STATUS_LOG_FILE} + /bin/chown -R clamav:clamav ${FRESH_STATUS_LOG_FILE} +fi + +#fixe #1623 +/usr/share/eole/sbin/clamd-reload.sh noreload > /dev/null 2>&1 + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-antivirus/posttemplates/01-avscanner b/seed/release/eole-2.7/2.7.1/applicationservice/eole-antivirus/posttemplates/01-avscanner new file mode 100644 index 0000000000000000000000000000000000000000..052b134ebe7fe0ca79aab095d7aa12375c3be714 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-antivirus/posttemplates/01-avscanner @@ -0,0 +1,213 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import sys +from os.path import isdir, join +from os import listdir +import re +from crontab import CronTab +from creole.client import CreoleClient +import yaml + +avScanner = "/usr/share/eole/sbin/avscan" +avScannerConfDir = "/etc/eole/avscan.d/" +days = {"lundi": "MON", + "mardi": "TUE", + "mercredi": "WED", + "jeudi": "THU", + "vendredi": "FRI", + "samedi": "SAT", + "dimanche": "SUN"} +CUSTOM_RE = re.compile(r'^\s*((((\*/[0-9]+)|([0-9]+-[0-9]+/[0-9]+)|([0-9]+-[0-9]+)|([0-9]+(,[0-9]+)*)|(\*))(\s+(((\*/[0-9]+)|([0-9]+-[0-9]+/[0-9]+)|([0-9]+-[0-9]+)|([0-9]+(,[0-9]+)*)|(\*)))){4})|(@(reboot)|(yearly)|(annually)|(monthly)|(weekly)|(daily)|(midnight)|(hourly)))$') + + +def is_valid_minute(minute): + if minute in range(60): + return True + return False + + +def is_valid_hour(hour): + if hour in range(25): + return True + return False + + +def is_valid_wday(day): + if day in days.values(): + return True + return False + + +def is_valid_mday(day): + if day in range(32): + return True + return False + + +def is_valid_custom(custom): + if CUSTOM_RE.match(custom): + return True + return False + + +class AvScan(object): + def __init__(self, mode='folder', path=None, recursive=True): + self.mode = mode + if mode == 'folder' and path: + self.command = '{0} -d {1}'.format(avScanner, path) + elif mode == 'share': + self.command = '{0} -s'.format(avScanner) + else: + raise Exception('Could not build command from parameters (mode: {}, path: {})'.format(mode, path)) + self.is_recursive = recursive + + def toCronJob(self, crontab): + raise NotImplemented('*AvScan class must implement toCronJob method') + + +class HourlyAvScan(AvScan): + def __init__(self, mode='folder', path=None, recursive=True, minute=None, **kwargs): + super(HourlyAvScan, self).__init__(mode=mode, path=path, recursive=recursive) + self.minute = minute + + def is_valid(self): + return is_valid_minute(self.minute) + + def toCronJob(self, crontab): + if self.is_valid(): + job = crontab.new(self.command) + job.minute.on(self.minute) + crontab.write() + else: + raise Exception('Invalid parameters for cron task') + + +class DailyAvScan(AvScan): + def __init__(self, mode='folder', path=None, recursive=True, hour=None, minute=None, **kwargs): + super(DailyAvScan, self).__init__(mode=mode, path=path, recursive=recursive) + self.hour = hour + self.minute = minute + + def is_valid(self): + return is_valid_hour(self.hour) and is_valid_minute(self.minute) + + def toCronJob(self, crontab): + if self.is_valid(): + job = crontab.new(self.command) + job.hour.on(self.hour) + job.minute.on(self.minute) + crontab.write() + else: + raise Exception('Invalid parameters for cron task') + + +class WeeklyAvScan(AvScan): + def __init__(self, mode='folder', path=None, recursive=True, day=None, hour=None, minute=None, **kwargs): + super(WeeklyAvScan, self).__init__(mode=mode, path=path, recursive=recursive) + self.day = days[day] + self.hour = hour + self.minute = minute + + def is_valid(self): + return is_valid_wday(self.day) and is_valid_hour(self.hour) and is_valid_minute(self.minute) + + def toCronJob(self, crontab): + if self.is_valid(): + job = crontab.new(self.command) + job.dow.on(self.day) + job.hour.on(self.hour) + job.minute.on(self.minute) + crontab.write() + else: + raise Exception('Invalid parameters for cron task') + + +class MonthlyAvScan(AvScan): + def __init__(self, mode='folder', path=None, recursive=True, day=None, hour=None, minute=None, **kwargs): + super(MonthlyAvScan, self).__init__(mode=mode, path=path, recursive=recursive) + self.day = day + self.hour = hour + self.minute = minute + + def is_valid(self): + return is_valid_mday(self.day) and is_valid_hour(self.hour) and is_valid_minute(self.minute) + + def toCronJob(self, crontab): + if self.is_valid(): + job = crontab.new(self.command) + job.dom.on(self.day) + job.hour.on(self.hour) + job.minute.on(self.minute) + crontab.write() + else: + raise Exception('Invalid parameters for cron task') + + +class CustomAvScan(AvScan): + def __init__(self, mode='folder', path=None, recursive=True, custom=None, **kwargs): + super(CustomAvScan, self).__init__(mode=mode, path=path, recursive=recursive) + self.custom = custom + + def is_valid(self): + return is_valid_custom(self.custom) + + def toCronJob(self, crontab): + if self.is_valid(): + job = crontab.new(self.command) + job.parse(' '.join([self.custom, self.command])) + crontab.write() + else: + raise Exception('Invalid parameters for cron task') + + +AVCLASSES = { + u'heures': HourlyAvScan, + u'jours': DailyAvScan, + u'semaines': WeeklyAvScan, + u'mois': MonthlyAvScan, + u'personnalisé': CustomAvScan, + } + +def die(exitCode, message=None): + ''' + Exit with an exit code, make it die properly ! + ''' + if message: + print(message) + sys.exit(exitCode) + + +def getTargets(): + # Load targets described in yaml + if not isdir(avScannerConfDir): + die(0) + targetYAMLs = [join(avScannerConfDir, yml) for yml in listdir(avScannerConfDir) if yml.endswith('.yaml')] + if not targetYAMLs: + die(0) + params = [] + for targetYAML in targetYAMLs: + with open(targetYAML, 'r') as targetDescription: + params.extend(yaml.load_all(targetDescription)) + + targets = [] + for param_set in params: + try: + target = AVCLASSES[param_set['frequency']](**param_set) + targets.append(target) + except Exception as err: + print('Cannot configure cron task with parameters {}'.format(param_set)) + print(err) + return targets + +# +# MAIN +# + +if __name__ == "__main__": + targets = getTargets() + crontab = CronTab(user=True) + crontab.remove_all(avScanner) + if targets: + for tg in targets: + tg.toCronJob(crontab) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-antivirus/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-antivirus/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..e6f1e7e63469834cf1428be2fec47c11cb23f626 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-antivirus/service.yml @@ -0,0 +1,57 @@ +format: '0.1' +name: eole-antivirus +version: |- + 2.7.1-6 +description: |- + Templates et dictionnaires pour l'antivirus EOLE + Gestion d'antivirus distribuée basée sur clamav et freshclam + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: [] +packages: + - clamav-freshclam + - clamav + - python-yaml + - python-crontab +dictionaries: + - 20_antivirus.xml +extra_dictionaries: {} +templates: + - avscan-folders.yaml + - clamav.sudoers + - clamd-reload.cnf + - clamd.conf + - freshclam.apparmor.conf + - freshclam.conf + - usr.sbin.clamd +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: + - 00-antivirus + - 01-avscanner +files: + /usr/share/eole/diagnose/151-antivirus: + owner: root + group: root + mode: '0755' + /usr/share/eole/sbin/avscan: + owner: root + group: root + mode: '0755' + /usr/share/eole/sbin/clamd-reload.sh: + owner: root + group: root + mode: '0755' + /usr/share/eole/sbin/freshclam-status.sh: + owner: root + group: root + mode: '0755' + /usr/share/zephir/monitor/configs/freshclam.agent: + owner: root + group: root + mode: '0644' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-antivirus/templates/avscan-folders.yaml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-antivirus/templates/avscan-folders.yaml new file mode 100644 index 0000000000000000000000000000000000000000..d3787408648522e4203272a6e9f458ed09c050a7 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-antivirus/templates/avscan-folders.yaml @@ -0,0 +1,27 @@ +%for %%folder in %%clam_scan_dir +--- +type: folder +path: %%folder +recursive: %%folder.clam_scan_recurs +frequency: %%folder.clam_scan_when +%if %%folder.clam_scan_when == u'heures' +minute: %%folder.clam_scan_min +%elif %%folder.clam_scan_when == u'jours' +%set %%hour, %%minute = %%folder.clam_scan_hour.split(':') +hour: %%hour +minute: %%minute +%elif %%folder.clam_scan_when == u'semaines' +%set %%hour, %%minute = %%folder.clam_scan_hour.split(':') +hour: %%hour +minute: %%minute +day: %%folder.clam_scan_week_day +%elif %%folder.clam_scan_when == u'mois' +%set %%hour, %%minute = %%folder.clam_scan_hour.split(':') +hour: %%hour +minute: %%minute +day: %%folder.clam_scan_monthday +%elif %%folder.clam_scan_when == u'personnalisé' +custom: %%folder.clam_scan_when_custom +%end if +... +%end for diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-antivirus/templates/clamav.sudoers b/seed/release/eole-2.7/2.7.1/applicationservice/eole-antivirus/templates/clamav.sudoers new file mode 100644 index 0000000000000000000000000000000000000000..5500e77220afe0fc3119e5a295c9e5079fbced0f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-antivirus/templates/clamav.sudoers @@ -0,0 +1 @@ +clamav ALL=NOPASSWD : /usr/share/eole/sbin/clamd-reload.sh diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-antivirus/templates/clamd-reload.cnf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-antivirus/templates/clamd-reload.cnf new file mode 100644 index 0000000000000000000000000000000000000000..95b02269601de83131d37972d4d95b451978f6a2 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-antivirus/templates/clamd-reload.cnf @@ -0,0 +1,17 @@ +CLAMD_CONTAINER="%slurp +%if %%getVar('exim_clamav', 'non') == 'oui' +mail %slurp +%end if +%if %%getVar('smb_vscan', 'non') == 'oui' +fichier %slurp +%end if +%if %%getVar('ftp_scan', 'non') == 'oui' +ftp %slurp +%end if +%if %%getVar('dansguardian_clam', 'non') == 'oui' +proxy %slurp +%end if +%if %%getVar('clam_forcer_daemon', 'non') == 'oui' +root %slurp +%end if +" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-antivirus/templates/clamd.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-antivirus/templates/clamd.conf new file mode 100644 index 0000000000000000000000000000000000000000..cab6bb92ced775d157dd71697e9b85fd84f01f84 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-antivirus/templates/clamd.conf @@ -0,0 +1,420 @@ +## Fichier de configuration pour clamd 0.99 +## EOLE 2.6 +## Mai 2016 +## Equipe Eole eole@ac-dijon.fr + +# Uncomment this option to enable logging. +# LogFile must be writable for the user running daemon. +# A full path is required. +# Default: disabled +#LogFile /var/log/clamav/clamav.log + +# By default the log file is locked for writing - the lock protects against +# running clamd multiple times (if want to run another clamd, please +# copy the configuration file, change the LogFile variable, and run +# the daemon with --config-file option). +# This option disables log file locking. +# Default: no +#LogFileUnlock yes + +# Maximum size of the log file. +# Value of 0 disables the limit. +# You may use 'M' or 'm' for megabytes (1M = 1m = 1048576 bytes) +# and 'K' or 'k' for kilobytes (1K = 1k = 1024 bytes). To specify the size +# in bytes just don't use modifiers. +# Default: 1M +#LogFileMaxSize 2M + +# Log time with each message. +# Default: no +#LogTime yes + +# Also log clean files. Useful in debugging but drastically increases the +# log size. +# Default: no +#LogClean yes + +# Use system logger (can work together with LogFile). +# Default: no +LogSyslog yes + +# Specify the type of syslog messages - please refer to 'man syslog' +# for facility names. +# Default: LOG_LOCAL6 +#LogFacility LOG_MAIL + +# Enable verbose logging. +# Default: no +#LogVerbose yes + +# Log additional information about the infected file, such as its +# size and hash, together with the virus name. +# Default: no +#ExtendedDetectionInfo yes + +# This option allows you to save a process identifier of the listening +# daemon (main thread). +# Default: disabled +PidFile /run/clamav/clamd.pid + +# Optional path to the global temporary directory. +# Default: system specific (usually /tmp or /var/tmp). +TemporaryDirectory /var/lib/clamav + +# Path to the database directory. +# Default: hardcoded (depends on installation options) +DatabaseDirectory /var/lib/clamav + +# Only load the official signatures published by the ClamAV project. +# Default: no +#OfficialDatabaseOnly no + +# The daemon works in a local OR a network mode. Due to security reasons we +# recommend the local mode. + +# Path to a local socket file the daemon will listen on. +# Default: disabled +LocalSocket /var/run/clamav/clamd.ctl + +# Remove stale socket after unclean shutdown. +# Default: no +FixStaleSocket yes + +# Sets the group ownership on the unix socket. +# Default: disabled (the primary group of the user running clamd) +#LocalSocketGroup virusgroup + +# Sets the permissions on the unix socket to the specified mode. +# Default: disabled (socket is world accessible) +#LocalSocketMode 660 + +# TCP port address. +# Default: no +#TCPSocket 3310 + +# TCP address. +# By default we bind to INADDR_ANY, probably not wise. +# Enable the following to provide some degree of protection +# from the outside world. +# Default: no +#TCPAddr 127.0.0.1 + +# Maximum length the queue of pending connections may grow to. +# Default: 200 +MaxConnectionQueueLength 30 + +# Clamd uses FTP-like protocol to receive data from remote clients. +# If you are using clamav-milter to balance load between remote clamd daemons +# on firewall servers you may need to tune the options below. + +# Close the connection when the data size limit is exceeded. +# The value should match your MTA's limit for a maximum attachment size. +# Default: 25M +#StreamMaxLength 25M + +# Limit port range. +# Default: 1024 +#StreamMinPort 30000 +# Default: 2048 +#StreamMaxPort 32000 + +# Maximum number of threads running at the same time. +# Default: 10 +MaxThreads 12 + +# Waiting for data from a client socket will timeout after this time (seconds). +# Value of 0 disables the timeout. +# Default: 120 +ReadTimeout 180 + +# Waiting for a new job will timeout after this time (seconds). +# Default: 30 +#IdleTimeout 30 + +# Maximum depth directories are scanned at. +# Default: 15 +MaxDirectoryRecursion %%clam_max_directory_recursion + +# Follow directory symlinks. +# Default: no +#FollowDirectorySymlinks no + +# Follow regular file symlinks. +# Default: no +#FollowFileSymlinks no + +# Perform a database check. +# Default: 1800 (30 min) +SelfCheck 600 + +# Execute a command when virus is found. In the command string %v will +# be replaced with the virus name. +# Default: no +#VirusEvent /usr/local/bin/send_sms 123456789 "VIRUS ALERT: %v" + +# Run as another user (clamd must be started by root to make this option +# working). +# Default: don't drop privileges +User root + +# Initialize supplementary group access (clamd must be started by root). +# Default: no +#AllowSupplementaryGroups no + +# Stop daemon when libclamav reports out of memory condition. +# Default: no +ExitOnOOM %%clam_exit_on_oom + +# Don't fork into background. +# Default: no +#Foreground yes + +# Enable debug messages in libclamav. +# Default: no +#Debug yes + +# Do not remove temporary files (for debug purposes). +# Default: no +#LeaveTemporaryFiles yes + +# In some cases (eg. complex malware, exploits in graphic files, and others), +# ClamAV uses special algorithms to provide accurate detection. This option +# controls the algorithmic detection. +# Default: yes +#AlgorithmicDetection yes + +## +## Executable files +## + +# PE stands for Portable Executable - it's an executable file format used +# in all 32 and 64-bit versions of Windows operating systems. This option allows +# ClamAV to perform a deeper analysis of executable files and it's also +# required for decompression of popular executable packers such as UPX, FSG, +# and Petite. +# Default: yes +ScanPE yes + +# Executable and Linking Format is a standard format for UN*X executables. +# This option allows you to control the scanning of ELF files. +# Default: yes +ScanELF %%clam_scan_elf + +# With this option clamav will try to detect broken executables (both PE and +# ELF) and mark them as Broken.Executable. +# Default: no +DetectBrokenExecutables %%clam_broken_exe + + +## +## Documents +## + +# This option enables scanning of OLE2 files, such as Microsoft Office +# documents and .msi files. +# Default: yes +ScanOLE2 yes + +# With this option enabled OLE2 files with VBA macros, which were not +# detected by signatures will be marked as "Heuristics.OLE2.ContainsMacros". +# Default: no +#OLE2BlockMacros no + +# This option enables scanning within PDF files. +# Default: yes +ScanPDF %%clam_scan_pdf + + +## +## Mail files +## + +# Enable scanning of mail files +# Default: yes +%if %%getVar('exim_clamav', 'non') == 'oui' +ScanMail yes +%else +ScanMail %%clam_scan_mail +%end if + +# Scan RFC1341 messages split over many emails. You will need to periodically clean up $TemporaryDirectory/clamav- +# partial directory. WARNING: This option may open your system to a DoS attack. Never use it on loaded servers. +# Default: no +#ScanPartialMessages yes + +# With this option enabled ClamAV will try to detect phishing attempts by using +# signatures. +# Default: yes +PhishingSignatures yes + +# Scan urls found in mails for phishing attempts. +# (available in experimental builds only) +# Default: yes +#PhishingScanURLs yes + +# Use phishing detection only for domains listed in the .pdb database. It is +# not recommended to have this option turned off, because scanning of all +# domains may lead to many false positives! +# (available in experimental builds only) +# Default: yes +#PhishingRestrictedScan yes + +# Always block SSL mismatches in URLs, even if the URL isn't in the database. +# This can lead to false positives. +# (available in experimental builds only) +# +# Default: no +#PhishingAlwaysBlockSSLMismatch no + +# Always block cloaked URLs, even if URL isn't in database. +# This can lead to false positives. +# (available in experimental builds only) +# +# Default: no +#PhishingAlwaysBlockCloak no + +# Allow heuristic match to take precedence. +# When enabled, if a heuristic scan (such as phishingScan) detects +# a possible virus/phish it will stop scan immediately. Recommended, saves CPU +# scan-time. +# When disabled, virus/phish detected by heuristic scans will be reported only at +# the end of a scan. If an archive contains both a heuristically detected +# virus/phish, and a real malware, the real malware will be reported +# Default: no +#HeuristicScanPrecedence yes + + +## +## HTML +## + +# Perform HTML normalisation and decryption of MS Script Encoder code. +# Default: yes +ScanHTML yes + + +## +## Archives +## + +# ClamAV can scan within archives and compressed files. +# Default: yes +ScanArchive yes + +# Mark encrypted archives as viruses (Encrypted.Zip, Encrypted.RAR). +# Default: no +#ArchiveBlockEncrypted no + + +## +## Fichiers (nouvelles options) +## + +# Sets the maximum amount of data to be scanned for each input file. Archives and other containers are recursively +# extracted and scanned up to this value. Warning: disabling this limit or setting it too high may result in severe damage +# to the system. +# Default: 100M +MaxScanSize %%{clam_max_scan_size}M + +# Files larger than this limit won't be scanned. Affects the input file itself as well as files contained inside it (when +# the input file is an archive, a document or some other kind of container). Warning: disabling this limit or setting it +# too high may result in severe damage to the system. +# Default: 25M +MaxFileSize %%{clam_max_file_size}M + +# Nested archives are scanned recursively, e.g. if a Zip archive contains a RAR file, all files within it will also be +# scanned. This options specifies how deeply the process should be continued. Warning: disabling this limit or setting it +# too high may result in severe damage to the system. +# Default: 16 +MaxRecursion %%clam_max_recursion + +# Number of files to be scanned within an archive, a document, or any other kind of container. Warning: disabling this +# limit or setting it too high may result in severe damage to the system. +# Default: 10000 +MaxFiles %%clam_max_files + + +## +## Data Loss Prevention (DLP) +## + +# Enable the DLP module +# Default: No +#StructuredDataDetection yes + + +## +## Possibly Unwanted Applications (PUA) +## + +# Detect Possibly Unwanted Applications. +# Default: No +DetectPUA %%clam_detect_pua + +# Exclude a specific PUA (Possibly Unwanted Applications) category. +# This directive can be used multiple times. +# See http://www.clamav.net/support/pua for the complete list of PUA +# categories. +# Default: Load all categories (if DetectPUA is activated) +#ExcludePUA NetTool +#ExcludePUA PWTool + +# Only include a specific PUA category. This directive can be used multiple +# times. +# Default: Load all categories (if DetectPUA is activated) +#IncludePUA Spy +#IncludePUA Scanner +#IncludePUA RAT + + +## +## Some other new options for clamav 0.97 +## + +# This option specifies the time (in seconds) after which clamd should +# timeout if a client doesn't provide any initial command after connecting. +# Default: 5 +#CommandReadTimeout 5 + +# This option specifies how long to wait (in miliseconds) if the send buffer is full. +# Keep this value low to prevent clamd hanging +# Default: 500 +SendBufTimeout 200 + +# Maximum number of queued items (including those being processed by MaxThreads threads) +# It is recommended to have this value at least twice MaxThreads if possible. +# WARNING: you shouldn't increase this too much to avoid running out of file descriptors, +# the following condition should hold: +# MaxThreads*MaxRecursion + (MaxQueue - MaxThreads) + 6< RLIMIT_NOFILE (usual max is 1024) +# Default: 100 +#MaxQueue 200 + +# Don't scan files and directories matching regex +# This directive can be used multiple times +# Default: scan all +#ExcludePath ^/proc/ +#ExcludePath ^/sys/ + +# Scan files and directories on other filesystems. +# Default: yes +#CrossFilesystems yes + +# This option sets the lowest number of Credit Card numbers found in a file +# to generate a detect. +# Default: 3 +#StructuredMinCreditCardCount 5 + +# This option sets the lowest number of Social Security Numbers found +# in a file to generate a detect. +# Default: 3 +#StructuredMinSSNCount 5 + +# With this option enabled the DLP module will search for valid +# SSNs formatted as xxx-yy-zzzz +# Default: yes +#StructuredSSNFormatNormal yes + +# With this option enabled the DLP module will search for valid +# SSNs formatted as xxxyyzzzz +# Default: no +#StructuredSSNFormatStripped yes diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-antivirus/templates/freshclam.apparmor.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-antivirus/templates/freshclam.apparmor.conf new file mode 100644 index 0000000000000000000000000000000000000000..5bd1386fc2d63420c57393ab01e6ef9d32f5f4f2 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-antivirus/templates/freshclam.apparmor.conf @@ -0,0 +1,7 @@ +# Site-specific additions and overrides for usr.bin.freshclam. +# For more details, please see /etc/apparmor.d/local/README. +# + /bin/bash Ux, +%if %%getVar('activer_client_ldap', False) + /etc/ldap/ldap.conf r, +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-antivirus/templates/freshclam.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-antivirus/templates/freshclam.conf new file mode 100644 index 0000000000000000000000000000000000000000..8e8f7352705f62bad05c8c0521633c91c30628b2 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-antivirus/templates/freshclam.conf @@ -0,0 +1,114 @@ +## Fichier de configuration pour freshclam > 0.90 +## Scribe 2.0 +## février 207 +## Equipe Eole eole@ac-dijon.fr + +# Path to the database directory. +# WARNING: It must match clamd.conf's directive! +# Default: hardcoded (depends on installation options) +DatabaseDirectory /var/lib/clamav + +# Path to the log file (make sure it has proper permissions) +# Default: disabled +#UpdateLogFile /var/log/clamav/freshclam.log + +# Enable verbose logging. +# Default: no +LogVerbose yes + +# Use system logger (can work together with UpdateLogFile). +# Default: no +LogSyslog yes + +# Specify the type of syslog messages - please refer to 'man syslog' +# for facility names. +# Default: LOG_LOCAL6 +#LogFacility LOG_LOCAL6 + +# By default when started freshclam drops privileges and switches to the +# "clamav" user. This directive allows you to change the database owner. +# Default: clamav (may depend on installation options) +DatabaseOwner clamav + +# Initialize supplementary group access (freshclam must be started by root). +# Default: no +#AllowSupplementaryGroups yes + +# Use DNS to verify virus database version. Freshclam uses DNS TXT records +# to verify database and software versions. With this directive you can change +# the database verification domain. +# Default: enabled, pointing to current.cvd.clamav.net +DNSDatabaseInfo %%clam_dns_database_info + +%if %%clam_forcer_mirror_database == 'oui': + %for %%variable_iter in %%clam_mirror_database +DatabaseMirror %%variable_iter + %end for +%else +# Uncomment the following line and replace XY with your country +# code. See http://www.iana.org/cctld/cctld-whois.htm for the full list. +DatabaseMirror db.%%{clam_iana}.clamav.net + +# database.clamav.net is a round-robin record which points to our most +# reliable mirrors. It's used as a fall back in case db.XY.clamav.net is +# not working. DO NOT TOUCH the following line unless you know what you +# are doing. +DatabaseMirror database.clamav.net +%end if + +# How many attempts to make before giving up. +# Default: 3 (per mirror) +MaxAttempts %%clam_max_attempts + +# With this option you can control scripted updates. It's highly recommended +# to keep it enabled. +ScriptedUpdates yes + +# Number of database checks per day. +# Default: 12 (every two hours) +Checks %%clam_checks + +# Proxy settings +# Default: disabled +%if %%activer_proxy_client == 'oui' +HTTPProxyServer %%proxy_client_adresse +HTTPProxyPort %%proxy_client_port +#HTTPProxyUsername myusername +#HTTPProxyPassword mypass +%end if + +# Send the RELOAD command to clamd. +# Default: no +#NotifyClamd +# By default it uses the hardcoded configuration file but you can force an +# another one. +#NotifyClamd /etc/clamav/clamd.conf + +# Run command after successful database update. +# Default: disabled +%if %%mode_conteneur_actif == 'oui' +OnUpdateExecute sudo /usr/share/eole/sbin/clamd-reload.sh +%else +OnUpdateExecute /usr/share/eole/sbin/freshclam-status.sh "0" +%end if + + +# Run command when database update process fails. +# Default: disabled +OnErrorExecute /usr/share/eole/sbin/freshclam-status.sh "1" + +# Don't fork into background. +# Default: no +#Foreground yes + +# Enable debug messages in libclamav. +# Default: no +#Debug yes + +# Timeout in seconds when connecting to database server. +# Default: 30 +#ConnectTimeout 60 + +# Timeout in seconds when reading from database server. +# Default: 30 +#ReceiveTimeout 60 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-antivirus/templates/usr.sbin.clamd b/seed/release/eole-2.7/2.7.1/applicationservice/eole-antivirus/templates/usr.sbin.clamd new file mode 100644 index 0000000000000000000000000000000000000000..fabe66110ac89aee49bbf807c99383ac692cba76 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-antivirus/templates/usr.sbin.clamd @@ -0,0 +1,19 @@ +# Site-specific additions and overrides for usr.sbin.clamd. +# For more details, please see /etc/apparmor.d/local/README. +capability setuid, +capability setgid, +/{,var/}run/clamav/clamd w, + +%for %%index in ['1', '2', '3'] + %if %%getVar('dans_cachedir' + %%index, None) is not None +%%getVar('dans_cachedir' + %%index)/* r, + %end if +%end for + +%if %%activer_scandir == "oui" + %for %%dir in %%getVar('clam_scan_dir') +%%dir/ r, +%%dir/** r, + + %end for +%end if \ No newline at end of file diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-apt-cacher-ng/dictionaries/00_eole-apt-cacher-ng_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-apt-cacher-ng/dictionaries/00_eole-apt-cacher-ng_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..176790afc148ef2834750bda82cc7e7e259bbd0c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-apt-cacher-ng/dictionaries/00_eole-apt-cacher-ng_packages.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>apt-cacher-ng</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-apt-cacher-ng/dictionaries/05_apt-cacher-ng.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-apt-cacher-ng/dictionaries/05_apt-cacher-ng.xml new file mode 100644 index 0000000000000000000000000000000000000000..458141bc12edee51a272cf4bcffbd56c86a865b4 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-apt-cacher-ng/dictionaries/05_apt-cacher-ng.xml @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="utf-8"?> +<creole> + + <files> + <file name='/etc/apt-cacher-ng/acng.conf' filelist='apt_cacher' /> + <file name='/etc/apt-cacher-ng/backends_eole' filelist='apt_cacher' /> + <file name='/etc/apt-cacher-ng/backends_ubuntu' filelist='apt_cacher' /> + <file name='/etc/systemd/system/apt-cacher-ng.service.d/override.conf' instance_mode='when_container' source="apt-cache-ng.override.conf" mkdir="True" /> + </files> + + <variables> + <family name='services'> + + <variable name='activer_apt_cacher' type='oui/non' mode='expert' + description='Activer le cache APT'> + <value>oui</value> + </variable> + + </family> + + <family name='apt-cacher' mode='expert' icon='debian'> + + <variable name='apt_cacher_port' type='port' + description='Port d’écoute du service apt-cacher-ng'> + <value>3142</value> + </variable> + + </family> + </variables> + + <constraints> + <condition name='disabled_if_in' source='activer_apt_cacher'> + <param>non</param> + <target type='filelist'>apt_cacher</target> + <target type='family'>apt-cacher</target> + </condition> + </constraints> + + <help> + <family name='apt-cacher'>Paramétrage avancé du service de mise en cache des paquets</family> + <variable name='activer_apt_cacher'>Apt-cacher est une solution proxy de mise en cache de paquets Debian</variable> + </help> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-apt-cacher-ng/posttemplates/99-apt-cacher-ng b/seed/release/eole-2.7/2.7.1/applicationservice/eole-apt-cacher-ng/posttemplates/99-apt-cacher-ng new file mode 100644 index 0000000000000000000000000000000000000000..81c4efa77df683658220c3076c2d50384cc486e7 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-apt-cacher-ng/posttemplates/99-apt-cacher-ng @@ -0,0 +1,10 @@ +#!/bin/bash + +if [ $(CreoleGet activer_apt_cacher) = "oui" ]; then + systemctl enable apt-cacher-ng + service apt-cacher-ng restart +else + systemctl disable apt-cacher-ng + service apt-cacher-ng stop +fi +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-apt-cacher-ng/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-apt-cacher-ng/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..86717c1335648b6c2b086888c33aaddfbe773293 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-apt-cacher-ng/service.yml @@ -0,0 +1,42 @@ +format: '0.1' +name: eole-apt-cacher-ng +version: |- + 2.7.0-1 +description: |- + Configuration EOLE pour apt-cacher-ng + Apt-Cacher NG est un mandataire de cache pour le téléchargement de paquets + depuis des dépôts de logiciels dans le style de Debian (ou d'autres types).. + . + Le principe est qu'une machine centrale héberge le mandataire pour un + réseau local. Les clients règlent leur configuration d'APT pour télécharger + sur cette machine. Apt-Cacher NG conserve une copie de toutes les données + utiles transitant à travers lui et, quand une requête similaire est faite, + la copie en cache des données est délivrée sans être téléchargée à nouveau. + . + Apt-Cacher NG a été conçu de zéro en tant que remplacement pour apt-cacher, + mais avec le but de maximiser les échanges pour les systèmes ayant peu de + ressources système. Il peut être utilisé en tant que remplacement pour + apt-proxy et approx sans nécessiter de modifier les fichiers sources.list + des clients. + . + Ce paquet fourni le dictionnaire et les templates EOLE. +depends: [] +packages: + - apt-cacher-ng +dictionaries: + - 05_apt-cacher-ng.xml +extra_dictionaries: {} +templates: + - acng.conf + - apt-cache-ng.override.conf + - backends_eole + - backends_ubuntu +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: + - 99-apt-cacher-ng +files: {} +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-apt-cacher-ng/templates/acng.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-apt-cacher-ng/templates/acng.conf new file mode 100644 index 0000000000000000000000000000000000000000..09ccb408c4f821772dc81e781aab49adbe340505 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-apt-cacher-ng/templates/acng.conf @@ -0,0 +1,64 @@ + +# Letter case in directive names does not matter. Must be separated with colons. +# Valid boolean values are a zero number for false, non-zero numbers for true. + +CacheDir: /var/cache/apt-cacher-ng + +# set empty to disable logging +LogDir: /var/log/apt-cacher-ng + +# place to look for additional configuration and resource files if they are not +# found in the configuration directory +# SupportDir: /usr/lib/apt-cacher-ng + +# TCP (http) port +# Set to 9999 to emulate apt-proxy +Port:%%getVar('apt_cacher_port', 3142) + +# Addresses or hostnames to listen on. Multiple addresses must be separated by +# spaces. Each entry must be an exact local address which is associated with a +# local interface. DNS resolution is performed using getaddrinfo(3) for all +# available protocols (IPv4, IPv6, ...). Using a protocol specific format will +# create binding(s) only on protocol specific socket(s) (e.g. 0.0.0.0 will listen +# only to IPv4). +# +# Default: not set, will listen on all interfaces and protocols +# +%set %%bindaddresses = "localhost" +%if %%getVar('mode_conteneur_actif', 'non') == 'oui' +%set %%bindaddresses += ' ' + %%getVar('adresse_ip_br0', '192.0.2.1') +%end if +BindAddress: %%bindaddresses + +%if %%getVar('activer_proxy_client', 'non') == 'oui' +# The specification of another proxy which shall be used for downloads. +# Username and password are, and see manual for limitations. +# +Proxy: http://%%proxy_client_adresse:%%proxy_client_port +%end if + +# Repository remapping. See manual for details. +# EOLE configuration +# Add backends to list of mirrors and remap to backends +Remap-uburep: file:ubuntu_mirrors /ubuntu file:backends_ubuntu ; file:backends_ubuntu # Ubuntu Archives +Remap-eolerep: file:backends_eole /eole ; file:backends_eole # EOLE archives + +# Virtual page accessible in a web browser to see statistics and status +# information, i.e. under http://localhost:3142/acng-report.html +ReportPage: acng-report.html + +# Forbid all downloads that don't run through preconfigured backends (.where) +#ForceManaged: 0 + +# Days before considering an unreferenced file expired (to be deleted). +# Warning: if the value is set too low and particular index files are not +# available for some days (mirror downtime) there is a risk of deletion of +# still useful package files. +ExTreshold: 4 + +# Arbitrary set of data to append to request headers sent over the wire. Should +# be a well formated HTTP headers part including newlines (DOS style) which +# can be entered as escape sequences (\r\n). +RequestAppendix: X-Tracking-Choice: do-not-track\r\n + +PassThroughPattern: changelogs\.ubuntu\.com diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-apt-cacher-ng/templates/apt-cache-ng.override.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-apt-cacher-ng/templates/apt-cache-ng.override.conf new file mode 100644 index 0000000000000000000000000000000000000000..546e18363956fd764642abd256c3a5d25c5293db --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-apt-cacher-ng/templates/apt-cache-ng.override.conf @@ -0,0 +1,2 @@ +[Unit] +After=lxc-net.service diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-apt-cacher-ng/templates/backends_eole b/seed/release/eole-2.7/2.7.1/applicationservice/eole-apt-cacher-ng/templates/backends_eole new file mode 100644 index 0000000000000000000000000000000000000000..6ae93c05cf5327ea942059102bd045333b746f9f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-apt-cacher-ng/templates/backends_eole @@ -0,0 +1,4 @@ +%set %%default_mirrors = ['eole.ac-dijon.fr', 'ftp.crihan.fr'] +%for %%server in %%getVar('serveur_maj', %%default_mirrors) +http://%%server/eole +%end for diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-apt-cacher-ng/templates/backends_ubuntu b/seed/release/eole-2.7/2.7.1/applicationservice/eole-apt-cacher-ng/templates/backends_ubuntu new file mode 100644 index 0000000000000000000000000000000000000000..f4737d40556fcdd0f034cf41011acc4cf5bfba57 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-apt-cacher-ng/templates/backends_ubuntu @@ -0,0 +1,4 @@ +%set %%default_mirrors = ['eole.ac-dijon.fr', 'ftp.crihan.fr'] +%for %%server in %%getVar('ubuntu_update_mirrors', %%default_mirrors) +http://%%server/ubuntu +%end for diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos-mysql/dictionaries/00_eole-bareos-mysql_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos-mysql/dictionaries/00_eole-bareos-mysql_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..41a37a0e228a8b1104770f3c14da647e5c73905b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos-mysql/dictionaries/00_eole-bareos-mysql_packages.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>bareos-database-mysql</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos-mysql/dictionaries/24_bareos-mysql.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos-mysql/dictionaries/24_bareos-mysql.xml new file mode 100644 index 0000000000000000000000000000000000000000..5c083868dc1ef520ac3af864292a174cd80a856f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos-mysql/dictionaries/24_bareos-mysql.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files/> + + <variables/> + + <constraints> + <check name='valid_enum' target='bareos_db_type'> + <param>['mysql', 'sqlite3']</param> + </check> + </constraints> + + <help/> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos-mysql/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos-mysql/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..581ea25a144f6a1fdff476079d747f6968fe9347 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos-mysql/service.yml @@ -0,0 +1,27 @@ +format: '0.1' +name: eole-bareos-mysql +version: |- + 2.7.1-2 +description: |- + Configuration (dictionnaire et templates) et Scripts bareos avec support de mysql pour les modules Eole + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: + - eole-bareos + - eole-web + - eole-mysql + - eole-bareoswebui +packages: + - bareos-database-mysql +dictionaries: + - 24_bareos-mysql.xml +extra_dictionaries: {} +templates: [] +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: [] +files: {} +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/dictionaries/00_eole-bareos_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/dictionaries/00_eole-bareos_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..d878d26acdae37eaa1994500475b95d2d600c1dc --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/dictionaries/00_eole-bareos_packages.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>creole</package> + <package>eole-bareos-pkg</package> + <package>python-pyeole</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/dictionaries/23_bareos.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/dictionaries/23_bareos.xml new file mode 100644 index 0000000000000000000000000000000000000000..8e0f5b542c49b35cef1bbda3e04702cd6f3d3cdc --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/dictionaries/23_bareos.xml @@ -0,0 +1,411 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + <service servicelist="bareos">bareos-director</service> + <service servicelist="bareos_fd">bareos-filedaemon</service> + <service servicelist="bareos_sd">bareos-storage</service> + <service_access service='bareos_sd'> + <port>9103</port> + <tcpwrapper tcpwrapper_type='SymLinkOption'>bareos_sd_name</tcpwrapper> + </service_access> + <service_restriction service='bareos_sd'> + <ip interface='auto' ip_type='SymLinkOption'>bareos_sd_address_fd</ip> + <ip interface='auto' ip_type='SymLinkOption'>bareos_sd_remote_dir_ip</ip> + <ip interface='auto' ip_type='SymLinkOption'>bareos_fd_remote_dir_address</ip> + </service_restriction> + <service_access service='bareos-fd'> + <port>9102</port> + <tcpwrapper tcpwrapper_type='SymLinkOption'>bareos_fd_name</tcpwrapper> + </service_access> + <service_restriction service='bareos-fd'> + <ip interface='eth0' ip_type='SymLinkOption'>bareos_fd_remote_dir_address</ip> + </service_restriction> + + <file filelist="bareos" name='/etc/bareos/query.sql'/> + <file filelist="bareos" name='/etc/bareos/include-options.conf'/> + <file filelist="bareos_fd" name='/etc/bareos/bareos-fd.conf' source='bareos-fd.conf'/> + <file filelist="bareos_sd" name='/etc/bareos/bareos-sd.conf' source='bareos-sd.conf'/> + <file filelist="bareos" name='/etc/bareos/bareos-dir.conf' source='bareos-dir.conf'/> + <file filelist="bareos" name='/etc/sudoers.d/bareos' source='bareos.sudoers' mode="0440" rm='True'/> + <file filelist="bareos" name='/etc/bareos/bconsole.conf'/> + <file filelist="bareos" name='/etc/bareos/bareossupport.conf'/> + <file filelist="bareos" name='/etc/bareos/bareosschedulepre.conf'/> + <file filelist="bareos_dir_fd" name='/etc/bareos/bareosschedule.conf'/> + <file filelist="bareos" name='/etc/bareos/bareosschedulepost.conf'/> + <file filelist="bareos" name='/etc/bareos/bareos-restore.conf'/> + <file filelist="bareos" name='/etc/bareos/bat.conf'/> + <file filelist="bareos" name='/etc/bareos/bareos-config-lib.sh' mode="0440" group='bareos'/> + <file name='/etc/logrotate.d/bareos-common' source='bareos-common.logrotate'/> + <file filelist="bareos_dir_fd" name='/etc/bareos/bareosfichiers.d/ead_extra.conf' source="bareos_ead_extra.conf"/> + <file filelist="bareos_fd_remote" name='bareos_dir_remote_fd_extra' name_type="SymLinkOption" source="bareos_ead_extra_remote.conf" mkdir="True"/> + <file filelist="bareos_fd_remote" name='bareos_dir_remote_fd_schedule' name_type="SymLinkOption" source="bareosschedule_remote.conf" mkdir="True"/> + </files> + + <variables> + <family name='services'> + <variable name='activer_bareos_dir' type='oui/non' description="Activer le directeur de sauvegarde"> + <value>oui</value> + </variable> + <variable name='activer_bareos_sd' type='oui/non' description="Activer le stockage de sauvegarde"/> + <variable name='activer_bareos_fd' type='oui/non' description="Activer la sauvegarde des fichiers locaux" mode="expert"/> + <variable name='local_bareos_fd_needed' type='oui/non' description='Variable intermédiaire pour gérer la désactivation de la configuration' hidden='True'/> + </family> + <family name='directeur bareos' icon='archive'> + <variable name='bareos_db_type' type='string' description='Type de la base de données du catalogue' auto_freeze='True' mandatory='True' /> + <variable name='bareos_db_extract_dir' type='filename' description="Répertoire d'extraction de la base de données du catalogue" mode="expert"> + <value>/var/lib/bareos</value> + </variable> + <variable name='bareos_db_mysql_password' type='password' description="Mot de passe de la base de données MySQL de la sauvegarde" auto_freeze='True' mandatory="True" mode="expert"/> + <variable name='bareos_dir_name' type='string' description='Nom du directeur local' auto_freeze='True' mandatory='True'/> + + <!-- configuration de la rétention --> + <!-- pool Full --> + <variable name='bareos_full_retention' type='number' description='Période de rétention des sauvegardes complètes' mandatory='True'> + <value>6</value> + </variable> + <variable name='bareos_full_retention_unit' type='string' description='Unité de valeur pour la rétention des sauvegardes complètes'> + <value>months</value> + </variable> + <!-- pool Diff --> + <variable name='bareos_diff_retention' type='number' description='Période de rétention des sauvegardes différentielles' mandatory='True'> + <value>5</value> + </variable> + <variable name='bareos_diff_retention_unit' type='string' description='Unité de valeur pour la rétention des sauvegardes différentielles'> + <value>weeks</value> + </variable> + <!-- pool Inc --> + <variable name='bareos_inc_retention' type='number' description='Période de rétention des sauvegardes incrémentales' mandatory='True'> + <value>10</value> + </variable> + <variable name='bareos_inc_retention_unit' type='string' description='Unité de valeur pour la rétention des sauvegardes incrémentales'> + <value>days</value> + </variable> + + <!-- Options bareos-dir --> + <variable name='bareos_max_run_time' type='number' description="Durée maximale pour l'exécution complète d'une sauvegarde (en secondes)" mode="expert"> + <value>86400</value> + </variable> + <variable name='bareos_compression' type='string' description='Niveau de compression des sauvegardes' mode="expert"> + <value>GZIP6</value> + </variable> + <variable name='bareos_dir_password' type='password' description='Mot de passe du directeur' mode="expert" auto_save='True'/> + + <!-- Configuration du storage daemon utilisé par le directeur local --> + <variable name="bareos_dir_use_local_sd" type='oui/non' description='Utiliser le gestionnaire de stockage local'/> + <variable name="bareos_dir_sd_name" type='string' description='Nom du serveur de stockage utilisé par le directeur' mandatory='True' hidden='True'/> + <variable name="bareos_dir_remote_sd_name" type='string' description='Nom du serveur de stockage distant' mandatory='True'/> + <variable name='bareos_dir_sd_address' type='domain' description='Adresse du serveur de stockage utilisé par le directeur' mandatory='True' hidden='True'/> + <variable name='bareos_dir_remote_sd_address' type='domain' description='Adresse du serveur de stockage distant' mandatory='True'/> + <variable name='bareos_dir_sd_password' type='password' description='Mot de passe du serveur de stockage utilisé par le directeur' mandatory='True' hidden='True'/> + <variable name='bareos_dir_remote_sd_password' type='password' description='Mot de passe pour la connexion au serveur de stockage distant' mandatory='True'/> + + <!-- Configuration des clients distant --> + <variable name="bareos_dir_set_remote_fds" type='oui/non' description='Configurer la sauvegarde de fichiers distants' > + <value>non</value> + </variable> + + <variable name='bareos_dir_remote_fd_name' type='string' description='Identifiant du client distant' mandatory='True' multi='True'/> + <variable name='bareos_dir_remote_fd_display_name' type='string' description='Nom du client distant' mandatory='True' multi='True'/> + <variable name='bareos_dir_remote_fd_address' type='domain' description='Adresse du client distant' mandatory='True'/> + <variable name='bareos_dir_remote_fd_password' type='password' description='Mot de passe du client distant' mandatory='True'/> + <variable name='bareos_dir_remote_fd_schedule' type='filename' description='Nom du fichier schedule à généré' multi='True'/> + <variable name='bareos_dir_remote_fd_extra' type='filename' description='Nom du fichier schedule à généré' multi='True'/> + </family> + <family name="stockage bareos" icon='archive'> + <!-- Configuration du Storage daemon local (sauvegarde sur disque local ou périphérique monté en local) --> + <variable name='bareos_sd_name' type='string' description='Nom du serveur de stockage' mandatory='True'/> + + <variable name='bareos_sd_address_fd' type='domain' description='Adresse du serveur de stockage distant calculé pour les clients'/> + <variable name='bareos_sd_password' type='password' description='Mot de passe pour le serveur de stockage Bareos' mandatory='True' auto_save='True'/> + <!-- Configuration des directeurs distants --> + <variable name='bareos_sd_set_remote_dirs' type='oui/non' description='Configurer les services directeurs distants autoriser à utiliser le service de stockage local'> + <value>non</value> + </variable> + <variable name='bareos_sd_remote_dir_name' type='string' description='Nom du directeur Bareos distant' multi='True' mandatory='True'/> + <variable name='bareos_sd_remote_dir_ip' type='domain' description='Adresse IP du directeur distant' mandatory='True'/> + <variable name='bareos_sd_remote_dir_password' type='password' description='Mot de passe Bareos distant' mandatory='True'/> + + </family> + <family name="client bareos" icon='archive'> + <!-- Configuration du client local --> + <variable name='bareos_fd_name' type='string' description='Nom du service de sauvegarde des fichiers locaux' mode="expert"/> + <variable name='bareos_fd_remote_dir_address' type='domain' description='Adresse du directeur Bareos distant' mandatory='True'/> + <variable name='bareos_fd_remote_dir_name' type='string' description='Nom du directeur Bareos distant' mandatory='True'/> + <variable name='bareos_fd_remote_dir_password' type='password' description='Mot de passe Bareos distant' mandatory='True'/> + + </family> + + <separators> + <separator name='bareos_dir_use_local_sd'>Gestion du stockage</separator> + <separator name='bareos_sd_set_remote_dirs'>Configuration des accès distants au stockage</separator> + <separator name='bareos_dir_set_remote_fds'>Configuration de la sauvegarde de fichiers distants</separator> + <separator name='bareos_fd_remote_dir_address'>Configuration de l'accès du directeur distant</separator> + </separators> + </variables> + + <constraints> + <check name='valid_regexp' target='bareos_dir_remote_fd_name'> + <param>^[A-Za-z_][A-Za-z0-9_]+$</param> + <param name='err_msg'>L’identifiant du client ne peut être composé que de caractères alphanumériques et du caractère _ et ne peut pas commencer par un chiffre.</param> + </check> + <check name='valid_enum' target='bareos_db_type'> + <param>['sqlite3']</param> + </check> + <check name='valid_enum' target='bareos_full_retention_unit'> + <param>['years', 'months', 'weeks', 'days']</param> + </check> + <check name='valid_enum' target='bareos_diff_retention_unit'> + <param>['years', 'months', 'weeks', 'days']</param> + </check> + <check name='valid_enum' target='bareos_inc_retention_unit'> + <param>['years', 'months', 'weeks', 'days']</param> + </check> + <check name='valid_enum' target='bareos_compression'> + <param>['Aucune', 'GZIP1', 'GZIP2', 'GZIP3', 'GZIP4', 'GZIP5', 'GZIP6', 'GZIP7', 'GZIP8', 'GZIP9']</param> + </check> + <fill name="auto_copy_val" target="activer_bareos_sd"> + <param type="eole">activer_bareos_dir</param> + </fill> + <fill name="auto_copy_val" target="activer_bareos_fd"> + <param type="eole">activer_bareos_dir</param> + </fill> + <auto name='calc_multi_condition' target='local_bareos_fd_needed'> + <param>non</param> + <param type='eole' name='condition_1'>activer_bareos_dir</param> + <param type='eole' name='condition_2'>activer_bareos_fd</param> + <param name='match'>non</param> + <param name='mismatch'>oui</param> + </auto> + <fill name="concat" target='bareos_dir_name'> + <param type='eole' name='valeur1'>nom_machine</param> + <param name='valeur2'>-dir</param> + </fill> + <fill name='calc_multi_condition' target='bareos_sd_set_remote_dirs'> + <param>['non', 'oui']</param> + <param name='condition_1' type='eole'>activer_bareos_dir</param> + <param name='condition_2' type='eole'>activer_bareos_sd</param> + <param name='match'>oui</param> + </fill> + <fill name="concat" target="bareos_sd_name"> + <param type='eole' name='valeur1'>nom_machine</param> + <param name='valeur2'>-sd</param> + </fill> + <fill name="concat" target='bareos_fd_name'> + <param type='eole' name='valeur1'>nom_machine</param> + <param name='valeur2'>_fd</param> + </fill> + <auto name="concat" target="bareos_dir_remote_fd_schedule"> + <param>/etc/bareos/</param> + <param type="eole">bareos_dir_remote_fd_name</param> + <param>/bareosschedule.conf</param> + </auto> + <auto name="concat" target="bareos_dir_remote_fd_extra"> + <param>/etc/bareos/</param> + <param type="eole">bareos_dir_remote_fd_name</param> + <param>/bareosfichiers.d/ead_extra.conf</param> + </auto> + + <group master='bareos_sd_remote_dir_name'> + <slave>bareos_sd_remote_dir_ip</slave> + <slave>bareos_sd_remote_dir_password</slave> + </group> + + <group master='bareos_dir_remote_client_name'> + <slave>bareos_dir_remote_client_password</slave> + <slave>bareos_dir_remote_ip</slave> + </group> + + <group master ='bareos_dir_remote_fd_name'> + <slave>bareos_dir_remote_fd_display_name</slave> + <slave>bareos_dir_remote_fd_address</slave> + <slave>bareos_dir_remote_fd_password</slave> + <slave>bareos_dir_remote_fd_schedule</slave> + <slave>bareos_dir_remote_fd_extra</slave> + </group> + + <condition name='disabled_if_in' source='activer_bareos_dir'> + <param>non</param> + <target type='family'>directeur bareos</target> + <target type='filelist'>bareos</target> + <target type='servicelist'>bareos</target> + <target type='variable'>bareos_sd_password</target> + </condition> + <condition name='disabled_if_in' source='local_bareos_fd_needed'> + <param>non</param> + <target type='filelist'>bareos_fd</target> + <target type='family'>client bareos</target> + <target type='servicelist'>bareos_fd</target> + </condition> + <condition name='disabled_if_not_in' source='bareos_db_type'> + <param>mysql</param> + <target>bareos_db_mysql_password</target> + </condition> + <condition name='disabled_if_in' source='activer_bareos_sd'> + <param>non</param> + <target type='family'>stockage bareos</target> + <target type='variable'>bareos_sd_set_remote_dirs</target> + <target type='filelist'>bareos_sd</target> + <target type='servicelist'>bareos_sd</target> + </condition> + <condition name='disabled_if_in' source='bareos_sd_set_remote_dirs'> + <param>non</param> + <target type='variable'>bareos_sd_remote_dir_name</target> + <target type='variable'>bareos_sd_remote_dir_ip</target> + </condition> + <condition name='disabled_if_in' source='activer_bareos_dir'> + <param>non</param> + <target type='filelist'>bareos_dir_fd</target> + </condition> + <condition name='disabled_if_in' source='activer_bareos_fd'> + <param>non</param> + <target type='filelist'>bareos_dir_fd</target> + </condition> + <condition name='disabled_if_in' source='bareos_dir_set_remote_fds'> + <param>non</param> + <target type='filelist'>bareos_fd_remote</target> + <target type='variable'>bareos_dir_remote_fd_name</target> + <target type='variable'>bareos_dir_remote_fd_address</target> + <target type='variable'>bareos_dir_remote_fd_password</target> + </condition> + <condition name='disabled_if_in' source='bareos_dir_set_remote_fds'> + <param>oui</param> + <target type='filelist'>cronschedule</target> + </condition> + <condition name='disabled_if_in' source='activer_bareos_dir'> + <param>non</param> + <target type='variable'>bareos_dir_sd_address</target> + <target type='variable'>bareos_sd_address_fd</target> + </condition> + + <fill name='gen_random' target='bareos_db_mysql_password'/> + <fill name='gen_random' target='bareos_dir_password'/> + <fill name='gen_random' target='bareos_sd_password'/> + <!-- Si activer_bareos_sd == 'oui' on veut que la valeur par défaut de bareos_dir_use_local_sd soit aussi 'oui' + si activer_bareos_sd == 'non', la valeur de bareos_dir_use_local_sd ne peut être que "non"--> + <fill name='calc_val' target='bareos_dir_use_local_sd'> + <param type='eole' name='valeur'>activer_bareos_sd</param> + </fill> + <condition name='frozen_if_in' source='activer_bareos_sd'> + <param>non</param> + <target type='variable'>bareos_dir_use_local_sd</target> + </condition> + + <condition name="frozen_if_in" source ="activer_bareos_fd"> + <param>non</param> + <target type="variable">bareos_dir_set_remote_fds</target> + <target type="variable">bareos_fd_name</target> + <target type='variable'>bareos_fd_remote_dir_address</target> + <target type='variable'>bareos_fd_remote_dir_name</target> + <target type='variable'>bareos_fd_remote_dir_password</target> + </condition> + + <fill name='calc_multi_condition' target='bareos_dir_set_remote_fds'> + <param>non</param> + <param type='eole' name='condition_1'>activer_bareos_fd</param> + <param name='match'>oui</param> + <param name='mismatch'>non</param> + </fill> + <condition name='disabled_if_in' source='bareos_dir_set_remote_fds'> + <param>non</param> + <target type='variable'>bareos_dir_remote_fd_name</target> + </condition> + + <condition name='frozen_if_in' source='activer_bareos_dir'> + <param>oui</param> + <target type='variable'>bareos_fd_remote_dir_name</target> + <target type='variable'>bareos_fd_remote_dir_address</target> + <target type='variable'>bareos_fd_remote_dir_password</target> + </condition> + <auto name='calc_multi_condition' target='bareos_sd_address_fd'> + <param>non</param> + <param type='eole' name='condition_1'>bareos_dir_set_remote_fds</param> + <param name='match'>127.0.0.1</param> + <param type='eole' name='mismatch'>adresse_ip_eth0</param> + </auto> + <condition name='disabled_if_in' source='bareos_dir_use_local_sd'> + <param>oui</param> + <target type='variable'>bareos_dir_remote_sd_name</target> + <target type='variable'>bareos_dir_remote_sd_address</target> + <target type='variable'>bareos_dir_remote_sd_password</target> + </condition> + <auto name='calc_multi_condition' target='bareos_dir_sd_name'> + <param>oui</param> + <param type='eole' name='condition_1'>bareos_dir_use_local_sd</param> + <param type='eole' name='match' hidden='False'>bareos_sd_name</param> + <param type='eole' name='mismatch' hidden='False'>bareos_dir_remote_sd_name</param> + <param name='default_mismatch'>None</param> + </auto> + <auto name='calc_multi_condition' target='bareos_dir_sd_address'> + <param>oui</param> + <param type='eole' name='condition_1'>bareos_dir_use_local_sd</param> + <param type='eole' name='match' hidden='False'>bareos_sd_address_fd</param> + <param type='eole' name='mismatch' hidden='False'>bareos_dir_remote_sd_address</param> + <param name='default_mismatch'>None</param> + </auto> + <auto name='calc_multi_condition' target='bareos_dir_sd_password'> + <param>oui</param> + <param type='eole' name='condition_1'>bareos_dir_use_local_sd</param> + <param type='eole' name='match' hidden='False'>bareos_sd_password</param> + <param type='eole' name='mismatch' hidden='False'>bareos_dir_remote_sd_password</param> + <param name='default_mismatch'>None</param> + </auto> + <fill name='calc_multi_condition' target='bareos_fd_remote_dir_name'> + <param>oui</param> + <param type='eole' name='condition_1'>activer_bareos_dir</param> + <param type='eole' hidden='False' name='match'>bareos_dir_name</param> + <param name='default_mismatch'>None</param> + </fill> + <fill name='calc_multi_condition' target='bareos_fd_remote_dir_address'> + <param>oui</param> + <param type='eole' name='condition_1'>activer_bareos_dir</param> + <param name='match'>127.0.0.1</param> + <param name='default_mismatch'>None</param> + + </fill> + <fill name='calc_multi_condition' target='bareos_fd_remote_dir_password'> + <param>oui</param> + <param type='eole' name='condition_1'>activer_bareos_dir</param> + <param type='eole' hidden='False' name='match'>bareos_dir_password</param> + <param name='default_mismatch'>None</param> + </fill> + </constraints> + + <help> + <!-- Services --> + <variable name='activer_bareos_dir'>Permet d'activer le service bareos-dir (Directeur Bareos)</variable> + <variable name='activer_bareos_sd'>Permet d'activer le service bareos-sd (Stockage Bareos)</variable> + <variable name='activer_bareos_fd'>Permet d'activer le service bareos-fd (Client Bareos)</variable> + <!-- Directeur bareos --> + <family name='Directeur bareos'>Configuration du serveur de sauvegarde</family> + <variable name='bareos_dir_name'>Nom identifiant le service bareos-dir</variable> + <variable name='bareos_full_retention'>Durée pendant laquelle le contenu des sauvegardes complètes est conservé avant écrasement</variable> + <variable name='bareos_full_retention_unit'>Unité de la durée de rétention pour les sauvegardes complètes</variable> + <variable name='bareos_diff_retention'>Durée pendant laquelle le contenu des sauvegardes différentielles est conservé avant écrasement</variable> + <variable name='bareos_diff_retention_unit'>Unité de la durée de rétention pour les sauvegardes différentielles</variable> + <variable name='bareos_inc_retention'>Durée pendant laquelle le contenu des sauvegardes incrémentales est conservé avant écrasement</variable> + <variable name='bareos_inc_retention_unit'>Unité de la durée de rétention pour les sauvegardes incrémentales</variable> + <variable name='bareos_max_run_time'>Spécifie le délai, en secondes, alloué pour l'exécution complète d'un job depuis son lancement (pas nécessairement à l'heure de sa programmation) jusqu'à sa fin (0 pour pas de limite)</variable> + <variable name='bareos_compression'>Niveau de compression gzip appliqué aux données sauvegardées</variable> + <variable name='bareos_dir_password'>Mot de passe à transmettre aux applications distantes pour leur permettre de s'authentifier auprès du directeur</variable> + <variable name='bareos_dir_use_local_sd'>Choix du service bareos-sd gérant l'écriture des volumes de sauvegardes</variable> + <variable name='bareos_dir_sd_address'>Adresse du service bareos-sd gérant l'écriture des volumes de sauvegardes</variable> + <variable name='bareos_dir_sd_password'>Mot de passe permettant d'identifier le service bareos-sd du serveur distant (ressource Storage de la configuration du service bareos-dir local)</variable> + <variable name='bareos_dir_set_remote_fds'>Permet de déclarer des clients distants afin de gérer la sauvegarde des fichiers d’autres serveurs</variable> + <!-- Stockage bareos --> + <family name='Stockage bareos'>Configuration du service bareos-sd</family> + <!-- client bareos --> + <family name='client bareos'>Configuration du client bareos-fd</family> + <variable name='bareos_sd_remote_dir_name'>Nom du service bareos-dir du serveur distant à sauvegarder</variable> + <variable name='bareos_sd_remote_dir_ip'>Adresse du serveur distant à sauvegarder</variable> + <variable name='bareos_sd_remote_dir_password'>Mot de passe permettant d'identifier le service bareos-dir du serveur distant à sauvegarder (ressource Director de la configuration du service bareos-sd local)</variable> + <!-- clients distants --> + <variable name='bareos_dir_remote_fd_display_name'>Nom du service bareos-fd du client distant</variable> + <variable name='bareos_dir_remote_fd_address'>Adresse IP ou nom d'hôte du client distant</variable> + <variable name='bareos_dir_remote_fd_password'>Mot de passe permettant d'identifier le service bareos-fd du client distant</variable> + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/extra_dictionaries/backuponce/00_action.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/extra_dictionaries/backuponce/00_action.xml new file mode 100644 index 0000000000000000000000000000000000000000..eb7bec9ec2780463e79d4ea72be9c0c66a1ba338 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/extra_dictionaries/backuponce/00_action.xml @@ -0,0 +1,74 @@ +<?xml version="1.0" encoding="utf-8"?> +<creole> + <family_action name="Sauvegarde"> + <action type="form" + title="Exécuter une sauvegarde" + description="Exécuter une sauvegarde (maintenant ou programmée)" + image="icons/x-office-calendar.svg" + actionlist="backuponce"> + <input>Exécuter</input> + <profile>ead_admin</profile> + <ewtapp>ead</ewtapp> + <tag>sauvegarde</tag> + </action> + </family_action> + <variables> + <family name='Sauvegarde' description="Exécuter une sauvegarde"> + <variable description="Programmation" type="string" name="type"> + <value>now</value> + </variable> + <variable description="Type de sauvegarde" type="string" name="option"> + <value>Full</value> + </variable> + <variable description="Sauvegarde des fichiers locaux" type="oui/non" name="local" mandatory="True"/> + <variable description="Client" type="string" name="client" mandatory="True"/> + <variable description="Heure" name='hour' type='number' mandatory="True"/> + <variable description="Minute" name='minute' type='number' mandatory="True"/> + <variable description="Jour" name='day' type='date' mandatory="True"/> + </family> + </variables> + <constraints> + <check name='valid_enum' target='backuponce.sauvegarde.type'> + <param>['now', 'later']</param> + </check> + <check name='valid_enum' target='backuponce.sauvegarde.option'> + <param>['Full', 'Differential', 'Incremental']</param> + </check> + <check name='valid_enum' target='backuponce.sauvegarde.client'> + <param type='eole'>bareos_dir_remote_fd_name</param> + </check> + <fill name='calc_val' target='backuponce.sauvegarde.local'> + <param type='eole' name='valeur'>activer_bareos_fd</param> + </fill> + <condition name ='frozen_if_in' source='bareos_dir_set_remote_fds'> + <param>non</param> + <target type='variable'>backuponce.sauvegarde.local</target> + </condition> + <condition name ='frozen_if_in' source='activer_bareos_fd'> + <param>non</param> + <target type='variable'>backuponce.sauvegarde.local</target> + </condition> + <condition name ='disabled_if_in' source='backuponce.sauvegarde.local'> + <param>oui</param> + <target type='variable'>backuponce.sauvegarde.client</target> + </condition> + <condition name ='disabled_if_not_in' source='backuponce.sauvegarde.type'> + <param>later</param> + <target type='variable'>backuponce.sauvegarde.hour</target> + <target type='variable'>backuponce.sauvegarde.minute</target> + <target type='variable'>backuponce.sauvegarde.day</target> + </condition> + <check name='valid_enum' target='backuponce.sauvegarde.hour'> + <param type='python'>range(0, 24)</param> + </check> + <check name='valid_enum' target='backuponce.sauvegarde.minute'> + <param type='python'>range(0, 60)</param> + </check> + <condition name ='disabled_if_in' source='activer_bareos_dir'> + <param>non</param> + <target type='actionlist'>backuponce</target> + <target type='family'>backuponce.sauvegarde</target> + </condition> + </constraints> + <help/> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/extra_dictionaries/backupreport/00_action.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/extra_dictionaries/backupreport/00_action.xml new file mode 100644 index 0000000000000000000000000000000000000000..3deeb1d4de9552c6eb4dc5d6de9dba115da701d8 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/extra_dictionaries/backupreport/00_action.xml @@ -0,0 +1,32 @@ +<creole> + <family_action name="Sauvegarde"> + <action type="reader" + title="Rapport de sauvegarde" + description="Visualiser le journal de la dernière sauvegarde" + image="icons/edit-find.svg" + actionlist="backupreport"> + <profile>ead_admin</profile> + <ewtapp>ead</ewtapp> + <tag>log</tag> + <tag>sauvegarde</tag> + </action> + </family_action> + <variables> + <family name="options" + description="Dernière sauvegarde"> + <variable name="filename" type="filename"> + <value>/var/lib/eole/reports/rapport-bareos.txt</value> + </variable> + <variable name="language" type="string"> + <value>prolog</value> + </variable> + </family> + </variables> + <constraints> + <condition name ='disabled_if_in' source='activer_bareos_dir'> + <param>non</param> + <target type='actionlist'>backupreport</target> + </condition> + </constraints> + <help/> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/extra_dictionaries/bareos/00_bareos.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/extra_dictionaries/bareos/00_bareos.xml new file mode 100644 index 0000000000000000000000000000000000000000..b9e7d89cf9a5a7544c00437f9ca52bdd528e1c32 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/extra_dictionaries/bareos/00_bareos.xml @@ -0,0 +1,100 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + <family_action name="Sauvegarde" + description="Gestion de la sauvegarde" + color="#99e6ff" + image="icons/media-floppy.svg"> + <action type="form" + save="True" + title="Configurer la sauvegarde" + description="Configurer la sauvegarde (type de support, notification par courrier électronique, programmation)" + image="configuration.svg" + actionlist="bareos"> + <profile>ead_admin</profile> + <ewtapp>ead</ewtapp> + <input>Configurer</input> + <tag>configuration</tag> + <tag>sauvegarde</tag> + </action> + </family_action> + <variables> + <family name="monitor" description="Moniteur" hidden="True"> + <variable name='bareos_mon_password' auto_freeze='True'/> + </family> + <family name="support" description="Support de sauvegarde"> + <variable name="support_type" description="Choix du type de support"> + <value>none</value> + </variable> + <variable name='smb_machine' description="Nom de machine du serveur SMB" type='hostname' mandatory='True'/> + <variable name='smb_ip' description="IP du serveur SMB" type='ip' mandatory='True'/> + <variable name='smb_partage' description="Nom du partage SMB" type='string' mandatory='True'/> + <variable name='smb_login' description="Identifiant SMB" type='string'/> + <variable name='smb_password' description="Mot de passe SMB" type='password'/> + <variable name='usb_path' description="Chemin USB" type='filename' mandatory='True'/> + </family> + <family name='mail' description="Directeur"> + <variable name='mail_ok' description="Adresse pour notifier les sauvegardes réussies" type='mail' multi='True'/> + <variable name='mail_error' description="Adresse pour notifier les sauvegardes échouées" type='mail' multi='True'/> + </family> + <family name='job' description="Sauvegarde des fichiers locaux"> + <variable name='job_type' description="Fréquence de sauvegarde" multi='True'/> + <variable name='day' description="Nuit d'exécution de la sauvegarde" mandatory="True"/> + <variable name='end_day' description="Nuit de fin d'exécution de la sauvegarde" mandatory="True"/> + <variable name='hour' description="Heure de lancement de la sauvegarde" mandatory="True"/> + <variable name='level' description="Type de sauvegarde" mandatory="True"/> + </family> + </variables> + <constraints> + <check name='valid_enum' target='bareos.support.support_type'> + <param>['none', 'manual', 'usb', 'smb']</param> + </check> + <check name='valid_enum' target='bareos.job.job_type.level'> + <param>['Full', 'Incremental', 'Differential']</param> + </check> + <check name='valid_enum' target='bareos.job.job_type.job_type'> + <param>['monthly', 'weekly', 'daily']</param> + </check> + <check name='valid_enum' target='bareos.job.job_type.day'> + <param>['1', '2', '3', '4', '5', '6', '7']</param> + </check> + <check name='valid_enum' target='bareos.job.job_type.end_day'> + <param>['1', '2', '3', '4', '5', '6', '7']</param> + </check> + <check name='valid_enum' target='bareos.job.job_type.hour'> + <param>['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23']</param> + </check> + <fill name='gen_random' target='bareos.monitor.bareos_mon_password'/> + <condition name='disabled_if_not_in' source='bareos.support.support_type'> + <param>smb</param> + <target type='variable'>bareos.support.smb_login</target> + <target type='variable'>bareos.support.smb_password</target> + <target type='variable'>bareos.support.smb_machine</target> + <target type='variable'>bareos.support.smb_ip</target> + <target type='variable'>bareos.support.smb_partage</target> + </condition> + <condition name='disabled_if_not_in' source='bareos.support.support_type'> + <param>usb</param> + <target type='variable'>bareos.support.usb_path</target> + </condition> + <condition name='disabled_if_not_in' source='bareos.job.job_type.job_type'> + <param>daily</param> + <target type='variable'>bareos.job.job_type.end_day</target> + </condition> + <group master="bareos.job.job_type" description="Programmation automatique"> + <slave>day</slave> + <slave>end_day</slave> + <slave>hour</slave> + <slave>level</slave> + </group> + <condition name ='disabled_if_in' source='activer_bareos_dir'> + <param>non</param> + <target type='actionlist'>bareos</target> + </condition> + <condition name ='disabled_if_in' source='activer_bareos_fd'> + <param>non</param> + <target type='family'>bareos.job</target> + </condition> + </constraints> + <help/> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/extra_dictionaries/bareosfilesselection/00_bareosfilesselection.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/extra_dictionaries/bareosfilesselection/00_bareosfilesselection.xml new file mode 100644 index 0000000000000000000000000000000000000000..becb095361b3a07f5dd2001c48346fb8212eb4f9 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/extra_dictionaries/bareosfilesselection/00_bareosfilesselection.xml @@ -0,0 +1,46 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + <family_action name="Sauvegarde"> + <action type="form" + save="True" + title="Fichiers complémentaires" + description="Ajouter une liste de fichier complémentaire à sauvegarder" + image="icons/document-properties.svg" + actionlist="bareosfilesselection"> + <profile>ead_admin</profile> + <ewtapp>ead</ewtapp> + <input>Configurer</input> + <tag>configuration</tag> + <tag>sauvegarde</tag> + <tag>distant</tag> + </action> + </family_action> + <variables> + <family name='extra_files' description="Fichiers complémentaires locaux"> + <variable name='extra_includes' description="Nom des fichiers complémentaires à sauvegarde" type="filename" multi='True'/> + <variable name='extra_excludes' description="Nom des fichiers complémentaires à exclure" multi="True"/> + <variable name='extra_excludes_regexp' description="Expression rationnelle d'exclusion" multi="True"/> + </family> + <family name='extra_files_' description="Fichiers complémentaires pour " dynamic="bareos_dir_remote_fd_name"> + <variable name='extra_includes_' description="Nom des fichiers complémentaires à sauvegarde" type="filename" multi='True'/> + <variable name='extra_excludes_' description="Nom des fichiers complémentaires à exclure" multi="True"/> + <variable name='extra_excludes_regexp_' description="Expression rationnelle d'exclusion" multi="True"/> + </family> + </variables> + <constraints> + <condition name='disabled_if_in' source='activer_bareos_fd'> + <param>non</param> + <target type='family'>bareosfilesselection.extra_files</target> + </condition> + <condition name='disabled_if_in' source='bareos_dir_set_remote_fds'> + <param>non</param> + <target type='family'>bareosfilesselection.extra_files_</target> + </condition> + <condition name='disabled_if_in' source='activer_bareos_dir'> + <param>non</param> + <target type='actionlist'>bareosfilesselection</target> + </condition> + </constraints> + <help/> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/extra_dictionaries/bareosremoteclient/00_bareosremoteclient.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/extra_dictionaries/bareosremoteclient/00_bareosremoteclient.xml new file mode 100644 index 0000000000000000000000000000000000000000..9de7d33e582e03f997ecc9a6a4f95dc749542773 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/extra_dictionaries/bareosremoteclient/00_bareosremoteclient.xml @@ -0,0 +1,60 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + <family_action name="Sauvegarde"> + <action type="form" + save="True" + title="Programmer les clients distants" + description="Configurer la programmation des sauvegardes sur les clients distants" + image="configuration.svg" + actionlist="bareos_fd_remote"> + <profile>ead_admin</profile> + <ewtapp>ead</ewtapp> + <input>Configurer</input> + <tag>configuration</tag> + <tag>sauvegarde</tag> + <tag>distant</tag> + </action> + </family_action> + <variables> + <family name='job_' description="Programmation pour " dynamic="bareos_dir_remote_fd_name"> + <variable name='job_type_' description="Fréquence de sauvegarde" multi='True'/> + <variable name='day_' description="Nuit d'exécution de la sauvegarde" mandatory="True"/> + <variable name='end_day_' description="Nuit de fin d'exécution de la sauvegarde" mandatory="True"/> + <variable name='hour_' description="Heure de lancement de la sauvegarde" mandatory="True"/> + <variable name='level_' description="Type de sauvegarde" mandatory="True"/> + </family> + </variables> + <constraints> + <check name='valid_enum' target='bareosremoteclient.job_.job_type_.level_'> + <param>['Full', 'Incremental', 'Differential']</param> + </check> + <check name='valid_enum' target='bareosremoteclient.job_.job_type_.job_type_'> + <param>['monthly', 'weekly', 'daily']</param> + </check> + <check name='valid_enum' target='bareosremoteclient.job_.job_type_.day_'> + <param>['1', '2', '3', '4', '5', '6', '7']</param> + </check> + <check name='valid_enum' target='bareosremoteclient.job_.job_type_.end_day_'> + <param>['1', '2', '3', '4', '5', '6', '7']</param> + </check> + <check name='valid_enum' target='bareosremoteclient.job_.job_type_.hour_'> + <param>['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23']</param> + </check> + <condition name='disabled_if_not_in' source='bareosremoteclient.job_.job_type_.job_type_'> + <param>daily</param> + <target type='variable'>bareosremoteclient.job_.job_type_.end_day_</target> + </condition> + <group master="bareosremoteclient.job_.job_type_" description="Sauvegarde automatique de "> + <slave>day_</slave> + <slave>end_day_</slave> + <slave>hour_</slave> + <slave>level_</slave> + </group> + <condition name ='disabled_if_in' source='bareos_dir_set_remote_fds'> + <param>non</param> + <target type='actionlist'>bareos_fd_remote</target> + </condition> + </constraints> + <help/> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/extra_dictionaries/schedule/01_bareos.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/extra_dictionaries/schedule/01_bareos.xml new file mode 100644 index 0000000000000000000000000000000000000000..c0996e29a82c21910074646a6cb81ec3da24612e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/extra_dictionaries/schedule/01_bareos.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + <variables> + <family name='bareos' description="Compactage de la base de données de Bareos"> + <variable name="description" type="string" hidden="True"><value>Compactage de la base de donnée de Bareos</value></variable> + <variable name="day" type="schedule" description="Périodicité d'exécution" mandatory="True"></variable> + <variable name="mode" type="schedulemod" hidden="True"><value>post</value></variable> + </family> + </variables> + <constraints> + <fill name='calc_multi_condition' target='schedule.bareos.day'> + <param>non</param> + <param type='eole' name='condition_1'>activer_bareos_dir</param> + <param name='match'>none</param> + <param name='mismatch'>monthly</param> + </fill> + </constraints> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/etc/bareos/bareosfichiers.d/bareos.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/etc/bareos/bareosfichiers.d/bareos.conf new file mode 100644 index 0000000000000000000000000000000000000000..841f765c80337e2a4e841105d32c6dbb0f4e56b1 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/etc/bareos/bareosfichiers.d/bareos.conf @@ -0,0 +1,14 @@ +# fichiers communs pour EOLE et bareos +Include { + Options { + aclsupport = no + @/etc/bareos/include-options.conf + } + File = /etc/eole/config.eol + File = /usr/share/eole/creole/patch + File = /usr/share/eole/creole/dicos/local + File = /var/lib/eole/config + File = /etc/ssl + File = /etc/bareos/bareosfichiers.d + File = /home/backup +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/etc/default/bareos-dir b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/etc/default/bareos-dir new file mode 100644 index 0000000000000000000000000000000000000000..94af90309f91355c783e1406f384184221e9f4fb --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/etc/default/bareos-dir @@ -0,0 +1,4 @@ +PIDDIR=/var/run/bareos +PIDFILE=$PIDDIR/${NAME}.${NETWORK_PORT}.pid +mkdir -p $PIDDIR +chown bareos: $PIDDIR diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/etc/default/bareos-fd b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/etc/default/bareos-fd new file mode 100644 index 0000000000000000000000000000000000000000..94af90309f91355c783e1406f384184221e9f4fb --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/etc/default/bareos-fd @@ -0,0 +1,4 @@ +PIDDIR=/var/run/bareos +PIDFILE=$PIDDIR/${NAME}.${NETWORK_PORT}.pid +mkdir -p $PIDDIR +chown bareos: $PIDDIR diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/etc/default/bareos-sd b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/etc/default/bareos-sd new file mode 100644 index 0000000000000000000000000000000000000000..94af90309f91355c783e1406f384184221e9f4fb --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/etc/default/bareos-sd @@ -0,0 +1,4 @@ +PIDDIR=/var/run/bareos +PIDFILE=$PIDDIR/${NAME}.${NETWORK_PORT}.pid +mkdir -p $PIDDIR +chown bareos: $PIDDIR diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/ead2/backend/config/actions/actions_bareos.cfg b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/ead2/backend/config/actions/actions_bareos.cfg new file mode 100644 index 0000000000000000000000000000000000000000..e0a4beeda0abffddbad29c76c010a5d5fc5ace86 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/ead2/backend/config/actions/actions_bareos.cfg @@ -0,0 +1,2 @@ +bareos +bareosconfig diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/ead2/backend/config/perms/perm_bareos.ini b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/ead2/backend/config/perms/perm_bareos.ini new file mode 100644 index 0000000000000000000000000000000000000000..f81c4337647527cdc283753f7ebe40bde1561c64 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/ead2/backend/config/perms/perm_bareos.ini @@ -0,0 +1,7 @@ +[roles] +admin=Administrateur + +[permissions] +bareos=admin +bareos_config=admin +rapport_sav=admin diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/eole/bareos/delete_catalog_backup b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/eole/bareos/delete_catalog_backup new file mode 100644 index 0000000000000000000000000000000000000000..380ca1e84fe801def08d27df92ba61dc3ac828a4 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/eole/bareos/delete_catalog_backup @@ -0,0 +1,37 @@ +#!/bin/sh +# +# BAREOS® - Backup Archiving REcovery Open Sourced +# +# Copyright (C) 2000-2011 Free Software Foundation Europe e.V. +# Copyright (C) 2013-2014 Bareos GmbH & Co. KG +# +# This program is Free Software; you can redistribute it and/or +# modify it under the terms of version three of the GNU Affero General Public +# License as published by the Free Software Foundation and included +# in the file LICENSE. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. +# +# This script deletes a catalog dump +# + +# +# Source the Bareos config functions. +# +. /usr/lib/bareos/scripts/bareos-config-lib.sh +if [ -f /etc/bareos/bareos-config-lib.sh ]; then + . /etc/bareos/bareos-config-lib.sh +fi + +db_name="${db_name:-bareos}" +[ -z $working_dir ] && working_dir=`get_working_dir` + +rm -f ${working_dir}/${db_name}.sql diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/eole/bareos/make_catalog_backup b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/eole/bareos/make_catalog_backup new file mode 100644 index 0000000000000000000000000000000000000000..2be8c64c7f9f71b6f16fa36075434892d9617b06 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/eole/bareos/make_catalog_backup @@ -0,0 +1,168 @@ +#!/bin/sh +# +# BAREOS® - Backup Archiving REcovery Open Sourced +# +# Copyright (C) 2000-2011 Free Software Foundation Europe e.V. +# Copyright (C) 2013-2014 Bareos GmbH & Co. KG +# +# This program is Free Software; you can redistribute it and/or +# modify it under the terms of version three of the GNU Affero General Public +# License as published by the Free Software Foundation and included +# in the file LICENSE. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. +# +# This script dumps your Bareos catalog in ASCII format +# It works for MySQL, SQLite, and PostgreSQL +# +# $1 is the name of the database to be backed up and the name +# of the output file (default = bareos). +# $2 is the user name with which to access the database +# (default = bareos). +# $3 is the password with which to access the database or "" if no password +# (default ""). WARNING!!! Passing the password via the command line is +# insecure and should not be used since any user can display the command +# line arguments and the environment using ps. Please consult your +# MySQL or PostgreSQL manual for secure methods of specifying the +# password. +# $4 is the host on which the database is located +# (default "") +# $5 is the type of database +# + +workging_dir= +db_type= +db_user= +db_passwd= +db_name= +db_host= + +# +# Source the Bareos config functions. +# + +. /usr/lib/bareos/scripts/bareos-config-lib.sh + +if [ -f /etc/bareos/bareos-config-lib.sh ]; then + . /etc/bareos/bareos-config-lib.sh +fi + +[ -z $working_dir ] && working_dir=`get_working_dir` +default_db_type=`get_database_driver_default` + +usage() { + cat<<EOF +usage: $0 [-h]|[-t <sqlite3|mysql|postgresql|ingres> [-u] [-p] [-n] [-a]] + +This script extract database content in a format suitable for backup. + +OPTIONS: + -h Show this message + -t database type (sqlite3, mysql, postgresql, ingres) + -u database user + -p user password + -n database name + -a database host +EOF +} + +while getopts "ht:p:u:n:a:" OPTION +do + case $OPTION in + h) + usage + exit 0 + ;; + t) + db_type=$OPTARG + ;; + p) + db_passwd=$OPTARG + ;; + u) + db_user=$OPTARG + ;; + n) + db_name=$OPTARG + ;; + a) + db_host=$OPTARG + ;; + *) + usage + exit 1 + ;; + esac +done + +# +# If no new db_type is gives use the default db_type. +# +if [ -z "${db_type}" ]; then + db_type="${default_db_type}" +fi + +cd ${working_dir} +rm -f ${db_name}.sql + +bindir=`get_database_utility_path ${db_type}` +if [ ! -z "${bindir}" ]; then + PATH="$bindir:$PATH" +fi + +case ${db_type} in + sqlite3) + echo ".dump" | sqlite3 ${db_name}.db > ${db_name}.sql + ;; + mysql) + if [ ! -z "${db_passwd}" ]; then + MYSQLPASSWORD=" --password=${db_passwd}" + else + MYSQLPASSWORD="" + fi + if [ ! -z "${db_host}" ]; then + MYSQLHOST=" --host=${db_host}" + else + MYSQLHOST="" + fi + mysqldump -u ${2}${MYSQLPASSWORD}${MYSQLHOST} -f --opt ${db_name} > ${db_name}.sql + ;; + postgresql) + if [ ! -z "${db_passwd}" ]; then + PGPASSWORD=${db_passwd} + export PGPASSWORD + fi + if [ ! -z "${db_host}" ]; then + PGHOST=" --host=${db_host}" + else + PGHOST="" + fi + # you could also add --compress for compression. See man pg_dump + pg_dump -c $PGHOST -U ${db_user} ${db_name} > ${db_name}.sql + ;; +esac +# +# To read back a MySQL database use: +# cd /var/lib/bareos +# rm -f ${BINDIR}/../var/bareos/* +# mysql <bareos.sql +# +# To read back a SQLite database use: +# cd /var/lib/bareos +# rm -f bareos.db +# sqlite bareos.db <bareos.sql +# +# To read back a PostgreSQL database use: +# cd /var/lib/bareos +# dropdb bareos +# createdb bareos -T template0 -E SQL_ASCII +# psql bareos <bareos.sql +# diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/eole/bareos/restore/__init__.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/eole/bareos/restore/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..5583ba226fd09a8226ec92eea25ab515ce3b31bf --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/eole/bareos/restore/__init__.py @@ -0,0 +1,18 @@ +""" +Chargement des plugins de l'utilitaire de sauvegarde +""" + + +#on ajoute des '__' pour que lors du chargement des plugins les variables +#propre a l'init ne soit pas prises en compte +import glob as __glob__ +import re as __re__ +import os as __os__ + +__os__.chdir('/usr/share/eole/bareos') + +__zorg__ = __glob__.glob('restore'+'/[a-z]*.py') + +for __p__ in __zorg__: + __m__ = __re__.search('(?<=/)\w+', __p__) + exec "import %s" %__m__.group() diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/eole/bareos/restore/all_files.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/eole/bareos/restore/all_files.py new file mode 100644 index 0000000000000000000000000000000000000000..fa67097581816d8b9ad2c78fb94997a54fc33745 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/eole/bareos/restore/all_files.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python +"""Restauration de tous les fichiers""" +from pyeole.bareosrestore import bareos_restore_all_files, exit_if_running_jobs +import sys + +def execute(option, opt_str, value, parser, jobid, test_jobs=True): + """all_files helper""" + if len(parser.rargs) > 0: + option = parser.rargs[0] + if option == 'pre': + pre() + elif option == 'post': + post() + else: + if test_jobs: + exit_if_running_jobs() + job(jobid) + +def pre(): + print "pre all_files" + +def post(): + print "post all_files" + +def job(jobid): + print "Restauration des fichiers" + bareos_restore_all_files(jobid) + + +priority=80 + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/eole/bareos/restore/catalog.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/eole/bareos/restore/catalog.py new file mode 100644 index 0000000000000000000000000000000000000000..7934c768cd162debf56fef2d14d4c66ddf271531 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/eole/bareos/restore/catalog.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +"""Restauration du catalogue de bareos (attention il faut savoir ce que l'on fait !)""" +from pyeole.bareosrestore import extract_bareos_files, bareos_restore_dump, \ + restore_file +from creole.loader import load_store +from sys import exit +from creole.client import CreoleClient + + +client = CreoleClient() + + +def execute(option, opt_str, value, parser, jobid, test_jobs=False): + """catalog helper + never test jobs + """ + if client.get_creole('module_instancie') == 'non': + print "Le serveur doit être instancié pour lancer cette commande" + print "Peut-être voulez-vous utiliser l'option --configeol ?" + exit(1) + if len(parser.rargs) > 0: + option = parser.rargs[0] + if option == 'pre': + pre() + elif option == 'post': + post() + else: + print "Attention, il ne faut plus spécifier le nom du directeur Bareos" + exit(1) + else: + job(jobid) + +def pre(): + print "pre catalog" + +def post(): + print "post catalog" + +def job(jobid): + print "Restauration du catalogue" + try: + extract_bareos_files() + bareos_restore_dump() + except Exception,e: + print e + exit(1) + +priority=0 + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/eole/bareos/restore/configeol.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/eole/bareos/restore/configeol.py new file mode 100644 index 0000000000000000000000000000000000000000..e2fdcdc862233e94b8657c293bd646d8fa798e43 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/eole/bareos/restore/configeol.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +"""Restauration du config.eol de bareos (attention il faut savoir ce que l'on fait !)""" +from pyeole.bareosrestore import extract_configeol_files +from sys import exit + +def execute(option, opt_str, value, parser, jobid, test_jobs=False): + """helper + never test jobs + """ + if len(parser.rargs) > 0: + option = parser.rargs[0] + if option == 'pre': + pre() + elif option == 'post': + post() + else: + job(option, jobid) + else: + print "Il faut spécifier le nom du directeur Bareos" + exit(1) + +def pre(): + print "pre configeol" + +def post(): + print "post configeol" + +def job(bareos_dir_name, jobid): + print "Restauration du fichier config.eol" + try: + extract_configeol_files(bareos_dir_name=bareos_dir_name) + except Exception,e: + print e + exit(1) + +priority=0 + + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/eole/bareos/restore/file.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/eole/bareos/restore/file.py new file mode 100644 index 0000000000000000000000000000000000000000..bf5c265ca555ef3fa04b9f6d8ad7d258dd7f3deb --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/eole/bareos/restore/file.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +"""Restauration du fichier passé en argument""" +from pyeole.bareosrestore import bareos_restore_one_file, exit_if_running_jobs +import sys + +def execute(option, opt_str, value, parser, jobid, test_jobs=True): + """file helper""" + if len(parser.rargs) > 0: + option = parser.rargs[0] + if option == 'pre': + pre() + elif option == 'post': + post() + else: + if test_jobs: + exit_if_running_jobs() + job(option, jobid) + + else: + print "Il faut sprécifier le nom du fichier à restaurer" + sys.exit(1) + +def pre(): + print "pre file" + +def post(): + print "post file" + +def job(filename, jobid): + print "Restauration du fichier {0}".format(filename) + bareos_restore_one_file(filename, jobid) + + +priority=0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/eole/bareos/restore/folder.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/eole/bareos/restore/folder.py new file mode 100644 index 0000000000000000000000000000000000000000..6d08114f3c559b33e640e0966a8d96ebed965129 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/eole/bareos/restore/folder.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +"""Restauration du répertoire passé en argument et de son contenu""" +from pyeole.bareosrestore import bareos_restore_one_folder, exit_if_running_jobs +import sys + +def execute(option, opt_str, value, parser, jobid, test_jobs=True): + """file helper""" + if len(parser.rargs) > 0: + option = parser.rargs[0] + if option == 'pre': + pre() + elif option == 'post': + post() + else: + if test_jobs: + exit_if_running_jobs() + job(option, jobid) + + else: + print "Il faut spécifier le chemin du répertoire a restaurer" + sys.exit(1) + +def pre(): + print "pre folder" + +def post(): + print "post folder" + +def job(foldername, jobid): + print "Restauration du répertoire {0}".format(foldername) + bareos_restore_one_folder(foldername, jobid) + + +priority=0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/eole/bareos/restore/ls_folder.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/eole/bareos/restore/ls_folder.py new file mode 100644 index 0000000000000000000000000000000000000000..d5554b3955fbfa9f410d0dee8bea1028c2a2b5cf --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/eole/bareos/restore/ls_folder.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +"""Liste le contenu du répertoire passé en argument """ +from pyeole.bareosrestore import bareos_ls_one_folder, exit_if_running_jobs +import sys + +def execute(option, opt_str, value, parser, jobid, test_jobs=True): + """file helper""" + if len(parser.rargs) > 0: + option = parser.rargs[0] + if option == 'pre': + pre() + elif option == 'post': + post() + else: + if test_jobs: + exit_if_running_jobs() + job(option, jobid) + + else: + print "Il faut spécifier le répertoire à lister" + sys.exit(1) + +def pre(): + print "pre ls_folder" + +def post(): + print "post ls_folder" + +def job(foldername, jobid): + print "Contenu de {0}".format(foldername) + bareos_ls_one_folder(foldername, jobid) + + +priority=0 + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/eole/bareos/restore/search.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/eole/bareos/restore/search.py new file mode 100644 index 0000000000000000000000000000000000000000..19f558e8b76008863e553348c9caf6ec4092c217 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/eole/bareos/restore/search.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +"""Liste les fichiers avec le nom passé en argument (attention, mettre '\\*' au lieu de '*' et '\\?' au lien de '?')""" +import sys +from pyeole.process import system_code +from pyeole.service import service_out +from glob import glob +from os import unlink +from pyeole.bareosrestore import exit_if_running_jobs, bareos_search + +def execute(option, opt_str, value, parser, jobid, test_jobs=True): + """search helper""" + if len(parser.rargs) > 0: + option = parser.rargs[0] + if option == 'pre': + pre() + elif option == 'post': + post() + else: + if test_jobs: + exit_if_running_jobs() + job(option, jobid) + + else: + print "Il faut spécifier le fichier ou répertoire à rechercher" + sys.exit(1) + +def pre(): + print "pre search" + +def post(): + print "post search" + +def job(filenames, jobid): + print "Recherche dans la sauvegarde" + try: + bareos_search(filenames.split(',')) + except Exception, e: + print e + sys.exit(1) + sys.stdout.write('\n') + +priority=0 + + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/eole/diagnose/153-bareos b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/eole/diagnose/153-bareos new file mode 100644 index 0000000000000000000000000000000000000000..5b8bebab0be7dee4ef570e780fda87c2ad456d47 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/eole/diagnose/153-bareos @@ -0,0 +1,151 @@ +#!/bin/bash +. /usr/lib/eole/diagnose.sh +len_pf_accent=$((len_pf+1)) + +TestBareosMonitorLocal(){ + printf "Test de $1 :\n" + if [ ! "$3" = "oui" ]; then + Inactif "$1" + else + printf ". %${len_pf}s => " "$1" + pass=$(CreoleGet bareos.monitor.bareos_mon_password) + /usr/lib/nagios/plugins/check_bareos -H localhost -D $2 -K "$pass" -M bareos-$(CreoleGet nom_machine)-mon > /dev/null 2>&1 + if [ $? -eq 0 ]; then + EchoVert "Ok" + printf ". %${len_pf}s => " "fichier de configuration" + bareos-$2 -t -c /etc/bareos/bareos-$2.conf > /dev/null 2>&1 + ret=$? + if [ $ret -eq 0 ] + then + EchoVert "Ok" + else + EchoRouge "Erreur" + return 1 + fi + return 0 + else + EchoRouge "Erreur" + return 1 + fi + fi +} +TestClientDistant(){ + if [ "$(CreoleGet activer_bareos_dir)" = 'oui' ]; then + RemoteFD="$(CreoleGet bareos_dir_set_remote_fds)" + if [ $RemoteFD = "oui" ]; then + declare -a FILER_NAME + declare -a FILER_IP + declare -a FILER_PWD + FILER_NAME=($(CreoleGet bareos_dir_remote_fd_display_name)) + FILER_IP=($(CreoleGet bareos_dir_remote_fd_address)) + FILER_PWD=($(CreoleGet bareos_dir_remote_fd_password)) + DIR_NAME=$(CreoleGet bareos_dir_name) + NB_FILER=${#FILER_NAME[*]} + printf ". %${len_pf}s" "sauvegardes distantes ($NB_FILER clients)" + printf "\n" + for ((id=0; id < $NB_FILER; id+=1)) do + printf ". %${len_pf}s =>" "Client ${FILER_NAME[id]}" + /usr/lib/nagios/plugins/check_bareos -H ${FILER_IP[id]} -D fd -K "${FILER_PWD[id]}" -M $DIR_NAME > /dev/null 2>&1 + if [ $? -eq 0 ]; then + EchoVert " Ok" + else + EchoRouge " Erreur" + fi + done + fi + fi +} +EchoGras "*** Sauvegarde" +bareos_dir=$(CreoleGet activer_bareos_dir) +TestBareosMonitorLocal "Bareos Director" dir "$bareos_dir" +#Test du client a faire si le directeur est activé +if [ "$bareos_dir" = "oui" ]; then + TestBareosMonitorLocal "Bareos Client" fd "$bareos_dir" +else + TestBareosMonitorLocal "Bareos Client" fd "$(CreoleGet activer_bareos_fd)" +fi +TestClientDistant +TestBareosMonitorLocal "Bareos Storage" sd "$(CreoleGet activer_bareos_sd)" + + if [ "$(CreoleGet activer_bareos_sd)" = 'oui' ];then + if [ "$(CreoleGet bareos.support.support_type)" = 'none' ];then + NoConfig "Montage du support" + else + printf ". %${len_pf}s => " "Montage du support" + /usr/share/eole/sbin/bareosmount.py -t -f > /dev/null 2>&1 + if [ $? = 0 ]; then + EchoVert "Ok" + else + EchoRouge "Erreur" + fi + fi + fi +if [ "$bareos_dir" = "oui" ]; then + # utilisation des fonctions de pyeole/bareos.py + BAREOS_RAPPORT_OK="1" + BAREOS_RAPPORT_ERR="-1" + #BAREOS_RAPPORT_UNKNOWN="0" + printf "Statut des sauvegardes :\n" + eval `/usr/bin/env python -c 'from pyeole.bareos import bareos_rapport_load; rap = bareos_rapport_load("cronpre"); print "RAP[0]=\"%s\";RAP[1]=\"%s\";" %(rap[0], rap[1])'` + printf ". %${len_pf_accent}s => " "préparation sauvegarde" + if [ "${RAP[0]}" = $BAREOS_RAPPORT_OK ]; then + EchoVert "Ok : ${RAP[1]}" + elif [ "${RAP[0]}" = $BAREOS_RAPPORT_ERR ]; then + EchoRouge "Erreur : ${RAP[1]}" + else + EchoOrange "Inconnu : ${RAP[1]}" + fi + eval `/usr/bin/env python -c 'from pyeole.bareos import bareos_rapport_load; rap = bareos_rapport_load("sauvegarde"); print "RAP[0]=\"%s\";RAP[1]=\"%s\";" %(rap[0], rap[1])'` + printf ". %${len_pf}s => " "sauvegarde principale" + if [ "${RAP[0]}" = $BAREOS_RAPPORT_OK ]; then + EchoVert "Ok : ${RAP[1]}" + elif [ "${RAP[0]}" = $BAREOS_RAPPORT_ERR ]; then + EchoRouge "Erreur : ${RAP[1]}" + else + EchoOrange "Inconnu : ${RAP[1]}" + fi + eval `/usr/bin/env python -c 'from pyeole.bareos import bareos_rapport_load; rap = bareos_rapport_load("catalogue"); print "RAP[0]=\"%s\";RAP[1]=\"%s\";" %(rap[0], rap[1])'` + printf ". %${len_pf}s => " "sauvegarde catalogue" + if [ "${RAP[0]}" = $BAREOS_RAPPORT_OK ]; then + EchoVert "Ok : ${RAP[1]}" + elif [ "${RAP[0]}" = $BAREOS_RAPPORT_ERR ]; then + EchoRouge "Erreur : ${RAP[1]}" + else + EchoOrange "Inconnu : ${RAP[1]}" + fi + eval `/usr/bin/env python -c 'from pyeole.bareos import bareos_rapport_load; rap = bareos_rapport_load("cronpost"); print "RAP[0]=\"%s\";RAP[1]=\"%s\";" %(rap[0], rap[1])'` + if [ "${RAP[0]}" = $BAREOS_RAPPORT_OK ]; then + printf ". %${len_pf_accent}s => " "exécution cron par bareos" + EchoVert "Ok : ${RAP[1]}" + elif [ "${RAP[0]}" = $BAREOS_RAPPORT_ERR ]; then + printf ". %${len_pf_accent}s => " "exécution cron par bareos" + EchoRouge "Erreur : ${RAP[1]}" + fi + eval `/usr/bin/env python -c 'from pyeole.bareos import bareos_rapport_load_pcent_usage; rap = bareos_rapport_load_pcent_usage(); print "PCENT=\"%s\";IPCENT=\"%s\";" %(rap[0], rap[1])'` + if [ ! $PCENT = -1 ] && [ ! $IPCENT = -1 ]; then + printf "Espace sur le support de sauvegarde :\n" + if [ ! $PCENT = -1 ]; then + printf ". %${len_pf_accent}s => " "espace utilisé sur le support" + if [ "$PCENT" -lt 80 ]; then + EchoVert "$PCENT%" + elif [ "$PCENT" -lt 90 ]; then + EchoOrange "$PCENT%" + else + EchoRouge "$PCENT%" + fi + fi + if [ ! $IPCENT = -1 ]; then + printf ". %${len_pf_accent}s => " "inodes utilisés sur le support" + if [ "$IPCENT" -lt 80 ]; then + EchoVert "$IPCENT%" + elif [ "$IPCENT" -lt 90 ]; then + EchoOrange "$IPCENT%" + else + EchoRouge "$IPCENT%" + fi + fi + fi + echo + fi +exit 0 + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/eole/sbin/bareosconfig.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/eole/sbin/bareosconfig.py new file mode 100644 index 0000000000000000000000000000000000000000..8c21aefec1bfd59a710b2fdcf520c84cd0734dad --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/eole/sbin/bareosconfig.py @@ -0,0 +1,272 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +############################################################################ +# # +# Utilitaire de configuration du support pour bareos # +# # +############################################################################ + +from optparse import OptionParser, OptionGroup +import sys + +from pyeole.bareos import save_bareos_support_usb, save_bareos_support_smb, \ + save_bareos_support_manual, save_bareos_mail, load_bareos_mail,\ + load_bareos_support, pprint_bareos_jobs, \ + add_job, del_job, \ + run_backup, Disabled, bareos_rapport_in_progress, bareos_rapport_err, \ + bareos_rapport_ok, test_bareos_support, write_bareos_schedule +import pyeole.lock +from pyeole.ansiprint import print_red +from pyeole.lock import acquire, release, get_system_lock_name, is_name_locked +from pyeole.log import init_logging + +def main(): + def conf_support(): + support = options.support + usb_path = options.usb_path + smb_machine = options.smb_machine + smb_ip = options.smb_ip + smb_partage = options.smb_partage + smb_login = options.smb_login + smb_password = options.smb_password + no_reload = options.no_reload + try: + if support == 'usb': + if usb_path is None: + raise Exception("L'option --usb_path est obligatoire pour une sauvegarde sur support USB") + save_bareos_support_usb(usb_path=usb_path, no_reload=no_reload) + elif support == 'smb': + save_bareos_support_smb(smb_machine=smb_machine, + smb_ip=smb_ip, smb_partage=smb_partage, + smb_login=smb_login, smb_password=smb_password, + no_reload=no_reload) + elif support == 'manual': + save_bareos_support_manual(no_reload=no_reload) + else: + raise Exception("Support {} inconnu".format(support)) + except Exception as err: + print_red(unicode(err)) + sys.exit(1) + + def conf_mail(): + no_reload = options.no_reload + try: + save_bareos_mail(mail_ok=options.mail_ok, + mail_error=options.mail_error, no_reload=no_reload) + except Exception as err: + print_red(unicode(err)) + sys.exit(1) + + def conf_job(): + no_reload = options.no_reload + try: + add_job(job=options.job, level=options.job_level, + day=options.job_day, hour=options.job_hour, + end_day=options.job_end_day, no_reload=no_reload) + except Exception as err: + print_red(unicode(err)) + sys.exit(1) + + def display_infos(): + begin = "Support : {0}" + try: + ret = str(load_bareos_support()) + print begin.format(ret) + except Disabled as e: + print begin.format(e) + except Exception as err: + print_red(unicode(err)) + sys.exit(1) + + begin = "Mail : {0}" + try: + ret = load_bareos_mail() + if ret == False: + print begin.format('non configuré') + else: + print begin.format(str(ret)) + except Disabled: + pass + except Exception as err: + print_red(unicode(err)) + sys.exit(1) + + msg = "Programmation : " + try: + jobs = pprint_bareos_jobs() + if jobs == None: + print msg + 'non configuré' + else: + print msg + print jobs + except Disabled: + pass + except Exception as err: + import traceback + traceback.print_exc() + print_red(unicode(err)) + sys.exit(1) + + + def run_back(): + try: + status, comment = test_bareos_support() + print comment + except Exception as err: + print_red(u'Erreur au test de montage : ' + unicode(err)) + sys.exit(1) + if status == False: + print_red(u'Erreur au test de montage') + sys.exit(1) + try: + print run_backup(options.level, bareos_fd=options.bareos_fd) + except Exception as err: + print_red(unicode(err)) + sys.exit(1) + + log=init_logging() + + #get options + parser = OptionParser(usage="Seulement une option \n%prog [option]") + parser.add_option("-d", "--display", action="store_true", dest="display", + default=False, help=u"Liste les configurations") + parser.add_option("--no-reload", action="store_true", dest="no_reload", + default=False, help=u"Ne pas recharger Bareos lors de l'application") + parser.add_option("-a", "--apply", action="store_true", dest="apply_c", + default=False, help=u"Force l'aplication des configurations") + + group = OptionGroup(parser, "Configuration du support de sauvegarde pour l’instance locale de bareos-sd") + group.add_option("-s", "--support", dest="support", help=u"Type du support de sauvegarde (usb, smb ou manual)") + group.add_option("--usb_path", dest="usb_path", help=u"Support usb : chemin du disque usb") + group.add_option("--smb_machine", dest="smb_machine", help=u"Support smb : nom machine avec le partage") + group.add_option("--smb_ip", dest="smb_ip", help=u"Support smb : ip de la machine avec le partage") + group.add_option("--smb_partage", dest="smb_partage", help=u"Support smb : nom du partage") + group.add_option("--smb_login", dest="smb_login", help=u"Support smb : nom de l'utilisateur smb (facultatif)") + group.add_option("--smb_password", dest="smb_password", help=u"Support smb : mot de passe smb (facultatif)") + parser.add_option_group(group) + + group2 = OptionGroup(parser, "Configuration des adresses mails") + group2.add_option("-m", "--mail", dest="mail", action="store_true", default=False, + help=u"Configuration des adresses mails de sauvegarde (sans autre option, suppression)") + group2.add_option("--mail_ok", dest="mail_ok", help=u" Mail admin sauvegarde (facultatif)") + group2.add_option("--mail_error", dest="mail_error", help=u" Mail admin sauvegarde pour les erreurs (facultatif)") + parser.add_option_group(group2) + + group3 = OptionGroup(parser, "Programmation des sauvegardes") + group3.add_option("-j", "--job", dest="job", help=u"Type de programmation (daily, weekly ou monthly)") + group3.add_option("--job_level", dest="job_level", help=u"Niveau de programmation (Full, Incremental ou Differential)") + group3.add_option("--job_day", dest="job_day", help=u"Jour de programmation (1 pour la nuit du dimanche au lundi, ..., 7 du samedi au dimanche). La nuit commence à 12h") + group3.add_option("--job_end_day", dest="job_end_day", help=u"Si programmation daily, nuit de la fin de la plage") + group3.add_option("--job_hour", dest="job_hour", help=u"Heure de programmation (chiffre de 0 à 23), la nuit commence à 12h et finit à 11h le lendemain") + group3.add_option("-x", "--del_job", dest="del_job", help=u"Suppression du job (numéro") + parser.add_option_group(group3) + + group4 = OptionGroup(parser, "Lancer une sauvegarde") + group4.add_option("-n", "--now", dest="now", help=u"Lancer une sauvegarde immédiate", action="store_true", default=False) + group4.add_option("--level", dest="level", help=u"Niveau de sauvegarde (Full, Incremental ou Differential)") + group4.add_option("--client", dest="bareos_fd", help=u"Nom du client à sauvegarder", default=None) + parser.add_option_group(group4) + + group5 = OptionGroup(parser, "Gestion des verrous") + group5.add_option("--lock", dest="lock", help=u"Mettre un verrou de sauvegarde", action="store_true", default=False) + group5.add_option("--unlock", dest="unlock", help=u"Supprimer le verrou de sauvegarde", action="store_true", default=False) + group5.add_option("--daemon", dest="daemon", help=u"Identifiant du démon", default='eolesauvegarde') + group5.add_option("--dir", dest="director", help=u"Identifiant du directeur") + group5.add_option("--fd", dest="client", help=u"Identifiant du client") + group5.add_option("--jobID", dest="job_id", help=u"Identifiant du job") + group5.add_option("--backup_progress", dest="backup_progress", help=u"Rapport : la sauvegarde est en cours", action="store_true", default=False) + group5.add_option("--backup_ok", dest="backup_ok", help=u"Rapport : la sauvegarde s'est terminée avec succès", action="store_true", default=False) + group5.add_option("--backup_err", dest="backup_err", help=u"Rapport : la sauvegarde s'est terminée par une erreur", action="store_true", default=False) + group5.add_option("--jobType", dest="job_type", help=u"Indiquer le type de tâche (cronpre, cronpost, sauvegarde ou catalogue)") + parser.add_option_group(group5) + + + (options, args) = parser.parse_args() + + if options.support == None and options.mail == False and options.job == None \ + and options.display == False and options.now == False \ + and options.lock == False and options.del_job == None \ + and options.unlock == False and options.backup_err == False \ + and options.apply_c == False: + parser.print_help() + sys.exit(1) + + + if options.support != None: + conf_support() + + if options.mail != False: + conf_mail() + + if options.job != None: + conf_job() + + if options.del_job != None: + del_job(options.del_job, no_reload=options.no_reload) + + if options.display != False: + display_infos() + + if options.now != False: + run_back() + + if options.backup_progress != False: + bareos_rapport_in_progress(options.job_type) + + if options.backup_ok != False: + bareos_rapport_ok(options.job_type) + + if options.backup_err != False: + bareos_rapport_err(options.job_type) + + if options.lock != False: + locks = get_system_lock_name() + if options.job_id is None: + print_red(u"Erreur : l'option --lock nécessite l'identifiant du job") + sys.exit(1) + pyeole.lock.PID = options.job_id + if options.director != None: + #remplacer "." par "_" #8481 + lock_name = options.director.replace('.', '_') + if len(locks) == 1 and is_name_locked(lock_name, level='system'): + print u'Lock système déjà placé : {}'.format(locks).encode("utf-8") + print u'Inutile de placer un lock supplémentaire'.encode('utf-8') + elif not locks: + #remplacer "." par "_" #8481 + lock_name = options.daemon.replace('.', '_') + acquire(lock_name, level='system') + else: + print_red(u'Lock système déjà placé : {}'.format(locks).encode("utf-8")) + sys.exit(1) + elif not locks: + try: + status, comment = test_bareos_support() + except Exception as err: + print_red(u'Erreur au test de montage : ' + unicode(err)) + sys.exit(1) + #remplacer "." par "_" #8481 + lock_name = options.daemon.replace('.', '_') + acquire(lock_name, level='system') + else: + for lock in locks: + print_red(u'Lock déjà présent : ' + unicode(lock)) + sys.exit(1) + + if options.unlock != False: + if options.job_id is None: + print u"Erreur : l'option --unlock nécessite l'identifiant du job" + sys.exit(1) + pyeole.lock.PID = options.job_id + #remplacer "." par "_" #8481 + lock_name = options.daemon.replace('.', '_') + + if is_name_locked(lock_name, level='system'): + release(lock_name, level='system') + + if options.apply_c: + write_bareos_schedule() + + +if __name__ == "__main__": + main() diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/eole/sbin/bareosmount.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/eole/sbin/bareosmount.py new file mode 100644 index 0000000000000000000000000000000000000000..f08726fb388725ef3ef7961aef28d2bcd465d06b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/eole/sbin/bareosmount.py @@ -0,0 +1,73 @@ +#!/usr/bin/python +# -*- coding: UTF-8 -*- + +from optparse import OptionParser, OptionGroup +import sys + +from pyeole.bareos import test_bareos_support, mount_bareos_support, umount_bareos_support, bareos_active_sd, mount_status_to_str + + +def main(): + #get options + parser = OptionParser(usage="Seulement une option \n%prog [option]") + parser.add_option("--mount", action="store_true", dest="mount", + default=False, help=u"Monte le support") + parser.add_option("--umount", action="store_true", dest="umount", + default=False, help=u"Démonte le support") + parser.add_option("-t", "--test", action="store_true", dest="test", + default=False, help=u"Test de la configuration du support") + parser.add_option("-o", "--owner", action="store_true", dest="chown", + default=False, help=u"Change le propriétaire du point de montage") + parser.add_option("-f", "--force", action="store_true", dest="force", + default=False, help=u"Force l'exécution du test sans vérifier l'activation des services") + parser.add_option("--volume", dest="volume", default="", + help=u"Volume utilisé (option utilisée pour le démontage sélectif)") + + (options, args) = parser.parse_args() + + + if options.test == False and options.mount == False and options.umount == False: + parser.print_help() + sys.exit(1) + + if options.test != False: + try: + status, comment = test_bareos_support(options.force, chown=options.chown) + if status == True: + print "Test OK" + else: + print 'Échec du test de montage :\n', comment + sys.exit(1) + except Exception, e: + print unicode(e) + sys.exit(1) + + if options.mount != False: + try: + status, detail = mount_bareos_support(chown=options.chown) + if status == True: + print "Montage OK" + else: + print "Échec du montage :\n", mount_status_to_str(detail) + sys.exit(1) + except Exception, e: + print unicode(e) + sys.exit(1) + + if options.umount != False: + try: + ret = umount_bareos_support(options.volume) + if ret == True: + print "Démontage OK" + else: + print ret + except Exception, e: + print unicode(e) + sys.exit(1) + +if __name__ == "__main__": + if bareos_active_sd(): + main() + else: + print "Bareos sd local est désactivé ; le support de sauvegarde n'est pas testé." + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/eole/sbin/bareosregen.sh b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/eole/sbin/bareosregen.sh new file mode 100644 index 0000000000000000000000000000000000000000..54bd53731951025271dd8701611802ec60593805 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/eole/sbin/bareosregen.sh @@ -0,0 +1,155 @@ +#!/bin/bash + +MOUNT_DIR='/mnt/sauvegardes' +BAREOS_DB='/var/lib/bareos/bareos.db' +DDL_MYSQL='/usr/lib/bareos/scripts/ddl/grants/mysql.sql' +DDL_MYSQL_CREATE='/usr/lib/bareos/scripts/ddl/creates/mysql.sql' +DDL_MYSQL_TMP="/tmp/mysql.sql.$$" + +#if database is already exists and noquestion set, do nothing +if [ ! -z $1 ]; then + noquestion=1 + if [ "$1" = "noquestion" ]; then + restart_mysql=1 + else + extract_file=$1 + fi +fi + +regen_user_bdd=0 + +function regen_mysql_pwd() { + /usr/share/eole/sbin/mysql_pwd.py $1 nomodif +} + +if [ ! -z $2 ]; then + bareos_db_type=$2 +else + bareos_db_type=$(CreoleGet bareos_db_type) +fi +if [ "$bareos_db_type" = "mysql" ]; then + passwd=$(pwgen 40 1) + options="-uroot -p$passwd -h $(CreoleGet adresse_ip_mysql)" +fi + +if [ "$noquestion" = "1" -o "$(CreoleGet activer_bareos_dir)" = "oui" ]; then + . /usr/lib/eole/ihm.sh + #(re)generation du catalog + rep=0 + if [ "$bareos_db_type" = "sqlite3" ]; then + [ -e $BAREOS_DB ] && allready_generate=1 + elif [ "$bareos_db_type" = "mysql" ]; then + if [ $(python -c "from eolesql.db_test import db_exists; print db_exists('bareos');") = "True" ]; then + allready_generate=1 + fi + else + echo "FIXME a faire" + exit 1 + fi + if [ ! -z $allready_generate ]; then + if [ "$noquestion" = "1" ]; then + if [ ! -z $extract_file ]; then + rep=0 + else + rep=1 + fi + else + Question_ouinon "La régénération du catalogue de la sauvegarde va écraser l'ancienne base, confirmez-vous ?" "$interactive" 'non' 'warn' + rep=$? + fi + fi + if [ "$rep" = "0" ]; then + echo + echo "## Régénération du catalogue Bareos##" + if [ -z $restart_mysql ]; then + CreoleService bareos-director stop + CreoleService bareos-storage stop + elif [ "$bareos_db_type" = "mysql" ]; then + CreoleService mysql start + fi + if [ "$bareos_db_type" = "mysql" ]; then + regen_mysql_pwd $passwd + fi + [ ! -z $allready_generate ] && /usr/lib/bareos/scripts/drop_bareos_database $options + /usr/lib/bareos/scripts/create_bareos_database $options + if [ "$bareos_db_type" = "mysql" ]; then + # Correction de la base de donnée (#17078, #19562) + cp -a $DDL_MYSQL_CREATE $DDL_MYSQL_TMP + sed -i "s/DATETIME DEFAULT 0/DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP/g;s/ClientId INT UNSIGNED DEFAULT NULL/ClientId INTEGER DEFAULT 0/g;s/FileSystem(256)/FileSystem(255)/g;s/EnvName(256)/EnvName(255)/g" $DDL_MYSQL_CREATE + fi + if [ "$bareos_db_type" = "mysql" ] || [ -z $extract_file ]; then + /usr/lib/bareos/scripts/make_bareos_tables $options + fi + if [ "$bareos_db_type" = "mysql" ]; then + cp -a $DDL_MYSQL_TMP $DDL_MYSQL_CREATE + rm -f $DDL_MYSQL_TMP + fi + if [ ! -z $extract_file ]; then + if [ "$bareos_db_type" = "sqlite3" ]; then + /usr/bin/sqlite3 $BAREOS_DB < $extract_file + elif [ "$bareos_db_type" = "mysql" ]; then + mysql $options bareos < $extract_file + fi + fi + regen_user_bdd=1 + need_startstop=1 + else + if [ -z $restart_mysql ]; then + exit 0 + fi + #regarde s'il y a un mot de passe à l'utilisateur bareos + if [ "$bareos_db_type" = "mysql" ]; then + if [ ! -z $restart_mysql ]; then + CreoleService mysql start + fi + echo "exit" | mysql -ubareos bareos &> /dev/null + [ $? -eq 0 ] && regen_user_bdd=1 + need_startstop=1 + fi + fi +fi + +if [ "$regen_user_bdd" = "1" ] && [ "$bareos_db_type" = "mysql" ]; then + if [ -z $restart_mysql ] && [ ! "$need_startstop" = "1" ]; then + CreoleService mysql start + fi + regen_mysql_pwd $passwd + mode_conteneur_actif=$(CreoleGet mode_conteneur_actif) +# if [ $mode_conteneur_actif = 'oui' ]; then + cp -a $DDL_MYSQL $DDL_MYSQL_TMP + echo "USE mysql +GRANT ALL PRIVILEGES ON TABLE @DB_NAME@.* TO @DB_USER@@$(CreoleGet adresse_ip_br0) @DB_PASS@; +FLUSH PRIVILEGES;" > $DDL_MYSQL +# fi + /usr/lib/bareos/scripts/grant_bareos_privileges $options +# if [ $mode_conteneur_actif = 'oui' ]; then + cp -a $DDL_MYSQL_TMP $DDL_MYSQL + rm -f $DDL_MYSQL_TMP +# fi + [ -z $restart_mysql ] && [ ! "$need_startstop" = "1" ] && CreoleService mysql stop +fi + +# Update the DB schema +if [ -x /usr/lib/bareos/scripts/update_bareos_tables ] +then + if [ "${bareos_db_type}" = 'mysql' ] + then + need_startstop=1 + CreoleService mysql start + fi + echo "Mise à jour de la base de donnée Bareos... " + /usr/share/eole/sbin/update_bareos_tables +fi + +if [ "$need_startstop" = "1" ]; then + echo "Régénération du catalogue terminée" + echo "Suppression des anciens rapports d'état" + sleep 5 + rm -f /var/lib/bareos/*.state + if [ -z $restart_mysql ]; then + CreoleService bareos-director start + CreoleService bareos-storage start + elif [ "$bareos_db_type" = "mysql" ]; then + CreoleService mysql stop + fi +fi diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/eole/sbin/bareosrestore.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/eole/sbin/bareosrestore.py new file mode 100644 index 0000000000000000000000000000000000000000..bab6989ba1bc3ed32ba15a6441f5133b0284c82c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/eole/sbin/bareosrestore.py @@ -0,0 +1,98 @@ +#!/usr/bin/env python +# -*- coding: UTF-8 -*- +""" +Lanceur + +""" + +import sys +from optparse import OptionParser +#from operator import itemgetter, attrgetter +from creole.config import bareos_restore_root, bareos_restore +sys.path.insert(0, bareos_restore_root) +sys.path.insert(0, bareos_restore) +import restore + +from pyeole.bareosrestore import exit_if_running_jobs +from pyeole.bareosrestoreplugins import list_bareos_restore, filter_built +# ____________________________________________________________ + +class Option(object): + """ + Objet de creation de l'import + """ + + def __init__(self, name, doc, jobid): + self.name = name + self.doc = doc + self.jobid = jobid + + def add_optparse_option(self, parser): + """ + bind entre le parser et la fonction + """ + parser.add_option("--"+self.name, help=self.doc, + action='callback', + callback=self.callback, + callback_args=(self.jobid,)) + +# ____________________________________________________________ + +def utils_imp(module, plug_options): + """Utilitaire d'import du module plugin""" + return __import__(module, globals(), locals(), plug_options) + +def add_options(option_names): + """Ajout des fonctions a partir des plugins""" + descr = [] + #on recharge le module plugin pour pouvoir importer les modules necessaires + plugin_imp = utils_imp('restore', option_names) + option = Option('all', 'Toutes les options', 0) + setattr(option, 'callback', opt_all) + descr.append(option) + list_bareos = list_bareos_restore() + for name in option_names: + func = sys.modules['restore.'+name] + jobid = list_bareos.index(name)+1 + option = Option(name, func.__doc__, jobid) + setattr(option, 'callback', func.execute) + descr.append(option) + return descr + +def opt_all(option, opt_str, value, parser, fake_jobid): + """Excution des fonction pour toutes les options""" + exit_if_running_jobs() + plug_options = filter_built(restore) + plugins = utils_imp('restore', plug_options) + plug_options_ordered = [] + list_bareos = list_bareos_restore() + #gestion des priorites lors de l'appel du module + for plug in plug_options: + func = sys.modules['restore.'+plug] + jobid = list_bareos.index(plug)+1 + if not dir(func).__contains__('priority'): + print "need priority for {0}".format(str(func)) + #exclude script with priority 0 + if func.priority != 0: + plug_options_ordered.append((func.priority, func.execute, jobid)) + + plug_options_ordered = sorted(plug_options_ordered) + for plug in plug_options_ordered: + plug[1](option, opt_str, value, parser, plug[2], False) + print "" + +def main(): + """Fonction principal""" + parser = OptionParser() + plug_options = filter_built(restore) + descr = add_options(plug_options) + #config = Config(descr) + for opt in descr: + opt.add_optparse_option(parser) + parser.parse_args() + if len(sys.argv) == 1: + parser.print_help() + sys.exit(1) + +if __name__ == '__main__': + main() diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/eole/sbin/update_bareos_tables b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/eole/sbin/update_bareos_tables new file mode 100644 index 0000000000000000000000000000000000000000..c45f9f5b74544e53e850ab8a0e9d2d573f6c4ff2 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/eole/sbin/update_bareos_tables @@ -0,0 +1,178 @@ +#!/bin/sh +# +# BAREOS® - Backup Archiving REcovery Open Sourced +# +# Copyright (C) 2000-2011 Free Software Foundation Europe e.V. +# Copyright (C) 2013-2014 Bareos GmbH & Co. KG +# +# This program is Free Software; you can redistribute it and/or +# modify it under the terms of version three of the GNU Affero General Public +# License as published by the Free Software Foundation and included +# in the file LICENSE. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. +# +# This script will update a BAREOS database to the latest version. +# + +# +# Source the Bareos config functions. +# +. /usr/lib/bareos/scripts/bareos-config-lib.sh + +db_name="${db_name:-`get_database_name @db_name@`}" +db_user="${db_user:-`get_database_user @db_user@`}" +db_password="${db_password-`get_database_password `}" +db_version=`get_database_version` +bareos_sql_ddl=`get_database_ddl_dir` +temp_sql_schema="/tmp/tables.sql.$$" +default_db_type=`get_database_driver_default` +working_dir=`get_working_dir` + +# +# See if the first argument is a valid backend name. +# If so the user overrides the default database backend. +# +if [ $# -gt 0 ]; then + case $1 in + sqlite3) + db_type=$1 + shift + ;; + mysql) + db_type=$1 + shift + ;; + postgresql) + db_type=$1 + shift + ;; + ingres) + db_type=$1 + shift + ;; + *) + ;; + esac +fi + +# +# If no new db_type is gives use the default db_type. +# +if [ -z "${db_type}" ]; then + db_type="${default_db_type}" +fi + +echo "Updating ${db_type} tables" + +bindir=`get_database_utility_path ${db_type}` +if [ ! -z "${bindir}" ]; then + PATH="$bindir:$PATH" +fi + +while [ 1 ] +do + # + # Figure out what the current version of the database is. + # + case ${db_type} in + sqlite3) + DBVERSION=`echo 'SELECT MAX(VersionId) FROM Version;' | sqlite3 ${working_dir}/${db_name}.db` + ;; + mysql) + DBVERSION=`mysql -h 127.0.0.1 -u$db_user -p$db_password -D ${db_name} $* -e "SELECT MAX(VersionId) FROM Version\G" | \ + sed -n -e 's/^.*VersionId.*: \(.*\)$/\1/p'` + ;; + postgresql) + DBVERSION=`psql -d ${db_name} -t --pset format=unaligned -c "SELECT MAX(VersionId) FROM Version;" $*` + ;; + ingres) + DBVERSION="@BDB_VERSION@" + ;; + *) + echo "Unknown database type ${db_type}" + exit 1 + ;; + esac + + if [ -z "${DBVERSION}" ]; then + echo "Unable to determine version of Bareos ${db_type} database" + exit 1 + fi + + if [ ${DBVERSION} = ${db_version} ]; then + echo "Finished upgrading database to version ${db_version}" + exit 0 + fi + + # + # See if its a known conversion. + # + found=0 + known_conversions=`ls ${bareos_sql_ddl}/updates/${db_type}* 2>/dev/null| \ + sed -e 's#.*/##' | \ + cut -d'.' -f2` + for conversion in ${known_conversions} + do + start_version=`echo ${conversion} | cut -d_ -f1` + end_version=`echo ${conversion} | cut -d_ -f2` + + if [ ${start_version} = ${DBVERSION} ]; then + found=1 + break + fi + done + + if [ ${found} = 0 ]; then + echo "Don't know how to upgrade from version ${DBVERSION} to ${db_version}" + exit 1 + fi + + sql_definitions="${bareos_sql_ddl}/updates/${db_type}.${conversion}.sql" + if [ ! -f ${sql_definitions} ]; then + echo "Unable to open database update definitions in file ${sql_definitions}" + exit 1 + fi + + sed -e "s/@DB_NAME@/${db_name}/" \ + -e "s/@DB_USER@/${db_user}/" \ + ${sql_definitions} > ${temp_sql_schema} + + echo "Upgrading database schema from version ${start_version} to ${end_version}" + + case ${db_type} in + sqlite3) + sqlite3 $* ${working_dir}/${db_name}.db < ${temp_sql_schema} + retval=0 + ;; + mysql) + mysql -D ${db_name} $* < ${temp_sql_schema} + retval=$? + ;; + postgresql) + psql -f ${temp_sql_schema} -d ${db_name} $* + retval=$? + ;; + ingres) + sql -u${db_user} $* ${db_name} < ${temp_sql_schema} + retval=$? + ;; + esac + + rm -f ${temp_sql_schema} + + if [ ${retval} != 0 ]; then + echo "Failed to upgrade database schema from version ${start_version} to ${end_version}" + break; + fi +done + +exit ${retval} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/eole/schedule/scripts/bareos b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/eole/schedule/scripts/bareos new file mode 100644 index 0000000000000000000000000000000000000000..e633937e9a720284efaed2bd70240cf0226b56d5 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/eole/schedule/scripts/bareos @@ -0,0 +1,9 @@ +#!/bin/bash + +DESC='Compactage de la base de donnée de Bareos' + +if [ -e /var/lib/bareos/bareos.db ]; then + sqlite3 /var/lib/bareos/bareos.db 'VACUUM;' +fi + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/zephir/monitor/configs/bareos.agent b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/zephir/monitor/configs/bareos.agent new file mode 100644 index 0000000000000000000000000000000000000000..15941ab64e86bb14df0a0e8964badcea45c69340 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/zephir/monitor/configs/bareos.agent @@ -0,0 +1,34 @@ +# -*- coding: UTF-8 -*- +""" +Surveillance des services Bareos activés +""" + +import re +from zephir.monitor.agentmanager.config import ACTIVER_BAREOS_DIR, ACTIVER_BAREOS_SD, BAREOS_MON_PASSWORD, NOM_MACHINE + +AGENTS = [] + +from zephir.monitor.agents.bareos import BareosService +from zephir.monitor.agents.bareosservices import BareosServices +agents = [] + +if ACTIVER_BAREOS_DIR: + agents.append(BareosService('bareos-dir', BAREOS_MON_PASSWORD, + NOM_MACHINE, period=115, + description='État du démon bareos-dir')) + agents.append(BareosService('bareos-fd', BAREOS_MON_PASSWORD, + NOM_MACHINE, period=115, + description='État du démon bareos-fd')) +if ACTIVER_BAREOS_SD: + agents.append(BareosService('bareos-sd', BAREOS_MON_PASSWORD, + NOM_MACHINE, period=115, + description='État du démon bareos-sd')) + +if agents != []: + AGENTS.extend(agents) + # meta-agent + AGENTS.append(BareosServices('bareosservices', + [agent.name for agent in agents], + period=60, + description='État des démons bareos', + section='Services')) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/zephir/monitor/configs/sauvegarde.agent b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/zephir/monitor/configs/sauvegarde.agent new file mode 100644 index 0000000000000000000000000000000000000000..1637921fdd62ca6475304456e74afe80baa56149 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/files/usr/share/zephir/monitor/configs/sauvegarde.agent @@ -0,0 +1,20 @@ +# -*- coding: UTF-8 -*- +""" +Etat des sauvegardes +""" +from zephir.monitor.agentmanager.config import ACTIVER_BAREOS_DIR + + +if ACTIVER_BAREOS_DIR: + from zephir.monitor.agents.sauvegarde import Sauvegarde + svg = Sauvegarde("sauvegarde", + period = 300, + description = """Sauvegarde""", + section="""Utilisation""", + ) + AGENTS = [svg] + +else: + + AGENTS = [] + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/posttemplates/00-bareos b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/posttemplates/00-bareos new file mode 100644 index 0000000000000000000000000000000000000000..1226ab274f56b7c42842c12d351707e8a3ae9c5b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/posttemplates/00-bareos @@ -0,0 +1,36 @@ +#!/bin/bash + +if [ "$(CreoleGet activer_bareos_dir)" = "oui" ]; then + . /usr/lib/eole/ihm.sh + # ne pas changer MOUNT_DIR : la /mnt/sauvegardes est utilisée par bareosmount.py + MOUNT_DIR='/mnt/sauvegardes' + #BAREOS_DB='/var/lib/bareos/bareos.db' + + #[ -f $BAREOS_DB ] && chown bareos:root $BAREOS_DB + + /usr/share/eole/sbin/bareosregen.sh noquestion + + # a ne faire qu'une seule fois + if [ ! -f /var/lib/eole/reports/rapport-bareos.txt ]; then + # rapports de sauvegarde pour l'EAD + touch /var/lib/eole/reports/rapport-bareos.txt + chown bareos /var/lib/eole/reports/rapport-bareos.txt + touch /var/lib/eole/reports/rapport-bareos-default.txt + chown bareos /var/lib/eole/reports/rapport-bareos-default.txt + touch /var/lib/eole/reports/resultat-bareos + chown bareos /var/lib/eole/reports/resultat-bareos + # rapport pour la restauration des données + touch /var/log/bareos/restore.txt + chown bareos /var/log/bareos/restore.txt + mkdir -p $MOUNT_DIR + chown bareos:root $MOUNT_DIR + + mkdir -p /var/run/bareos + chown bareos:bareos /var/run/bareos + fi + + mount | grep -q ' '$MOUNT_DIR' ' + [ $? = 0 ] && /usr/share/eole/sbin/bareosmount.py --umount +fi + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..20eea88c62ebb301384c8f8672b053b6a9a4473e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/service.yml @@ -0,0 +1,164 @@ +format: '0.1' +name: eole-bareos +version: |- + 2.7.1-2 +description: |- + Configuration (dictionnaire et templates) et Scripts bareos pour les modules Eole + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: [] +packages: + - creole + - eole-bareos-pkg + - python-pyeole +dictionaries: + - 23_bareos.xml +extra_dictionaries: + backuponce: + - 00_action.xml + backupreport: + - 00_action.xml + bareos: + - 00_bareos.xml + bareosfilesselection: + - 00_bareosfilesselection.xml + bareosremoteclient: + - 00_bareosremoteclient.xml + schedule: + - 01_bareos.xml +templates: + - bareos-common.logrotate + - bareos-config-lib.sh + - bareos-dir.conf + - bareos-fd.conf + - bareos-restore.conf + - bareos-sd.conf + - bareos.sudoers + - bareos_ead_extra.conf + - bareos_ead_extra_remote.conf + - bareosschedule.conf + - bareosschedule_remote.conf + - bareosschedulepost.conf + - bareosschedulepre.conf + - bareossupport.conf + - bat.conf + - bconsole.conf + - include-options.conf + - query.sql +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: + - 00-bareos +files: + /etc/bareos/bareosfichiers.d/bareos.conf: + owner: root + group: root + mode: '0644' + /etc/default/bareos-dir: + owner: root + group: root + mode: '0644' + /etc/default/bareos-fd: + owner: root + group: root + mode: '0644' + /etc/default/bareos-sd: + owner: root + group: root + mode: '0644' + /usr/share/ead2/backend/config/actions/actions_bareos.cfg: + owner: root + group: root + mode: '0644' + /usr/share/ead2/backend/config/perms/perm_bareos.ini: + owner: root + group: root + mode: '0644' + /usr/share/eole/bareos/delete_catalog_backup: + owner: root + group: root + mode: '0755' + /usr/share/eole/bareos/make_catalog_backup: + owner: root + group: root + mode: '0755' + /usr/share/eole/bareos/restore/__init__.py: + owner: root + group: root + mode: '0644' + /usr/share/eole/bareos/restore/all_files.py: + owner: root + group: root + mode: '0644' + /usr/share/eole/bareos/restore/catalog.py: + owner: root + group: root + mode: '0644' + /usr/share/eole/bareos/restore/configeol.py: + owner: root + group: root + mode: '0644' + /usr/share/eole/bareos/restore/file.py: + owner: root + group: root + mode: '0644' + /usr/share/eole/bareos/restore/folder.py: + owner: root + group: root + mode: '0644' + /usr/share/eole/bareos/restore/ls_folder.py: + owner: root + group: root + mode: '0644' + /usr/share/eole/bareos/restore/search.py: + owner: root + group: root + mode: '0644' + /usr/share/eole/diagnose/153-bareos: + owner: root + group: root + mode: '0755' + /usr/share/eole/sbin/bareosconfig.py: + owner: root + group: root + mode: '0755' + /usr/share/eole/sbin/bareosmount.py: + owner: root + group: root + mode: '0755' + /usr/share/eole/sbin/bareosregen.sh: + owner: root + group: root + mode: '0755' + /usr/share/eole/sbin/bareosrestore.py: + owner: root + group: root + mode: '0755' + /usr/share/eole/sbin/update_bareos_tables: + owner: root + group: root + mode: '0755' + /usr/share/eole/schedule/scripts/bareos: + owner: root + group: root + mode: '0755' + /usr/share/zephir/monitor/configs/bareos.agent: + owner: root + group: root + mode: '0644' + /usr/share/zephir/monitor/configs/sauvegarde.agent: + owner: root + group: root + mode: '0644' +excluding_regexp: + /usr/share/doc: 2 + /usr/share/eole/creole/extra/backuponce/salt/: 1 + /usr/share/eole/creole/extra/backuponce/sls/: 2 + /usr/share/eole/creole/extra/bareos/salt/: 1 + /usr/share/eole/creole/extra/bareos/sls/: 2 + /usr/share/eole/creole/extra/bareosfilesselection/salt/: 1 + /usr/share/eole/creole/extra/bareosfilesselection/sls/: 2 + /usr/share/eole/creole/extra/bareosremoteclient/salt/: 1 + /usr/share/eole/creole/extra/bareosremoteclient/sls/: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/bareos-common.logrotate b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/bareos-common.logrotate new file mode 100644 index 0000000000000000000000000000000000000000..de45c6b031a9620731e9d42699ab4bdf6d42c527 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/bareos-common.logrotate @@ -0,0 +1,21 @@ +/var/log/rsyslog/local/bareos-dir/*.log { + monthly + rotate 5 + notifempty + missingok +} + +/var/log/rsyslog/local/bareos-fd/*.log { + monthly + rotate 5 + notifempty + missingok +} +%if %%activer_bareos_sd == 'oui' +/var/log/rsyslog/local/bareos-sd/*.log { + monthly + rotate 5 + notifempty + missingok +} +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/bareos-config-lib.sh b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/bareos-config-lib.sh new file mode 100644 index 0000000000000000000000000000000000000000..15cbb2aa88e995e0791a77cd328fd7fd9774d8e2 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/bareos-config-lib.sh @@ -0,0 +1,4 @@ +working_dir=%%bareos_db_extract_dir +%if %%bareos_db_type == "mysql" +db_passwd=%%bareos_db_mysql_password +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/bareos-dir.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/bareos-dir.conf new file mode 100644 index 0000000000000000000000000000000000000000..fbe63941f0a7705e67a5ca8604ad6da88c866989 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/bareos-dir.conf @@ -0,0 +1,664 @@ +%if %%bareos_db_type == 'mysql' + %if %%adresse_ip_mysql == 'localhost' + %set %%dbaddress = "127.0.0.1" + %else + %set %%dbaddress = "%%adresse_ip_mysql" + %end if +%end if +##############################################################################r +# Directeur # +############################################################################### + +Director { + Name = %%bareos_dir_name + DIRport = 9101 + QueryFile = "/etc/bareos/query.sql" + WorkingDirectory = "/var/lib/bareos" + PidDirectory = "/var/run/bareos" + Maximum Concurrent Jobs = 1 + Heartbeat Interval = 10 + Password = "%%bareos_dir_password" # Console password + Messages = MessagesDir +} + +Console { + Name = bareos-%%{nom_machine}-mon + Password = %%creole_client.get('bareos.monitor.bareos_mon_password') + CommandACL = status, .status +} +%if %%getVar('activer_bareoswebui', 'non') == 'oui' + +@/etc/bareos/bareos-dir.d/profile/webui-admin.conf +%for %%user in %%bareoswebui_user + +Console { + Name = "%%user" + Password = "%%user.bareoswebui_password" + Profile = "webui-admin" +} +%end for +%end if + +############################################################################### +# Client local # +############################################################################### + +# Le client est toujours disponible pour sauvegarde le catalogue +Client { + Name = %%bareos_fd_name + Address = "127.0.0.1" + FDPort = 9102 + Catalog = MyCatalog + Password = "%%bareos_fd_remote_dir_password" # password for FileDaemon + #AutoPrune = yes # Prune expired Jobs/Files +# On garde la liste des fichiers aussi longtemps que nécessaire +# La durée maximale est la rétention des volumes de sauvegarde complet +# ou la retention de base si on n'utilise pas des pool séparés +# File Retention = %%bareos_full_retention %%bareos_full_retention_unit +# Job Retention = %%bareos_full_retention %%bareos_full_retention_unit +} +%if %%bareos_dir_set_remote_fds == 'oui' +%for %%bareos_fd in %%bareos_dir_remote_fd_name + +Client { + Name = %%bareos_fd.bareos_dir_remote_fd_display_name + Address = "%%bareos_fd.bareos_dir_remote_fd_address" + FDPort = 9102 + Catalog = MyCatalog + Password = "%%bareos_fd.bareos_dir_remote_fd_password" # password for FileDaemon + Passive = yes + #AutoPrune = yes # Prune expired Jobs/Files +} +%end for +%end if + +############################################################################### +# Schedule # +############################################################################### + +Schedule { + Name = "ScheduleDefaultPre" + @/etc/bareos/bareosschedulepre.conf +} +%if %%activer_bareos_fd == 'oui' + +Schedule { + Name = "ScheduleDefault" + @/etc/bareos/bareosschedule.conf +} +%end if + +Schedule { + Name = "ScheduleDefaultPost" + @/etc/bareos/bareosschedulepost.conf +} +%if %%bareos_dir_set_remote_fds == 'oui' +%for %%bareos_fd in %%bareos_dir_remote_fd_name + +Schedule { + Name = "Schedule%%{bareos_fd.bareos_dir_remote_fd_display_name}" + @/etc/bareos/%%{bareos_fd}/bareosschedule.conf +} +%end for +%end if + +############################################################################### +# Storage # +############################################################################### + +# StorageDescriptor (peut être local ou distant) +Storage { + Name = "%%bareos_dir_sd_name" +# Do not use "localhost" here + Address = "%%bareos_dir_sd_address" + SDPort = 9103 + Password = "%%bareos_dir_sd_password" + Device = FileStorage + Media Type = File +} + +############################################################################### +# Job # +############################################################################### + +FileSet { + Name = "FileSetDefault" +} + +JobDefs { + Name = "JobDefsDefault" + Type = Backup + Level = Full + Client = "%%bareos_fd_name" + Storage = "%%bareos_dir_sd_name" #CHANGER LE NOM + Messages = "MessagesDefault" +%if %%bareos_dir_use_local_sd == 'oui' + # L'option "Mount Command" dans bareos-sd.conf est exécutée à chaque fois donc on mount ici + # https://dev-eole.ac-dijon.fr/issues/8510 + RunBeforeJob = "sudo /usr/share/eole/sbin/bareosmount.py --mount" + RunAfterJob = "sudo /usr/share/eole/sbin/bareosmount.py --umount" + RunAfterFailedJob = "sudo /usr/share/eole/sbin/bareosmount.py --umount" +%end if +} +%if %%activer_bareos_fd == 'oui' + +JobDefs { + Name = "JobDefsSauvegarde" + Type = Backup + Storage = "%%bareos_dir_sd_name" + Client = "%%bareos_fd_name" + Messages = "MessagesSauvegarde" + Write Bootstrap = "/var/lib/bareos/%%{bareos_dir_name}-JobDefsSauvegarde.bsr" + # Debut Sauvegarde + RunBeforeJob = "sudo /usr/share/eole/sbin/bareosconfig.py --lock --daemon=%d --jobID=%i --backup_progress --jobType=sauvegarde" + ClientRunBeforeJob = "sudo /usr/share/eole/sbin/bareosconfig.py --lock --dir=%D --daemon=%d --jobID=%i --backup_progress --jobType=sauvegarde" + # bareosconfig effectue un test de montage, ce test démonte le support donc à effectuer AVANT le montage réel +%if %%bareos_dir_use_local_sd == 'oui' + RunBeforeJob = "sudo /usr/share/eole/sbin/bareosmount.py --mount" + RunAfterJob = "sudo /usr/share/eole/sbin/bareosmount.py --umount" + RunAfterFailedJob = "sudo /usr/share/eole/sbin/bareosmount.py --umount" +%end if + ClientRunAfterJob = "sudo /usr/share/eole/sbin/bareosconfig.py --unlock --dir=%D --daemon=%d --jobID=%i --backup_ok --jobType=sauvegarde" + RunAfterJob = "sudo /usr/share/eole/sbin/bareosconfig.py --unlock --daemon=%d --jobID=%i --backup_ok --jobType=sauvegarde" + RunAfterFailedJob = "sudo /usr/share/eole/sbin/bareosconfig.py --unlock --daemon=%d --jobID=%i --backup_err --jobType=sauvegarde" +} + +# List of files to be backed up +FileSet { + Name = "FileSetSauvegarde" + Exclude { + file = /proc + file = /tmp + file = /.journal + file = /.fsck + } +@|"sh -c 'for f in /etc/bareos/bareosfichiers.d/*.conf; do echo @${f}; done'" +} +%end if + +Job { + Name = "JobSchedulePre" + JobDefs = "JobDefsDefault" + Messages = "MessagesDefaultOverwrite" + Schedule = "ScheduleDefaultPre" + FileSet = "FileSetDefault" + Pool = "PoolDefault" + RunBeforeJob = "sudo /usr/share/eole/sbin/bareosconfig.py --lock --daemon=%d --jobID=%i --backup_progress --jobType=cronpre" + ClientRunBeforeJob = "sudo /usr/share/eole/sbin/bareosconfig.py --lock --dir=%D --daemon=%d --jobID=%i --backup_progress --jobType=cronpre" + ClientRunBeforeJob = "/usr/share/eole/schedule/schedule_bareos pre" + ClientRunAfterJob = "sudo /usr/share/eole/sbin/bareosconfig.py --unlock --dir=%D --daemon=%d --jobID=%i --backup_ok --jobType=cronpre" + RunAfterJob = "sudo /usr/share/eole/sbin/bareosconfig.py --unlock --daemon=%d --jobID=%i --backup_ok --jobType=cronpre" + RunAfterFailedJob = "sudo /usr/share/eole/sbin/bareosconfig.py --unlock --daemon=%d --jobID=%i --backup_err --jobType=cronpre" + Priority = 10 + Max Wait Time = 600 +} +%if %%activer_bareos_fd == 'oui' + +Job { + Name = "JobSauvegarde" + Schedule = "ScheduleDefault" + FileSet = "FileSetSauvegarde" + JobDefs = "JobDefsSauvegarde" + Pool = "Full-Pool" + Full Backup Pool = "Full-Pool" + Differential Backup Pool = "Diff-Pool" + Incremental Backup Pool = "Inc-Pool" + Priority = 20 + Max Run Time = %%bareos_max_run_time +} +%end if + +Job { + Name = "JobSchedulePost" + JobDefs = "JobDefsDefault" + Schedule = "ScheduleDefaultPost" + FileSet = "FileSetDefault" + Pool = "PoolDefault" + RunBeforeJob = "sudo /usr/share/eole/sbin/bareosconfig.py --lock --daemon=%d --jobID=%i --backup_progress --jobType=cronpost" + ClientRunBeforeJob = "sudo /usr/share/eole/sbin/bareosconfig.py --lock --dir=%D --daemon=%d --jobID=%i --backup_progress --jobType=cronpost" + ClientRunAfterJob = "/usr/share/eole/schedule/schedule_bareos post" + ClientRunAfterJob = "sudo /usr/share/eole/sbin/bareosconfig.py --unlock --dir=%D --daemon=%d --jobID=%i --backup_ok --jobType=cronpost" + RunAfterJob = "sudo /usr/share/eole/sbin/bareosconfig.py --unlock --daemon=%d --jobID=%i --backup_ok --jobType=cronpost" + RunAfterFailedJob = "sudo /usr/share/eole/sbin/bareosconfig.py --unlock --daemon=%d --jobID=%i --backup_err --jobType=cronpost" + Priority = 99 +} +%if %%bareos_dir_set_remote_fds == 'oui' +%for %%bareos_fd in %%bareos_dir_remote_fd_name + +JobDefs { + Name = "JobDefs%%{bareos_fd.bareos_dir_remote_fd_display_name}Default" + Type = Backup + Level = Full + Client = "%%bareos_fd.bareos_dir_remote_fd_display_name" + Storage = "%%bareos_dir_sd_name" #CHANGER LE NOM + Messages = "MessagesDefault" +%if %%bareos_dir_use_local_sd == 'oui' + # L'option "Mount Command" dans bareos-sd.conf est exécutée à chaque fois donc on mount ici + # https://dev-eole.ac-dijon.fr/issues/8510 + RunBeforeJob = "sudo /usr/share/eole/sbin/bareosmount.py --mount" + RunAfterJob = "sudo /usr/share/eole/sbin/bareosmount.py --umount" + RunAfterFailedJob = "sudo /usr/share/eole/sbin/bareosmount.py --umount" +%end if +} + +JobDefs { + Name = "JobDefs%%bareos_fd.bareos_dir_remote_fd_display_name" + Type = Backup + Storage = "%%bareos_dir_sd_name" + Client = "%%bareos_fd.bareos_dir_remote_fd_display_name" + Messages = "MessagesSauvegarde" + Write Bootstrap = "/var/lib/bareos/%%{bareos_fd.bareos_dir_remote_fd_display_name}-JobDefsSauvegarde.bsr" + # Debut Sauvegarde + RunBeforeJob = "sudo /usr/share/eole/sbin/bareosconfig.py --lock --daemon=%d --jobID=%i --backup_progress --jobType=sauvegarde" + ClientRunBeforeJob = "sudo /usr/share/eole/sbin/bareosconfig.py --lock --dir=%D --daemon=%d --jobID=%i --backup_progress --jobType=sauvegarde" + # bareosconfig effectue un test de montage, ce test démonte le support donc à effectuer AVANT le montage réel +%if %%bareos_dir_use_local_sd == 'oui' + RunBeforeJob = "sudo /usr/share/eole/sbin/bareosmount.py --mount" + RunAfterJob = "sudo /usr/share/eole/sbin/bareosmount.py --umount" + RunAfterFailedJob = "sudo /usr/share/eole/sbin/bareosmount.py --umount" +%end if + ClientRunAfterJob = "sudo /usr/share/eole/sbin/bareosconfig.py --unlock --dir=%D --daemon=%d --jobID=%i --backup_ok --jobType=sauvegarde" + RunAfterJob = "sudo /usr/share/eole/sbin/bareosconfig.py --unlock --daemon=%d --jobID=%i --backup_ok --jobType=sauvegarde" + RunAfterFailedJob = "sudo /usr/share/eole/sbin/bareosconfig.py --unlock --daemon=%d --jobID=%i --backup_err --jobType=sauvegarde" +} + +# List of files to be backed up +FileSet { + Name = "FileSet%%bareos_fd.bareos_dir_remote_fd_display_name" + Exclude { + file = /proc + file = /tmp + file = /.journal + file = /.fsck + } +@|"sh -c 'for f in /etc/bareos/%%{bareos_fd}/bareosfichiers.d/*.conf; do echo @${f}; done'" +} + +Job { + Name = "JobSchedule%%{bareos_fd.bareos_dir_remote_fd_display_name}Pre" + JobDefs = "JobDefs%%{bareos_fd.bareos_dir_remote_fd_display_name}Default" + Schedule = "ScheduleDefaultPre" + FileSet = "FileSetDefault" + Pool = "Full-Pool-%%bareos_fd.bareos_dir_remote_fd_display_name" + RunBeforeJob = "sudo /usr/share/eole/sbin/bareosconfig.py --lock --daemon=%d --jobID=%i --backup_progress --jobType=cronpre" + ClientRunBeforeJob = "sudo /usr/share/eole/sbin/bareosconfig.py --lock --dir=%D --daemon=%d --jobID=%i --backup_progress --jobType=cronpre" + ClientRunBeforeJob = "/usr/share/eole/schedule/schedule_bareos pre" + ClientRunAfterJob = "sudo /usr/share/eole/sbin/bareosconfig.py --unlock --dir=%D --daemon=%d --jobID=%i --backup_ok --jobType=cronpre" + RunAfterJob = "sudo /usr/share/eole/sbin/bareosconfig.py --unlock --daemon=%d --jobID=%i --backup_ok --jobType=cronpre" + RunAfterFailedJob = "sudo /usr/share/eole/sbin/bareosconfig.py --unlock --daemon=%d --jobID=%i --backup_err --jobType=cronpre" + Priority = 11 + Max Wait Time = 600 +} + +Job { + Name = "JobSauvegarde%%bareos_fd.bareos_dir_remote_fd_display_name" + Schedule = "Schedule%%bareos_fd.bareos_dir_remote_fd_display_name" + FileSet = "FileSet%%bareos_fd.bareos_dir_remote_fd_display_name" + JobDefs = "JobDefs%%bareos_fd.bareos_dir_remote_fd_display_name" + Pool = "Full-Pool-%%bareos_fd.bareos_dir_remote_fd_display_name" + Full Backup Pool = "Full-Pool-%%bareos_fd.bareos_dir_remote_fd_display_name" + Differential Backup Pool = "Diff-Pool-%%bareos_fd.bareos_dir_remote_fd_display_name" + Incremental Backup Pool = "Inc-Pool-%%bareos_fd.bareos_dir_remote_fd_display_name" + Priority = 20 + Max Run Time = %%bareos_max_run_time +} + +Job { + Name = "JobSchedule%%{bareos_fd.bareos_dir_remote_fd_display_name}Post" + JobDefs = "JobDefs%%{bareos_fd.bareos_dir_remote_fd_display_name}Default" + Schedule = "ScheduleDefaultPost" + FileSet = "FileSetDefault" + Pool = "Full-Pool-%%bareos_fd.bareos_dir_remote_fd_display_name" + RunBeforeJob = "sudo /usr/share/eole/sbin/bareosconfig.py --lock --daemon=%d --jobID=%i --backup_progress --jobType=cronpost" + ClientRunBeforeJob = "sudo /usr/share/eole/sbin/bareosconfig.py --lock --dir=%D --daemon=%d --jobID=%i --backup_progress --jobType=cronpost" + ClientRunAfterJob = "/usr/share/eole/schedule/schedule_bareos post" + ClientRunAfterJob = "sudo /usr/share/eole/sbin/bareosconfig.py --unlock --dir=%D --daemon=%d --jobID=%i --backup_ok --jobType=cronpost" + RunAfterJob = "sudo /usr/share/eole/sbin/bareosconfig.py --unlock --daemon=%d --jobID=%i --backup_ok --jobType=cronpost" + RunAfterFailedJob = "sudo /usr/share/eole/sbin/bareosconfig.py --unlock --daemon=%d --jobID=%i --backup_err --jobType=cronpost" + Priority = 98 +} +%end for +%end if + +############################################################################### +# Message # +############################################################################### + +%if not %%is_empty(%%system_mail_from) +%set adresse_expediteur=%%system_mail_from +%else +%set adresse_expediteur="bareos-" + %%nom_machine + "@" + %%nom_domaine_local +%end if +%set %%mail_error = %%custom_join(%%creole_client.get('/bareos/mail/mail_error'), ',') +%set %%mail_ok = %%custom_join(%%creole_client.get('/bareos/mail/mail_ok'), ',') + +Messages { + Name = "MessagesDir" + console = all, !skipped, !saved + syslog = all, !skipped, !saved +} + +Messages { + Name = "MessagesSauvegarde" + append = "/var/lib/eole/reports/rapport-bareos.txt" = all, !skipped, !notsaved + console = all, !skipped, !saved + syslog = all, !skipped, !saved + mailcommand = "/usr/bin/mutt -n -e \"set from=%%adresse_expediteur copy=no use_envelope_from=yes send_charset=utf-8\" -s \'%e : %%numero_etab sauvegarde \"%n\" %%nom_machine.%%nom_domaine_local\' -- %r" +%if %%mail_error != '' + MailOnError = %%mail_error = all + operatorcommand = "/usr/bin/mutt -n -e \"set from=%%adresse_expediteur copy=no use_envelope_from=yes send_charset=utf-8\" -s \"%e : %%numero_etab sauvegarde %%nom_machine.%%nom_domaine_local\" -- %r" + operator = %%mail_error = mount +%end if +%if %%mail_ok != '' + Mail = %%mail_ok = all +%end if +} + +Messages { + Name = "MessagesDefault" + append = "/var/lib/eole/reports/rapport-bareos.txt" = all, !skipped, !notsaved + console = all, !skipped, !saved + syslog = all, !skipped, !saved + mailcommand = "/usr/bin/mutt -n -e \"set from=%%adresse_expediteur copy=no use_envelope_from=yes send_charset=utf-8\" -s \'%e : %%numero_etab sauvegarde \"%n\" %%nom_machine.%%nom_domaine_local\' -- %r" +%if %%mail_error != '' and %%mail_ok != '' + MailOnError = %%mail_error, %%mail_ok = all + operatorcommand = "/usr/bin/mutt -n -e \"set from=%%adresse_expediteur copy=no use_envelope_from=yes send_charset=utf-8\" -s \"%e : %%numero_etab sauvegarde %%nom_machine.%%nom_domaine_local\" -- %r" + operator = %%mail_error = mount +%elif %%mail_error != '' + MailOnError = %%mail_error = all + operatorcommand = "/usr/bin/mutt -n -e \"set from=%%adresse_expediteur copy=no use_envelope_from=yes send_charset=utf-8\" -s \"%e : %%numero_etab sauvegarde %%nom_machine.%%nom_domaine_local\" -- %r" + operator = %%mail_error = mount +%elif %%mail_ok != '' + MailOnError = %%mail_ok = all +%end if +} + +# pour l'EAD, le rapport doit être écrasé en PRE backup pour ne contenir que la sauvegarde actuelle (Pre, Sauv, Catalogue, Post) +Messages { + Name = "MessagesDefaultOverwrite" + file = "/var/lib/eole/reports/rapport-bareos.txt" = all, !skipped, !notsaved + console = all, !skipped, !saved + syslog = all, !skipped, !saved + mailcommand = "/usr/bin/mutt -n -e \"set from=%%adresse_expediteur copy=no use_envelope_from=yes send_charset=utf-8\" -s \'%e : %%numero_etab sauvegarde \"%n\" %%nom_machine.%%nom_domaine_local\' -- %r" +%set %%mail_error = %%custom_join(%%creole_client.get('/bareos/mail/mail_error'), ',') +%set %%mail_ok = %%custom_join(%%creole_client.get('/bareos/mail/mail_ok'), ',') +%if %%mail_error != '' and %%mail_ok != '' + MailOnError = %%mail_error, %%mail_ok = all + operatorcommand = "/usr/bin/mutt -n -e \"set from=%%adresse_expediteur copy=no use_envelope_from=yes send_charset=utf-8\" -s \"%e : %%numero_etab sauvegarde %%nom_machine.%%nom_domaine_local\" -- %r" + operator = %%mail_error = mount +%elif %%mail_error != '' + MailOnError = %%mail_error = all + operatorcommand = "/usr/bin/mutt -n -e \"set from=%%adresse_expediteur copy=no use_envelope_from=yes send_charset=utf-8\" -s \"%e : %%numero_etab sauvegarde %%nom_machine.%%nom_domaine_local\" -- %r" + operator = %%mail_error = mount +%elif %%mail_ok != '' + MailOnError = %%mail_ok = all +%end if +} + +############################################################################### +# Pool # +############################################################################### + +# Default pool definition +Pool { + Name = "PoolDefault" + Pool Type = Backup + AutoPrune = yes + Recycle = yes # Bareos can automatically recycle Volumes + Maximum Volume Jobs = 1 + Maximum Volumes = 1 +# Accept Any Volume = yes # write on any volume in the pool + LabelFormat = "%%{bareos_dir_name}-volume-" + Volume Retention = 1 minutes + Recycle Oldest Volume = yes + Recycle Current Volume = yes + Maximum Volume Bytes = 1 gb +} +%if %%activer_bareos_fd == 'oui' + +# Pool for full backup +Pool { + Name = Full-Pool + Pool Type = Backup + Recycle = yes + AutoPrune = yes + Volume Retention = %%bareos_full_retention %%bareos_full_retention_unit +# Accept Any Volume = yes # write on any volume in the pool + LabelFormat = "%%{bareos_dir_name}-full-" + Recycle Oldest Volume = yes + # Max volume use is 2gb or 1 unit + Maximum Volume Bytes = 2 gb + Volume Use Duration = 1 %%bareos_full_retention_unit +} + +# Pool for Differential backup +Pool { + Name = Diff-Pool + Pool Type = Backup + Recycle = yes + AutoPrune = yes + Volume Retention = %%bareos_diff_retention %%bareos_diff_retention_unit +# Accept Any Volume = yes # write on any volume in the pool + LabelFormat = "%%{bareos_dir_name}-diff-" + Recycle Oldest Volume = yes + # Max volume use is 2gb or 1 unit + Maximum Volume Bytes = 2 gb + Volume Use Duration = 1 %%bareos_diff_retention_unit +} + +# Pool for incremental backup +Pool { + Name = Inc-Pool + Pool Type = Backup + Recycle = yes + AutoPrune = yes + Volume Retention = %%bareos_inc_retention %%bareos_inc_retention_unit +# Accept Any Volume = yes # write on any volume in the pool + LabelFormat = "%%{bareos_dir_name}-inc-" + Recycle Oldest Volume = yes + # Max volume use is 2gb or retention -1 (avoid very little volumes) + Maximum Volume Bytes = 2 gb + Volume Use Duration = 1 %%bareos_inc_retention_unit +} +%end if +%if %%bareos_dir_set_remote_fds == 'oui' +%for %%bareos_fd in %%bareos_dir_remote_fd_name + +Pool { + Name = Full-Pool-%%bareos_fd.bareos_dir_remote_fd_display_name + Pool Type = Backup + Recycle = yes + AutoPrune = yes + Volume Retention = %%bareos_full_retention %%bareos_full_retention_unit +# Accept Any Volume = yes # write on any volume in the pool + LabelFormat = "%%{bareos_fd.bareos_dir_remote_fd_display_name}-full-" + Recycle Oldest Volume = yes + # Max volume use is 2gb or 1 unit + Maximum Volume Bytes = 2 gb + Volume Use Duration = 1 %%bareos_full_retention_unit +} + +Pool { + Name = Diff-Pool-%%bareos_fd.bareos_dir_remote_fd_display_name + Pool Type = Backup + Recycle = yes + AutoPrune = yes + Volume Retention = %%bareos_diff_retention %%bareos_diff_retention_unit +# Accept Any Volume = yes # write on any volume in the pool + LabelFormat = "%%{bareos_fd.bareos_dir_remote_fd_display_name}-diff-" + Recycle Oldest Volume = yes + # Max volume use is 2gb or 1 unit + Maximum Volume Bytes = 2 gb + Volume Use Duration = 1 %%bareos_diff_retention_unit +} + +Pool { + Name = Inc-Pool-%%bareos_fd.bareos_dir_remote_fd_display_name + Pool Type = Backup + Recycle = yes + AutoPrune = yes + Volume Retention = %%bareos_inc_retention %%bareos_inc_retention_unit +# Accept Any Volume = yes # write on any volume in the pool + LabelFormat = "%%{bareos_fd.bareos_dir_remote_fd_display_name}-inc-" + Recycle Oldest Volume = yes + # Max volume use is 2gb or retention -1 (avoid very little volumes) + Maximum Volume Bytes = 2 gb + Volume Use Duration = 1 %%bareos_inc_retention_unit +} +%end for +%end if + +############################################################################### +# Catalogue # +############################################################################### + +# Generic catalog service +Catalog { + Name = MyCatalog + dbdriver = "%%bareos_db_type" + dbname = "bareos" + user = "bareos" +%if %%bareos_db_type == 'mysql' + dbaddress = "%%dbaddress" + password = "%%bareos_db_mysql_password" +%else + password = "" +%end if +} + +### Catalog Bareos ### +### le catalog est sur bareos-dir ### +# +Pool { + Name = "PoolCatalog" + Pool Type = Backup + Recycle = yes # Bareos can automatically recycle Volumes + AutoPrune = no # Prune expired volumes + Volume Retention = 1 seconds + Recycle Current Volume = yes + Maximum Volumes = 1 +# Accept Any Volume = yes # write on any volume in the pool + LabelFormat = "%%{bareos_dir_name}-catalog-" + Recycle Oldest Volume = yes + Maximum Volume Bytes = 2 gb + Maximum Volume Jobs = 1 +} + +JobDefs { + Name = "JobDefsCatalog" + Type = Backup + Storage = "%%bareos_dir_sd_name" + Client = "%%bareos_fd_name" + Messages = "MessagesDefault" + Write Bootstrap = "/var/lib/bareos/%%{bareos_dir_name}-JobDefsCatalog.bsr" + # Debut Sauvegarde + RunBeforeJob = "sudo /usr/share/eole/sbin/bareosconfig.py --lock --daemon=%d --jobID=%i --backup_progress --jobType=catalogue" + ClientRunBeforeJob = "sudo /usr/share/eole/sbin/bareosconfig.py --lock --dir=%D --daemon=%d --jobID=%i --backup_progress --jobType=catalogue" +%if %%bareos_dir_use_local_sd == 'oui' + # bareosconfig effectue un test de montage, ce test démonte le support donc à effectuer AVANT le montage réel + RunBeforeJob = "sudo /usr/share/eole/sbin/bareosmount.py --mount" + RunAfterJob = "sudo /usr/share/eole/sbin/bareosmount.py --umount" + RunAfterFailedJob = "sudo /usr/share/eole/sbin/bareosmount.py --umount" +%end if +%if %%bareos_db_type == 'mysql' + RunBeforeJob = "/usr/share/eole/bareos/make_catalog_backup -n bareos -u bareos -a %%dbaddress -t mysql" +%else + RunBeforeJob = "/usr/share/eole/bareos/make_catalog_backup -n bareos -t sqlite3" +%end if + RunAfterJob = "/usr/share/eole/bareos/delete_catalog_backup" + ClientRunAfterJob = "sudo /usr/share/eole/sbin/bareosconfig.py --unlock --dir=%D --daemon=%d --jobID=%i --backup_ok --jobType=catalogue" + RunAfterJob = "sudo /usr/share/eole/sbin/bareosconfig.py --unlock --daemon=%d --jobID=%i --backup_ok --jobType=catalogue" + RunAfterFailedJob = "sudo /usr/share/eole/sbin/bareosconfig.py --unlock --daemon=%d --jobID=%i --backup_err --jobType=catalogue" +} + +Job { + Name = "BackupCatalog" + JobDefs = "JobDefsCatalog" + FileSet = "FileSetCatalog" + Schedule = "ScheduleDefaultPost" +# Prune Jobs = "yes" + Pool = "PoolCatalog" + Priority = 97 +} + +FileSet { + Name = "FileSetCatalog" + Include { + Options { + signature = MD5 + wildfile = "*.bsr" + regexfile = "^%%bareos_db_extract_dir/bareos.sql" + regexfile = "^/etc/eole/bareos.conf" + } + Options { + exclude = Yes + regexfile = ".*" + regexdir = ".*" + } + File = /var/lib/bareos + File = /etc/eole + File = /etc/eole/config.eol + } +} + +############################################################################### +# Restauration # +############################################################################### + +Messages { + Name = "MessagesRestore" + file = "/var/log/bareos/restore.txt" = all, !skipped, !notsaved + console = all, !skipped, !saved + syslog = all, !skipped +} + +%if %%activer_bareos_fd == 'oui' +JobDefs { + Name = "JobDefsRestore" + Type = Restore + Client = %%bareos_fd_name + FileSet="FileSetSauvegarde" + Storage = %%bareos_dir_sd_name + Pool = Full-Pool + Full Backup Pool = Full-Pool + Differential Backup Pool = Diff-Pool + Incremental Backup Pool = Inc-Pool + Messages = MessagesRestore + Where = / +%if %%bareos_dir_use_local_sd == 'oui' + RunBeforeJob = "sudo /usr/share/eole/sbin/bareosmount.py --mount" + RunAfterJob = "sudo /usr/share/eole/sbin/bareosmount.py --umount" + RunAfterFailedJob = "sudo /usr/share/eole/sbin/bareosmount.py --umount" +%end if +} + +@/etc/bareos/bareos-restore.conf +%end if +%if %%bareos_dir_set_remote_fds == 'oui' +%for %%bareos_fd in %%bareos_dir_remote_fd_name +JobDefs { + Name = "JobDefsRestore%%bareos_fd.bareos_dir_remote_fd_display_name" + Type = Restore + Client = %%bareos_fd_name + FileSet = "FileSet%%bareos_fd.bareos_dir_remote_fd_display_name" + Storage = %%bareos_dir_sd_name + Pool = "Full-Pool-%%bareos_fd.bareos_dir_remote_fd_display_name" + Full Backup Pool = "Full-Pool-%%bareos_fd.bareos_dir_remote_fd_display_name" + Differential Backup Pool = "Diff-Pool-%%bareos_fd.bareos_dir_remote_fd_display_name" + Incremental Backup Pool = "Inc-Pool-%%bareos_fd.bareos_dir_remote_fd_display_name" + Messages = MessagesRestore + Where = / +%if %%bareos_dir_use_local_sd == 'oui' + RunBeforeJob = "sudo /usr/share/eole/sbin/bareosmount.py --mount" + RunAfterJob = "sudo /usr/share/eole/sbin/bareosmount.py --umount" + RunAfterFailedJob = "sudo /usr/share/eole/sbin/bareosmount.py --umount" +%end if +} + +Job { + Name = "Restore%%bareos_fd.bareos_dir_remote_fd_display_name" + JobDefs = "JobDefsRestore%%bareos_fd.bareos_dir_remote_fd_display_name" +} + +%end for +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/bareos-fd.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/bareos-fd.conf new file mode 100644 index 0000000000000000000000000000000000000000..9dc57d9040243ea69eb13f393da4d9e3b10f3948 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/bareos-fd.conf @@ -0,0 +1,37 @@ +# +# Default Bareos File Daemon Configuration file +# +# For Bareos release 1.36.1 (24 November 2004) -- mandrake (Bamboo) +# +# There is not much to change here except perhaps the +# File daemon Name to +# + +# +# "Global" File daemon configuration specifications +# +FileDaemon { # this is me + Name = %%bareos_fd_name + FDport = 9102 # where we listen for the director + WorkingDirectory = /var/lib/bareos + Pid Directory = /var/run/bareos + Maximum Concurrent Jobs = 20 + Heartbeat Interval = 10 +} + + +# Send all messages back to Director +Messages { + Name = %%bareos_fd_name + director = %%bareos_fd_remote_dir_name = all +} +# Director who are permitted to contact Storage daemon +Director { + Name = %%bareos_fd_remote_dir_name + Password = "%%bareos_fd_remote_dir_password" +} +Director { + Name = bareos-%%{nom_machine}-mon + Password = %%creole_client.get('bareos.monitor.bareos_mon_password') + Monitor = yes +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/bareos-restore.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/bareos-restore.conf new file mode 100644 index 0000000000000000000000000000000000000000..c4e29d5cc16c637b85c11a3daa00c807b439f213 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/bareos-restore.conf @@ -0,0 +1,15 @@ +%import pyeole.bareosrestoreplugins + +%for %%bareos_restore in %%pyeole.bareosrestoreplugins.list_bareos_restore() +Job { + Name = "Restore_%%bareos_restore" + JobDefs = "JobDefsRestore" + # Debut Sauvegarde + ClientRunBeforeJob = "/usr/share/eole/sbin/bareosrestore.py --%%bareos_restore pre" + # Fin Sauvegarde + ClientRunAfterJob = "/usr/share/eole/sbin/bareosrestore.py --%%bareos_restore post" + # Sauvegarde echouee ! + RunAfterFailedJob = "/usr/share/eole/sbin/bareosrestore.py --%%bareos_restore err" +} + +%end for diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/bareos-sd.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/bareos-sd.conf new file mode 100644 index 0000000000000000000000000000000000000000..b948d7a20c5136eac41ebb6c40a266ee0566e7f5 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/bareos-sd.conf @@ -0,0 +1,69 @@ + +# Default Bareos Storage Daemon Configuration file +# +# For Bareos release 1.36.1 (24 November 2004) -- mandrake (Bamboo) +# +# You may need to change the name of your tape drive +# on the "Archive Device" directive in the Device +# resource. If you change the Name and/or the +# "Media Type" in the Device resource, please ensure +# that dird.conf has corresponding changes. +# + +# +# "Global" Storage daemon configuration specifications +# +Storage { # definition of myself + Name = %%bareos_sd_name + SDPort = 9103 # Director's port + WorkingDirectory = "/var/lib/bareos" + Pid Directory = "/var/run/bareos" + Maximum Concurrent Jobs = 20 +} + +%if %%activer_bareos_dir == 'oui' +# Send all messages back to Director +Messages { +#FIXME + Name = %%bareos_sd_name + director = %%bareos_dir_name = all +} +# Director who are permitted to contact Storage daemon +Director { + Name = %%bareos_dir_name + Password = "%%bareos_dir_sd_password" +} +%else +Console { + Name = bareos-%%{nom_machine}-mon + Password = %%creole_client.get('bareos.monitor.bareos_mon_password') + Monitor = yes +} +%end if + +%if %%getVar('bareos_sd_set_remote_dirs', 'non') == 'oui' +%for %%bareos_dir in %%bareos_sd_remote_dir_name +Messages { + Name = %%bareos_dir + director = %%bareos_dir = all +} +Director { + Name = %%bareos_dir + Password = "%%bareos_dir.bareos_sd_remote_dir_password" +} +%end for +%end if + +Director { + Name = bareos-%%{nom_machine}-mon + Password = %%creole_client.get('bareos.monitor.bareos_mon_password') + Monitor = yes +} +# Devices supported by this Storage daemon +# To connect, the Director's bareos-dir.conf must have the +# same Name and MediaType. +# +Device { + @/etc/bareos/bareossupport.conf +} + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/bareos.sudoers b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/bareos.sudoers new file mode 100644 index 0000000000000000000000000000000000000000..ce7f77390790417869ba71196955acace6c30557 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/bareos.sudoers @@ -0,0 +1,4 @@ +bareos ALL=NOPASSWD : /usr/share/eole/sbin/bareosconfig.py +%if %%activer_bareos_sd == 'oui' +bareos ALL=NOPASSWD : /usr/share/eole/sbin/bareosmount.py +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/bareos_ead_extra.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/bareos_ead_extra.conf new file mode 100644 index 0000000000000000000000000000000000000000..daa9e2c1d1145075f97084597e142e0926b2f9bb --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/bareos_ead_extra.conf @@ -0,0 +1,30 @@ +%set %%extra_files = %%creole_client.get('/bareosfilesselection/extra_files/extra_includes') +%set %%extra_excludes = %%creole_client.get('/bareosfilesselection/extra_files/extra_excludes') +%set %%extra_excludes_regexp = %%creole_client.get('/bareosfilesselection/extra_files/extra_excludes_regexp') +# generate from ead action +%if (%%extra_files) +Include { + Options { + aclsupport = no + @/etc/bareos/include-options.conf + } +%for %%file in %%extra_files + File = %%file +%end for +%if (%%extra_excludes_regexp) + Options { + Exclude = yes +%for %%file in %%extra_excludes_regexp + RegexFile = "%%file" +%end for + } +%end if +} +%if (%%extra_excludes) +Exclude { +%for %%file in %%extra_excludes + File = %%file +%end for +} +%end if +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/bareos_ead_extra_remote.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/bareos_ead_extra_remote.conf new file mode 100644 index 0000000000000000000000000000000000000000..93586284053e061bf14d4fd2f9c2083b0d3d0fb2 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/bareos_ead_extra_remote.conf @@ -0,0 +1,31 @@ +%set %%bareos_fd = %%_creole_filename.split('/', 4)[3].split('.')[0] +%set %%_extra_files = %%creole_client.get('/bareosfilesselection/extra_files_{0}/extra_includes_{0}'.format(%%bareos_fd)) +%set %%_extra_excludes = %%creole_client.get('/bareosfilesselection/extra_files_{0}/extra_excludes_{0}'.format(%%bareos_fd)) +%set %%_extra_excludes_regexp = %%creole_client.get('/bareosfilesselection/extra_files_{0}/extra_excludes_regexp_{0}'.format(%%bareos_fd)) +# generate from ead action +%if (%%_extra_files) +Include { + Options { + aclsupport = no + @/etc/bareos/include-options.conf + } +%for %%file in %%_extra_files + File = %%file +%end for +%if (%%_extra_excludes_regexp) + Options { + Exclude = yes +%for %%file in %%_extra_excludes_regexp + RegexFile = "%%file" +%end for + } +%end if +} +%if (%%_extra_excludes) +Exclude { +%for %%file in %%_extra_excludes + File = %%file +%end for +} +%end if +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/bareosschedule.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/bareosschedule.conf new file mode 100644 index 0000000000000000000000000000000000000000..8203e1a9d77cece0417540cddfaf9a093db6f779 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/bareosschedule.conf @@ -0,0 +1,4 @@ +%set %%schedules = %%gen_bareos_schedule(%%creole_client.get('/bareos/job/job_type'), %%creole_client.get('/schedule/schedule')) +%for %%schedule in %%schedules + Run = %%schedule[0] %%schedule[1]%%schedule[2] at %%schedule[3]:00 +%end for diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/bareosschedule_remote.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/bareosschedule_remote.conf new file mode 100644 index 0000000000000000000000000000000000000000..f718c0a0a0cd32f1ad19023616d10120223b8849 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/bareosschedule_remote.conf @@ -0,0 +1,5 @@ +%set %%bareos_fd = %%_creole_filename.split('/', 4)[3].split('.')[0] +%set %%schedules = %%gen_bareos_schedule(%%creole_client.get('/bareosremoteclient/job_{0}/job_type_{0}'.format(%%bareos_fd)), %%creole_client.get('/schedule/schedule'), suffix='_{}'.format(%%bareos_fd)) +%for %%schedule in %%schedules + Run = %%schedule[0] %%schedule[1]%%schedule[2] at %%schedule[3]:00 +%end for diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/bareosschedulepost.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/bareosschedulepost.conf new file mode 100644 index 0000000000000000000000000000000000000000..207d6b9a7811cdd1aa088b6ab081bb8a77e93d08 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/bareosschedulepost.conf @@ -0,0 +1,14 @@ +%if %%bareos_dir_set_remote_fds == 'oui' +%set %%extra_jobs = %%creole_client.get('/bareosremoteclient') +%else +%set %%extra_jobs = None +%end if +%if %%activer_bareos_fd == 'oui' +%set %%localsettings = %%creole_client.get('/bareos/job/job_type') +%else +%set %%localsettings = {} +%end if +%set %%schedules = %%gen_bareos_schedule(%%localsettings, %%creole_client.get('/schedule/schedule'), extra_jobs=%%extra_jobs) +%for %%schedule in %%schedules + Run = Full %%schedule[1]%%schedule[4] at %%schedule[5]:%%schedule[6] +%end for diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/bareosschedulepre.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/bareosschedulepre.conf new file mode 100644 index 0000000000000000000000000000000000000000..2e7e85dc4412757b28ece7b93d321b1abcac300e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/bareosschedulepre.conf @@ -0,0 +1,14 @@ +%if %%bareos_dir_set_remote_fds == 'oui' +%set %%extra_jobs = %%creole_client.get('/bareosremoteclient') +%else +%set %%extra_jobs = None +%end if +%if %%activer_bareos_fd == 'oui' +%set %%localsettings = %%creole_client.get('/bareos/job/job_type') +%else +%set %%localsettings = {} +%end if +%set %%schedules = %%gen_bareos_schedule(%%localsettings, %%creole_client.get('/schedule/schedule'), extra_jobs=%%extra_jobs) +%for %%schedule in %%schedules + Run = Full %%schedule[1]%%schedule[2] at %%schedule[3]:00 +%end for diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/bareossupport.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/bareossupport.conf new file mode 100644 index 0000000000000000000000000000000000000000..31a20b15c540b7a2f7c1fa4ed198e95d669841fa --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/bareossupport.conf @@ -0,0 +1,39 @@ +%set %%support=%%creole_client.get('bareos.support.support_type') +#Fichier généré à la configuration de bareos +#il n'est pas templatisé en même temps que les autres + Name = FileStorage + LabelMedia = yes # lets Bareos label unlabeled media + Archive Device = /mnt/sauvegardes +%if %%support in ['none', 'manual'] + Media Type = File + Device type = File + Random Access = Yes + RemovableMedia = no + AlwaysOpen = no +#Si le support est une bande +# Media Type = Tape +# Device type = Tape +# Archive Device = /dev/nst0 +# Random Access = no +#la configuration par défaut ne démonte pas automatiquement le support +# Removable Media = no +# Always Open = yes +#pour le démontage automatique +#commenter les lignes précédentes et décommenter +# Removable Media = yes +# Always Open = no +%end if + +%if %%support in ['usb', 'smb'] + Media Type = File + Device type = File + Random Access = yes + Removable Media = no + Always Open = no + # https://dev-eole.ac-dijon.fr/issues/8510 + # Mount Point = /mnt/sauvegardes + # Mount Command = "sudo /usr/share/eole/sbin/bareosmount.py --mount" + # Unmount Command = "sudo /usr/share/eole/sbin/bareosmount.py --umount" + # Maximum Open Wait = 60 #attend 1 min pour le montage + # Requires Mount = yes +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/bat.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/bat.conf new file mode 100644 index 0000000000000000000000000000000000000000..0e8052ac57811106f5a7b2512cfb0ba8db7d5d26 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/bat.conf @@ -0,0 +1,10 @@ +# +# Bareos Administration Tool (bat) configuration file +# + +Director { + Name = 127.0.0.1-dir + DIRport = 9101 + address = localhost + Password = "%%bareos_dir_password" # Console password +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/bconsole.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/bconsole.conf new file mode 100644 index 0000000000000000000000000000000000000000..57db767e4f04805ffdc58a2a64790dd97abedf2f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/bconsole.conf @@ -0,0 +1,10 @@ +# +# Bareos User Agent (or Console) Configuration File +# + +Director { + Name = %%{nom_machine}-dir + DIRport = 9101 + address = 127.0.0.1 + Password = "%%bareos_dir_password" # Console password +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/include-options.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/include-options.conf new file mode 100644 index 0000000000000000000000000000000000000000..b84c6477abdc82d8820819830df277212010f18b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/include-options.conf @@ -0,0 +1,4 @@ +%if %%bareos_compression != 'Aucune' +compression = %%bareos_compression +%end if +signature = md5 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/query.sql b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/query.sql new file mode 100644 index 0000000000000000000000000000000000000000..596d53252000361a6f407207a3db606c3df9053f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareos/templates/query.sql @@ -0,0 +1,275 @@ +# +# This file contains sample queries +# that you can possibly use with the bconsole query command. +# + +# 1 +:List up to 20 places where a File is saved regardless of the directory and Client +*Enter Filename (no path): +SELECT DISTINCT Job.JobId AS JobId, Client.Name AS Client, + Path.Path,Filename.Name,StartTime,Level,JobFiles,ROUND(JobBytes/1024.0/1024.0/1024.0,3) AS SIZE_GB + FROM Client,Job,File,Filename,Path WHERE Client.ClientId=Job.ClientId + AND JobStatus IN ('T','W') AND Job.JobId=File.JobId + AND Path.PathId=File.PathId AND Filename.FilenameId=File.FilenameId + AND Filename.Name='%1' + ORDER BY Job.StartTime LIMIT 20; + +# 2 +:List where the most recent copies of a file with path of a Client are saved +*Enter path with trailing slash: +*Enter filename: +*Enter Client name: +SELECT DISTINCT Job.JobId,StartTime AS JobStartTime,VolumeName,Client.Name AS ClientName + FROM Job,File,Path,Filename,Media,JobMedia,Client + WHERE File.JobId=Job.JobId + AND Path.Path='%1' + AND Filename.Name='%2' + AND Client.Name='%3' + AND Path.PathId=File.PathId + AND Filename.FilenameId=File.FilenameId + AND JobMedia.JobId=Job.JobId + AND JobMedia.MediaId=Media.MediaId + AND Client.ClientId=Job.ClientId + ORDER BY Job.StartTime DESC LIMIT 5; + +# 3 +:List last 20 Full Backups for a Client +*Enter Client name: +SELECT DISTINCT Job.JobId,Client.Name AS Client,Starttime,JobFiles,ROUND(JobBytes/1024.0/1024.0/1024.0,3) AS GB + FROM Client,Job,JobMedia,Media + WHERE Client.Name='%1' + AND Client.ClientId=Job.ClientId + AND Level='F' AND JobStatus IN ('T', 'W') + AND JobMedia.JobId=Job.JobId + AND JobMedia.MediaId=Media.MediaId + ORDER BY Job.StartTime DESC LIMIT 20; + +# 4 +:List all backups for a Client after a specified time +*Enter Client Name: +*Enter time in YYYY-MM-DD HH:MM:SS format: +SELECT DISTINCT Job.JobId,Client.Name AS Client,Level,StartTime,JobFiles,ROUND(JobBytes/1024.0/1024.0/1024.0,3) AS GB,Count(VolumeName) AS Volumes + FROM Client,Job,JobMedia,Media + WHERE Client.Name='%1' + AND Client.ClientId=Job.ClientId + AND JobStatus IN ('T', 'W') + AND JobMedia.JobId=Job.JobId AND JobMedia.MediaId=Media.MediaId + AND Job.StartTime >= '%2' + GROUP BY Job.JobId,Client.Name,Level,StartTime,JobFiles,JobBytes + ORDER BY Job.StartTime; + +# 5 +:List all backups for a Client and COUNT the Volumes which been used +*Enter Client Name: +SELECT DISTINCT Job.JobId AS JobId,Client.Name AS Client, + FileSet.FileSet AS FileSet,Level,StartTime, + JobFiles,ROUND(JobBytes/1024.0/1024.0/1024.0,3) AS GB,Count(VolumeName) AS Volumes + FROM Client,Job,JobMedia,Media,FileSet + WHERE Client.Name='%1' + AND Client.ClientId=Job.ClientId AND Job.Type='B' + AND Job.JobStatus IN ('T','W') AND Job.FileSetId=FileSet.FileSetId + AND JobMedia.JobId=Job.JobId AND JobMedia.MediaId=Media.MediaId + GROUP BY Job.JobId,Client.Name,FileSet.FileSet,Level,StartTime,JobFiles,JobBytes + ORDER BY Job.StartTime; + +# 6 +:List Volume Attributes for a selected Volume +*Enter Volume name: +SELECT Slot,MaxVolBytes,VolCapacityBytes,VolStatus,Recycle,VolRetention, + VolUseDuration,MaxVolJobs,MaxVolFiles + FROM Media + WHERE VolumeName='%1'; + +# 7 +:List Volumes used by selected JobId +*Enter JobId: +SELECT DISTINCT Job.JobId,VolumeName + FROM Job,JobMedia,Media + WHERE Job.JobId=%1 + AND Job.JobId=JobMedia.JobId + AND JobMedia.MediaId=Media.MediaId; +# 8 +:List Volumes to Restore All Files +*Enter Client Name: +!DROP TABLE temp; +!DROP TABLE temp2; +CREATE TABLE temp (JobId BIGINT NOT NULL, + JobTDate BIGINT, + ClientId BIGINT, + Level CHAR, + StartTime TEXT, + VolumeName TEXT, + StartFile BIGINT, + VolSessionId BIGINT, + VolSessionTime BIGINT ); +CREATE TABLE temp2 (JobId BIGINT NOT NULL, + StartTime TEXT, + VolumeName TEXT, + Level CHAR, + StartFile BIGINT, + VolSessionId BIGINT, + VolSessionTime BIGINT); +# Select last Full save +INSERT INTO temp SELECT Job.JobId,JobTDate,Job.ClientId,Job.Level, + StartTime,VolumeName,JobMedia.StartFile,VolSessionId,VolSessionTime + FROM Client,Job,JobMedia,Media WHERE Client.Name='%1' + AND Client.ClientId=Job.ClientId + AND Level='F' AND JobStatus IN ('T', 'W') + AND JobMedia.JobId=Job.JobId + AND JobMedia.MediaId=Media.MediaId + ORDER BY Job.JobTDate DESC LIMIT 1; +# Copy into temp 2 getting all volumes of Full save +INSERT INTO temp2 SELECT Job.JobId,Job.StartTime,Media.VolumeName,Job.Level, + JobMedia.StartFile,Job.VolSessionId,Job.VolSessionTime + FROM temp,Job,JobMedia,Media WHERE temp.JobId=Job.JobId + AND Job.Level='F' AND Job.JobStatus IN ('T', 'W') + AND JobMedia.JobId=Job.JobId + AND JobMedia.MediaId=Media.MediaId; +# Now add subsequent incrementals +INSERT INTO temp2 SELECT DISTINCT Job.JobId,Job.StartTime,Media.VolumeName, + Job.Level,JobMedia.StartFile,Job.VolSessionId,Job.VolSessionTime + FROM Job,temp,JobMedia,Media + WHERE Job.JobTDate>temp.JobTDate + AND Job.ClientId=temp.ClientId + AND Job.Level IN ('I','D') AND JobStatus IN ('T', 'W') + AND JobMedia.JobId=Job.JobId + AND JobMedia.MediaId=Media.MediaId; +# list results +SELECT DISTINCT VolumeName from temp2; +!DROP TABLE temp; +!DROP TABLE temp2; + +# 9 +:List Pool Attributes for a selected Pool +*Enter Pool name: +SELECT Recycle,VolRetention,VolUseDuration,MaxVolJobs,MaxVolFiles,MaxVolBytes + FROM Pool + WHERE Name='%1'; + +# 10 +:List total files/bytes by Job +SELECT COUNT(*) AS Jobs,SUM(JobFiles) AS Files,ROUND(SUM(JobBytes/1024.0/1024.0/1024.0),3) AS GB, Name AS Job + FROM Job + GROUP by Name; + +# 11 +:List total files/bytes by Volume +SELECT COUNT(*) AS Jobs,SUM(JobFiles) AS Files,ROUND(SUM(JobBytes/1024.0/1024.0/1024.0),3) AS GB, VolumeName + FROM Job,JobMedia,Media + WHERE JobMedia.JobId=Job.JobId + AND JobMedia.MediaId=Media.MediaId + GROUP by VolumeName; + +# 12 +:List Files for a selected JobId +*Enter JobId: +SELECT Path.Path,Filename.Name FROM File,Filename,Path WHERE File.JobId=%1 + AND Filename.FilenameId=File.FilenameId + AND Path.PathId=File.PathId ORDER BY + Path.Path,Filename.Name; + +# 13 +:List Jobs stored on a selected MediaId +*Enter MediaId: +SELECT DISTINCT Job.JobId,Job.Name,Job.StartTime,Job.Type, + Job.Level,Job.JobFiles,ROUND(Job.JobBytes/1024.0/1024.0/1024.0,3) AS GB,Job.JobStatus + FROM JobMedia,Job + WHERE JobMedia.JobId=Job.JobId + AND JobMedia.MediaId=%1 + ORDER by Job.StartTime; + +# 14 +:List Jobs stored for a given Volume name +*Enter Volume name: +SELECT DISTINCT Job.JobId AS JobId,Job.Name AS Name,Job.StartTime AS StartTime, + Job.Type AS Type,Job.Level AS Level,Job.JobFiles AS Files, + ROUND(Job.JobBytes/1024.0/1024.0/1024.0,3) AS GB ,Job.JobStatus AS Status + FROM Media,JobMedia,Job + WHERE Media.VolumeName='%1' + AND Media.MediaId=JobMedia.MediaId + AND JobMedia.JobId=Job.JobId + ORDER by Job.StartTime; + +# 15 +:List Volumes Bareos thinks are in changer +SELECT MediaId,VolumeName,ROUND(VolBytes/(1024.0*1024.0*1024.0),3) AS GB,Storage.Name + AS Storage,Slot,Pool.Name AS Pool,MediaType,VolStatus + FROM Media,Pool,Storage + WHERE Media.PoolId=Pool.PoolId + AND Slot>0 AND InChanger=1 + AND Media.StorageId=Storage.StorageId + ORDER BY MediaType ASC, Slot ASC; + +# 16 +:List Volumes likely to need replacement from age or errors +SELECT VolumeName AS Volume,VolErrors AS Errors, VolMounts AS Mounts, +VolWrites AS Writes,RecycleCount,VolStatus AS Status + FROM Media + WHERE (VolErrors>0) OR (VolStatus='Error') OR (VolMounts>50) OR + (VolStatus='Disabled') OR (VolWrites>3999999) + ORDER BY VolErrors DESC, VolStatus, VolMounts,VolumeName DESC; + +# 17 +:List Volumes Bareos thinks are eligible for the changer +SELECT VolumeName,VolStatus,Storage.Name AS Location, + VolBytes/(1024*1024*1024) AS GB,MediaId,MediaType,Pool.Name AS Pool + FROM Media,Pool,Storage + WHERE Media.PoolId=Pool.PoolId + AND Media.StorageId=Storage.StorageId + AND InChanger=0 + AND ((VolStatus='Purged') OR (VolStatus='Append') OR (VolStatus='Recycle')) + ORDER BY VolMounts ASC, Pool.Name ASC, VolumeName ASC + +# 18 +:List Volumes by Volume: +SELECT VolumeName, Job.JobId AS JobID, Job.Name AS JobName, Job.StartTime AS +Start, JobFiles AS Files,ROUND(JobBytes/1024.0/1024.0/1024.0,3) AS GB + FROM Job,JobMedia,Media + WHERE JobMedia.JobId=Job.JobId + AND JobMedia.MediaId=Media.MediaId + GROUP by VolumeName, Job.JobID, Job.Name, JobBytes, JobFiles, Job.StartTime + ORDER by VolumeName; + +# 19 +:List Volumes by Jobs: +SELECT Job.Name AS JobName, Job.JobId AS JobID, VolumeName, Job.StartTime AS +Start, JobFiles AS Files,ROUND(JobBytes/1024.0/1024.0/1024.0,3) AS GB + FROM Job,JobMedia,Media + WHERE JobMedia.JobId=Job.JobId + AND JobMedia.MediaId=Media.MediaId + GROUP by VolumeName, Job.JobID, Job.Name, JobBytes, JobFiles, Job.StartTime + ORDER by JobName, Start; + +# 20 +:List Volumes for a jobname: +*Enter Job name: +SELECT Job.Name AS JobName, Job.JobId AS JobID, VolumeName, Job.StartTime AS +Start, JobFiles AS Files,ROUND(JobBytes/1024.0/1024.0/1024.0,3) AS Bytes + FROM Job,JobMedia,Media + WHERE Job.Name='%1' + AND JobMedia.JobId=Job.JobId + AND JobMedia.MediaId=Media.MediaId + GROUP by VolumeName, Job.JobID, Job.Name, JobBytes, JobFiles, Job.StartTime + ORDER by JobName, Start; + +################################################################################ +# Fonctions utilisées par les outils EOLE # +################################################################################ + +# La numérotation n'est pas utilisée par les fonctions EOLE. +# La découverte du numéro pour appeler une fonction donnée est effectuée par +# correspondance d'un motif de type (EOLE:<nom de fonction>). + +# Fonction pour récupérer le nombre de jobs en cours +:Count Running Jobs (EOLE:running_jobs) +SELECT count(*) AS NB + FROM Job + WHERE JobStatus IN ('R','B','F','S','m','M','s','j','c','d','t','p','a','i'); + +# Fonction pour récupérer le volume de données par pool +:List total bytes by Pool (EOLE:pools_size) +SELECT Pool.Name AS PoolName, sum(VolBytes) AS Bytes + FROM Media,Pool + WHERE Pool.PoolID = Media.PoolID + GROUP by Media.PoolID; + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareoswebui/dictionaries/21_bareoswebui.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareoswebui/dictionaries/21_bareoswebui.xml new file mode 100644 index 0000000000000000000000000000000000000000..058bd841890ee5aee1ce287531a2065fb711aff1 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareoswebui/dictionaries/21_bareoswebui.xml @@ -0,0 +1,54 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + <files/> + <containers> + <container name="web"> + <package>eole-bareoswebui-pkg</package> + <service method="apache" servicelist="bareoswebui">bareos-webui</service> + <file filelist="bareoswebui" name="/etc/bareos-webui/directors.ini" source="bareoswebui-directors.ini"/> + </container> + </containers> + <variables> + <family name='applications web'> + <variable name='activer_bareoswebui' type='oui/non' description="Activer Bareos WebUI (gestion de la sauvegarde)"> + <value>non</value> + </variable> + </family> + <family name='bareos webui' icon='archive'> + <variable name='bareoswebui_user' type='unix_user' description="Utilisateur autorisé à se connecter à l'interface web de gestion de la sauvegarde" mandatory="True" multi='True'/> + <variable name='bareoswebui_password' type='password' description="Mot de passe de l'utilisateur autorisé à se connecter à l'interface web de gestion de la sauvegarde" mandatory="True"/> + <variable name='bareoswebui_db_mysql_password' type='password' description="Mot de passe de la base de données MySQL de la sauvegarde" auto_freeze='True'/> + </family> + </variables> + <constraints> + <fill name='gen_random' target='bareoswebui_db_mysql_password'/> + <group master='bareoswebui_user'> + <slave>bareoswebui_password</slave> + </group> + <condition name='disabled_if_in' source='activer_bareoswebui'> + <param>non</param> + <target type='family'>bareos webui</target> + <target type='filelist'>bareoswebui</target> + <target type='servicelist'>bareoswebui</target> + </condition> + <condition name='disabled_if_not_in' source='activer_bareos_dir'> + <param>oui</param> + <target>activer_bareoswebui</target> + </condition> + <condition name='disabled_if_not_in' source='activer_mysql'> + <param>oui</param> + <target>activer_bareoswebui</target> + </condition> + <condition name='disabled_if_not_in' source='bareos_db_type'> + <param>mysql</param> + <target>activer_bareoswebui</target> + </condition> + </constraints> + <help> + <family name='bareos webui'>Paramétrage de l'application web Bareos WebUI</family> + <variable name='activer_bareoswebui'>Bareos WebUI est une application web permettant de surveiller et gérer les sauvegardes Bareos</variable> + </help> +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareoswebui/extra_dictionaries/backupstate/00_action.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareoswebui/extra_dictionaries/backupstate/00_action.xml new file mode 100644 index 0000000000000000000000000000000000000000..31e6147b5a315b9986448096dcba996f9b5ce6b7 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareoswebui/extra_dictionaries/backupstate/00_action.xml @@ -0,0 +1,30 @@ +<creole> + <family_action name="Sauvegarde"> + <action type="apache" + title="Afficher l'état des sauvegardes" + description="Accéder à bareos-web pour voir l'état des sauvegardes (en cours, en attente, réussies, en échec)" + image="backup.svg" + actionlist="backupstate" + apache_path="bareos-webui"> + <profile>ead_admin</profile> + <ewtapp>ead</ewtapp> + <tag>sauvegarde</tag> + <tag>bareos</tag> + <tag>bareoswebui</tag> + </action> + </family_action> + <variables> + <family name="backupstate"></family> + </variables> + <constraints> + <condition name="disabled_if_in" source="activer_bareoswebui" fallback="True"> + <param>non</param> + <target type='actionlist'>backupstate</target> + </condition> + <condition name ='disabled_if_in' source='activer_bareos_dir'> + <param>non</param> + <target type='actionlist'>backupstate</target> + </condition> + </constraints> + <help/> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareoswebui/posttemplates/00-bareoswebui b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareoswebui/posttemplates/00-bareoswebui new file mode 100644 index 0000000000000000000000000000000000000000..5b94ccadbea299fe0070554f6d62f6c8e9e8a0a6 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareoswebui/posttemplates/00-bareoswebui @@ -0,0 +1,22 @@ +#!/bin/bash + +container_path_web=$(CreoleGet container_path_web) +PWD_OK=$container_path_web/etc/bareos-webui/password.ok + +if [ "$(CreoleGet activer_bareoswebui non)" = "oui" ] && [ ! -f $PWD_OK ];then + # droits en lecture pour l'utilisateur bareos_webui + set -e + path_mysql=$(CreoleGet container_path_mysql) + ip_web=$(CreoleGet container_ip_web) + DB_USER=bareos_webui + DB_PASS=$(CreoleGet bareoswebui_db_mysql_password) + /usr/lib/bareos/scripts/bareos-config get_database_grant_privileges mysql $DB_USER $DB_PASS readonly | sed "s/127.0.0.1/$ip_web/g" > $path_mysql/tmp/database_grant_privileges.sql + CreoleService mysql start + CreoleRun "mysql --defaults-file=/etc/mysql/debian.cnf < /tmp/database_grant_privileges.sql" "mysql" + CreoleRun "mysqladmin --defaults-file=/etc/mysql/debian.cnf flush-privileges" "mysql" + CreoleService mysql stop + rm -f $path_mysql/tmp/database_grant_privileges.sql + set +e + touch $PWD_OK +fi +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareoswebui/preservices/00-bareoswebui b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareoswebui/preservices/00-bareoswebui new file mode 100644 index 0000000000000000000000000000000000000000..075de96dcb007c3b84b366bf7252ceb1aa078914 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareoswebui/preservices/00-bareoswebui @@ -0,0 +1,15 @@ +#!/bin/bash + +#Il faut un sites-available et non un conf-available + +path=$(CreoleGet container_path_web) + +#desactive le conf-enabled +[ -f $path/etc/apache2/conf-enabled/bareos-webui.conf ] && CreoleRun "a2disconf bareos-webui" "web" + +#copie en sites-available +sites_available=$path/etc/apache2/sites-available/bareos-webui +conf_available=$path/etc/apache2/conf-available/bareos-webui.conf +[ ! -f $sites_available ] && cp -a $conf_available $sites_available + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareoswebui/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareoswebui/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..72b71854a6da356b880bf724d8e4ee3d384711a1 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareoswebui/service.yml @@ -0,0 +1,30 @@ +format: '0.1' +name: eole-bareoswebui +version: |- + 2.7.0-1 +description: |- + Configuration (dictionnaire et templates) et Scripts bareoswebui pour les modules Eole + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: + - eole-mysql + - eole-web + - eole-bareos +packages: [] +dictionaries: + - 21_bareoswebui.xml +extra_dictionaries: + backupstate: + - 00_action.xml +templates: + - bareoswebui-directors.ini +creole_funcs: [] +preservices: + - 00-bareoswebui +postservices: [] +pretemplates: [] +posttemplates: + - 00-bareoswebui +files: {} +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareoswebui/templates/bareoswebui-directors.ini b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareoswebui/templates/bareoswebui-directors.ini new file mode 100644 index 0000000000000000000000000000000000000000..5d657e2d405d92b42335eee0855981db1694c646 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-bareoswebui/templates/bareoswebui-directors.ini @@ -0,0 +1,47 @@ +; +; Bareos WebUI Configuration +; File: /etc/bareos-webui/directors.ini +; + +; +; Section localhost-dir +; +[%%bareos_dir_name] + +; Enable or disable section. Possible values are "yes" or "no", the default is "yes". +enabled = "yes" + +; Possible values are "postgresql" or "mysql", the default is "postgresql" +dbdriver = "mysql" + +; Fill in the IP-Address or FQDN of your catalog DB +dbaddress = "%%adresse_ip_mysql" + +; Default values are corresponding to your dbriver, e.g 5432 or 3306 +dbport = 3306 + +; Default is "bareos" +dbuser = "bareos_webui" + +; No default value +dbpassword = "%%bareoswebui_db_mysql_password" + +; Default is set to "bareos" +dbname = "bareos" + +; Fill in the IP-Address or FQDN of you director. +diraddress = "%%adresse_ip_br0" + +; Default value is 9101 +dirport = 9101 + +; Note: TLS has not been tested and documented, yet. +;tls_verify_peer = false +;server_can_do_tls = false +;server_requires_tls = false +;client_can_do_tls = false +;client_requires_tls = false +;ca_file = "" +;cert_file = "" +;cert_file_passphrase = "" +;allowed_cns = "" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-client-annuaire/creole_funcs/eos-ldapreader.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-client-annuaire/creole_funcs/eos-ldapreader.py new file mode 100644 index 0000000000000000000000000000000000000000..87f283b3e47ec683fbbacd4d33b4dd7f39f9b5b9 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-client-annuaire/creole_funcs/eos-ldapreader.py @@ -0,0 +1,13 @@ +#!/usr/bin/python + +def pwdreader(encoder,reader): + try: + mypwdreader=open(reader, "r").readline().rstrip() + if encoder == "": + return mypwdreader + elif encoder == "base64": + import base64 + return base64.b64encode(mypwdreader) + + except: + return "mot de passe inconnu" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-client-annuaire/dictionaries/00_eole-client-annuaire_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-client-annuaire/dictionaries/00_eole-client-annuaire_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..c1dae42c11e3c234d54e9e6df70d23fb36ed915d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-client-annuaire/dictionaries/00_eole-client-annuaire_packages.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>eole-client-annuaire-pkg</package> + <package>eole-nsswitch</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-client-annuaire/dictionaries/20_client_annuaire.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-client-annuaire/dictionaries/20_client_annuaire.xml new file mode 100644 index 0000000000000000000000000000000000000000..5ed980cb83be9d8d49b8026a3fdcc47fa916a018 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-client-annuaire/dictionaries/20_client_annuaire.xml @@ -0,0 +1,102 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + <files> + <file name='/etc/ldap.conf'/> + <file name='/etc/nsswitch.conf.default'/> + <file filelist='ldap_nss_active' name='/etc/nsswitch.conf.noldap' rm='True'/> + <file filelist='client_ldap' rm='True' name='/etc/ldap/ldap.conf'/> + </files> + + <variables> + <family name='services'> + <!--activer_client_ldap peut être non/local/distant--> + <variable name='activer_client_ldap' type='string' description="Activer le client LDAP"> + <value>distant</value> + </variable> + </family> + <family name="annuaire" icon='book'> + <variable name='adresse_ip_ldap' type='domain' description="Adresse IP ou nom DNS du serveur LDAP" mandatory='True'/> + <variable name='ldap_base_dn' type='string' description="Base DN de l'annuaire"> + <value>o=gouv,c=fr</value> + </variable> + <variable name='ldap_tls' type='oui/non' description="Activer le support de TLS"> + <value>non</value> + </variable> + <variable name='ldap_nss' type='oui/non' description="Ajouter les utilisateurs LDAP aux utilisateurs locaux"> + <value>non</value> + </variable> + <variable name='ldap_port' type='port' description='Port du serveur LDAP' mandatory='True'> + <value>389</value> + </variable> + <variable name='ldap_reader' type='string' description='Utilisateur de lecture des comptes LDAP'/> + <variable name='ldap_reader_passfile' type='filename' description="Fichier de mot de passe de l'utilisateur de lecture"> + <value>/root/.reader</value> + </variable> + <variable name='activer_admin_passfile' type='oui/non' description="Définir le mot de passe admin de LDAP dans un fichier"> + <value>non</value> + </variable> + <variable name='ldap_admin_passfile' type='filename' description="Fichier de mot de passe de l'utilisateur admin" mode='expert'> + <value>/root/.writer</value> + </variable> + <variable name='ldap_match_attribute' type='string' description="Attribut de recherche des utilisateurs" mode='expert'> + <value>uid</value> + </variable> + <variable name='ldap_filter_user' type='string' description="Filtre d'utilisateurs" mode='expert'> + <value>objectClass=person</value> + </variable> + <variable name='ldap_filter_group' type='string' description="Filtre de groupes" mode='expert'> + <value>objectClass=posixGroup</value> + </variable> + <variable name='ldap_dntree_user' type='string' description="DN racine de l'arbre utilisateurs" mode='expert'/> + <variable name='ldap_dntree_group' type='string' description="DN racine de l'arbre groupes" mode='expert'/> + <variable name='ldap_fill_displayname' type='string' description="Champ 'nom d'affichage' de l'utilisateur" mode='expert'> + <value>displayName</value> + </variable> + <variable name='ldap_fill_mail' type='string' description="Champ 'mail' de l'utilisateur" mode='expert'> + <value>mail</value> + </variable> + <variable name='ldap_fill_maildir' type='string' description="Champ 'maildir' de l'utilisateur" mode='expert'> + <value>maildir</value> + </variable> + <variable name='ldap_fill_fonction' type='string' description="Champ 'fonction' de l'utilisateur" mode='expert'/> + <variable name='ldap_fill_categorie' type='string' description="Champ 'categorie' de l'utilisateur" mode='expert'/> + <variable name='ldap_fill_rne' type='string' description="Champ 'rne' de l'utilisateur" mode='expert'/> + <variable name='ldap_fill_fredurne' type='string' description="Champ 'fredurne' de l'utilisateur" mode='expert'/> + <variable name='ldap_fill_displaygroup' type='string' description="Champ 'nom d'affichage' du groupe" mode='expert'> + <value>cn</value> + </variable> + </family> + </variables> + + <constraints> + <check name='valid_regexp' target='ldap_base_dn'> + <param>^o=|^dc=|^ou=</param> + <param name='err_msg'>La racine doit débuter par une organisation (o=), une composante du domaine (dc=) ou une unité organisationnelle (ou=)</param> + </check> + <fill name='concat' target='ldap_reader'> + <param>cn=reader,</param> + <param type='eole'>ldap_base_dn</param> + </fill> + <condition name='disabled_if_in' source='activer_client_ldap'> + <param>non</param> + <target type='family'>annuaire</target> + <target type='filelist'>client_ldap</target> + </condition> + <condition name='disabled_if_in' source='ldap_nss'> + <param>non</param> + <target type='filelist'>ldap_nss_active</target> + </condition> + <check name='valid_enum' target='activer_client_ldap'> + <param>['non', 'distant']</param> + </check> + </constraints> + + <help> + <family name='annuaire'>Configuration générale de l'annuaire</family> + <variable name='adresse_ip_ldap'>Nom de domaine ou l'adresse IP de l'annuaire distant</variable> + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-client-annuaire/files/usr/share/eole/diagnose/21-annuaire b/seed/release/eole-2.7/2.7.1/applicationservice/eole-client-annuaire/files/usr/share/eole/diagnose/21-annuaire new file mode 100644 index 0000000000000000000000000000000000000000..bde6395b806e8782e6a0848397d7fd558cb684ef --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-client-annuaire/files/usr/share/eole/diagnose/21-annuaire @@ -0,0 +1,38 @@ +#!/bin/bash + +. /usr/lib/eole/diagnose.sh +activer_client_ldap=$(CreoleGet activer_client_ldap) + +if [ "$activer_client_ldap" = "distant" ];then + EchoGras "*** Annuaire distant" + TestService Annuaire $(CreoleGet adresse_ip_ldap):$(CreoleGet ldap_port) + echo +elif [ "$activer_client_ldap" = "local" ];then + EchoGras "*** Annuaire local" + TestService Annuaire $(CreoleGet container_ip_annuaire):389 + printf ". %${len_pf}s => " "Test de l'annuaire" + object=$(CreoleGet ldap_base_dn | cut -d',' -f1) + ldapsearch -LLL -x $object 2>/dev/null | grep -q ^o + [ $? -ne 0 ] && err="EchoRouge \"Erreur : objet \\\"$object\\\" non trouvé\";" + # ou=%%nom_academie est fourni par eole-annuaire (mais Zéphir ne l'utilise pas #3719) + # ou=%%numero_etab et cn=DomainAdmins sont fournis par eole-fichier-primaire (FIXME) + if [ -f /usr/share/eole/creole/distrib/01_fichier.ldif ];then + nom_academie=$(CreoleGet nom_academie) + numero_etab=$(CreoleGet numero_etab) + ldapsearch -LLL -x ou=$nom_academie 2>/dev/null | grep -q ^ou + [ $? -ne 0 ] && err="EchoRouge \"Erreur : classe d'objet \\\"ou=$nom_academie\\\" non trouvée\";" + ldapsearch -LLL -x ou=$numero_etab 2>/dev/null | grep -q ^ou + [ $? -ne 0 ] && err="${err}EchoRouge \"Erreur : classe d'objet \\\"ou=$numero_etab\\\" non trouvée\";" + ldapsearch -LLL -x cn=DomainAdmins cn 2>/dev/null | grep -q ^cn + [ $? -ne 0 ] && err="${err}EchoRouge \"Erreur : groupe \\\"cn=DomainAdmins\\\" non trouvé\";" + fi + if [ -z "$err" ];then + EchoVert "OK" + else + EchoRouge "Erreur" + eval $err + fi + echo +fi + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-client-annuaire/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-client-annuaire/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..39bad1f491aae84dc064428098efd40f1118f87f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-client-annuaire/service.yml @@ -0,0 +1,33 @@ +format: '0.1' +name: eole-client-annuaire +version: |- + 2.6.1-1 +description: |- + Templates et dictionnaires configurer un client LDAP + Configuration client pour LDAP + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: [] +packages: + - eole-client-annuaire-pkg + - eole-nsswitch +dictionaries: + - 20_client_annuaire.xml +extra_dictionaries: {} +templates: + - ldap.conf + - eoleldap.conf +creole_funcs: + - eos-ldapreader.py +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: [] +files: + /usr/share/eole/diagnose/21-annuaire: + owner: root + group: root + mode: '0755' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-client-annuaire/templates/eoleldap.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-client-annuaire/templates/eoleldap.conf new file mode 100644 index 0000000000000000000000000000000000000000..5a76dfa20a1e367aadcf6e4bee14612d02ce6706 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-client-annuaire/templates/eoleldap.conf @@ -0,0 +1,10 @@ +# -*- coding: UTF-8 -*- +#################################################### +# fichier de configuration des scripts python-ldap # +#################################################### + +# mot de passe de l'admin ldap +ldap_passwd = "xxxxx" + +# adresse du serveur ldap +ldap_server = "%%adresse_ip_ldap" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-client-annuaire/templates/ldap.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-client-annuaire/templates/ldap.conf new file mode 100644 index 0000000000000000000000000000000000000000..4ff3b85c8c65a5bdd48affd9eee805f367341778 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-client-annuaire/templates/ldap.conf @@ -0,0 +1,38 @@ +%set %%active_ldap = 'non' + +# cas Amon sans AmonEcole +%if %%is_defined('activer_nufw') and %%activer_client_ldap == 'non' + %if %%activer_nufw == 'oui' +%set %%active_ldap = 'oui' + %end if +%else + %if %%activer_client_ldap != 'non' +%set %%active_ldap = 'oui' + %end if +%end if + +%if %%active_ldap == 'oui' +host %%adresse_ip_ldap +base %%ldap_base_dn +port %%ldap_port +timelimit 10 +bind_time_limit 10 +bind_policy soft +ldap_version 3 +scope sub +pam_login_attribute uid +pam_password md5 +nss_map_attribute gecos displayName +nss_base_passwd %%ldap_base_dn?sub +nss_base_group %%ldap_base_dn?sub +#fixe #1809 +nss_initgroups_ignoreusers root + %if %%ldap_tls == 'oui' +ssl start_tls +tls_checkpeer no +TLSVerifyClient never +TLS_REQCERT never + %else +ssl off + %end if +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-client/dictionaries/25_eole-client.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-client/dictionaries/25_eole-client.xml new file mode 100644 index 0000000000000000000000000000000000000000..29a55234ad111cca95917ea9f109f3f719f0167b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-client/dictionaries/25_eole-client.xml @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + <!-- partie cliente (eole-client) --> + <file name='/home/clienteole/install.ini'/> + <file name='/home/clienteole/liste_fwregles.eol'/> + <file name='/home/admin/perso/IntegrDom/joineole.cfg'/> + </files> + + <containers> + <container name='fichier'> + <!-- partie serveur --> + <package>eole-client-pkg</package> + <service servicelist='eole-client'>eole-client</service> + <service_access service='eole-client'> + <port>8789</port> + <port>8790</port> + </service_access> + <file name='/usr/share/eole/client/config.py' source='eole-client-config.py'/> + </container> + </containers> + + <variables> + </variables> + + <constraints> + <condition name="disabled_if_in" source="activer_esu"> + <param>non</param> + <target type="servicelist">eole-client</target> + </condition> + </constraints> + + <help/> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-client/files/usr/share/eole/diagnose/151-eole-client b/seed/release/eole-2.7/2.7.1/applicationservice/eole-client/files/usr/share/eole/diagnose/151-eole-client new file mode 100644 index 0000000000000000000000000000000000000000..aa8629e73518842a7616ea8605efd89f6db66eb9 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-client/files/usr/share/eole/diagnose/151-eole-client @@ -0,0 +1,13 @@ +#!/bin/bash +. /usr/lib/eole/diagnose.sh + +EchoGras "*** Eole-Client" +if [ $(CreoleGet activer_esu) = 'oui' ];then + container_ip_fichier=$(CreoleGet container_ip_fichier) + TestService Eole-Client $container_ip_fichier:8789 + TestService Eole-Client\ \(Web\) $container_ip_fichier:8790 +else + Inactif +fi +echo +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-client/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-client/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..36f77f2710441e73cb63c6db84bc05a550c66531 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-client/service.yml @@ -0,0 +1,28 @@ +format: '0.1' +name: eole-client +version: |- + 2.7.0-2 +description: |- + Templates pour le backend et les scripts/exe de gestion des clients Eole pour les serveurs de fichiers +depends: [] +packages: [] +dictionaries: + - 25_eole-client.xml +extra_dictionaries: {} +templates: + - eole-client-config.py + - install.ini + - joineole.cfg + - liste_fwregles.eol +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: [] +files: + /usr/share/eole/diagnose/151-eole-client: + owner: root + group: root + mode: '0755' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-client/templates/eole-client-config.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-client/templates/eole-client-config.py new file mode 100644 index 0000000000000000000000000000000000000000..a3ed984c90d49a313ed8433cade862f0b2c0e418 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-client/templates/eole-client-config.py @@ -0,0 +1,4 @@ +vareole = "/var/lib/eole/config" +smb_netbios_name = "%%smb_netbios_name" +ldap_serveur = "%%container_ip_annuaire" +master_ip = "%%adresse_ip_br0" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-client/templates/install.ini b/seed/release/eole-2.7/2.7.1/applicationservice/eole-client/templates/install.ini new file mode 100644 index 0000000000000000000000000000000000000000..115df1381e8b119e4d5f317ed439b5ccb3cdfcc9 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-client/templates/install.ini @@ -0,0 +1,16 @@ +[global] +inst_args = /SILENT /NORESTART +uninst_args = /SILENT /NORESTART +%if %%container_ip_annuaire == "127.0.0.1" +ip_scribe=%%adresse_ip_eth0 +%else +ip_scribe=%%adresse_ip_fichier_link +%end if +nom_scribe=%%smb_netbios_name +nom_domaine=%%smb_workgroup +port_scribe=8789 +port_scribe_update=8790 +port_client=8788 +port_utilisateur=8791 +version=19 + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-client/templates/joineole.cfg b/seed/release/eole-2.7/2.7.1/applicationservice/eole-client/templates/joineole.cfg new file mode 100644 index 0000000000000000000000000000000000000000..a02993774d071582e093fea3822be25cb937a403 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-client/templates/joineole.cfg @@ -0,0 +1,10 @@ +[global] +admin = admin +%if %%container_ip_annuaire == "127.0.0.1" +ip = %%adresse_ip_eth0 +%else +ip = %%adresse_ip_fichier_link +%end if +domaine = %%smb_workgroup +serveur = %%smb_netbios_name + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-client/templates/liste_fwregles.eol b/seed/release/eole-2.7/2.7.1/applicationservice/eole-client/templates/liste_fwregles.eol new file mode 100644 index 0000000000000000000000000000000000000000..36fb55d56a3f26d10e4902865ce528e6e38bc02d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-client/templates/liste_fwregles.eol @@ -0,0 +1,44 @@ +# Destruction des anciennes règles +Vista:: "Scribe" ;; DELETE +Vista:: "DNS" ;; DELETE +Vista:: "VNC" ;; DELETE +Vista:: "Utilisateur" ;; DELETE +Vista:: "NuWinC" ;; DELETE +Vista:: "GestionPostes" ;; DELETE + +## Ajout de règles ## +# Scribe uniquement vers les ports utilisés aussi lors du mode blocage. +WinNT|Win2K|WinXP|Vista:: "Scribe" ;; proto = "tcp" ;; ip_src = "me" ;; ip_dst = %EOLE_IP_SCRIBE% ;; port_dst = "135,137,138,139,445,8789,8790,389" ;; action = "allow" +WinNT|Win2K|WinXP|Vista:: "Scribe" ;; proto = "udp" ;; ip_src = "any" ;; ip_dst = "any" ;; action = "allow" +WinNT|Win2K|WinXP|Vista:: "Scribe" ;; proto = "any" ;; ip_src = %EOLE_IP_SCRIBE% ;; ip_dst = "me" ;; action = "allow" + +## Service Scribe +# Restreindre l'accès au service scribe à Scribe (Vista est en mode "tout interdit sauf") +Vista:: "Scribe" ;; proto = "any" ;; program="%EOLEPATH%\cliscribe\servscribe.exe" ;; ip_src = %EOLE_IP_SCRIBE% ;; ip_dst = me ;; action = "allow" +Vista:: "Scribe" ;; proto = "any" ;; program="%EOLEPATH%\cliscribe\servscribe.exe" ;; ip_src = me ;; ip_dst = any ;; action = "allow" +# mais cette règle doit être ajoutée dans "ipfw" après avoir autorisé Scribe +WinNT|Win2K|WinXP:: "Scribe" ;; proto = "tcp" ;; ip_src = "any" ;; ip_dst = "me" ;; port_dst = "8788" ;; action = "block" +WinNT|Win2K|WinXP:: "Scribe" ;; proto = "tcp" ;; ip_src = "any" ;; ip_dst = "me" ;; port_dst = "5900" ;; action = "block" + +# Samba +WinNT|Win2K|WinXP:: "ICMP" ;; proto = "icmp" ;; ip_src = "any" ;; ip_dst = "any" ;; port_dst = "any" ;; action = "allow" +WinNT|Win2K|WinXP:: "SMB" ;; proto = "tcp" ;; ip_src = "any" ;; ip_dst = "any" ;; port_dst = "135,137,138,139,445" ;; action = "allow" + +# VNC +WinNT|Win2K|WinXP|Vista:: "VNC" ;; proto = "tcp" ;; port_dst = "5500,5800" ;; action = "allow" +Vista:: "VNC" ;; program="%EOLEPATH%\ultravnc\winvnc.exe" ;; action = "allow" +Vista:: "VNC" ;; program="%EOLEPATH%\ultravnc\vncviewer.exe" ;; action = "allow" +Vista:: "VNC" ;; program="P:\gestion-postes\winvnc.exe" ;; action = "allow" +Vista:: "VNC" ;; program="P:\gestion-postes\vncviewer.exe" ;; action = "allow" + +#Utilisateur +Vista:: "Utilisateur" ;; proto = "any" ;; program="%EOLEPATH%\cliscribe\logon.exe" ;; action = "allow" +## Entrant depuis LOCALHOST et Scribe +Vista:: "Utilisateur" ;; proto = "any" ;; program="%EOLEPATH%\cliscribe\utilisateur.exe" ;; ip_src = 127.0.0.1,%EOLE_IP_SCRIBE% ;; ip_dst = me ;; action = "allow" +## Sortant vers 0.0.0.0 +Vista:: "Utilisateur" ;; proto = "any" ;; program="%EOLEPATH%\cliscribe\utilisateur.exe" ;; ip_src = me ;; ip_dst = any ;; action = "allow" +Vista:: "NuWinC" ;; proto = "any" ;; program="%EOLEPATH%\NuWINc\nuwinc.exe" ;; action = "allow" +Vista:: "GestionPostes" ;; proto = "any" ;; program="P:\gestion-postes\gestion-postes.exe" ;; action = "allow" + +# NuWINc +WinNT|Win2K|WinXP|Vista:: "NuWINc" ;; proto = "tcp" ;; ip_src = "me" ;; ip_dst = "any" ;; port_dst = "4129" ;; action = "allow" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-cntlm/dictionaries/61_cntlm.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-cntlm/dictionaries/61_cntlm.xml new file mode 100644 index 0000000000000000000000000000000000000000..d28b00501643d60a212008588f2e505084ee3ffa --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-cntlm/dictionaries/61_cntlm.xml @@ -0,0 +1,149 @@ +<?xml version='1.0' encoding='utf-8'?> + +<creole> + <containers> + <container name='proxy'> + <package>eole-cntlm-pkg</package> + <file filelist='cntlm' name='/etc/cntlm.conf'/> + <file filelist='cntlm' name='/usr/sbin/eole-cntlm' mode='755'/> + <service servicelist='cntlm'>eole-cntlm</service> + <service_access service='eole-cntlm'> + <port port_type="SymLinkOption">cntlm_port</port> + </service_access> + <service_restriction service='eole-cntlm'> + <!--interface--> + <ip service_restrictionlist='cntlm_eth0' interface='eth0' netmask='adresse_netmask_eth0' netmask_type='SymLinkOption' ip_type='SymLinkOption'>adresse_network_eth0</ip> + <ip interface='eth1' netmask='adresse_netmask_eth1' netmask_type='SymLinkOption' ip_type='SymLinkOption'>adresse_network_eth1</ip> + <ip interface='eth2' netmask='adresse_netmask_eth2' netmask_type='SymLinkOption' ip_type='SymLinkOption'>adresse_network_eth2</ip> + <ip interface='eth3' netmask='adresse_netmask_eth3' netmask_type='SymLinkOption' ip_type='SymLinkOption'>adresse_network_eth3</ip> + <ip interface='eth4' netmask='adresse_netmask_eth4' netmask_type='SymLinkOption' ip_type='SymLinkOption'>adresse_network_eth4</ip> + <!--vlan--> + <ip service_restrictionlist='cntlm_eth0' interface='eth0' netmask='vlan_netmask_eth0' netmask_type='SymLinkOption' ip_type='SymLinkOption'>vlan_network_eth0</ip> + <ip interface='eth1' netmask='vlan_netmask_eth1' netmask_type='SymLinkOption' ip_type='SymLinkOption'>vlan_network_eth1</ip> + <ip interface='eth2' netmask='vlan_netmask_eth2' netmask_type='SymLinkOption' ip_type='SymLinkOption'>vlan_network_eth2</ip> + <ip interface='eth3' netmask='vlan_netmask_eth3' netmask_type='SymLinkOption' ip_type='SymLinkOption'>vlan_network_eth3</ip> + <ip interface='eth4' netmask='vlan_netmask_eth4' netmask_type='SymLinkOption' ip_type='SymLinkOption'>vlan_network_eth4</ip> + <!-- réseaux supplémentaires --> + <ip service_restrictionlist="cntlm_eth0" interface="eth0" netmask="proxy_eth0_netmask" netmask_type="SymLinkOption" ip_type="SymLinkOption">proxy_eth0_ip</ip> + </service_restriction> + </container> + </containers> + + <variables> + <family name='Interface-0'> + <variable name='activer_cntlm_eth0' type='oui/non' description="Activer le proxy NTLM sur cette interface"/> + </family> + <family name='Interface-1'> + <variable name='activer_cntlm_eth1' type='oui/non' description="Activer le proxy NTLM sur cette interface" mode="expert"/> + </family> + <family name='Interface-2'> + <variable name='activer_cntlm_eth2' type='oui/non' description="Activer le proxy NTLM sur cette interface" mode="expert"/> + </family> + <family name='Interface-3'> + <variable name='activer_cntlm_eth3' type='oui/non' description="Activer le proxy NTLM sur cette interface" mode="expert"/> + </family> + <family name='Interface-4'> + <variable name='activer_cntlm_eth4' type='oui/non' description="Activer le proxy NTLM sur cette interface" mode="expert"/> + </family> + + <family name='proxy authentifié'> + <variable name='activer_cntlm' type='oui/non' description="Activer le proxy NTLM"> + <value>non</value> + </variable> + <variable name='cntlm_port' type='port' description="Port d'écoute du proxy NTLM" mode='expert'> + <value>3127</value> + </variable> + </family> + </variables> + + <constraints> + <condition name='disabled_if_not_in' source='activer_cntlm'> + <param>oui</param> + <target type='servicelist'>cntlm</target> + <target type='filelist'>cntlm</target> + <target type='variable'>cntlm_port</target> + <target>activer_cntlm_eth0</target> + <target>activer_cntlm_eth1</target> + <target>activer_cntlm_eth2</target> + <target>activer_cntlm_eth3</target> + <target>activer_cntlm_eth4</target> + </condition> + <condition name='disabled_if_not_in' source='squid_auth_eth1'> + <param>oui</param> + <target>activer_cntlm_eth1</target> + </condition> + <condition name='disabled_if_not_in' source='squid_auth_eth2'> + <param>oui</param> + <target>activer_cntlm_eth2</target> + </condition> + <condition name='disabled_if_not_in' source='squid_auth_eth3'> + <param>oui</param> + <target>activer_cntlm_eth3</target> + </condition> + <condition name='disabled_if_not_in' source='squid_auth_eth4'> + <param>oui</param> + <target>activer_cntlm_eth4</target> + </condition> + <condition name='disabled_if_not_in' source='nombre_interfaces' > + <param>1</param> + <target type='service_restrictionlist'>cntlm_eth0</target> + </condition> + <condition name='disabled_if_not_in' source='type_squid_auth'> + <param>NTLM/SMB</param> + <param>NTLM/KERBEROS</param> + <target type='variable'>activer_cntlm</target> + </condition> + <auto name='calc_multi_condition' target='activer_cntlm_eth0'> + <param>1</param> + <param type='eole' name='condition_1'>nombre_interfaces</param> + </auto> + <fill name='calc_val' target='activer_cntlm_eth1'> + <param type='eole' name='valeur'>activer_cntlm</param> + </fill> + <fill name='calc_val' target='activer_cntlm_eth2'> + <param type='eole' name='valeur'>activer_cntlm</param> + </fill> + <fill name='calc_val' target='activer_cntlm_eth3'> + <param type='eole' name='valeur'>activer_cntlm</param> + </fill> + <fill name='calc_val' target='activer_cntlm_eth4'> + <param type='eole' name='valeur'>activer_cntlm</param> + </fill> + <fill name='calc_multi_condition' target='wpad_proxyport_eth0'> + <param>non</param> + <param type='eole' name='condition_1' hidden="False">activer_cntlm_eth0</param> + <param name='match'>3128</param> + <param name='mismatch' type='eole' hidden="False">cntlm_port</param> + </fill> + <fill name='calc_multi_condition' target='wpad_proxyport_eth1'> + <param>non</param> + <param type='eole' name='condition_1' hidden="False">activer_cntlm_eth1</param> + <param name='match'>3128</param> + <param name='mismatch' type='eole' hidden="False">cntlm_port</param> + </fill> + <fill name='calc_multi_condition' target='wpad_proxyport_eth2'> + <param>non</param> + <param type='eole' name='condition_1' hidden="False">activer_cntlm_eth2</param> + <param name='match'>3128</param> + <param name='mismatch' type='eole' hidden="False">cntlm_port</param> + </fill> + <fill name='calc_multi_condition' target='wpad_proxyport_eth3'> + <param>non</param> + <param type='eole' name='condition_1' hidden="False">activer_cntlm_eth3</param> + <param name='match'>3128</param> + <param name='mismatch' type='eole' hidden="False">cntlm_port</param> + </fill> + <fill name='calc_multi_condition' target='wpad_proxyport_eth4'> + <param>non</param> + <param type='eole' name='condition_1' hidden="False">activer_cntlm_eth4</param> + <param name='match'>3128</param> + <param name='mismatch' type='eole' hidden="False">cntlm_port</param> + </fill> + </constraints> + + <help> + <variable name="activer_cntlm">CNTLM est un proxy permettant de s'authentifier en NTLM / NTLM Session Response / NTLMv2. L'authentification se fera sur le premier domaine spécifié.</variable> + </help> + +</creole> + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-cntlm/files/usr/share/eole/diagnose/151-proxy-cntlm b/seed/release/eole-2.7/2.7.1/applicationservice/eole-cntlm/files/usr/share/eole/diagnose/151-proxy-cntlm new file mode 100644 index 0000000000000000000000000000000000000000..5d333d2f0b8939a9f9f135a6c085750604d95af0 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-cntlm/files/usr/share/eole/diagnose/151-proxy-cntlm @@ -0,0 +1,19 @@ +#!/bin/bash +. /usr/lib/eole/diagnose.sh + +if [ "$(CreoleGet activer_cntlm non)" = "oui" ];then + for int in $(seq 0 $[$(CreoleGet nombre_interfaces)-1]); do + if [ "$(CreoleGet activer_cntlm_eth$int non)" = 'oui' ];then + if [ $(CreoleGet mode_conteneur_actif) = 'oui' ];then + ip=$(CreoleGet adresse_ip_eth${int}_proxy_link) + else + ip=$(CreoleGet adresse_ip_eth$int) + fi + # on teste uniquement sur la 1ère interface Cntlm trouvée + TestService "Proxy Cntlm" $ip:$(CreoleGet cntlm_port) proxy + break + fi + done +fi +echo +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-cntlm/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-cntlm/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..fbce7a78ff76cc40d07b782ca2bad1984b326099 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-cntlm/service.yml @@ -0,0 +1,29 @@ +format: '0.1' +name: eole-cntlm +version: |- + 2.7.0-1 +description: |- + EOlisation de Cntlm + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: + - eole-proxy +packages: [] +dictionaries: + - 61_cntlm.xml +extra_dictionaries: {} +templates: + - cntlm.conf + - eole-cntlm +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: [] +files: + /usr/share/eole/diagnose/151-proxy-cntlm: + owner: root + group: root + mode: '0755' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-cntlm/templates/cntlm.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-cntlm/templates/cntlm.conf new file mode 100644 index 0000000000000000000000000000000000000000..7b706c7e958a533b3820293d216d577a0170265a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-cntlm/templates/cntlm.conf @@ -0,0 +1,103 @@ +# +# Cntlm Authentication Proxy Configuration +# +# NOTE: all values are parsed literally, do NOT escape spaces, +# do not quote. Use 0600 perms if you use plaintext password. +# + +#Username testuser +%if %%type_squid_auth == 'NTLM/SMB' +Domain %%nom_domaine_smb +%elif %%type_squid_auth == 'NTLM/KERBEROS' +Domain %%nom_domaine_windows +%end if +#Password password +# NOTE: Use plaintext password only at your own risk +# Use hashes instead. You can use a "cntlm -M" and "cntlm -H" +# command sequence to get the right config for your environment. +# See cntlm man page +# Example secure config shown below. +# PassLM 1AD35398BE6565DDB5C4EF70C0593492 +# PassNT 77B9081511704EE852F94227CF48A793 +### Only for user 'testuser', domain 'corp-uk' +# PassNTLMv2 D5826E9C665C37C80B53397D5C07BBCB + +# Specify the netbios hostname cntlm will send to the parent +# proxies. Normally the value is auto-guessed. +# +# Workstation netbios_hostname + +# List of parent proxies to use. More proxies can be defined +# one per line in format <proxy_ip>:<proxy_port> +# +#Proxy 10.0.0.41:3128 +#Proxy 10.0.0.42:3128 + +# List addresses you do not want to pass to parent proxies +# * and ? wildcards can be used +# +#NoProxy localhost, 127.0.0.*, 10.*, 192.168.* + +# Specify the port cntlm will listen on +# You can bind cntlm to specific interface by specifying +# the appropriate IP address also in format <local_ip>:<local_port> +# Cntlm listens on 127.0.0.1:3128 by default +# +#Listen 3127 + +# If you wish to use the SOCKS5 proxy feature as well, uncomment +# the following option. It can be used several times +# to have SOCKS5 on more than one port or on different network +# interfaces (specify explicit source address for that). +# +# WARNING: The service accepts all requests, unless you use +# SOCKS5User and make authentication mandatory. SOCKS5User +# can be used repeatedly for a whole bunch of individual accounts. +# +#SOCKS5Proxy 8010 +#SOCKS5User dave:password + +# Use -M first to detect the best NTLM settings for your proxy. +# Default is to use the only secure hash, NTLMv2, but it is not +# as available as the older stuff. +# +# This example is the most universal setup known to man, but it +# uses the weakest hash ever. I won't have it's usage on my +# conscience. :) Really, try -M first. +# +%if %%type_squid_auth == 'NTLM/SMB' +Auth LM +%elif %%type_squid_auth == 'NTLM/KERBEROS' +Auth NTLMv2 +%end if +#Flags 0x06820000 + +# Enable to allow access from other computers +# +Gateway yes + +NTLMToBasic yes + +# +# Useful in Gateway mode to allow/restrict certain IPs +# Specifiy individual IPs or subnets one rule per line. +# +#Allow 127.0.0.1 +#Deny 0/0 + +# GFI WebMonitor-handling plugin parameters, disabled by default +# +#ISAScannerSize 1024 +#ISAScannerAgent Wget/ +#ISAScannerAgent APT-HTTP/ +#ISAScannerAgent Yum/ + +# Headers which should be replaced if present in the request +# +#Header User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows 98) + +# Tunnels mapping local port to a machine behind the proxy. +# The format is <local_port>:<remote_host>:<remote_port> +# +#Tunnel 11443:remote.com:443 + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-cntlm/templates/eole-cntlm b/seed/release/eole-2.7/2.7.1/applicationservice/eole-cntlm/templates/eole-cntlm new file mode 100644 index 0000000000000000000000000000000000000000..e12de0d519ef0f485e93cde8945176b4683e45e8 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-cntlm/templates/eole-cntlm @@ -0,0 +1,11 @@ +#!/bin/sh +%for %%int in xrange(0, %%int(%%nombre_interfaces)) + %if %%getVar('activer_cntlm_eth' + %%str(%%int), 'non') == 'oui' + %if %%mode_conteneur_actif == 'oui' + %set %%ip = %%getVar('adresse_ip_eth' + %%str(%%int) + '_proxy_link') + %else + %set %%ip = %%getVar('adresse_ip_eth' + %%str(%%int)) + %end if +/usr/sbin/cntlm -U cntlm -c /etc/cntlm.conf -l %%ip:%%cntlm_port %%ip:3128 + %end if +%end for diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-controle-vnc/dictionaries/25_vnc.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-controle-vnc/dictionaries/25_vnc.xml new file mode 100644 index 0000000000000000000000000000000000000000..b9676e575a64f4a4662a2e44e562d39f6a554739 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-controle-vnc/dictionaries/25_vnc.xml @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + <!-- gestion de la base de donnée --> + <file name='/usr/share/eole/mysql/controlevnc/gen/controlevnc.sql' mkdir="True"/> + <file name='/usr/share/eole/mysql/controlevnc/updates/controlevnc.sql' source='controlevnc-update.sql' mkdir="True"/> + <file name='/usr/share/eole/applications/passwords/controlevnc.ini' mkdir="True"/> + </files> + + <containers> + <container name='fichier'> + <!-- partie serveur --> + <package>eole-controle-vnc-pkg</package> + <service>controle-vnc</service> + <service_access service='controle-vnc'> + <port>8789</port> + <port>8790</port> + </service_access> + <file name='/usr/share/eole/controlevnc/config.py' source='vnc_config.py'/> + </container> + </containers> + + <variables> + <family name='services'> + <variable name='activer_mysql' hidden="False" redefine='True'> + <value>oui</value> + </variable> + </family> + </variables> + + <constraints> + </constraints> + + <help/> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-controle-vnc/files/usr/share/eole/applications/gen/controlevnc.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-controle-vnc/files/usr/share/eole/applications/gen/controlevnc.py new file mode 100644 index 0000000000000000000000000000000000000000..9aa54fa684d5f7f258995beeaa5f1f2f1ad1dd98 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-controle-vnc/files/usr/share/eole/applications/gen/controlevnc.py @@ -0,0 +1,28 @@ +#-*-coding:utf-8-*- +########################################################################### +# Eole NG - 2015 +# Copyright Pole de Competence Eole (Ministere Education - Academie Dijon) +# Licence CeCill cf /root/LicenceEole.txt +# eole@ac-dijon.fr +# +# controlevnc.py +# +# Configuration de base de données mysql de controlevnc +# +########################################################################### +""" + Config pour controlevnc +""" +from eolesql.db_test import db_exists, test_var + +TABLEFILENAMES = ["/usr/share/eole/mysql/controlevnc/gen/controlevnc.sql"] + +def test(): + """ + test l'existence de la base controlevnc + """ + return not db_exists('controlevnc') + +conf_dict = dict(filenames=TABLEFILENAMES, + test=test) + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-controle-vnc/files/usr/share/eole/diagnose/151-fichier-vnc b/seed/release/eole-2.7/2.7.1/applicationservice/eole-controle-vnc/files/usr/share/eole/diagnose/151-fichier-vnc new file mode 100644 index 0000000000000000000000000000000000000000..64776273e33cacc2ec7ff7a00ce67feb33c0fc27 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-controle-vnc/files/usr/share/eole/diagnose/151-fichier-vnc @@ -0,0 +1,9 @@ +#!/bin/bash +. /usr/lib/eole/diagnose.sh + +EchoGras "*** Controle-Vnc" +container_ip_fichier=$(CreoleGet container_ip_fichier) +TestService Controle-Vnc $container_ip_fichier:8789 +TestService Controle-Vnc\ \(Web\) $container_ip_fichier:8790 +echo +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-controle-vnc/posttemplates/05_client-scribe b/seed/release/eole-2.7/2.7.1/applicationservice/eole-controle-vnc/posttemplates/05_client-scribe new file mode 100644 index 0000000000000000000000000000000000000000..8c21cb9e5ad2e6f3105309a8e628b190ca5bfac2 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-controle-vnc/posttemplates/05_client-scribe @@ -0,0 +1,13 @@ +#!/bin/bash + +LOG_SAMBA=/var/log/samba + +if [ $(CreoleGet mode_conteneur_actif) = "oui" ]; then + #remonter des logs en mode non-conteneur + if [ ! -L $LOG_SAMBA ]; then + rm -rf $LOG_SAMBA + ln -s $(CreoleGet container_path_fichier)$LOG_SAMBA $LOG_SAMBA + fi +fi + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-controle-vnc/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-controle-vnc/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..2868b1f796fe87d13f063d07ad9343d056f756ed --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-controle-vnc/service.yml @@ -0,0 +1,35 @@ +format: '0.1' +name: eole-controle-vnc +version: |- + 2.7.1-1 +description: |- + Templates et dictionnaires pour controle-vnc + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: [] +packages: [] +dictionaries: + - 25_vnc.xml +extra_dictionaries: {} +templates: + - controlevnc-update.sql + - controlevnc.ini + - controlevnc.sql + - vnc_config.py +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: + - 05_client-scribe +files: + /usr/share/eole/applications/gen/controlevnc.py: + owner: root + group: root + mode: '0644' + /usr/share/eole/diagnose/151-fichier-vnc: + owner: root + group: root + mode: '0755' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-controle-vnc/templates/controlevnc-update.sql b/seed/release/eole-2.7/2.7.1/applicationservice/eole-controle-vnc/templates/controlevnc-update.sql new file mode 100644 index 0000000000000000000000000000000000000000..562bfa44c10cb84b51cbc3a8a7a7da9e0a277a70 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-controle-vnc/templates/controlevnc-update.sql @@ -0,0 +1,19 @@ +# Connexion a la base +USE controlevnc; + +DELIMITER $$ + +DROP PROCEDURE IF EXISTS drop_index_netbios_if_exists $$ +CREATE PROCEDURE drop_index_netbios_if_exists() +BEGIN + IF((SELECT COUNT(*) AS index_exists + FROM information_schema.statistics + WHERE TABLE_SCHEMA = DATABASE() and table_name = 'log' AND index_name = 'netbios') > 0) THEN + SET @s = 'DROP INDEX `netbios` ON `log`'; + PREPARE stmt FROM @s; + EXECUTE stmt; + END IF; +END $$ +CALL drop_index_netbios_if_exists $$ +DROP PROCEDURE IF EXISTS drop_index_netbios_if_exists $$ +DELIMITER ; diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-controle-vnc/templates/controlevnc.ini b/seed/release/eole-2.7/2.7.1/applicationservice/eole-controle-vnc/templates/controlevnc.ini new file mode 100644 index 0000000000000000000000000000000000000000..fa538a68ebfd132c9b08c0da3ccfa0cfc14571e5 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-controle-vnc/templates/controlevnc.ini @@ -0,0 +1,7 @@ +[controlevnc] +username=controlevnc +template='mysql_password = "' +end_template='"' +filename=%%container_path_fichier/usr/share/eole/controlevnc/config.py +owner=root:root +chmod=660 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-controle-vnc/templates/controlevnc.sql b/seed/release/eole-2.7/2.7.1/applicationservice/eole-controle-vnc/templates/controlevnc.sql new file mode 100644 index 0000000000000000000000000000000000000000..ff9a71048a7458fda7278ab9605ad61f1e5a0a76 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-controle-vnc/templates/controlevnc.sql @@ -0,0 +1,32 @@ +## Creation de la base Mysql pour ControleVNC + +# Creation base de donnees +CREATE DATABASE controlevnc CHARACTER SET utf8; + +# Creation utilisateur +GRANT select,insert,update,delete ON controlevnc.* TO controlevnc@%%adresse_ip_fichier IDENTIFIED BY 'sqpassword'; + +# Connexion a la base +\r controlevnc + +# Creation de la table *log* +CREATE TABLE log ( + ip varchar(16) NOT NULL, + netbios varchar(15) DEFAULT '', + os varchar(8) DEFAULT '', + up boolean DEFAULT False, + user varchar(32) DEFAULT '', + display_name varchar(128) DEFAULT '', + sid varchar(50) DEFAULT '', + prim_group varchar(32) DEFAULT '', + mac varchar(18) DEFAULT '', + PRIMARY KEY (`ip`, `user`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT="informations sur la machine et l'utilisateur"; + +CREATE TABLE `group` ( + ip varchar(16) NOT NULL, + groupname varchar(32) DEFAULT '', + PRIMARY KEY (`ip`, `groupname`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='groupes utilisateurs'; + + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-controle-vnc/templates/vnc_config.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-controle-vnc/templates/vnc_config.py new file mode 100644 index 0000000000000000000000000000000000000000..ac23598a1f848067b8350b1952bc9e0d33072bda --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-controle-vnc/templates/vnc_config.py @@ -0,0 +1,26 @@ +# -*- coding: UTF-8 -*- +vareole = "/var/lib/eole/config" +smb_netbios_name = "%%smb_netbios_name" +ldap_serveur = "%%container_ip_annuaire" +ldap_base_dn = "%%ldap_base_dn" +ldap_admin = "cn=admin,%%ldap_base_dn" +master_ip = "%%adresse_ip_br0" +mysql_password = "NOUVEAU_PASSWORD" +mysql_host = "%%adresse_ip_mysql" +activer_eop = "%%getVar('activer_eop', 'non')" +activer_eoe = "%%getVar('activer_eoe', 'non')" +%if %%getVar('activer_ad', 'non') == 'oui' +activer_ad = "oui" +%def %%gen_dc() +%return 'DC='+',DC='.join(%%ad_domain.split('.')) +%end def +# variables supplémentaires pour eole-AD +ad_address = "%%ad_address" +ad_user = "%%ad_user" +ad_base = "%%gen_dc()" +ad_pwdfile = "/root/.eolead" +ad_ldaps = "%%ad_ldaps" +%else +activer_ad = "non" +%end if +debug = False diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-courier-client/dictionaries/00_eole-courier-client_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-courier-client/dictionaries/00_eole-courier-client_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..7e0bc3d48c2409b305a740967cb4f92da6f6857c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-courier-client/dictionaries/00_eole-courier-client_packages.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>eole-sso-client</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-courier-client/dictionaries/23_client_courier.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-courier-client/dictionaries/23_client_courier.xml new file mode 100644 index 0000000000000000000000000000000000000000..ea4d74f94b6e25839038764f04205158caa4371c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-courier-client/dictionaries/23_client_courier.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + <files/> + <variables> + <family name='messagerie'> + <variable name='activer_recuperation_courriel' type='string' description="Activer le serveur de récupération de courrier électronique"> + <value>distant</value> + </variable> + <variable name='adresse_imap' type='domain' description="Adresse du serveur de récupération de courrier électronique IMAP" mandatory="True"/> + </family> + <separators> + <separator name='activer_recuperation_courriel'>Serveur de récupération de courrier électronique (POP/IMAP)</separator> + </separators> + </variables> + + <constraints> + <check name="valid_enum" target="activer_recuperation_courriel"> + <param>['non', 'distant']</param> + </check> + <condition name='disabled_if_in' source='activer_recuperation_courriel'> + <param>non</param> + <target type='variable'>adresse_imap</target> + </condition> + </constraints> + + <help/> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-courier-client/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-courier-client/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..bff5f02d7568578bc22a43b0b9b7f43159b2e608 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-courier-client/service.yml @@ -0,0 +1,24 @@ +format: '0.1' +name: eole-courier-client +version: |- + 2.6.0-1 +description: |- + Templates et dictionnaires pour client IMAP + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: [] +packages: + - eole-sso-client +dictionaries: + - 23_client_courier.xml +extra_dictionaries: {} +templates: [] +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: [] +files: {} +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-courier/dictionaries/23_courier.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-courier/dictionaries/23_courier.xml new file mode 100644 index 0000000000000000000000000000000000000000..6edc3521563b2e3123f59b1f450309db2c648aff --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-courier/dictionaries/23_courier.xml @@ -0,0 +1,127 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + <file filelist='courier' name='/usr/share/eole/annuaire/password_files/mail.ini' mkdir='True' rm='True'/> + <file filelist='courier' name='/etc/bareos/bareosfichiers.d/courier.conf' source='bareos-courier.conf' rm='True'/> + </files> + <containers> + <container name='mail' id='13'> + <package>eole-courier-pkg</package> + <service servicelist='courier_imap'>courier-imap</service> + <service servicelist='courier_imap'>courier-imap-ssl</service> + <service_access service='courier_imap'> + <port>143</port> + <port>993</port> + </service_access> + <service servicelist='courier_pop'>courier-pop</service> + <service servicelist='courier_pop'>courier-pop-ssl</service> + <service_access service='courier_pop'> + <port>110</port> + <port>995</port> + </service_access> + <service servicelist='courier_authdaemon'>courier-authdaemon</service> + <file filelist='courier' name='/etc/courier/authdaemonrc'/> + <file filelist='courier' name='/etc/courier/authldaprc' mode='0600'/> + <file filelist='courier' name='/etc/courier/imapd'/> + <!-- pour courier-imaps --> + <file filelist='courier' name='/etc/courier/imapd-ssl'/> + <!-- pour courier-pops --> + <file filelist='courier' name='/etc/courier/pop3d-ssl'/> + <!-- pour courier-eolecas --> + <file name='/etc/courier/authprog.conf' filelist='couriersso'/> + <file name='/usr/share/php/configCAS/cas.inc.php' source='cas.inc.php.tmpl' filelist='couriersso' mkdir='True'/> + </container> + </containers> + + <variables> + <family name='messagerie'> + <variable name='activer_recuperation_courriel' redefine='True'> + <value>local</value> + </variable> + <variable name='activer_courier_imap' type='oui/non' description="Activer le serveur IMAP de Courier"> + <value>oui</value> + </variable> + <variable name='activer_courier_pop' type='oui/non' description="Activer le serveur POP de Courier"> + <value>non</value> + </variable> + <variable name="activer_courier_commun" type='oui/non' description="Activer les services communs pour Courier"/> + <variable name="activer_courier_imap_sso" type='oui/non' description="Autoriser l'authentification CAS pour le serveur IMAP de Courier"> + <value>oui</value> + </variable> + <variable name='adresse_imap_sso' type='domain' description="Adresse du serveur IMAP utilisé pour le client CAS/IMAP" mandatory="True"/> + </family> + <separators/> + </variables> + + <constraints> + <check name="valid_enum" target="activer_recuperation_courriel"> + <param>['non', 'local', 'distant']</param> + </check> + <condition name='disabled_if_in' source='activer_sso'> + <param>non</param> + <target type='filelist'>couriersso</target> + </condition> + <condition name='disabled_if_in' source='activer_courier_imap_sso'> + <param>non</param> + <target type='filelist'>couriersso</target> + </condition> + <condition name='disabled_if_in' source='activer_courier_imap'> + <param>non</param> + <target>activer_courier_imap_sso</target> + </condition> + <condition name='disabled_if_in' source='activer_courier_imap_sso'> + <param>non</param> + <target>adresse_imap_sso</target> + </condition> + <condition name='disabled_if_not_in' source='activer_recuperation_courriel'> + <param>local</param> + <target>activer_courier_imap</target> + <target>activer_courier_pop</target> + <target>activer_courier_commun</target> + </condition> + <condition name='disabled_if_not_in' source='activer_courier_commun'> + <param>oui</param> + <target type='servicelist'>courier_authdaemon</target> + <target type='filelist'>courier</target> + </condition> + <condition name='disabled_if_in' source='activer_courier_imap'> + <param>non</param> + <target type='servicelist'>courier_imap</target> + </condition> + <condition name='disabled_if_in' source='activer_courier_pop'> + <param>non</param> + <target type='servicelist'>courier_pop</target> + </condition> + <fill name='calc_multi_condition' target='adresse_imap'> + <param>local</param> + <param type='eole' name='condition_1'>activer_recuperation_courriel</param> + <param type='eole' name='match'>adresse_ip_mail</param> + <param name='default_mismatch'>None</param> + </fill> + <auto name='calc_multi_condition' target='activer_courier_commun'> + <param>non</param> + <param type='eole' name='condition_1'>activer_courier_imap</param> + <param type='eole' name='condition_2'>activer_courier_pop</param> + <param name='match'>non</param> + <param name='mismatch'>oui</param> + </auto> + <fill name='calc_val' target='adresse_imap_sso'> + <param type='eole'>adresse_imap</param> + </fill> + <condition name='frozen_if_in' source='activer_recuperation_courriel'> + <param>local</param> + <target type='variable'>adresse_imap</target> + </condition> + </constraints> + + <help> + <variable name='activer_courier_imap'>Courier est un serveur d'échange de courrier électronique via le protocole IMAP</variable> + <variable name='activer_courier_pop'>Courier est un serveur d'échange de courrier électronique via le protocole POP</variable> + <variable name='adresse_imap_sso'>Il faut renseigner l'adresse du serveur IMAP définit sur le client IMAP avec authentification CAS (par exemple roundcube)</variable> + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-courier/files/usr/share/eole/certs/01_eole-mail.gen_cert b/seed/release/eole-2.7/2.7.1/applicationservice/eole-courier/files/usr/share/eole/certs/01_eole-mail.gen_cert new file mode 100644 index 0000000000000000000000000000000000000000..33ac480c7fcea369487e0494eee294b64c100971 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-courier/files/usr/share/eole/certs/01_eole-mail.gen_cert @@ -0,0 +1,7 @@ +gen_certif('/etc/courier/imapd.pem', cert_user='root', cert_grp='root', cert_chmod='600', + key_user='root', key_grp='root', key_chmod='600', copy_key=True, regen=regen, + container='mail') +gen_certif('/etc/courier/pop3d.pem', cert_user='root', cert_grp='root', cert_chmod='600', + key_user='root', key_grp='root', key_chmod='600', copy_key=True, regen=regen, + container='mail') + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-courier/files/usr/share/eole/diagnose/51-courier b/seed/release/eole-2.7/2.7.1/applicationservice/eole-courier/files/usr/share/eole/diagnose/51-courier new file mode 100644 index 0000000000000000000000000000000000000000..6b8463928f3b88978543494ce446c00b0b49b92b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-courier/files/usr/share/eole/diagnose/51-courier @@ -0,0 +1,25 @@ +#!/bin/bash +. /usr/lib/eole/diagnose.sh +if [ $(CreoleGet activer_recuperation_courriel) = 'non' ]; then + Inactif "Courrier POP/IMAP" +else + activer_courier_imap=$(CreoleGet activer_courier_imap) + activer_courier_pop=$(CreoleGet activer_courier_pop) + container_ip_mail=$(CreoleGet container_ip_mail) + container_path_mail=$(CreoleGet container_path_mail) + + if [ "$activer_courier_imap" = 'oui' ]; then + TestService "Courrier IMAP" $container_ip_mail:143 + TestCerts $container_path_mail/etc/courier/imapd.pem 10 "certificat expiré" + else + Inactif "Courrier IMAP" + fi + if [ "$activer_courier_pop" = 'oui' ]; then + TestService "Courrier POP" $container_ip_mail:110 + TestCerts $container_path_mail/etc/courier/pop3d.pem 10 "certificat expiré" + else + Inactif "Courrier POP" + fi +echo +fi +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-courier/files/usr/share/zephir/monitor/configs/services/24_imap.srv b/seed/release/eole-2.7/2.7.1/applicationservice/eole-courier/files/usr/share/zephir/monitor/configs/services/24_imap.srv new file mode 100644 index 0000000000000000000000000000000000000000..87e39175c33bdddf95d625a57196b19e76a945de --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-courier/files/usr/share/zephir/monitor/configs/services/24_imap.srv @@ -0,0 +1,14 @@ +# -*- coding: UTF-8 -*- +""" +Surveillance du service courier-imap +""" + +from zephir.monitor.agents.services import TCPServices +from zephir.monitor.agentmanager.config import ACTIVER_COURIER_IMAP, ADRESSE_IMAP + +if ACTIVER_COURIER_IMAP: + adresse = ADRESSE_IMAP + test = '%s:143' % adresse + data = {test : "Courrier électronique (IMAP)"} + AGENTS.append(TCPServices('imap', data, period=115, + description="Etat du serveur IMAP")) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-courier/files/usr/share/zephir/monitor/configs/services/24_pop.srv b/seed/release/eole-2.7/2.7.1/applicationservice/eole-courier/files/usr/share/zephir/monitor/configs/services/24_pop.srv new file mode 100644 index 0000000000000000000000000000000000000000..7b3c1a2e1c1f72e2d33838d61b758981d47c738c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-courier/files/usr/share/zephir/monitor/configs/services/24_pop.srv @@ -0,0 +1,14 @@ +# -*- coding: UTF-8 -*- +""" +Surveillance du service courier-imap +""" + +from zephir.monitor.agents.services import TCPServices +from zephir.monitor.agentmanager.config import ACTIVER_COURIER_POP, ADRESSE_IMAP + +if ACTIVER_COURIER_POP: + adresse = ADRESSE_IMAP + test = '%s:110' % adresse + data = {test : "Courrier électronique (POP)"} + AGENTS.append(TCPServices('pop', data, period=115, + description="Etat du serveur POP")) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-courier/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-courier/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..42f9f5677d6990e0c8423c028ddcfc86c0a533d4 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-courier/service.yml @@ -0,0 +1,49 @@ +format: '0.1' +name: eole-courier +version: |- + 2.6.0-1 +description: |- + Templates et dictionnaires pour Courier + Configuration courier-pop et courier-imap pour EOLE. + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: + - eole-courier-client +packages: [] +dictionaries: + - 23_courier.xml +extra_dictionaries: {} +templates: + - pop3d-ssl + - imapd-ssl + - mail.ini + - authprog.conf + - bareos-courier.conf + - imapd + - authldaprc + - authdaemonrc +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: [] +files: + /usr/share/zephir/monitor/configs/services/24_imap.srv: + owner: root + group: root + mode: '0644' + /usr/share/zephir/monitor/configs/services/24_pop.srv: + owner: root + group: root + mode: '0644' + /usr/share/eole/certs/01_eole-mail.gen_cert: + owner: root + group: root + mode: '0644' + /usr/share/eole/diagnose/51-courier: + owner: root + group: root + mode: '0755' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-courier/templates/authdaemonrc b/seed/release/eole-2.7/2.7.1/applicationservice/eole-courier/templates/authdaemonrc new file mode 100644 index 0000000000000000000000000000000000000000..3f62f14950d3be4202ce7033e7490f0063d4761f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-courier/templates/authdaemonrc @@ -0,0 +1,113 @@ +############################################ +# +# Authentification Pop/Imap pour Scribe-2.0 +# Equipe Eole +# 12/2006 +# +############################################ +# +# Copyright 2000-2005 Double Precision, Inc. See COPYING for +# distribution information. +# +# authdaemonrc created from authdaemonrc.dist by sysconftool +# +# Do not alter lines that begin with ##, they are used when upgrading +# this configuration. +# +# This file configures authdaemond, the resident authentication daemon. +# +# Comments in this file are ignored. Although this file is intended to +# be sourced as a shell script, authdaemond parses it manually, so +# the acceptable syntax is a bit limited. Multiline variable contents, +# with the \ continuation character, are not allowed. Everything must +# fit on one line. Do not use any additional whitespace for indentation, +# or anything else. + +##NAME: authmodulelist:2 +# +# The authentication modules that are linked into authdaemond. The +# default list is installed. You may selectively disable modules simply +# by removing them from the following list. The available modules you +# can use are: authuserdb authpam authpgsql authldap authmysql authcustom authpipe + +%if %%getVar('activer_courier_imap_sso', 'non') == 'oui' +authmodulelist="authpipe" +%else +authmodulelist="authldap" +%end if + +##NAME: authmodulelistorig:3 +# +# This setting is used by Courier's webadmin module, and should be left +# alone + +authmodulelistorig="authuserdb authpam authpgsql authldap authmysql authcustom authpipe" + +##NAME: daemons:0 +# +# The number of daemon processes that are started. authdaemon is typically +# installed where authentication modules are relatively expensive: such +# as authldap, or authmysql, so it's better to have a number of them running. +# PLEASE NOTE: Some platforms may experience a problem if there's more than +# one daemon. Specifically, SystemV derived platforms that use TLI with +# socket emulation. I'm suspicious of TLI's ability to handle multiple +# processes accepting connections on the same filesystem domain socket. +# +# You may need to increase daemons if as your system load increases. Symptoms +# include sporadic authentication failures. If you start getting +# authentication failures, increase daemons. However, the default of 5 +# SHOULD be sufficient. Bumping up daemon count is only a short-term +# solution. The permanent solution is to add more resources: RAM, faster +# disks, faster CPUs... + +daemons=5 + +##NAME: authdaemonvar:2 +# +# authdaemonvar is here, but is not used directly by authdaemond. It's +# used by various configuration and build scripts, so don't touch it! + +authdaemonvar=/var/run/courier/authdaemon + +##NAME: DEBUG_LOGIN:0 +# +# Dump additional diagnostics to syslog +# +# DEBUG_LOGIN=0 - turn off debugging +# DEBUG_LOGIN=1 - turn on debugging +# DEBUG_LOGIN=2 - turn on debugging + log passwords too +# +# ** YES ** - DEBUG_LOGIN=2 places passwords into syslog. +# +# Note that most information is sent to syslog at level 'debug', so +# you may need to modify your /etc/syslog.conf to be able to see it. + +DEBUG_LOGIN=0 + +##NAME: DEFAULTOPTIONS:0 +# +# A comma-separated list of option=value pairs. Each option is applied +# to an account if the account does not have its own specific value for +# that option. So for example, you can set +# DEFAULTOPTIONS="disablewebmail=1,disableimap=1" +# and then enable webmail and/or imap on individual accounts by setting +# disablewebmail=0 and/or disableimap=0 on the account. + +DEFAULTOPTIONS="" + +##NAME: LOGGEROPTS:0 +# +# courierlogger(1) options, e.g. to set syslog facility +# + +LOGGEROPTS="" + +##NAME: LDAP_TLS_OPTIONS:0 +# +# Options documented in ldap.conf(5) can be set here, prefixed with 'LDAP'. +# Examples: +# +#LDAPTLS_CACERT=/path/to/cacert.pem +#LDAPTLS_REQCERT=demand +#LDAPTLS_CERT=/path/to/clientcert.pem +#LDAPTLS_KEY=/path/to/clientkey.pem diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-courier/templates/authldaprc b/seed/release/eole-2.7/2.7.1/applicationservice/eole-courier/templates/authldaprc new file mode 100644 index 0000000000000000000000000000000000000000..18b8c020fbf81af3e27405a9b58b9dbef1347da9 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-courier/templates/authldaprc @@ -0,0 +1,281 @@ +############################################ +# +# Authentification Pop/Imap pour Scribe +# Equipe Eole +# 12/2006 +# +############################################ +# +# Copyright 2000-2004 Double Precision, Inc. See COPYING for +# distribution information. +# +# Do not alter lines that begin with ##, they are used when upgrading +# this configuration. +# +# authldaprc created from authldaprc.dist by sysconftool +# +# DO NOT INSTALL THIS FILE with world read permissions. This file +# might contain the LDAP admin password! +# +# This configuration file specifies LDAP authentication parameters +# +# The format of this file must be as follows: +# +# field[spaces|tabs]value +# +# That is, the name of the field, followed by spaces or tabs, followed by +# field value. No trailing spaces. +# +# Here are the fields: + +##NAME: LOCATION:0 +# +# Location of your LDAP server(s). If you have multiple LDAP servers, +# you can list them separated by commas and spaces, and they will be tried in +# turn. + +LDAP_URI ldap://%%adresse_ip_ldap + +##NAME: LDAP_PROTOCOL_VERSION:0 +# +# Which version of LDAP protocol to use + +LDAP_PROTOCOL_VERSION 3 + +##NAME: LDAP_BASEDN:0 +# +# Look for authentication here: + +LDAP_BASEDN %%ldap_base_dn + +##NAME: LDAP_BINDDN:0 +# +# You may or may not need to specify the following. Because you've got +# a password here, authldaprc should not be world-readable!!! + +LDAP_BINDDN cn=admin, %%ldap_base_dn +LDAP_BINDPW toto + +##NAME: LDAP_TIMEOUT:0 +# +# Timeout for LDAP search and connection + +LDAP_TIMEOUT 5 + +##NAME: LDAP_AUTHBIND:0 +# +# Define this to have the ldap server authenticate passwords. If LDAP_AUTHBIND +# the password is validated by rebinding with the supplied userid and password. +# If rebind succeeds, this is considered to be an authenticated request. This +# does not support CRAM-MD5 authentication, which requires clearPassword. +# Additionally, if LDAP_AUTHBIND is 1 then password changes are done under +# the credentials of the user themselves, not LDAP_BINDDN/BINDPW +# +LDAP_AUTHBIND 1 + +##NAME: LDAP_MAIL:0 +# +# Here's the field on which we query + +LDAP_MAIL mail + +##NAME: LDAP_FILTER:0 +# +# This LDAP filter will be ANDed with the query for the field defined above +# in LDAP_MAIL. So if you are querying for mail, and you have LDAP_FILTER +# defined to be "(objectClass=CourierMailAccount)" the query that is performed +# will be "(&(objectClass=CourierMailAccount)(mail=<someAccount>))" +# +# LDAP_FILTER (objectClass=CourierMailAccount) + +##NAME: LDAP_DOMAIN:0 +# +# The following default domain will be appended, if not explicitly specified. +# +LDAP_DOMAIN *%%domaine_messagerie_etab + +##NAME: LDAP_GLOB_IDS:0 +# +# The following two variables can be used to set everybody's uid and gid. +# This is convenient if your LDAP specifies a bunch of virtual mail accounts +# The values can be usernames or userids: +# +LDAP_GLOB_UID mail +LDAP_GLOB_GID mail + +##NAME: LDAP_HOMEDIR:0 +# +# We will retrieve the following attributes +# +# The HOMEDIR attribute MUST exist, and we MUST be able to chdir to it + +#LDAP_HOMEDIR homeDirectory +LDAP_HOMEDIR mailDir + +##NAME: LDAP_MAILROOT:0 +# +# If homeDirectory is not an absolute path, define the root of the +# relative paths in LDAP_MAILROOT +# +# LDAP_MAILROOT /var/mail + + +##NAME: LDAP_MAILDIR:0 +# +# The MAILDIR attribute is OPTIONAL, and specifies the location of the +# mail directory. If not specified, ./Maildir will be used + +#LDAP_MAILDIR mailbox +LDAP_MAILDIR mailDir + +##NAME: LDAP_DEFAULTDELIVERY:0 +# +# Courier mail server only: optional attribute specifies custom mail delivery +# instructions for this account (if defined) -- essentially overrides +# DEFAULTDELIVERY from ${sysconfdir}/courierd + +LDAP_DEFAULTDELIVERY defaultDelivery + +##NAME: LDAP_MAILDIRQUOTA:0 +# +# The following variable, if defined, specifies the field containing the +# maildir quota, see README.maildirquota for more information +# +# LDAP_MAILDIRQUOTA quota + + +##NAME: LDAP_FULLNAME:0 +# +# FULLNAME is optional, specifies the user's full name + +LDAP_FULLNAME cn + +##NAME: LDAP_PW:0 +# +# CLEARPW is the clear text password. CRYPT is the crypted password. +# ONE OF THESE TWO ATTRIBUTES IS REQUIRED. If CLEARPW is provided, and +# libhmac.a is available, CRAM authentication will be possible! + +#LDAP_CLEARPW clearPassword +LDAP_CRYPTPW userPassword + +##NAME: LDAP_IDS:0 +# +# Uncomment the following, and modify as appropriate, if your LDAP database +# stores individual userids and groupids. Otherwise, you must uncomment +# LDAP_GLOB_UID and LDAP_GLOB_GID above. LDAP_GLOB_UID and LDAP_GLOB_GID +# specify a uid/gid for everyone. Otherwise, LDAP_UID and LDAP_GID must +# be defined as attributes for everyone. +# +# LDAP_UID uidNumber +# LDAP_GID gidNumber + + +##NAME: LDAP_AUXOPTIONS:0 +# +# Auxiliary options. The LDAP_AUXOPTIONS setting should contain a list of +# comma-separated "ATTRIBUTE=NAME" pairs. These names are additional +# attributes that define various per-account "options", as given in +# INSTALL's description of the OPTIONS setting. +# +# Each ATTRIBUTE specifies an LDAP attribute name. If it is present, +# the attribute value gets placed in the OPTIONS variable, with the name +# NAME. For example: +# +# LDAP_AUXOPTIONS shared=sharedgroup,disableimap=disableimap +# +# Then, if an LDAP record contains the following attributes: +# +# shared: domain1 +# disableimap: 0 +# +# Then authldap will initialize OPTIONS to "sharedgroup=domain1,disableimap=0" +# +# NOTE: ** no spaces in this setting **, the above example has exactly +# one tab character after LDAP_AUXOPTIONS + + +##NAME: LDAP_ENUMERATE_FILTER:0 +# +# {EXPERIMENTAL} +# Optional custom filter used when enumerating accounts for authenumerate, +# in order to compile a list of accounts for shared folders. If present, +# this filter will be used instead of LDAP_FILTER. +# +# LDAP_ENUMERATE_FILTER (&(objectClass=CourierMailAccount)(!(disableshared=1))) + + +##NAME: LDAP_DEREF:0 +# +# Determines how aliases are handled during a search. This option is available +# only with OpenLDAP 2.0 +# +# LDAP_DEREF can be one of the following values: +# never, searching, finding, always. If not specified, aliases are +# never dereferenced. + +LDAP_DEREF never + +##NAME: LDAP_TLS:0 +# +# Set LDAP_TLS to 1 to use the Start TLS extension (RFC 2830). This is +# when the server accepts a normal LDAP connection on port 389 which +# the client then requests 'upgrading' to TLS, and is equivalent to the +# -ZZ flag to ldapsearch. If you are using an ldaps:// URI then do not +# set this option. +# +# For additional LDAP-related options, see the authdaemonrc config file. + +LDAP_TLS 0 + +##NAME: LDAP_EMAILMAP:0 +# +# The following optional settings, if enabled, result in an extra LDAP +# lookup to first locate a handle for an E-mail address, then a second lookup +# on that handle to get the actual authentication record. You'll need +# to uncomment these settings to enable an email handle lookup. +# +# The E-mail address must be of the form user@realm, and this is plugged +# into the following search string. "@user@" and "@realm@" are placeholders +# for the user and the realm portions of the login ID. +# +# LDAP_EMAILMAP (&(userid=@user@)(realm=@realm@)) + +##NAME: LDAP_EMAILMAP_BASEDN:0 +# +# Specify the basedn for the email lookup. The default is LDAP_BASEDN. +# +# LDAP_EMAILMAP_BASEDN o=emailmap, c=com + + +##NAME: LDAP_EMAILMAP_ATTRIBUTE:0 +# +# The attribute which holds the handle. The contents of this attribute +# are then plugged into the regular authentication lookup, and you must set +# LDAP_EMAILMAP_MAIL to the name of this attribute in the authentication +# records (which may be the same as LDAP_MAIL). +# You MUST also leave LDAP_DOMAIN undefined. This enables authenticating +# by handles only. +# +# Here's an example: +# +# dn: userid=john, realm=example.com, o=emailmap, c=com # LDAP_EMAILMAP_BASEDN +# userid: john # LDAP_EMAILMAP search +# realm: example.com # LDAP_EMAILMAP search +# handle: cc223344 # LDAP_EMAILMAP_ATTRIBUTE +# +# +# dn: controlHandle=cc223344, o=example, c=com # LDAP_BASEDN +# controlHandle: cc223344 # LDAP_EMAILMAP_MAIL set to "controlHandle" +# uid: ... +# gid: ... +# [ etc... ] +# +# LDAP_EMAILMAP_ATTRIBUTE handle + +##NAME: LDAP_EMAILMAP_MAIL:0 +# +# After reading LDAP_EMAIL_ATTRIBUTE, the second query will go against +# LDAP_BASEDN, but will key against LDAP_EMAILMAP_MAIL instead of LDAP_MAIL. +# +# LDAP_EMAILMAP_MAIL mail diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-courier/templates/authprog.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-courier/templates/authprog.conf new file mode 100644 index 0000000000000000000000000000000000000000..e05b590b7b72dfe04fb75eda3ef70bd7f9882a64 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-courier/templates/authprog.conf @@ -0,0 +1,18 @@ +<?php +// Données pour le debogage +define('DEBUG', False); +define('LOGTAG', 'courier-cas'); +// Configuration ldap +define('BASEDN', '%%ldap_base_dn'); +define('USER_FILTER', '(&(objectclass=inetOrgPerson)(mail=*)(uid=%s))'); +define('LDAP_SERVER', '%%adresse_ip_annuaire'); +// Configuration IMAP +define('IMAP_SERVER', '%%adresse_imap_sso'); +// Validité du ticket SSO +define('TIMEOUT', %%eolesso_session_timeout); +// Attributs LDAP +define('ATTR_UID','%%ldap_match_attribute.lower()'); +define('ATTR_MAIL','%%ldap_fill_mail.lower()'); +define('ATTR_MAILDIR','%%ldap_fill_maildir.lower()'); +define('ATTR_DESCRIPTION','%%ldap_fill_displayname.lower()'); +?> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-courier/templates/bareos-courier.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-courier/templates/bareos-courier.conf new file mode 100644 index 0000000000000000000000000000000000000000..06f3de01401e7da1346e381e07f67f4b99faede5 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-courier/templates/bareos-courier.conf @@ -0,0 +1,12 @@ +Include { + Options { + aclsupport = no + @/etc/bareos/include-options.conf + } + File = %%container_path_mail/etc/courier/imapd.cnf + File = %%container_path_mail/etc/courier/imapd.key + File = %%container_path_mail/etc/courier/imapd.pem + File = %%container_path_mail/etc/courier/pop3d.cnf + File = %%container_path_mail/etc/courier/pop3d.key + File = %%container_path_mail/etc/courier/pop3d.pem +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-courier/templates/imapd b/seed/release/eole-2.7/2.7.1/applicationservice/eole-courier/templates/imapd new file mode 100644 index 0000000000000000000000000000000000000000..54a3c2f71bc846b856ee5dcb9f09c321bcb76a1e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-courier/templates/imapd @@ -0,0 +1,416 @@ +##VERSION: $Id: imapd.dist.in,v 1.38 2006/02/24 02:15:07 mrsam Exp $ +# +# imapd created from imapd.dist by sysconftool +# +# Do not alter lines that begin with ##, they are used when upgrading +# this configuration. +# +# Copyright 1998 - 2006 Double Precision, Inc. See COPYING for +# distribution information. +# +# This configuration file sets various options for the Courier-IMAP server +# when used with the couriertcpd server. +# A lot of the stuff here is documented in the manual page for couriertcpd. +# +# NOTE - do not use \ to split long variable contents on multiple lines. +# This will break the default imapd.rc script, which parses this file. +# +##NAME: ADDRESS:0 +# +# Address to listen on, can be set to a single IP address. +# +# ADDRESS=127.0.0.1 + +ADDRESS=0 + +##NAME: PORT:1 +# +# Port numbers that connections are accepted on. The default is 143, +# the standard IMAP port. +# +# Multiple port numbers can be separated by commas. When multiple port +# numbers are used it is possible to select a specific IP address for a +# given port as "ip.port". For example, "127.0.0.1.900,192.68.0.1.900" +# accepts connections on port 900 on IP addresses 127.0.0.1 and 192.68.0.1 +# The previous ADDRESS setting is a default for ports that do not have +# a specified IP address. + +PORT=143 + +##NAME: AUTHSERVICE:0 +# +# It's possible to authenticate using a different 'service' parameter +# depending on the connection's port. This only works with authentication +# modules that use the 'service' parameter, such as PAM. Example: +# +# AUTHSERVICE143=imap +# AUTHSERVICE993=imaps + +##NAME: MAXDAEMONS:0 +# +# Maximum number of IMAP servers started +# + +MAXDAEMONS=40 + +##NAME: MAXPERIP:0 +# +# Maximum number of connections to accept from the same IP address + +MAXPERIP=20 + +##NAME: PIDFILE:0 +# +# File where couriertcpd will save its process ID +# + +PIDFILE=/var/run/courier/imapd.pid + +##NAME: TCPDOPTS:0 +# +# Miscellaneous couriertcpd options that shouldn't be changed. +# + +TCPDOPTS="-nodnslookup -noidentlookup" + +##NAME: LOGGEROPTS:0 +# +# courierlogger(1) options. +# + +LOGGEROPTS="-name=imapd" + +##NAME: DEFDOMAIN:0 +# +# Optional default domain. If the username does not contain the +# first character of DEFDOMAIN, then it is appended to the username. +# If DEFDOMAIN and DOMAINSEP are both set, then DEFDOMAIN is appended +# only if the username does not contain any character from DOMAINSEP. +# You can set different default domains based on the the interface IP +# address using the -access and -accesslocal options of couriertcpd(1). + +#DEFDOMAIN="@example.com" + +##NAME: IMAP_CAPABILITY:1 +# +# IMAP_CAPABILITY specifies what most of the response should be to the +# CAPABILITY command. +# +# If you have properly configured Courier to use CRAM-MD5, CRAM-SHA1, or +# CRAM-SHA256 authentication (see INSTALL), set IMAP_CAPABILITY as follows: +# +# IMAP_CAPABILITY="IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA AUTH=CRAM-MD5 AUTH=CRAM-SHA1 AUTH=CRAM-SHA256 IDLE" +# + +IMAP_CAPABILITY="IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE" + +##NAME: KEYWORDS_CAPABILITY:0 +# +# IMAP_KEYWORDS=1 enables custom IMAP keywords. Set this option to 0 to +# disable custom keywords. + +IMAP_KEYWORDS=1 + +##NAME: ACL_CAPABILITY:0 +# +# IMAP_ACL=1 enables IMAP ACL extension. Set this option to 0 to +# disable ACL capabilities announce. + +IMAP_ACL=1 + +##NAME: SMAP1_CAPABILITY:0 +# +# EXPERIMENTAL +# +# To enable the experimental "Simple Mail Access Protocol" extensions, +# uncomment the following setting. +# +# SMAP_CAPABILITY=SMAP1 + +##NAME: IMAP_CAPABILITY_ORIG:2 +# +# For use by webadmin + +IMAP_CAPABILITY_ORIG="IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA AUTH=CRAM-MD5 AUTH=CRAM-SHA1 AUTH=CRAM-SHA256 IDLE" + +##NAME: IMAP_PROXY:0 +# +# Enable proxying. See README.proxy + +IMAP_PROXY=0 + +##NAME: PROXY_HOSTNAME:0 +# +# Override value from gethostname() when checking if a proxy connection is +# required. +# +# PROXY_HOSTNAME= + +##NAME: IMAP_PROXY_FOREIGN:0 +# +# Proxying to non-Courier servers. Re-sends the CAPABILITY command after +# logging in to the remote server. May not work with all IMAP clients. + +IMAP_PROXY_FOREIGN=0 + +##NAME: IMAP_IDLE_TIMEOUT:0 +# +# This setting controls how often +# the server polls for changes to the folder, in IDLE mode (in seconds). + +IMAP_IDLE_TIMEOUT=60 + +##NAME: IMAP_CAPABILITY_TLS:0 +# +# The following setting will advertise SASL PLAIN authentication after +# STARTTLS is established. If you want to allow SASL PLAIN authentication +# with or without TLS then just comment this out, and add AUTH=PLAIN to +# IMAP_CAPABILITY + +IMAP_CAPABILITY_TLS="$IMAP_CAPABILITY AUTH=PLAIN" + +##NAME: IMAP_TLS_ORIG:0 +# +# For use by webadmin + +IMAP_CAPABILITY_TLS_ORIG="$IMAP_CAPABILITY_ORIG AUTH=PLAIN" + +##NAME: IMAP_DISABLETHREADSORT:0 +# +# Set IMAP_DISABLETHREADSORT to disable the THREAD and SORT commands - +# server side sorting and threading. +# +# Those capabilities will still be advertised, but the server will reject +# them. Set this option if you want to disable all the extra load from +# server-side threading and sorting. Not advertising those capabilities +# will simply result in the clients reading the entire folder, and sorting +# it on the client side. That will still put some load on the server. +# advertising these capabilities, but rejecting the commands, will stop this +# silliness. +# + +IMAP_DISABLETHREADSORT=0 + +##NAME: IMAP_CHECK_ALL_FOLDERS:0 +# +# Set IMAP_CHECK_ALL_FOLDERS to 1 if you want the server to check for new +# mail in every folder. Not all IMAP clients use the IMAP's new mail +# indicator, but some do. Normally new mail is checked only in INBOX, +# because it is a comparatively time consuming operation, and it would be +# a complete waste of time unless mail filters are used to deliver +# mail directly to folders. +# +# When IMAP clients are used which support new mail indication, and when +# mail filters are used to sort incoming mail into folders, setting +# IMAP_CHECK_ALL_FOLDERS to 1 will allow IMAP clients to announce new +# mail in folders. Note that this will result in slightly more load on the +# server. +# + +IMAP_CHECK_ALL_FOLDERS=0 + +##NAME: IMAP_OBSOLETE_CLIENT:0 +# +# Set IMAP_OBSOLETE_CLIENT if your IMAP client expects \\NoInferiors to mean +# what \\HasNoChildren really means. + +IMAP_OBSOLETE_CLIENT=0 + +##NAME: IMAP_UMASK:0 +# +# IMAP_UMASK sets the umask of the server process. The value of IMAP_UMASK is +# simply passed to the "umask" command. The default value is 022. +# +# This feature is mostly useful for shared folders, where the file permissions +# of the messages may be important. + +IMAP_UMASK=022 + +##NAME: IMAP_ULIMITD:0 +# +# IMAP_ULIMITD sets the maximum size of the data segment of the server +# process. The value of IMAP_ULIMITD is simply passed to the "ulimit -d" +# command (or ulimit -v). The argument to ulimi sets the upper limit on the +# size of the data segment of the server process, in kilobytes. The default +# value of 65536 sets a very generous limit of 64 megabytes, which should +# be more than plenty for anyone. +# +# This feature is used as an additional safety check that should stop +# any potential denial-of-service attacks that exploit any kind of +# a memory leak to exhaust all the available memory on the server. +# It is theoretically possible that obscenely huge folders will also +# result in the server running out of memory when doing server-side +# sorting (by my calculations you have to have at least 100,000 messages +# in a single folder, for that to happen). + +IMAP_ULIMITD=65536 + +##NAME: IMAP_USELOCKS:0 +# +# Setting IMAP_USELOCKS to 1 will use dot-locking to support concurrent +# multiple access to the same folder. This incurs slight additional +# overhead. Concurrent multiple access will still work without this setting, +# however occasionally a minor race condition may result in an IMAP client +# downloading the same message twice, or a keyword update will fail. +# +# IMAP_USELOCKS=1 is strongly recommended when shared folders are used. + +IMAP_USELOCKS=1 + +##NAME: IMAP_SHAREDINDEXFILE:0 +# +# The index of all accessible folders. Do not change this setting unless +# you know what you're doing. See README.sharedfolders for additional +# information. + +IMAP_SHAREDINDEXFILE=/etc/courier/shared/index + +##NAME: IMAP_ENHANCEDIDLE:0 +# +# If Courier was compiled with the File Alteration Monitor, setting +# IMAP_ENHANCEDIDLE to 1 enables enhanced IDLE mode, where multiple +# clients may open the same folder concurrently, and receive updates to +# folder contents in realtime. See the imapd(8) man page for additional +# information. +# +# IMPORTANT: IMAP_USELOCKS *MUST* also be set to 1, and IDLE must be included +# in the IMAP_CAPABILITY list. +# + +IMAP_ENHANCEDIDLE=0 + +##NAME: IMAP_TRASHFOLDERNAME:0 +# +# The name of the magic trash Folder. For MSOE compatibility, +# you can set IMAP_TRASHFOLDERNAME="Deleted Items". +# +# IMPORTANT: If you change this, you must also change IMAP_EMPTYTRASH + +IMAP_TRASHFOLDERNAME=Trash + +##NAME: IMAP_EMPTYTRASH:0 +# +# The following setting is optional, and causes messages from the given +# folder to be automatically deleted after the given number of days. +# IMAP_EMPTYTRASH is a comma-separated list of folder:days. The default +# setting, below, purges 7 day old messages from the Trash folder. +# Another useful setting would be: +# +# IMAP_EMPTYTRASH=Trash:7,Sent:30 +# +# This would also delete messages from the Sent folder (presumably copies +# of sent mail) after 30 days. This is a global setting that is applied to +# every mail account, and is probably useful in a controlled, corporate +# environment. +# +# Important: the purging is controlled by CTIME, not MTIME (the file time +# as shown by ls). It is perfectly ordinary to see stuff in Trash that's +# a year old. That's the file modification time, MTIME, that's displayed. +# This is generally when the message was originally delivered to this +# mailbox. Purging is controlled by a different timestamp, CTIME, which is +# changed when the file is moved to the Trash folder (and at other times too). +# +# You might want to disable this setting in certain situations - it results +# in a stat() of every file in each folder, at login and logout. +# + +IMAP_EMPTYTRASH=Trash:7 + +##NAME: IMAP_MOVE_EXPUNGE_TO_TRASH:0 +# +# Set IMAP_MOVE_EXPUNGE_TO_TRASH to move expunged messages to Trash. This +# effectively allows an undo of message deletion by fishing the deleted +# mail from trash. Trash can be manually expunged as usually, and mail +# will get automatically expunged from Trash according to IMAP_EMPTYTRASH. +# +# NOTE: shared folders are still expunged as usual. Shared folders are +# not affected. +# + +IMAP_MOVE_EXPUNGE_TO_TRASH=0 + + +##NAME: OUTBOX:0 +# +# The next set of options deal with the "Outbox" enhancement. +# Uncomment the following setting to create a special folder, named +# INBOX.Outbox +# +# OUTBOX=.Outbox + +##NAME: SENDMAIL:0 +# +# If OUTBOX is defined, mail can be sent via the IMAP connection by copying +# a message to the INBOX.Outbox folder. For all practical matters, +# INBOX.Outbox looks and behaves just like any other IMAP folder. If this +# folder doesn't exist it must be created by the IMAP mail client, just +# like any other IMAP folder. The kicker: any message copied or moved to +# this folder is will be E-mailed by the Courier-IMAP server, by running +# the SENDMAIL program. Therefore, messages copied or moved to this +# folder must be well-formed RFC-2822 messages, with the recipient list +# specified in the To:, Cc:, and Bcc: headers. Courier-IMAP relies on +# SENDMAIL to read the recipient list from these headers (and delete the Bcc: +# header) by running the command "$SENDMAIL -oi -t -f $SENDER", with the +# message piped on standard input. $SENDER will be the return address +# of the message, which is set by the authentication module. +# +# DO NOT MODIFY SENDMAIL, below, unless you know what you're doing. +# + +SENDMAIL=/usr/sbin/sendmail + +##NAME: HEADERFROM:0 +# +# For administrative and oversight purposes, the return address, $SENDER +# will also be saved in the X-IMAP-Sender mail header. This header gets +# added to the sent E-mail (but it doesn't get saved in the copy of the +# message that's saved in the folder) +# +# WARNING - By enabling OUTBOX above, *every* IMAP mail client will receive +# the magic OUTBOX treatment. Therefore advance LARTing is in order for +# _all_ of your lusers, until every one of them is aware of this. Otherwise if +# OUTBOX is left at its default setting - a folder name that might be used +# accidentally - some people may be in for a rude surprise. You can redefine +# the name of the magic folder by changing OUTBOX, above. You should do that +# and pick a less-obvious name. Perhaps brand it with your organizational +# name ( OUTBOX=.WidgetsAndSonsOutbox ) + +HEADERFROM=X-IMAP-Sender + +##NAME: OUTBOX_MULTIPLE_SEND:0 +# +# Remove the following comment to allow a COPY of more than one message to +# the Outbox, at a time. +# +# OUTBOX_MULTIPLE_SEND=1 + +##NAME: IMAPDSTART:0 +# +# IMAPDSTART is not used directly. Rather, this is a convenient flag to +# be read by your system startup script in /etc/rc.d, like this: +# +# . /etc/courier/imapd +# +# case x$IMAPDSTART in +# x[yY]*) +# /usr/lib/courier/imapd.rc start +# ;; +# esac +# +# The default setting is going to be NO, so you'll have to manually flip +# it to yes. + +IMAPDSTART=YES + +##NAME: MAILDIRPATH:0 +# +# MAILDIRPATH - directory name of the maildir directory. +# +MAILDIRPATH=MailDir + +##NAME: IMAP_MAILBOX_SANITY_CHECK:0 +## +## Sanity check -- make sure home directory and maildir's ownership matches +## the IMAP server's effective uid and gid +IMAP_MAILBOX_SANITY_CHECK=0 + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-courier/templates/imapd-ssl b/seed/release/eole-2.7/2.7.1/applicationservice/eole-courier/templates/imapd-ssl new file mode 100644 index 0000000000000000000000000000000000000000..14ef729cad1d36cb8fcf76cf04a0422af2cbbcdc --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-courier/templates/imapd-ssl @@ -0,0 +1,334 @@ +##VERSION: $Id: imapd-ssl.dist.in 64 2011-04-11 11:01:33Z mrsam $ +# +# imapd-ssl created from imapd-ssl.dist by sysconftool +# +# Do not alter lines that begin with ##, they are used when upgrading +# this configuration. +# +# Copyright 2000 - 2008 Double Precision, Inc. See COPYING for +# distribution information. +# +# This configuration file sets various options for the Courier-IMAP server +# when used to handle SSL IMAP connections. +# +# SSL and non-SSL connections are handled by a dedicated instance of the +# couriertcpd daemon. If you are accepting both SSL and non-SSL IMAP +# connections, you will start two instances of couriertcpd, one on the +# IMAP port 143, and another one on the IMAP-SSL port 993. +# +# Download OpenSSL from http://www.openssl.org/ +# +##NAME: SSLPORT:1 +# +# Options in the imapd-ssl configuration file AUGMENT the options in the +# imapd configuration file. First the imapd configuration file is read, +# then the imapd-ssl configuration file, so we do not have to redefine +# anything. +# +# However, some things do have to be redefined. The port number is +# specified by SSLPORT, instead of PORT. The default port is port 993. +# +# Multiple port numbers can be separated by commas. When multiple port +# numbers are used it is possibly to select a specific IP address for a +# given port as "ip.port". For example, "127.0.0.1.900,192.168.0.1.900" +# accepts connections on port 900 on IP addresses 127.0.0.1 and 192.168.0.1 +# The SSLADDRESS setting is a default for ports that do not have +# a specified IP address. + +SSLPORT=993 + +##NAME: SSLADDRESS:0 +# +# Address to listen on, can be set to a single IP address. +# +# SSLADDRESS=127.0.0.1 + +SSLADDRESS=0 + +##NAME: SSLPIDFILE:0 +# +# That's the SSL IMAP port we'll listen on. +# Feel free to redefine MAXDAEMONS, TCPDOPTS, and MAXPERIP. + +SSLPIDFILE=/var/run/courier/imapd-ssl.pid + +##NAME: SSLLOGGEROPTS:0 +# +# courierlogger(1) options. +# + +SSLLOGGEROPTS="-name=imapd-ssl" + +##NAME: IMAPDSSLSTART:0 +# +# Different pid files, so that both instances of couriertcpd can coexist +# happily. +# +# You can also redefine IMAP_CAPABILITY, although I can't +# think of why you'd want to do that. +# +# +# Ok, the following settings are new to imapd-ssl: +# +# Whether or not to start IMAP over SSL on simap port: + +IMAPDSSLSTART=YES + +##NAME: IMAPDSTARTTLS:0 +# +# Whether or not to implement IMAP STARTTLS extension instead: + +IMAPDSTARTTLS=YES + +##NAME: IMAP_TLS_REQUIRED:1 +# +# Set IMAP_TLS_REQUIRED to 1 if you REQUIRE STARTTLS for everyone. +# (this option advertises the LOGINDISABLED IMAP capability, until STARTTLS +# is issued). +#IMAPDSSLSTART=NO +#IMAPDSTARTTLS=YES +#IMAP_TLS_REQUIRED=1 + +IMAP_TLS_REQUIRED=0 +TLS_CIPHER_LIST="ALL:!ADH:RC4+RSA:!SSLv2:@STRENGTH:!LOW:!MEDIUM:!EXP:!DES:!DES-CBC3-SHA:TLS1_2:HIGH" +TLS_PROTOCOL="TLS1_1:TLS1:TLS1_2" + + +######################################################################### +# +# The following variables configure IMAP over SSL. If OpenSSL or GnuTLS +# is available during configuration, the couriertls helper gets compiled, and +# upon installation a dummy TLS_CERTFILE gets generated. +# +# WARNING: Peer certificate verification has NOT yet been tested. Proceed +# at your own risk. Only the basic SSL/TLS functionality is known to be +# working. Keep this in mind as you play with the following variables. +# +##NAME: COURIERTLS:0 +# + +COURIERTLS=/usr/bin/couriertls + +##NAME: TLS_PROTOCOL:0 +# +# TLS_PROTOCOL sets the protocol version. The possible versions are: +# +# OpenSSL: +# +# SSL3 - SSLv3 +# SSL23 - either SSLv2 or SSLv3 (also TLS1, it seems) +# TLS1 - TLS1 +# +# Note that this setting, with OpenSSL, is modified by the TLS_CIPHER_LIST +# setting, below. +# +# GnuTLS: +# +# SSL3 - SSLv3 +# TLS1 - TLS 1.0 +# TLS1_1 - TLS 1.1 +# +# When compiled against GnuTLS, multiple protocols can be selected as follows: +# +# TLS_PROTOCOL="TLS1_1:TLS1:SSL3" +# +# DEFAULT VALUES: +# +# SSL23 (OpenSSL), or "TLS_1:TLS1:SSL3" (GnuTLS) + +##NAME: TLS_STARTTLS_PROTOCOL:0 +# +# TLS_STARTTLS_PROTOCOL is used instead of TLS_PROTOCOL for the IMAP STARTTLS +# extension, as opposed to IMAP over SSL on port 993. +# +# It takes the same values for OpenSSL/GnuTLS as TLS_PROTOCOL + +##NAME: TLS_CIPHER_LIST:0 +# +# TLS_CIPHER_LIST optionally sets the list of ciphers to be used by the +# OpenSSL library. In most situations you can leave TLS_CIPHER_LIST +# undefined +# +# OpenSSL: +# +# TLS_CIPHER_LIST="SSLv3:TLSv1:HIGH:!LOW:!MEDIUM:!EXP:!NULL:!aNULL@STRENGTH" +# +# +# GnuTLS: +# +# TLS_CIPHER_LIST="HIGH:MEDIUM" +# +# The actual list of available ciphers depend on the options GnuTLS was +# compiled against. The possible ciphers are: +# +# AES256, 3DES, AES128, ARC128, ARC40, RC2, DES, NULL +# +# Also, the following aliases: +# +# HIGH -- all ciphers that use more than a 128 bit key size +# MEDIUM -- all ciphers that use a 128 bit key size +# LOW -- all ciphers that use fewer than a 128 bit key size, the NULL cipher +# is not included +# ALL -- all ciphers except the NULL cipher + +##NAME: TLS_MIN_DH_BITS:0 +# +# TLS_MIN_DH_BITS=n +# +# GnuTLS only: +# +# Set the minimum number of acceptable bits for a DH key exchange. +# +# GnuTLS's compiled-in default is 727 bits (as of GnuTLS 1.6.3). Some server +# have been encountered that offer 512 bit keys. You may have to set +# TLS_MIN_DH_BITS=512 here, if necessary. + +##NAME: TLS_KX_LIST:0 +# +# GnuTLS only: +# +# Allowed key exchange protocols. The default of "ALL" should be sufficient. +# The list of supported key exchange protocols depends on the options GnuTLS +# was compiled against, but may include the following: +# +# DHERSA, DHEDSS, RSA, SRP, SRPRSA, SRPDSS, PSK, DHEPSK, ANONDH, RSAEXPORT + +TLS_KX_LIST=ALL + +##NAME: TLS_COMPRESSION:0 +# +# GnuTLS only: +# +# Optional compression. "ALL" selects all available compression methods. +# +# Available compression methods: DEFLATE, LZO, NULL + +TLS_COMPRESSION=ALL + +##NAME: TLS_CERTS:0 +# +# GnuTLS only: +# +# Supported certificate types are X509 and OPENPGP. +# +# OPENPGP has not been tested + +TLS_CERTS=X509 + +##NAME: TLS_TIMEOUT:0 +# TLS_TIMEOUT is currently not implemented, and reserved for future use. +# This is supposed to be an inactivity timeout, but its not yet implemented. +# + +##NAME: TLS_DHCERTFILE:0 +# +# TLS_DHCERTFILE - PEM file that stores a Diffie-Hellman -based certificate. +# When OpenSSL is compiled to use Diffie-Hellman ciphers instead of RSA +# you must generate a DH pair that will be used. In most situations the +# DH pair is to be treated as confidential, and the file specified by +# TLS_DHCERTFILE must not be world-readable. +# +# TLS_DHCERTFILE= + +##NAME: TLS_CERTFILE:0 +# +# TLS_CERTFILE - certificate to use. TLS_CERTFILE is required for SSL/TLS +# servers, and is optional for SSL/TLS clients. TLS_CERTFILE is usually +# treated as confidential, and must not be world-readable. Set TLS_CERTFILE +# instead of TLS_DHCERTFILE if this is a garden-variety certificate +# +# VIRTUAL HOSTS (servers only): +# +# Due to technical limitations in the original SSL/TLS protocol, a dedicated +# IP address is required for each virtual host certificate. If you have +# multiple certificates, install each certificate file as +# $TLS_CERTFILE.aaa.bbb.ccc.ddd, where "aaa.bbb.ccc.ddd" is the IP address +# for the certificate's domain name. So, if TLS_CERTFILE is set to +# /etc/certificate.pem, then you'll need to install the actual certificate +# files as /etc/certificate.pem.192.168.0.2, /etc/certificate.pem.192.168.0.3 +# and so on, for each IP address. +# +# GnuTLS only (servers only): +# +# GnuTLS implements a new TLS extension that eliminates the need to have a +# dedicated IP address for each SSL/TLS domain name. Install each certificate +# as $TLS_CERTFILE.domain, so if TLS_CERTFILE is set to /etc/certificate.pem, +# then you'll need to install the actual certificate files as +# /etc/certificate.pem.host1.example.com, /etc/certificate.pem.host2.example.com +# and so on. +# +# Note that this TLS extension also requires a corresponding support in the +# client. Older SSL/TLS clients may not support this feature. +# +# This is an experimental feature. + +TLS_CERTFILE=/etc/courier/imapd.pem + +##NAME: TLS_TRUSTCERTS:0 +# +# TLS_TRUSTCERTS=pathname - load trusted certificates from pathname. +# pathname can be a file or a directory. If a file, the file should +# contain a list of trusted certificates, in PEM format. If a +# directory, the directory should contain the trusted certificates, +# in PEM format, one per file and hashed using OpenSSL's c_rehash +# script. TLS_TRUSTCERTS is used by SSL/TLS clients (by specifying +# the -domain option) and by SSL/TLS servers (TLS_VERIFYPEER is set +# to PEER or REQUIREPEER). +# + +TLS_TRUSTCERTS=/etc/ssl/certs + +##NAME: TLS_VERIFYPEER:0 +# +# TLS_VERIFYPEER - how to verify client certificates. The possible values of +# this setting are: +# +# NONE - do not verify anything +# +# PEER - verify the client certificate, if one's presented +# +# REQUIREPEER - require a client certificate, fail if one's not presented +# +# +TLS_VERIFYPEER=NONE + + +##NAME: TLS_EXTERNAL:0 +# +# To enable SSL certificate-based authentication: +# +# 1) TLS_TRUSTCERTS must be set to a pathname that holds your certificate +# authority's SSL certificate +# +# 2) TLS_VERIFYPEER=PEER or TLS_VERIFYPEER=REQUIREPEER (the later settings +# requires all SSL clients to present a certificate, and rejects +# SSL/TLS connections without a valid cert). +# +# 3) Set TLS_EXTERNAL, below, to the subject field that holds the login ID. +# Example: +# +# TLS_EXTERNAL=emailaddress +# +# The above example retrieves the login ID from the "emailaddress" subject +# field. The certificate's emailaddress subject must match exactly the login +# ID in the courier-authlib database. + +##NAME: TLS_CACHE:0 +# +# A TLS/SSL session cache may slightly improve response for IMAP clients +# that open multiple SSL sessions to the server. TLS_CACHEFILE will be +# automatically created, TLS_CACHESIZE bytes long, and used as a cache +# buffer. +# +# This is an experimental feature and should be disabled if it causes +# problems with SSL clients. Disable SSL caching by commenting out the +# following settings: + +TLS_CACHEFILE=/var/lib/courier/couriersslcache +TLS_CACHESIZE=524288 + +##NAME: MAILDIRPATH:0 +# +# MAILDIRPATH - directory name of the maildir directory. +# +MAILDIRPATH=Maildir diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-courier/templates/mail.ini b/seed/release/eole-2.7/2.7.1/applicationservice/eole-courier/templates/mail.ini new file mode 100644 index 0000000000000000000000000000000000000000..89964459fac9413e66972fcba6de929c9add41e3 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-courier/templates/mail.ini @@ -0,0 +1,10 @@ +# fichiers nécessitant mot de passe ldap +# pour les services mail + +[authldaprc] +container='mail' +path="/etc/courier" +string='LDAP_BINDPW ' +rights='daemon' +mode='0600' + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-courier/templates/pop3d-ssl b/seed/release/eole-2.7/2.7.1/applicationservice/eole-courier/templates/pop3d-ssl new file mode 100644 index 0000000000000000000000000000000000000000..4db6abb83336be21158a6f07162e64d6e53b595e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-courier/templates/pop3d-ssl @@ -0,0 +1,317 @@ +##VERSION: $Id: pop3d-ssl.dist.in 64 2011-04-11 11:01:33Z mrsam $ +# +# pop3d-ssl created from pop3d-ssl.dist by sysconftool +# +# Do not alter lines that begin with ##, they are used when upgrading +# this configuration. +# +# Copyright 2000-2008 Double Precision, Inc. See COPYING for +# distribution information. +# +# This configuration file sets various options for the Courier-IMAP server +# when used to handle SSL POP3 connections. +# +# SSL and non-SSL connections are handled by a dedicated instance of the +# couriertcpd daemon. If you are accepting both SSL and non-SSL POP3 +# connections, you will start two instances of couriertcpd, one on the +# POP3 port 110, and another one on the POP3-SSL port 995. +# +# Download OpenSSL from http://www.openssl.org/ +# +##NAME: SSLPORT:0 +# +# Options in the pop3d-ssl configuration file AUGMENT the options in the +# pop3d configuration file. First the pop3d configuration file is read, +# then the pop3d-ssl configuration file, so we do not have to redefine +# anything. +# +# However, some things do have to be redefined. The port number is +# specified by SSLPORT, instead of PORT. The default port is port 995. +# +# Multiple port numbers can be separated by commas. When multiple port +# numbers are used it is possibly to select a specific IP address for a +# given port as "ip.port". For example, "127.0.0.1.900,192.168.0.1.900" +# accepts connections on port 900 on IP addresses 127.0.0.1 and 192.168.0.1 +# The SSLADDRESS setting is a default for ports that do not have +# a specified IP address. + +SSLPORT=995 + +##NAME: SSLADDRESS:0 +# +# Address to listen on, can be set to a single IP address. +# +# SSLADDRESS=127.0.0.1 + +SSLADDRESS=0 + +##NAME: SSLPIDFILE:0 +# + +SSLPIDFILE=/var/run/courier/pop3d-ssl.pid + +##NAME: SSLLOGGEROPTS:0 +# +# courierlogger(1) options. +# + +SSLLOGGEROPTS="-name=pop3d-ssl" + +##NAME: POP3DSSLSTART:0 +# +# Whether or not to start POP3 over SSL on spop3 port: + +POP3DSSLSTART=YES + +##NAME: POP3_STARTTLS:0 +# +# Whether or not to implement the POP3 STLS extension: + +POP3_STARTTLS=YES + +##NAME: POP3_TLS_REQUIRED:1 +# +# Set POP3_TLS_REQUIRED to 1 if you REQUIRE STARTTLS for everyone. +# (this option advertises the LOGINDISABLED POP3 capability, until STARTTLS +# is issued). + +POP3_TLS_REQUIRED=0 +TLS_CIPHER_LIST="ALL:!ADH:RC4+RSA:!SSLv2:@STRENGTH:!LOW:!MEDIUM:!EXP:!DES:!DES-CBC3-SHA:TLS1_2:HIGH" +TLS_PROTOCOL="TLS1_1:TLS1:TLS1_2" + +##NAME: COURIERTLS:0 +# +# The following variables configure POP3 over SSL. If OpenSSL or GnuTLS +# is available during configuration, the couriertls helper gets compiled, and +# upon installation a dummy TLS_CERTFILE gets generated. +# +# WARNING: Peer certificate verification has NOT yet been tested. Proceed +# at your own risk. Only the basic SSL/TLS functionality is known to be +# working. Keep this in mind as you play with the following variables. + +COURIERTLS=/usr/bin/couriertls + +##NAME: TLS_PROTOCOL:0 +# +# TLS_PROTOCOL sets the protocol version. The possible versions are: +# +# OpenSSL: +# +# SSL3 - SSLv3 +# SSL23 - either SSLv2 or SSLv3 (also TLS1, it seems) +# TLS1 - TLS1 +# +# Note that this setting, with OpenSSL, is modified by the TLS_CIPHER_LIST +# setting, below. +# +# GnuTLS: +# +# SSL3 - SSLv3 +# TLS1 - TLS 1.0 +# TLS1_1 - TLS 1.1 +# +# When compiled against GnuTLS, multiple protocols can be selected as follows: +# +# TLS_PROTOCOL="TLS1_1:TLS1:SSL3" +# +# DEFAULT VALUES: +# +# SSL23 (OpenSSL), or "TLS_1:TLS1:SSL3" (GnuTLS) + +##NAME: TLS_STARTTLS_PROTOCOL:0 +# +# TLS_STARTTLS_PROTOCOL is used instead of TLS_PROTOCOL for the POP3 STARTTLS +# extension, as opposed to POP3 over SSL on port 995. +# +# It takes the same values for OpenSSL/GnuTLS as TLS_PROTOCOL + +TLS_STARTTLS_PROTOCOL=TLS1 + +##NAME: TLS_CIPHER_LIST:0 +# +# TLS_CIPHER_LIST optionally sets the list of ciphers to be used by the +# OpenSSL library. In most situations you can leave TLS_CIPHER_LIST +# undefined +# +# OpenSSL: +# +# TLS_CIPHER_LIST="SSLv3:TLSv1:HIGH:!LOW:!MEDIUM:!EXP:!NULL:!aNULL@STRENGTH" +# +# +# GnuTLS: +# +# TLS_CIPHER_LIST="HIGH:MEDIUM" +# +# The actual list of available ciphers depend on the options GnuTLS was +# compiled against. The possible ciphers are: +# +# AES256, 3DES, AES128, ARC128, ARC40, RC2, DES, NULL +# +# Also, the following aliases: +# +# HIGH -- all ciphers that use more than a 128 bit key size +# MEDIUM -- all ciphers that use a 128 bit key size +# LOW -- all ciphers that use fewer than a 128 bit key size, the NULL cipher +# is not included +# ALL -- all ciphers except the NULL cipher + + +##NAME: TLS_MIN_DH_BITS:0 +# +# TLS_MIN_DH_BITS=n +# +# GnuTLS only: +# +# Set the minimum number of acceptable bits for a DH key exchange. +# +# GnuTLS's compiled-in default is 727 bits (as of GnuTLS 1.6.3). Some server +# have been encountered that offer 512 bit keys. You may have to set +# TLS_MIN_DH_BITS=512 here, if necessary. + +##NAME: TLS_KX_LIST:0 +# +# GnuTLS only: +# +# Allowed key exchange protocols. The default of "ALL" should be sufficient. +# The list of supported key exchange protocols depends on the options GnuTLS +# was compiled against, but may include the following: +# +# DHERSA, DHEDSS, RSA, SRP, SRPRSA, SRPDSS, PSK, DHEPSK, ANONDH, RSAEXPORT + +TLS_KX_LIST=ALL + +##NAME: TLS_COMPRESSION:0 +# +# GnuTLS only: +# +# Optional compression. "ALL" selects all available compression methods. +# +# Available compression methods: DEFLATE, LZO, NULL + +TLS_COMPRESSION=ALL + +##NAME: TLS_CERTS:0 +# +# GnuTLS only: +# +# Supported certificate types are X509 and OPENPGP. +# +# OPENPGP has not been tested + +TLS_CERTS=X509 + +##NAME: TLS_TIMEOUT:0 +# TLS_TIMEOUT is currently not implemented, and reserved for future use. +# This is supposed to be an inactivity timeout, but its not yet implemented. +# + +##NAME: TLS_DHCERTFILE:0 +# +# TLS_DHCERTFILE - PEM file that stores a Diffie-Hellman -based certificate. +# When OpenSSL is compiled to use Diffie-Hellman ciphers instead of RSA +# you must generate a DH pair that will be used. In most situations the +# DH pair is to be treated as confidential, and the file specified by +# TLS_DHCERTFILE must not be world-readable. +# +# TLS_DHCERTFILE= + +##NAME: TLS_CERTFILE:0 +# +# TLS_CERTFILE - certificate to use. TLS_CERTFILE is required for SSL/TLS +# servers, and is optional for SSL/TLS clients. TLS_CERTFILE is usually +# treated as confidential, and must not be world-readable. Set TLS_CERTFILE +# instead of TLS_DHCERTFILE if this is a garden-variety certificate +# +# VIRTUAL HOSTS (servers only): +# +# Due to technical limitations in the original SSL/TLS protocol, a dedicated +# IP address is required for each virtual host certificate. If you have +# multiple certificates, install each certificate file as +# $TLS_CERTFILE.aaa.bbb.ccc.ddd, where "aaa.bbb.ccc.ddd" is the IP address +# for the certificate's domain name. So, if TLS_CERTFILE is set to +# /etc/certificate.pem, then you'll need to install the actual certificate +# files as /etc/certificate.pem.192.168.0.2, /etc/certificate.pem.192.168.0.3 +# and so on, for each IP address. +# +# GnuTLS only (servers only): +# +# GnuTLS implements a new TLS extension that eliminates the need to have a +# dedicated IP address for each SSL/TLS domain name. Install each certificate +# as $TLS_CERTFILE.domain, so if TLS_CERTFILE is set to /etc/certificate.pem, +# then you'll need to install the actual certificate files as +# /etc/certificate.pem.host1.example.com, /etc/certificate.pem.host2.example.com +# and so on. +# +# Note that this TLS extension also requires a corresponding support in the +# client. Older SSL/TLS clients may not support this feature. +# +# This is an experimental feature. + +TLS_CERTFILE=/etc/courier/pop3d.pem + +##NAME: TLS_TRUSTCERTS:0 +# +# TLS_TRUSTCERTS=pathname - load trusted certificates from pathname. +# pathname can be a file or a directory. If a file, the file should +# contain a list of trusted certificates, in PEM format. If a +# directory, the directory should contain the trusted certificates, +# in PEM format, one per file and hashed using OpenSSL's c_rehash +# script. TLS_TRUSTCERTS is used by SSL/TLS clients (by specifying +# the -domain option) and by SSL/TLS servers (TLS_VERIFYPEER is set +# to PEER or REQUIREPEER). +# + +TLS_TRUSTCERTS=/etc/ssl/certs + +##NAME: TLS_VERIFYPEER:0 +# +# TLS_VERIFYPEER - how to verify client certificates. The possible values of +# this setting are: +# +# NONE - do not verify anything +# +# PEER - verify the client certificate, if one's presented +# +# REQUIREPEER - require a client certificate, fail if one's not presented +# +# +TLS_VERIFYPEER=NONE + +##NAME: TLS_EXTERNAL:0 +# +# To enable SSL certificate-based authentication: +# +# 1) TLS_TRUSTCERTS must be set to a pathname that holds your certificate +# authority's SSL certificate +# +# 2) TLS_VERIFYPEER=PEER or TLS_VERIFYPEER=REQUIREPEER (the later settings +# requires all SSL clients to present a certificate, and rejects +# SSL/TLS connections without a valid cert). +# +# 3) Set TLS_EXTERNAL, below, to the subject field that holds the login ID. +# Example: +# +# TLS_EXTERNAL=emailaddress +# +# The above example retrieves the login ID from the "emailaddress" subject +# field. The certificate's emailaddress subject must match exactly the login +# ID in the courier-authlib database. + +##NAME: TLS_CACHE:0 +# +# A TLS/SSL session cache may slightly improve response for long-running +# POP3 clients. TLS_CACHEFILE will be automatically created, TLS_CACHESIZE +# bytes long, and used as a cache buffer. +# +# This is an experimental feature and should be disabled if it causes +# problems with SSL clients. Disable SSL caching by commenting out the +# following settings: + +TLS_CACHEFILE=/var/lib/courier/couriersslcache +TLS_CACHESIZE=524288 + +##NAME: MAILDIRPATH:0 +# +# MAILDIRPATH - directory name of the maildir directory. +# +MAILDIRPATH=Maildir diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/dictionaries/24_cups.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/dictionaries/24_cups.xml new file mode 100644 index 0000000000000000000000000000000000000000..e56e3c215fa355e3b703a35ced7d614c3599dbaa --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/dictionaries/24_cups.xml @@ -0,0 +1,127 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + <file filelist='cups' name='/etc/bareos/bareosfichiers.d/cups.conf' source='bareos-cups.conf' mkdir='True'/> + </files> + + <containers> + <!-- FIXME 2.4 : a new container for cups ? --> + <container name='fichier' id='12'> + <package>eole-cups-pkg</package> + <service servicelist='cups'>cups</service> + <service servicelist='cups'>cups-browsed</service> + <service_access service='cups'> + <port>631</port> + </service_access> + <file filelist='cups' name='/etc/cups/cupsd.conf'/> + <file filelist='cups' name='/etc/cups/cups-browsed.conf'/> + <file filelist='cups' name='/etc/cups/cups-files.conf'/> + <file filelist='cups' name='/etc/cups/cups-pdf.conf'/> + <file filelist='cups' name='/etc/cups/client.conf' source='cups-client.conf'/> + <file filelist='cups' name='/etc/pam.d/cupsys' source='cups'/> + <file filelist='cups' name='/etc/default/cups' source='cups.default'/> + <file filelist='cups' name='/etc/apparmor.d/local/usr.sbin.cupsd' /> + </container> + </containers> + + <variables> + + <family name='services'> + <variable name='activer_cups' type='oui/non' description="Activer le serveur d'impression CUPS" > + <value>oui</value> + </variable> + </family> + + <family name='cups' mode='expert' icon='print'> + <variable name="cups_pdf" type="oui/non" description="Activation de l'imprimante virtuelle PDF"> + <value>oui</value> + </variable> + <variable name="cups_pdf_name" type="string" description="Nom de l'imprimante virtuelle PDF"> + <value>PDF</value> + </variable> + <variable name="cups_pdf_shared" type="string" description="L'imprimante virtuelle PDF est partagée"> + <value>true</value> + </variable> + <variable name='cups_loglevel' type='string' description='Niveau de log'> + <value>warn</value> + </variable> + <variable name='cups_browsing' type='on/off' description='Activer la récupération des informations des imprimantes distantes'> + <value>on</value> + </variable> + <variable name='cups_maxcopies' type='number' description="Nombre maximum de copies qu'un utilisateur peut effectuer pour un travail d'impression"> + <value>100</value> + </variable> + <variable name='cups_maxjobs' type='number' description='Nombre maximum de travaux simultanés'> + <value>500</value> + </variable> + <variable name='cups_maxclients' type='number' description='Nombre maximum de clients simultanés'> + <value>100</value> + </variable> + <variable name='cups_preservejobhistory' type='string' description="Conserver l'historique des demandes d'impression"> + <value>Yes</value> + </variable> + <variable name='cups_preservejobfiles' type='string' description='Conserver les fichiers après impression'> + <value>No</value> + </variable> + <variable name='cups_autopurgejobs' type='string' description="Purger automatiquement l'historique des travaux"> + <value>No</value> + </variable> + <variable name='cups_printcap' type='oui/non' description="Générer le fichier printcap"> + <value>non</value> + </variable> + <variable name='cups_lp' type='oui/non' description="Charger le module d'impression d'imprimante sur port parallèle (incompatible avec les conteneurs)"> + <value>non</value> + </variable> + + </family> + + <separators/> + + </variables> + + <constraints> + <check name='valid_regexp' target='cups_pdf_name'> + <param>^[A-Za-z0-9_-]*$</param> + <param name='err_msg'>Seuls les caractères alphanumériques, _ et - sont autorisés</param> + </check> + <check name='valid_enum' target='cups_pdf_shared'> + <param>['true','false']</param> + </check> + <check name='valid_enum' target='cups_loglevel'> + <param>['alert','crit','debug2','debug','emerg','error','info','none','notice','warn']</param> + </check> + <check name='valid_enum' target='cups_preservejobhistory'> + <param>['Yes','No']</param> + </check> + <check name='valid_enum' target='cups_preservejobfiles'> + <param>['Yes','No']</param> + </check> + <check name='valid_enum' target='cups_autopurgejobs'> + <param>['Yes','No']</param> + </check> + + <condition name='disabled_if_in' source='cups_pdf'> + <param>non</param> + <target type='variable'>cups_pdf_name</target> + <target type='variable'>cups_pdf_shared</target> + </condition> + + <condition name='disabled_if_in' source='activer_cups'> + <param>non</param> + <target type='filelist'>cups</target> + <target type='servicelist'>cups</target> + <target type='family'>cups</target> + </condition> + + </constraints> + + <help> + <variable name='activer_cups'>Le Common Unix Printing System (CUPS) est un système modulaire d'impression informatique pour les systèmes d'exploitation Unix et assimilés</variable> + <family name='cups'>Paramétrage avancé du serveur d'impression CUPS</family> + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/files/usr/share/ead2/backend/config/actions/actions_cups.cfg b/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/files/usr/share/ead2/backend/config/actions/actions_cups.cfg new file mode 100644 index 0000000000000000000000000000000000000000..0fd22c83d05e3026d24454ed2dee330fd65bbcf0 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/files/usr/share/ead2/backend/config/actions/actions_cups.cfg @@ -0,0 +1 @@ +printers diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/files/usr/share/ead2/backend/config/perms/perm_cups.ini b/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/files/usr/share/ead2/backend/config/perms/perm_cups.ini new file mode 100644 index 0000000000000000000000000000000000000000..0ca671be51a4d04c16bf3a4cf5c1512c03e8b4e6 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/files/usr/share/ead2/backend/config/perms/perm_cups.ini @@ -0,0 +1,5 @@ +[roles] +admin=Administrateur + +[permissions] +printers=admin diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/files/usr/share/eole/diagnose/42-cups b/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/files/usr/share/eole/diagnose/42-cups new file mode 100644 index 0000000000000000000000000000000000000000..5861472fac442b0286d76c91f632651dfb74f2fb --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/files/usr/share/eole/diagnose/42-cups @@ -0,0 +1,10 @@ +#!/bin/bash + +if [ $(CreoleGet activer_cups) != "non" ];then + . /usr/lib/eole/diagnose.sh + EchoGras "*** Serveur d'impressions" + TestPid "Impression Cups" cupsd + echo +fi + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/files/usr/share/zephir/monitor/configs/printers.agent b/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/files/usr/share/zephir/monitor/configs/printers.agent new file mode 100644 index 0000000000000000000000000000000000000000..30382d09a89f2f41aaf9a074408f74dd6c9c299d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/files/usr/share/zephir/monitor/configs/printers.agent @@ -0,0 +1,18 @@ +# -*- coding: UTF-8 -*- +""" +Imprimantes +""" + +from zephir.monitor.agentmanager.config import ACTIVER_CUPS + +if ACTIVER_CUPS: + from zephir.monitor.agents.printers import Printers + printers = Printers("printers", + period = 240, + description = """Imprimantes""", + requires = ['cups'], + section="""Utilisation""", + ) + AGENTS = [printers] +else: + AGENTS = [] diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/files/usr/share/zephir/monitor/configs/services/21_cups.srv b/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/files/usr/share/zephir/monitor/configs/services/21_cups.srv new file mode 100644 index 0000000000000000000000000000000000000000..041c272eca1e99a291538a46e72378e2a3ee6e86 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/files/usr/share/zephir/monitor/configs/services/21_cups.srv @@ -0,0 +1,12 @@ +# -*- coding: UTF-8 -*- +""" +Surveillance du service Cups +""" + +from zephir.monitor.agents.services import PIDService +from zephir.monitor.agentmanager.config import ACTIVER_CUPS + +if ACTIVER_CUPS: + data = {'cupsd' : "Impression (CUPS)"} + AGENTS.append(PIDService('cups', data, period=115, + description="Etat du service d'Impression (CUPS)")) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/postservices/00-cups b/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/postservices/00-cups new file mode 100644 index 0000000000000000000000000000000000000000..70cb3c9990816c93c9aac50d9d322abd8e74c140 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/postservices/00-cups @@ -0,0 +1,72 @@ +#!/bin/bash + +#inspiré par /var/lib/dpkg/info/cups-pdf.postinst et /var/lib/dpkg/info/cups-pdf.postrm + +[ "$(CreoleGet activer_cups)" = "non" ] && exit 0 + +LPSTAT=$(CreoleRun "LC_ALL=C lpstat -h localhost -v 2> /dev/null| grep 'cups-pdf:/'" "fichier") +SIZE="A4" + +activated=$(CreoleGet cups_pdf) + +function add_printer() { + aqueue=$1 + shared=$2 + # Create the queue. + CreoleRun "lpadmin -h localhost -p $aqueue -v cups-pdf:/ -m lsb/usr/cups-pdf/CUPS-PDF_opt.ppd -o printer-is-shared=$shared -o PageSize=$SIZE" "fichier" + # Enable the queue. + CreoleRun "cupsenable -h localhost $aqueue" "fichier" + CreoleRun "cupsaccept -h localhost $aqueue" "fichier" + #reload + CreoleRun "LC_ALL=C lpoptions -h localhost -d $aqueue &>/dev/null" "fichier" +} + +function del_printer() { + dqueue=$1 + moveto=$2 + CreoleRun "cupsreject -h localhost $dqueue" "fichier" + CreoleRun "cupsdisable -h localhost $dqueue" "fichier" + [ -n "$moveto" ] && CreoleRun "lpmove -h localhost $dqueue $moveto" "fichier" + CreoleRun "lpadmin -h localhost -x $dqueue" "fichier" +} + +if [ "$(CreoleGet cups_pdf)" = "oui" ]; then + queue=$(CreoleGet cups_pdf_name) + shared=$(CreoleGet cups_pdf_shared) + if [ -z "$LPSTAT" ] + then + add_printer $queue "$shared" + elif [ "${LPSTAT:0:11}" = "device for " ]; then + #rename printer + old_queue=$(echo ${LPSTAT:11}|cut -d':' -f1) + if [ "$queue" = "$old_queue" ]; then + #do nothing + echo -n '' + elif [ "$(echo $queue | tr a-z A-Z)" = "$(echo $old_queue | tr a-z A-Z)" ]; then + #change case (cups is case insensitive) + del_printer $old_queue + add_printer $queue "$shared" + else + #rename + add_printer $queue "$shared" + del_printer $old_queue $queue + fi + fi + #if shared option is different + old_shared=$(CreoleRun "lpoptions -h localhost -p $queue|sed 's/ /\n/g'|grep printer-is-shared|cut -d'=' -f2" "fichier") + if [ ! "$shared" = "$old_shared" ]; then + CreoleRun "lpoptions -h localhost -p $queue -o printer-is-shared=$shared" "fichier" + fi + # Set the PDF queue as default if there is no default printer yet. + LPSTATD=$(CreoleRun "LC_ALL=C lpstat -h localhost -d 2>/dev/null | grep 'system default destination:'" "fichier") + if [ -z "$LPSTATD" ] + then + CreoleRun "lpadmin -h localhost -d $queue" "fichier" + fi +else + if [ "${LPSTAT:0:11}" = "device for " ]; then + del_printer "$(echo ${LPSTAT:11}|cut -d':' -f1)" + fi +fi + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/posttemplates/00-cups b/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/posttemplates/00-cups new file mode 100644 index 0000000000000000000000000000000000000000..5acd515cbb65f8d03dc39129ff73e408cb078e05 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/posttemplates/00-cups @@ -0,0 +1,7 @@ +#!/bin/bash + +# Ne pas faire en mode conteneur, voir pour la 2.5 ou supérieur s'il faut le faire dans le conteneur +APPARMOR_CONF=/etc/apparmor.d/usr.sbin.cupsd +[ -f ${APPARMOR_CONF} ] && apparmor_parser -r ${APPARMOR_CONF} + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..5e4e874347e230eb2392c6d79e4e7255d38e1ec1 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/service.yml @@ -0,0 +1,55 @@ +format: '0.1' +name: eole-cups +version: |- + 2.7.0-1 +description: |- + Templates et dictionnaires pour CUPS + Configuration du serveur d'impressions CUPS + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: [] +packages: [] +dictionaries: + - 24_cups.xml +extra_dictionaries: {} +templates: + - bareos-cups.conf + - cups + - cups-browsed.conf + - cups-client.conf + - cups-files.conf + - cups-pdf.conf + - cups.default + - cupsd.conf + - usr.sbin.cupsd +creole_funcs: [] +preservices: [] +postservices: + - 00-cups +pretemplates: [] +posttemplates: + - 00-cups +files: + /usr/share/ead2/backend/config/actions/actions_cups.cfg: + owner: root + group: root + mode: '0644' + /usr/share/ead2/backend/config/perms/perm_cups.ini: + owner: root + group: root + mode: '0644' + /usr/share/eole/diagnose/42-cups: + owner: root + group: root + mode: '0755' + /usr/share/zephir/monitor/configs/printers.agent: + owner: root + group: root + mode: '0644' + /usr/share/zephir/monitor/configs/services/21_cups.srv: + owner: root + group: root + mode: '0644' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/templates/bareos-cups.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/templates/bareos-cups.conf new file mode 100644 index 0000000000000000000000000000000000000000..b952bcaa564561d0ed7b5a99394a196f78adfa9b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/templates/bareos-cups.conf @@ -0,0 +1,25 @@ +Include { + Options { + aclsupport = no + @/etc/bareos/include-options.conf + regex = "(printers\.conf$)|(ppds\.dat$)|(ppd)" + } + Options { + exclude = yes + regex = ".*" + } + File = %%container_path_fichier/etc/cups +} + +Include { + Options { + aclsupport = no + @/etc/bareos/include-options.conf + regex = "(printers)|(ntdrivers\.tdb$)|(ntforms\.tdb$)|(ntprinters\.tdb$)" + } + Options { + exclude = yes + regex = ".*" + } + File = %%container_path_fichier/var/lib/samba +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/templates/cups b/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/templates/cups new file mode 100644 index 0000000000000000000000000000000000000000..ca7f08c1d2518e146ac1223598391be4e367ed99 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/templates/cups @@ -0,0 +1,17 @@ +#%PAM-1.0 +######################################################## +## login pour Eole-2.1 +# +## Equipe Eole eole@ac-dijon.fr +# +## 02/2008 +######################################################## +auth required pam_securetty.so +auth required pam_nologin.so +auth sufficient pam_ldap.so +auth required pam_unix.so try_first_pass +account sufficient pam_ldap.so +account required pam_unix.so +password required pam_ldap.so +session sufficient pam_ldap.so +session required pam_unix.so diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/templates/cups-browsed.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/templates/cups-browsed.conf new file mode 100644 index 0000000000000000000000000000000000000000..2d509906783183743e7c8eb67a3ab43ae78995c3 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/templates/cups-browsed.conf @@ -0,0 +1,74 @@ +# Which protocols will we use to discover printers on the network? +# Can use DNSSD and/or CUPS, or 'none' for neither. +#BrowseRemoteProtocols dnssd cups + +BrowseOrder deny,allow +#BrowseOrder allow,deny +BrowseDeny All +BrowseLocalProtocols CUPS +BrowseAddress @LOCAL +BrowseAllow 127.0.0.1 +BrowseAllow @LOCAL + +# Which protocols will we use to broadcast shared local printers to the network? +# Can use DNSSD and/or CUPS, or 'none' for neither. +# Only CUPS is actually supported, as DNSSD is done by CUPS itself (we ignore +# DNSSD in this directive). +# BrowseLocalProtocols none + +# Settings of this directive apply to both BrowseRemoteProtocols and +# BrowseLocalProtocols. +# Can use DNSSD and/or CUPS, or 'none' for neither. +# BrowseProtocols none + +# Only browse remote printers from selected servers +# BrowseAllow cups.example.com +# BrowseAllow 192.168.1.12 +# BrowseAllow 192.168.1.0/24 +# BrowseAllow 192.168.1.0/255.255.255.0 + +# Use BrowsePoll to poll a particular CUPS server +# BrowsePoll cups.example.com +# BrowsePoll cups.example.com:631 +# BrowsePoll cups.example.com:631/version=1.1 + +# Use DomainSocket to access the local CUPS daemon via another than the +# default domain socket +# DomainSocket /var/run/cups/cups.sock + +# Set CreateIPPPrinterQueues to "Yes" to let cups-browsed discover IPP +# network printers (native printers, not CUPS queues) with known page +# description languages (PWG Raster, PDF, PostScript, PCL XL, PCL +# 5c/e) in the local network and auto-create PPD-less print queues for +# them (using a System V interface script to control the filter +# chain). Clients have to IPP-poll the capabilities of the printer and +# send option settings as standard IPP attributes. We do not poll the +# capabilities by ourselves to not wake up the printer from +# power-saving mode when creating the queues. Jobs have to be sent in +# PDF format. Other formats are not accepted. This functionality is +# primarily for mobile devices running CUPS to not need a printer +# setup tool nor a collection of printer drivers and PPDs. + +# CreateIPPPrinterQueues Yes + +# The AutoShutdown directive specifies whether cups-browsed should +# automatically terminate when it has no local raw queues set up +# pointing to any discovered remote printers (auto shutdown +# mode). Setting it to "On" activates the auto-shutdown mode, setting +# it to "Off" deactiivates it (the default). The special mode "avahi" +# turns auto shutdown off while avahi-daemon is running and on when +# avahi-daemon stops. This allows running cups-browsed on-demand when +# avahi-daemon is run on-demand. + +# AutoShutdown Off +# AutoShutdown On +# AutoShutdown avahi + +# The AutoShutdownTimeout directive specifies after how many seconds +# without local raw queues set up pointing to any discovered remote +# printers cups-browsed should actually shut down in auto shutdown +# mode. Default is 30 seconds, 0 means immediate shutdown. + +# AutoShutdownTimeout 30 + +# Unknown directives are ignored, also unknown values. diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/templates/cups-client.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/templates/cups-client.conf new file mode 100644 index 0000000000000000000000000000000000000000..ffe52903219405305e45b7d7358d9006085f758e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/templates/cups-client.conf @@ -0,0 +1,2 @@ +ServerName localhost:631 +Encryption Always diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/templates/cups-files.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/templates/cups-files.conf new file mode 100644 index 0000000000000000000000000000000000000000..60ca15a49ebe5670a0c809260ddcd40ec19b2c34 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/templates/cups-files.conf @@ -0,0 +1,102 @@ +# +# +# Sample file/directory/user/group configuration file for the CUPS scheduler. +# See "man cups-files.conf" for a complete description of this file. +# + +# List of events that are considered fatal errors for the scheduler... +#FatalErrors config + +# Default user and group for filters/backends/helper programs; this cannot be +# any user or group that resolves to ID 0 for security reasons... +#User lp +#Group lp + +# Administrator user group, used to match @SYSTEM in cupsd.conf policy rules... +SystemGroup lpadmin + +# User that is substituted for unauthenticated (remote) root accesses... +#RemoteRoot remroot + +# Do we allow file: device URIs other than to /dev/null? +#FileDevice No + +# Permissions for configuration and log files... +#ConfigFilePerm 640 +#LogFilePerm 0640 + +# Location of the file logging all access to the scheduler; may be the name +# "syslog". If not an absolute path, the value of ServerRoot is used as the +# root directory. Also see the "AccessLogLevel" directive in cupsd.conf. +AccessLog syslog + +# Location of cache files used by the scheduler... +#CacheDir /var/cache/cups + +# Location of data files used by the scheduler... +#DataDir /usr/share/cups + +# Location of the static web content served by the scheduler... +#DocumentRoot /usr/share/cups/doc-root + +# Location of the file logging all messages produced by the scheduler and any +# helper programs; may be the name "syslog". If not an absolute path, the value +# of ServerRoot is used as the root directory. Also see the "LogLevel" +# directive in cupsd.conf. +ErrorLog syslog + +# Location of fonts used by older print filters... +#FontPath /usr/share/cups/fonts + +# Location of LPD configuration +#LPDConfigFile + +# Location of the file logging all pages printed by the scheduler and any +# helper programs; may be the name "syslog". If not an absolute path, the value +# of ServerRoot is used as the root directory. Also see the "PageLogFormat" +# directive in cupsd.conf. +PageLog syslog + +# Location of the file listing all of the local printers... +#Printcap /var/run/cups/printcap + +# Format of the Printcap file... +#PrintcapFormat bsd +#PrintcapFormat plist +#PrintcapFormat solaris +# +%if %%cups_printcap == 'oui' +Printcap /var/run/cups/printcap +%else +Printcap +%end if + + +# Location of all spool files... +#RequestRoot /var/spool/cups + +# Location of helper programs... +#ServerBin /usr/lib/cups + +# SSL/TLS certificate for the scheduler... +ServerCertificate %%server_cert + +# SSL/TLS private key for the scheduler... +ServerKey %%server_key + +# Location of other configuration files... +#ServerRoot /etc/cups + +# Location of Samba configuration file... +#SMBConfigFile + +# Location of scheduler state files... +#StateDir /var/run/cups + +# Location of scheduler/helper temporary files. This directory is emptied on +# scheduler startup and cannot be one of the standard (public) temporary +# directory locations for security reasons... +#TempDir /var/spool/cups/tmp + +# +# diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/templates/cups-pdf.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/templates/cups-pdf.conf new file mode 100644 index 0000000000000000000000000000000000000000..7177b1dc63699376ef4659a651b4442a7b29794d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/templates/cups-pdf.conf @@ -0,0 +1,286 @@ +# cups-pdf.conf -- CUPS Backend Configuration (version 2.6.1, 2011-10-04) +# 18.09.2005, Volker C. Behr +# Experimentelle Physik V, Universitaet Wuerzburg +# behr@physik.uni-wuerzburg.de +# http://www.cups-pdf.de +# +# +# This code may be freely distributed as long as this header +# is preserved. Changes to the code should be clearly indicated. +# +# This code is distributed under the GPL. +# (http://www.gnu.org/copyleft/gpl.html) +# +# For more detailed licensing information see cups-pdf.c in the +# corresponding version number. + +########################################################################### +# # +# This is the configuration file for CUPS-PDF. Values that are not set in # +# here will use the defaults. Changes take effect immediately without the # +# need for restarting any services. # +# # +# Take care not to add whitespaces at the end of a line! # +# # +########################################################################### + + +########################################################################### +# # +# Path Settings # +# # +########################################################################### + +### Key: Out +## CUPS-PDF output directory +## special qualifiers: +## ${HOME} will be expanded to the user's home directory +## ${USER} will be expanded to the user name +## in case it is an NFS export make sure it is exported without +## root_squash! +### Default: /var/spool/cups-pdf/${USER} + +Out ${HOME}/perso/PDF + +### Key: AnonDirName +## ABSOLUTE path for anonymously created PDF files +## if anonymous access is disabled this setting has no effect +### Default: /var/spool/cups-pdf/ANONYMOUS + +#AnonDirName /var/spool/cups-pdf/ANONYMOUS + +### Key: Spool +## CUPS-PDF spool directory - make sure there is no user 'SPOOL' on your +## system or change the path +### Default: /var/spool/cups-pdf/SPOOL + +#Spool /var/spool/cups-pdf/SPOOL + + +########################################################################### +# # +# Filename Settings # +# # +########################################################################### + +### Key: Truncate +## truncate long filenames to a maximum of <Truncate> characters +## this does not consider the full path to the output but only the filename +## without the .pdf-extension or a job-id prefix (see 'Label') +## the minimal value is 8 +### Default: 64 + +#Truncate 64 + +### Key: Cut +## removing file name extensions before appending .pdf to output +## extensions will only be removed if _both_ the following criteria are met: +## - the extension (w/o the dot) is not longer than <Cut> characters +## - the remaining filename has a minimal length of 1 character +## set Cut to -1 in order to disable cutting +## recommended values: pure UNIX environment : -1 +## mixed environments : 3 +### Default: 3 + +#Cut 3 + +### Key: Label +## label all jobs with a unique job-id in order to avoid overwriting old +## files in case new ones with identical names are created; always true for +## untitled documents +## 0: label untitled documents only +## 1: label all documents with a preceeding "job_#-" +## 2: label all documents with a tailing "-job_#" +### Default: 0 + +#Label 0 + +### Key: TitlePref +## where to look first for a title when creating the output filename +## (title in PS file or title on commandline): +## 0: prefer title from %Title statement in the PS file +## 1: prefer title passed via commandline +### Default: 0 + +#TitlePref 0 + + +########################################################################### +# # +# User Settings # +# # +########################################################################### + +### Key: AnonUser +## uid for anonymous PDF creation (this might be a security issue) +## this setting has no influence on AnonDirName (see there) +## set this to an empty value to disable anonymous +### Default: nobody + +#AnonUser nobody + +### Key: LowerCase +## This options allows to check user names given to CUPS-PDF additionally +## against their lower case variants. This is necessary since in some +## Windows environments only upper case user names are passed. Usually UNIX +## user names are all lower case and it is save to use this option +## but be aware that it can lead to mis-identifications in case +## you have user names that differ only in upper/lower case. +## check only against user name as passed to CUPS : 0 +## check additionally against lower case user name : 1 +### Default: 1 + +#LowerCase 1 + +### Key: UserPrefix +## some installations require a domain prefix added to the user name +## leave empty for no prefix +### Default: <empty> + +#UserPrefix + +### Key: DirPrefix +## if a prefix was defined above this switch toggels whether to include +## the prefix in the output directory's name (if not $HOME) or not +## 0: do not include, 1: include +### Default: 0 + +#DirPrefix 0 + +### Key: RemovePrefix +## some installation pass usernames with a prefix (usually a domain name) +## if you do not want this prefix to be used by the ${USER} variable for +## output directories put the part which is to be cut here +### Default: <empty> + +#RemovePrefix + + +########################################################################### +# # +# Security Settings # +# # +########################################################################### + +### Key: AnonUMask +## umask for anonymous output +## these are the _inverse_ permissions to be granted +### Default: 0000 + +#AnonUMask 0000 + +### Key: UserUMask +## umask for user output of known users +## changing this can introduce security leaks if confidential +## information is processed! +### Default: 0077 + +#UserUMask 0077 + +### Key: Grp +## group cups-pdf is supposed to run as - this will also be the gid for all +## created directories and log files +### Default: lp + +Grp lpadmin + + +########################################################################### +# # +# Log Settings # +# # +########################################################################### + +### Key: Log +## CUPS-PDF log directory +## set this to an empty value to disable all logging +### Default: /var/log/cups + +#Log /var/log/cups + +### Key: LogType +## log-mode +## 1: errors +## 2: status (i.e. activity) +## 4: debug - this will generate a lot of log-output! +## add up values to combine options, i.e. 7 is full logging +## if logging is disabled these setting have no effect +### Default: 3 + +LogType 1 + + +########################################################################### +# # +# PDF Conversion Settings # +# # +########################################################################### + +### Key: GhostScript +## location of GhostScript binary (gs) +## MacOSX: for using pstopdf (recommended) set this to /usr/bin/pstopdf +## or its proper location on your system +### Default: /usr/bin/gs + +#GhostScript /usr/bin/gs + +### Key: GSTmp +## location of temporary files during GhostScript operation +## this must be user-writable like /var/tmp or /tmp ! +### Default: /var/tmp + +#GSTmp /var/tmp + +### Key: GSCall +## command line for calling GhostScript (!!! DO NOT USE NEWLINES !!!) +## MacOSX: for using pstopdf set this to %s %s -o %s %s +### Default: %s -q -dCompatibilityLevel=%s -dNOPAUSE -dBATCH -dSAFER -sDEVICE=pdfwrite -sOutputFile="%s" -dAutoRotatePages=/PageByPage -dAutoFilterColorImages=false -dColorImageFilter=/FlateEncode -dPDFSETTINGS=/prepress -c .setpdfwrite -f %s + +#GSCall %s -q -dCompatibilityLevel=%s -dNOPAUSE -dBATCH -dSAFER -sDEVICE=pdfwrite -sOutputFile="%s" -dAutoRotatePages=/PageByPage -dAutoFilterColorImages=false -dColorImageFilter=/FlateEncode -dPDFSETTINGS=/prepress -c .setpdfwrite -f %s + +### Key: PDFVer +## PDF version to be created - can be "1.5", "1.4", "1.3" or "1.2" +## MacOSX: for using pstopdf set this to an empty value +### Default: 1.4 + +#PDFVer 1.4 + +### Key: PostProcessing +## postprocessing script that will be called after the creation of the PDF +## as arguments the filename of the PDF, the username as determined by +## CUPS-PDF and the one as given to CUPS-PDF will be passed +## the script will be called with user privileges +## set this to an empty value to use no postprocessing +### Default: <empty> + +#PostProcessing + + +########################################################################### +# # +# Experimental Settings # +# These settings activate experimental options. If you decide to use # +# them I would appreciate any feedback - including an 'ok' if they # +# work as expected - so I can eventually put them into the non- # +# experimental sections. # +# # +########################################################################### + +### Key: DecodeHexStrings +## this option will try to decode hex strings in the title to allow +## internationalized titles +## (have a look at contrib/pstitleconv for a suitable filter for data +## from Windows clients) +## 0: disable, 1: enable +### Default: 0 + +DecodeHexStrings 1 + +### Key: FixNewlines +## this option will try to fix various unusal line delimiters (e.g. +## form feeds) +## especially useful when using non-Linux-generated files +## 0: disable, 1: enable +### Default: 0 + +#FixNewlines 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/templates/cups.default b/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/templates/cups.default new file mode 100644 index 0000000000000000000000000000000000000000..ad74b76fec4b03648c2e19921518ba611006c827 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/templates/cups.default @@ -0,0 +1,9 @@ +# Cups configure options + +# LOAD_LP_MODULE: enable/disable to load "lp" parallel printer driver module +%if %%cups_lp == 'oui' +LOAD_LP_MODULE=yes +%else +LOAD_LP_MODULE=no +%end if + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/templates/cupsd.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/templates/cupsd.conf new file mode 100644 index 0000000000000000000000000000000000000000..75aae5756bbe58945770f0e78403f31e687e4795 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/templates/cupsd.conf @@ -0,0 +1,182 @@ +# +# configuration CUPS pour EOLE +# +# Equipe Eole <eole@ac-dijon.fr> +# + +# Log general information in error_log - change "warn" to "debug" +# for troubleshooting... +LogLevel %%cups_loglevel + +# Deactivate CUPS' internal logrotating, as we provide a better one, especially +# LogLevel debug2 gets usable now +MaxLogSize 0 + +# Only listen for connections from the local machine. +#Listen localhost:631 +Listen 0.0.0.0:631 +Listen /var/run/cups/cups.sock + +%set %%aliases = %%set() +%%aliases.add(%%nom_machine) +%%aliases.add(%%nom_machine + '.' + %%nom_domaine_local) +%if %%is_defined('web_url') +%%aliases.add(%%web_url) +%end if +%for %%alias in %%aliases +ServerAlias %%alias +%end for + +# Show shared printers on the local network. +Browsing %%cups_browsing +# Suppress error "Unable to communicate with avahi-daemon: Daemon not ounning" +BrowseLocalProtocols none + + +# Default authentication type, when authentication is required... +DefaultAuthType Basic + +# Web interface setting... +WebInterface Yes + +# DefaultLanguage: the default language if not specified by the browser. +# If not specified, the current locale is used. +DefaultLanguage fr + +# PreserveJobHistory: whether or not to preserve the job history after a +# job is completed, cancelled, or stopped. Default is Yes. +PreserveJobHistory %%cups_preservejobhistory + +# PreserveJobFiles: whether or not to preserve the job files after a +# job is completed, cancelled, or stopped. Default is No. +PreserveJobFiles %%cups_preservejobfiles + +# AutoPurgeJobs: automatically purge jobs when not needed for quotas. +# Default is No. +AutoPurgeJobs %%cups_autopurgejobs + +# MaxCopies: maximum number of copies that a user can request. Default is +# 100. +MaxCopies %%cups_maxcopies + +# MaxJobs: maximum number of jobs to keep in memory (active and completed.) +# Default is 500; the value 0 is used for no limit. +MaxJobs %%cups_maxjobs + +######## +######## Network Options +######## + +# +# NOTE: Unfortunately, most web browsers don't support TLS or HTTP Upgrades +# for encryption. If you want to support web-based encryption you'll +# probably need to listen on port 443 (the "https" port...) +# +#SSLport 631 +#Port 80 +#Port 443 +#Port 631 + +# MaxClients: controls the maximum number of simultaneous clients that +# will be handled. Defaults to 100. +MaxClients %%cups_maxclients + + +DefaultEncryption Required + +# Restrict access to the server... +<Location /> + Order deny,allow +</Location> + +# Restrict access to the admin pages... +<Location /admin> + Order allow,deny + Satisfy any + Allow From 127.0.0.1 + AuthType Default + Require valid-user + Require group adm + Require group PrintOperators +</Location> + +# Restrict access to configuration files... +<Location /admin/conf> + #I can't disallow it + AuthType Default + Require user root +</Location> + +# Set the default printer/job policies... +<Policy default> + # Job/subscription privacy... + JobPrivateAccess default + #17403 + JobPrivateValues none + SubscriptionPrivateAccess default + SubscriptionPrivateValues default + + # Job-related operations must be done by the owner or an administrator... + <Limit Create-Job Print-Job Print-URI Validate-Job> + Order deny,allow + </Limit> + + <Limit Send-Document Send-URI Hold-Job Release-Job Restart-Job Purge-Jobs Set-Job-Attributes Create-Job-Subscription Renew-Subscription Cancel-Subscription Get-Notifications Reprocess-Job Cancel-Current-Job Suspend-Current-Job Resume-Job Cancel-My-Jobs Close-Job CUPS-Move-Job CUPS-Get-Document> + Order deny,allow + </Limit> + + <Limit CUPS-Get-Devices> + #Force authentification in web interface when adding printer + AuthType Default + Require group adm + Require group PrintOperators + </Limit> + + # All administration operations require an administrator to authenticate... + <Limit CUPS-Add-Modify-Printer CUPS-Delete-Printer CUPS-Add-Modify-Class CUPS-Delete-Class CUPS-Set-Default> + #I just wan that 127.0.0.1 access without password, not administrative IP + Satisfy any + Allow From 127.0.0.1 +%if %%activer_firewall == 'oui' + %for num_int in %%range(0, %%int(%%nombre_interfaces)) + %for %%ip_admin in %%getVar('ip_admin_eth' + %%str(num_int), []) + Deny From %%ip_admin/%%getattr(%%ip_admin, 'netmask_admin_eth' + %%str(num_int)) + %end for + %end for +%end if + AuthType Default + Require group adm + Require group PrintOperators + </Limit> + + # All printer operations require a printer operator to authenticate... + <Limit Pause-Printer Resume-Printer Enable-Printer Disable-Printer Pause-Printer-After-Current-Job Hold-New-Jobs Release-Held-New-Jobs Deactivate-Printer Activate-Printer Restart-Printer Shutdown-Printer Startup-Printer Promote-Job Schedule-Job-After Cancel-Jobs CUPS-Accept-Jobs CUPS-Reject-Jobs> + #I just wan that 127.0.0.1 access without password, not administrative IP + Satisfy any + Allow From 127.0.0.1 +%if %%activer_firewall == 'oui' + %for num_int in %%range(0, %%int(%%nombre_interfaces)) + %for %%ip_admin in %%getVar('ip_admin_eth' + %%str(num_int), []) + Deny From %%ip_admin/%%getattr(%%ip_admin, 'netmask_admin_eth' + %%str(num_int)) + %end for + %end for +%end if + AuthType Default + Require group adm + Require group PrintOperators + </Limit> + + # Only the owner or an administrator can cancel or authenticate a job... + <Limit Cancel-Job CUPS-Authenticate-Job> + AuthType Default + Require group adm + Require group PrintOperators + Require user @OWNER + # les professeurs peuvent supprimer les jobs + Require group professeurs + </Limit> + + <Limit All> + Order deny,allow + </Limit> +</Policy> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/templates/usr.sbin.cupsd b/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/templates/usr.sbin.cupsd new file mode 100644 index 0000000000000000000000000000000000000000..fb2a3b64c1b1ce92b3b41273c155454c970ba93d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-cups/templates/usr.sbin.cupsd @@ -0,0 +1,4 @@ +# Site-specific additions and overrides for usr.sbin.cupsd. +# For more details, please see /etc/apparmor.d/local/README. +/run/utmp rk, +/etc/ldap/ldap.conf r, diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-db/dictionaries/00_eole-db_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-db/dictionaries/00_eole-db_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..44eaf598f87b5ad585ee381f5bb031259af793c4 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-db/dictionaries/00_eole-db_packages.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>python</package> + <package>python-eoledb</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-db/dictionaries/19_eoledb.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-db/dictionaries/19_eoledb.xml new file mode 100644 index 0000000000000000000000000000000000000000..fb8052ac16d2752a58d78315b920bd3b2c1d278a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-db/dictionaries/19_eoledb.xml @@ -0,0 +1,48 @@ +<?xml version="1.0" encoding="utf-8"?> +<creole> + <files> + <!-- Je suis un commentaire --> + <file filelist='eoledb' name='/etc/eole/eole-db.conf' mkdir='True' rm='True'/> + </files> + <variables> + <family name='services'> + <variable name='activer_eoledb' type='oui/non' description='Activer le service de gestion de bases de données EoleDB' mode='expert'> + <value>oui</value> + </variable> + </family> + <family name='EoleDB' icon='database' mode='expert'> + <variable name='edb_local' type='oui/non' description='Le serveur par défaut est local'> + <value>oui</value> + </variable> + <variable name='edb_host' type='string' description='Adresse du serveur de base de données'/> + <variable name='edb_port' type='number' description='Port du serveur de base de données'/> + <variable name='edb_root' type='string' description="Compte d'administration du serveur de base de données"/> + <variable name='edb_rootpw' type='string' description="Fichier contenant le mot de passe associé au compte d'administration"/> + <variable name='edb_allow_hosts' type='string' description='Machines qui peuvent utiliser le serveur de BDD' multi='True'/> + </family> + </variables> + <constraints> + <condition name='disabled_if_in' source='activer_eoledb'> + <param>non</param> + <target type='filelist'>eoledb</target> + <target type='family'>EoleDB</target> + </condition> + <condition name='disabled_if_in' source='edb_local'> + <param>oui</param> + <target type='variable'>edb_host</target> + <target type='variable'>edb_port</target> + <target type='variable'>edb_root</target> + <target type='variable'>edb_rootpw</target> + <target type='variable'>edb_allow_hosts</target> + </condition> + </constraints> + <help> + <family name='EoleDb'>Outil de gestion automatique des bases de données, simple et pratique</family> + <variable name='activer_eoledb'>Utiliser ou non le service de gestion des bases de données EoleDB</variable> + <variable name='edb_host'>Adresse du serveur de base de données par défaut de EoleDB, cette valeur sera utilisée pour toutes les applications qui ne définiront pas elles-mêmes un serveur de base de données</variable> + <variable name='edb_port'>Port d'écoute du serveur de base de données par défaut de EoleDB</variable> + <variable name='edb_root'>Identifiant du compte à utiliser pour administrer la base de données par défaut de EoleDB</variable> + <variable name='edb_rootpw'>Chemin du fichier contenant le mot de passe de l'administrateur de la base de données par défaut de EoleDB</variable> + <variable name='edb_allow_hosts'>Adresses IP avec lesquelles les utilisateurs de la base de données sont susceptibles de se connecter</variable> + </help> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-db/files/usr/bin/eole_db_gen b/seed/release/eole-2.7/2.7.1/applicationservice/eole-db/files/usr/bin/eole_db_gen new file mode 100644 index 0000000000000000000000000000000000000000..d78cfe48254997dce5ea6daa5c17e5f06957fed2 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-db/files/usr/bin/eole_db_gen @@ -0,0 +1,415 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- +########################################################################### +# Eole NG - 2012 +# Copyright Pole de Competence Eole (Ministere Education - Academie Dijon) +# Licence CeCill cf /root/LicenceEole.txt +# eole@ac-dijon.fr +########################################################################### +""" EoleDB the new database manager for EOLE +""" +import argparse +from os import listdir +from os.path import isfile, join +from IPy import IP +from termcolor import colored +import yaml +import re +from itertools import product + +from eoledb.eoledbconnector import EoleDbConnector +from eoledb.eoledberrors import UnsupportedDatabase + +CONF_FILE_RE = re.compile(r'^.*\.yml$') +HBA_PATTERN = "{protocol}\t{dbname}\t{dbuser}\t{source}\t{auth_method}" +HBA_RE = r"^(?P<protocol>{protocol})\s+(?P<dbname>{dbname})\s+(?P<dbuser>{dbuser})(?:\s+(?P<source>(?P<ip>{ip})(?:(?:/(?P<ip_class>{ip_class}))|(?:\s+(?P<ip_netmask>{ip_netmask})))?))?\s+(?P<auth_method>{auth_method})(?:\s+(?P<auth_option>{auth_option}))?$" +hba_options = {'protocol': r"(?:host|local)", + 'dbname': r"[\S]+", + 'dbuser': r"[\S]+", + 'ip': r"[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}", + 'ip_class': r"[0-9]{1,2}", + 'ip_netmask': r"[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}", + 'auth_method': r"(?:peer|ident|md5|password)", + 'auth_option': r".*" + } +HBA_RE = re.compile(HBA_RE.format(**hba_options)) +PG_HBA_END_PATH = 'etc/postgresql/10/main/pg_hba.conf' +ALL_DB_RE = re.compile(r'^\*') + +def parse_pg_hba_file(pg_hba): + """Renvoie la liste des accès configurés dans le fichier pg_hba.conf + :param pg_hba: chemin du fichier pg_hba.conf + :type pg_hba: str + """ + with open(pg_hba, 'r') as pg_hba_file: + relevant_rules = [rule.strip() for rule in pg_hba_file.readlines()] + try: + relevant_rules = relevant_rules[relevant_rules.index('# distant_users'):relevant_rules.index('# end distant_users')] + except ValueError: + relevant_rules = [] + pg_hba_rules = [HBA_RE.match(hba_rule).groupdict() + for hba_rule in relevant_rules + if HBA_RE.match(hba_rule)] + return pg_hba_rules + + +def weight_pg_hba_rule(rule): + """ + Return weight of rule based on user and db targeted ("all" must be at the + end of the list + :param rule: dictionary describing rule + :type rule: dict + """ + weight = 0 + # dbname + dbname = rule['dbname'] + if dbname == 'all': + weight += 3 + elif dbname == 'samerole': + weight += 2 + elif dbname == 'sameuser': + weight += 1 + # dbuser + dbuser = rule['dbuser'] + if dbuser == 'all': + weight += 2 + elif dbuser.startswith('+'): + weight += 1 + return weight + + +def normalise_rule(rule): + """Normalise les règles d'accès + :param conf: paramètres d'une règle d'accès + :type conf: dict + """ + if rule['source'] in ['localhost', '127.0.0.1', None]: + rule.setdefault('protocol', 'local') + rule['source'] = '' + elif rule['source'] != '': + rule.setdefault('protocol', 'host') + if rule['ip_netmask'] is None: + netmask = IP('/'.join([rule['ip'], rule.get('ip_class', '32')])).strNetmask() + else: + netmask = rule['ip_netmask'] + rule['source'] = '\t'.join([rule['ip'], netmask]) + rule.setdefault('auth_method', 'md5') + rule.setdefault('auth_option', '') + return rule + + +def clean_rules(rules): + """ + Return rules list after deduplication and sort + :param rules: list of dict containing host based access rules parameters + :type rules: tuple of dict + """ + rules = [normalise_rule(rule) for rule in rules] + dedup_rules = {(conf['protocol'], conf['dbname'], conf['dbuser']): conf + for conf in rules}.values() + dedup_rules.sort(key=lambda x: weight_pg_hba_rule(x)) + return dedup_rules + + +def sort_confs(confs): + """ + Return keys from confs ordered by name, taking care of dependencies + (postgresql templating) + :param confs: databases configuration + :type confs: dict + """ + sorted_templates = sorted([conf for conf in confs + if confs[conf].get('is_template', False) == True]) + sorted_databases = sorted([conf for conf in confs + if confs[conf].get('is_template', False) == False]) + sorted_confs = sorted_templates + sorted_databases + return sorted_confs + + +class DBConf(object): + """Configuration object offering one context to aggregate informations + and generate shared configuration. + """ + backends = ('mysql', 'postgres', 'sqlite') + + def __init__(self, conf_path): + self.default_conf = {} + self.default_conf = self.load_conf(conf_path) + self.pg_hba_path = join(self.default_conf.get('container_path_postgresql', '/'), + PG_HBA_END_PATH) + self.db_confs = {} + + def __enter__(self): + """Retourne l'object configuration + """ + return self + + def load_conf(self, cpath): + """ Load configuration from yaml file + """ + try: + with open(cpath, 'r') as yml_conf: + conf = yaml.load(yml_conf) + except Exception: + conf = None + + if conf is None: + conf = {} + elif isinstance(conf, dict) is False: + msg = "[ERROR] Configuration file format error !" + msg += "\n{0} is not a valid YAML file".format(cpath) + raise Exception(msg) + elif 'dbname' in conf: + self.add_db_conf(conf) + elif 'additional_db' in conf or 'additional_roles' in conf: + self.add_db_conf({'dbname': 'postgres', + 'dbtype': 'postgres', + 'dbuser': 'postgres'}) + for db_conf in conf.get('additional_db', {}).values(): + self.add_db_conf(db_conf) + for role_conf in conf.get('additional_roles', {}).values(): + self.add_role_conf(role_conf) + # add pwd_mode for user in database section if owns this database + for db in self.db_confs: + if self.db_confs[db]['dbuser'] == role_conf['role']: + self.db_confs[db]['dbuser_pwd_mode'] = role_conf['pwd_mode'] + else: + return conf + + def expand_db_names(self, conf): + """ + Return db names list expanding db from privileges dict keys in conf. + :param conf: dictionnary with 'privileges' key + :type conf: dict + """ + privileges = {} + db_privileges = {} + for privilege in conf['privileges']: + segments = ALL_DB_RE.sub('|'.join([pg_conf[0] + for pg_conf + in self.get_confs_by_backend('postgres')]), + privilege['objet']).split('.') + for priv in list(product(*[segment.split('|') for segment in segments])): + #if len(priv) == 3 and priv[2] == '*': + # priv = priv[:2] + privileges.setdefault(priv[0], set(['CONNECT'])) + priv = '.'.join(priv) + privileges.setdefault(priv, set([])) + privileges[priv].update(set(privilege['privilege'].split())) + for privilege in privileges: + db = privilege.split('.')[0] + db_privileges.setdefault(db, {}) + db_privileges[db][privilege] = privileges[privilege] + return db_privileges + + def add_db_conf(self, conf): + """Ajouter la configuration au pool de configurations de l'instance + :param conf: configuration de base de données + :type conf: dict + """ + mandatory_vars = {'dbtype': None, + 'updatescripts': [], + 'sqlscripts': [], + 'pwd_files': [], + 'in_cont': False, + 'client_hosts': []} + mandatory_vars.update(self.default_conf) + + for var, default in mandatory_vars.items(): + conf.setdefault(var, default) + self.db_confs.setdefault(conf['dbname'], {}) + if 'additional_roles' in self.db_confs[conf['dbname']]: + conf['additional_roles'].update(self.db_confs[conf['dbname']]) + self.db_confs[conf['dbname']].update(conf) + + def add_role_conf(self, conf): + """Ajouter la configuration des rôles au pool de configurations + de l'instance. + :param conf: configuration de role + :type conf: dict + """ + if 'privileges' in conf: + db_privileges = self.expand_db_names(conf) + del conf['privileges'] + for db in db_privileges: + self.db_confs.setdefault(db, {}) + self.db_confs[db].setdefault('additional_roles', {}) + conf.update(self.db_confs[db]['additional_roles']) + additional_roles = self.db_confs[db]['additional_roles'] + additional_roles[conf['role']] = conf.copy() + additional_roles[conf['role']].setdefault('privileges', {}) + additional_roles[conf['role']]['privileges'].update(db_privileges[db]) + else: + self.db_confs.setdefault('postgres', {}) + if 'additional_roles' in self.db_confs['postgres']: + conf.update(self.db_confs['postgres']['additional_roles']) + else: + self.db_confs['postgres']['additional_roles'] = {} + self.db_confs['postgres']['additional_roles'][conf['role']] = conf + + def get_db_confs(self): + """Méthode pour accéder aux dictionnaires des configurations des bases + de données + """ + sorted_confs = sort_confs(self.db_confs) + return ((conf, self.db_confs[conf]) for conf in sorted_confs) + + def get_confs_by_backend(self, backend): + """Méthode pour accéder aux dictionnaires des configurations des bases + de données utilisant la backend fourni en paramètre. + """ + if backend in self.backends: + confs = [conf for conf in self.get_db_confs() + if conf[1]['dbtype'] == backend] + else: + confs = [] + return confs + + def gen_pg_access_conf(self): + """Génère le contenu du fichier pg_hba + """ + + if isfile(self.pg_hba_path): + custom_accesses = parse_pg_hba_file(self.pg_hba_path) + else: + custom_accesses = [] + + pg_confs = self.get_confs_by_backend('postgres') + if self.default_conf['in_cont'] is True: + source = '192.0.2.1' + adm_method = "ident" + else: + source = '127.0.0.1' + adm_method = 'peer' + access_confs = [{item[0]: item[1] for dic in conf for item in dic.iteritems()} + for pg_conf in pg_confs + for conf in list(product([{'dbname': pg_conf[1]['dbname']}, ], + [{'dbuser': pg_conf[1]['dbuser']}, ], + [{'source': src} + for src in pg_conf[1]['client_hosts'] + [source]] + ) + ) + ] + access_confs.extend(custom_accesses) + access_confs = clean_rules(access_confs) + access_str = HBA_PATTERN.format(protocol='local', dbname='all', + dbuser='postgres', source='', + #auth_method='{}\tmap=pg_map\n'.format(adm_method)) + auth_method='md5\n') + access_str += '\n'.join([HBA_PATTERN.format(**access_rule) + for access_rule in access_confs]) + return access_str + + def write_pg_conf(self): + """Écrit les fichiers de configuration de postgresql + """ + access_conf = self.gen_pg_access_conf() + with open(self.pg_hba_path, 'w') as pg_hba: + pg_hba.write(access_conf) + + def __exit__(self, type, value, traceback): + """Finaliser l'application de la configuration + """ + if len(self.get_confs_by_backend('postgres')) > 0: + self.write_pg_conf() + + +def usage(): + """ Print command help message + """ + print "Usage:" + print "\t -c file # Configuration File" + + +def run_change_password(conn, local_conf, bdir): + """ Run all the changing password opérations + """ + print "\t>>> Passwords", + if conn.change_passwords(local_conf, bdir): + print "\t[{0}]".format(colored('OK', 'green')) + else: + print "\t[{0}]".format(colored('NA', 'blue')) + + +def create_db(connection, context=None): + """Exécute et affiche le résultat des opérations de création + :param connection: connexion à la base de données + :type connection: EoleDbConnector + :param context: contexte d'exécution de la fonction + :type context: str + """ + creation_res = connection.instance_db() + if context is 'reconfigure': + print "\t>>> Create ", + if creation_res: + print "\t[{0}]".format(colored('OK', 'green')) + else: + print "\t[{0}]".format(colored('NA', 'blue')) + return creation_res + + +def update_db(connection, context=None): + """Exécute et affiche le résultat des opérations de mise à jour + :param connection: connexion à la base de données + :type connection: EoleDbConnector + :param context: contexte d'exécution de la fonction + :type context: str + """ + update_res = connection.update_db() + if context is 'reconfigure': + print "\t>>> Update ", + if update_res: + print "\t[{0}]".format(colored('OK', 'green')) + else: + print "\t[{0}]".format(colored('NA', 'blue')) + return update_res + + +def main(): + """ EoleDB main program + """ + parser = argparse.ArgumentParser(description='Eole Database generator.') + parser.add_argument('-c', '--config', metavar='CONFIG_FILE', + default='/etc/eole/eole-db.conf', + help='eole database configuration file)') + parser.add_argument('-d', '--dbdir', metavar='DB_CONFIG_DIR', + default='/etc/eole/eole-db.d/', + help='eole database configuration directory)') + parser.add_argument('-i', '--interactive', action='store_true', + default=False, help='eole database manager interactive mode') + parser.add_argument('-b', '--backup-dir', metavar="PW_BACKUP_DIR", + default='/var/backups/eoledb', + help='eole database directory to store backups of changed files') + args = parser.parse_args() + + if args.interactive: + print "Not implemented yet" + + if args.config: + with DBConf(args.config) as global_db_conf: + for cfile in listdir(args.dbdir): + if CONF_FILE_RE.match(cfile): + global_db_conf.load_conf(join(args.dbdir, cfile)) + for conf_file, conf in global_db_conf.get_db_confs(): + try: + conn = EoleDbConnector(conf)() + if conn: + print("{0} : ".format(conn.dbname.upper())) + if args.backup_dir: + run_change_password(conn, + None, + args.backup_dir) + else: + run_change_password(conn, None, None) + create_db(conn, context='reconfigure') + update_db(conn, context='reconfigure') + except UnsupportedDatabase as err: + print err + except AttributeError as err: + print err + else: + parser.error("options -c is mandatory") + + +if __name__ == "__main__": + main() diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-db/posttemplates/01-eoledb b/seed/release/eole-2.7/2.7.1/applicationservice/eole-db/posttemplates/01-eoledb new file mode 100644 index 0000000000000000000000000000000000000000..1a64446dd24fe8bed1e8a04aace99857e30d5743 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-db/posttemplates/01-eoledb @@ -0,0 +1,26 @@ +#!/bin/bash + +B_DIR=/var/backup/eole-db +DB_BACKENDS='' + +[[ ! -d "${B_DIR}" ]] && mkdir -p ${B_DIR} + +if [[ $(CreoleGet activer_mysql non) == "oui" ]] +then + DB_BACKENDS="$DB_BACKENDS mysql" +fi +if [[ $(CreoleGet activer_postgresql non) == "oui" ]] +then + DB_BACKENDS="$DB_BACKENDS postgresql" +fi + +for db_backend in $DB_BACKENDS +do + CreoleService $db_backend start +done +eole_db_gen -b ${B_DIR} +for db_backend in $DB_BACKENDS +do + CreoleService $db_backend stop +done +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-db/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-db/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..1a34441880d644099c377f04d741d4fcbf9ce272 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-db/service.yml @@ -0,0 +1,30 @@ +format: '0.1' +name: eole-db +version: |- + 2.7.0-3 +description: |- + Database management tool and library + It's a pretty small, local (that is, straight on the operating + system) databases manager. Supports SQLITE, MySQL and PostgresSQL +depends: [] +packages: + - python + - python-eoledb +dictionaries: + - 19_eoledb.xml +extra_dictionaries: {} +templates: + - eole-db.conf +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: + - 01-eoledb +files: + /usr/bin/eole_db_gen: + owner: root + group: root + mode: '0755' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-db/templates/eole-db.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-db/templates/eole-db.conf new file mode 100644 index 0000000000000000000000000000000000000000..fbf601fa84c32167fa6bd145d29e626ecb52ac39 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-db/templates/eole-db.conf @@ -0,0 +1,23 @@ +--- +%if %%getVar('edb_local','non') == 'oui' + %if %%getVar('mode_conteneur_actif', 'non') == 'oui' +in_cont: True +client_hosts: [ '%%adresse_ip_web', '%%adresse_ip_br0' ] + %if %%getVar('activer_postgresql', 'non') == 'oui' +container_path_postgresql: %%container_path_postgresql + %end if + %if %%getVar('activer_postgresql', 'non') == 'oui' +container_path_mysql: %%container_path_mysql + %end if + %else +in_cont: False +dbcliconf: /etc/mysql/debian.cnf + %end if +%elif %%getVar('edb_root','non') != 'non' +dbhost: %%edb_host +dbport: %%edb_port +dbroot: %%edb_root +client_hosts: ['%%adresse_ip_eth0'] +dbrootpwd: %%edb_rootpw +%end if +adresse_ip_eth0: %%adresse_ip_eth0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-dhcp/dictionaries/20_dhcp.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dhcp/dictionaries/20_dhcp.xml new file mode 100644 index 0000000000000000000000000000000000000000..fbca314d8ef4650c657f1b8cb326a55b1454acae --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dhcp/dictionaries/20_dhcp.xml @@ -0,0 +1,322 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + <files> + <file filelist='dhcp' name='/usr/share/ead2/backend/config/perms/perm_dhcp.ini' rm="True"/> + <file filelist='dhcp' name='/var/lib/eole/config/eoledhcp.cfg' rm="True"/> + </files> + <containers> + <container name='dhcp' id='17'> + <package>eole-dhcp-pkg</package> + <service servicelist='dhcp'>isc-dhcp-server</service> + <service servicelist='dhcpipv6'>isc-dhcp-server6</service> + <service_access service='failover_dhcp'> + <port service_accesslist='failover_dhcp' port_type='SymLinkOption'>dhcp_failover_port</port> + </service_access> + <service_restriction service='failover_dhcp'> + <ip service_restrictionlist='failover_dhcp' ip_type='SymLinkOption' interface='auto' netmask='255.255.255.255'>dhcp_failover_peer_address</ip> + </service_restriction> + <service_access service='tftp'> + <port protocol='udp'>69</port> + <tcpwrapper>in.tftpd</tcpwrapper> + </service_access> + <service_access service='omap'> + <port service_accesslist='omapi' port_type='SymLinkOption'>omapi_port</port> + </service_access> + <file filelist='dhcp' name='/etc/dhcp/dhcpd.conf'/> + <file filelist='tftp' name='/etc/default/tftpd-hpa' source='tftpd-hpa.default'/> + </container> + </containers> + <variables> + <family name='services'> + <variable name='activer_dhcp' type='oui/non' description="Activer le serveur DHCP" mode='basic'> + <value>non</value> + </variable> + <variable name='activer_tftp' type='oui/non' description="Activer l'utilisation d'un serveur PXE/TFTP" mode='expert'> + <value>non</value> + </variable> + </family> + <family name='dhcp' icon='bolt'> + <variable name='global_nom_domaine_dhcp' type='domain_strict' description='Nom de domaine à renvoyer aux clients DHCP' mode='expert'/> + <variable name='global_adresse_ip_gw_dhcp' type='ip' description='Adresse IP du routeur à renvoyer aux clients DHCP' mode='expert'/> + <variable name='global_adresse_ip_dns_dhcp' type='ip' description='Adresse IP du DNS à renvoyer aux clients DHCP' mode='expert'/> + <variable name='global_adresse_ip_dns_secondaire_dhcp' type='ip' description='Adresse IP du DNS secondaire à renvoyer aux clients DHCP' mode='expert'/> + <variable name='global_adresse_ip_wins_primaire_dhcp' type='ip' description='Adresse IP du serveur primaire Wins à renvoyer aux clients' mode='expert'/> + <variable name='global_adresse_ip_wins_secondaire_dhcp' type='ip' description='Adresse IP du serveurs secondaire Wins à renvoyer aux clients' mode='expert'/> + <variable name='global_adresse_ip_ntp_dhcp' type='ip' description='Adresse IP du serveur NTP à renvoyer aux clients' mode='expert'/> + <variable name='global_dhcp_lease_default' type='number' description='Temps du bail par défaut (sec)' mandatory='True' mode='expert'> + <value>36000</value> + </variable> + <variable name='global_dhcp_lease_max' type='number' description='Temps maximum du bail (sec)' mandatory='True' mode='expert'> + <value>144000</value> + </variable> + <variable name='global_domain_wpad_dhcp' type='domain_strict' description='Nom de domaine du serveur WPAD' mode='expert'/> + + <variable name='activer_dhcp_failover' type='oui/non' description='Activer la continuité de service'> + <value>non</value> + </variable> + <variable name='dhcp_failover_name' type='string' description='Nom de la grappe' mandatory='True'/> + <variable name='dhcp_failover_rank' type='string' description='Rang du serveur dans la grappe' mandatory='True'/> + <variable name='dhcp_failover_local_address' type='ip' description='Adresse IP du serveur DHCP local, en écoute du serveur pair' mandatory='True'/> + <variable name='dhcp_failover_port' type='number' description='Port de communication du serveur DHCP local, en écoute du serveur pair' mandatory='True'/> + <variable name='dhcp_failover_peer_address' type='ip' description='Adresse IP du serveur pair' mandatory='True'/> + <variable name='dhcp_failover_peer_port' type='number' description='Port de communication du serveur pair' mandatory='True'/> + <variable name='dhcp_failover_response_delay' type='number' description='Délai maximal de réponse' mode='expert'> + <value>60</value> + </variable> + <variable name='dhcp_failover_unacked_updates' type='number' description='Nombre de messages BNDUPD' mode='expert'> + <value>10</value> + </variable> + <variable name='dhcp_failover_balance_seconds' type='number' description='Délai avant passage de témoin' mode='expert'> + <value>5</value> + </variable> + <variable name='dhcp_failover_mclt' type='number' description='Temps maximum de délégation' mode='expert'> + <value>3600</value> + </variable> + <variable name='dhcp_failover_split' type='number' description='Seuil de prise en charge par le serveur primaire' mode='expert'> + <value>128</value> + </variable> + + <variable name='activer_omapi' type='oui/non' description='Activer OMAPI' mode='expert'> + <value>non</value> + </variable> + <variable name='omapi_port' type='number' description='Port d’écoute pour OMAPI' mode='expert'> + <value>7911</value> + </variable> + <variable name='omapi_secret' type='password' description='Secret partagé pour OMAPI' auto_save='True'/> + + <variable name='adresse_network_dhcp' type='network' description='Adresse réseau de la plage DHCP' multi='True' mandatory="True"/> + <variable name='adresse_netmask_dhcp' type='netmask' description='Masque de sous-réseau de la plage DHCP' mandatory="True"/> + <variable name='nom_plage_dhcp' type='hostname_strict' description='Nom de la plage DHCP' mandatory="True"/> + <variable name='ip_basse_dhcp' type='ip' description='IP basse de la plage DHCP' mandatory="True"/> + <variable name='ip_haute_dhcp' type='ip' description='IP haute de la plage DHCP' mandatory="True"/> + <variable name='adressage_statique' type='oui/non' description='Distribuer des IP statiques pour cette plage (compatible EAD3 seulement)'> + <value>non</value> + </variable> + <variable name='nom_domaine_dhcp' type='domain_strict' description='Nom de domaine à renvoyer aux clients DHCP' mode='basic'/> + <variable name='adresse_ip_gw_dhcp' type='ip' description='Adresse IP du routeur à renvoyer aux clients DHCP' mode='basic'/> + <variable name='adresse_ip_dns_dhcp' type='ip' description='Adresse IP du DNS à renvoyer aux clients DHCP' mode='basic'/> + <variable name='adresse_ip_dns_secondaire_dhcp' type='ip' description='Adresse IP du DNS secondaire à renvoyer aux clients DHCP' mode='expert'/> + <variable name='adresse_ip_wins_primaire_dhcp' type='ip' description='Adresse IP du serveur primaire Wins à renvoyer aux clients' mode='expert'/> + <variable name='adresse_ip_wins_secondaire_dhcp' type='ip' description='Adresse IP du serveur secondaire Wins à renvoyer aux clients' mode='expert'/> + <variable name='adresse_ip_ntp_dhcp' type='ip' description='Adresse IP du serveur NTP à renvoyer aux clients' mode='expert'/> + <variable name='fichier_pxe_dhcp' type='string' description='Fichier pour le boot PXE' mode='expert'/> + <variable name='domain_wpad_dhcp' type='domain_strict' description='Domaine servant la fonctionnalité WPAD' mode='expert'/> + <variable name='dhcp_pool_use_failover' type='oui/non' description='Utiliser la configuration de continuité de service pour ce pool' mode='expert' hidden='True'/> + <variable name='interdire_hotes_inconnus' type='oui/non' description="Interdire cette zone aux hôtes inconnus" mode='expert'> + <value>non</value> + </variable> + <variable name='dhcp_lease_default' type='number' description='Temps du bail par défaut (sec)' mode='expert'/> + <variable name='dhcp_lease_max' type='number' description='Temps maximum du bail (sec)' mode='expert'/> + </family> + <family name='tftp' icon='cloud'> + <variable name='adresse_ip_tftp' type='ip' description="Adresse IP du serveur PXE/TFTP" /> + <variable name='repertoire_tftp' type='filename' description="Répertoire sur le serveur PXE/TFTP" > + <value>/var/lib/tftpboot/</value> + </variable> + <variable name='chemin_fichier_pxe' type='filename' description="Chemin vers le fichier de boot PXE initial" > + <value>/pxelinux.0</value> + </variable> + </family> + <separators> + <separator name="global_nom_domaine_dhcp">Paramètres globaux (peuvent être surchargés pour un réseau spécifique)</separator> + <separator name='activer_dhcp_failover'>Configurer la continuité de service</separator> + <separator name='activer_omapi'>Support de l'API OMAPI</separator> + <separator name="adresse_network_dhcp">Définition des sous-réseaux</separator> + </separators> + </variables> + <constraints> + <group master='adresse_network_dhcp'> + <slave>adresse_netmask_dhcp</slave> + <slave>nom_plage_dhcp</slave> + <slave>ip_basse_dhcp</slave> + <slave>ip_haute_dhcp</slave> + <slave>adressage_statique</slave> + <slave>nom_domaine_dhcp</slave> + <slave>adresse_ip_gw_dhcp</slave> + <slave>adresse_ip_dns_dhcp</slave> + <slave>adresse_ip_dns_secondaire_dhcp</slave> + <slave>adresse_ip_wins_primaire_dhcp</slave> + <slave>adresse_ip_wins_secondaire_dhcp</slave> + <slave>adresse_ip_ntp_dhcp</slave> + <slave>fichier_pxe_dhcp</slave> + <slave>domain_wpad_dhcp</slave> + <slave>dhcp_pool_use_failover</slave> + <slave>interdire_hotes_inconnus</slave> + <slave>dhcp_lease_default</slave> + <slave>dhcp_lease_max</slave> + </group> + <check name='valid_in_network' target='ip_basse_dhcp'> + <param type='eole'>adresse_network_dhcp</param> + <param type='eole'>adresse_netmask_dhcp</param> + </check> + <check name='valid_in_network' target='ip_haute_dhcp'> + <param type='eole'>adresse_network_dhcp</param> + <param type='eole'>adresse_netmask_dhcp</param> + </check> + <check name='check_name_uniq' target='nom_plage_dhcp'> + </check> + <fill name='calc_multi_condition' target='dhcp_failover_port'> + <param>primary</param> + <param type='eole' name='condition_1'>dhcp_failover_rank</param> + <param name='match' type='number'>647</param> + <param name='mismatch' type='number'>847</param> + </fill> + <fill name='calc_multi_condition' target='dhcp_failover_peer_port'> + <param>secondary</param> + <param type='eole' name='condition_1'>dhcp_failover_rank</param> + <param name='match' type='number'>647</param> + <param name='mismatch' type='number'>847</param> + </fill> + <fill name='calc_val' target='global_nom_domaine_dhcp'> + <param type='eole' name='valeur'>nom_domaine_local</param> + </fill> + <fill name='calc_val' target='nom_domaine_dhcp'> + <param type='eole' name='valeur'>global_nom_domaine_dhcp</param> + </fill> + <fill name='calc_val' target='adresse_ip_gw_dhcp'> + <param type='eole'>global_adresse_ip_gw_dhcp</param> + </fill> + <fill name='calc_val' target='adresse_ip_dns_dhcp'> + <param type='eole'>global_adresse_ip_dns_dhcp</param> + </fill> + <fill name='calc_val' target='adresse_ip_dns_secondaire_dhcp'> + <param type='eole'>global_adresse_ip_dns_secondaire_dhcp</param> + </fill> + <fill name='calc_val' target='adresse_ip_wins_primaire_dhcp'> + <param type='eole'>global_adresse_ip_wins_primaire_dhcp</param> + </fill> + <fill name='calc_val' target='adresse_ip_wins_secondaire_dhcp'> + <param type='eole'>global_adresse_ip_wins_secondaire_dhcp</param> + </fill> + <fill name='calc_val' target='adresse_ip_ntp_dhcp'> + <param type='eole'>global_adresse_ip_ntp_dhcp</param> + </fill> + <fill name='calc_val' target='dhcp_lease_default'> + <param type='eole'>global_dhcp_lease_default</param> + </fill> + <fill name='calc_val' target='dhcp_lease_max'> + <param type='eole'>global_dhcp_lease_max</param> + </fill> + <fill name='calc_val' target='dhcp_pool_use_failover'> + <param type='eole'>activer_dhcp_failover</param> + </fill> + <fill name='calc_val' target='fichier_pxe_dhcp'> + <param type='eole'>chemin_fichier_pxe</param> + </fill> + <fill name='calc_val' target='domain_wpad_dhcp'> + <param type='eole'>global_domain_wpad_dhcp</param> + </fill> + <fill name='calc_val' target='adresse_ip_tftp'> + <param type='eole' name='valeur'>adresse_ip_eth0</param> + </fill> + <fill name='calc_multi_condition' target='global_domain_wpad_dhcp'> + <param>non</param> + <param type="eole" name="condition_1" optional="True">activer_wpad</param> + <param name='default_match'>None</param> + <param type="eole" name='mismatch'>nom_domaine_local</param> + <param name='default_mismatch'>None</param> + </fill> + <fill name='gen_random' target='omapi_secret'/> + <condition name='disabled_if_in' source='activer_tftp'> + <param>non</param> + <target type='servicelist'>tftp</target> + <target type='family'>tftp</target> + <target type='filelist'>tftp</target> + <target type='variable'>fichier_pxe_dhcp</target> + </condition> + <condition name='disabled_if_in' source='activer_ipv6'> + <param>non</param> + <target type='servicelist'>dhcpipv6</target> + </condition> + <condition name='disabled_if_in' source='activer_dhcp'> + <param>non</param> + <target type='filelist'>dhcp</target> + <target type='servicelist'>dhcp</target> + <target type='family'>dhcp</target> + <target type='variable'>chemin_fichier_pxe</target> + </condition> + <check name='valid_enum' target='dhcp_failover_rank'> + <param>['primary', 'secondary']</param> + </check> + <!--<condition name='disabled_if_in' source='adressage_statique'> + <param>oui</param> + <target type='variable'>interdire_hotes_inconnus</target> + </condition>--> + <condition name='disabled_if_in' source='activer_dhcp_failover'> + <param>non</param> + <target type='variable'>dhcp_failover_name</target> + <target type='variable'>dhcp_failover_rank</target> + <target type='variable'>dhcp_failover_local_address</target> + <target type='variable'>dhcp_failover_port</target> + <target type='variable'>dhcp_failover_peer_address</target> + <target type='variable'>dhcp_failover_peer_port</target> + <target type='variable'>dhcp_failover_response_delay</target> + <target type='variable'>dhcp_failover_unacked_updates</target> + <target type='variable'>dhcp_failover_balance_seconds</target> + <target type='service_accesslist'>failover_dhcp</target> + <target type='service_restrictionlist'>failover_dhcp</target> + </condition> + <condition name='disabled_if_in' source='dhcp_failover_rank'> + <param>secondary</param> + <target type='variable'>dhcp_failover_mclt</target> + <target type='variable'>dhcp_failover_split</target> + </condition> + <condition name='disabled_if_in' source='activer_omapi'> + <param>non</param> + <target type='variable'>omapi_port</target> + <target type='variable'>omapi_secret</target> + <target type='service_accesslist'>omapi</target> + </condition> + </constraints> + + <help> + <family name='dhcp'>Paramétrage du serveur DHCP local</family> + <family name='tftp'>Configuration du serveur TFTP</family> + <variable name='activer_dhcp'>DHCP (Dynamic Host Configuration Protocol) est un protocole réseau dont le rôle est d’assurer la configuration automatique des paramètres IP d’une station</variable> + <variable name='activer_tftp'>TFTP (Trivial File Transfer Protocol) est un protocole simplifié de transfert de fichiers</variable> + <variable name='global_nom_domaine_dhcp'>Nom de domaine à renvoyer aux clients DHCP</variable> + <variable name='global_adresse_ip_gw_dhcp'>Adresse IP du routeur par défaut à renvoyer aux clients DHCP</variable> + <variable name='global_adresse_ip_dns_dhcp'>Adresse IP du DNS à renvoyer aux clients DHCP</variable> + <variable name='global_adresse_ip_wins_primaire_dhcp'>Adresse IP du serveur primaire WINS à renvoyer aux clients DHCP</variable> + <variable name='global_adresse_ip_wins_secondaire_dhcp'>Adresse IP du serveur secondaire WINS à renvoyer aux clients DHCP</variable> + <variable name='global_adresse_ip_ntp_dhcp'>Adresse IP du serveur NTP à renvoyer aux clients DHCP</variable> + <variable name='global_dhcp_lease_default'>Temps du bail par défaut, en secondes, offert à un client n'ayant pas fait la demande d'une durée spécifique</variable> + <variable name='global_dhcp_lease_max'>Temps du bail maximal, en secondes, accordé à un client ayant fait la demande d'une durée spécifique</variable> + <variable name='activer_dhcp_failover'>Affiche les paramètres pour la configuration de la continuité de service (failover) de DHCP.</variable> + <variable name='dhcp_failover_name'>Nom utilisé pour identifier une configuration de continuité de service et l’associer aux pools d’adresses.</variable> + <variable name='dhcp_failover_rank'>Rôle joué par le serveur dans le mécanisme de continuité de service (primaire ou secondaire).</variable> + <variable name='dhcp_failover_local_address'>Adresse IP du serveur local failover, en écoute du serveur pair.</variable> + <variable name='dhcp_failover_port'>Port utilisé pour recevoir les informations du serveur pair.</variable> + <variable name='dhcp_failover_peer_address'>Adresse IP du serveur pair.</variable> + <variable name='dhcp_failover_peer_port'>Port utilisé pour contacter le serveur pair (peut être identique au port d’écoute du service hébergé).</variable> + <variable name='dhcp_failover_response_delay'>Seuil de temps (en secondes) à partir duquel un serveur pair ne répondant pas aux requêtes est supposé défaillant.</variable> + <variable name='dhcp_failover_unacked_updates'>Nombre limite de messages BNDUPD sans réponse BNDACK tolérés.</variable> + <variable name='dhcp_failover_balance_seconds'>Temps limite (en secondes) après lequel un pair prend le pas sur l’autre si ce dernier ne répond plus aux requêtes des clients mais seulement aux messages d’appairage (outrepassement des paramètres de répartition de charge).</variable> + <variable name='dhcp_failover_mclt'>Durée maximale (en secondes) pendant laquelle un serveur pair peut renouveler un bail sans concertation avec l’autre serveur (Maximum Client Lead Time).</variable> + <variable name='dhcp_failover_split'>Valeur comprise entre 0 et 256 inclus faisant office de seuil et permettant d’associer les requêtes à l’un ou à l’autre serveur pair (répartition de charge).</variable> + <variable name='activer_omapi'>Afficher les variables utilisées pour la configuration de OMAPI</variable> + <variable name='omapi_port'>Port à ouvrir et à utiliser pour OMAPI</variable> + <variable name='omapi_secret'>Clé secrète partagée à utiliser dans la configuration des différents serveurs utilisant OMAPI</variable> + <variable name='adresse_network_dhcp'>Adresse réseau du sous-réseau</variable> + <variable name='adresse_netmask_dhcp'>Masque de sous-réseau</variable> + <variable name='nom_plage_dhcp'>Nom permettant d'identifier facilement la plage DHCP, notamment dans l'interface d'administration</variable> + <variable name='ip_basse_dhcp'>IP basse de la plage d'adresses attribuées dynamiquement pour le sous-réseau</variable> + <variable name='ip_haute_dhcp'>IP haute de la plage d'adresses attribuées dynamiquement pour le sous-réseau</variable> + <variable name='adressage_statique'>Si oui, la plage est réservée à un adressage statique via l’EAD3, sinon, adressage dynamique.</variable> + <variable name='nom_domaine_dhcp'>Nom de domaine à renvoyer aux clients DHCP du sous-réseau</variable> + <variable name='adresse_ip_gw_dhcp'>Adresse IP du routeur à renvoyer aux clients DHCP du sous-réseau</variable> + <variable name='adresse_ip_dns_dhcp'>Adresse IP du DNS à renvoyer aux clients DHCP du sous-réseau</variable> + <variable name='adresse_ip_dns_secondaire_dhcp'>Adresse IP d'un serveur DNS secondaire à renvoyer aux clients DHCP du sous-réseau</variable> + <variable name='adresse_ip_wins_primaire_dhcp'>Adresse IP du serveur primaire WINS à renvoyer aux clients du sous-réseau</variable> + <variable name='adresse_ip_wins_secondaire_dhcp'>Adresse IP du serveur secondaire WINS à renvoyer aux clients du sous-réseau</variable> + <variable name='adresse_ip_ntp_dhcp'>Adresse IP du serveur NTP à renvoyer aux clients du sous-réseau</variable> + <variable name='global_domain_wpad_dhcp'>Nom de domaine du serveur WPAD à renvoyer aux clients du sous-réseau</variable> + <variable name='interdire_hotes_inconnus'>Le serveur attribuera des adresses uniquement aux stations déclarées</variable> + <variable name='dhcp_lease_default'>Temps du bail par défaut, en secondes, offert à un client du sous-réseau n'ayant pas fait la demande d'une durée spécifique</variable> + <variable name='dhcp_lease_max'>Temps du bail maximal, en secondes, accordé à un client du sous-réseau ayant fait la demande d'une durée spécifique</variable> + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-dhcp/extra_dictionaries/dhcp/00_action.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dhcp/extra_dictionaries/dhcp/00_action.xml new file mode 100644 index 0000000000000000000000000000000000000000..ae1b5292d85615c05685b30a3ca7f5b5e08e355f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dhcp/extra_dictionaries/dhcp/00_action.xml @@ -0,0 +1,49 @@ +<creole> + <family_action name="Réseau" + description="Gestion du réseau" + color="#3ca5d2" + image="icons/applications-internet.svg"> + <action type="custom" + title="Paramétrer le DHCP" + description="Gérer la configuration DHCP via la visualisation des baux en cours et la réservation d'IP" + image="icons/document-properties.svg" + actionlist="dhcp"> + <profile>ead_admin</profile> + <ewtapp>ead</ewtapp> + <tag>dhcp</tag> + <tag>réseau</tag> + </action> + </family_action> + <variables> + <family name="dhcp"> + <variable name="last_id" type="number" description="Dernier index utilisé lors de la réservation DHCP" mode="expert"> + <value>0</value> + </variable> + <variable name="id_dhcp" type="number" description="Index de la réservation DHCP" multi="True"/> + <variable name="hostname" type="domain" description="Nom de la machine" mandatory="True"/> + <variable name="macaddress" type="mac" description="Adresse MAC de la machine" mandatory="True"/> + <variable name="dyn" type="oui/non" description="La machine est sur une plage dynamique" mandatory="True"/> + <variable name="ip" type="ip" description="IP à réserver dans le réseau DHCP" mandatory="True"/> + <variable name="name" type="string" description="Nom de la plage dynamique"/> + </family> + </variables> + <constraints> + <condition name ='disabled_if_in' source='activer_dhcp'> + <param>non</param> + <target type='actionlist'>dhcp</target> + <target type='family'>dhcp.dhcp</target> + </condition> + <condition name ='disabled_if_in' source='dhcp.dhcp.id_dhcp.dyn'> + <param>oui</param> + <target>dhcp.dhcp.id_dhcp.ip</target> + </condition> + <group master="dhcp.dhcp.id_dhcp"> + <slave>hostname</slave> + <slave>macaddress</slave> + <slave>dyn</slave> + <slave>ip</slave> + <slave>name</slave> + </group> + </constraints> + <help/> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-dhcp/extra_dictionaries/dhcpactivation/00_action.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dhcp/extra_dictionaries/dhcpactivation/00_action.xml new file mode 100644 index 0000000000000000000000000000000000000000..63665f7b4824ee615bf1180209092cb13c7c1984 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dhcp/extra_dictionaries/dhcpactivation/00_action.xml @@ -0,0 +1,34 @@ +<creole> + <family_action name="Réseau"> + <action type="form" + title="DHCP : Compatibilité EAD2/EAD3" + save="True" + description="Gestion de la Compatibilité EAD2/EAD3 pour le DHCP" + image="icons/document-properties.svg" + actionlist="dhcpactivation"> + <input>Valider</input> + <profile>ead_admin</profile> + <ewtapp>ead</ewtapp> + <tag>dhcp</tag> + <tag>réseau</tag> + <tag>compatibilité</tag> + <tag>EAD2</tag> + <tag>EAD3</tag> + </action> + </family_action> + <variables> + <family name="dhcp_activation" description="Activation de l'action EAD3 de gestion DHCP"> + <variable name="dhcp_activation_ead3" type="oui/non" description="Activer l'action DHCP EAD3 (et désactiver celle de l'EAD2) ?"> + <value>non</value> + </variable> + </family> + </variables> + <constraints> + <condition name ='disabled_if_in' source='activer_dhcp'> + <param>non</param> + <target type='actionlist'>dhcpactivation</target> + <target type='family'>dhcpactivation.dhcp_activation</target> + </condition> + </constraints> + <help/> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-dhcp/files/etc/logrotate.d/eole-dhcp b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dhcp/files/etc/logrotate.d/eole-dhcp new file mode 100644 index 0000000000000000000000000000000000000000..a7c5d3faa6d25d65655ca7fb5f350268ed0c5c87 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dhcp/files/etc/logrotate.d/eole-dhcp @@ -0,0 +1,10 @@ +/var/log/rsyslog/local/dhcpd/*.log { + rotate 53 + weekly + missingok + compress + postrotate + service rsyslog rotate >/dev/null + endscript +} + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-dhcp/files/usr/share/eole/diagnose/40-dhcp b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dhcp/files/usr/share/eole/diagnose/40-dhcp new file mode 100644 index 0000000000000000000000000000000000000000..50b63368bc76eb1a947c58de11693f1cefa995d6 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dhcp/files/usr/share/eole/diagnose/40-dhcp @@ -0,0 +1,21 @@ +#!/bin/bash +. /usr/lib/eole/diagnose.sh +EchoGras "*** Serveur DHCP" +if [ $(CreoleGet activer_dhcp) = 'oui' ];then + TestPid DHCP dhcpd +else + Inactif "DHCP" +fi +adresse_ip_tftp="$(CreoleGet adresse_ip_tftp '')" +if [ -n "$adresse_ip_tftp" ];then + # test possible uniquement si TFTP local (#5525) + if [ "$adresse_ip_tftp" = "$(CreoleGet adresse_ip_eth0)" ] || + [ "$adresse_ip_tftp" = "$(CreoleGet adresse_ip_fichier_link '')" ];then + TestUDP TFTP 69 dhcp + else + printf ". %${len_pf}s => " "TFTP" + EchoOrange "Distant" + fi +fi +echo +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-dhcp/files/usr/share/eole/sbin/gen_dhcp b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dhcp/files/usr/share/eole/sbin/gen_dhcp new file mode 100644 index 0000000000000000000000000000000000000000..e5e0ac179870661a20db9f820016974e9e54f1ee --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dhcp/files/usr/share/eole/sbin/gen_dhcp @@ -0,0 +1,237 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +import sys +from glob import glob +from itertools import product +from os import makedirs, unlink +from os.path import join, isdir, isfile +from IPy import IP, IPSet +from pyeole.service import manage_services +from creole.client import CreoleClient +from creole.eosfunc import is_ip + +DHCP_DIR = 'etc/dhcp/fixed-address' +DHCP_CLASSES_DIR = 'etc/dhcp/host-classes' +CONFIG_FILE = '/var/lib/eole/config/dhcp.conf' +STATIC_IP_HOSTS_TMPL = "host %s { hardware ethernet %s; fixed-address %s; }\n" +DYNAMIC_IP_HOSTS_TMPL = "host %s { hardware ethernet %s; }\n" +DHCP_CLASS_TMPL = 'class "{0}" {{\n\tmatch hardware;\n}}\n' +DHCP_SUBCLASSES_TMPL = 'subclass "{0}" {1};\nsubclass "{0}" 1:{1};\n' +try: + DICO = CreoleClient().get_creole() +except: + DICO = {} + + +def build_dir_name(dir_name=DHCP_DIR, dico=DICO): + """ + Calcul du chemin du répertoire en fonction du mode + conteneur/non conteneur + """ + return join('/', dico['container_path_dhcp'], dir_name) + + +def build_file_name(name, dir_name=DHCP_DIR, dico=DICO): + """ + Calcul du chemin de l'un des fichiers de configuration + """ + dirname = build_dir_name(dir_name=dir_name, dico=dico) + return join(dirname, name+'.txt') + + +def clean(): + """ + remove old files and create empty files + """ + for dirname in [DHCP_CLASSES_DIR, DHCP_DIR]: + dirname = build_dir_name(dirname) + if not isdir(dirname): + makedirs(dirname) + for name in glob(join(dirname, '*')): + unlink(name) + # fixed adresse file + with open(build_file_name('fixed-addresses'), 'w') as fixed_addresses_file: + fixed_addresses_file.write('') + # pool related classes file + for i in range(0, len(DICO['adresse_network_dhcp'])): + ip_basse = DICO['adresse_network_dhcp.ip_basse_dhcp'][i] + ip_haute = DICO['adresse_network_dhcp.ip_haute_dhcp'][i] + filename = '{}-{}'.format(ip_basse, ip_haute) + with open(build_file_name(filename, dir_name=DHCP_CLASSES_DIR), + 'w+') as class_file: + class_file.write('') + + +def parse_ead_config(ead_config=CONFIG_FILE): + """ + Extract and structure information from ead exported list of static IP + configurations. + :param ead_config: static IP configurations exported from EAD. + :type ead_config: path + """ + tuples = [] + if isfile(ead_config): + with open(ead_config, 'r') as ead_file: + tuples = [l.strip().split('#') for l in ead_file.readlines() + if l.count('#') == 2 and not l.startswith('#')] + return tuples + + +def clean_ead_file(hosts_configuration, ead_config=CONFIG_FILE): + """ + """ + confs = ['#'.join(c) + for mac, conf in hosts_configuration.iteritems() + for c in product([conf['name']], [ip.strNormal() + for ip in conf['ip']], [mac])] + with open(ead_config, 'w') as ead_file: + ead_file.write('\n'.join(confs)) + return hosts_configuration + + +# erreurs optionnelles +CRITICAL_ALLOC_ERRORS = set([ + 'incohérence couples MAC, nom', + 'format IP invalide', + # 'IP hors sous-réseau déclaré', +]) + + +def clean_hosts_configuration(raw_configuration, critical_errors=CRITICAL_ALLOC_ERRORS, dico=DICO, ead_config=CONFIG_FILE): + """ + Return filtered IP allocations list and trigger /var/lib/eole/config/dhcp.conf + file cleaning accordingly + :param raw_configuration: configuration exported by EAD + :type raw_configuration: `list` (`str` name, `str` ip, `str` mac) + """ + + subnets = [IP('{0}/{1}'.format(network, netmask)) + for network, netmask in zip(dico['adresse_network_dhcp'], + dico['adresse_network_dhcp.adresse_netmask_dhcp'])] + pools = [] + for ip_basse, ip_haute in zip(dico['adresse_network_dhcp.ip_basse_dhcp'], + dico['adresse_network_dhcp.ip_haute_dhcp']): + pool = IPSet() + base_network, low_host_bit = ip_basse.rsplit('.', 1) + high_host_bit = ip_haute.rsplit('.', 1)[-1] + for host_bit in range(int(low_host_bit), int(high_host_bit) + 1): + ip = IP('{0}.{1}'.format(base_network, host_bit)) + pool.add(ip) + pools.append(('{}-{}'.format(ip_basse, ip_haute), pool)) + conf = {'static': [], 'dynamic': {}} + conf['dynamic'].update({subnet: {} for subnet in subnets}) + for pool in pools: + for subnet in conf['dynamic']: + if not pool[1].isdisjoint(IPSet([subnet])): + conf['dynamic'][subnet].setdefault(pool[0], []) + hosts = {} + for name, ip, mac in raw_configuration: + + # consignation des erreurs rencontrées lors des validations optionnelles + errors = [] + + if (mac in hosts and hosts[mac]['name'] != name or + ((len([h for h in hosts.values() if h['name'] == name]) != 0) and + (mac not in [m for m, h in hosts.iteritems() if h['name'] == name]))): + print "Un nom donné ({}) doit être associé à une seule adresse MAC".format(name) + errors.append('incohérence couples MAC, nom') + + if not is_ip(ip): + print "Format de l’IP fournie invalide" + errors.append('format IP invalide') + + elif IP(ip) not in IPSet(conf['dynamic'].keys()): # IP defined outside declared subnets + print "Aucun subnet n’est déclaré pour cette adresse IP : {0} ({1})".format(ip, name) + errors.append('IP hors sous-réseau déclaré') + + if not set(errors).isdisjoint(critical_errors): + continue + else: + current_subnet = [s for s in subnets if IP(ip) in s] + current_subnet = current_subnet[0] if len(current_subnet) != 0 else None + current_pool = [p for p in pools if IP(ip) in p[1]] + current_pool = current_pool[0] if len(current_pool) != 0 else None + + if current_pool is None: + if IP(ip) in IPSet([p for m in hosts.values() for p in m['ip']]): # ip already allocated + print "IP déjà attribuée" + elif (mac in hosts and # mac already used in conf + current_subnet in hosts[mac]['tree'] and # mac already used in same subnet + len(hosts[mac]['tree'][current_subnet].keys()) > 0): # mac either associated with static address or pool + print "Allocation statique de l’IP {} pour l’adresse MAC {} ({}) incompatible avec une allocation pré-existante (même sous-réseau).".format(ip, mac, name) + else: + # add IP to static addresses list + conf['static'] = conf.get('static', []) + [(name, ip, mac)] + hosts.setdefault(mac, {'name': name, 'ip': [], 'tree': {}}) + hosts[mac]['tree'].setdefault(current_subnet, {}) + hosts[mac]['ip'].append(IP(ip)) + hosts[mac]['tree'][current_subnet]['static'] = IP(ip) + + else: + if (mac in hosts and # mac already used in conf + current_subnet in hosts[mac]['tree'] and # mac already used in same subnet + len(set(['static', current_pool]).intersection(set(hosts[mac]['tree'][current_subnet].keys()))) is not None): # mac either associated with static address or same pool + print "Association au pool {} de l’adresse MAC {} ({}) incompatible avec une allocation pré-existante (adresse statique dans le même sous-réseau voire le même pool).".format(ip, mac, name) + else: + # add IP to pool + conf['dynamic'][current_subnet][current_pool[0]] = conf['dynamic'][current_subnet].get(current_pool[0], []) + [(name, mac)] + hosts.setdefault(mac, {'name': name, 'ip': [], 'tree': {}}) + hosts[mac]['tree'].setdefault(current_subnet, {}) + hosts[mac]['ip'].append(IP(ip)) + hosts[mac]['tree'][current_subnet][current_pool[0]] = IP(ip) + clean_ead_file(hosts, ead_config=ead_config) + return conf + + +def gen_dhcp_config(hosts_configuration, dico=DICO, dir_name=DHCP_DIR): + """ + Génération des fichiers de configuration (hosts et class) + :param hosts_configuration: structure contenant l’information sur les allocations + d’adresses IP + :type hosts_configuration: `dict` {'static': [(`str` name, `str` ip, `str` mac),], + 'dynamic': {`IPSet` subnet: {`str` range: [(`str` name, `str` mac,),]}, }} + """ + # création du fichier d’hôtes rassemblant ceux avec les IP statiques et les + # autres si ils ne figurent pas déjà dans la précédente liste + with open(build_file_name('fixed-addresses', dico=dico, dir_name=dir_name), 'w') as fixed_address_file: + hosts = {} + for static_alloc in hosts_configuration['static']: + hosts.setdefault((static_alloc[0], static_alloc[2]), []) + hosts[(static_alloc[0], static_alloc[2])].append(static_alloc[1]) + for host, ips in hosts.iteritems(): + fixed_addresses = ', '.join([ip for ip in ips]) + host = STATIC_IP_HOSTS_TMPL %(host[0], host[1], fixed_addresses) + fixed_address_file.write(host) + for pool, host_list in [p for pools in hosts_configuration['dynamic'].values() + for p in pools.iteritems()]: + for host in host_list: + if host[0] not in [h[0] for h in hosts]: + host = DYNAMIC_IP_HOSTS_TMPL %(host[0], host[1]) + fixed_address_file.write(host) + + # création des fichiers de classes pour la restriction des pools + for pool, macs in [p for subnet in hosts_configuration['dynamic'].values() + for p in subnet.iteritems()]: + if dir_name != DHCP_DIR: + sub_dir_name = dir_name + else: + sub_dir_name = DHCP_CLASSES_DIR + with open(build_file_name(pool, dir_name=sub_dir_name, dico=dico), 'w') as pool_file: + class_name = "pool-{}".format(pool) + subclasses = [DHCP_SUBCLASSES_TMPL.format(class_name, client[1]) for client in macs] + pool_file.write(DHCP_CLASS_TMPL.format(class_name)) + pool_file.write(''.join(subclasses)) + + + +if __name__ == '__main__': + clean() + hosts_configuration = parse_ead_config() + pools_configuration = clean_hosts_configuration(hosts_configuration) + gen_dhcp_config(pools_configuration) + if len(sys.argv) == 1: + # si aucun argument, on redémarre le service + ret = manage_services('restart', 'isc-dhcp-server', 'dhcp') + if ret != 0: + print "Une erreur s'est produite au redémarrage du service dhcp" + exit(ret) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-dhcp/postservices/05-tftp b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dhcp/postservices/05-tftp new file mode 100644 index 0000000000000000000000000000000000000000..26b5992aaf7fd5c3a3f15e2fa255042a6a845830 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dhcp/postservices/05-tftp @@ -0,0 +1,16 @@ +#!/bin/bash +. /usr/lib/eole/utils.sh + +adresse_ip_tftp="$(CreoleGet adresse_ip_tftp '')" +if [ -n "$adresse_ip_tftp" ];then + if [ "$adresse_ip_tftp" = "$(CreoleGet adresse_ip_eth0)" ] || + [ "$adresse_ip_tftp" = "$(CreoleGet adresse_ip_fichier_link '')" ];then + enable_service 'tftpd-hpa' 'dhcp' + else + disable_service 'tftpd-hpa' 'dhcp' + fi +else + disable_service 'tftpd-hpa' 'dhcp' +fi + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-dhcp/posttemplates/05-dhcp b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dhcp/posttemplates/05-dhcp new file mode 100644 index 0000000000000000000000000000000000000000..04892bc6d0dabbed153a33d4affd9887a0206379 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dhcp/posttemplates/05-dhcp @@ -0,0 +1,10 @@ +#!/bin/bash +ACTION_EAD=/usr/share/ead2/backend/config/actions/actions_dhcp.cfg +if [ $(CreoleGet activer_dhcp) = 'oui' ];then + # déclaration de l'action EAD + [ ! -f $ACTION_EAD ] && echo dhcp > $ACTION_EAD + /usr/share/eole/sbin/gen_dhcp norestart +else + rm -f $ACTION_EAD +fi +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-dhcp/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dhcp/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..35613e37a17fb987e1a00ea8a4a6f34d90b86571 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dhcp/service.yml @@ -0,0 +1,51 @@ +format: '0.1' +name: eole-dhcp +version: |- + 2.7.1-3 +description: |- + Templates et dictionnaires pour DHCP/TFTP EOLE + Configuration des services dhcp3-server et tftpd-hpa + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: [] +packages: [] +dictionaries: + - 20_dhcp.xml +extra_dictionaries: + dhcp: + - 00_action.xml + dhcpactivation: + - 00_action.xml +templates: + - dhcpd.conf + - eoledhcp.cfg + - perm_dhcp.ini + - tftpd-hpa.default +creole_funcs: [] +preservices: [] +postservices: + - 05-tftp +pretemplates: [] +posttemplates: + - 05-dhcp +files: + /etc/logrotate.d/eole-dhcp: + owner: root + group: root + mode: '0644' + /usr/share/eole/diagnose/40-dhcp: + owner: root + group: root + mode: '0755' + /usr/share/eole/sbin/gen_dhcp: + owner: root + group: root + mode: '0755' +excluding_regexp: + /usr/share/doc: 2 + /usr/share/eole/creole/extra/dhcp/custom/: 888 + /usr/share/eole/creole/extra/dhcp/salt/: 1 + /usr/share/eole/creole/extra/dhcp/sls/: 2 + /usr/share/eole/creole/extra/dhcpactivation/salt/: 1 + /usr/share/eole/creole/extra/dhcpactivation/sls/: 3 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-dhcp/templates/dhcpd.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dhcp/templates/dhcpd.conf new file mode 100644 index 0000000000000000000000000000000000000000..df58483a4cacf2ea983a941a831aae2b65582889 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dhcp/templates/dhcpd.conf @@ -0,0 +1,338 @@ +######################################################## +# +## dhcpd.conf pour ScribeNg +# +## Equipe Eole eole@ac-dijon.fr +# +## septembre 2007 +# +######################################################## +# +%def fallback_option(%%struct, %%option, %%fallback_option, %%fallback) + %if getattr(%%struct, %%option, None) != None + %return getattr(%%struct, %%option) + %elif %%getVar(%%fallback_option, None) != None + %return %%getVar(%%fallback_option) + %else + %return %%fallback + %end if +%end def +%set %%ead3 = %%creole_client.get('dhcpactivation.dhcp_activation.dhcp_activation_ead3', 'non') +%set %%options = ['adresse_netmask_dhcp', 'ip_basse_dhcp', 'ip_haute_dhcp', 'adresse_ip_gw_dhcp', 'interdire_hotes_inconnus', 'adressage_statique', 'dhcp_pool_use_failover', 'fichier_pxe_dhcp'] +%set %%overloaded_options = ['nom_domaine_dhcp', 'adresse_ip_dns_dhcp', 'adresse_ip_dns_secondaire_dhcp', 'adresse_ip_wins_primaire_dhcp', 'adresse_ip_wins_secondaire_dhcp', 'adresse_ip_ntp_dhcp', 'dhcp_lease_default', 'dhcp_lease_max', 'domain_wpad_dhcp'] +%set %%groups = {} +%set %%pools = {} +%set %%subnets = {} +%for %%range_def in %%adresse_network_dhcp +%silent %%subnets.setdefault((%%str(%%range_def), %%range_def.adresse_netmask_dhcp), []) +%silent %%subnets[(%%str(%%range_def), %%range_def.adresse_netmask_dhcp)].append(%%range_def.nom_plage_dhcp) +%if %%range_def.adressage_statique == 'oui' +%set %%groups[%%range_def.nom_plage_dhcp] = {} +%for %%option in %%options +%if %%hasattr(%%range_def, %%option) +%set %%groups[%%range_def.nom_plage_dhcp][%%option] = %%getattr(%%range_def, %%option) +%end if +%end for +%for %%option in %%overloaded_options +%if %%hasattr(%%range_def, %%option) +%set %%groups[%%range_def.nom_plage_dhcp][%%option] = %%fallback_option(%%range_def, %%option, 'global_{}'.format(%%option), None) +%end if +%end for +%else +%set %%pools[%%range_def.nom_plage_dhcp] = {} +%for %%option in %%options +%if %%hasattr(%%range_def, %%option) +%set %%pools[%%range_def.nom_plage_dhcp][%%option] = %%getattr(%%range_def, %%option) +%end if +%end for +%for %%option in %%overloaded_options +%if %%hasattr(%%range_def, %%option) +%set %%pools[%%range_def.nom_plage_dhcp][%%option] = %%fallback_option(%%range_def, %%option, 'global_{}'.format(%%option), None) +%end if +%end for +%end if +%end for +%if not %%is_empty(%%global_dhcp_lease_default) +default-lease-time %%global_dhcp_lease_default; +%end if +%if not %%is_empty(%%global_dhcp_lease_max) +max-lease-time %%global_dhcp_lease_max; +%end if +%if not %%is_empty(%%global_nom_domaine_dhcp) +option domain-name "%%global_nom_domaine_dhcp"; +%end if +%if not %%is_empty(%%global_adresse_ip_dns_dhcp) +%set %%dns_ip = %%global_adresse_ip_dns_dhcp +%if not %%is_empty(%%global_adresse_ip_dns_secondaire_dhcp) +%set %%dns_ip = %%dns_ip + ', ' + %%global_adresse_ip_dns_secondaire_dhcp +%end if +option domain-name-servers %%dns_ip; +%end if +%if not %%is_empty(%%global_adresse_ip_wins_primaire_dhcp) +%set %%netbios_ip = %%global_adresse_ip_wins_primaire_dhcp +%if not %%is_empty(%%global_adresse_ip_wins_secondaire_dhcp) +%set %%netbios_ip = %%netbios_ip + ', ' + %%global_adresse_ip_wins_secondaire_dhcp +%end if +option netbios-name-servers %%netbios_ip; +option netbios-dd-server %%netbios_ip; +option netbios-node-type 8; +%end if +%if not %%is_empty(%%global_adresse_ip_ntp_dhcp) +option ntp-servers %%global_adresse_ip_ntp_dhcp; +%end if +%if not %%is_empty(%%global_domain_wpad_dhcp) +option wpad-url code 252 = text; +option wpad-url "http://wpad.%%global_domain_wpad_dhcp/wpad.dat\n"; +%end if + +%if %%getVar('activer_dhcp_failover', 'non') == 'oui' +#failover +failover peer "%%{dhcp_failover_name}" { + %%{dhcp_failover_rank}; + address %%{dhcp_failover_local_address}; + port %%{dhcp_failover_port}; + peer address %%{dhcp_failover_peer_address}; + peer port %%{dhcp_failover_peer_port}; + max-response-delay %%{dhcp_failover_response_delay}; + max-unacked-updates %%{dhcp_failover_unacked_updates}; + load balance max seconds %%{dhcp_failover_balance_seconds}; +%if %%dhcp_failover_rank == 'primary' + mclt %%{dhcp_failover_mclt}; + split %%{dhcp_failover_split}; +%end if +} +%end if + +#ddns-update-style none; +authoritative; + +%if %%getVar('activer_omapi', 'non') == 'oui' +# omapi +omapi-port %%{omapi_port}; +omapi-key omapi_key; + +key omapi_key { + algorithm hmac-md5; + secret %%{omapi_secret}; +} +%end if + +# déclaration des hôtes des plages statiques +%if %%ead3 == 'non' +include "/etc/dhcp/fixed-address/fixed-addresses.txt"; +%else +%set %%hosts = %%zip(%%creole_client.get('dhcp.dhcp.id_dhcp.macaddress'), %%creole_client.get('dhcp.dhcp.id_dhcp.hostname'), %%creole_client.get('dhcp.dhcp.id_dhcp.ip'), %%creole_client.get('dhcp.dhcp.id_dhcp.name'), %%creole_client.get('dhcp.dhcp.id_dhcp.dyn')) +%for %%group in %%groups +%set %%grouped_hosts = [h for h in %%hosts if h[3] == %%group] +%if %%grouped_hosts != [] +group %%group { + option subnet-mask %%groups[%%group].get('adresse_netmask_dhcp'); +%if %%groups[%%group].get('adresse_ip_gw_dhcp') is not None + option routers %%groups[%%group].get('adresse_ip_gw_dhcp'); +%end if +%if %%groups[%%group].get('nom_domaine_dhcp') is not None + option domain-name "%%groups[%%group].get('nom_domaine_dhcp')"; +%end if +%if %%groups[%%group].get('adresse_ip_dns_dhcp') is not None + option domain-name-servers %%groups[%%group].get('adresse_ip_dns_dhcp')%slurp + %if %%groups[%%group].get('adresse_ip_dns_secondaire_dhcp') is not None +, %%groups[%%group].get('adresse_ip_dns_secondaire_dhcp')%slurp + %end if +; +%end if +%if %%groups[%%group].get('adresse_ip_wins_primaire_dhcp') is not None + option netbios-name-servers %%groups[%%group].get('adresse_ip_wins_primaire_dhcp')%slurp + %if %%groups[%%group].get('adresse_ip_wins_secondaire_dhcp') is not None +, %%groups[%%group].get('adresse_ip_wins_secondaire_dhcp')%slurp + %end if +; + option netbios-dd-server %%groups[%%group].get('adresse_ip_wins_primaire_dhcp')%slurp + %if %%groups[%%group].get('adresse_ip_wins_secondaire_dhcp') is not None +, %%groups[%%group].get('adresse_ip_wins_secondaire_dhcp')%slurp + %end if +; + option netbios-node-type 8; +%end if +%if %%groups[%%group].get('adresse_ip_ntp_dhcp') is not None + option ntp-servers %%groups[%%group].get('adresse_ip_ntp_dhcp'); +%end if +%if %%activer_tftp == 'oui' and %%groups[%%group].get('fichier_pxe_dhcp') is not None + next-server %%adresse_ip_tftp; + filename "%%groups[%%group].get('fichier_pxe_dhcp')"; +%end if +%if %%groups[%%group].get('domain_wpad_dhcp') is not None + option wpad-url "http://wpad.%%groups[%%group]['domain_wpad_dhcp']/wpad.dat\n"; +%end if +%if %%groups[%%group].get('dhcp_lease_default') is not None + default-lease-time %%groups[%%group].get('dhcp_lease_max'); +%end if +%if %%groups[%%group].get('dhcp_lease_max') is not None + max-lease-time %%groups[%%group].get('dhcp_lease_max'); +%end if + +%for %%host in %%grouped_hosts + host %%host[1] { hardware ethernet %%host[0]; fixed-address %%host[2]; } +%end for +} +%end if +%end for + +# déclaration des hôtes statiques hors plage statique +%for %%host in %%hosts +%if %%host[3] not in %%groups and not %%isinstance(%%host[2], dict) +host %%host[1] { hardware ethernet %%host[0]; fixed-address %%host[2]; } +%end if +%end for + +# déclaration des hôtes autorisés dans les plages dynamiques +%for %%host in [h for h in %%hosts if h[4] == 'oui'] +host %%host[1] { hardware ethernet %%host[0]; } +%end for + +%end if + +%if %%adresse_network_eth0 not in %%adresse_network_dhcp +# pas de dhcp sur la zone scribe +subnet %%adresse_network_eth0 netmask %%adresse_netmask_eth0 { +} +%end if + +%for %%subnet in %%subnets +%for %%pool in %%subnets[%%subnet] +%if %%pools.get(%%pool) and %%pools[%%pool]['interdire_hotes_inconnus'] == 'oui' and %%pools[%%pool]['adressage_statique'] == 'non' +%if %%ead3 == 'non' +include "/etc/dhcp/host-classes/%%{pools[%%pool]['ip_basse_dhcp']}-%%{pools[%%pool]['ip_haute_dhcp']}.txt"; +%else +class "pool-%%{pools[%%pool]['ip_basse_dhcp']}-%%{pools[%%pool]['ip_haute_dhcp']}" { + match hardware; +} +%set %%filtered_hosts = [h for h in %%hosts if h[3] == %%pool] +%for %%filtered_host in %%filtered_hosts +subclass "pool-%%{pools[%%pool]['ip_basse_dhcp']}-%%{pools[%%pool]['ip_haute_dhcp']}" %%filtered_host[0]; +subclass "pool-%%{pools[%%pool]['ip_basse_dhcp']}-%%{pools[%%pool]['ip_haute_dhcp']}" 1:%%filtered_host[0]; +%end for +%end if +%end if +%end for +%end for + +%for %%subnet in %%subnets +subnet %%subnet[0] netmask %%subnet[1] { + option subnet-mask %%subnet[1]; + + %set %%adresses_ip_gw = [] + %set %%noms_domaine = [] + %set %%adresses_ip_dns = [] + %set %%adresses_ip_wins = [] + %set %%adresses_ip_ntp = [] + %set %%domains_wpad = [] + %for %%pool in [p for p in %%subnets[%%subnet] if p in %%pools and %%pools[p]['adressage_statique'] == 'non'] + %set %%pool_adresse_ip_gw = %%pools[%%pool].get('adresse_ip_gw_dhcp') + %if %%pool_adresse_ip_gw is not None and %%pool_adresse_ip_gw not in %%adresses_ip_gw + %silent %%adresses_ip_gw.append(%%pool_adresse_ip_gw) + %end if + %set %%pool_nom_domaine = %%pools[%%pool].get('nom_domaine_dhcp') + %if %%pool_nom_domaine is not None and %%pool_nom_domaine not in %%noms_domaine + %silent %%noms_domaine.append(%%pool_nom_domaine) + %end if + %set %%pool_adresse_ip_dns = %%pools[%%pool].get('adresse_ip_dns_dhcp') + %if %%pool_adresse_ip_dns is not None and %%pool_adresse_ip_dns not in %%adresses_ip_dns + %silent %%adresses_ip_dns.append(%%pool_adresse_ip_dns) + %end if + %set %%pool_adresse_ip_dns_secondaire = %%pools[%%pool].get('adresse_ip_dns_secondaire_dhcp') + %if %%pool_adresse_ip_dns_secondaire is not None and %%pool_adresse_ip_dns_secondaire not in %%adresses_ip_dns + %silent %%adresses_ip_dns.append(%%pool_adresse_ip_dns_secondaire) + %end if + %set %%pool_adresse_ip_wins_primaire = %%pools[%%pool].get('adresse_ip_wins_primaire_dhcp') + %if %%pool_adresse_ip_wins_primaire is not None and %%pool_adresse_ip_wins_primaire not in %%adresses_ip_wins + %silent %%adresses_ip_wins.append(%%pool_adresse_ip_wins_primaire) + %end if + %set %%pool_adresse_ip_wins_secondaire = %%pools[%%pool].get('adresse_ip_wins_secondaire_dhcp') + %if %%pool_adresse_ip_wins_secondaire is not None and %%pool_adresse_ip_wins_secondaire not in %%adresses_ip_wins + %silent %%adresses_ip_wins.append(%%pool_adresse_ip_wins_secondaire) + %end if + %set %%pool_adresse_ip_ntp = %%pools[%%pool].get('adresse_ip_ntp_dhcp') + %if %%pool_adresse_ip_ntp is not None and %%pool_adresse_ip_ntp not in %%adresses_ip_ntp + %silent %%adresses_ip_ntp.append(%%pool_adresse_ip_ntp) + %end if + %end for + %if %%adresses_ip_gw + option routers %%custom_join(%%adresses_ip_gw, ', '); + %end if + %if %%noms_domaine + option domain-name "%%noms_domaine[0]"; + %end if + %if %%adresses_ip_dns + option domain-name-servers %%custom_join(%%adresses_ip_dns, ', '); + %end if + %if %%adresses_ip_wins + option netbios-name-servers %%custom_join(%%adresses_ip_wins, ', '); + option netbios-dd-server %%custom_join(%%adresses_ip_wins, ', '); + option netbios-node-type 8; + %end if + %if %%adresses_ip_ntp + option ntp-servers %%custom_join(%%adresses_ip_ntp, ', '); + %end if + %if %%activer_tftp == 'oui' + next-server %%adresse_ip_tftp; + filename "%%chemin_fichier_pxe"; + %end if + + # plages d'ip + %for %%pool in [p for p in %%subnets[%%subnet] if p in %%pools and %%pools[p]['adressage_statique'] == 'non'] + pool { +%if %%pools[%%pool].get('adresse_ip_gw_dhcp') is not None + option routers %%pools[%%pool].get('adresse_ip_gw_dhcp'); +%end if +%if %%pools[%%pool].get('nom_domaine_dhcp') is not None + option domain-name "%%pools[%%pool].get('nom_domaine_dhcp')"; +%end if +%if %%pools[%%pool].get('adresse_ip_dns_dhcp') is not None + option domain-name-servers %%pools[%%pool].get('adresse_ip_dns_dhcp')%slurp + %if %%pools[%%pool].get('adresse_ip_dns_secondaire_dhcp') is not None +, %%pools[%%pool].get('adresse_ip_dns_secondaire_dhcp')%slurp + %end if +; +%end if +%if %%pools[%%pool].get('adresse_ip_wins_primaire_dhcp') is not None + option netbios-name-servers %%pools[%%pool].get('adresse_ip_wins_primaire_dhcp')%slurp + %if %%pools[%%pool].get('adresse_ip_wins_secondaire_dhcp') is not None +, %%pools[%%pool].get('adresse_ip_wins_secondaire_dhcp')%slurp + %end if +; +%end if +%if %%pools[%%pool].get('adresse_ip_ntp_dhcp') is not None + option ntp-servers %%pools[%%pool].get('adresse_ip_ntp_dhcp'); +%end if +%if %%pools[%%pool].get('domain_wpad_dhcp') is not None + option wpad-url "http://wpad.%%pools[%%pool]['domain_wpad_dhcp']/wpad.dat\n"; +%end if + %if %%pools[%%pool]['dhcp_pool_use_failover'] == 'oui' + failover peer "%%{dhcp_failover_name}"; + %end if + range %%pools[%%pool]['ip_basse_dhcp'] %%pools[%%pool]['ip_haute_dhcp']; + %if %%pools[%%pool]['interdire_hotes_inconnus'] == 'oui' + allow members of "pool-%%{%%pools[%%pool]['ip_basse_dhcp']}-%%{%%pools[%%pool]['ip_haute_dhcp']}"; + %else + %for %%restricted_class in [rp for rp in %%pools if %%pools[rp]['interdire_hotes_inconnus'] == 'oui'] + deny members of "pool-%%{%%pools[%%restricted_class]['ip_basse_dhcp']}-%%{%%pools[%%restricted_class]['ip_haute_dhcp']}"; + %end for + %end if + %set %%lease_default = %%pools[%%pool]['dhcp_lease_default'] + %if not %%lease_default == None + default-lease-time %%lease_default; + %end if + %set %%lease_max = %%pools[%%pool]['dhcp_lease_max'] + %if not %%lease_max == None + max-lease-time %%lease_max; + %end if + %if %%activer_tftp == 'oui' and %%pools[%%pool].get('fichier_pxe_dhcp') is not None + next-server %%adresse_ip_tftp; + filename "%%pools[%%pool].get('fichier_pxe_dhcp')"; + %end if + + } +%end for +} + +%end for diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-dhcp/templates/eoledhcp.cfg b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dhcp/templates/eoledhcp.cfg new file mode 100644 index 0000000000000000000000000000000000000000..6983336f4a68e6e13dd1b0b04a5b5cffb4d93226 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dhcp/templates/eoledhcp.cfg @@ -0,0 +1,7 @@ +[eole] +%if %%is_empty(%%container_path_dhcp) +container_path_dhcp = "" +%else +container_path_dhcp = %%container_path_dhcp +%end if +dhcp_path = %%container_path_dhcp/var/lib/dhcp/dhcpd.leases diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-dhcp/templates/perm_dhcp.ini b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dhcp/templates/perm_dhcp.ini new file mode 100644 index 0000000000000000000000000000000000000000..16da68c8dd6d6083f4775bacc57a646e8aed8f92 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dhcp/templates/perm_dhcp.ini @@ -0,0 +1,5 @@ +[roles] +admin=Administrateur + +[permissions] +dhcp=admin diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-dhcp/templates/tftpd-hpa.default b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dhcp/templates/tftpd-hpa.default new file mode 100644 index 0000000000000000000000000000000000000000..39d36e9face0ca25e3e1ef188ca3324c4a7427b6 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dhcp/templates/tftpd-hpa.default @@ -0,0 +1,5 @@ +#Defaults for tftpd-hpa +TFTP_USERNAME="tftp" +TFTP_DIRECTORY="%%repertoire_tftp" +TFTP_ADDRESS="%%adresse_ip_tftp:69" +TFTP_OPTIONS="--secure" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-dhcrelay/dictionaries/00_eole-dhcrelay_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dhcrelay/dictionaries/00_eole-dhcrelay_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..5121b2f02d1002a8eca50dce3e4626d9822d91ea --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dhcrelay/dictionaries/00_eole-dhcrelay_packages.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>isc-dhcp-relay</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-dhcrelay/dictionaries/20_dhcrelay.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dhcrelay/dictionaries/20_dhcrelay.xml new file mode 100644 index 0000000000000000000000000000000000000000..4a867e636340b17a4d6fab616e8320127590513c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dhcrelay/dictionaries/20_dhcrelay.xml @@ -0,0 +1,52 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + <files> + <service servicelist='dhrelay'>isc-dhcp-relay</service> + <file filelist='dhrelay' name='/etc/default/isc-dhcp-relay'/> + </files> + <variables> + <family name='services'> + <variable name='activer_dhcprelay' type='oui/non' description='Activer le relai DHCP'> + <value>non</value> + </variable> + </family> + <family name='relai dhcp' icon='forward'> + <variable name='dhcrelay_interfaces' type='string' mandatory='True' description="Numéro de l'interface derrière laquelle sont les clients DHCP" multi='True'> + <value>all</value> + </variable> + <variable name='dhcrelay_vlan' type='number' description='Numéro de VLAN des clients DHCP'/> + <variable name='dhcrelay_server_interface' type='string' mandatory='True' description="Numéro de l'interface derrière laquelle est le serveur DHCP" /> + <variable name='adresse_ip_dhcp_dhcrelay' type='ip' mandatory='True' description='Adresse IP du serveur DHCP à relayer'/> + </family> + <separators/> + </variables> + <constraints> + <check name='valid_enum' target="dhcrelay_interfaces"> + <param>['all', '1', '2', '3', '4']</param> + </check> + <check name='valid_enum' target="dhcrelay_server_interface"> + <param>['1', '2', '3', '4']</param> + </check> + <condition name='disabled_if_in' source='activer_dhcprelay'> + <param>non</param> + <target type='filelist'>dhrelay</target> + <target type='servicelist'>dhrelay</target> + <target type='family'>relai dhcp</target> + </condition> + <fill name='calc_val' target='adresse_ip_dhcp_dhcrelay'> + <param type='eole' optional='True' hidden='False'>ip_serveur_scribe_dmz</param> + </fill> + <group master='dhcrelay_interfaces'> + <slave>dhcrelay_vlan</slave> + </group> + </constraints> + <help> + <family name='relai dhcp'>Paramétrage du relai DHCP</family> + <variable name='activer_dhcprelay'>Le relai DHCP permet de relayer les trames DHCP d'un réseau vers d'autres réseaux</variable> + <variable name='dhcrelay_interfaces'>'all' relaiera les reqêtes DHCP depuis toutes les interfaces vers le serveur DHCP</variable> + <variable name='dhcrelay_server_interface'>Numéro de l'interface vers où relayer les requêtes DHCP</variable> + </help> +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-dhcrelay/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dhcrelay/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..6e2548978e261452e545f9ade2155afca23b016f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dhcrelay/service.yml @@ -0,0 +1,26 @@ +format: '0.1' +name: eole-dhcrelay +version: |- + 2.6.2-1 +description: |- + Templates et dictionnaires pour le relayage DHCP + Configuration du serveur relai DHCP + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: [] +packages: + - isc-dhcp-relay +dictionaries: + - 20_dhcrelay.xml +extra_dictionaries: {} +templates: + - isc-dhcp-relay +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: [] +files: {} +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-dhcrelay/templates/isc-dhcp-relay b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dhcrelay/templates/isc-dhcp-relay new file mode 100644 index 0000000000000000000000000000000000000000..7e6f9bb83a0645fb0a6ee7c46b3cb8dbe064d7a3 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dhcrelay/templates/isc-dhcp-relay @@ -0,0 +1,30 @@ +# Define SERVERS with a list of one or more DHCP servers where +# DHCP packets are to be relayed to and from. This is mandatory. +#SERVERS="10.11.12.13 10.9.8.7" + +SERVERS="%%adresse_ip_dhcp_dhcrelay" +%if 'all' not in %%dhcrelay_interfaces + %set %%dhc_server_int = %%getVar('nom_zone_eth' + %%dhcrelay_server_interface) +OPTIONS="%slurp + %set %%serv_int_ok = [] + %for %%dhcrelay_int in %%dhcrelay_interfaces + %if not %%is_empty(%%dhcrelay_int.dhcrelay_vlan) + %set %%dhc_int = %%getVar('nom_zone_eth' + %%dhcrelay_int)+'.'+%%str(%%dhcrelay_int.dhcrelay_vlan) + %else + %set %%dhc_int = %%getVar('nom_zone_eth' + %%dhcrelay_int) + %end if + %if %%dhc_int == %%dhc_server_int + %silent %%serv_int_ok.append('OK') + %end if +-i %%dhc_int %slurp + %end for + %if 'OK' not in %%serv_int_ok +-i %%dhc_server_int%slurp + %end if +" +%end if + +# Define OPTIONS with any other options to pass to the dhcrelay server. +# See dhcrelay(8) for available options and syntax. +#OPTIONS="-q -i eth0 -i eth1" + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-dns/dictionaries/22_dns.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dns/dictionaries/22_dns.xml new file mode 100644 index 0000000000000000000000000000000000000000..b16a06712de7277055c4f7099604712463ead354 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dns/dictionaries/22_dns.xml @@ -0,0 +1,262 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + <file name='/etc/apparmor.d/local/usr.sbin.named' source="named.apparmor.conf"/> + </files> + + <containers> + <container name="dns" id='18'> + <package>eole-dns-pkg</package> + <service>bind9</service> + <service_access service='bind9'> + <port>53</port> + <port protocol='udp'>53</port> + </service_access> + <service_restriction service='bind9'> + <ip service_restrictionlist='bind9_eth0' interface='eth0' netmask='0.0.0.0'>0.0.0.0</ip> + <ip interface='eth1' netmask='0.0.0.0'>0.0.0.0</ip> + <ip interface='eth2' netmask='0.0.0.0'>0.0.0.0</ip> + <ip interface='eth3' netmask='0.0.0.0'>0.0.0.0</ip> + <ip interface='eth4' netmask='0.0.0.0'>0.0.0.0</ip> + </service_restriction> + <file name='/etc/bind/named.conf'/> + <file name='/etc/bind/forward.zones'/> + <file name='/etc/default/bind9'/> + <file name='/etc/systemd/system/bind9.service.d/override.conf' source='bind9.override' mkdir='True'/> + <file filelist='agriates' name='/etc/bind/agriates.zones'/> + </container> + </containers> + + <variables> + + <family name='services'> + <variable name='activer_bind' type='oui/non' description='Activer le service bind' hidden='True'> + <value>oui</value> + </variable> + </family> + + <family name='Interface-0'> + <variable name='activer_dns_eth0' type='oui/non' description="Activer le serveur DNS sur cette zone"> + <value>oui</value> + </variable> + <variable name='dns_master_eth0' type='oui/non' description="Serveur master DNS sur cette zone" > + <value>non</value> + </variable> + </family> + <family name='Interface-1'> + <variable name='dns_master_eth1' type='oui/non' description="Serveur master DNS de cette zone" > + <value>oui</value> + </variable> + <variable name='dns_rvp_eth1' type='oui/non' description="Autoriser cette zone à utiliser les DNS de Forward RVP/AGRIATES" > + <value>oui</value> + </variable> + <variable name='dns_forward_eth1' type='oui/non' description="Autoriser cette zone à utiliser les DNS des zones forward additionnelles" > + <value>oui</value> + </variable> + </family> + <family name='Interface-2'> + <variable name='dns_master_eth2' type='oui/non' description="Serveur master DNS de cette zone" > + <value>oui</value> + </variable> + <variable name='dns_rvp_eth2' type='oui/non' description="Autoriser cette zone à utiliser les DNS de Forward RVP/AGRIATES" > + <value>non</value> + </variable> + <variable name='dns_forward_eth2' type='oui/non' description="Autoriser cette zone à utiliser les DNS des zones forward additionnelles" > + <value>oui</value> + </variable> + </family> + <family name='Interface-3'> + <variable name='dns_master_eth3' type='oui/non' description="Serveur master DNS de cette zone" > + <value>oui</value> + </variable> + <variable name='dns_rvp_eth3' type='oui/non' description="Autoriser cette zone à utiliser les DNS de Forward RVP/AGRIATES" > + <value>non</value> + </variable> + <variable name='dns_forward_eth3' type='oui/non' description="Autoriser cette zone à utiliser les DNS des zones forward additionnelles" > + <value>oui</value> + </variable> + </family> + <family name='Interface-4'> + <variable name='dns_master_eth4' type='oui/non' description="Serveur master DNS de cette zone" > + <value>oui</value> + </variable> + <variable name='dns_rvp_eth4' type='oui/non' description="Autoriser cette zone à utiliser les DNS de Forward RVP/AGRIATES" > + <value>non</value> + </variable> + <variable name='dns_forward_eth4' type='oui/non' description="Autoriser cette zone à utiliser les DNS des zones forward additionnelles" > + <value>oui</value> + </variable> + </family> + <family name='zones-dns' mode='expert' icon='random'> + <variable name='nom_domaine_local_supp' type='domain_strict' description='Nom domaine local supplémentaire ou rien' multi='True' /> + <variable name='activer_zone_forward' type='oui/non' description='Déclarer des zones DNS à forwarder'> + <value>non</value> + </variable> + <variable name='nom_zone_forward' type='domain_strict' description='Nom DNS de la zone' multi='True' mandatory='True'/> + <variable name='ip_dns_zone_forward' type='ip' description='Adresse IP du serveur DNS de la zone' mandatory='True'/> + </family> + <family name='rvp' hidden='True'> + <variable name='install_rvp' exists='False' type='oui/non'> + <value>non</value> + </variable> + <variable name='agriates_member' exists='False' type='oui/non'> + <value>non</value> + </variable> + <variable name='adresse_dns_agriates' type='ip' description='Adresse du DNS permettant de resoudre les in.ac-acad.fr' multi='True'/> + <variable name='nom_zone_forward_rvp' type='domain_strict' description='Nom DNS de la zone resolue par le DNS AGRIATES' multi='True'/> + </family> + <separators> + <separator name='activer_dns_eth0'>Configuration DNS sur l'interface</separator> + <separator name='dns_master_eth1'>Configuration DNS sur l'interface</separator> + <separator name='dns_master_eth2'>Configuration DNS sur l'interface</separator> + <separator name='dns_master_eth3'>Configuration DNS sur l'interface</separator> + <separator name='dns_master_eth4'>Configuration DNS sur l'interface</separator> + <separator name='nom_domaine_local_supp'>Ajout de domaines locaux supplémentaires (DNS master sur ces domaines)</separator> + <separator name='activer_zone_forward'>Forward de zones DNS</separator> + </separators> + </variables> + + <constraints> + <group master='nom_zone_forward'> + <slave>ip_dns_zone_forward</slave> + </group> + <condition name='disabled_if_in' source='activer_zone_forward'> + <param>non</param> + <target type='variable'>nom_zone_forward</target> + <target type='variable'>ip_dns_zone_forward</target> + </condition> + <condition name='disabled_if_in' source='agriates_member'> + <param>non</param> + <target type='variable'>adresse_dns_agriates</target> + <target type='filelist'>agriates</target> + </condition> + <condition name='disabled_if_in' source='activer_dns_eth0'> + <param>non</param> + <target type='variable'>dns_master_eth0</target> + <target type='service_restrictionlist'>bind9_eth0</target> + </condition> + <condition name='disabled_if_in' source='alias_eth1'> + <param>non</param> + <target type='variable'>dns_rvp_alias_eth1</target> + <target type='variable'>dns_forward_alias_eth1</target> + </condition> + <condition name='disabled_if_in' source='agriates_member'> + <param>non</param> + <target type='variable'>dns_rvp_alias_eth1</target> + </condition> + <condition name='disabled_if_in' source='install_rvp'> + <param>non</param> + <target type='variable'>dns_rvp_eth1</target> + <target type='variable'>dns_rvp_vlan_eth1</target> + <target type='variable'>dns_rvp_alias_eth1</target> + </condition> + <condition name='disabled_if_in' source='vlan_eth1'> + <param>non</param> + <target type='variable'>dns_rvp_vlan_eth1</target> + <target type='variable'>dns_forward_vlan_eth1</target> + </condition> + <condition name='disabled_if_in' source='agriates_member'> + <param>non</param> + <target type='variable'>dns_rvp_vlan_eth1</target> + </condition> + <condition name='disabled_if_in' source='alias_eth2'> + <param>non</param> + <target type='variable'>dns_rvp_alias_eth2</target> + <target type='variable'>dns_forward_alias_eth2</target> + </condition> + <condition name='disabled_if_in' source='agriates_member'> + <param>non</param> + <target type='variable'>dns_rvp_alias_eth2</target> + </condition> + <condition name='disabled_if_in' source='install_rvp'> + <param>non</param> + <target type='variable'>dns_rvp_eth2</target> + <target type='variable'>dns_rvp_alias_eth2</target> + <target type='variable'>dns_rvp_vlan_eth2</target> + </condition> + <condition name='disabled_if_in' source='vlan_eth2'> + <param>non</param> + <target type='variable'>dns_rvp_vlan_eth2</target> + <target type='variable'>dns_forward_vlan_eth2</target> + </condition> + <condition name='disabled_if_in' source='agriates_member'> + <param>non</param> + <target type='variable'>dns_rvp_vlan_eth2</target> + </condition> + <condition name='disabled_if_in' source='alias_eth3'> + <param>non</param> + <target type='variable'>dns_rvp_alias_eth3</target> + <target type='variable'>dns_forward_alias_eth3</target> + </condition> + <condition name='disabled_if_in' source='agriates_member'> + <param>non</param> + <target type='variable'>dns_rvp_alias_eth3</target> + </condition> + <condition name='disabled_if_in' source='install_rvp'> + <param>non</param> + <target type='variable'>dns_rvp_eth3</target> + <target type='variable'>dns_rvp_alias_eth3</target> + <target type='variable'>dns_rvp_vlan_eth3</target> + </condition> + <condition name='disabled_if_in' source='vlan_eth3'> + <param>non</param> + <target type='variable'>dns_rvp_vlan_eth3</target> + <target type='variable'>dns_forward_vlan_eth3</target> + </condition> + <condition name='disabled_if_in' source='agriates_member'> + <param>non</param> + <target type='variable'>dns_rvp_vlan_eth3</target> + </condition> + <condition name='disabled_if_in' source='alias_eth4'> + <param>non</param> + <target type='variable'>dns_rvp_alias_eth4</target> + <target type='variable'>dns_forward_alias_eth4</target> + </condition> + <condition name='disabled_if_in' source='agriates_member'> + <param>non</param> + <target type='variable'>dns_rvp_alias_eth4</target> + </condition> + <condition name='disabled_if_in' source='install_rvp'> + <param>non</param> + <target type='variable'>dns_rvp_eth4</target> + <target type='variable'>dns_rvp_alias_eth4</target> + <target type='variable'>dns_rvp_vlan_eth4</target> + </condition> + <condition name='disabled_if_in' source='vlan_eth4'> + <param>non</param> + <target type='variable'>dns_rvp_vlan_eth4</target> + <target type='variable'>dns_forward_vlan_eth4</target> + </condition> + <condition name='disabled_if_in' source='agriates_member'> + <param>non</param> + <target type='variable'>dns_rvp_vlan_eth4</target> + </condition> + <condition name='disabled_if_in' source='activer_route'> + <param>non</param> + <target type='variable'>dns_route</target> + <target type='variable'>dns_rvp_route</target> + <target type='variable'>dns_forward_route</target> + </condition> + <condition name='disabled_if_in' source='agriates_member'> + <param>non</param> + <target type='variable'>dns_rvp_route</target> + </condition> + <condition name='disabled_if_in' source='install_rvp'> + <param>non</param> + <target type='variable'>dns_rvp_route</target> + </condition> + <condition name='disabled_if_in' source='agriates_member'> + <param>non</param> + <target type='variable'>nom_zone_forward_rvp</target> + </condition> + </constraints> + + <help> + <family name='zones-dns'>Personnalisation des zones DNS</family> + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-dns/files/etc/logrotate.d/named b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dns/files/etc/logrotate.d/named new file mode 100644 index 0000000000000000000000000000000000000000..795bd79774831ab8382915c9c21b3babc305f32f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dns/files/etc/logrotate.d/named @@ -0,0 +1,7 @@ +/var/log/rsyslog/local/named/*.log { + rotate 52 + missingok + notifempty + weekly + compress +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-dns/files/usr/share/eole/diagnose/151-dns b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dns/files/usr/share/eole/diagnose/151-dns new file mode 100644 index 0000000000000000000000000000000000000000..2b4b8e97cec110c4a929234740c4ac2d0d52bc87 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dns/files/usr/share/eole/diagnose/151-dns @@ -0,0 +1,11 @@ +#!/bin/bash +. /usr/lib/eole/diagnose.sh + +EchoGras "*** DNS local" +container_ip_dns=$(CreoleGet container_ip_dns) +for dnsname in $(CreoleGet test_distant_domaine); do + TestDns $container_ip_dns $dnsname + [ $? = 0 ] && break +done +echo +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-dns/files/usr/share/eole/sbin/gen_dns b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dns/files/usr/share/eole/sbin/gen_dns new file mode 100644 index 0000000000000000000000000000000000000000..7293433e5a5a2849dee7ab46f292ac7915f743e4 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dns/files/usr/share/eole/sbin/gen_dns @@ -0,0 +1,236 @@ +#!/bin/bash +########################################################### +# gen_dns +# generation de named.conf et des fichiers de zone pour bind +############################################################ + +. /usr/lib/eole/ihm.sh + +container_path_dns="$(CreoleGet container_path_dns)" +nom_domaine_local=$(CreoleGet nom_domaine_local) +nom_domaine_local_supp=$(CreoleGet nom_domaine_local_supp) +nom_zone_forward=$(CreoleGet nom_zone_forward "") +ip_dns_zone_forward=$(CreoleGet ip_dns_zone_forward "") + +declare -a VLAN_ID=('') +declare -a VLAN_Network=('') +declare -a VLAN_Netmask=('') +declare -a Cmd_supp=('') +declare -a DOMAINNAME_SUPP=('') + +# Ajout des droits pour bind (#5342) +chmod g+w $container_path_dns/etc/bind + +# On fait le ménage des fichiers de zones (db.* sauf db.root) +declare -a DB_FILES=(`ls $container_path_dns/etc/bind/db.*`) +rm -f ${DB_FILES[*]#$container_path_dns/etc/bind/db.root} + +ZONESCONF=$container_path_dns/etc/bind/local.zones +ZONESCONF_SUPP=$container_path_dns/etc/bind/local_supp.zones +TMP_BIND_DIR=/tmp/tmp_bind +HOSTS=/etc/hosts +TMP_HOSTS=/tmp/hosts +# Suppression de localhost dans le HOSTFILE pour éviter les warnings +grep -v "^127\.0\.0\.1" $HOSTS > $TMP_HOSTS + +declare -i I Max nb_int +cd $container_path_dns/etc/bind +if [ "$container_path_dns" = "" ]; then + MACHINNAME=$(CreoleGet nom_machine) +else + MACHINNAME=`echo $container_path_dns|awk -F/ '{ print $(NF-1) }'` +fi +DOMAINNAME=$MACHINNAME.$nom_domaine_local +if [ "${system_mail_to}" == "" ] +then + system_mail_to="root"; +fi + +# Gestion de délégation de sous-domaines +NOM_ZONE_FORWARD=($nom_zone_forward) +IP_DNS_ZONE_FORWARD=($ip_dns_zone_forward) +NB_ZONE_FORWARD=${#NOM_ZONE_FORWARD[*]} +subdomain="" +if [ ! $NB_ZONE_FORWARD -eq 0 ] +then + # Prise en compte des éventuels sous-domaines + for ((i=0; i < $NB_ZONE_FORWARD; i+=1)) + do + if [[ "${NOM_ZONE_FORWARD[i]}" == *"${nom_domaine_local}"* ]] + then + # Option pour ne générer qu'un CNAME si une entrée de ce sous-domaine existe dans le fichier hosts + subdomain="-c ${NOM_ZONE_FORWARD[i]} ${subdomain}" + + # Ajout de la délégation DNS pour le sous-domaine + echo """\$ORIGIN ${NOM_ZONE_FORWARD[i]}. +\$TTL 86400 +@ IN NS dns${NOM_ZONE_FORWARD[i]}.""" >> db.subdomain.$nom_domaine_local + + # Ajout de l'entrée du serveur DNS dans le fichier hosts temporaire + echo "${IP_DNS_ZONE_FORWARD[i]} dns${NOM_ZONE_FORWARD[i]}" >> $TMP_HOSTS + fi + done +fi + +# Extraction du DN sans le dernier label +DB_FILENAME="db.$(echo $nom_domaine_local | rev | cut -d"." -f2- | rev)" +if [ "$subdomain" == "" ] +then + # Pas de sous-domaine à déléguer + Cmd="/usr/share/eole/sbin/h2n -h $MACHINNAME -d $nom_domaine_local db=$DB_FILENAME mode=D -s $DOMAINNAME -u $system_mail_to -H $TMP_HOSTS" + +else + # Prise en compte des sous-domaines à déléguer + Cmd="/usr/share/eole/sbin/h2n -h $MACHINNAME -d $nom_domaine_local db=$DB_FILENAME spcl=db.subdomain.$nom_domaine_local mode=D $subdomain -s $DOMAINNAME -u $system_mail_to -H $TMP_HOSTS" +fi + +DOMAIN_LOCAL_SUPP=($nom_domaine_local_supp) +NB_DOMAINNAME_SUPP=${#DOMAIN_LOCAL_SUPP[*]} +if [ ! $NB_DOMAINNAME_SUPP -eq 0 ] +then + # Prise en compte des éventuels domaines supplémentaires + for ((i=0; i < $NB_DOMAINNAME_SUPP; i+=1)) + do + DOMAINNAME_SUPP[i]=$MACHINNAME.${DOMAIN_LOCAL_SUPP[i]} + # Extraction du DN sans le dernier label + DB_FILENAME="db.$(echo ${DOMAIN_LOCAL_SUPP[i]} | rev | cut -d"." -f2- | rev)" + Cmd_supp[i]="/usr/share/eole/sbin/h2n -h $MACHINNAME -d ${DOMAIN_LOCAL_SUPP[i]} db=$DB_FILENAME mode=D -s ${DOMAINNAME_SUPP[i]} -u $system_mail_to -H $TMP_HOSTS" + done +fi + +Max=`expr $(CreoleGet nombre_interfaces) - 1` +I=0 +while [ $I -le $Max ] +do + Master="$(CreoleGet dns_master_eth${I} 2>/dev/null)" + if [ "${Master}" == "oui" -o "$I" == "0" ] + then + Network=$(CreoleGet adresse_network_eth${I}) + Netmask=$(CreoleGet adresse_netmask_eth${I}) + Cmd=$Cmd" -n ${Network}:${Netmask}" + if [ ! $NB_DOMAINNAME_SUPP -eq 0 ] + then + for ((i=0; i < $NB_DOMAINNAME_SUPP; i+=1)) + do + Cmd_supp[i]=${Cmd_supp[i]}" -n ${Network}:${Netmask} " + done + fi + # Zones pour les éventuels VLAN + VLAN=$(CreoleGet vlan_eth${I}) + if [ "$VLAN" == "oui" ] + then + VLAN_ID=($(CreoleGet vlan_id_eth${I})) + VLAN_Network=($(CreoleGet vlan_network_eth${I})) + VLAN_Netmask=($(CreoleGet vlan_netmask_eth${I})) + NB_VLAN=${#VLAN_ID[*]} + for ((id=0; id < $NB_VLAN; id+=1)) + do + Cmd=$Cmd" -n ${VLAN_Network[id]}:${VLAN_Netmask[id]}" + if [ ! $NB_DOMAINNAME_SUPP -eq 0 ] + then + for ((i=0; i < $NB_DOMAINNAME_SUPP; i+=1)) + do + Cmd_supp[i]=${Cmd_supp[i]}" -n ${VLAN_Network[id]}:${VLAN_Netmask[id]}" + done + fi + done + fi + fi + I=$I+1 +done +if [ ! "$container_path_dns" = "" ]; then + #mode conteneur + adresse_network_br0=$(CreoleGet adresse_network_br0) + adresse_netmask_br0=$(CreoleGet adresse_netmask_br0) + Cmd=$Cmd" -n $adresse_network_br0:$adresse_netmask_br0" + if [ ! $NB_DOMAINNAME_SUPP -eq 0 ] + then + for ((i=0; i < $NB_DOMAINNAME_SUPP; i+=1)) + do + Cmd_supp[i]=${Cmd_supp[i]}" -n $adresse_network_br0:$adresse_netmask_br0" + done + fi +fi + +Cmd=$Cmd" -M +c $ZONESCONF mode=S -y -b $ZONESCONF -W /etc/bind/ -I warn" +if [ ! $NB_DOMAINNAME_SUPP -eq 0 ] +then + Cmd=$Cmd" -e ${DOMAIN_LOCAL_SUPP[*]}" + for ((i=0; i < $NB_DOMAINNAME_SUPP; i+=1)) + do + # On exclut tous les domaines sauf celui en cours + EXCLUDED_DOMAINS=${DOMAIN_LOCAL_SUPP[*]#${DOMAIN_LOCAL_SUPP[i]}} + Cmd_supp[i]=${Cmd_supp[i]}" -M +c $ZONESCONF_SUPP mode=S -y -b $ZONESCONF_SUPP -W /etc/bind/ -e $nom_domaine_local ${EXCLUDED_DOMAINS} -I warn" + done +fi + +# routes statiques +if [ $(CreoleGet activer_route) = "oui" ];then + route_adresse=$(CreoleGet route_adresse) + route_netmask=$(CreoleGet route_netmask) + routes=`echo $route_adresse | wc -w` + if [ $routes -gt 0 ];then + adresse=($route_adresse) + netmask=($route_netmask) + for index in `eval echo "{0..$((routes-1))}"`; do + Cmd=$Cmd" -n ${adresse[$index]}:${netmask[$index]} mode=S" + if [ ! $NB_DOMAINNAME_SUPP -eq 0 ] + then + for ((i=0; i < $NB_DOMAINNAME_SUPP; i+=1)) + do + Cmd_supp[i]=${Cmd_supp[i]}" -n ${adresse[$index]}:${netmask[$index]} mode=S" + done + fi + done + fi +fi +# Création des zones pour le domaine local +$Cmd > /dev/null 2>&1 +[ ! $? -eq 0 ] && EchoRouge "ERREUR : pour plus d'information, lancer la commande \"$Cmd\" manuellement" && exit 1 +if [ ! $NB_DOMAINNAME_SUPP -eq 0 ] +then + ZONESDIR=$(dirname $ZONESCONF) + for ((i=0; i < $NB_DOMAINNAME_SUPP; i+=1)) + do + # Création des zones pour les domaines locaux supplémentaires + # dans un répertoire temporaire pour ne pas écraser les existantes + mkdir $TMP_BIND_DIR && cd $TMP_BIND_DIR + ${Cmd_supp[i]} > /dev/null 2>&1 + [ ! $? -eq 0 ] && EchoRouge "ERREUR : pour plus d'information, lancer la commande \"${Cmd_supp[i]}\" manuellement" && exit 1 + cat $ZONESCONF_SUPP >> $ZONESCONF + + for TMP_DB_FILE in `ls $TMP_BIND_DIR/db.*` + do + # Concaténation et copie des fichiers de zones au bon endroit + DB_FILE=$(basename $TMP_DB_FILE) + DB_FULL_FILENAME=$ZONESDIR/$DB_FILE + LEFT_DN_LABEL="db.$(echo ${DOMAIN_LOCAL_SUPP[i]} | rev | cut -d"." -f2- | rev)" + + if [ "$DB_FILE" = "$LEFT_DN_LABEL" ] + then + # Si fichier domaine, on le déplace + mv $TMP_DB_FILE $DB_FULL_FILENAME + else + # Si fichier zone + if [ -e "$DB_FULL_FILENAME" ] + then + # On concatène les PTR uniquement avec celui existant + grep -P "\tPTR\t" $TMP_DB_FILE >> $DB_FULL_FILENAME + else + # On le déplace si nouvelle zone + mv $TMP_DB_FILE $DB_FULL_FILENAME + fi + fi + done + rm -rf $TMP_BIND_DIR + cd - > /dev/null + done +fi +# On conserve uniquement les lignes de zones +# et on supprime les doublons +sed -n -e "/^zone/p" $ZONESCONF > $ZONESCONF_SUPP +cat $ZONESCONF_SUPP | sort | uniq > $ZONESCONF +rm -f $ZONESCONF_SUPP $TMP_HOSTS +cp -f "$container_path_dns/etc/bind/db.root" "$container_path_dns/etc/bind/db.cache" + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-dns/files/usr/share/eole/sbin/h2n b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dns/files/usr/share/eole/sbin/h2n new file mode 100644 index 0000000000000000000000000000000000000000..ecae51b4fdf355659cd6c34b200d93ff81ae49f2 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dns/files/usr/share/eole/sbin/h2n @@ -0,0 +1,11685 @@ +#!/usr/bin/perl +# +# Originally written by Paul Albitz and Ken Stone of Hewlett Packard +# h2n-hp,v 1.96 1999/12/02 22:05:56 milli (Michael Milligan), Hewlett-Packard +# Extended to v 2.56 2004-03-31 by Andris Kalnozols, HP Labs +# +# NAME +# +# h2n - Translate host table to name server file format +# +# SYNOPSIS +# +# h2n -d DOMAIN -n NET -u CONTACT [options] +# + +use Cwd; # for calling `getcwd' +use FileHandle; # for calling `autoflush' +use Symbol; # for calling `qualify' +use Sys::Hostname; # for calling `hostname' + +# Various defaults +# +my $VERSION = "2.56"; +my $Program = $0; + $Program =~ s/.*\///; +my $Host = hostname(); +my $do_aliases = 1; +my $do_mx = 1; +my $do_zone_apex_mx = 0; +my $do_wks = 0; +my $do_txt = 0; +my $do_rp = 0; +my $Bootfile = "./named.boot"; +my $Conffile = "./named.conf"; +my $new_fmt_Conffile = 0; +my $Conf_prefile = ""; +my $Hostfile = "/etc/hosts"; +my $Commentfile = ""; +my $Pwd = getcwd(); +my $Bwd = ""; +my $Domain = ""; +my $Domainfile = ""; +my $RespHost = ""; +my $RespUser = ""; +my $DefSerial = 1; +my $DefRefresh = "3H"; +my $DefRetry = "1H"; +my $DefExpire = "1W"; +my $DefNegCache = "10M"; +my $DefTtl = "1D"; +my $need_numeric_ttl = 0; +my $DefMxWeight = 10; +my $Defsubnetmask = "255.255.255.0"; +my $Supernetting_enabled = 0; +my $ForceSerial = -1; +my $UseDateInSerial = 0; +my $DateSerial = 0; +my $Print_sequence = 0; +my $Open_DB_files = 0; +my $Open_file_limit = 120; +my $verbose = 1; +my $line_num = 0; +my $show_host_line = 0; +my $gen_count = 0; +my $CustomLogging = 0; +my $CustomOptions = 0; +my $NeedHints = 1; +my $multi_homed_mode = ""; +my $check_level = "audit"; +my $rfc952 = 0; # NOTE: Don't set true unless $rfc1123 is also true. +my $rfc1123 = 1; +my $rfc2308 = 1; # New default as of version 2.40 +my $rfc2782 = 0; +my $audit = 1; # DNS auditing is independent of RFC name checking. +my $DefAction = "Warning"; # Default action to take if hostnames aren't perfect. +my $Load_Status = 0; # Set true by READ_RRs() if BIND won't load the zone. +my $newline_printed = 0; +my $preserve_case = 0; +my $verify_mode = 0; +my $recursive_verify = 0; +my $verify_delegations = 1; +my $show_chained_cnames = 0; +my $debug = 0; +my $debug_DIR = "/tmp"; +my $valid_SOA_timers = 1; +my $localhost = "127.0.0.1"; +my $MakeLoopbackSOA = 1; +my $MakeLoopbackZone = 1; +my $nameset = ""; +my $rcfile = ""; + +# The following two data items are used in verify mode to create a sorted +# list of best possible name servers from which a zone transfer is requested. +# This helps to avoid unnecessary delays by trying name servers on local +# networks first. +# +# * The "@local_networks" array should be initialized to the list of +# network(s) (in CIDR format) to which the localhost is connected, +# e.g., a dual-homed localhost should have two entries in this array. +# * The "@local_subnetmasks" array should be initialized to the subnet +# mask(s) which correspond to the network(s) in "@local_networks". +# +my @local_networks = ("0/0"); # Set default network and mask +my @local_subnetmasks = ("0.0.0.0"); # for universal connectivity. + +# The `h2n' program calls two external utilities, `DiG' and `check_del', +# to make various DNS queries. The following two variables hold their +# filenames. If not qualified with a pathname, the filename is expected +# to be found in the environment's search path, e.g., if `h2n' is run +# via cron(1M), the default PATH is usually "/usr/bin:/usr/sbin:.". +# +my $DiG = "/usr/local/bin/dig"; +my $check_del = "/usr/local/bin/check_del"; + +# The DiG utility is rather patient in the time it will wait for a +# response before giving up on a name server in an NS RRset (4 seconds +# for versions 2-8.X and 5 seconds for 9.X versions). It's also +# rather generous in the number of times each name server is retried +# (4 times for 2-8.X versions and 3 times for 9.X versions). +# There is a potential for significant delays when auditing domain +# names that point to unreachable name servers. The following two +# variables allow these DiG parameters to be customized. +# +my $DiG_timeout = 4; +my $DiG_retries = 2; + +# The above six data items that were just initialized can be +# overridden by a special configuration file that the READ_RCFILE +# subroutine will look for a bit later. + +# To increase the processing speed of the READ_RRs subroutine, arrange the +# set of recognized RR types in order of decreasing frequency, i.e., +# the most common types of RRs should appear first. There can be up to +# a 7% speed difference between best-case and worst-case ordering. +# NOTE: * Per RFC-1035, the NULL RR is not allowed in master files and, +# thus, the NULL RR is deliberately not recognized. +# * Per RFC-1123, the obsolete MD and MF RR types are deliberately +# not recognized. +# * The meta-RRs OPT (RFC-2671), TSIG (RFC-2845), and TKEY (RFC-2930) +# are recognized in case they appear in the output of utilities +# such as DiG which this program may use. +# +my $RRtypes = "MX|A|CNAME|PTR|NS|AAAA|HINFO|RP|TXT|SRV|SOA|A6|M[BGR]|" + . "MINFO|NSAP|NSAP-PTR|AFSDB|RT|ISDN|X25|PX|NAPTR|LOC|CERT|" + . "SIG|KEY|NXT|KX|DNAME|DS|WKS|EID|NIMLOC|ATMA|GPOS|APL|SINK|" + . "TSIG|OPT|TKEY"; + +# Construct a table of BIND versions that are vulnerable to various bugs +# according to < http://www.isc.org/products/BIND/bind-security.html >. +# A warning will be displayed anytime `h2n' detects one of these versions. +# NOTE: The GET_BIND_VERSION() subroutine will also determine if any +# of the following bugs should be reported as possibly present: +# +# DoS internal consistency check +# libbind buffer overflow +# OpenSSL buffer overflow +# BIND: Remote Execution of Code +# BIND: Multiple Denial of Service +# LIBRESOLV: buffer overrun +# +my %BIND_bug_index = ( + '4.8' => 'infoleak', + '4.8.1' => 'infoleak', + '4.8.2.1' => 'infoleak', + '4.8.3' => 'infoleak', + '4.9.3' => 'complain infoleak', + '4.9.4' => 'complain infoleak', + '4.9.4-P1'=> 'complain infoleak', + '4.9.5' => 'sig naptr maxdname complain infoleak', + '4.9.5-P1'=> 'sig naptr maxdname complain infoleak', + '4.9.6' => 'sig naptr maxdname complain infoleak', + '4.9.7' => 'naptr maxdname complain infoleak', + '4.9.8' => 'naptr maxdname', + '8.1' => 'sig naptr maxdname solinger fdmax infoleak', + '8.1.1' => 'sig naptr maxdname solinger fdmax infoleak', + '8.1.2' => 'naptr maxdname solinger fdmax infoleak', + '8.2' => 'sigdiv0 srv nxt sig naptr maxdname solinger fdmax infoleak tsig', + '8.2-P1' => 'sigdiv0 srv nxt sig naptr maxdname solinger fdmax infoleak tsig', + '8.2.1' => 'sigdiv0 srv nxt sig naptr maxdname solinger fdmax infoleak tsig', + '8.2.2' => 'zxfr sigdiv0 srv naptr maxdname infoleak tsig', + '8.2.2-P1'=> 'zxfr sigdiv0 srv naptr maxdname infoleak tsig', + '8.2.2-P2'=> 'zxfr sigdiv0 srv infoleak tsig', + '8.2.2-P3'=> 'zxfr sigdiv0 srv infoleak tsig', + '8.2.2-P4'=> 'zxfr sigdiv0 srv infoleak tsig', + '8.2.2-P5'=> 'zxfr sigdiv0 srv infoleak tsig', + '8.2.2-P6'=> 'zxfr srv infoleak tsig', + '8.2.2-P7'=> 'infoleak tsig', + '8.2.3-T' => 'tsig' +); + +# URLs that document the above-mentioned BIND bugs +# +my $CERT_URL_bugs = "< http://www.cert.org/advisories/CA-2001-02.html >"; +my $CERT_URL_DoS = "< http://www.cert.org/advisories/CA-2002-15.html >"; +my $CERT_URL_libbind = "< http://www.cert.org/advisories/CA-2002-19.html >"; +my $CERT_URL_openssl = "< http://www.cert.org/advisories/CA-2002-23.html >"; +my $CERT_URL_buf_DoS = "< http://www.cert.org/advisories/CA-2002-31.html >"; +my $ISC_URL = "< http://www.isc.org/products/BIND/bind-security.html >"; + +my ($BIND_ver_msg, $BIND_version, $BIND_version_num, $Bootsecaddr); +my ($Bootsecsaveaddr, $Confsecaddr, $Confsecsaveaddr, $DiG_bufsize); +my ($DiG_version_num, $Domainpattern, $Expire, $MasterTtl, $NewSerial); +my ($Refresh, $Retry, $SOA_count, $Search_dir, $Serial, $Specialfile, $Ttl); +my ($UseDefaultDomain, $User); +my ($action, $addr, $addrpattern, $alias, $cDomain, $canonical, $cmode); +my ($comment, $common_alias, $continue_search, $data, $data_fname); +my ($debug_BIND_version, $default_PTR, $error, $first_IP, $ignore_c_opt, $key); +my ($last_IP, $last_octet, $make_rr, $match, $message, $names, $netpat); +my ($pDomain, $pmode, $ptr_file, $ptr_owner, $ptr_template, $ptrpat); +my ($reformatted_line, $show_nxdomain_cnames, $soa_warned, $tmp, $tmp_rfc952); +my ($ttl, $uqdn, $zone_file, $zone_name); +my (%Aliases, %AliasesPTR, %Apex_RRs, %Apex_aliases, %Apex_route_RRs); +my (%CommentRRs, %Comments, %DB_filehandle, %Hosts, %HostsPTR, %LRUtable); +my (%MasterZoneOptions, %MXlist, %NSowners, %NSlist, %Net_ranges, %Net_zones); +my (%PartialServers, %RRowners, %SlaveZoneOptions, %Ttl, %Wildcards, %cAliases); +my (%cModeSpec, %cpatrel, %deferredPTR, %ePatExceptions, %extNS, %pModeSpec); +my (%pPTR, %pendingPTR, %ptrpatrel, %spclAFSDB, %spclCNAME, %spclPTR, %spclRP); +my (%spclRT, %spclSRV); +my (@BootOptions, @ConfLogging, @ConfOptions, @DNSrrset, @FullServers); +my (@GlobalMasterZoneOptions, @GlobalSlaveZoneOptions, @MX, @Vdomains); +my (@addrs, @aliases, @bootmsgs, @cpats, @elimpats, @makesoa, @our_addrs); +my (@our_netbits, @our_nets, @our_subnetmasks, @our_subnets, @ptrpats); + +autoflush STDOUT 1; # Allows single-character output w/o newline. +autoflush STDERR 1; # Keeps STDERR output synchronized with STDOUT. + +&READ_RCFILE; # a way to override various built-in defaults +&PARSE_ARGS(@ARGV); # overrides any options found in a CONF file +&FIXUP; + +if ($DiG_version_num == 90000 && ($verify_mode || $audit)) { + ($message = <<EOT) =~ s/^\s+\|//gm; + | + |The DiG utility found by `h2n' is version 9.0. It is unsupported + |due to its inability to echo batch file input. Please replace it + |with another version of DiG from either BIND 8 or the most recent + |distribution of BIND 9. +EOT + unless ($verify_mode) { + $message .= "The auditing option has been disabled for this run.\n"; + $audit = 0; + } + print STDERR "$message\n"; + exit(2) if $verify_mode; +} +# NOTE: All versions of DiG 9.0.1, while usable by `h2n', have a small +# defect whereby the command line is not echoed whenever any kind of +# name server connection failure is encountered. The AUDIT_RRs() +# subroutine treats these detected cases as a general synchronization +# failure when parsing the output from DiG and will generate a status +# of "[sync. error ]" for the queried domain name. +# + +if ($verify_mode) { # If called with -V + &VERIFY_ZONE; + exit 0; +} + +if (!$rfc2308 || $BIND_version_num < 80201) { + # + # When in doubt, convert time intervals that may be in symbolic + # notation to the equivalent number of seconds. This is the + # universally understood format. + # + $need_numeric_ttl = 1; + $DefRefresh = &SECONDS($DefRefresh); + $DefRetry = &SECONDS($DefRetry); + $DefExpire = &SECONDS($DefExpire); + $DefNegCache = &SECONDS($DefNegCache); + $DefTtl = &SECONDS($DefTtl); + $Refresh = &SECONDS($Refresh) if $Refresh; + $Retry = &SECONDS($Retry) if $Retry; + $Expire = &SECONDS($Expire) if $Expire; + $Ttl = &SECONDS($Ttl) if $Ttl; + $MasterTtl = &SECONDS($MasterTtl) if $MasterTtl; +} + +if ($BIND_ver_msg) { + ($tmp = $RespHost) =~ s/\.$//; + $BIND_ver_msg =~ s/ See /See /; + $BIND_ver_msg =~ s/ </ </g; + print STDERR "\nWarning: $tmp (-h option) is running BIND $BIND_version.\n"; + print STDERR "This version of BIND may be vulnerable to the following bug(s):\n"; + print STDERR "$BIND_ver_msg\n\n"; +} + +print STDOUT "Initializing new database files...\n" if $verbose; +&INITDBs; + +if (-r $Specialfile) { + print STDOUT "Reading special file `$Specialfile'...\n" if $verbose; + # + # Make sure to disable checking of single-character hostnames and + # aliases since this RFC-952 restriction is limited to host files. + # + $tmp_rfc952 = $rfc952; + $rfc952 = 0; + + # The "$newline_printed" variable controls the printing of cosmetic + # newlines surrounding a block of warning messages that the + # READ_RRs subroutine may generate. "$newline_printed" is global + # in scope to prevent unwanted extra newlines in case READ_RRs is + # called recursively. If necessary, the initial newline is output + # within READ_RRs while the one or two terminating newline characters + # are printed after the subroutine returns to its original caller. + # + $newline_printed = &READ_RRs($Specialfile, "$Domain.", "$Domain.", + "$Domain.", 0); + if ($verbose) { + print STDERR "\n" while $newline_printed--; + } else { + $newline_printed = 0; + } + $rfc952 = $tmp_rfc952; +} + +print STDOUT "Reading host file `$Hostfile'...\n" if $verbose; +unless (open(*HOSTS, $Hostfile)) { + print STDERR "Couldn't open the host file: $!\n"; + print STDERR "Check your -H option argument.\n"; + print STDERR "I give up ... sorry.\n"; + exit(2); +} +LINE: while (<HOSTS>) { + $line_num++; + chop; # Remove the trailing newline. + next if /^#/ || /^$/; # Skip comments and empty lines. + ($data, $comment) = split('#', $_, 2); # Separate comments from the + $comment = "" unless defined($comment); # interesting bits. + ($addr, $names) = split(' ', $data, 2); # Isolate IP addr. from name(s). + if ($addr =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/) { + if (($4 > 255 || $3 > 255 || $2 > 255 || $1 > 255) + || $addr =~ /(^|\.)0\d/) { + $message = 1; + } else { + $message = 0; + } + } else { + $message = 1; + } + if ($message || $names =~ /^\s*$/) { + if ($verbose) { + print STDERR "Line $line_num: Skipping; incorrectly formatted data.\n"; + print STDERR "> $_\n"; + } + next LINE; + } + $names = lc($names) unless $preserve_case; + + # Match -e args + # + foreach $netpat (@elimpats) { + if ($names =~ /[.\s]$netpat/i) { + # + # If a -e domain happens to be a parent of the -d domain or + # a -c or -p domain, exit this loop and continue processing. + # Otherwise, fetch the next host file entry. + # + last if $names =~ /$ePatExceptions{$netpat}/i; + next LINE; + } + } + + if ($comment =~ /\[\s*ttl\s*=\s*(\d+|(\d+[wdhms])+)\s*\]/i) { + $ttl = $1; # set TTL if explicit + if ($need_numeric_ttl) { # and convert time + $ttl = &SECONDS($ttl); # format if necessary + } else { + $ttl = &SYMBOLIC_TIME($ttl); + } + } else { + $ttl = ""; # set TTL to implicit default + } + # Separate the canonical name from any aliases that follow. + # + ($canonical, @aliases) = split(' ', $names); + $error = &CHECK_NAME($canonical, 'A'); + if ($error) { + $action = ($error == 3) ? "Skipping" : $DefAction; + if ($verbose) { + print STDERR "Line $line_num: $action; `$canonical' not a valid canonical hostname.\n"; + if ($action eq "Skipping") { + print STDERR "> $_\n"; + } else { + $show_host_line = 1; + } + } + next LINE if $action eq "Skipping"; + } + $reformatted_line = 0; + + # Process -c arguments + # + # If a `spcl' file exists for the `-d' domain, it has already been read. + # The %RRowners hash now contains the discovered `spcl' and -T option + # domain names and will be used to prevent the creation of conflicting + # CNAMEs. + # Checks are also made to prevent the accidental creation of cross-domain + # wildcard CNAMEs in case "*" characters are lurking in the host table. + # NOTE: The "@cpats" array has been sorted by the FIXUP() subroutine so + # that the deepest subtrees of each domain will be matched before + # their ancestors in the domain tree. + # + $cmode = ""; + foreach $netpat (@cpats) { + if ($names =~ /\.$netpat/i) { + next LINE if $addr eq $localhost; + $cmode = $cModeSpec{$netpat}; + if ($cmode =~ /O/) { + # + # The matched domain is a parent domain of the default + # domain (-d option). Make sure to override -c option + # processing if the current host file entry also matches + # the -d option domain. + # + if ($names =~ /$Domainpattern/i) { + $cmode = ""; + last; + } + } + $cDomain = $cpatrel{$netpat}; + # + # Although the fully-qualified canonical host name is + # supposed to follow the IP address in a properly + # formatted host table, some sysadmins use the following + # style instead: + # + # 192.168.0.1 host1 host1.movie.edu alias1 alias2 ... + # + # We'll accommodate this idiosyncrasy by comparing the + # canonical host against the first alias. If the only + # difference is the default domain name, the name columns + # will be shifted to eliminate the redundancy. + # Another common formatting style is to have a fully-qualified + # canonical host name followed by the unqualified host name as + # the first alias. If this is the case, the redundant alias + # will be eliminated. + # + if (@aliases) { + $data = ($cmode =~ /I/) ? $Domain : $cDomain; + if (lc("$canonical.$data") eq lc($aliases[0])) { + $canonical = $aliases[0]; + shift(@aliases); + $reformatted_line = 1; + } + if (@aliases && lc($canonical) eq lc("$aliases[0].$data")) { + shift(@aliases); + $reformatted_line = 1; + } + } + ($uqdn = $canonical) =~ s/\.$netpat//i; + $ignore_c_opt = 0; + if ($comment =~ /\[\s*(no|ignore)\s*-c\s*\]/i) { + $ignore_c_opt = 1; + } elsif ($cmode !~ /D/) { + # + # Create CNAMEs now, not later. + # + if ($cmode =~ /I/) { + # + # Make the intra-zone domain name in the CNAME's RDATA + # field relative to the zone's origin (-d option). + # + $cDomain =~ s/$Domainpattern$//; + } else { + # + # Make the RDATA domain name absolute. + # + $cDomain .= "."; + } + if (exists($RRowners{$uqdn})) { + # + # Accommodate any DNSSEC-related RRs from a `spcl' + # file that are allowed to co-exist with CNAMEs + # per RFC-2065. + # + $match = $RRowners{$uqdn}; + 1 while $match =~ s/ (SIG|NXT|KEY) / /; + } else { + $match = " "; + } + if ($match eq " " && $uqdn !~ /^\*($|\.)/) { + &PRINTF(*DOMAIN, "%s%s\tCNAME\t%s.%s\n", &TAB($uqdn, 16), $ttl, $uqdn, $cDomain); + if (exists($RRowners{$uqdn})) { + $RRowners{$uqdn} .= "CNAME "; + } else { + $RRowners{$uqdn} = " CNAME "; + } + $data = $uqdn; + while ($data =~ /(\\[.]|[^.])*\./) { + # + # The UQDN consists of two or more labels. + # Register the interior labels in the %RRowners hash + # so that we can correctly distinguish between a + # non-existent domain name and a domain name with no + # DNS resource records during the auditing phase. + # + $data =~ s/(\\[.]|[^.])*\.//; # strip leading label + $RRowners{$data} = " " unless exists($RRowners{$data}); + } + } elsif ($match ne " " && $verbose) { + print STDERR "Line $line_num: Can't create CNAME for `$uqdn'; another RR exists.\n"; + $show_host_line = 1; + } + if ($cmode =~ /A/) { # also create CNAMEs for alias(es) + foreach $tmp (@aliases) { + ($alias = $tmp) =~ s/\.$netpat//i; + $make_rr = 1 unless $alias =~ /^\*($|\.)/; + $error = &CHECK_NAME($alias, 'CNAME'); + if ($error) { + $action = ($error == 3) ? "Skipping" : $DefAction; + if ($verbose) { + print STDERR "Line $line_num: $action; `$alias' not a valid hostname alias.\n"; + $show_host_line = 1; + } + $make_rr = 0 unless $action eq "Warning"; + } + if ($make_rr) { + if (exists($RRowners{$alias})) { + $match = $RRowners{$alias}; + 1 while $match =~ s/ (SIG|NXT|KEY) / /; + } else { + $match = " "; + } + if ($match eq " ") { + &PRINTF(*DOMAIN, "%s%s\tCNAME\t%s.%s\n", &TAB($alias, 16), $ttl, $uqdn, $cDomain); + if (exists($RRowners{$alias})) { + $RRowners{$alias} .= "CNAME "; + } else { + $RRowners{$alias} = " CNAME "; + } + $data = $alias; + while ($data =~ /(\\[.]|[^.])*\./) { + $data =~ s/(\\[.]|[^.])*\.//; + unless (exists($RRowners{$data})) { + $RRowners{$data} = " "; + } + } + } elsif ($verbose) { + print STDERR "Line $line_num: Can't create CNAME for `$alias'; another RR exists.\n"; + $show_host_line = 1; + } + } + } + } + + } else { + # + # Defer creation of CNAMEs + # + if (exists($RRowners{$uqdn})) { + $match = $RRowners{$uqdn}; + 1 while $match =~ s/ (SIG|NXT|KEY) / /; + } else { + $match = " "; + } + if ($match eq " " && $uqdn !~ /^\*($|\.)/) { + $cAliases{$uqdn} = "$uqdn $netpat $ttl"; + } elsif ($match ne " " && $cmode !~ /Q/ && $verbose) { + print STDERR "Line $line_num: Can't create CNAME for `$uqdn'; another RR exists.\n"; + $show_host_line = 1; + } + if ($cmode =~ /A/) { + foreach $tmp (@aliases) { + ($alias = $tmp) =~ s/\.$netpat//i; + $make_rr = 1 unless $alias =~ /^\*($|\.)/; + $error = &CHECK_NAME($alias, 'CNAME'); + if ($error) { + $action = ($error == 3) ? "Skipping" : $DefAction; + if ($verbose) { + print STDERR "Line $line_num: $action; `$alias' not a valid hostname alias.\n"; + $show_host_line = 1; + } + $make_rr = 0 unless $action eq "Warning"; + } + if ($make_rr) { + if (exists($RRowners{$alias})) { + $match = $RRowners{$alias}; + 1 while $match =~ s/ (SIG|NXT|KEY) / /; + } else { + $match = " "; + } + if ($match eq " ") { + $cAliases{$alias} = "$uqdn $netpat $ttl"; + } elsif ($cmode !~ /Q/ && $verbose) { + print STDERR "Line $line_num: Can't create CNAME for `$alias'; another RR exists.\n"; + $show_host_line = 1; + } + } + } + } + } + # Check if this was flagged as an intra-zone domain or + # if there is a matching -p argument. A check made in + # PARSE_ARGS() has ensured that both conditions can not + # be simultaneously true. + # + if ($cmode =~ /I/) { + $match = 1; + } else { + $match = 0; + foreach $ptrpat (@ptrpats) { + if ($names =~ /\.$ptrpat/i) { + $match = 1; + last; + } + } + } + unless ($match) { + if ($show_host_line) { + print STDERR "> $_\n"; + $show_host_line = 0; + } + next LINE; + } else { + last; # exit from the -c processing loop + } + } + } + + # Check that the address is covered by a -n or -a option. + # Search in the order of most specific network class to + # the least specific network class, i.e., + # + # 1. sub class-C (/25 to /32) + # 2. class C (/17 to /24) + # 3. class B (/9 to /16) + # 3. class A (/8) + # + $continue_search = 1; + ($data = $addr) =~ s/[.]\d+$//; + if (exists($Net_ranges{"$data.X"})) { + $netpat = $Net_ranges{"$data.X"}; + # + # The "$netpat" variable contains a list of IP address ranges or + # individual IP addresses that correspond to one or more /25 to + # /32 networks having the /24 network in "$data" as the common + # class-C parent network. Further searching is necessary to + # determine if there's a match with the last octet of current + # host entry's IP address. + # + $match = 0; + ($last_octet = $addr) =~ s/^.+[.]//; + foreach $tmp (split(' ', $netpat)) { + ($first_IP, $last_IP) = split(/-/, $tmp); + $last_IP = $first_IP unless defined($last_IP); + if ($last_octet >= $first_IP && $last_octet <= $last_IP) { + $ptr_file = $Net_ranges{"$data.$tmp"}; + $match = 1; + last; + } + } + $continue_search = 0 if $match || !$Supernetting_enabled; + } + if ($continue_search) { + # + # When finding a match for a class C, B, or A network, + # the "$ptr_file" variable can either be the null string + # (signifying a -a option) or it can be a file descriptor + # typeglob having "*" as the first character (-n option). + # + if (exists($Net_ranges{$data})) { + # + # A `-a/-n network/17-24' option was matched. + # + $ptr_file = $Net_ranges{$data}; + $match = 1; + } else { + # + # Remove another octet to see if the address matches + # a `-a/-n network/9-16' option, i.e., a class-B zone. + # + $data =~ s/[.]\d+$//; + if (exists($Net_ranges{$data})) { + $ptr_file = $Net_ranges{$data}; + $match = 1; + } else { + # + # Remove another octet to see if the address matches + # a `-a/-n network/8' option, i.e., a class-A zone. + # + $data =~ s/[.]\d+$//; + if (exists($Net_ranges{$data})) { + $ptr_file = $Net_ranges{$data}; + $match = 1; + } else { + $match = 0; + } + } + } + } + unless ($match) { + if ($verbose) { + print STDERR "Line $line_num: Skipping; IP not within range specified by -n/-a options.\n"; + if ($cmode =~ /I/ && !$ignore_c_opt) { + print STDERR "Dangling CNAME(s) may exist in the -d domain due to prior -c option processing.\n"; + } + print STDERR "> $_\n"; + $show_host_line = 0; + } + next LINE; + } + + if ($ptr_file) { + # + # A -n option has been matched. Separate the file handle for + # printing PTR zone data from the IP address template that is + # used for creating the relative owner name of the PTR record. + # + ($ptr_file, $ptr_template) = split(' ', $ptr_file, 2); + } + + # Process -p args + # NOTE: The "@ptrpats" array has been sorted by the FIXUP() subroutine + # so that the deepest subtrees of each domain will be matched + # before their ancestors in the domain tree. + # + foreach $netpat (@ptrpats) { + if ($names =~ /\.$netpat/i) { + next LINE if !$ptr_file || $addr eq $localhost + || $comment =~ /\[\s*no(\s*-*\s*)?ptr\s*\]/i; + $pmode = $pModeSpec{$netpat}; + if ($pmode =~ /O/) { + # + # The matched domain is a parent domain of the default + # domain (-d option). Make sure to override -p option + # processing if the current host file entry also matches + # the -d option domain. + # + last if $names =~ /$Domainpattern/i; + } + # + # Accommodate differing host table formats unless this has + # already been done by a previously matched -c option. + # + if (!$reformatted_line && @aliases) { + $pDomain = $ptrpatrel{$netpat}; + if (lc("$canonical.$pDomain") eq lc($aliases[0])) { + $canonical = $aliases[0]; + shift(@aliases); + } + if (@aliases && lc($canonical) eq lc("$aliases[0].$pDomain")) { + shift(@aliases); + } + } + unless ($canonical =~ /\.$netpat/i) { + if ($show_host_line) { + print STDERR "> $_\n"; + $show_host_line = 0; + } + next LINE; + } + # + # See the comments in the section for processing the -n option + # in PARSE_ARGS for an explanation on how the "/ee" modifier + # activates "$ptr_template" in the following substitution. + # + ($ptr_owner = $addr) =~ s/(\d+)\.(\d+)\.(\d+)\.(\d+)/$ptr_template/ee; + $canonical .= "." unless $canonical =~ /\.$/; + # + # This program has a feature for choosing how PTR records + # get generated for multi-homed hosts. They can either + # point to the multi-address canonical name (the default) + # or, alternatively, to the first unique single-address + # interface name. The default method allows us to create + # the PTR record immediately while the alternate method + # requires us to defer the PTR creation since it may not + # yet be known whether the current host has more than one + # address. + # + # We'll first determine how to set the $default_PTR flag + # based on the relevant conditions and exceptions that + # may be present with this host. Creation or deferral + # of the PTR record will then follow. + # + if (!@aliases || $pmode =~ /A/) { + # + # No aliases or a "mode=A" argument in the -p option means + # that there is no other choice but to use the canonical + # name as the RDATA field of the PTR record. + # NOTE: The "mode=A" argument overrides the `+m P' and `+m CP' + # options as well as the "[mh=p]" and "[mh=cp]" flags in + # the comment field of this host. + # + $default_PTR = 1; + } else { + # + # Test the status of any +m option that was specified + # and whether or not it is being overridden by a "[mh=??]" + # flag in the comment field. + # + unless ($multi_homed_mode =~ /P/) { + # + # Use the default PTR method unless overridden. + # + $default_PTR = ($comment =~ /\[\s*mh\s*=\s*(p|cp|pc)\s*\]/i) ? 0 : 1; + } else { + # + # Use the alternate PTR method unless overridden. + # NOTE: The absence of the "p" specification in the + # comment flag signifies an override condition. + # + $default_PTR = ($comment =~ /\[\s*mh\s*=\s*[cd]\s*\]/i) ? 1 : 0; + } + } + if ($default_PTR) { + # + # The PTR record must point to the canonical name + # and thus can be created immediately. + # + unless (exists($pPTR{$addr})) { + unless ($ptr_file eq *DOMAIN) { + &PRINTF($ptr_file, "%s%s\tPTR\t%s\n", &TAB($ptr_owner, 8), $ttl, $canonical); + $pPTR{$addr} = 1; + } elsif (exists($RRowners{$ptr_owner}) + && $RRowners{$ptr_owner} =~ / CNAME /) { + if ($verbose) { + print STDERR "Line $line_num: Can't create PTR for `$ptr_owner'; a CNAME RR exists.\n"; + $show_host_line = 1; + } + } else { + &PRINTF(*DOMAIN, "%s%s\tPTR\t%s\n", &TAB($ptr_owner, 16), $ttl, $canonical); + $pPTR{$addr} = 1; + if (exists($RRowners{$ptr_owner})) { + $RRowners{$ptr_owner} .= "PTR " unless $RRowners{$ptr_owner} =~ / PTR /; + } else { + $RRowners{$ptr_owner} = " PTR "; + } + $data = $ptr_owner; + while ($data =~ /(\\[.]|[^.])*\./) { + $data =~ s/(\\[.]|[^.])*\.//; + $RRowners{$data} = " " unless exists($RRowners{$data}); + } + } + } + } else { + # + # Defer the creation of the PTR record until it can be + # determined whether or not the canonical name is that + # of a multi-homed host. If so, the first non-common + # alias will have an Address record in the forward-mapping + # file and the PTR record will created to point to it + # instead of the canonical name. + # + unless (exists($HostsPTR{$canonical})) { + ($tmp = $netpat) =~ s/\\././g; + $HostsPTR{$canonical} = "$tmp "; + } + ($addrpattern = $addr) =~ s/\./\\./g; + unless ($HostsPTR{$canonical} =~ /\b$addrpattern /) { + # + # Add the new IP address to the hash of canonical names + # for PTR records and store the deferred PTR data. + # + $HostsPTR{$canonical} .= "$addr "; + $deferredPTR{"$canonical-$addr"} = "$ptr_file $ptr_owner $ttl"; + } + # Make sure that all aliases get indexed. + # + $AliasesPTR{"$canonical-$addr"} .= "@aliases "; + } + if ($show_host_line) { + print STDERR "> $_\n"; + $show_host_line = 0; + } + next LINE; + } + } + + # Accommodate differing host table formats unless this has + # already been done by a previously matched intra-zone + # -c option (mode=I). + # + if (!$reformatted_line && @aliases) { + if (lc("$canonical.$Domain") eq lc($aliases[0])) { + $canonical = $aliases[0]; + shift(@aliases); + } + if (@aliases && lc($canonical) eq lc("$aliases[0].$Domain")) { + shift(@aliases); + } + } + unless ($canonical =~ /$Domainpattern$/i || $UseDefaultDomain) { + if ($verbose) { + print STDERR "Line $line_num: Skipping `$canonical'.\nThe canonical name does not match the -d option.\n"; + print STDERR "> $_\n"; + $show_host_line = 0; + } + next LINE; + } else { + $canonical =~ s/$Domainpattern$//i; # strip off domain if present + if (exists($Hosts{$canonical})) { + ($addrpattern = $addr) =~ s/\./\\./g; + unless ($Hosts{$canonical} =~ /\b$addrpattern /) { + # + # The above check prevents the creation of duplicate + # Address and PTR records. Now go ahead and index the + # address by canonical name. + # + $Hosts{$canonical} .= "$addr "; + $addrpattern = ""; + } + } else { + # + # This is the first IP address for this host. + # + $Hosts{$canonical} = "$addr "; + $addrpattern = ""; + $data = $canonical; + while ($data =~ /(\\[.]|[^.])*\./) { + $data =~ s/(\\[.]|[^.])*\.//; + $RRowners{$data} = " " unless exists($RRowners{$data}); + } + } + # Index aliases by name and address. + # + $Aliases{"$canonical-$addr"} .= "@aliases "; + $Comments{"$canonical-$addr"} .= $comment; + if ($ttl) { + if (exists($Ttl{$canonical})) { + if (&SECONDS($ttl) < &SECONDS($Ttl{$canonical})) { + $Ttl{$canonical} = $ttl; + } + if ($verbose) { + print STDERR "Line $line_num: Hmm, another TTL spec for `$canonical', using lowest value ($Ttl{$canonical}).\n"; + $show_host_line = 1; + } + } else { + $Ttl{$canonical} = $ttl; + } + } + if ($ptr_file && $addrpattern eq "" && $addr ne $localhost + && $comment !~ /\[\s*no(\s*-*\s*)?ptr\s*\]/i) { + # + # Construct the data for the PTR record. See the comments + # in the section for processing the -n option in PARSE_ARGS + # for an explanation on how the "/ee" modifier activates + # "$ptr_template" in the following substitution. + # + ($ptr_owner = $addr) =~ s/(\d+)\.(\d+)\.(\d+)\.(\d+)/$ptr_template/ee; + unless (@aliases && $do_aliases) { + # No aliases or the -A option being in effect means + # that there is no other choice but to use the canonical + # name as the RDATA field of the PTR record. + # NOTE: The -A option overrides the `+m P' and `+m CP' + # options as well as the "[mh=p]" and "[mh=cp]" + # flags in the comment field of this host. + # + $default_PTR = 1; + } else { + unless ($multi_homed_mode =~ /P/) { + $default_PTR = ($comment =~ /\[\s*mh\s*=\s*(p|cp|pc)\s*\]/i) ? 0 : 1; + } else { + $default_PTR = ($comment =~ /\[\s*mh\s*=\s*[cd]\s*\]/i) ? 1 : 0; + } + } + if ($default_PTR) { + unless ($ptr_file eq *DOMAIN) { + &PRINTF($ptr_file, "%s%s\tPTR\t%s.%s.\n", &TAB($ptr_owner, 8), $ttl, $canonical, $Domain); + } elsif (exists($RRowners{$ptr_owner}) + && $RRowners{$ptr_owner} =~ / CNAME /) { + if ($verbose) { + print STDERR "Line $line_num: Can't create PTR for `$ptr_owner'; a CNAME RR exists.\n"; + $show_host_line = 1; + } + } else { + &PRINTF(*DOMAIN, "%s%s\tPTR\t%s\n", &TAB($ptr_owner, 16), $ttl, $canonical); + if (exists($RRowners{$ptr_owner})) { + $RRowners{$ptr_owner} .= "PTR " unless $RRowners{$ptr_owner} =~ / PTR /; + } else { + $RRowners{$ptr_owner} = " PTR "; + } + $data = $ptr_owner; + while ($data =~ /(\\[.]|[^.])*\./) { + $data =~ s/(\\[.]|[^.])*\.//; + $RRowners{$data} = " " unless exists($RRowners{$data}); + } + } + } else { + $deferredPTR{"$canonical-$addr"} = "$ptr_file $ptr_owner $ttl"; + } + } + } + if ($show_host_line) { + print STDERR "> $_\n"; + $show_host_line = 0; + } +} +close(*HOSTS); + +if ($Commentfile) { + print STDOUT "Reading comments file `$Commentfile'...\n" if $verbose; + unless (&OPEN(*F, $Commentfile)) { + print STDERR "Unable to open the comments file': $!\n"; + print STDERR "Check your -C option argument.\n"; + print STDERR "I give up ... sorry.\n"; + exit(2); + } + while (<F>) { + chop; + ($key, $comment) = split(':', $_, 2); + $CommentRRs{$key} = $comment; + } + &CLOSE(*F); +} + +print STDOUT "Writing database files...\n" if $verbose; + +# Go through the list of canonical names. +# If there is more than one address associated with a name, it is a +# multi-homed host. Special checks are made for the generation of +# A and/or CNAME RRs for multi-homed hosts in the CNAME() subroutine. +# +# Since the %Hosts hash may be quite large, do not call the keys() +# function in a list context. To do so would incur unnecessary +# overhead in both time and memory space when every hash key is +# slurped into the list at once. Instead, the each() function will +# be used to access the hash keys and elements one by one. +# It's imperative, however, to first call keys() in a scalar context +# in order to reset the internal hash iterator. Otherwise, data might +# be missed if the each() function doesn't start accessing the hash +# from the beginning. +# +scalar(keys(%Hosts)); +while (($canonical, $data) = each %Hosts) { + @addrs = split(' ', $data); + + $ttl = (defined($Ttl{$canonical})) ? $Ttl{$canonical} : ""; + foreach $addr (@addrs) { + # + # Print address record(s) for the canonical name. + # + if (exists($RRowners{$canonical}) && $RRowners{$canonical} =~ / CNAME /) { + print STDERR "Can't create A record for `$canonical' due to an existing CNAME RR.\n" if $verbose; + } elsif ($addr ne $localhost) { + &PRINTF(*DOMAIN, "%s%s\tA\t%s\n", ($canonical eq $nameset ? "\t\t" : &TAB($canonical, 16)), $ttl, $addr); + $nameset = $canonical; + } + } + if ($do_mx) { + &MX($canonical, @addrs); + } + if ($do_txt) { + &TXT($canonical, @addrs); + } + if ($Commentfile) { + &DO_COMMENTS($canonical, @addrs); + } + if ($do_rp) { + &RP($canonical, @addrs); + } + if ($do_aliases) { + &CNAME($canonical, @addrs); + } + if (exists($cAliases{$canonical})) { + # + # RRs for the default domain take precedence over identically-named + # CNAMEs requested by a -c option with "mode=D". + # Prevent the generation of an illegal duplicate DNS record by + # removing it from the deferred list. + # + ($tmp, $netpat, $tmp) = split(' ', $cAliases{$canonical}, 3); + $cmode = $cModeSpec{$netpat}; + print STDERR "Can't create CNAME for `$canonical.$cpatrel{$netpat}'; another RR exists.\n" if $verbose && $cmode !~ /Q/; + delete($cAliases{$canonical}); + } +} + +if (keys(%cAliases)) { + # + # The deferred set of non-conflicting CNAMEs can finally be created. + # + while (($alias, $data) = each %cAliases) { + if (exists($RRowners{$alias})) { + $match = $RRowners{$alias}; + 1 while $match =~ s/ (SIG|NXT|KEY) / /; + } else { + $match = " "; + } + ($canonical, $netpat, $ttl) = split(' ', $data, 3); + $cmode = $cModeSpec{$netpat}; + $cDomain = $cpatrel{$netpat}; + if ($cmode =~ /I/) { + $cDomain =~ s/$Domainpattern$//; + } else { + $cDomain .= "."; + } + if ($match eq " ") { + &PRINTF(*DOMAIN, "%s%s\tCNAME\t%s.%s\n", &TAB($alias, 16), $ttl, $canonical, $cDomain); + if (exists($RRowners{$alias})) { + $RRowners{$alias} .= "CNAME "; + } else { + $RRowners{$alias} = " CNAME "; + } + $tmp = $alias; + while ($tmp =~ /(\\[.]|[^.])*\./) { + $tmp =~ s/(\\[.]|[^.])*\.//; + $RRowners{$tmp} = " " unless exists($RRowners{$tmp}); + } + } else { + print STDERR "Can't create CNAME for `$canonical.$cpatrel{$netpat}'; another RR exists.\n" if $verbose && $cmode !~ /Q/; + } + } +} + +if (keys(%deferredPTR) || keys(%pendingPTR)) { + # + # Make sure that deferred PTR records are output. + # + if (keys(%HostsPTR)) { + # + # Look for domain names that matched a -p option which also + # point to multi-homed hosts. The methodology is basically + # the same as in the CNAME subroutine. + # + while (($canonical, $data) = each %HostsPTR) { + ($pDomain, @addrs) = split(' ', $data); + if (@addrs > 1) { + # + # Found a multi-homed host. + # + foreach $addr (@addrs) { + @aliases = split(' ', $AliasesPTR{"$canonical-$addr"}); + foreach $alias (@aliases) { + # + # For every IP address, check each alias for the + # following: + # + # 1. Skip aliases that are identical to the FQDN. + # 2. Skip aliases that are common to all addresses + # since they have CNAMEs assigned to them. + # 3. Make the necessary fix-ups so that the PTR record + # will point to the first non-common alias since it + # is this alias that will have an Address RR in the + # forward-mapping data file. + # 4. Do nothing if we run out of aliases. The default + # PTR record which points to the canonical name + # will be generated in the subsequent block. + # + next if $canonical eq "$alias.$pDomain." || $canonical eq "$alias."; + $common_alias = 1; + foreach $tmp (@addrs) { + unless ($AliasesPTR{"$canonical-$tmp"} =~ /(^|\s)$alias\s/) { + $common_alias = 0; + last; + } + last unless $common_alias; + } + if ($common_alias) { + # + # Remove the alias from this as well as the other + # addresses of this host so that it won't be + # encountered again. + # + foreach $tmp (@addrs) { + $AliasesPTR{"$canonical-$tmp"} =~ s/(^|\s)$alias\s/$1/; + } + } elsif (exists($deferredPTR{"$canonical-$addr"})) { + # + # Make the necessary updates so that reverse-mapping + # queries are answered with the unique interface + # name instead of the multi-address canonical name. + # + ($ptr_file, $ptr_owner, $ttl) = split(' ', $deferredPTR{"$canonical-$addr"}, 3); + $tmp = $alias; + $tmp .= ".$pDomain." unless $alias =~ /\.$/; + $pendingPTR{$ptr_file}{$ptr_owner} = "$tmp $ttl"; + delete($deferredPTR{"$canonical-$addr"}); + last; # finished with this IP address + } + } + } + } + } + scalar(keys(%deferredPTR)); # Reset the hash iterator before leaving + } + while (($canonical, $data) = each %deferredPTR) { + # + # Anything left over in the deferred PTR hash gets the default + # treatment - a PTR record that points to the canonical name. + # + $canonical =~ s/-(\d+[.]){3}\d+$//; + ($ptr_file, $ptr_owner, $ttl) = split(' ', $data, 3); + $pendingPTR{$ptr_file}{$ptr_owner} = "$canonical $ttl"; + } + scalar(keys(%pendingPTR)); + while (($ptr_file, $addr) = each %pendingPTR) { + foreach $ptr_owner (sort { $a cmp $b } keys %{ $pendingPTR{$ptr_file} }) { + ($canonical, $ttl) = split(' ', $pendingPTR{$ptr_file}{$ptr_owner}, 2); + unless ($ptr_file eq *DOMAIN) { + $canonical .= ".$Domain." unless $canonical =~ /\.$/; + &PRINTF($ptr_file, "%s%s\tPTR\t%s\n", &TAB($ptr_owner, 8), $ttl, $canonical); + } elsif (exists($RRowners{$ptr_owner}) + && $RRowners{$ptr_owner} =~ / CNAME /) { + print STDERR "Can't create PTR record for `$ptr_owner' due to an existing CNAME RR.\n" if $verbose; + } else { + &PRINTF(*DOMAIN, "%s%s\tPTR\t%s\n", &TAB($ptr_owner, 16), $ttl, $canonical); + if (exists($RRowners{$ptr_owner})) { + $RRowners{$ptr_owner} .= "PTR " unless $RRowners{$ptr_owner} =~ / PTR /; + } else { + $RRowners{$ptr_owner} = " PTR "; + } + $data = $ptr_owner; + while ($data =~ /(\\[.]|[^.])*\./) { + $data =~ s/(\\[.]|[^.])*\.//; + $RRowners{$data} = " " unless exists($RRowners{$data}); + } + } + } + } +} + +# Deal with 'spcl' files. +# +if (-r $Specialfile) { + &PRINTF(*DOMAIN, "\n\$INCLUDE $Pwd/%s\n", $Specialfile); + print STDOUT "File `$Specialfile' included.\n" if $verbose; +} +scalar(keys(%Net_zones)); +while (($key, $data) = each %Net_zones) { + ($zone_name, $zone_file) = split(' ', $data, 2); + if (-r "spcl.$zone_file") { + $data = $Net_ranges{$key}; + ($ptr_file, $ptr_template) = split(' ', $data, 2); + &PRINTF($ptr_file, "\n\$INCLUDE $Pwd/spcl.%s\n", $zone_file); + print STDOUT "File `spcl.$zone_file' found and included.\n" if $verbose; + # + # Make sure to disable checking of single-character hostnames + # and aliases since this RFC-952 restriction is limited to + # entries in the host table. + # + $tmp_rfc952 = $rfc952; + $rfc952 = 0; + + # Since all forward-mapping data has now been accounted for, + # the "READ_RRs" subroutine will be able to issue a warning + # if it detects a PTR record which points to an in-zone CNAME. + # + $zone_name .= "."; + $newline_printed = &READ_RRs("spcl.$zone_file", $zone_name, $zone_name, + $zone_name, 0); + if ($verbose) { + print STDERR "\n" while $newline_printed--; + } else { + $newline_printed = 0; + } + $rfc952 = $tmp_rfc952; + } +} +if ($Open_DB_files) { + # + # Close any DB files that may still be open since we are finished + # with the task of writing resource records to them. + # + scalar(keys(%LRUtable)); + while (($key, $data) = each %LRUtable) { + &CLOSE($key) if $data; + } +} + +print STDOUT "Generating boot and conf files...\n" if $verbose; +&GEN_BOOT; + +if ($audit && $verbose) { + # + # Take the opportunity to undefine some data structures that are + # no longer needed. The memory space can then be recycled by the + # AUDIT_RRs subroutine which itself needs to create still more + # data structures. + # + undef %Aliases; + undef %Comments; + undef %Ttl; + undef %deferredPTR; + undef %pendingPTR; + undef %pPTR; + undef %HostsPTR; + undef %AliasesPTR; + undef %cAliases; + undef %cModeSpec; + undef %pModeSpec; + undef %cpatrel; + undef %ptrpatrel; + undef %CommentRRs if $Commentfile; + undef %DB_filehandle; + undef %LRUtable; + undef %Net_ranges; + undef %Net_zones; + undef %MasterZoneOptions; + undef %SlaveZoneOptions; + undef @BootOptions; + undef @ConfLogging; + undef @ConfOptions; + undef @GlobalMasterZoneOptions; + undef @GlobalSlaveZoneOptions; + undef @aliases; + undef @bootmsgs; + undef @cpats; + undef @ptrpats; + undef @elimpats; + undef @makesoa; + + # As a paranoid exercise, make sure the "$data_fname" variable + # undergoes the same sanitation as is performed in the VERIFY_ZONE + # subroutine so that there are no nasty surprises with temporary + # filenames that can't be created. + # + $data_fname = lc($Domain); # override a -P option + for ($data_fname) { + s/\\([<|>&\(\)\$\?@;'`])/$1/g; # unescape special characters + s/[\/<|>&\[\(\)\$\?;'`]/%/g; # change the bad ones to "%" + s/\\\s/_/g; # change tabs and spaces to underscores + s/\\//g; # remove any remaining escapes chars. + } + + print STDOUT "Checking NS, MX, and other RRs for various improprieties...\n"; + &AUDIT_RRs(0); +} + +if (($Load_Status == 2 && $DefAction eq "Skipping") || $Load_Status > 2) { + ($message = <<EOT) =~ s/^\s+\|//gm; + |Attention! One or more of the above errors is sufficiently severe to + | either prevent the zone from being loaded or the bad data + | may cause interoperability problems with other name servers. +EOT + print STDERR "$message\n" if $verbose; + $error = 1; +} else { + $error = 0; +} +print STDOUT "Done.\n" if $verbose; +exit($error); + + +# +# Subroutine to check for bad names +# No check is made for maximum length of hostnames and/or domain labels. +# +# Return values: +# 0 = valid name within the selected checking context +# 1 (not returned - reserved) +# 2 = invalid name which violates RFC-1123 and/or RFC-952 +# 3 = invalid DNS name within all checking contexts +# +sub CHECK_NAME { + my ($name, $rrtype) = @_; + my $bad_chars; + + # Regular Expression processing can get expensive in terms + # of processing time. Since this subroutine can be called + # literally thousands of times during a processing run, + # it is imperative that duplicate processing is eliminated. + + if ($rfc1123 && $rrtype =~ /^(A|MX|WKS)$/) { + # + # The name checking that is done in this block is a + # superset of what is done for other other record types + # or when RFC-1123 checking is not in effect. Therefore, + # we will be able to exit with a definitive result. + # + # At this point, RFC-1123 name checking is in effect for + # canonical hostnames in the host table as well as DNS + # domain names with the following record types: A, MX, or WKS. + # + # The character set of such names is limited to digits, + # the minus sign (-), the period (.), and any mix of + # upper/lowercase letters. Hostnames and domain label + # names must not begin or end with a minus sign or period. + # The RFC-952 prohibition against names beginning with + # numbers is lifted and hostnames can now have a maximum + # length of 255 characters. + # + # The RDATA fields of certain other record types also + # qualify for more stringent name checking according to + # the following table: + # + # RRtype owner field RDATA field + # ------ ----------- ----------- + # A yes n/a + # MX yes yes (exchange-dname portion) + # WKS yes n/a + # NS no yes + # RP no yes (mbox-dname portion) + # SOA no yes (MNAME and RNAME) + # PTR no yes + # SRV no yes + # NSAP no n/a + # AFSDB no yes (hostname portion) + # RT no yes (intermediate-host portion) + # + # These RDATA fields make it to this point in the subroutine + # by calling CHECK_NAME with a record type of "A". + # + if ($name =~ /^[.-]|[.-]$|[.][.]|[.]-|-[.]/) { + # + # This hostname/domain name is bad but we now need + # to know how bad. If it merely violates RFC-1123 + # and we're processing a host table, it's possible + # to let the user off with a warning depending on + # what `-I' option is in effect. + # A violation of the basic DNS naming rules, however, + # means the name has no hope of being loaded by a + # BIND name server. In this case, we must set the + # return code to a special value so that the hostname + # can be skipped if we're processing a host table. + # + $name =~ s/-//g; + return 3 if $name =~ /^[.]|[.][.]|[.]$/; + return 2; + } + $bad_chars = $name; + $bad_chars =~ tr/A-Za-z0-9.-//d; + return 2 if $bad_chars; + return 2 if $rfc952 && $rrtype eq "A" && length($name) == 1; + return 0; + } + + # Regardless of the state of the "$rfc1123" flag, this section + # of the subroutine is limited to checking for the basic validity + # of a DNS domain name. + + # Domain names must not begin or end with an unescaped + # dot nor contain adjacent unescaped dots. + # + if ($name =~ /^[.]|[^\\][.]$|[^\\][.][.]/) { + # + # No matter what level of name checking is in effect, + # we've encountered a basic DNS name error that will + # prevent a zone from being loaded by a BIND name server. + # If the host table is being processed, unilaterally + # declare that the entry is being skipped by setting + # a special return value. + # + return 3; + } + return 2 if $rfc952 && $rrtype eq "CNAME" && length($name) == 1; + return 0; +} + + +# +# Subroutine to fit a name into a tab-delimited space +# +sub TAB { + my ($name, $field) = @_; + my $tabs; + + $tabs = $field - length($name); + unless ($tabs > 0) { + return "$name "; + } + while ($tabs > 0) { + $name .= "\t"; + $tabs -= 8; + } + return $name; +} + + +# +# Subroutine to print to a DB file and utilize a data structure +# to accommodate limits on the number of concurrently-open files. +# NOTE: Do not use this subroutine to write to non-DB (zone data) +# files unless their filenames and filehandles have been +# registered in the %DB_filehandle and %LRUtable hashes. +# +# As a host file is processed, the appropriate reverse-mapping +# DB files are opened as the IP addresses are encountered. +# Since there's no requirement that a host file be sorted in +# numerical IP address order, there's nothing in the input data +# stream that can signal us when a file can be closed. So we +# just keep opening files. +# +# Depending on the size of the host file, we may eventually +# reach the limit of concurrently-open files imposed by either +# the computer's operating system or the -L option of `h2n'. +# A file must be closed in order to free up the resources for +# the new file to be opened. Ideally, we should choose the +# Least Recently Used (LRU) file for closure. +# +# This subroutine will maintain the %LRUtable hash to identify +# the LRU files. Each time a record is written to a DB file, +# the "$Print_sequence" number is incremented and assigned as +# the value of the corresponding filehandle key in %LRUtable. +# When the OPEN() subroutine needs to close a file, it will +# sort %LRUtable and close the file with the smallest, i.e., +# oldest, print sequence number. +# +sub PRINTF { + my (@args, $output_file); + local *FILE; + (*FILE, @args) = @_; + + unless ($LRUtable{*FILE}) { + # + # The DB file is closed - re-open it in append mode. + # + $output_file = "$DB_filehandle{*FILE}"; + unless (&OPEN(*FILE, ">> $output_file")) { + print STDERR "Couldn't re-open `$output_file' in \&PRINTF().\n"; + print STDERR "Error: $!\n"; + print STDERR "I give up ... sorry.\n"; + exit(2); + } + } + if (printf FILE @args) { + $LRUtable{*FILE} = ++$Print_sequence; + } else { + $output_file = "$DB_filehandle{*FILE}"; + print STDERR "Couldn't write to `$output_file' in \&PRINTF().\n"; + print STDERR "Error: $!\n"; + print STDERR "I give up ... sorry.\n"; + exit(2); + } +} + + +# +# Subroutine to open a file. If necessary, a currently-open +# file will be closed if all available filehandles are in use. +# NOTE: Unlike the PRINTF() subroutine above, the OPEN() and +# CLOSE() subroutines may be called to service non-DB +# files. Currently-open DB files will be closed as +# necessary to open a non-DB file. +# An example of where this is used is in READ_RRs(). +# The LRU service of OPEN() is not really needed to +# process a forward-mapping `spcl' file since this is +# done before the host file is read. However, READ_RRs() +# is also called after the host file is read if any +# reverse-mapping `spcl' files are discovered. +# Here, the LRU service of OPEN() is needed because of +# the large number of DB files that may be open as a +# result of processing the host file. +# +sub OPEN { + my ($FH, $arg, $ok, $tries, @sortedFH); + local *FILE_HANDLE; + (*FILE_HANDLE, $arg) = @_; + + if ($Open_DB_files < $Open_file_limit) { + $ok = open(*FILE_HANDLE, $arg); + } + unless ($ok) { + # + # Assume that we have exceeded "$Open_file_limit (-L option) + # or we've run into a limit set by the operating system. + # Either way, we'll sort %LRUtable to find the least recently + # used file that's still open and close it to make room for + # the new file that needs to be opened. + # + @sortedFH = sort { $LRUtable{$a} <=> $LRUtable{$b}; } keys %LRUtable; + $tries = 0; + foreach $FH (@sortedFH) { + if ($LRUtable{$FH} > 0) { + &CLOSE($FH); # CLOSE() decrements "$Open_DB_files" + $tries++; # and sets $LRUtable{$FH} to zero + $ok = open(*FILE_HANDLE, $arg); + # + # It's reasonable to assume that a single CLOSE() will be + # sufficient for the new OPEN() to succeed. Be flexible, + # however, and allow three tries. Bail out if the OPEN() + # still fails since the operating system may be complaining + # about a problem that's unrelated to concurrently-open files. + # + last if $ok || $tries >= 3; + } + } + } + if ($ok) { + $Open_DB_files++ if exists($DB_filehandle{*FILE_HANDLE}); + return $ok; + } else { + return; # return the undefined value just like the real open() + } +} + + +# +# Subroutine to close a file and maintain the %DB_filehandle +# data structure for managing DB files. +# +sub CLOSE { + my ($ok); + local *FHANDLE; + (*FHANDLE) = @_; + + $ok = close(*FHANDLE); + if ($ok && exists($DB_filehandle{*FHANDLE})) { + $Open_DB_files-- if $Open_DB_files > 0; + $LRUtable{*FHANDLE} = 0; + } +} + + +# +# Generate resource record data for strings from the comment +# field that are found in the comment file (-C). +# +sub DO_COMMENTS { + my ($canonical, @addrs) = @_; + my (@c, $c, $addr, $comments, $class, $rrtype, $tmp); + + foreach $addr (@addrs) { + $comments .= " " . $Comments{"$canonical-$addr"}; + } + + @c = split(' ', $comments); + foreach $c (@c) { + if (exists($CommentRRs{$c})) { + ($class, $rrtype, $tmp) = split(' ', $CommentRRs{$c}, 3); + unless ($class =~ /^(IN|CH|HS)$/) { + # + # Assume the optional CLASS field was omitted (defaults + # to IN) and that "$class" has the parsed RR type. + # + $rrtype = $class + } + $rrtype = uc($rrtype); + if (exists($RRowners{$canonical}) && $RRowners{$canonical} =~ / CNAME /) { + print STDERR "Can't create $rrtype record for `$canonical' due to an existing CNAME RR.\n" if $verbose; + } else { + &PRINTF(*DOMAIN, "%s%s\t%s\n", ($canonical eq $nameset ? "\t\t" : &TAB($canonical, 16)), $ttl, $CommentRRs{$c}); + $nameset = $canonical; + if (exists($RRowners{$canonical})) { + $RRowners{$canonical} .= "$rrtype " unless $RRowners{$canonical} =~ / $rrtype /; + } else { + $RRowners{$canonical} = " $rrtype "; + } + } + } + } +} + + +# +# Generate MX record data +# +sub MX { + my ($canonical, @addrs) = @_; + my ($LocalHost, $addr, $comments, $global, $rafcp, $rdata, $self); + + $LocalHost = 0; + foreach $addr (@addrs) { + $comments .= " " . $Comments{"$canonical-$addr"}; + $LocalHost = 1 if $addr eq $localhost; + } + + # As of version 2.45, the "[smtp]" flag by itself is sufficient + # to suppress the global MX records (-m option) and leave only + # the self-pointing MX record. The "[smtp] [no mx]" combination + # no longer has to be specified. Existing host file entries that + # have "[smtp] [no mx]" will continue to work as before. + # + $self = $global = 1; $rafcp = 0; + $self = $global = 0 if $comments =~ /\[\s*no(\s*-*\s*)?mx\s*\]/i; + $self = 0 if $comments =~ /\[\s*no(\s*-*\s*)?smtp\s*\]/i; + if ($comments =~ /\[\s*smtp((\s*-*\s*)?only)?\s*\]/i) { + $self = 1; + $global = 0; + } + if ($comments =~ /\[\s*rafcp\s*\]/i) { + $rafcp = 1; + $self = $global = 0; + } + + if (exists($RRowners{$canonical}) && $RRowners{$canonical} =~ / CNAME /) { + print STDERR "Can't create WKS record for `$canonical' due to an existing CNAME RR.\n" if ($rafcp || $do_wks) && $verbose; + print STDERR "Can't create MX record for `$canonical' due to an existing CNAME RR.\n" if ($self || $global) && $verbose; + return; + } + # If `[rafcp]' is specified in the comment section, add in a WKS record, + # and do not add any MX records. + # + if ($rafcp) { + foreach $addr (@addrs) { + &PRINTF(*DOMAIN, "%s%s\tWKS\t%s rafcp\n", ($canonical eq $nameset ? "\t\t" : &TAB($canonical, 16)), $ttl, $addr); + $nameset = $canonical; + } + if (exists($RRowners{$canonical})) { + $RRowners{$canonical} .= "WKS " unless $RRowners{$canonical} =~ / WKS /; + } else { + $RRowners{$canonical} = " WKS "; + } + } elsif (!$LocalHost) { + if ($self) { + # Add WKS if requested + if ($do_wks) { + foreach $addr (@addrs) { + &PRINTF(*DOMAIN, "%s%s\tWKS\t%s tcp smtp\n", ($canonical eq $nameset ? "\t\t" : &TAB($canonical, 16)), $ttl, $addr); + $nameset = $canonical; + } + if (exists($RRowners{$canonical})) { + $RRowners{$canonical} .= "WKS " unless $RRowners{$canonical} =~ / WKS /; + } else { + $RRowners{$canonical} = " WKS "; + } + } + &PRINTF(*DOMAIN, "%s%s\tMX\t%s %s\n", ($canonical eq $nameset ? "\t\t" : &TAB($canonical, 16)), $ttl, $DefMxWeight, $canonical); + $nameset = $canonical; + if (exists($RRowners{$canonical})) { + $RRowners{$canonical} .= "MX " unless $RRowners{$canonical} =~ / MX /; + } else { + $RRowners{$canonical} = " MX "; + } + } + if (@MX > 0 && $global) { + foreach $rdata (@MX) { + &PRINTF(*DOMAIN, "%s%s\tMX\t%s\n", ($canonical eq $nameset ? "\t\t" : &TAB($canonical, 16)), $ttl, $rdata); + $nameset = $canonical; + } + if (exists($RRowners{$canonical})) { + $RRowners{$canonical} .= "MX " unless $RRowners{$canonical} =~ / MX /; + } else { + $RRowners{$canonical} = " MX "; + } + } + } +} + + +# +# Generate RP record data +# +sub RP { + my ($canonical, @addrs) = @_; + my ($addr, $comments, $rp, $rptxt, $user_part, $domain_part); + + if (exists($RRowners{$canonical}) && $RRowners{$canonical} =~ / CNAME /) { + print STDERR "Can't create RP record for `$canonical' due to an existing CNAME RR.\n" if $verbose; + return; + } + + foreach $addr (@addrs) { + $comments .= " " . $Comments{"$canonical-$addr"}; + } + + # Be liberal in what we accept, e.g., + # + # [rp=first.last@host"text"] [ rp = first.last@host "text" ] + # [rp = first.last@host random "text" string ] + # + # all result in RP MAILBOX = first\.last.host + # RP TXTDNAME = current canonical domain name + # TXT RDATA = "text" + # + # [rp=first.last@host] [rp= first.last@host "" ] + # [rp = first.last@host random "" string ] + # [rp = first.last@host random string ] + # + # all result in RP MAILBOX = first\.last.host + # RP TXTDNAME = . (root zone placeholder) + # no TXT record + # + # [rp="text"] [ rp = "text" ] [rp = "text" random string ] + # + # all result in RP MAILBOX = . (root zone placeholder) + # RP TXTDNAME = current canonical domain name + # TXT RDATA = "text" + # + if ($comments =~ /\[\s*rp\s*=\s*([^\s"]+)?[^"]*("[^"]*")?[^\]]*\]/i) { + $rp = ($1) ? $1 : "."; + $rptxt = ($2) ? $2 : ""; + $rptxt =~ s/"//g; + if ($rp =~ /@/) { + ($user_part, $domain_part) = split(/@/, $rp, 2); + $user_part =~ s/\./\\./g; # escape "." in username + 1 while $user_part =~ s/\\\\/\\/g; # remove redundancies + if ($domain_part =~ /\./) { # multiple domain labels + $domain_part .= "."; # append root domain + } # relative domain fmt. otherwise + $rp = "$user_part.$domain_part"; # rejoin w/ unescaped "." + } elsif ($rp !~ /\.$/) { # proceed if no trailing "." + $rp =~ s/\./\\./g; # treat as username & escape "." + 1 while $rp =~ s/\\\\/\\/g; # remove redundancies + } # leave username in relative fmt + $rp =~ s/\.\././g; # remove redundant "." chars. + &PRINTF(*DOMAIN, "%s%s\tRP\t%s %s\n", ($canonical eq $nameset ? "\t\t" : &TAB($canonical, 16)), $ttl, $rp, ($rptxt eq "" ? "." : "$canonical")); + if (exists($RRowners{$canonical})) { + $RRowners{$canonical} .= "RP " unless $RRowners{$canonical} =~ / RP /; + } else { + $RRowners{$canonical} = " RP "; + } + unless ($rptxt eq "") { + &PRINTF(*DOMAIN, "%s%s\tTXT\t\"%s\"\n", "\t\t", $ttl, $rptxt); + $RRowners{$canonical} .= "TXT " unless $RRowners{$canonical} =~ / TXT /; + } + $nameset = $canonical; + } +} + + +# +# Generate TXT record data +# +sub TXT { + my ($canonical, @addrs) = @_; + my ($addr, $comments); + + foreach $addr (@addrs) { + $comments .= " " . $Comments{"$canonical-$addr"}; + } + + for ($comments) { + s/\[\s*no(\s*-*\s*)?smtp\s*\]//gi; + s/\[\s*smtp((\s*-*\s*)?only)?\s*\]//gi; + s/\[\s*no(\s*-*\s*)?mx\s*\]//gi; + s/\[\s*rafcp\s*\]//gi; + s/\[\s*ttl\s*=\s*(\d+|(\d+[wdhms])+)\s*\]//gi; + s/\[\s*rp\s*=\s*([^\s"]+)?[^"]*("[^"]*")?[^\]]*\]//gi; + s/\[\s*mh\s*=\s*(d|c|p|cp|pc)\s*\]//gi; + s/\[\s*no(\s*-*\s*)?ptr\s*\]//gi; + s/\[\s*(no|ignore)\s*-c\s*\]//gi; + s/^\s+//; + s/\s+$//; + } + + if ($comments) { + if (exists($RRowners{$canonical}) && $RRowners{$canonical} =~ / CNAME /) { + print STDERR "Can't create TXT record for `$canonical' due to an existing CNAME RR.\n" if $verbose; + } else { + &PRINTF(*DOMAIN, "%s%s\tTXT\t\"%s\"\n", ($canonical eq $nameset ? "\t\t" : &TAB($canonical, 16)), $ttl, $comments); + $nameset = $canonical; + if (exists($RRowners{$canonical})) { + $RRowners{$canonical} .= "TXT " unless $RRowners{$canonical} =~ / TXT /; + } else { + $RRowners{$canonical} = " TXT "; + } + } + } +} + + +# +# Generate resource records (CNAME or A) for the aliases of a +# canonical name. This subroutine is called after the generation +# of all of the canonical name's other RRs (A, MX, TXT, etc.). +# +sub CNAME { + my ($canonical, @addrs) = @_; + my ($addr, $alias, $common_alias, $default_method, $interface_alias); + my ($make_rr, $numaddrs, $ptr_file, $rr_written, $tmp, @aliases); + + $rr_written = 0; + $numaddrs = @addrs; + foreach $addr (@addrs) { + # + # If this is a single-address host, print a CNAME record + # for each alias. + # + # If this is a multi-homed host, perform the following tasks + # for each alias of each IP address: + # + # 1. Identify aliases that are common to all addresses. + # If possible, a CNAME pointing to the canonical name + # will be created. + # + # 2. The first non-common alias will be assigned an A record + # and, if enabled, the appropriate MX RRset. + # + # 3. If the default method of handling multi-homed hosts is + # in effect, then do the following: + # + # * Subsequent non-common aliases are assigned the same + # RRset(s) as the first alias in step #2. + # + # Otherwise, generate the rest of the forward-mapping RRs + # for the multi-homed host using the following alternative: + # + # * Subsequent non-common aliases will be assigned a CNAME + # that points to the A record created in step #2. + # + if ($numaddrs > 1) { + # + # Each address of a multi-homed host may specify how the + # forward- and reverse-mapping RRsets get generated via + # the "[mh=??]" flag together with the +m option. + # Determine the forward-mapping method that's now in effect. + # + unless ($multi_homed_mode =~ /C/) { + # + # Use the default method unless overridden. + # + $default_method = ($Comments{"$canonical-$addr"} =~ /\[\s*mh\s*=\s*(c|cp|pc)\s*\]/i) ? 0 : 1; + } else { + # + # Use the alternate method unless overridden. + # NOTE: The absence of the "c" specification in the + # comment flag signifies an override condition. + # + $default_method = ($Comments{"$canonical-$addr"} =~ /\[\s*mh\s*=\s*[dp]\s*\]/i) ? 1 : 0; + } + } + @aliases = split(' ', $Aliases{"$canonical-$addr"}); + $interface_alias = ""; + foreach $alias (@aliases) { + # + # Skip over the alias if it and the canonical name differ + # only in that one of them has the domain appended to it. + # + $alias =~ s/$Domainpattern$//i; + + # If "$UseDefaultDomain" is in effect (-d domain mode=D), + # the following typo is not caught when the host file is + # read by the main section of the program: + # + # host.domain (correct) + # host .domain (typo) + # + # The ".domain" fragment gets interpreted as an alias and will + # be rendered to the null string by the previous statement. + # Make sure that null aliases are also skipped over. + # Otherwise, havoc will ensue later in this subroutine. + # + next if !$alias || $alias eq $canonical; + + $common_alias = 0; + if ($numaddrs > 1) { + # + # If the alias exists for *all* addresses of this host, + # we can use a CNAME instead of an Address record. + # + $common_alias = 1; + foreach $tmp (@addrs) { + unless ($Aliases{"$canonical-$tmp"} =~ /(^|\s)$alias\s/) { + $common_alias = 0; + last; + } + } + } + + if ($numaddrs > 1 && !$common_alias && !$interface_alias) { + unless ($default_method) { + # + # Only the current alias will be assigned an A record. + # Subsequent non-common aliases will be assigned CNAME + # records that point back to this one. + # Initialize the $interface_alias variable with the + # domain name to which the CNAME(s) will reference. + # The variable assignment will also prevent subsequent + # aliases of the current address from be processed by + # this A-record block. + # + $interface_alias = $alias; + } + if (exists($RRowners{$alias}) && $RRowners{$alias} =~ / CNAME /) { + print STDERR "Can't create A record for `$alias' due to an existing CNAME RR.\n" if $verbose; + $make_rr = 0; + } else { + $make_rr = 1; + $error = &CHECK_NAME($alias, 'A'); + if ($error) { + $action = ($error == 3) ? "Skipping" : $DefAction; + $make_rr = 0 unless $action eq "Warning"; + if ($verbose) { + if ($make_rr) { + print STDERR "Warning: non-RFC-compliant Address record (`$alias') being generated.\n"; + } else { + print STDERR "Cannot generate Address record for `$alias' (invalid hostname).\n"; + } + print STDERR "It is an alias for `$canonical', but CNAME not possible (multi-homed).\n"; + } + } + } + if ($make_rr) { + &PRINTF(*DOMAIN, "%s%s\tA\t%s\n", ($alias eq $nameset ? "\t\t" : &TAB($alias, 16)), $ttl, $addr); + $nameset = $alias; + $rr_written = 1; + # + # Keep track of domain names that now have Address RRs + # assigned to them (we can't make these registrations + # in the %Hosts hash because we are in a loop that is + # serially reading that data structure with the each() + # function). + # This data will be used to prevent the creation + # of conflicting CNAMEs and, if auditing is enabled, + # to make sure that in-domain NS and MX RRs point to + # domain names that have at least one Address record. + # + if (exists($RRowners{$alias})) { + $RRowners{$alias} .= "A " unless $RRowners{$alias} =~ / A /; + } else { + $RRowners{$alias} = " A "; + } + $data = $alias; + while ($data =~ /(\\[.]|[^.])*\./) { + # + # The unqualified alias consists of two or more labels. + # Register the interior labels in the %RRowners hash + # so that we can correctly distinguish between a + # non-existent domain name and a domain name with no + # DNS resource records during the auditing phase. + # + $data =~ s/(\\[.]|[^.])*\.//; # strip leading label + $RRowners{$data} = " " unless exists($RRowners{$data}); + } + + if ($do_mx) { + # + # Ensure that every Address RR has the accompanying + # MX RRset. First, however, the comment flags that + # are tied to the canonical name of this particular + # address must be copied to a key based on the current + # alias. + # + $Comments{"$alias-$addr"} = $Comments{"$canonical-$addr"}; + &MX($alias, ($addr)); + } + + if (exists($deferredPTR{"$canonical-$addr"})) { + # + # Update the deferred PTR hash so that reverse-mapping + # queries are answered with the unique interface name + # instead of the multi-address canonical name. + # + ($ptr_file, $ptr_owner, $tmp) = split(' ', $deferredPTR{"$canonical-$addr"}); + $pendingPTR{$ptr_file}{$ptr_owner} = "$alias $tmp"; + delete($deferredPTR{"$canonical-$addr"}); + } + } + } else { + # + # Make sure that the alias does not already have an + # assigned domain name before creating a CNAME record. + # + if (exists($RRowners{$alias})) { + # + # Accommodate any DNSSEC-related RRs from a `spcl' + # file that are allowed to co-exist with CNAMEs + # per RFC-2065. + # + $tmp = $RRowners{$alias}; + 1 while $tmp =~ s/ (SIG|NXT|KEY) / /; + } else { + $tmp = " "; + } + if ($tmp ne " " || exists($Hosts{$alias})) { + print STDERR "Resource record already exists for `$alias'; alias ignored.\n" if $verbose; + $make_rr = 0; + } else { + $make_rr = 1; + $error = &CHECK_NAME($alias, 'CNAME'); + if ($error) { + $action = ($error == 3) ? "Skipping" : $DefAction; + $make_rr = 0 unless $action eq "Warning"; + if ($verbose) { + if ($make_rr) { + print STDERR "Warning: creating non-RFC-compliant CNAME record for alias `$alias'.\n"; + } else { + print STDERR "Cannot create CNAME record for `$alias' (invalid alias).\n"; + } + } + } + if ($make_rr) { + if ($numaddrs == 1 || $common_alias) { + $tmp = $canonical; + } else { + $tmp = $interface_alias; + } + &PRINTF(*DOMAIN, "%s%s\tCNAME\t%s\n", &TAB($alias, 16), $ttl, $tmp); + $nameset = $alias; + $rr_written = 1; + if (exists($RRowners{$alias})) { + $RRowners{$alias} .= "CNAME "; + } else { + $RRowners{$alias} = " CNAME "; + } + $data = $alias; + while ($data =~ /(\\[.]|[^.])*\./) { + $data =~ s/(\\[.]|[^.])*\.//; + unless (exists($RRowners{$data})) { + $RRowners{$data} = " "; + } + } + if ($audit && $verbose && $alias =~ /^\*($|\.)/) { + # + # Register the wildcard CNAME in the hash + # that is reserved for this purpose. + # + $tmp = $alias; + $tmp .= ".$Domain." unless $tmp =~ /$Domainpattern\.$/i; + $tmp =~ s/^\*\.//; + $Wildcards{$tmp} = " CNAME "; + } + } + } + } + + if ($common_alias) { + # + # Since a CNAME record was either created or otherwise + # accounted for, remove this name from the alias list so + # it's not encountered again for the next address of this host. + # + foreach $tmp (@addrs) { + $Aliases{"$canonical-$tmp"} =~ s/(^|\s)$alias\s/$1/; + } + } + if ($rr_written && exists($cAliases{$alias})) { + # + # RRs for the default domain take precedence over identically- + # named CNAMEs requested by a -c option with "mode=D". + # Prevent the generation of an illegal duplicate DNS record + # by removing the pending domain name from the deferred list. + # + ($tmp, $netpat) = split(' ', $cAliases{$alias}); + $cmode = $cModeSpec{$netpat}; + print STDERR "Can't create CNAME for `$alias.$cpatrel{$netpat}'; another RR exists.\n" if $verbose && $cmode !~ /Q/; + delete($cAliases{$alias}); + } + $rr_written = 0; + } + } +} + + +# +# Convert a time period in symbolic notation to the equivalent +# number of seconds. Repeated time periods are added together +# consistent with the behavior of BIND, e.g., +# "1w2d3h2h1d1w" is calculated identically to "2w3d5h" +# +sub SECONDS { + my ($input_time) = @_; + my @weeks = ("dhms", "w", 604800); + my @days = ("whms", "d", 86400); + my @hours = ("wdms", "h", 3600); + my @minutes = ("wdhs", "m", 60); + my @seconds = ("wdhm", "s", 1); + my @time_interval = (@weeks, @days, @hours, @minutes, @seconds); + my ($other_units, $this_unit, $multiplier, $time, $total_seconds); + + return $input_time if $input_time =~ /^\d*$/; + $total_seconds = 0; + while (($other_units, $this_unit, $multiplier) = @time_interval) { + $time = $input_time; + $time =~ s/(\d+[$other_units])//gi; + $time =~ s/$this_unit/ /gi; + $time =~ s/ (\d+)/+$1/g; + $total_seconds += ($multiplier * eval($time)) if $time; + splice(@time_interval, 0, 3); + } + return $total_seconds; +} + + +# +# Convert a time period in seconds to its equivalent symbolic format. +# +sub SYMBOLIC_TIME { + my ($input_time) = @_; + my @weeks = ("w", 604800); + my @days = ("d", 86400); + my @hours = ("h", 3600); + my @minutes = ("m", 60); + my @time_interval = (@weeks, @days, @hours, @minutes); + my ($num_seconds, $remainder, $time_symbol, $time_string, $units); + + $input_time = uc($input_time) if $input_time =~ /^\d+[wdhms]$/; + return $input_time unless $input_time =~ /^\d+$/; + return "${input_time}S" if $input_time < 60; + $time_string = ""; + $remainder = $input_time; + while (($time_symbol, $num_seconds) = @time_interval) { + $units = int($remainder / $num_seconds); + if ($units) { + $time_string .= "${units}${time_symbol}"; + $remainder = $remainder % $num_seconds; + } + splice(@time_interval, 0, 2); + } + $time_string .= "${remainder}s" if $remainder; + $time_string = uc($time_string) if $time_string =~ /^\d+[wdhms]$/; + return $time_string; +} + + +# +# Subroutine to increment the SOA serial number according to the +# specifications in RFC-1982. Called only when a fixed number +# (-i option) or a calendar-based format of YYYYMMDDvv or YYYYMMvvvv +# (-y [mode=D|M] option) is requested for an existing zone data file. +# +# The SOA serial number is an unsigned 32-bit integer that uses +# special arithmetic described in RFC-1982. Basically, a serial +# number always increases through the range of 0-4294967295 with +# a maximum single increment value of 2147483647 (the maximum +# 31-bit unsigned value). When an increment causes the value of +# 4294967295 to be exceeded, a wrap-around occurs and the remainder +# is added to zero. Although the ending number is smaller than the +# starting number in absolute numerical terms, slave name servers will +# treat the wrap-around as a logical increment in the serial number's +# value (as long as the 2147483647 limit is observed) and request a +# transfer of the zone's changed data from the master name server. +# NOTE: Care must be taken to avoid successive increments in the serial +# number on the master name server that, when taken together, +# exceed 2147483647 without first making sure that all configured +# slave name servers (delegated and stealth) are synchronized after +# each individual increment. Otherwise, any wrap-around effect will +# not be noticed and the slaves will treat a smaller serial number +# on the master as being "older" than their zone copy with a larger +# numeric value and not transfer the updated zone. +# +# Return list: +# (serial, flag) +# serial : incremented SOA serial number +# flag : 0 = requested serial number was within the RFC-1982 limit +# 1 = requested serial number was equal to the existing one +# 2 = requested serial number exceeded the RFC-1982 limit +# +sub INCREMENT_SERIAL { + my ($current_serial) = @_; + my ($current_month_format, $new_serial, $limit_flag, $tmp_serial); + + if ($NewSerial == $current_serial) { + # + # Never return an unchanged serial number. + # + if ($NewSerial == 4294967295) { + # + # Wrap around to the next serial number. Because of + # ambiguities in the way that different name server + # implementations treat an SOA serial number of zero, + # set the incremented number to one instead. + # + $new_serial = 1; + } else { + $new_serial = $NewSerial + 1; + } + if ($UseDateInSerial) { + # + # This is effectively the second update of the current + # zone data file in the same calendar day. + # + $limit_flag = 0; + } else { + # + # Set the flag to issue a warning that the requested + # serial number had to be overridden. + # + $limit_flag = 1; + } + return ($new_serial, $limit_flag); + } + + if ($NewSerial > $current_serial) { + if (($NewSerial - $current_serial) <= 2147483647) { + # + # No special serial number handling is necessary. + # + return ($NewSerial, 0); + } else { + # + # Add the maximum RFC-1982 increment and + # return the appropriate warning flag. + # + $tmp_serial = $current_serial + 2147483647; + return ($tmp_serial, 2); + } + } + + # Deal with a value of "$NewSerial" that is numerically + # less than the zone's existing serial number. + + if ($UseDateInSerial) { + # + # Take into account the possibility that the current + # SOA serial number scheme is already calendar based. + # + if ($UseDateInSerial > 1 && ($current_serial - $NewSerial) <= 98) { + # + # This is the expected result for a site that uses the + # date-based format of YYYYMMDDvv since it unambiguously + # supports 100 changes per calendar day (versions 00 to 99). + # + $new_serial = $current_serial +1; + return ($new_serial, 0); + } + # + # Accommodate busier sites that wish to use a calendar + # format of YYYYMMvvvv as well as the occasional day + # when there are more than 100 updates for users of + # the YYYYMMDDvv format. This allows for 10,000 + # changes per calendar month. + # + if ($UseDateInSerial == 1) { + $current_month_format = $NewSerial; + } else { + # + # If the date format is YYYYMMDDvv, the "$UseDateInSerial" + # variable has been assigned the day-portion of the base + # serial number. Subtract it to get the base YYYYMMvvvv + # format. + # + $current_month_format = $NewSerial - $UseDateInSerial; + } + if (($current_serial - $current_month_format) <= 9998) { + $new_serial = $current_serial +1; + return ($new_serial, 0); + } + # Not returning to the caller from this block implies the + # remaining scenario in which the hostmaster is changing + # to the calendar-based format from an ordinary serial + # number which is greater by 10000 or more. + } + + # Since the requested serial number is numerically less than + # the current serial number, we must wrap around the maximum + # serial number value of 4294967295 either now or the next + # time that `h2n' is run in order to properly set the new + # serial number. + + if ($current_serial <= 2147483648) { + # + # The wrap-around can not occur now because of the + # maximum increment limitation. Go as far as we can + # and set the limit flag. + # + $tmp_serial = $current_serial + 2147483647; + return ($tmp_serial, 2); + } + if ($NewSerial == 0) { + # + # Even though this SOA serial number is not recommended, + # the user has chosen this value anyway. Make it so, + # since we are within the maximum increment range. + # By explicitly accounting for this possibility here, we + # can purposely avoid setting an interim serial number of + # zero in the next block. + # + return (0, 0); + } + $tmp_serial = 2147483646 - (4294967295 - $current_serial); + if ($tmp_serial < $NewSerial) { + # + # The wrap-around falls short of reaching the requested serial + # number. Add the maximum increment to the current serial and + # set the limit flag. If the computed interim serial number is + # zero, subtract one to avoid possible interoperability issues. + # + $tmp_serial = 4294967295 if $tmp_serial == 0; + return ($tmp_serial, 2); + } else { + # + # The requested serial number can be reached from the current + # serial number within the maximum increment limit by wrapping + # around the maximum serial number. + # + return ($NewSerial, 0); + } +} + + +# +# Subroutine to create the zone apex records (SOA and NS) at the beginning +# of the db file. If the -T option was specified, additional zone apex +# records for the forward-mapping domain will also be added. +# A $TTL directive will appear at the beginning of the db file unless +# our RFC-2308 status specifically prohibits it. +# +# Return values: +# 0 = desired SOA serial number denied due to RFC-1982 limits +# 1 = no SOA serial number warnings +# +sub MAKE_SOA { + my ($SOA_expire, $SOA_minimum, $SOA_mname, $SOA_refresh, $SOA_retry); + my ($SOA_rname, $TTL_directive, $current_serial, $data, $error); + my ($fname, $found_TTL_directive, $limit_flag, $message, $new_serial); + my ($rdata, $rrtype, $s, $serial, $tmp, $ttl, $uq_fname, @SOA_fields); + local *FILEH; + ($fname, $uq_fname, *FILEH) = @_; + + if (-e "$fname.log" || -e "$fname.jnl") { + # + # Not good. The presence of a BIND 8 log file or BIND 9 + # journal file indicates that this is a dynamic zone. + # Dynamic zones *must* be dynamically updated. + # The risk of data loss is high if `h2n' is allowed + # to overwrite a dynamic zone with a relatively static + # snapshot of the host file data. + # + print STDERR "Dynamic zone log/journal found for `$fname'.\n"; + print STDERR "I refuse to risk loss of data ... sorry.\n"; + exit(2); + } + if (-s $fname) { + $found_TTL_directive = 0; + unless (open(*FILEH, $fname)) { + print STDERR "Couldn't open `$fname' for reading in \&MAKE_SOA().\n"; + print STDERR "Error: $!\n"; + print STDERR "I give up ... sorry.\n"; + exit(2); + } + $_ = <FILEH>; + if (/^\s*$/ || /^\s*;/ || /^\$ORIGIN\s+/) { + # + # We've encountered a zone file that was not created by + # us. We'll deal with two possibilities. + # + if (/^;BIND DUMP/) { + # + # Not good. This fits the profile of a dynamic zone + # snapshot that BIND periodically dumps to disk. + # + print STDERR "Dynamic zone format encountered in `$fname'.\n"; + print STDERR "I refuse to risk loss of data ... sorry.\n"; + exit(2); + } else { + # + # Some sites may want to copy zone files from a slave + # name server and/or an AXFR query from a utility like DiG. + # Deal with this possibility by skipping over the comment + # lines and/or $ORIGIN directive that precede the SOA record. + # + while (/^\s*$/ || /^\s*;/ || /^\$ORIGIN\s+/) { $_ = <FILEH>; } + } + } + chop; + if (/^\$TTL\s+([^;]+)/) { + $TTL_directive = $1; + $found_TTL_directive = 1; + if ($rfc2308 == 1 && $BIND_version_num == 0) { + # + # We are here because our RFC-2308 status was specifically + # cancelled via the -o option *and* the FIXUP subroutine could + # not determine the version of BIND on the master name server. + # Under these two circumstances, the "$rfc2308" flag is set + # to the "soft" value of 1. + # Discovery of an existing $TTL directive overrides this + # tentative condition and firmly establishes RFC-2308 status. + # Now that this status is known, follow the same course + # of action as documented by the comments in the relevant + # section of FIXUP. + # + $rfc2308 = 2; + $MasterTtl = $Ttl if $Ttl; + $Ttl = $DefNegCache; + } + $_ = <FILEH>; + chop; + } + if (/\s\(\s*$/) { + unless ($soa_warned) { + print STDOUT "Converting SOA format to new style.\n" if $verbose; + $soa_warned = 1; + } + # The SOA record is split across more than one line. + # Although any combination is theoretically possible, + # only two variations occur in real life. Either the + # SOA serial and timer fields are all on the next line + # or these fields appear individually on the next five + # lines. + # + $SOA_refresh = ""; + $_ = <FILEH>; + if (/\s\)\s*$/) { + # + # The rest of the SOA RR has just been read. + # + ($current_serial, $SOA_refresh, $SOA_retry, + $SOA_expire, $SOA_minimum, $tmp) = split(' ', $_, 6); + } else { + # + # All we have is the serial number so far. + # + ($current_serial, $tmp) = split(' ', $_, 2); + } + if (!$SOA_refresh && (!$Refresh || !$Retry || !$Expire || !$Ttl)) { + # + # The rest of the SOA fields have not yet been obtained + # and we need to preserve one or more SOA timer values. + # + ($SOA_refresh, $tmp) = split(' ', <FILEH>, 2); + ($SOA_retry, $tmp) = split(' ', <FILEH>, 2); + ($SOA_expire, $tmp) = split(' ', <FILEH>, 2); + ($SOA_minimum, $tmp) = split(' ', <FILEH>, 2); + } + # Preserve existing SOA timer values in the absence + # of a replacement value passed via the -o/+t options. + # + $SOA_refresh = $Refresh if $Refresh; + $SOA_retry = $Retry if $Retry; + $SOA_expire = $Expire if $Expire; + $SOA_minimum = $Ttl if $Ttl; + } else { + if (/^(.*?\s)SOA\s+(.+)/i) { + $error = 0; + $tmp = $1; + $rdata = $2; + $rdata =~ s/[()]//g; + @SOA_fields = split(' ', $rdata); + if ($#SOA_fields == 6) { + $current_serial = $SOA_fields[2]; + $SOA_refresh = ($Refresh) ? $Refresh : $SOA_fields[3]; + $SOA_retry = ($Retry) ? $Retry : $SOA_fields[4]; + $SOA_expire = ($Expire) ? $Expire : $SOA_fields[5]; + $SOA_minimum = ($Ttl) ? $Ttl : $SOA_fields[6]; + } else { + $error = 1; + } + } else { + $error = 1; + } + if ($error) { + print STDERR "Improper format SOA in `$fname'.\n"; + print STDERR "I give up ... sorry.\n"; + exit(2); + } + } + unless (defined($NewSerial)) { + if ($current_serial == 4294967295) { + # + # Although the next serial number wraps around to zero, + # skip this value to avoid potential interoperability + # issues that different name server implementations may + # have with an SOA serial number of zero. + # + $new_serial = 1; + } else { + $new_serial = $current_serial + 1; + } + } else { + ($new_serial, $limit_flag) = &INCREMENT_SERIAL($current_serial); + } + if ($rfc2308 == 2 && !$found_TTL_directive) { + # + # The existing zone file we just read did not have a $TTL + # directive but one will appear in the replacement zone file. + # This means that the SOA Minimum field will switch its + # context from a TTL value to a Negative Caching TTL value. + # Because existing SOA fields are preserved unless explicitly + # set via the -o/+t options, make sure that the SOA Minimum + # field is replaced by a suitable default value in the absence + # of one from -o/+t. + # + $SOA_minimum = ($Ttl) ? $Ttl : $DefNegCache; + } + close(*FILEH); + } else { + # + # Since this is a new zone file, any valid serial number + # can be assigned without having to do RFC-1982 arithmetic. + # + $new_serial = (defined($NewSerial)) ? $NewSerial : $DefSerial; + $SOA_refresh = ($Refresh) ? $Refresh : $DefRefresh; + $SOA_retry = ($Retry) ? $Retry : $DefRetry; + $SOA_expire = ($Expire) ? $Expire : $DefExpire; + if ($rfc2308 == 2) { + $SOA_minimum = ($Ttl) ? $Ttl : $DefNegCache; + } else { + $SOA_minimum = ($Ttl) ? $Ttl : $DefTtl; + } + } + + unless (open(*FILEH, "> $fname")) { + print STDERR "Couldn't open `$fname' for writing in \&MAKE_SOA()\n"; + print STDERR "Error: $!\n"; + print STDERR "I give up ... sorry.\n"; + exit(2); + } + + $SOA_mname = $RespHost; + $SOA_rname = $RespUser; + if ($uq_fname eq $Domainfile) { + # + # Make a cosmetic indulgence by keeping in-domain names + # relative to the origin in the forward-mapping file. + # + $SOA_mname =~ s/$Domainpattern\.$//i; + $SOA_rname =~ s/$Domainpattern\.$//i; + } + if ($need_numeric_ttl) { + $SOA_refresh = &SECONDS($SOA_refresh); + $SOA_retry = &SECONDS($SOA_retry); + $SOA_expire = &SECONDS($SOA_expire); + $SOA_minimum = &SECONDS($SOA_minimum); + } else { + $SOA_refresh = &SYMBOLIC_TIME($SOA_refresh); + $SOA_retry = &SYMBOLIC_TIME($SOA_retry); + $SOA_expire = &SYMBOLIC_TIME($SOA_expire); + $SOA_minimum = &SYMBOLIC_TIME($SOA_minimum); + } + if ($rfc2308 == 2) { + $TTL_directive = $MasterTtl if $MasterTtl; + $TTL_directive = $DefTtl unless $TTL_directive; + $TTL_directive = ($need_numeric_ttl) ? &SECONDS($TTL_directive) + : &SYMBOLIC_TIME($TTL_directive); + print FILEH "\$TTL $TTL_directive\n"; + print FILEH "\@\tSOA\t$SOA_mname $SOA_rname"; + } else { + # + # If no $TTL directive is to be written, RFC-1035 requires the first + # record of the zone file to have an explicitly-specified TTL field. + # + printf FILEH "\@ %5s SOA\t%s %s", $SOA_minimum, $SOA_mname, $SOA_rname; + } + print FILEH " ( $new_serial $SOA_refresh $SOA_retry $SOA_expire $SOA_minimum )\n"; + foreach $s (@FullServers) { + $tmp = $s; + $tmp =~ s/$Domainpattern\.$//i if $uq_fname eq $Domainfile; + print FILEH "\tNS\t$tmp\n"; + } + if (exists($PartialServers{$uq_fname})) { + foreach $s (split(' ', $PartialServers{$uq_fname})) { + $tmp = $s; + $tmp =~ s/$Domainpattern\.$//i if $uq_fname eq $Domainfile; + print FILEH "\tNS\t$tmp\n"; + } + } elsif (!@FullServers) { + # + # Add name server in MNAME field of SOA record if missing -s/-S + # + print FILEH "\tNS\t$SOA_mname\n"; + } + if ($uq_fname eq $Domainfile && keys(%Apex_RRs)) { + # + # Add additional records from the -T option. These RRs + # have already been submitted to READ_RRs() for validation + # and registration into the appropriate data structures. + # + foreach $rrtype (keys %Apex_RRs) { + foreach $data (@{ $Apex_RRs{$rrtype} }) { + $rdata = $data; + if ($rdata =~ /\n$/) { + # + # A newline appended to the "$rdata" string is a + # data structure signal to indicate that this is + # a continuation line of a multi-line record. + # + $rdata =~ s/\n$//; + if ($rdata =~ /\n$/) { + # + # Besides this being a continuation line, a second + # appended newline signifies that the previous line + # ended with an open quote in effect. Therefore, + # the usual cosmetic indentation must not be added + # in order to maintain data integrity. + # + print FILEH $rdata; + } else { + print FILEH "\t\t$rdata\n"; + } + } else { + ($ttl, $rdata) = split(/,/, $rdata, 2); + $ttl = ($need_numeric_ttl) ? &SECONDS($ttl) + : &SYMBOLIC_TIME($ttl); + printf FILEH " %6s %s\t%s\n", $ttl, $rrtype, $rdata; + } + } + } + } + print FILEH "\n"; + $DB_filehandle{*FILEH} = $fname; + &CLOSE(*FILEH); # CLOSE() will begin the management of %LRUtable + + unless ($limit_flag) { + return 1; + } elsif ($limit_flag == 1) { + ($message = <<EOT) =~ s/^\s+\|//gm; + |Warning: SOA serial number for db file `$uq_fname' was already + | set to the requested value of $NewSerial. It has been + | incremented to $new_serial instead. +EOT + print STDERR "$message\n"; + return 1; + } else { + ($message = <<EOT) =~ s/^\s+\|//gm; + |Warning: SOA serial increment from $current_serial to $NewSerial for db file + | `$uq_fname' exceeds the RFC-1982 maximum of 2147483647. + | To prevent zone propagation failures, only the maximum increment + | was applied; the serial number is set to $new_serial instead. +EOT + print STDERR "$message\n"; + return 0; + } +} + + +# +# Initialize database files with new or updated SOA records. +# +sub INITDBs { + my $LoopbackSOA_incremented = 0; + my $warning = 0; + my ($FILEH, $alias, $file_name, $lc_alias, $message, $ttl, $zone_entry); + + foreach $zone_entry (@makesoa) { + ($file_name, $FILEH) = split(' ', $zone_entry, 2); + $LoopbackSOA_incremented = 1 if $file_name eq "db.127.0.0"; + unless (&MAKE_SOA("$Search_dir/$file_name", $file_name, $FILEH)) { + $warning = 1 + } + } + unless (exists($RRowners{localhost})) { + # + # Since the -T option argument 'ALIAS=localhost' was not specified, + # make the address record for `localhost' appear as the first + # non-top-of-zone-related RR in the forward-mapping zone for "$Domain". + # + &PRINTF(*DOMAIN, "%s\tA\t127.0.0.1\n", "localhost\t"); + $RRowners{localhost} = " A "; + } + if (keys(%Apex_aliases)) { + # + # Add any CNAMEs that were configured with the `ALIAS=' keyword + # of the -T option. These always point to the zone apex. + # NOTE: These aliases have already been registered in the + # "%RRowners" hash when they were submitted to + # READ_RRs() for validation by FIXUP(). + # + while (($lc_alias, $alias) = each %Apex_aliases) { + ($alias, $ttl) = split(' ', $alias, 2); + if ($need_numeric_ttl) { + $ttl = &SECONDS($ttl); + } else { + $ttl = &SYMBOLIC_TIME($ttl); + } + &PRINTF(*DOMAIN, "%s%s\tCNAME\t\@\n", &TAB($alias, 16), $ttl); + } + } + if ($MakeLoopbackSOA) { + $FILEH = "DB.127.0.0"; + unless ($LoopbackSOA_incremented) { + $file_name = "db.127.0.0"; + $warning = 1 unless &MAKE_SOA("$Search_dir/db.127.0.0", $file_name, + $FILEH); + } + &PRINTF($FILEH, "1\t\tPTR\tlocalhost.\n"); + } + if ($warning) { + ($message = <<EOT) =~ s/^\s+\|//gm; + | + | !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + | !! !! + | !! IMPORTANT: Do *not* run this program again until all of the !! + | !! zones affected by the SOA serial number warnings !! + | !! have propagated to *all* of their configured !! + | !! (both delegated and stealth) slave name servers. !! + | !! Failure to do so might cause some slaves to treat !! + | !! their SOA serial numbers as being "greater" than !! + | !! the effective serial number on the master server. !! + | !! !! + | !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +EOT + print STDERR "$message\n"; + } +} + + +# +# Take a Left-Hand-Side or Right-Hand-Side template specification +# passed via the BIND $GENERATE directive and return a specially- +# formatted string. This subroutine's caller, READ_RRs(), will +# then generate the appropriate owner name/RDATA fields by using +# the eval() function on the returned LHS and RHS strings. +# +# Return values: +# "eval_string": successful $GENERATE template -> eval() string conversion +# undef: invalid $GENERATE template specification encountered +# +sub GEN_NAME { + my ($template) = @_; + my ($eval_string, $prefix, $suffix, $offset, $width, $radix); + + $eval_string = '""'; + $template =~ s/\$\$/\\\$/g; # "$$" -> "\$" for backwards compatibility + while ($template) { + unless ($template =~ /([^\$]+)?\$(.*)/) { + # + # We are finished - there are no more "$" characters. + # Append what's left of "$template" to "$eval_string" + # and set "$template" to null so that the loop exits. + # + $eval_string .= " . \"$template\""; + $template = ""; + } else { + # + # A "$" character exists. Append whatever appears in front + # of it to "$eval_string". "$template" is re-assigned with + # whatever appears after the "$" character. + # + $prefix = (defined($1)) ? $1 : ""; + $suffix = (defined($2)) ? $2 : ""; + $eval_string .= " . \"$prefix\""; + $template = $suffix; + if ($eval_string =~ /\\\"$/) { + # + # It turns out that an escape character preceded the "$" + # that was just found thus rendering it as just another + # character. + # Replace the escape character with the "$" character that + # was removed from the end of the "$eval_string" variable + # and proceed to the next loop iteration. + # + $eval_string =~ s/\\\"$/\$\"/; + } else { + # + # The "$" character is indeed an iterator replacement symbol. + # Now see if it is followed by a format specification. + # + unless ($template =~ /^{/) { + # + # No format specification appears after the "$" character. + # Substitute an appended literal iterator variable "$i" + # which will be used by READ_RRs() in place of the "$" + # iteration token of the BIND $GENERATE template. + # + $eval_string .= ' . $i'; + } elsif ($template =~ /^{(-?\d+),*([^,}]+)?,*([^,}]+)?}(.*)/) { + # + # A valid format specification appears after the "$" + # substitution symbol, e.g., host${0,3,d} + # NOTE: As of version 9.2.0, BIND doesn't complain if + # the `width' and `radix' fields do not consist of + # digits and the pattern [doxX], respectively, i.e., + # host${9,foo,zoo} silently defaults to host${9,0,d}. + # + $offset = $1; + $width = $2; + $radix = $3; + $template = $4; + unless (defined($width) && $width =~ /^\d+$/) { + $width = 0; + } else { + $width = "0$width"; # prepend "0" for zero-padding + } + $radix = "d" unless defined($radix) && $radix =~ /^[doxX]$/; + $eval_string .= " . sprintf(\"%${width}${radix}\", "; + $eval_string .= '($i + ' . "$offset))"; + } else { + # + # The BIND $GENERATE template specification is invalid. + # + return; + } + } + } + } + # To keep things simple, the template translator always precedes + # a data substring with the "." concatenation character before + # appending it to "$eval_string". This results in one or more + # consecutive NO-OP concatenations ("" . ) at the start of each + # "$eval_string". Remove them to eliminate unnecessary processing + # by eval() in READ_RRs(). + # + 1 while $eval_string =~ s/^\"\" . //; + return $eval_string; +} + + +# +# Scan `spcl' files (or zone transfer [AXFR] data if in verify mode) +# so that the following may be done: +# * Store information about in-domain owner names in order to prevent +# (detect in verify mode) the creation (existence) of conflicting +# CNAMEs (forward-mapping files only). +# * Store information about the RDATA fields of NS, MX, PTR, SRV, RT, +# and AFSDB records for later reporting in case these RRs are found +# to be not pointing to domain names with A records. +# * Store information about the TXTDNAME field of RP RRs so that +# missing TXT records can be identified. +# * Store information about the RDATA field of CNAME RRs so that +# dangling CNAMEs can be identified. +# * Keep track of wildcard RRs and child domains so that the +# auditing of the various record types can be done properly. +# * Report RFC-1123 errors with owner-names and RDATA domain names plus +# errors with malformed IP addresses. +# +# Return values: +# 0 = no warnings +# 1 = warnings +# 2 = file open error +# +sub READ_RRs { + my ($spcl_file, $zone, $origin, $owner, $warning_status) = @_; + my ($bad_record, $char, $continuation_line, $data, $data2, $default_ttl); + my ($domain_pattern, $error, $gen_file, $gen_owner, $gen_rdata, $i); + my ($include_file, $last_char, $lhs, $line_buffer, $line_num, $message); + my ($n, $new_origin, $open_paren_count, $open_quote, $original_line); + my ($port, $preference, $protocol, $range, $rdata, $rp_mailbox); + my ($rr, $rrtype, $service, $spcl_name, $split_line_num, $start, $step); + my ($stop, $tmp, $ttl, $txt_domain, $uq_owner, $weight, $zone_pattern); + my $zone_suffix; + local (*SPCL, *GEN); + + unless (&OPEN(*SPCL, $spcl_file)) { + if ($verbose) { + print STDERR "\n" unless $newline_printed; + print STDERR "Couldn't open `$spcl_file': $!"; + # + # The terminating newline will be output + # by this subroutine's caller. + } + $Load_Status = 3; + $warning_status = $newline_printed = 2; + return $warning_status; + } + $zone = lc($zone); # in case the -P option is in effect + $origin = lc($origin); # ditto + $domain_pattern = lc($Domainpattern); # time-saver to accommodate -P option + $zone_suffix = ($origin ne '.') ? ".$origin" : "."; + $zone_pattern = $zone; + # + # Make sure to escape any Regular Expression metacharacters + # that may be present in "$zone_pattern". + # + $zone_pattern =~ s/([.\|\\\$\^\+\[\(\)\?'`])/\\$1/g; + $zone_pattern = "\\.$zone_pattern" if $zone ne '.'; + if ($spcl_file eq "$debug_DIR/-T_option_RRs") { + $spcl_name = "-T option"; + } else { + ($spcl_name = $spcl_file) =~ s/^.*\///; + $spcl_name = "`$spcl_name'"; + } + $message = $ttl = ""; + $continuation_line = $open_paren_count = $open_quote = 0; + if (defined($MasterTtl)) { + $default_ttl = lc($MasterTtl); + } elsif (defined($Ttl)) { + $default_ttl = lc($Ttl); + } else { + $default_ttl = lc($DefTtl); + } + $line_num = 0; + # + # The following code block for reading text from a master zone data + # file and assembling that data into DNS records emulates the strict + # behavior of the BIND 9 lexer. DNS records which are not compliant + # with the syntax specifications of RFC-1035 will be flagged as errors + # and skipped from further processing. + # Illegal zone file syntax that the lexers in BIND 4/8 mistakenly + # allowed must now be fixed. + # + while (<SPCL>) { + $line_num++; + if ($continuation_line || /["()]/) { + # + # Scan the line character-by-character to identify the + # proper context of any quoting characters we find. + # + unless ($continuation_line) { + $original_line = $_; + $line_buffer = ""; + $split_line_num = $line_num; + $bad_record = 0; + } else { + # + # As a sanity check for unbalanced quotes/parentheses, + # keep track of the accumulated length of the concatenated + # continuation lines and quit reading the zone file if it + # exceeds a certain threshold. + # This threshold number was determined by deliberately + # breaking a zone file and submitting it to the BIND 9 + # utility `named-checkzone'. The isc_lex_gettoken() + # call fails with a "ran out of space" error after + # running through about 131500 bytes (approximately + # 3000 lines of a typical zone file). + # + $original_line .= $_; + last if length($original_line) > 131500; + } + + # Scan each character in the line while keeping in mind + # the following special characters and quoting hierarchy: + # + # '\' -> An escape (backslash) cancels any special meaning + # of the character that immediately follows. This + # includes backslashes, double-quotes, semicolons, + # left and right parentheses, and the newline. + # + # '"' -> The double-quote character quotes whitespace, the + # ";()" characters which are special to RFC-1035, + # and escaped newlines until a matching unescaped + # double-quote is reached. + # + # ';' -> Signifies the start of a comment. It and + # the remaining characters that follow are + # ignored up to and including the next escaped + # or unescaped newline character. + # + # '(' -> Signifies that subsequent newline characters + # are to be ignored, i.e., quoted, if encountered. + # Does not perform any other quoting function. + # May be nested to multiple levels. + # + # ')' -> Cancels the effect of the "(" character at + # the current nesting level. Newlines are still + # ignored until the outer-most opening "(" is + # balanced by the corresponding ")" character. + # + # 1. An escaped newline is only valid within matching + # double-quote characters. The lexer will report + # an "unexpected end of input" error otherwise. + # + # 2. An unescaped newline effectively cancels an open + # double-quote character. The lexer will report an + # "unbalanced quotes" error if this situation occurs. + # If, however, there are also one or more open parentheses + # in effect, the lexer will continue to scan for their + # closing ")" counterparts to try to complete the disposition + # of the defective record. Quoting will be cancelled and + # not be toggled by subsequent double-quote characters until + # the balancing parentheses are found. + # + # 3. If the nesting level of parentheses goes negative, the + # lexer will immediately report the imbalance and discard + # the rest of the line. If an odd number of double-quote + # characters are part of the refuse, this may have a + # side-effect of introducing an "unbalanced quotes" error + # in a subsequent line. Since resynchronization has to + # occur at some point, however, the lexer's chosen priority + # is to balance parentheses. + # + chop; + $last_char = ""; # don't carry an escape from the previous line + while (length($_)) { + ($char, $_) = split(//, $_, 2); + if ($char eq "\\" && $last_char eq "\\") { + # + # An escape character which is itself escaped + # becomes an ordinary backslash character. + # Move it into the buffer and remove its ability + # to escape the next character in the byte stream. + # + $line_buffer .= $char; + $last_char = ""; + next; + } + if ($char eq '"' && $last_char ne "\\") { + $open_quote = !$open_quote unless $bad_record; + $line_buffer .= $char; + $last_char = $char; + next; + } + unless ($open_quote || $last_char eq "\\") { + # + # Encountering an unquoted and unescaped semicolon + # marks the start of a comment. There is no need + # to scan the rest of the line. + # + last if $char eq ";"; + # + # Unquoted and unescaped parentheses are not part of + # the DNS resource record but an RFC-1035 construct + # to ignore intervening newlines. + # Keep track of them to maintain the current nesting + # level but do not include these characters in the + # line buffer of the record that we are assembling. + # + if ($char eq "\(") { + $open_paren_count++; + next; + } + if ($char eq "\)") { + $open_paren_count--; + last if $open_paren_count < 0; + next; + } + } + if ($open_quote) { + if ($char eq "\\" && $last_char ne "\\" && !length($_)) { + # + # An escaped newline has been encountered. + # Replace the backslash with a newline so + # it can be converted to BIND 9 presentation + # format in the next block. + # + $char = "\n"; + } + if (ord($char) < 32) { + # + # Adopt the BIND 9 presentation format in which + # quoted non-printing characters other than a + # space get converted into an escape character + # followed by the non-printing character's + # three-digit decimal equivalent ASCII value. + # An escaped newline followed by a tab, for + # example, would appear as "\010\009". + # + $line_buffer .= "\\0"; + $line_buffer .= "0" if ord($char) < 10; + $line_buffer .= ord($char); + } else { + $line_buffer .= $char; + } + $last_char = $char; + } else { + # + # Preservation of cosmetic whitespace is unnecessary + # since the assembled record will be parsed again into + # its DNS components, i.e., the owner, TTL, class, + # RRtype, and RDATA fields. + # + $char = " " if $char eq "\t"; + unless ($char eq " " && $last_char eq " ") { + $line_buffer .= $char; + $last_char = $char; + } + } + } + # Assess the situation now that the character scan + # of the current line is complete. + # + if ($open_paren_count < 0) { + print STDERR "Unbalanced parentheses; file `$spcl_file', line $line_num\n"; + print STDERR "> $original_line"; + $Load_Status = 3; + $continuation_line = $open_paren_count = 0; + next; + } + if ($open_quote && $last_char ne "\n") { + print STDERR "Unbalanced quotes; file `$spcl_file', line $line_num\n"; + print STDERR "> $original_line"; + $open_quote = 0; + $Load_Status = 3; + $bad_record = 1 if $open_paren_count; + next; + } + $continuation_line = $open_quote + $open_paren_count; + next if $continuation_line || $bad_record; + $_ = $line_buffer; + next if /^\s*$/; # line was only a comment + } else { + # + # Lex the much simpler case of an ordinary line of text. + # + next if /^\s*$/ || /^\s*;/; + $original_line = $_; + s/([^\\]);.*/$1/; # strip comments + if (/\\$/) { + # + # Escaped newlines are only valid when quoted. + # + print STDERR "Unexpected end of input; file `$spcl_file', line $line_num\n"; + print STDERR "> $original_line"; + $Load_Status = 3; + next; + } + } + # The RR parsing pattern expects the RRtype field to be delimited + # by whitespace at both ends. A missing RDATA field (normally an + # error but valid for APL RRs [RFC-3123]) will prevent the RR from + # matching the pattern unless we make it a practice to always append + # a space character to each line as it emerges from the lexer. + # The side-effect of this is that the parsed RDATA field *must* + # always be chopped of *all* trailing whitespace in order to be + # properly processed. + # + $_ .= " "; + $rr = 0; + if (/^[^\$]/ && /^(.*?\s)($RRtypes)\s+(.*)/io) { + # ^ ^ + # Note: Minimal matching must be used in the first group of the + # Regular Expression. Otherwise, the following SOA record + # will be mistakenly matched as an NS record: + # + # @ 1D IN SOA ns hostmaster ( 123 3h 1h 1w 10m ) + # ^^ + # Also, "$RRtypes" is static during the program's execution. + # Make sure the "compile once" pattern modifier is in place. + # + $tmp = lc($1); + $rrtype = uc($2); + ($rdata = lc($3)) =~ s/\s+$//; # chop whitespace + $rr = 1; + $tmp =~ s/([^\\])\s+(in|hs|ch(aos)?|any)\s+/$1 /; # strip class + if ($tmp =~ /^\S/) { # TTL *may* exist + ($owner, $ttl) = split(' ', $tmp); + $ttl = $default_ttl unless $ttl; + # + # Make sure that all new owner names are fully-qualified. + # + 1 while $owner =~ s/\\\\/\\/g; # strip excess escapes + $owner = $origin if $owner eq '@'; + $owner .= $zone_suffix unless $owner =~ /(^|[^\\])\.$/; + } elsif ($tmp =~ /\S/) { # TTL field does exist + ($ttl = $tmp) =~ s/\s+//g; + } else { # TTL field is null + $ttl = $default_ttl; + } + if ($owner =~ /$zone_pattern$/ || $owner eq $zone) { + # + # Only consider RRs matching the current zone tree. RRs in + # child zones will also be processed so that missing glue + # and/or non-glue records can be reported. + # + # Normal mode: + # ------------ + # Register owner names that are in the forward-mapping + # domain so that conflicting CNAMEs won't be created. + # The idea here is that the owner names of already-existing + # RRs should have priority over potential CNAMEs that have + # yet to be discovered in the host table. + # + # Verify mode: + # ------------ + # Register owner names as the zone file is read so that + # CNAME conflicts can be reported. In both normal mode + # and verify mode, registered CNAMEs will be used to + # quickly determine if they are pointed to by the RDATA + # field of any record type (NS, MX, etc.) that should + # properly point to the canonical domain name instead. + # + $uq_owner = $owner; + $uq_owner =~ s/$domain_pattern\.$// unless $owner eq '.'; + if ($rrtype eq 'CNAME' && $owner eq $zone) { + $message = "Warning: Zone name can not exist as a CNAME"; + $Load_Status = 3; + } elsif ($rrtype eq 'NS' && $owner =~ /^\*(\.|$)/) { + $message = "Warning: NS owner name can not exist as a wildcard"; + $Load_Status = 3; + } elsif (exists($RRowners{$uq_owner})) { + # + # See if there's a "CNAME and other data" error. + # Allow for the fact that the DNSSEC RRtypes SIG, NXT, + # and KEY are allowed to share owner names with CNAMEs + # per RFC-2065. + # + $data = $data2 = $RRowners{$uq_owner}; + if ($rrtype eq 'CNAME') { + # + # Remove the DNSSEC RR types from the temporary copy + # of the accumulated RR types for this owner name. + # Any leftover RR types will trigger the warning. + # + 1 while $data2 =~ s/ (SIG|NXT|KEY) / /; + } + if ($data =~ / CNAME / && $rrtype !~ /^(SIG|NXT|KEY)$/) { + $message = "Warning: `$uq_owner' already exists as a CNAME"; + $Load_Status = 3; + } elsif ($rrtype eq 'CNAME' && $data2 ne " ") { + $message = "Warning: `$uq_owner' already exists as another resource record"; + $Load_Status = 3; + } + if ($data !~ / $rrtype /) { + # + # If necessary, add the RR type to those + # already registered to the owner name. + # + $RRowners{$uq_owner} .= "$rrtype "; + } + } else { + # + # Register the new owner name and its RR type. + # + $RRowners{$uq_owner} = " $rrtype "; + # + # Make sure to trim any terminating root zone + # character before submitting the owner field + # to the CHECK_NAME subroutine. Wildcard labels + # of A, MX, and WKS RRs will also be removed. + # NOTE: Use the FQDN to make sure that the owner names + # of RRtypes which are subject to stricter name + # checking get passed to CHECK_NAME in their entirety. + # + ($tmp = $owner) =~ s/\.$//; + $tmp =~ s/^\*(\.|$)// if $rrtype =~ /^(A|MX|WKS)$/; + $error = ($tmp) ? &CHECK_NAME($tmp, $rrtype) : 0; + if ($error) { + $message .= "Invalid owner name field"; + $Load_Status = $error if $error > $Load_Status; + } + $data = ($error == 3) ? "" : $uq_owner; + while ($data =~ /(\\[.]|[^.])*\./) { + # + # The unqualified owner consists of two or more labels. + # Register the interior labels in the %RRowners hash + # so that we can correctly distinguish between a + # non-existent domain name and a domain name with no + # DNS resource records during the auditing phase. + # + $data =~ s/(\\[.]|[^.])*\.//; # strip leading label + $RRowners{$data} = " " unless exists($RRowners{$data}); + } + if ($rrtype eq 'SRV' && $rfc2782) { + # + # Although the owner fields of SRV RRs are not + # subject to RFC-1123 name checking, we'll use + # the presence of another flag, "$rfc2782", to + # make sure that the owner field complies with + # RFC-2782: + # + # 1. The Service and Protocol labels are present. + # 2. Each label begins with an underscore character. + # + # BIND does not enforce these specifications, however, + # since RFC-2915 (the NAPTR RR) requires that the owner + # field of an SRV RR also exist as an ordinary domain + # name to which a NAPTR record can point so that a + # client can obtain the information in the RDATA field + # of the SRV record. + # + # Because of these two possible query contexts, BIND + # has no other choice than to go with the lowest common + # denominator and leave the special naming requirements + # of RFC-2782 unenforced. + # + # However, a DNS administrator will presumably know the + # query context of any SRV RRs in the zone data under + # his/her control. Therefore, selective enforcement of + # RFC-2782 is available via the "$rfc2782" flag that is + # set with the -I rfc2782 option. + # + if ($owner eq $zone) { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Missing SRV Service and Protocol labels"; + } else { + ($tmp = $uq_owner) =~ s/([^\\])[.]/$1 /; + ($service, $protocol) = split(' ', $tmp, 2); + unless ($service =~ /^_.+/) { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Leading underscore character missing from SRV Service label"; + } + unless ($protocol) { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Missing SRV Protocol label"; + } elsif ($protocol !~ /^_.+/) { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Leading underscore character missing from SRV Protocol label"; + } + } + } + } + if ($ttl && $ttl !~ /^(\d+|(\d+[wdhms])+)$/) { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Invalid TTL value"; + $Load_Status = 3; + } + # Parse and process the RDATA field(s) of the various + # resource record types that will help in the effort + # to identify the most common types of configuration + # errors. Even if the "$audit" flag is false, the + # auditing data structures identify new domain names + # in the RDATA fields and thus help to minimize + # redundant calls to the CHECK_NAME subroutine. + # For best efficiency, the processing blocks should be + # arranged so that the most common RR types appear first. + # NOTE: In order to conserve memory resources of the + # audit-related data structures, domain names are + # stored in zone-relative format whenever possible. + # + 1 while $rdata =~ s/\\\\/\\/g; # strip excess escapes + if ($rrtype eq 'MX') { + ($preference, $tmp) = split(' ', $rdata, 2); + $rdata = (defined($tmp)) ? $tmp : ""; + unless ($preference =~ /^\d+$/ && $preference <= 65535) { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Invalid MX Preference value"; + $Load_Status = 3; + } + if ($rdata =~ /^\S+$/) { + $rdata = $origin if $rdata eq '@'; + $rdata =~ s/$domain_pattern\.$//; + if (exists($MXlist{$rdata})) { + $MXlist{$rdata} .= ", $spcl_name" unless $MXlist{$rdata} =~ /$spcl_name/; + if ($owner eq $zone) { + # + # The reason for checking only the zone apex + # for redundantly-specified target hostnames + # of certain routing RRs (MX and RT) is a + # trade-off. Complete disclosure could result + # in the same basic message repeated one or more + # times for every domain name in a zone plus the + # memory requirement of storing all the domain + # names in yet another hash besides %RRowners. + # Instead, we'll make the reasonably probable + # assumption that the zone apex has an MX and/or + # RT RRset that is similar to those throughout + # the rest of the zone. + # + if (exists($Apex_route_RRs{MX}) + && exists($Apex_route_RRs{MX}{$rdata})) { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Redundant MX hostname"; + $Load_Status = 1; + $Apex_route_RRs{MX}{$rdata} .= " $preference"; + } else { + $Apex_route_RRs{MX}{$rdata} = $preference; + } + } + } else { + $MXlist{$rdata} = "$spcl_name"; + if ($owner eq $zone) { + $Apex_route_RRs{MX}{$rdata} = $preference; + } + # + # Zone names, i.e., the owner fields of SOA records, + # are not subject to RFC-1123 name-checking. This + # is no problem if the zone only contains other + # RRtypes which also have less-strict name checking. + # For RRtypes which have stricter name checking, + # however, make sure the check is contextually + # complete by using the FQDN. + # + $tmp = $rdata; + $tmp .= $zone_suffix unless $tmp =~ /(^|[^\\])\.$/; + $tmp =~ s/\.$//; + $error = ($tmp) ? &CHECK_NAME($tmp, 'MX') : 0; + if ($error) { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Invalid MX hostname field"; + $Load_Status = $error if $error > $Load_Status; + } + } + } elsif ($rdata) { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Invalid MX hostname field"; + $Load_Status = 3; + } else { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Missing MX hostname field"; + $Load_Status = 3; + } + } elsif ($rrtype eq 'A') { + if ($rdata =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/) { + if (($4 > 255 || $3 > 255 || $2 > 255 || $1 > 255) + || $rdata =~ /(^|\.)0\d/) { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Invalid IP address"; + $Load_Status = 3; + } + } else { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Invalid IP address"; + $Load_Status = 3; + } + } elsif ($rrtype eq 'CNAME') { + # + # Keep track of CNAME references so that dangling + # CNAMEs and CNAME loops can be detected. + # + if ($rdata =~ /^\S+$/) { + $rdata = $origin if $rdata eq '@'; + $rdata =~ s/$domain_pattern\.$//; + if ($rrtype eq 'CNAME' && $uq_owner eq $rdata) { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Warning: `$rdata' points back to itself"; + } + if (exists($spclCNAME{$rdata})) { + $spclCNAME{$rdata} .= ", $spcl_name" unless $spclCNAME{$rdata} =~ /$spcl_name/; + } else { + $spclCNAME{$rdata} = "$spcl_name"; + ($tmp = $rdata) =~ s/[^\\]\.$//; + $error = ($tmp) ? &CHECK_NAME($tmp, 'CNAME') : 0; + if ($error) { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Invalid RDATA field"; + $Load_Status = $error if $error > $Load_Status; + } + } + } else { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Invalid RDATA field"; + $Load_Status = 3; + } + } elsif ($rrtype eq 'PTR') { + # + # Keep track of PTR references to determine whether + # or not they properly point to Address RRs. + # + if ($rdata =~ /^\S+$/) { + $rdata = $origin if $rdata eq '@'; + $rdata =~ s/$domain_pattern\.$//; + if (exists($spclPTR{$rdata})) { + $spclPTR{$rdata} .= ", $spcl_name" unless $spclPTR{$rdata} =~ /$spcl_name/; + } else { + $spclPTR{$rdata} = "$spcl_name"; + # + # Since the RDATA field must properly point + # to a canonical domain name, enforce a + # stricter level of checking than was done + # on the PTR record's owner field. + # + $tmp = $rdata; + $tmp .= $zone_suffix unless $tmp =~ /(^|[^\\])\.$/; + $tmp =~ s/\.$//; + $error = ($tmp) ? &CHECK_NAME($tmp, 'A') : 0; + if ($error) { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Invalid RDATA field"; + $Load_Status = $error if $error > $Load_Status; + } + } + } else { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Invalid RDATA field"; + $Load_Status = 3; + } + } elsif ($rrtype eq 'RP') { + if ($rdata =~ /^(\S+)\s+(\S+)$/) { + $rp_mailbox = $1; + $txt_domain = $2; + $rp_mailbox = $origin if $rp_mailbox eq '@'; + $txt_domain = $origin if $txt_domain eq '@'; + # + # Do not append/strip the domain if the + # MAILBOX/TXTDNAME field ends with/exists as + # a "." character. + # + $rp_mailbox .= $zone_suffix unless $rp_mailbox =~ /(^|[^\\])\.$/; + $txt_domain =~ s/$domain_pattern\.$// unless $txt_domain eq "."; + # + # Starting with BIND 4.9.4, `res_mailok' in `res_comp.c' + # states that RNAMEs of SOA and RP RRs "can have any + # printable character in their first label, but the + # rest of the name has to look like a host name." + # Also, an RNAME of "." is a valid symbol for a missing + # representation. These checks will be made now. + # + if ($rp_mailbox ne ".") { + $tmp = $rp_mailbox; + $tmp =~ s/(\\[.]|[^.])*\.//; # strip first label + $tmp =~ s/\.$//; # strip last dot + $error = ($tmp) ? &CHECK_NAME($tmp, 'A') : 1; + if ($error) { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Invalid MAILBOX field in RP RR"; + $Load_Status = $error if $error > $Load_Status; + } + } + if ($txt_domain ne '.') { + if (exists($spclRP{$txt_domain})) { + $spclRP{$txt_domain} .= ", $spcl_name" unless $spclRP{$txt_domain} =~ /$spcl_name/; + } else { + $spclRP{$txt_domain} = "$spcl_name"; + ($tmp = $txt_domain) =~ s/[^\\]\.$//; + $error = &CHECK_NAME($tmp, 'TXT'); + if ($error) { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Invalid TXTDNAME field in RP RR"; + $Load_Status = $error if $error > $Load_Status; + } + } + } + } else { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Invalid number of RDATA fields in RP RR"; + $Load_Status = 3; + } + } elsif ($rrtype eq 'NS' && $owner !~ /^\*(\.|$)/) { + if ($rdata =~ /^\S+$/) { + $rdata = $origin if $rdata eq '@'; + $rdata =~ s/$domain_pattern\.$//; + if (exists($NSlist{$rdata})) { + $NSlist{$rdata} .= ", $spcl_name" unless $NSlist{$rdata} =~ /$spcl_name/; + } else { + $NSlist{$rdata} = "$spcl_name"; + # + # Since the RDATA field must properly point + # to a canonical domain name, enforce a + # stricter level of checking than was done + # on the NS record's owner field. + # + $tmp = $rdata; + $tmp .= $zone_suffix unless $tmp =~ /(^|[^\\])\.$/; + $tmp =~ s/\.$//; + $error = ($tmp) ? &CHECK_NAME($tmp, 'A') : 0; + if ($error) { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Invalid RDATA field"; + $Load_Status = $error if $error > $Load_Status; + } + } + if ($audit) { + if ($verify_mode && $recursive_verify + && $owner ne $zone && !exists($NSowners{$uq_owner})) { + # + # This subzone will be the next one to be + # verified unless a subsequent subzone is + # encountered. + # + push(@Vdomains, $owner); + } + # Store the owner, TTL, and rdata fields of the NS + # resource records. The owner fields will allow + # out-of-zone data to be recognized. The NS RRsets + # for each domain will be checked for having at + # least two listed name servers (RFC-1034) and + # consistent TTL values (RFC-2181). Checks for + # necessary glue records as well as non-glue at or + # below any zone cut will also be made. + # If we are verifying a domain, the NS records will + # be supplied as input data to the `check_del' + # program so that proper delegation can be checked. + # + $NSowners{$uq_owner} .= " " . &SECONDS($ttl) . " $rdata"; + } + } else { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Invalid RDATA field"; + $Load_Status = 3; + } + } elsif ($rrtype eq 'SRV') { + ($preference, $weight, $port, $tmp) = split(' ', $rdata, 4); + $rdata = (defined($tmp)) ? $tmp : ""; + unless ($preference =~ /^\d+$/ && $preference <= 65535) { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Invalid SRV Priority value"; + $Load_Status = 3; + } + unless (defined($weight) && $weight =~ /^\d+$/ && $weight <= 65535) { + $n = ($message) ? ".\n" : ""; + $tmp = (defined($weight)) ? "Invalid" : "Missing"; + $message .= "${n}$tmp SRV Weight value"; + $Load_Status = 3; + } + unless (defined($port) && $port =~ /^\d+$/ && $port <= 65535) { + $n = ($message) ? ".\n" : ""; + $tmp = (defined($port)) ? "Invalid" : "Missing"; + $message .= "${n}$tmp SRV Port value"; + $Load_Status = 3; + } + unless ($rdata) { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Missing SRV Target field"; + $Load_Status = 3; + } elsif ($rdata !~ /^\S+$/) { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Invalid SRV Target field"; + $Load_Status = 3; + } elsif ($rdata !~ /^\.$/) { + $rdata = $origin if $rdata eq '@'; + $rdata =~ s/$domain_pattern\.$//; + if (exists($spclSRV{$rdata})) { + $spclSRV{$rdata} .= ", $spcl_name" unless $spclSRV{$rdata} =~ /$spcl_name/; + } else { + $spclSRV{$rdata} = "$spcl_name"; + # + # Since the RDATA field must properly point + # to a canonical domain name, enforce a + # stricter level of checking than was done + # on the NS record's owner field. + # + $tmp = $rdata; + $tmp .= $zone_suffix unless $tmp =~ /(^|[^\\])\.$/; + $tmp =~ s/\.$//; + $error = ($tmp) ? &CHECK_NAME($tmp, 'A') : 0; + if ($error) { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Invalid SRV Target field"; + $Load_Status = $error if $error > $Load_Status; + } + } + } + } elsif ($rrtype eq 'NSAP') { + # + # Make sure that the RDATA field meets the + # following syntax requirements: + # + # * the hexadecimal string begins with "0x" (RFC-1706) + # * optional readability separator is "." + # * hex digits must occur in unseparated pairs + # * at least one pair of hex digits is present + # + # NOTE: BIND 8.X additionally allows "+" and "/" as + # optional readability separators but BIND 9.X + # does not. We'll use the BIND 9.X standard. + # + if ($rdata =~ /^\S+$/) { + unless ($rdata =~ /^0x/i) { + $n = ($message) ? ".\n" : ""; + $message .= "${n}RDATA field must begin with `0x' (RFC-1706)"; + $Load_Status = 3; + } + $rdata =~ s/^0x([.]+)?//i; + unless ($rdata) { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Missing hexadecimal digits in RDATA"; + $Load_Status = 3; + } else { + $rdata = uc($rdata); + } + while (length($rdata)) { + ($tmp, $rdata) = split(//, $rdata, 2); + next if $tmp eq "."; + unless ($tmp =~ /\d|[A-F]/) { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Invalid character found in RDATA"; + $Load_Status = 3; + last; + } + unless ($rdata && $rdata =~ /^(\d|[A-F])/) { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Unpaired hexadecimal digit in RDATA"; + $Load_Status = 3; + last; + } else { + $rdata =~ s/^.//; + } + } + } else { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Invalid RDATA field"; + $Load_Status = 3; + } + } elsif ($rrtype eq 'AFSDB') { + ($preference, $tmp) = split(' ', $rdata, 2); + $rdata = (defined($tmp)) ? $tmp : ""; + unless ($preference =~ /^\d+$/ && $preference <= 65535) { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Invalid AFSDB Subtype value"; + $Load_Status = 3; + } + if ($rdata =~ /^\S+$/) { + $rdata = $origin if $rdata eq '@'; + $rdata =~ s/$domain_pattern\.$//; + if (exists($spclAFSDB{$rdata})) { + $spclAFSDB{$rdata} .= ", $spcl_name" unless $spclAFSDB{$rdata} =~ /$spcl_name/; + } else { + $spclAFSDB{$rdata} = "$spcl_name"; + # + # For RRtypes which have stricter name checking, + # make sure the check is contextually complete + # by using the FQDN. + # + $tmp = $rdata; + $tmp .= $zone_suffix unless $tmp =~ /(^|[^\\])\.$/; + $tmp =~ s/\.$//; + $error = ($tmp) ? &CHECK_NAME($tmp, 'A') : 0; + if ($error) { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Invalid AFSDB Hostname field"; + $Load_Status = $error if $error > $Load_Status; + } + } + } elsif ($rdata) { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Invalid AFSDB Hostname field"; + $Load_Status = 3; + } else { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Missing AFSDB Hostname field"; + $Load_Status = 3; + } + } elsif ($rrtype eq 'RT') { + ($preference, $tmp) = split(' ', $rdata, 2); + $rdata = (defined($tmp)) ? $tmp : ""; + unless ($preference =~ /^\d+$/ && $preference <= 65535) { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Invalid RT Preference value"; + $Load_Status = 3; + } + if ($rdata =~ /^\S+$/) { + $rdata = $origin if $rdata eq '@'; + $rdata =~ s/$domain_pattern\.$//; + if (exists($spclRT{$rdata})) { + $spclRT{$rdata} .= ", $spcl_name" unless $spclRT{$rdata} =~ /$spcl_name/; + if ($owner eq $zone) { + if (exists($Apex_route_RRs{RT}) + && exists($Apex_route_RRs{RT}{$rdata})) { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Redundant RT hostname"; + $Load_Status = 1; + $Apex_route_RRs{RT}{$rdata} .= " $preference"; + } else { + $Apex_route_RRs{RT}{$rdata} = $preference; + } + } + } else { + $spclRT{$rdata} = "$spcl_name"; + if ($owner eq $zone) { + $Apex_route_RRs{RT}{$rdata} = $preference; + } + # + # For RRtypes which have stricter name checking, + # make sure the check is contextually complete + # by using the FQDN. + # + $tmp = $rdata; + $tmp .= $zone_suffix unless $tmp =~ /(^|[^\\])\.$/; + $tmp =~ s/\.$//; + $error = ($tmp) ? &CHECK_NAME($tmp, 'A') : 0; + if ($error) { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Invalid RT Intermediate-Host field"; + $Load_Status = $error if $error > $Load_Status; + } + } + } elsif ($rdata) { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Invalid RT Intermediate field"; + $Load_Status = 3; + } else { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Missing RT Intermediate field"; + $Load_Status = 3; + } + } elsif ($rrtype eq 'SOA') { + unless ($verify_mode) { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Warning: SOA RR is invalid in the `spcl' file context"; + $Load_Status = 3; + } else { + # + # "$SOA_count" is used to detect the duplicate SOA RR + # that appears at the end of a successful zone transfer. + # It's also used to prevent the duplicate record from + # being reprocessed. + # + $SOA_count++; + if ($SOA_count > 1) { + next unless $SOA_count != 2 || $message; + if ($SOA_count > 2) { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Warning: found unexpected SOA record"; + } + } else { + ($RespHost, $RespUser, $Serial, $Refresh, $Retry, $Expire, $Ttl) = split(' ', $rdata, 7); + $RespHost = $origin if $RespHost eq '@'; + $RespUser = $origin if $RespUser eq '@'; + # + # Do not append the origin if the MNAME/RNAME + # field exists as, or ends with, an unescaped ".". + # + $RespHost .= $zone_suffix unless $RespHost =~ /(^|[^\\])\.$/; + $RespUser .= $zone_suffix unless $RespUser =~ /(^|[^\\])\.$/; + # + # Although a successful zone transfer should return + # a valid SOA record, there's a distinct possibility + # that it could have bad data (particularly in the + # RNAME field) if obtained from a non-BIND server. + # + if ($owner ne $zone) { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Warning: owner name of SOA RR must match zone name"; + } elsif ($owner !~ /\.$/) { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Warning: owner name of SOA RR must be absolute"; + } + if ($RespHost ne ".") { + ($tmp = $RespHost) =~ s/\.$//; + if ($tmp && &CHECK_NAME($tmp, 'A')) { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Invalid MNAME field in SOA RR"; + } + } + if ($RespUser ne ".") { + $tmp = $RespUser; + $tmp =~ s/(\\[.]|[^.])*\.//; # strip first label + $tmp =~ s/\.$//; # strip last dot + if (!$tmp || &CHECK_NAME($tmp, 'A')) { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Invalid RNAME field in SOA RR"; + } + } + unless ($Serial =~ /^\d+$/) { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Invalid Serial number"; + } + unless ($Refresh =~ /^(\d+|(\d+[wdhms])+)$/i) { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Invalid Refresh interval"; + $valid_SOA_timers = 0; + } + unless ($Retry =~ /^(\d+|(\d+[wdhms])+)$/i) { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Invalid Retry interval"; + $valid_SOA_timers = 0; + } + unless ($Expire =~ /^(\d+|(\d+[wdhms])+)$/i) { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Invalid Expiry period"; + $valid_SOA_timers = 0; + } + unless ($Ttl =~ /^(\d+|(\d+[wdhms])+)$/i) { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Invalid default TTL/Negative Cache period"; + $valid_SOA_timers = 0; + } + } + } + } + if ($owner =~ /^\*(\...*)?$zone_pattern$/ && + $rrtype !~ /^(SOA|NS)$/ && $audit) { + # + # Keep track of wildcarded owner names and their + # RR types so that nothing is missed when the + # AUDIT_RRs subroutine is called. + # + ($tmp = $owner) =~ s/^\*\.//; + if (exists($Wildcards{$tmp})) { + $Wildcards{$tmp} .= "$rrtype " unless $Wildcards{$tmp} =~ / $rrtype /; + } else { + $Wildcards{$tmp} = " $rrtype "; + } + } + } else { + $message = "Warning: data outside zone `$zone' ignored"; + } + } elsif (/^\$INCLUDE($|\s+(\S+)?\s*(\S+)?\s*(\S+)?)/) { + $include_file = $2; + $new_origin = lc($3); + $data = $4; + unless ($include_file) { + $message = "Unable to process \$INCLUDE - filename missing"; + $Load_Status = 3; + } else { + if ($new_origin) { + $new_origin = $origin if $new_origin eq "@"; + $new_origin .= $zone_suffix unless $new_origin =~ /(^|[^\\])\.$/; + ($tmp = $new_origin) =~ s/\.$//; + $error = ($tmp) ? &CHECK_NAME($tmp, 'NS') : 0; + if ($error) { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Domain name in origin argument is invalid"; + $Load_Status = $error if $error > $Load_Status; + } + } else { + $new_origin = $origin; + } + if ($data) { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Found uncommented text in comment field"; + } + # Stop what we're doing with the current file and make a + # recursive call to process the specified $INCLUDE file. + # If the $INCLUDE directive also specified an origin + # argument, it will be passed along as well. + # Upon return, we'll automatically revert back to the + # origin and current owner name that was in effect before + # the subroutine call. Restoration of the current owner + # name is not specifically mentioned in RFC-1035 but is + # implemented as a feature/deviation in BIND 8 and BIND 9. + # + $data = $_; # $_ is global in scope - save it. + $warning_status = &READ_RRs($include_file, $zone, $new_origin, + $owner, $warning_status); + $_ = $data; + if ($warning_status == 2) { + # + # The $INCLUDE filename could not be opened. An error + # message has already been output but without the + # terminating newline character. + # + $message = "\n$message"; + $warning_status = $newline_printed = 1; + } + } + } elsif (/^\$ORIGIN($|\s+(\S+)?\s*(\S+)?)/) { + $new_origin = lc($2); + $data = $3; + unless ($new_origin) { + $message = "Missing argument from \$ORIGIN directive"; + $Load_Status = 3; + } else { + if ($new_origin eq '..' && $verify_mode) { + # + # As a hack, get rid of the redundant trailing dot. + # DiG version 8.2 erroneously generates this $ORIGIN + # directive when it transfers the root zone. + # + $new_origin = "."; + } + $origin = $new_origin unless $new_origin eq "@"; + $origin .= $zone_suffix unless $origin =~ /(^|[^\\])\.$/; + $zone_suffix = ($origin eq '.') ? "." : ".$origin"; + ($tmp = $origin) =~ s/\.$//; + $error = ($tmp) ? &CHECK_NAME($tmp, 'NS') : 0; + if ($error) { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Domain name is invalid"; + $Load_Status = $error if $error > $Load_Status; + } + if ($data) { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Found uncommented text in comment field"; + $Load_Status = 3; + } + } + } elsif (/^\$TTL($|\s+(\S+)?\s*(\S+)?)/) { + $tmp = lc($2); + $data = $3; + unless ($tmp) { + $message = "Missing argument from \$TTL directive"; + } else { + if ($tmp =~ /^(\d+|(\d+[wdhms])+)$/) { + $default_ttl = $tmp; + } else { + $message = "Invalid TTL value - ignored"; + $Load_Status = 3; + } + if ($data) { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Found uncommented text in comment field"; + $Load_Status = 3; + } + } + } elsif (/^\$GENERATE($|\s+(\S+)?\s*(\S+)?\s*(\S+)?\s*(\S+)?\s*(\S+)?)/) { + # + # This directive causes name server running BIND version 8.2 + # or later to generate a set of resource records that differ + # from each other by one or more iterator values. + # + $range = $2; + $lhs = $3; + $rrtype = uc($4); + $rdata = $5; + $data = $6; + $gen_count++; + unless ($range) { + $message = "Missing argument list from \$GENERATE directive"; + $Load_Status = 3; + } else { + unless ($range =~ /(\d+)-(\d+)(.*)/) { + $message = "Invalid range argument"; + $Load_Status = 3; + } else { + $start = $1; + $stop = $2; + $step = $3; + if ($stop < $start) { + $message = "Invalid range (stop < start)"; + $Load_Status = 3; + } + if ($step) { + unless ($step =~ /^\/(\d+)$/) { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Invalid range argument"; + $Load_Status = 3; + } else { + $step = $1; + } + } else { + $step = 1; + } + } + unless ($lhs) { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Missing LHS argument"; + $Load_Status = 3; + } + unless ($rrtype) { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Missing RRtype argument"; + $Load_Status = 3; + } elsif ($rrtype !~ /^(A|AAAA|CNAME|DNAME|NS|PTR)$/) { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Unsupported RRtype argument"; + $Load_Status = 3; + } + unless ($rdata) { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Missing RHS argument"; + $Load_Status = 3; + } + if ($data) { + $n = ($message) ? ".\n" : ""; + $message .= "${n}Found uncommented text in comment field"; + } + } + unless ($message) { + # + # Now that the basic syntax of the directive has been + # checked, it's time to register the RRs that BIND + # will generate into the appropriate global hash(es). + # This will be done as follows: + # + # 1. Loop through the range specification and write + # the resulting RRs to a temporary file. + # 2. Take the same action as though the temporary + # file appeared in an $INCLUDE directive - make + # a recursive call to READ_RRs to register the + # RRs into the appropriate data structure(s). + # 3. Remove the temporary file upon returning from + # the recursive subroutine call and continue + # processing the `spcl' file. + # + $gen_file = "$debug_DIR/GENERATE_#$gen_count"; + unless (&OPEN(*GEN, "> $gen_file")) { + $message = "Couldn't open temporary working file: $!"; + } else { + $gen_owner = &GEN_NAME($lhs); + $message = "GEN_NAME: invalid LHS template" unless $gen_owner; + $gen_rdata = &GEN_NAME($rdata); + unless ($gen_rdata) { + unless ($gen_owner) { + $message = "GEN_NAME: invalid LHS and RHS templates"; + } else { + $message = "GEN_NAME: invalid RHS template"; + } + } + unless ($message) { + $data = ($rrtype eq 'PTR') ? 16 : 24; + for ($i = $start; $i <= $stop; $i += $step) { + # + # The eval() function will substitute the current + # value of "$i" and concatenate any fixed strings + # in "$gen_owner" and/or "$gen_rdata" to generate + # RRs with the corresponding owner and RDATA fields. + # + printf(GEN "%s\t%s\t%s\n", &TAB(eval($gen_owner), $data), $rrtype, eval($gen_rdata)); + } + } + &CLOSE(*GEN); + unless ($message) { + # + # Make the recursive call that will register the + # generated RRs into the relevant data structure(s). + # + $data = $_; + $warning_status = &READ_RRs($gen_file, $zone, $origin, + $owner, $warning_status); + $_ = $data; + if ($warning_status == 2) { + # + # The temporary working file was not able to + # be opened. An error message has already been + # output but without the terminating newline + # character. + # + $message = "\n$message"; + $warning_status = $newline_printed = 1; + } + } + unlink($gen_file) unless $debug; + } + } + } elsif (/^\$/) { + $message = "Unknown directive"; + $Load_Status = 3; + } else { + $message = "Invalid DNS record [unknown RR type and/or missing/extra field(s)] - ignored.\n"; + $Load_Status = 3; + } + if ($message && $verbose) { + if ($verify_mode) { + $message .= "." unless $message =~ /\n$/; + $message =~ s/\n$//; # prevents double-spaced lines + } else { + $n = ($message =~ /\n$/) ? "" : "; "; + if ($spcl_name eq "-T option") { + $message .= "${n}-T option"; + } else { + $message .= "${n}file $spcl_name, line $line_num"; + } + } + print STDERR "\n" unless $newline_printed; + $original_line =~ s/\n$//; # prevents double-spaced lines + if ($rr && $original_line =~ /^(\S+)?\s+(.+)/s) { + # + # Perform some cosmetic data manipulations to + # ensure the clarity of the diagnostic output. + # + $data = $1; + $tmp = $2; + if (defined($data)) { + $data = ($owner eq $origin) ? '@' : $owner; + $data =~ s/$zone_pattern$//; + } else { + $data = ""; + } + $n = length($data); + $n = ($n < 24) ? 24 : $n; + printf STDERR "%s\n%s%s\n", $message, &TAB("> $data", $n), $tmp; + } else { + print STDERR "$message\n> $original_line\n"; + } + $message = $n = ""; + $warning_status = $newline_printed = 1; + } + } + &CLOSE(*SPCL); + if ($open_quote || $open_paren_count) { + if ($verbose) { + $char = ($open_quote) ? "quotes" : "parentheses"; + print STDERR "Unable to process file `$spcl_file'\ndue to unbalanced $char. The syntax problem begins at line $split_line_num.\n"; + $warning_status = $newline_printed = 1; + } + $Load_Status = 4; + } + return $warning_status; +} + + +# +# Subroutine to determine if a domain name is part of +# a child domain or matches a wildcard owner name. +# +# Return value: +# ($subzone, $wildcard, $wildcard_rrtypes) +# +# The null string is returned for any list element which +# does not have a matching value. +# +sub MATCH_DOMAIN { + my ($domain_name) = @_; + my ($subzone, $uq_domain_name, $wildcard); + my ($wildcard_matching_OK, $wildcard_rrtypes); + + # There are two basic approaches for seeing if a domain + # name matches a child zone or wildcard: + # + # 1. Fetch child zones/wildcards from their respective + # hashes until a match is found or there are no more + # hash indices to compare. This is a classic example + # of an N**2 search algorithm which becomes very slow + # for a zone with many child zones and/or wildcards. + # + # 2. [a] See if the current domain name matches that + # of a child zone/wildcard. + # [b] If no match is found, strip the first label + # from the current domain name and retry step [a] + # until either a match is found or the remaining + # label(s) match the current zone being audited. + # + # The cumulative search time for the second method has a linear + # relationship to the number of child zones/wildcards and, thus, + # is implemented here. + # + $subzone = $wildcard = $wildcard_rrtypes = ""; + $wildcard_matching_OK = 1; + # + # NOTE: The "$domain_name" parameter as well as the global variables + # "$Domain" and "$Domainpattern" have already been lower-cased + # by &AUDIT_RRs(), the sole caller of this subroutine. + # + while ($domain_name && ".$domain_name" =~ /$Domainpattern\.$/) { + ($uq_domain_name = $domain_name) =~ s/$Domainpattern\.$//; + # + # The following test will be made for each label of the passed + # domain name until either a subzone is matched or the current + # zone apex is reached. Even if a wildcard is ostensibly matched + # in the subsequent block, we need to keep testing for a subzone + # since delegation cancels wildcard matching. + # + if ($domain_name ne "$Domain." && exists($NSowners{$uq_domain_name})) { + $subzone = $domain_name; + # + # Per RFC-1034, the wildcard matching algorithm does not apply + # across zone boundaries, i.e., delegation cancels the wildcard + # defaults. Make sure to nullify any such previous match. + # + $wildcard = $wildcard_rrtypes = "" if $wildcard; + last; + } + if ($wildcard_matching_OK) { + # + # The following wildcard tests will be made for each label + # of the passed domain name until one of the following + # conditions is met: + # + # 1. A DNS node (either empty or owning one or more RRs) + # exists at or between the passed domain name and an + # otherwise-matching wildcard. + # + # 2. A wildcard is matched. This keeps the longest match in + # case another wildcard with fewer labels would otherwise + # match as well. + # + # 3. A subzone is matched. This cancels any previous wildcard + # match. + # + # 4. The label(s) representing the current zone apex is/are + # reached. + # + if ($uq_domain_name ne $domain_name + && exists($RRowners{$uq_domain_name})) { + # + # If the passed domain name explicitly matches a DNS node + # (empty or having any resource record) or a DNS node is + # known to exist in the DNS hierarchy between the passed + # domain name and the nearest intra-zone wildcard, a + # wildcard match must not occur according to RFC-1034. + # For example, given the following RRs: + # + # foo.example.com. A 192.168.1.1 + # foo.moo.example.com. A 192.168.2.2 + # *.example.com. MX 10 foo.example.com. + # zoo.example.com. CNAME zoo.foo.example.com. + # goo.example.com. CNAME fee.fie.example.com. + # + # the resolution of `zoo.foo.example.com' would be + # NXDOMAIN since `foo.example.com' exists as a node + # in the DNS namespace (it also happens to be an owner + # of an RR) and does not have a wildcard. NXDOMAIN + # would also be returned for `zoo.moo.example.com' + # since `moo.example.com' exists as a DNS node even + # though that domain name does not own any records. + # The domain `fee.fie.example.com', on the other hand, + # does match the wildcard since there is no explicit + # match for that owner name nor for `fie.example.com'. + # However, if the following record were added: + # + # *.foo.example.com. A 192.168.3.3 + # + # then `zoo.foo.example.com' would match this more + # explicit wildcard. + # + $wildcard_matching_OK = 0 if !exists($Wildcards{$domain_name}); + } + if ($wildcard_matching_OK && exists($Wildcards{$domain_name})) { + # + # The longest-matching wildcard (may be multi-label) has + # been found. Once stored into the "$wildcard" variable, + # further wildcard matching attempts are cancelled. + # We will not exit the label-trimming loop, however, + # because the RFC-1034 wildcard algorithm requires us + # to continue searching for a matching subzone which + # will cancel this wildcard match. + # + $wildcard = "*.$domain_name"; + $wildcard_rrtypes = $Wildcards{$domain_name}; + $wildcard_matching_OK = 0; + } + } + # Find the leading label, i.e., the characters up to + # and including the first unescaped ".", and remove + # it from the domain name prior to the next attempt + # at matching a child domain/wildcard. + # + $domain_name =~ s/(\\[.]|[^.])*\.//; + } + return ($subzone, $wildcard, $wildcard_rrtypes); +} + + +# +# Perform some final error checking that is only possible after +# all of this zone's data has been accounted for. +# Checks are made for the following conditions: +# * NS, MX, PTR, SRV, RT, and AFSDB records that point to CNAMEs or +# domain names with no Address records or to nonexistent domains. +# * RP records with TXTDNAME fields that reference nonexistent +# TXT records. +# * CNAME records that point to nonexistent domain names, i.e., +# "dangling" CNAMEs. +# * Zones with only one listed name server (violates RFC-1034), +# NS RRsets with inconsistent TTL values (violates RFC-2181), +# NS RRs with missing glue records, and non-glue records at +# or below a zone cut. +# This subroutine assumes that the `DiG' program is available for +# resolving domain names that are external to the zone being processed. +# +# Having these checks performed by `h2n' after it builds the zone +# data files is useful because such misconfigurations are not reported +# in the syslog when the zone is initially loaded by `named'. To do so +# would require `named' to make two passes though the data, an impractical +# task to add to its overhead. Even though `named' eventually logs these +# domain names when they are accessed, it's also impractical to expect +# busy hostmasters to be constantly scanning the syslog(s) for such events. +# +# NOTE: Since this subroutine could be called for every run of `h2n' +# that processes a host file, careful consideration should be made +# before adding any more data verification tasks. Additional data +# checks which are time-consuming and/or esoteric may be better +# placed in the "CHECK_ZONE" subroutine and called with the +# -V option instead. +# +# Return values: +# 0 = no warnings +# 1 = warnings +# +sub AUDIT_RRs { + my ($warning_status) = @_; + my ($DiG_batch, $additional, $answer, $authority, $buffer, $chain_length); + my ($cname, $cname_loop, $cname_n, $debug_file, $domain, $flags); + my ($first_answer, $fq_host, $host, $i, $k, $last_zone, $location); + my ($match, $max_chain_length, $n, $nextbatch, $nextbatch_is_open); + my ($ns_count, $query_options, $query_section, $result, $rrtype); + my ($saved_cname, $status, $subzone, $subzones_exist, $t, $tmp, $ttl); + my ($warning, $wildcard, $wildcards_exist, $zone); + my (%baseCNAME, %chainCNAME, %extAFSDB, %extCNAME, %extMX, %extPTR, %extRP); + my (%extRT, %extSRV, %glue_RRs, %non_glue_RRs); + my (@NSrfc1034, @NSrfc2181, @delete_list, @temp); + + $n = ($warning_status) ? "" : "\n"; # controls output of cosmetic newlines + if ($verify_mode) { # other cosmetic considerations + $t = 40; + $location = "(SOA MNAME)"; + } else { + $t = 32; + $location = "-h option"; + } + $Domain = lc($Domain); # in case the -P option is in effect + $Domainpattern = lc($Domainpattern); # ditto + $domain = ($Domain) ? "$Domain." : ""; # accommodate the root zone + # + # Add the master name server in the `-h' option or, if in verify mode, + # the name server from the SOA MNAME field, to the list of any name + # servers found in the READ_RRs subroutine. + # + unless ($RespHost =~ /^\.?$/) { + ($host = lc($RespHost)) =~ s/$Domainpattern\.$//; + if (exists($NSlist{$host})) { + $NSlist{$host} = "$location, $NSlist{$host}"; + } else { + $NSlist{$host} = $location; + } + } + unless ($verify_mode) { + # + # Add the name servers from the `-s' and `-S' options to the data + # set of other name servers that may have found when reading a + # `spcl' file. Similarly, mailhosts from any `-m' options will + # be added to any `spcl' mailhosts. + # + foreach $host (@FullServers) { + ($host = lc($host)) =~ s/$Domainpattern\.$//; + if (exists($NSlist{$host})) { + $location = $NSlist{$host}; + if ($location =~ /-h option/) { + $location =~ s/-h option/-h,-s options/; + } elsif ($location !~ /-s option/) { + $location = "-s option, $location"; + } + $NSlist{$host} = $location; + } else { + $NSlist{$host} = "-s option"; + } + # Register the NS RRs of this domain in the same manner + # as any child domains that were found in a `spcl' file. + # + $NSowners{"$Domain."} .= " " . &SECONDS($DefTtl) . " $host"; + } + foreach $tmp (keys %PartialServers) { + @temp = split(' ', $PartialServers{$tmp}); + foreach $host (@temp) { + ($host = lc($host)) =~ s/$Domainpattern\.$//; + if (exists($NSlist{$host})) { + $location = $NSlist{$host}; + if ($location =~ /-[hs] option/) { + $location =~ s/([^ ]+) options?/$1,-S options/; + } elsif ($location !~ /-S option/) { + $location = "-S option, $location"; + } + $NSlist{$host} = $location; + } else { + $NSlist{$host} = "-S option"; + } + # Register the NS RRs of the forward-mapping domain. + # + $NSowners{"$Domain."} .= " " . &SECONDS($DefTtl) . " $host" if $tmp eq $Domainfile; + } + } + + if ($do_mx || $do_zone_apex_mx) { + # + # Combine the `-m' and `spcl' MX data structures into one. + # The %MXlist hash will track each mailhost and where it was found. + # NOTE: In-zone hostnames in the @MX array are already stored + # as UQDNs. + # + foreach $buffer (@MX) { + ($tmp, $host) = split(' ', $buffer); + $host = ($host eq '@') ? "$Domain." : lc($host); + if (exists($MXlist{$host})) { + $location = $MXlist{$host}; + if ($location =~ /^-T option/) { + $location =~ s/-T option/-T,-m options/; + } elsif ($location !~ /-m option/) { + $location = "-m option, $location"; + } + $MXlist{$host} = $location; + } else { + $MXlist{$host} = "-m option"; + } + } + } + } + + # Undefine data structures that are no longer needed so that + # the "%ext*" hashes have the maximum amount of room to grow + # as each RR type is audited. + # + undef @FullServers; + undef %PartialServers; + undef @MX; + undef @temp; + + $subzones_exist = keys(%NSowners); + $wildcards_exist = keys(%Wildcards); + scalar(keys(%NSlist)); # Reset the iterator! + while (($host, $location) = each %NSlist) { + # + # Try to find an explicit match in the local domain. + # + if ($host !~ /[^\\]\.$/ || $host eq "$Domain.") { + $match = $warning = 0; + if (exists($Hosts{$host})) { + $match = 1; + } elsif (exists($RRowners{$host})) { + $rrtype = $RRowners{$host}; + if ($rrtype =~ / (A|AAAA|A6) /) { + $match = 1; + } elsif ($rrtype =~ / CNAME /) { + $match = $warning = 1; + $NSlist{$host} = "[CNAME record]|$NSlist{$host}"; + } elsif ($rrtype eq " ") { + $match = $warning = 1; + $NSlist{$host} = "[no RRs exist]|$NSlist{$host}"; + } else { + $match = $warning = 1; + $NSlist{$host} = "[no addr. RR ]|$NSlist{$host}"; + } + } + if ($subzones_exist || (!$match && $wildcards_exist)) { + # + # If no explicit match was found, try matching an existing + # wildcard. In any case, however, see if the domain name of + # this NS host belongs to a delegated subdomain. If so, the + # `DiG' program will be called upon to make sure that the + # domain name can be resolved. + # + $fq_host = ($host eq "$Domain.") ? $host : "$host.$domain"; + ($subzone, $wildcard, $rrtype) = &MATCH_DOMAIN($fq_host); + if ($subzone) { + $match = 1; + $warning = 0; + $extNS{$fq_host} = $location; + } elsif (!$match && $wildcard) { + $match = 1; + unless ($rrtype =~ / (A|AAAA|A6) /) { + if ($rrtype =~ / CNAME /) { + $warning = "(*) CNAME RR"; + } elsif ($rrtype =~ / MX /) { + $warning = " (*) MX RR "; + } else { + $warning = "(*) non-A RR"; + } + $NSlist{$host} = "[$warning]|$NSlist{$host}"; + } + } + } + if ($match) { + push(@delete_list, $host) unless $warning; + } else { + $NSlist{$host} = "[no such name]|$NSlist{$host}"; + } + } else { + # + # Save the external NS host for `DiG' to look up later. + # + $extNS{$host} = $location; + push(@delete_list, $host); + } + } + # Now that we're no longer iterating over %NSlist, remove + # the hash keys that were marked for deletion. + # + foreach $host (@delete_list) { + delete($NSlist{$host}); + } + + @delete_list = (); + scalar(keys(%MXlist)); + while (($host, $location) = each %MXlist) { + if ($host !~ /[^\\]\.$/ || $host eq "$Domain.") { + $match = $warning = 0; + if (exists($Hosts{$host})) { + $match = 1; + } elsif (exists($RRowners{$host})) { + $rrtype = $RRowners{$host}; + if ($rrtype =~ / (A|AAAA|A6) /) { + $match = 1; + } elsif ($rrtype =~ / CNAME /) { + $match = $warning = 1; + $MXlist{$host} = "[CNAME record]|$MXlist{$host}"; + } elsif ($rrtype eq " ") { + $match = $warning = 1; + $MXlist{$host} = "[no RRs exist]|$MXlist{$host}"; + } else { + $match = $warning = 1; + $MXlist{$host} = "[no addr. RR ]|$MXlist{$host}"; + } + } + if ($subzones_exist || (!$match && $wildcards_exist)) { + $fq_host = ($host eq "$Domain.") ? $host : "$host.$domain"; + ($subzone, $wildcard, $rrtype) = &MATCH_DOMAIN($fq_host); + if ($subzone) { + $match = 1; + $warning = 0; + $extMX{$fq_host} = $location; + } elsif (!$match && $wildcard) { + $match = 1; + unless ($rrtype =~ / (A|AAAA|A6) /) { + if ($rrtype =~ / CNAME /) { + $warning = "(*) CNAME RR"; + } elsif ($rrtype =~ / MX /) { + $warning = " (*) MX RR "; + } else { + $warning = "(*) non-A RR"; + } + $MXlist{$host} = "[$warning]|$MXlist{$host}"; + } + } + } + if ($match) { + push(@delete_list, $host) unless $warning; + } else { + $MXlist{$host} = "[no such name]|$MXlist{$host}"; + } + } else { + $extMX{$host} = $location; + push(@delete_list, $host); + } + } + foreach $host (@delete_list) { + delete($MXlist{$host}); + } + + # Attempt to reconcile the Target domain name of any SRV RRs + # that were found while scanning a `spcl' or zone data file. + # + @delete_list = (); + scalar(keys(%spclSRV)); + while (($host, $location) = each %spclSRV) { + if ($host !~ /[^\\]\.$/ || $host eq "$Domain.") { + $match = $warning = 0; + if (exists($Hosts{$host})) { + $match = 1; + } elsif (exists($RRowners{$host})) { + $rrtype = $RRowners{$host}; + if ($rrtype =~ / (A|AAAA|A6) /) { + $match = 1; + } elsif ($rrtype =~ / CNAME /) { + $match = $warning = 1; + $spclSRV{$host} = "[CNAME record]|$spclSRV{$host}"; + } elsif ($rrtype eq " ") { + $match = $warning = 1; + $spclSRV{$host} = "[no RRs exist]|$spclSRV{$host}"; + } else { + $match = $warning = 1; + $spclSRV{$host} = "[no addr. RR ]|$spclSRV{$host}"; + } + } + if ($subzones_exist || (!$match && $wildcards_exist)) { + $fq_host = ($host eq "$Domain.") ? $host : "$host.$domain"; + ($subzone, $wildcard, $rrtype) = &MATCH_DOMAIN($fq_host); + if ($subzone) { + $match = 1; + $warning = 0; + $extSRV{$fq_host} = $location; + } elsif (!$match && $wildcard) { + $match = 1; + unless ($rrtype =~ / (A|AAAA|A6) /) { + if ($rrtype =~ / CNAME /) { + $warning = "(*) CNAME RR"; + } elsif ($rrtype =~ / MX /) { + $warning = " (*) MX RR "; + } else { + $warning = "(*) non-A RR"; + } + $spclSRV{$host} = "[$warning]|$spclSRV{$host}"; + } + } + } + if ($match) { + push(@delete_list, $host) unless $warning; + } else { + $spclSRV{$host} = "[no such name]|$spclSRV{$host}"; + } + } else { + $extSRV{$host} = $location; + push(@delete_list, $host); + } + } + foreach $host (@delete_list) { + delete($spclSRV{$host}); + } + + # Attempt to reconcile the RDATA field of any PTR RRs that + # were found while scanning a `spcl' or zone data file. + # + @delete_list = (); + scalar(keys(%spclPTR)); + while (($host, $location) = each %spclPTR) { + if ($host !~ /[^\\]\.$/ || $host eq "$Domain.") { + $match = $warning = 0; + if (exists($Hosts{$host})) { + $match = 1; + } elsif (exists($RRowners{$host})) { + $rrtype = $RRowners{$host}; + if ($rrtype =~ / (A|AAAA|A6|NSAP) /) { + $match = 1; + } elsif ($rrtype =~ / CNAME /) { + $match = $warning = 1; + $spclPTR{$host} = "[CNAME record]|$spclPTR{$host}"; + } elsif ($rrtype eq " ") { + $match = $warning = 1; + $spclPTR{$host} = "[no RRs exist]|$spclPTR{$host}"; + } else { + $match = $warning = 1; + $spclPTR{$host} = "[no addr. RR ]|$spclPTR{$host}"; + } + } + if ($subzones_exist || (!$match && $wildcards_exist)) { + $fq_host = ($host eq "$Domain.") ? $host : "$host.$domain"; + ($subzone, $wildcard, $rrtype) = &MATCH_DOMAIN($fq_host); + if ($subzone) { + $match = 1; + $warning = 0; + $extPTR{$fq_host} = $location; + } elsif (!$match && $wildcard) { + $match = 1; + unless ($rrtype =~ / (A|AAAA|A6|NSAP) /) { + if ($rrtype =~ / CNAME /) { + $warning = "(*) CNAME RR"; + } elsif ($rrtype =~ / MX /) { + $warning = " (*) MX RR "; + } else { + $warning = "(*) non-A RR"; + } + $spclPTR{$host} = "[$warning]|$spclPTR{$host}"; + } + } + } + if ($match) { + push(@delete_list, $host) unless $warning; + } else { + $spclPTR{$host} = "[no such name]|$spclPTR{$host}"; + } + } else { + $extPTR{$host} = $location; + push(@delete_list, $host); + } + } + foreach $host (@delete_list) { + delete($spclPTR{$host}); + } + + # Attempt to reconcile the HOSTNAME field of any AFSDB RRs that + # were found while scanning a `spcl' or zone data file. + # + @delete_list = (); + scalar(keys(%spclAFSDB)); + while (($host, $location) = each %spclAFSDB) { + if ($host !~ /[^\\]\.$/ || $host eq "$Domain.") { + $match = $warning = 0; + if (exists($Hosts{$host})) { + $match = 1; + } elsif (exists($RRowners{$host})) { + $rrtype = $RRowners{$host}; + if ($rrtype =~ / (A|AAAA|A6) /) { + $match = 1; + } elsif ($rrtype =~ / CNAME /) { + $match = $warning = 1; + $spclAFSDB{$host} = "[CNAME record]|$spclAFSDB{$host}"; + } elsif ($rrtype eq " ") { + $match = $warning = 1; + $spclAFSDB{$host} = "[no RRs exist]|$spclAFSDB{$host}"; + } else { + $match = $warning = 1; + $spclAFSDB{$host} = "[no addr. RR ]|$spclAFSDB{$host}"; + } + } + if ($subzones_exist || (!$match && $wildcards_exist)) { + $fq_host = ($host eq "$Domain.") ? $host : "$host.$domain"; + ($subzone, $wildcard, $rrtype) = &MATCH_DOMAIN($fq_host); + if ($subzone) { + $match = 1; + $warning = 0; + $extAFSDB{$fq_host} = $location; + } elsif (!$match && $wildcard) { + $match = 1; + unless ($rrtype =~ / (A|AAAA|A6) /) { + if ($rrtype =~ / CNAME /) { + $warning = "(*) CNAME RR"; + } elsif ($rrtype =~ / MX /) { + $warning = " (*) MX RR "; + } else { + $warning = "(*) non-A RR"; + } + $spclAFSDB{$host} = "[$warning]|$spclAFSDB{$host}"; + } + } + } + if ($match) { + push(@delete_list, $host) unless $warning; + } else { + $spclAFSDB{$host} = "[no such name]|$spclAFSDB{$host}"; + } + } else { + $extAFSDB{$host} = $location; + push(@delete_list, $host); + } + } + foreach $host (@delete_list) { + delete($spclAFSDB{$host}); + } + + # Attempt to reconcile the INTERMEDIATE-HOST field of any RT RRs + # that were found while scanning a `spcl' or zone data file. + # + @delete_list = (); + scalar(keys(%spclRT)); + while (($host, $location) = each %spclRT) { + if ($host !~ /[^\\]\.$/ || $host eq "$Domain.") { + $match = $warning = 0; + if (exists($Hosts{$host})) { + $match = 1; + } elsif (exists($RRowners{$host})) { + $rrtype = $RRowners{$host}; + if ($rrtype =~ / (A|AAAA|A6|ISDN|X25) /) { + $match = 1; + } elsif ($rrtype =~ / CNAME /) { + $match = $warning = 1; + $spclRT{$host} = "[CNAME record]|$spclRT{$host}"; + } elsif ($rrtype eq " ") { + $match = $warning = 1; + $spclRT{$host} = "[no RRs exist]|$spclRT{$host}"; + } else { + $match = $warning = 1; + $spclRT{$host} = "[no addr. RR ]|$spclRT{$host}"; + } + } + if ($subzones_exist || (!$match && $wildcards_exist)) { + $fq_host = ($host eq "$Domain.") ? $host : "$host.$domain"; + ($subzone, $wildcard, $rrtype) = &MATCH_DOMAIN($fq_host); + if ($subzone) { + $match = 1; + $warning = 0; + $extRT{$fq_host} = $location; + } elsif (!$match && $wildcard) { + $match = 1; + unless ($rrtype =~ / (A|AAAA|A6|ISDN|X25) /) { + if ($rrtype =~ / CNAME /) { + $warning = "(*) CNAME RR"; + } elsif ($rrtype =~ / MX /) { + $warning = " (*) MX RR "; + } else { + $warning = "(*) non-A RR"; + } + $spclRT{$host} = "[$warning]|$spclRT{$host}"; + } + } + } + if ($match) { + push(@delete_list, $host) unless $warning; + } else { + $spclRT{$host} = "[no such name]|$spclRT{$host}"; + } + } else { + $extRT{$host} = $location; + push(@delete_list, $host); + } + } + foreach $host (@delete_list) { + delete($spclRT{$host}); + } + + # Attempt to reconcile the TXTDNAME field of any RP RRs that + # were found while scanning a `spcl' or zone data file. + # + @delete_list = (); + scalar(keys(%spclRP)); + while (($host, $location) = each %spclRP) { + if ($host !~ /[^\\]\.$/ || $host eq "$Domain.") { + $match = $warning = 0; + if (exists($RRowners{$host})) { + $rrtype = $RRowners{$host}; + if ($rrtype =~ / TXT /) { + $match = 1; + } elsif ($rrtype =~ / CNAME /) { + $match = $warning = 1; + $spclRP{$host} = "[CNAME record]|$spclRP{$host}"; + } elsif ($rrtype eq " ") { + $match = $warning = 1; + $spclRP{$host} = "[no RRs exist]|$spclRP{$host}"; + } else { + $match = $warning = 1; + $spclRP{$host} = "[ no TXT RR ]|$spclRP{$host}"; + } + } + if ($subzones_exist || (!$match && $wildcards_exist)) { + $fq_host = ($host eq "$Domain.") ? $host : "$host.$domain"; + ($subzone, $wildcard, $rrtype) = &MATCH_DOMAIN($fq_host); + if ($subzone) { + $match = 1; + $warning = 0; + $extRP{$fq_host} = $location; + } elsif (!$match && $wildcard) { + $match = 1; + unless ($rrtype =~ / TXT /) { + if ($rrtype =~ / CNAME /) { + $warning = "(*) CNAME RR"; + } elsif ($rrtype =~ / MX /) { + $warning = " (*) MX RR "; + } else { + $warning = "(*)nonTXT RR"; + } + $spclRP{$host} = "[$warning]|$spclRP{$host}"; + } + } + } + if ($match) { + push(@delete_list, $host) unless $warning; + } else { + $spclRP{$host} = "[no such name]|$spclRP{$host}"; + } + } else { + $extRP{$host} = $location; + push(@delete_list, $host); + } + } + foreach $host (@delete_list) { + delete($spclRP{$host}); + } + + # Attempt to reconcile the RDATA field of any CNAMEs that + # were found while scanning a `spcl' or zone data file. + # + @delete_list = (); + scalar(keys(%spclCNAME)); + while (($host, $location) = each %spclCNAME) { + if ($host !~ /[^\\]\.$/ || $host eq "$Domain.") { + $match = $warning = 0; + if (exists($Hosts{$host})) { + $match = 1; + } elsif (exists($RRowners{$host})) { + $match = 1; + if ($RRowners{$host} eq " ") { + $warning = 1; + $spclCNAME{$host} = "[no RRs exist]|$spclCNAME{$host}"; + } + } + if ($subzones_exist || (!$match && $wildcards_exist)) { + $fq_host = ($host eq "$Domain.") ? $host : "$host.$domain"; + ($subzone, $wildcard, $rrtype) = &MATCH_DOMAIN($fq_host); + if ($subzone) { + $match = 1; + $extCNAME{$fq_host} = $location; + } elsif (!$match && $wildcard) { + $match = 1; + } + } + if ($match) { + push(@delete_list, $host) unless $warning; + } else { + $spclCNAME{$host} = "[no such name]|$spclCNAME{$host}"; + } + } else { + $extCNAME{$host} = $location; + push(@delete_list, $host); + } + } + foreach $host (@delete_list) { + delete($spclCNAME{$host}); + } + + $answer = keys(%extNS) + keys(%extMX) + keys(%extSRV) + keys(%extPTR) + + keys(%extAFSDB) + keys(%extRT) + keys(%extRP) + keys(%extCNAME); + if ($answer) { + # + # Use `DiG' to to find out if the external domain names refer + # to CNAMEs, lack Address records, or if they even exist. + # + $i = "00"; + $chain_length = $max_chain_length = 0; + $DiG_batch = "$debug_DIR/h2n-dig.bat${i}_$data_fname"; + unless (open(*DIGBATCH, "> $DiG_batch")) { + print STDERR "Couldn't create batch file for `DiG': $!\n"; + print STDERR "Unable to check external domain names.\n"; + %extNS = %extMX = %extPTR = %extRP = %extCNAME = (); + } else { + while (($host, $tmp) = each %extNS) { + print DIGBATCH "$host A \%NS\n"; + } + while (($host, $tmp) = each %extMX) { + print DIGBATCH "$host A \%MX\n"; + } + while (($host, $tmp) = each %extSRV) { + print DIGBATCH "$host A \%SRV\n"; + } + while (($host, $tmp) = each %extPTR) { + print DIGBATCH "$host A \%PTR\n"; + } + while (($host, $tmp) = each %extAFSDB) { + print DIGBATCH "$host A \%AFSDB\n"; + } + while (($host, $tmp) = each %extRT) { + print DIGBATCH "$host A \%RT\n"; + } + while (($host, $tmp) = each %extRP) { + print DIGBATCH "$host TXT \%RP\n"; + } + while (($host, $tmp) = each %extCNAME) { + print DIGBATCH "$host ANY \%CNAME\n"; + } + close(*DIGBATCH); + + if ($answer == 1) { + $tmp = "query for an out-of-zone domain"; + } else { + $tmp = "queries for out-of-zone domains"; + } + print STDOUT "(processing $answer $tmp)\n"; + $query_options = " +noauthority +noadditional +nostats"; + $query_options .= " +$DiG_timeout +$DiG_retries"; + while (-s $DiG_batch) { + # + # Call DiG to process the original batch file plus any + # subsequent batch files that get generated as a result + # of following chained CNAMEs. + # + $debug_file = "$debug_DIR/h2n-dig.ans${i}_$data_fname"; + if ($debug) { + unless (open(*DEBUGOUT, "> $debug_file")) { + print STDERR "Error opening `$debug_file': $!\n"; + print STDERR "Disabling the -debug option for the remainder of the program.\n"; + $debug = 0; + } + } + unless (open(*DIGOUT, "$DiG $query_options -f $DiG_batch 2>&1 |")) { + print STDERR "Error running the `$DiG' program: $!\n"; + print STDERR "Unable to check external domain names.\n"; + %extNS = %extMX = %extSRV = %extPTR = %extAFSDB = %extRT = + %extRP = %extCNAME = (); + close(*DEBUGOUT) if $debug; + $nextbatch = ""; + last; + } + $i++; + $chain_length++; + $nextbatch = "$debug_DIR/h2n-dig.bat${i}_$data_fname"; + unless (open(*NEXTBATCH, "> $nextbatch")) { + $nextbatch_is_open = 0; + } else { + $nextbatch_is_open = 1; + } + $rrtype = $saved_cname = ""; + while (<DIGOUT>) { + print DEBUGOUT $_ if $debug; + chop; + next if /^$/; + if (/^; <<>> DiG \d+\.\d+.* <<>>.* (\S+) (AN?Y?|TXT) %(NS|MX|SRV|PTR|AFSDB|RT|RP|CNAME)=?(\S+)?/) { + $host = $1; + $rrtype = $3; + $cname = $4; + if ($rrtype eq 'CNAME') { + # + # Deal with the various work-arounds that this + # program has to make in order to accommodate a + # small internal buffer size in DiG version 8.2 + # and earlier whereby it overruns the buffer when + # reading a line from a batch file that exceeds + # 100 characters in length. + # + if ($chain_length == 1) { + # + # When the original batch file is created, + # the starting CNAME ($cname) is identical + # to the domain name to be queried ($host). + # To save buffer space, the redundant field + # is not written to the batch file. + # + $cname = $host; + } elsif ($host eq '<NO-OP>') { + # + # When subsequent batch files are created to + # follow chained CNAMEs, it may be necessary + # to split the batch file entry into two lines. + # A dummy name is assigned to "$host" followed + # by the real base CNAME in its expected field. + # + $saved_cname = $cname; + } elsif ($saved_cname) { + # + # This section is reached when the second line + # of the split-line work-around is reached. + # The "$host" variable contains the chained + # CNAME to be queried while the "$cname" + # variable has just been set to null. + # Restore the value of the base CNAME from the + # prior input line to complete the work-around. + # + $cname = $saved_cname; + $saved_cname = ""; + } + } + $status = $result = ""; + $query_section = $first_answer = 0; + next; + } elsif (/^;.+(connection |no route|unreachable|...malformed|packet size error|Message too long)/i) { + # + # Check the "$rrtype" variable as a precaution against + # accidentally overwriting the result of the last + # successful lookup in case synchronization is lost. + # This step is necessary in order to accommodate + # versions 9.0.1 of DiG which fail to echo the command + # line when encountering any type of connection failure. + # + next unless $rrtype; + s/.+(timed out).*/ $1 /; + s/.+(refused).*/con. $1/; + s/.+(no route).+/ $1 /; + s/.+(unreachable).+/$1 /; + s/.+(...malformed|packet size error|Message too long).*/bad DNS msg./i; + $result = $_; + # + # Instead of getting the next line, we'll fall through + # to the section where a non-null "$result" variable + # is processed and throw in the towel for this batch + # file entry. It's pointless and likely futile to + # wait for the sanity check in the Query Section. + # + } elsif (/^;.+HEADER.+opcode: QUERY, status: ([^,]+)/) { + $status = $1; + if ($status ne 'NOERROR') { + $status = " $status " if length($status) == 6; + $status .= " " if length($status) < 8; + $result = " $status "; + $status = ""; + } + next; # trust nothing until the Query Section + } elsif ($status && /^;.+flags: (.*); QUE.*, ANS[^:]*: (\d+), AUTH[^:]*: (\d+), ADDIT[^:]*: (\d+)/i) { + $flags = $1; + $answer = $2; + $authority = $3; + $additional = $4; + if ($answer == 0) { + if ($rrtype =~ /^(NS|MX|SRV|PTR|AFSDB|RT)$/) { + $result = "no A record "; + } elsif ($rrtype eq 'RP') { + $result = " no TXT RR "; + } else { + # + # Hmm. The domain name must exist since + # the status of the query is NOERROR and + # yet there are no answers for ANY resource + # records. This can happen when querying + # for an interior label of an existing + # domain name, e.g., + # + # a.foo.example.com exists as a RR in the + # `example.com' zone + # foo.example.com does *not* exist as a RR + # + # We would be here if an ANY query were made + # for the domain name `foo.example.com' since + # no RRs exist at that node in the DNS + # namespace hierarchy. + # + $result = "no RRs exist"; + } + $status = ""; + } else { + # + # Prepare for the Answer Section once we pass + # the sanity check in the Query Section. + # + $first_answer = 1; + } + next; # trust nothing until the Query Section + } elsif (/^;; QUE.+:$/) { + $query_section = 1; + next; + } + next if !$rrtype || $host eq '<NO-OP>'; + if ($query_section && /^;;?\s*(\S+)\s+/) { + $tmp = lc($1); + $query_section = 0; + if ($tmp =~ /,$/) { + # + # DiG versions through 8.X match this pattern. + # + $tmp =~ s/,$/./; + $tmp = "." if $tmp eq ".."; # '.' zone special case + } + if ($tmp ne $host) { + # + # The domain name that was passed to DiG in the + # batch file and which appears on the echoed + # command line is *not* what DiG actually used + # when making its query. A line in the batch + # file that exceeded "$DiG_bufsize" in length + # is the likely source of DiG's buffer overrun. + # All we can do now is report what occurred and + # then resynchronize on the next line from the + # batch input file. + # + $result = "buffer error"; + $status = ""; + $first_answer = 0; + if ($chain_length > 1 && exists($baseCNAME{$host})) { + # + # Recover the "$cname" field that was most + # likely trashed due to the buffer overrun. + # + $cname = $baseCNAME{$host}; + } + } + } + if ($chain_length > 1) { + # + # The backup copy of the base CNAME is no longer needed. + # Remove the chained CNAME key for possible re-use. + # + delete($baseCNAME{$host}); + } + if ($result) { + if ($rrtype eq 'NS') { + $extNS{$host} = "[$result]|$extNS{$host}"; + } elsif ($rrtype eq 'MX') { + $extMX{$host} = "[$result]|$extMX{$host}"; + } elsif ($rrtype eq 'SRV') { + $extSRV{$host} = "[$result]|$extSRV{$host}"; + } elsif ($rrtype eq 'PTR') { + $extPTR{$host} = "[$result]|$extPTR{$host}"; + } elsif ($rrtype eq 'AFSDB') { + $extAFSDB{$host} = "[$result]|$extAFSDB{$host}"; + } elsif ($rrtype eq 'RT') { + $extRT{$host} = "[$result]|$extRT{$host}"; + } elsif ($rrtype eq 'RP') { + $extRP{$host} = "[$result]|$extRP{$host}"; + } else { + if ($chain_length == 1) { + # + # Despite the name of the control variable, + # there's no CNAME chain here; a bigger + # problem has caused us to bail out early. + # + if ($show_nxdomain_cnames + || $result !~ /(NXDOMAIN|no RRs exist)/) { + $extCNAME{$cname} = "[$result]|$extCNAME{$cname}"; + } else { + # + # We are not interested in reporting any + # dangling CNAMEs. + # + delete($extCNAME{$cname}); + } + } elsif (exists($extCNAME{$cname})) { + # + # The reason we tested for the existence of + # "$cname" as a hash key is that we might + # not have been able to recover the backup + # copy after a buffer overrun was detected. + # + if ($show_chained_cnames + || $show_nxdomain_cnames + || $result !~ /(NXDOMAIN|no RRs exist)/) { + $extCNAME{$cname} =~ s/\[.+\]/[$result]/; + $max_chain_length = $chain_length; + } else { + delete($extCNAME{$cname}); + } + } + } + # Setting "$rrtype" to null after detecting either a + # buffer overrun or a non-NOERROR query status will + # effectively ignore DiG's output until the next echoed + # DiG command in the output stream. This effectively + # allows a resynchronization to take place and prevents + # the accidental overwriting of valid data. + # + $rrtype = "" if $result eq "buffer error" || !$status; + $result = ""; + } + next unless $status; + if ($first_answer && /^[^;]/) { + if (/\sCNAME\s+(\S+)$/) { + $cname_n = lc($1); + if ($rrtype eq 'NS') { + $extNS{$host} = "[CNAME record]|$extNS{$host}"; + } elsif ($rrtype eq 'MX') { + $extMX{$host} = "[CNAME record]|$extMX{$host}"; + } elsif ($rrtype eq 'SRV') { + $extSRV{$host} = "[CNAME record]|$extSRV{$host}"; + } elsif ($rrtype eq 'PTR') { + $extPTR{$host} = "[CNAME record]|$extPTR{$host}"; + } elsif ($rrtype eq 'AFSDB') { + $extAFSDB{$host} = "[CNAME record]|$extAFSDB{$host}"; + } elsif ($rrtype eq 'RT') { + $extRT{$host} = "[CNAME record]|$extRT{$host}"; + } elsif ($rrtype eq 'RP') { + $extRP{$host} = "[CNAME record]|$extRP{$host}"; + } else { + # + # Follow the CNAME chain. + # + $cname_loop = 0; + if ($chain_length == 1) { + # + # Regardless of one's opinion about CNAME + # chains being bad practice or a feature, + # record this status as well as the current + # chain length until final resolution can + # be determined. This program's default + # behavior is to treat chained CNAMEs as + # no problem as long as a non-CNAME RR is + # ultimately resolved. + # + $extCNAME{$cname} = "[CNAME chain ](1)|$extCNAME{$cname}"; + $chainCNAME{$cname} = [ $cname ]; + } + for ($k = 0; $k < $chain_length; $k++) { + # + # Before rushing off to follow the latest + # CNAME, make sure it's not one that we've + # already encountered in the current chain. + # + if ($chainCNAME{$cname}[$k] eq $cname_n) { + $extCNAME{$cname} =~ s/^[^\|]+/[ CNAME loop ]\($chain_length\)/; + $cname_loop = 1; + last; + } + } + # + # Regardless of whether or not we've discovered + # a CNAME loop, maintain accuracy by updating + # the chain length of the base CNAME and add + # the latest CNAME to the list of chain members. + # + $extCNAME{$cname} =~ s/ \]\(\d+\)/ \]\($chain_length\)/; + push @{ $chainCNAME{$cname} }, $cname_n; + if ($nextbatch_is_open && !$cname_loop) { + # + # Find out where the chained CNAME leads us + # by creating the appropriate entry in the + # pending DiG batch file. + # + $buffer = "$cname_n ANY \%CNAME=$cname\n"; + if (length($buffer) > $DiG_bufsize) { + # + # Avoid creating a buffer overrun in + # DiG by splitting the necessary data + # across two lines of batch input. + # + print NEXTBATCH "<NO-OP> ANY \%CNAME=$cname\n"; + print NEXTBATCH "$cname_n ANY \%CNAME\n"; + } else { + print NEXTBATCH $buffer; + # + # If a buffer overrun occurs despite + # our efforts, the field most likely + # to be trashed is the one holding the + # value of "$cname". As an exercise in + # paranoid programming, we'll create + # a reverse-lookup hash as a way to + # recover the base CNAME in case our + # fears are realized. + # + unless (exists($baseCNAME{$cname_n})) { + $baseCNAME{$cname_n} = $cname; + } else { + # + # No can do. Another base CNAME + # has already submitted a query to + # the current batch file for the + # same chained CNAME. Not only do + # we have to give up the current + # backup attempt, the original base + # CNAME that got here first must + # also abandon its backup copy. + # + $baseCNAME{$cname_n} = ""; + } + } + } else { + # + # The buck just stopped. + # Update the cosmetic control variable. + # + $max_chain_length = $chain_length; + } + } + } else { + # + # All is well - either an Address RR exists for the + # object of the NS, MX, or PTR RR or the CNAME RR + # points to something other than another CNAME. + # + if ($rrtype eq 'NS') { + delete($extNS{$host}); + } elsif ($rrtype eq 'MX') { + delete($extMX{$host}); + } elsif ($rrtype eq 'SRV') { + delete($extSRV{$host}); + } elsif ($rrtype eq 'PTR') { + delete($extPTR{$host}); + } elsif ($rrtype eq 'AFSDB') { + delete($extAFSDB{$host}); + } elsif ($rrtype eq 'RT') { + delete($extRT{$host}); + } elsif ($rrtype eq 'RP') { + delete($extRP{$host}); + } elsif ($show_chained_cnames && $extCNAME{$cname} =~ /\]\(\d+\)/) { + $max_chain_length = $chain_length; + } else { + delete($extCNAME{$cname}); + } + } + $first_answer = 0; # Ignore remaining output until + $rrtype = $status = ""; # the next batch entry is read. + } + } + close(*NEXTBATCH) if $nextbatch_is_open; + + # BIND's observed limits of chasing CNAME chains are: + # + # * BIND 8 will chase 8 CNAMEs - if #8 points to a non-CNAME + # RR, you'll get the answer. If #8 points to yet another + # CNAME, you'll get the 9 CNAMEs and the response code will + # be set to SERVFAIL. + # + # * BIND 9 will chase 16 CNAMEs - if #16 points to a non-CNAME + # RR, you'll get the answer. If #16 points to yet another + # CNAME, you'll get the 17 CNAMEs with a NOERROR response + # code. + # + # The loop that follows chained CNAMEs will exhaust itself + # naturally or when the 17th iteration is reached. + # + unlink($nextbatch) if -z $nextbatch; + if ($chain_length == 17) { + unlink($nextbatch) unless $debug; + $nextbatch = ""; + $max_chain_length = 17; + } + close(*DIGOUT); + if ($debug) { + close(*DEBUGOUT); + } else { + unlink($DiG_batch); + # + # Clean up any leftover debug file of DiG's output + # from a prior run if the -debug option was specified. + # + unlink($debug_file) if -e $debug_file; + } + $DiG_batch = $nextbatch; + } + } + } + + # Ideally, all of the hashes should be empty. + # If not, here's where the warnings get reported. + # Note: The `if' tests are structured to prevent short-circuiting so + # that there are no passed-over calls to the keys() function + # for initializing the iterator of each hash. + # + if ((keys(%NSlist) + keys(%extNS))) { + print STDERR "${n}Warning: found NS RR(s) pointing to the following problematic domain name(s):\n"; + $n = ""; + while (($host, $tmp) = each %NSlist) { + # + # If DiG generates output that is unexpected in either content + # or sequence and it is detected by the `h2n' output parser, + # the value of the hash index may lack the assignment of the + # status field as the parser attempts to resynchronize. + # In such cases, assign a generic status field that indicates + # roughly what happened. + # + $host .= ".$domain" unless $host =~ /(^|[^\\])\.$/; + $tmp = "[sync. error ]|$tmp" unless $tmp =~ /\|/; + ($status, $location) = split('\|', $tmp, 2); + $location = "" if $verify_mode && $location ne "(SOA MNAME)"; + printf STDERR "%s%s %s\n", &TAB(" $host", $t), $status, $location; + } + while (($host, $tmp) = each %extNS) { + $tmp = "[sync. error ]|$tmp" unless $tmp =~ /\|/; + ($status, $location) = split('\|', $tmp, 2); + $location = "" if $verify_mode && $location ne "(SOA MNAME)"; + printf STDERR "%s%s %s\n", &TAB(" $host", $t), $status, $location; + } + } + if ((keys(%MXlist) + keys(%extMX))) { + print STDERR "${n}Warning: found MX RR(s) pointing to the following problematic domain name(s):\n"; + $n = ""; + while (($host, $tmp) = each %MXlist) { + $host .= ".$domain" unless $host =~ /(^|[^\\])\.$/; + $tmp = "[sync. error ]|$tmp" unless $tmp =~ /\|/; + ($status, $location) = split('\|', $tmp, 2); + $location = "" if $verify_mode; + printf STDERR "%s%s %s\n", &TAB(" $host", $t), $status, $location; + } + while (($host, $tmp) = each %extMX) { + $tmp = "[sync. error ]|$tmp" unless $tmp =~ /\|/; + ($status, $location) = split('\|', $tmp, 2); + $location = "" if $verify_mode; + printf STDERR "%s%s %s\n", &TAB(" $host", $t), $status, $location; + } + } + if ((keys(%spclSRV) + keys(%extSRV))) { + print STDERR "${n}Warning: found SRV RR(s) pointing to the following problematic domain name(s):\n"; + $n = ""; + while (($host, $tmp) = each %spclSRV) { + $host .= ".$domain" unless $host =~ /(^|[^\\])\.$/; + $tmp = "[sync. error ]|$tmp" unless $tmp =~ /\|/; + ($status, $location) = split('\|', $tmp, 2); + $location = "" if $verify_mode; + printf STDERR "%s%s %s\n", &TAB(" $host", $t), $status, $location; + } + while (($host, $tmp) = each %extSRV) { + $tmp = "[sync. error ]|$tmp" unless $tmp =~ /\|/; + ($status, $location) = split('\|', $tmp, 2); + $location = "" if $verify_mode; + printf STDERR "%s%s %s\n", &TAB(" $host", $t), $status, $location; + } + } + if ((keys(%spclPTR) + keys(%extPTR))) { + print STDERR "${n}Warning: found PTR RR(s) pointing to the following problematic domain name(s):\n"; + $n = ""; + while (($host, $tmp) = each %spclPTR) { + $host .= ".$domain" unless $host =~ /(^|[^\\])\.$/; + $tmp = "[sync. error ]|$tmp" unless $tmp =~ /\|/; + ($status, $location) = split('\|', $tmp, 2); + $location = "" if $verify_mode; + printf STDERR "%s%s %s\n", &TAB(" $host", $t), $status, $location; + } + while (($host, $tmp) = each %extPTR) { + $tmp = "[sync. error ]|$tmp" unless $tmp =~ /\|/; + ($status, $location) = split('\|', $tmp, 2); + $location = "" if $verify_mode; + printf STDERR "%s%s %s\n", &TAB(" $host", $t), $status, $location; + } + } + if ((keys(%spclAFSDB) + keys(%extAFSDB))) { + print STDERR "${n}Warning: found AFSDB RR(s) pointing to the following problematic dom. name(s):\n"; + $n = ""; + while (($host, $tmp) = each %spclAFSDB) { + $host .= ".$domain" unless $host =~ /(^|[^\\])\.$/; + $tmp = "[sync. error ]|$tmp" unless $tmp =~ /\|/; + ($status, $location) = split('\|', $tmp, 2); + $location = "" if $verify_mode; + printf STDERR "%s%s %s\n", &TAB(" $host", $t), $status, $location; + } + while (($host, $tmp) = each %extAFSDB) { + $tmp = "[sync. error ]|$tmp" unless $tmp =~ /\|/; + ($status, $location) = split('\|', $tmp, 2); + $location = "" if $verify_mode; + printf STDERR "%s%s %s\n", &TAB(" $host", $t), $status, $location; + } + } + if ((keys(%spclRT) + keys(%extRT))) { + print STDERR "${n}Warning: found RT RR(s) pointing to the following problematic domain name(s):\n"; + $n = ""; + while (($host, $tmp) = each %spclRT) { + $host .= ".$domain" unless $host =~ /(^|[^\\])\.$/; + $tmp = "[sync. error ]|$tmp" unless $tmp =~ /\|/; + ($status, $location) = split('\|', $tmp, 2); + $location = "" if $verify_mode; + printf STDERR "%s%s %s\n", &TAB(" $host", $t), $status, $location; + } + while (($host, $tmp) = each %extRT) { + $tmp = "[sync. error ]|$tmp" unless $tmp =~ /\|/; + ($status, $location) = split('\|', $tmp, 2); + $location = "" if $verify_mode; + printf STDERR "%s%s %s\n", &TAB(" $host", $t), $status, $location; + } + } + if ((keys(%spclRP) + keys(%extRP))) { + print STDERR "${n}Warning: found RP RR(s) pointing to the following problematic TXT domain(s):\n"; + $n = ""; + while (($host, $tmp) = each %spclRP) { + $host .= ".$domain" unless $host =~ /(^|[^\\])\.$/; + $tmp = "[sync. error ]|$tmp" unless $tmp =~ /\|/; + ($status, $location) = split('\|', $tmp, 2); + $location = "" if $verify_mode; + printf STDERR "%s%s %s\n", &TAB(" $host", $t), $status, $location; + } + while (($host, $tmp) = each %extRP) { + $tmp = "[sync. error ]|$tmp" unless $tmp =~ /\|/; + ($status, $location) = split('\|', $tmp, 2); + $location = "" if $verify_mode; + printf STDERR "%s%s %s\n", &TAB(" $host", $t), $status, $location; + } + } + if ((keys(%spclCNAME) + keys(%extCNAME))) { + print STDERR "${n}Warning: found CNAME(s) pointing to the following problematic domain name(s):\n"; + print STDERR "(numbers within parentheses represent the length of a CNAME chain)\n" if $max_chain_length; + $n = ""; + if (!$max_chain_length || $verify_mode) { + $i = ""; + } else { + $i = ($max_chain_length < 10) ? " " : " "; + } + while (($host, $tmp) = each %spclCNAME) { + $host .= ".$domain" unless $host =~ /(^|[^\\])\.$/; + $tmp = "[sync. error ]|$tmp" unless $tmp =~ /\|/; + ($status, $location) = split('\|', $tmp, 2); + $status .= ($status =~ /\)$/) ? "" : $i; + $location = "" if $verify_mode; + printf STDERR "%s%s %s\n", &TAB(" $host", $t), $status, $location; + } + while (($host, $tmp) = each %extCNAME) { + $tmp = "[sync. error ]|$tmp" unless $tmp =~ /\|/; + ($status, $location) = split('\|', $tmp, 2); + $status .= ($status =~ /\)$/) ? "" : $i; + $location = "" if $verify_mode; + printf STDERR "%s%s %s\n", &TAB(" $host", $t), $status, $location; + if ($show_chained_cnames && $status =~ /\]\((\d+)\)/) { + $chain_length = $1; + for ($k = 1; $k <= $chain_length; $k++) { + print STDERR " > $chainCNAME{$host}[$k]\n"; + } + } + + } + } + # Undefine data structures that are no longer needed so that + # the hashes and lists in the NS-related audits that follow + # have room to grow. + # + unless ($verify_delegations) { + undef %NSlist; + undef %extNS; + } + undef %MXlist; + undef %extMX; + undef %spclSRV; + undef %extSRV; + undef %spclPTR; + undef %extPTR; + undef %spclAFSDB; + undef %extAFSDB; + undef %spclRT; + undef %extRT; + undef %spclRP; + undef %extRP; + undef %spclCNAME; + undef %extCNAME; + undef %baseCNAME; + undef %chainCNAME; + + if (keys(%NSowners)) { + # + # Check that each zone has at least two listed name servers + # and, if so, that the TTLs of the NS RRset are consistent. + # While we're at it, name servers in child zones will trigger + # a check for necessary glue in this (the parent) zone. + # + $last_zone = ""; + @delete_list = (); + while (($zone, $buffer) = each %NSowners) { + # + # Cycle through each zone. Before plowing ahead, however, + # this is the time to identify any invalid "grandchild" + # zones that may have come our way, e.g., + # + # $ORIGIN example.com. + # @ IN SOA ... + # ... + # child IN NS ns.child ; valid delegation + # ns.child IN A 192.249.249.3 ; valid glue + # child.child IN NS ns.child.child ; invalid delegation + # ; NS RR below zone cut + # ns.child.child IN A 192.249.249.4 ; invalid - non-glue + # ; A RR below zone cut + # + # Up to now, these instances have been treated like any other + # domain in that DiG has been called to look up references to + # these out-of-zone domains when they have appeared in the RDATA + # fields of the record types that `h2n' scrutinizes. + # From now on, however, these out-of-context NS records have + # no meaning and will be removed from the %NSowners hash. + # They'll be reported a bit later as just another occurrence + # of non-glue below a zone cut. + # + if ($zone ne "$Domain.") { + $status = 1; + $subzone = $zone; + while ($subzone =~ /(\\[.]|[^.])*\./) { + $subzone =~ s/(\\[.]|[^.])*\.//; # remove leftmost label + if (exists($NSowners{$subzone})) { + # + # Our original "$zone" is a bogus delegation because of + # an existing delegation between it and the parent zone. + # + push(@delete_list, $zone); + $status = 0; + last; + } + } + next unless $status; + } + $ns_count = 0; + while ($buffer) { + # + # For each zone, cycle through each listed name server. + # + ($ttl, $host, $buffer) = split(' ', $buffer, 3); + $ns_count++; + if ($ns_count == 1) { + $answer = $ttl; + } elsif ($status) { + unless ($ttl == $answer) { + push(@NSrfc2181, $zone); + $status = 0; + } + } + unless ($host =~ /(^|[^\\])\.$/) { + # + # The domain name of the name server is not absolute and + # thus may be located in the zone that is currently being + # iterated. If so, make a search for the required glue RR. + # + # Be advised that your mileage may vary when this section + # is working in verify mode. That's because a name server + # that started out with missing glue may have fetched the + # missing A, AAAA, and/or A6 records from some other + # name server during the course of a recursive query. + # Fetched glue is included in a zone transfer unless + # requested from a name server that has been configured + # with the "recursion no" *and* "fetch-glue no" options + # or the name server is running BIND 9. + # NOTE: Per RFC-1034, delegation effectively cancels + # wildcard matching. Therefore, a wildcard can + # not be used as a glue record, e.g., the + # following A record does *not* qualify as glue: + # + # $ORIGIN example.com. + # child NS ns.child + # *.child A 192.168.1.1 + # + # Unfortunately, not all name server implementations + # treat this condition correctly. BIND 4/8 will go + # ahead and synthesize the following record in the + # answer or additional section of a response: + # + # ns.child.example.com. A 192.168.1.1 + # + # This is related to the design limitation of all + # served zones being contained in a single database. + # BIND 9, however, strictly complies with the RFC + # and will *not* match `ns.child.example.com.' with + # the wildcard record in the parent zone. + # + ($subzone, $wildcard, $rrtype) = &MATCH_DOMAIN("$host.$domain"); + if ($subzone && ("$zone.$domain" eq $subzone + || $zone eq "$Domain.")) { + $match = 0; + if (exists($Hosts{$host})) { + $match = 1; + } elsif (exists($RRowners{$host})) { + $match = 1 if $RRowners{$host} =~ / (A|AAAA|A6) /; + } + if ($match) { + # + # Register the glue record so that it can be + # identified a bit later during the check for + # non-glue records at or below a zone cut. + # + $glue_RRs{$host} = 1; + } else { + unless ($last_zone) { + print STDERR "${n}Warning: found NS RR(s) to be missing the requisite glue record(s):\n \$ORIGIN $Domain.\n"; + $n = ""; + } + if ($zone ne $last_zone) { + $last_zone = $zone; + $authority = ($zone eq "$Domain.") ? '@' : $zone; + printf STDERR "%s\t%s\tIN NS\t%s\n", &TAB(" $authority", 16), $ttl, $host; + } else { + printf STDERR "%s\t%s\tIN NS\t%s\n", &TAB(" ", 16), $ttl, $host; + } + } + } + } + } + push(@NSrfc1034, $zone) if $ns_count == 1; + } + # Now that we're no longer iterating over %NSowners, remove + # the bogus delegations that were marked for deletion. + # + foreach $subzone (@delete_list) { + delete($NSowners{$subzone}); + } + + if (@NSrfc1034) { + print STDERR "${n}Warning: found zone(s) not having at least two listed name servers (RFC-1034):\n \$ORIGIN $Domain.\n"; + $n = ""; + foreach $zone (@NSrfc1034) { + ($ttl, $host) = split(' ', $NSowners{$zone}); + $authority = ($zone eq "$Domain.") ? '@' : $zone; + printf STDERR "%s\t%s\tIN NS\t%s\n", &TAB(" $authority", 16), $ttl, $host; + } + } + + if (@NSrfc2181) { + print STDERR "${n}Warning: found NS RRset(s) with inconsistent TTL values (RFC-2181):\n \$ORIGIN $Domain.\n"; + $n = ""; + foreach $zone (@NSrfc2181) { + $buffer = $NSowners{$zone}; + $ns_count = 1; + while ($buffer) { + ($ttl, $host, $buffer) = split(' ', $buffer, 3); + if ($ns_count == 1) { + $authority = ($zone eq "$Domain.") ? '@' : $zone; + printf STDERR "%s\t%s\tIN NS\t%s\n", &TAB(" $authority", 16), $ttl, $host; + } else { + printf STDERR "%s\t%s\tIN NS\t%s\n", &TAB(" ", 16), $ttl, $host; + } + $ns_count++; + } + } + } + # Undefine the lists that are no longer needed in order to provide + # the "%non_glue_RRs" hash with the maximum amount of headroom. + # + undef @NSrfc1034; + undef @NSrfc2181; + undef @delete_list; + + # Starting with BIND 8.2.3 but not (yet) in BIND 9, master zones will + # not load if non-glue, non-address resource records appear at or + # below any zone cut. In other words, no child-zone data is (should be) + # permitted in the parent zone unless it is glue. + # Now that all child zones and resource records are known and existing + # glue has been identified, this inspection can proceed. + # + scalar(keys(%RRowners)); + while (($host, $rrtype) = each %RRowners) { + next if $host eq "$Domain."; + ($subzone, $wildcard, $tmp) = &MATCH_DOMAIN("$host.$domain"); + if ($subzone) { + if ("$host.$domain" eq $subzone) { + # + # We are at a zone cut. Remove the NS RRtype + # and, if present, the KEY RRtype. + # + 1 while $rrtype =~ s/ (NS|KEY) / /; + } + if (exists($glue_RRs{$host})) { + # + # This domain name exists as required glue - which is good. + # What's bad is if the domain name has a record type other + # than A, AAAA, or A6 (if we're still at a zone cut, the + # NS and KEY records have already been taken care of). + # + 1 while $rrtype =~ s/ (A|AAAA|A6) / /; + } + next if $rrtype eq " "; + $non_glue_RRs{$host} = $rrtype; + } + } + scalar(keys(%Hosts)); + while (($host, $tmp) = each %Hosts) { + $host = lc($host); # in case the -P option is in effect + ($subzone, $wildcard, $tmp) = &MATCH_DOMAIN("$host.$domain"); + if ($subzone) { + # + # Only A records of canonical names are represented in the + # "%Hosts" hash. These will either be glue or non-glue. + # + next if exists($glue_RRs{$host}); + $non_glue_RRs{$host} = " A "; + } + } + if (keys(%non_glue_RRs)) { + print STDERR "${n}Warning: found the following non-glue domain name(s) at or below a zone cut:\n \$ORIGIN $Domain.\n"; + $n = ""; + $warning = 0; + while (($host, $rrtype) = each %non_glue_RRs) { + $match = 1; + while ($rrtype =~ /\S/) { + $tmp = $rrtype; + $tmp =~ /^\s*(\S+)(.*)/; + $tmp = $1; + $rrtype = $2; + $warning = 1 unless $tmp =~ /^(A|AAAA)$/; + if ($match) { + printf STDERR "%s%s\t...\n", &TAB(" $host", 32), $tmp; + $match = 0; + } else { + printf STDERR "%s%s\t...\n", &TAB(" ", 32), $tmp; + } + } + } + $Load_Status = 3 if $warning && $BIND_version_num >= 80203 + && $BIND_version_num < 90000; + } + } + + if ($n) { + return 0; + } else { + print STDERR "\n" unless $verify_mode; + return 1; + } +} + + +# +# Do some basic sanity checks on the SOA timer values. These checks +# are the same ones that BIND performs when a zone is loaded. +# +# Return values: +# 0 = no warnings +# 1 = warnings +# +sub CHECK_SOA_TIMERS { + my ($expire, $expire_sec, $message, $n, $refresh, $refresh_sec); + my ($retry, $retry_sec, $ttl, $ttl_sec); + + # If the READ_RRs subroutine detected a bad or missing SOA timer, + # there is no point in proceeding. Exit with a successful return + # code since the error has already been reported. + # + return 0 unless $valid_SOA_timers; + + $refresh = ($Refresh) ? $Refresh : $DefRefresh; + $retry = ($Retry) ? $Retry : $DefRetry; + $expire = ($Expire) ? $Expire : $DefExpire; + if ($Ttl) { + $ttl = $Ttl; + } else { + $ttl = ($rfc2308) ? $DefNegCache : $DefTtl; + } + $refresh_sec = &SECONDS($refresh); + $retry_sec = &SECONDS($retry); + $expire_sec = &SECONDS($expire); + $ttl_sec = &SECONDS($ttl); + $message = ""; + + if ($expire_sec < ($refresh_sec + $retry_sec)) { + $message = " SOA expire value is less than SOA refresh + retry\n [$expire < $refresh + $retry]"; + } + if ($expire_sec < ($refresh_sec + (10 * $retry_sec))) { + $n = ($message) ? ".\n" : ""; + $message .= "$n SOA expire value is less than SOA refresh + (10 * retry)\n [$expire < $refresh + (10 * $retry)]"; + } + if ($expire_sec < (7 * 24 * 3600)) { + $n = ($message) ? ".\n" : ""; + $message .= "$n SOA expire value ($expire) is less than 7 days"; + } + if ($expire_sec > (183 * 24 * 3600)) { + $n = ($message) ? ".\n" : ""; + $message .= "$n SOA expire value ($expire) is greater than 6 months"; + } + if ($refresh_sec < (2 * $retry_sec)) { + $n = ($message) ? ".\n" : ""; + $message .= "$n SOA refresh value is less than SOA retry * 2 [$refresh < ($retry * 2)]"; + } + if (!$verify_mode && $rfc2308 && $ttl_sec > 10800) { + $n = ($message) ? ".\n" : ""; + $message .= "$n SOA negative cache value ($ttl) exceeds recommended maximum of 3 hours"; + } + if ($message) { + if ($verify_mode) { + print STDERR "\nWarning: found the following problematic SOA time interval(s):\n"; + } else { + print STDERR "Warning: the -o/+t option values generated the following message(s):\n"; + } + print STDERR "$message.\n"; + return 1; + } else { + return 0; + } +} + + +# +# Perform various consistency checks on zone data for each domain +# specified with the -V option. The zone transfer data must first +# be processed by the "READ_RRs" subroutine before this one is called. +# Checks are made for the following conditions: +# * SOA records containing time specifications with extreme values +# (via the "CHECK_SOA_TIMERS" subroutine). +# * NS, MX, and PTR records that point to CNAMEs or domain names +# with no Address records or to nonexistent domain names (via the +# "AUDIT_RRs" subroutine). +# * CNAME records that point to nonexistent domain names, i.e., +# "dangling" CNAMEs (via the "AUDIT_RRs" subroutine). +# * Zones with only one listed name server (violates RFC-1034), +# NS RRsets with inconsistent TTL values (violates RFC-2181), +# and NS RRs with missing glue (via the "AUDIT_RRs" subroutine). +# * Lame delegations and name servers that are not running +# or are unresponsive. Accomplished with the `check_del' +# program but only if delegation checking is not purposely +# disabled by specifying the `-no-check-del' option. +# +# NOTE: In order to not adversely affect the amount of time that +# `h2n' takes in its normal task of generating zone data, +# future consistency checks should be limited to the -V option by +# placing them into this subroutine instead of "AUDIT_RRs". +# +# Return values: +# 0 = no warnings +# 1 = warnings +# +sub CHECK_ZONE { + my ($warning_status) = @_; + my ($answer, $buffer, $debug_file, $del_batch, $domain, $first_answer); + my ($fq_host, $host, $i, $n, $t, $ttl, $zone); + my (%check_del_RRs, @zone_rrset, @sorted_rrset, $ns_data, $mismatch); + + + if ($BIND_ver_msg) { + print STDERR "\nWarning: the name server supplying the zone data is running a version\n of BIND that may be vulnerable to the following bug(s):\n"; + print STDERR "$BIND_ver_msg\n"; + } + + # First do some sanity checks on the SOA timer values and then call + # the "AUDIT_RRs" subroutine so that the %NSlist and %extNS data + # structures can be referenced. These hashes are needed to prepare + # an appropriate list of name servers for which proper delegation is + # to be checked. + # + $n = (&AUDIT_RRs(&CHECK_SOA_TIMERS)) ? "" : "\n"; + + # Per RFC-1034, the NS RRsets that surround a zone cut are required + # to be kept consistent. We will now check for this by comparing + # the NS RRset from the original DNS query (ostensibly above the zone + # cut) to the NS RRset obtained from the zone transfer data, i.e., + # below the zone cut). Our mileage may vary, however, because the + # name server(s) that supplied the answer to the recursive DNS query + # may have discovered and replaced the less credible NS RRset above + # the zone cut with the authoritative (and thus more credible) NS + # RRset from the zone itself. + # + # Note: As previously mentioned in the main program, a future + # version of `h2n' will use a query strategy that + # attempts to consistently obtain the NS RRset of the + # delegating parent zone (above the zone cut). However, + # even this strategy may not succeed under the following + # conditions: + # + # 1. The name server is running BIND 4 or 8. + # 2. The same name server is authoritative for the child + # zone as well as the parent zone, i.e., both sides + # of the zone cut. + # + # In this case, the authoritative NS RRset of the child + # zone will always be returned. This is due to the fact + # that BIND 4 and 8 name servers have just one database + # for storing data. Both NS RRsets can't occupy the same + # space and so the authoritative data always wins. + # Another side-effect of this scenario is if the parent + # zone is being verified. Missing glue will not be detected + # for the same reason. It will always be "filled in" by the + # presence of the child zone's authoritative data. + # BIND 9 name servers, in contrast, have separate internal + # databases for each zone and, thus, exhibit none of these + # anomalies. + # + # + $domain = ($Domain) ? "$Domain." : ""; # accommodate the root zone + ($ns_data = $NSowners{"$Domain."}) =~ s/ \d+ (\S+)/$1 /g; + $ns_data =~ s/([^.]|\\[.]) /$1.$domain /g; + @zone_rrset = split(' ', $ns_data); + @sorted_rrset = sort { $a cmp $b } @zone_rrset; + @zone_rrset = @sorted_rrset; + @sorted_rrset = sort { $a cmp $b } @DNSrrset; + @DNSrrset = @sorted_rrset; + $mismatch = 0; + unless (scalar(@DNSrrset) == scalar(@zone_rrset)) { + $mismatch = 1; + } else { + for ($i = 0; $i < scalar(@DNSrrset); $i++) { + if ($DNSrrset[$i] ne $zone_rrset[$i]) { + $mismatch = 1; + last; + } + } + } + if ($mismatch) { + print STDERR "${n}Warning: found inconsistent NS RRsets surrounding the zone boundary (RFC-1034):\n"; + $n = ""; + $t = (length(" $Domain.") <= 20) ? 16 : 24; + for ($i = 0; $i < @DNSrrset; $i++) { + if ($i == 0) { + printf STDERR "%s\tIN NS\t%s\n", &TAB(" $Domain.", $t), $DNSrrset[$i]; + } else { + printf STDERR "%s\tIN NS\t%s\n", &TAB(" ", $t), $DNSrrset[$i]; + } + } + print STDERR " (non-authoritative)\n"; + print STDERR " ---------------------------- zone cut ----------------------------\n"; + print STDERR " ( authoritative )\n"; + for ($i = 0; $i < @zone_rrset; $i++) { + if ($i == 0) { + printf STDERR "%s\tIN NS\t%s\n", &TAB(" \@", $t), $zone_rrset[$i]; + } else { + printf STDERR "%s\tIN NS\t%s\n", &TAB(" ", $t), $zone_rrset[$i]; + } + } + } + + if (keys(%NSowners) && $verify_delegations) { + # + # First, create the input file that will + # be needed by the `check_del' program. + # + $del_batch = "$debug_DIR/h2n-del.bat_$data_fname"; + unless (open(*DELBATCH, "> $del_batch")) { + print STDERR "Couldn't create batch file for `check_del': $!\n"; + print STDERR "Unable to verify name server delegations.\n"; + $verify_delegations = 0; + } else { + # + # Be thorough by also checking the NS RRset + # of the parent domain's delegation. + # + for ($i = 0; $i < @DNSrrset; $i++) { + print DELBATCH "$Domain.\t\t\tIN NS\t$DNSrrset[$i]\n"; + $check_del_RRs{"$Domain."} .= " $DNSrrset[$i] "; + } + $domain = ($Domain) ? "$Domain." : ""; # accommodate the root zone + while (($zone, $buffer) = each %NSowners) { + # + # Cycle through each zone. + # + $zone = "$zone.$domain" if $zone !~ /(^|[^\\])\.$/; + while ($buffer) { + # + # For each zone, cycle through each listed name server. + # + ($ttl, $host, $buffer) = split(' ', $buffer, 3); + if ($host =~ /(^|[^\\])\.$/) { + $fq_host = $host; + } else { + $fq_host = "$host.$domain"; + } + # Only check name servers that have a reasonable + # expectation of being found. + # + unless ((exists($NSlist{$host}) && $NSlist{$host} !~ /CNAME /) || + (exists($extNS{$fq_host}) && $extNS{$fq_host} !~ /CNAME /)) { + # + # Add the NS RR for `check_del' to process + # but only if it is not already registered. + # + unless (exists($check_del_RRs{$zone}) && + $check_del_RRs{$zone} =~ / $fq_host /) { + print DELBATCH "$zone\t\t$ttl\tIN NS\t$fq_host\n"; + $check_del_RRs{$zone} .= " $fq_host "; + } + } + } + } + close(*DELBATCH); + } + + if ($verify_delegations && -s $del_batch) { + $first_answer = $answer = 1; + $debug_file = "$debug_DIR/h2n-del.ans_$data_fname"; + if ($debug) { + unless (open(*DEBUGOUT, "> $debug_file")) { + print STDERR "Error opening `$debug_file': $!\n"; + print STDERR "Disabling the -debug option for the remainder of the program.\n"; + $debug = 0; + } + } + # + # Use the `-F' (Fast) argument of `check_del'. + # Otherwise, you'll be sorry (and bored) when it + # trudges through a large list of unresponsive servers. + # + unless (open(*DELOUT, "$check_del -F -v -f $del_batch 2>&1 |")) { + print STDERR "Error running the `check_del' program: $!\n"; + print STDERR "Unable to verify NS delegations.\n"; + } else { + while (<DELOUT>) { + print DEBUGOUT $_ if $debug; + next if /^$|^Skipping | is authoritative | (moved|put).* list/; + $answer = 0 if /^\s*\d/; # Ignore everything past the + # "proper" & "improper" summary. + # + # If this point is reached, then `check_del' has found + # something noteworthy to report. + # + if ($answer) { + if ($first_answer) { + print STDERR "${n}Warning: verifying the NS delegations generated the following error(s):\n"; + $n = ""; + $first_answer = 0; + } + print STDERR " $_"; + } + } + close(*DELOUT); + } + if ($debug) { + close(*DEBUGOUT); + } else { + unlink($del_batch); + # + # Clean up any leftover debug file of check_del's output + # from a prior run if the -debug option was specified. + # + unlink($debug_file) if -e $debug_file; + } + } + } + + if ($n) { + $n = "Verification completed.\n"; + if ($BIND_ver_msg) { + $n = "\n$n"; + $warning_status = 1; + } + } + if ($warning_status || !$n) { + print STDERR "$n\n"; + return 1; + } else { + return 0; + } +} + + +sub VERIFY_ZONE { + my ($NS, $additional, $answer, $answer_section, $attempt, $authority); + my ($displayed_domain, $domain, $error, $expected_SOA_count, $flags); + my ($i, $ip, $n, $ns, $origin, $query_options, $separator, $status); + my ($version_buffer, $warning_status, $zone_data); + my (@NSlocal, @NSnet, @NSother, @NSsubnet, @Nameservers); + + # + # Verify the zone data for each domain in the @Vdomains array. + # + # It only makes sense to do all this work if the "$verbose" and "$audit" + # flags are enabled. However, the user is free to set the level of + # name checking by choosing the appropriate -I option which will then + # set the "$rfc1123" flag accordingly. "Strict" name-checking will + # be disabled, however, since the RFC-952 check for single-character + # hostnames and/or aliases is only valid when processing a host table. + # + $verbose = 1; + $audit = 1; + $rfc952 = 0; + + &GET_LOCAL_NETINFO; # for determining best net connectivity + $separator = ""; + while ($domain = pop(@Vdomains)) { + # + # Certain characters on the `h2n' command line like "<|>&()$?;'`" + # must be escaped in order to make it past the shell and into this + # program. If any of these are present, the "$domain" variable will + # still keep them in order to make it past the shell once again when + # the Perl system() function is called to make the DiG AXFR query a + # bit later in this subroutine. + # Such escapes and shell operator characters, however, are poisonous + # when trying to use them in a temporary filename. To solve this + # problem, we'll copy "$domain" into "$data_fname" so that these + # troublesome characters can be translated into something harmless. + # We'll start by cleaning up the "$data_fname" variable just enough + # so that we can display the actual domain name being verified. + # NOTE 1: Leave "\$" and "\@" (and possibly "\(" and "\)" - see NOTE 2) + # escaped as an accurate presentation of what BIND itself + # displays when encountering these characters. + # In fact, "@" may appear unescaped on the command line + # since it is not a shell special character. If that's + # the case, we'll insert an escape character before each + # unescaped "@" for the sake of robustness and consistency. + # NOTE 2: The is an inconsistency in the way that BIND8 and early + # versions of BIND9 handle the "()" characters in the owner + # field of a domain name as opposed to BIND 9.1.2 and later + # versions. BIND versions less than 9.1.2 will load the + # zone with or without preceding escapes and the corresponding + # versions of DiG will strip the escape characters that precede + # the "()" characters when it displays answers to a query. + # Conversely, BIND 9.1.2 and later will not load a zone with + # unescaped "()" characters in an owner field and the + # corresponding versions of DiG always include the escape + # characters in its displayed answers even when querying a + # name server that is running a BIND version earlier than 9.1.2. + # + $domain =~ s/([^\\])@/$1\\@/g; + $data_fname = $domain; + if ($DiG_version_num >= 90102) { + $data_fname =~ s/\\([<|>&\?;'`])/$1/g; + } else { + $data_fname =~ s/\\([<|>&\(\)\?;'`])/$1/g; + } + print STDOUT "$separator"; + print STDOUT "\nVerifying zone data for domain `$data_fname':\n"; + print STDOUT "Getting NS RRset...\n"; + # + # Occasionally, a query is made for a domain's NS RRs and the + # Additional Section of the response is incomplete. One or more + # subsequent queries, however, do return the IP address(es) that + # that correspond with the NS RR(s) in the Answer Section. + # The most likely scenario is an NS RRset where one or more NS RRs + # point to name servers that are in a different Top-Level Domain + # (TLD) than the zone itself. Since the Internet root name servers + # do not perform recursion and do not fetch glue, Address RRs that + # are not on the same TLD server as the NS RRs will not appear in + # the Additional Section of the response. Once the local name server + # has the NS RRset cached, successive recursive queries will cause + # the desired Address RR(s) to appear in the Additional Section (but + # *only* if the option `fetch-glue' is set to `yes' (see Note 3). + # In anticipation of this possibility, we'll make up to five attempts + # to get the Additional Section information that we expect to find. + # + # NOTE 1: Some name servers give out minimal answers, i.e., empty + # Authority and Additional Sections. BIND 9 even has a + # configuration option to do this ("minimal-responses yes"). + # The current strategy fails miserably in this circumstance. + # + # NOTE 2: If all of the NS records are misconfigured to point to + # CNAMEs instead of the canonical names (with A RRs), the + # Additional Section will always be empty since CNAMEs + # aren't "chased" when processing that section of the + # response. The current strategy fails miserably in this + # circumstance. See NOTE 3. + # + # NOTE 3: BIND 4 and 8 name servers have the `fetch-glue' option + # enabled by default. BIND 9 name servers, however, have + # deprecated the glue-fetching option because it is now + # considered a bad idea. + # A future version of `h2n' will use a query strategy + # that tries to consistently get the delegation NS RRset + # from the parent zone (useful for later comparison with + # the authoritative NS RRset of the child zone). + # Also, explicit queries will be made for the Address RRs + # of the NS RRs. Thus, the reliance on glue-fetching for + # supplying Address RRs in the Additional section will no + # longer be necessary. + # + $query_options = "+noques +noauthor +nostats +$DiG_timeout +$DiG_retries"; + @NSlocal = @NSsubnet = @NSnet = @NSother = (); + $match = $error = 0; + $attempt = 1; + until ($match || $error || $attempt > 5) { + sleep 2 if $attempt > 1; + unless (open(DIGOUT, "$DiG $query_options $domain NS 2>&1 |")) { + print STDERR "Error running the `DiG' program: $!\n"; + print STDERR "I give up ... sorry.\n"; + exit(2); + } + while (<DIGOUT>) { + chop; + next if /^$/; + # + # Whenever `h2n' calls the DiG utility, the pattern-matching + # statements for processing the output are structured to be + # compatible with the different formats generated by versions + # 2.X, 8.X, and 9.X of DiG. + # + if (/^; <<>> DiG/) { + $status = ""; + $answer = $answer_section = 0; + @DNSrrset = (); + } elsif (/^;.+(connection |no route|unreachable)/i) { + s/[^:]+:/ /; + $message = "DiG reported the following error:\n$_"; + $error = 1; + } elsif (/^;.+HEADER.+opcode: QUERY, status: ([^,]+)/) { + $status = $1; + if ($status ne 'NOERROR') { + $message = "DiG reported the following status: $status"; + $error = 1; + $status = ""; + } + } elsif ($status && /^;.+flags: (.*); QUE.*, ANS[^:]*: (\d+), AUTH[^:]*: (\d+), ADDIT[^:]*: (\d+)/i) { + $flags = $1; + $answer = $2; + $authority = $3; + $additional = $4; + if ($answer == 0) { + if ($flags !~ /aa/ && $authority == 0 && $additional == 0) { + # + # We've probably queried a name server that is + # lame due to either bad delegation or it has + # invalidated a zone due to bad data (although + # SERVFAIL would be the expected response for + # the latter case). + # + $message = "DiG reported a failed query. Perhaps a lame delegation was encountered."; + } else { + # + # We've encountered an undelegated domain name. + # + $message = "DiG reported that no NS records exist."; + } + $error = 1; + $status = ""; + } elsif (($additional < $answer) && ($attempt < 5)) { + # + # Quit parsing this query and initiate another + # recursive one in an attempt to get at least + # as many name server IP addresses in the + # Additional section as there are name servers + # in the Answer section. + # + last; + } else { + # + # We either have at least as many IP addresses as + # there are name servers in the Answer section or + # we are on our last attempted query. Continue + # parsing the current response. + # + next; + } + } + next unless $status; + if ($answer > 0) { + if (/^;; ANSWER/) { + $answer_section = 1; + next; + } elsif (/^;; ADDITIONAL/) { + $answer_section = 0; + next; + } elsif ($answer_section) { + # + # Store the answers so that the NS RRset of the + # response can be compared to the NS RRset that + # is actually contained in the domain's zone data. + # + s/.+\s+//; + push(@DNSrrset, lc($_)); + next; + } + # The Additional Section of the response has been reached. + # Assign the IP address to the proper network category. + # + next if !/\.\s.*\sA\s+/; # only deal with IPv4 A records + s/\.\s.*\sA\s+/ /; + $tmp = $_; + $tmp =~ s/.+ //; + $addr = pack('C4', split('\.', $tmp, 4)); + $match = 0; + foreach $tmp (@our_addrs) { + if ($addr eq $tmp) { + # + # The localhost is authoritative for the domain. + # Naturally, we'll try this IP address first. + # + push(@NSlocal, $_); + $match = 1; + last; + } + } + next if $match; + for ($i = 0; $i < @our_netbits; $i++) { + if (($addr & $our_netbits[$i]) eq $our_nets[$i]) { + # + # The IP address is on a local network. + # Now see if it's on a local subnet. + # + if (($addr & $our_subnetmasks[$i]) eq $our_subnets[$i]) { + push(@NSsubnet, $_); + } else { + push(@NSnet, $_); + } + $match = 1; + last; + } + } + next if $match; + push(@NSother, $_); + $match = 1; + } + } + close(DIGOUT); + $attempt++; + } + if ($error || !$match) { + $message = "Failed to obtain any name server IP addresses." unless $error; + $answer = 0; + $error = 1; + } + # Finish the cleanup of "$data_fname" so that our temporary files + # can be built without generating an error. Obnoxious filename + # characters will get translated into a harmless "%". Escaped + # whitespace will be converted to underscore characters and then + # any remaining escapes will be eliminated. + # + for ($data_fname) { + s/\\([\$@\(\)])/$1/g; # unescape the "$@()" characters + s/[\/<|>&\[\(\)\$\?;'`]/%/g; + s/\\\s/_/g; + s/\\//g; + s/(\S+)\.$/$1/; # trim last dot if not root zone + } + $zone_data = "$debug_DIR/h2n-zone.data_$data_fname"; + if ($debug && -s $zone_data) { + if ($error) { + # + # Even though we'll still proceed with the (re)verification + # of the zone data left over from a previous run with the + # `-debug' option, report the error that was encountered + # when we tried to do a DNS query for the domain's NS RRset. + # This will explain the subsequent warning message about + # inconsistent NS RRsets which will surely come later. + # + print STDERR "$message\n"; + print STDERR "(proceeding anyway using zone data in `$zone_data')\n"; + $error = 0; + } else { + print STDOUT "(using existing zone data in `$zone_data')\n"; + } + $answer = $expected_SOA_count = 1; + $BIND_version = ""; + } elsif ($answer) { + print STDOUT "Transferring zone.."; + $version_buffer = ""; + $query_options = "+$DiG_timeout +$DiG_retries"; + # + # Proactively create a generic error message + # just in case something unexpected happens. + # + $message = "All zone transfer attempts failed."; + $answer = 0; + $expected_SOA_count = 2; + @Nameservers = (); + push(@Nameservers, @NSlocal) if @NSlocal; + push(@Nameservers, @NSsubnet) if @NSsubnet; + push(@Nameservers, @NSnet) if @NSnet; + push(@Nameservers, @NSother) if @NSother; + foreach $NS (@Nameservers) { + ($ns, $ip) = split(' ', $NS, 2); + print STDOUT "."; + $version_buffer .= " "; + $status = 0xffff & system("$DiG $query_options $domain axfr \@$ip > $zone_data 2>&1"); + # + # If an error occurs, the message will be stored in a + # variable and the next name server will be tried. + # The loop is exited when a successful zone transfer is + # made or there are no more name servers to try. If the + # transfer is unsuccessful, the last error message to be + # stored will be the one that gets displayed. + # + if ($status == 0xff00) { + $message = "DiG command failed: $!"; + } elsif ($status > 0x80) { + $status >>= 8; + $message = "DiG command returned non-zero exit status: $status"; + } elsif ($status != 0) { + $message = "DiG command exited with "; + if ($status & 0x80) { + $status &= ~0x80; + $message .= "coredump from "; + } + $message .= "signal: $status"; + } + # + # Regardless of the system() function's exit status, + # try to examine the last few lines of DiG's output. + # We'll either get initial confirmation of a successful + # zone transfer or, possibly, a more detailed message + # explaining why the attempt(s) failed. + # The definitive test of a successful zone transfer + # will be the detection of the trailing SOA record + # by the READ_RRs subroutine. + # + open(ZONE_DATA, "tail -7 $zone_data |"); + while (<ZONE_DATA>) { + if (/^;; Received (\d+) answers? \(\d+ records?\)/ || + /^;; XFR size:\s+(\d+) names?,\s+\d+ rrs?/i || + /^;; XFR size:\s+(\d+) records?/i) { + # + # These lines are output by pre-9.X, 9.0.X, and + # 9.1.X-to-current versions of DiG, respectively, + # and usually indicate a successful zone transfer. + # + $answer = $1; + if ($answer == 0) { + # + # Pre-9.X versions of DiG return an answer count + # of zero to indicate a disallowed zone transfer. + # + $message = "Transfer of zone data is disallowed or unavailable."; + } + last; + } elsif (/^; Transfer failed/) { + # + # This line is returned by 9.X versions of DiG when a + # zone transfer is either disallowed or unavailable. + # + $message = "Transfer of zone data is disallowed or unavailable."; + last; + } elsif (/^;; [Cc]onnect/) { + # + # This pattern matches connection failures by all + # versions of DiG. + # + s/^;; *//; + s/[^:]+: //; + chop; + $message = ucfirst($_); + $message .= "." unless $message =~ /\.$/; + last; + } + } + close(ZONE_DATA); + last if $answer > 0; + } + if ($answer > 0) { + # + # Report the name server from which the zone transfer was + # obtained and make an inquiry about the version of BIND + # it is running. + # + print STDOUT " (from `$ns' [$ip])\n"; + &GET_BIND_VERSION($ip); + } + } + if ($answer == 0) { + $n = ($error) ? "" : "\n"; + print STDERR "${n}$message\n"; + print STDERR "Unable to verify this domain.\n\n"; + $separator = ""; + } else { + # + # Initialize the appropriate global variables that + # might be holding data from a previous pass. + # + # NOTE: Certain characters on the command line like "<|>&()?'`" + # may have had to be escaped in order to make it past the + # shell but require no escapes as part of a DNS domain name + # (except for the previously-mentioned difference in the + # way that "()" is handled by BIND/DiG versions 8 and 9). + # + # Now that we're in a safer environment, remove the escapes + # from "$domain". Otherwise, what we think is the domain + # name won't match what's in the actual zone data file. + # + # The "$Domainpattern" variable is another story. Since + # it represents "$domain" as a matching Regular Expression, + # we must make sure that any RE metacharacters contained + # therein get escaped. + # + if ($DiG_version_num >= 90102) { + $domain =~ s/\\([<|>&\?'`])/$1/g; + } else { + $domain =~ s/\\([<|>&\(\)\?'`])/$1/g; + } + $Domain = $origin = $domain; + $Domain =~ s/\.$//; + $Domainpattern = ($domain ne '.') ? ".$Domain" : ""; + $Domainpattern =~ s/([.\|\\\$\^\+\[\(\)\?'`])/\\$1/g; + $SOA_count = 0; + $RespHost = $RespUser = ""; + $Serial = $Refresh = $Retry = $Expire = $Ttl = ""; + %RRowners = (); + %NSowners = (); + %NSlist = (); + %extNS = (); + %Wildcards = (); + $newline_printed = 0; + if ($BIND_version) { + $version_buffer .="(NS BIND version: $BIND_version)"; + } else { + $version_buffer = ""; + } + print STDOUT "Parsing zone data...$version_buffer\n"; + $warning_status = $newline_printed = &READ_RRs($zone_data, $origin, + $origin, $origin, 0); + print STDERR "\n" while $newline_printed--; + if ($SOA_count < $expected_SOA_count) { + if ($expected_SOA_count == 2) { + print STDERR "Incomplete zone transfer detected - suppressing further action.\nUnable to verify this domain.\n\n"; + } else { + print STDERR "Missing SOA record from zone data - suppressing further action.\nUnable to verify this domain.\n\n"; + } + $warning_status = 1; + } elsif (!exists($NSowners{$origin})) { + print STDERR "No NS records found at zone top - suppressing further action.\nUnable to verify this domain.\n\n"; + $warning_status = 1; + } elsif ($Load_Status == 4) { + # + # Unbalanced quotes/parentheses prevented READ_RRs() from + # completely reading the zone file. The detailed error + # message has already been printed. + # + print STDERR "Unable to verify this domain.\n\n"; + $warning_status = 1; + } else { + print STDOUT "Performing in-zone and external lookups...\n"; + $warning_status = &CHECK_ZONE($warning_status); + } + if ($warning_status) { + $separator = "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n"; + } else { + print STDOUT "Domain verified with no detected improprieties!\n\n"; + $separator = ""; + } + } + unlink($zone_data) unless $debug; + } + return; +} + + +# +# Reverse the octets of a network specification or the labels of +# a domain name. Only unescaped "." characters are recognized +# as octet/label delimiters. +# +sub REVERSE { + my ($dotted_token) = @_; + + $dotted_token =~ s/([^\\])[.]/$1 /g; + return join('.', reverse(split(' ', $dotted_token))); +} + + +sub GIVE_UP { + + print STDERR "I give up ... sorry.\n"; + exit(2); +} + + +# +# Subroutine to parse a list of `h2n' options and arguments thereof. +# +# It is first called in a scalar context by the READ_RCFILE subroutine +# to process any options that are found in a special configuration file. +# In this context, PARSE_ARGS will print a message for each warning or +# error it encounters but will not terminate `h2n' prematurely. +# After returning a count of printed messages to READ_RCFILE, `h2n' +# will terminate with an informational message about the configuration +# file if the message count is non-zero. +# +# If no error or warning messages were encountered by READ_RCFILE, +# PARSE_ARGS is called again, this time by the main program in a +# void context to process the actual command-line arguments. +# This allows for a logical way to dynamically override any option +# that may be in the `h2n' configuration file as a normal default. +# In the void context, the program will terminate upon encountering +# any hard error while processing a command-line option. +# +sub PARSE_ARGS { + my @args = @_; + # + # The following two variables hold patterns for all the command-line + # options that `h2n' recognizes. By explicitly defining these + # reserved tokens, the parser will be able to accept non-matching + # tokens as option arguments which themselves may also begin with + # a `-' or `+' character. + # + my $h2n_opts = "-[AaBbCcdefHhIiLMmNnOoPpqrSsTtuVWwyZz]|-v([:=].*)?|" + . "\\+([CcLmOSt]|o[ms])"; + my $verify_opts = "-(no-?)?(check|verify)[_-]?del|-(no-?)?debug(:.*)?|" + . "-(no-?)?recurs(e|ive|ion)|" + . "-(no-?)?show-?nxdomain-?cnames?|" + . "-(no-?)?show-?(cname|chained)-?(chain|cname)s?"; + + # Create a set of RRtypes that will be recognized as valid to add + # to a forward-mapping zone's apex with the -T option. + # + my $apex_RRtypes = "MX|A|PTR|AAAA|HINFO|RP|TXT|SRV|A6|NSAP|AFSDB|RT|ISDN|" + . "X25|PX|NAPTR|LOC|CERT|SIG|KEY|KX|DNAME|WKS|GPOS|APL"; + + my ($AltDb, $AltSpcl, $IP_range, $already_warned, $argument, $arg2, $char); + my ($cidr_size, $classC_key, $comment, $continuation_line); + my ($default_supernetting, $domain_arg, $error, $file, $formatted_template); + my ($i, $j, $last_char, $lastNorD, $lc_zone_name, $line_num); + my ($message_count, $net, $net_file, $octet1, $octets1_and_2, $octet_token); + my ($open_paren_count, $open_quote, $option, $original_line, $overlap); + my ($preference, $ptr_arg, $ptr_map, $rfc2317_domain, $rdata, $rrtype); + my ($skip_next_token, $sub_classC_key, $subnet, $subnet_key, $subnetmask); + my ($supernet, $tmp1, $tmp2, $tmpMasterTtl, $tmpTtl, $token, $ttl); + my (%allocated_octets, %duplicate, %e_opt_domain, %sub_classC); + my (@file_args, @ctime, @unbalanced_args); + + $lastNorD = ""; + $default_supernetting = $i = $message_count = 0; + while ($i <= $#args) { + $option = $args[$i]; + + if ($option eq "-A") { + $do_aliases = 0; + + } elsif ($option eq "-a" || $option eq "-n") { + unless ($#args > $i && $args[$i + 1] !~ /^($h2n_opts)$/o + && $args[$i + 1] !~ /^($verify_opts)$/io) { + print STDERR "Improper $option option; at least one argument, a network number, is required.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + next; + } + $lastNorD = "-n" if $option eq "-n"; + while (++$i <= $#args && $args[$i] !~ /^($h2n_opts)$/o + && $args[$i] !~ /^($verify_opts)$/io) { + $argument = $args[$i]; + if ($argument =~ /^(mode|domain|ptr-owner)=/i) { + if ($argument =~ /^mode=/i) { + $argument =~ s/=.*/=/; + print STDERR "Improper $option option.\nA network number must precede `$argument'.\n"; + } elsif ($option eq "-n") { + print STDERR "Improper -n option.\nA network number must precede `$argument'.\n"; + } else { + print STDERR "Improper -a option.\nThe `$argument' domain argument is not allowed.\n"; + } + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + last; + } + if ($argument =~ /:/) { + ($net, $subnetmask) = split(/:/, $argument); + $cidr_size = undef; + } elsif ($argument =~ /\//) { + ($net, $cidr_size) = split(/\//, $argument); + $subnetmask = undef; + } else { + $net = $argument; + $subnetmask = $Defsubnetmask; + $cidr_size = undef; + } + $error = &CHECK_NET(\$net, \$cidr_size, \$subnetmask); + if ($error) { + print STDERR "Improper $option option ($option $argument):\n$error"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + last; + } elsif ($cidr_size < 8) { + print STDERR "Improper $option option ($option $argument).\nOnly network sizes /8 to /32 are supported.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + last; + } + # Peek ahead and gather any `mode=' or `domain=' and/or + # `ptr-owner=' argument(s) that may be present after first + # setting the appropriate default values in case the argument(s) + # are absent. + # + $supernet = $rfc2317_domain = $ptr_template = ""; + while ($#args > $i && + (($args[$i + 1] =~ /^mode=/i && !$supernet) || + ($args[$i + 1] =~ /^domain=/i && !$rfc2317_domain) || + ($args[$i + 1] =~ /^ptr-owner=/i && !$ptr_template))) { + $arg2 = $args[++$i]; + if ($arg2 =~ /^mode=/i) { + $supernet = $arg2; + } elsif ($arg2 =~ /^domain=/i) { + $rfc2317_domain = $arg2; + } else { + $ptr_template = $arg2; + } + } + if ($supernet) { + unless ($supernet =~ /^mode=S$/i) { + print STDERR "Improper `$supernet' argument in $option option.\nThe component of a valid `mode=' value must be `S'.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + last; + } elsif ($cidr_size >= 25) { + print STDERR "Improper $option option ($option $argument).\nThe `$supernet' argument is for CIDR sizes 8 to 24; ignored.\n"; + $message_count++; + $supernet = ""; + } else { + $supernet = "S "; + } + } else { + $supernet = "S " if ($default_supernetting + && $cidr_size <= 24); + } + $Supernetting_enabled = 1 if $supernet; + $domain_arg = $rfc2317_domain; + $rfc2317_domain =~ s/^domain=//i; + if ($rfc2317_domain) { + # + # Check to see if the domain name is not one that + # fits the pattern of a standard delegation in the + # `arpa.' zone, i.e., that of a /8, /16, or /24 + # network. First, however, clean up the domain + # name as follows: + # + # 1. Remove any redundant escape characters and + # any trailing root zone (".") characters. + # 2. Remove any escapes that may have been + # necessary to get the special characters + # "<|>&()$?;'`" past the shell. + # 3. Escape any unescaped "@" character to be + # consistent with BIND when it encounters + # "@" as a literal character in a domain name. + # + 1 while $rfc2317_domain =~ s/\\\\/\\/g; + $rfc2317_domain =~ s/([^\\])\.+$/$1/; + $rfc2317_domain =~ s/\\([<|>&\(\)\?;'`])/$1/g; + $rfc2317_domain =~ s/([^\\])@/$1\\@/g; + $error = 0; + if (($option eq "-n" && $cidr_size <= 24) + || $option eq "-a") { + print STDERR "Improper -n option (-n $argument).\nThe `$domain_arg' domain argument is for CIDR sizes 25 to 32; ignored.\n" if $option eq "-n"; + print STDERR "Improper -a option (-a $argument).\nThe `$domain_arg' domain argument is meaningless; ignored.\n" if $option eq "-a"; + $message_count++; + $rfc2317_domain = ""; + } elsif ($rfc2317_domain && &CHECK_NAME($rfc2317_domain, 'SOA')) { + print STDERR "Improper `domain=' argument (-n $argument $domain_arg).\nIt is not a valid domain name.\n"; + $error = 1; + } elsif ($rfc2317_domain =~ /^((\d+[.]){1,3})?in-addr.arpa$/i) { + print STDERR "Improper `domain=' argument (-n $argument $domain_arg).\nIt conflicts with the hierarchy of parent networks under the ARPA zone.\n"; + $error = 1; + } elsif ($cidr_size < 32 && + $rfc2317_domain =~ /^(\d+[.]){4}in-addr.arpa$/i) { + print STDERR "Improper `domain=' argument (-n $argument $domain_arg).\nIt conflicts with the delegation of a /32 network under the ARPA zone.\n"; + $error = 1; + } elsif ($cidr_size == 32 && + $rfc2317_domain =~ /^(\d+[.]){4}in-addr.arpa$/i && + lc($rfc2317_domain) ne &REVERSE($net) . ".in-addr.arpa") { + print STDERR "Improper `domain=' argument (-n $argument $domain_arg).\nIt represents a different /32 network under the ARPA zone.\n"; + $error = 1; + } elsif ($rfc2317_domain !~ /((\d+[.]){3})in-addr.arpa$/i && + !$Domain) { + # + # The forward-mapping domain must be known in advance + # so that references to it by the `domain=' argument + # can be recognized and correctly processed. + # + print STDERR "Improper `domain=' argument (-n $argument $domain_arg).\nIt cannot be properly processed without first specifying the -d option.\n"; + $error = 1; + } + if ($error) { + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + last; + } + } + $ptr_arg = $ptr_template; + $ptr_template =~ s/^ptr-owner=//i; + if ($ptr_template) { + # + # Check the PTR template for basic syntax and pay + # special attention to contexts which require or + # disallow a top-of-zone PTR record, e.g., + # + # $ORIGIN d.c.b.a.in-addr.arpa. + # @ IN SOA . . ( serial refresh retry expiry minimum ) + # IN NS nameserver1. + # IN NS nameserver2. + # IN PTR some.domain.name. + # + # First, however, clean up the PTR owner name template + # as follows: + # + # 1. Remove any redundant escape characters. + # 2. Make sure to detect an empty pair of single + # or double quotes (escaped or unescaped) and + # change them to a pair of unescaped single + # quote characters. This is the syntax for + # requesting a top-of-zone PTR record. + # NOTE: Since the literal "$" and "'" characters + # are valid in the owner name field of a PTR + # record, the cleaned-up copy of "$ptr_template" + # is sufficient for basic DNS domain name testing + # with the CHECK_NAME subroutine. + # + 1 while $ptr_template =~ s/\\\\/\\/g; + $ptr_template = "''" if $ptr_template =~ /^([\\]?\'){2}$/ || + $ptr_template =~ /^([\\]?\"){2}$/; + $error = 0; + if (($option eq "-n" && $cidr_size <= 24) + || $option eq "-a") { + print STDERR "Improper -n option (-n $argument).\nThe `$ptr_arg' domain argument is for CIDR sizes 25 to 32; ignored.\n" if $option eq "-n"; + print STDERR "Improper -a option (-a $argument).\nThe `$ptr_arg' domain argument is meaningless; ignored.\n" if $option eq "-a"; + $message_count++; + $ptr_template = ""; + } elsif (&CHECK_NAME($ptr_template, 'PTR')) { + print STDERR "Improper `ptr-owner=' argument (-n $argument $ptr_arg).\nIt would create an invalid DNS domain name.\n"; + if ($ptr_template =~ /\.$/) { + print STDERR "The `ptr-owner' argument must be specified in domain-relative format.\n"; + } + $error = 1; + } elsif ($ptr_template =~ /(^|[^\\])\$[^1-4]/) { + print STDERR "Improper `ptr-owner=' argument (-n $argument $ptr_arg).\nValid octet substitution tokens are \$1, \$2, \$3, and \$4.\n"; + $error = 1; + } elsif ($cidr_size != 32 && $ptr_template eq "''") { + print STDERR "Improper `ptr-owner=' argument (-n $argument $ptr_arg).\nA top-of-zone PTR record is only valid for a /32 network.\n"; + $error = 1; + } elsif ($cidr_size == 32 && $ptr_template ne "''" && + (!$rfc2317_domain || + $rfc2317_domain =~ /^(\d+[.]){4}in-addr.arpa$/i)) { + $tmp1 = ($rfc2317_domain) ? "specified" : "default"; + $tmp2 = &REVERSE($net) . ".in-addr.arpa"; + print STDERR "Improper `ptr-owner=' argument (-n $argument $ptr_arg).\nThe $tmp1 domain ($tmp2) for this network requires a\ntop-of-zone PTR record, i.e., omit the `ptr-owner=' argument or set it to \"''\".\n"; + $error = 1; + } elsif ($ptr_template !~ /(^''$|(^|[^\\])\$4)/) { + print STDERR "Improper `ptr-owner=' argument (-n $argument $ptr_arg).\nThe `\$4' token (representing the rightmost octet of an IP address) must always\nbe present for creating the owner names of non-top-of-zone PTR records.\n"; + $error = 1; + } elsif ($ptr_template =~ /^\*\./) { + if ($cidr_size == 32) { + $error = "wildcard PTR record"; + } else { + $error = "set of wildcard PTR records"; + } + print STDERR "Improper `ptr-owner=' argument (-n $argument $ptr_arg).\nIt would create an ambiguous $error.\n"; + $error = 1; + } + if ($error) { + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + last; + } elsif ($ptr_template) { + # + # Do a character-by-character scan of the template + # while looking backwards and forwards for IP address + # octet tokens, non-printing characters, and whether + # the current context is escaped or not. + # The end product will be used as the replacement text + # in a `s///' substitution operator for mapping an IP + # address into its appropriate PTR record. For example, + # given an IP address of 156.153.254.81, say that we + # want to construct the PTR record for the corresponding + # class-B zone (153.156.in-addr.arpa). The relative + # owner name of the record needs to be `81.254'. + # The Perl statements for doing this are: + # + # $addr = "156.153.254.81"; + # $addr =~ s/(\d+)\.(\d+)\.(\d+)\.(\d+)/$4.$3/; + # $addr equals "81.254". + # + # This does *not* work, however: + # + # $addr = "156.153.254.81"; + # $template = "\$4.\$3"; + # $addr =~ s/(\d+)\.(\d+)\.(\d+)\.(\d+)/$template/; + # $addr equals "$4.$3". + # + # The contents of "$template" were literally substituted + # for the matching pattern of "$addr". The trick is to + # use the `eval' modifier (/e) to evaluate the contents + # of "$template" as an expression first. The results + # are then used as the substitution's replacement text. + # Actually, it takes two `eval' modifiers (/ee) to get + # the job done. The first `eval' interpolates the + # contents of "$template" and identifies the context of + # "$3" and "$4" as capture variables. In other words, + # the replacement text is translated and staged. The + # second `eval' substitutes the captured text in "$3" + # and "$4" and evaluates the resulting replacement + # string in its entirety as a Perl expression. + # + # $addr = "156.153.254.81"; + # $template = "\$4.\$3"; + # $addr =~ s/(\d+)\.(\d+)\.(\d+)\.(\d+)/$template/ee; + # $addr equals "81254". + # + # What happened here was that "81" was substituted into + # "$4" and "254" was substituted into "$3". The "." + # character, however, was evaluated as a concatenation + # operator and thus the results were squashed together. + # If the "$template" variable contained this instead: + # + # $4 . '.' . $3 + # + # the proper results would have been achieved (81.254). + # + # The following scan of "$ptr_template" will insert the + # necessary quotes and concatenation operators to + # achieve the desired results. + # NOTE 1: Single quotes are used to surround non-token + # text to avoid the accidental interpolation + # of an `h2n' symbol name which may + # coincidentally exist. + # NOTE 2: If "$ptr_template" contains the special value + # of "''", a short-circuit mechanism prevents + # it from being erroneously processed. + # + if ($ptr_template =~ /^\$\d/) { + $formatted_template = ""; + $open_quote = 0; + } else { + $formatted_template = "'"; + $open_quote = 1; + } + $last_char = ""; + $ptr_template = "" if $ptr_template eq "''"; + while (length($ptr_template)) { + if ($ptr_template =~ /^\$(\d)/ && $last_char ne "\\") { + $octet_token = $1; + $formatted_template .= "'." if $open_quote; + $formatted_template .= "\$$octet_token"; + $last_char = $octet_token; + $ptr_template =~ s/^..//; + $open_quote = 0; + } else { + unless ($open_quote) { + # + # There are one or more characters still + # left in the template after the $[1-4] + # octet token that was just processed in + # the previous iteration. + # + $formatted_template .= ".'"; + $last_char = ""; + $open_quote = 1; + } + ($char, $ptr_template) = split(//, $ptr_template, 2); + if (ord($char) <= 32) { + # + # Create the escaped three-digit decimal + # representation of the non-printing ASCII + # character that's compatible with BIND. + # + $char = "0" . ord($char); + $char = "\\$char" if $last_char ne "\\"; + } elsif ($char =~ /^(@|\"|\')$/ && $last_char ne "\\") { + $char = "\\$char"; + } + $formatted_template .= $char; + ($last_char = $char) =~ s/.*(.)$/$1/; + } + } + $formatted_template .= "'" if $open_quote; + $ptr_template = $formatted_template; + } + } + # Now that the arguments have been vetted for proper syntax, + # it's time to analyze the address space specifications to + # see if there are any conflicts. + # + $overlap = ""; + $already_warned = $error = 0; + foreach $subnet (&SUBNETS($net, $cidr_size)) { + ($subnet_key, $IP_range) = split(/:/, $subnet, 2); + # + # For networks with a CIDR size <= 24, each constituent + # class-A, class-B, or class-C subnet serves as an index + # key into the %Net_ranges hash. The hash value is either + # a file-descriptor typeglob for a `-n' option or the null + # string for `-a', i.e., + # + # -n: $Net_ranges{"N"} = "*main::DB.N" (/8) + # -a: $Net_ranges{"N"} = "" (/8) + # -n: $Net_ranges{"N.N"} = "*main::DB.N.N" (/9 to /16) + # -a: $Net_ranges{"N.N"} = "" (/9 to /16) + # -n: $Net_ranges{"N.N.N"} = "*main::DB.N.N.N" (/17 to /24) + # -a: $Net_ranges{"N.N.N"} = ""; (/17 to /24) + # + # For networks with a CIDR size >= 25, the class-C supernet + # plus an appended ".X" string serves as the hash key index + # with a space-separated list of non-overlapping IP address + # ranges as the hash value. The distinction between a `-n' + # or `-a' network is made by concatenating each IP-range to + # the class-C supernet to create the unique key, i.e., + # + # -n/-a: $Net_ranges{"N.N.N.X"} = "IP-range IP-range ..." + # -n: $Net_ranges{"N.N.N.IP-range"} = "*main::DB.zone" + # -a: $Net_ranges{"N.N.N.IP-range"} = ""; + # + # NOTE: By default, each non-overlapping sub-class-C + # network within a class-C supernet is assigned + # to a unique domain name. However, since the + # last octet of each such network address is + # unique within the supernet (due to `$4' being + # present in the PTR template), there's nothing + # to prohibit these sub-class-C networks from + # being combined into one "super-domain", i.e., + # sharing the same "domain=" argument. + # + ##### + # + # The first thing we need to do is to check for the + # following network overlap conditions: + # + # 1. Any overlap between networks of a different + # class (A, B, C, or sub-C) will be reported + # as a fatal error unless supernetting is in + # effect (+S global option or `mode=S' argument + # to -n/-a option) when the larger network + # is declared with -n/-a. + # + # 2. Overlaps between networks of the same class + # (A, B, or C) will be let off with a warning. + # Overlaps between sub-class-C networks will + # be reported as a fatal error, however. + # + # 3. Intra-class A, B, or C overlaps (#2 above) + # will be reported as a fatal error if the + # specified option (-n/-a) is inconsistent. + # + # In conjunction with the %Net_ranges hash described + # previously, the %allocated_octets hash will keep + # track of networks per the following example: + # + # -a 192.168.15/24 + # $Net_ranges{"192.168.15"} = ""; + # $tmp = "192.168.15 -a 192.168.15/24"; + # $allocated_octets{"192"} = $tmp; + # $allocated_octets{"192.168"} = $tmp; + # $allocated_octets{"192.168.15"} = $tmp; + # + # Subsequent attempts to process the following options: + # + # -a 192/8 + # -a 192.168/16 + # + # will fail because the octets would already be registered + # as keys in the %allocated_octets hash with a hash value + # pointing to a class-C network (192.168.15) as the + # registrant. The remaining fields of the hash value + # ("-a 192.168.15/24") reference the original option for + # generating a descriptive error message. + # + # However, if supernetting is specified globally with the + # +S option or selectively by adding the `mode=S' argument + # to a -n/-a option, e.g., + # + # -a 192/8 mode=S + # +S + # -a 192.168/16 + # + # then no error will be generated when a network overlaps + # with another of a larger class that has been declared to + # be a supernet. + # + if ($cidr_size == 8) { + if (exists($allocated_octets{$subnet_key})) { + # + # Either a duplicate class A network exists or + # there's an overlap with an existing class B + # and/or class C network. + # + $overlap = $allocated_octets{$subnet_key}; + if ($overlap !~ /^$subnet_key /) { + # + # An overlapping class B and/or class C and/or + # one or more sub-class-C network(s) exist(s). + # + if ($supernet) { + $overlap = ""; + } else { + $error = 1; + } + } elsif ($overlap !~ /\S+ $option /) { + # + # The duplicate class A network specification + # is ambiguous because one is a -a option and + # another is a -n option. + # + $error = 3; + } + } + unless ($overlap) { + $Net_ranges{$subnet_key} = ""; + $allocated_octets{$subnet_key} = + "$subnet_key $supernet$option $argument"; + } + } elsif ($cidr_size <= 16) { + ($octet1 = $subnet_key) =~ s/\..+//; + if (exists($allocated_octets{$subnet_key})) { + $overlap = $allocated_octets{$subnet_key}; + if ($overlap !~ /^$subnet_key /) { + # + # An overlapping class C or one or more + # sub-class-C network(s) exist(s). + # + if ($supernet) { + $overlap = ""; + } else { + $error = 1; + } + } elsif ($overlap !~ /\S+ $option /) { + # + # The duplicate class B network specification + # is ambiguous because one is a -a option and + # another is a -n option. + # + $error = 3; + } + } elsif (exists($allocated_octets{$octet1})) { + $tmp = $allocated_octets{$octet1}; + if ($tmp =~ /^\d+ /) { + # + # An overlapping class A network exists. + # + if ($tmp =~ /^\S+ S /) { + # + # The class A network was a supernet. + # + $overlap = ""; + } else { + $overlap = $tmp; + $error = 1; + } + } + } + unless ($overlap) { + $Net_ranges{$subnet_key} = ""; + $tmp = "$subnet_key $supernet$option $argument"; + $allocated_octets{$subnet_key} = $tmp; + unless (exists($allocated_octets{$octet1})) { + # + # The first octet has not been allocated by a + # previously-specified non-overlapping network. + # + $allocated_octets{$octet1} = $tmp; + } + } + } elsif ($cidr_size <= 24) { + $octet1 = $octets1_and_2 = $subnet_key; + $octet1 =~ s/\..+//; + $octets1_and_2 =~ s/\.\d+$//; + if (exists($allocated_octets{$subnet_key})) { + $overlap = $allocated_octets{$subnet_key}; + if (exists($Net_ranges{"$subnet_key.X"})) { + # + # One or more overlapping sub-class-C + # network(s) exist(s). + # + if ($supernet) { + $overlap = ""; + } else { + $error = 1; + } + } elsif ($overlap !~ /\S+ $option /) { + # + # The duplicate class C network specification + # is ambiguous because one is a -a option and + # another is a -n option. + # + $error = 3; + } + } elsif (exists($allocated_octets{$octets1_and_2})) { + $tmp = $allocated_octets{$octets1_and_2}; + if ($tmp =~ /^\d+\.\d+ /) { + # + # An overlapping class B network exists. + # + if ($tmp =~ /^\S+ S /) { + # + # The class B network was a supernet. + # + $overlap = ""; + } else { + $overlap = $tmp; + $error = 1; + } + } + } elsif (exists($allocated_octets{$octet1})) { + $tmp = $allocated_octets{$octet1}; + if ($tmp =~ /^\d+ /) { + # + # An overlapping class A network exists. + # + if ($tmp =~ /^\S+ S /) { + # + # The class A network was a supernet. + # + $overlap = ""; + } else { + $overlap = $tmp; + $error = 1; + } + } + } + unless ($overlap) { + $Net_ranges{$subnet_key} = ""; + $tmp = "$subnet_key $supernet$option $argument"; + $allocated_octets{$subnet_key} = $tmp; + # + # Allocate octets 1 and 2 to this class-C network + # unless already allocated by a previously specified + # non-overlapping network. + # + unless (exists($allocated_octets{$octets1_and_2})) { + $allocated_octets{$octets1_and_2} = $tmp; + } + unless (exists($allocated_octets{$octet1})) { + $allocated_octets{$octet1} = $tmp; + } + } + } else { + # + # Deal with sub-class-C networks (/25 to /32). + # First, see if there is an overlap conflict with + # some other class A, B, or C network. + # + $octet1 = $octets1_and_2 = $subnet_key; + $octet1 =~ s/\..+//; + $octets1_and_2 =~ s/\.\d+$//; + if (exists($allocated_octets{$subnet_key})) { + if (exists($Net_ranges{$subnet_key})) { + # + # An overlapping class-C network exists. + # + $tmp = $allocated_octets{$subnet_key}; + if ($tmp =~ /^\S+ S /) { + # + # The class C network was a supernet. + # + $overlap = ""; + } else { + $overlap = $tmp; + $error = 1; + } + } + } elsif (exists($allocated_octets{$octets1_and_2})) { + $tmp = $allocated_octets{$octets1_and_2}; + if ($tmp =~ /^\d+\.\d+ /) { + # + # An overlapping class B network exists. + # + if ($tmp =~ /^\S+ S /) { + # + # The class B network was a supernet. + # + $overlap = ""; + } else { + $overlap = $tmp; + $error = 1; + } + } + } elsif (exists($allocated_octets{$octet1})) { + $tmp = $allocated_octets{$octet1}; + if ($tmp =~ /^\d+ /) { + # + # An overlapping class A network exists. + # + if ($tmp =~ /^\S+ S /) { + # + # The class A network was a supernet. + # + $overlap = ""; + } else { + $overlap = $tmp; + $error = 1; + } + } + } + unless ($overlap) { + # + # Now see if there are any sub-class-C overlaps + # within the parent class-C supernet. + # NOTE: Even though `h2n' will tolerate and + # simply isue a warning when it detects + # duplicate intra-class (A, B, and C only) + # networks with identical -n or -a options, + # no such indulgence will be made to see if + # two such sub-class-C networks are exactly + # duplicated because of the added variables + # of the RFC-2317 zone name and the template + # for PTR owner names. Therefore, no IP + # address overlap of any kind is permitted + # for sub-class-C networks. + # + $classC_key = $sub_classC_key = $subnet_key; + unless (exists($Net_ranges{"$classC_key.X"})) { + # + # This is the first sub-class-C network in + # the parent class-C supernet. + # + $Net_ranges{"$classC_key.X"} = $IP_range; + $sub_classC_key .= ".$IP_range"; + $Net_ranges{$sub_classC_key} = ""; + $tmp = "$classC_key $option $argument $domain_arg $ptr_arg"; + $allocated_octets{$classC_key} = $tmp; + # + # Allocate octets 1 and 2 to this sub-class-C + # network unless already allocated by a + # previously specified non-overlapping network. + # + unless (exists($allocated_octets{$octets1_and_2})) { + $allocated_octets{$octets1_and_2} = $tmp; + } + unless (exists($allocated_octets{$octet1})) { + $allocated_octets{$octet1} = $tmp; + } + # Finally, register the sub-class-C hash key + # so that a descriptive error message can be + # generated in case a subsequent sub-class-C + # network specification causes a conflict. + # + $allocated_octets{$sub_classC_key} = $tmp; + + } else { + # + # One or more sub-class-C networks already + # exist in the parent class-C supernet. + # The only valid situation at this point + # is if we are appending a non-overlapping + # IP address range to an existing list of + # non-overlapping sub-class-C address ranges. + # + ($first_IP, $last_IP) = split(/-/, $IP_range, 2); + $last_IP = $first_IP unless defined($last_IP); + foreach $tmp (split(' ', $Net_ranges{"$classC_key.X"})) { + ($tmp1, $tmp2) = split(/-/, $tmp, 2); + $tmp2 = $tmp1 unless defined($tmp2); + if (($first_IP >= $tmp1 && $first_IP <= $tmp2) + || ($tmp1 >= $first_IP && $tmp1 <= $last_IP)) { + # + # An overlap exists. Reconstruct + # the sub-class-C index key into + # the %allocated_octets hash so + # that a descriptive error message + # can be generated. + # + $overlap = $allocated_octets{"$classC_key.$tmp"}; + $error = 2; + last; + } + } + unless ($overlap) { + # + # Append the non-overlapping range of + # addresses to the existing list and + # initialize the new hash key associated + # with this sub-class-C network. + # + $Net_ranges{"$classC_key.X"} .= " $IP_range"; + $sub_classC_key .= ".$IP_range"; + $Net_ranges{$sub_classC_key} = ""; + # + # There is no need to register the parent + # class-C supernet in the %allocated_octets + # hash since this has already been done by + # the supernet's first sub-class-C network. + # However, we do want to register the + # current sub-class-C network so that + # any future conflict can be accompanied + # by a descriptive error message. + # + $allocated_octets{$sub_classC_key} = + "$classC_key $option $argument $domain_arg $ptr_arg"; + } + } + } + } + if ($overlap) { + $overlap =~ s/^\S+ (S )?//; + unless ($error) { + if ($verbose && !$already_warned) { + print STDERR "Warning: overlapping $option option ($option $argument).\n"; + print STDERR "It redundantly includes one or more (sub)networks from a previous option:\n $overlap\nCheck your -n/-a networks and subnetmasks/CIDRsizes for overlap.\n"; + $already_warned = 1; + $overlap = ""; + $message_count++; + } + } elsif ($error == 1) { + print STDERR "Improper $option option ($option $argument).\n"; + print STDERR "It overlaps with a network of a different class from a previous option:\n $overlap\nThey can't simultaneously specify a part of the same DNS address-to-name space.\n"; + } elsif ($error == 2) { + print STDERR "Improper $option option ($option $argument).\n"; + print STDERR "It overlaps with another sub-class-C network from a previous option:\n $overlap\nTo prevent DNS naming ambiguities, sub-class-C overlaps are always disallowed.\n"; + } else { + print STDERR "Improper $option option ($option $argument).\n"; + print STDERR "It conflicts with a previous option ($overlap).\nA network specification cannot be shared between the -n and -a options.\n"; + } + if ($error) { + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + last; + } + } + if ($subnet_key eq "127.0.0") { + if ($option eq "-a") { + # + # Skip the automatic generation of the generic + # reverse-mapping db file for the loopback network. + # + $MakeLoopbackSOA = 0; + } else { + # + # Skip the automatic declaration of the loopback + # network in the various configuration files + # generated by the GEN_BOOT() subroutine. + # + $MakeLoopbackZone = 0; + } + } + next if $option eq "-a"; + + # Finish processing the -n option by creating the necessary + # data structures to allocate the "db.*" files to which the + # PTR records will get written. + # + if ($cidr_size <= 24) { + if ($cidr_size == 8) { + # + # PTR records for a /8 network will get + # written to a single class-A zone file. + # + $ptr_template = "\$4.'.'.\$3.'.'.\$2"; + } elsif ($cidr_size <= 16) { + # + # PTR records for networks sizes /9 to /16 will get + # get written to the equivalent number of class-B + # zone files. + # + $ptr_template = "\$4.'.'.\$3"; + } else { + # + # PTR records for networks sizes /17 to /24 will get + # get written to the equivalent number of class-C + # zone files. + # + $ptr_template = "\$4"; + } + $zone_file = $subnet_key; + $zone_name = &REVERSE($zone_file) . ".in-addr.arpa"; + } else { + # + # Assemble the sub-class-C network information. + # + unless ($ptr_template) { + # + # No `ptr-owner=' argument was specified. + # Set the template to the appropriate default + # value based on the sub-class-C network's size. + # + if ($cidr_size == 32 && + (!$rfc2317_domain || + $rfc2317_domain =~ /^(\d+[.]){4}in-addr.arpa$/i)) { + # + # Accommodate the special case of the + # PTR record being at the zone top + # along with the SOA and NS records. + # + $ptr_template = "''"; + $ptr_arg = "[ptr-owner='']"; + } else { + $ptr_template = "\$4"; + $ptr_arg = "[ptr-owner=\$4]"; + } + } + if ($rfc2317_domain) { + $zone_name = $rfc2317_domain; + } else { + $zone_file = $sub_classC_key; + $zone_name = &REVERSE($zone_file) . ".in-addr.arpa"; + $domain_arg = "[domain=$zone_name]"; + } + $lc_zone_name = lc($zone_name); + # + # It is possible for multiple sub-class-C networks + # belonging to different class-C supernets to specify + # (explicitly or implicitly) the same "domain=" argument + # in their respective `-n' options. + # However, the default PTR template of `$4' is + # insufficient in these cases because the last octet + # that it represents is not unique across different + # class-C supernets. + # Choosing such a shared reverse-mapping zone requires + # that the "ptr-owner=" argument be specified (either + # explicitly or implicitly) so that the IP addresses of + # each sub-class-C network map to unique PTR owner names + # in the common zone file. + # + $ptr_map = "$classC_key.xxx"; + $ptr_map =~ s/(\d+)\.(\d+)\.(\d+)\.(\S+)/$ptr_template/ee; + $ptr_map = lc($ptr_map); + if (exists($sub_classC{$lc_zone_name}{first_supernet}) + && $sub_classC{$lc_zone_name}{first_supernet} ne $classC_key + && exists($sub_classC{$lc_zone_name}{$ptr_map})) { + $error = $sub_classC{$lc_zone_name}{$ptr_map}; + print STDERR "The following -n option is ambiguously specified:\n -n $argument $domain_arg $ptr_arg\n"; + print STDERR "There is the possibility of overlapping PTR owner names with a prior -n option:\n $error\n"; + print STDERR "Sub-class-C networks belonging to different class-C supernets must specify\nuniquely-mapping `ptr-owner=' arguments if they share a common domain name.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + last; + } + $sub_classC{$lc_zone_name}{$ptr_map} = "$argument $domain_arg $ptr_arg"; + if ($rfc2317_domain) { + if (lc($rfc2317_domain) eq lc($Domain)) { + # + # The PTR records are to be written to the + # same zone file as the forward-mapping + # domain data (-d option). + # + $net_file = "DOMAIN"; + $Net_ranges{$sub_classC_key} = + "\*" . qualify($net_file) . + " " . $ptr_template; + $sub_classC{lc($Domain)}{first_supernet} = $classC_key unless exists($sub_classC{lc($Domain)}{first_supernet}); + next; + } + $zone_file = $rfc2317_domain; + if ($rfc2317_domain =~ /\.in-addr\.arpa$/i) { + $zone_file = &REVERSE($rfc2317_domain); + $zone_file =~ s/^arpa\.in-addr\.//i; + $zone_file =~ s/\.($cidr_size)\/(.+)$/.$2\/$1/; + } + # + # Certain non-alphanumeric characters cause + # trouble when they appear in filenames but + # are nonetheless valid in a DNS domain name. + # Translate these nettlesome characters into + # a harmless "%" character after making sure + # to unescape any "$@()" characters. Escaped + # whitespace will be converted to underscore + # characters and then any remaining escapes + # will be eliminated. + # + for ($zone_file) { + s/\\([\$@\(\)])/$1/g; + s/[\/<|>&\[\(\)\$\?;'`]/%/g; + s/\\\s/_/g; + s/\\//g; + } + } + } + $net_file = "DB.$zone_file"; + # + # Prepend our package name to the value that is stored + # in the "%Net_ranges" hash. This hash value is used + # as a globally-scoped file descriptor typeglob for + # printing RRs to the DB files and as a key into + # the "%DB_filehandle" hash. + # + $subnet_key = $sub_classC_key if $cidr_size >= 25; + $Net_ranges{$subnet_key} = "\*" . qualify($net_file) . + " " . $ptr_template; + next if ($cidr_size >= 25 && + exists($sub_classC{$lc_zone_name}{first_supernet})); + + # Make sure the SOA record gets created as well as + # adding the necessary entries to the boot/conf file(s). + # + push(@makesoa, "db.$zone_file $net_file"); + push(@bootmsgs, "$zone_name db.$zone_file"); + $Net_zones{$subnet_key} = "$zone_name $zone_file"; + $sub_classC{$lc_zone_name}{first_supernet} = $classC_key if $cidr_size >= 25; + $lastNorD .= " $zone_file"; + + } # end of "foreach $subnet" loop + } # end of "while -n/-a" loop + $i--; + + } elsif ($option eq "-B") { + unless ($#args > $i && $args[$i + 1] !~ /^($h2n_opts)$/o + && $args[$i + 1] !~ /^($verify_opts)$/io) { + print STDERR "Improper -B option; the required boot file pathname argument is missing.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + next; + } + $Bwd = $args[++$i] . "/"; + $Bwd =~ s/\/+$/\//; + unless ($Bwd =~ /^\//) { + print STDERR "Must use an absolute pathname for -B option.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + next; + } + + } elsif ($option eq "-b") { + unless ($#args > $i && $args[$i + 1] !~ /^($h2n_opts)$/o + && $args[$i + 1] !~ /^($verify_opts)$/io) { + print STDERR "Improper -b option; the `boot' file argument is missing.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + next; + } + $Bootfile = $args[++$i]; + + } elsif ($option eq "-C") { + unless ($#args > $i && $args[$i + 1] !~ /^($h2n_opts)$/o + && $args[$i + 1] !~ /^($verify_opts)$/io) { + print STDERR "Improper -C option; must specify the name of a comment file as an argument.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + next; + } + $Commentfile = $args[++$i]; + if (! -r $Commentfile || -z $Commentfile) { + print STDERR "Invalid file `$Commentfile' specified for -C option.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + next; + } + + } elsif ($option eq "-c") { + unless ($#args > $i && $args[$i + 1] !~ /^($h2n_opts)$/o + && $args[$i + 1] !~ /^($verify_opts)$/io) { + print STDERR "Improper -c option; required domain name argument is missing.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + next; + } + while (++$i <= $#args && $args[$i] !~ /^($h2n_opts)$/o + && $args[$i] !~ /^($verify_opts)$/io) { + $argument = $args[$i]; + if ($argument =~ /^mode=/i) { + print STDERR "Improper -c option; a domain name must precede the `$argument' argument.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + last; + } + ($tmp = $argument) =~ s/\.+$//; + if (length($tmp) == 0 || &CHECK_NAME($tmp, 'SOA')) { + print STDERR "Improper -c option; the domain name `$argument' is invalid.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + last; + } + unless ($tmp =~ /\./) { + unless ($Domain) { + print STDERR "Improper -c option; the single-label domain name of `$argument'\nrequires that the -d option be first specified so that the\ndefault fully-qualified domain can be appended.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + last; + } else { + $argument = "$tmp.$Domain"; + } + } else { + $argument = $tmp; + } + ($tmp = lc($argument)) =~ s/\./\\./g; + if (exists($cpatrel{$tmp})) { + print STDERR "Improper -c option; the domain `$args[$i]' has\nalready been specified in a prior -c option.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + last; + } + $cpatrel{$tmp} = $argument; + push(@cpats, $tmp); + $cModeSpec{$tmp} = ""; # a `mode=' arg. may update this + + # Peek ahead and see if there's an optional `mode=' argument. + # + if ($#args > $i && $args[$i + 1] =~ /^mode=/i) { + ($argument = uc($args[++$i])) =~ s/^MODE=//; + $argument =~ s/[,]//g; + $error = 0; + unless ($argument =~ /^[ADIQ]+$/) { + print STDERR "Improper `$argument' argument in -c option.\nComponents of a valid `mode=' value are: A, D, I, and Q.\n"; + $error = 1; + } elsif ($argument =~ /^[AI]*Q$/) { + print STDERR "Improper `$argument' argument in -c option.\n'mode=' component of \"Q\" requires that \"D\" also be specified.\n"; + $error = 1; + } elsif ($argument =~ /I/ && !$Domain) { + print STDERR "Improper `$argument' argument in -c option.\n'mode=' component of \"I\" requires that the -d option be first specified.\n"; + $error = 1; + } elsif ($argument =~ /I/ && $cpatrel{$tmp} !~ /$Domainpattern$/i) { + print STDERR "Improper `-c $cpatrel{$tmp}' option.\nThe `mode=' component of \"I\" requires the -c domain to be\nan intra-zone subdomain of the -d option ($Domain).\n"; + $error = 1; + } + if ($error) { + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + last; + } + $cModeSpec{$tmp} = $argument; # update with actual flag(s) + } + } + $i--; + + } elsif ($option eq "+C") { + unless ($#args > $i && $args[$i + 1] !~ /^($h2n_opts)$/o + && $args[$i + 1] !~ /^($verify_opts)$/io) { + print STDERR "Improper +C option; the `conf' prepend file argument is missing.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + next; + } + $argument = $args[++$i]; + if ($Conf_prefile) { + if ($verbose) { + print STDERR "Extra +C option ($argument) ignored, only one instance allowed.\n"; + $message_count++; + } + $i++; + next; + } + $error = 0; + if (!-e $argument) { + print STDERR "Improper +C option; `$argument' is a non-existent file.\n"; + $error = 1; + } elsif (!-f $argument) { + print STDERR "Improper +C option; `$argument' is not a plain file.\n"; + $error = 1; + } elsif (!-r $argument) { + print STDERR "Improper +C option; `$argument' is a non-readable file.\n"; + $error = 1; + } + if ($error) { + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + last; + } else { + ($Conf_prefile = $argument) =~ s/^\.\///; + $Conf_prefile = "$Pwd/$Conf_prefile" if $Conf_prefile !~ /^\//; + } + + } elsif ($option eq "+c") { + unless ($#args > $i && $args[$i + 1] !~ /^($h2n_opts)$/o + && $args[$i + 1] !~ /^($verify_opts)$/io) { + print STDERR "Improper +c option; must specify a `conf' file and/or `mode=' argument(s)\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + next; + } + while (++$i <= $#args && $args[$i] !~ /^($h2n_opts)$/o + && $args[$i] !~ /^($verify_opts)$/io) { + $argument = $args[$i]; + if ($argument =~ /^mode=/i) { + ($argument = uc($argument)) =~ s/^MODE=//; + unless ($argument =~ /^[MS]$/) { + print STDERR "Improper `$argument' argument in +c option.\nValid `mode=' value is either `S' or `M'.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + last; + } + $new_fmt_Conffile = ($argument eq "S") ? 0 : 1; + } else { + $Conffile = $argument; + } + } + $i--; + + } elsif ($option eq "-d") { + unless ($#args > $i && $args[$i + 1] !~ /^($h2n_opts)$/o + && $args[$i + 1] !~ /^($verify_opts)$/io) { + print STDERR "Improper -d option; at least one argument, the domain name, must be specified.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + next; + } + $argument = $args[++$i]; + if ($argument =~ /^(db|spcl|mode)=/i) { + print STDERR "Improper -d option; a domain name must precede any `db=|spcl=|mode=' arguments.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + next; + } + if ($Domain) { + if ($verbose) { + print STDERR "Extra -d option ($argument) ignored, only one instance allowed.\n"; + $message_count++; + } + $i++; + while ($args[$i] =~ /^(db|spcl|mode)=/i) { + $i++; + } + next; + } + ($Domain = $argument) =~ s/\.+$//; + if (length($Domain) == 0 || &CHECK_NAME($Domain, 'SOA')) { + print STDERR "Improper -d option; the domain name `$argument' is invalid.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + next; + } + ($Domainpattern = ".$Domain") =~ s/\./\\./g; # for stripping domain + ($Domainfile = $Domain) =~ s/\..*//; + $Specialfile = "spcl.$Domainfile"; + $Domainfile = "db.$Domainfile"; + + # Process any optional arguments that may be present. + # + while (++$i <= $#args && $args[$i] !~ /^($h2n_opts)$/o + && $args[$i] !~ /^($verify_opts)$/io) { + $argument = $args[$i]; + if ($argument !~ /^(db|spcl|mode)=/i) { + print STDERR "Improper -d option; unknown argument ($argument).\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + last; + } + if (!defined($AltDb) && $argument =~ /^db=/i) { + ($Domainfile = $argument) =~ s/^db=//i; + if ($Domainfile =~ /\// && $Domainfile !~ /^\.\/[^\/]+/) { + print STDERR "No pathname allowed in `-d db=' argument.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + last; + } + $AltDb = 1; + } elsif (!defined($AltSpcl) && $argument =~ /^spcl=/i) { + ($Specialfile = $argument) =~ s/^spcl=//i; + $AltSpcl = 1; + } elsif ($argument =~ /^mode=/i) { + if ($argument =~ /^mode=d/i) { + if (!defined($UseDefaultDomain)) { + $UseDefaultDomain = 1; + } elsif ($verbose) { + print STDERR "Extra -d argument ($argument) ignored, only one instance allowed.\n"; + $message_count++; + } + } else { + print STDERR "Improper `$argument' argument in -d option.\nThe component of a valid `mode=' value must be `D'.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + last; + } + } elsif ($verbose) { + print STDERR "Extra -d argument ($argument) ignored, only one instance allowed.\n"; + $message_count++; + } + } + $i--; + + # Add entry to the boot file. + # + $lastNorD = "-d $Domainfile"; + push(@makesoa, "$Domainfile DOMAIN"); + push(@bootmsgs, "$Domain $Domainfile"); + + } elsif ($option eq "-e") { + unless ($#args > $i && $args[$i + 1] !~ /^($h2n_opts)$/o + && $args[$i + 1] !~ /^($verify_opts)$/io) { + print STDERR "Improper -e option; required domain name argument is missing.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + next; + } + while (++$i <= $#args && $args[$i] !~ /^($h2n_opts)$/o + && $args[$i] !~ /^($verify_opts)$/io) { + $argument = $args[$i]; + ($tmp = lc($argument)) =~ s/\.+$//; + if (length($tmp) == 0 || &CHECK_NAME($tmp, 'SOA')) { + print STDERR "Improper -e option; the domain name `$argument' is invalid.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + last; + } + unless ($tmp =~ /\./) { + unless ($Domain) { + print STDERR "Improper -e option; the single-label domain name of `$argument'\nrequires that the -d option be previously specified so that\nthe default fully-qualified domain can be appended.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + last; + } else { + $argument = "$tmp.$Domain"; + } + } else { + $argument = $tmp; + } + if (exists($e_opt_domain{$argument})) { + print STDERR "Improper -e option; the domain `$args[$i]' has\nalready been specified in a prior -e option.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + last; + } + $e_opt_domain{$argument} = 1; + $argument =~ s/\./\\./g; + push(@elimpats, $argument); + } + $i--; + + } elsif ($option eq "-f") { + unless ($#args > $i && $args[$i + 1] !~ /^($h2n_opts)$/o + && $args[$i + 1] !~ /^($verify_opts)$/io) { + print STDERR "Improper -f option; the required filename argument is missing.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + next; + } + $file = $args[++$i]; + $tmp1 = join(":", (stat($file))[0..1]); + if ($tmp1 eq $rcfile) { + print STDERR "Warning: -f option ignored; `$file' has been already\n"; + print STDERR " processed as an $Program configuration file.\n"; + $message_count++; + $i++; + next; + } + unless (open(*OPT, $file)) { + print STDERR "Unable to open options file `$file': $!\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + next; + } + # Read through each line of the options file and split it into a + # stream of individual option/argument tokens via the following + # shell-like rules: + # + # 1. Quoting characters are the escape (\), the literal or + # single quote ('), and the grouping or double quote ("). + # 2. Tokens are delimited by unquoted whitespace (space, tab, + # and newline). Multi-line tokens are not allowed, however. + # A quoted newline generates an "unexpected end of input" + # error. + # 3. Tokens that begin with an unquoted "#" or ";" character + # signify the start of a comment which then extends to + # the rest of the line. + # 4. A pair of literal (single) quotes removes the special + # meaning of all enclosed characters, i.e., nothing can be + # escaped since "\" becomes a literal backslash character. + # Use \' or "'" outside of single quotes to refer to the + # literal ' character. + # 5. A pair of grouping (double) quotes removes the special + # meaning of all enclosed characters except "\" and the + # double quote itself. This means that the backslash and + # the double quote character can be rendered into their + # literal meaning by preceding them with an escape. + # + @file_args = (); + $line_num = $skip_next_token = 0; + $error = ""; + while (<OPT>) { + $line_num++; + chop; + s/\s+$//; + $original_line = $_; + s/^\s+//; + next if /^$/ || /^[#;]/; + $comment = 0; + unless (/[\\"']/) { + foreach $token (split(' ')) { + if ($token =~ /^[#;]/) { + $comment = 1; + last; + } + if ($skip_next_token) { + $skip_next_token = 0; + next; + } + if ($token eq "-f") { + if ($verbose) { + print STDERR "Already reading file `$file'; nested -f option ignored.\n"; + $message_count++; + } + $skip_next_token = 1; + next; + } + push(@file_args, $token); + } + next if $comment; + } else { + # + # Assemble a token character-by-character until unquoted + # whitespace or the end of the line is reached. + # + $token = ""; + $open_quote = 0; + while (length($_)) { + ($char, $_) = split(//, $_, 2); + if ($open_quote == 1) { + if ($char eq "'") { + $open_quote = 0; + next; + } + } elsif ($char eq "\\") { + unless (length($_)) { + $error = "unexpected end of input\n> $original_line"; + last; + } + ($char, $_) = split(//, $_, 2); + } elsif ($open_quote == 2) { + if ($char eq '"') { + $open_quote = 0; + next; + } + } elsif ($char eq "'") { + $open_quote = 1; + next; + } elsif ($char eq '"') { + $open_quote = 2; + next; + } elsif ($char =~ /\s/) { + if ($token =~ /[#;]/) { + $comment = 1; + last; + } elsif ($skip_next_token) { + $skip_next_token = 0; + } elsif ($token eq "-f") { + if ($verbose) { + print STDERR "Already reading file `$file'; nested -f option ignored.\n"; + $message_count++; + } + $skip_next_token = 1; + } else { + push(@file_args, $token); + } + $token = ""; + s/^\s+//; + next; + } + $token .= $char; + } + if ($open_quote) { + $error = "unbalanced quotes\n> $original_line"; + } elsif (!$comment && !$error) { + if ($skip_next_token) { + $skip_next_token = 0; + } elsif ($token eq "-f") { + if ($verbose) { + print STDERR "Already reading file `$file'; nested -f option ignored.\n"; + $message_count++; + } + $skip_next_token = 1; + } else { + push(@file_args, $token); + } + } + } + last if $error; + } + close(*OPT); + if ($error) { + print STDERR "Error in option file `$file' at line $line_num; $error\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + next; + } else { + # + # Preserve the order in which the arguments were presented to + # this program by appending what's left of the original argument + # list to those that were just read in from the options file. + # The next argument to be processed will be the first one from + # the just-read file. + # + push(@file_args, @args[++$i..$#args]); + @args = @file_args; + $i = -1; + } + + } elsif ($option eq "-H") { + unless ($#args > $i && $args[$i + 1] !~ /^($h2n_opts)$/o + && $args[$i + 1] !~ /^($verify_opts)$/io) { + print STDERR "Improper -H option; must specify the name of a host file as an argument.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + next; + } + $Hostfile = $args[++$i]; + if (! -r $Hostfile || -z $Hostfile) { + print STDERR "Invalid file `$Hostfile' specified for -H option.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + next; + } + + } elsif ($option eq "-h") { + unless ($#args > $i && $args[$i + 1] !~ /^($h2n_opts)$/o + && $args[$i + 1] !~ /^($verify_opts)$/io) { + print STDERR "Improper -h option; the zone master name server (SOA MNAME) is missing.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + next; + } + $Host = $args[++$i]; + + } elsif ($option eq "-I") { + # + # Maintain backward-compatibility in case there is no argument. + # + $check_level = "fail"; + $rfc952 = 0; + $rfc1123 = 1; + $audit = 1; + $DefAction = "Skipping"; + while (++$i <= $#args && $args[$i] !~ /^($h2n_opts)$/o + && $args[$i] !~ /^($verify_opts)$/io) { + $argument = $args[$i]; + if ($argument =~ /^(no|false|off|none|disable|ignore)$/i) { + $check_level = "ignore"; + $rfc952 = 0; + $rfc1123 = 0; + $audit = 0; + $DefAction = "Warning"; + } elsif ($argument =~ /^warn$/i) { + $check_level = "warn"; + $rfc952 = 0; + $rfc1123 = 1; + $audit = 0; + $DefAction = "Warning"; + } elsif ($argument =~ /^audit\-only$/i) { + $check_level = "audit-only"; + $rfc952 = 0; + $rfc1123 = 0; + $audit = 1; + $DefAction = "Warning"; + } elsif ($argument =~ /^audit$/i) { + $check_level = "audit"; + $rfc952 = 0; + $rfc1123 = 1; + $audit = 1; + $DefAction = "Warning"; + } elsif ($argument =~ /^warn\-strict$/i) { + $check_level = "warn-strict"; + $rfc952 = 1; + $rfc1123 = 1; + $audit = 1; + $DefAction = "Warning"; + } elsif ($argument =~ /^(yes|true|on|check|enable|fail)$/i) { + $check_level = "fail"; + $rfc952 = 0; + $rfc1123 = 1; + $audit = 1; + $DefAction = "Skipping"; + } elsif ($argument =~ /^strict$/i) { + $check_level = "strict"; + $rfc952 = 1; + $rfc1123 = 1; + $audit = 1; + $DefAction = "Skipping"; + } elsif ($argument =~ /^rfc-?2782$/i) { + $rfc2782 = 1; + } else { + if ($verbose) { + print STDERR "Unknown `-I' argument (`$argument'); name checking remains `$check_level'.\n"; + $message_count++; + } + } + } + $i--; + + } elsif ($option eq "-i") { + unless ($#args > $i && $args[$i + 1] !~ /^($h2n_opts)$/o + && $args[$i + 1] !~ /^($verify_opts)$/io) { + print STDERR "Improper -i option; the SOA serial number is missing.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + next; + } + $argument = $args[++$i]; + $error = 0; + if ($UseDateInSerial) { + print STDERR "Improper -i option; it is incompatible with the already-specified -y option.\n"; + $error = 1; + } elsif ($argument !~ /^\d+$/ || $argument > 4294967295) { + print STDERR "Improper -i option; the SOA serial number must be a non-negative\ninteger between zero and 4294967295. See RFC-1982 for details.\n"; + $error = 1; + } + if ($error) { + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + next; + } else { + $NewSerial = $argument; + if ($NewSerial == 0) { + print STDERR "Warning: Setting the SOA serial number to zero may cause unpredictable results\n with slave name servers. See RFC-1982, Section 7 for details.\n"; + $message_count++; + } + } + + } elsif ($option eq "-L") { + unless ($#args > $i && $args[$i + 1] !~ /^($h2n_opts)$/o + && $args[$i + 1] !~ /^($verify_opts)$/io) { + print STDERR "Improper -L option; the max-filehandles argument is missing.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + next; + } + $argument = $args[++$i]; + if ($argument !~ /^\d+$/ && $verbose) { + print STDERR "Expected numerical argument for -L option; ignored.\n"; + $message_count++; + } elsif ($argument < 10) { + if ($verbose) { + print STDERR "Using minimum value of 10 for -L option.\n"; + $message_count++; + } + $Open_file_limit = 10; + } else { + $Open_file_limit = $argument; + } + + } elsif ($option eq "+L") { + $CustomLogging = 1; + $argument = ""; + while (++$i <= $#args && $args[$i] !~ /^($h2n_opts)$/o + && $args[$i] !~ /^($verify_opts)$/io) { + $argument .= "$args[$i] "; + } + $i--; + if ($argument) { + $argument =~ s/ +$//; + $argument .= ";" unless $argument =~ /;$/; + push(@ConfLogging, $argument); + } + + } elsif ($option eq "-M") { + $do_mx = 0; + + } elsif ($option eq "-m") { + while (++$i <= $#args && $args[$i] !~ /^($h2n_opts)$/o + && $args[$i] !~ /^($verify_opts)$/io) { + $argument = $args[$i]; + ($preference, $domain_arg) = split(/:/, $argument, 2); + $error = 0; + unless ($preference && $preference =~ /^\d+$/ + && $preference <= 65535) { + print STDERR "Improper -m option; invalid MX preference value ($preference).\n"; + $error = 1; + } elsif (!$domain_arg) { + print STDERR "Improper -m option; missing MX hostname.\n"; + $error = 1; + } elsif ($domain_arg =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/) { + print STDERR "Uh, the -m option requires a domain name, not an IP address.\n"; + $error = 1; + } + if ($error) { + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + last; + } else { + push(@MX, "$preference $domain_arg"); + } + } + $i--; + + } elsif ($option eq "+m") { + $argument = ""; + while (++$i <= $#args && $args[$i] !~ /^($h2n_opts)$/o + && $args[$i] !~ /^($verify_opts)$/io) { + $argument .= $args[$i]; + } + $i--; + $argument =~ s/[,]//g; + unless ($argument =~ /^(D|C|P|CP|PC)$/i) { + print STDERR "Improper `$argument' argument in +m option.\nValid argument must be one of: D, C, P, or CP.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + next; + } else { + $argument = uc($argument); + if ($multi_homed_mode && $verbose) { + print STDERR "Hmm, using `+m $argument' to override previous +m option.\n"; + $message_count++; + } + $multi_homed_mode = $argument; + } + + } elsif ($option eq "-N") { + unless ($#args > $i && $args[$i + 1] !~ /^($h2n_opts)$/o + && $args[$i + 1] !~ /^($verify_opts)$/io) { + print STDERR "Improper -N option; must specify /CIDRsize or subnetmask as an argument.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + next; + } + $argument = $args[++$i]; + if ($argument =~ /^\//) { + ($cidr_size = $argument) =~ s/^\///; + $Defsubnetmask = undef; + } else { + $cidr_size = undef; + $Defsubnetmask = $argument; + } + $error = &CHECK_NET(undef, \$cidr_size, \$Defsubnetmask); + if ($error) { + print STDERR "Improper -N option ($argument):\n$error"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + next; + } elsif ($cidr_size < 8) { + print STDERR "Improper -N option ($argument).\nOnly network sizes /8 to /32 are supported.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + next; + } + + } elsif ($option eq "-O") { + $argument = ""; + while (++$i <= $#args && $args[$i] !~ /^($h2n_opts)$/o + && $args[$i] !~ /^($verify_opts)$/io) { + $argument .= "$args[$i] "; + } + $i--; + $argument =~ s/ $//; + push(@BootOptions, $argument); + + } elsif ($option eq "-o") { + unless ($#args > $i && $args[$i + 1] !~ /^($h2n_opts)$/o + && $args[$i + 1] !~ /^($verify_opts)$/io) { + print STDERR "Improper -o option; must specify an argument of one or more SOA time values.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + next; + } + $argument = $args[++$i]; + unless ("$argument:" =~ /^((\d+|(\d+[wdhms])+)?:){1,5}$/i || + $argument =~ /^:{3,4}$/ || $argument !~ /^([+-].*)?$/) { + print STDERR "Improper -o option `$argument'.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + next; + } + # As of version 2.40 of `h2n', RFC-2308 status is assumed + # unless one of the following two conditions is true: + # + # 1. We are able to determine that a BIND version earlier + # than 8.2 is running on the master name server. + # + # 2. The BIND version is unknown *and* exactly four arguments + # (any of which can be null) are specified in the -o option + # *and* no +t option is specified *and* no $TTL directive is + # discovered in an existing DB file. + # + # Here are some examples that illustrate the various contexts: + # + # -o ::: Special case of explicitly specifying `h2n' + # default SOA values and toggling the default + # RFC-2308 status to false. + # + # -o :30m:: Sets SOA Retry field for all DB files and + # toggles the default RFC-2308 status to false. + # + # -o :::8h Sets non-RFC-2308 TTL interval in the + # SOA Minimum field for all DB files and toggles + # the default RFC-2308 status to false. + # + # -o :30m::8h Combines the previous two examples while + # toggling the default RFC-2308 status to false. + # + # -o 3h:1h:1w:1d Explicitly specifies all four default SOA values + # and sets the default RFC-2308 status to false. + # + # -o :::: Special case of explicitly specifying `h2n' + # default SOA values and leaving the default + # RFC-2308 status to true. + # + # -o :30m Sets SOA Retry field for all DB files but leaves + # the default RFC-2308 status to true since there + # are not exactly four arguments specified. + # + # -o ::::8h Sets RFC-2308 $TTL directive for all DB files. + # SOA Minimum fields either retain existing values + # or get the default negative caching interval. + # + # -o :::30m: Sets RFC-2308 negative caching interval in the + # SOA Minimum field for all DB files. + # $TTL directives either retain existing values + # or are created with the default TTL value. + # + # -o :::30m:8h Sets RFC-2308 $TTL directive and SOA Minimum + # field for all DB files. + # + # The default $TTL value and negative caching interval can + # also be set with the +t option. However, doing so will + # set the "$rfc2308" flag to a "hard" value of 2 which only + # the FIXUP subroutine can reverse if it detects a BIND + # version earlier than 8.2. The -o option can toggle the + # "$rfc2308" flag between 0 (non-RFC-2308 status) and 1 + # ("soft" RFC-2308 status) as long as +t is not specified. + # + $tmpTtl = $tmpMasterTtl = ""; + if ($Refresh || $Retry || $Expire || $Ttl || $MasterTtl) { + if ($verbose) { + print STDERR "Hmm, using `-o $argument' to override previous -o/+t option.\n"; + $message_count++; + } + if ($rfc2308 && ($Ttl || $MasterTtl)) { + if ($rfc2308 != 2 && $argument =~ /^([^:]*:){3}[^:]*$/) { + if ($verbose) { + print STDERR "(Ignoring previous \$TTL/Negative cache value(s).)\n"; + $message_count++; + } + $Ttl = $MasterTtl = ""; + } elsif ($argument !~ /^([^:]*:){3,4}[^:]*$/) { + if ($verbose) { + print STDERR "(Retaining previous \$TTL/Negative cache value(s), however.)\n"; + $message_count++; + } + $tmpTtl = $Ttl if $Ttl; + $tmpMasterTtl = $MasterTtl if $MasterTtl; + } + } + } + if ($rfc2308 != 2) { + $rfc2308 = ($argument =~ /^([^:]*:){3}[^:]*$/) ? 0 : 1; + } + ($Refresh, $Retry, $Expire, $Ttl, $MasterTtl) = split(':', $argument); + $Ttl = $tmpTtl if $tmpTtl; + $MasterTtl = $tmpMasterTtl if $tmpMasterTtl; + if ($verbose) { + $message_count++ if &CHECK_SOA_TIMERS; + } + + } elsif ($option eq "+O") { + $argument = ""; + while (++$i <= $#args && $args[$i] !~ /^($h2n_opts)$/o + && $args[$i] !~ /^($verify_opts)$/io) { + $argument .= "$args[$i] "; + } + $i--; + $CustomOptions = 1; + if ($argument) { + $argument =~ s/ +$//; + $argument .= ";" unless $argument =~ /[;{]$/; + push(@ConfOptions, $argument); + } else { + $NeedHints = 0; + } + + } elsif ($option eq "+om") { + $argument = ""; + while (++$i <= $#args && $args[$i] !~ /^($h2n_opts)$/o + && $args[$i] !~ /^($verify_opts)$/io) { + $argument .= "$args[$i] "; + } + $i--; + $argument =~ s/ +$//; + $argument .= ";" unless $argument =~ /[;{]$/; + if ($lastNorD =~ /^-d (.*)/) { + $MasterZoneOptions{$1} .= "$argument\n"; + } elsif ($lastNorD =~ /^-n /) { + ($tmp1 = $lastNorD) =~ s/^-n //; + foreach $tmp2 (split(' ', $tmp1)) { + $MasterZoneOptions{"db.$tmp2"} .= "$argument\n"; + } + } else { + push(@GlobalMasterZoneOptions, $argument); + } + + } elsif ($option eq "+os") { + $argument = ""; + while (++$i <= $#args && $args[$i] !~ /^($h2n_opts)$/o + && $args[$i] !~ /^($verify_opts)$/io) { + $argument .= "$args[$i] "; + } + $i--; + $argument =~ s/ +$//; + $argument .= ";" unless $argument =~ /[;{]$/; + if ($lastNorD =~ /^-d (.*)/) { + $SlaveZoneOptions{$1} .= "$argument\n"; + } elsif ($lastNorD =~ /^-n /) { + ($tmp1 = $lastNorD) =~ s/^-n //; + foreach $tmp2 (split(' ', $tmp1)) { + $SlaveZoneOptions{"db.$tmp2"} .= "$argument\n"; + } + } else { + push(@GlobalSlaveZoneOptions, $argument); + } + + } elsif ($option eq "-P") { + eval { require Tie::CPHash; }; + if ($@) { + print STDERR "Ignoring -P option; the required Tie::CPHash Perl module is not installed.\n"; + $message_count++; + } else { + $preserve_case = 1; + } + + } elsif ($option eq "-p") { + unless ($#args > $i && $args[$i + 1] !~ /^($h2n_opts)$/o + && $args[$i + 1] !~ /^($verify_opts)$/io) { + print STDERR "Improper -p option; required domain name argument is missing.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + next; + } + while (++$i <= $#args && $args[$i] !~ /^($h2n_opts)$/o + && $args[$i] !~ /^($verify_opts)$/io) { + $argument = $args[$i]; + if ($argument =~ /^mode=/i) { + print STDERR "Improper -p option; a domain name must precede the `$argument' argument.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + last; + } + ($tmp = $argument) =~ s/\.+$//; + if (length($tmp) == 0 || &CHECK_NAME($tmp, 'SOA')) { + print STDERR "Improper -p option; the domain name `$argument' is invalid.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + last; + } + unless ($tmp =~ /\./) { + unless ($Domain) { + print STDERR "Improper -p option; the single-label domain name of `$argument'\nrequires that the -d option be previously specified so that\nthe default fully-qualified domain can be appended.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + last; + } else { + $argument = "$tmp.$Domain"; + } + } else { + $argument = $tmp; + } + ($tmp = lc($argument)) =~ s/\./\\./g; + if (exists($ptrpatrel{$tmp})) { + print STDERR "Improper -p option; the domain `$args[$i]' has\nalready been specified in a prior -p option.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + last; + } + $ptrpatrel{$tmp} = $argument; + push(@ptrpats, $tmp); + $pModeSpec{$tmp} = ""; # a `mode=' arg. may update this + + # Peek ahead and see if there's an optional `mode=' argument. + # + if ($#args > $i && $args[$i + 1] =~ /^mode=/i) { + ($argument = uc($args[++$i])) =~ s/^MODE=//; + $argument =~ s/[,]//g; + # + # Accept "D" as a valid flag for consistency with the +m + # option and the "[mh= ]" comment flag in the host file. + # Silently ignore it, however. + # + unless ($argument =~ /^(A|D|AD|DA|P)$/) { + print STDERR "Improper `$argument' argument in -p option.\nValid `mode=' value must be one of `A' or `P'.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + last; + } + $argument =~ s/D//; + $pModeSpec{$tmp} = $argument; # update with actual flag(s) + } + } + $i--; + + } elsif ($option eq "-q") { + $verbose = 0; + + } elsif ($option eq "-r") { + $do_rp = 1; + + } elsif ($option eq "-S") { + $error = 0; + unless ($#args > $i && $args[$i + 1] !~ /^($h2n_opts)$/o + && $args[$i + 1] !~ /^($verify_opts)$/io) { + print STDERR "Improper -S option; required domain name argument is missing.\n"; + $error = 1; + } elsif (!$lastNorD) { + print STDERR "Uh, the -S option is position dependent (applies to preceding -d or -n).\n"; + $error = 1; + } + if ($error) { + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + next; + } + while (++$i <= $#args && $args[$i] !~ /^($h2n_opts)$/o + && $args[$i] !~ /^($verify_opts)$/io) { + $argument = $args[$i]; + if ($argument =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/) { + print STDERR "Uh, the -S option requires a domain name, not an IP address.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + last; + } elsif ($lastNorD =~ /^-d (.+)/) { + $PartialServers{$1} .= " $argument"; + } elsif ($lastNorD =~ /^-n /) { + ($tmp1 = $lastNorD) =~ s/^-n //; + foreach $tmp2 (split(' ', $tmp1)) { + $PartialServers{"db.$tmp2"} .= " $argument"; + } + } + } + $i--; + + } elsif ($option eq "+S") { + $argument = ""; + while (++$i <= $#args && $args[$i] !~ /^($h2n_opts)$/o + && $args[$i] !~ /^($verify_opts)$/io) { + $argument = $args[$i]; + if ($argument =~ /^(no|false|off|none|disable)$/i) { + $default_supernetting = 0; + } elsif ($argument =~ /^(yes|true|on|enable)$/i) { + $default_supernetting = 1; + } else { + if ($verbose) { + $check_level = ($default_supernetting) ? "enabled" + : "disabled"; + print STDERR "Unknown `+S' argument (`$argument'); supernetting remains $check_level.\n"; + $message_count++; + } + } + } + $i--; + unless ($argument) { + if ($default_supernetting && $verbose) { + print STDERR "Redundant +S option with no argument; supernetting remains enabled.\n"; + $message_count++; + } + $default_supernetting = 1; + } + + } elsif ($option eq "-s") { + unless ($#args > $i && $args[$i + 1] !~ /^($h2n_opts)$/o + && $args[$i + 1] !~ /^($verify_opts)$/io) { + print STDERR "Improper -s option; required domain name argument is missing.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + next; + } + while (++$i <= $#args && $args[$i] !~ /^($h2n_opts)$/o + && $args[$i] !~ /^($verify_opts)$/io) { + $argument = $args[$i]; + if ($argument =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/) { + print STDERR "Uh, the -s option requires a domain name, not an IP address.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + last; + } else { + push(@FullServers, $argument); + } + } + $i--; + + } elsif ($option eq "-T") { + unless ($#args > $i && $args[$i + 1] !~ /^($h2n_opts)$/o + && $args[$i + 1] !~ /^($verify_opts)$/io) { + print STDERR "Improper -T option; must specify at least one of the following arguments:\n"; + print STDERR " mode=M, RR=, and/or ALIAS=\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + next; + } + while (++$i <= $#args && $args[$i] !~ /^($h2n_opts)$/o + && $args[$i] !~ /^($verify_opts)$/io) { + $argument = $args[$i]; + if ($argument =~ /^mode=M/i) { + $do_zone_apex_mx = 1; + } elsif ($argument =~ /^ALIAS=/i) { + ($domain_arg = $argument) =~ s/^ALIAS=//i; + unless (length($domain_arg)) { + print STDERR "Improper -T option; the `ALIAS=' keyword requires a domain name as an argument.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + last; + } + ($domain_arg, $ttl) = split(' ', $domain_arg, 2); + $ttl = "" unless defined($ttl); + if (exists($Apex_aliases{lc($domain_arg)})) { + print STDERR "Improper -T option; duplicate argument `$argument' ignored.\n" if $verbose; + $message_count++; + } elsif ($ttl && $ttl !~ /^(\d+|(\d+[wdhms])+)$/i) { + print STDERR "Improper -T option; invalid TTL in argument `$argument'.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + last; + } else { + $Apex_aliases{lc($domain_arg)} = "$domain_arg $ttl"; + } + } elsif ($argument =~ /^RR=/i) { + ($token = $argument) =~ s/^RR=//i; + unless (length($token)) { + print STDERR "Improper -T option; the `RR=' keyword requires a DNS record as an argument.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + last; + } + $error = ""; + if ($token =~ /^(.*?\s)($RRtypes)\s+(.+)/io) { + $tmp1 = $1; + $rrtype = uc($2); + $rdata = $3; + $tmp1 =~ s/\s+IN\s+$//i; # strip `IN' if present + $domain_arg = '@'; # set to default value + if ($tmp1 =~ /^\S/) { # $ttl *may* be null + ($domain_arg, $ttl) = split(' ', $tmp1); + 1 while $domain_arg =~ s/\\\\/\\/g; + } elsif ($tmp1 =~ /\S/) { # $ttl is *not* null + ($ttl = $tmp1) =~ s/\s+//g; + } else { # $ttl *is* null + $ttl = ""; + } + if ($domain_arg ne '@' && lc($domain_arg) ne lc("$Domain.")) { + $error = "the `RR=' owner field must be `\@' if specified."; + } elsif ($rrtype eq 'SOA') { + $error = "the SOA record is configured with -h/-i/-o/+t/-u/-y."; + } elsif ($rrtype eq 'NS') { + $error = "zone apex NS records may only be configured with -s/-S."; + } elsif ($rrtype !~ /^($apex_RRtypes)$/o) { + $error = "`$rrtype' is out of context as a zone apex RR type."; + } elsif ($ttl && $ttl !~ /^(\d+|(\d+[wdhms])+)$/i) { + $error = "invalid TTL ($ttl)."; + } + } else { + $error = "the `RR=' argument has a bad format or an unknown RR type."; + } + if ($error) { + print STDERR "Improper -T option; $error\n"; + $argument =~ s/=.*//; + print STDERR "> $argument='$token'\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + last; + } + $continuation_line = $open_paren_count = $open_quote = 0; + while ($continuation_line || $rdata =~/["()]/) { + # + # Accommodate the possibility that the -T option + # may specify a multi-line resource record, e.g., + # + # -T RR=" WKS 192.249.239.3 TCP ( telnet smtp" + # " ftp shell domain)" + # -T RR=' TXT "First line of text\' + # 'second line of text."' + # + # NOTE: The shell and/or the -f option has already + # ensured that any quotes needed to protect + # whitespace or other special characters in + # the "@args" argument stream are already + # balanced. These 'outer' quotes are + # effectively removed as each argument is + # assembled and thus are not seen here. + # Unescaped "inner" quotes that are part of + # an RDATA field, however, are seen and + # accounted for by the -T option. Unbalanced + # quotes and/or parentheses will cause subsequent + # arguments to be appended until balance is + # achieved or there are no more arguments left + # in "@args". + # + $token = $rdata; + $last_char = ""; + while (length($token)) { + ($char, $token) = split(//, $token, 2); + if ($char eq "\\" && $last_char eq "\\") { + # + # An escape character which is itself escaped + # becomes an ordinary backslash character. + # Remove its ability to escape the next + # character in the byte stream. + # + $last_char = ""; + next; + } + unless ($open_quote || $last_char eq "\\") { + last if $char eq ";"; + if ($char eq "\(") { + $open_paren_count++; + # + # Maintain a stack of arguments which have + # open quotes and/or parentheses. Arguments + # are popped from the stack as the balancing + # characters are read. Leftover arguments + # on the stack are reported along with the + # appropriate error message to help locate + # the source of the imbalance. + # + $j = $#unbalanced_args; + if ($j < 0 || $unbalanced_args[$j][0] ne $rdata) { + push(@unbalanced_args, [ $rdata, 0 ]); + } else { + $unbalanced_args[$j][1]++; + } + } elsif ($char eq "\)") { + $open_paren_count--; + $j = $#unbalanced_args; + if ($open_paren_count < 0) { + @unbalanced_args = (); + push(@unbalanced_args, $rdata); + last; + } + if ($unbalanced_args[$j][1]) { + $unbalanced_args[$j][1]--; + } else { + pop(@unbalanced_args); + } + } + } + if ($char eq '"' && $last_char ne "\\") { + $open_quote = !$open_quote; + $j = $#unbalanced_args; + if ($open_quote) { + if ($j < 0 || $unbalanced_args[$j][0] ne $rdata) { + push(@unbalanced_args, [ $rdata, 0 ]); + } else { + $unbalanced_args[$j][1]++; + } + } else { + if ($unbalanced_args[$j][1]) { + $unbalanced_args[$j][1]--; + } else { + pop(@unbalanced_args); + } + } + } + $last_char = $char; + + } + if ($continuation_line) { + # + # Append a newline as a way of signaling FIXUP() + # and MAKE_SOA() that this is a multi-line record. + # A second newline is appended if an open quote + # is in effect when the line break occurs. + # + $rdata .= "\n"; + $rdata .= "\n" if $continuation_line == 2; + } else { + # + # Prepend the record's TTL to the beginning + # of each new RR. + # + $rdata = "$ttl,$rdata"; + } + push(@{ $Apex_RRs{$rrtype} }, $rdata); + unless ($open_quote || $open_paren_count) { + $rdata = ""; + $continuation_line = 0; + } elsif ($open_paren_count < 0) { + $error = "found `RR=' argument with a misplaced closing parenthesis:\n"; + $error .= "> `$unbalanced_args[0]'"; + last; + } else { + # + # Get the next token in the PARSE_ARGS() argument + # vector provided there is one that's available. + # + if ($#args > $i) { + $continuation_line = ($open_quote) ? 2 : 1; + $rdata = $args[++$i]; + } else { + if (!$open_quote) { + $tmp1 = "parentheses.\n"; + } elsif (!$open_paren_count) { + $tmp1 = "quotes.\n"; + } else { + $tmp1 = "parentheses and\nquotes. "; + } + $error = "found `RR=' argument(s) with unbalanced $tmp1"; + $error .= "Ran out of arguments before the following item(s) could be balanced:"; + for $j (0 .. $#unbalanced_args) { + $error .= "\n> `$unbalanced_args[$j][0]'"; + } + last; + } + } + } + if ($error) { + print STDERR "Improper -T option; $error\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + last; + } elsif ($rdata) { + # + # An ordinary single-line RR was specified. + # + $rdata = "$ttl,$rdata"; + push(@{ $Apex_RRs{$rrtype} }, $rdata); + } + } else { + print STDERR "Improper -T option; argument `$argument' is unrecognized.\n"; + print STDERR " Must be one of mode=M, RR=, and/or ALIAS=\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + last; + } + + } + $i--; + + } elsif ($option eq "-t") { + $do_txt = 1; + + } elsif ($option eq "+t") { + unless ($#args > $i && $args[$i + 1] !~ /^($h2n_opts)$/o + && $args[$i + 1] !~ /^($verify_opts)$/io) { + print STDERR "Improper +t option; must specify at least a DEFAULT-TTL argument.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + next; + } + $argument = $args[++$i]; + unless ($argument =~ /^(\d+|(\d+[wdhms])+)$/i) { + print STDERR "Improper +t option `$argument' for DEFAULT-TTL.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + next; + } else { + $MasterTtl = $argument; + } + unless ($#args > $i && ($args[$i + 1] =~ /^($h2n_opts)$/o || + $args[$i + 1] =~ /^($verify_opts)$/io)) { + $argument = $args[++$i]; + unless ($argument =~ /^(\d+|(\d+[wdhms])+)$/i) { + print STDERR "Improper +t option `$argument' for MINIMUM-TTL.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + next; + } else { + $Ttl = $argument; + } + } else { + $Ttl = $DefNegCache; + } + if (!$rfc2308 && $verbose) { + print STDERR "Hmm, using `+t $MasterTtl $Ttl' to override previous -o option.\n"; + $message_count++; + } + # NOTE: Once the `+t' option is specified, our RFC-2308 status + # can not be undone by a subsequent four-argument `-o' + # option, e.g., `-o :::', in this subroutine (PARSE_ARGS). + # The "$rfc2308" flag is set to a "hard" value of 2. + # The only way for non-RFC-2308 status to be asserted now, + # i.e., "$rfc2308" = 0, is if the FIXUP subroutine detects + # that a pre-8.2 version of BIND is running on the master + # name server (-h option). + # + $rfc2308 = 2; + if ($verbose) { + $message_count++ if &CHECK_SOA_TIMERS; + } + + } elsif ($option eq "-u") { + unless ($#args > $i && $args[$i + 1] !~ /^($h2n_opts)$/o + && $args[$i + 1] !~ /^($verify_opts)$/io) { + print STDERR "Improper -u option; the zone contact mail address (SOA RNAME) is missing.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + next; + } + $argument = $args[++$i]; + if ($argument eq '@') { + $argument = "root"; + print STDERR "`\@' is not acceptable for the -u option; substituting `root' instead.\n" if $verbose; + $message_count++; + } + $User = $argument; + + } elsif ($option eq "-V") { + while (++$i <= $#args && $args[$i] !~ /^($h2n_opts)$/o + && $args[$i] !~ /^($verify_opts)$/io) { + $argument = lc($args[$i]); + # + # Append the root zone as a trailing dot and then + # make sure that there is only one such dot. + # + $argument .= "."; + $argument =~ s/\.+$/./; + # + # Stack the domains with the unshift() function so that they + # can be popped in the same order. This allows child domains + # to be pushed onto the stack during processing and thus grouped + # with the parent domain if recursive verification is enabled. + # + unshift(@Vdomains, $argument) unless exists($duplicate{$argument}); + $duplicate{$argument} = 1; + } + $verify_mode = 1; + $i--; + + } elsif ($option =~ /^-v([:=](.*))?$/) { + # + # This option has two functions. The documented one is to + # report the version number of `h2n'. The undocumented + # function is to set the "$BIND_version" variable as an aid + # in debugging the BIND bugs reported by GET_BIND_VERSION(). + # + if (defined $2) { + $debug_BIND_version = $2; + } else { + print STDOUT "This is $0 v$VERSION\n"; + exit(0) unless defined wantarray; + } + + } elsif ($option eq "-W") { + unless ($#args > $i && $args[$i + 1] !~ /^($h2n_opts)$/o + && $args[$i + 1] !~ /^($verify_opts)$/io) { + print STDERR "Improper -W option; the zone file pathname is missing.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + next; + } + ($Pwd = $args[++$i]) =~ s/\/+$//; + unless ($Pwd =~ /^\//) { + print STDERR "Must use an absolute pathname for -W option.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + next; + } + + } elsif ($option eq "-w") { + $do_wks = 1; + + } elsif ($option eq "-y") { + $argument = "D"; + if (defined($NewSerial) && !$UseDateInSerial) { + print STDERR "Improper -y option; it is incompatible with the already-specified -i option.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + next; + } elsif ($#args > $i && $args[$i + 1] =~ /^mode=/i) { + $token = $args[++$i]; + ($argument = uc($token)) =~ s/^MODE=//; + unless ($argument =~ /^[DM]$/) { + print STDERR "Improper `$token' argument in -y option.\nThe component of a valid `mode=' value is either `D' or `M'.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + next; + } + } + if ($argument =~ /^[DM]$/) { + @ctime = localtime(time); + $NewSerial = (($ctime[5] + 1900) * 1000000) + + (($ctime[4] + 1) * 10000); + if ($argument eq "M") { + $UseDateInSerial = 1; + } else { + $UseDateInSerial = ($ctime[3] * 100); + $NewSerial += $UseDateInSerial; + } + } + + } elsif ($option eq "-Z") { + unless ($#args > $i && $args[$i + 1] !~ /^($h2n_opts)$/o + && $args[$i + 1] !~ /^($verify_opts)$/io) { + print STDERR "Improper -Z option; must specify at least one name server IP address.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + next; + } + while (++$i <= $#args && $args[$i] !~ /^($h2n_opts)$/o + && $args[$i] !~ /^($verify_opts)$/io) { + $argument = $args[$i]; + if ($argument =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/) { + if (($4 > 255 || $3 > 255 || $2 > 255 || $1 > 255) + || $argument =~ /(^|\.)0\d/) { + $tmp = 0; + } else { + $tmp = 1; + } + } else { + $tmp = 0; + } + unless ($tmp) { + print STDERR "Improper IP address [$argument] in -Z option.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + last; + } + if (defined($Bootsecaddr)) { + $Bootsecaddr .= " " . $argument; + } else { + $Bootsecaddr = $argument; + } + if (defined($Confsecaddr)) { + $Confsecaddr .= " " . $argument . ";"; + } else { + $Confsecaddr = $argument . ";"; + } + } + $i--; + + } elsif ($option eq "-z") { + unless ($#args > $i && $args[$i + 1] !~ /^($h2n_opts)$/o + && $args[$i + 1] !~ /^($verify_opts)$/io) { + print STDERR "Improper -z option; must specify at least one name server IP address.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + next; + } + while (++$i <= $#args && $args[$i] !~ /^($h2n_opts)$/o + && $args[$i] !~ /^($verify_opts)$/io) { + $argument = $args[$i]; + if ($argument =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/) { + if (($4 > 255 || $3 > 255 || $2 > 255 || $1 > 255) + || $argument =~ /(^|\.)0\d/) { + $tmp = 0; + } else { + $tmp = 1; + } + } else { + $tmp = 0; + } + unless ($tmp) { + print STDERR "Improper IP address [$argument] in -z option.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + $i++; + last; + } + if (defined($Bootsecsaveaddr)) { + $Bootsecsaveaddr .= " " . $argument; + } else { + $Bootsecsaveaddr = $argument; + } + if (defined($Confsecsaveaddr)) { + $Confsecsaveaddr .= " " . $argument . ";"; + } else { + $Confsecsaveaddr = $argument . ";"; + } + } + $i--; + + } elsif ($option eq "-1" && $verbose) { + print STDERR "Option -1 is obsolete ... ignored.\n"; + $message_count++; + + } elsif ($option eq "-F" && $verbose) { + print STDERR "Option -F is now the default (and only) way ... ignored.\n"; + $message_count++; + + } elsif ($option =~ /^-(no-?)?recurs(e|ive|ion)$/i) { + # + # Causes each child domain to be verified immediately + # after completing verification of the parent domain. + # + $recursive_verify = ($option =~ /^-no/) ? 0 : 1; + + } elsif ($option =~ /^-(no-?)?(check|verify)[_-]?del$/i) { + # + # Bypasses the checking of proper delegations with the + # `check_del' program when in verify mode. `check_del' + # can be quite time-consuming when encountering a large + # number of unresponsive name servers. + # + $verify_delegations = ($option =~ /^-no/) ? 0 : 1; + + } elsif ($option =~ /^-(no-?)?show-?(dangling|nxdomain)-?cnames?$/i) { + # + # CNAMEs that point to non-existent domain names, i.e., + # "dangling CNAMEs", are not generally considered to be + # DNS errors. This is especially true in the context + # of RFC-2317 delegations of sub-class-C `in-addr.arpa' + # zones where each CNAME placeholder does not necessarily + # point to an existing domain name having a PTR record. + # For forward-mapping zones, however, it may be of interest + # to know if a CNAME has become obsolete if the out-of-zone + # domain name to which it points no longer longer exists. + # + $show_nxdomain_cnames = ($option =~ /^-no/) ? 0 : 1; + + } elsif ($option =~ /^-(no-?)?show-?(cname|chained)-?(chain|cname)s?$/i) { + # + # The length of out-of-zone CNAME chains are normally + # displayed only if the CNAME ultimately fails to resolve + # to a non-CNAME domain name. This option overrides the + # default behavior by identifying all instances of + # out-of-zone CNAME chains. + # + $show_chained_cnames = ($option =~ /^-no/) ? 0 : 1; + + } elsif ($option =~ /^-(no-?)?debug(:(.*))?$/) { + # + # Prevents the removal of all temporary files that get + # created during the course of normal processing including + # zone transfer files: + # + # * If zone auditing is in effect, the DiG batch input file + # is saved as well as a copy of the answers to the queries. + # * If delegations are being verified, the complete input and + # output of the `check_del' program is also saved. + # * If a domain is being verified and the zone transfer file + # still exists from a previous run with -debug, the existing + # zone transfer data will be used instead of requesting a + # new copy from an authoritative name server. + # + # An alternate directory to `/tmp' may be specified by using + # the format `-debug:directory'. The directory must exist + # and the user running `h2n' must have read/write access. + # + $debug_DIR = $3; + if ($option =~ /^-no/) { + $debug_DIR = "/tmp"; + $debug = 0; + } else { + $debug = 1; + if ($debug_DIR) { + $debug_DIR =~ s/\/+$//; + $debug_DIR = "/" unless $debug_DIR; + if (!-d $debug_DIR) { + if ($verbose) { + print STDERR "`$debug_DIR' argument of -debug must be a directory; ignored.\n"; + $message_count++; + } + $debug_DIR = "/tmp"; + } elsif (!-r $debug_DIR || !-w $debug_DIR) { + if ($verbose) { + print STDERR "`$debug_DIR' argument of -debug requires R/W access; ignored.\n"; + $message_count++; + } + $debug_DIR = "/tmp"; + } + $debug_DIR = "" if $debug_DIR eq "/"; + } else { + $debug_DIR = "/tmp"; + } + } + + } elsif ($option eq "-\?") { + print STDOUT <<EOT; +Usage: h2n [zone creation options] | -V [zone verification options] + +The zone creation options are: + -A Don't create name server data for aliases in the host table + -a NET[:SUBNETMASK|/CIDRsize [mode=S]] [NET ...] + Add hostname data on NET to -d DOMAIN but without PTR data + mode=S Allow /8-24 network to be a supernet to smaller-classed nets + -B PATH + Sets absolute directory path where boot/conf files will be written + -b BOOTFILE + Use BOOTFILE instead of the default: ./named.boot (BIND 4) + -C COMMENT-FILE + Create RRs using special host file comments as keys into COMMENT-FILE + +C [PRE-CONFFILE] + Prepend contents of PRE-CONFFILE to the BIND 8/9 conf file (+c option) + -c REMOTE-DOMAIN [mode=[A][I][D[Q]]] [REMOTE-DOMAIN [mode=[A][I][D[Q]]]] + Add CNAMEs which point to REMOTE-DOMAIN + mode=A Create additional CNAMEs for aliases in REMOTE-DOMAIN + =I REMOTE-DOMAIN is an intra-zone subdomain of -d DOMAIN + =D Defer CNAMEs; name conflicts prefer -d DOMAIN over REMOTE-DOMAIN + =Q Don't report name conflicts that prevent deferred CNAME creation + +c [CONFFILE] [mode=[S|M] + Use CONFFILE instead of the default: ./named.conf (BIND 8/9) + mode=S Create CONFFILE with zone entries in single-line format (default) + =M Create CONFFILE with zone entries in multi-line format + -d DOMAIN [db=FILE1] [spcl=FILE2] [mode=D] + Create zone data file for DOMAIN + db=FILE1 Override default filename of db.LABEL, e.g., label.movie.edu + spcl=FILE2 Override default filename of spcl.LABEL for existing RRs + mode=D Set default domain of unqualified hostnames to DOMAIN + -e EXCLUDED-DOMAIN [EXCLUDED-DOMAIN] + Exclude hostfile data with names in EXCLUDED-DOMAIN + -f FILE + Read command line options from FILE + -H HOSTFILE + Use HOSTFILE instead of /etc/hosts + -h HOST + Set HOST in the MNAME (master name server) field of the SOA record + -I [ignore|warn|audit|audit-only|warn-strict|fail|strict] [rfc2782] + Control level and type of various RFC conformance checks + ignore Disables checking of domain names and zone data consistency + warn Issue warning when hostnames contain illegal characters + audit Check zone data for integrity and RFC compliance + `warn' + audit-only Check zone data integrity without the `warn' check + warn-strict Warn about single-character hostnames + `warn' + `audit' + fail Reject hostnames with illegal characters + `audit' + strict Reject single-character hostnames + `fail' + `audit' + rfc2782 Check SRV RRs for `_service._protocol' labels in owner names + -i NUM + Set the serial number of the zone to NUM + -L NUM + Set file handle limit to NUM + +L [LOG-SPEC] + Add a logging specification to the BIND 8/9 config files + -M Don't generate MX records + -m WEIGHT:MX-HOST [WEIGHT:MX-HOST] + Include MX record for each host not having a [no mx] flag + +m [D|C|P|CP] + Control RR generation method for multi-homed hosts + D Use default behavior (A RRs for all names, CNAMEs for common aliases) + C Create A RRs for canonical name and 1st alias, CNAMEs for all others + P Create PTR RRs that point to A RR of 1st alias instead of canonical + CP Combine `C' and `P' flags + -N SUBNETMASK|/CIDRsize + Apply SUBNETMASK/CIDRsize as default value for subsequent -n/-a options + -n NET[:SUBNETMASK|/CIDRsize [mode=S] [domain=DOMAIN] [ptr-owner=TEMPLATE]] + Create zone data for each class-A/B/C subnet of NET for network sizes + /8 to /24. For /25-32 networks, create zone data to support RFC-2317 + delegations to DOMAIN with the owner names of the PTR records fitting + the TEMPLATE pattern. + mode=S Allow /8-24 network to be a supernet to smaller-classed nets + -O OPTION OPTION-ARGS + Add option specifications to BIND 4 boot files + +O [OPTION-SPEC] + Add option specifications to BIND 8/9 conf files + -o [REFRESH]:[RETRY]:[EXPIRE]:[MINIMUM]:[DEFAULT-TTL] + Set SOA time intervals + +om OPTION OPTIONS-ARGS + Adds zone-specific options to BIND 8/9 master conf + +os OPTION OPTIONS-ARGS + Adds zone-specific options to BIND 8/9 slave conf + -P Preserve upper-case characters of hostnames and aliases in the host table + -p REMOTE-DOMAIN [mode=[A|P] [REMOTE-DOMAIN [mode=[A|P]] + Create only PTR data for REMOTE-DOMAIN hosts + mode=A Required flag if REMOTE-DOMAIN's forward-mapping zone built w/ -A + =P Enables alternate method of PTR generation as described for +m P + -q Work quietly + -r Enable creation of RP (Responsible Person) records + -S SERVER [SERVER] + Adds NS record to zone(s) for the last preceding -d or -n options + +S [enable|disable] + Control class-A/B/C NETs to act as supernets for subsequent -n/-a options + -s SERVER [SERVER] + Adds NS record to zones for -d option and all -n options + -T [mode=M] [RR='DNS RR' [RR='...']] [ALIAS='name [TTL]' [ALIAS='...']] + Add additional top-of-zone-related records to DOMAIN of the -d option + mode=M Add the global MX record(s) specified in the -m option + RR= Add 'DNS RR' with owner field set to whitespace or to `\@' + ALIAS= Add CNAME RR with owner field of 'name' & RDATA field set to `\@' + -t Generate TXT records from the host table comment section + +t DEFAULT-TTL [MINIMUM-TTL] + Create \$TTL directives & SOA Negative Cache TTL + -u CONTACT + Set CONTACT as the mail addr. in the SOA RNAME (responsible person) field + -v Display the version number of h2n + -W PATH + Sets absolute directory pathname where zone files will be located + -w Generate WKS records for SMTP/TCP for every MX RRset + -y [mode=[D|M] + Set SOA serial numbers to use date/version format + mode=D Set day format of YYYYMMDDvv allowing 100 versions/day (default) + =M Set month format of YYYYMMvvvv allowing 10,000 versions/month + -Z ADDRESS [ADDRESS] + Specify ADDRESS of primary from which to load unsaved zone data + -z ADDRESS [ADDRESS] + Specify ADDRESS of primary from which to load saved zone data + -show-nxdomain-cnames [-no-show-nxdomain-cnames] + Report CNAMEs that point to non-existent out-of-zone domain names or + domain names with no RRs if auditing is in effect (default is -show) + -show-chained-cnames [-no-show-chained-cnames] + Display each out-of-zone chained CNAME if auditing (default is -no) + -debug[:directory] [-no-debug] + Prevent removal of temp files in /tmp or [directory] (default is -no) + +The zone verification options are: + -f FILE + Read command line options from FILE + -v Display the version number of h2n + -I [audit|audit-only] + Control level and type of various RFC conformance checks + audit Check zone data integrity & report names with illegal chars. + audit-only Check zone data integrity & ignore names with illegal chars. + -V DOMAIN [DOMAIN] + Verify the integrity of a domain obtained by an AXFR query + -recurse [-no-recurse] + Recursively verify delegated subdomains (default is -no) + -show-nxdomain-cnames [-no-show-nxdomain-cnames] + Report CNAMEs that point to non-existent out-of-zone domain names + if auditing is in effect (default is -show) + -show-chained-cnames [-no-show-chained-cnames] + Display each out-of-zone chained CNAME (default is -no) + -check-del [-no-check-del] + Check delegation of all discovered NS RRs (default) + -debug[:directory] [-no-debug] + Prevent removal of temp files in /tmp or [directory] (default is -no) + Zone data temp file is re-verified instead of making a new AXFR query. + +This is $0 v$VERSION +EOT + exit(0) unless defined wantarray; + $message_count++; + + } elsif ($option =~ /^[+-].+/ && $verbose) { + print STDERR "Unknown option `$option'; ignored.\n"; + $message_count++; + + } elsif ($verbose) { + print STDERR "Extraneous input `$option'; ignored.\n"; + $message_count++; + } + $i++; + } + + $net = keys(%Net_ranges); + if ($verify_mode) { + unless (@Vdomains) { + print STDERR "The -V option requires at least one domain name as an argument.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + } + if ($net || $Domain || defined($User)) { + print STDERR "The -d, -n/-a, and/or -u options are incompatible with -V.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + } + } elsif (!$do_aliases && $multi_homed_mode =~ /[CP]/) { + print STDERR "`+m $multi_homed_mode' option incompatible with -A option.\n"; + &GIVE_UP unless defined wantarray; + $message_count++; + } elsif (!defined(wantarray) && + (!$net || !$Domain || !defined($User))) { + print STDERR "Must specify at least -d, one -n/-a, and -u.\n"; + print STDERR "I give up ... sorry.\n"; + exit(2); + } else { + $Search_dir = "."; + if (@cpats) { + $argument = 0; + foreach $tmp (@cpats) { + $domain_arg = $cpatrel{$tmp}; + $argument = 1 if lc($domain_arg) eq lc($Domain); + if ($argument) { + ($message = <<EOT) =~ s/^\s+\|//gm; + |The `$domain_arg' domain name argument is ambiguously + |specified. Its appearance in the -d option is incompatible + |with a simultaneous specification in the -c option. +EOT + print STDERR "$message"; + &GIVE_UP unless defined wantarray; + $message_count++; + last; + } + } + } + if (@elimpats) { + $argument = ""; + foreach $tmp (@elimpats) { + ($domain_arg = $tmp) =~ s/\\[.]/./g; + if ($domain_arg eq lc($Domain)) { + $argument = "-d option"; + } else { + if (exists($cpatrel{$tmp})) { + $argument = "-c option"; + } + if (exists($ptrpatrel{$tmp})) { + if ($argument) { + $argument = "-c and -p options"; + } else { + $argument = "-p option"; + } + } + } + if ($argument) { + ($message = <<EOT) =~ s/^\s+\|//gm; + |The `$domain_arg' domain name argument is ambiguously + |specified. Its appearance in a -e option is incompatible + |with a simultaneous specification in the $argument. +EOT + print STDERR "$message"; + &GIVE_UP unless defined wantarray; + $message_count++; + last; + } + } + } + if (@ptrpats) { + $message = ""; + foreach $tmp (@ptrpats) { + $domain_arg = $ptrpatrel{$tmp}; + if (lc($domain_arg) eq lc($Domain)) { + ($message = <<EOT) =~ s/^\s+\|//gm; + |The `$domain_arg' domain name argument is ambiguously + |specified. Its appearance in the -d option is incompatible + |with a simultaneous specification in the -p option. +EOT + } elsif (exists($cpatrel{$tmp}) && $cModeSpec{$tmp} =~ /I/) { + ($message = <<EOT) =~ s/^\s+\|//gm; + |Improper `-p $domain_arg' option; the domain name + |matches that of a -c option which has been flagged with `mode=I' + |to indicate that it is an intra-zone subdomain of the -d option. + |The -p option is restricted to domains that are in a different + |DNS zone than the -d option ($Domain). +EOT + } + if ($message) { + print STDERR "$message"; + &GIVE_UP unless defined wantarray; + $message_count++; + last; + } + } + } + } + return $message_count; +} + + +# Validate a network specification passed in one of the following formats: +# +# (network, CIDRsize, netmask="") +# (network, CIDRsize="", netmask) +# (undef, CIDRsize, netmask="") +# (undef, CIDRsize="", netmask) +# +# where network matches a format of x[.x[.x[.x]]] +# CIDRsize is an integer from 1 to 32 +# netmask matches the format of x.x.x.x +# +# * A valid `network/CIDRsize' specification returns the corresponding netmask +# and normalizes the network to its minimum number of octets. +# * A valid `network:netmask' specification returns the corresponding CIDR +# size and normalizes the network to its minimum number of octets. +# * A valid `CIDRsize' specification returns the corresponding netmask. +# * A valid `netmask' specification returns the corresponding CIDRsize. +# +# NOTE: Parameters *must* be passed using the following convention: +# +# Input variables - passed by *reference* and subject to change +# Output variable - initialized to "" and passed by *reference* +# Void parameter - the undefined value passed as a placeholder +# +# Returns: the undefined value or null string if no error +# an error string otherwise +# +# +############################################################################# +# +# NETWORKING TERMINOLOGY +# ====================== +# +# Determining the Class of an Address +# ----------------------------------- +# +# Given a 32-bit address, xxxxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx, +# +# 0xxxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx Class A 1-127.x.x.x +# 10xxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx Class B 128-191.x.x.x +# 110xxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx Class C 192-223.x.x.x +# 1110xxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx Class D 224-239.x.x.x (multicast) +# 1111xxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx Class E 240-255.x.x.x (experimental) +# +# The original concept of network classes has given way to a +# more efficient way of allocating networks of IP addresses +# called Classless InterDomain Routing or CIDR. +# +# +# CIDR Conversion Table +# --------------------- +# +# CIDR +# Length Mask # Networks # Addresses +# ------ --------------- ---------- ------------- +# /0 0.0.0.0 special wildcard mask used in ACLs +# to match any address to [0.0.0.0] +# /1 128.0.0.0 128 A 2,147,483,648 +# /2 192.0.0.0 64 A 1,073,741,824 +# /3 224.0.0.0 32 A 536,870,912 +# /4 240.0.0.0 16 A 268,435,456 +# /5 248.0.0.0 8 A 134,217,728 +# /6 252.0.0.0 4 A 67,108,864 +# /7 254.0.0.0 2 A 33,554,432 +# /8 255.0.0.0 1 A 16,777,216 +# /9 255.128.0.0 128 B 8,388,608 +# /10 255.192.0.0 64 B 4,194,304 +# /11 255.224.0.0 32 B 2,097,152 +# /12 255.240.0.0 16 B 1,048,576 +# /13 255.248.0.0 8 B 524,288 +# /14 255.252.0.0 4 B 262,144 +# /15 255.254.0.0 2 B 131,072 +# /16 255.255.0.0 1 B 65,536 +# /17 255.255.128.0 128 C 32,768 +# /18 255.255.192.0 64 C 16,384 +# /19 255.255.224.0 32 C 8,192 +# /20 255.255.240.0 16 C 4,096 +# /21 255.255.248.0 8 C 2,048 +# /22 255.255.252.0 4 C 1,024 +# /23 255.255.254.0 2 C 512 +# /24 255.255.255.0 1 C 256 +# /25 255.255.255.128 2 subnets 128 +# /26 255.255.255.192 4 subnets 64 +# /27 255.255.255.224 8 subnets 32 +# /28 255.255.255.240 16 subnets 16 +# /29 255.255.255.248 32 subnets 8 +# /30 255.255.255.252 64 subnets 4 +# /31 255.255.255.254 none 2 +# /32 255.255.255.255 1/256 C 1 +# +# +# +# RFC-1918 Reserved Network Numbers +# --------------------------------- +# +# The following networks are reserved for use by entities which do not +# require globally unique address space. The obvious advantage for the +# Internet at large is the conservation of globally unique address space +# by not using it where global uniqueness is not required. +# +# Class Start End # Addrs Comment +# ----- ----------- --------------- ---------- ------------------------------- +# A 10.0.0.0 10.255.255.255 16,777,216 a single Class A network +# B 172.16.0.0 172.31.255.255 1,048,576 16 contiguous Class B networks +# C 192.168.0.0 192.168.255.255 65,536 256 contiguous Class C networks +# +# +sub CHECK_NET { + my ($network_ref, $cidr_ref, $mask_ref) = @_; + my ($bit_num, $cidr, $error, $error_status, $factor, $int_mask, $mask); + my ($network, $num_octets, $octet, $octet_1, $octet_2, $octet_3, $octet_4); + my ($octet_count, $remainder, $rightmost_octet); + + $error = ""; + $error_status = 0; + + if (defined($network_ref)) { + $network = $$network_ref; + unless ($network =~ /^\d+([.]\d+){0,3}$/) { + $error = " Invalid network specification.\n"; + } else { + ($octet_1, $octet_2, $octet_3, $octet_4) = split(/\./, $network, 4); + if (defined($octet_4)) { + $num_octets = 4; + $error_status = 1 if $octet_4 > 255; + } elsif (defined($octet_3)) { + $num_octets = 3; + $error_status = 1 if $octet_3 > 255; + } elsif (defined($octet_2)) { + $num_octets = 2; + $error_status = 1 if $octet_2 > 255; + } else { + $num_octets = 1; + $error_status = 1 if ($octet_1 == 0 or $octet_1 > 255); + } + $error = " Invalid network specification (octet out of range).\n" if $error_status; + } + } + $cidr = $$cidr_ref; + $mask = $$mask_ref; + if (defined($cidr)) { + unless ($cidr =~ /^\d+$/) { + $error .= " Invalid CIDR specification.\n"; + } elsif ($cidr < 1 || $cidr > 32) { + $error .= " Invalid CIDR size (must be 1 to 32).\n"; + } + } else { + unless (defined($mask) && $mask =~ /^\d+([.]\d+){3}$/) { + $error .= " Invalid netmask specification.\n"; + } else { + # + # Prepare a 32-bit integer version of the netmask. + # + $int_mask = $octet_count = 0; + foreach $octet (split(/\./, $mask)) { + last if $octet > 255 || ($octet == 0 && $octet_count == 0); + $octet_count++; + $int_mask += $octet; + $int_mask = $int_mask << 8 if $octet_count < 4; + } + if ($octet_count < 4) { + $error .= " Invalid netmask specification (octet out of range).\n"; + } else { + # + # Start inspecting the 32-bit mask from right to left. + # Once a "1" is found, make sure that there are no + # intervening "0"s between that point and the leftmost bit. + # + $cidr = 0; + foreach $bit_num (reverse 1..32) { + if ($int_mask & 0x00000001) { + $cidr = $bit_num unless $cidr; + } elsif ($cidr) { + $error .= " Invalid netmask specification (non-contiguous).\n"; + last; + } + $int_mask = $int_mask >> 1; + } + } + } + } + if ($error) { + return $error; + } elsif (defined($cidr_ref) && !$$cidr_ref) { + # + # Pass back the computed CIDR size from the netmask that was passed in. + # + $$cidr_ref = $cidr; + return unless defined($network_ref); + } + + # + # So far, each of the passed parameters is syntactically valid. + # If a network specification was passed, we also have a valid CIDR + # size which was passed directly or computed from a passed netmask. + # Now it's time to check if the network/CIDR combination is logically + # valid. We'll start by checking for some very general formatting errors. + # + + if (defined($network_ref)) { + if ($cidr <= 8) { + if (($num_octets >= 2 && $octet_2 != 0) || + ($num_octets >= 3 && $octet_3 != 0) || + ($num_octets == 4 && $octet_4 != 0)) { + $error = " CIDR sizes /1-8 require just the first non-zero network octet to be specified.\n"; + $error .= " If other octets are included, they must be zeros.\n"; + } else { + $network = $rightmost_octet = $octet_1; + $octet = "first"; + } + + } elsif ($cidr <= 16) { + if ($num_octets < 2) { + $error = " CIDR sizes /9-16 require the first two network octets to be specified.\n"; + } elsif (($num_octets >= 3 && $octet_3 != 0) || + ($num_octets == 4 && $octet_4 != 0)) { + $error = " CIDR sizes /9-16 require just the first two network octets to be specified.\n"; + $error .= " If other octets are included, they must be zeros.\n"; + } else { + $network = "$octet_1.$octet_2"; + $rightmost_octet = $octet_2; + $octet = "second"; + } + + } elsif ($cidr <= 24) { + if ($num_octets < 3) { + $error = " CIDR sizes /17-24 require the first three network octets to be specified.\n"; + } elsif ($num_octets == 4 && $octet_4 != 0) { + $error = " CIDR sizes /17-24 require just the first three network octets to be specified.\n"; + $error .= " If the fourth octet is included, it must be zero.\n"; + } else { + $network = "$octet_1.$octet_2.$octet_3"; + $rightmost_octet = $octet_3; + $octet = "third"; + } + + } elsif ($cidr <= 32) { + if ($num_octets < 4) { + $error = " CIDR sizes /25-32 require all four network octets to be specified.\n"; + } else { + $rightmost_octet = $octet_4; + $octet = "fourth"; + } + } + return $error if $error; + + # + # Finally, if the CIDR size is not 8, 16, 24, or 32, the rightmost + # non-zero octet of a passed network specification must be evenly + # divisible by the appropriate power of two. Make sure this is so. + # + + $remainder = $cidr % 8; + if ($remainder) { + $factor = 256 >> $remainder; # right-shift by the needed bits + # + # For "$remainder" of 1, 2, 3, 4, 5, 6, or 7 + # "$factor" is 128, 64, 32, 16, 8, 4, or 2 + # + if ($rightmost_octet % $factor) { + $error = " Invalid network specification for CIDR size of /$cidr"; + $error .= ($$mask_ref) ? " (from subnetmask).\n" : ".\n"; + $error .= " The $octet octet must be evenly divisible by $factor.\n"; + return $error; + } + } + $$network_ref = $network; + } + + unless ($$mask_ref) { + # + # Compute the netmask from the CIDR size. + # + $mask = ((2 ** $cidr) - 1) << (32 - $cidr); + $octet_1 = ($mask & 0xff000000) >> 24; + $octet_2 = ($mask & 0x00ff0000) >> 16; + $octet_3 = ($mask & 0x0000ff00) >> 8; + $octet_4 = $mask & 0x000000ff; + $$mask_ref = "$octet_1.$octet_2.$octet_3.$octet_4"; + } + return; +} + + +# +# For CIDR sizes /8 to /24, calculate all of the constituent +# class A, B, or C subnets for a given network and return +# them to the caller as a list. +# +# For CIDR sizes /25 to /32, calculate the range of addresses +# for use in the default naming scheme of the sub-class-C DB file. +# Unless overridden by a `-n x.x.x.x domain=zone-name' option, +# the default zone file name will also serve as the basis for the +# zone name itself. +# +sub SUBNETS { + my ($network, $cidr_size) = @_; + my ($additional_units, $base_net, $final_value, @subnets); + + if ($cidr_size <= 24) { + push(@subnets, $network); # the network itself is always first + return @subnets unless $cidr_size % 8; + $base_net = $last_octet = $network; + $base_net =~ s/\.\d+$//; + $last_octet =~ s/.+\.//; + if ($cidr_size < 16) { + $additional_units = (2 ** (16 - $cidr_size)) - 1; + } else { + $additional_units = (2 ** (24 - $cidr_size)) - 1; + } + for (1 .. $additional_units) { + $last_octet++; + push(@subnets, "$base_net.$last_octet"); + } + } else { + # + # For CIDR sizes 25 to 32, a single array element will + # be returned in the following format: + # + # class-C_subnet:first_host_address-last_host_address + # ^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + # lookup key host address or address range + # + # Examples: 192.6.19.0/25 => 192.6.19:0-127 + # db.192.6.19.0-127 + # 156.153.254.80/28 => 156.153.254:80-95 + # db.156.153.254.80-95 + # + # For a CIDR size of 32, the address range is simply + # replaced by the host address number itself, e.g., + # + # 192.6.19.97/32 => 192.6.19:97 + # db.192.6.19.97 + # + $base_net = $last_octet = $network; + $base_net =~ s/\.\d+$//; + $last_octet =~ s/.+\.//; + if ($cidr_size == 32) { + push(@subnets, "$base_net:$last_octet"); + } else { + $additional_units = (2 ** (32 - $cidr_size)) - 1; + $final_value = $last_octet + $additional_units; + push(@subnets, "$base_net:$last_octet-$final_value"); + } + } + return @subnets; +} + + +# +# Subroutine for normalizing various data items once a complete +# view of the operating environment is obtained from PARSE_ARGS. +# +# Normal mode: +# ------------ +# * Establish what we will be using for the SOA MNAME and RNAME +# fields (-h/-u options) and the global MX RRset (-m option) +# as well as the various NS RRsets (-s/-S options). +# Single-label domain names will be qualified with the current +# domain (-d option). +# * Validate any zone apex records submitted via the -T option. +# NOTE: Error/warning messages will be generated for any invalid +# domain name and/or SOA RR field. A go/no-go decision for +# proceeding will be made depending on the severity of the +# problems and the error checking level set by the -I option. +# * Set the default mode for handling multi-homed hosts. +# * Optimize the search arrays for the -e, -c, and -p options to +# accommodate super- and subdomains of related domain trees. +# * Try to query the MNAME host to see what version of BIND is running +# so that our RFC-2308 status can be unequivocally set. This also +# helps to determine whether symbolic TTL values can be used. +# +# Normal mode and Verify mode: +# --------------------------- +# * Get the version of DiG that is available. This allows the `h2n' +# program to make various parsing and buffer-size adjustments. +# +sub FIXUP { + my ($Apex_RRs_aliases, $Fixup_DefAction, $alias, $data, $domain_part); + my ($epat, $file, $i, $lc_alias, $major_version, $minor_version, $mxhost); + my ($patch_version, $preference, $rdata, $rrtype, $status, $s, $t); + my ($tmp_rfc952, $tmp_rfc1123, $tmp_verbose, $ttl, $user_part); + my (%ServerName, @UniqueServers, @sorted, @temp, @unsorted); + + unless ($verify_mode) { + if ($preserve_case) { + # + # Use the CPAN module `Tie::CPHash' [already loaded when the -P + # option was encountered in PARSE_ARGS()] to enhance the following + # hashes so that their keys can be matched in a case-insensitive + # manner while still preserving the case of the last-stored key as + # returned by the each() and keys() functions. + # NOTE: This added functionality comes at the expense of a fair + # amount of overhead according to the module's documentation. + # Thus, only the necessary hashes are specified. + # + tie %Aliases, "Tie::CPHash"; + tie %AliasesPTR, "Tie::CPHash"; + tie %Comments, "Tie::CPHash"; + tie %Hosts, "Tie::CPHash"; + tie %HostsPTR, "Tie::CPHash"; + tie %Ttl, "Tie::CPHash"; + tie %cAliases, "Tie::CPHash"; + tie %deferredPTR, "Tie::CPHash"; + tie %pendingPTR, "Tie::CPHash"; + tie %RRowners, "Tie::CPHash"; + tie %Wildcards, "Tie::CPHash"; + } + $status = 0; + $action = ""; + $tmp_rfc952 = $rfc952; + $tmp_rfc1123 = $rfc1123; + $rfc952 = 0; + $rfc1123 = 1; # SOA, NS, and MX RRs should be RFC-compliant + $Fixup_DefAction = ($DefAction eq "Warning") ? "Warning" : "Error"; + $Domain =~ s/\.$//; + # + # Although the owner fields of SOA records, i.e., delegated domain + # names, are not subject to RFC-1123 name checking, the fact that + # this name will become part of the FQDN of A records generated + # by this program means that the higher standard must be applied. + # + $error = &CHECK_NAME($Domain, 'A'); + if ($error) { + $status = $error; + $action = ($error == 3) ? "Error" : $Fixup_DefAction; + print STDERR "$action: Domain name `$Domain' (-d) is invalid.\n"; + } + + if ($Host eq '.' || $Host eq '@') { + # + # Even though it is clear from the spirit of the RFCs that + # the SOA MNAME field should contain the zone's master + # name server, BIND does allow the root zone to appear as + # a placeholder. Accommodate this possibility as an + # undocumented feature. Also allow the "@" symbol which, + # in this context, represents the zone name of the -d option. + # Don't leave the special "@" symbol as-is, however, since + # its context will be incorrect in any reverse-mapping zones. + # + $RespHost = ($Host eq '@') ? $Domain : $Host; + } else { + $Host =~ s/\.$//; + $error = &CHECK_NAME($Host, 'A'); + if ($error) { + $status = $error if $error > $status; + $action = ($error == 3) ? "Error" : $Fixup_DefAction; + print STDERR "$action: SOA host name `$Host' (-h) is invalid.\n"; + } + if ($Host =~ /\./) { + $RespHost = "$Host."; + } else { + $RespHost = "$Host.$Domain."; + } + $RespHost =~ s/\.\././g; # remove redundant "." + } + + # As of BIND 4.9.4, RNAMEs in SOA and RP can have any printable + # character in the first label as long as the subsequent labels + # form an RFC1123-compliant domain name. Since this has not been + # make official in any RFC subsequent to RFC-1035, the preference + # of the `h2n' program is to stick with the original specification + # of interpreting the first unescaped "." as the implied "@" character. + # + if ($User =~ /@/) { + $User =~ s/\\@/@/; # unescape the "@" + ($user_part, $domain_part) = split(/@/, $User); + $user_part =~ s/\./\\./g; # escape "." in username + 1 while $user_part =~ s/\\\\/\\/g; # remove redundancies + if ($domain_part =~ /\./) { # multiple domain labels + $domain_part .= "."; # append root domain + } else { + $domain_part .= ".$Domain."; # append our domain name + } + $RespUser = "$user_part.$domain_part"; # join w/ unescaped "." + } elsif ($User !~ /\.$/) { # already RNAME if no + $user_part = $User; # "@" and trailing "." + $user_part =~ s/\./\\./g; # escape "." in username + 1 while $user_part =~ s/\\\\/\\/g; # remove redundancies + $RespUser = "$user_part.$Domain."; # join w/ unescaped "." + } else { + $RespUser = $User; + } + $RespUser =~ s/\.\././g; + # + # Final inspection. + # + if ($RespUser ne ".") { + $tmp = $RespUser; + $tmp =~ s/(\\[.]|[^.])*\.//; # strip first label + $tmp =~ s/\.$//; # strip last dot + unless ($tmp) { + $status = 3; # flag this as a fatal error + print STDERR "Error: SOA RNAME field `$RespUser' (-u) is invalid.\n"; + } else { + $error = &CHECK_NAME($tmp, 'A'); + if ($error) { + $status = $error if $error > $status; + $action = ($error == 3) ? "Error" : $Fixup_DefAction; + print STDERR "$action: SOA RNAME field `$RespUser' (-u) is invalid.\n"; + } + } + } + + # Clean up name servers. + # + foreach $s (@FullServers) { + $s =~ s/\.$//; + $s = $Domain if $s eq '@'; + $error = ($s) ? &CHECK_NAME($s, 'A') : 0; + if ($error) { + $status = $error if $error > $status; + $action = ($error == 3) ? "Error" : $Fixup_DefAction; + print STDERR "$action: Name server name `$s' (-s) is invalid.\n"; + } + $s .= ".$Domain" unless $s =~ /\./; + $s .= "."; + if ($action ne "Error" && exists($ServerName{lc($s)})) { + print STDERR "Ignoring redundant name server (-s): $s\n"; + } else { + push(@UniqueServers, $s); + $ServerName{lc($s)} = 1; + } + } + @FullServers = @UniqueServers; + + foreach $t (keys %PartialServers) { + @temp = split(' ', $PartialServers{$t}); + @UniqueServers = (); + %ServerName = (); + foreach $s (@temp) { + $s =~ s/\.$//; + $s = $Domain if $s eq '@'; + $error = ($s) ? &CHECK_NAME($s, 'A') : 0; + if ($error) { + $status = $error if $error > $status; + $action = ($error == 3) ? "Error" : $Fixup_DefAction; + print STDERR "$action: Name server name `$s' (-S) is invalid.\n"; + } + $s .= ".$Domain" unless $s =~ /\./; + $s .= "."; + if ($action ne "Error" && exists($ServerName{lc($s)})) { + print STDERR "Ignoring redundant name server (-S): $s\n"; + } else { + push(@UniqueServers, $s); + $ServerName{lc($s)} = 1; + } + } + $PartialServers{$t} = join(' ', @UniqueServers); + } + + unless ($do_mx || $do_zone_apex_mx) { + if (@MX) { + print STDERR "Warning: The global MX record(s) specified with the -m option(s) will\n"; + print STDERR " not be generated due to the -M option also being specified.\n"; + } + } elsif ($do_zone_apex_mx && !@MX) { + print STDERR "Warning: The `-T mode=M' option is effectively cancelled due to the fact\n"; + print STDERR " that no global MX records were specified with the -m option.\n"; + $do_zone_apex_mx = 0; + } elsif (@MX) { + # + # Clean up MX hosts. + # + %ServerName = (); + foreach $s (@MX) { + ($preference, $mxhost) = split(' ', $s, 2); + $mxhost =~ s/\.$//; + $data = ($mxhost eq '@') ? $Domain : $mxhost; + $error = ($data) ? &CHECK_NAME($data, 'MX') : 0; + if ($error) { + $status = $error if $error > $status; + $action = ($error == 3) ? "Error" : $Fixup_DefAction; + print STDERR "$action: MX hostname `$mxhost' (-m) is invalid.\n"; + } + if ($mxhost =~ /$Domainpattern$/) { + # + # Prevent unnecessary verbosity by keeping in-domain + # names in origin-relative format since the MX records + # will appear only in the forward-mapping file. + # + $mxhost =~ s/$Domainpattern$//; + } else { + $mxhost .= "." if $mxhost =~ /\./; + } + $s = "$preference $mxhost"; + $mxhost = ($mxhost eq '@') ? lc("$Domain.") : lc($mxhost); + if (exists($ServerName{$mxhost})) { + $ServerName{$mxhost} .= " $preference"; + } else { + $ServerName{$mxhost} = $preference; + } + } + unless ($action eq "Error") { + # + # Now go through the hash of MX hosts. Those that are + # redundantly specified will have multiple preference + # values. Keep the most preferred entry, i.e., the + # preference value that is numerically smallest. + # + scalar(keys(%ServerName)); + while (($mxhost, $data) = each %ServerName) { + unless ($data =~ /^\d+$/) { + @temp = sort { $a <=> $b } split(' ', $data); + $ServerName{$mxhost} = $temp[0]; + } + } + @UniqueServers = (); + foreach $s (@MX) { + ($preference, $mxhost) = split(' ', $s, 2); + $mxhost = ($mxhost eq '@') ? lc("$Domain.") : lc($mxhost); + unless (exists($ServerName{$mxhost}) + && $preference == $ServerName{$mxhost}) { + print STDERR "Ignoring redundant MX host (-m): $s\n"; + } else { + push(@UniqueServers, $s); + delete($ServerName{$mxhost}); + } + } + @MX = @UniqueServers; + } + } + + # Validate and register any zone apex RRs or aliases that were + # configured with the -T option. This is done by writing the + # RRs to a temporary file and submitting the data to READ_RRs(). + # + $Apex_RRs_aliases = (keys(%Apex_RRs) || keys(%Apex_aliases)) ? 1 : 0; + if ($Apex_RRs_aliases || $do_zone_apex_mx) { + if ($Apex_RRs_aliases) { + if ($verbose) { + print STDOUT "Checking zone apex RRs (-T option)...\n"; + } + $file = "$debug_DIR/-T_option_RRs"; + unless (open(*APEXRRS, "> $file")) { + print STDERR "Couldn't create temporary file for validating RRs entered with the -T option.\nError: $!\n"; + print STDERR "I give up ... sorry.\n"; + exit(2); + } + } + if (keys(%Apex_RRs)) { + print APEXRRS "\@"; + foreach $rrtype (keys %Apex_RRs) { + foreach $data (@{ $Apex_RRs{$rrtype} }) { + $rdata = $data; + if ($rdata =~ /\n$/) { + # + # A newline appended to the "$rdata" string is a + # data structure signal to indicate that this is + # a continuation line of a multi-line record. + # + $rdata =~ s/\n$//; + if ($rdata =~ /\n$/) { + # + # Besides this being a continuation line, + # a second appended newline signifies that + # the previous line ended with an open quote + # in effect. Therefore, the usual cosmetic + # indentation must not be added in order to + # maintain data integrity. + # + print APEXRRS $rdata; + } else { + print APEXRRS "\t\t\t$rdata\n"; + } + } else { + ($ttl, $rdata) = split(/,/, $rdata, 2); + print APEXRRS "\t$ttl\t$rrtype\t$rdata\n"; + } + } + } + } + if (keys(%Apex_aliases)) { + # + # Add any CNAMEs that were configured with the -T option. + # These always point to the zone apex. + # + while (($lc_alias, $alias) = each %Apex_aliases) { + ($alias, $ttl) = split(' ', $alias, 2); + if ($alias =~ /$Domainpattern\.$/) { + # + # Prevent unnecessary verbosity by keeping in-domain + # names in origin-relative format. + # + $alias =~ s/$Domainpattern\.$//; + $Apex_aliases{$lc_alias} = "$alias $ttl"; + } + printf APEXRRS "%s%s\tCNAME\t\@\n", &TAB($alias, 16), $ttl; + } + } + if ($Apex_RRs_aliases) { + close(*APEXRRS); + $tmp_verbose = $verbose; + $verbose = 1; + $newline_printed = READ_RRs($file, "$Domain.", "$Domain.", + "$Domain.", 0); + $verbose = $tmp_verbose; + $status = $Load_Status if $Load_Status > $status; + unlink($file) unless $debug; + } + if ((($status == 2 && $Fixup_DefAction eq "Warning") || $status < 2) + && $do_zone_apex_mx) { + # + # Add the global MX records from the -m option to any + # that were additionally specified for the zone apex + # and report any redundancies between the two sets. + # + foreach $s (@MX) { + ($preference, $mxhost) = split(' ', $s, 2); + $mxhost = ($mxhost eq '@') ? lc("$Domain.") : lc($mxhost); + if (exists($Apex_route_RRs{MX}) + && exists($Apex_route_RRs{MX}{$mxhost})) { + print STDERR "Redundant MX hostname; -T/-m options\n"; + print STDERR " @\tMX\t$s\n"; + } + # Prepend "," as the placeholder for the default TTL. + # + push(@{ $Apex_RRs{MX} }, ",$s"); + } + } + if ($Apex_RRs_aliases) { + print STDERR "\n" while $newline_printed--; + } + } + + if ($status > 1) { + if (($status == 2 && $Fixup_DefAction eq "Error") || $status > 2) { + print STDERR "I give up ... sorry.\n"; + exit(2); + } else { + ($message = <<EOT) =~ s/^\s+\|//gm; + |Attention! Because `h2n' is running with an error-checking level of + | `$check_level' (-I option), it will go ahead and process the + | host table despite the above warning(s). It is very important, + | however, to have fully-compliant SOA, NS, and MX records in + | order to prevent interoperability issues with other name servers + | and/or mail servers. These naming irregularities should be + | fixed at the earliest opportunity. +EOT + print STDERR "$message\n"; + } + } + $rfc952 = $tmp_rfc952; + $rfc1123 = $tmp_rfc1123; + + # If no +m option was specified, forward and reverse RRsets of + # multi-homed hosts will be generated in the default manner. + # + $multi_homed_mode = "D" unless $multi_homed_mode; + + # Optimize the search arrays for the -c, -p, and -e options. + # + for $i (1..2) { + @temp = ($i == 1) ? @cpats : @ptrpats; + next unless @temp; + # + # If a domain and one or more of its subdomains were specified + # in a -c or -p option, they should be ordered from the most + # specific subdomain to the least specific superdomain, e.g., + # `fx.movie.edu' should be tried for a matching host file entry + # before `movie.edu'. Reversing the domain name labels, sorting + # them in descending order, and reversing the labels back again + # will accomplish this task. + # + @unsorted = (); + foreach $tmp (@temp) { + if ($Domain =~ /\.$tmp$/i) { + # + # The domain of a -c or -p option is a parent domain + # of that specified in the -d option. Add a special + # flag to allow a host in the -d domain to override + # the -c or -p processing that would otherwise occur. + # + if ($i == 1) { + $cModeSpec{$tmp} .= "O"; + } else { + $pModeSpec{$tmp} .= "O"; + } + } + ($domain_part = $tmp) =~ s/\\[.]/./g; + push(@unsorted, join('.', reverse(split('\.', $domain_part)))); + } + @sorted = sort { $b cmp $a } @unsorted; + foreach $tmp (@sorted) { + $tmp = join('.', reverse(split('\.', $tmp))); + $tmp =~ s/\./\\./g; + } + if ($i == 1) { + @cpats = @sorted; + } else { + @ptrpats = @sorted; + } + } + if (@elimpats >= 2) { + # + # If a domain and one or more of its subdomains were specified + # in a -e option, the subdomains are effectively redundant, + # e.g., `movie.edu' matches everything that `fx.movie.edu' + # matches. All such subdomains will now be removed. + # + @unsorted = (); + foreach $epat (@elimpats) { + ($domain_part = ".$epat") =~ s/\\[.]/./g; + push(@unsorted, join('.', reverse(split('\.', $domain_part)))); + } + @sorted = sort { $a cmp $b } @unsorted; # ascending order this time + $i = 0; + until ($i >= $#sorted) { + ($domain_part = $sorted[$i]) =~ s/\./\\./g; + while ($i < $#sorted && $sorted[$i + 1] =~ /^$domain_part/) { + # + # Remove the array element that holds the unnecessary + # subdomain or duplicate domain name. + # + splice(@sorted, ($i + 1), 1); + } + $i++; + } + if (@sorted < @elimpats) { + foreach $epat (@sorted) { + $epat =~ s/\.$//; + $epat = join('.', reverse(split('\.', $epat))); + $epat =~ s/\./\\./g; + } + @elimpats = @sorted; + } + } + if (@elimpats) { + # + # Look for any -e domains that happen to be parent domains + # of those specified in the -d option or -c or -p options. + # Construct the appropriate exception domain patterns in + # the "%ePatExceptions" hash. + # + foreach $epat (@elimpats) { + @unsorted = (); + if ($Domain =~ /\.$epat$/i) { + push(@unsorted, join('.', reverse(split('\.', ".$Domain")))); + } + foreach $tmp (@cpats) { + ($domain_part = ".$tmp") =~ s/\\[.]/./g; + if ($domain_part =~ /\.$epat$/) { + push(@unsorted, join('.', reverse(split('\.', $domain_part)))); + } + } + foreach $tmp (@ptrpats) { + ($domain_part = ".$tmp") =~ s/\\[.]/./g; + if ($domain_part =~ /\.$epat$/) { + push(@unsorted, join('.', reverse(split('\.', $domain_part)))); + } + } + unless (@unsorted) { + $ePatExceptions{$epat} = '^$'; + } else { + # + # Just as was done previously when effectively redundant + # subdomains were removed from the -e option, compress + # the list of exception domains down to the minimum set + # of matching highest-level domains. + # + @sorted = sort { $a cmp $b } @unsorted; + $i = 0; + until ($i >= $#sorted) { + ($domain_part = $sorted[$i]) =~ s/\./\\./g; + while ($i < $#sorted && $sorted[$i + 1] =~ /^$domain_part/) { + splice(@sorted, ($i + 1), 1); + } + $i++; + } + $domain_part = ""; + foreach $tmp (@sorted) { + $tmp = "." . join('.', reverse(split('\.', $tmp))); + $tmp =~ s/\./\\./g; + $domain_part .= "|$tmp"; + } + $domain_part =~ s/^\|//; + $ePatExceptions{$epat} = $domain_part; + } + } + } + } + + unless (defined($show_nxdomain_cnames)) { + if ($verify_mode && $Vdomains[0] =~ /\.in-addr\.arpa\.$/) { + $show_nxdomain_cnames = 0; + } else { + $show_nxdomain_cnames = 1; + } + } + # `h2n' will try to call the DiG utility to provide various + # items of useful DNS information. Get the version of DiG that + # is installed on this system in order to accommodate the various + # differences in which its output may appear. + # + $DiG_version_num = 0; + if (open(*DIGOUT, "$DiG 1.0.0.127.in-addr.arpa. PTR 2>&1 |")) { + while (<DIGOUT>) { + if (/^; <<>> DiG (\d+)(\.(\d+))?(\.(\d+).*)? <<>>/) { + $major_version = (defined $1) ? $1 : 0; + $minor_version = (defined $3) ? $3 : 0; + $patch_version = (defined $5) ? $5 : 0; + $DiG_version_num = (10000 * $major_version) + + (100 * $minor_version) + $patch_version; + last; + } + } + close(*DIGOUT); + + $DiG_timeout = "time=$DiG_timeout"; + if ($DiG_version_num < 80300) { + # + # Set the threshold at which long command lines to DiG + # must be split across two lines when following chained + # CNAMEs in the AUDIT_RRs subroutine. + # + $DiG_bufsize = 98; + $DiG_retries = "retry=$DiG_retries"; + } elsif ($DiG_version_num < 90000) { + # + # The buffer size was increased in version 8.3. Assume + # that the same value exists for subsequent 8.X versions. + # + $DiG_bufsize = 382; + $DiG_retries = "retry=$DiG_retries"; + } else { + # + # Version 9 of DiG is a rewrite of this utility with a + # significant increase in the buffer sizes. + # + $DiG_bufsize = 986; + $DiG_retries = "tries=$DiG_retries"; + } + } + + unless ($verify_mode) { + # + # RFC-2308 is implemented in BIND name servers starting with + # version 8.2. This specifies that the SOA Minimum Field + # is defined to be the negative caching interval and the + # default time-to-live value is now defined with a new + # master zone file directive, $TTL. + # BIND version 8.2 and later will issue a warning when the + # $TTL directive is missing from a master zone that is being + # loaded. BIND 9 versions prior to 9.2.0a1 will fail to load + # master zones which are missing the $TTL directive. + # + # In order to suppress these warnings/errors, we'll try to + # use DiG to issue a special query to the master name server + # to find out which version of BIND it is running. + # Knowing the BIND version allows an unambiguous determination + # of our RFC-2308 status according to the following hierarchy: + # + # (1) BIND version + # | + # | overrides + # | + # (2) confirmed RFC-2308 status via a +t option + # OR + # discovered $TTL directives in existing DB files + # | + # | overrides + # | + # (3) negated RFC-2308 status via a -o option with + # exactly four positional arguments + # | + # | overrides + # | + # (4) default RFC-2308 status of "true" for `h2n' + # version 2.40 and later + # | + # | obsoletes + # | + # (5) default RFC-2308 status of "false" for `h2n' + # version 2.39 and earlier. + # + # Also, knowing the working BIND version determines how to + # handle TTL values. Specifically, symbolic TTL values + # were not supported until version 8.2.1. If our version + # of BIND is an earlier one or can not be determined, all + # TTL values will be converted into their equivalent number + # of seconds. + # + $Host = ($RespHost eq ".") ? "127.0.0.1" : $RespHost; + &GET_BIND_VERSION($Host); + if ($BIND_version_num) { + if ($BIND_version_num < 80200) { + # + # Disable the generation of $TTL directives in the MAKE_SOA + # subroutine by negating the "$rfc2308" flag to the "hard" + # value of 0 regardless of what was specified in a -o/+t + # option. $TTL directives in existing DB files will be + # effectively removed. + # + $rfc2308 = 0; + + # NOTE: If a value for "$MasterTtl" was specified with a + # -o/+t option, transfer the value to its proper + # context in the SOA MINIMUM field, "$Ttl". + # Otherwise, a -o "$Ttl" argument will take effect + # in the MAKE_SOA subroutine or, if no "$Ttl" was + # specified, the value of "$DefTtl" will take effect. + # In either case, any RFC-2308 Negative Caching value + # that may have been specified with -o/+t is cancelled. + # + $Ttl = $MasterTtl if $MasterTtl; + } else { + # + # The detected BIND version implements RFC-2308 and so $TTL + # directives must always be present in every zone file. + # + unless ($rfc2308) { + # + # RFC-2308 status was toggled off by a -o option that + # specified exactly four arguments. If a value for + # "$Ttl" was specified, transfer the value to its + # proper context in "$MasterTtl". Otherwise, existing + # $TTL directives will retain their values or be created + # with the value of "$DefTtl". + # + $MasterTtl = $Ttl if $Ttl; + + # The MAKE_SOA subroutine will use the SOA time intervals + # from an already-existing DB file in the absence of + # replacement values via a -o/+t option. Since a positive + # RFC-2308 status from the detected BIND version overrides + # the negated status set by the -o option, it is best to + # make the following assumptions: + # + # 1. The name server was upgraded to BIND 8.2 or newer + # and the -o option was not updated to reflect this. + # + # 2. The existing DB files still have SOA RRs with the + # SOA Minimum fields in their old context of holding + # a positive TTL value. + # + # In order to make sure that existing SOA Minimum fields + # assume their new context, we'll explicitly set "$Ttl" + # as though a value had been passed via the -o/+t option + # in an RFC-2308 context. The SOA RRs will thus be + # initialized with the default recommended value for the + # negative cache interval. + # + $Ttl = $DefNegCache; + } + # Make sure the generation of $TTL directives is unequivocally + # forced by setting the "$rfc2308" flag to a "hard" value of 2. + # + $rfc2308 = 2; + } + } else { + # + # The version of BIND running on the master name server (-h option) + # can not be determined. Either the BIND daemon is not running or + # the version ID may have been altered in the configuration file + # or an altered version of the special RR `version.bind. CH TXT' + # may have been created. + # + if ($rfc2308) { + # + # Either no -o/+t option was specified ("$rfc2308" starts out + # with a default value of 1 at the start of the program), a + # -o option did not toggle the RFC-2308 status to false, and/or + # a +t option forced RFC-2308 to be assumed. + # Make sure the generation of $TTL directives is unequivocally + # forced by setting the "$rfc2308" flag to a "hard" value of 2. + # + $rfc2308 = 2; + } else { + # + # RFC-2308 status was toggled off by a -o option that + # specified exactly four arguments. Even though we don't + # know which version of BIND we're running, our RFC-2308 + # override policy is that an existing $TTL directive which + # is discovered by the MAKE_SOA subroutine will toggle the + # RFC-2308 status back to true. + # Allow this possible change to take place by setting the + # "$rfc2308" flag to the "soft" value of 1. + # + $rfc2308 = 1; + } + } + } +} + + +# +# Subroutine for obtaining the version string of a BIND name server. +# The following global variables are set: +# +# $BIND_version : Actual version string +# $BIND_version_num : Numerical version value for use in comparisons +# $BIND_ver_msg : List of bugs which the BIND version may have +# +sub GET_BIND_VERSION { + my ($nameserver) = @_; + my ($BIND48_bug_tokens, $BIND_bugs, $CERT_URL_refs, $continuation_line); + my ($major_version, $minor_version, $patch_version, $query_options); + my ($release_token, $status, $tmp_version); + local *DIGOUT; + + $BIND48_bug_tokens = $BIND_bugs = $BIND_ver_msg = $CERT_URL_refs + = $continuation_line = $status = ""; + $BIND_version_num = 0; + if (defined($debug_BIND_version)) { + $BIND_version = $debug_BIND_version; + } else { + $BIND_version = "unavailable"; + return if $DiG_version_num == 0; + $query_options = "+nostats +$DiG_timeout +$DiG_retries" + . " \@$nameserver version.bind txt chaos"; + open(*DIGOUT, "$DiG $query_options 2>&1 |"); + while (<DIGOUT>) { + chop; + next if /^$/; + if (/^;.+HEADER.+opcode: QUERY, status: ([^,]+)/) { + $status = $1; + if ($status ne 'NOERROR') { + if ($status =~ /^(NOTIMPL?|FORMERR)$/) { + # + # We are probably dealing with a non-BIND name server. + # Microsoft -> NOTIMP + # djbdns -> FORMERR + # + $BIND_version = "*Non-BIND NS*"; + } else { + $BIND_version = $status; + } + last; + } + } elsif (/^VERSION\.BIND\.\s+.*TXT\s+\"([^\"]*)/i) { + $BIND_version = $1; + if ($BIND_version =~ /\\$/) { + $BIND_version =~ s/(\s+)\\$/$1/; # remove pre-spaced escape + $BIND_version =~ s/\\$/ /; # escape -> space char. + $continuation_line = "1"; + next; + } else { + $BIND_version = "unavailable" if $BIND_version =~ /^\s*$/; + last; + } + } elsif ($continuation_line && /([^\"]*)/) { + $continuation_line = $1; + $continuation_line =~ s/^\s+//; + $BIND_version .= $continuation_line; + if ($BIND_version =~ /\\$/) { + $BIND_version =~ s/(\s+)\\$/$1/; + $BIND_version =~ s/\\$/ /; + next; + } else { + $BIND_version = "unavailable" if $BIND_version =~ /^\s*$/; + last; + } + } + } + close(*DIGOUT); + return unless $status eq "NOERROR"; + } + + if ($BIND_version =~ /^(\d+)\.(\d+)(\.(\d+))?(.*)/) { + $major_version = (defined $1) ? $1 : 0; + $minor_version = (defined $2) ? $2 : 0; + $patch_version = (defined $4) ? $4 : 0; + $release_token = (defined $5) ? $5 : ""; + $BIND_version_num = (10000 * $major_version) + + (100 * $minor_version) + $patch_version; + } + if ($BIND_version_num < 90000 && $BIND_version =~ /[48][.]\d/) { + # + # See if "$BIND_version" resembles the format of a standard BIND + # version string. If so, we'll massage the text a bit and check + # "%BIND_bug_index" for any security-related defects to which + # this version may be vulnerable. + # NOTE: Here are the samples of customized BIND version + # strings that have been seen so far: + # + # "named 8.2.3 for Multinet V4.3 Process Software" + # "Meta IP/DNS V4.1 - BIND V8.1.2 (Build 4704 )" + # + $tmp_version = $BIND_version; + for ($tmp_version) { + s/.*(named|BIND) //i; # remove these prepended titles + s/^V(ers?i?o?n ?)?(\d)/$2/i; # remove custom prepended text + s/(\d)[.-]REL.*/$1/i; # truncate "-RELease" + s/(\d)\s*\(.*\)$/$1/; # remove custom appended text + s/(\d)[.-][PT](\d).*/$1-P$2/i; # standardize Test & Beta vers. + s/^8.2.3-P.*/8.2.3-T/; # standardize 8.2.3-T?? versions + } + if ($BIND_version_num == 0 + && $tmp_version =~ /^(\d+)\.(\d+)(\.(\d+))?/) { + # + # Now that the customized version string has undergone an + # attempted cleanup, make another stab at determining the + # equivalent numerical version. + # + $major_version = (defined $1) ? $1 : 0; + $minor_version = (defined $2) ? $2 : 0; + $patch_version = (defined $4) ? $4 : 0; + $BIND_version_num = (10000 * $major_version) + + (100 * $minor_version) + $patch_version; + } + if (exists($BIND_bug_index{$tmp_version})) { + $BIND48_bug_tokens = $BIND_bug_index{$tmp_version}; + for ($BIND48_bug_tokens) { + s/(\S+) /$1, /g; + s/^([^,]+), ([^,]+)$/$1 & $2/; + s/, ([^,]+)$/, & $1/; + } + $CERT_URL_refs = " $CERT_URL_bugs,\n"; + } + if (($BIND_version_num >= 40803 && $BIND_version_num < 40909) || + ($BIND_version_num >= 80000 && $BIND_version_num < 80206) || + ($BIND_version_num >= 80300 && $BIND_version_num < 80303)) { + $BIND_bugs = "libbind buffer overflow, "; + $CERT_URL_refs .= " $CERT_URL_libbind,\n"; + } + if (($BIND_version_num >= 40905 && $BIND_version_num <= 40910) || + ($BIND_version_num >= 80100 && $BIND_version_num <= 80206) || + ($BIND_version_num >= 80300 && $BIND_version_num <= 80303)) { + $BIND_bugs .= "BIND: Remote Execution of Code, "; + } + if (($BIND_version_num >= 80200 && $BIND_version_num <= 80206) || + ($BIND_version_num >= 80300 && $BIND_version_num <= 80303)) { + $BIND_bugs .= "BIND: Multiple Denial of Service, "; + } + if ($BIND_version_num >= 40902 && $BIND_version_num <= 40910) { + $BIND_bugs .= "LIBRESOLV: buffer overrun, "; + } + if ($BIND_bugs =~ /(BIND|LIBRESOLV): /) { + $CERT_URL_refs .= " $CERT_URL_buf_DoS,\n"; + } + } elsif ($BIND_version_num >= 90000) { + # + # BIND 9 version strings have a more standard format than BIND 8. + # + if ($BIND_version_num >= 90100 && $BIND_version_num < 90200) { + # + # These versions of BIND included a vulnerable version + # of the OpenSSL library and were automatically linked + # to it. BIND versions 9.2.X and later may be affected + # if optionally linked to a vulnerable OpenSSL library + # with the `--with-openssl=libpath' configuration option. + # + $BIND_bugs = "OpenSSL buffer overflow, "; + $CERT_URL_refs = " $CERT_URL_openssl,\n"; + } + if ($BIND_version_num < 90201 || + ($BIND_version_num == 90201 && $release_token)) { + $BIND_bugs .= "DoS internal consistency check, "; + $CERT_URL_refs .= " $CERT_URL_DoS,\n"; + } + if ($BIND_version_num >= 90200 && $BIND_version_num <= 90201) { + # + # This release of BIND may be vulnerable to the + # `libbind buffer overflow' bug if configured with + # the `--enable-libbind' option. + # + $BIND_bugs .= "libbind buffer overflow, "; + $CERT_URL_refs .= " $CERT_URL_libbind,\n"; + } + } + if ($CERT_URL_refs) { + $CERT_URL_refs =~ s/,\n$//; + unless ($CERT_URL_refs =~ /,/) { + # + # Just one CERT advisory to report. + # + $BIND_bugs =~ s/, $//; + $BIND_bugs = $BIND48_bug_tokens . $BIND_bugs; + $BIND_ver_msg = " $BIND_bugs.\n" + . " See $ISC_URL and\n" + . "$CERT_URL_refs for details."; + } else { + if ($BIND48_bug_tokens) { + $BIND48_bug_tokens =~ s/,? &/,/; + $BIND48_bug_tokens .= ",\n "; + } + $BIND_bugs =~ s/([^,]+,[^,]+,)/$1\n/gm; # Insert newline after + $BIND_bugs =~ s/,?. $//s; # every other entry. + $BIND_bugs = $BIND48_bug_tokens . $BIND_bugs; + $CERT_URL_refs =~ s/(.+),\n(.+)/$1, and\n$2/s; + $BIND_ver_msg = " $BIND_bugs.\n" + . " See $ISC_URL,\n" + . "$CERT_URL_refs for details."; + } + } + return; + +} + + +# +# Subroutine to look for a special configuration file that holds the +# network connectivity information for computer running `h2n' and +# other customizable values. The file search order is: +# +# $HOME/.h2nrc +# $PWD/h2n.conf +# /etc/h2n.conf +# /etc/opt/h2n/h2n.conf +# /usr/local/etc/h2n.conf +# +# If found, the data contained therein will replace the built-in values +# of the following global data structures: +# +# @local_networks +# @local_subnetmasks +# $DiG +# $check_del +# $DiG_retries +# $DiG_timeout +# +sub READ_RCFILE { + my ($CWD, $buffer, $cidr_size, $data, $error, $file, $first_net_token); + my ($line_num, $mask_size, $netmask, $network, $options_file, $subnet_mask); + my @conf_paths = (".h2nrc", "./h2n.conf", "/etc/h2n.conf", + "/etc/opt/h2n/h2n.conf", "/usr/local/etc/h2n.conf"); + + $first_net_token = 1; + $options_file = ""; + $CWD = getcwd(); + chdir; # change to the user's $HOME + foreach $file (@conf_paths) { + if (-f $file && -r $file && -s $file && open(*CONF, $file)) { + $file = "\$HOME/$file" if $file eq ".h2nrc"; + while (<CONF>) { + $line_num++; + chop; + s/^\s+//; + next if /^#/ || /^$/; + s/#.*//; + s/\s+$//; + if (/^LOCAL-NETWORKS\s*=/i) { + if ($first_net_token) { + @local_networks = (); + @local_subnetmasks = (); + $first_net_token = 0; + } + s/^LOCAL-NETWORKS\s*=\s*//i; + ($buffer = $_) =~ s/,/ /g; + while ($buffer) { + ($data, $buffer) = split(' ', $buffer, 2); + ($data, $subnet_mask) = split(/:/, $data, 2); + $subnet_mask = "" unless defined($subnet_mask); + ($network, $cidr_size) = split(/\//, $data, 2); + $cidr_size = 0 unless defined($cidr_size); + if ($data eq "0/0") { + $subnet_mask = "0.0.0.0"; + } else { + $netmask = undef; + $error = &CHECK_NET(\$network, \$cidr_size, \$netmask); + if ($error) { + print STDERR "Ignoring bad LOCAL-NETWORKS value ($data) at line $line_num\nin configuration file `$file':\n"; + print STDERR $error; + next; + } else { + # + # Re-initialize "$data" in case the network- + # portion of the specification was normalized. + # + $data = "$network/$cidr_size"; + unless ($subnet_mask) { + $subnet_mask = $netmask; + } else { + $mask_size = undef; + $error = &CHECK_NET(undef, \$mask_size, \$subnet_mask); + if ($error || $mask_size < $cidr_size) { + print STDERR "Ignoring bad LOCAL-NETWORKS value ($data) at line $line_num\nin configuration file `$file':\n"; + if ($error) { + print STDERR $error; + } else { + print STDERR " The number of mask bits is fewer than that of the corresponding network.\n"; + } + next; + } + } + } + } + push(@local_networks, $data); + push(@local_subnetmasks, $subnet_mask); + } + } elsif (/^DIG-UTILITY\s*=/i) { + s/^DIG-UTILITY\s*=\s*//i; + $DiG = $_; + if ($DiG =~ /\//) { + if (! -e $DiG) { + print STDERR "Non-existent file for DIG-UTILITY at line $line_num\nin configuration file `$file'\n"; + print STDERR "Resetting default value to unqualified filename of `dig'.\n"; + $DiG = "dig"; + } elsif (! -x $DiG) { + print STDERR "Non-executable file for DIG-UTILITY at line $line_num\nin configuration file `$file'\n"; + print STDERR "Resetting default value to unqualified filename of `dig'.\n"; + $DiG = "dig"; + } + } + } elsif (/^CHECK_DEL-UTILITY\s*=/i) { + s/^CHECK_DEL-UTILITY\s*=\s*//i; + $check_del = $_; + if ($check_del =~ /\//) { + if (! -e $check_del) { + print STDERR "Non-existent file for CHECK_DEL-UTILITY at line $line_num\nin configuration file `$file'\n"; + print STDERR "Resetting default value to unqualified filename of `check_del'.\n"; + $check_del = "check_del"; + } elsif (! -x $check_del) { + print STDERR "Non-executable file for CHECK_DEL-UTILITY at line $line_num\nin configuration file `$file'\n"; + print STDERR "Resetting default value to unqualified filename of `check_del'.\n"; + $check_del = "check_del"; + } + } + } elsif (/^DIG-RETRY-LIMIT\s*=/i) { + s/^DIG-RETRY-LIMIT\s*=\s*//i; + if (/^\d+$/) { + $DiG_retries = $_; + } else { + print STDERR "Non-numeric value for DIG-RETRY-LIMIT at line $line_num\nin configuration file `$file'\n"; + print STDERR "Resetting default value to 2.\n"; + $DiG_retries = 2; + } + } elsif (/^DIG-TIMEOUT-LIMIT\s*=/i) { + s/^DIG-TIMEOUT-LIMIT\s*=\s*//i; + if (/^\d+$/) { + $DiG_timeout = $_; + } else { + print STDERR "Non-numeric value for DIG-TIMEOUT-LIMIT at line $line_num\nin configuration file `$file'\n"; + print STDERR "Resetting default value to 4.\n"; + $DiG_timeout = 4; + } + } elsif (/^[^-+]/) { + print STDERR "Unrecognized data ($_) at line $line_num\nin configuration file `$file' - ignored.\n"; + } else { + # + # Assume that this line contains one or more `h2n' + # options that the user wishes to set as defaults + # without typing them on the command line or specifying + # them in a separate `-f' options file. + # Store the options in a temporary file for later + # submission to the PARSE_ARGS() subroutine. + # + unless ($options_file) { + ($data = $file) =~ s/.*\/\.?//; + $options_file = "$debug_DIR/${data}_options"; + unless (&OPEN(*OPT, "> $options_file")) { + print STDERR "While processing command-line options found in the $Program configuration file\n($file), trying to open the temporary working file\n`$options_file' failed with the following error:\n $!\n"; + print STDERR "I give up ... sorry.\n"; + close(*CONF); + exit(2); + } + } + print OPT "$_\n"; + } + } + # + # Save the unique identity (device and inode) + # of the just-processed configuration file. + # + $rcfile = join(":", (stat(*CONF))[0..1]); + close(*CONF); + $data = $file; # save $file before exiting `foreach' loop + last; # don't read any more configuration files + } + chdir $CWD if $file eq ".h2nrc"; + } + chdir $CWD; # make sure we're back to our original directory + unless (@local_networks) { + # + # Reassign the default values in case they got erased + # by empty text in an `h2n' configuration file. + # + @local_networks = ("0/0"); + @local_subnetmasks = ("0.0.0.0"); + } + if ($options_file) { + close(*OPT); + $error = &PARSE_ARGS(("-f", $options_file)); + if ($error) { + if ($error == 1) { + print STDERR "NOTE: The above message was generated from an erroneous command-line option\n"; + } else { + print STDERR "NOTE: The above messages were generated from erroneous command-line options\n"; + } + print STDERR " found in the $Program configuration file `$data'.\nPlease make the necessary correction(s).\n"; + exit(2); + } elsif (!$debug) { + unlink($options_file); + } + } + return; +} + + +sub GET_LOCAL_NETINFO { + my ($i, $netbits, $netmask, $network, $our_host); + + # In order to verify a domain, a zone transfer must be obtained from + # one of the domain's listed name servers. This program will use DiG + # to get every IP address of every listed name server so that they can + # all be tried in a zone transfer request before having to give up. + # Some IP addresses, however, may belong to inaccessible interfaces + # of multi-homed bastion hosts. Requesting a zone transfer from such + # IP addresses will cause cause this program to hang until the connection + # request times out. We'll try to avoid these delays by sorting the + # IP addresses using the information in the site-specific global arrays + # + # @local_networks + # @local_subnetmasks + # + # This subroutine will initialize the following global arrays: + # + # @our_nets + # @our_netbits + # @our_subnetmasks + # @our_subnets + # + # This information will allow any IP address to be sorted into one + # of the following four categories: + # + # 1) the localhost itself + # 2) subnets to which the localhost is directly connected + # 3) networks to which the localhost has known connectivity + # 4) all other networks + # + $our_host = hostname(); + ($tmp, $tmp, $tmp, $tmp, @our_addrs) = gethostbyname($our_host); + + # The "@our_addrs" array returned by the gethostbyname() function + # contains the IP address(es) of the local host. Each IP address + # is a binary structure consisting of four unsigned character values. + # We'll use the pack() and unpack() function with a template of `C4' + # to do the necessary data manipulations. + # + # First, add the loopback address as a local host address. + # + push(@our_addrs, pack('C4', "127", "0", "0", "1")); + @our_nets = @our_netbits = @our_subnetmasks = @our_subnets = (); + for ($i = 0; $i < @local_networks; $i++) { + # + # Create the corresponding network-related packed data structures. + # + ($network, $netbits) = split('/', $local_networks[$i]); + $network .= ".0.0.0"; # ensure a 4-octet format + $our_nets[$i] = pack('C4', split('\.', $network)); + $netmask = ((2 ** $netbits) - 1) << (32 - $netbits); + + # Convert the above 32-bit "$netmask" variable to a packed `C4' + # data structure so that it will be compatible for bitwise AND + # operations with the other IP-based data structures. + # + $our_netbits[$i] = pack('C4', ($netmask & 0xff000000) >> 24, + ($netmask & 0x00ff0000) >> 16, + ($netmask & 0x0000ff00) >> 8, + $netmask & 0x000000ff); + + # Each network specified in "@local_networks" will have a + # corresponding subnet mask in "@local_subnetmasks". + # + $netmask = $local_subnetmasks[$i]; + $our_subnetmasks[$i] = pack('C4', split('\.', $netmask)); + $our_subnets[$i] = ""; # create defined values for all indices + } + foreach $addr (@our_addrs) { + # + # Find all subnets to which the local host is directly connected. + # + for ($i = 0; $i < @our_netbits; $i++) { + $network = $addr & $our_netbits[$i]; + if ($network eq $our_nets[$i]) { + $our_subnets[$i] = $addr & $our_subnetmasks[$i]; + last; + } + } + } + return; +} + + +sub GEN_BOOT { + my ($bcname, $bootdb, $bootdom, $bootzone, $line, $one, $sname); + + unless (-e "boot.cacheonly") { + $bcname = "${Bwd}boot.cacheonly"; + unless (open(*F, "> $bcname")) { + print STDERR "Unable to write `$bcname': $!\n"; + print STDERR "Check your -B option argument.\n"; + print STDERR "I give up ... sorry.\n"; + exit(2); + } + print F "\ndirectory $Pwd\n\n"; + print F "cache .\t\t\t\tdb.cache\n"; + print F "primary 0.0.127.in-addr.arpa\t\tdb.127.0.0\n"; + close(*F); + } + + unless (-e "conf.cacheonly") { + $bcname = "${Bwd}conf.cacheonly"; + unless (open(*F, "> $bcname")) { + print STDERR "Unable to write `$bcname': $!\n"; + print STDERR "Check your -B option argument.\n"; + print STDERR "I give up ... sorry.\n"; + exit(2); + } + print F "\noptions {\n"; + print F "\tdirectory \"$Pwd\";\n};\n\n"; + if ($NeedHints) { + if ($new_fmt_Conffile) { + print F "zone \".\" {\n\ttype hint;\n\tfile \"db.cache\";\n};\n"; + } else { + print F "zone \".\"\t\t\t{ type hint;\tfile \"db.cache\"; };\n"; + } + } + if ($new_fmt_Conffile) { + print F "zone \"0.0.127.in-addr.arpa\" {\n\ttype master;\n\tfile \"db.127.0.0\";\n};\n"; + } else { + print F "zone \"0.0.127.in-addr.arpa\"\t{ type master;\tfile \"db.127.0.0\"; };\n"; + } + close(*F); + } + + if ($Bwd && $Bootfile !~ /^\//) { + $bcname = "$Bwd$Bootfile"; + } else { + $bcname = "$Bootfile"; + } + unless (open(*F, "> $bcname")) { + print STDERR "Unable to write `$bcname': $!\n"; + print STDERR "Check your -B and/or -b option argument(s).\n"; + print STDERR "I give up ... sorry.\n"; + exit(2); + } + print F "\n"; + foreach $line (@BootOptions) { + printf F "%s\n", $line; + } + print F "\ndirectory $Pwd\n\n"; + print F "cache .\t\t\t\tdb.cache\n"; + if ($MakeLoopbackZone) { + print F "primary 0.0.127.in-addr.arpa\t\tdb.127.0.0\n"; + } + foreach $line (@bootmsgs) { + ($bootdom, $bootdb) = split(' ', $line); + printf F "primary %s%s\n", &TAB($bootdom, 29), $bootdb; + } + $sname = "spcl-boot"; + if (-r $sname) { + unless (open(*ADD, $sname)) { + print STDERR "Unable to read `$sname': $!\n"; + print STDERR "I give up ... sorry.\n"; + exit(2); + } + printf F "\n; ----- Begin contents of file `$sname' -----\n\n"; + while (<ADD>) { + print F; + } + close(*ADD); + printf F "\n; ----- End of appended file `$sname' -----\n\n"; + print STDOUT "File `$sname' found and appended to `$bcname'.\n" if $verbose; + } + close(*F); + + if ($Bwd && $Conffile !~ /^\//) { + $bcname = "$Bwd$Conffile"; + } else { + $bcname = "$Conffile"; + } + unless (open(*F, "> $bcname")) { + print STDERR "Unable to write `$bcname': $!\n"; + print STDERR "Check your -B and/or +c option argument(s).\n"; + print STDERR "I give up ... sorry.\n"; + exit(2); + } + if ($Conf_prefile) { + print F "\ninclude \"$Conf_prefile\";\n"; + } + if ($CustomLogging) { + if (@ConfLogging) { + print F "\nlogging {\n"; + foreach $line (@ConfLogging) { + printf F "\t%s\n", $line; + } + print F "};\n\n"; + } else { + print F "\nlogging {\n"; + print F "\tcategory lame-servers { null; };\n"; + print F "\tcategory cname { null; };\n"; + print F "\tcategory security { default_syslog; };\n"; + print F "};\n\n"; + } + } + if ($CustomOptions) { + if (@ConfOptions) { + print F "\n" unless $CustomLogging; + print F "options {\n"; + print F "\tdirectory \"$Pwd\";\n"; + foreach $line (@ConfOptions) { + printf F "\t%s\n", $line; + } + print F "};\n\n"; + } + } else { + print F "\n" unless $CustomLogging; + print F "options {\n"; + print F "\tdirectory \"$Pwd\";\n"; + print F "};\n\n"; + } + if ($NeedHints) { + if ($new_fmt_Conffile) { + print F "zone \".\" {\n\ttype hint;\n\tfile \"db.cache\";\n};\n"; + } else { + print F "zone \".\"\t\t\t{ type hint;\tfile \"db.cache\"; };\n"; + } + } elsif ($Conf_prefile) { + print F "\n" unless $CustomLogging; + } + if ($MakeLoopbackZone) { + if ($new_fmt_Conffile) { + print F "zone \"0.0.127.in-addr.arpa\" {\n\ttype master;\n\tfile \"db.127.0.0\";\n};\n"; + } else { + print F "zone \"0.0.127.in-addr.arpa\"\t{ type master;\tfile \"db.127.0.0\"; };\n"; + } + } + foreach $line (@bootmsgs) { + ($bootdom, $bootdb) = split(' ', $line); + if ($new_fmt_Conffile) { + printf F "zone \"%s\" {\n\ttype master;\n\tfile \"%s\";", $bootdom, $bootdb; + foreach $one (@GlobalMasterZoneOptions) { + printf F "\n\t%s", $one; + } + if (exists($MasterZoneOptions{"$bootdb"})) { + foreach $one (split('\n', $MasterZoneOptions{"$bootdb"})) { + printf F "\n\t%s", $one; + } + } + printf F "\n};\n"; + } else { + printf F "zone %s{ type master;\tfile \"%s\";", &TAB("\"$bootdom\"", 27), $bootdb; + foreach $one (@GlobalMasterZoneOptions) { + printf F "\n %s", $one; + } + if (exists($MasterZoneOptions{"$bootdb"})) { + foreach $one (split('\n', $MasterZoneOptions{"$bootdb"})) { + printf F "\n %s", $one; + } + } + printf F " };\n"; + } + } + $sname = "spcl-conf"; + if (-r $sname) { + print F "\ninclude \"$Pwd/$sname\";\n\n"; + } + close(*F); + + if (defined($Bootsecaddr)) { + $bcname = "${Bwd}boot.sec"; + unless (open(*F, "> $bcname")) { + print STDERR "Unable to write `$bcname': $!\n"; + print STDERR "Check your -B and/or -Z option argument(s).\n"; + print STDERR "I give up ... sorry.\n"; + exit(2); + } + print F "\n"; + foreach $line (@BootOptions) { + printf F "%s\n", $line; + } + print F "\ndirectory $Pwd\n\n"; + print F "cache .\t\t\t\tdb.cache\n"; + if ($MakeLoopbackZone) { + print F "primary 0.0.127.in-addr.arpa\t\tdb.127.0.0\n"; + } + foreach $line (@bootmsgs) { + ($bootdom, $bootdb) = split(' ', $line); + printf F "secondary %s%s\n", &TAB($bootdom, 29), $Bootsecaddr; + } + $sname = "spcl-boot.sec"; + if (-r $sname) { + unless (open(*ADD, $sname)) { + print STDERR "Unable to read `$sname': $!\n"; + print STDERR "I give up ... sorry.\n"; + exit(2); + } + printf F "\n; ----- Begin contents of file `$sname' -----\n\n"; + while (<ADD>) { + print F; + } + close(*ADD); + printf F "\n; ----- End of appended file `$sname' -----\n\n"; + print STDOUT "File `$sname' found and appended to `$bcname'.\n" if $verbose; + } + close(*F); + } + + if (defined($Confsecaddr)) { + $bcname = "${Bwd}conf.sec"; + unless (open(*F, "> $bcname")) { + print STDERR "Unable to write `$bcname': $!\n"; + print STDERR "Check your -B and/or -Z option argument(s).\n"; + print STDERR "I give up ... sorry.\n"; + exit(2); + } + if ($Conf_prefile) { + print F "\ninclude \"$Conf_prefile\";\n"; + } + if ($CustomLogging) { + if (@ConfLogging) { + print F "\nlogging {\n"; + foreach $line (@ConfLogging) { + printf F "\t%s\n", $line; + } + print F "};\n\n"; + } else { + print F "\nlogging {\n"; + print F "\tcategory lame-servers { null; };\n"; + print F "\tcategory cname { null; };\n"; + print F "\tcategory security { default_syslog; };\n"; + print F "};\n\n"; + } + } + if ($CustomOptions) { + if (@ConfOptions) { + print F "\n" unless $CustomLogging; + print F "options {\n"; + print F "\tdirectory \"$Pwd\";\n"; + foreach $line (@ConfOptions) { + printf F "\t%s\n", $line; + } + print F "};\n\n"; + } + } else { + print F "\n" unless $CustomLogging; + print F "options {\n"; + print F "\tdirectory \"$Pwd\";\n"; + print F "};\n\n"; + } + if ($NeedHints) { + if ($new_fmt_Conffile) { + print F "zone \".\" {\n\ttype hint;\n\tfile \"db.cache\";\n};\n"; + } else { + print F "zone \".\"\t\t\t{ type hint;\tfile \"db.cache\"; };\n"; + } + } elsif ($Conf_prefile) { + print F "\n" unless $CustomLogging; + } + if ($MakeLoopbackZone) { + if ($new_fmt_Conffile) { + print F "zone \"0.0.127.in-addr.arpa\" {\n\ttype master;\n\tfile \"db.127.0.0\";\n};\n"; + } else { + print F "zone \"0.0.127.in-addr.arpa\"\t{ type master;\tfile \"db.127.0.0\"; };\n"; + } + } + foreach $line (@bootmsgs) { + ($bootdom, $bootzone) = split(' ', $line); + if ($new_fmt_Conffile) { + printf F "zone \"%s\" {\n\ttype slave;\n\tmasters { %s };", $bootdom, $Confsecaddr; + foreach $one (@GlobalSlaveZoneOptions) { + printf F "\n\t%s", $one; + } + if (exists($SlaveZoneOptions{"$bootzone"})) { + foreach $one (split('\n', $SlaveZoneOptions{"$bootzone"})) { + printf F "\n\t%s", $one; + } + } + printf F "\n};\n"; + } else { + printf F "zone %s{ type slave;\tmasters { %s };", &TAB("\"$bootdom\"", 27), $Confsecaddr; + foreach $one (@GlobalSlaveZoneOptions) { + printf F "\n %s", $one; + } + if (exists($SlaveZoneOptions{"$bootzone"})) { + foreach $one (split('\n', $SlaveZoneOptions{"$bootzone"})) { + printf F "\n %s", $one; + } + } + printf F " };\n"; + } + } + $sname = "spcl-conf.sec"; + if (-r $sname) { + print F "\ninclude \"$Pwd/$sname\";\n\n"; + } + close(*F); + } + + if (defined($Bootsecsaveaddr)) { + $bcname = "${Bwd}boot.sec.save"; + unless (open(*F, "> $bcname")) { + print STDERR "Unable to write `$bcname': $!\n"; + print STDERR "Check your -B and/or -z option argument(s).\n"; + print STDERR "I give up ... sorry.\n"; + exit(2); + } + print F "\n"; + foreach $line (@BootOptions) { + printf F "%s\n", $line; + } + print F "\ndirectory $Pwd\n\n"; + print F "cache .\t\t\t\tdb.cache\n"; + if ($MakeLoopbackZone) { + print F "primary 0.0.127.in-addr.arpa\t\tdb.127.0.0\n"; + } + foreach $line (@bootmsgs) { + ($bootdom, $bootdb) = split(' ', $line); + printf F "secondary %s%s%s\n", &TAB($bootdom, 29), &TAB($Bootsecsaveaddr, 16), $bootdb; + } + $sname = "spcl-boot.sec.save"; + if (-r $sname) { + unless (open(*ADD, $sname)) { + print STDERR "Unable to read `$sname': $!\n"; + print STDERR "I give up ... sorry.\n"; + exit(2); + } + printf F "\n; ----- Begin contents of file `$sname' -----\n\n"; + while (<ADD>) { + print F; + } + close(*ADD); + printf F "\n; ----- End of appended file `$sname' -----\n\n"; + print STDOUT "File `$sname' found and appended to `$bcname'.\n" if $verbose; + } + close(*F); + } + + if (defined($Confsecsaveaddr)) { + $bcname = "${Bwd}conf.sec.save"; + unless (open(*F, "> $bcname")) { + print STDERR "Unable to write `$bcname': $!\n"; + print STDERR "Check your -B and/or -z option argument(s).\n"; + print STDERR "I give up ... sorry.\n"; + exit(2); + } + if ($Conf_prefile) { + print F "\ninclude \"$Conf_prefile\";\n"; + } + if ($CustomLogging) { + if (@ConfLogging) { + print F "\nlogging {\n"; + foreach $line (@ConfLogging) { + printf F "\t%s\n", $line; + } + print F "};\n\n"; + } else { + print F "\nlogging {\n"; + print F "\tcategory lame-servers { null; };\n"; + print F "\tcategory cname { null; };\n"; + print F "\tcategory security { default_syslog; };\n"; + print F "};\n\n"; + } + } + if ($CustomOptions) { + if (@ConfOptions) { + print F "\n" unless $CustomLogging; + print F "options {\n"; + print F "\tdirectory \"$Pwd\";\n"; + foreach $line (@ConfOptions) { + printf F "\t%s\n", $line; + } + print F "};\n\n"; + } + } else { + print F "\n" unless $CustomLogging; + print F "options {\n"; + print F "\tdirectory \"$Pwd\";\n"; + print F "};\n\n"; + } + if ($NeedHints) { + if ($new_fmt_Conffile) { + print F "zone \".\" {\n\ttype hint;\n\tfile \"db.cache\";\n};\n"; + } else { + print F "zone \".\"\t\t\t{ type hint;\tfile \"db.cache\"; };\n"; + } + } elsif ($Conf_prefile) { + print F "\n" unless $CustomLogging; + } + if ($MakeLoopbackZone) { + if ($new_fmt_Conffile) { + print F "zone \"0.0.127.in-addr.arpa\" {\n\ttype master;\n\tfile \"db.127.0.0\";\n};\n"; + } else { + print F "zone \"0.0.127.in-addr.arpa\"\t{ type master;\tfile \"db.127.0.0\"; };\n"; + } + } + foreach $line (@bootmsgs) { + ($bootdom, $bootdb) = split(' ', $line); + $bootzone = $bootdb; + $bootdb =~ s/^db/bak/i; + if ($new_fmt_Conffile) { + printf F "zone \"%s\" {\n\ttype slave;\n\tfile \"%s\";\n\tmasters { %s };", $bootdom, $bootdb, $Confsecsaveaddr; + foreach $one (@GlobalSlaveZoneOptions) { + printf F "\n\t%s", $one; + } + if (exists($SlaveZoneOptions{"$bootzone"})) { + foreach $one (split('\n', $SlaveZoneOptions{"$bootzone"})) { + printf F "\n\t%s", $one; + } + } + printf F "\n};\n"; + } else { + printf F "zone %s{ type slave;\tfile %smasters { %s };", &TAB("\"$bootdom\"", 27), &TAB("\"$bootdb\";", 19), $Confsecsaveaddr; + foreach $one (@GlobalSlaveZoneOptions) { + printf F "\n %s", $one; + } + if (exists($SlaveZoneOptions{"$bootzone"})) { + foreach $one (split('\n', $SlaveZoneOptions{"$bootzone"})) { + printf F "\n %s", $one; + } + } + printf F " };\n"; + } + } + $sname = "spcl-conf.sec.save"; + if (-r $sname) { + print F "\ninclude \"$Pwd/$sname\";\n\n"; + } + close(*F); + } +} + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-dns/files/usr/share/zephir/monitor/configs/services/21_dns.srv b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dns/files/usr/share/zephir/monitor/configs/services/21_dns.srv new file mode 100644 index 0000000000000000000000000000000000000000..c1c8b074b69117b139605353991d4b4ce69f2ca8 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dns/files/usr/share/zephir/monitor/configs/services/21_dns.srv @@ -0,0 +1,15 @@ +# -*- coding: UTF-8 -*- +""" +Surveillance du service DNS (bind9) +""" + +from zephir.monitor.agents.services import TCPServices +from zephir.monitor.agentmanager.config import CONTAINER_IP_DNS + +address = CONTAINER_IP_DNS +if address == '127.0.0.1': + address = 'localhost' +test = '{0}:53'.format(address) +data = {test: "Serveur de noms (DNS)"} +AGENTS.append(TCPServices('dns', data, period=115, + description='Etat du serveur de noms (DNS)')) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-dns/posttemplates/00-dns b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dns/posttemplates/00-dns new file mode 100644 index 0000000000000000000000000000000000000000..68158d7dc4658a880713f0ef10a6533537e863e3 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dns/posttemplates/00-dns @@ -0,0 +1,5 @@ +#!/bin/bash +# génération des fichiers de configuration +# pour bind9 +/usr/share/eole/sbin/gen_dns +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-dns/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dns/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..c0303242323972eb3458e50d09df6d2092d697fd --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dns/service.yml @@ -0,0 +1,51 @@ +format: '0.1' +name: eole-dns +version: |- + 2.7.0-3 +description: |- + Templates et dictionnaires pour le service DNS + Configuration du serveur DNS : bind9 + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: [] +packages: [] +dictionaries: + - 22_dns.xml +extra_dictionaries: {} +templates: + - agriates.zones + - bind9 + - bind9.override + - forward.zones + - named.apparmor.conf + - named.conf +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: + - 00-dns +files: + /etc/logrotate.d/named: + owner: root + group: root + mode: '0644' + /usr/share/eole/diagnose/151-dns: + owner: root + group: root + mode: '0755' + /usr/share/eole/sbin/gen_dns: + owner: root + group: root + mode: '0755' + /usr/share/eole/sbin/h2n: + owner: root + group: root + mode: '0755' + /usr/share/zephir/monitor/configs/services/21_dns.srv: + owner: root + group: root + mode: '0644' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-dns/templates/agriates.zones b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dns/templates/agriates.zones new file mode 100644 index 0000000000000000000000000000000000000000..97453bfbbe9096e9eb92b1ff455edf7cf9a22a9a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dns/templates/agriates.zones @@ -0,0 +1,463 @@ +// Academie d'Aix-Marseille +zone "in.ac-aix-marseille.fr" in { + type forward; + forwarders { +%for %%var_iter in %%adresse_dns_agriates + %%var_iter; +%end for + }; + forward only; +}; + +// Academie d Amiens +zone "in.ac-amiens.fr" in { + type forward; + forwarders { +%for %%var_iter in %%adresse_dns_agriates + %%var_iter; +%end for + }; + forward only; +}; + +// Academie de Besancon +zone "in.ac-besancon.fr" in { + type forward; + forwarders { +%for %%var_iter in %%adresse_dns_agriates + %%var_iter; +%end for + }; + forward only; +}; + +// Academie de Bordeaux +zone "in.ac-bordeaux.fr" in { + type forward; + forwarders { +%for %%var_iter in %%adresse_dns_agriates + %%var_iter; +%end for + }; + forward only; +}; + +// Academie de Caen +zone "in.ac-caen.fr" in { + type forward; + forwarders { +%for %%var_iter in %%adresse_dns_agriates + %%var_iter; +%end for + }; + forward only; +}; + +// Academie de Clermont-Ferrand +zone "in.ac-clermont.fr" in { + type forward; + forwarders { +%for %%var_iter in %%adresse_dns_agriates + %%var_iter; +%end for + }; + forward only; +}; + +// Academie de Corse +zone "in.ac-corse.fr" in { + type forward; + forwarders { +%for %%var_iter in %%adresse_dns_agriates + %%var_iter; +%end for + }; + forward only; +}; + +// Academie de Creteil +zone "in.ac-creteil.fr" in { + type forward; + forwarders { +%for %%var_iter in %%adresse_dns_agriates + %%var_iter; +%end for + }; + forward only; +}; + +// Academie de Dijon +zone "in.ac-dijon.fr" in { + type forward; + forwarders { +%for %%var_iter in %%adresse_dns_agriates + %%var_iter; +%end for + }; + forward only; +}; + +// Academie de Grenoble +zone "in.ac-grenoble.fr" in { + type forward; + forwarders { +%for %%var_iter in %%adresse_dns_agriates + %%var_iter; +%end for + }; + forward only; +}; + +// Academie de la Guadeloupe +zone "in.ac-guadeloupe.fr" in { + type forward; + forwarders { +%for %%var_iter in %%adresse_dns_agriates + %%var_iter; +%end for + }; + forward only; +}; + +// Academie de Guyane +zone "in.ac-guyane.fr" in { + type forward; + forwarders { +%for %%var_iter in %%adresse_dns_agriates + %%var_iter; +%end for + }; + forward only; +}; + +// Academie de Lille +zone "in.ac-lille.fr" in { + type forward; + forwarders { +%for %%var_iter in %%adresse_dns_agriates + %%var_iter; +%end for + }; + forward only; +}; + +// Academie de Limoges +zone "in.ac-limoges.fr" in { + type forward; + forwarders { +%for %%var_iter in %%adresse_dns_agriates + %%var_iter; +%end for + }; + forward only; +}; + +// Academie de Lyon +zone "in.ac-lyon.fr" in { + type forward; + forwarders { +%for %%var_iter in %%adresse_dns_agriates + %%var_iter; +%end for + }; + forward only; +}; + +// Academie de Martinique +zone "in.ac-martinique.fr" in { + type forward; + forwarders { +%for %%var_iter in %%adresse_dns_agriates + %%var_iter; +%end for + }; + forward only; +}; + +// Academie de Mayotte +zone "in.ac-mayotte.fr" in { + type forward; + forwarders { +%for %%var_iter in %%adresse_dns_agriates + %%var_iter; +%end for + }; + forward only; +}; + +// Academie de Montpellier +zone "in.ac-montpellier.fr" in { + type forward; + forwarders { +%for %%var_iter in %%adresse_dns_agriates + %%var_iter; +%end for + }; + forward only; +}; + +// Academie de Nancy-Metz +zone "in.ac-nancy-metz.fr" in { + type forward; + forwarders { +%for %%var_iter in %%adresse_dns_agriates + %%var_iter; +%end for + }; + forward only; +}; + +// Academie de Nantes +zone "in.ac-nantes.fr" in { + type forward; + forwarders { +%for %%var_iter in %%adresse_dns_agriates + %%var_iter; +%end for + }; + forward only; +}; + +// Academie de Nice +zone "in.ac-nice.fr" in { + type forward; + forwarders { +%for %%var_iter in %%adresse_dns_agriates + %%var_iter; +%end for + }; + forward only; +}; + +// Academie de nouvelle caledonie +zone "in.ac-noumea.nc" in { + type forward; + forwarders { +%for %%var_iter in %%adresse_dns_agriates + %%var_iter; +%end for + }; + forward only; +}; + +// Academie de Orleans-Tours +zone "in.ac-orleans-tours.fr" in { + type forward; + forwarders { +%for %%var_iter in %%adresse_dns_agriates + %%var_iter; +%end for + }; + forward only; +}; + +// Academie de Paris +zone "in.ac-paris.fr" in { + type forward; + forwarders { +%for %%var_iter in %%adresse_dns_agriates + %%var_iter; +%end for + }; + forward only; +}; + +// Academie de Poitiers +zone "in.ac-poitiers.fr" in { + type forward; + forwarders { +%for %%var_iter in %%adresse_dns_agriates + %%var_iter; +%end for + }; + forward only; +}; + +// Academie de Polynesie +zone "in.ac-polynesie.pf" in { + type forward; + forwarders { +%for %%var_iter in %%adresse_dns_agriates + %%var_iter; +%end for + }; + forward only; +}; + +// Academie de Reims +zone "in.ac-reims.fr" in { + type forward; + forwarders { +%for %%var_iter in %%adresse_dns_agriates + %%var_iter; +%end for + }; + forward only; +}; + +// Academie de Rennes +zone "in.ac-rennes.fr" in { + type forward; + forwarders { +%for %%var_iter in %%adresse_dns_agriates + %%var_iter; +%end for + }; + forward only; +}; + +// Academie de Reunion +zone "in.ac-reunion.fr" in { + type forward; + forwarders { +%for %%var_iter in %%adresse_dns_agriates + %%var_iter; +%end for + }; + forward only; +}; + +// Academie de Rouen +zone "in.ac-rouen.fr" in { + type forward; + forwarders { +%for %%var_iter in %%adresse_dns_agriates + %%var_iter; +%end for + }; + forward only; +}; + +// Academie de Strasbourg +zone "in.ac-strasbourg.fr" in { + type forward; + forwarders { +%for %%var_iter in %%adresse_dns_agriates + %%var_iter; +%end for + }; + forward only; +}; + +// Academie de Toulouse +zone "in.ac-toulouse.fr" in { + type forward; + forwarders { +%for %%var_iter in %%adresse_dns_agriates + %%var_iter; +%end for + }; + forward only; +}; + +// Academie de Versailles +zone "in.ac-versailles.fr" in { + type forward; + forwarders { +%for %%var_iter in %%adresse_dns_agriates + %%var_iter; +%end for + }; + forward only; +}; + +// Academie Virtuelle +zone "in.acv.orion.education.fr" in { + type forward; + forwarders { +%for %%var_iter in %%adresse_dns_agriates + %%var_iter; +%end for + }; + forward only; +}; + +// administration centrale +zone "in.adc.education.fr" in { + type forward; + forwarders { +%for %%var_iter in %%adresse_dns_agriates + %%var_iter; +%end for + }; + forward only; +}; + +// Ader +zone "ader.gouv.fr" in { + type forward; + forwarders { +%for %%var_iter in %%adresse_dns_agriates + %%var_iter; +%end for + }; + forward only; +}; + +// RIE +zone "rie.gouv.fr" in { + type forward; + forwarders { +%for %%var_iter in %%adresse_dns_agriates + %%var_iter; +%end for + }; + forward only; +}; + +// Orion +zone "in.orion.education.fr" in { + type forward; + forwarders { +%for %%var_iter in %%adresse_dns_agriates + %%var_iter; +%end for + }; + forward only; +}; + +// intranet pleiade +zone "intranet.pleiade.education.fr" in { + type forward; + forwarders { +%for %%var_iter in %%adresse_dns_agriates + %%var_iter; +%end for + }; + forward only; +}; + +// publication pleiade +zone "publication.pleiade.education.fr" in { + type forward; + forwarders { +%for %%var_iter in %%adresse_dns_agriates + %%var_iter; +%end for + }; + forward only; +}; + +// applications nationales +zone "in.phm.education.gouv.fr" in { + type forward; + forwarders { +%for %%var_iter in %%adresse_dns_agriates + %%var_iter; +%end for + }; + forward only; +}; + +// Zones supplémentaires +%for %%zone in %%getVar('nom_zone_forward_rvp', '') +zone "%%zone" in { + type forward; + forwarders { +%for %%var_iter in %%adresse_dns_agriates + %%var_iter; +%end for + }; + forward only; +}; +%end for diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-dns/templates/bind9 b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dns/templates/bind9 new file mode 100644 index 0000000000000000000000000000000000000000..e28645880ba9cd965445d4f442e862f12107f489 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dns/templates/bind9 @@ -0,0 +1,9 @@ +# run resolvconf? +RESOLVCONF=yes + +# startup options for the server +%if %%activer_ipv6 == 'oui' +OPTIONS="-u bind" +%else +OPTIONS="-u bind -4" +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-dns/templates/bind9.override b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dns/templates/bind9.override new file mode 100644 index 0000000000000000000000000000000000000000..3eff63692db3aed88f311ce1a1f369f6d53e110a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dns/templates/bind9.override @@ -0,0 +1,4 @@ +[Service] +Type=forking +ExecStart= +ExecStart=/usr/sbin/named -u bind diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-dns/templates/forward.zones b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dns/templates/forward.zones new file mode 100644 index 0000000000000000000000000000000000000000..0604498c383c31e2d066efc91ae4319cffbb4798 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dns/templates/forward.zones @@ -0,0 +1,11 @@ +%if %%activer_zone_forward == 'oui' + %for %%zone_name in %%nom_zone_forward +zone "%%zone_name" in { + type forward; + forwarders { + %%zone_name.ip_dns_zone_forward; + }; + forward only; +}; + %end for +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-dns/templates/named.apparmor.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dns/templates/named.apparmor.conf new file mode 100644 index 0000000000000000000000000000000000000000..b3c9af2609ba92f4ca16ad91c7d8ba7703a5f01e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dns/templates/named.apparmor.conf @@ -0,0 +1,14 @@ +# Site-specific additions and overrides for usr.sbin.named. +# For more details, please see /etc/apparmor.d/local/README. +%set %%result = False +%for nbcrt in %%range(1, %%int(%%nombre_interfaces)) + %if %%getVar('dns_master_eth' + %%str(%%nbcrt)) + %set %%result = True + %end if + %if %%getVar('activer_dns_eth0') == "oui" + %set %%result = True + %end if +%end for +%if %%result + /etc/bind/** rw, +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-dns/templates/named.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dns/templates/named.conf new file mode 100644 index 0000000000000000000000000000000000000000..08986610f3121bcb5c8dd5b6db833f2ad32b4051 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-dns/templates/named.conf @@ -0,0 +1,305 @@ +%def getSlave(%%master, %%slave, %%iterator) + %if %%is_defined(%%master+'.'+%%slave) + %return %%getattr(%%iterator, %%slave) + %else + %return '' + %end if +%end def +%def gen_match_clients(%%agriates, %%forward) + %if %%nombre_interfaces >= "2" + %if (%%getVar('dns_rvp_eth1', "non") == %%agriates or %%agriates == 'force') and \ + (%%dns_forward_eth1 == %%forward or %%forward == 'force') + %%adresse_network_eth1/%%calc_classe(%%adresse_netmask_eth1); + %end if + %if %%alias_eth1 == "oui" + %for %%alias_ip in %%alias_ip_eth1 + %if (%%getSlave('alias_ip_eth1', 'dns_rvp_alias_eth1', %%alias_ip) == %%agriates or %%agriates == 'force') and \ + (%%alias_ip.dns_forward_alias_eth1 == %%forward or %%forward == 'force') + %%alias_ip.alias_network_eth1/%%calc_classe(%%alias_ip.alias_netmask_eth1); + %end if + %end for + %end if + %if %%vlan_eth1 == "oui" + %for %%vlan in %%vlan_id_eth1 + %if (%%getSlave('vlan_id_eth1', 'dns_rvp_vlan_eth1', %%vlan) == %%agriates or %%agriates == 'force') and \ + (%%vlan.dns_forward_vlan_eth1 == %%forward or %%forward == 'force') + %%vlan.vlan_network_eth1/%%calc_classe(%%vlan.vlan_netmask_eth1); + %end if + %end for + %end if + %end if + %if %%nombre_interfaces >= "3" + %if (%%getVar('dns_rvp_eth2', "non") == %%agriates or %%agriates == 'force') and \ + (%%dns_forward_eth2 == %%forward or %%forward == 'force') + %%adresse_network_eth2/%%calc_classe(%%adresse_netmask_eth2); + %end if + %if %%alias_eth2 == "oui" + %for %%alias_ip in %%alias_ip_eth2 + %if (%%getSlave('alias_ip_eth2', 'dns_rvp_alias_eth2', %%alias_ip) == %%agriates or %%agriates == 'force') and \ + (%%alias_ip.dns_forward_alias_eth2 == %%forward or %%forward == 'force') + %%alias_ip.alias_network_eth2/%%calc_classe(%%alias_ip.alias_netmask_eth2); + %end if + %end for + %end if + %if %%vlan_eth2 == "oui" + %for %%vlan in %%vlan_id_eth2 + %if (%%getSlave('vlan_id_eth2', 'dns_rvp_vlan_eth2', %%vlan) == %%agriates or %%agriates == 'force') and \ + (%%vlan.dns_forward_vlan_eth2 == %%forward or %%forward == 'force') + %%vlan.vlan_network_eth2/%%calc_classe(%%vlan.vlan_netmask_eth2); + %end if + %end for + %end if + %end if + %if %%nombre_interfaces >= "4" + %if (%%getVar('dns_rvp_eth3', "non") == %%agriates or %%agriates == 'force') and \ + (%%dns_forward_eth3 == %%forward or %%forward == 'force') + %%adresse_network_eth3/%%calc_classe(%%adresse_netmask_eth3); + %end if + %if %%alias_eth3 == "oui" + %for %%alias_ip in %%alias_ip_eth3 + %if (%%getSlave('alias_ip_eth3', 'dns_rvp_alias_eth3', %%alias_ip) == %%agriates or %%agriates == 'force') and \ + (%%alias_ip.dns_forward_alias_eth3 == %%forward or %%forward == 'force') + %%alias_ip.alias_network_eth3/%%calc_classe(%%alias_ip.alias_netmask_eth3); + %end if + %end for + %end if + %if %%vlan_eth3 == "oui" + %for %%vlan in %%vlan_id_eth3 + %if (%%getSlave('vlan_id_eth3', 'dns_rvp_vlan_eth3', %%vlan) == %%agriates or %%agriates == 'force') and \ + (%%vlan.dns_forward_vlan_eth3 == %%forward or %%forward == 'force') + %%vlan.vlan_network_eth3/%%calc_classe(%%vlan.vlan_netmask_eth3); + %end if + %end for + %end if + %end if + %if %%nombre_interfaces >= "5" + %if (%%getVar('dns_rvp_eth4', "non") == %%agriates or %%agriates == 'force') and \ + (%%dns_forward_eth4 == %%forward or %%forward == 'force') + %%adresse_network_eth4/%%calc_classe(%%adresse_netmask_eth4); + %end if + %if %%alias_eth4 == "oui" + %for %%alias_ip in %%alias_ip_eth4 + %if (%%getSlave('alias_ip_eth4', 'dns_rvp_alias_eth4', %%alias_ip) == %%agriates or %%agriates == 'force') and \ + (%%alias_ip.dns_forward_alias_eth4 == %%forward or %%forward == 'force') + %%alias_ip.alias_network_eth4/%%calc_classe(%%alias_ip.alias_netmask_eth4); + %end if + %end for + %end if + %if %%vlan_eth4 == "oui" + %for %%vlan in %%vlan_id_eth4 + %if (%%getSlave('vlan_id_eth4', 'dns_rvp_vlan_eth4', %%vlan) == %%agriates or %%agriates == 'force') and \ + (%%vlan.dns_forward_vlan_eth4 == %%forward or %%forward == 'force') + %%vlan.vlan_network_eth4/%%calc_classe(%%vlan.vlan_netmask_eth4); + %end if + %end for + %end if + %end if + %if %%activer_route == "oui" + %for %%indirectnet in %%route_adresse + %if (%%getSlave('route_adresse', 'dns_rvp_route', %%indirectnet) == %%agriates or %%agriates == 'force') and \ + (%%indirectnet.dns_forward_route == %%forward or %%forward == 'force') + %%indirectnet/%%calc_classe(%%indirectnet.route_netmask); + %end if + %end for + %end if +%end def + + +options { + directory "/etc/bind"; + /* + * If there is a firewall between you and nameservers you want + * to talk to, you might need to uncomment the query-source + * directive below. Previous versions of BIND always asked + * questions using port 53, but BIND 8.1 uses an unprivileged + * port by default. + */ + version "MyVersion"; + // query-source address * port 53; + // *** DNS EXTERNE +%if not %%is_empty(%%adresse_ip_dns) + forwarders { + %for %%variable_iter in %%adresse_ip_dns + %%variable_iter; + %end for + }; + forward only; +%elif not %%is_empty(%%adresse_ip_dns_du_dhcp) + forwarders { + %for %%variable_iter in %%adresse_ip_dns_du_dhcp + %%variable_iter; + %end for + }; + forward only; +%end if + +listen-on {intra;}; +allow-notify {none;}; +allow-recursion {allnets;}; +allow-transfer {none;}; +allow-query {allnets;}; + +}; + +acl "allnets" { + localnets; +%if %%activer_route == 'oui' +%for %%indirectnet in %%route_adresse + %if %%indirectnet.dns_route == "oui" + %%indirectnet/%%calc_classe(%%indirectnet.route_netmask); + %end if +%end for +%end if + +%if %%is_defined('sites_dist_ip') + %for %%lans in %%sites_dist_ip + %%lans/%%calc_classe(%%lans.sites_dist_netmask); + %end for +%end if + +}; + +acl "intra" { + 127.0.0.1; +%if %%mode_conteneur_actif == 'oui' +// mode avec conteneur +%if %%activer_dns_eth0 == 'oui' +%if %%is_defined('adresse_ip_eth0_proxy_link') and %%adresse_ip_eth0_proxy_link != '' + %%adresse_ip_eth0_proxy_link; +%end if +%end if + %%container_ip_dns; +%if %%nombre_interfaces > 1 and %%is_defined('adresse_ip_eth1_proxy_link') and %%adresse_ip_eth1_proxy_link != '' + %%adresse_ip_eth1_proxy_link; +%end if +%if %%nombre_interfaces > 2 and %%is_defined('adresse_ip_eth2_proxy_link') and %%adresse_ip_eth2_proxy_link != '' + %%adresse_ip_eth2_proxy_link; +%end if +%if %%nombre_interfaces > 3 and %%is_defined('adresse_ip_eth3_proxy_link') and %%adresse_ip_eth3_proxy_link != '' + %%adresse_ip_eth3_proxy_link; +%end if +%else +// mode sans conteneur +%if %%activer_dns_eth0 == 'oui' + %%adresse_ip_eth0; +%end if +%if %%nombre_interfaces >= "2" + %%adresse_ip_eth1; +%if %%alias_eth1 == "oui" +%for %%alias_ip in %%alias_ip_eth1 + %%alias_ip; +%end for +%end if +%if %%vlan_eth1 == "oui" +%for %%vlan_id1 in %%vlan_id_eth1 + %%vlan_id1.vlan_ip_eth1; +%end for +%end if +%end if +%if %%nombre_interfaces >= "3" + %%adresse_ip_eth2; +%if %%alias_eth2 == "oui" +%for %%alias_ip in %%alias_ip_eth2 + %%alias_ip; +%end for +%end if +%if %%vlan_eth2 == "oui" +%for %%vlan_id2 in %%vlan_id_eth2 + %%vlan_id2.vlan_ip_eth2; +%end for +%end if +%end if +%if %%nombre_interfaces >= "4" + %%adresse_ip_eth3; +%if %%alias_eth3 == "oui" +%for %%alias_ip in %%alias_ip_eth3 + %%alias_ip; +%end for +%end if +%if %%vlan_eth3 == "oui" +%for %%vlan_id3 in %%vlan_id_eth3 + %%vlan_id3.vlan_ip_eth3; +%end for +%end if +%end if +%if %%nombre_interfaces >= "5" + %%adresse_ip_eth4; +%if %%alias_eth4 == "oui" +%for %%alias_ip in %%alias_ip_eth4 + %%alias_ip; +%end for +%end if +%if %%vlan_eth4 == "oui" +%for %%vlan_id4 in %%vlan_id_eth4 + %%vlan_id4.vlan_ip_eth4; +%end for +%end if +%end if +%if %%vlan_eth0 == "oui" +%for %%vlan_id0 in %%vlan_id_eth0 + %%vlan_id0.vlan_ip_eth0; +%end for +%end if +// fin mode sans conteneur +%end if +}; + +%if %%install_rvp == "oui" and %%agriates_member == "oui" and not %%is_empty(%%adresse_dns_agriates) and %%activer_zone_forward == 'oui' +view "Zones AGRIATES-FORWARD" { + match-clients { + 127.0.0.1; +%if %%mode_conteneur_actif == 'oui' + 192.0.2.0/24; +%end if +%%gen_match_clients('oui', 'oui') + }; +include "/etc/bind/agriates.zones"; +include "/etc/bind/forward.zones"; +include "/etc/bind/local.zones"; +}; +%end if + +%if %%install_rvp == "oui" and %%agriates_member == "oui" and not %%is_empty(%%adresse_dns_agriates) +view "Reseau Agriates" { + match-clients { + 127.0.0.1; +%if %%mode_conteneur_actif == 'oui' + 192.0.2.0/24; +%end if + %if %%activer_zone_forward == 'oui' +%%gen_match_clients('oui', 'non') + %else +%%gen_match_clients('oui', 'force') + %end if + }; + +include "/etc/bind/agriates.zones"; +include "/etc/bind/local.zones"; +}; +%end if + +%if %%activer_zone_forward == 'oui' +view "Zones forward" { + match-clients { + 127.0.0.1; +%if %%mode_conteneur_actif == 'oui' + 192.0.2.0/24; +%end if + %if %%install_rvp == "oui" and %%agriates_member == "oui" and not %%is_empty(%%adresse_dns_agriates) +%%gen_match_clients('non', 'oui') + %else +%%gen_match_clients('force', 'oui') + %end if + }; +include "/etc/bind/forward.zones"; +include "/etc/bind/local.zones"; +}; +%end if + +view "tous" { + match-clients { + any; + }; +include "/etc/bind/local.zones"; +include "/etc/bind/named.conf.local"; +}; diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/dictionaries/00_eole-ead-common_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/dictionaries/00_eole-ead-common_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..b345eb1a33cf476b6fcb415578610459b51a2b38 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/dictionaries/00_eole-ead-common_packages.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>python-nevow</package> + <package>python-openssl</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/dictionaries/22_ead.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/dictionaries/22_ead.xml new file mode 100644 index 0000000000000000000000000000000000000000..65b2ee6bb7ff46b82f9f0b89c8ddf2fecde933fc --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/dictionaries/22_ead.xml @@ -0,0 +1,102 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- devrait posséder un numéro supérieur à **-sso-client.xml --> + +<creole> + + <files> + <service>ead-server</service> + <service_access service='ead_server'> + <port service_accesslist='ead_server'>4201</port> + <port service_accesslist='ead_server'>4202</port> + </service_access> + <service_restriction service='ead_server'> + <ip interface='eth0' netmask='netmask_frontend_ead_distant_eth0' netmask_type='SymLinkOption' ip_type='SymLinkOption'>ip_frontend_ead_distant_eth0</ip> + <ip interface='eth1' netmask='netmask_frontend_ead_distant_eth1' netmask_type='SymLinkOption' ip_type='SymLinkOption'>ip_frontend_ead_distant_eth1</ip> + <ip interface='eth2' netmask='netmask_frontend_ead_distant_eth2' netmask_type='SymLinkOption' ip_type='SymLinkOption'>ip_frontend_ead_distant_eth2</ip> + <ip interface='eth3' netmask='netmask_frontend_ead_distant_eth3' netmask_type='SymLinkOption' ip_type='SymLinkOption'>ip_frontend_ead_distant_eth3</ip> + <ip interface='eth4' netmask='netmask_frontend_ead_distant_eth4' netmask_type='SymLinkOption' ip_type='SymLinkOption'>ip_frontend_ead_distant_eth4</ip> + </service_restriction> + <service servicelist='ead_web'>ead-web</service> + <service_access service='ead_web'> + <port>4200</port> + <port port_type='SymLinkOption'>port_ead_reverseproxy</port> + </service_access> + <service_restriction service='ead_web'> + <ip interface='eth0' netmask='netmask_admin_eth0' netmask_type='SymLinkOption' ip_type='SymLinkOption'>ip_admin_eth0</ip> + <ip interface='eth1' netmask='netmask_admin_eth1' netmask_type='SymLinkOption' ip_type='SymLinkOption'>ip_admin_eth1</ip> + <ip interface='eth2' netmask='netmask_admin_eth2' netmask_type='SymLinkOption' ip_type='SymLinkOption'>ip_admin_eth2</ip> + <ip interface='eth3' netmask='netmask_admin_eth3' netmask_type='SymLinkOption' ip_type='SymLinkOption'>ip_admin_eth3</ip> + <ip interface='eth4' netmask='netmask_admin_eth4' netmask_type='SymLinkOption' ip_type='SymLinkOption'>ip_admin_eth4</ip> + </service_restriction> + <file name="/var/lib/eole/config/ead.cfg"/> + </files> + + <variables> + <family name='services'> + <variable name='activer_ead_web' type='oui/non' description="Activer l'interface web de l'EAD" mode="expert"> + <value>oui</value> + </variable> + <variable name='acces_distant_backend_ead' type='oui/non' description="Autoriser l'utilisation du backend EAD par des frontend EAD distants"/> + </family> + <family name='ead-web' mode='expert' icon='gear'> + <variable name='activer_ead_reverseproxy' type='oui/non' description="Activer l'interface web de l'EAD sur un second port"> + <value>non</value> + </variable> + <variable name='port_ead_reverseproxy' type='port' description="Port d'accès EAD personnalisé"> + <value>4203</value> + </variable> + </family> + <family name='eole sso'> + <variable name='ead_sso' type='oui/non' description="Utiliser l'authentification SSO pour l'EAD" mode='expert'> + <value>oui</value> + </variable> + </family> + </variables> + + <constraints> + <auto name='calc_multi_condition' target='acces_distant_backend_ead'> + <param>non</param> + <param type='eole' name='condition_0'>frontend_ead_distant_eth0</param> + <param type='eole' name='condition_1' hidden='False'>frontend_ead_distant_eth1</param> + <param type='eole' name='condition_2' hidden='False'>frontend_ead_distant_eth2</param> + <param type='eole' name='condition_3' hidden='False'>frontend_ead_distant_eth3</param> + <param type='eole' name='condition_4' hidden='False'>frontend_ead_distant_eth4</param> + <param name='match'>non</param> + <param name='mismatch'>oui</param> + </auto> + <condition name='disabled_if_in' source='activer_ead_web'> + <param>non</param> + <target type='servicelist'>ead_web</target> + <target type='family'>ead-web</target> + </condition> + <condition name='disabled_if_in' source='activer_firewall'> + <param>non</param> + <target type='variable'>acces_distant_backend_ead</target> + </condition> + <condition name='disabled_if_in' source='acces_distant_backend_ead'> + <param>non</param> + <target type='service_accesslist'>ead_server</target> + </condition> + <condition name='disabled_if_in' source='activer_ead_reverseproxy'> + <param>non</param> + <target type='variable'>port_ead_reverseproxy</target> + </condition> + <condition name='disabled_if_in' source='activer_sso' fallback='True'> + <param>non</param> + <target type='variable'>ead_sso</target> + </condition> + <check name="valid_differ" target="port_ead_reverseproxy"> + <param>4200</param> + </check> + </constraints> + + <help> + <family name='ead-web'>Paramétrage avancé de l'interface web EAD</family> + <variable name='acces_distant_backend_ead'>Ouverture des ports 4201 et 4202 pour permettre à un frontend EAD distant d'utiliser le backend EAD de ce serveur</variable> + <variable name='activer_ead_web'>L'EAD est une interface simplifiée de gestion du serveur</variable> + <variable name='activer_ead_reverseproxy'>Ce second port peut, par exemple, permettre d'accéder à l'interface depuis l'extérieur si un proxy inverse est utilisé</variable> + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/dictionaries/24_ead_distant.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/dictionaries/24_ead_distant.xml new file mode 100644 index 0000000000000000000000000000000000000000..64c484e3e04710a299cf980dd6395785f75e5105 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/dictionaries/24_ead_distant.xml @@ -0,0 +1,125 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files/> + + <variables> + <family name='Interface-0'> + <variable name='frontend_ead_distant_eth0' type='oui/non' description="Autoriser l'accès au backend EAD depuis des frontend EAD distants" mode='expert'> + <value>non</value> + </variable> + <variable name='ip_frontend_ead_distant_eth0' type='network' description="Adresse IP réseau autorisée à accéder au backend EAD" multi='True' mandatory='True'/> + <variable name='netmask_frontend_ead_distant_eth0' type='netmask' description="Masque du sous réseau autorisé à accéder au backend EAD" mandatory='True'/> + </family> + <family name='Interface-1'> + <variable name='frontend_ead_distant_eth1' type='oui/non' description="Autoriser l'accès au backend EAD depuis des frontend EAD distants" mode='expert'> + <value>non</value> + </variable> + <variable name='ip_frontend_ead_distant_eth1' type='network' description="Adresse IP réseau autorisée à accéder au backend EAD" multi='True' mandatory='True'/> + <variable name='netmask_frontend_ead_distant_eth1' type='netmask' description="Masque du sous réseau autorisé à accéder au backend EAD" mandatory='True'/> + </family> + <family name='Interface-2'> + <variable name='frontend_ead_distant_eth2' type='oui/non' description="Autoriser l'accès au backend EAD depuis des frontend EAD distants" mode='expert'> + <value>non</value> + </variable> + <variable name='ip_frontend_ead_distant_eth2' type='network' description="Adresse IP réseau autorisée à accéder au backend EAD" multi='True' mandatory='True'/> + <variable name='netmask_frontend_ead_distant_eth2' type='netmask' description="Masque du sous réseau autorisé à accéder au backend EAD" mandatory='True'/> + </family> + <family name='Interface-3'> + <variable name='frontend_ead_distant_eth3' type='oui/non' description="Autoriser l'accès au backend EAD depuis des frontend EAD distants" mode='expert'> + <value>non</value> + </variable> + <variable name='ip_frontend_ead_distant_eth3' type='network' description="Adresse IP réseau autorisée à accéder au backend EAD" multi='True' mandatory='True'/> + <variable name='netmask_frontend_ead_distant_eth3' type='netmask' description="Masque du sous réseau autorisé à accéder au backend EAD" mandatory='True'/> + </family> + <family name='Interface-4'> + <variable name='frontend_ead_distant_eth4' type='oui/non' description="Autoriser l'accès au backend EAD depuis des frontend EAD distants" mode='expert'> + <value>non</value> + </variable> + <variable name='ip_frontend_ead_distant_eth4' type='network' description="Adresse IP réseau autorisée à accéder au backend EAD" multi='True' mandatory='True'/> + <variable name='netmask_frontend_ead_distant_eth4' type='netmask' description="Masque du sous réseau autorisé à accéder au backend EAD" mandatory='True'/> + </family> + + <separators> + <separator name='frontend_ead_distant_eth0'>Configuration de l'accès au backend EAD</separator> + <separator name='frontend_ead_distant_eth1'>Configuration de l'accès au backend EAD</separator> + <separator name='frontend_ead_distant_eth2'>Configuration de l'accès au backend EAD</separator> + <separator name='frontend_ead_distant_eth3'>Configuration de l'accès au backend EAD</separator> + <separator name='frontend_ead_distant_eth4'>Configuration de l'accès au backend EAD</separator> + </separators> + + </variables> + + <constraints> + + <check name="valid_networknetmask" target="netmask_frontend_ead_distant_eth0"> + <param type='eole'>ip_frontend_ead_distant_eth0</param> + </check> + <condition name='disabled_if_in' source='frontend_ead_distant_eth0'> + <param>non</param> + <target type='variable'>ip_frontend_ead_distant_eth0</target> + <target type='variable'>netmask_frontend_ead_distant_eth0</target> + </condition> + <check name="valid_networknetmask" target="netmask_frontend_ead_distant_eth1"> + <param type='eole'>ip_frontend_ead_distant_eth1</param> + </check> + <condition name='disabled_if_in' source='frontend_ead_distant_eth1'> + <param>non</param> + <target type='variable'>ip_frontend_ead_distant_eth1</target> + <target type='variable'>netmask_frontend_ead_distant_eth1</target> + </condition> + <check name="valid_networknetmask" target="netmask_frontend_ead_distant_eth2"> + <param type='eole'>ip_frontend_ead_distant_eth2</param> + </check> + <condition name='disabled_if_in' source='frontend_ead_distant_eth2'> + <param>non</param> + <target type='variable'>ip_frontend_ead_distant_eth2</target> + <target type='variable'>netmask_frontend_ead_distant_eth2</target> + </condition> + <check name="valid_networknetmask" target="netmask_frontend_ead_distant_eth3"> + <param type='eole'>ip_frontend_ead_distant_eth3</param> + </check> + <condition name='disabled_if_in' source='frontend_ead_distant_eth3'> + <param>non</param> + <target type='variable'>ip_frontend_ead_distant_eth3</target> + <target type='variable'>netmask_frontend_ead_distant_eth3</target> + </condition> + <check name="valid_networknetmask" target="netmask_frontend_ead_distant_eth4"> + <param type='eole'>ip_frontend_ead_distant_eth4</param> + </check> + <condition name='disabled_if_in' source='frontend_ead_distant_eth4'> + <param>non</param> + <target type='variable'>ip_frontend_ead_distant_eth4</target> + <target type='variable'>netmask_frontend_ead_distant_eth4</target> + </condition> + + <group master='ip_frontend_ead_distant_eth0'> + <slave>netmask_frontend_ead_distant_eth0</slave> + </group> + <group master='ip_frontend_ead_distant_eth1'> + <slave>netmask_frontend_ead_distant_eth1</slave> + </group> + <group master='ip_frontend_ead_distant_eth2'> + <slave>netmask_frontend_ead_distant_eth2</slave> + </group> + <group master='ip_frontend_ead_distant_eth3'> + <slave>netmask_frontend_ead_distant_eth3</slave> + </group> + <group master='ip_frontend_ead_distant_eth4'> + <slave>netmask_frontend_ead_distant_eth4</slave> + </group> + + </constraints> + + <help> + <variable name='frontend_ead_distant_eth0'>Ouverture des ports 4201 et 4202 depuis l'interface 0</variable> + <variable name='frontend_ead_distant_eth1'>Ouverture des ports 4201 et 4202 depuis l'interface 1</variable> + <variable name='frontend_ead_distant_eth2'>Ouverture des ports 4201 et 4202 depuis l'interface 2</variable> + <variable name='frontend_ead_distant_eth3'>Ouverture des ports 4201 et 4202 depuis l'interface 3</variable> + <variable name='frontend_ead_distant_eth4'>Ouverture des ports 4201 et 4202 depuis l'interface 4</variable> + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/files/etc/cron.daily/eole-ead b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/files/etc/cron.daily/eole-ead new file mode 100644 index 0000000000000000000000000000000000000000..c3ac64aebe0ca493b69f0a23ff6e2aa15ec0019a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/files/etc/cron.daily/eole-ead @@ -0,0 +1,7 @@ +#!/bin/bash +# Nettoyage du répertoire : /usr/share/ead2/backend/tmp/importation (#7374) +EXTENSIONS="csv xml register zip" +DIRECTORY="/usr/share/ead2/backend/tmp/importation" +for EXT in $EXTENSIONS;do + find $DIRECTORY -maxdepth 1 -name "*.$EXT" -ctime +7 -delete &>/dev/null +done diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/files/usr/share/ead2/__init__.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/files/usr/share/ead2/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..9eb8ceba13542da181610c99874d8e2fa7bce9d2 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/files/usr/share/ead2/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: UTF-8 -*- + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/files/usr/share/ead2/config/__init__.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/files/usr/share/ead2/config/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..9eb8ceba13542da181610c99874d8e2fa7bce9d2 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/files/usr/share/ead2/config/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: UTF-8 -*- + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/files/usr/share/ead2/config/config.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/files/usr/share/ead2/config/config.py new file mode 100644 index 0000000000000000000000000000000000000000..c1cc94867e38b7cdebdde06d87ad60d794a34a24 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/files/usr/share/ead2/config/config.py @@ -0,0 +1,75 @@ +# -*- coding: UTF-8 -*- + +# répertoire de l'application ead +import os.path as osp +from sys import exit +from creole.eosfunc import is_installed +from ConfigParser import ConfigParser + +CONFIG_FILE = '/var/lib/eole/config/ead.cfg' + +if not osp.isfile(CONFIG_FILE): + print("Fichier de configuration non existant") + exit(0) + +cfg = ConfigParser(allow_no_value=True) +cfg.read(CONFIG_FILE) + +HERE = osp.dirname(__file__) +EAD_DIR = osp.normpath(osp.join(HERE, '..')) + +ip_locale = cfg.get('eole', 'adresse_ip_eth0') +AUTH_SERVER_ADDR = cfg.get('ead', 'auth_server_addr') +AUTH_FORM_PORT = cfg.get('ead', 'auth_form_port') +AUTH_FORM_URL = cfg.get('ead', 'auth_form_url') +AUTH_SERVER = cfg.get('ead', 'auth_server') +REVERSEPROXY_PORT = cfg.get('ead', 'reverseproxy_port') +SSL_dir = cfg.get('ead', 'SSL_dir') +certname = cfg.get('ead', 'certname') +cert_file = cfg.get('ead', 'cert_file') +key_file = cfg.get('ead', 'key_file') + +MAGIC_NUMBER_TIMEOUT = cfg.getint('ead', 'magic_number_timeout') +EXPIRED_SESSION_TIMEOUT = cfg.getint('ead', 'expired_session_timeout') +LIGHTSQUID_INSTALLED = cfg.getboolean('lightsquid', 'lightsquid_installed') +LIGHTSQUID_TIMEOUT = cfg.getint('lightsquid', 'lightsquid_timeout') +LIGHTSQUID_PORT = cfg.getint('lightsquid', 'lightsquid_port') +LIGHTSQUID_AUTO = cfg.getboolean('lightsquid', 'lightsquid_auto') +SQUID_AUTH = cfg.getboolean('proxy', "squid_auth") +SQUID2_ACTIVATE = cfg.getboolean('proxy', "squid2_activate") +BACKEND_LISTEN_PORT = cfg.getint('ead', 'backend_listen_port') +#Port d'ecoute du serveur de fichier +EADFILE_LISTEN_PORT = cfg.getint('ead', 'eadfile_listen_port') +EADFILE_URL = cfg.get('ead', 'eadfile_url') +DHCP_PATH = cfg.get('eole', 'container_path_dhcp') +DHCP_ACTIVATION_EAD3 = cfg.get('eole', 'dhcp_activation_ead3') +CUPS_ACTIVATE = cfg.getboolean('cups', 'cups_activate') +CUPS_ADDRESS = cfg.get('cups', 'cups_address') +CONTAINER_IP_FICHIER = cfg.get('eole', 'container_ip_fichier') +CONTAINER_PATH_FICHIER = cfg.get('eole', 'container_path_fichier') +CONTAINER_PATH_PROXY = cfg.get('eole', 'container_path_proxy') +NOM_ACADEMIE = cfg.get('eole', 'nom_academie') +LIBELLE_ETAB = cfg.get('eole', 'libelle_etab') +EOLE_MODULE = cfg.get('eole', 'eole_module') +EOLE_VERSION = cfg.get('eole', 'eole_version') +SUFFIXE_DOMAINE_ACADEMIQUE = cfg.get('eole', 'suffixe_domaine_academique') +SCHEDULE_CUSTOMIZE_TASKS = cfg.get('eole', 'schedule_customize_tasks') +BAREOS_SD_INSTALLED = cfg.getboolean('backup', 'bareos_sd_installed') +BAREOS_SD_ACTIVATE = cfg.getboolean('backup', 'bareos_sd_activate') +BAREOS_DIR_ACTIVATE = cfg.getboolean('backup', 'bareos_dir_activate') +BLACKLIST_INSTALLED = cfg.getboolean('proxy', 'blacklist_installed') +ANTIVIRUS_SAMBA = cfg.getboolean('fichier', 'antivirus_samba') +SYNCHRO_AAF = cfg.get('fichier', 'synchro_aaf') +NFS_ACTIVATE = cfg.getboolean('fichier', 'nfs_activate') +CLIENT_LTSP_INSTALLED = cfg.getboolean('fichier', 'client_ltsp_installed') +SMB_MIN_PASSWORD_LENGTH = cfg.get('fichier', 'smb_min_password_length') +SMB_MIN_PASSWORD_CLASS = cfg.get('fichier', 'smb_min_password_class') +# FIXME: utilisation de eth1 sur AmonEcole (#2726) +FICHIER_LINK_INTERFACE = cfg.get('fichier', 'fichier_link_interface') +DOMAIN_FICHIER_LINK_INTERFACE = cfg.get('fichier', 'domain_fichier_link_interface') +DANSGUARDIAN_EAD_FILTRE1 = cfg.get('proxy', 'dansguardian_ead_filtre1') +DANSGUARDIAN_EAD_FILTRE2 = cfg.get('proxy', 'dansguardian_ead_filtre2') +DANSGUARDIAN_EAD_FILTRE3 = cfg.get('proxy', 'dansguardian_ead_filtre3') +services_name = cfg.get('eole', 'services_name').split() +services_container = cfg.get('eole', 'services_container').split() +SERVICES = set(zip(services_name, services_container)) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/files/usr/share/ead2/lib/__init__.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/files/usr/share/ead2/lib/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..0fc1f6da4423817c9cdcb943d1f099ba88dc377b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/files/usr/share/ead2/lib/__init__.py @@ -0,0 +1,6 @@ +# -*- coding: UTF-8 -*- +""" + +librairies communes au backend et au frontend + +""" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/files/usr/share/ead2/lib/certs/server.pem b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/files/usr/share/ead2/lib/certs/server.pem new file mode 100644 index 0000000000000000000000000000000000000000..ddc5e69aaae48b5b0487dc7281f39fcd608ff241 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/files/usr/share/ead2/lib/certs/server.pem @@ -0,0 +1,30 @@ +SubjectAltName=antislash.eole.lan +-----BEGIN CERTIFICATE----- +MIICGTCCAYICAQAwDQYJKoZIhvcNAQEEBQAwVTELMAkGA1UEBhMCRlIxDTALBgNV +BAoTBGdvdXYxEjAQBgNVBAsTCWVkdWNhdGlvbjEUMBIGA1UECxMLYWMtZGlqb24u +ZnIxDTALBgNVBAMTBEVvbGUwHhcNMDUxMTIyMTUzMDQ1WhcNMTAxMDI3MTUzMDQ1 +WjBVMQswCQYDVQQGEwJGUjENMAsGA1UEChMEZ291djESMBAGA1UECxMJZWR1Y2F0 +aW9uMRQwEgYDVQQLEwthYy1kaWpvbi5mcjENMAsGA1UEAxMERW9sZTCBnzANBgkq +hkiG9w0BAQEFAAOBjQAwgYkCgYEA9V7WQRSyMvnpnclYkIv4D04JhvZOJ9PPLWpC +jyZEGMl1mkA/JRqHLzS24fmSjnzTPT/kj0hVgygbmrH7OXf6GtBIR/t1PKQgyAQn +fH/m75gmqbp9bHPZldkmbu6CuiKKfox9mr+sUqleyO0b/GqijhElIdYDSKg7QNYX +A4/DkJUCAwEAATANBgkqhkiG9w0BAQQFAAOBgQBPyqFUJx0INm41UkVro4qsRbMu +W8/+CoxHSPnAIbq57eu+pdn+CHuoULIwESirfb74umbjQbFHlLAn/9c8APGd51I+ +0GzTwhOej9YICs9+UC4JNuaz5aNCxEOLZc9QOqZXsZVuvwDft3YKycJXrUg6jasI +dnGo4h+yUQM+X9CiMw== +-----END CERTIFICATE----- +-----BEGIN RSA PRIVATE KEY----- +MIICXQIBAAKBgQD1XtZBFLIy+emdyViQi/gPTgmG9k4n088takKPJkQYyXWaQD8l +GocvNLbh+ZKOfNM9P+SPSFWDKBuasfs5d/oa0EhH+3U8pCDIBCd8f+bvmCapun1s +c9mV2SZu7oK6Iop+jH2av6xSqV7I7Rv8aqKOESUh1gNIqDtA1hcDj8OQlQIDAQAB +AoGBALy0fQ58PjgaH2LsEKLKIrKSj50uHBlhOjpxOFMjWMe/WCSTOHzuk/zoC6Zq +7B2NPmAinULcnHdMBz7HlrAx5zPqYpkkC3RsLs2Cf+ID385Umv9Jx7n3Vw8zE61w +1Kx9reUnAKeup5mb3mTG9Vh8rQfCXnVF7HuxifKP3zg4GyFZAkEA/oL5P44J9GVK +O8GTSMP862uIJj0MTrVCR5ThlGoPsBpAkX6af5AJKWWrHWu7f/qg7moqD06sDlKh +HVVyR/c6mwJBAPbOLZ1VbHLTtdmjzZYBi9w24/7RPA6qneV7Z4UOKmETbnD3OfQH +PNsAeltgAW/nuoJ2GKLt2xhZ6LhpbvLgvI8CQGbxevdl8EjWH2yEI5qvC0H9wJgW +4T+EuUZSxdtN+wJz2+H9n2gxTkNcSBYiWTiumyFT96cxXw58BYbj5NGPAjkCQQDr +YihO7bHIsfG16GuirUbed9tqo9NLiZ2dx9wrIh95BjdGtgMnod+AXyxTCXVVbQSM +eGV2vrM+vkEd4DBYo84xAkAnMnTytpbKnt1UL2gwPRosYg547wcKTIudGlTfiGV4 +EtqaXbTe9IEezCYROm1nZutMmM/mzaU78cYOqMXWz+pL +-----END RSA PRIVATE KEY----- diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/files/usr/share/ead2/lib/crypto.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/files/usr/share/ead2/lib/crypto.py new file mode 100644 index 0000000000000000000000000000000000000000..89ffa8dbac87af7a669243cfb050a1d832c77597 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/files/usr/share/ead2/lib/crypto.py @@ -0,0 +1,16 @@ +#-*-coding:utf-8-*- +""" + Fonction de cryptage +""" +try: + from hashlib import sha1 as sha +except ImportError: + from sha import sha +from time import time + +def create_key(cle1, cle2): + """ + génère une clé aléatoire + """ + quote = '%s%s%s' % (int(time()), cle1, cle2) + return sha(quote).hexdigest() diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/files/usr/share/ead2/lib/error.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/files/usr/share/ead2/lib/error.py new file mode 100644 index 0000000000000000000000000000000000000000..10fcf33f9967686843bfddedda48cd7afe82b26e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/files/usr/share/ead2/lib/error.py @@ -0,0 +1,49 @@ +# -*- coding: UTF-8 -*- +""" +Module contenant les erreurs de l'ead +""" +from ead2.backend.actions.tools import forbidden_pwd_chars + +# Définition des exceptions pour les listes d'objets +class UnknownServer(Exception): + pass + +class ExistingServer(Exception): + pass + +## utilisé dans les actions +class MissingKey(Exception): + """ Il manque une clé dans un retour de formulaire """ + pass + +class MissingValue(Exception): + """ Une valeur n'est pas renseignée """ + pass + +class BadPassword(Exception): + """ Un mot de passe est mal formé """ + message = "Erreur : le mot de passe ne doit pas contenir d'espace." + +class BadLogin(Exception): + """ Un login est mal formé """ + message = "Erreur : le login ne doit contenir que les caratères de a à z, de 0 à 9 et -_ ." + +class BadShareName(Exception): + """ Un nom de partage est mal formé """ + message = "Erreur : le nom du partage ne doit contenir que les caratères de a à z, de 0 à 9 et -_ ." + +class BadGroupName(Exception): + """ Un nom de groupe est mal formé """ + message = "Erreur : le nom du groupe ne doit contenir que les caratères de a à z, de 0 à 9 et -_ ." + +class BadDriveLetter(Exception): + """ Une lettre de lecteur mal formée """ + message = "Erreur : lettre de lecteur mal formé (ex: k:)." + +class BadPath(Exception): + """ un chemin de fichier mal formé """ + message = "Erreur : le chemin ne doit contenir que les caratères de a à z, de 0 à 9 et -_/ ." + +class TemplateError(Exception): + pass + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/files/usr/share/ead2/lib/i18n_backend.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/files/usr/share/ead2/lib/i18n_backend.py new file mode 100644 index 0000000000000000000000000000000000000000..88d8eff12fd0006326db1d19113c5227d1c5b53b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/files/usr/share/ead2/lib/i18n_backend.py @@ -0,0 +1,47 @@ +# -*- coding: UTF-8 -*- +""" + +internationalisation ead 2 + +""" + +import gettext +from ead2.backend.config.config import I18N_DIR, APP_NAME +from os import listdir + +LANGUAGE_PACK = {} +languages = [d for d in listdir(I18N_DIR) if d != '.svn'] +languages.append('us') +for lang in languages: + LANGUAGE_PACK[lang] = gettext.translation( + domain=APP_NAME, + localedir=I18N_DIR, + languages=[lang], + fallback=True, + ) + +gettext.bindtextdomain (APP_NAME, I18N_DIR) +gettext.textdomain (APP_NAME) +def _(msg, language=None): + if language == None or not LANGUAGE_PACK.has_key(language): + return gettext.gettext(msg) + else: + return LANGUAGE_PACK[language].gettext(msg) + + + + +#def enable_i18n(): +# gettext.bindtextdomain (APP_NAME, I18N_DIR) +# gettext.textdomain (APP_NAME) +# # installons la fonction _() dans les builtins +# #gettext.install (APP_NAME, I18N_DIR, unicode=1) +# gettext.install (APP_NAME, I18N_DIR) +# # si _() n'est pas présent, on la remplace par str +# if not '_' in globals().keys(): +# globals()['_'] = str + +# on lance la commande +#enable_i18n() + + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/files/usr/share/ead2/lib/i18n_frontend.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/files/usr/share/ead2/lib/i18n_frontend.py new file mode 100644 index 0000000000000000000000000000000000000000..52ce8e1ff833b13dda4a34bfb3fd0cd4119701c4 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/files/usr/share/ead2/lib/i18n_frontend.py @@ -0,0 +1,12 @@ +# -*- coding: UTF-8 -*- +""" + +internationalisation ead 2 + +""" + +from nevow.i18n import Translator + +_ = Translator(gettextFunction='gettext') + + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/files/usr/share/ead2/lib/i18n_frontend_console.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/files/usr/share/ead2/lib/i18n_frontend_console.py new file mode 100644 index 0000000000000000000000000000000000000000..d775304404a62d36827981d32e6cfcb826a99c4b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/files/usr/share/ead2/lib/i18n_frontend_console.py @@ -0,0 +1,24 @@ +# -*- coding: UTF-8 -*- +""" + +internationalisation ead 2 + +""" + +import gettext + +from ead2.frontend.config.config import I18N_DIR, APP_NAME + + +def enable_i18n(): + gettext.bindtextdomain (APP_NAME, I18N_DIR) + gettext.textdomain (APP_NAME) + # installons la fonction _() dans les builtins + gettext.install (APP_NAME, I18N_DIR, unicode=1) + # si _() n'est pas présent, on la remplace par str + if not '_' in globals().keys(): + globals()['_'] = str + + +# on lance la commande +enable_i18n() diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/files/usr/share/ead2/lib/libbackend.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/files/usr/share/ead2/lib/libbackend.py new file mode 100644 index 0000000000000000000000000000000000000000..223dededb5faae7023531f646158c007cb275acd --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/files/usr/share/ead2/lib/libbackend.py @@ -0,0 +1,119 @@ +# -*- coding: UTF-8 -*- +import PAM + + +class PamAuth(): + """AUTHENTIFICATION PAM + """ + def __init__(self, service='passwd'): + self.service = service + self.auth = PAM.pam() + + def pam_conv(self, auth, query_list, userData): + """fonction de dialogue avec la lib_pam""" + resp = [] + for i in range(len(query_list)): + query, type = query_list[i] + if type == PAM.PAM_PROMPT_ECHO_ON: + val = raw_input(query) + resp.append((val, 0)) + elif type == PAM.PAM_PROMPT_ECHO_OFF: + resp.append((self.passwd, 0)) + elif type == PAM.PAM_PROMPT_ERROR_MSG or type == PAM.PAM_PROMPT_TEXT_INFO: + print query + resp.append(('', 0)) + else: + return None + return resp + + def authenticate(self, user, passwd): + self.auth.start(self.service) + self.passwd = passwd + if user != None: + self.auth.set_item(PAM.PAM_USER, user) + self.auth.set_item(PAM.PAM_CONV, self.pam_conv) + try: + self.auth.authenticate() + self.auth.acct_mgmt() + self.passwd = None + except PAM.error, resp: + return False + except: + print 'Internal error' + return False + else: + return True + +from ConfigParser import ConfigParser + +class PasswordParser(ConfigParser): + """ + AUTHENTIFICATION PAR FICHIER DE MOTS DE PASSE + Utilisé pour parser un fichier passwd.ini + + [password] + user1=password1 + + """ + + + def parse_file(self, filename): + """ + charge les login/mdp depuis un fichier + """ + self.read(filename) + + def get_passwd_dict(self): + """ + renvoi les couples login/mdp cryptes + """ + self._passwd = {} + for login, passwd in self.items('password'): + self._passwd[login]=passwd + + return self._passwd + + def write_file(self, filename, dict): + """ + ecrit les valeurs dans le fichier de configuration + """ + for login, passwd in dict.items(): + self.set('password',login, passwd) + try: + fd = file(filename,'w') + self.write(fd) + fd.close() + except: + return False + + return True + + +def clean_color_codes(chaine): + """ + enleve les caracteres de couleur de la chaine (spécifique aux terminaux) + FIXME: rajouter des couleurs + """ + win_new_line = chr(13)+chr(10) + colors = [ + + "[65G", + "[1;31m",#rouge + "[1;32m",#vert + "[1;33m",#jaune + "[1;34m", + "[1;35m", + "[1;36m", + "[1;37m",#blanc + "[0;39m",#retour normal? + "E", #retour ligne? + "[70G", + "[60G", + "[", #a garder en dernier pour dernier recourt (on gardera peut etre des caracteres en trop mais ca passera) + "" #a garder en dernier pour dernier recourt (on gardera peut etre des caracteres en trop mais ca passera) + ] + #pour chaque code de couleur, on le remplace par une chaine vide + for col in colors: + chaine = chaine.replace(col,'') + chaine=chaine.replace(win_new_line,'\n') + return chaine diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/files/usr/share/ead2/lib/libead.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/files/usr/share/ead2/lib/libead.py new file mode 100644 index 0000000000000000000000000000000000000000..03dafbbc489eed8bf1c61e45124f8714270bb584 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/files/usr/share/ead2/lib/libead.py @@ -0,0 +1,127 @@ +# -*- coding: UTF-8 -*- +""" +utilitaires ead +""" +from ConfigParser import ConfigParser + +class EadKeyParser(ConfigParser): + """ + Utilisé pour parser un fichier de type key.ini + (fichier qui definit les clés/adresses ip autorisées) + """ + + def parse_file(self, filename): + """ + charge les ips/clés depuis un fichier + """ + self.read(filename) + + def get_key_dict(self): + """ + renvoi les couples ip/clé + """ + self._keys = {} + for ip, key in self.items('keys'): + self._keys[ip] = key + + return self._keys + + def write_file(self, filename, dict): + """ + ecrit les valeurs dans le fichier de configuration + """ + for option in self.options('keys'): + # on supprime tout + self.remove_option('keys', option) + for ip, key in dict.items(): + # on rentre le dico + self.set('keys', ip, key) + try: + # on enregistre + fd = file(filename, 'w') + self.write(fd) + fd.close() + except: + return False + + return True + +def uni(ch): + if not isinstance(ch, unicode): + try: + return ch.decode('utf-8') + except: + try: + a = ch.decode('iso-8859-1') + a.encode('utf-8') + return a + except: + return ch + else: + return ch + +def encode_str(string): + """ encode une string ou un unicode en utf8 et vérifie la présence de caractères interdits + """ + if contains_bad_chars(string, chars=["<", ">", '"']): + raise Exception, "Erreur : caractères interdits dans certains champs de saisie (<, >, \\\" et ')." + try: + string = string.encode('utf8') + except: + pass + return string + +def contains_bad_chars(content, chars=["<", ">", "'", '"']): + """ prévient si une chaine contient certains caractères + """ + for char in chars: + if char in content: + return True + return False + +def parcour_list(_list, str_fct=encode_str): + """ + parcour une liste afin d'appliquer la fonction str_fct + à toutes les strings présentes + """ + encoded_list = [] + for element in _list: + if type(element) == str: + encoded_list.append(str_fct(element)) + elif type(element) == dict: + encoded_list.append(parcour_dico(element, str_fct)) + elif type(element) == list: + encoded_list.append(parcour_list(element, str_fct)) + elif type(element) == unicode: + encoded_list.append(str_fct(element)) + return encoded_list + +def test_bad_chars(content_string): + return content_string == filter_bad_chars(content_string, chars=[" ", "'", '"']) + +def parcour_dico(dico, str_fct=encode_str): + """ + parcour un dico afin d'appliquer la fonction str_fct + à toutes les strings présentes + """ + for key in dico.keys(): + if type(dico[key]) in (str, unicode): + if key == 'value' and dico.get('name', "vide") in ('password', 'repassword', 'old_password', 'input_password'): + if contains_bad_chars(dico[key], chars=[" ", "'", '"']): + raise Exception, "Erreur : caractères interdits dans le mot de passe." + # FIX pour #10324 + elif key == 'value' and dico.get('name', "vide") in ('forname', 'name', 'displayName', 'addsite'): + if contains_bad_chars(dico[key], chars=["<", ">", '"']): + raise Exception, "Erreur : caractères interdits dans certains champs de saisie (<, > et \\\")." + try: + # retour de l'encodage #10741 + dico[key] = dico[key].encode('utf8') + except: + pass + else: + dico[key] = str_fct(dico[key]) + elif type(dico[key]) == dict: + dico[key] = parcour_dico(dico[key], str_fct) + elif type(dico[key]) == list: + dico[key] = parcour_list(dico[key], str_fct) + return dico diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/files/usr/share/ead2/lib/libfrontend.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/files/usr/share/ead2/lib/libfrontend.py new file mode 100644 index 0000000000000000000000000000000000000000..263af7b55d80ce0c2e8fb1713f97531ea07cfa24 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/files/usr/share/ead2/lib/libfrontend.py @@ -0,0 +1,100 @@ +#-*-coding: UTF-8-*- +""" + Librairies utilisées par le frontend ead: + ServerParser : interface pour les fichiers .ini des serveurs + +""" +from pyeole.dict4ini import DictIni +from ead2.lib.error import UnknownServer, ExistingServer +from ead2.config.config import BACKEND_LISTEN_PORT + +SERVER_ID_NOT_FOUND = "Le serveur d'id %s n'a pas pu être retrouvé." +SERVER_ID_EXISTS = "Un serveur : \"%s:%s\" est déjà enregistré." + +class ServerParser(DictIni): + """ + utilisé pour parser un fichier servers.ini + (fichier qui definit les serveurs sur lequel un front-end peut se connecter + """ + + def __init__(self, filename): + DictIni.__init__(self, filename) + self._servers = {} + + def add_server(self, url, port, comment, key): + """ + enregistre un nouveau serveur + """ + servs = self.get_server() + for serv in servs.values(): + if serv[0] == url and str(serv[1]) == str(port): + raise ExistingServer(SERVER_ID_EXISTS % (url, port)) + cle = str(len(servs) + 1) + servs[cle] = (url, port, comment, key) + self.save_conf(servs) + + def del_server(self, id_serv): + """ + supprime un serveur + """ + servs = self.get_server() + try: + del(servs[id_serv]) + except KeyError: + raise(UnknownServer(SERVER_ID_NOT_FOUND % id_serv)) + server_keys = servs.keys() + server_keys.sort() + dico_tmp = {} + #on va maintenant mettre a jour les indices des serveurs dans le dico + #si on a les serveurs 1, 2 et 3, et qu'on supprime le 2, on veut que 3 devienne 2 + for key in server_keys: + cle = str(server_keys.index(key)+1) + dico_tmp[cle] = servs[key] + self.save_conf(dico_tmp) + + def get_server(self, id_serv = None): + """ + renvoie les informations sur un serveur + """ + if not self._servers: + for idserv, _config in self.items(): + if idserv.isdigit(): + url = _config.get('url') + port = _config.get('port', "pasdeport") + if port.isdigit(): + port = int(port) + else: + port = BACKEND_LISTEN_PORT + comment = _config.get('comment', "Aucune information") + key = _config.get('key') + self._servers.setdefault(idserv, (url, port, comment, key)) + if id_serv != None: + if not self._servers.has_key(id_serv): + raise(UnknownServer(SERVER_ID_NOT_FOUND % id_serv)) + else: + return self._servers[id_serv] + else: + return self._servers + + def save_conf(self, dico): + """ + ecrit le fichier de serveurs + on efface tout pour remettre les bons ids aux serveurs + ( 1,2,3 , je supprime 2, je veux 1 et 2 ) + """ + if self is not {}: + for section in self.keys(): + del(self[section]) + for serv_id, config in dico.items(): + url, port, comment, key = config + self.setdefault(serv_id, {}) + self[serv_id]['url'] = url + self[serv_id]['port'] = str(port) + self[serv_id]['comment'] = comment + self[serv_id]['key'] = key + try: + self.save() + self.read() + return True + except: + return False diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/files/usr/share/ead2/lib/libsecure.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/files/usr/share/ead2/lib/libsecure.py new file mode 100644 index 0000000000000000000000000000000000000000..ba0215a1b585bf17c57fa1badd970b81ea13b6cd --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/files/usr/share/ead2/lib/libsecure.py @@ -0,0 +1,50 @@ +# -*- coding: UTF-8 -*- +import xmlrpclib +from OpenSSL import SSL, crypto +from OpenSSL import crypto +from os.path import join, dirname +from ead2.config.config import cert_file, key_file + + +# transport sécurisé utilisant un certificat +class TransportEole(xmlrpclib.SafeTransport): + + def make_connection(self, host): + # create a HTTPS connection object from a host descriptor + # host may be a string, or a (host, x509-dict) tuple + import httplib + localhost, extra_headers, x509 = self.get_host_info(host) + try: + HTTPS = httplib.HTTPS + except AttributeError: + raise NotImplementedError( + "your version of httplib doesn't support HTTPS" + ) + else: + cx = HTTPS(localhost, None, + key_file = key_file, + cert_file = cert_file) + return cx + + +################################################# +## Factory permettant de créer un contexte SSL ## +################################################# +class ServerContextFactory: + + def __init__(self): + """ + load the key and cert files in a PKey Object + """ + self.cert = crypto.load_certificate(crypto.FILETYPE_PEM, open(cert_file).read()) + self.key = crypto.load_privatekey(crypto.FILETYPE_PEM, open(key_file).read()) + + def getContext(self): + """ + Create an SSL context. + Load cert and key files in a context + """ + ctx = SSL.Context(SSL.TLSv1_METHOD) + ctx.use_certificate(self.cert) + ctx.use_privatekey(self.key) + return ctx diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/files/usr/share/ead2/lib/table.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/files/usr/share/ead2/lib/table.py new file mode 100644 index 0000000000000000000000000000000000000000..e78adcecef512c38957f622e0a59da55615effeb --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/files/usr/share/ead2/lib/table.py @@ -0,0 +1,817 @@ +# -*- coding: UTF-8 -*- +""" Copyright (c) 2000-2002 LOGILAB S.A. (Paris, FRANCE). + http://www.logilab.fr/ -- mailto:contact@logilab.fr + +Logilab common libraries +""" + +"""Table management module +""" + +__revision__ = '$Id: table.py,v 1.7 2005/02/15 14:55:38 adim Exp $' + +# from logilab.common.compat import enumerate, sum + + +class Table: + """Table defines a data table with column and row names. + inv: + len(self.data) <= len(self.row_names) + forall(self.data, lambda x: len(x) <= len(self.col_names)) + """ + + def __init__(self): + self.col_names = [] + self.row_names = [] + self.data = [] + + ## Rows / Columns creation ################################################# + def create_rows(self, row_names): + """Appends row_names to the list of existing rows + """ + self.row_names.extend(row_names) + for row_name in row_names: + self.data.append([0]*len(self.col_names)) + + def create_columns(self, col_names): + """Appends col_names to the list of existing columns + """ + for col_name in col_names: + self.create_column(col_name) + + def create_row(self, row_name): + """Creates a rowname to the row_names list + """ + self.row_names.append(row_name) + self.data.append([0]*len(self.col_names)) + + + def create_column(self, col_name): + """Creates a colname to the col_names list + """ + self.col_names.append(col_name) + for row in self.data: + row.append(0) + + ## Sort by column ########################################################## + def sort_by_column_id(self, col_id, method = 'asc'): + """Sorts the table (in-place) according to data stored in col_id + """ + try: + col_index = self.col_names.index(col_id) + self.sort_by_column_index(col_index, method) + except ValueError: + raise KeyError, "Col (%s) not found in table"%(col_id) + + + def sort_by_column_index(self, col_index, method = 'asc'): + """Sorts the table 'in-place' according to data stored in col_index + + method should be in ('asc', 'desc') + """ + sort_list = [(row[col_index], row, row_name) + for row, row_name in zip(self.data, self.row_names)] + # Sorting sort_list will sort according to col_index + sort_list.sort() + # If we want reverse sort, then reverse list + if method.lower() == 'desc': + sort_list.reverse() + + # Rebuild data / row names + self.data = [] + self.row_names = [] + for val, row, row_name in sort_list: + self.data.append(row) + self.row_names.append(row_name) + + + ## The 'setter' part ####################################################### + def set_cell(self, row_index, col_index, data): + """Sets value of cell 'row_indew', 'col_index' to data + """ + self.data[row_index][col_index] = data + + + def set_cell_by_ids(self, row_id, col_id, data): + """Sets value of cell mapped by row_id and col_id to data + Raises a KeyError if row_id or col_id are not found in the table + """ + try: + row_index = self.row_names.index(row_id) + except ValueError: + raise KeyError, "Row (%s) not found in table"%(row_id) + else: + try: + col_index = self.col_names.index(col_id) + self.data[row_index][col_index] = data + except ValueError: + raise KeyError, "Column (%s) not found in table"%(col_id) + + + def set_row(self, row_index, row_data): + """Sets the 'row_index' row + pre: + type(row_data) == types.ListType + len(row_data) == len(self.col_names) + """ + self.data[row_index] = row_data + + + def set_row_by_id(self, row_id, row_data): + """Sets the 'row_id' column + pre: + type(row_data) == types.ListType + len(row_data) == len(self.row_names) + Raises a KeyError if row_id is not found + """ + try: + row_index = self.row_names.index(row_id) + self.set_row(row_index, row_data) + except ValueError: + raise KeyError, 'Row (%s) not found in table'%(row_id) + + + def append_row(self, row_data, row_name): + """Appends a row to the table + pre: + type(row_data) == types.ListType + len(row_data) == len(self.col_names) + """ + self.row_names.append(row_name) + self.data.append(row_data) + + + def insert_row(self, index, row_data, row_name): + """Appends row_data before 'index' in the table. To make 'insert' + behave like 'list.insert', inserting in an out of range index will + insert row_data to the end of the list + pre: + type(row_data) == types.ListType + len(row_data) == len(self.col_names) + """ + self.row_names.insert(index, row_name) + self.data.insert(index, row_data) + + + def delete_row(self, index): + """Deletes the 'index' row in the table, and returns it. + Raises an IndexError if index is out of range + """ + self.row_names.pop(index) + return self.data.pop(index) + + + def delete_row_by_id(self, row_id): + """Deletes the 'row_id' row in the table. + Raises a KeyError if row_id was not found. + """ + try: + row_index = self.row_names.index(row_id) + self.delete_row(row_index) + except ValueError: + raise KeyError, 'Row (%s) not found in table'%(row_id) + + + def set_column(self, col_index, col_data): + """Sets the 'col_index' column + pre: + type(col_data) == types.ListType + len(col_data) == len(self.row_names) + """ + + for row_index, cell_data in enumerate(col_data): + self.data[row_index][col_index] = cell_data + + + def set_column_by_id(self, col_id, col_data): + """Sets the 'col_id' column + pre: + type(col_data) == types.ListType + len(col_data) == len(self.col_names) + Raises a KeyError if col_id is not found + """ + try: + col_index = self.col_names.index(col_id) + self.set_column(col_index, col_data) + except ValueError: + raise KeyError, 'Column (%s) not found in table'%(col_id) + + + def append_column(self, col_data, col_name): + """Appends the 'col_index' column + pre: + type(col_data) == types.ListType + len(col_data) == len(self.row_names) + """ + self.col_names.append(col_name) + for row_index, cell_data in enumerate(col_data): + self.data[row_index].append(cell_data) + + + def insert_column(self, index, col_data, col_name): + """Appends col_data before 'index' in the table. To make 'insert' + behave like 'list.insert', inserting in an out of range index will + insert col_data to the end of the list + pre: + type(col_data) == types.ListType + len(col_data) == len(self.row_names) + """ + self.col_names.insert(index, col_name) + for row_index, cell_data in enumerate(col_data): + self.data[row_index].insert(index, cell_data) + + + def delete_column(self, index): + """Deletes the 'index' column in the table, and returns it. + Raises an IndexError if index is out of range + """ + self.col_names.pop(index) + return [row.pop(index) for row in self.data] + + + def delete_column_by_id(self, col_id): + """Deletes the 'col_id' col in the table. + Raises a KeyError if col_id was not found. + """ + try: + col_index = self.col_names.index(col_id) + self.delete_column(col_index) + except ValueError: + raise KeyError, 'Column (%s) not found in table'%(col_id) + + + ## The 'getter' part ####################################################### + def __getitem__(self, row_index): + """Provided for convenience + """ + return self.data[row_index] + + + def get_dimensions(self): + """Returns a tuple which represents the table's size + """ + return len(self.row_names), len(self.col_names) + + + def get_element(self, row_index, col_index): + """Returns the element at [row_index][col_index] + """ + return self.data[row_index][col_index] + + + def get_row(self, row_index): + """Returns the 'row_index' row + """ + return self.data[row_index] + + + def get_row_by_id(self, row_id): + """Returns the 'row_id' row + """ + row_index = self.row_names.index(row_id) + return self.get_row(row_index) + + + def get_column(self, col_index): + """Returns the 'col_index' col + """ + return [row[col_index] for row in self.data] + + + def get_column_by_id(self, col_id): + """Returns the 'col_id' col + """ + col_index = self.col_names.index(col_id) + return self.get_column(col_index) + + + def get_rows(self): + """Returns all the rows in the table + """ + return self.data + + + def get_columns(self): + """Returns all the columns in the table + """ + return [self.get_column(index) for index in range(len(self.col_names))] + + + def apply_stylesheet(self, stylesheet): + """Applies the stylesheet to this table + """ + for instruction in stylesheet.instructions: + eval(instruction) + + + def transpose(self): + """Keeps the self object intact, and returns the transpoed (rotated) + table. + """ + transposed = Table() + transposed.create_rows(self.col_names) + transposed.create_columns(self.row_names) + for col_index, column in enumerate(self.get_columns()): + transposed.set_row(col_index, column) + + return transposed + + + def pprint(self): + """returns a string representing the table in a pretty + printed 'text' format. + """ + # The maxium row name (to know the start_index of the first col) + max_row_name = 0 + for row_name in self.row_names: + if len(row_name) > max_row_name: + max_row_name = len(row_name) + col_start = max_row_name + 5 + + lines = [] + # Build the 'first' line <=> the col_names one + # The first cell <=> an empty one + col_names_line = [' '*col_start] + for col_name in self.col_names: + col_names_line.append(col_name.encode('iso-8859-1') + ' '*5) + lines.append('|' + '|'.join(col_names_line) + '|') + max_line_length = len(lines[0]) + + # Build the table + for row_index, row in enumerate(self.data): + line = [] + # First, build the row_name's cell + row_name = self.row_names[row_index].encode('iso-8859-1') + line.append(row_name + ' '*(col_start-len(row_name))) + + # Then, build all the table's cell for this line. + for col_index, cell in enumerate(row): + col_name_length = len(self.col_names[col_index]) + 5 + data = str(cell) + line.append(data + ' '*(col_name_length - len(data))) + lines.append('|' + '|'.join(line) + '|') + if len(lines[-1]) > max_line_length: + max_line_length = len(lines[-1]) + + # Wrap the table with '-' to make a frame + lines.insert(0, '-'*max_line_length) + lines.append('-'*max_line_length) + return '\n'.join(lines) + + + def __str__(self): + data = [] + # We must convert cells into strings before joining them + for row in self.data: + data.append([str(cell) for cell in row]) + lines = ['\t'.join(row) for row in data] + return '\n'.join(lines) + + + +class TableStyle: + """Defines a table's style + """ + + def __init__(self, table): + + self._table = table + self.size = dict([(col_name,'1*') for col_name in table.col_names]) + # __row_column__ is a special key to define the first column which + # actually has no name (<=> left most column <=> row names column) + self.size['__row_column__'] = '1*' + self.alignment = dict([(col_name,'right') + for col_name in table.col_names]) + self.alignment['__row_column__'] = 'right' + + # We shouldn't have to create an entry for + # the 1st col (the row_column one) + self.units = dict([(col_name,'') for col_name in table.col_names]) + self.units['__row_column__'] = '' + + # XXX FIXME : params order should be reversed for all set() methods + def set_size(self, value, col_id): + """Sets the size of the specified col_id to value + """ + self.size[col_id] = value + + def set_size_by_index(self, value, col_index): + """Allows to set the size according to the column index rather than + using the column's id. + BE CAREFUL : the '0' column is the '__row_column__' one ! + """ + if col_index == 0: + col_id = '__row_column__' + else: + col_id = self._table.col_names[col_index-1] + + self.size[col_id] = value + + + def set_alignment(self, value, col_id): + """Sets the alignment of the specified col_id to value + """ + self.alignment[col_id] = value + + + def set_alignment_by_index(self, value, col_index): + """Allows to set the alignment according to the column index rather than + using the column's id. + BE CAREFUL : the '0' column is the '__row_column__' one ! + """ + if col_index == 0: + col_id = '__row_column__' + else: + col_id = self._table.col_names[col_index-1] + + self.alignment[col_id] = value + + + def set_unit(self, value, col_id): + """Sets the unit of the specified col_id to value + """ + self.units[col_id] = value + + + def set_unit_by_index(self, value, col_index): + """Allows to set the unit according to the column index rather than + using the column's id. + BE CAREFUL : the '0' column is the '__row_column__' one ! + (Note that in the 'unit' case, you shouldn't have to set a unit + for the 1st column (the __row__column__ one)) + """ + if col_index == 0: + col_id = '__row_column__' + else: + col_id = self._table.col_names[col_index-1] + + self.units[col_id] = value + + + def get_size(self, col_id): + """Returns the size of the specified col_id + """ + return self.size[col_id] + + + def get_size_by_index(self, col_index): + """Allows to get the size according to the column index rather than + using the column's id. + BE CAREFUL : the '0' column is the '__row_column__' one ! + """ + if col_index == 0: + col_id = '__row_column__' + else: + col_id = self._table.col_names[col_index-1] + + return self.size[col_id] + + + def get_alignment(self, col_id): + """Returns the alignment of the specified col_id + """ + return self.alignment[col_id] + + + def get_alignment_by_index(self, col_index): + """Allors to get the alignment according to the column index rather than + using the column's id. + BE CAREFUL : the '0' column is the '__row_column__' one ! + """ + if col_index == 0: + col_id = '__row_column__' + else: + col_id = self._table.col_names[col_index-1] + + return self.alignment[col_id] + + + def get_unit(self, col_id): + """Returns the unit of the specified col_id + """ + return self.units[col_id] + + + def get_unit_by_index(self, col_index): + """Allors to get the unit according to the column index rather than + using the column's id. + BE CAREFUL : the '0' column is the '__row_column__' one ! + """ + if col_index == 0: + col_id = '__row_column__' + else: + col_id = self._table.col_names[col_index-1] + + return self.units[col_id] + + +import re +CELL_PROG = re.compile("([0-9]+)_([0-9]+)") + +class TableStyleSheet: + """A simple Table stylesheet + Rules are expressions where cells are defined by the row_index + and col_index separated by an underscore ('_'). + For example, suppose you want to say that the (2,5) cell must be + the sum of its two preceding cells in the row, you would create + the following rule : + 2_5 = 2_3 + 2_4 + You can also use all the math.* operations you want. For example: + 2_5 = sqrt(2_3**2 + 2_4**2) + """ + + def __init__(self, rules = None): + rules = rules or [] + self.rules = [] + self.instructions = [] + for rule in rules: + self.add_rule(rule) + + + def add_rule(self, rule): + """Adds a rule to the stylesheet rules + """ + try: + source_code = ['from math import *'] + source_code.append(CELL_PROG.sub(r'self.data[\1][\2]', rule)) + self.instructions.append(compile('\n'.join(source_code), + 'table.py', 'exec')) + self.rules.append(rule) + except SyntaxError: + print "Bad Stylesheet Rule : %s [skipped]"%rule + + + def add_rowsum_rule(self, dest_cell, row_index, start_col, end_col): + """Creates and adds a rule to sum over the row at row_index from + start_col to end_col. + dest_cell is a tuple of two elements (x,y) of the destination cell + No check is done for indexes ranges. + pre: + start_col >= 0 + end_col > start_col + """ + cell_list = ['%d_%d'%(row_index, index) for index in range(start_col, + end_col + 1)] + rule = '%d_%d='%dest_cell + '+'.join(cell_list) + self.add_rule(rule) + + + def add_rowavg_rule(self, dest_cell, row_index, start_col, end_col): + """Creates and adds a rule to make the row average (from start_col + to end_col) + dest_cell is a tuple of two elements (x,y) of the destination cell + No check is done for indexes ranges. + pre: + start_col >= 0 + end_col > start_col + """ + cell_list = ['%d_%d'%(row_index, index) for index in range(start_col, + end_col + 1)] + num = (end_col - start_col + 1) + rule = '%d_%d='%dest_cell + '('+'+'.join(cell_list)+')/%f'%num + self.add_rule(rule) + + + def add_colsum_rule(self, dest_cell, col_index, start_row, end_row): + """Creates and adds a rule to sum over the col at col_index from + start_row to end_row. + dest_cell is a tuple of two elements (x,y) of the destination cell + No check is done for indexes ranges. + pre: + start_row >= 0 + end_row > start_row + """ + cell_list = ['%d_%d'%(index, col_index) for index in range(start_row, + end_row + 1)] + rule = '%d_%d='%dest_cell + '+'.join(cell_list) + self.add_rule(rule) + + + def add_colavg_rule(self, dest_cell, col_index, start_row, end_row): + """Creates and adds a rule to make the col average (from start_row + to end_row) + dest_cell is a tuple of two elements (x,y) of the destination cell + No check is done for indexes ranges. + pre: + start_row >= 0 + end_row > start_row + """ + cell_list = ['%d_%d'%(index, col_index) for index in range(start_row, + end_row + 1)] + num = (end_row - start_row + 1) + rule = '%d_%d='%dest_cell + '('+'+'.join(cell_list)+')/%f'%num + self.add_rule(rule) + + + +class TableCellRenderer: + """Defines a simple text renderer + """ + + def __init__(self, **properties): + """keywords should be properties with an associated boolean as value. + For example : + renderer = TableCellRenderer(units = True, alignment = False) + An unspecified property will have a 'False' value by default. + Possible properties are : + alignment, unit + """ + self.properties = properties + + + def render_cell(self, cell_coord, table, table_style): + """Renders the cell at 'cell_coord' in the table, using table_style + """ + row_index, col_index = cell_coord + cell_value = table.data[row_index][col_index] + final_content = self._make_cell_content(cell_value, + table_style, col_index +1) + return self._render_cell_content(final_content, + table_style, col_index + 1) + + + def render_row_cell(self, row_name, table, table_style): + """Renders the cell for 'row_id' row + """ + cell_value = row_name.encode('iso-8859-1') + return self._render_cell_content(cell_value, table_style, 0) + + + def render_col_cell(self, col_name, table, table_style): + """Renders the cell for 'col_id' row + """ + cell_value = col_name.encode('iso-8859-1') + col_index = table.col_names.index(col_name) + return self._render_cell_content(cell_value, table_style, col_index +1) + + + + def _render_cell_content(self, content, table_style, col_index): + """Makes the appropriate rendering for this cell content. + Rendering properties will be searched using the + *table_style.get_xxx_by_index(col_index)' methods + + **This method should be overriden in the derived renderer classes.** + """ + return content + + + def _make_cell_content(self, cell_content, table_style, col_index): + """Makes the cell content (adds decoration data, like units for + example) + """ + final_content = cell_content + if 'skip_zero' in self.properties: + replacement_char = self.properties['skip_zero'] + else: + replacement_char = 0 + if replacement_char and final_content == 0: + return replacement_char + + try: + units_on = self.properties['units'] + if units_on: + final_content = self._add_unit( + cell_content, table_style, col_index) + except KeyError: + pass + + return final_content + + + def _add_unit(self, cell_content, table_style, col_index): + """Adds unit to the cell_content if needed + """ + unit = table_style.get_unit_by_index(col_index) + return str(cell_content) + " " + unit + + + +class DocbookRenderer(TableCellRenderer): + """Defines how to render a cell for a docboook table + """ + + def __init__(self, **properties): + TableCellRenderer.__init__(self, **properties) + + + def define_col_header(self, col_index, table_style): + """Computes the colspec element according to the style + """ + size = table_style.get_size_by_index(col_index) + return '<colspec colname="c%d" colwidth="%s"/>\n' % \ + (col_index, size) + + + def _render_cell_content(self, cell_content, table_style, col_index): + """Makes the appropriate rendering for this cell content. + Rendering properties will be searched using the + *table_style.get_xxx_by_index(col_index)' methods. + """ + try: + align_on = self.properties['alignment'] + alignment = table_style.get_alignment_by_index(col_index) + if align_on: + return "<entry align='%s'>%s</entry>\n" % \ + (alignment, cell_content) + except KeyError: + # KeyError <=> Default alignment + return "<entry>%s</entry>\n"%cell_content + + +class TableWriter: + """A class to write tables + """ + + def __init__(self, stream, table, style, **properties): + self._stream = stream + self.style = style or TableStyle(table) + self._table = table + self.properties = properties + self.renderer = None + + + def set_style(self, style): + """Sets the table's associated style + """ + self.style = style + + + def set_renderer(self, renderer): + """Sets the way to render cell + """ + self.renderer = renderer + + + def update_properties(self, **properties): + """Updates writer's properties (for cell rendering) + """ + self.properties.update(properties) + + + def write_table(self, title = ""): + """Writes the table + """ + raise NotImplementedError, "write_table must be implemented !" + + + +class DocbookTableWriter(TableWriter): + """Defines an implementation of TableWriter to write a table in Docbook + """ + + def _write_headers(self): + """Writes col headers + """ + # Define col_headers (colstpec elements) + for col_index in range(len(self._table.col_names)+1): + self._stream.write(self.renderer.define_col_header(col_index, + self.style)) + + self._stream.write("<thead>\n<row>\n") + # XXX FIXME : write an empty entry <=> the first (__row_column) column + self._stream.write('<entry></entry>\n') + for col_name in self._table.col_names: + self._stream.write(self.renderer.render_col_cell( + col_name, self._table, + self.style)) + + self._stream.write("</row>\n</thead>\n") + + + def _write_body(self): + """Writes the table body + """ + self._stream.write('<tbody>\n') + + for row_index, row in enumerate(self._table.data): + self._stream.write('<row>\n') + row_name = self._table.row_names[row_index] + # Write the first entry (row_name) + self._stream.write(self.renderer.render_row_cell(row_name, + self._table, + self.style)) + + for col_index, cell in enumerate(row): + self._stream.write(self.renderer.render_cell( + (row_index, col_index), + self._table, self.style)) + + self._stream.write('</row>\n') + + self._stream.write('</tbody>\n') + + + def write_table(self, title = ""): + """Writes the table + """ + self._stream.write('<table>\n<title>%s></title>\n'%(title)) + self._stream.write( + '<tgroup cols="%d" align="left" colsep="1" rowsep="1">\n'% + (len(self._table.col_names)+1)) + self._write_headers() + self._write_body() + + self._stream.write('</tgroup>\n</table>\n') + + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/posttemplates/01-ead b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/posttemplates/01-ead new file mode 100644 index 0000000000000000000000000000000000000000..cb94ff0763ec8dd320a0ade784ce96c440fac599 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/posttemplates/01-ead @@ -0,0 +1,51 @@ +#!/usr/bin/env python2 +# -*- coding: utf-8 -*- + +import sys +from pwd import getpwuid +from grp import getgrgid +from os.path import join +from creole.utils import run_bash_function + +def register_ead(): + """ + Enregistrement de l'EAD local + """ + from creole.client import CreoleClient + sys.path.insert(1, '/usr/share') + from ead2.frontend.web.lib.servers import servers + from ead2.lib.libead import EadKeyParser + from ead2.lib.crypto import create_key as create_magicnb + from ead2.backend.config.config import CONFIG_DIR, FRONTEND_KEYS_FILE, NOBODY_UID, NOBODY_GID + from ead2.config.config import BACKEND_LISTEN_PORT, SSL_dir, certname + nom_machine = CreoleClient().get_creole('nom_machine') + nom_domaine = CreoleClient().get_creole('ssl_server_name') + # Install SSL directories and files + username = getpwuid(NOBODY_UID).pw_name + groupname = getgrgid(NOBODY_GID).gr_name + ret = run_bash_function("/usr/lib/eole/utils.sh", "InstallSSLFiles", "{0} {1} {2} {3}".format(certname, username, groupname, SSL_dir)) + ead = EadKeyParser() + ead.parse_file(join(CONFIG_DIR, FRONTEND_KEYS_FILE)) + ead_keys = ead.get_key_dict() + if ead_keys != {}: + # des frontend sont déjà enregistrés + # Remplacement de 127.0.0.1 avec le nom complet DNS (valide dans le certif SSL) + if "127.0.0.1" in ead_keys: + toRm = '' + srvLst = servers().get_server() + for key,value in srvLst.items(): + if value[0] == 'https://127.0.0.1': + servers().del_server(key) + else: + return + key = create_magicnb('admin', 'admin') + dic = { nom_domaine: key } + # ecriture clé ead-serveur + ead.write_file(join(CONFIG_DIR, FRONTEND_KEYS_FILE), dic) + # ecriture clé ead-web + servers().add_server('https://{0}'.format(nom_domaine), + str(BACKEND_LISTEN_PORT), + nom_machine, + str(key)) + +register_ead() diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..e890a86e8d627101ac41ad3e4c920bec432325de --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/service.yml @@ -0,0 +1,93 @@ +format: '0.1' +name: eole-ead-common +version: |- + 2.7.1-4 +description: |- + Librairies communes pour l'outil EAD + Pour toute information complementaire, veuillez vous rendre + sur le site du Projet a l'adresse suivante : + . + http://eole.orion.education.fr +depends: [] +packages: + - python-nevow + - python-openssl +dictionaries: + - 22_ead.xml + - 24_ead_distant.xml +extra_dictionaries: {} +templates: + - ead.cfg +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: + - 01-ead +files: + /etc/cron.daily/eole-ead: + owner: root + group: root + mode: '0755' + /usr/share/ead2/__init__.py: + owner: root + group: root + mode: '0644' + /usr/share/ead2/config/__init__.py: + owner: root + group: root + mode: '0644' + /usr/share/ead2/config/config.py: + owner: root + group: root + mode: '0644' + /usr/share/ead2/lib/__init__.py: + owner: root + group: root + mode: '0644' + /usr/share/ead2/lib/certs/server.pem: + owner: root + group: root + mode: '0644' + /usr/share/ead2/lib/crypto.py: + owner: root + group: root + mode: '0644' + /usr/share/ead2/lib/error.py: + owner: root + group: root + mode: '0644' + /usr/share/ead2/lib/i18n_backend.py: + owner: root + group: root + mode: '0644' + /usr/share/ead2/lib/i18n_frontend.py: + owner: root + group: root + mode: '0644' + /usr/share/ead2/lib/i18n_frontend_console.py: + owner: root + group: root + mode: '0644' + /usr/share/ead2/lib/libbackend.py: + owner: root + group: root + mode: '0644' + /usr/share/ead2/lib/libead.py: + owner: root + group: root + mode: '0644' + /usr/share/ead2/lib/libfrontend.py: + owner: root + group: root + mode: '0644' + /usr/share/ead2/lib/libsecure.py: + owner: root + group: root + mode: '0644' + /usr/share/ead2/lib/table.py: + owner: root + group: root + mode: '0644' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/templates/ead.cfg b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/templates/ead.cfg new file mode 100644 index 0000000000000000000000000000000000000000..651959a3301f9625f3e6a75888d1d3416ab66711 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead-common/templates/ead.cfg @@ -0,0 +1,153 @@ +[eole] +adresse_ip_eth0 = %%adresse_ip_eth0 +container_path_dhcp = %%getVar('container_path_dhcp', '') +container_ip_fichier = %%getVar('container_ip_fichier', '127.0.0.1') +container_path_fichier = %%getVar('container_path_fichier', '') +container_path_proxy = %%getVar('container_path_proxy', '') +nom_academie = %%nom_academie +%if %%len(%%libelle_etab) < 2 +libelle_etab = Établissement inconnu +%else +libelle_etab = %%libelle_etab.capitalize() +%end if +eole_module = %%eole_module +eole_version = %%eole_version +suffixe_domaine_academique = %%suffixe_domaine_academique +schedule_customize_tasks = %%schedule_customize_tasks +%set %%services = [] +%for %%service in %%creole_client.get_services(): +%if %%service.get('activate', False) == True and %%service['method'] in [u'service', u'upstart', u'network', u'systemd']: +%%services.append((%%service['name'], %%service['container_group']))%slurp +%end if +%end for +services_name =%slurp +%for %%service in %%services + %%service[0]%slurp +%end for + +services_container =%slurp +%for %%service in %%services + %%service[1]%slurp +%end for + +dhcp_activation_ead3 = %%creole_client.get('dhcpactivation.dhcp_activation.dhcp_activation_ead3', 'non') + +[ead] +#port d'ecoute du backend +backend_listen_port = 4201 +#Port d'ecoute du serveur de fichier +eadfile_listen_port = 4202 +eadfile_url = %%adresse_ip_eth0 +%if %%getVar('activer_ead_reverseproxy', 'non') != 'non' +reverseproxy_port = %%port_ead_reverseproxy +%else +reverseproxy_port +%end if +%set %%SSL_dir = '/etc/ead/ssl' +%set %%certname = 'ead-server' +SSL_dir = %%SSL_dir +certname = %%certname +cert_file = %%{SSL_dir}/certs/%%{certname}.crt +key_file = %%{SSL_dir}/private/%%{certname}.key +#durée de vie d'un nombre magique permettant la communication entre un frontend et un backend +#ce timeout est reinitialise a chaque fois qu'une action est lancée +magic_number_timeout = 86400 +#durée de vie des sessions expirées. Quand une session expire, on la garde dans un cache pour savoir +#si quand une session est non valide, si elle avait expirée ou si elle n'a jamais existée +expired_session_timeout = 7200 +%if %%getVar('ead_sso', 'non') == 'oui': +auth_server_addr = %%eolesso_adresse +auth_form_port = %%eolesso_port +#URL de la page web d'authentification +auth_form_url = https://%%eolesso_adresse:%%eolesso_port +#URL du serveur d'authentification +auth_server = https://%%eolesso_adresse:%%eolesso_port/xmlrpc +%else +auth_server_addr +auth_form_port +auth_form_url +auth_server +%end if + +[lightsquid] +# lightsquid (consultation des logs) +lightsquid_installed = %%is_defined('lightsquid_auto') +# durée de vie en secondes de la session pour l'accès à l'application +lightsquid_timeout = 900 +# Port de l'application Lightsquid (consultation des logs squid) +lightsquid_port = %%getVar('lightsquid_port', 8062) +lightsquid_auto = %slurp +%if %%getVar('lightsquid_auto', 'non') == 'oui' +yes +%else +no +%end if + +[proxy] +squid_auth = %slurp +%if %%getVar("activer_squid_auth", 'non') == 'oui' +yes +%else +no +%end if +squid2_activate = %slurp +%if %%getVar("activer_squid2", 'non') == 'oui' +yes +%else +no +%end if +blacklist_installed = %%is_defined('url_maj_blacklist') +dansguardian_ead_filtre1 = %%getVar('dansguardian_ead_filtre1', "Filtre web 1") +dansguardian_ead_filtre2 = %%getVar('dansguardian_ead_filtre2', "Filtre web 2") +dansguardian_ead_filtre3 = %%getVar('dansguardian_ead_filtre3', "Filtre web 3") + +[cups] +cups_activate = %slurp +%if %%getVar('activer_cups', 'non') == 'oui' +yes +%if %%mode_conteneur_actif == 'oui': +cups_address = %%adresse_ip_fichier_link +%else +cups_address = %%adresse_ip_eth0 +%end if +%else +no +cups_address +%end if + +[backup] +bareos_sd_installed = %%is_defined('activer_bareos_sd') +bareos_sd_activate = %slurp +%if %%getVar('activer_bareos_sd', 'non') == 'oui' +yes +%else +no +%end if +bareos_dir_activate = %slurp +%if %%getVar('activer_bareos_dir', 'non') == 'oui' +yes +%else +no +%end if + +[fichier] +antivirus_samba = %slurp +%if %%getVar('smb_vscan', 'non') == 'oui' +yes +%else +no +%end if +synchro_aaf = %%getVar('synchro_aaf', '') +nfs_activate = %slurp +%if %%getVar('activer_nfs', 'non') == 'oui' +yes +%else +no +%end if +client_ltsp_installed = %%is_defined('interface_client_ltsp') +smb_min_password_length = %%getVar('smb_min_password_length', '') +smb_min_password_class = %%getVar('smb_min_password_class', '') +# FIXME: utilisation de eth1 sur AmonEcole (#2726) +%set %%fichier_link = %%getVar('fichier_link_interface', 'eth0') +fichier_link_interface = %%fichier_link +domain_fichier_link_interface = %%getVar('adresse_ip_' + %%fichier_link) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3-saltstack/dictionaries/00_eole-ead3-saltstack_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3-saltstack/dictionaries/00_eole-ead3-saltstack_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..4247350b709e11a8812f693f1da0a3283503f304 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3-saltstack/dictionaries/00_eole-ead3-saltstack_packages.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>eole-common</package> + <package>salt-api</package> + <package>salt-master</package> + <package>salt-minion</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3-saltstack/dictionaries/20_saltstack_ead3.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3-saltstack/dictionaries/20_saltstack_ead3.xml new file mode 100644 index 0000000000000000000000000000000000000000..3ac58e2e8aa97e337aabba0c868a1655de7ed33b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3-saltstack/dictionaries/20_saltstack_ead3.xml @@ -0,0 +1,53 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + <file filelist="ead3-saltstack" name="/etc/ead3/salt/minion"/> + <file filelist="ead3-saltstack" name="/etc/ead3/salt/minion.d/smtp.conf" source="minion.smtp.conf" mkdir='True'/> + <file filelist="ead3-saltstack" name="/etc/ead3/salt/master"/> + <file filelist="ead3-saltstack" name="/etc/ead3/salt/master.d/cherry.conf" mkdir='True'/> + <file filelist="ead3-saltstack" name="/etc/ead3/salt/master.d/ext_auth.conf" mkdir='True'/> + <service servicelist="ead3-saltstack">salt-api-ead3</service> + <service servicelist="ead3-saltstack">salt-master-ead3</service> + <service servicelist="ead3-saltstack">salt-minion-ead3</service> + </files> + + <variables> + <family name="services"> + <variable name="activer_saltstack_ead3" type="oui/non" description="Activer SaltStack pour l'EAD3"> + <value>oui</value> + </variable> + </family> + <family name="EAD3" icon="cogs" mode="expert"> + <!-- FIXME domain_strict --> + <variable name="minion_domain_name" description="Nom de domaine du minion" type="string"> + <value>local</value> + </variable> + <variable name="salt_api_port" description="Port d'accès à l'API SaltStack" type="port"> + <value>8880</value> + </variable> + </family> + + <separators> + <separator name='minion_domain_name'>Personnalisation de la configuration SaltStack</separator> + </separators> + </variables> + + <constraints> + <condition name='disabled_if_in' source='activer_saltstack_ead3'> + <param>non</param> + <target type='servicelist'>ead3-saltstack</target> + <target type='filelist'>ead3-saltstack</target> + <target type='family'>EAD3</target> + </condition> + </constraints> + + <help> + <family name="EAD3">Personnalisation de la configuration de l'EAD3</family> + <variable name="activer_saltstack_ead3">SaltStack est un logiciel de gestion de configuration écrit en Python</variable> + <variable name="minion_domain_name">La machine cliente SaltStack est appelé « minion »</variable> + </help> + +</creole> + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3-saltstack/files/lib/systemd/system/salt-api-ead3.service b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3-saltstack/files/lib/systemd/system/salt-api-ead3.service new file mode 100644 index 0000000000000000000000000000000000000000..8897754aee0b315b92439b95b2114fb394afc4f7 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3-saltstack/files/lib/systemd/system/salt-api-ead3.service @@ -0,0 +1,15 @@ +[Unit] +Description=The Salt API for EAD3 +Documentation=man:salt-api(1) file:///usr/share/doc/salt/html/contents.html https://docs.saltstack.com/en/latest/contents.html +After=network.target + +[Service] +Type=notify +NotifyAccess=all +LimitNOFILE=8192 +ExecStart=/usr/bin/salt-api -c /etc/ead3/salt --log-file=file:///dev/log +TimeoutStopSec=3 +SyslogIdentifier=salt-api-ead3 + +[Install] +WantedBy=multi-user.target diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3-saltstack/files/lib/systemd/system/salt-master-ead3.service b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3-saltstack/files/lib/systemd/system/salt-master-ead3.service new file mode 100644 index 0000000000000000000000000000000000000000..fd3411f4e98d7400e9df0f3777c3fe0701589c23 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3-saltstack/files/lib/systemd/system/salt-master-ead3.service @@ -0,0 +1,19 @@ +[Unit] +Description=The Salt Master Server for EAD3 +Documentation=man:salt-master(1) file:///usr/share/doc/salt/html/contents.html https://docs.saltstack.com/en/latest/contents.html +After=network.target + +[Service] +LimitNOFILE=100000 +Type=notify +NotifyAccess=all +ExecStart=/usr/bin/salt-master -c /etc/ead3/salt +User=root +Group=root +CacheDirectory=salt/master +RuntimeDirectory=salt +StateDirectory=salt/pki/master +SyslogIdentifier=salt-master-ead3 + +[Install] +WantedBy=multi-user.target diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3-saltstack/files/lib/systemd/system/salt-minion-ead3.service b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3-saltstack/files/lib/systemd/system/salt-minion-ead3.service new file mode 100644 index 0000000000000000000000000000000000000000..141b3365834a1ad0a92903e643c2d09ecb2a5b4e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3-saltstack/files/lib/systemd/system/salt-minion-ead3.service @@ -0,0 +1,15 @@ +[Unit] +Description=The Salt Minion for EAD3 +Documentation=man:salt-minion(1) file:///usr/share/doc/salt/html/contents.html https://docs.saltstack.com/en/latest/contents.html +After=network.target salt-master.service + +[Service] +KillMode=process +Type=notify +NotifyAccess=all +LimitNOFILE=8192 +ExecStart=/usr/bin/salt-minion -c /etc/ead3/salt +SyslogIdentifier=salt-minion-ead3 + +[Install] +WantedBy=multi-user.target diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3-saltstack/files/usr/lib/python3/dist-packages/eole_salt_netapi-2.7.1.egg-info b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3-saltstack/files/usr/lib/python3/dist-packages/eole_salt_netapi-2.7.1.egg-info new file mode 100644 index 0000000000000000000000000000000000000000..b7661cf21fbdc87cbad7348cf6b09527c0b31f3a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3-saltstack/files/usr/lib/python3/dist-packages/eole_salt_netapi-2.7.1.egg-info @@ -0,0 +1,10 @@ +Metadata-Version: 1.0 +Name: eole_salt_netapi +Version: 2.7.1 +Summary: EOLE API module for Saltstack based on rest_tornado +Home-page: http://www.eole.orion.education.fr +Author: eole +Author-email: eole@ac-dijon.fr +License: UNKNOWN +Description: UNKNOWN +Platform: UNKNOWN diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3-saltstack/files/usr/lib/python3/dist-packages/salt/netapi/rest_eole/__init__.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3-saltstack/files/usr/lib/python3/dist-packages/salt/netapi/rest_eole/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..7a4dfe8d11619e1f161dbcf63a670dc6b3fe3132 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3-saltstack/files/usr/lib/python3/dist-packages/salt/netapi/rest_eole/__init__.py @@ -0,0 +1,136 @@ +# encoding: utf-8 + +# Import python libs +from __future__ import absolute_import, print_function +import hashlib +import logging +import os + +# Import salt libs +import salt.auth +from salt.utils.versions import StrictVersion as _StrictVersion + +__virtualname__ = os.path.abspath(__file__).rsplit(os.sep)[-2] or 'rest_tornado' + +logger = logging.getLogger(__virtualname__) + +# we require at least 4.0, as that includes all the Future's stuff we use +min_tornado_version = '4.0' +has_tornado = False +try: + import tornado + if _StrictVersion(tornado.version) >= _StrictVersion(min_tornado_version): + has_tornado = True + else: + logger.error('rest_tornado requires at least tornado {0}'.format(min_tornado_version)) +except (ImportError, TypeError) as err: + has_tornado = False + logger.error('ImportError! {0}'.format(str(err))) + + +def __virtual__(): + mod_opts = __opts__.get(__virtualname__, {}) + + if has_tornado and 'port' in mod_opts: + return __virtualname__ + + return False + + +def get_application(opts): + try: + from . import saltnado + except ImportError as err: + logger.error('ImportError! {0}'.format(str(err))) + return None + + mod_opts = opts.get(__virtualname__, {}) + + paths = [ + (r"/", saltnado.SaltAPIHandler), + (r"/login", saltnado.SaltAuthHandler), + (r"/validate_token", saltnado.SaltValidateTokenHandler), + (r"/logout", saltnado.SaltLogoutHandler), + (r"/minions/(.*)", saltnado.MinionSaltAPIHandler), + (r"/minions", saltnado.MinionSaltAPIHandler), + (r"/jobs/(.*)", saltnado.JobsSaltAPIHandler), + (r"/jobs", saltnado.JobsSaltAPIHandler), + (r"/run", saltnado.RunSaltAPIHandler), + (r"/events", saltnado.EventsSaltAPIHandler), + (r"/hook(/.*)?", saltnado.WebhookSaltAPIHandler), + ] + + # if you have enabled websockets, add them! + if mod_opts.get('websockets', False): + from . import saltnado_websockets + + token_pattern = r"([0-9A-Fa-f]{{{0}}})".format(len(getattr(hashlib, opts.get('hash_type', 'md5'))().hexdigest())) + all_events_pattern = r"/all_events/{0}".format(token_pattern) + formatted_events_pattern = r"/formatted_events/{0}".format(token_pattern) + logger.debug("All events URL pattern is {0}".format(all_events_pattern)) + paths += [ + # Matches /all_events/[0-9A-Fa-f]{n} + # Where n is the length of hexdigest + # for the current hashing algorithm. + # This algorithm is specified in the + # salt master config file. + (all_events_pattern, saltnado_websockets.AllEventsHandler), + (formatted_events_pattern, saltnado_websockets.FormattedEventsHandler), + ] + + application = tornado.web.Application(paths, debug=mod_opts.get('debug', False)) + + application.opts = opts + application.mod_opts = mod_opts + application.auth = salt.auth.LoadAuth(opts) + application.resolver = salt.auth.Resolver(opts) + return application + + +def start(): + ''' + Start the saltnado! + ''' + mod_opts = __opts__.get(__virtualname__, {}) + + if 'num_processes' not in mod_opts: + mod_opts['num_processes'] = 1 + + if mod_opts['num_processes'] > 1 and mod_opts.get('debug', False) is True: + raise Exception(( + 'Tornado\'s debug implementation is not compatible with multiprocess. ' + 'Either disable debug, or set num_processes to 1.' + )) + + # the kwargs for the HTTPServer + kwargs = {} + if not mod_opts.get('disable_ssl', False): + if 'ssl_crt' not in mod_opts: + logger.error("Not starting '%s'. Options 'ssl_crt' and " + "'ssl_key' are required if SSL is not disabled.", + __name__) + + return None + # cert is required, key may be optional + # https://docs.python.org/2/library/ssl.html#ssl.wrap_socket + ssl_opts = {'certfile': mod_opts['ssl_crt']} + if mod_opts.get('ssl_key', False): + ssl_opts.update({'keyfile': mod_opts['ssl_key']}) + kwargs['ssl_options'] = ssl_opts + + import tornado.httpserver + http_server = tornado.httpserver.HTTPServer(get_application(__opts__), **kwargs) + try: + http_server.bind(mod_opts['port'], + address=mod_opts.get('address'), + backlog=mod_opts.get('backlog', 128), + ) + http_server.start(mod_opts['num_processes']) + except: + logger.error('Rest_tornado unable to bind to port {0}'.format(mod_opts['port']), exc_info=True) + raise SystemExit(1) + + try: + tornado.ioloop.IOLoop.instance().start() + except KeyboardInterrupt: + raise SystemExit(0) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3-saltstack/files/usr/lib/python3/dist-packages/salt/netapi/rest_eole/event_processor.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3-saltstack/files/usr/lib/python3/dist-packages/salt/netapi/rest_eole/event_processor.py new file mode 100644 index 0000000000000000000000000000000000000000..b8e947a591247aca068d7c5773f367b85a8d5eb8 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3-saltstack/files/usr/lib/python3/dist-packages/salt/netapi/rest_eole/event_processor.py @@ -0,0 +1,233 @@ +# encoding: utf-8 +from __future__ import absolute_import +import json +import logging +import threading +import salt.ext.six as six + +import salt.netapi + +logger = logging.getLogger(__name__) + + +class SaltInfo(object): + ''' + Class to handle processing and publishing of "real time" Salt upates. + ''' + + def __init__(self, handler): + ''' + handler is expected to be the server side end of a websocket + connection. + ''' + self.handler = handler + + # These represent a "real time" view into Salt's jobs. + self.jobs = {} + + # This represents a "real time" view of minions connected to + # Salt. + self.minions = {} + + def publish_minions(self): + ''' + Publishes minions as a list of dicts. + ''' + logger.debug('in publish minions') + minions = {} + + logger.debug('starting loop') + for minion, minion_info in six.iteritems(self.minions): + logger.debug(minion) + # logger.debug(minion_info) + curr_minion = {} + curr_minion.update(minion_info) + curr_minion.update({'id': minion}) + minions[minion] = curr_minion + logger.debug('ended loop') + ret = {'minions': minions} + self.handler.write_message(u'{0}\n\n'.format(json.dumps(ret))) + + def publish(self, key, data): + ''' + Publishes the data to the event stream. + ''' + publish_data = {key: data} + pub = u'{0}\n\n'.format(json.dumps(publish_data)) + self.handler.write_message(pub) + + def process_minion_update(self, event_data): + ''' + Associate grains data with a minion and publish minion update + ''' + tag = event_data['tag'] + event_info = event_data['data'] + + _, _, _, _, mid = tag.split('/') + + if not self.minions.get(mid, None): + self.minions[mid] = {} + + minion = self.minions[mid] + + minion.update({'grains': event_info['return']}) + logger.debug("In process minion grains update with minions={0}".format(self.minions)) + self.publish_minions() + + def process_ret_job_event(self, event_data): + ''' + Process a /ret event returned by Salt for a particular minion. + These events contain the returned results from a particular execution. + ''' + tag = event_data['tag'] + event_info = event_data['data'] + + _, _, jid, _, mid = tag.split('/') + job = self.jobs.setdefault(jid, {}) + + minion = job.setdefault('minions', {}).setdefault(mid, {}) + minion.update({'return': event_info['return']}) + minion.update({'retcode': event_info['retcode']}) + minion.update({'success': event_info['success']}) + + job_complete = all([minion['success'] for mid, minion + in six.iteritems(job['minions'])]) + + if job_complete: + job['state'] = 'complete' + + self.publish('jobs', self.jobs) + + def process_new_job_event(self, event_data): + ''' + Creates a new job with properties from the event data + like jid, function, args, timestamp. + + Also sets the initial state to started. + + Minions that are participating in this job are also noted. + + ''' + job = None + tag = event_data['tag'] + event_info = event_data['data'] + minions = {} + for mid in event_info['minions']: + minions[mid] = {'success': False} + + job = { + 'jid': event_info['jid'], + 'start_time': event_info['_stamp'], + 'minions': minions, # is a dictionary keyed by mids + 'fun': event_info['fun'], + 'tgt': event_info['tgt'], + 'tgt_type': event_info['tgt_type'], + 'state': 'running', + } + self.jobs[event_info['jid']] = job + self.publish('jobs', self.jobs) + + def process_key_event(self, event_data): + ''' + Tag: salt/key + Data: + {'_stamp': '2014-05-20T22:45:04.345583', + 'act': 'delete', + 'id': 'compute.home', + 'result': True} + ''' + + tag = event_data['tag'] + event_info = event_data['data'] + + if event_info['act'] == 'delete': + self.minions.pop(event_info['id'], None) + elif event_info['act'] == 'accept': + self.minions.setdefault(event_info['id'], {}) + + self.publish_minions() + + def process_presence_events(self, salt_data, token, opts): + ''' + Check if any minions have connected or dropped. + Send a message to the client if they have. + ''' + logger.debug('In presence') + changed = False + + # check if any connections were dropped + if set(salt_data['data'].get('lost', [])): + dropped_minions = set(salt_data['data'].get('lost', [])) + else: + dropped_minions = set(self.minions) - set(salt_data['data'].get('present', [])) + + for minion in dropped_minions: + changed = True + logger.debug('Popping {0}'.format(minion)) + self.minions.pop(minion, None) + + # check if any new connections were made + if set(salt_data['data'].get('new', [])): + logger.debug('got new minions') + new_minions = set(salt_data['data'].get('new', [])) + changed = True + elif set(salt_data['data'].get('present', [])) - set(self.minions): + logger.debug('detected new minions') + new_minions = set(salt_data['data'].get('present', [])) - set(self.minions) + changed = True + else: + new_minions = [] + + tgt = ','.join(new_minions) + for mid in new_minions: + logger.debug('Adding minion') + self.minions[mid] = {} + + if tgt: + changed = True + client = salt.netapi.NetapiClient(opts) + client.run( + { + 'fun': 'grains.items', + 'tgt': tgt, + 'expr_type': 'list', + 'mode': 'client', + 'client': 'local', + 'async': 'local_async', + 'token': token, + }) + + if changed: + self.publish_minions() + + def process(self, salt_data, token, opts): + ''' + Process events and publish data + ''' + logger.debug('In process {0}'.format(threading.current_thread())) + logger.debug(salt_data['tag']) + logger.debug(salt_data) + + parts = salt_data['tag'].split('/') + if len(parts) < 2: + return + + # TBD: Simplify these conditional expressions + if parts[1] == 'job': + logger.debug('In job part 1') + if parts[3] == 'new': + logger.debug('In new job') + self.process_new_job_event(salt_data) + # if salt_data['data']['fun'] == 'grains.items': + # self.minions = {} + elif parts[3] == 'ret': + logger.debug('In ret') + self.process_ret_job_event(salt_data) + if salt_data['data']['fun'] == 'grains.items': + self.process_minion_update(salt_data) + elif parts[1] == 'key': + logger.debug('In key') + self.process_key_event(salt_data) + elif parts[1] == 'presence': + self.process_presence_events(salt_data, token, opts) + # logger.debug('In presence') diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3-saltstack/files/usr/lib/python3/dist-packages/salt/netapi/rest_eole/saltnado.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3-saltstack/files/usr/lib/python3/dist-packages/salt/netapi/rest_eole/saltnado.py new file mode 100644 index 0000000000000000000000000000000000000000..4c766b5e15e46b55a6e266ac04fbe95cfa6af021 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3-saltstack/files/usr/lib/python3/dist-packages/salt/netapi/rest_eole/saltnado.py @@ -0,0 +1,1727 @@ +# encoding: utf-8 +from __future__ import absolute_import, print_function + +''' +A non-blocking REST API for Salt +================================ + +.. py:currentmodule:: salt.netapi.rest_tornado.saltnado + +:depends: - tornado Python module + +:configuration: All authentication is done through Salt's :ref:`external auth + <acl-eauth>` system which requires additional configuration not described + here. + + +In order to run rest_tornado with the salt-master +add the following to the Salt master config file. + +.. code-block:: yaml + + rest_tornado: + # can be any port + port: 8000 + # address to bind to (defaults to 0.0.0.0) + address: 0.0.0.0 + # socket backlog + backlog: 128 + ssl_crt: /etc/pki/api/certs/server.crt + # no need to specify ssl_key if cert and key + # are in one single file + ssl_key: /etc/pki/api/certs/server.key + debug: False + disable_ssl: False + webhook_disable_auth: False + cors_origin: null + +.. _rest_tornado-auth: + +Authentication +-------------- + +Authentication is performed by passing a session token with each request. +Tokens are generated via the :py:class:`SaltAuthHandler` URL. + +The token may be sent in one of two ways: + +* Include a custom header named :mailheader:`X-Auth-Token`. +* Sent via a cookie. This option is a convenience for HTTP clients that + automatically handle cookie support (such as browsers). + +.. seealso:: You can bypass the session handling via the :py:class:`RunSaltAPIHandler` URL. + +CORS +---- + +rest_tornado supports Cross-site HTTP requests out of the box. It is by default +deactivated and controlled by the `cors_origin` config key. + +You can allow all origins by settings `cors_origin` to `*`. + +You can allow only one origin with this configuration: + +.. code-block:: yaml + + rest_tornado: + cors_origin: http://salt.yourcompany.com + +You can also be more specific and select only a few allowed origins by using +a list. For example: + +.. code-block:: yaml + + rest_tornado: + cors_origin: + - http://salt.yourcompany.com + - http://salt-preprod.yourcampany.com + +The format for origin are full URL, with both scheme and port if not standard. + +In this case, rest_tornado will check if the Origin header is in the allowed +list if it's the case allow the origin. Else it will returns nothing, +effectively preventing the origin to make request. + +For reference, CORS is a mechanism used by browser to allow (or disallow) +requests made from browser from a different origin than salt-api. It's +complementary to Authentication and mandatory only if you plan to use +a salt client developed as a Javascript browser application. + +Usage +----- + +Commands are sent to a running Salt master via this module by sending HTTP +requests to the URLs detailed below. + +.. admonition:: Content negotiation + + This REST interface is flexible in what data formats it will accept as well + as what formats it will return (e.g., JSON, YAML, x-www-form-urlencoded). + + * Specify the format of data in the request body by including the + :mailheader:`Content-Type` header. + * Specify the desired data format for the response body with the + :mailheader:`Accept` header. + +Data sent in :http:method:`post` and :http:method:`put` requests must be in +the format of a list of lowstate dictionaries. This allows multiple commands to +be executed in a single HTTP request. + +.. glossary:: + + lowstate + A dictionary containing various keys that instruct Salt which command + to run, where that command lives, any parameters for that command, any + authentication credentials, what returner to use, etc. + + Salt uses the lowstate data format internally in many places to pass + command data between functions. Salt also uses lowstate for the + :ref:`LocalClient() <python-api>` Python API interface. + +The following example (in JSON format) causes Salt to execute two commands:: + + [{ + "client": "local", + "tgt": "*", + "fun": "test.fib", + "arg": ["10"] + }, + { + "client": "runner", + "fun": "jobs.lookup_jid", + "jid": "20130603122505459265" + }] + +Multiple commands in a Salt API request will be executed in serial and makes +no gaurantees that all commands will run. Meaning that if test.fib (from the +example above) had an exception, the API would still execute "jobs.lookup_jid". + +Responses to these lowstates are an in-order list of dicts containing the +return data, a yaml response could look like:: + + - ms-1: true + ms-2: true + - ms-1: foo + ms-2: bar + +In the event of an exception while executing a command the return for that lowstate +will be a string, for example if no minions matched the first lowstate we would get +a return like:: + + - No minions matched the target. No command was sent, no jid was assigned. + - ms-1: true + ms-2: true + +.. admonition:: x-www-form-urlencoded + + Sending JSON or YAML in the request body is simple and most flexible, + however sending data in urlencoded format is also supported with the + caveats below. It is the default format for HTML forms, many JavaScript + libraries, and the :command:`curl` command. + + For example, the equivalent to running ``salt '*' test.ping`` is sending + ``fun=test.ping&arg&client=local&tgt=*`` in the HTTP request body. + + Caveats: + + * Only a single command may be sent per HTTP request. + * Repeating the ``arg`` parameter multiple times will cause those + parameters to be combined into a single list. + + Note, some popular frameworks and languages (notably jQuery, PHP, and + Ruby on Rails) will automatically append empty brackets onto repeated + parameters. E.g., ``arg=one``, ``arg=two`` will be sent as ``arg[]=one``, + ``arg[]=two``. This is not supported; send JSON or YAML instead. + + +.. |req_token| replace:: a session token from :py:class:`~SaltAuthHandler`. +.. |req_accept| replace:: the desired response format. +.. |req_ct| replace:: the format of the request body. + +.. |res_ct| replace:: the format of the response body; depends on the + :mailheader:`Accept` request header. + +.. |200| replace:: success +.. |400| replace:: bad request +.. |401| replace:: authentication required +.. |406| replace:: requested Content-Type not available +.. |500| replace:: internal server error +''' # pylint: disable=W0105 +# pylint: disable=W0232 + +# Import Python libs +from os import unlink +from os.path import join, isfile +import time +import fnmatch +import logging +from copy import copy +from collections import defaultdict + +# pylint: disable=import-error +import cgi +import yaml +import tornado.escape +import tornado.httpserver +import tornado.ioloop +import tornado.web +import tornado.gen +from tornado.concurrent import Future +from zmq.eventloop import ioloop +import salt.ext.six as six +# pylint: enable=import-error + +# instantiate the zmq IOLoop (specialized poller) +ioloop.install() + +# salt imports +import salt.netapi +import salt.utils +import salt.utils.event +from salt.utils.event import tagify +import salt.client +import salt.runner +import salt.auth +from salt.exceptions import EauthAuthenticationError + +json = salt.utils.import_json() +logger = logging.getLogger() + +# The clients rest_cherrypi supports. We want to mimic the interface, but not +# necessarily use the same API under the hood +# # all of these require coordinating minion stuff +# - "local" (done) +# - "local_async" (done) + +# # master side +# - "runner" (done) +# - "wheel" (need async api...) + + +class SaltClientsMixIn(object): + ''' + MixIn class to container all of the salt clients that the API needs + ''' + # TODO: load this proactively, instead of waiting for a request + __saltclients = None + + @property + def saltclients(self): + if SaltClientsMixIn.__saltclients is None: + local_client = salt.client.get_local_client(mopts=self.application.opts) + # TODO: refreshing clients using cachedict + SaltClientsMixIn.__saltclients = { + 'local': local_client.run_job_async, + # not the actual client we'll use.. but its what we'll use to get args + 'local_async': local_client.run_job_async, + 'runner': salt.runner.RunnerClient(opts=self.application.opts).cmd_async, + 'runner_async': None, # empty, since we use the same client as `runner` + } + return SaltClientsMixIn.__saltclients + + +AUTH_TOKEN_HEADER = 'X-Auth-Token' +AUTH_COOKIE_NAME = 'session_id' + + +class TimeoutException(Exception): + pass + + +class Any(Future): + ''' + Future that wraps other futures to "block" until one is done + ''' + def __init__(self, futures): # pylint: disable=E1002 + super(Any, self).__init__() + for future in futures: + future.add_done_callback(self.done_callback) + + def done_callback(self, future): + # Any is completed once one is done, we don't set for the rest + if not self.done(): + self.set_result(future) + + +class EventListener(object): + ''' + Class responsible for listening to the salt master event bus and updating + futures. This is the core of what makes this async, this allows us to do + non-blocking work in the main processes and "wait" for an event to happen + ''' + + def __init__(self, mod_opts, opts): + self.mod_opts = mod_opts + self.opts = opts + self.event = salt.utils.event.get_event( + 'master', + opts['sock_dir'], + opts['transport'], + opts=opts, + listen=True, + io_loop=tornado.ioloop.IOLoop.current() + ) + + # tag -> list of futures + self.tag_map = defaultdict(list) + + # request_obj -> list of (tag, future) + self.request_map = defaultdict(list) + + # map of future -> timeout_callback + self.timeout_map = {} + + self.event.set_event_handler(self._handle_event_socket_recv) + + def clean_timeout_futures(self, request): + ''' + Remove all futures that were waiting for request `request` since it is done waiting + ''' + if request not in self.request_map: + return + for tag, future in self.request_map[request]: + # timeout the future + self._timeout_future(tag, future) + # remove the timeout + if future in self.timeout_map: + tornado.ioloop.IOLoop.current().remove_timeout(self.timeout_map[future]) + del self.timeout_map[future] + + del self.request_map[request] + + def get_event(self, + request, + tag='', + callback=None, + timeout=None + ): + ''' + Get an event (async of course) return a future that will get it later + ''' + # if the request finished, no reason to allow event fetching, since we + # can't send back to the client + if request._finished: + future = Future() + future.set_exception(TimeoutException()) + return future + + future = Future() + if callback is not None: + def handle_future(future): + tornado.ioloop.IOLoop.current().add_callback(callback, future) + future.add_done_callback(handle_future) + # add this tag and future to the callbacks + self.tag_map[tag].append(future) + self.request_map[request].append((tag, future)) + + if timeout: + timeout_future = tornado.ioloop.IOLoop.current().call_later(timeout, self._timeout_future, tag, future) + self.timeout_map[future] = timeout_future + + return future + + def _timeout_future(self, tag, future): + ''' + Timeout a specific future + ''' + if tag not in self.tag_map: + return + if not future.done(): + future.set_exception(TimeoutException()) + self.tag_map[tag].remove(future) + if len(self.tag_map[tag]) == 0: + del self.tag_map[tag] + + def _handle_event_socket_recv(self, raw): + ''' + Callback for events on the event sub socket + ''' + mtag, data = self.event.unpack(raw, self.event.serial) + # see if we have any futures that need this info: + for tag_prefix, futures in six.iteritems(self.tag_map): + if mtag.startswith(tag_prefix): + for future in futures: + if future.done(): + continue + future.set_result({'data': data, 'tag': mtag}) + self.tag_map[tag_prefix].remove(future) + if future in self.timeout_map: + tornado.ioloop.IOLoop.current().remove_timeout(self.timeout_map[future]) + del self.timeout_map[future] + + +class BaseSaltAPIHandler(tornado.web.RequestHandler, SaltClientsMixIn): # pylint: disable=W0223 + ct_out_map = ( + ('application/json', json.dumps), + ('application/x-yaml', yaml.safe_dump), + ) + + def _verify_client(self, low): + ''' + Verify that the client is in fact one we have + ''' + if 'client' not in low or low.get('client') not in self.saltclients: + self.set_status(400) + self.write("400 Invalid Client: Client not found in salt clients") + self.finish() + return False + return True + + def initialize(self): + ''' + Initialize the handler before requests are called + ''' + if not hasattr(self.application, 'event_listener'): + logger.critical('init a listener') + self.application.event_listener = EventListener( + self.application.mod_opts, + self.application.opts, + ) + + @property + def token(self): + ''' + The token used for the request + ''' + # find the token (cookie or headers) + if AUTH_TOKEN_HEADER in self.request.headers: + return self.request.headers[AUTH_TOKEN_HEADER] + else: + return self.get_cookie(AUTH_COOKIE_NAME) + + def _verify_auth(self): + ''' + Boolean whether the request is auth'd + ''' + + return self.token and bool(self.application.auth.get_tok(self.token)) + + def prepare(self): + ''' + Run before get/posts etc. Pre-flight checks: + - verify that we can speak back to them (compatible accept header) + ''' + # Find an acceptable content-type + accept_header = self.request.headers.get('Accept', '*/*') + # Ignore any parameter, including q (quality) one + parsed_accept_header = [cgi.parse_header(h)[0] for h in accept_header.split(',')] + + def find_acceptable_content_type(parsed_accept_header): + for media_range in parsed_accept_header: + for content_type, dumper in self.ct_out_map: + if fnmatch.fnmatch(content_type, media_range): + return content_type, dumper + return None, None + + content_type, dumper = find_acceptable_content_type(parsed_accept_header) + + # better return message? + if not content_type: + self.send_error(406) + + self.content_type = content_type + self.dumper = dumper + + # do the common parts + self.start = time.time() + self.connected = True + + self.lowstate = self._get_lowstate() + + def timeout_futures(self): + ''' + timeout a session + ''' + # TODO: set a header or something??? so we know it was a timeout + self.application.event_listener.clean_timeout_futures(self) + + def on_finish(self): + ''' + When the job has been done, lets cleanup + ''' + # timeout all the futures + self.timeout_futures() + + def on_connection_close(self): + ''' + If the client disconnects, lets close out + ''' + self.finish() + + def serialize(self, data): + ''' + Serlialize the output based on the Accept header + ''' + self.set_header('Content-Type', self.content_type) + + return self.dumper(data) + + def _form_loader(self, _): + ''' + function to get the data from the urlencoded forms + ignore the data passed in and just get the args from wherever they are + ''' + data = {} + for key in self.request.arguments: + val = self.get_arguments(key) + if len(val) == 1: + data[key] = val[0] + else: + data[key] = val + return data + + def deserialize(self, data): + ''' + Deserialize the data based on request content type headers + ''' + ct_in_map = { + 'application/x-www-form-urlencoded': self._form_loader, + 'application/json': json.loads, + 'application/x-yaml': yaml.safe_load, + 'text/yaml': yaml.safe_load, + # because people are terrible and don't mean what they say + 'text/plain': json.loads + } + + try: + # Use cgi.parse_header to correctly separate parameters from value + value, parameters = cgi.parse_header(self.request.headers['Content-Type']) + return ct_in_map[value](tornado.escape.native_str(data)) + except KeyError: + self.send_error(406) + except ValueError: + self.send_error(400) + + def _get_lowstate(self): + ''' + Format the incoming data into a lowstate object + ''' + if not self.request.body: + return + data = self.deserialize(self.request.body) + self.request_payload = copy(data) + + if data and 'arg' in data and not isinstance(data['arg'], list): + data['arg'] = [data['arg']] + + if not isinstance(data, list): + lowstate = [data] + else: + lowstate = data + + return lowstate + + def set_default_headers(self): + ''' + Set default CORS headers + ''' + mod_opts = self.application.mod_opts + + if mod_opts.get('cors_origin'): + origin = self.request.headers.get('Origin') + + allowed_origin = _check_cors_origin(origin, mod_opts['cors_origin']) + + if allowed_origin: + self.set_header("Access-Control-Allow-Origin", allowed_origin) + + def options(self, *args, **kwargs): + ''' + Return CORS headers for preflight requests + ''' + # Allow X-Auth-Token in requests + request_headers = self.request.headers.get('Access-Control-Request-Headers') + allowed_headers = request_headers.split(',') + + # Filter allowed header here if needed. + + # Allow request headers + self.set_header('Access-Control-Allow-Headers', ','.join(allowed_headers)) + + # Allow X-Auth-Token in responses + self.set_header('Access-Control-Expose-Headers', 'X-Auth-Token') + + # Allow all methods + self.set_header('Access-Control-Allow-Methods', 'OPTIONS, GET, POST') + + self.set_status(204) + self.finish() + + +class SaltAuthHandler(BaseSaltAPIHandler): # pylint: disable=W0223 + ''' + Handler for login requests + ''' + def get(self): + ''' + All logins are done over post, this is a parked enpoint + + .. http:get:: /login + + :status 401: |401| + :status 406: |406| + + **Example request:** + + .. code-block:: bash + + curl -i localhost:8000/login + + .. code-block:: http + + GET /login HTTP/1.1 + Host: localhost:8000 + Accept: application/json + + **Example response:** + + .. code-block:: http + + HTTP/1.1 401 Unauthorized + Content-Type: application/json + Content-Length: 58 + + {"status": "401 Unauthorized", "return": "Please log in"} + ''' + self.set_status(401) + self.set_header('WWW-Authenticate', 'Session') + + ret = {'status': '401 Unauthorized', + 'return': 'Please log in'} + + self.write(self.serialize(ret)) + + # TODO: make async? Underlying library isn't... and we ARE making disk calls :( + def post(self): + ''' + :ref:`Authenticate <rest_tornado-auth>` against Salt's eauth system + + .. http:post:: /login + + :reqheader X-Auth-Token: |req_token| + :reqheader Accept: |req_accept| + :reqheader Content-Type: |req_ct| + + :form eauth: the eauth backend configured for the user + :form username: username + :form password: password + + :status 200: |200| + :status 400: |400| + :status 401: |401| + :status 406: |406| + :status 500: |500| + + **Example request:** + + .. code-block:: bash + + curl -si localhost:8000/login \\ + -H "Accept: application/json" \\ + -d username='saltuser' \\ + -d password='saltpass' \\ + -d eauth='pam' + + .. code-block:: http + + POST / HTTP/1.1 + Host: localhost:8000 + Content-Length: 42 + Content-Type: application/x-www-form-urlencoded + Accept: application/json + + username=saltuser&password=saltpass&eauth=pam + + **Example response:** + + .. code-block:: http + + HTTP/1.1 200 OK + Content-Type: application/json + Content-Length: 206 + X-Auth-Token: 6d1b722e + Set-Cookie: session_id=6d1b722e; expires=Sat, 17 Nov 2012 03:23:52 GMT; Path=/ + + {"return": { + "token": "6d1b722e", + "start": 1363805943.776223, + "expire": 1363849143.776224, + "user": "saltuser", + "eauth": "pam", + "perms": [ + "grains.*", + "status.*", + "sys.*", + "test.*" + ] + }} + ''' + try: + if not isinstance(self.request_payload, dict): + self.send_error(400) + return + + creds = {'username': self.request_payload['username'], + 'password': self.request_payload['password'], + 'eauth': self.request_payload['eauth'], + } + # if any of the args are missing, its a bad request + except KeyError: + self.send_error(400) + return + + token = self.application.resolver.mk_token(creds) + if not token: + logger.debug("Authentication failure or no permissions.") + self.send_error(401) + return + + # copied from cherrypy + token_id = token['token'] + token_timeout = (token['expire'] - token['start']) / 60 + token_user = token['name'] + + # Grab eauth config for the current backend for the current user + try: + eauth = self.application.opts.get('external_auth', {}).get(token['eauth'], {}) + # Get sum of '*' perms, user-specific perms, and group-specific perms + perms = eauth.get(token['name'], []) + perms.extend(eauth.get('*', [])) + + if 'groups' in token and token['groups']: + logger.debug("Getting permissions from Groups ({})".format(token['groups'])) + user_groups = set(token['groups']) + eauth_groups = set([i.rstrip('%') for i in eauth.keys() if i.endswith('%')]) + + for group in user_groups & eauth_groups: + perms.extend(eauth['{0}%'.format(group)]) + + if not perms: + logger.debug("Eauth permission list not found.") + self.send_error(401) + return + + if 'token' not in token: + # TODO: nicer error message + # 'Could not authenticate using provided credentials') + logger.debug("Eauth token id not found.") + self.send_error(401) + # return since we don't want to execute any more + return + + except (AttributeError, IndexError): + logger.debug("Configuration for external_auth malformed for " + "eauth '{0}', and user '{1}'." + .format(token.get('eauth'), token.get('name')), exc_info=True) + # TODO better error -- 'Configuration for external_auth could not be read.' + self.send_error(500) + return + + ret = {'return': [{ + 'token': token['token'], + 'expire': token['expire'], + 'start': token['start'], + 'user': token['name'], + 'eauth': token['eauth'], + 'perms': perms, + }]} + + self.write(self.serialize(ret)) + + +class SaltValidateTokenHandler(BaseSaltAPIHandler): # pylint: disable=W0223 + ''' + Handler for logout requests + ''' + + def post(self): + ''' + Checks token in /var/cache/salt/master/tokens + ''' + if not self._verify_auth(): + self.send_error(401) + return + + +class SaltLogoutHandler(BaseSaltAPIHandler): # pylint: disable=W0223 + ''' + Handler for logout requests + ''' + + def post(self): + ''' + Deletes token in /var/cache/salt/master/tokens + ''' + try: + token_dir = self.application.opts.get('token_dir') + token = self.request.headers.get('X-Auth-Token', "") + + if token and isfile(join(token_dir, token)): + unlink(join(token_dir, token)) + except KeyError: + self.send_error(500) + return + + +class SaltAPIHandler(BaseSaltAPIHandler, SaltClientsMixIn): # pylint: disable=W0223 + ''' + Main API handler for base "/" + ''' + def get(self): + ''' + An enpoint to determine salt-api capabilities + + .. http:get:: / + + :reqheader Accept: |req_accept| + + :status 200: |200| + :status 401: |401| + :status 406: |406| + + **Example request:** + + .. code-block:: bash + + curl -i localhost:8000 + + .. code-block:: http + + GET / HTTP/1.1 + Host: localhost:8000 + Accept: application/json + + **Example response:** + + .. code-block:: http + + HTTP/1.1 200 OK + Content-Type: application/json + Content-Legnth: 83 + + {"clients": ["local", "local_async", "runner", "runner_async"], "return": "Welcome"} + ''' + ret = {"clients": list(self.saltclients.keys()), + "return": "Welcome"} + self.write(self.serialize(ret)) + + @tornado.web.asynchronous + def post(self): + ''' + Send one or more Salt commands (lowstates) in the request body + + .. http:post:: / + + :reqheader X-Auth-Token: |req_token| + :reqheader Accept: |req_accept| + :reqheader Content-Type: |req_ct| + + :resheader Content-Type: |res_ct| + + :status 200: |200| + :status 401: |401| + :status 406: |406| + + :term:`lowstate` data describing Salt commands must be sent in the + request body. + + **Example request:** + + .. code-block:: bash + + curl -si https://localhost:8000 \\ + -H "Accept: application/x-yaml" \\ + -H "X-Auth-Token: d40d1e1e" \\ + -d client=local \\ + -d tgt='*' \\ + -d fun='test.ping' \\ + -d arg + + .. code-block:: http + + POST / HTTP/1.1 + Host: localhost:8000 + Accept: application/x-yaml + X-Auth-Token: d40d1e1e + Content-Length: 36 + Content-Type: application/x-www-form-urlencoded + + fun=test.ping&arg&client=local&tgt=* + + **Example response:** + Responses are an in-order list of the lowstate's return data. In the + event of an exception running a command the return will be a string + instead of a mapping. + + .. code-block:: http + + HTTP/1.1 200 OK + Content-Length: 200 + Allow: GET, HEAD, POST + Content-Type: application/x-yaml + + return: + - ms-0: true + ms-1: true + ms-2: true + ms-3: true + ms-4: true + + .. admonition:: multiple commands + Note that if multiple :term:`lowstate` structures are sent, the Salt + API will execute them in serial, and will not stop execution upon failure + of a previous job. If you need to have commands executed in order and + stop on failure please use compount-command-execution. + + ''' + # if you aren't authenticated, redirect to login + if not self._verify_auth(): + self.redirect('/login') + return + + self.disbatch() + + @tornado.gen.coroutine + def disbatch(self): + ''' + Disbatch all lowstates to the appropriate clients + ''' + ret = [] + + # check clients before going, we want to throw 400 if one is bad + try: + for low in self.lowstate: + if not self._verify_client(low): + return + + # Make sure we have 'token' or 'username'/'password' in each low chunk. + # Salt will verify the credentials are correct. + if self.token is not None and 'token' not in low: + low['token'] = self.token + + if not (('token' in low) + or ('username' in low and 'password' in low and 'eauth' in low)): + ret.append('Failed to authenticate') + break + + # disbatch to the correct handler + try: + chunk_ret = yield getattr(self, '_disbatch_{0}'.format(low['client']))(low) + ret.append(chunk_ret) + except EauthAuthenticationError as exc: + ret.append('Failed to authenticate') + break + except Exception as ex: + ret.append('Unexpected exception while handling request: {0}'.format(ex)) + logger.error('Unexpected exception while handling request:', exc_info=True) + except Exception as ex: + ret.append('Error while parsing request (malformed arguments): {0}'.format(ex)) + logger.error('Error while parsing request (malformed arguments):', exc_info=True) + + self.write(self.serialize({'return': ret})) + self.finish() + + @tornado.gen.coroutine + def _disbatch_local(self, chunk): + ''' + Dispatch local client commands + ''' + chunk_ret = {} + + f_call = self._format_call_run_job_async(chunk) + # fire a job off + try: + pub_data = yield self.saltclients['local'](*f_call.get('args', ()), **f_call.get('kwargs', {})) + except EauthAuthenticationError: + raise tornado.gen.Return('Not authorized to run this job') + + # if the job didn't publish, lets not wait around for nothing + # TODO: set header?? + if 'jid' not in pub_data: + raise tornado.gen.Return('No minions matched the target. No command was sent, no jid was assigned.') + + # seed minions_remaining with the pub_data + minions_remaining = pub_data['minions'] + + syndic_min_wait = None + if self.application.opts['order_masters']: + syndic_min_wait = tornado.gen.sleep(self.application.opts['syndic_wait']) + + job_not_running = self.job_not_running(pub_data['jid'], + chunk['tgt'], + f_call['kwargs']['tgt_type'], + minions_remaining=minions_remaining + ) + + # if we have a min_wait, do that + if syndic_min_wait is not None: + yield syndic_min_wait + # we are completed when either all minions return or the job isn't running anywhere + chunk_ret = yield self.all_returns(pub_data['jid'], + finish_futures=[job_not_running], + minions_remaining=minions_remaining, + ) + + raise tornado.gen.Return(chunk_ret) + + @tornado.gen.coroutine + def all_returns(self, + jid, + finish_futures=None, + minions_remaining=None, + ): + ''' + Return a future which will complete once all returns are completed + (according to minions_remaining), or one of the passed in "finish_futures" completes + ''' + if finish_futures is None: + finish_futures = [] + if minions_remaining is None: + minions_remaining = [] + + ret_tag = tagify([jid, 'ret'], 'job') + chunk_ret = {} + while True: + ret_event = self.application.event_listener.get_event(self, + tag=ret_tag, + ) + f = yield Any([ret_event] + finish_futures) + if f in finish_futures: + raise tornado.gen.Return(chunk_ret) + event = f.result() + chunk_ret[event['data']['id']] = event['data']['return'] + # its possible to get a return that wasn't in the minion_remaining list + try: + minions_remaining.remove(event['data']['id']) + except ValueError: + pass + if len(minions_remaining) == 0: + raise tornado.gen.Return(chunk_ret) + + @tornado.gen.coroutine + def job_not_running(self, + jid, + tgt, + tgt_type, + minions_remaining=None, + ): + ''' + Return a future which will complete once jid (passed in) is no longer + running on tgt + ''' + if minions_remaining is None: + minions_remaining = [] + + ping_pub_data = yield self.saltclients['local'](tgt, + 'saltutil.find_job', + [jid], + tgt_type=tgt_type) + ping_tag = tagify([ping_pub_data['jid'], 'ret'], 'job') + + minion_running = False + while True: + try: + event = yield self.application.event_listener.get_event(self, + tag=ping_tag, + timeout=self.application.opts['gather_job_timeout'], + ) + except TimeoutException: + if not minion_running: + raise tornado.gen.Return(True) + else: + ping_pub_data = yield self.saltclients['local'](tgt, + 'saltutil.find_job', + [jid], + tgt_type=tgt_type) + ping_tag = tagify([ping_pub_data['jid'], 'ret'], 'job') + minion_running = False + continue + # Minions can return, we want to see if the job is running... + if event['data'].get('return', {}) == {}: + continue + minion_running = True + id_ = event['data']['id'] + if id_ not in minions_remaining: + minions_remaining.append(event['data']['id']) + + @tornado.gen.coroutine + def _disbatch_local_async(self, chunk): + ''' + Disbatch local client_async commands + ''' + f_call = self._format_call_run_job_async(chunk) + # fire a job off + pub_data = yield self.saltclients['local_async'](*f_call.get('args', ()), **f_call.get('kwargs', {})) + + raise tornado.gen.Return(pub_data) + + @tornado.gen.coroutine + def _disbatch_runner(self, chunk): + ''' + Disbatch runner client commands + ''' + pub_data = self.saltclients['runner'](chunk) + tag = pub_data['tag'] + '/ret' + try: + event = yield self.application.event_listener.get_event(self, tag=tag) + + # only return the return data + raise tornado.gen.Return(event['data']['return']) + except TimeoutException: + raise tornado.gen.Return('Timeout waiting for runner to execute') + + @tornado.gen.coroutine + def _disbatch_runner_async(self, chunk): + ''' + Disbatch runner client_async commands + ''' + pub_data = self.saltclients['runner'](chunk) + raise tornado.gen.Return(pub_data) + + # salt.utils.format_call doesn't work for functions having the annotation tornado.gen.coroutine + def _format_call_run_job_async(self, chunk): + f_call = salt.utils.format_call(salt.client.LocalClient.run_job, chunk, is_class_method=True) + f_call.get('kwargs', {})['io_loop'] = tornado.ioloop.IOLoop.current() + return f_call + + +class MinionSaltAPIHandler(SaltAPIHandler): # pylint: disable=W0223 + ''' + A convenience endpoint for minion related functions + ''' + @tornado.web.asynchronous + def get(self, mid=None): # pylint: disable=W0221 + ''' + A convenience URL for getting lists of minions or getting minion + details + + .. http:get:: /minions/(mid) + + :reqheader X-Auth-Token: |req_token| + :reqheader Accept: |req_accept| + + :status 200: |200| + :status 401: |401| + :status 406: |406| + + **Example request:** + + .. code-block:: bash + + curl -i localhost:8000/minions/ms-3 + + .. code-block:: http + + GET /minions/ms-3 HTTP/1.1 + Host: localhost:8000 + Accept: application/x-yaml + + **Example response:** + + .. code-block:: http + + HTTP/1.1 200 OK + Content-Length: 129005 + Content-Type: application/x-yaml + + return: + - ms-3: + grains.items: + ... + ''' + # if you aren't authenticated, redirect to login + if not self._verify_auth(): + self.redirect('/login') + return + + self.lowstate = [{ + 'client': 'local', + 'tgt': mid or '*', + 'fun': 'grains.items', + }] + self.disbatch() + + @tornado.web.asynchronous + def post(self): + ''' + Start an execution command and immediately return the job id + + .. http:post:: /minions + + :reqheader X-Auth-Token: |req_token| + :reqheader Accept: |req_accept| + :reqheader Content-Type: |req_ct| + + :resheader Content-Type: |res_ct| + + :status 200: |200| + :status 401: |401| + :status 406: |406| + + :term:`lowstate` data describing Salt commands must be sent in the + request body. The ``client`` option will be set to + :py:meth:`~salt.client.LocalClient.local_async`. + + **Example request:** + + .. code-block:: bash + + curl -sSi localhost:8000/minions \\ + -H "Accept: application/x-yaml" \\ + -d tgt='*' \\ + -d fun='status.diskusage' + + .. code-block:: http + + POST /minions HTTP/1.1 + Host: localhost:8000 + Accept: application/x-yaml + Content-Length: 26 + Content-Type: application/x-www-form-urlencoded + + tgt=*&fun=status.diskusage + + **Example response:** + + .. code-block:: http + + HTTP/1.1 202 Accepted + Content-Length: 86 + Content-Type: application/x-yaml + + return: + - jid: '20130603122505459265' + minions: [ms-4, ms-3, ms-2, ms-1, ms-0] + ''' + # if you aren't authenticated, redirect to login + if not self._verify_auth(): + self.redirect('/login') + return + + # verify that all lowstates are the correct client type + for low in self.lowstate: + # if you didn't specify, its fine + if 'client' not in low: + low['client'] = 'local_async' + continue + # if you specified something else, we don't do that + if low.get('client') != 'local_async': + self.set_status(400) + self.write('We don\'t serve your kind here') + self.finish() + return + + self.disbatch() + + +class JobsSaltAPIHandler(SaltAPIHandler): # pylint: disable=W0223 + ''' + A convenience endpoint for job cache data + ''' + @tornado.web.asynchronous + def get(self, jid=None): # pylint: disable=W0221 + ''' + A convenience URL for getting lists of previously run jobs or getting + the return from a single job + + .. http:get:: /jobs/(jid) + + List jobs or show a single job from the job cache. + + :status 200: |200| + :status 401: |401| + :status 406: |406| + + **Example request:** + + .. code-block:: bash + + curl -i localhost:8000/jobs + + .. code-block:: http + + GET /jobs HTTP/1.1 + Host: localhost:8000 + Accept: application/x-yaml + + **Example response:** + + .. code-block:: http + + HTTP/1.1 200 OK + Content-Length: 165 + Content-Type: application/x-yaml + + return: + - '20121130104633606931': + Arguments: + - '3' + Function: test.fib + Start Time: 2012, Nov 30 10:46:33.606931 + Target: jerry + Target-type: glob + + **Example request:** + + .. code-block:: bash + + curl -i localhost:8000/jobs/20121130104633606931 + + .. code-block:: http + + GET /jobs/20121130104633606931 HTTP/1.1 + Host: localhost:8000 + Accept: application/x-yaml + + **Example response:** + + .. code-block:: http + + HTTP/1.1 200 OK + Content-Length: 73 + Content-Type: application/x-yaml + + info: + - Arguments: + - '3' + Function: test.fib + Minions: + - jerry + Start Time: 2012, Nov 30 10:46:33.606931 + Target: '*' + Target-type: glob + User: saltdev + jid: '20121130104633606931' + return: + - jerry: + - - 0 + - 1 + - 1 + - 2 + - 6.9141387939453125e-06 + ''' + # if you aren't authenticated, redirect to login + if not self._verify_auth(): + self.redirect('/login') + return + + if jid: + self.lowstate = [{ + 'fun': 'jobs.list_job', + 'jid': jid, + 'client': 'runner', + }] + else: + self.lowstate = [{ + 'fun': 'jobs.list_jobs', + 'client': 'runner', + }] + + self.disbatch() + + +class RunSaltAPIHandler(SaltAPIHandler): # pylint: disable=W0223 + ''' + Endpoint to run commands without normal session handling + ''' + @tornado.web.asynchronous + def post(self): + ''' + Run commands bypassing the :ref:`normal session handling + <rest_cherrypy-auth>` + + .. http:post:: /run + + This entry point is primarily for "one-off" commands. Each request + must pass full Salt authentication credentials. Otherwise this URL + is identical to the :py:meth:`root URL (/) <LowDataAdapter.POST>`. + + :term:`lowstate` data describing Salt commands must be sent in the + request body. + + :status 200: |200| + :status 401: |401| + :status 406: |406| + + **Example request:** + + .. code-block:: bash + + curl -sS localhost:8000/run \\ + -H 'Accept: application/x-yaml' \\ + -d client='local' \\ + -d tgt='*' \\ + -d fun='test.ping' \\ + -d username='saltdev' \\ + -d password='saltdev' \\ + -d eauth='pam' + + .. code-block:: http + + POST /run HTTP/1.1 + Host: localhost:8000 + Accept: application/x-yaml + Content-Length: 75 + Content-Type: application/x-www-form-urlencoded + + client=local&tgt=*&fun=test.ping&username=saltdev&password=saltdev&eauth=pam + + **Example response:** + + .. code-block:: http + + HTTP/1.1 200 OK + Content-Length: 73 + Content-Type: application/x-yaml + + return: + - ms-0: true + ms-1: true + ms-2: true + ms-3: true + ms-4: true + ''' + self.disbatch() + + +class EventsSaltAPIHandler(SaltAPIHandler): # pylint: disable=W0223 + ''' + Expose the Salt event bus + + The event bus on the Salt master exposes a large variety of things, notably + when executions are started on the master and also when minions ultimately + return their results. This URL provides a real-time window into a running + Salt infrastructure. + + .. seealso:: :ref:`events` + ''' + @tornado.gen.coroutine + def get(self): + r''' + An HTTP stream of the Salt master event bus + + This stream is formatted per the Server Sent Events (SSE) spec. Each + event is formatted as JSON. + + .. http:get:: /events + + :status 200: |200| + :status 401: |401| + :status 406: |406| + + **Example request:** + + .. code-block:: bash + + curl -NsS localhost:8000/events + + .. code-block:: http + + GET /events HTTP/1.1 + Host: localhost:8000 + + **Example response:** + + .. code-block:: http + + HTTP/1.1 200 OK + Connection: keep-alive + Cache-Control: no-cache + Content-Type: text/event-stream;charset=utf-8 + + retry: 400 + data: {'tag': '', 'data': {'minions': ['ms-4', 'ms-3', 'ms-2', 'ms-1', 'ms-0']}} + + data: {'tag': '20130802115730568475', 'data': {'jid': '20130802115730568475', 'return': True, 'retcode': 0, 'success': True, 'cmd': '_return', 'fun': 'test.ping', 'id': 'ms-1'}} + + The event stream can be easily consumed via JavaScript: + + .. code-block:: javascript + + # Note, you must be authenticated! + var source = new EventSource('/events'); + source.onopen = function() { console.debug('opening') }; + source.onerror = function(e) { console.debug('error!', e) }; + source.onmessage = function(e) { console.debug(e.data) }; + + Or using CORS: + + .. code-block:: javascript + + var source = new EventSource('/events', {withCredentials: true}); + + Some browser clients lack CORS support for the ``EventSource()`` API. Such + clients may instead pass the :mailheader:`X-Auth-Token` value as an URL + parameter: + + .. code-block:: bash + + curl -NsS localhost:8000/events/6d1b722e + + It is also possible to consume the stream via the shell. + + Records are separated by blank lines; the ``data:`` and ``tag:`` + prefixes will need to be removed manually before attempting to + unserialize the JSON. + + curl's ``-N`` flag turns off input buffering which is required to + process the stream incrementally. + + Here is a basic example of printing each event as it comes in: + + .. code-block:: bash + + curl -NsS localhost:8000/events |\ + while IFS= read -r line ; do + echo $line + done + + Here is an example of using awk to filter events based on tag: + + .. code-block:: bash + + curl -NsS localhost:8000/events |\ + awk ' + BEGIN { RS=""; FS="\\n" } + $1 ~ /^tag: salt\/job\/[0-9]+\/new$/ { print $0 } + ' + tag: salt/job/20140112010149808995/new + data: {"tag": "salt/job/20140112010149808995/new", "data": {"tgt_type": "glob", "jid": "20140112010149808995", "tgt": "jerry", "_stamp": "2014-01-12_01:01:49.809617", "user": "shouse", "arg": [], "fun": "test.ping", "minions": ["jerry"]}} + tag: 20140112010149808995 + data: {"tag": "20140112010149808995", "data": {"fun_args": [], "jid": "20140112010149808995", "return": true, "retcode": 0, "success": true, "cmd": "_return", "_stamp": "2014-01-12_01:01:49.819316", "fun": "test.ping", "id": "jerry"}} + ''' + # if you aren't authenticated, redirect to login + if not self._verify_auth(): + self.redirect('/login') + return + # set the streaming headers + self.set_header('Content-Type', 'text/event-stream') + self.set_header('Cache-Control', 'no-cache') + self.set_header('Connection', 'keep-alive') + + self.write(u'retry: {0}\n'.format(400)) + self.flush() + + while True: + try: + event = yield self.application.event_listener.get_event(self) + self.write(u'tag: {0}\n'.format(event.get('tag', ''))) + self.write(u'data: {0}\n\n'.format(json.dumps(event))) + self.flush() + except TimeoutException: + break + + +class WebhookSaltAPIHandler(SaltAPIHandler): # pylint: disable=W0223 + ''' + A generic web hook entry point that fires an event on Salt's event bus + + External services can POST data to this URL to trigger an event in Salt. + For example, Amazon SNS, Jenkins-CI or Travis-CI, or GitHub web hooks. + + .. note:: Be mindful of security + + Salt's Reactor can run any code. A Reactor SLS that responds to a hook + event is responsible for validating that the event came from a trusted + source and contains valid data. + + **This is a generic interface and securing it is up to you!** + + This URL requires authentication however not all external services can + be configured to authenticate. For this reason authentication can be + selectively disabled for this URL. Follow best practices -- always use + SSL, pass a secret key, configure the firewall to only allow traffic + from a known source, etc. + + The event data is taken from the request body. The + :mailheader:`Content-Type` header is respected for the payload. + + The event tag is prefixed with ``salt/netapi/hook`` and the URL path is + appended to the end. For example, a ``POST`` request sent to + ``/hook/mycompany/myapp/mydata`` will produce a Salt event with the tag + ``salt/netapi/hook/mycompany/myapp/mydata``. + + The following is an example ``.travis.yml`` file to send notifications to + Salt of successful test runs: + + .. code-block:: yaml + + language: python + script: python -m unittest tests + after_success: + - 'curl -sS http://saltapi-url.example.com:8000/hook/travis/build/success -d branch="${TRAVIS_BRANCH}" -d commit="${TRAVIS_COMMIT}"' + + .. seealso:: :ref:`events`, :ref:`reactor` + ''' + def post(self, tag_suffix=None): # pylint: disable=W0221 + ''' + Fire an event in Salt with a custom event tag and data + + .. http:post:: /hook + + :status 200: |200| + :status 401: |401| + :status 406: |406| + :status 413: request body is too large + + **Example request:** + + .. code-block:: bash + + curl -sS localhost:8000/hook -d foo='Foo!' -d bar='Bar!' + + .. code-block:: http + + POST /hook HTTP/1.1 + Host: localhost:8000 + Content-Length: 16 + Content-Type: application/x-www-form-urlencoded + + foo=Foo&bar=Bar! + + **Example response**: + + .. code-block:: http + + HTTP/1.1 200 OK + Content-Length: 14 + Content-Type: application/json + + {"success": true} + + As a practical example, an internal continuous-integration build + server could send an HTTP POST request to the URL + ``http://localhost:8000/hook/mycompany/build/success`` which contains + the result of a build and the SHA of the version that was built as + JSON. That would then produce the following event in Salt that could be + used to kick off a deployment via Salt's Reactor:: + + Event fired at Fri Feb 14 17:40:11 2014 + ************************* + Tag: salt/netapi/hook/mycompany/build/success + Data: + {'_stamp': '2014-02-14_17:40:11.440996', + 'headers': { + 'X-My-Secret-Key': 'F0fAgoQjIT@W', + 'Content-Length': '37', + 'Content-Type': 'application/json', + 'Host': 'localhost:8000', + 'Remote-Addr': '127.0.0.1'}, + 'post': {'revision': 'aa22a3c4b2e7', 'result': True}} + + Salt's Reactor could listen for the event: + + .. code-block:: yaml + + reactor: + - 'salt/netapi/hook/mycompany/build/*': + - /srv/reactor/react_ci_builds.sls + + And finally deploy the new build: + + .. code-block:: yaml + + {% set secret_key = data.get('headers', {}).get('X-My-Secret-Key') %} + {% set build = data.get('post', {}) %} + + {% if secret_key == 'F0fAgoQjIT@W' and build.result == True %} + deploy_my_app: + cmd.state.sls: + - tgt: 'application*' + - arg: + - myapp.deploy + - kwarg: + pillar: + revision: {{ revision }} + {% endif %} + ''' + disable_auth = self.application.mod_opts.get('webhook_disable_auth') + if not disable_auth and not self._verify_auth(): + self.redirect('/login') + return + + # if you have the tag, prefix + tag = 'salt/netapi/hook' + if tag_suffix: + tag += tag_suffix + + # TODO: consolidate?? + self.event = salt.utils.event.get_event( + 'master', + self.application.opts['sock_dir'], + self.application.opts['transport'], + opts=self.application.opts, + listen=False) + + arguments = {} + for argname in self.request.query_arguments: + value = self.get_arguments(argname) + if len(value) == 1: + value = value[0] + arguments[argname] = value + ret = self.event.fire_event({ + 'post': self.request_payload, + 'get': arguments, + # In Tornado >= v4.0.3, the headers come + # back as an HTTPHeaders instance, which + # is a dictionary. We must cast this as + # a dictionary in order for msgpack to + # serialize it. + 'headers': dict(self.request.headers), + }, tag) + + self.write(self.serialize({'success': ret})) + + +def _check_cors_origin(origin, allowed_origins): + """ + Check if an origin match cors allowed origins + """ + if isinstance(allowed_origins, list): + if origin in allowed_origins: + return origin + elif allowed_origins == '*': + return allowed_origins + elif allowed_origins == origin: + # Cors origin is either * or specific origin + return allowed_origins diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3-saltstack/files/usr/lib/python3/dist-packages/salt/netapi/rest_eole/saltnado_websockets.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3-saltstack/files/usr/lib/python3/dist-packages/salt/netapi/rest_eole/saltnado_websockets.py new file mode 100644 index 0000000000000000000000000000000000000000..33c37f1872881989793d903ad83c24b1cf85ce78 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3-saltstack/files/usr/lib/python3/dist-packages/salt/netapi/rest_eole/saltnado_websockets.py @@ -0,0 +1,428 @@ +# encoding: utf-8 +''' +A Websockets add-on to saltnado +=============================== + +.. py:currentmodule:: salt.netapi.rest_tornado.saltnado + +:depends: - tornado Python module + +In order to enable saltnado_websockets you must add websockets: True to your +saltnado config block. + +.. code-block:: yaml + + rest_tornado: + # can be any port + port: 8000 + ssl_crt: /etc/pki/api/certs/server.crt + # no need to specify ssl_key if cert and key + # are in one single file + ssl_key: /etc/pki/api/certs/server.key + debug: False + disable_ssl: False + websockets: True + +All Events +---------- + +Exposes ``all`` "real-time" events from Salt's event bus on a websocket connection. +It should be noted that "Real-time" here means these events are made available +to the server as soon as any salt related action (changes to minions, new jobs etc) happens. +Clients are however assumed to be able to tolerate any network transport related latencies. +Functionality provided by this endpoint is similar to the ``/events`` end point. + +The event bus on the Salt master exposes a large variety of things, notably +when executions are started on the master and also when minions ultimately +return their results. This URL provides a real-time window into a running +Salt infrastructure. Uses websocket as the transport mechanism. + +Exposes GET method to return websocket connections. +All requests should include an auth token. +A way to obtain obtain authentication tokens is shown below. + +.. code-block:: bash + + % curl -si localhost:8000/login \\ + -H "Accept: application/json" \\ + -d username='salt' \\ + -d password='salt' \\ + -d eauth='pam' + +Which results in the response + +.. code-block:: json + + { + "return": [{ + "perms": [".*", "@runner", "@wheel"], + "start": 1400556492.277421, + "token": "d0ce6c1a37e99dcc0374392f272fe19c0090cca7", + "expire": 1400599692.277422, + "user": "salt", + "eauth": "pam" + }] + } + +In this example the ``token`` returned is ``d0ce6c1a37e99dcc0374392f272fe19c0090cca7`` and can be included +in subsequent websocket requests (as part of the URL). + +The event stream can be easily consumed via JavaScript: + +.. code-block:: javascript + + // Note, you must be authenticated! + + // Get the Websocket connection to Salt + var source = new Websocket('wss://localhost:8000/all_events/d0ce6c1a37e99dcc0374392f272fe19c0090cca7'); + + // Get Salt's "real time" event stream. + source.onopen = function() { source.send('websocket client ready'); }; + + // Other handlers + source.onerror = function(e) { console.debug('error!', e); }; + + // e.data represents Salt's "real time" event data as serialized JSON. + source.onmessage = function(e) { console.debug(e.data); }; + + // Terminates websocket connection and Salt's "real time" event stream on the server. + source.close(); + +Or via Python, using the Python module +`websocket-client <https://pypi.python.org/pypi/websocket-client/>`_ for example. +Or the tornado +`client <https://tornado.readthedocs.io/en/latest/websocket.html#client-side-support>`_. + +.. code-block:: python + + # Note, you must be authenticated! + + from websocket import create_connection + + # Get the Websocket connection to Salt + ws = create_connection('wss://localhost:8000/all_events/d0ce6c1a37e99dcc0374392f272fe19c0090cca7') + + # Get Salt's "real time" event stream. + ws.send('websocket client ready') + + + # Simple listener to print results of Salt's "real time" event stream. + # Look at https://pypi.python.org/pypi/websocket-client/ for more examples. + while listening_to_events: + print ws.recv() # Salt's "real time" event data as serialized JSON. + + # Terminates websocket connection and Salt's "real time" event stream on the server. + ws.close() + + # Please refer to https://github.com/liris/websocket-client/issues/81 when using a self signed cert + +Above examples show how to establish a websocket connection to Salt and activating +real time updates from Salt's event stream by signaling ``websocket client ready``. + + +Formatted Events +----------------- + +Exposes ``formatted`` "real-time" events from Salt's event bus on a websocket connection. +It should be noted that "Real-time" here means these events are made available +to the server as soon as any salt related action (changes to minions, new jobs etc) happens. +Clients are however assumed to be able to tolerate any network transport related latencies. +Functionality provided by this endpoint is similar to the ``/events`` end point. + +The event bus on the Salt master exposes a large variety of things, notably +when executions are started on the master and also when minions ultimately +return their results. This URL provides a real-time window into a running +Salt infrastructure. Uses websocket as the transport mechanism. + +Formatted events parses the raw "real time" event stream and maintains +a current view of the following: + +- minions +- jobs + +A change to the minions (such as addition, removal of keys or connection drops) +or jobs is processed and clients are updated. +Since we use salt's presence events to track minions, +please enable ``presence_events`` +and set a small value for the ``loop_interval`` +in the salt master config file. + +Exposes GET method to return websocket connections. +All requests should include an auth token. +A way to obtain obtain authentication tokens is shown below. + +.. code-block:: bash + + % curl -si localhost:8000/login \\ + -H "Accept: application/json" \\ + -d username='salt' \\ + -d password='salt' \\ + -d eauth='pam' + +Which results in the response + +.. code-block:: json + + { + "return": [{ + "perms": [".*", "@runner", "@wheel"], + "start": 1400556492.277421, + "token": "d0ce6c1a37e99dcc0374392f272fe19c0090cca7", + "expire": 1400599692.277422, + "user": "salt", + "eauth": "pam" + }] + } + +In this example the ``token`` returned is ``d0ce6c1a37e99dcc0374392f272fe19c0090cca7`` and can be included +in subsequent websocket requests (as part of the URL). + +The event stream can be easily consumed via JavaScript: + +.. code-block:: javascript + + // Note, you must be authenticated! + + // Get the Websocket connection to Salt + var source = new Websocket('wss://localhost:8000/formatted_events/d0ce6c1a37e99dcc0374392f272fe19c0090cca7'); + + // Get Salt's "real time" event stream. + source.onopen = function() { source.send('websocket client ready'); }; + + // Other handlers + source.onerror = function(e) { console.debug('error!', e); }; + + // e.data represents Salt's "real time" event data as serialized JSON. + source.onmessage = function(e) { console.debug(e.data); }; + + // Terminates websocket connection and Salt's "real time" event stream on the server. + source.close(); + +Or via Python, using the Python module +`websocket-client <https://pypi.python.org/pypi/websocket-client/>`_ for example. +Or the tornado +`client <https://tornado.readthedocs.io/en/latest/websocket.html#client-side-support>`_. + +.. code-block:: python + + # Note, you must be authenticated! + + from websocket import create_connection + + # Get the Websocket connection to Salt + ws = create_connection('wss://localhost:8000/formatted_events/d0ce6c1a37e99dcc0374392f272fe19c0090cca7') + + # Get Salt's "real time" event stream. + ws.send('websocket client ready') + + + # Simple listener to print results of Salt's "real time" event stream. + # Look at https://pypi.python.org/pypi/websocket-client/ for more examples. + while listening_to_events: + print ws.recv() # Salt's "real time" event data as serialized JSON. + + # Terminates websocket connection and Salt's "real time" event stream on the server. + ws.close() + + # Please refer to https://github.com/liris/websocket-client/issues/81 when using a self signed cert + +Above examples show how to establish a websocket connection to Salt and activating +real time updates from Salt's event stream by signaling ``websocket client ready``. + +Example responses +----------------- + +``Minion information`` is a dictionary keyed by each connected minion's ``id`` (``mid``), +grains information for each minion is also included. + +Minion information is sent in response to the following minion events: + +- connection drops + - requires running ``manage.present`` periodically every ``loop_interval`` seconds +- minion addition +- minon removal + +.. code-block:: python + + # Not all grains are shown + data: { + "minions": { + "minion1": { + "id": "minion1", + "grains": { + "kernel": "Darwin", + "domain": "local", + "zmqversion": "4.0.3", + "kernelrelease": "13.2.0" + } + } + } + } + +``Job information`` is also tracked and delivered. + +Job information is also a dictionary +in which each job's information is keyed by salt's ``jid``. + +.. code-block:: python + + data: { + "jobs": { + "20140609153646699137": { + "tgt_type": "glob", + "jid": "20140609153646699137", + "tgt": "*", + "start_time": "2014-06-09T15:36:46.700315", + "state": "complete", + "fun": "test.ping", + "minions": { + "minion1": { + "return": true, + "retcode": 0, + "success": true + } + } + } + } + } + +Setup +===== +''' +from __future__ import absolute_import + +import tornado.websocket +from . import event_processor +from .saltnado import _check_cors_origin + +import tornado.gen + +import salt.utils +import salt.netapi + +json = salt.utils.import_json() + +import logging +logger = logging.getLogger() + + +class AllEventsHandler(tornado.websocket.WebSocketHandler): # pylint: disable=W0223,W0232 + ''' + Server side websocket handler. + ''' + + # pylint: disable=W0221 + def get(self, token): + ''' + Check the token, returns a 401 if the token is invalid. + Else open the websocket connection + ''' + logger.debug('In the websocket get method') + + self.token = token + # close the connection, if not authenticated + if not self.application.auth.get_tok(token): + logger.debug('Refusing websocket connection, bad token!') + self.send_error(401) + return + super(AllEventsHandler, self).get(token) + + def open(self, token): # pylint: disable=W0221 + ''' + Return a websocket connection to Salt + representing Salt's "real time" event stream. + ''' + self.connected = False + + @tornado.gen.coroutine + def on_message(self, message): + """Listens for a "websocket client ready" message. + Once that message is received an asynchronous job + is stated that yields messages to the client. + These messages make up salt's + "real time" event stream. + """ + logger.debug('Got websocket message {0}'.format(message)) + if message == 'websocket client ready': + if self.connected: + # TBD: Add ability to run commands in this branch + logger.debug('Websocket already connected, returning') + return + + self.connected = True + + while True: + try: + event = yield self.application.event_listener.get_event(self) + self.write_message(json.dumps(event)) + except Exception as err: + logger.info('Error! Ending server side websocket connection. Reason = {0}'.format(str(err))) + break + + self.close() + else: + # TBD: Add logic to run salt commands here + pass + + def on_close(self, *args, **kwargs): + '''Cleanup. + + ''' + logger.debug('In the websocket close method') + self.close() + + def check_origin(self, origin): + """ + If cors is enabled, check that the origin is allowed + """ + + mod_opts = self.application.mod_opts + + if mod_opts.get('cors_origin'): + return bool(_check_cors_origin(origin, mod_opts['cors_origin'])) + else: + return super(AllEventsHandler, self).check_origin(origin) + + +class FormattedEventsHandler(AllEventsHandler): # pylint: disable=W0223,W0232 + + @tornado.gen.coroutine + def on_message(self, message): + """Listens for a "websocket client ready" message. + Once that message is received an asynchronous job + is stated that yields messages to the client. + These messages make up salt's + "real time" event stream. + """ + logger.debug('Got websocket message {0}'.format(message)) + if message == 'websocket client ready': + if self.connected: + # TBD: Add ability to run commands in this branch + logger.debug('Websocket already connected, returning') + return + + self.connected = True + + evt_processor = event_processor.SaltInfo(self) + client = salt.netapi.NetapiClient(self.application.opts) + client.run({ + 'fun': 'grains.items', + 'tgt': '*', + 'token': self.token, + 'mode': 'client', + 'async': 'local_async', + 'client': 'local' + }) + while True: + try: + event = yield self.application.event_listener.get_event(self) + evt_processor.process(event, self.token, self.application.opts) + # self.write_message(u'data: {0}\n\n'.format(json.dumps(event))) + except Exception as err: + logger.debug('Error! Ending server side websocket connection. Reason = {0}'.format(str(err))) + break + + self.close() + else: + # TBD: Add logic to run salt commands here + pass diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3-saltstack/files/usr/share/eole/sbin/dumpconfig.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3-saltstack/files/usr/share/eole/sbin/dumpconfig.py new file mode 100644 index 0000000000000000000000000000000000000000..4a591d922f54d381fc2c1e0ed07d331aad8b49d0 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3-saltstack/files/usr/share/eole/sbin/dumpconfig.py @@ -0,0 +1,6 @@ +#!/usr/bin/python + +from creole.client import CreoleClient +from json import dumps + +print dumps(CreoleClient().get('/')) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3-saltstack/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3-saltstack/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..616f54a367f1b7be621dc6c7d22ed641d19f250b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3-saltstack/service.yml @@ -0,0 +1,68 @@ +format: '0.1' +name: eole-ead3-saltstack +version: |- + 2.7.1-4 +description: |- + saltstack's EOLE configuration and integration for EAD3 + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: [] +packages: + - eole-common + - salt-api + - salt-master + - salt-minion +dictionaries: + - 20_saltstack_ead3.xml +extra_dictionaries: {} +templates: + - cherry.conf + - ext_auth.conf + - master + - minion + - minion.smtp.conf +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: [] +files: + /lib/systemd/system/salt-api-ead3.service: + owner: root + group: root + mode: '0644' + /lib/systemd/system/salt-master-ead3.service: + owner: root + group: root + mode: '0644' + /lib/systemd/system/salt-minion-ead3.service: + owner: root + group: root + mode: '0644' + /usr/lib/python3/dist-packages/eole_salt_netapi-2.7.1.egg-info: + owner: root + group: root + mode: '0644' + /usr/lib/python3/dist-packages/salt/netapi/rest_eole/__init__.py: + owner: root + group: root + mode: '0644' + /usr/lib/python3/dist-packages/salt/netapi/rest_eole/event_processor.py: + owner: root + group: root + mode: '0644' + /usr/lib/python3/dist-packages/salt/netapi/rest_eole/saltnado.py: + owner: root + group: root + mode: '0644' + /usr/lib/python3/dist-packages/salt/netapi/rest_eole/saltnado_websockets.py: + owner: root + group: root + mode: '0644' + /usr/share/eole/sbin/dumpconfig.py: + owner: root + group: root + mode: '0755' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3-saltstack/templates/cherry.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3-saltstack/templates/cherry.conf new file mode 100644 index 0000000000000000000000000000000000000000..6aeb7b4c544c0b055b90a63d57a59e772b3a4b5f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3-saltstack/templates/cherry.conf @@ -0,0 +1,7 @@ +rest_eole: + host: 0.0.0.0 + port: %%salt_api_port + disable_ssl: true + cors_origin: "*" + websockets: true + debug: true diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3-saltstack/templates/ext_auth.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3-saltstack/templates/ext_auth.conf new file mode 100644 index 0000000000000000000000000000000000000000..9cadb35c14caa0e6932ccb027753de31b3b4ad90 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3-saltstack/templates/ext_auth.conf @@ -0,0 +1,67 @@ +%set %%DEFAULT_ROLE = {u'ead_admin': [{'name': 'adm', 'type': 'group'}]} +%set %%DEFAULT_PROFILE = [u'ead_admin'] +µµµµµµµµµµ %%dico looks like {action_name: {'profile': [profiles], 'activate': True, 'ewtapp': [ewtapps]}}, where profiles is a list +µµµµµµµµµµ for example {u'shutdown': [u'admin_ead']} +%set %%dico = {} +%set %%action_names = {} +%for %%path, %%value in %%creole_client.get('/actions', {}).items() + %set %%splitted_path = %%path.split('.') + %if %%len(%%splitted_path) == 2 + %continue + %else + µµµµµµµµµµ set name to <family>.<varname> (same name if several families) + %set %%name = '.'.join(%%splitted_path[0:2]) + %set %%type_ = %%splitted_path[2] + %end if + %silent %%dico.setdefault(%%name, {'profile': [], 'activate': False, 'ewtapp': []}) + %if %%type_ in ['profile', 'activate', 'ewtapp', 'saltaction'] + %silent %%dico[%%name][%%type_] = %%value + %end if + %if type_ == 'name' + %set %%action_names[%%name] = %%value + %end if +%end for +%if %%dico != {} +µµµµµµµµµµ %%users' dict looks like {user/group: actions}, where actions is a list +µµµµµµµµµµ for example {'adm%': [u'shutdown']} + %set %%users = {} + %set %%custom_actions = {} + %for %%action, %%action_infos in %%dico.items() + %if %%action_infos['activate'] + %set %%action_profiles = %%action_infos['profile'] + %if %%action_profiles == [] + %set %%action_profiles = %%DEFAULT_PROFILE + %end if + %for %%action_profile in %%action_profiles + %set %%roles = %%DEFAULT_ROLE[%%action_profile] + %for %%role in %%roles + %set %%user = %%role['name'] + %if %%role['type'] == 'group' + %set %%user += '%' + %end if + %silent %%users.setdefault(%%user, []).append(%%action) + %if 'saltaction' in %%action_infos + %for %%saltaction in %%action_infos['saltaction'] + %silent %%custom_actions.setdefault(%%user, []).append(%%saltaction) + %end for + %end if + %end for + %end for + %end if + %end for +external_auth: + pam: + %for %%user, %%actions in %%users.items() + %%user: + %for %%action in %%actions + %for %%ewtapp in %%dico[%%action]['ewtapp'] + - %%ewtapp.%%{action_names[%%action]}_.* + %end for + %end for + %if %%user in %%custom_actions + %for %%action in %%custom_actions[%%user] + - %%action + %end for + %end if + %end for +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3-saltstack/templates/master b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3-saltstack/templates/master new file mode 100644 index 0000000000000000000000000000000000000000..1ede85047ef03584956cb9dde8d9c0b088182916 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3-saltstack/templates/master @@ -0,0 +1,1013 @@ +##### Primary configuration settings ##### +########################################## +# This configuration file is used to manage the behavior of the Salt Master. +# Values that are commented out but have an empty line after the comment are +# defaults that do not need to be set in the config. If there is no blank line +# after the comment then the value is presented as an example and is not the +# default. + +# Per default, the master will automatically include all config files +# from master.d/*.conf (master.d is a directory in the same directory +# as the main master config file). +#default_include: master.d/*.conf + +# The address of the interface to bind to: +#interface: 0.0.0.0 + +# Whether the master should listen for IPv6 connections. If this is set to True, +# the interface option must be adjusted, too. (For example: "interface: '::'") +#ipv6: False + +# The tcp port used by the publisher: +publish_port: 4605 + +# The user under which the salt master will run. Salt will update all +# permissions to allow the specified user to run the master. The exception is +# the job cache, which must be deleted if this user is changed. If the +# modified files cause conflicts, set verify_env to False. +user: root + +# The port used by the communication interface. The ret (return) port is the +# interface used for the file server, authentication, job returns, etc. +ret_port: 4606 + +# Specify the location of the daemon process ID file: +#pidfile: /var/run/salt-master.pid + +# The root directory prepended to these options: pki_dir, cachedir, +# sock_dir, log_file, autosign_file, autoreject_file, extension_modules, +# key_logfile, pidfile: +root_dir: /var/lib/ead3/ + +# The path to the master's configuration file. +#conf_file: /etc/salt/master + +# Directory used to store public key data: +#pki_dir: /etc/salt/pki/master + +# Directory to store job and cache data: +# This directory may contain sensitive data and should be protected accordingly. +# +#cachedir: /var/cache/salt/master + +# Directory for custom modules. This directory can contain subdirectories for +# each of Salt's module types such as "runners", "output", "wheel", "modules", +# "states", "returners", etc. +#extension_modules: <no default> + +# Directory for custom modules. This directory can contain subdirectories for +# each of Salt's module types such as "runners", "output", "wheel", "modules", +# "states", "returners", etc. +# Like 'extension_modules' but can take an array of paths +#module_dirs: <no default> +# - /var/cache/salt/minion/extmods + +# Verify and set permissions on configuration directories at startup: +#verify_env: True + +# Set the number of hours to keep old job information in the job cache: +#keep_jobs: 24 + +# The number of seconds to wait when the client is requesting information +# about running jobs. +#gather_job_timeout: 10 + +# Set the default timeout for the salt command and api. The default is 5 +# seconds. +#timeout: 5 + +# The loop_interval option controls the seconds for the master's maintenance +# process check cycle. This process updates file server backends, cleans the +# job cache and executes the scheduler. +#loop_interval: 60 + +# Set the default outputter used by the salt command. The default is "nested". +#output: nested + +# Set the default output file used by the salt command. Default is to output +# to the CLI and not to a file. Functions the same way as the "--out-file" +# CLI option, only sets this to a single file for all salt commands. +#output_file: None + +# Return minions that timeout when running commands like test.ping +#show_timeout: True + +# By default, output is colored. To disable colored output, set the color value +# to False. +#color: True + +# Do not strip off the colored output from nested results and state outputs +# (true by default). +# strip_colors: False + +# To display a summary of the number of minions targeted, the number of +# minions returned, and the number of minions that did not return, set the +# cli_summary value to True. (False by default.) +# +#cli_summary: False + +# Set the directory used to hold unix sockets: +#sock_dir: /var/run/salt/master + +# The master can take a while to start up when lspci and/or dmidecode is used +# to populate the grains for the master. Enable if you want to see GPU hardware +# data for your master. +# enable_gpu_grains: False + +# The master maintains a job cache. While this is a great addition, it can be +# a burden on the master for larger deployments (over 5000 minions). +# Disabling the job cache will make previously executed jobs unavailable to +# the jobs system and is not generally recommended. +#job_cache: True + +# Cache minion grains and pillar data in the cachedir. +#minion_data_cache: True + +# Store all returns in the given returner. +# Setting this option requires that any returner-specific configuration also +# be set. See various returners in salt/returners for details on required +# configuration values. (See also, event_return_queue below.) +# +#event_return: mysql + +# On busy systems, enabling event_returns can cause a considerable load on +# the storage system for returners. Events can be queued on the master and +# stored in a batched fashion using a single transaction for multiple events. +# By default, events are not queued. +#event_return_queue: 0 + +# Only return events matching tags in a whitelist, +# event_return_whitelist: +# - salt/master/a_tag +# - salt/master/another_tag + +# Store all event returns _except_ the tags in a blacklist. +# event_return_blacklist: +# - salt/master/not_this_tag +# - salt/master/or_this_one + +# Passing very large events can cause the minion to consume large amounts of +# memory. This value tunes the maximum size of a message allowed onto the +# master event bus. The value is expressed in bytes. +#max_event_size: 1048576 + +# By default, the master AES key rotates every 24 hours. The next command +# following a key rotation will trigger a key refresh from the minion which may +# result in minions which do not respond to the first command after a key refresh. +# +# To tell the master to ping all minions immediately after an AES key refresh, set +# ping_on_rotate to True. This should mitigate the issue where a minion does not +# appear to initially respond after a key is rotated. +# +# Note that ping_on_rotate may cause high load on the master immediately after +# the key rotation event as minions reconnect. Consider this carefully if this +# salt master is managing a large number of minions. +# +# If disabled, it is recommended to handle this event by listening for the +# 'aes_key_rotate' event with the 'key' tag and acting appropriately. +# ping_on_rotate: False + +# By default, the master deletes its cache of minion data when the key for that +# minion is removed. To preserve the cache after key deletion, set +# 'preserve_minion_cache' to True. +# +# WARNING: This may have security implications if compromised minions auth with +# a previous deleted minion ID. +#preserve_minion_cache: False + +# If max_minions is used in large installations, the master might experience +# high-load situations because of having to check the number of connected +# minions for every authentication. This cache provides the minion-ids of +# all connected minions to all MWorker-processes and greatly improves the +# performance of max_minions. +# con_cache: False + +# The master can include configuration from other files. To enable this, +# pass a list of paths to this option. The paths can be either relative or +# absolute; if relative, they are considered to be relative to the directory +# the main master configuration file lives in (this file). Paths can make use +# of shell-style globbing. If no files are matched by a path passed to this +# option, then the master will log a warning message. +# +# Include a config file from some other path: +# include: /etc/salt/extra_config +# +# Include config from several files and directories: +# include: +# - /etc/salt/extra_config + + +##### Large-scale tuning settings ##### +########################################## +# Max open files +# +# Each minion connecting to the master uses AT LEAST one file descriptor, the +# master subscription connection. If enough minions connect you might start +# seeing on the console (and then salt-master crashes): +# Too many open files (tcp_listener.cpp:335) +# Aborted (core dumped) +# +# By default this value will be the one of `ulimit -Hn`, ie, the hard limit for +# max open files. +# +# If you wish to set a different value than the default one, uncomment and +# configure this setting. Remember that this value CANNOT be higher than the +# hard limit. Raising the hard limit depends on your OS and/or distribution, +# a good way to find the limit is to search the internet. For example: +# raise max open files hard limit debian +# +#max_open_files: 100000 + +# The number of worker threads to start. These threads are used to manage +# return calls made from minions to the master. If the master seems to be +# running slowly, increase the number of threads. This setting can not be +# set lower than 3. +#worker_threads: 5 + +# Set the ZeroMQ high water marks +# http://api.zeromq.org/3-2:zmq-setsockopt + +# The publisher interface ZeroMQPubServerChannel +#pub_hwm: 1000 + +# These two ZMQ HWM settings, salt_event_pub_hwm and event_publisher_pub_hwm +# are significant for masters with thousands of minions. When these are +# insufficiently high it will manifest in random responses missing in the CLI +# and even missing from the job cache. Masters that have fast CPUs and many +# cores with appropriate worker_threads will not need these set as high. + +# On deployment with 8,000 minions, 2.4GHz CPUs, 24 cores, 32GiB memory has +# these settings: +# +# salt_event_pub_hwm: 128000 +# event_publisher_pub_hwm: 64000 + +# ZMQ high-water-mark for SaltEvent pub socket +#salt_event_pub_hwm: 20000 + +# ZMQ high-water-mark for EventPublisher pub socket +#event_publisher_pub_hwm: 10000 + +# The master may allocate memory per-event and not +# reclaim it. +# To set a high-water mark for memory allocation, use +# ipc_write_buffer to set a high-water mark for message +# buffering. +# Value: In bytes. Set to 'dynamic' to have Salt select +# a value for you. Default is disabled. +# ipc_write_buffer: 'dynamic' + + +##### Security settings ##### +########################################## +# Enable "open mode", this mode still maintains encryption, but turns off +# authentication, this is only intended for highly secure environments or for +# the situation where your keys end up in a bad state. If you run in open mode +# you do so at your own risk! +#open_mode: False + +# Enable auto_accept, this setting will automatically accept all incoming +# public keys from the minions. Note that this is insecure. +#auto_accept: False + +# Time in minutes that a incoming public key with a matching name found in +# pki_dir/minion_autosign/keyid is automatically accepted. Expired autosign keys +# are removed when the master checks the minion_autosign directory. +# 0 equals no timeout +# autosign_timeout: 120 + +# If the autosign_file is specified, incoming keys specified in the +# autosign_file will be automatically accepted. This is insecure. Regular +# expressions as well as globing lines are supported. +#autosign_file: /etc/salt/autosign.conf + +# Works like autosign_file, but instead allows you to specify minion IDs for +# which keys will automatically be rejected. Will override both membership in +# the autosign_file and the auto_accept setting. +#autoreject_file: /etc/salt/autoreject.conf + +# Enable permissive access to the salt keys. This allows you to run the +# master or minion as root, but have a non-root group be given access to +# your pki_dir. To make the access explicit, root must belong to the group +# you've given access to. This is potentially quite insecure. If an autosign_file +# is specified, enabling permissive_pki_access will allow group access to that +# specific file. +#permissive_pki_access: False + +# Allow users on the master access to execute specific commands on minions. +# This setting should be treated with care since it opens up execution +# capabilities to non root users. By default this capability is completely +# disabled. +#pulisher_acl: +# larry: +# - test.ping +# - network.* +# +# Blacklist any of the following users or modules +# +# This example would blacklist all non sudo users, including root from +# running any commands. It would also blacklist any use of the "cmd" +# module. This is completely disabled by default. +# +# +# Check the list of configured users in client ACL against users on the +# system and throw errors if they do not exist. +#client_acl_verify: True +# +#publisher_acl_blacklist: +# users: +# - root +# - '^(?!sudo_).*$' # all non sudo users +# modules: +# - cmd +# +# WARNING: client_acl and client_acl_blacklist options are deprecated and will +# be removed in the future releases. Use publisher_acl and +# publisher_acl_blacklist instead. + +# Enforce publisher_acl & publisher_acl_blacklist when users have sudo +# access to the salt command. +# +#sudo_acl: False + +# The external auth system uses the Salt auth modules to authenticate and +# validate users to access areas of the Salt system. +#external_auth: +# pam: +# fred: +# - test.* +# +# Time (in seconds) for a newly generated token to live. Default: 12 hours +#token_expire: 43200 + +# Allow minions to push files to the master. This is disabled by default, for +# security purposes. +#file_recv: False + +# Set a hard-limit on the size of the files that can be pushed to the master. +# It will be interpreted as megabytes. Default: 100 +#file_recv_max_size: 100 + +# Signature verification on messages published from the master. +# This causes the master to cryptographically sign all messages published to its event +# bus, and minions then verify that signature before acting on the message. +# +# This is False by default. +# +# Note that to facilitate interoperability with masters and minions that are different +# versions, if sign_pub_messages is True but a message is received by a minion with +# no signature, it will still be accepted, and a warning message will be logged. +# Conversely, if sign_pub_messages is False, but a minion receives a signed +# message it will be accepted, the signature will not be checked, and a warning message +# will be logged. This behavior went away in Salt 2014.1.0 and these two situations +# will cause minion to throw an exception and drop the message. +# sign_pub_messages: False + +##### Salt-SSH Configuration ##### +########################################## + +# Pass in an alternative location for the salt-ssh roster file +#roster_file: /etc/salt/roster + +# Pass in minion option overrides that will be inserted into the SHIM for +# salt-ssh calls. The local minion config is not used for salt-ssh. Can be +# overridden on a per-minion basis in the roster (`minion_opts`) +#ssh_minion_opts: +# gpg_keydir: /root/gpg + +##### Master Module Management ##### +########################################## +# Manage how master side modules are loaded. + +# Add any additional locations to look for master runners: +#runner_dirs: [] + +# Enable Cython for master side modules: +#cython_enable: False + + +##### State System settings ##### +########################################## +# The state system uses a "top" file to tell the minions what environment to +# use and what modules to use. The state_top file is defined relative to the +# root of the base environment as defined in "File Server settings" below. +#state_top: top.sls + +# The master_tops option replaces the external_nodes option by creating +# a plugable system for the generation of external top data. The external_nodes +# option is deprecated by the master_tops option. +# +# To gain the capabilities of the classic external_nodes system, use the +# following configuration: +# master_tops: +# ext_nodes: <Shell command which returns yaml> +# +#master_tops: {} + +# The external_nodes option allows Salt to gather data that would normally be +# placed in a top file. The external_nodes option is the executable that will +# return the ENC data. Remember that Salt will look for external nodes AND top +# files and combine the results if both are enabled! +#external_nodes: None + +# The renderer to use on the minions to render the state data +#renderer: yaml_jinja + +# The Jinja renderer can strip extra carriage returns and whitespace +# See http://jinja.pocoo.org/docs/api/#high-level-api +# +# If this is set to True the first newline after a Jinja block is removed +# (block, not variable tag!). Defaults to False, corresponds to the Jinja +# environment init variable "trim_blocks". +#jinja_trim_blocks: False +# +# If this is set to True leading spaces and tabs are stripped from the start +# of a line to a block. Defaults to False, corresponds to the Jinja +# environment init variable "lstrip_blocks". +#jinja_lstrip_blocks: False + +# The failhard option tells the minions to stop immediately after the first +# failure detected in the state execution, defaults to False +#failhard: False + +# The state_verbose and state_output settings can be used to change the way +# state system data is printed to the display. By default all data is printed. +# The state_verbose setting can be set to True or False, when set to False +# all data that has a result of True and no changes will be suppressed. +#state_verbose: True + +# The state_output setting changes if the output is the full multi line +# output for each changed state if set to 'full', but if set to 'terse' +# the output will be shortened to a single line. If set to 'mixed', the output +# will be terse unless a state failed, in which case that output will be full. +# If set to 'changes', the output will be full unless the state didn't change. +#state_output: full + +# Automatically aggregate all states that have support for mod_aggregate by +# setting to 'True'. Or pass a list of state module names to automatically +# aggregate just those types. +# +# state_aggregate: +# - pkg +# +#state_aggregate: False + +# Send progress events as each function in a state run completes execution +# by setting to 'True'. Progress events are in the format +# 'salt/job/<JID>/prog/<MID>/<RUN NUM>'. +#state_events: False + +##### File Server settings ##### +########################################## +# Salt runs a lightweight file server written in zeromq to deliver files to +# minions. This file server is built into the master daemon and does not +# require a dedicated port. + +# The file server works on environments passed to the master, each environment +# can have multiple root directories, the subdirectories in the multiple file +# roots cannot match, otherwise the downloaded files will not be able to be +# reliably ensured. A base environment is required to house the top file. +# Example: +# file_roots: +# base: +# - /srv/salt/ +# dev: +# - /srv/salt/dev/services +# - /srv/salt/dev/states +# prod: +# - /srv/salt/prod/services +# - /srv/salt/prod/states +# +#file_roots: +# base: +# - /srv/salt +# +file_roots: + base: + - /srv/ead3/salt/ +%set %%ewtapps = %%list() +%for %%path, %%value in %%creole_client.get('/actions').items() + %if %%path.endswith('.ewtapp'): + %for %%val in %%value + %if %%val not in %%ewtapps + %silent %%ewtapps.append(%%str(%%val)) + %%val: + - /srv/ead3/salt/%%val + %end if + %end for + %end if +%end for + +# When using multiple environments, each with their own top file, the +# default behaviour is an unordered merge. To prevent top files from +# being merged together and instead to only use the top file from the +# requested environment, set this value to 'same'. +top_file_merging_strategy: merge + +# To specify the order in which environments are merged, set the ordering +# in the env_order option. Given a conflict, the last matching value will +# win. +%set %%ewtapps = ['base'] + %%ewtapps +env_order: %%ewtapps + +# If top_file_merging_strategy is set to 'same' and an environment does not +# contain a top file, the top file in the environment specified by default_top +# will be used instead. +default_top: base + +# The hash_type is the hash to use when discovering the hash of a file on +# the master server. The default is md5 but sha1, sha224, sha256, sha384 +# and sha512 are also supported. +# +# WARNING: While md5 is supported, do not use it due to the high chance +# of possible collisions and thus security breach. +# +# Prior to changing this value, the master should be stopped and all Salt +# caches should be cleared. +hash_type: sha256 + +# The buffer size in the file server can be adjusted here: +#file_buffer_size: 1048576 + +# A regular expression (or a list of expressions) that will be matched +# against the file path before syncing the modules and states to the minions. +# This includes files affected by the file.recurse state. +# For example, if you manage your custom modules and states in subversion +# and don't want all the '.svn' folders and content synced to your minions, +# you could set this to '/\.svn($|/)'. By default nothing is ignored. +#file_ignore_regex: +# - '/\.svn($|/)' +# - '/\.git($|/)' + +# A file glob (or list of file globs) that will be matched against the file +# path before syncing the modules and states to the minions. This is similar +# to file_ignore_regex above, but works on globs instead of regex. By default +# nothing is ignored. +# file_ignore_glob: +# - '*.pyc' +# - '*/somefolder/*.bak' +# - '*.swp' + +# File Server Backend +# +# Salt supports a modular fileserver backend system, this system allows +# the salt master to link directly to third party systems to gather and +# manage the files available to minions. Multiple backends can be +# configured and will be searched for the requested file in the order in which +# they are defined here. The default setting only enables the standard backend +# "roots" which uses the "file_roots" option. +#fileserver_backend: +# - roots +# +# To use multiple backends list them in the order they are searched: +#fileserver_backend: +# - git +# - roots +# +# Uncomment the line below if you do not want the file_server to follow +# symlinks when walking the filesystem tree. This is set to True +# by default. Currently this only applies to the default roots +# fileserver_backend. +#fileserver_followsymlinks: False +# +# Uncomment the line below if you do not want symlinks to be +# treated as the files they are pointing to. By default this is set to +# False. By uncommenting the line below, any detected symlink while listing +# files on the Master will not be returned to the Minion. +#fileserver_ignoresymlinks: True +# +# By default, the Salt fileserver recurses fully into all defined environments +# to attempt to find files. To limit this behavior so that the fileserver only +# traverses directories with SLS files and special Salt directories like _modules, +# enable the option below. This might be useful for installations where a file root +# has a very large number of files and performance is impacted. Default is False. +# fileserver_limit_traversal: False +# +# The fileserver can fire events off every time the fileserver is updated, +# these are disabled by default, but can be easily turned on by setting this +# flag to True +#fileserver_events: False + +# Git File Server Backend Configuration +# +# Optional parameter used to specify the provider to be used for gitfs. Must +# be one of the following: pygit2, gitpython, or dulwich. If unset, then each +# will be tried in that same order, and the first one with a compatible +# version installed will be the provider that is used. +#gitfs_provider: pygit2 + +# Along with gitfs_password, is used to authenticate to HTTPS remotes. +# gitfs_user: '' + +# Along with gitfs_user, is used to authenticate to HTTPS remotes. +# This parameter is not required if the repository does not use authentication. +#gitfs_password: '' + +# By default, Salt will not authenticate to an HTTP (non-HTTPS) remote. +# This parameter enables authentication over HTTP. Enable this at your own risk. +#gitfs_insecure_auth: False + +# Along with gitfs_privkey (and optionally gitfs_passphrase), is used to +# authenticate to SSH remotes. This parameter (or its per-remote counterpart) +# is required for SSH remotes. +#gitfs_pubkey: '' + +# Along with gitfs_pubkey (and optionally gitfs_passphrase), is used to +# authenticate to SSH remotes. This parameter (or its per-remote counterpart) +# is required for SSH remotes. +#gitfs_privkey: '' + +# This parameter is optional, required only when the SSH key being used to +# authenticate is protected by a passphrase. +#gitfs_passphrase: '' + +# When using the git fileserver backend at least one git remote needs to be +# defined. The user running the salt master will need read access to the repo. +# +# The repos will be searched in order to find the file requested by a client +# and the first repo to have the file will return it. +# When using the git backend branches and tags are translated into salt +# environments. +# Note: file:// repos will be treated as a remote, so refs you want used must +# exist in that repo as *local* refs. +#gitfs_remotes: +# - git://github.com/saltstack/salt-states.git +# - file:///var/git/saltmaster +# +# The gitfs_ssl_verify option specifies whether to ignore ssl certificate +# errors when contacting the gitfs backend. You might want to set this to +# false if you're using a git backend that uses a self-signed certificate but +# keep in mind that setting this flag to anything other than the default of True +# is a security concern, you may want to try using the ssh transport. +#gitfs_ssl_verify: True +# +# The gitfs_root option gives the ability to serve files from a subdirectory +# within the repository. The path is defined relative to the root of the +# repository and defaults to the repository root. +#gitfs_root: somefolder/otherfolder +# +# +##### Pillar settings ##### +########################################## +# Salt Pillars allow for the building of global data that can be made selectively +# available to different minions based on minion grain filtering. The Salt +# Pillar is laid out in the same fashion as the file server, with environments, +# a top file and sls files. However, pillar data does not need to be in the +# highstate format, and is generally just key/value pairs. +#pillar_roots: +# base: +# - /srv/pillar +# +ext_pillar: + - cmd_json: /usr/share/eole/sbin/dumpconfig.py + +# The ext_pillar_first option allows for external pillar sources to populate +# before file system pillar. This allows for targeting file system pillar from +# ext_pillar. +#ext_pillar_first: False + +# The pillar_gitfs_ssl_verify option specifies whether to ignore ssl certificate +# errors when contacting the pillar gitfs backend. You might want to set this to +# false if you're using a git backend that uses a self-signed certificate but +# keep in mind that setting this flag to anything other than the default of True +# is a security concern, you may want to try using the ssh transport. +#pillar_gitfs_ssl_verify: True + +# The pillar_opts option adds the master configuration file data to a dict in +# the pillar called "master". This is used to set simple configurations in the +# master config file that can then be used on minions. +#pillar_opts: False + +# The pillar_safe_render_error option prevents the master from passing pillar +# render errors to the minion. This is set on by default because the error could +# contain templating data which would give that minion information it shouldn't +# have, like a password! When set true the error message will only show: +# Rendering SLS 'my.sls' failed. Please see master log for details. +#pillar_safe_render_error: True + +# The pillar_source_merging_strategy option allows you to configure merging strategy +# between different sources. It accepts four values: recurse, aggregate, overwrite, +# or smart. Recurse will merge recursively mapping of data. Aggregate instructs +# aggregation of elements between sources that use the #!yamlex renderer. Overwrite +# will verwrite elements according the order in which they are processed. This is +# behavior of the 2014.1 branch and earlier. Smart guesses the best strategy based +# on the "renderer" setting and is the default value. +#pillar_source_merging_strategy: smart + +# Recursively merge lists by aggregating them instead of replacing them. +#pillar_merge_lists: False + +# Git External Pillar (git_pillar) Configuration Options +# +# Specify the provider to be used for git_pillar. Must be either pygit2 or +# gitpython. If unset, then both will be tried in that same order, and the +# first one with a compatible version installed will be the provider that +# is used. +#git_pillar_provider: pygit2 + +# If the desired branch matches this value, and the environment is omitted +# from the git_pillar configuration, then the environment for that git_pillar +# remote will be base. +#git_pillar_base: master + +# If the branch is omitted from a git_pillar remote, then this branch will +# be used instead +#git_pillar_branch: master + +# Environment to use for git_pillar remotes. This is normally derived from +# the branch/tag (or from a per-remote env parameter), but if set this will +# override the process of deriving the env from the branch/tag name. +#git_pillar_env: '' + +# Path relative to the root of the repository where the git_pillar top file +# and SLS files are located. +#git_pillar_root: '' + +# Specifies whether or not to ignore SSL certificate errors when contacting +# the remote repository. +#git_pillar_ssl_verify: False + +# When set to False, if there is an update/checkout lock for a git_pillar +# remote and the pid written to it is not running on the master, the lock +# file will be automatically cleared and a new lock will be obtained. +#git_pillar_global_lock: True + +# Git External Pillar Authentication Options +# +# Along with git_pillar_password, is used to authenticate to HTTPS remotes. +#git_pillar_user: '' + +# Along with git_pillar_user, is used to authenticate to HTTPS remotes. +# This parameter is not required if the repository does not use authentication. +#git_pillar_password: '' + +# By default, Salt will not authenticate to an HTTP (non-HTTPS) remote. +# This parameter enables authentication over HTTP. +#git_pillar_insecure_auth: False + +# Along with git_pillar_privkey (and optionally git_pillar_passphrase), +# is used to authenticate to SSH remotes. +#git_pillar_pubkey: '' + +# Along with git_pillar_pubkey (and optionally git_pillar_passphrase), +# is used to authenticate to SSH remotes. +#git_pillar_privkey: '' + +# This parameter is optional, required only when the SSH key being used +# to authenticate is protected by a passphrase. +#git_pillar_passphrase: '' + +# A master can cache pillars locally to bypass the expense of having to render them +# for each minion on every request. This feature should only be enabled in cases +# where pillar rendering time is known to be unsatisfactory and any attendant security +# concerns about storing pillars in a master cache have been addressed. +# +# When enabling this feature, be certain to read through the additional ``pillar_cache_*`` +# configuration options to fully understand the tunable parameters and their implications. +# +# Note: setting ``pillar_cache: True`` has no effect on targeting Minions with Pillars. +# See https://docs.saltstack.com/en/latest/topics/targeting/pillar.html +#pillar_cache: False + +# If and only if a master has set ``pillar_cache: True``, the cache TTL controls the amount +# of time, in seconds, before the cache is considered invalid by a master and a fresh +# pillar is recompiled and stored. +#pillar_cache_ttl: 3600 + +# If an only if a master has set ``pillar_cache: True``, one of several storage providers +# can be utilized: +# +# disk: The default storage backend. This caches rendered pillars to the master cache. +# Rendered pillars are serialized and deserialized as ``msgpack`` structures for +# speed. Note that pillars are stored UNENCRYPTED. Ensure that the master cache +# has permissions set appropriately (sane defaults are provided). +# +# memory: [EXPERIMENTAL] An optional backend for pillar caches which uses a pure-Python +# in-memory data structure for maximal performance. There are several caveats, +# however. First, because each master worker contains its own in-memory cache, +# there is no guarantee of cache consistency between minion requests. This +# works best in situations where the pillar rarely if ever changes. Secondly, +# and perhaps more importantly, this means that unencrypted pillars will +# be accessible to any process which can examine the memory of the ``salt-master``! +# This may represent a substantial security risk. +# +#pillar_cache_backend: disk + + +##### Syndic settings ##### +########################################## +# The Salt syndic is used to pass commands through a master from a higher +# master. Using the syndic is simple. If this is a master that will have +# syndic servers(s) below it, then set the "order_masters" setting to True. +# +# If this is a master that will be running a syndic daemon for passthrough, then +# the "syndic_master" setting needs to be set to the location of the master server +# to receive commands from. + +# Set the order_masters setting to True if this master will command lower +# masters' syndic interfaces. +#order_masters: False + +# If this master will be running a salt syndic daemon, syndic_master tells +# this master where to receive commands from. +#syndic_master: masterofmaster + +# This is the 'ret_port' of the MasterOfMaster: +#syndic_master_port: 4506 + +# PID file of the syndic daemon: +#syndic_pidfile: /var/run/salt-syndic.pid + +# LOG file of the syndic daemon: +#syndic_log_file: syndic.log + +# The behaviour of the multi-syndic when connection to a master of masters failed. +# Can specify ``random`` (default) or ``ordered``. If set to ``random``, masters +# will be iterated in random order. If ``ordered`` is specified, the configured +# order will be used. +#syndic_failover: random + + +##### Peer Publish settings ##### +########################################## +# Salt minions can send commands to other minions, but only if the minion is +# allowed to. By default "Peer Publication" is disabled, and when enabled it +# is enabled for specific minions and specific commands. This allows secure +# compartmentalization of commands based on individual minions. + +# The configuration uses regular expressions to match minions and then a list +# of regular expressions to match functions. The following will allow the +# minion authenticated as foo.example.com to execute functions from the test +# and pkg modules. +#peer: +# foo.example.com: +# - test.* +# - pkg.* +# +# This will allow all minions to execute all commands: +#peer: +# .*: +# - .* +# +# This is not recommended, since it would allow anyone who gets root on any +# single minion to instantly have root on all of the minions! + +# Minions can also be allowed to execute runners from the salt master. +# Since executing a runner from the minion could be considered a security risk, +# it needs to be enabled. This setting functions just like the peer setting +# except that it opens up runners instead of module functions. +# +# All peer runner support is turned off by default and must be enabled before +# using. This will enable all peer runners for all minions: +#peer_run: +# .*: +# - .* +# +# To enable just the manage.up runner for the minion foo.example.com: +#peer_run: +# foo.example.com: +# - manage.up +# +# +##### Mine settings ##### +##################################### +# Restrict mine.get access from minions. By default any minion has a full access +# to get all mine data from master cache. In acl definion below, only pcre matches +# are allowed. +# mine_get: +# .*: +# - .* +# +# The example below enables minion foo.example.com to get 'network.interfaces' mine +# data only, minions web* to get all network.* and disk.* mine data and all other +# minions won't get any mine data. +# mine_get: +# foo.example.com: +# - network.interfaces +# web.*: +# - network.* +# - disk.* + + +##### Logging settings ##### +########################################## +# The location of the master log file +# The master log can be sent to a regular file, local path name, or network +# location. Remote logging works best when configured to use rsyslogd(8) (e.g.: +# ``file:///dev/log``), with rsyslogd(8) configured for network logging. The URI +# format is: <file|udp|tcp>://<host|socketpath>:<port-if-required>/<log-facility> +#log_file: /var/log/salt/master +#log_file: file:///dev/log +#log_file: udp://loghost:10514 +log_file: file:///dev/log + +#log_file: /var/log/salt/master +#key_logfile: /var/log/salt/key + +# The level of messages to send to the console. +# One of 'garbage', 'trace', 'debug', info', 'warning', 'error', 'critical'. +# +# The following log levels are considered INSECURE and may log sensitive data: +# ['garbage', 'trace', 'debug'] +# +#log_level: warning + +# The level of messages to send to the log file. +# One of 'garbage', 'trace', 'debug', info', 'warning', 'error', 'critical'. +# If using 'log_granular_levels' this must be set to the highest desired level. +#log_level_logfile: warning + +# The date and time format used in log messages. Allowed date/time formatting +# can be seen here: http://docs.python.org/library/time.html#time.strftime +#log_datefmt: '%H:%M:%S' +#log_datefmt_logfile: '%Y-%m-%d %H:%M:%S' + +# The format of the console logging messages. Allowed formatting options can +# be seen here: http://docs.python.org/library/logging.html#logrecord-attributes +# +# Console log colors are specified by these additional formatters: +# +# %(colorlevel)s +# %(colorname)s +# %(colorprocess)s +# %(colormsg)s +# +# Since it is desirable to include the surrounding brackets, '[' and ']', in +# the coloring of the messages, these color formatters also include padding as +# well. Color LogRecord attributes are only available for console logging. +# +#log_fmt_console: '%(colorlevel)s %(colormsg)s' +#log_fmt_console: '[%(levelname)-8s] %(message)s' +# +#log_fmt_logfile: '%(asctime)s,%(msecs)03.0f [%(name)-17s][%(levelname)-8s] %(message)s' +log_fmt_logfile: 'salt-master-ead3[%(name)-17s][%(levelname)-8s] %(message)s' + +# This can be used to control logging levels more specificically. This +# example sets the main salt library at the 'warning' level, but sets +# 'salt.modules' to log at the 'debug' level: +# log_granular_levels: +# 'salt': 'warning' +# 'salt.modules': 'debug' +# +#log_granular_levels: {} + + +##### Node Groups ###### +########################################## +# Node groups allow for logical groupings of minion nodes. A group consists of +# a group name and a compound target. Nodgroups can reference other nodegroups +# with 'N@' classifier. Ensure that you do not have circular references. +# +#nodegroups: +# group1: 'L@foo.domain.com,bar.domain.com,baz.domain.com or bl*.domain.com' +# group2: 'G@os:Debian and foo.domain.com' +# group3: 'G@os:Debian and N@group1' +# group4: +# - 'G@foo:bar' +# - 'or' +# - 'G@foo:baz' + + +##### Range Cluster settings ##### +########################################## +# The range server (and optional port) that serves your cluster information +# https://github.com/ytoolshed/range/wiki/%22yamlfile%22-module-file-spec +# +#range_server: range:80 + + +##### Windows Software Repo settings ##### +########################################### +# Location of the repo on the master: +#winrepo_dir_ng: '/srv/salt/win/repo-ng' +# +# List of git repositories to include with the local repo: +#winrepo_remotes_ng: +# - 'https://github.com/saltstack/salt-winrepo-ng.git' + + +##### Windows Software Repo settings - Pre 2015.8 ##### +######################################################## +# Legacy repo settings for pre-2015.8 Windows minions. +# +# Location of the repo on the master: +#winrepo_dir: '/srv/salt/win/repo' +# +# Location of the master's repo cache file: +#winrepo_mastercachefile: '/srv/salt/win/repo/winrepo.p' +# +# List of git repositories to include with the local repo: +#winrepo_remotes: +# - 'https://github.com/saltstack/salt-winrepo.git' + + +##### Returner settings ###### +############################################ +# Which returner(s) will be used for minion's result: +#return: mysql + + +###### Miscellaneous settings ###### +############################################ +# Default match type for filtering events tags: startswith, endswith, find, regex, fnmatch +#event_match_type: startswith diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3-saltstack/templates/minion b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3-saltstack/templates/minion new file mode 100644 index 0000000000000000000000000000000000000000..b7cd2a45297cbfa735b23e68af294e7a45dad7fd --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3-saltstack/templates/minion @@ -0,0 +1,774 @@ +##### Primary configuration settings ##### +########################################## +# This configuration file is used to manage the behavior of the Salt Minion. +# With the exception of the location of the Salt Master Server, values that are +# commented out but have an empty line after the comment are defaults that need +# not be set in the config. If there is no blank line after the comment, the +# value is presented as an example and is not the default. + +# Per default the minion will automatically include all config files +# from minion.d/*.conf (minion.d is a directory in the same directory +# as the main minion config file). +#default_include: minion.d/*.conf + +# Set the location of the salt master server. If the master server cannot be +# resolved, then the minion will fail to start. +master: 127.0.0.1 + +# Set http proxy information for the minion when doing requests +#proxy_host: +#proxy_port: +#proxy_username: +#proxy_password: + +# If multiple masters are specified in the 'master' setting, the default behavior +# is to always try to connect to them in the order they are listed. If random_master is +# set to True, the order will be randomized instead. This can be helpful in distributing +# the load of many minions executing salt-call requests, for example, from a cron job. +# If only one master is listed, this setting is ignored and a warning will be logged. +# NOTE: If master_type is set to failover, use master_shuffle instead. +#random_master: False + +# Use if master_type is set to failover. +#master_shuffle: False + +# Minions can connect to multiple masters simultaneously (all masters +# are "hot"), or can be configured to failover if a master becomes +# unavailable. Multiple hot masters are configured by setting this +# value to "str". Failover masters can be requested by setting +# to "failover". MAKE SURE TO SET master_alive_interval if you are +# using failover. +# master_type: str + +# Poll interval in seconds for checking if the master is still there. Only +# respected if master_type above is "failover". To disable the interval entirely, +# set the value to -1. (This may be necessary on machines which have high numbers +# of TCP connections, such as load balancers.) +# master_alive_interval: 30 + +# If the minion is in multi-master mode and the master_type configuration option +# is set to "failover", this setting can be set to "True" to force the minion +# to fail back to the first master in the list if the first master is back online. +#master_failback: False + +# If the minion is in multi-master mode, the "master_type" configuration is set to +# "failover", and the "master_failback" option is enabled, the master failback +# interval can be set to ping the top master with this interval, in seconds. +#master_failback_interval: 0 + +# Set whether the minion should connect to the master via IPv6: +#ipv6: False + +# Set the number of seconds to wait before attempting to resolve +# the master hostname if name resolution fails. Defaults to 30 seconds. +# Set to zero if the minion should shutdown and not retry. +# retry_dns: 30 + +# Set the port used by the master reply and authentication server. +master_port: 4606 + +# The user to run salt. +#user: root + +# The user to run salt remote execution commands as via sudo. If this option is +# enabled then sudo will be used to change the active user executing the remote +# command. If enabled the user will need to be allowed access via the sudoers +# file for the user that the salt minion is configured to run as. The most +# common option would be to use the root user. If this option is set the user +# option should also be set to a non-root user. If migrating from a root minion +# to a non root minion the minion cache should be cleared and the minion pki +# directory will need to be changed to the ownership of the new user. +#sudo_user: root + +# Specify the location of the daemon process ID file. +#pidfile: /var/run/salt-minion.pid + +# The root directory prepended to these options: pki_dir, cachedir, log_file, +# sock_dir, pidfile. +root_dir: /var/lib/ead3/ + +# The path to the minion's configuration file. +#conf_file: /etc/salt/minion + +# The directory to store the pki information in +#pki_dir: /etc/salt/pki/minion + +# Explicitly declare the id for this minion to use, if left commented the id +# will be the hostname as returned by the python call: socket.getfqdn() +# Since salt uses detached ids it is possible to run multiple minions on the +# same machine but with different ids, this can be useful for salt compute +# clusters. +id: '%%minion_domain_name' + +# Cache the minion id to a file when the minion's id is not statically defined +# in the minion config. Defaults to "True". This setting prevents potential +# problems when automatic minion id resolution changes, which can cause the +# minion to lose connection with the master. To turn off minion id caching, +# set this config to ``False``. +#minion_id_caching: True + +# Append a domain to a hostname in the event that it does not exist. This is +# useful for systems where socket.getfqdn() does not actually result in a +# FQDN (for instance, Solaris). +#append_domain: + +# Custom static grains for this minion can be specified here and used in SLS +# files just like all other grains. This example sets 4 custom grains, with +# the 'roles' grain having two values that can be matched against. +#grains: +# roles: +# - webserver +# - memcache +# deployment: datacenter4 +# cabinet: 13 +# cab_u: 14-15 +# +# Where cache data goes. +# This data may contain sensitive data and should be protected accordingly. +#cachedir: /var/cache/salt/minion + +# Append minion_id to these directories. Helps with +# multiple proxies and minions running on the same machine. +# Allowed elements in the list: pki_dir, cachedir, extension_modules +# Normally not needed unless running several proxies and/or minions on the same machine +# Defaults to ['cachedir'] for proxies, [] (empty list) for regular minions +#append_minionid_config_dirs: + +# Verify and set permissions on configuration directories at startup. +#verify_env: True + +# The minion can locally cache the return data from jobs sent to it, this +# can be a good way to keep track of jobs the minion has executed +# (on the minion side). By default this feature is disabled, to enable, set +# cache_jobs to True. +#cache_jobs: False + +# Set the directory used to hold unix sockets. +#sock_dir: /var/run/salt/minion + +# Set the default outputter used by the salt-call command. The default is +# "nested". +#output: nested +# +# By default output is colored. To disable colored output, set the color value +# to False. +#color: True + +# Do not strip off the colored output from nested results and state outputs +# (true by default). +# strip_colors: False + +# Backup files that are replaced by file.managed and file.recurse under +# 'cachedir'/file_backups relative to their original location and appended +# with a timestamp. The only valid setting is "minion". Disabled by default. +# +# Alternatively this can be specified for each file in state files: +# /etc/ssh/sshd_config: +# file.managed: +# - source: salt://ssh/sshd_config +# - backup: minion +# +#backup_mode: minion + +# When waiting for a master to accept the minion's public key, salt will +# continuously attempt to reconnect until successful. This is the time, in +# seconds, between those reconnection attempts. +#acceptance_wait_time: 10 + +# If this is nonzero, the time between reconnection attempts will increase by +# acceptance_wait_time seconds per iteration, up to this maximum. If this is +# set to zero, the time between reconnection attempts will stay constant. +#acceptance_wait_time_max: 0 + +# If the master rejects the minion's public key, retry instead of exiting. +# Rejected keys will be handled the same as waiting on acceptance. +#rejected_retry: False + +# When the master key changes, the minion will try to re-auth itself to receive +# the new master key. In larger environments this can cause a SYN flood on the +# master because all minions try to re-auth immediately. To prevent this and +# have a minion wait for a random amount of time, use this optional parameter. +# The wait-time will be a random number of seconds between 0 and the defined value. +#random_reauth_delay: 60 + +# When waiting for a master to accept the minion's public key, salt will +# continuously attempt to reconnect until successful. This is the timeout value, +# in seconds, for each individual attempt. After this timeout expires, the minion +# will wait for acceptance_wait_time seconds before trying again. Unless your master +# is under unusually heavy load, this should be left at the default. +#auth_timeout: 60 + +# Number of consecutive SaltReqTimeoutError that are acceptable when trying to +# authenticate. +#auth_tries: 7 + +# The number of attempts to connect to a master before giving up. +# Set this to -1 for unlimited attempts. This allows for a master to have +# downtime and the minion to reconnect to it later when it comes back up. +# In 'failover' mode, it is the number of attempts for each set of masters. +# In this mode, it will cycle through the list of masters for each attempt. +# +# This is different than auth_tries because auth_tries attempts to +# retry auth attempts with a single master. auth_tries is under the +# assumption that you can connect to the master but not gain +# authorization from it. master_tries will still cycle through all +# the masters in a given try, so it is appropriate if you expect +# occasional downtime from the master(s). +#master_tries: 1 + +# If authentication fails due to SaltReqTimeoutError during a ping_interval, +# cause sub minion process to restart. +#auth_safemode: False + +# Ping Master to ensure connection is alive (minutes). +#ping_interval: 0 + +# To auto recover minions if master changes IP address (DDNS) +# auth_tries: 10 +# auth_safemode: False +# ping_interval: 90 +# +# Minions won't know master is missing until a ping fails. After the ping fail, +# the minion will attempt authentication and likely fails out and cause a restart. +# When the minion restarts it will resolve the masters IP and attempt to reconnect. + +# If you don't have any problems with syn-floods, don't bother with the +# three recon_* settings described below, just leave the defaults! +# +# The ZeroMQ pull-socket that binds to the masters publishing interface tries +# to reconnect immediately, if the socket is disconnected (for example if +# the master processes are restarted). In large setups this will have all +# minions reconnect immediately which might flood the master (the ZeroMQ-default +# is usually a 100ms delay). To prevent this, these three recon_* settings +# can be used. +# recon_default: the interval in milliseconds that the socket should wait before +# trying to reconnect to the master (1000ms = 1 second) +# +# recon_max: the maximum time a socket should wait. each interval the time to wait +# is calculated by doubling the previous time. if recon_max is reached, +# it starts again at recon_default. Short example: +# +# reconnect 1: the socket will wait 'recon_default' milliseconds +# reconnect 2: 'recon_default' * 2 +# reconnect 3: ('recon_default' * 2) * 2 +# reconnect 4: value from previous interval * 2 +# reconnect 5: value from previous interval * 2 +# reconnect x: if value >= recon_max, it starts again with recon_default +# +# recon_randomize: generate a random wait time on minion start. The wait time will +# be a random value between recon_default and recon_default + +# recon_max. Having all minions reconnect with the same recon_default +# and recon_max value kind of defeats the purpose of being able to +# change these settings. If all minions have the same values and your +# setup is quite large (several thousand minions), they will still +# flood the master. The desired behavior is to have timeframe within +# all minions try to reconnect. +# +# Example on how to use these settings. The goal: have all minions reconnect within a +# 60 second timeframe on a disconnect. +# recon_default: 1000 +# recon_max: 59000 +# recon_randomize: True +# +# Each minion will have a randomized reconnect value between 'recon_default' +# and 'recon_default + recon_max', which in this example means between 1000ms +# 60000ms (or between 1 and 60 seconds). The generated random-value will be +# doubled after each attempt to reconnect. Lets say the generated random +# value is 11 seconds (or 11000ms). +# reconnect 1: wait 11 seconds +# reconnect 2: wait 22 seconds +# reconnect 3: wait 33 seconds +# reconnect 4: wait 44 seconds +# reconnect 5: wait 55 seconds +# reconnect 6: wait time is bigger than 60 seconds (recon_default + recon_max) +# reconnect 7: wait 11 seconds +# reconnect 8: wait 22 seconds +# reconnect 9: wait 33 seconds +# reconnect x: etc. +# +# In a setup with ~6000 thousand hosts these settings would average the reconnects +# to about 100 per second and all hosts would be reconnected within 60 seconds. +# recon_default: 100 +# recon_max: 5000 +# recon_randomize: False +# +# +# The loop_interval sets how long in seconds the minion will wait between +# evaluating the scheduler and running cleanup tasks. This defaults to a +# sane 60 seconds, but if the minion scheduler needs to be evaluated more +# often lower this value +#loop_interval: 60 + +# The grains can be merged, instead of overridden, using this option. +# This allows custom grains to defined different subvalues of a dictionary +# grain. By default this feature is disabled, to enable set grains_deep_merge +# to ``True``. +#grains_deep_merge: False + +# The grains_refresh_every setting allows for a minion to periodically check +# its grains to see if they have changed and, if so, to inform the master +# of the new grains. This operation is moderately expensive, therefore +# care should be taken not to set this value too low. +# +# Note: This value is expressed in __minutes__! +# +# A value of 10 minutes is a reasonable default. +# +# If the value is set to zero, this check is disabled. +#grains_refresh_every: 1 + +# Cache grains on the minion. Default is False. +#grains_cache: False + +# Cache rendered pillar data on the minion. Default is False. +# This may cause 'cachedir'/pillar to contain sensitive data that should be +# protected accordingly. +#minion_pillar_cache: False + +# Grains cache expiration, in seconds. If the cache file is older than this +# number of seconds then the grains cache will be dumped and fully re-populated +# with fresh data. Defaults to 5 minutes. Will have no effect if 'grains_cache' +# is not enabled. +# grains_cache_expiration: 300 + +# Determines whether or not the salt minion should run scheduled mine updates. +# Defaults to "True". Set to "False" to disable the scheduled mine updates +# (this essentially just does not add the mine update function to the minion's +# scheduler). +#mine_enabled: True + +# Determines whether or not scheduled mine updates should be accompanied by a job +# return for the job cache. Defaults to "False". Set to "True" to include job +# returns in the job cache for mine updates. +#mine_return_job: False + +# Example functions that can be run via the mine facility +# NO mine functions are established by default. +# Note these can be defined in the minion's pillar as well. +#mine_functions: +# test.ping: [] +# network.ip_addrs: +# interface: eth0 +# cidr: '10.0.0.0/8' + +# Windows platforms lack posix IPC and must rely on slower TCP based inter- +# process communications. Set ipc_mode to 'tcp' on such systems +#ipc_mode: ipc + +# Overwrite the default tcp ports used by the minion when in tcp mode +#tcp_pub_port: 4510 +#tcp_pull_port: 4511 + +# Passing very large events can cause the minion to consume large amounts of +# memory. This value tunes the maximum size of a message allowed onto the +# minion event bus. The value is expressed in bytes. +#max_event_size: 1048576 + +# To detect failed master(s) and fire events on connect/disconnect, set +# master_alive_interval to the number of seconds to poll the masters for +# connection events. +# +#master_alive_interval: 30 + +# The minion can include configuration from other files. To enable this, +# pass a list of paths to this option. The paths can be either relative or +# absolute; if relative, they are considered to be relative to the directory +# the main minion configuration file lives in (this file). Paths can make use +# of shell-style globbing. If no files are matched by a path passed to this +# option then the minion will log a warning message. +# +# Include a config file from some other path: +# include: /etc/salt/extra_config +# +# Include config from several files and directories: +#include: +# - /etc/salt/extra_config +# - /etc/roles/webserver + +# The syndic minion can verify that it is talking to the correct master via the +# key fingerprint of the higher-level master with the "syndic_finger" config. +#syndic_finger: '' +# +# +# +##### Minion module management ##### +########################################## +# Disable specific modules. This allows the admin to limit the level of +# access the master has to the minion. +#disable_modules: [cmd,test] +#disable_returners: [] +# +# Modules can be loaded from arbitrary paths. This enables the easy deployment +# of third party modules. Modules for returners and minions can be loaded. +# Specify a list of extra directories to search for minion modules and +# returners. These paths must be fully qualified! +#module_dirs: [] +#returner_dirs: [] +#states_dirs: [] +#render_dirs: [] +#utils_dirs: [] +# +# A module provider can be statically overwritten or extended for the minion +# via the providers option, in this case the default module will be +# overwritten by the specified module. In this example the pkg module will +# be provided by the yumpkg5 module instead of the system default. +#providers: +# pkg: yumpkg5 +# +# Enable Cython modules searching and loading. (Default: False) +#cython_enable: False +# +# Specify a max size (in bytes) for modules on import. This feature is currently +# only supported on *nix operating systems and requires psutil. +# modules_max_memory: -1 + + +##### State Management Settings ##### +########################################### +# The state management system executes all of the state templates on the minion +# to enable more granular control of system state management. The type of +# template and serialization used for state management needs to be configured +# on the minion, the default renderer is yaml_jinja. This is a yaml file +# rendered from a jinja template, the available options are: +# yaml_jinja +# yaml_mako +# yaml_wempy +# json_jinja +# json_mako +# json_wempy +# +#renderer: yaml_jinja +# +# The failhard option tells the minions to stop immediately after the first +# failure detected in the state execution. Defaults to False. +#failhard: False +# +# Reload the modules prior to a highstate run. +#autoload_dynamic_modules: True +# +# clean_dynamic_modules keeps the dynamic modules on the minion in sync with +# the dynamic modules on the master, this means that if a dynamic module is +# not on the master it will be deleted from the minion. By default, this is +# enabled and can be disabled by changing this value to False. +#clean_dynamic_modules: True +# +# Normally, the minion is not isolated to any single environment on the master +# when running states, but the environment can be isolated on the minion side +# by statically setting it. Remember that the recommended way to manage +# environments is to isolate via the top file. +#environment: None +# +# Isolates the pillar environment on the minion side. This functions the same +# as the environment setting, but for pillar instead of states. +#pillarenv: None +# +# If using the local file directory, then the state top file name needs to be +# defined, by default this is top.sls. +#state_top: top.sls +# +# Run states when the minion daemon starts. To enable, set startup_states to: +# 'highstate' -- Execute state.highstate +# 'sls' -- Read in the sls_list option and execute the named sls files +# 'top' -- Read top_file option and execute based on that file on the Master +#startup_states: '' +# +# List of states to run when the minion starts up if startup_states is 'sls': +#sls_list: +# - edit.vim +# - hyper +# +# Top file to execute if startup_states is 'top': +#top_file: '' + +# Automatically aggregate all states that have support for mod_aggregate by +# setting to True. Or pass a list of state module names to automatically +# aggregate just those types. +# +# state_aggregate: +# - pkg +# +#state_aggregate: False + +##### File Directory Settings ##### +########################################## +# The Salt Minion can redirect all file server operations to a local directory, +# this allows for the same state tree that is on the master to be used if +# copied completely onto the minion. This is a literal copy of the settings on +# the master but used to reference a local directory on the minion. + +# Set the file client. The client defaults to looking on the master server for +# files, but can be directed to look at the local file directory setting +# defined below by setting it to "local". Setting a local file_client runs the +# minion in masterless mode. +# file_client: local +file_client: remote + +# The file directory works on environments passed to the minion, each environment +# can have multiple root directories, the subdirectories in the multiple file +# roots cannot match, otherwise the downloaded files will not be able to be +# reliably ensured. A base environment is required to house the top file. +# Example: +# file_roots: +# base: +# - /srv/salt/ +# dev: +# - /srv/salt/dev/services +# - /srv/salt/dev/states +# prod: +# - /srv/salt/prod/services +# - /srv/salt/prod/states +# +file_roots: + base: + - /etc/ead3/srv/salt + +# Uncomment the line below if you do not want the file_server to follow +# symlinks when walking the filesystem tree. This is set to True +# by default. Currently this only applies to the default roots +# fileserver_backend. +#fileserver_followsymlinks: False +# +# Uncomment the line below if you do not want symlinks to be +# treated as the files they are pointing to. By default this is set to +# False. By uncommenting the line below, any detected symlink while listing +# files on the Master will not be returned to the Minion. +#fileserver_ignoresymlinks: True +# +# By default, the Salt fileserver recurses fully into all defined environments +# to attempt to find files. To limit this behavior so that the fileserver only +# traverses directories with SLS files and special Salt directories like _modules, +# enable the option below. This might be useful for installations where a file root +# has a very large number of files and performance is negatively impacted. Default +# is False. +#fileserver_limit_traversal: False + +# The hash_type is the hash to use when discovering the hash of a file in +# the local fileserver. The default is sha256, sha224, sha384 and sha512 are also supported. +# +# WARNING: While md5 and sha1 are also supported, do not use it due to the high chance +# of possible collisions and thus security breach. +# +# Warning: Prior to changing this value, the minion should be stopped and all +# Salt caches should be cleared. +hash_type: sha256 + +# The Salt pillar is searched for locally if file_client is set to local. If +# this is the case, and pillar data is defined, then the pillar_roots need to +# also be configured on the minion: +#pillar_roots: +# base: +# - /srv/pillar + +# Set a hard-limit on the size of the files that can be pushed to the master. +# It will be interpreted as megabytes. Default: 100 +#file_recv_max_size: 100 +# +# +###### Security settings ##### +########################################### +# Enable "open mode", this mode still maintains encryption, but turns off +# authentication, this is only intended for highly secure environments or for +# the situation where your keys end up in a bad state. If you run in open mode +# you do so at your own risk! +#open_mode: False + +# Enable permissive access to the salt keys. This allows you to run the +# master or minion as root, but have a non-root group be given access to +# your pki_dir. To make the access explicit, root must belong to the group +# you've given access to. This is potentially quite insecure. +#permissive_pki_access: False + +# The state_verbose and state_output settings can be used to change the way +# state system data is printed to the display. By default all data is printed. +# The state_verbose setting can be set to True or False, when set to False +# all data that has a result of True and no changes will be suppressed. +#state_verbose: True + +# The state_output setting changes if the output is the full multi line +# output for each changed state if set to 'full', but if set to 'terse' +# the output will be shortened to a single line. +#state_output: full + +# The state_output_diff setting changes whether or not the output from +# successful states is returned. Useful when even the terse output of these +# states is cluttering the logs. Set it to True to ignore them. +#state_output_diff: False + +# The state_output_profile setting changes whether profile information +# will be shown for each state run. +#state_output_profile: True + +# Fingerprint of the master public key to validate the identity of your Salt master +# before the initial key exchange. The master fingerprint can be found by running +# "salt-key -F master" on the Salt master. +#master_finger: '' + + +###### Thread settings ##### +########################################### +# Disable multiprocessing support, by default when a minion receives a +# publication a new process is spawned and the command is executed therein. +#multiprocessing: True + + +##### Logging settings ##### +########################################## +# The location of the minion log file +# The minion log can be sent to a regular file, local path name, or network +# location. Remote logging works best when configured to use rsyslogd(8) (e.g.: +# ``file:///dev/log``), with rsyslogd(8) configured for network logging. The URI +# format is: <file|udp|tcp>://<host|socketpath>:<port-if-required>/<log-facility> +#log_file: /var/log/salt/minion +#log_file: file:///dev/log +#log_file: udp://loghost:10514 +# +log_file: file:///dev/log +#log_file: /var/log/salt/minion +#key_logfile: /var/log/salt/key + +# The level of messages to send to the console. +# One of 'garbage', 'trace', 'debug', info', 'warning', 'error', 'critical'. +# +# The following log levels are considered INSECURE and may log sensitive data: +# ['garbage', 'trace', 'debug'] +# +# Default: 'warning' +#log_level: warning + +# The level of messages to send to the log file. +# One of 'garbage', 'trace', 'debug', info', 'warning', 'error', 'critical'. +# If using 'log_granular_levels' this must be set to the highest desired level. +# Default: 'warning' +#log_level_logfile: + +# The date and time format used in log messages. Allowed date/time formatting +# can be seen here: http://docs.python.org/library/time.html#time.strftime +#log_datefmt: '%H:%M:%S' +#log_datefmt_logfile: '%Y-%m-%d %H:%M:%S' + +# The format of the console logging messages. Allowed formatting options can +# be seen here: http://docs.python.org/library/logging.html#logrecord-attributes +# +# Console log colors are specified by these additional formatters: +# +# %(colorlevel)s +# %(colorname)s +# %(colorprocess)s +# %(colormsg)s +# +# Since it is desirable to include the surrounding brackets, '[' and ']', in +# the coloring of the messages, these color formatters also include padding as +# well. Color LogRecord attributes are only available for console logging. +# +#log_fmt_console: '%(colorlevel)s %(colormsg)s' +#log_fmt_console: '[%(levelname)-8s] %(message)s' +# +#log_fmt_logfile: '%(asctime)s,%(msecs)03.0f [%(name)-17s][%(levelname)-8s] %(message)s' +log_fmt_logfile: 'salt-minion-ead3[%(name)-17s][%(levelname)-8s] %(message)s' + +# This can be used to control logging levels more specificically. This +# example sets the main salt library at the 'warning' level, but sets +# 'salt.modules' to log at the 'debug' level: +# log_granular_levels: +# 'salt': 'warning' +# 'salt.modules': 'debug' +# +#log_granular_levels: {} + +# To diagnose issues with minions disconnecting or missing returns, ZeroMQ +# supports the use of monitor sockets to log connection events. This +# feature requires ZeroMQ 4.0 or higher. +# +# To enable ZeroMQ monitor sockets, set 'zmq_monitor' to 'True' and log at a +# debug level or higher. +# +# A sample log event is as follows: +# +# [DEBUG ] ZeroMQ event: {'endpoint': 'tcp://127.0.0.1:4505', 'event': 512, +# 'value': 27, 'description': 'EVENT_DISCONNECTED'} +# +# All events logged will include the string 'ZeroMQ event'. A connection event +# should be logged as the minion starts up and initially connects to the +# master. If not, check for debug log level and that the necessary version of +# ZeroMQ is installed. +# +#zmq_monitor: False + +###### Module configuration ##### +########################################### +# Salt allows for modules to be passed arbitrary configuration data, any data +# passed here in valid yaml format will be passed on to the salt minion modules +# for use. It is STRONGLY recommended that a naming convention be used in which +# the module name is followed by a . and then the value. Also, all top level +# data must be applied via the yaml dict construct, some examples: +# +# You can specify that all modules should run in test mode: +#test: True +# +# A simple value for the test module: +#test.foo: foo +# +# A list for the test module: +#test.bar: [baz,quo] +# +# A dict for the test module: +#test.baz: {spam: sausage, cheese: bread} +# +# +###### Update settings ###### +########################################### +# Using the features in Esky, a salt minion can both run as a frozen app and +# be updated on the fly. These options control how the update process +# (saltutil.update()) behaves. +# +# The url for finding and downloading updates. Disabled by default. +#update_url: False +# +# The list of services to restart after a successful update. Empty by default. +#update_restart_services: [] + + +###### Keepalive settings ###### +############################################ +# ZeroMQ now includes support for configuring SO_KEEPALIVE if supported by +# the OS. If connections between the minion and the master pass through +# a state tracking device such as a firewall or VPN gateway, there is +# the risk that it could tear down the connection the master and minion +# without informing either party that their connection has been taken away. +# Enabling TCP Keepalives prevents this from happening. + +# Overall state of TCP Keepalives, enable (1 or True), disable (0 or False) +# or leave to the OS defaults (-1), on Linux, typically disabled. Default True, enabled. +#tcp_keepalive: True + +# How long before the first keepalive should be sent in seconds. Default 300 +# to send the first keepalive after 5 minutes, OS default (-1) is typically 7200 seconds +# on Linux see /proc/sys/net/ipv4/tcp_keepalive_time. +#tcp_keepalive_idle: 300 + +# How many lost probes are needed to consider the connection lost. Default -1 +# to use OS defaults, typically 9 on Linux, see /proc/sys/net/ipv4/tcp_keepalive_probes. +#tcp_keepalive_cnt: -1 + +# How often, in seconds, to send keepalives after the first one. Default -1 to +# use OS defaults, typically 75 seconds on Linux, see +# /proc/sys/net/ipv4/tcp_keepalive_intvl. +#tcp_keepalive_intvl: -1 + + +###### Windows Software settings ###### +############################################ +# Location of the repository cache file on the master: +#win_repo_cachefile: 'salt://win/repo/winrepo.p' + + +###### Returner settings ###### +############################################ +# Which returner(s) will be used for minion's result: +#return: mysql + + +###### Miscellaneous settings ###### +############################################ +# Default match type for filtering events tags: startswith, endswith, find, regex, fnmatch +#event_match_type: startswith diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3-saltstack/templates/minion.smtp.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3-saltstack/templates/minion.smtp.conf new file mode 100644 index 0000000000000000000000000000000000000000..f346f4528b908b420b088d8a3df0c24fb20d0228 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3-saltstack/templates/minion.smtp.conf @@ -0,0 +1,6 @@ +smtp_eole: + smtp.server: localhost + smtp.tls: false +%if not %%is_empty(%%system_mail_from) + smtp.sender: %%system_mail_from +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/creole_funcs/uploadedfiles.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/creole_funcs/uploadedfiles.py new file mode 100644 index 0000000000000000000000000000000000000000..691c77be1154ac27b3daf81c4908f5d821122f6a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/creole_funcs/uploadedfiles.py @@ -0,0 +1,30 @@ +# coding: utf-8 + +"""Lists files located in an upload target directory +""" +from os import listdir +from os.path import join, isfile, splitext, isdir +import json + +CONF_FILE='/etc/eole/flask/enabled/ead3fileserver.conf' + + +def uploaded_files(allowed_extensions=None, default_content=None): + """Lists files located in an upload target directory + """ + if isfile(CONF_FILE): + _DIRECTORY = json.load(open(CONF_FILE, 'r')).get("UPLOAD_FOLDER","") + else: + _DIRECTORY = "" + + if _DIRECTORY and isdir(_DIRECTORY): + list_file = [filename for filename in listdir(_DIRECTORY) + if isfile(join(_DIRECTORY, filename)) and ( + allowed_extensions is None or splitext(filename)[1] in allowed_extensions)] + if len(list_file) != 0: + return list_file + + if default_content is None: + return [] + else: + return [default_content] diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/dictionaries/00_eole-ead3_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/dictionaries/00_eole-ead3_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..a0b462163c4c9dd5a5ccc8a5ef6fb37558c4e736 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/dictionaries/00_eole-ead3_packages.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>python-ead3fileserver</package> + <package>ewt-portal</package> + <package>python3-salt.states.eole</package> + <package>nginx-full</package> + <package>python3-creole</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/dictionaries/29_ead3.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/dictionaries/29_ead3.xml new file mode 100644 index 0000000000000000000000000000000000000000..a05a0f46bd660aca385d90c8c86add09415906fb --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/dictionaries/29_ead3.xml @@ -0,0 +1,81 @@ +<?xml version='1.0' encoding='utf-8'?> + +<creole> + + <files> + <file name="/etc/ewt/appdata/ead/config.json" source="config_ead.json" mkdir="True" filelist='ead3'/> + <file name='/etc/eole/flask/available/ead3fileserver.conf' source='ead3fileserver.conf' filelist='ead3'/> + <file name="/srv/ead3/salt/top.sls" mkdir="True" filelist='ead3'/> + <file name="/var/lib/eole/config/ead3.cfg" source="ead3.services.cfg" filelist='ead3'/> + <file name='/etc/nginx/web.d/ead3.conf' source='ead3.nginx.conf' mkdir='True' rm='True' filelist='ead3' /> + <file name='/etc/apache2/sites-available/ead3.conf' source='ead3.apache.conf' rm='True' filelist='ead3_apache' /> + <file name='/etc/nginx/sites-enabled/ead3_apache.conf' source='ead3.apache_nginx.conf' rm='True' filelist='ead3_nginx' /> + <service_access service='ead3'> + <port service_accesslist='ead3'>443</port> + </service_access> + <service method='apache' servicelist='ead3_apache'>ead3</service> + </files> + + <variables> + + <family name='Services'> + <variable name='activer_ead3' type='oui/non' description='Activer l’interface d’administration du module (EAD3)' mode='expert'> + <value>non</value> + </variable> + + <!-- Workaround when eole-web is not installed --> + <variable name='activer_apache' type='oui/non' exists='False' hidden='True'> + <value>non</value> + </variable> + + <variable name='activer_saltstack_ead3' redefine='True'/> + </family> + + <family name='EAD3'> + <variable name='ead3_upload_path' type='string' description='Chemin de téléversement des fichiers EAD3' mode='expert'> + <value>/var/lib/eole/ead3files</value> + </variable> + </family> + <separators> + <separator name='ead3_upload_path'>Personnalisation de la configuration EAD3</separator> + </separators> + + </variables> + + <constraints> + + <!-- User can disable ead3 --> + <condition name='disabled_if_in' source='activer_ead3'> + <param>non</param> + <target type='filelist'>ead3_apache</target> + <target type='filelist'>ead3_nginx</target> + <target type='filelist'>ead3</target> + <target type='servicelist'>ead3_apache</target> + <target type='service_accesslist'>ead3</target> + </condition> + + <!-- Do not configure Apache if Apache is disabled --> + <condition name='disabled_if_in' source='activer_apache'> + <param>non</param> + <target type='filelist'>ead3_apache</target> + <target type='servicelist'>ead3_apache</target> + </condition> + + <!-- Disable EAD3 will disable SaltStack --> + <auto name='calc_val_first_value' target='activer_saltstack_ead3'> + <param type='eole' hidden='False'>activer_ead3</param> + <param>non</param> + </auto> + + </constraints> + + <help> + + <variable name='activer_ead3'>Publier l’interface d’administration du module sur le port standard HTTPS (443)</variable> + <variable name='ead3_upload_path'>Chemin absolu (commençant par un /) vers lequel sont téléversés les fichiers provenant de l'action "Gestion de fichier"</variable> + + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/extra_dictionaries/fileserver/00_action.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/extra_dictionaries/fileserver/00_action.xml new file mode 100644 index 0000000000000000000000000000000000000000..02d58a60f4c5715f7e89b32182cc23ec059f23da --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/extra_dictionaries/fileserver/00_action.xml @@ -0,0 +1,23 @@ +<creole> + <family_action name="Fichiers" + description="Stockage de fichiers pour les actions EAD3" + color="#fcce74" + image="icons/system-file-manager.svg"> + <action type="custom" + title="Gérer les fichiers" + description="Téléversement/téléchargement de fichiers pour les actions EAD3" + image="icons/system-file-manager.svg" + actionlist="fileserver"> + <profile>ead_admin</profile> + <ewtapp>ead</ewtapp> + <tag>fichiers</tag> + <tag>téléchargement</tag> + <tag>téléversement</tag> + </action> + </family_action> + <variables> + </variables> + <constraints> + </constraints> + <help/> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/extra_dictionaries/majlist/00_action.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/extra_dictionaries/majlist/00_action.xml new file mode 100644 index 0000000000000000000000000000000000000000..55646f0c0d566b4184f8d14a7a7e19caa7dfac30 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/extra_dictionaries/majlist/00_action.xml @@ -0,0 +1,27 @@ +<creole> + <family_action name="Mise à jour" + description="Gestion de la mise à jour" + color="#fca474" + image="icons/applications-internet.svg"> + <action type="reader" + title="Paquets à mettre à jour" + description="Afficher la liste des paquets disponibles" + image="icons/system-software-update.svg"> + <profile>ead_admin</profile> + <ewtapp>ead</ewtapp> + <tag>maj</tag> + <tag>système</tag> + </action> + </family_action> + <variables> + <family name="options" + description="Paquets à mettre à jour"> + <variable name="filename" type="filename"> + <value>/tmp/majlist</value> + </variable> + </family> + </variables> + <constraints> + </constraints> + <help/> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/extra_dictionaries/majonce/00_action.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/extra_dictionaries/majonce/00_action.xml new file mode 100644 index 0000000000000000000000000000000000000000..a39bc7e12f85fcc6309027114dc100ba16632eb4 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/extra_dictionaries/majonce/00_action.xml @@ -0,0 +1,61 @@ +<creole> + <family_action name="Mise à jour"> + <action type="form" + title="Mise à jour" + description="Programmer une mise à jour (maintenant, cette nuit, à exécution programmée)" + image="icons/x-office-calendar.svg"> + <input>Appliquer</input> + <profile>ead_admin</profile> + <ewtapp>ead</ewtapp> + <tag>maj-auto</tag> + <tag>update</tag> + <tag>mise à jour</tag> + <tag>schedule</tag> + </action> + </family_action> + + <variables> + <family description='Mise à jour unique' name="mise_a_jour"> + <variable description="Type de la mise à jour" type="string" name="typemaj"> + <value>Faire une mise à jour du serveur la nuit qui vient</value> + </variable> + <variable description="Choisir les options de mise à jour" type="string" name="majoption"> + <value>Mise à jour, reconfigure et redémarrage du serveur</value> + </variable> + <variable description="Heure" name='hour' type='number' mandatory='True'/> + <variable description="Minute" name='minute' type='number' mandatory='True'/> + <variable description="Jour" name='day' type='date' mandatory='True'/> + </family> + </variables> + + <constraints> + + <check name='valid_enum' target='majonce.mise_a_jour.typemaj'> + <param>['Faire une mise à jour du serveur instantanément', 'Programmer une mise à jour unique du serveur', 'Faire une mise à jour du serveur la nuit qui vient']</param> + </check> + <check name='valid_enum' target='majonce.mise_a_jour.majoption'> + <param>['Uniquement la mise à jour', 'Mise à jour et reconfigure', 'Mise à jour, reconfigure et redémarrage du serveur']</param> + </check> + + <condition name='disabled_if_not_in' source='majonce.mise_a_jour.typemaj'> + <param>Programmer une mise à jour unique du serveur</param> + <param>Faire une mise à jour du serveur instantanément</param> + <target type='variable'>majonce.mise_a_jour.majoption</target> + </condition> + <condition name ='disabled_if_not_in' source='majonce.mise_a_jour.typemaj'> + <param>Programmer une mise à jour unique du serveur</param> + <target type='variable'>majonce.mise_a_jour.hour</target> + <target type='variable'>majonce.mise_a_jour.minute</target> + <target type='variable'>majonce.mise_a_jour.day</target> + </condition> + + <check name='valid_enum' target='majonce.mise_a_jour.hour'> + <param type='python'>range(0, 24)</param> + </check> + <check name='valid_enum' target='majonce.mise_a_jour.minute'> + <param type='python'>range(0, 60)</param> + </check> + + </constraints> + <help/> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/extra_dictionaries/majreport/00_action.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/extra_dictionaries/majreport/00_action.xml new file mode 100644 index 0000000000000000000000000000000000000000..75c9ef092e3fd90a4b4184b18d899897d8c64438 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/extra_dictionaries/majreport/00_action.xml @@ -0,0 +1,32 @@ +<creole> + <family_action name="Mise à jour" + description="Gestion de la mise à jour" + color="#fca474" + image="icons/applications-internet.svg"> + <action type="reader" + title="Rapport de mise à jour" + description="Afficher le journal de la dernière mise à jour" + image="icons/edit-find.svg"> + <profile>ead_admin</profile> + <ewtapp>ead</ewtapp> + <tag>log</tag> + <tag>maj</tag> + <tag>maj-auto</tag> + <tag>mise à jour</tag> + </action> + </family_action> + <variables> + <family name="options" + description="Dernière mise à jour"> + <variable name="filename" type="filename"> + <value>/var/lib/eole/reports/rapport-maj.log</value> + </variable> + <variable name="language" type="string"> + <value>prolog</value> + </variable> + </family> + </variables> + <constraints> + </constraints> + <help/> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/extra_dictionaries/manageservices/00_action.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/extra_dictionaries/manageservices/00_action.xml new file mode 100644 index 0000000000000000000000000000000000000000..7f165d076d936b30e984283d4cda3008082560f3 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/extra_dictionaries/manageservices/00_action.xml @@ -0,0 +1,21 @@ +<creole> + <family_action name="Système" + description="Liste des actions pour gérer le système EOLE" + color="#ddc9e6" + image="system.svg"> + <action type="custom" + title="Services" + save="True" + description="Gestion des services" + image="icons/preferences-system-session.svg"> + <profile>ead_admin</profile> + <ewtapp>ead</ewtapp> + <tag>services</tag> + </action> + </family_action> + <variables> + </variables> + <constraints> + </constraints> + <help/> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/extra_dictionaries/reboot/00_action.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/extra_dictionaries/reboot/00_action.xml new file mode 100644 index 0000000000000000000000000000000000000000..9e0aef880f21d631cb2ce7a93b22ded3e843ef0b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/extra_dictionaries/reboot/00_action.xml @@ -0,0 +1,57 @@ +<creole> + <family_action name="Système" + description="Gestion du serveur" + color="#ddc9e6" + image="system.svg"> + <action type="form" + title="Redémarrer" + save="True" + description="Programmer le redémarrage du serveur" + image="icons/system-shutdown.svg"> + <input>Appliquer</input> + <profile>ead_admin</profile> + <ewtapp>ead</ewtapp> + <tag>reboot</tag> + <tag>redémarrage</tag> + </action> + </family_action> + + <variables> + <family name='reboot' + description="Programmer le redémarrage du serveur"> + <variable description="Type d'exécution" type="string" name="typeex"> + <value>Redémarrer le serveur la nuit qui vient</value> + </variable> + <variable description="Heure" name='hour' type='number' mandatory='True'/> + <variable description="Minute" name='minute' type='number' mandatory='True'/> + <variable description="Jour" name='day' type='date' mandatory='True'/> + </family> + </variables> + + <constraints> + + <check name='valid_enum' target='reboot.reboot.typeex'> + <param>['Redémarrer le serveur instantanément', 'Redémarrer le serveur la nuit qui vient', 'Redémarrer le serveur à une certaine date']</param> + </check> + + <condition name='disabled_if_not_in' source='reboot.reboot.typeex'> + <param>Redémarrer le serveur à une certaine date</param> + <param>Redémarrer le serveur instantanément</param> + </condition> + <condition name ='disabled_if_not_in' source='reboot.reboot.typeex'> + <param>Redémarrer le serveur à une certaine date</param> + <target type='variable'>reboot.reboot.hour</target> + <target type='variable'>reboot.reboot.minute</target> + <target type='variable'>reboot.reboot.day</target> + </condition> + + <check name='valid_enum' target='reboot.reboot.hour'> + <param type='python'>range(0, 24)</param> + </check> + <check name='valid_enum' target='reboot.reboot.minute'> + <param type='python'>range(0, 60)</param> + </check> + + </constraints> + <help/> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/extra_dictionaries/reconfigure/00_action.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/extra_dictionaries/reconfigure/00_action.xml new file mode 100644 index 0000000000000000000000000000000000000000..b7b567c9fec1d250a95aa6844a1e2cef0a72a8f4 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/extra_dictionaries/reconfigure/00_action.xml @@ -0,0 +1,55 @@ +<creole> + <family_action name="Système" + description="Gestion du serveur" + color="#ddc9e6" + image="system.svg"> + <action type="form" + title="Reconfigurer" + description="Programmer le reconfigure du serveur" + image="icons/preferences-system-session.svg"> + <input>Appliquer</input> + <profile>ead_admin</profile> + <ewtapp>ead</ewtapp> + <tag>reconfigure</tag> + </action> + </family_action> + <variables> + <family name='reconfigure' + description="Programmer le reconfigure du serveur"> + <variable description="Type d'exécution" type="string" name="typeex"> + <value>Reconfigurer le serveur la nuit qui vient</value> + </variable> + <variable description="Heure" name='hour' type='number' mandatory='True'/> + <variable description="Minute" name='minute' type='number' mandatory='True'/> + <variable description="Jour" name='day' type='date' mandatory='True'/> + </family> + </variables> + + <constraints> + + <check name='valid_enum' target='reconfigure.reconfigure.typeex'> + <param>['Reconfigurer le serveur instantanément', 'Reconfigurer le serveur la nuit qui vient', 'Reconfigurer le serveur à une certaine date']</param> + </check> + + <condition name='disabled_if_not_in' source='reconfigure.reconfigure.typeex'> + <param>Reconfigurer le serveur à une certaine date</param> + <param>Reconfigurer le serveur instantanément</param> + </condition> + <condition name ='disabled_if_not_in' source='reconfigure.reconfigure.typeex'> + <param>Reconfigurer le serveur à une certaine date</param> + <target type='variable'>reconfigure.reconfigure.hour</target> + <target type='variable'>reconfigure.reconfigure.minute</target> + <target type='variable'>reconfigure.reconfigure.day</target> + </condition> + + <check name='valid_enum' target='reconfigure.reconfigure.hour'> + <param type='python'>range(0, 24)</param> + </check> + <check name='valid_enum' target='reconfigure.reconfigure.minute'> + <param type='python'>range(0, 60)</param> + </check> + + </constraints> + + <help/> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/extra_dictionaries/scheduleonce/00_action.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/extra_dictionaries/scheduleonce/00_action.xml new file mode 100644 index 0000000000000000000000000000000000000000..066f1805fa0f024e7801030707a961bc1b29d76f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/extra_dictionaries/scheduleonce/00_action.xml @@ -0,0 +1,17 @@ +<creole> + <family_action name="Tâches planifiées"> + <action type="custom" + title="Tâches uniques" + description="Liste des tâches planifiées cette nuit" + image="icons/preferences-desktop-screensaver.svg"> + <profile>ead_admin</profile> + <ewtapp>ead</ewtapp> + <tag>schedule</tag> + </action> + </family_action> + <variables> + </variables> + <constraints> + </constraints> + <help/> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/extra_dictionaries/shutdown/00_action.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/extra_dictionaries/shutdown/00_action.xml new file mode 100644 index 0000000000000000000000000000000000000000..af8f69af427d317aa4690958bce82241badf2340 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/extra_dictionaries/shutdown/00_action.xml @@ -0,0 +1,58 @@ +<creole> + <family_action name="Système" + description="Gestion du serveur" + color="#ddc9e6" + image="system.svg"> + <action type="form" + title="Éteindre" + description="Programmer l'arrêt du serveur" + image="icons/system-shutdown.svg"> + <input>Appliquer</input> + <profile>ead_admin</profile> + <ewtapp>ead</ewtapp> + <tag>shutdown</tag> + <tag>arrêt</tag> + <tag>éteindre</tag> + <tag>halt</tag> + <tag>poweroff</tag> + </action> + </family_action> + + <variables> + <family name='shutdown' + description="Programmer l'arrêt du serveur"> + <variable description="Type d'exécution" type="string" name="typeex"> + <value>Éteindre le serveur la nuit qui vient</value> + </variable> + <variable description="Heure" name='hour' type='number' mandatory='True'/> + <variable description="Minute" name='minute' type='number' mandatory='True'/> + <variable description="Jour" name='day' type='date' mandatory='True'/> + </family> + </variables> + + <constraints> + + <check name='valid_enum' target='shutdown.shutdown.typeex'> + <param>['Éteindre le serveur instantanément', 'Éteindre le serveur la nuit qui vient', 'Éteindre le serveur à une certaine date']</param> + </check> + + <condition name='disabled_if_not_in' source='shutdown.shutdown.typeex'> + <param>Éteindre le serveur à une certaine date</param> + </condition> + <condition name ='disabled_if_not_in' source='shutdown.shutdown.typeex'> + <param>Éteindre le serveur à une certaine date</param> + <target type='variable'>shutdown.shutdown.hour</target> + <target type='variable'>shutdown.shutdown.minute</target> + <target type='variable'>shutdown.shutdown.day</target> + </condition> + + <check name='valid_enum' target='shutdown.shutdown.hour'> + <param type='python'>range(0, 24)</param> + </check> + <check name='valid_enum' target='shutdown.shutdown.minute'> + <param type='python'>range(0, 60)</param> + </check> + + </constraints> + <help/> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/files/etc/eole/flask/available/ead3fileserver.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/files/etc/eole/flask/available/ead3fileserver.conf new file mode 100644 index 0000000000000000000000000000000000000000..478ef199827581bf0557c9610024da3c6899dad8 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/files/etc/eole/flask/available/ead3fileserver.conf @@ -0,0 +1,10 @@ +{ +"APPNAME":"ead3fileserver", +"MOUNT_POINT":"/ead3fileserver", +"LABEL":"EAD3 - Serveur de fichiers", +"DEBUG": "FALSE", +"LOG_LEVEL":"INFO", +"UPLOAD_FOLDER": "%%ead3_upload_path", +"ALLOWED_EXTENSIONS": ["xml", "csv", "tgz", "zip", "tar.gz", "gz"], +"CORS_AUTHORIZATIONS": ["*"] +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/posttemplates/51-ead3fileserver b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/posttemplates/51-ead3fileserver new file mode 100644 index 0000000000000000000000000000000000000000..0a1f69c080e2b08711697d7e3eed2859e469200b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/posttemplates/51-ead3fileserver @@ -0,0 +1,17 @@ +#!/bin/bash + +# Script EAD3 posttemplate + +# Activation de l'EAD3 au niveau des applications flask (ead3fileserver) + +############################################ + +activer_ead3=$(CreoleGet activer_ead3 non) + +if [ "$activer_ead3" == "oui" ] +then + CreoleRun "/usr/share/eole/sbin/eflkctl enable ead3fileserver &>/dev/null" +else + CreoleRun "/usr/share/eole/sbin/eflkctl disable ead3fileserver &>/dev/null" +fi +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..a75c3e9453f307d47120393a2724ffdb496872f8 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/service.yml @@ -0,0 +1,72 @@ +format: '0.1' +name: eole-ead3 +version: |- + 2.7.1-2 +description: |- + EAD3 actions and configuration files for ewt-portal. + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: + - eole-server +packages: + - python-ead3fileserver + - ewt-portal + - python3-salt.states.eole + - nginx-full + - python3-creole +dictionaries: + - 29_ead3.xml +extra_dictionaries: + fileserver: + - 00_action.xml + majlist: + - 00_action.xml + majonce: + - 00_action.xml + majreport: + - 00_action.xml + manageservices: + - 00_action.xml + reboot: + - 00_action.xml + reconfigure: + - 00_action.xml + scheduleonce: + - 00_action.xml + shutdown: + - 00_action.xml +templates: + - config_ead.json + - ead3.apache.conf + - ead3.apache_nginx.conf + - ead3.nginx.conf + - ead3.services.cfg + - ead3fileserver.conf + - top.sls +creole_funcs: + - uploadedfiles.py +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: + - 51-ead3fileserver +files: + /etc/eole/flask/available/ead3fileserver.conf: + owner: root + group: root + mode: '0644' +excluding_regexp: + /usr/share/doc: 2 + /usr/share/eole/creole/extra/fileserver/custom/: 367 + /usr/share/eole/creole/extra/majlist/salt/: 1 + /usr/share/eole/creole/extra/majonce/sls/: 2 + /usr/share/eole/creole/extra/manageservices/custom/: 759 + /usr/share/eole/creole/extra/manageservices/salt/: 1 + /usr/share/eole/creole/extra/reboot/salt/: 1 + /usr/share/eole/creole/extra/reboot/sls/: 2 + /usr/share/eole/creole/extra/reconfigure/sls/: 2 + /usr/share/eole/creole/extra/scheduleonce/custom/: 810 + /usr/share/eole/creole/extra/scheduleonce/salt/: 1 + /usr/share/eole/creole/extra/shutdown/salt/: 1 + /usr/share/eole/creole/extra/shutdown/sls/: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/templates/config_ead.json b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/templates/config_ead.json new file mode 100644 index 0000000000000000000000000000000000000000..1af52816bee2eda9a2e8f5a7be07dd796e77449c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/templates/config_ead.json @@ -0,0 +1,6 @@ +{ + "app_title": "EAD", + "eole_module": "%%eole_module", + "server_name": "%%nom_machine", + "domain_name": "%%libelle_etab" +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/templates/ead3.apache.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/templates/ead3.apache.conf new file mode 100644 index 0000000000000000000000000000000000000000..f09479f05dc9db66503c6c38fdb024ed37b6668c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/templates/ead3.apache.conf @@ -0,0 +1,12 @@ +<Location /ead> + RewriteEngine On + RewriteCond %{HTTPS} off + RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] + ProxyPass http://127.0.0.1:4300/ead + ProxyPassReverse http://127.0.0.1:4300/ead + ProxyPreserveHost Off + RequestHeader set X-Forwarded-Proto "https" + Order Allow,Deny + Allow from all +</Location> + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/templates/ead3.apache_nginx.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/templates/ead3.apache_nginx.conf new file mode 100644 index 0000000000000000000000000000000000000000..5902ef5b6c93c3d89d613ae78708bb0128b07eb9 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/templates/ead3.apache_nginx.conf @@ -0,0 +1,19 @@ +# Configuration for local EAD +server { +%if %%activer_apache == 'oui' and %%mode_conteneur_actif == 'non' + listen 4300; + set_real_ip_from 127.0.0.1; + real_ip_header X-Forwarded-For; +%else + listen 443 ssl; + ssl_certificate %%server_cert; + ssl_certificate_key %%server_key; +%end if + access_log /var/log/nginx/revprox.revprox_ead3.access.log; + server_name localhost; + error_page 403 404 502 503 504 /nginx.html; + location = /nginx.html{ + root /usr/share/nginx/html; + } + include web.d/ead3.conf; +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/templates/ead3.nginx.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/templates/ead3.nginx.conf new file mode 100644 index 0000000000000000000000000000000000000000..9442c779964cff235d2c2435be455436894470f0 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/templates/ead3.nginx.conf @@ -0,0 +1,164 @@ +location ~ ^/ead/appdata(?:/(.*))?$ { + alias /etc/ewt/appdata/ead/$1; +} + +location ~ ^/ead(?:/(.*))?$ { + + access_log /var/log/nginx/ead3-access.log; + error_log /var/log/nginx/ead3-error.log; + + proxy_redirect off; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + + # Accès websockets + location ~ ^/ead/ws(?:/(.*))?$ { + + proxy_pass http://127.0.0.1:%%salt_api_port/$1; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_read_timeout 1d; + + } + + # Accès fileserver + location ~ ^/ead/fileserver(?:/(.*))?$ { + proxy_pass http://127.0.0.1:5000/ead3fileserver/$1; + } + + if ($request_method = POST ) { + proxy_pass http://127.0.0.1:%%salt_api_port/$1; + } + + alias /usr/share/ewt/static/$1; + + %set %%allowall=False + + %if %%activer_firewall == 'non' + %set %%allowall=True + allow all; + %elif %%ssh_eth0 == 'oui' + %for %%admin_net in %%ip_ssh_eth0 + %if %%admin_net == '0.0.0.0' and %%admin_net.netmask_ssh_eth0 == '0.0.0.0' + %set %%allowall=True + allow all; + %break + %end if + %end for + %end if + %if %%allowall == False + %for %%interface in %%range(%%int(%%nombre_interfaces)) + %if %%getVar('ssh_eth{0}'.format(%%interface), 'non') == 'oui' + + # ssh_eth%%interface + %for %%admin_net in %%getVar('ip_ssh_eth{0}'.format(%%interface)) + %set %%net = %%admin_net + '/' + %%calc_classe(%%getattr(%%admin_net, 'netmask_ssh_eth{0}'.format(%%interface))) + %if %%net == '0.0.0.0/0.0.0.0' + allow %%getVar('adresse_network_eth' + %%str(%%interface))/%%calc_classe(%%getVar('adresse_netmask_eth' + %%str(%%interface))); + %if %%getVar('vlan_eth' + %%str(%%interface)) == 'oui' + %for %%vlan in %%getVar('vlan_id_eth' + %%str(%%interface)) + %set vlan_network = 'vlan_network_eth' + %%str(%%interface) + %set vlan_netmask = 'vlan_netmask_eth' + %%str(%%interface) + allow %%getattr(vlan, %%vlan_network)/%%calc_classe(%%getattr(vlan, %%vlan_netmask)); + %end for + %end if + %if %%getVar('alias_eth' + %%str(%%interface)) == 'oui' + %for %%idx, %%alias in %%enumerate(%%getVar('alias_ip_eth' + %%str(%%interface))) + %set alias_network = 'alias_network_eth' + %%str(%%interface) + %set alias_netmask = 'alias_netmask_eth' + %%str(%%interface) + allow %%getattr(alias, %%alias_network)/%%calc_classe(%%getattr(alias, %%alias_netmask)); + %end for + %end if + %if %%activer_route == "oui" + #Routes statiques + %for %%indirectnet in %%route_adresse + %if %%indirectnet.route_int == %%str(%%interface) + allow %%indirectnet/%%calc_classe(%%indirectnet.route_netmask); + %end if + %end for + %end if + %else + allow %%net; + %end if + %end for + %end if + %end for + %end if + + # Deny by default + deny all; +} + +µµµµµµµµµµ +µµµµµµµµµµ For external action +µµµµµµµµµµ +%set %%dico = {} +%for %%key, %%value in %%creole_client.get('/actions', {}, withoption='type', withvalue='external').items() + %set %%action_name = %%key.split('.')[-2] + %silent %%dico.setdefault(%%action_name, {'url': None, 'name': None, 'ewtapp': None, 'activate': False}) + %set %%key_name = %%key.split('.')[-1] + %if %%key_name in ['url', 'name', 'ewtapp', 'activate', 'rewrite'] + %set %%dico[%%action_name][%%key_name] = %%value + %end if +%end for +%for %%key, %%values in %%dico.items() + %if %%values['name'] is not None and %%values['url'] is not None and %%values['ewtapp'] is not None + %if %%values['activate'] + %for %%ewtapp in %%values['ewtapp'] + +# external url for the action '%%values['name']' +location ^~ /%%{ewtapp}/%%values['name']/ { + proxy_pass %%values['url']; + # change security headers to allow display in iframe (same origin) + proxy_hide_header X-Frame-Options; + proxy_hide_header content-security-policy; + add_header X-Frame-Options "SAMEORIGIN"; + add_header content-security-policy "frame-ancestors 'self'"; + # check if user is allowed to access application + auth_request /ead/auth_%%values['name']; +%if 'rewrite' in %%values and %%values['rewrite'] + # rewrite URLs in content (for applications with absolute URLS) + # add "/ewtapp/name" for every href/action/src starting with "/" + sub_filter ' href="/' ' target="_self" href="/%%{ewtapp}/%%values['name']/'; + sub_filter ' action="/' ' target="_self" action="/%%{ewtapp}/%%values['name']/'; + sub_filter ' src="/' ' target="_self" src="/%%{ewtapp}/%%values['name']/'; + sub_filter_once off; + # disable encoding on proxied application because + # sub_filter does not work on gzippe'd content + proxy_set_header Accept-Encoding ""; +%end if +} +location = /ead/auth_%%values['name'] { + proxy_method POST; + proxy_set_header Accept "application/json"; + proxy_set_header Content-Type "application/json"; + proxy_pass http://127.0.0.1:%%salt_api_port/; + # pass parameters to called function to check perms for each URL ? + proxy_set_body '[{"fun":"%%{ewtapp}.%%{values['name']}_ping", "client":"local", "tgt":"local"}]'; + } + %end for + %end if + %end if +%end for +µµµµµµµµµµ +µµµµµµµµµµ For custom action +µµµµµµµµµµ +%set %%customs = [] +%for %%key, %%value in %%creole_client.get('/actions', {}, withoption='type', withvalue='custom').items() + %set %%action_name = %%key.split('.')[-2] + %set %%key_name = %%key.split('.')[-1] + %if %%key_name == 'name' + %%customs.append(%%value) + %end if +%end for +%for %%action_name in %%customs + %set %%dirname = "/usr/share/eole/creole/extra/" + %%action_name + "/custom/" + %if %%os.path.isdir(%%dirname) +# custom url for the action '%%action_name' +location ^~ /ead/customs/%%action_name { + alias %%dirname; +} + %end if +%end for diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/templates/ead3.services.cfg b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/templates/ead3.services.cfg new file mode 100644 index 0000000000000000000000000000000000000000..4c600e7d76d8e26d9abbeda10da2576f06d8238d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/templates/ead3.services.cfg @@ -0,0 +1,20 @@ +[eole] +%set %%services = [] +%for %%service in %%creole_client.get_services(): +%if %%service.get('activate', False) == True and %%service['method'] in [u'service', u'upstart', u'network', u'systemd']: +%%services.append((%%service['name'], %%service['container_group']))%slurp +%end if +%end for +services_name =%slurp +%for %%service in %%services + %%service[0]%slurp +%end for + +services_container =%slurp +%for %%service in %%services + %%service[1]%slurp +%end for + +services_warn = salt-minion salt-master salt-api +services_non_stop = networking bastion rsyslog ead-web eole-sso +services_excluded = network salt-minion salt-api salt-master nginx diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/templates/ead3fileserver.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/templates/ead3fileserver.conf new file mode 100644 index 0000000000000000000000000000000000000000..478ef199827581bf0557c9610024da3c6899dad8 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/templates/ead3fileserver.conf @@ -0,0 +1,10 @@ +{ +"APPNAME":"ead3fileserver", +"MOUNT_POINT":"/ead3fileserver", +"LABEL":"EAD3 - Serveur de fichiers", +"DEBUG": "FALSE", +"LOG_LEVEL":"INFO", +"UPLOAD_FOLDER": "%%ead3_upload_path", +"ALLOWED_EXTENSIONS": ["xml", "csv", "tgz", "zip", "tar.gz", "gz"], +"CORS_AUTHORIZATIONS": ["*"] +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/templates/top.sls b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/templates/top.sls new file mode 100644 index 0000000000000000000000000000000000000000..e808a0fdd097b2e4f51edcc481992ab572f24ed5 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ead3/templates/top.sls @@ -0,0 +1,3 @@ +base: + '*': + - test.ping diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-eclair/dictionaries/30_eclair.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-eclair/dictionaries/30_eclair.xml new file mode 100644 index 0000000000000000000000000000000000000000..b117e9266a3786722d4083149808c48cc7a609a5 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-eclair/dictionaries/30_eclair.xml @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files/> + <containers/> + + <variables> + + <family name='general'> + <variable name='eole_module' redefine='True'> + <value>eclair</value> + </variable> + <variable name='nombre_interfaces' redefine='True' mode='expert'/> + </family> + + <family name='système'> + + <!-- We need to recalculate the variables --> + <variable name='eole_lv_names' redefine='True' remove_check='True' /> + <variable name='eole_lv_standard_extends' redefine='True' remove_check='True' /> + + </family> + + <family name='Interface-0'> + <variable name='eth0_method' redefine='True' hidden='True'> + <value>statique</value> + </variable> + </family> + + <separators/> + + </variables> + + <constraints> + + <!-- Default AmonEcole* logical volumes --> + <auto name='calc_multi_val' target='eole_lv_names'> + <param>root</param> + <param>tmp</param> + <param>opt</param> + </auto> + + <!-- Default AmonEcole* logical volumes extension: 100% /home --> + <auto name='calc_multi_val' target='eole_lv_standard_extends'> + <param type='number'>0</param> + <param type='number'>0</param> + <param type='number'>100</param> + </auto> + + </constraints> + + <help/> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-eclair/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-eclair/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..c28138485ab7b47660c973092ef7f43a1883d252 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-eclair/service.yml @@ -0,0 +1,27 @@ +format: '0.1' +name: eole-eclair +version: |- + 2.7.0-1 +description: |- + configuration du module Eole : Eclair + Pour toute information complementaire, veuillez vous rendre + sur le site du Projet a l'adresse suivante : + . + http://eole.orion.education.fr +depends: + - eole-ltsp-server + - eole-gaspacho-agent + - eole-server +packages: [] +dictionaries: + - 30_eclair.xml +extra_dictionaries: {} +templates: [] +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: [] +files: {} +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ecostations/dictionaries/00_eole-ecostations_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ecostations/dictionaries/00_eole-ecostations_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..6367cf9757f8b830edadc1a30d58b20df77430cc --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ecostations/dictionaries/00_eole-ecostations_packages.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>wakeonlan</package> + <package>eole-ecostations-apps</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ecostations/dictionaries/52_ecostations.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ecostations/dictionaries/52_ecostations.xml new file mode 100644 index 0000000000000000000000000000000000000000..4aa4fa8b52b1df504ec606780a720857583868a0 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ecostations/dictionaries/52_ecostations.xml @@ -0,0 +1,24 @@ +<?xml version='1.0' encoding='utf-8'?> +<creole> + + <files> + <service method='apache' servicelist='apache'>ecostations.conf</service> + <file name='/var/www/html/outils/ecoStations/config/db.inc.php' source='ecostations-db.inc.php'/> + </files> + + <variables> + <family name='applications web'> + <variable name='activer_ecostations' type='oui/non' description="Activer ecoStations (extinction du parc informatique)" hidden='True'> + <value>oui</value> + </variable> + </family> + </variables> + + <constraints> + </constraints> + + <help> + <variable name='activer_ecostations'>ecoStations est un outil qui permet d'éteindre le parc informatique d'un établissement</variable> + </help> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ecostations/files/etc/sudoers.d/ecostations b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ecostations/files/etc/sudoers.d/ecostations new file mode 100644 index 0000000000000000000000000000000000000000..66bbf9cc6ba9a6a3d6a64a08c0e1e657f443ee60 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ecostations/files/etc/sudoers.d/ecostations @@ -0,0 +1,8 @@ +#script de configuration du cron utilisé par ecostations +www-data ALL=NOPASSWD : /var/www/html/outils/ecoStations/IecoStations.pl +www-data ALL=NOPASSWD : /var/www/html/outils/ecoStations/IecoStations_start.pl +www-data ALL=NOPASSWD : /var/www/html/outils/ecoStations/suppr_cron.pl +www-data ALL=NOPASSWD : /var/www/html/outils/ecoStations/suppr_cron_stop.pl +www-data ALL=NOPASSWD : /var/www/html/outils/ecoStations/copieFicMachinesDB.pl + + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ecostations/files/home/netlogon/annule-ecostation.exe b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ecostations/files/home/netlogon/annule-ecostation.exe new file mode 100644 index 0000000000000000000000000000000000000000..c571fbb90f44ef48cd438eae5bd1abd4c24d04b8 Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ecostations/files/home/netlogon/annule-ecostation.exe differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ecostations/files/usr/share/eole/applications/gen/ecostations.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ecostations/files/usr/share/eole/applications/gen/ecostations.py new file mode 100644 index 0000000000000000000000000000000000000000..43f4ca8d818dfa3b31a0fd16a694d5e05790ff99 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ecostations/files/usr/share/eole/applications/gen/ecostations.py @@ -0,0 +1,33 @@ +#-*-coding:utf-8-*- +########################################################################### +# Eole NG - 2017 +# Copyright Pole de Competence Eole (Ministere Education - Academie Dijon) +# Licence CeCill cf /root/LicenceEole.txt +# eole@ac-dijon.fr +# +# Création de la base de données MySQL pour ecoStations +# +########################################################################### +""" + Config pour ecoStations +""" +from eolesql.db_test import db_exists, test_var + +def test(): + """ + teste l'existence de la bdd ecoStations + """ + return test_var('activer_ecostations') and not db_exists('ecoStations') + +def pregen_func(db_handler): + """ + Fonction exécutée avant la génération si le test est bon + """ + db_handler.simple_query("CREATE DATABASE ecoStations;") + db_handler.simple_query("GRANT ALL PRIVILEGES ON ecoStations.* TO ecostations@localhost IDENTIFIED BY 'ecostations';") + db_handler.simple_query("FLUSH PRIVILEGES;") + +conf_dict = dict(filenames=[], + test=test, + pregen=pregen_func, + ) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ecostations/files/usr/share/eole/applications/passwords/ecostations.ini b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ecostations/files/usr/share/eole/applications/passwords/ecostations.ini new file mode 100644 index 0000000000000000000000000000000000000000..2dd1377913409e02c5d355943d9b35a2bbf64c66 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ecostations/files/usr/share/eole/applications/passwords/ecostations.ini @@ -0,0 +1,6 @@ +[ecostations] +username=ecostations +template=$pass=" +filename=/var/www/html/outils/ecoStations/config/db.inc.php +owner=root:www-data +chmod=660 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ecostations/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ecostations/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..77979f7f374670107e3002d9119b8d732268d120 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ecostations/service.yml @@ -0,0 +1,46 @@ +format: '0.1' +name: eole-ecostations +version: |- + 2.5.1-7 +description: |- + Configuration EOLE pour ecoStations + ecoStations est un outil qui permet d'éteindre le parc informatique + d'un établissement suivant une procédure assez souple pour permettre + d'intégrer la notion d'internat par exemple ou de station à laisser + allumée constamment. + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: [] +packages: + - wakeonlan + - eole-ecostations-apps +dictionaries: + - 52_ecostations.xml +extra_dictionaries: {} +templates: + - ecostations-db.inc.php +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: [] +files: + /home/netlogon/annule-ecostation.exe: + owner: root + group: root + mode: '0644' + /etc/sudoers.d/ecostations: + owner: root + group: root + mode: '0644' + /usr/share/eole/applications/passwords/ecostations.ini: + owner: root + group: root + mode: '0644' + /usr/share/eole/applications/gen/ecostations.py: + owner: root + group: root + mode: '0644' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ecostations/templates/ecostations-db.inc.php b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ecostations/templates/ecostations-db.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..7f443a3799aa491069f3f7d0d1c28e52bfc63d50 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ecostations/templates/ecostations-db.inc.php @@ -0,0 +1,7 @@ +<?php +$dbhost="localhost"; +$user="ecostations"; +$pass="MGQ5M718"; + +$database="ecoStations"; +?> \ No newline at end of file diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ejabberd/dictionaries/30_ejabberd.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ejabberd/dictionaries/30_ejabberd.xml new file mode 100644 index 0000000000000000000000000000000000000000..0740eb7a580be157d088864b7cb8e25991b1fa1f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ejabberd/dictionaries/30_ejabberd.xml @@ -0,0 +1,100 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + <containers> + <container name="reseau" id="51"/> + <container name='jabber' id='23' group="reseau"> + <package>eole-ejabberd-pkg</package> + <file name='/etc/ldap.conf'/> + <file filelist='client_ldap' rm='True' name='/etc/ldap/ldap.conf'/> + <file name='/etc/nsswitch.conf' source="nsswitch.conf.default"/> + <service servicelist='ejabberd'>ejabberd</service> + <service_access service='ejabberd'> + <port>5222</port> + <port>5223</port> + </service_access> + <file filelist='ejabberd' name='/etc/ejabberd/ejabberd.yml' /> + <file filelist='jappix' name='/etc/pam.d/ejabberd' source='pam_ejabberd' rm='True'/> + <file filelist='jappix' name='/etc/pam_cas.conf' source="pam_cas_auth.conf"/> + </container> + </containers> + + <variables> + <family name='services'> + <variable name='activer_ejabberd' type='oui/non' description="Activer le serveur de messagerie instantanée ejabberd" > + <value>oui</value> + </variable> + </family> + <family name="annuaire"> + <variable name="ldap_nss" redefine="True"> + <value>oui</value> + </variable> + </family> + <family name='ejabberd' icon='comments'> + <variable name='domaine_messagerie_etab' type='string' hidden='True' exists='False'/> + <variable name='domain_jabber_etab' type='string' description="Nom de domaine de la messagerie instantanée de l'établissement (ex : monetab.ac-aca.fr)" mandatory='True'/> + <variable name='ejabberd_shared_roster_ldap' type='oui/non' description="Voir les autres utilisateurs sans autorisation préalable"> + <value>non</value> + </variable> + <variable name='ejabberd_admin_user' type='string' description="Login de l'administrateur" mode='expert'> + <value>admin</value> + </variable> + <variable name='ejabberd_max_login_per_user' type='number' description="Nombre maximum de connexions simultanées par utilisateur" mode='expert'> + <value>10</value> + </variable> + <variable name='activer_jappix' type='oui/non' description='Activer Jappix (plateforme sociale)' hidden='True'> + <value>non</value> + </variable> + </family> + + </variables> + + <constraints> + + <!-- famille ejabberd --> + <fill name='calc_val' target='domain_jabber_etab'> + <param type='eole' name='valeur'>domaine_messagerie_etab</param> + </fill> + + <!-- can't work with activer_client_ldap="non" --> + <condition name='disabled_if_in' source='activer_client_ldap'> + <param>non</param> + <target type='variable'>activer_ejabberd</target> + </condition> + + <!-- activation du logiciel --> + <condition name='disabled_if_in' source='activer_ejabberd'> + <param>non</param> + <target type='filelist'>ejabberd</target> + <target type='servicelist'>ejabberd</target> + <target type='family'>ejabberd</target> + </condition> + + <!-- 61_jappix.xml doit rester compatible 2.3 --> + <condition name='disabled_if_in' source='activer_sso' fallback='True'> + <param>non</param> + <target type='filelist'>jappix</target> + </condition> + <condition name='disabled_if_in' source='activer_ejabberd'> + <param>non</param> + <target type='filelist'>jappix</target> + </condition> + <condition name='disabled_if_in' source='activer_jappix'> + <param>non</param> + <target type='filelist'>jappix</target> + </condition> + + </constraints> + + <help> + <family name='ejabberd'>Paramétrage du serveur de messagerie instantanée ejabberd</family> + <variable name='activer_ejabberd'>ejabberd est un serveur Jabber/XMPP libre de messagerie instantanée à haute performance</variable> + <variable name='domain_jabber_etab'>Nom d'hôte du serveur de messagerie instantanée ejabberd. Il doit être correctement déclaré dans le DNS</variable> + <variable name='ejabberd_shared_roster_ldap'>Le module shared_roster_ldap permet de mettre en contact des utilisateurs sans entente préalable</variable> + <variable name='ejabberd_admin_user'>Login de l'utilisateur qui doit être administrateur du serveur ejabberd</variable> + <variable name='ejabberd_max_login_per_user'>Nombre maximum de connexions simultanées autorisées pour un utilisateur</variable> + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ejabberd/extra_dictionaries/schedule/01_ejabberd.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ejabberd/extra_dictionaries/schedule/01_ejabberd.xml new file mode 100644 index 0000000000000000000000000000000000000000..1d3f58e292d82cc8771954616c722f2f22bf429a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ejabberd/extra_dictionaries/schedule/01_ejabberd.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + <variables> + <family name="ejabberd" description="Exportation de la base de données ejabberd"> + <variable name="description" hidden="True" type="string"><value>Exportation de la base de ejabberd</value></variable> + <variable name="day" type="schedule"></variable> + <variable name="mode" hidden="True" type="schedulemod"><value>pre</value></variable> + </family> + </variables> + <constraints> + <fill name='calc_multi_condition' target='schedule.ejabberd.day'> + <param>non</param> + <param type='eole' name='condition_1' hidden='False'>activer_ejabberd</param> + <param name='match'>none</param> + <param name='mismatch'>daily</param> + </fill> + </constraints> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ejabberd/files/usr/share/eole/bareos/restore/jabber.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ejabberd/files/usr/share/eole/bareos/restore/jabber.py new file mode 100644 index 0000000000000000000000000000000000000000..94989a19c130e7a263dcdd302b314549637c4230 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ejabberd/files/usr/share/eole/bareos/restore/jabber.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python +"""Module jabber""" +import sys +from shutil import copyfile +from os.path import isdir +from os import remove, makedirs +from creole.client import CreoleClient +from pyeole.process import system_code +from pyeole.service import manage_service +from pyeole.bareosrestore import bareos_restore_one_file, exit_if_running_jobs + +jabfile = '/home/backup/ejabberd' +dirname = '/var/backups/ejabberd' +filename = "{0}/ejabberd.tmp".format(dirname) +dico_eole = CreoleClient() + +def execute(option, opt_str, value, parser, jobid, test_jobs=True): + """jabber helper""" + if dico_eole.get_creole('activer_ejabberd') == 'non': + sys.exit(0) + if len(parser.rargs) > 0: + option = parser.rargs[0] + if option == 'pre': + pre() + elif option == 'post': + post() + else: + if test_jobs: + exit_if_running_jobs() + job(jobid) + +def pre(): + print "pre jabber" + +def post(): + """ + Backup of jabber database : ejabberdctl is in container while database is in + /home/backup on host. + ejabberdctl cannot reach database in /home/backup on host. Database must be + copied first in relevant container to be processed. + """ + print "post jabber" + path = dico_eole.get_creole('container_path_jabber') + if not isdir(path+dirname): + makedirs(path+dirname) + + destdir = path + filename + copyfile(jabfile, destdir) + system_code(["/bin/chown", "ejabberd", filename], container='jabber') + system_code(["/bin/su", "-l", "ejabberd", "-c", "/usr/sbin/ejabberdctl install_fallback " + filename], container='jabber') + remove(destdir) + manage_service('restart', 'ejabberd', container='jabber') + +def job(jobid): + print "Restauration de la base ejabberd" + bareos_restore_one_file(jabfile, jobid) + +priority = 20 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ejabberd/files/usr/share/eole/diagnose/68-ejabberd b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ejabberd/files/usr/share/eole/diagnose/68-ejabberd new file mode 100644 index 0000000000000000000000000000000000000000..c544ddba5f846be9683b6f72d895c1be5d07e545 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ejabberd/files/usr/share/eole/diagnose/68-ejabberd @@ -0,0 +1,9 @@ +#!/bin/bash +if [ $(CreoleGet activer_ejabberd non) = 'oui' ];then + . /usr/lib/eole/diagnose.sh + EchoGras "*** Serveur XMPP (jabber)" + TestService "Ejabberd" $(CreoleGet container_ip_jabber):5222 +echo +fi + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ejabberd/files/usr/share/eole/schedule/scripts/ejabberd b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ejabberd/files/usr/share/eole/schedule/scripts/ejabberd new file mode 100644 index 0000000000000000000000000000000000000000..124383577899e4454bd453cb1c3f6affab5f019a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ejabberd/files/usr/share/eole/schedule/scripts/ejabberd @@ -0,0 +1,32 @@ +#!/bin/bash + +set -e + +DESC="Exportation de la base de jabber" + +. /usr/share/eole/schedule/config.sh + +JABSAV=$SAVDIR/ejabberd + +container_path_jabber=$(CreoleGet container_path_jabber) + +mkdir -p $SAVDIR +rm -f $JABSAV + +TMPINDIR="/var/backups/ejabberd" +TMPDIR=$container_path_jabber$TMPINDIR +mkdir -p $TMPDIR +CreoleRun "chown ejabberd: $TMPINDIR" jabber +chmod 700 $TMPDIR +TMPINFILE="$TMPINDIR/ejabberd" +TMPFILE="$TMPDIR/ejabberd" + +rm -f $TMPDIR/* + +CreoleRun "su -l ejabberd -c \"/usr/sbin/ejabberdctl backup $TMPINFILE\"" jabber + +chown root: $TMPFILE +chmod 600 $TMPFILE + +mv $TMPFILE $JABSAV +rmdir $TMPDIR diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ejabberd/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ejabberd/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..7a462630ba9a19f6ddf2f9c910de88956637aa96 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ejabberd/service.yml @@ -0,0 +1,39 @@ +format: '0.1' +name: eole-ejabberd +version: |- + 2.7.0-2 +description: |- + Dictionnaire, templates et utilitaires pour Ejabberd + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: + - eole-client-annuaire +packages: [] +dictionaries: + - 30_ejabberd.xml +extra_dictionaries: + schedule: + - 01_ejabberd.xml +templates: + - ejabberd.yml + - pam_ejabberd +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: [] +files: + /usr/share/eole/bareos/restore/jabber.py: + owner: root + group: root + mode: '0644' + /usr/share/eole/diagnose/68-ejabberd: + owner: root + group: root + mode: '0755' + /usr/share/eole/schedule/scripts/ejabberd: + owner: root + group: root + mode: '0755' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ejabberd/templates/ejabberd.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ejabberd/templates/ejabberd.yml new file mode 100644 index 0000000000000000000000000000000000000000..e275c36e20e3157648606f29dca6d75c0f92ee52 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ejabberd/templates/ejabberd.yml @@ -0,0 +1,199 @@ +%compiler-settings +cheetahVarStartToken = @@ +directiveStartToken = @ +%end compiler-settings + +@if @@is_defined("eolesso_adresse") and @@domain_jabber_etab!=@@eolesso_adresse +hosts: + - "@@eolesso_adresse" + - "@@domain_jabber_etab" +@else +hosts: + - "@@domain_jabber_etab" +@end if + + +access: + max_user_sessions: + all: "@@ejabberd_max_login_per_user" + announce: + admin: allow + c2s: + blocked: deny + all: allow + c2s_shaper: + admin: none + all: normal + configure: + admin: allow + local: + local: allow + muc: + all: allow + muc_admin: + admin: allow + pubsub_createnode: + all: allow + register: + all: deny + s2s_shaper: + all: fast +acl: + admin: + user: + - "@@ejabberd_admin_user" + - "@@ejabberd_admin_user": "@@domain_jabber_etab" + + local: + user_regexp: + - "" +@if @@getVar('activer_jappix', 'non') == 'oui' +auth_method: + - pam + - ldap +pam_service: "ejabberd" +@else +auth_method: ldap +@end if + + +language: "fr" +ldap_base: "@@ldap_base_dn" +ldap_servers: + - "@@adresse_ip_ldap" +listen: + - + port: 5222 + module: ejabberd_c2s + shaper: c2s_shaper + certfile: "@@server_pem" + starttls: true + max_stanza_size: 65536 + access: c2s + - + port: 5223 + module: ejabberd_c2s + shaper: c2s_shaper + certfile: "@@server_pem" + tls: true + max_stanza_size: 65536 + access: c2s + - + port: 5269 + module: ejabberd_s2s_in + max_stanza_size: 131072 + shaper: s2s_shaper + - +@if @@getVar('activer_jappix', 'non') == 'oui' + port: 5280 + module: ejabberd_http + request_handlers: + "/http-bind": mod_http_bind +@else + port: 5280 + module: ejabberd_http + web_admin: true + http_poll: true +@end if + +loglevel: 4 +modules: + mod_adhoc: [] + mod_announce: + access: announce + mod_register: + access_from: register + mod_roster: [] + mod_privacy: [] + mod_configure: [] + mod_disco: + extra_domains: + - "@@domain_jabber_etab" + mod_stats: [] + mod_vcard_ldap: + search: true + ldap_base: "@@ldap_base_dn" + ldap_filter: "(objectClass=inetOrgPerson)" + ldap_vcard_map: + "NICKNAME": + "%u": [] + "GIVEN": + "%s": + - "givenName" + "FAMILY": + "%s": + - "sn" + "FN": + "%s, %s": + - "sn" + - "givenName" + "EMAIL": + "%s": + - "mail" + "BDAY": + "%s": + - "dateNaissance" + "ORGNAME": + "%s": + - "o" + "ORGUNIT": + "%s": + - "ou" + "LOCALITY": + "%s": + - "l" + "STREET": + "%s": + - "Street" + "TEL": + "%s": + - "Phone" + ldap_search_fields: + "User": "%u" + "Name": "givenName" + "Family Name": "sn" + "Email": "mail" + ldap_search_reported: + "Full Name": "FN" + "Nickname": "NICKNAME" + mod_offline: [] + mod_echo: [] + mod_private: [] + mod_irc: [] + mod_muc: + access: muc + access_create: muc + access_admin: muc_admin + mod_pubsub: + access_createnode: pubsub_createnode + ## reduces resource comsumption, but XEP incompliant + ignore_pep_from_offline: true + ## XEP compliant, but increases resource comsumption + ## ignore_pep_from_offline: false + last_item_cache: false + plugins: + - "flat" + - "hometree" + - "pep" # pep requires mod_caps + mod_caps: [] + mod_time: [] + mod_last: [] +@if @@ejabberd_shared_roster_ldap == 'oui' + mod_shared_roster_ldap: + ldap_filter: "(objectClass=InetOrgPerson)" + ldap_rfilter: "(objectClass=InetOrgPerson)" + ldap_memberattr: "uid" + ldap_ufilter: "(uid=%u)" + ldap_useruid: "uid" + ldap_userdesc: "gecos" +@end if + mod_version: [] +@if @@getVar('activer_jappix', 'non') == 'oui' + mod_http_bind: [] +@end if +outgoing_s2s_port: 5269 +s2s_certfile: "@@server_pem" +s2s_use_starttls: true +shaper: + normal: 1000 + fast: 50000 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ejabberd/templates/pam_ejabberd b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ejabberd/templates/pam_ejabberd new file mode 100644 index 0000000000000000000000000000000000000000..f14cd6974249bfc906610331cd867850bcf7512f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ejabberd/templates/pam_ejabberd @@ -0,0 +1,2 @@ +%echo "#%PAM-1.0\n" +auth sufficient pam_cas.so -sxmpp://%%domain_jabber_etab -f/etc/pam_cas.conf diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-eoe/dictionaries/51_eoe.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-eoe/dictionaries/51_eoe.xml new file mode 100644 index 0000000000000000000000000000000000000000..dd4d82c411b3a90934b402a2b3ea00f4e784c845 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-eoe/dictionaries/51_eoe.xml @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="utf-8"?> +<creole> + <files> + </files> + <containers> + <container name='web'> + <package>eole-eoe-apps</package> + <file filelist='eoe' name='/etc/eole/flask/available/eoe.conf' source='eoe-eoe.conf'/> + </container> + </containers> + <variables> + <family name='applications web'> + <variable name='activer_eoe' type='oui/non' description='Activer EOE (gestion de mot de passe élève)'> + <value>oui</value> + </variable> + </family> + <family name='eoleflask' mode='expert'> + <variable redefine='True' name='activer_eoleapps'> + <value>oui</value> + </variable> + </family> + </variables> + <constraints> + <condition name='disabled_if_in' source='activer_sso'> + <param>non</param> + <target type='variable'>activer_eoe</target> + </condition> + <condition name="disabled_if_in" source="activer_eoleapps"> + <param>non</param> + <target type='variable'>activer_eoe</target> + </condition> + <condition name='disabled_if_in' source='activer_eoe'> + <param>non</param> + <target type='filelist'>eoe</target> + </condition> + </constraints> + <help> + <variable name='activer_eoe'>EOE est une application web à destination des élèves</variable> + </help> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-eoe/posttemplates/51-eoe b/seed/release/eole-2.7/2.7.1/applicationservice/eole-eoe/posttemplates/51-eoe new file mode 100644 index 0000000000000000000000000000000000000000..ebd7faf1c65fe83dc0a667eb301dcb19e2162f42 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-eoe/posttemplates/51-eoe @@ -0,0 +1,20 @@ +#!/bin/bash + +# Script EOE posttemplate + +# Activation d'EOE au niveau des applications flask + +# Doit avoir lieu en premier avant le renew des clés flask (posttemplate d'eoleflask) +# et avant la copie des clés en mode conteneur (posttemplate/80-eoe) + +############################################ + +activer_eoe=$(CreoleGet activer_eoe non) + +if [ "$activer_eoe" == "oui" ] +then + CreoleRun "/usr/share/eole/sbin/eflkctl enable eoe eoleapps &>/dev/null" web +else + CreoleRun "/usr/share/eole/sbin/eflkctl disable eoe eoleapps &>/dev/null" web +fi +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-eoe/posttemplates/80-eoe b/seed/release/eole-2.7/2.7.1/applicationservice/eole-eoe/posttemplates/80-eoe new file mode 100644 index 0000000000000000000000000000000000000000..be6a4a725128dcc9e1e1e9ce9fe2a71f3f7aa7b0 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-eoe/posttemplates/80-eoe @@ -0,0 +1,36 @@ +#!/bin/bash + +# Script EOE posttemplate + +# Copie de la clé flaks en mode conteneur + +# Doit avoir lieu en dernier après l'activation d'eoe (posttemplate/51-eoe) +# et après le renew des clés flask (posttemplate d'eoleflask) + +############################################ + +activer_eoe=$(CreoleGet activer_eoe non) +mode_conteneur_actif=$(CreoleGet mode_conteneur_actif) +path_key="/etc/eole/flask/keys" +key="eoe.key" + +if [ "$activer_eoe" == "oui" ] +then + # En mode conteneur, il faut copier la clé secrète eoe dans le + # conteneur fichier pour la rendre accessible à controle-vnc + if [ "$mode_conteneur_actif" = "oui" ]; then + container_path_web=$(CreoleGet container_path_web) + container_path_fichier=$(CreoleGet container_path_fichier) + test -d "$container_path_fichier$path_key" || mkdir -p "$container_path_fichier$path_key" + cp -f $container_path_web$path_key/$key $container_path_fichier$path_key + fi +else + # En mode conteneur, suppression la clé secrète eoe du conteneur fichier + if [ "$mode_conteneur_actif" = "oui" ]; then + container_path_fichier=$(CreoleGet container_path_fichier) + if [ -e "$container_path_fichier$path_key/$key" ];then + rm -f $container_path_fichier$path_key/$key + fi + fi +fi +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-eoe/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-eoe/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..cc479bfb5977f561fcad13e3ce5345bdf8408bc9 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-eoe/service.yml @@ -0,0 +1,31 @@ +format: '0.1' +name: eole-eoe +version: |- + 2.6.2-1 +description: |- + Templates et dictionnaires pour EOE (outils élèves). + Application web indépendante pour le changement + de mot de passe des élèves. + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: + - eole-web + - eole-controle-vnc + - eole-flask +packages: [] +dictionaries: + - 51_eoe.xml +extra_dictionaries: {} +templates: + - eoe-eoe.conf +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: + - 51-eoe + - 80-eoe +files: {} +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-eoe/templates/eoe-eoe.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-eoe/templates/eoe-eoe.conf new file mode 100644 index 0000000000000000000000000000000000000000..914d09459a43d47be7c304a1dfacf436395ccc22 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-eoe/templates/eoe-eoe.conf @@ -0,0 +1,21 @@ +{ +"APPNAME":"eoe", +"MOUNT_POINT":"/eleves", +"PREFIX":"true", + +"EOE":"Outils Élèves", +"EOLE":"EOLE Outils Élèves", + +"NB_CAR_MIN":%%smb_min_password_length, +"NB_CLASSE_MIN":%%smb_min_password_class, + +"EOLEAUTH_MODE":"LOCAL", +"EOLEAUTH_PLUGIN":"CASClient", + +"HOST_SCRIBE":"%%web_url", +"CAS_URL":"https://%%eolesso_adresse:%%eolesso_port/", +%if %%getVar('activer_sso', 'non') == 'local' +"CAS_ALLOWED_IP":["%%adresse_ip_br0", "127.0.0.1", "%%container_ip_web"], +%end if +"CONTROLEVNC_URL":"http://%%adresse_ip_fichier:8792" +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-eop/dictionaries/51_eop.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-eop/dictionaries/51_eop.xml new file mode 100644 index 0000000000000000000000000000000000000000..a6a21c62633c7d0b41fb9458c31934c6847b1e0f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-eop/dictionaries/51_eop.xml @@ -0,0 +1,65 @@ +<?xml version="1.0" encoding="utf-8"?> +<creole> + <files> + </files> + <containers> + <container name='web'> + <package>eole-eop-apps</package> + <file filelist='eop' name='/etc/eole/flask/available/eop.conf' source='eop-eop.conf'/> + <file filelist='eop' name='/usr/share/eole/flask/eop/menus/motdepasse.conf' source='eop-motdepasse.conf'/> + </container> + <container name='fichier'> + <package>eole-websockify-pkg</package> + <service servicelist='websockify'>websockify</service> + <service_access service='websockify'> + <port>6080</port> + </service_access> + <file filelist='websockify' name='/etc/default/eop-websockify' source='eop-websockify' mode='0755'/> + </container> + </containers> + <variables> + <family name='applications web'> + <variable name='revprox_eop' exists='False' disabled='True'/> + <variable name='activer_eop' type='oui/non' description='Activer EOP (EOLE Outils Profs)'> + <value>oui</value> + </variable> + <variable name='eop_profs_can_change_all_passwords' type='oui/non' description='Permettre aux enseignants de changer le mot de passe de tous les élèves' mode='expert'> + <value>non</value> + </variable> + </family> + <family name='eoleflask' mode='expert'> + <variable redefine='True' name='activer_eoleapps'> + <value>oui</value> + </variable> + </family> + </variables> + <constraints> + <condition name='disabled_if_in' source='activer_sso'> + <param>non</param> + <target type='variable'>activer_eop</target> + </condition> + <condition name="disabled_if_in" source="activer_eoleapps"> + <param>non</param> + <target type='variable'>activer_eop</target> + </condition> + <condition name='disabled_if_in' source='activer_eop'> + <param>non</param> + <target type='variable'>eop_profs_can_change_all_passwords</target> + <target type='filelist'>eop</target> + <target type='filelist'>websockify</target> + <target type='servicelist'>websockify</target> + <target type='service_accesslist'>websockify</target> + </condition> + <auto name='calc_multi_condition' target='revprox_eop'> + <param>oui</param> + <param name="operator">OR</param> + <param type='eole' name='condition_1' hidden='False'>activer_eop</param> + <param type='eole' name='match'>container_ip_fichier</param> + <param name='default_mismatch'>None</param> + </auto> + </constraints> + <help> + <variable name='activer_eop'>EOP est une application web indépendante de l'EAD destinée aux profs</variable> + <variable name='eop_profs_can_change_all_passwords'>Par défaut, seuls les professeurs principaux peuvent changer le mot de passe de leurs élèves. En choisissant "oui" , les professeurs pourront changer le mot de passe de n'importe quel élève.</variable> + </help> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-eop/files/usr/share/eole/diagnose/70-eop b/seed/release/eole-2.7/2.7.1/applicationservice/eole-eop/files/usr/share/eole/diagnose/70-eop new file mode 100644 index 0000000000000000000000000000000000000000..e0a36cd756805bd14dce0b43c57eb567bd025ed9 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-eop/files/usr/share/eole/diagnose/70-eop @@ -0,0 +1,11 @@ +#!/bin/sh + +if [ $(CreoleGet activer_eop non) != "non" ];then + . /usr/lib/eole/diagnose.sh + EchoGras "*** EOP" + TestService Controle-vnc $(CreoleGet container_ip_fichier):8788 + TestService Websockify $(CreoleGet container_ip_fichier):6080 + echo +fi + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-eop/posttemplates/51-eop b/seed/release/eole-2.7/2.7.1/applicationservice/eole-eop/posttemplates/51-eop new file mode 100644 index 0000000000000000000000000000000000000000..35eff503f122995cc3e75db561128aa054b61a40 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-eop/posttemplates/51-eop @@ -0,0 +1,20 @@ +#!/bin/bash + +# Script EOP posttemplate + +# Activation d'EOP au niveau des applications flask + +# Doit avoir lieu en premier avant le renew des clés flask (posttemplate d'eoleflask) +# et avant la copie des clés en mode conteneur (posttemplate/80-eop) + +############################################ + +activer_eop=$(CreoleGet activer_eop non) + +if [ "$activer_eop" == "oui" ] +then + CreoleRun "/usr/share/eole/sbin/eflkctl enable eop eoleapps &>/dev/null" web +else + CreoleRun "/usr/share/eole/sbin/eflkctl disable eop eoleapps &>/dev/null" web +fi +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-eop/posttemplates/80-eop b/seed/release/eole-2.7/2.7.1/applicationservice/eole-eop/posttemplates/80-eop new file mode 100644 index 0000000000000000000000000000000000000000..42a0b22aea89e8f77c4c4ba8284d916ab804dd50 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-eop/posttemplates/80-eop @@ -0,0 +1,36 @@ +#!/bin/bash + +# Script EOP posttemplate + +# Copie de la clé flaks en mode conteneur + +# Doit avoir lieu en dernier après l'activation d'eop (posttemplate/51-eop) +# et après le renew des clés flask (posttemplate d'eoleflask) + +############################################ + +activer_eop=$(CreoleGet activer_eop non) +mode_conteneur_actif=$(CreoleGet mode_conteneur_actif) +path_key="/etc/eole/flask/keys" +key="eop.key" + +if [ "$activer_eop" == "oui" ] +then + # En mode conteneur, il faut copier la clé secrète eop dans le + # conteneur fichier pour la rendre accessible à controle-vnc + if [ "$mode_conteneur_actif" = "oui" ]; then + container_path_web=$(CreoleGet container_path_web) + container_path_fichier=$(CreoleGet container_path_fichier) + test -d "$container_path_fichier$path_key" || mkdir -p "$container_path_fichier$path_key" + cp -f $container_path_web$path_key/$key $container_path_fichier$path_key + fi +else + # En mode conteneur, suppression la clé secrète eop du conteneur fichier + if [ "$mode_conteneur_actif" = "oui" ]; then + container_path_fichier=$(CreoleGet container_path_fichier) + if [ -e "$container_path_fichier$path_key/$key" ];then + rm -f $container_path_fichier$path_key/$key + fi + fi +fi +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-eop/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-eop/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..bd90aeede52daf767760efb0b8cff4522dd159d7 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-eop/service.yml @@ -0,0 +1,38 @@ +format: '0.1' +name: eole-eop +version: |- + 2.7.0-3 +description: |- + Templates et dictionnaires pour EOP (gestion de devoir). + Application indépendante de l'EAD dont l'objectif est de proposer une + interface simple pour la gestion des devoirs à destination des + professeurs. + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: + - eole-web + - eole-controle-vnc + - eole-flask +packages: [] +dictionaries: + - 51_eop.xml +extra_dictionaries: {} +templates: + - eop-eop.conf + - eop-motdepasse.conf + - eop-websockify +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: + - 51-eop + - 80-eop +files: + /usr/share/eole/diagnose/70-eop: + owner: root + group: root + mode: '0755' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-eop/templates/eop-eop.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-eop/templates/eop-eop.conf new file mode 100644 index 0000000000000000000000000000000000000000..beca4a4228e2cad9db68b14afacf6db075e0aab9 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-eop/templates/eop-eop.conf @@ -0,0 +1,31 @@ +{ +"APPNAME":"eop", +"MOUNT_POINT":"/eop", +"PREFIX":"true", + +"EOP":"EOP", +"EOLE":"EOLE Outils Prof", +"ANNEE":"2016", + +"NB_CAR_MIN":%%smb_min_password_length, +"NB_CLASSE_MIN":%%smb_min_password_class, +"PROFS_CAN_CHANGE_ALL_PASSWORDS":"%%eop_profs_can_change_all_passwords", + +"UPLOAD_FOLDER":"/tmp", +"CHEMIN_DEV":"tempfiledir", +"CHEMIN_DATA":"tempdatadir", + +"EOLEAUTH_MODE":"LOCAL", +"EOLEAUTH_PLUGIN":"CASClient", + +"HOST_SCRIBE":"%%web_url", +"PORT_VNC":"6080", +"CAS_URL":"https://%%eolesso_adresse:%%eolesso_port/", +%if %%getVar('activer_sso', 'non') == 'local' +"CAS_ALLOWED_IP":["%%adresse_ip_br0", "127.0.0.1", "%%container_ip_web"], +%end if +"CONTROLEVNC_URL":"http://%%adresse_ip_fichier:8788", +"SERVER_SMTP":"%%container_ip_mail", +"DOMAINE_MAIL":"%%domaine_messagerie_etab", +"MAX_UPLOAD_FILE_SIZE":%%php_post_max_size +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-eop/templates/eop-motdepasse.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-eop/templates/eop-motdepasse.conf new file mode 100644 index 0000000000000000000000000000000000000000..6d98277a78d0218e08f95de335398560ab4304e3 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-eop/templates/eop-motdepasse.conf @@ -0,0 +1,17 @@ +{ +"items": [ + {"top-menu": "Gestion", + "menu-item": { + "name": "Mots de passe", + "icon": "fa fa-key", + "link": "/motdepasse", +%if %%getVar('eop_profs_can_change_all_passwords', 'non') == 'oui' + "typeadmin": ["admin", "prof_admin", "prof"] +%else + "typeadmin": ["admin", "prof_admin"] +%end if + + } + } +] +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-eop/templates/eop-websockify b/seed/release/eole-2.7/2.7.1/applicationservice/eole-eop/templates/eop-websockify new file mode 100644 index 0000000000000000000000000000000000000000..51097ea8dfb29981b9097db094df88395488f8ba --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-eop/templates/eop-websockify @@ -0,0 +1,8 @@ +# Server Port +SERVER_PORT=6080 + +# Server SSL certificate to use +SERVER_CERT=%%server_cert + +# Server SSL certificate private key to use +SERVER_KEY=%%server_key diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-eqos/dictionaries/00_eole-eqos_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-eqos/dictionaries/00_eole-eqos_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..2473d42fd8959c707c43bbf50d28fa948543c4d6 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-eqos/dictionaries/00_eole-eqos_packages.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>libnagios-plugin-perl</package> + <package>libdbd-sqlite3-perl</package> + <package>libsoap-lite-perl</package> + <package>libunicode-string-perl</package> + <package>init-system-helpers</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-eqos/dictionaries/27_eqos.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-eqos/dictionaries/27_eqos.xml new file mode 100644 index 0000000000000000000000000000000000000000..5b8baf4e12c4cf9400af6a5ec9e5d8573ccfd4e8 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-eqos/dictionaries/27_eqos.xml @@ -0,0 +1,35 @@ +<?xml version='1.0' encoding='utf-8'?> +<creole> + + <files> + <service servicelist="eqos">eqos</service> + <file filelist='proxy' name='/etc/http_proxy' rm='True'/> + </files> + + <variables> + <family name='services'> + <variable name='activer_eqos' type='oui/non' description="Activer les sondes Eqos"> + <value>oui</value> + </variable> + </family> + <separators> + <separator name='activer_eqos'>Sondes Eqos</separator> + </separators> + </variables> + + <constraints> + <condition name='disabled_if_in' source='activer_proxy_client'> + <param>non</param> + <target type='filelist'>proxy</target> + </condition> + <condition name='disabled_if_in' source='activer_eqos'> + <param>non</param> + <target type='servicelist'>eqos</target> + </condition> + </constraints> + + <help> + <variable name='activer_eqos'>Les sondes Eqos sont des outils de mesure de la Qualité de Service</variable> + </help> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-eqos/files/etc/logrotate.d/eqos b/seed/release/eole-2.7/2.7.1/applicationservice/eole-eqos/files/etc/logrotate.d/eqos new file mode 100644 index 0000000000000000000000000000000000000000..7acd59d0ac7ac3f63fa65a2d7b2555b14ec745c0 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-eqos/files/etc/logrotate.d/eqos @@ -0,0 +1,13 @@ +/var/log/eqos.log { + daily + rotate 0 + sharedscripts + prerotate + if [ -e /var/run/eqos.pid ]; then + invoke-rc.d --quiet eqos stop > /dev/null + fi + endscript + postrotate + invoke-rc.d --quiet eqos start > /dev/null + endscript +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-eqos/files/lib/systemd/system/eqos.service b/seed/release/eole-2.7/2.7.1/applicationservice/eole-eqos/files/lib/systemd/system/eqos.service new file mode 100644 index 0000000000000000000000000000000000000000..a7653089b30edced63ae016c77a5a3c4923c58f3 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-eqos/files/lib/systemd/system/eqos.service @@ -0,0 +1,10 @@ +[Unit] +Description=Sonde EQOS +After=local_fs.target remote_fs.target network.target + +[Service] +ExecStart=/usr/share/eqos/eqosd.pl +User=eqos + +[Install] +WantedBy=multi-user.target diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-eqos/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-eqos/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..ae71dfc25f5b7269b59a4aa899eae2887c7da405 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-eqos/service.yml @@ -0,0 +1,36 @@ +format: '0.1' +name: eole-eqos +version: |- + 2.6.0-4 +description: |- + Sondes Eqos + Outils de mesure de la Qualité de Service et indicateurs +depends: [] +packages: + - libnagios-plugin-perl + - libdbd-sqlite3-perl + - libsoap-lite-perl + - libunicode-string-perl + - init-system-helpers +dictionaries: + - 27_eqos.xml +extra_dictionaries: {} +templates: + - http_proxy +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: [] +files: + /lib/systemd/system/eqos.service: + owner: root + group: root + mode: '0644' + /etc/logrotate.d/eqos: + owner: root + group: root + mode: '0644' +excluding_regexp: + /usr/share/eqos: 21 + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-eqos/templates/http_proxy b/seed/release/eole-2.7/2.7.1/applicationservice/eole-eqos/templates/http_proxy new file mode 100644 index 0000000000000000000000000000000000000000..99271b3853ec26b727006a8565bd15b3081cf969 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-eqos/templates/http_proxy @@ -0,0 +1 @@ +http://%%proxy_client_adresse:%%proxy_client_port diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-era/dictionaries/00_eole-era_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-era/dictionaries/00_eole-era_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..049c031b1720421aa378dd476524693d676cf44b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-era/dictionaries/00_eole-era_packages.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>era</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-era/dictionaries/10_era.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-era/dictionaries/10_era.xml new file mode 100644 index 0000000000000000000000000000000000000000..31973cbb776a778581d5368c93b69e1be4ad4618 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-era/dictionaries/10_era.xml @@ -0,0 +1,73 @@ +<?xml version="1.0" encoding="utf-8"?> +<creole> + + <files> + <file name='/usr/share/era/backend/data/active_tags'/> + <file name='/usr/share/ead2/backend/config/perms/perm_era.ini'/> + </files> + + <variables> + + <family name='firewall'> + <variable name='type_amon' type='string' description='Modèle de filtrage' mode='basic' /> + <variable name='type_amon_concat' type='string' description='Modèle de filtrage' hidden='True' /> + <variable name='install_scribe_dmz' type='oui/non' description="Activer la gestion d'un Scribe dans la DMZ"> + <value>non</value> + </variable> + <variable name='nom_serveur_scribe_dmz' type='hostname' description='Nom du Scribe dans la DMZ (pour enregistrement DNS)' mandatory='True'/> + <variable name='ip_serveur_scribe_dmz' type='ip' description='Adresse IP du Scribe dans la DMZ' mandatory='True'/> + <variable name='use_iptables_restore' type='oui/non' description='Optimiser la génération des règles de pare-feu' mode='expert'> + <value>oui</value> + </variable> + </family> + + <family name="réseau avancé"> + <!-- pare-feu non désactivable sur les modules embarquant Era --> + <variable name='activer_firewall' redefine='True' hidden='True'> + <value>oui</value> + </variable> + <variable name='restrict_ping_request' redefine='True' disabled='True' remove_condition='True'/> + </family> + + <separators/> + + </variables> + + <constraints> + + <check name="valid_enum" target="type_amon"> + <param type="python">eosfunc.list_files('/usr/share/era/modeles', '*.xml', True, default=['2zones', '2zones-amonecole', '3zones', '3zones-dmz', '4zones', '5zones'], exception='minimal')</param> + <param name="checkval">False</param> + </check> + <fill name='concat' target='type_amon_concat'> + <param type="eole">nombre_interfaces</param> + <param>zones</param> + </fill> + <fill name='calc_multi_condition' target='type_amon'> + <param>amon</param> + <param type='eole' name='condition_1'>eole_module</param> + <param name='match' type="eole">type_amon_concat</param> + <param name='mismatch'>2zones-amonecole</param> + </fill> + + <condition name='disabled_if_in' source='activer_firewall'> + <param>oui</param> + <target type='filelist'>era_not_installed</target> + </condition> + + <condition name='disabled_if_in' source='install_scribe_dmz'> + <param>non</param> + <target type='variable'>nom_serveur_scribe_dmz</target> + <target type='variable'>ip_serveur_scribe_dmz</target> + </condition> + + </constraints> + + <help> + <variable name='type_amon'>Modèle de pare-feu Era à appliquer sur le serveur</variable> + <variable name='use_iptables_restore'>Permet d'accélérer la génération des règles en utilisant le format iptables-restore</variable> + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-era/files/usr/share/eole/sbin/qoseole b/seed/release/eole-2.7/2.7.1/applicationservice/eole-era/files/usr/share/eole/sbin/qoseole new file mode 100644 index 0000000000000000000000000000000000000000..ba47729be93eea008514ed8f4af004049618731f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-era/files/usr/share/eole/sbin/qoseole @@ -0,0 +1,69 @@ +#! /bin/bash +# +# qoseole Start/Stop le script activant la qos sur Amon +# +# description: lance StartQos.sh si fichier conf trouvé dans /etc. +# $Id +# config: + + +RETVAL=0 + +. /lib/lsb/init-functions + +prog="qoseole" + +start() { + if [ -e /etc/qoseole.conf ] + then + log_begin_msg "Activation de la QOS " + /usr/bin/StartQos.sh 2>&1 > /dev/null + RETVAL=$? + log_end_msg $RETVAL + [ $RETVAL -eq 0 ] && touch /var/lock/qoseole + return $RETVAL + else + exit 1 + fi +} + +stop() { + log_begin_msg "Arret de la QOS " + /usr/bin/StopQos.sh 2>&1 > /dev/null + RETVAL=$? + log_end_msg $RETVAL + [ $RETVAL -eq 0 ] && rm -f /var/lock/qoseole + return $RETVAL +} + + +restart() { + stop + start +} + +case "$1" in + start) + start + ;; + stop) + stop + ;; + restart) + restart + ;; + reload) + restart + ;; + status) + /usr/bin/StatusQos.sh + ;; + condrestart) + [ -f /var/lock/qoseole ] && restart || : + ;; + *) + printf "Usage: %s {start|stop|status|reload|restart|condrestart}\n" "$0" + exit 1 +esac + +exit $? diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-era/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-era/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..6830172f05864d3040d50bd16c7077bd11d70212 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-era/service.yml @@ -0,0 +1,33 @@ +format: '0.1' +name: eole-era +version: |- + 2.7.0-8 +description: |- + Configuration EOLE pour Era + Era est un outil GTK permettant de gérer les règles de firewall + pour les modules Eole. + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: + - eole-proxy-bypass +packages: + - era +dictionaries: + - 10_era.xml +extra_dictionaries: {} +templates: + - active_tags + - perm_era.ini +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: [] +files: + /usr/share/eole/sbin/qoseole: + owner: root + group: root + mode: '0755' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-era/templates/active_tags b/seed/release/eole-2.7/2.7.1/applicationservice/eole-era/templates/active_tags new file mode 100644 index 0000000000000000000000000000000000000000..24e0399f1bdb1b8f8d6444e13fc7f4cd82b33c62 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-era/templates/active_tags @@ -0,0 +1,151 @@ +%for %%interface in range(0, %%int(%%nombre_interfaces)) + %if %%getVar('ssh_eth'+str(%%interface), 'non') == 'oui' +SSHDepuisEth%%interface + %end if + %if %%getVar('admin_eth'+str(%%interface), 'non') == 'oui' + %if not %%is_empty(%%getVar('lightsquid_port', None)) +lightsquid%%interface + %end if + %if %%getVar('activer_cups', 'non') == 'oui' +activer_cups%%interface + %end if +AdminDepuisEth%%interface + %end if + %if %%getVar('acces_distant_backend_ead', 'non') == 'oui' + %if %%getVar('frontend_ead_distant_eth' + str(%%interface), 'non') == 'oui' +BackendEADDepuisEth%%interface + %end if + %end if +%end for +%if %%install_scribe_dmz == "oui" +ScribeDMZ +%end if +%if %%getVar('activer_nufw', 'non') == "oui" +auth_nufw +%end if +%if %%getVar('activer_squid2', 'non') == "oui" +Activer squid2 +%end if +%if %%getVar('activer_cntlm', 'non') == "oui" +cntlm +%end if +%if %%getVar('activer_serveur_nfs', 'non') == "oui" +activer_nfs +%end if +%if %%getVar('activer_ejabberd', 'non') == "oui" +activer_xmpp +%end if +%if %%activer_log_distant == 'oui' + %if %%activer_reception_logs == 'oui' + %if %%activer_reception_logs_relp == 'oui' +ClientRsyslogRELP + %end if + %if %%activer_reception_logs_tcp == 'oui' +ClientRsyslogTCP + %end if + %if %%activer_reception_logs_udp == 'oui' +ClientRsyslogUDP + %end if + %end if +%end if +%if %%getVar('activer_sso', 'non') == 'local' +eole_sso +%end if +%if not %%is_empty(%%getVar('revprox_sso', '')) +revprox_sso +%end if +%if %%getVar('activer_revprox_ead', 'non') == 'oui' +ead_scribe +%end if +%if %%getVar('activer_revprox', 'non') == 'oui' +ActiverNGINX +%end if +%if %%getVar('freerad_listen_int', None) +ActiverRadius%%freerad_listen_int +%end if +%if %%getVar('freerad_listen_addr', None) + %for num_int in %%range(0, %%int(%%nombre_interfaces)) + %if %%freerad_listen_addr == %%getVar('adresse_ip_eth' + %%str(num_int), None) +ActiverRadiuseth%%num_int + %end if + %end for +%end if +%if %%getVar('activer_client_ldap', 'non') == 'local' + %if %%ldap_restrict_access == 'tous' and %%ldap_ssl != 'uniquement' +activer_ldap + %end if + %if %%ldap_restrict_access == 'tous' and %%ldap_ssl != 'non' +activer_ldaps + %end if +%end if +%if %%getVar('activer_tftp', 'non') == 'oui' +activer_tftp +%end if +%if %%getVar('activer_courier_imap', 'non') == 'oui' +activer_courrier_imap +%end if +%if %%getVar('activer_courier_pop', 'non') == 'oui' +activer_courrier_pop +%end if +%if %%getVar('activer_proftpd', 'non') == "oui" +activer_proftpd +%end if +%if %%getVar('proxy_bypass_eth1', 'non') == "oui" +ProxyBypass1 +%else +ForceProxy1 +%end if +%if %%getVar('proxy_bypass_eth2', 'non') == "oui" +ProxyBypass2 +%else +ForceProxy2 +%end if +%if %%getVar('proxy_bypass_eth3', 'non') == "oui" +ProxyBypass3 +%else +ForceProxy3 +%end if +%if %%getVar('proxy_bypass_eth4', 'non') == "oui" +ProxyBypass4 +%else +ForceProxy4 +%end if +%if %%is_defined('visio_pack40_ip') + %if not %%is_empty(%%getVar('visio_pack40_ip', None)) +wan_visio + %end if +%end if +%if %%is_defined('sites_distants_ip') + %if not %%is_empty(%%getVar('sites_distants_ip', None)) + %if not %%is_empty(%%getVar('ecdl_serveurs_ip', None)) +dist_ecdl + %end if + %if not %%is_empty(%%getVar('res_partagees_lan_ip', None)) +dist_samba + %end if + %if not %%is_empty(%%getVar('wins_serveurs_ip', None)) +dist_wins + %end if + %if not %%is_empty(%%getVar('arkeia_serveurs_ip', None)) +dist_arkeia + %end if + %if not %%is_empty(%%getVar('serveurs_lan_ip', None)) +dist_http + %end if + %if not %%is_empty(%%getVar('serveurs_ftp_ip', None)) +dist_ftp + %end if + %if not %%is_empty(%%getVar('badge_serveurs_ip', None)) and not %%is_empty(%%getVar('badge_port_ip', None)) +dist_badge + %end if + %if not %%is_empty(%%getVar('autocad_serveurs_ip', None)) +dist_acad + %end if + %end if +%end if +%if %%getVar('activer_gaspacho', 'non') == "oui" +GaspachoEth1 +%end if +%if %%is_defined('adresse_ip_eclair_link') +activer_eclair_amonecole +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-era/templates/perm_era.ini b/seed/release/eole-2.7/2.7.1/applicationservice/eole-era/templates/perm_era.ini new file mode 100644 index 0000000000000000000000000000000000000000..f70f677641c89e84d0c9e472d21a6ddb6789db7c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-era/templates/perm_era.ini @@ -0,0 +1,14 @@ +[roles] +admin=Administrateur +admin_amon=Administrateur de l'Amon +admin_pedago=Administrateur du reseau peda + +[permissions] +#pedago +regles_admin=admin,admin_amon +%if %%getVar('dans_instance_2_active', 'non') == 'oui' +#admin +regles_pedago=admin,admin_amon,admin_pedago +%end if +#commun +regles_generales=admin,admin_amon diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-esu/dictionaries/00_eole-esu_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-esu/dictionaries/00_eole-esu_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..991736f8ad02d337b7b3fa1d3ee3ed6c28b3231b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-esu/dictionaries/00_eole-esu_packages.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>eole-esu-rules</package> + <package>python-pylibacl</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-esu/dictionaries/20_esu.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-esu/dictionaries/20_esu.xml new file mode 100644 index 0000000000000000000000000000000000000000..62ce49b70edd258217ec48dcd8738eaab0001c49 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-esu/dictionaries/20_esu.xml @@ -0,0 +1,55 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + <files> + <file filelist='esu' name='/home/esu/Base/DomainConf.xml' mkdir='True'/> + <file filelist='esu' name='/home/esu/Console/esuconf.xml'/> + </files> + + <variables> + <family name='services'> + <variable name='activer_esu' type='oui/non' description="Utiliser le logiciel ESU" hidden='True'> + <value>oui</value> + </variable> + </family> + <family name='esu' icon='windows'> + <variable name='esu_proxy' type='oui/non' description="Activer le paramétrage du proxy dans ESU"> + <value>non</value> + </variable> + <variable name='esu_proxy_default' type='oui/non' description="Activer le proxy ESU dans les modèles par défaut" auto_freeze='True'> + <value>oui</value> + </variable> + <variable name='esu_proxy_server' type='domain' description='Adresse du proxy par défaut dans ESU' mandatory='True'/> + <variable name='esu_proxy_port' type='port' description='Port du proxy par défaut dans ESU' mandatory='True'> + <value>3128</value> + </variable> + <variable name='esu_proxy_bypass' type='string' description='Site accessible sans proxy dans ESU' multi='True'> + <value>127.0.0.1</value> + </variable> + </family> + </variables> + + <constraints> + <!-- ESU --> + <condition name='disabled_if_in' source='activer_esu'> + <param>non</param> + <target type='family'>esu</target> + <target type='filelist'>esu</target> + </condition> + <condition name='disabled_if_in' source='esu_proxy'> + <param>non</param> + <target type='variable'>esu_proxy_default</target> + <target type='variable'>esu_proxy_server</target> + <target type='variable'>esu_proxy_port</target> + <target type='variable'>esu_proxy_bypass</target> + </condition> + </constraints> + + <help> + <variable name='activer_esu'>ESU est une application de gestion avancée des postes clients</variable> + <variable name='esu_proxy_bypass'>Liste des sites qui sont accessibles sans passer par le proxy</variable> + <family name='esu'>Configuration du proxy ESU</family> + </help> +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-esu/files/usr/share/eole/esu/ListeGM.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-esu/files/usr/share/eole/esu/ListeGM.xml new file mode 100644 index 0000000000000000000000000000000000000000..e3b5e8de49123666edecb14d9574c11bf55447c1 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-esu/files/usr/share/eole/esu/ListeGM.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="ISO-8859-1"?> +<ESU_LGM> + <ListeGM> <GM nom="grp_eole"> + <ListeMachines> <Machine>*</Machine> + </ListeMachines> + <ListeGestionnaires/> + </GM> + </ListeGM> + <numeroSerie>dSzKVlGe8bjVJA9ghxMn7Vc9En0=</numeroSerie> +</ESU_LGM> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-esu/posttemplates/04-esu b/seed/release/eole-2.7/2.7.1/applicationservice/eole-esu/posttemplates/04-esu new file mode 100644 index 0000000000000000000000000000000000000000..5c4397c1a7bb496d726db5f40ceec72eb8f839bf --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-esu/posttemplates/04-esu @@ -0,0 +1,55 @@ +#!/bin/bash + +HOMEDIR="/home" +HOMEESU="$HOMEDIR/esu" +BASEESU="$HOMEESU/Base" +CONSOLEESU="$HOMEESU/Console" +CONFIG="/usr/share/eole/config/grp_eole" +ESUDIR="/home/netlogon/icones/grp_eole" + +for dir in "/home/admin/perso" "/home/a/admin/perso"; do + if [ -d $dir ]; then + ADMIN_HOME=$dir + fi +done +# ESU +if [ $(CreoleGet activer_esu) = "oui" ]; then + # ESU + mkdir -p $BASEESU + mkdir -p $CONSOLEESU + /bin/cp -f $CONSOLEESU/Install/* $BASEESU + /bin/cp -f $CONSOLEESU/radmin32.dll $CONSOLEESU/rlocal32.dll $BASEESU + if [ -d $CONFIG ]; then + if [ ! -d $BASEESU/grp_eole ]; then + /bin/cp -Rf $CONFIG $BASEESU + CreoleCat -s $CONFIG/_Machine.xml -o $BASEESU/grp_eole/_Machine.xml + # modèles concernés par les variables proxy + for model in "DomainAdmins.xml" "DomainUsers.xml" "eleves.xml" "professeurs.xml" "administratifs.xml" + do + [ -f $CONFIG/$model ] && CreoleCat -s $CONFIG/$model -o $BASEESU/grp_eole/$model + done + fi + fi + for dir in "_Machine" "DomainAdmins" "DomainUsers" "eleves" "professeurs" "administratifs" + do + if [ -f $BASEESU/grp_eole/$dir.xml ]; then + /bin/mkdir -p $ESUDIR/$dir/Bureau + /bin/mkdir -p $ESUDIR/$dir/Menu\ Démarrer/Programmes/Démarrage + fi + done + if [ ! -f /home/esu/Base/ListeGM.xml ]; then + cp -a /usr/share/eole/esu/ListeGM.xml /home/esu/Base/ListeGM.xml + fi + if [ ! -z $ADMIN_HOME ]; then + [ ! -L $ADMIN_HOME/esu ] && /bin/ln -s /home/esu $ADMIN_HOME/esu + [ ! -f $ADMIN_HOME/Esu.lnk ] && /bin/cp /home/esu/Console/Esu.lnk $ADMIN_HOME/Esu.lnk + fi + /bin/rm -f $HOMEDIR/netlogon/*.bat +else + if [ ! -z $ADMIN_HOME ]; then + /bin/rm -f $ADMIN_HOME/esu + /bin/rm -f $ADMIN_HOME/Esu.lnk + fi +fi + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-esu/posttemplates/05-esu b/seed/release/eole-2.7/2.7.1/applicationservice/eole-esu/posttemplates/05-esu new file mode 100644 index 0000000000000000000000000000000000000000..9d2b52a7ede9dd6a4a1c500ec2ffd1b3c86f36cc --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-esu/posttemplates/05-esu @@ -0,0 +1,79 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# +########################################################################## +# python-pyeole +# Copyright © 2015 Pôle de compétences EOLE <eole@ac-dijon.fr> +# +# License CeCILL: +# * in french: http://www.cecill.info/licences/Licence_CeCILL_V2-fr.html +# * in english http://www.cecill.info/licences/Licence_CeCILL_V2-en.html +########################################################################## +from os.path import join, isdir, isfile +from xml.etree import ElementTree as ET +from grp import getgrnam +from pwd import getpwnam +from pyeole.log import init_logging +import posix1e +from creole.client import CreoleClient + +client = CreoleClient() + +if client.get_creole('activer_esu') == "oui": + log = init_logging(name=u'05-esu', level='info', syslog=False, + console=['stdout', 'stderr']) + + XMLDIR = "/home/esu/Base" + filename = join(XMLDIR, "ListeGM.xml") + xml = ET.parse(filename) + for group in xml.getiterator('GM'): + esu_group_name = group.get('nom') + filename = join(XMLDIR, esu_group_name, "_ListeUtilisateurs.xml") + if not isfile(filename): + log.error('file {} is not already exists'.format(filename)) + continue + xml = ET.parse(filename) + for groupe in xml.getiterator('GU'): + name = groupe.get('nom') + try: + if groupe.get('type') == 'U': + #if group is an user + posix_id = getpwnam(name).pw_uid + posix_type = posix1e.ACL_USER + else: + #if group is a group + posix_id = getgrnam(name).gr_gid + posix_type = posix1e.ACL_GROUP + except KeyError: + #user does not exists + log.error('user or group {} does not exists'.format(name)) + continue + #get directory informatin + dirname = join('/home/netlogon/icones', esu_group_name, name) + if not isdir(dirname): + log.error('directory {} not already exists'.format(dirname)) + continue + #if right not correct, change it + acls = posix1e.ACL(file=dirname.encode("utf-8")) + found = False + for acl in acls: # get_acl(dirname) + if acl.tag_type == posix_type and acl.qualifier == posix_id: + if not acl.permset.read or not acl.permset.execute: + acl.permset.read = True + acl.permset.execute = True + acls.applyto(dirname) + found = True + elif acl.tag_type == posix1e.ACL_OTHER and str(acl.permset) != '---': + acl.permset.read = False + acl.permset.execute = False + acl.permset.write = False + acls.applyto(dirname) + + if not found: + acl = acls.append() + acl.tag_type = posix_type + acl.qualifier = posix_id + acl.permset.read = True + acl.permset.execute = True + acls.calc_mask() + acls.applyto(dirname) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-esu/pretemplates/00-esu b/seed/release/eole-2.7/2.7.1/applicationservice/eole-esu/pretemplates/00-esu new file mode 100644 index 0000000000000000000000000000000000000000..2e65a6ee4d841066c75c30f77f0ca4b51694c36f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-esu/pretemplates/00-esu @@ -0,0 +1,12 @@ +#!/bin/bash + +if [ "$1" = "instance" ] && [ -d /home/esu/Base ]; then + . /usr/lib/eole/ihm.sh + echo + Question_ouinon "Voulez-vous réinitialiser la base ESU ?" "True" "non" "warn" + if [ "$?" = "0" ]; then + rm -rf /home/esu/Base/* + fi +fi + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-esu/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-esu/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..da8b3ab848c13ebbac2a27d5fd5c9641b8a871ed --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-esu/service.yml @@ -0,0 +1,33 @@ +format: '0.1' +name: eole-esu +version: |- + 2.7.1-1 +description: |- + Configuration ESU pour EOLE + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: [] +packages: + - eole-esu-rules + - python-pylibacl +dictionaries: + - 20_esu.xml +extra_dictionaries: {} +templates: + - DomainConf.xml + - esuconf.xml +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: + - 00-esu +posttemplates: + - 04-esu + - 05-esu +files: + /usr/share/eole/esu/ListeGM.xml: + owner: root + group: root + mode: '0644' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-esu/templates/DomainConf.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-esu/templates/DomainConf.xml new file mode 100644 index 0000000000000000000000000000000000000000..558806b03f686e8aa726b6e2ad0d940d2bc470de --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-esu/templates/DomainConf.xml @@ -0,0 +1,79 @@ +<?xml version="1.0" encoding="ISO-8859-1"?> +<ESU_DomainConf> + <Diffusion>EOLE</Diffusion> + <Reseau> + <Domaine present="1"> + <NomDomaine>%%smb_workgroup</NomDomaine> + <NomPDC>%%smb_netbios_name</NomPDC> + <Groupe_Admins_Domaine>DomainAdmins</Groupe_Admins_Domaine> + <Groupe_Utilisa_Domaine>DomainUsers</Groupe_Utilisa_Domaine> + </Domaine> + <StockageData> +%echo " <Chemin_AccesEcriture_NETLOGON>\\\\" +%%smb_netbios_name\NETLOGON</Chemin_AccesEcriture_NETLOGON> +%echo " <Chemin_AccesEcriture_RACCOURCIS>\\\\" +%%smb_netbios_name\ICONES$</Chemin_AccesEcriture_RACCOURCIS> + <LecteurReseau_RACCOURCIS>R</LecteurReseau_RACCOURCIS> + </StockageData> + <Elevation_Pouvoir> + <Login>17rf5arn</Login> + <MdP>1hefHEUClWCVlbNi12A=</MdP> + </Elevation_Pouvoir> + </Reseau> + <AdminLogin>XfqaX9eAwspfiFAfjkgN5BL9lmk=</AdminLogin> + <Annuaire type="LDAP" login="Windows"> +%if %%mode_conteneur_actif == 'oui' and int(%%nombre_interfaces) > 1 + <Serveur host="%%adresse_ip_eth1" port="389" version="3" anonyme="1"> +%else + <Serveur host="%%adresse_ip_eth0" port="389" version="3" anonyme="1"> +%end if + <Login></Login> + <MdP></MdP> + </Serveur> + <FiltresRecherche BaseDN="ou=%%numero_etab,ou=%%nom_academie,ou=education,o=gouv,c=fr"><FiltreRecherche nom="EnumerationGroupes"> + <SubBaseDN>ou=groupes</SubBaseDN> + <Filtre>(objectclass=posixGroup)</Filtre> + <AffichageResultat>cn</AffichageResultat> + <SubbaseDN></SubbaseDN> + </FiltreRecherche> + <FiltreRecherche nom="EnumerationUtilisateurs"> + <SubBaseDN>ou=utilisateurs</SubBaseDN> + <Filtre>(objectclass=posixAccount)</Filtre> + <AffichageResultat>Uid</AffichageResultat> + <SubbaseDN></SubbaseDN> + </FiltreRecherche> + <FiltreRecherche nom="EnumerationMembresGroupe"> + <SubBaseDN>ou=groupes</SubBaseDN> + <Filtre>(&(objectclass=posixGroup)(MemberUid=%USERNAME%))</Filtre> + <AffichageResultat>cn</AffichageResultat> + </FiltreRecherche> + <FiltreRecherche nom="ResolutionIDUtilisateur"> + <SubBaseDN>ou=utilisateurs</SubBaseDN> + <Filtre>(&(objectclass=posixAccount)(Uid=%USERNAME%))</Filtre> + <AffichageResultat>Uid</AffichageResultat> + </FiltreRecherche> + </FiltresRecherche> + </Annuaire> + <ActivationDelegation>1</ActivationDelegation> + <Internet> + <MiseAJour>0</MiseAJour> +%if %%esu_proxy == "oui" + <Proxy actif="1"> + <Serveur host="%%esu_proxy_server" port="%%esu_proxy_port" anonyme="1"> +%else + <Proxy actif="0"> + <Serveur host="" port="" anonyme="0"> +%end if + <Login></Login> + <MdP></MdP> + </Serveur> +%if %%esu_proxy == "oui" + <ByPass>%%custom_join(%%esu_proxy_bypass, ';')</ByPass> +%else + <ByPass></ByPass> +%end if + </Proxy> + </Internet> + <CommentairesRegles actif=""/> + <ModeModele></ModeModele> +</ESU_DomainConf> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-esu/templates/esuconf.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-esu/templates/esuconf.xml new file mode 100644 index 0000000000000000000000000000000000000000..5399b19695b554f521c07d6cbd8610d10b8051b2 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-esu/templates/esuconf.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="ISO-8859-1"?> +<ESU_Conf> +%echo " <Domaine data=\"\\\\" +%%{smb_netbios_name}\esu\Base\"/> + <CommentairesRegles actif="1"/> +%echo " <ModeleGMDefaut>\\\\" +%if %%activer_esu == 'oui' and %%is_defined('horus_frontend') +%%smb_netbios_name\esu\Console\modeles\gm\groupemachine_[horus].xml</ModeleGMDefaut> +%else +%%smb_netbios_name\esu\Console\modeles\gm\groupemachine_[scribe].xml</ModeleGMDefaut> +%end if + <ModeModele>0</ModeModele> +</ESU_Conf> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim-auth/dictionaries/00_eole-exim-auth_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim-auth/dictionaries/00_eole-exim-auth_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..7e0bc3d48c2409b305a740967cb4f92da6f6857c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim-auth/dictionaries/00_eole-exim-auth_packages.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>eole-sso-client</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim-auth/dictionaries/27_mail_auth.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim-auth/dictionaries/27_mail_auth.xml new file mode 100644 index 0000000000000000000000000000000000000000..911de72f18eb48c2c5f15b17fd900a3696f67e72 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim-auth/dictionaries/27_mail_auth.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- 27 pour etre apres 26_mail.xml --> +<creole> + + <containers> + <container name='mail'> + <package>eole-exim-auth-pkg</package> + <file name='/etc/pam.d/exim' source='pam_exim' + filelist='ldapsso' /> + <file name='/etc/pam_cas.conf' source='pam_cas_auth.conf' filelist='ssoclient' /> + <file name='/etc/ldap.conf' filelist='client_ldap' /> + <file name='/etc/ldap/ldap.conf' rm='True' filelist='client_ldap' /> + </container> + </containers> + + <variables /> + + <constraints> + <condition name='disabled_if_in' source='activer_client_ldap'> + <param>non</param> + <target type='filelist'>ldapsso</target> + </condition> + + <condition name='disabled_if_in' source='activer_sso'> + <param>non</param> + <target type='filelist'>ldapsso</target> + </condition> + </constraints> + + <help /> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim-auth/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim-auth/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..cc10751eb05b965e39a686700d81197fef88ee50 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim-auth/service.yml @@ -0,0 +1,26 @@ +format: '0.1' +name: eole-exim-auth +version: |- + 2.7.1-1 +description: |- + Configuration EOLE pour Exim + Ce paquet fournit les templates et dictionnaires EOLE pour la + configuration de l’authentification SMTP d’exim. +depends: + - eole-exim + - eole-client-annuaire +packages: + - eole-sso-client +dictionaries: + - 27_mail_auth.xml +extra_dictionaries: {} +templates: + - pam_exim +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: [] +files: {} +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim-auth/templates/pam_exim b/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim-auth/templates/pam_exim new file mode 100644 index 0000000000000000000000000000000000000000..77416346224ea89798f649e682756fd335df9012 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim-auth/templates/pam_exim @@ -0,0 +1,8 @@ +%echo "#%PAM-1.0\n" +%if %%activer_client_ldap != 'non' +auth sufficient pam_ldap.so +%end if + +%if %%activer_sso != 'non' +auth sufficient /lib/security/pam_cas.so -ssmtp://%%adresse_ip_mail -f/etc/pam_cas.conf +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim/dictionaries/26_mail.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim/dictionaries/26_mail.xml new file mode 100644 index 0000000000000000000000000000000000000000..795de1ee0e1efa878849253b2ab361fc50979881 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim/dictionaries/26_mail.xml @@ -0,0 +1,474 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- 26 pour etre apres 25_sympa.xml --> +<creole> + + <files> + <!-- configuration de ssmtp pour le mode conteneur --> + <file name='/etc/ssmtp/ssmtp.conf' instance_mode='when_container'/> + <file name='/etc/mailname'/> + <!-- FIXME: liste à diviser avec d'autres ? --> + <file name='/etc/bareos/bareosfichiers.d/mail.conf' source='bareos-mail.conf' filelist='exim-bareos'/> + </files> + + <containers> + <all> + <file name='/etc/ssmtp/ssmtp.conf' mkdir='True' instance_mode='when_container' /> + <file name='/etc/mailname' instance_mode='when_container' /> + </all> + + <container name='mail' id='13'> + <package>eole-exim-pkg</package> + <!-- installation de eole-antivirus-pkg déplacée dans eole-antivirus #8702 & #9213 --> + <!-- <package>eole-antivirus-pkg</package>--> + <!-- <service servicelist='clamav_mail'>clamav-daemon</service> --> + <service>exim4</service> + <service_access service='exim4'> + <port service_accesslist='smtp'>25</port> + <port service_accesslist='smtp'>465</port> + </service_access> + <file name='/etc/exim4/eole.d/exim-vars.conf' filelist='exim' /> + <file name='/etc/exim4/eole.d/transport/smtp.conf' filelist='exim'/> + <file name='/etc/exim4/eole.d/rewrite.conf' source='exim-rewrite.conf' filelist='exim' /> + <!-- clamav : génère même si pas activé pour le mode non conteneur--> + <file filelist='clamav_mail' name='/etc/clamav/clamd.conf'/> + <fstab name='/home/mail'/> + </container> + </containers> + + <variables> + + <!-- il faut laisser le hidden == True si antivirus n'est pas installé--> + <family name='clamav' hidden='True'> + <variable name='exim_clamav' type='oui/non' description="Activer l'anti-virus sur la messagerie"> + <value>non</value> + </variable> + </family> + + <family name='messagerie' icon='envelope'> + + <variable name='adresse_ip_mail' type='ip' description="Adresse IP du serveur de mail local" /> + <!-- configuration du SMTP local non experte --> + <variable name='domaine_messagerie_etab' type='domain' mandatory='True' description="Nom de domaine de la messagerie de l'établissement (ex : monetab.ac-aca.fr)" mode='basic'/> + <variable name='system_mail_from' type='mail' description="Adresse électronique d'envoi pour le compte root"/> + <variable name='system_mail_from_for_headers' type='oui/non' mode='expert' + description="Écraser les entêtes 'From:', 'Reply-To:' et 'Sender:' du message"> + <value>non</value> + </variable> + + <variable name='system_mail_to' type='string' description="Adresse électronique recevant les courriers électroniques à destination du compte root" mode='basic'/> + <variable name='system_mail_to_for_headers' type='oui/non' mode='expert' + description="Écraser les entêtes 'To:', 'Cc:' et 'Bcc:' du message"> + <value>non</value> + </variable> + + <!-- Comptes locaux (ex smarthost) --> + <variable name='exim_smarthost' type='oui/non' description="Gérer la distribution locale" mode='expert'> + <value>non</value> + </variable> + <variable name='exim_ldap_delivery' type='oui/non' description="Gérer la distribution pour les comptes LDAP" mode='expert'> + <value>non</value> + </variable> + <variable name='exim_quota' type='number' description="Quota des boîtes aux lettres en Mo"> + <value>20</value> + </variable> + <variable name='exim_quota_warn' type='number' mode='expert' description="Pourcentage d’utilisation des boîtes entraînant un warning"> + <value>80</value> + </variable> + <variable name='exim_spam_score' type='number' description="Seuil de détection d'un spam (multiplié par 10)" mode='expert'> + <value>50</value> + </variable> + + <variable name='exim_use_tls' type='oui/non' description="Activer le TLS pour les clients" mode='expert'> + <value>oui</value> + </variable> + + <!-- Passerelle SMTP --> + <variable name='activer_exim_relay_smtp' type='oui/non' description="Router les courriels par une passerelle SMTP" mode="basic"> + <value>oui</value> + </variable> + <variable name='exim_relay_smtp' type='domain' description="Passerelle SMTP" mandatory='True'/> + <variable name='tls_smtp' type='string' description="Utilisation du TLS (SSL) par la passerelle SMTP"> + <value>non</value> + </variable> + + <!-- Relayage des messages (ex mailhub) --> + <variable name='exim_relay' type='oui/non' description="Activer le relai des messages" mode='expert'> + <value>non</value> + </variable> + + <!-- Must be redefine to mode='normal' where DHCP is “normal†--> + <variable name='exim_relay_dhcp' type='oui/non' mode='expert' description="Relayer les courriers électroniques pour toutes les plages définies dans le DHCP"> + <value>non</value> + </variable> + + <variable name='exim_relay_cidrv4' type='string' multi='True' mode='expert' description="Relayer les courriers électroniques pour des plages d’adresses IPv4"/> + + <!-- Not yet managed --> + <variable name='exim_relay_cidrv6' type='string' multi='True' mode='expert' hidden='True' description="Relayer les courriers électroniques pour des plages d’adresses IPv6"/> + <!-- End not yet managed --> + + <variable name='exim_relay_domains' type='string' mode='expert' multi='True' description="Relayer les courriers électroniques pour des nom de domaines"/> + + <!-- Must be redefined only on Seshat to unhide it --> + <variable name='exim_relay_manual_routes' type='oui/non' mode='expert' hidden='True' description="Activer le relai avec des routes manuelles (EAD)"> + <value>non</value> + </variable> + + <variable name='test_smtp_access' type='oui/non' description="Vérifie si les ports SMTP doivent être accessibles depuis l'extérieur"/> + + <!-- configuration experte --> + <variable name='exim_primary_hostname' type='string' mode='expert' description="FQDN utilisé par Exim"> + <value>automatique</value> + </variable> + + <variable name='exim_qualify_domain' type='domain_strict' mode='expert' description="Domaine utilisé pour qualifier les adresses"> + <value>nom de domaine local</value> + </variable> + + <variable name='exim_use_syslog' type='oui/non' mode='expert' description='Envoyer les logs par rsyslog'> + <value>oui</value> + </variable> + + <variable name='exim_use_log_files' type='oui/non' mode='expert' description='Dupliquer les logs dans des fichiers'> + <value>non</value> + </variable> + + <variable name='exim_address_rewrite' type='oui/non' mode='expert' description="Activer les règles de réécriture étendue"> + <value>non</value> + </variable> + + <variable name='exim_address_rewrite_pattern' type='string' mode='expert' multi='True' description='Schéma de réécriture' /> + + <variable name='exim_address_rewrite_replacement' type='string' mode='expert' description='Remplacement de réécriture' /> + + <variable name='exim_address_rewrite_flags' type='string' mode='expert' description='Drapeau de réécriture' /> + + </family> + + <separators> + <separator name='domaine_messagerie_etab'>Serveur d'envoi/réception (SMTP)</separator> + <separator name='activer_exim_relay_smtp'>Relai des messages</separator> + <separator name='exim_primary_hostname'>Configuration experte</separator> + </separators> + + </variables> + + <constraints> + + <fill name='auto_copy_val' target='domaine_messagerie_etab'> + <param type='eole'>nom_domaine_local</param> + </fill> + + <auto name='calc_multi_condition' target='adresse_ip_mail'> + <param>oui</param> + <param type='eole' name='condition_1'>mode_conteneur_actif</param> + <param type='eole' name='match'>container_ip_mail</param> + <param type='eole' name='mismatch'>adresse_ip_eth0</param> + <param name='default_mismatch'>None</param> + </auto> + + <auto name='calc_multi_condition' target='test_smtp_access'> + <param>oui</param> + <param name="operator">OR</param> + <param type='eole' name='condition_1'>exim_smarthost</param> + <param type='eole' name='condition_2'>exim_relay</param> + </auto> + + <check name='valid_enum' target='tls_smtp'> + <param>['non','port 25', 'port 465']</param> + </check> + + <condition name='disabled_if_in' source='exim_smarthost'> + <param>non</param> + <target type='variable' optional='True'>activer_sympa</target> + <target type='variable'>exim_quota</target> + <target type='variable'>exim_quota_warn</target> + <target type='variable'>exim_ldap_delivery</target> + </condition> + + <condition name='disabled_if_in' source='activer_client_ldap' fallback='True'> + <param>non</param> + <target type='variable'>exim_ldap_delivery</target> + </condition> + + <condition name='disabled_if_in' source='activer_exim_relay_smtp'> + <param>non</param> + <target type='variable'>exim_relay_smtp</target> + <target type='variable'>tls_smtp</target> + </condition> + + <check name='valid_enum' target='exim_primary_hostname'> + <param>[ 'automatique', 'nom_machine.domaine_messagerie_etab', 'nom_machine.nom_domaine_local']</param> + <param name='checkval'>False</param> + </check> + + <check name='valid_enum' target='exim_qualify_domain'> + <param>[ 'nom de domaine local', 'domaine privé de messagerie établissement', 'domaine public de messagerie établissement']</param> + </check> + + <condition name='disabled_if_in' source='exim_address_rewrite'> + <param>non</param> + <target type='variable'>exim_address_rewrite_pattern</target> + <target type='variable'>exim_address_rewrite_replacement</target> + <target type='variable'>exim_address_rewrite_flags</target> + </condition> + + <check name='valid_regexp' target='exim_address_rewrite_flags'> + <param>^[EFTbcfhrstSQqRw\s]*$</param> + <param name='err_msg'>Les flags doivent être une série des caractères suivants: EFTbcfhrst S QqRw</param> + </check> + + <group master='exim_address_rewrite_pattern'> + <slave>exim_address_rewrite_replacement</slave> + <slave>exim_address_rewrite_flags</slave> + </group> + + <condition name='disabled_if_in' source='activer_dhcp' fallback='True'> + <param>non</param> + <target type="variable">exim_relay_dhcp</target> + </condition> + + <condition name='disabled_if_in' source='exim_clamav'> + <param>oui</param> + <target type="variable" optional="True">clam_scan_mail</target> + </condition> + + <condition name='disabled_if_in' source='exim_relay'> + <param>non</param> + <target type='variable'>exim_relay_dhcp</target> + <target type='variable'>exim_relay_cidrv4</target> + <!-- Not yet managed + <target type='variable'>exim_relay_cidrv6</target> + --> + <target type='variable'>exim_relay_domains</target> + <!-- Must be redefined only on Seshat to unhide it + <target type='variable'>exim_relay_manual_routes</target> + --> + </condition> + + <condition name='disabled_if_in' source='test_smtp_access'> + <param>non</param> + <target type='service_accesslist'>smtp</target> + </condition> + + <condition name='disabled_if_in' source='exim_use_syslog'> + <param>non</param> + <target type='variable'>exim_use_log_files</target> + </condition> + + <check name='valid_entier' target='exim_quota'> + <param name="mini">0</param> + </check> + + <check name='valid_entier' target='exim_quota_warn'> + <param name="mini">0</param> + </check> + + <condition name='disabled_if_in' source='activer_spamassassin' fallback='True'> + <param>non</param> + <target type='variable'>exim_spam_score</target> + </condition> + + <!-- antivirus sur SMTP --> + <condition name='disabled_if_in' source='activer_clam' fallback='True'> + <param>non</param> + <target type='servicelist'>clamav_mail</target> + <target type='filelist'>clamav_mail</target> + <target type='variable'>exim_clamav</target> + </condition> + <condition name='disabled_if_in' source='exim_clamav'> + <param>non</param> + <target type='servicelist'>clamav_mail</target> + <target type='filelist'>clamav_mail</target> + </condition> + + <!-- gestion présence bareos --> + <condition name='disabled_if_in' source='activer_bareos_dir' fallback='True'> + <param>non</param> + <target type='filelist'>exim-bareos</target> + </condition> + + </constraints> + + <help> + + + <variable name='exim_clamav'> + Gestion de l'antivirus sur la messagerie + </variable> + <!-- + <family name='messagerie'> + Paramétrage du serveur de messagerie (MTA) Exim : + - Utilisation d’un relai ou envoi direct sur Internet ; + - Paramétrage du domaine de messagerie suivant le modèle Exim ; + - Paramétrage des réécritures d’adresses ; + - Paramétrage des logs Exim ; + - Paramétrage du relai des courriers électroniques ; + - Paramétrage d’activation de SpamAssassin ; + - Paramétrage d’activation de Sympa. + </family> + --> + <family name='messagerie'> + Paramétrage du serveur de messagerie + </family> + + <variable name="domaine_messagerie_etab"> + Nom de domaine de la messagerie de l’établissement, un domaine + privé est automatiquement créé avec le préfixe « i- » si "exim_mail_type" est à "satellite". + </variable> + + <variable name='activer_exim_relay_smtp'> + Activer l’utilisation d’une passerelle SMTP pour l’envoi + des courriers électroniques vers l’extérieurs. Si cette option est + désactivée, le réseau doit autoriser le protocole SMTP + depuis ce serveur vers Internet. + </variable> + + <variable name='exim_relay_smtp'> + Passerelle SMTP utilisée pour l’envoi des courriers électroniques vers + l’extérieur. Le protocole SMTP doit être autorisé entre + le serveur local et cette passerelle. + </variable> + + <variable name='tls_smtp'> + Si la passerelle SMTP accepte le TLS, choisir le port en + fonction du support de la commande STARTTLS (port 25) ou + non (port 465) + </variable> + + <variable name='system_mail_from'> + Adresse utilisée comme expéditeur des courriers électroniques de l'utilisateur root + </variable> + + <variable name='system_mail_to'> + Adresse utilisée pour la réception des courriers électroniques à l'attention de l'utilisateur root + </variable> + + + <variable name='exim_smarthost'> + Gestion d’un domaine local et d’un domaine privé (préfixe "i-") + </variable> + + <variable name='exim_use_tls'> + Activer le support du TLS pour les sessions SMTP. + Le serveur de courrier supportera alors STARTTLS sur le port 25 et écoutera en TLS sur le port 465 pour les clients qui le supportent. + Passer cette variable à non rend l'authentification SMTP impossible ce qui empêche les utilisateurs d'envoyer des messages. + </variable> + + <variable name='exim_primary_hostname'> + Nom de domaine complètement qualifié utilisé par Exim dans + le protocole SMTP. C'est utile pour les + vérifications anti-spam des MX externes. + Les valeurs possibles sont : + - automatique : laisser Exim décider ; + - nom_machine.domaine_messagerie_etab : utiliser le + nom de la machine complété par le nom de domaine de la + messagerie établissement ; + - nom_machine.nom_domaine_local : utiliser le + nom de la machine complété par le nom de domaine local. + </variable> + + <variable name="exim_qualify_domain"> + Nom de domaine ajouté aux adresses : + - non qualifiées (sans @DOMAIN) ; + - qualifié avec un nom de machine sans domaine (@NOM_MACHINE). + Les valeurs configurables sont : + - nom de domaine local : correspond à « %%nom_domain_local » ; + - domaine privé de messagerie établissement : correspond à « i-%%domaine_messagerie_etab » ; + - domaine public de messagerie établissement : correspond à « %%domaine_messagerie_etab ». + Si « %%domaine_messagerie_etab » est vide, « %%nom_domain_local » est utilisé. + </variable> + + <variable name='exim_address_rewrite'>Permettre de définir des règles de réécriture personnalisées. Si non, seuls les courriers électroniques en 'localhost' sont réécris avec le 'nom_domain_local'. Voir http://exim.org/exim-html-current/doc/html/spec_html/ch31.html.</variable> + + <variable name='exim_address_rewrite_pattern'> + Modèle de correspondance des adresses courriers électroniques à réécrire. + http://exim.org/exim-html-current/doc/html/spec_html/ch31.html#SECID151 + </variable> + + <variable name='exim_address_rewrite_replacement'> + Valeur de remplacement des adresses électroniques. + http://exim.org/exim-html-current/doc/html/spec_html/ch31.html#SECID152 + </variable> + + <variable name='exim_address_rewrite_flags'> + Drapeau contrôlant la réécriture des adresses électroniques. + Voir http://exim.org/exim-html-current/doc/html/spec_html/ch31.html#SECID153 + </variable> + + <variable name='exim_use_syslog'> + Activer l’envoi des logs par rsyslog. + </variable> + + <variable name='exim_use_log_files'> + Dupliquer les logs dans des fichiers gérés directement par + Exim. + Si vous envoyez les logs par rsyslog, vous pouvez conserver la + gestion des fichiers traditionnelles d’Exim. + Ces fichiers étant gérés directement par Exim, ils se + trouveront dans le conteneurs du service. + </variable> + + <variable name="exim_relay_dhcp"> + Activer le relai des courriers électroniques pour les plages d’adresses + définies dans la configuration DHCP. + Si toutes les plages d’adresses ne sont pas autoriser à + utiliser ce serveur comme relai de messagerie, vous devez + spécifier « non » et activer le relai manuel. + </variable> + + <variable name="exim_relay"> + Activer la configuration manuelle du relai des courriers électroniques. + Cette variable permet d’activer : + - Les listes d’adresses IP autorisées à utiliser ce serveur comme relai de messagerie. + - La liste des noms de domaines autorisées à être relayés par ce serveur. + Si vous n’êtes pas sûr, mettre la valeur « non ». + </variable> + + <variable name="exim_relay_cidrv4"> + Liste des adresses IPv4 autorisées à utiliser ce serveur comme + relai de messagerie. + Les adresses doivent être spécifiés en notation CIDR. + </variable> + + <variable name="exim_relay_cidrv6"> + Liste des adresses IPv6 autorisées à utiliser ce serveur comme + relai de messagerie. + Les adresses doivent être spécifiés en notation CIDR. + À l’heure actuelle, ce paramètre n’ayant aucun effet il est caché. + </variable> + + <variable name="exim_relay_domains"> + Liste des noms de domaines autorisées à être relayés par ce + serveur. + Ce paramètre est utilisé pour des MX secondaires ou un frontal + à plusieurs domaines de messagerie. + La syntaxe autorise le joker « * » et bien plus encore + (http://exim.org/exim-html-current/doc/html/spec_html/ch10.html#SECTdomainlist) + Si vous n’êtes pas sûr, laissez vide. + </variable> + + <variable name='exim_relay_manual_routes'> + Activation du routage manuel des messages en utilisant la + liste de correspondance « domaine: passerelle SMTP » + définie dans l’EAD. + </variable> + + <variable name="exim_quota"> + Taille par défaut, en Mo, des boîtes aux lettres. + </variable> + + <variable name="exim_quota_warn"> + Limite d’utilisation, en pourcent, d’une boîte aux lettres entraînant + l’envoi d’un message d’alerte. + </variable> + <variable name='exim_spam_score'> + Seuil à partir duquel un courrier électronique est considéré + comme spam. Le seuil fourni par SpamAssassin est multiplié + par 10 afin de faire des comparaisons sur des entiers. + </variable> + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim/files/etc/logrotate.d/eole-exim b/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim/files/etc/logrotate.d/eole-exim new file mode 100644 index 0000000000000000000000000000000000000000..79b762d0e3f317d49477b9c5e6cfa992bd3db80e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim/files/etc/logrotate.d/eole-exim @@ -0,0 +1,18 @@ +# Alert are paniclog +# Very low size, so rotate on size +/var/log/rsyslog/local/exim/*.alert.log { + size 10M + missingok + rotate 30 + compress + create 640 syslog adm +} + +# All other logs are keep 6 month +/var/log/rsyslog/local/exim/*.[!a]*.log { + weekly + missingok + rotate 32 + compress + create 640 syslog adm +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim/files/usr/share/eole/diagnose/50-mail b/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim/files/usr/share/eole/diagnose/50-mail new file mode 100644 index 0000000000000000000000000000000000000000..73a338bc8316fb9c4d3df3397eb67fb0b61a6992 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim/files/usr/share/eole/diagnose/50-mail @@ -0,0 +1,7 @@ +#!/bin/bash +. /usr/lib/eole/diagnose.sh +EchoGras "*** Messagerie" +TestService "Courrier SMTP" $(CreoleGet container_ip_mail):25 +TestMailQ +echo +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim/files/usr/share/eole/lxc/fstab/mail b/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim/files/usr/share/eole/lxc/fstab/mail new file mode 100644 index 0000000000000000000000000000000000000000..d3be13e48fb8134f0a3ccfe92b93551d1f68e77a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim/files/usr/share/eole/lxc/fstab/mail @@ -0,0 +1 @@ +/home/mail {{ROOTFS}}/home/mail none bind 0 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim/files/usr/share/zephir/monitor/configs/eximstats.agent b/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim/files/usr/share/zephir/monitor/configs/eximstats.agent new file mode 100644 index 0000000000000000000000000000000000000000..2288cb54117aa7070573bc6b240ef7d0edf9ec0d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim/files/usr/share/zephir/monitor/configs/eximstats.agent @@ -0,0 +1,15 @@ +# -*- coding: UTF-8 -*- +""" +Statistiques Exim (courrier) +""" + +from zephir.monitor.agents.eximstats import EximStats + +eximstats = EximStats("eximstats", + period = 180, + description = """Statistiques courrier""", + section="""Utilisation""", + ) + +AGENTS = [eximstats] + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim/files/usr/share/zephir/monitor/configs/services/24_exim.srv b/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim/files/usr/share/zephir/monitor/configs/services/24_exim.srv new file mode 100644 index 0000000000000000000000000000000000000000..f7cfba98303a79c938953f622b7e454beb845542 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim/files/usr/share/zephir/monitor/configs/services/24_exim.srv @@ -0,0 +1,12 @@ +# -*- coding: UTF-8 -*- +""" +Surveillance du service SMTP +""" + +from zephir.monitor.agents.services import TCPServices +from zephir.monitor.agentmanager.config import ADRESSE_IP_MAIL + +test = '%s:25' % ADRESSE_IP_MAIL +data = {test : "Courrier électronique (SMTP)"} +AGENTS.append(TCPServices('exim', data, period=115, + description="Etat du serveur SMTP (Exim)")) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim/posttemplates/03-mail b/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim/posttemplates/03-mail new file mode 100644 index 0000000000000000000000000000000000000000..792c801e53e2046bb6af7a465ba87e8899be9f6d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim/posttemplates/03-mail @@ -0,0 +1,20 @@ +#!/bin/bash + +#à appeler avant la création d'admin pour l'envoi du mail d'ouverture + +########### +## Exim4 ## +########### + +. /usr/lib/eole/utils.sh + +# droits sur l'espace de stockage des boites mail +if [ "$(CreoleGet exim_ldap_delivery non)" = 'oui' ];then + CreoleRun "chown mail:mail /home/mail" mail +fi + +container_path_mail=$(CreoleGet container_path_mail) +exim_conf_dir=$(rgrep "EXIM_CONFDIR = " ${container_path_mail}/etc/exim4/exim4.conf | sed -e "s/^.*EXIM_CONFDIR = \(.*\)/\1/") +InstallSSLFiles exim4 Debian-exim Debian-exim ${exim_conf_dir}/ssl mail + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..1f356be61fddd42fbb04936490b7d0b7c22bc5ab --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim/service.yml @@ -0,0 +1,56 @@ +format: '0.1' +name: eole-exim +version: |- + 2.7.1-1 +description: |- + Configuration EOLE pour Exim + Ce paquet fourni les templates et dictionnaires EOLE pour la + configuration d’exim. + . + Cinq modes de fonctionnements sont supportés: + - Pas sur un réseau, distribution locale uniquement (local) + - Envois via relais sans mail local (satellite) + - Envois via relais avec gestion des boites locales et domaine privé (smarthost) + - Envois par routes manuelles et via relais sans mail local (mailhub) + - Relais (internet) +depends: [] +packages: [] +dictionaries: + - 26_mail.xml +extra_dictionaries: {} +templates: + - bareos-mail.conf + - exim-rewrite.conf + - exim-vars.conf + - mailname + - smtp.conf + - ssmtp.conf +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: + - 03-mail +files: + /etc/logrotate.d/eole-exim: + owner: root + group: root + mode: '0644' + /usr/share/eole/diagnose/50-mail: + owner: root + group: root + mode: '0755' + /usr/share/eole/lxc/fstab/mail: + owner: root + group: root + mode: '0644' + /usr/share/zephir/monitor/configs/eximstats.agent: + owner: root + group: root + mode: '0644' + /usr/share/zephir/monitor/configs/services/24_exim.srv: + owner: root + group: root + mode: '0644' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim/templates/bareos-mail.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim/templates/bareos-mail.conf new file mode 100644 index 0000000000000000000000000000000000000000..8c1fc7cddb35b854672ee1b8e63bac503232acb9 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim/templates/bareos-mail.conf @@ -0,0 +1,12 @@ +Include { + Options { + aclsupport = no + @/etc/bareos/include-options.conf + } + File = %%container_path_mail/var/spool/mail +%if %%getVar('activer_sympa', 'non') == 'oui' + File = %%container_path_mail/etc/mail/sympa/aliases + File = %%container_path_mail/var/lib/sympa/wwsarchive + File = %%container_path_mail/var/lib/sympa/expl +%end if +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim/templates/exim-rewrite.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim/templates/exim-rewrite.conf new file mode 100644 index 0000000000000000000000000000000000000000..a37af665773c1d01155298bdd64de1703dbe1b98 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim/templates/exim-rewrite.conf @@ -0,0 +1,114 @@ +###################################################################### +# REWRITE CONFIGURATION # +###################################################################### + +begin rewrite + +µµµµµµµµµµ +µµµµµµµµµµ Do not prepend machine name in front of valid local domain +µµµµµµµµµµ +%if %%exim_smarthost == u'non' or %%nom_domaine_local != %%domaine_messagerie_etab + %if %%current_container[u'name'] == u'root' + %set %%local_prefix = %%nom_machine + %else + %set %%local_prefix = %%current_container[u'name'] + '.' + %%nom_machine + %end if +# If mail is local: prefix local domain with machine name + %if %%mode_conteneur_actif == u'oui' +µµµµµµµµµµ Rewrite address from containers too +# If mail is from container: use HELO if defined +*@%%nom_domaine_local "${if eq {$received_protocol}{local}\ + {$local_part@%%local_prefix.%%domaine_messagerie_etab}\ + {${if and {{def:sender_helo_name}\ + {match_ip {$sender_host_address}{%%adresse_network_br0/%%calc_classe(%%adresse_netmask_br0)}}}\ + {$local_part@$sender_helo_name}\ + fail}}}" h + %else +µµµµµµµµµµ Rewrite only local mails +*@%%nom_domaine_local "${if eq {$received_protocol}{local}\ + {$local_part@%%local_prefix.%%domaine_messagerie_etab}\ + fail}" Eh + %end if +%end if + +%set %%force_from = %%getVar('system_mail_from', None) +%if %%system_mail_from_for_headers == u'oui' +µµµµµµµµµµ Override envelope and headers + %set %%from_flags = 'Ffrs' +%else +µµµµµµµµµµ Override only 'From:' envelope and 'Reply-To:' header + %set %%from_flags = 'Fr' +%end if + +%set %%force_to = %%getVar('system_mail_to', None) +%if %%system_mail_to_for_headers == u'oui' +µµµµµµµµµµ Override envelope and headers + %set %%to_flags = 'Ttcb' +%else +µµµµµµµµµµ Override only envelope + %set %%to_flags = 'T' +%end if + +%if %%force_from is not None or %%force_to is not None + %if %%force_to is not None +#### +#### All message To: root +#### + %if %%nom_domaine_local != %%domaine_messagerie_etab +root@%%nom_domaine_local %%force_to %%to_flags +root@%%domaine_messagerie_etab %%force_to %%to_flags + %else +root@%%nom_domaine_local %%force_to %%to_flags + %end if + + %end if +#### +#### Force From: and To: envelope and Reply-To header +#### + %if %%mode_conteneur_actif == u'oui' + %if %%force_from is not None + %set %%from_rewrite = "${if match_ip {$sender_host_address}{" + %%adresse_network_br0 + "/" + %%calc_classe(%%adresse_netmask_br0) + "}{" + %%force_from + "} fail}" + %end if + %if %%force_to is not None + %set %%to_rewrite = "${if match_ip {$sender_host_address}{" + %%adresse_network_br0 + "/" + %%calc_classe(%%adresse_netmask_br0) + "}{" + %%force_to + "} fail}" + %end if + %else + %if %%force_from is not None + %set %%from_rewrite = "${if eq {$received_protocol}{local}{" + %%force_from + "} fail}" + %end if + %if %%force_to is not None + %set %%to_rewrite = "${if eq {$received_protocol}{local}{" + %%force_to + "} fail}" + %end if + %end if + %for %%cont in %%creole_client.get_groups() + %set %%empty_line = False + %if %%cont == u'all' + %continue + %elif %%cont == u'root' + %set %%cont_name = %%nom_machine + %else + %set %%cont_name = %%cont + %end if + %if %%force_from is not None +\N^([^@]+)@%%cont_name.*$\N "%%from_rewrite" %%from_flags + %set %%empty_line = True + %end if + %if %%force_to +\N^([^@]+)@%%cont_name.*$\N "%%to_rewrite" %%to_flags + %set %%empty_line = True + %end if + %if %%empty_line + + %end if + %end for +%end if + +%if %%exim_address_rewrite == 'oui' +#### +#### Rewrite rules defined in gen_config +#### +%for %%pattern in %%exim_address_rewrite_pattern +%%pattern %%pattern.exim_address_rewrite_replacement %%pattern.exim_address_rewrite_flags + +%end for +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim/templates/exim-vars.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim/templates/exim-vars.conf new file mode 100644 index 0000000000000000000000000000000000000000..58147b1c6471535192e89d77de5104bf303408df --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim/templates/exim-vars.conf @@ -0,0 +1,258 @@ + +ACADEMIE = %%nom_academie +TLD = %%suffixe_domaine_academique + +####################### +# Type of mail system # +####################### + +%if %%getVar('exim_relay_smtp', None) is not None +# Use another MX to output mails +SMTP_SERVER = %%exim_relay_smtp +%else +# No SMTP relay defined => direct output on Internet +%end if + +%if %%exim_smarthost == 'oui' +# Enable local mails +SMARTHOST = True +%end if + +################### +# Global settings # +################### +SYSTEM_MAIL_FROM = %%system_mail_from +SYSTEM_MAIL_TO = %%system_mail_to + +%set %%primary_hostname = {'nom_machine.nom_domaine_local': %%nom_machine + '.' + %%nom_domaine_local} +%if %%exim_smarthost == 'oui' +%set %%primary_hostname['nom_machine.domaine_messagerie_etab'] = %%nom_machine + '.' + %%domaine_messagerie_etab +%end if + +%if %%exim_primary_hostname != 'automatique' + %if %%exim_primary_hostname in %%primary_hostname.keys() +PRIMARY_HOSTNAME = %%primary_hostname[%%exim_primary_hostname] + %else +PRIMARY_HOSTNAME = %%exim_primary_hostname + %end if +%end if + +LOCAL_DOMAINS = +PRIV_DOMAIN = +QUALIFY_DOMAIN = + +# Nom domaine local +%if %%getVar('nom_domaine_local', '') != '' +LOCAL_DOMAINS == %%nom_domaine_local +# Valeur par défaut, peut être redéfini en dessous par domaine_messagerie_etab +QUALIFY_DOMAIN == %%nom_domaine_local +%end if + +%if %%exim_smarthost == 'oui' +# Nom domaine messagerie établessiment pour smarthost +LOCAL_DOMAINS == LOCAL_DOMAINS : %%domaine_messagerie_etab : i-%%domaine_messagerie_etab +PRIV_DOMAIN == i-%%domaine_messagerie_etab +%end if + +%if %%exim_smarthost == 'oui' + %if %%exim_qualify_domain == u'domaine privé de messagerie établissement' +# Nom de domaine privé de messagerie établissement +QUALIFY_DOMAIN == i-%%domaine_messagerie_etab + %elif %%exim_qualify_domain == u'domaine public de messagerie établissement' +# Nom de domaine public de messagerie établissement +QUALIFY_DOMAIN == %%domaine_messagerie_etab + %end if +%end if + +# Nom du serveur et des conteneurs avec et sans FQDN +%set %%container_names_list = [%%nom_machine, %%nom_machine + ".QUALIFY_DOMAIN"] +%for cont in %%creole_client.get_containers(): + %if %%cont.name in ['root', 'all'] + %continue + %end if + %%container_names_list.extend([%%cont.name, %%cont.name + ".QUALIFY_DOMAIN"]) +%end for +%%container_names_list.insert(0, 'LOCAL_DOMAINS') +LOCAL_DOMAINS == %%custom_join(%%container_names_list, ' : ') + +%if %%getVar('exim_relay_manual_routes', 'non') == 'oui' +# Routes manuelles EAD +MANUAL_ROUTES = /etc/mail/routes +%end if + +# Liste de relais +RELAY_HOSTS = /etc/mail/relayhosts + +# Enable private mail to and from admin domain +%if %%getVar('system_mail_to', None) is not None and '@' in %%system_mail_to +%set %%priv_granted = %%system_mail_to.split('@') +PRIV_GRANTED = %%priv_granted[-1] +%else +PRIV_GRANTED = QUALIFY_DOMAIN +%end if + +################### +# Type of logging # +################### +%set %%log_path = '' +%if %%exim_use_syslog == 'oui' + %set %%log_path = 'syslog' + %if %%exim_use_log_files == 'oui' + %set %%log_path += ' : /var/log/exim4/%s.log' + %end if +LOG_PATH = %%log_path +%end if + +########################### +# List of served networks # +########################### + +# Initially empty +# Append with == +V4_NETWORKS = ${if exists{RELAY_HOSTS}{net-lsearch;RELAY_HOSTS}} +V6_NETWORKS = + +## Manual definition of relay CIDR +# IPv4 +%if %%getVar('exim_relay_cidrv4', None) is not None +V4_NETWORKS == V4_NETWORKS : %%custom_join(%%exim_relay_cidrv4, ' : ') +%end if + +# IPv6 +%if %%getVar('exim_relay_cidrv6', None) is not None +V6_NETWORKS == %%custom_join(%%exim_relay_cidrv6, ' : ') +%end if + +## DHCP pool +%if %%getVar('exim_relay_dhcp', 'non') == 'oui' +# IPv4 +%set %%relay_dhcpv4 = '' +%for %%dhcp_network in %%adresse_network_dhcp + %set %%relay_dhcpv4 += ' : ' + %%dhcp_network + '/' + %%calc_classe(%%dhcp_network.adresse_netmask_dhcp) +%end for +V4_NETWORKS == V4_NETWORKS %%relay_dhcpv4 +## DHCPv6 not implemented yet +# V6_NETWORKS == V6_NETWORKS +%end if + +# Mode conteneur +%if %%mode_conteneur_actif == 'oui' +CONTAINERS_NETWORK = %%adresse_network_br0/%%calc_classe(%%adresse_netmask_br0) +V4_NETWORKS == V4_NETWORKS : CONTAINERS_NETWORK +## IPv6 not implemented yet +# V6_NETWORKS == V6_NETWORKS + +# Authorize unqualified adress for these hosts +UNQUALIFIED_HOSTS = CONTAINERS_NETWORK +%end if + +########################### +# List of relayed domains # +########################### + +RELAY_DOMAINS = + +# Relais vers les routes manuelles +%if %%getVar('exim_relay_manual_routes', 'non') == 'oui' +RELAY_DOMAINS == RELAY_DOMAINS : ${if exists{MANUAL_ROUTES}{lsearch;MANUAL_ROUTES}} +%end if + +# Liste de domaines de relais +%if %%getVar('exim_relay_domains', None) is not None +RELAY_DOMAINS == %%custom_join(%%exim_relay_domains, ' : ') +%end if + +%if %%exim_smarthost == 'oui' +############### +# LDAP stuffs # +############### + +%if %%getVar('exim_ldap_delivery', 'non') != 'non' +LDAP_DELIVERY = True +%if %%getVar('activer_client_ldap', 'non') != 'non' +LDAP_SERVER = %%adresse_ip_ldap +BASE_DN = %%ldap_base_dn +MAIL_ALIAS_ATTRIBUTE = mailAlternateAddress +MAIL_STORE_ATTRIBUTE = mailDir +UID_ATTRIBUTE = uid +# QUOTA_ATTRIBUTE = +# Include LDAP queries +.include CONF_DIR/ldap.conf +%end if +%end if + +########## +# Zarafa # +########## +%if %%getVar('activer_groupware', 'non') == 'oui' +ZARAFA_SERVER = True +%end if + +######### +# Sympa # +######### + +# FIXME +TRUSTED_USERS = mail:root:www-data +%if %%getVar('activer_sympa', 'non') == 'oui' +SYMPA_USER = sympa +SYMPA_ALIASES = /etc/mail/sympa/aliases +TRUSTED_USERS == TRUSTED_USERS : SYMPA_USER +%end if +%end if + +############### +# Spamassasin # +############### + +%if %%getVar('activer_spamassassin', 'non') == 'oui' +SPAM_MASTER = spam-master +# FIXME +# SPAMD_ADDRESS = /var/run/spamd_socket +SPAMD_ADDRESS = 127.0.0.1 783 +SPAM_SCORE = %%exim_spam_score +spamd_address = SPAMD_ADDRESS +%end if + +########### +# Malware # +########### + +%if %%getVar('activer_clam', 'non') == 'oui' and %%exim_clamav == 'oui' +#FIXME +AV_SCANNER = clamd:/var/run/clamav/clamd.ctl +# AV_SCANNER = clamd:127.0.0.1 3310 +av_scanner = AV_SCANNER +%end if + +######## +# Misc # +######## + +# FIXME +MESSAGE_SIZE_LIMIT = 5M + +# FIXME: use LDAP? +%if %%is_defined('exim_quota') +BOX_QUOTA = %%{exim_quota}M +%end if + +################### +# SEND OVER SMTPS # +################### +%if %%getVar('tls_smtp', 'non') != 'non' +%set %%smtp_tls_src_port = {'port 25': 25, 'port 465': 465} +SMTPD_SRC_TLS = true +TLS_SRC_PORT = %%smtp_tls_src_port[%%tls_smtp] +%end if + +################### +# ACTIVATE TLS # +################### +%if %%exim_use_tls == 'oui' +%set %%SSL_dir = '/etc/exim4/ssl' +%set %%certname = 'exim4' +USE_TLS = true +CERT_PATH = %%{SSL_dir}/certs/%%{certname}.crt +KEY_PATH = %%{SSL_dir}/private/%%{certname}.key +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim/templates/mailname b/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim/templates/mailname new file mode 100644 index 0000000000000000000000000000000000000000..b71fe7de4c9cdeb072972bcbcdbde6a0dc07f799 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim/templates/mailname @@ -0,0 +1,5 @@ +%if %%current_container[u'name'] == u'root' +%%nom_machine.%%domaine_messagerie_etab +%else +%%current_container[u'name'].%%nom_machine.%%domaine_messagerie_etab +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim/templates/smtp.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim/templates/smtp.conf new file mode 100644 index 0000000000000000000000000000000000000000..4a11efd44032c156ccaefca69a8daf5c5e3513d5 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim/templates/smtp.conf @@ -0,0 +1,10 @@ +# This transport is used for delivering messages over SMTP connections. +remote_smtp: + debug_print = "T: remote_smtp for $local_part@$domain" + driver = smtp +.ifdef SMTPD_SRC_TLS + port = TLS_SRC_PORT + tls_certificate = CERT_PATH + tls_privatekey = KEY_PATH + # tls_require_ciphers = AES+SHA1 : RSA+SHA1 : DHE-DSS : DHE-RSA +.endif diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim/templates/ssmtp.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim/templates/ssmtp.conf new file mode 100644 index 0000000000000000000000000000000000000000..0594d465ef70eb8b8f244d78fc54c7e9694d415b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-exim/templates/ssmtp.conf @@ -0,0 +1,36 @@ +# +# Config file for sSMTP sendmail +# pour EOLE 2.3 +# Equipe Eole 2010 +# + +#Mailhub +# The host to send mail to, in the form host port | IP_addr port [: port]. +# The default port is 25. +Mailhub=%%container_ip_mail + +#UseTLS +# Specifies whether ssmtp uses TLS to talk to the SMTP server. +# The default is “noâ€. + +#UseSTARTTLS +# Specifies whether ssmtp does a EHLO/STARTTLS before starting SSL negotiation. +# See RFC 2487. + +# Hostname +# The full qualified name of the host. +# If not specified, the host is queried for its hostname. +%if %%current_container[u'name'] == u'root' +Hostname=%%nom_machine.%%domaine_messagerie_etab +%else +Hostname=%%current_container[u'name'].%%nom_machine.%%domaine_messagerie_etab +%end if + +# Where will the mail seem to come from? +#rewriteDomain= + +# Are users allowed to set their own From: address? +# YES - Allow the user to specify their own From: address +# NO - Use the system generated From: address +FromLineOverride=YES + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-actions/creole_funcs/quota.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-actions/creole_funcs/quota.py new file mode 100644 index 0000000000000000000000000000000000000000..aae8e4711a6567342bfe29134e66159cec4f888a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-actions/creole_funcs/quota.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- + +from pyeole.process import system_out + +def quota_directories(): + directories = set() + code, output, err = system_out(['quotaon', '-pa']) + if code != 0: + for line in output.splitlines(): + try: + directories.add(line.split()[3]) + except: + pass + return list(directories) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-actions/dictionaries/00_eole-fichier-actions_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-actions/dictionaries/00_eole-fichier-actions_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..b0f7ac1002d91245444c70d0144eeabbb0123ace --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-actions/dictionaries/00_eole-fichier-actions_packages.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>quota</package> + <package>acl</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-actions/dictionaries/20_fichieraction.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-actions/dictionaries/20_fichieraction.xml new file mode 100644 index 0000000000000000000000000000000000000000..f66a41e1b90a3e1d63a2afaa922d24abe9db5988 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-actions/dictionaries/20_fichieraction.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + <file filelist='actions_fichier' name='/usr/share/eole/creole/extra/quota/custom/options.json'/> + <file filelist='actions_fichier' name='/usr/share/eole/creole/extra/acl/custom/options.json' source='options_acl.json'/> + </files> + <variables> + <family name='ead3'> + <variable name='acl_directories' type='filename' description="Répertoire administrable dans l'action ACL" multi='True' mode='expert'> + <value>/home</value> + </variable> + </family> + </variables> + <constraints> + <condition name='disabled_if_in' source='activer_ead3' fallback='True'> + <param>non</param> + <target type='variable'>acl_directories</target> + <target type='filelist'>actions_fichier</target> + </condition> + </constraints> + <help> + <variable name='acl_directories'>Liste des répertoires dont les ACL pourront être éditées via l’interface EAD3</variable> + </help> +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-actions/extra_dictionaries/acl/00_base.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-actions/extra_dictionaries/acl/00_base.xml new file mode 100644 index 0000000000000000000000000000000000000000..f6ca4002aa55064fa952fb4801bb2cee8f70af30 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-actions/extra_dictionaries/acl/00_base.xml @@ -0,0 +1,19 @@ +<creole> + <family_action name="Système"> + <action type="custom" + title="Gestion des ACL" + description="Afficher et modifier les ACL des utilisateurs ou groupes" + image="icons/document-save-as.svg"> + <saltaction>user.getent</saltaction> + <saltaction>group.getent</saltaction> + <profile>ead_admin</profile> + <ewtapp>ead</ewtapp> + <tag>fichier</tag> + <tag>samba</tag> + </action> + </family_action> + <variables> + </variables> + <constraints/> + <help/> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-actions/extra_dictionaries/quota/00_base.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-actions/extra_dictionaries/quota/00_base.xml new file mode 100644 index 0000000000000000000000000000000000000000..f29b8c1342a0313bd4e5d6cf87decc3222ea2f58 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-actions/extra_dictionaries/quota/00_base.xml @@ -0,0 +1,37 @@ +<creole> + <family_action name="systeme"> + <action type="custom" + title="Gestion des quotas fichiers" + description="Afficher et modifier les quotas sur la taille des fichiers des utilisateurs ou des groupes" + image="icons/document-save-as.svg"> + <profile>ead_admin</profile> + <ewtapp>ead</ewtapp> + <tag>fichier</tag> + <tag>samba</tag> + </action> + </family_action> + <variables> + <family name="quota"> + <variable name="directories" description="Répertoire gérant les quotas" type="filename" multi="True"/> + <variable name="factor" description="Pourcentage de la limite douce ajoutée pour la calcule de la limite dure si l'utilisateur ne la précise pas" type="number" mandatory="True"> + <value>100</value> + </variable> + <variable name="maxfactor" description="Taille maximale ajoutée" type="number" mandatory="True"> + <value>0</value> + </variable> + <variable name="error_limit" description="Pourcentage d'usage à partir de laquelle l'utilisateur ou le groupe est en erreur" type="number" mandatory="True"> + <value>90</value> + </variable> + <variable name="warning_limit" description="Pourcentage d'usage à partir de laquelle l'utilisateur ou le groupe est en avertissement" type="number" mandatory="True"> + <value>80</value> + </variable> + </family> + </variables> + <constraints> + <fill name='quota_directories' target='quota.quota.directories'> + </fill> + </constraints> + <help> + <variable name="quota.quota.maxfactor">Valeur en Ko. La valeur 0 permet de désactiver la valeur maximale</variable> + </help> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-actions/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-actions/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..6089ef05eb36d520567ee207bd97ecdbcfa5a37b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-actions/service.yml @@ -0,0 +1,36 @@ +format: '0.1' +name: eole-fichier-actions +version: |- + 2.7.1-2 +description: |- + Actions génériques sur les fichiers + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: [] +packages: + - quota + - acl +dictionaries: + - 20_fichieraction.xml +extra_dictionaries: + acl: + - 00_base.xml + quota: + - 00_base.xml +templates: + - options.json + - options_acl.json +creole_funcs: + - quota.py +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: [] +files: {} +excluding_regexp: + /usr/share/doc: 2 + /usr/share/eole/creole/extra/acl/custom/: 89 + /usr/share/eole/creole/extra/acl/salt/: 1 + /usr/share/eole/creole/extra/quota/custom/: 88 + /usr/share/eole/creole/extra/quota/salt/: 1 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-actions/templates/options.json b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-actions/templates/options.json new file mode 100644 index 0000000000000000000000000000000000000000..7529d2e2518f99120433227d608805e79fc684dc --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-actions/templates/options.json @@ -0,0 +1,8 @@ +%import json +%%json.dumps({'directories': %%creole_client.get('.quota.quota.directories'), + 'factor': %%creole_client.get('.quota.quota.factor'), + 'maxfactor': %%creole_client.get('.quota.quota.maxfactor'), + 'error_limit': %%creole_client.get('.quota.quota.error_limit'), + 'warning_limit': %%creole_client.get('.quota.quota.warning_limit') +}) + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-actions/templates/options_acl.json b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-actions/templates/options_acl.json new file mode 100644 index 0000000000000000000000000000000000000000..5c7b0a13a9fc41a73e8234d3ddd4882b4d02b91c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-actions/templates/options_acl.json @@ -0,0 +1,2 @@ +%import json +%%json.dumps({'directories': %%creole_client.get_creole('acl_directories')}) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/dictionaries/00_eole-fichier-common_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/dictionaries/00_eole-fichier-common_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..b0f7ac1002d91245444c70d0144eeabbb0123ace --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/dictionaries/00_eole-fichier-common_packages.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>quota</package> + <package>acl</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/dictionaries/20_fichier.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/dictionaries/20_fichier.xml new file mode 100644 index 0000000000000000000000000000000000000000..5c417e8ab55ea90f1fb5806be5d13b4588f7f768 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/dictionaries/20_fichier.xml @@ -0,0 +1,336 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + <files> + <!-- warnquota s'execute sur le maitre bug #1602 --> + <file filelist='smb_quotawarn' name='/etc/warnquota.conf'/> + <!-- FIXME : firewall --> + <!--<file name='/usr/share/eole/firewall/00_fichier.fw'/>--> + <file name='/etc/bareos/bareosfichiers.d/fichier.conf' source='bareos-fichier.conf' mkdir='True'/> + </files> + <containers> + <container name='fichier' id='12'> + <disknod>/home</disknod> + <fstab name='home_path' name_type='SymLinkOption'/> + <!--attention, redefini dans 50_amonecole--> + <interface linkto="eth0" ip="adresse_ip_fichier_link" mask="adresse_mask_fichier_link" bcast="adresse_bcast_fichier_link">eth1</interface> + <package>eole-fichier-common-pkg</package> + <package instance_mode='when_no_container'>eole-antivirus-pkg</package> + <package instance_mode='when_container'>eole-antivirus-container-pkg</package> + <service>smbd</service> + <service>nmbd</service> + <service servicelist='antivirus_samba'>clamav-daemon</service> + <!--<service servicelist="antivirus_samba">scannedonly</service>--> + <file name='/etc/samba/smb.conf'/> + <file filelist='smb_trash' name='/etc/samba/recycle.conf'/> + <service_access service='ntp'> + <port protocol='udp'>123</port> + </service_access> + <service_access service='smbd'> + <port>139</port> + <port>445</port> + </service_access> + <service_access service='nmbd'> + <port protocol='udp'>137</port> + <port protocol='udp'>138</port> + </service_access> + <!-- cg --> + <file name='/usr/share/eole/bastion/data/80-eole_fichier_rules' mode='0755'/> + <file name='/etc/logrotate.d/samba' source='samba.logrotate'/> + <!--pam--> + <file name='/etc/pam.d/login'/> + <!-- clamd.conf is provided by eole-antivirus --> + <!--<file filelist='antivirus_samba' name='/etc/clamav/clamd.conf'/>--> + </container> + </containers> + + <variables> + + <!-- useless if eole-fichier depends on eole-antivirus --> + <!--<family name='services'> + <variable name='activer_clam' type='oui/non' description="Activer l'anti-virus ClamAV" exists='False' hidden='True'> + <value>non</value> + </variable> + </family>--> + + <family name='Interface-0'> + <variable name='adresse_ip_fichier_link' type='ip' description="Adresse IP pour le serveur de fichiers" mandatory='True'/> + <variable name='adresse_mask_fichier_link' type='netmask' description="Masque de sous réseau pour le serveur de fichiers" mandatory='True' mode='expert'/> + <variable name='adresse_bcast_fichier_link' type='broadcast' description="Broadcast pour le serveur de fichiers" mandatory='True'/> + </family> + + <!-- il faut laisser le hidden == True si antivirus n'est pas installé--> + <family name='clamav' hidden='True'> + <variable name='smb_vscan' type='oui/non' description="Activer l'anti-virus temps réel sur SMB" hidden='True'> + <value>non</value> + </variable> + <variable name='clam_purge' type='number' description='Durée de conservation des fichiers en quarantaine (en jours)'> + <value>20</value> + </variable> + </family> + + <family name='samba' icon='group'> + <variable name='smb_netbios_name' type='netbios' description="Nom du contrôleur de domaine (ex: monserveur)" auto_freeze='True' mandatory='True'/> + <variable name='smb_workgroup' type='netbios' description="Nom du domaine Samba (ex: mondomaine)" auto_freeze='True' mandatory='True'/> + <variable name='smb_ports' type='string' description="Ports sur lesquels Samba accepte les connexions" mode='expert'> + <value>445 139</value> + </variable> + <variable name='fichier_link_interface' type='string' description='Interface associée à adresse_ip_fichier_link' hidden='True'> + <value>eth0</value> + </variable> + <variable name='smb_server_string' type='string' description='Libellé du serveur Samba' mandatory='True' mode='expert'/> + <variable name='smb_trash' type='oui/non' description='Activer la corbeille Samba' mode='expert'> + <value>non</value> + </variable> + <variable name='smb_trash_dir' type='filename' description='Nom du répertoire corbeille' mandatory='True' mode='expert'> + <value>perso/.corbeille</value> + </variable> + <variable name='smb_trash_purge' type='number' description='Durée de conservation des fichiers dans la corbeille (en jours)' mandatory='True' mode='expert'> + <value>8</value> + </variable> + <variable name='smb_quotawarn' type='oui/non' description="Activer l'envoi de courriel en cas de dépassement des quotas" mode='expert'> + <value>non</value> + </variable> + <variable name='smb_guest' type='oui/non' description="Activer le mode invité sur le partage" mode='expert'> + <value>oui</value> + </variable> + <variable name='smb_log_level' type='number' description='Niveau de log' mandatory='True' mode='expert'> + <value>0</value> + </variable> + <variable name='smb_deadtime' type='number' description="Nombre de minutes d'inactivité avant déconnexion automatique d'accès à un fichier" mode='expert'> + <value>15</value> + </variable> + <variable name='smb_activer_hide_files' type='oui/non' description="Activer le masquage de fichiers" mode='expert' hidden='True'> + <value>oui</value> + </variable> + <variable name='smb_hide_files' type='string' description="Fichiers à masquer dans le partage" mode='expert'> + <value>/desktop.ini/</value> + </variable> + + <variable name='smb_wins_support' type='yes/no' description='Démarrer le serveur Wins' mode='expert'> + <value>yes</value> + </variable> + <variable name='smb_wins_server' type='ip' description='Serveur WINS distant' multi="True"/> + <variable name='smb_dns_proxy' type='yes/no' description="Rechercher des noms d'hôte dans le DNS" mode='expert'> + <value>no</value> + </variable> + <variable name='smb_name_resolve_order' type='string' description="Ordre de résolution de noms d'hôte" /> + <variable name='smb_oplocks' type='yes/no' description="Activer les verrous opportunistes (oplocks)" mode='expert'> + <value>no</value> + </variable> + <variable name='smb_dos_attributes' type='yes/no' description="Activer le support des attributs DOS" mode='expert'> + <value>no</value> + </variable> + <variable name='smb_os_level' type='number' description="Niveau de candidature lors de l'élection d'un maître explorateur" mandatory='True' mode='expert'> + <value>99</value> + </variable> + <variable name='smb_domain_master' type='yes/no' description='Contrôleur de domaine principal' mode='expert' > + <value>yes</value> + </variable> + <variable name='smb_max_proto' type='string' description='Niveau de protocole maximum supporté par le serveur' mode='expert'> + <value>default</value> + </variable> + <!-- FIXME: #179 --> + <variable name='smb_unixextensions' type='yes/no' description="Activer les extensions Unix" hidden='True'> + <value>no</value> + </variable> + <variable name='smb_printers_drivers_path' type='filename' description="Chemin vers les drivers d'imprimantes Windows" mandatory='True'> + <value>/var/lib/samba/printers</value> + </variable> + <variable name='smb_control_print_access_with_acl' type='oui/non' description="Les contrôles d'accès au partage print$ sont gérés par les ACL" > + <value>non</value> + </variable> + <variable name='smb_spoolss_x64' type='oui/non' description='Annoncer Spoolss comme architecture x64' mode='expert'> + <value>non</value> + </variable> + <variable name='home_path' type='filename' description='Chemin de base vers les dossiers personnels' hidden='True'> + <value>/home</value> + </variable> + <!-- ajouter un partage SMB --> + <variable name='smb_activer_partages' type='oui/non' description="Activer des partages supplémentaires" mode='expert'> + <value>non</value> + </variable> + <variable name='smb_partage_nom' type='string' description='Nom du partage' multi='True' mandatory='True' mode='expert'/> + + <variable name='smb_partage_path' type='filename' description='Nom absolu du répertoire à partager' mandatory='True' mode='expert'/> + + <variable name='smb_partage_visibilite' type='oui/non' description='Visibilité du partage' mode='expert'> + <value>non</value> + </variable> + + <variable name='smb_partage_ecriture' type='oui/non' description='Partage en lecture/écriture' mode='expert'> + <value>non</value> + </variable> + <variable name='smb_admin_users' type='string' description="Utilisateurs ayant des privilèges d'administration sur tous les partages" mode='expert' multi='True' hidden='True'> + <value>@DomainAdmins</value> + </variable> + <variable name='smb_lanman_auth' type='yes/no' description="Authentification LanManager" mode='expert'> + <value>yes</value> + </variable> + <variable name='smb_nt_acl_support' type='yes/no' description='Support NT ACL' mode='expert'> + <value>yes</value> + </variable> + <variable name='activer_regles_filtrage_port_source' type='oui/non' description="Autoriser l'ouverture de flux à partir d'un port source " mode='expert'> + <value>non</value> + </variable> + <variable name='fw_rule_port' type='number' description="Port source à partir duquel les flux sont autorisés" multi='True' mandatory='True'> + <value>137</value> + </variable> + <variable name='fw_rule_protocole' type='string' description="Protocole udp/tcp pour lequel les flux sont autorisés" mandatory='True'> + <value>udp</value> + </variable> + <variable name='fw_rule_int' type='string' description="Interface sur laquelle les flux sont autorisés" mandatory='True'> + <value>0</value> + </variable> + + <!-- variables pour sysctl.conf #5256 --> + <variable name='fs_inotify_max_user_instances' type='number' description="Nombre maximum d'instances inotify pour un UID réel" mode='expert'> + <value>128</value> + </variable> + <variable name='fs_inotify_max_user_watches' type='number' description='Nombre maximum de surveillants associés à une instance inotify' mode='expert'> + <value>8192</value> + </variable> + <variable name='fs_inotify_max_queued_events' type='number' description="Nombre maximum d'événements mis en file d'attente dans une instance inotify" mode='expert'> + <value>16384</value> + </variable> + <variable name='smb_usershare_max_shares' type='number' description="Nombre maximum de partage utilisateurs" mode='expert'/> + <variable name='smb_socket_options' type='string' description="Optimisations réseau" mode='expert'/> + </family> + + <family name='réseau avancé'> + <variable name="restrict_ping_request" redefine="True"> + <value>non</value> + </variable> + </family> + + <separators> + <separator name="adresse_ip_fichier_link">Adresse pour le serveur de fichier</separator> + <separator name="activer_regles_filtrage_port_source">Autoriser l'ouverture de flux à partir d'un port source</separator> + <separator name='fs_inotify_max_user_instances'>Paramètres système</separator> + </separators> + + </variables> + + <constraints> + + <!-- Anti-virus temps réél --> + <condition name='disabled_if_in' source='activer_clam'> + <param>non</param> + <target type='servicelist'>antivirus_samba</target> + <target type='filelist'>antivirus_samba</target> + </condition> + <condition name='disabled_if_in' source='smb_vscan'> + <param>non</param> + <target type='servicelist'>antivirus_samba</target> + <target type='filelist'>antivirus_samba</target> + <target>clam_purge</target> + </condition> + <!--attention, redefini dans 50_amonecole--> + <check name="valid_in_network" target="adresse_ip_fichier_link" level="warning"> + <param type='eole' hidden="False">adresse_network_eth0</param> + <param type='eole' hidden="False">adresse_netmask_eth0</param> + </check> + <check name="valid_differ" target="adresse_ip_fichier_link"> + <param type='eole' hidden="False">adresse_ip_eth0</param> + </check> + <check name="valid_differ" target="adresse_ip_fichier_link"> + <param type='eole' optional='True'>adresse_ip_eth0_proxy_link</param> + </check> + <condition name='disabled_if_in' source='mode_conteneur_actif'> + <param>non</param> + <target>adresse_ip_fichier_link</target> + <target>adresse_bcast_fichier_link</target> + <target>adresse_mask_fichier_link</target> + </condition> + <fill name='calc_val' target='adresse_mask_fichier_link'> + <param type='eole' name='valeur'>adresse_netmask_eth0</param> + </fill> + <check name="valid_enum" target="fw_rule_protocole"> + <param>['tcp','udp']</param> + </check> + <check name="valid_enum" target="fw_rule_int"> + <param>['0','1','2','3','4']</param> + </check> + <auto name='calc_broadcast' target='adresse_bcast_fichier_link'> + <param type='eole' name='ip'>adresse_ip_fichier_link</param> + <param type='eole' name='netmask'>adresse_mask_fichier_link</param> + </auto> + + <condition name='disabled_if_in' source='smb_activer_hide_files'> + <param>non</param> + <target type='variable'>smb_hide_files</target> + </condition> + <condition name='disabled_if_in' source='smb_trash'> + <param>non</param> + <target type='variable'>smb_trash_purge</target> + <target type='variable'>smb_trash_dir</target> + <target type='filelist'>smb_trash</target> + </condition> + + <condition name='disabled_if_in' source='smb_quotawarn'> + <param>non</param> + <target type='filelist'>smb_quotawarn</target> + </condition> + + <fill name='calc_val' target='smb_server_string'> + <param type='eole' name='valeur'>libelle_etab</param> + </fill> + <!-- smb_netbios_name != nom_machine pour mode conteneur (#2662) --> + <!--<fill name='calc_val' target='smb_netbios_name'> + <param type='eole' name='valeur'>nom_machine</param> + </fill>--> + <check name='valid_differ' target='smb_workgroup'> + <param type='eole'>smb_netbios_name</param> + </check> + <check name='valid_enum' target='smb_name_resolve_order'> + <param>['wins hosts bcast lmhosts', 'bcast wins hosts lmhosts', 'wins bcast hosts lmhosts']</param> + <param name='checkval'>False</param> + </check> + <condition name='disabled_if_in' source='activer_regles_filtrage_port_source'> + <param>non</param> + <target type='variable'>fw_rule_port</target> + <target type='variable'>fw_rule_protocole</target> + <target type='variable'>fw_rule_int</target> + </condition> + <group master='fw_rule_port'> + <slave>fw_rule_protocole</slave> + <slave>fw_rule_int</slave> + </group> + + <!-- ajouter un partage SMB --> + <condition name='disabled_if_in' source='smb_activer_partages'> + <param>non</param> + <target type='variable'>smb_partage_nom</target> + <target type='variable'>smb_partage_path</target> + <target type='variable'>smb_partage_visibilite</target> + <target type='variable'>smb_partage_ecriture</target> + </condition> + <condition name='disabled_if_in' source='smb_wins_support'> + <param>yes</param> + <target type='variable'>smb_wins_server</target> + </condition> + <group master='smb_partage_nom'> + <slave>smb_partage_path</slave> + <slave>smb_partage_visibilite</slave> + <slave>smb_partage_ecriture</slave> + </group> + <check name='valid_enum' target='smb_max_proto'> + <param>['NT1', 'SMB2', 'SMB3', 'default']</param> + <param name='checkval'>False</param> + </check> + </constraints> + + <help> + <family name='samba'>Configuration du serveur de fichier Samba</family> + <variable name='adresse_ip_fichier_link'>Adresse IP supplémentaire sur cette interface réseau, utilisée pour accèder aux serveurs de fichiers. Le serveur aura donc plusieurs adresses IP sur le réseau local</variable> + <!-- l'aide de la variable smb_netbios_name dépend du module installé (#11428) --> + <!--<variable name='smb_netbios_name'>Nom DNS du contrôleur de domaine. +En mode conteneur, il doit être différent de celui du serveur Linux EOLE</variable>--> + <variable name='smb_workgroup'>Nom du domaine (workgroup) Samba</variable> + <variable name='smb_usershare_max_shares'>Nombre maximum de partages pouvant être définis par l'utilisateur</variable> + <variable name='smb_spoolss_x64'>Spoolss est le service d'impression de Samba</variable> + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/dictionaries/20_nscd.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/dictionaries/20_nscd.xml new file mode 100644 index 0000000000000000000000000000000000000000..6d4441e4172256d60a87e09dcc6e5632f93f78bb --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/dictionaries/20_nscd.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + <files> + </files> + <containers> + <container name='fichier'> + <file filelist='nscd_files' name='/etc/nscd.conf'/> + <service servicelist='nscd_service'>nscd</service> + </container> + </containers> + <variables> + <family name='nscd' mode='expert' icon='retweet'> + <variable name='nscd_passwd_enabled_cache' type='yes/no' description="Activer le cache NSCD pour passwd"> + <value>no</value> + </variable> + <variable name='nscd_group_negative_time_to_live' type='number' description="Durée de vie du cache pour les groupes inexistants"> + <value>0</value> + </variable> + <variable name='nscd_group_persistent' type='yes/no' description="Activer la persistance pour les groupes"> + <value>no</value> + </variable> + </family> + </variables> + <constraints> + </constraints> + <help> + <family name='nscd'>Paramétrage de la mise en cache des données LDAP</family> + <variable name='nscd_group_negative_time_to_live'>Durée de vie en secondes</variable> + </help> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/extra_dictionaries/schedule/01_fichier.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/extra_dictionaries/schedule/01_fichier.xml new file mode 100644 index 0000000000000000000000000000000000000000..269a342eab708d98844d6af098f3cf8e1356caf7 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/extra_dictionaries/schedule/01_fichier.xml @@ -0,0 +1,78 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <variables> + <family name="fichier" description="Exportation des quotas et du SID Samba"> + <variable name="description" type="string" hidden="True"> + <value>Exportation des quotas et du SID Samba</value> + </variable> + <variable name="day" type="schedule" description="Périodicité d'exécution"> + <value>daily</value> + </variable> + <variable name="mode" type="schedulemod" hidden="True"> + <value>pre</value> + </variable> + </family> + <family name="scannedonly"> + <variable name="description" type="string" hidden="True"> + <value>Nettoyage des virus mis en quarantaine</value> + </variable> + <variable name="day" type="schedule" description="Périodicité d'exécution"> + <value>daily</value> + </variable> + <variable name="mode" type="schedulemod" hidden="True"> + <value>post</value> + </variable> + </family> + <family name="smbtrash" description="Purge des corbeilles Samba"> + <variable name="description" type="string" hidden="True"> + <value>Purge des corbeilles Samba</value> + </variable> + <variable name="day" type="schedule" description="Périodicité d'exécution"> + <value>daily</value> + </variable> + <variable name="mode" type="schedulemod" hidden="True"> + <value>post</value> + </variable> + </family> + <family name='warnquota'> + <variable name="description" type="string" hidden="True"> + <value>Envoi des courriels liés aux dépassement de quotas</value> + </variable> + <variable name="day" type="schedule" description="Périodicité d'exécution"> + <value>daily</value> + </variable> + <variable name="mode" type="schedulemod" hidden="True"> + <value>post</value> + </variable> + </family> + <family name="tdbbackup" description="Vérification de l'intégrité des caches Samba"> + <variable name="description" type="string" hidden="True"> + <value>Vérification de l'intégrité des caches Samba</value> + </variable> + <variable name="day" type="schedule" description="Périodicité d'exécution"> + <value>daily</value> + </variable> + <variable name="mode" type="schedulemod" hidden="True"> + <value>post</value> + </variable> + </family> + </variables> + + <constraints> + <condition name='disabled_if_in' source='smb_vscan'> + <param>non</param> + <target type='family'>schedule.scannedonly</target> + </condition> + <condition name='disabled_if_in' source='smb_trash'> + <param>non</param> + <target type='family'>schedule.smbtrash</target> + </condition> + <condition name='disabled_if_in' source='smb_quotawarn'> + <param>non</param> + <target type='family'>schedule.warnquota</target> + </condition> + </constraints> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/files/usr/share/ead2/backend/config/actions/actions_fichier.cfg b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/files/usr/share/ead2/backend/config/actions/actions_fichier.cfg new file mode 100644 index 0000000000000000000000000000000000000000..8c4ea0684b4c7283126821051cf0b8550ec2bc01 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/files/usr/share/ead2/backend/config/actions/actions_fichier.cfg @@ -0,0 +1 @@ +acls diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/files/usr/share/ead2/backend/config/perms/perm_fichier.ini b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/files/usr/share/ead2/backend/config/perms/perm_fichier.ini new file mode 100644 index 0000000000000000000000000000000000000000..f6e0fd8c8c0429779cff0c286d6823392ea9682d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/files/usr/share/ead2/backend/config/perms/perm_fichier.ini @@ -0,0 +1,6 @@ +[roles] +admin=Administrateur + +[permissions] +acls=admin +acls_editor=admin diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/files/usr/share/eole/bareos/restore/quota.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/files/usr/share/eole/bareos/restore/quota.py new file mode 100644 index 0000000000000000000000000000000000000000..b3085f9a1e5a665eda416ffe6b9377a22922e812 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/files/usr/share/eole/bareos/restore/quota.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python +"""Module quota""" +from pyeole.process import system_code +from pyeole.bareosrestore import bareos_restore_one_file, exit_if_running_jobs +from fichier.quota import set_quota + +quotafile = "/home/backup/samba/sauv_quota.txt" + +def execute(option, opt_str, value, parser, jobid, test_jobs=True): + """ldap helper""" + if len(parser.rargs) > 0: + option = parser.rargs[0] + if option == 'pre': + pre() + elif option == 'post': + post() + else: + if test_jobs: + exit_if_running_jobs() + job(jobid) + +def pre(): + print "pre quota" + +def post(): + print "post quota" + fp = file(quotafile, 'r') + started = False + for ligne in fp.readlines(): + if not started: + if ligne.startswith('------------'): + started = True + continue + # cas plusieurs partitions + if ligne.startswith('***'): + started = False + continue + elts = ligne.strip().split() + try: + user = elts[0] + quota = elts[3] + except: + continue + if quota != '0': + set_quota(user, int(quota)/1024) + fp.close() + +def job(jobid): + print "Restauration quota" + bareos_restore_one_file(quotafile, jobid) + +priority=40 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/files/usr/share/eole/diagnose/151-fichier b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/files/usr/share/eole/diagnose/151-fichier new file mode 100644 index 0000000000000000000000000000000000000000..32718404eafe4ffb95450aaedd612abdec27eb0f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/files/usr/share/eole/diagnose/151-fichier @@ -0,0 +1,103 @@ +#!/bin/bash +. /usr/lib/eole/diagnose.sh + +winbind_err="/var/log/rsyslog/local/winbindd/winbindd.err.log" +smbd_err="/var/log/rsyslog/local/smbd/smbd.err.log" +eolead=$(CreoleGet activer_ad non) + +EchoGras "*** Serveur de fichiers" +echo +echo "Test du fichier de configuration :" +printf ". %${len_pf}s => " "Syntaxe" +CreoleRun "testparm -s >/dev/null 2>&1" fichier +[[ $? -eq 0 ]] && EchoVert "Ok" || EchoRouge "Erreur" +echo + +if [[ "$(CreoleGet activer_winbind 'non')" == "oui" ]] +then + echo "Statut du service winbindd :" + printf ". %${len_pf}s => " "Service winbindd" + wbinfo -p >/dev/null 2>&1 + if [[ $? -eq 0 ]] + then + EchoVert "Ok" + else + EchoRouge "Erreur" + fi + printf ". %${len_pf}s => " "uid/gid disponibles" + if [[ -e $winbind_err ]] + then + [[ -z $(awk '/range full/ {print "erreur"}' $winbind_err) ]] && EchoVert "Ok" || EchoRouge "Erreur" + else + EchoOrange "N/A" + fi + printf ". %${len_pf}s => " "Etat du cache" + if [[ -e $winbind_err ]] + then + [[ -z $(awk '/(bad magic)|(beyond eof)/ {print "erreur"}' $winbind_err) ]] && EchoVert "Ok" || EchoRouge "Erreur" + else + EchoOrange "N/A" + fi + echo +fi + +# FIXME #25500 Shares test +#echo "Partages :" +#printf ". %${len_pf}s => " "Partage (SMB/TCP)" +#CreoleRun "smbclient -L localhost -U=admin% > /dev/null 2>&1" fichier +#[ $? = 0 ] && EchoVert "Ok" || EchoRouge "Erreur" + +printf ". %${len_pf}s => " "Partage (NMB/UDP)" +if [ $eolead == "oui" ]; then + workgroup=$(CreoleGet ad_workgroup) +else + workgroup=$(CreoleGet smb_workgroup) +fi +CreoleRun "nmblookup -U 127.0.0.1 $workgroup |grep -q 'name_query failed to find name '" fichier +[ $? = 1 ] && EchoVert "Ok" || EchoRouge "Erreur" + +printf ". %${len_pf}s => " "Connexions samba" +EchoVert `/usr/share/eole/sbin/connexions.sh` + +# test non fonctionnel, cf. #12910 +#printf ". %${len_pf}s => " "Encodage des noms de fichier" +#if [[ -e $smbd_err ]] +#then +# [[ -z $(awk '/Conversion error/ {print "erreur"}' $smbd_err 2>/dev/null) ]] && EchoVert "Ok" || EchoRouge "Erreur" +#else +# EchoOrange "N/A" +#fi +echo + +if [ $(CreoleGet smb_activer_partages) == "oui" ]; then + set_title=0 + for dirname in $(CreoleGet smb_partage_path); do + [ -d $dirname ] && continue + if [ $set_title = 0 ]; then + echo "Répertoires de partage supplémentaire inexistants" + set_title=1 + fi + EchoRouge "- $dirname" + done + [ $set_title = 1 ] && echo +fi + +# Test spécifique aux modules MEN (#12823) +if [[ -f /usr/share/eole/creole/dicos/29_scribehorus.xml ]] && [[ $eolead != 'oui' ]] +then + SID=`$CHROOT ldapsearch -x sambaDomainName=* sambaSID 2>/dev/null | grep ^sambaSID | awk -F ' ' '{print $2}'` + echo $SID | grep -q ' ' + if [ $? -eq 0 ];then + EchoOrange "ATTENTION : plusieurs sambaDomainName détectés !" + EchoOrange "Des dysfonctionnements sont possibles sur ce serveur" + echo + fi +fi +ls /home/netlogon/profil*/ntuser.dat &> /dev/null +if [ $? -eq 0 ];then + EchoOrange "ATTENTION : fichier ntuser.dat présent dans un profil obligatoire !" + EchoOrange "Des dysfonctionnements sont possibles sur ce serveur" + echo +fi + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/files/usr/share/eole/diagnose/151-fichier-netbios_wins b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/files/usr/share/eole/diagnose/151-fichier-netbios_wins new file mode 100644 index 0000000000000000000000000000000000000000..4569ff7af75788771dfe7b413b6a26aa3258676f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/files/usr/share/eole/diagnose/151-fichier-netbios_wins @@ -0,0 +1,69 @@ +#!/bin/bash + +########################################### +# Résolution de noms et remontées des WINS +# +. /usr/lib/eole/diagnose.sh + +if [ $(CreoleGet activer_ad non) == "oui" ]; then + nom_domaine=$(CreoleGet ad_workgroup) +else + nom_domaine=$(CreoleGet smb_workgroup) +fi +wins_servers=$(CreoleGet smb_wins_server "") +broadcast_eth0=$(CreoleGet adresse_broadcast_eth0) +share_container="fichier" + +EchoGras "*** Vérification de la résolution de nom netbios :" +echo +if [ -n "$wins_servers" ] +then + printf ". %${len_pf}s => " "Serveurs WINS" + echo $wins_servers + echo + echo "PDC du domaine $nom_domaine via broadcast :" + printf ". %${len_pf}s => " "IP" + cmd="nmblookup -B $broadcast_eth0 $nom_domaine#1B" + res=$(CreoleRun "${cmd}" fichier | awk '/<1b>/ { print $1}') + echo "${res}" + echo + echo "PDC via serveur WINS :" + echo + for wins in ${wins_servers} + do + printf ". %${len_pf}s => " "WINS $wins" + cmd="nmblookup -R -U $wins $nom_domaine#1B" + res=$(CreoleRun "${cmd}" ${share_container} | awk '/1b/ {if (match($1, /name_query/)) {print "Erreur"} else {print $1}}') + [[ "$res" != "Erreur" ]] && echo "$res" || EchoRouge $res + done + echo + echo "BDC du domaine $nom_domaine via broadcast :" + printf ". %${len_pf}s => " "IP" + echo $(nmblookup -B $broadcast_eth0 $nom_domaine#1C | awk '/<1c>/ { print $1}') + echo + echo "BDC via serveur WINS :" + for wins in ${wins_servers} + do + printf ". %${len_pf}s => " "WINS $wins" + cmd="nmblookup -R -U $wins $nom_domaine#1C" + res=$(CreoleRun "${cmd}" ${share_container} | awk '/1c/ {if (match($1, /name_query/)) {print "Erreur"} else {print $1}}') + [[ "$res" != "Erreur" ]] && echo $res || EchoRouge $res + done + echo +#else +# EchoOrange "Aucun serveur WINS" +fi +echo "Maître explorateur du domaine $nom_domaine:" + +printf ". %${len_pf}s => " "IP" +cmd="nmblookup -S $nom_domaine#1D" +res=$(CreoleRun "${cmd}" ${share_container}) +if [[ ${res} == *failed* ]] +then + EchoRouge "Erreur" +else + echo ${res} | awk '/1d/ {print $1}' +fi +echo + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/files/usr/share/eole/sbin/connexions.sh b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/files/usr/share/eole/sbin/connexions.sh new file mode 100644 index 0000000000000000000000000000000000000000..cf55f3360a6d4e61d53a2f458e621f712a2beb30 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/files/usr/share/eole/sbin/connexions.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +# on ignore les connexions venant de l'amon (ntlm) +CreoleRun "net status sessions" fichier | grep "(" | grep -v "($(CreoleGet adresse_ip_gw))" |wc -l diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/files/usr/share/eole/schedule/scripts/fichier b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/files/usr/share/eole/schedule/scripts/fichier new file mode 100644 index 0000000000000000000000000000000000000000..7f73461198f678e702bc636dd1b14b77f4c99b6a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/files/usr/share/eole/schedule/scripts/fichier @@ -0,0 +1,14 @@ +#!/bin/bash + +DESC="Exportation des quotas et du SID Samba" + +. /usr/share/eole/schedule/config.sh + +SAMBASAVDIR=$SAVDIR/samba +QUOTASAVFILE=$SAMBASAVDIR/sauv_quota.txt +SIDSAVEFILE=$SAMBASAVDIR/sauv_samba_SID + +mkdir -p $SAMBASAVDIR + +CreoleRun "/usr/sbin/repquota -a" fichier > $QUOTASAVFILE +CreoleRun "net getlocalsid | awk -F': ' '{print $2}'" fichier > $SIDSAVEFILE diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/files/usr/share/eole/schedule/scripts/scannedonly b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/files/usr/share/eole/schedule/scripts/scannedonly new file mode 100644 index 0000000000000000000000000000000000000000..9850d27fa3a9c382b40beff68c7de3daffdadaa6 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/files/usr/share/eole/schedule/scripts/scannedonly @@ -0,0 +1,5 @@ +#!/bin/bash +DESC="Nettoyage des virus mis en quarantaine" +if [ $(CreoleGet smb_vscan non) = 'oui' ];then + find /$(CreoleGet home_path) -name '.virus:*' -ctime +$(CreoleGet clam_purge) -delete &>/dev/null +fi diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/files/usr/share/eole/schedule/scripts/smbtrash b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/files/usr/share/eole/schedule/scripts/smbtrash new file mode 100644 index 0000000000000000000000000000000000000000..2ed733e0d50be7085690e2ab8e0f0d96e0fc5215 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/files/usr/share/eole/schedule/scripts/smbtrash @@ -0,0 +1,10 @@ +#!/bin/bash +if [ $(CreoleGet smb_trash non) = 'oui' ];then + dirname=$(basename $(CreoleGet smb_trash_dir)) + safe_dirname=$(echo "$dirname" |sed -e 's/\./\\./g') + home_path=$(CreoleGet home_path) + smb_trash_purge=$(CreoleGet smb_trash_purge) + #suppression de tous de type de fichier non répertoire puis suppression des répertoires vides #4727 + find /$home_path ! -type d -ctime +$smb_trash_purge -path "*/$safe_dirname/*" -delete &>/dev/null + find /$home_path -type d -empty -ctime +$smb_trash_purge -path "*/$safe_dirname/*" -delete &>/dev/null +fi diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/files/usr/share/eole/schedule/scripts/tdbbackup b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/files/usr/share/eole/schedule/scripts/tdbbackup new file mode 100644 index 0000000000000000000000000000000000000000..6ab040f7c9a10b283acd0385dce3eb1cf5edaa50 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/files/usr/share/eole/schedule/scripts/tdbbackup @@ -0,0 +1,4 @@ +#!/bin/bash + +CreoleRun "/usr/bin/tdbbackup /var/cache/samba/*.tdb /var/lib/samba/*.tdb >> /var/log/samba/tdbbackup.log" fichier +CreoleRun "/usr/bin/tdbbackup -v /var/cache/samba/*.tdb /var/lib/samba/*.tdb >> /var/log/samba/tdbbackup.log" fichier diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/files/usr/share/eole/schedule/scripts/warnquota b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/files/usr/share/eole/schedule/scripts/warnquota new file mode 100644 index 0000000000000000000000000000000000000000..a012aac78a5f47865f51c23ed994ee8f258fa58f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/files/usr/share/eole/schedule/scripts/warnquota @@ -0,0 +1,3 @@ +#!/bin/bash + +/usr/sbin/warnquota -u -s &>/dev/null diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/files/usr/share/zephir/monitor/configs/samba3.agent b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/files/usr/share/zephir/monitor/configs/samba3.agent new file mode 100644 index 0000000000000000000000000000000000000000..fab48cae4055fda3d5cf82ae539049b805465381 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/files/usr/share/zephir/monitor/configs/samba3.agent @@ -0,0 +1,42 @@ +# -*- coding: UTF-8 -*- +""" +Connexions +""" + +from zephir.monitor.agents.samba3 import SmbUsers + +# périodicité des mesures (secondes) +period=120 + +conn = SmbUsers( + "conn", period=period, + description = """Connexions Samba""", + section="""Utilisation""", + datasources = [{'name': "connected", 'min_bound': 0, 'max_bound': 300}], + + # sur 2 heures => toutes les 2 minutes + # sur 24 heures => toutes les 15 minutes + # semaine => toutes les heures + archives = [{'rows':120, 'steps':1}, + {'rows':24*4, 'steps':900/period}, + {'rows':24*7, 'steps':3600/period}, + ], + graphs = [ + { 'pngname': "connected-hour.png", + 'vnamedefs': {"pan": ("connected", 'AVERAGE')}, + 'options': ["-l0", "-s end-2hour", "-e now", "-t Connexions sur 2 heures", + "AREA:pan#FF8C00"] }, + { 'pngname': "connected-day.png", + 'vnamedefs': {"pan": ("connected", 'AVERAGE')}, + 'options': ["-l0", "-s end-1day", "-e now", "-t Connexions sur 24 heures", + "AREA:pan#7CFC00"] }, + { 'pngname': "connected-week.png", + 'vnamedefs': {"pan": ("connected", 'AVERAGE')}, + 'options': ["-l0", "-s end-7day", "-e now", "-t Connexions sur 7 jours", + "AREA:pan#7CFC00"] } + ], + requires = ['smb'] + ) + +AGENTS = [conn] + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/files/usr/share/zephir/monitor/configs/services/21_smb.srv b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/files/usr/share/zephir/monitor/configs/services/21_smb.srv new file mode 100644 index 0000000000000000000000000000000000000000..51d05d7a02c23dcebed95441b696fd6e81d332e1 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/files/usr/share/zephir/monitor/configs/services/21_smb.srv @@ -0,0 +1,12 @@ +# -*- coding: UTF-8 -*- +""" +Surveillance du service Samba +""" + +from zephir.monitor.agents.services import TCPServices +from zephir.monitor.agentmanager.config import ADRESSE_IP_FICHIER + +test = '%s:139' % ADRESSE_IP_FICHIER +data = {test: "Serveur de fichiers (SMB)"} +AGENTS.append(TCPServices('smb', data, period=115, + description='Etat du serveur de fichiers (SMB)')) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/files/usr/share/zephir/monitor/configs/virus.agent b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/files/usr/share/zephir/monitor/configs/virus.agent new file mode 100644 index 0000000000000000000000000000000000000000..6be30d1522ffee0d25d3ba96c8b72f8a87f92609 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/files/usr/share/zephir/monitor/configs/virus.agent @@ -0,0 +1,17 @@ +# -*- coding: UTF-8 -*- +""" +Antivirus temps réél +""" +from zephir.monitor.agentmanager.config import SMB_VSCAN + + +if SMB_VSCAN: + from zephir.monitor.agents.clamav import ClamLog + vir = ClamLog("vir", + period = 240, + description = """Détection de virus""", + section="""Utilisation""", + ) + AGENTS = [vir] +else: + AGENTS = [] diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/pretemplates/00-fix-home-fstab b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/pretemplates/00-fix-home-fstab new file mode 100644 index 0000000000000000000000000000000000000000..7d993beb1df14a1b173b060eb70b3e1316c4beb6 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/pretemplates/00-fix-home-fstab @@ -0,0 +1,131 @@ +#! /usr/bin/env python +# -*- coding: utf-8 -*- + +"""Check and fix /home fstab entry + +""" + +import os +import sys +from pyeole.process import system_out + +fstab = '/etc/fstab' +fb = file(fstab, 'r').readlines() +home_options = ['usrquota', 'grpquota'] + + +def add_fstab_options(mountpoint, options=None): + """Add options to fstab entry + """ + if options is None: + raise ValueError(u"Missing options to add to fstab entry.") + + if not isinstance(options, list): + new_options = set([options]) + else: + new_options = set(options) + + for i in range(len(fb)): + ligne = fb[i] + if testligne(ligne, mountpoint): + old_string_options = ligne.split()[3] + old_options = set(old_string_options.split(',')) + added_options = new_options - old_options + if len(added_options) == 0: + return True + if 'defaults' in old_options: + # Put default in front + updated_options = ['defaults'] + old_options.remove('defaults') + else: + updated_options = [] + updated_options.extend(sorted(list(old_options | new_options))) + updated_string_options = ",".join(updated_options) + fb[i] = ligne.replace(old_string_options, updated_string_options) + message_string = u"Option{0} {1} ajoutée{0} à '{2}'".encode('utf-8') + if len(added_options) > 1: + plural = 's' + else: + plural = '' + print(message_string.format(plural, + ",".join(new_options - old_options), + mountpoint)) + ecrire() + remount(mountpoint) + start_quota() + return True + return False + + +def remount(mountpoint): + os.system('/bin/mount -o remount %s' % mountpoint) + + +def start_quota(): + """ + Start quota service + """ + os.system('service quota start') + +def enable_quota(): + """ + Enable quota on call + """ + os.system('quotacheck -aug') + #le service ne doit pas être en erreur + os.system('systemctl reset-failed quotaon.service 2>/dev/null') + os.system('quotaon -aug') + +def check_quota(): + """ + Check quota if they are disabled during "instance" time + """ + cmd = ['quotaon','-pa'] + eni = {"LC_ALL": "C", "LANG": 'C', "PATH": '/sbin'} + code, out, err = system_out(cmd, env=eni) + status = out.strip().split('\n') + for elm in status: + if not elm.endswith('on'): + return False + return True + +def testligne(line, mountpoint): + """ + recherche du point de montage "motif" + """ + if line.startswith('#'): + return False + try: + items = line.split() + return items[1] == mountpoint + except: + return False + + +def ecrire(): + """ + Write fstab file + """ + fh = file(fstab, 'w') + for i in fb: + fh.write(i) + fh.close() + +def main(): + """ + Main program, call fstab modification and quota enable. + """ + #seulement à l'instance + if sys.argv[-1] != 'instance': + sys.exit(0) + + if not add_fstab_options('/home', home_options): + add_fstab_options('/', home_options) + + if not check_quota(): + enable_quota() + + +if __name__ == "__main__": + main() + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..233db57d82edb094ef69d9a03dade6e0839077ea --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/service.yml @@ -0,0 +1,96 @@ +format: '0.1' +name: eole-fichier-common +version: |- + 2.7.1-2 +description: |- + Templates et dictionnaires pour serveur de fichier EOLE + Templates et dictionnaires communs à + fichier-primaire et fichier-membre + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: + - eole-antivirus +packages: + - quota + - acl +dictionaries: + - 20_fichier.xml + - 20_nscd.xml +extra_dictionaries: + schedule: + - 01_fichier.xml +templates: + - 80-eole_fichier_rules + - bareos-fichier.conf + - login + - nscd.conf + - recycle.conf + - samba.logrotate + - smb.conf + - warnquota.conf +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: + - 00-fix-home-fstab +posttemplates: [] +files: + /usr/share/ead2/backend/config/actions/actions_fichier.cfg: + owner: root + group: root + mode: '0644' + /usr/share/ead2/backend/config/perms/perm_fichier.ini: + owner: root + group: root + mode: '0644' + /usr/share/eole/bareos/restore/quota.py: + owner: root + group: root + mode: '0644' + /usr/share/eole/diagnose/151-fichier: + owner: root + group: root + mode: '0755' + /usr/share/eole/diagnose/151-fichier-netbios_wins: + owner: root + group: root + mode: '0755' + /usr/share/eole/sbin/connexions.sh: + owner: root + group: root + mode: '0755' + /usr/share/eole/schedule/scripts/fichier: + owner: root + group: root + mode: '0755' + /usr/share/eole/schedule/scripts/scannedonly: + owner: root + group: root + mode: '0755' + /usr/share/eole/schedule/scripts/smbtrash: + owner: root + group: root + mode: '0755' + /usr/share/eole/schedule/scripts/tdbbackup: + owner: root + group: root + mode: '0755' + /usr/share/eole/schedule/scripts/warnquota: + owner: root + group: root + mode: '0755' + /usr/share/zephir/monitor/configs/samba3.agent: + owner: root + group: root + mode: '0644' + /usr/share/zephir/monitor/configs/services/21_smb.srv: + owner: root + group: root + mode: '0644' + /usr/share/zephir/monitor/configs/virus.agent: + owner: root + group: root + mode: '0644' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/templates/80-eole_fichier_rules b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/templates/80-eole_fichier_rules new file mode 100644 index 0000000000000000000000000000000000000000..a8243bd6d91a875f22f73d2aa0b9e05b77f150c8 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/templates/80-eole_fichier_rules @@ -0,0 +1,10 @@ +#!/bin/bash +# + +%if %%activer_regles_filtrage_port_source == 'oui' +%for %%port_source in %%fw_rule_port +# ouvre le port %%port_source en sortie pour le protocole %%port_source.fw_rule_protocole +/sbin/iptables -I eth%%port_source.fw_rule_int-root -i %%getVar('nom_zone_eth' + %%port_source.fw_rule_int) --protocol %%port_source.fw_rule_protocole --sport %%port_source -j ACCEPT + +%end for +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/templates/bareos-fichier.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/templates/bareos-fichier.conf new file mode 100644 index 0000000000000000000000000000000000000000..c1015c7aae1ef370ef2b38d54b73743833047f1f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/templates/bareos-fichier.conf @@ -0,0 +1,30 @@ +Include { + Options { + wildfile = "*/.virus:*" + wildfile = "*/.scanned:*" +%if %%is_defined("smb_trash_dir") + wilddir = "*/%%smb_trash_dir" +%end if + exclude = yes + } + Options { + aclsupport = yes + xattrsupport = yes + @/etc/bareos/include-options.conf + } + File = /home +} +Include { + Options { + aclsupport = no + @/etc/bareos/include-options.conf + } + File = /usr/share/eole/fichier/models/ +} + +Exclude { + File = %%home_path/aquota.group + File = %%home_path/aquota.user + File = %%home_path/recyclage + File = %%home_path/backup +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/templates/login b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/templates/login new file mode 100644 index 0000000000000000000000000000000000000000..ce5442b29cd4f378189b56e75f18efa3720121c3 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/templates/login @@ -0,0 +1,19 @@ +#%PAM-1.0 +######################################################## +## login pour EOLE 2.4 +# +## Equipe Eole eole@ac-dijon.fr +# +## 19/03/2013 +######################################################## +auth required pam_securetty.so +auth required pam_nologin.so +#auth sufficient pam_ldap.so +auth required pam_unix.so try_first_pass +account sufficient pam_ldap.so +account required pam_unix.so +password required pam_ldap.so +session optional pam_motd.so motd=/run/motd.dynamic noupdate +session optional pam_motd.so # [1] +session sufficient pam_ldap.so +session required pam_unix.so diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/templates/nscd.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/templates/nscd.conf new file mode 100644 index 0000000000000000000000000000000000000000..22138bb89b4ba6e2ca0d9e5dffac342cfe3b4dcf --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/templates/nscd.conf @@ -0,0 +1,81 @@ +# +# /etc/nscd.conf +# +# An example Name Service Cache config file. This file is needed by nscd. +# +# Legal entries are: +# +# logfile <file> +# debug-level <level> +# threads <initial #threads to use> +# max-threads <maximum #threads to use> +# server-user <user to run server as instead of root> +# server-user is ignored if nscd is started with -S parameters +# stat-user <user who is allowed to request statistics> +# reload-count unlimited|<number> +# paranoia <yes|no> +# restart-interval <time in seconds> +# +# enable-cache <service> <yes|no> +# positive-time-to-live <service> <time in seconds> +# negative-time-to-live <service> <time in seconds> +# suggested-size <service> <prime number> +# check-files <service> <yes|no> +# persistent <service> <yes|no> +# shared <service> <yes|no> +# max-db-size <service> <number bytes> +# auto-propagate <service> <yes|no> +# +# Currently supported cache names (services): passwd, group, hosts, services +# + + +# logfile /var/log/nscd.log +# threads 6 +# max-threads 128 +# server-user nobody +# stat-user somebody + debug-level 0 +# reload-count 5 + paranoia no +# restart-interval 3600 + + enable-cache passwd %%nscd_passwd_enabled_cache + positive-time-to-live passwd 7200 + negative-time-to-live passwd 20 + suggested-size passwd 4001 + check-files passwd yes + persistent passwd yes + shared passwd yes + max-db-size passwd 33554432 + auto-propagate passwd yes + + enable-cache group yes + positive-time-to-live group 7200 + negative-time-to-live group %%nscd_group_negative_time_to_live + suggested-size group 4001 + check-files group yes + persistent group %%nscd_group_persistent + shared group yes + max-db-size group 33554432 + auto-propagate group yes + +# hosts caching is broken with gethostby* calls, hence is now disabled +# per default. See /usr/share/doc/nscd/NEWS.Debian. + enable-cache hosts no + positive-time-to-live hosts 3600 + negative-time-to-live hosts 20 + suggested-size hosts 211 + check-files hosts yes + persistent hosts no + shared hosts yes + max-db-size hosts 33554432 + + enable-cache services yes + positive-time-to-live services 28800 + negative-time-to-live services 20 + suggested-size services 211 + check-files services yes + persistent services no + shared services yes + max-db-size services 33554432 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/templates/recycle.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/templates/recycle.conf new file mode 100644 index 0000000000000000000000000000000000000000..b024f4d5eb331722287e5962aa6a01b0a40eabb4 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/templates/recycle.conf @@ -0,0 +1,30 @@ +##Recycle Bin Configuration File## +#http://samba.org/samba/docs/man/Samba-HOWTO-Collection/VFS.html#id409802 +#http://ubuntuforums.org/showthread.php?t=155763 +#http://www.redhat.com/advice/tips/sambatrash.html +#recycle:name = Recycle Bin +#recycle:mode = KEEP_DIRECTORIES|VERSIONS|TOUCH +recycle:repository = %H/%%smb_trash_dir + +# Files that are larger than the number of bytes specified by this parameter will not be put into the recycle bin. +recycle:maxsize = 5000000 + +# Specifies whether the directory structure should be kept +# or if the files in the directory that is being deleted should be kept separately in the recycle bin. +recycle:keeptree = Yes + +# Specifies whether a file's access date should be touched when the file is moved to the recycle bin. +recycle:touch = Yes + +# If this option is set, two files with the same name that are deleted will both be kept in the recycle bin +# Newer deleted versions of a file will be called “Copy #x of filenameâ€. +recycle:versions = No + +# List of files that should not be put into the recycle bin when deleted, but deleted in the regular way. +recycle:exclude = *.tmp,*.temp,*.o,*.obj,~$*,*.~??,*.avi,*.mp2,*.mp3,*.mp4,*.mpg,*.mpeg,*.asf,*.mov,*.wav,*.rm,*.iso,*.cue,*.bin,*.nrg,*.ccd,*.vob,*.mkv,*.wmv,*.wma,.scanned:* + +# Contains a list of directories. When files from these directories are deleted, they are not put into the recycle bin but are deleted in the regular way. +recycle:exclude_dir = %%os.path.basename(%%smb_trash_dir) + +# Specifies a list of paths (wildcards such as * and ? are supported) for which no versioning should be used. Only useful when recycle:versions is enabled. +#noversions = *.doc|*.ppt|*.dat|*.ini diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/templates/samba.logrotate b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/templates/samba.logrotate new file mode 100644 index 0000000000000000000000000000000000000000..b925405f9c3418e99b54213bfc8166973a9e6682 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/templates/samba.logrotate @@ -0,0 +1,13 @@ +#pas log.winbind mais log.wb-SCRIBE +/var/log/samba/*.log /var/log/samba/log.[!w]*[!g][!z] /var/log/samba/log.wb-*[!g][!z] { + weekly + missingok + rotate 7 + postrotate + smbcontrol all reload-config + endscript + compress + # https://dev-eole.ac-dijon.fr/issues/15351 + copytruncate + notifempty +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/templates/smb.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/templates/smb.conf new file mode 100644 index 0000000000000000000000000000000000000000..c53389a2dd31b33d2527da7c61faf2275ad4ca2e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/templates/smb.conf @@ -0,0 +1,176 @@ +######################################## +# +# Fichier de configuration de SAMBA +# +# Definition du Template pour Eole-2.3 +# +# Eole Dijon +# +# revu le 10/12/2009 pour Samba-3.4 +# +######################################### + +# Global parameters +[global] + # configuration du serveur + netbios name = %%smb_netbios_name + workgroup = %%smb_workgroup + server string = %%smb_server_string + smb ports = %%smb_ports +%if %%is_file('/var/lib/creole/smb-include_global.conf') + %include '/var/lib/creole/smb-include_global.conf' +%end if + # journalisation + logging = syslog@0 + log level = 0 vfs:%%smb_log_level + vfs objects = full_audit + full_audit:prefix = %u|%I|%m|%S + full_audit:success = connect disconnect + full_audit:failure = none + full_audit:priority = NOTICE + max log size = 0 + wins support = %%smb_wins_support +%if %%smb_wins_support == 'no' + wins server = %%custom_join(%%smb_wins_server) +%end if + dns proxy = %%smb_dns_proxy + # exploration + domain master = %%smb_domain_master + os level = %%smb_os_level +%if not %%is_empty(%%smb_admin_users) + admin users = %%custom_join(%%smb_admin_users) +%end if + # impression +%if %%getVar('activer_cups','non') == 'oui' + printing = cups + printcap name = cups + load printers = yes + show add printer wizard = yes + cups server = /var/run/cups/cups.sock:631 +%if %%smb_spoolss_x64 == 'oui' + spoolss: architecture = Windows x64 +%end if +%else + load printers = no +%end if + # synchronisation temporelle + time server = yes + # divers + deadtime = %%smb_deadtime + #FIXME HORUS + #logon script = %U.bat +%if not %%is_empty(%%smb_socket_options) + socket options = %%smb_socket_options +%end if + #FIXME: #179 + #unix extensions = %%smb_unixextensions + #8251 pour l'authentification du proxy + lanman auth = %%smb_lanman_auth +%if not %%is_empty(%%smb_usershare_max_shares) + usershare max shares = %%smb_usershare_max_shares +%end if + unix extensions = no + nt acl support = %%smb_nt_acl_support + wide links = yes +%if %%getVar('smb_activer_hide_files', 'non') == 'oui' + hide files = %%smb_hide_files +%end if + delete veto files = yes +%if %%activer_clam == 'non' or %%smb_vscan == 'non' + veto files = /$RECYCLE.BIN/.scanned:*/ +%else + veto files = /$RECYCLE.BIN/ +%end if + oplocks = %%smb_oplocks + level2 oplocks = %%smb_oplocks + #name resolve order = %%smb_name_resolve_order +%if %%activer_clam == 'oui' and %%smb_vscan == 'oui' and %%smb_trash == 'oui' + vfs objects = scannedonly recycle +%elif %%activer_clam == 'oui' and %%smb_vscan == 'oui' + vfs objects = scannedonly +%elif %%smb_trash == 'oui' + vfs objects = recycle +%end if +%if %%smb_trash == 'oui' + # Corbeille Samba + include = /etc/samba/recycle.conf +%end if +%if %%activer_clam == 'oui' and %%smb_vscan == 'oui' + scannedonly:allow_nonscanned_files=True +%end if +%if %%smb_guest == 'oui' + # Support du mode guest + guest ok = yes + guest account = nobody + map to guest = Bad User +%end if + # Désactiver le support des Attributs DOS en global + store dos attributes = no + +%if %%mode_conteneur_actif == 'non' + interfaces = %%nom_zone_eth0 +%else + #ne pas écouter sur eth0 en mode conteneur (#2506) + interfaces = eth1 +%end if +%if %%smb_max_proto != 'default' + server max protocol = %%smb_max_proto +%end if + # REF #14453 (EOLE) + enable privileges = No + + +[printers] + comment = All Printers + path = /var/spool/samba + #desactivation (#2522) + #print command = lpr-cups -P %p -o raw %s -r # Utilise le Driver de la station + printable = yes + browseable = yes + available = yes + guest ok = no + +[print$] + browseable = yes + guest ok = no + # fixes #1104 + vfs objects = + path = %%smb_printers_drivers_path +%if %%smb_control_print_access_with_acl == 'oui' + read only = no +%else + read only = yes + valid users = @PrintOperators @DomainUsers + write list = @PrintOperators + create mask = 0664 + directory mask = 0775 + force group = PrintOperators +%end if + +%if %%is_file('/var/lib/creole/smb-include_shares.conf') + %include '/var/lib/creole/smb-include_shares.conf' +%end if + + +## partages multiples +%if %%smb_activer_partages == 'oui' +%for %%valeur in %%smb_partage_nom +[%%valeur] + path = %%valeur.smb_partage_path + %if %%valeur.smb_partage_visibilite == 'oui' + browseable = yes + %else + browseable = no + %end if + %if %%valeur.smb_partage_ecriture == 'oui' + writeable = yes + %else + writeable = no + %end if +%end for +%end if + +# +# Debut des partages LDAP +# + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/templates/warnquota.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/templates/warnquota.conf new file mode 100644 index 0000000000000000000000000000000000000000..1847f539c43040e5734588d9dd9bdb1310278d10 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-common/templates/warnquota.conf @@ -0,0 +1,75 @@ +# this is an example warnquota.conf +# +; ; and # type comments are allowed +# and even blank lines + +# values can be quoted: +MAIL_CMD = "/usr/sbin/sendmail -t" +%if %%is_defined('domaine_messagerie_etab') +FROM = "admin@%%domaine_messagerie_etab" +%elif %%is_defined('system_mail_from') and %%system_mail_from != '' +FROM = "admin@%%system_mail_from" +%end if +# but they don't have to be:SUBJECT = "Dépassement de la taille des fichiers personnels" +SUBJECT = "DEPASSEMENT DE LA TAILLE DES FICHIERS PERSONNELS" +# If you set this variable CC will be used only when user has less than +# specified grace time left (examples of possible times: 5 seconds, 1 minute, +# 12 hours, 5 days) +CC_BEFORE = 3 days +#SUPPORT = "admin@localhost" +#PHONE = "(123) 456-1111 or (222) 333-4444" +# Text in the beginning of the mail (if not specified, default text is used) +# This way text can be split to more lines +# Line breaks are done by '|' character +# The expressions %i, %h, %d, and %% are substituted for user/group name, +# host name, domain name, and '%' respectively. For backward compatibility +# %s behaves as %i but is deprecated. +MESSAGE = "Bonjour %i,||Vous avez depasse votre capacite de stockage de fichiers.||Vous risquez de ne plus pouvoir modifier ou enregistrer vos documents.||Voici les informations detaillees :|" +# Text in the end of the mail (if not specified, default text using SUPPORT and PHONE +# is created) +SIGNATURE = Merci de liberer de l'espace.| +# Following text is used for mails about group exceeding quotas +#GROUP_MESSAGE = Hello, a group '%i' you're member of use too much space at %h.|\ +#I chose you to do the cleanup.|Delete group files on the following filesystems:| +# Text in the end of the mail to the group (if not specified, default text using SUPPORT +# and PHONE is created). +#GROUP_SIGNATURE = See you!| Your admin| +# +#If you are running warnquota on a mail server, and don't want bounces +#because clients cannot receive mail setting this to "any" will cause +#warnquota to not send them mail for all devices. If you set this to the +#device name (for example /dev/hdb1) then they will not be sent mail if they +#are overquota on that device only, and will be sent mail for all other +#devices. +#MAILDEV = +# +# If you are using LDAP mail lookups. +# host, port, tls, binddn, and bindpw are straight forward. +# LDAP_BASEDN is your search base dn +# LDAP_SEARCH_ATTRIBUTE is the attr for the value you are looking for +# LDAP_MAIL_ATTRIBUTE is the attribute you want used for the mail address +# LDAP_DEFAULT_MAIL_DOMAIN is the default domain +# if the attribute isn't found +# if binddn and bindpw are blank or left out, an anonymous bind is used +# +# LDAP_MAIL = false # or false if you don't want to use it +# If you have at least LDAP 2.3 installed, you can use LDAP_URI +# LDAP_URI = ldaps://my.server:389 +# Otherwise you can specify LDAP_HOST and LDAP_PORT +%if %%getVar('activer_client_ldap', 'non') != 'non' +LDAP_MAIL = true +LDAP_URI = ldap://%%adresse_ip_ldap:389 +LDAP_BASEDN = %%ldap_base_dn +LDAP_SEARCH_ATTRIBUTE = uid +LDAP_MAIL_ATTRIBUTE = mail +%end if + +# LDAP_BINDDN = uid=ReadOnlyUser,o=YourOrg +# LDAP_BINDPW = YourReadOnlyUserPassword +# LDAP_BASEDN = YourSearchBase +# LDAP_SEARCH_ATTRIBUTE = uid +# LDAP_MAIL_ATTRIBUTE = mailLocalAddress +# LDAP_DEFAULT_MAIL_DOMAIN = YourDefaultMailDomain.com +# +# end of example warnquota.conf file +# diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-membre/dictionaries/00_eole-fichier-membre_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-membre/dictionaries/00_eole-fichier-membre_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..4fbcef08edc104290cac740daadd2e6668b50fe5 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-membre/dictionaries/00_eole-fichier-membre_packages.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>eole-nsswitch</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-membre/dictionaries/21_fichier-membre.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-membre/dictionaries/21_fichier-membre.xml new file mode 100644 index 0000000000000000000000000000000000000000..b1ec283e3bbbf968f1f39741657cf9440f292d59 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-membre/dictionaries/21_fichier-membre.xml @@ -0,0 +1,62 @@ +<?xml version="1.0" encoding="utf-8"?> + +<!-- Source: 20_fichier.xml --> + +<creole> + + <files> + </files> + + <containers> + <container name='fichier' id='12'> + <file name="/etc/nsswitch.conf" source="nsswitch.conf.default"/> + <!-- Lancement winbind --> + <package>eole-fichier-membre-pkg</package> + <service servicelist='kerberos'>winbind</service> + <file name="/etc/krb5.conf" source='krb5-membre.conf' /> + </container> + </containers> + + <variables> + <family name='samba'> + <variable name="activer_winbind" type="oui/non" description="Activer winbind" mode="expert"> + <value>oui</value> + </variable> + <variable name='smb_security' type='string' description='Type de domaine à intéger' /> + <variable name='smb_ad_server' type='netbios' description='Nom du contrôleur de domaine Active Directory' mandatory='True' /> + <variable name='ad_realm' type='domain_strict' description='Nom du domaine Active Directory' mandatory='True'/> + <variable name='smb_os_level' redefine='True' > + <value>0</value> + </variable> + <variable name='smb_domain_master' redefine='True' > + <value>no</value> + </variable> + </family> + <separators> + <separator name='smb_wins_server'>Adresse du serveur wins pour le serveur de fichier</separator> + </separators> + + </variables> + + <constraints> + <condition name='disabled_if_in' source='activer_winbind'> + <param>non</param> + <target type='servicelist'>winbind</target> + </condition> + <check name='valid_enum' target='smb_security'> + <param>['domain','ads']</param> + </check> + <condition name='disabled_if_not_in' source='smb_security'> + <param>ads</param> + <target type='variable'>smb_ad_server</target> + <target type='variable'>ad_realm</target> + </condition> + + </constraints> + + <help> + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-membre/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-membre/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..fd7e423296daa23b2ed4a717880134779d9ecbd0 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-membre/service.yml @@ -0,0 +1,28 @@ +format: '0.1' +name: eole-fichier-membre +version: |- + 2.7.1-2 +description: |- + Templates et dictionnaires pour serveur de fichier EOLE + Templates et dictionnaires pour un serveur membre + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: + - eole-fichier-common +packages: + - eole-nsswitch +dictionaries: + - 21_fichier-membre.xml +extra_dictionaries: {} +templates: + - krb5-membre.conf + - smb-include_global.conf +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: [] +files: {} +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-membre/templates/krb5-membre.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-membre/templates/krb5-membre.conf new file mode 100644 index 0000000000000000000000000000000000000000..a265966511b275e917025b8b9abef16c290c1bbe --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-membre/templates/krb5-membre.conf @@ -0,0 +1,16 @@ +%if %%smb_security == 'ads' +[libdefaults] + default_realm = %%ad_realm.upper() + dns_lookup_realm = false + dns_lookup_kdc = true + +[realms] +%%ad_realm.upper() = { + kdc = %%smb_ad_server.%%ad_realm:88 + admin_server = %%smb_ad_server.%%ad_realm:749 + default_domain = %%ad_realm +} +[domain_realm] + .%%ad_realm = %%ad_realm.upper() +%end if + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-membre/templates/smb-include_global.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-membre/templates/smb-include_global.conf new file mode 100644 index 0000000000000000000000000000000000000000..d2d0195ad3d51c8c9f702ddd29277b1d8bf47c59 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-membre/templates/smb-include_global.conf @@ -0,0 +1,48 @@ + preferred master = no + domain logons = no + security = %%smb_security +%if %%smb_security == 'ads' + password server = %%smb_ad_server.%%ad_realm + REALM = %%upper(%%ad_realm) +%else + password server = %%smb_password_server +%end if +### Pour winbind + winbind use default domain = no + winbind enum users = Yes + template homedir = /data/bureautique/individuel/%D/%U + winbind enum groups = Yes + winbind expand groups = 0 + allow trusted domains = yes + winbind separator = + + winbind sealed pipes = no + require strong key = no + winbind sealed pipes:%%smb_workgroup = yes + require strong key:%%smb_workgroup = yes + +#idmap +#################################### +## +## Fichier de configuration de SAMBA +## SUP partie pour version samba supérieur ou egal à 3.3.0 +################idmap +##---# Pour samba 3.3.x et plus, la plage globale + idmap config * : backend = tdb + idmap config * : range = 90010000-90090000 +#---# Fin de propre à samba 3.3.X +## FIN Fichier de configuration de SAMBA +##idmap +# +##Partie commune aux deux versions +### Default: idmap cache time = 604800 (one week) + idmap config %%smb_workgroup:backend = rid + idmap config %%smb_workgroup:range = 1000-90009999 +# pas de shell pour les util winbind + template shell = /bin/false + machine password timeout = 16048000 + +### Fin winbind + + client signing = no + client ipc signing = no + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-primaire/dictionaries/20_fichier-primaire.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-primaire/dictionaries/20_fichier-primaire.xml new file mode 100644 index 0000000000000000000000000000000000000000..dc8afae8f5df250052c9bc4857b9d7b8ad8f23a4 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-primaire/dictionaries/20_fichier-primaire.xml @@ -0,0 +1,105 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + <files> + </files> + <containers> + <container name='fichier' id='12'> + <package>eole-fichier-primaire-pkg</package> + <file name='/etc/smbldap-tools/smbldap.conf'/> + <file name='/etc/smbldap-tools/smbldap_bind.conf'/> + <!-- client ldap--> + <file name='/etc/nsswitch.conf' source="nsswitch.conf.default"/> + <file name='/etc/ldap.conf'/> + <file name='/etc/ldap/ldap.conf'/> + <file filelist='winbind' name='/etc/logrotate.d/winbind' source='winbind.logrotate' rm='True'/> + <service servicelist='winbind'>winbind</service> + </container> + </containers> + + <variables> + <family name='services'> + <variable name='activer_client_ldap' redefine='True' hidden='True'> + <value>distant</value> + </variable> + </family> + <family name='annuaire'> + <!-- the basedn can't be modified on Scribe & Horus --> + <variable name='ldap_base_dn' redefine='True' hidden='True'/> + <variable name='ldap_nss' redefine='True' hidden='True'> + <value>oui</value> + </variable> + </family> + <family name="samba"> + <variable name="activer_winbind" type="oui/non" description="Activer winbind" mode="expert"> + <value>non</value> + </variable> + <variable name="smb_ldap_machine_suffix" type="string" description="Suffixe de machine LDAP" mode="expert"/> + <variable name="smb_ldap_group_suffix" type="string" description="Suffixe de groupe LDAP" mode="expert"/> + <variable name="smb_ldap_max_pwd_age" type="number" + description="Âge maximal par défaut des mots de passe" + mode="expert"> + <value>0</value> + </variable> + <variable name='smb_idmap_negative_cache_time' type='number' description="Durée du cache des résultats de requêtes négatifs" mode='expert'> + <value>120</value> + </variable> + <variable name="smb_ldap_replication_sleep" type="number" description="LDAP replication sleep" mode="expert"/> + <variable name="smb_ldap_page_size" type="number" description="Nombre d'entrées par page dans une requête LDAP" mode="expert"/> + <variable name='smb_ldap_connection_timeout' type='number' description="Délai avant abandon pour la connexion au LDAP" mode='expert'/> + <variable name="smb_ldap_suffix" type='string' description="Base DN de l'annuaire utilisé par Samba"/> + <variable name="smb_ldap_admin_dn" type='string' description="Nom de l'administrateur du domaine LDAP"> + <value>cn=admin,o=gouv,c=fr</value> + </variable> + <variable name="ead_support_multietab" type="oui/non" description="Support du multi-établissement" hidden='True'> + <value>non</value> + </variable> + <variable name='smb_share_model' type='string' description='Modèle de partage par défaut'> + <value>standard</value> + </variable> + <variable name='smb_logon_home' type='string' description="Répertoire home distant de l'utilisateur" mandatory="True" mode="expert"> + <value>\\%N\%U</value> + </variable> + <variable name='smb_logon_script' type='string' description="Nom du script de logon" mandatory="True" mode="expert"> + <value>%U%a.bat</value> + </variable> + </family> + </variables> + + <constraints> + <condition name='disabled_if_in' source='activer_winbind'> + <param>non</param> + <target type='servicelist'>winbind</target> + <target type='filelist'>winbind</target> + </condition> + <check name="valid_enum" target="smb_share_model"> + <param type="python">eosfunc.list_files('/usr/share/eole/fichier/models','*.tmpl',True,default=['standard'])</param> + <param name="checkval">False</param> + </check> + <fill name='calc_val' target='smb_ldap_suffix'> + <param type='eole' name='valeur'>ldap_base_dn</param> + </fill> + <condition name='frozen_if_in' source='activer_client_ldap'> + <param>local</param> + <target type='variable'>adresse_ip_ldap</target> + <!-- ldap_base_dn can be modified on local installation #5707--> + <!--<target type='variable'>ldap_base_dn</target>--> + <target type='variable'>ldap_tls</target> + <target type='variable'>ldap_nss</target> + </condition> + + </constraints> + + <help> + <variable name="smb_ldap_max_pwd_age"> + Définit la durée en jours avant expiration d’un mot de + passe. Cette durée est compté à partir de la date + d’enregistrement du mot de passe. + </variable> + <variable name="ead_support_multietab">Le mode multi-établissement permet de gérer plusieurs établissements au sein d'un seul module EOLE</variable> + <variable name="smb_idmap_negative_cache_time">Durée exprimée en secondes (une valeur de 1 désactive le cache)</variable> + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-primaire/postservices/00-fichier-primaire b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-primaire/postservices/00-fichier-primaire new file mode 100644 index 0000000000000000000000000000000000000000..f2399288c4389cec3a2c41d58840d6f6553326ca --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-primaire/postservices/00-fichier-primaire @@ -0,0 +1,6 @@ +#!/bin/bash + +# application de la taille minimale des mots de passe pour Samba (#3937) +CreoleRun "pdbedit -P \"min password length\" -C $(CreoleGet smb_min_password_length) >/dev/null" fichier + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-primaire/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-primaire/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..f7914d3f4dccc7aba648dd1d7a4a7ee89bd29ca1 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-primaire/service.yml @@ -0,0 +1,32 @@ +format: '0.1' +name: eole-fichier-primaire +version: |- + 2.7.1-2 +description: |- + Templates et dictionnaires pour serveur de fichier EOLE + Templates et dictionnaires pour un contrôleur de domaine principal + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: + - eole-fichier-common + - eole-client-annuaire + - eole-userpassword +packages: [] +dictionaries: + - 20_fichier-primaire.xml +extra_dictionaries: {} +templates: + - smb-include_global.conf + - smbldap.conf + - smbldap_bind.conf + - winbind.logrotate +creole_funcs: [] +preservices: [] +postservices: + - 00-fichier-primaire +pretemplates: [] +posttemplates: [] +files: {} +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-primaire/templates/smb-include_global.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-primaire/templates/smb-include_global.conf new file mode 100644 index 0000000000000000000000000000000000000000..719afd702d08315cdff1e936cd89af1865ee8fc9 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-primaire/templates/smb-include_global.conf @@ -0,0 +1,67 @@ + preferred master = yes + domain logons = yes + security = user + logon home = %%smb_logon_home + logon script = %%smb_logon_script + logon path = +%if %%is_defined('adresse_ip_ldap') + # smbldap-tools + %if int(%%smb_min_password_class) > 1 + check password script = /usr/share/eole/fichier/checkpassword + %end if + add user script = /usr/sbin/smbldap-useradd -a -m "%u" + add group script = /usr/sbin/smbldap-groupadd -p -a -t 2 "%g" + add machine script = /usr/sbin/smbldap-useradd -w -a -d /dev/null -s /bin/false %u + add user to group script = /usr/sbin/smbldap-groupmod -m "%u" "%g" + delete user from group script = /usr/sbin/smbldap-groupmod -x "%u" "%g" + set primary group script = /usr/sbin/smbldap-usermod -g "%g" "%u" + rename user script = /usr/sbin/smbldap-usermod -J -r "%unew" "%uold" + ldap passwd sync = yes + %if %%getVar('activer_annuaire_secours', 'non') == 'oui' + passdb backend = ldapsam:"ldaps://%%adresse_ip_ldap:636" + %else + passdb backend = ldapsam:ldap://%%adresse_ip_ldap:389 + %end if + ldap suffix = %%smb_ldap_suffix + ldap admin dn = %%smb_ldap_admin_dn + %if %%activer_client_ldap == "distant" and %%ldap_tls == "oui" + ldap ssl = start tls + %else + ldap ssl = no + %end if + %if not %%is_empty(%%smb_ldap_page_size) + ldap page size = %%smb_ldap_page_size + %end if + %if not %%is_empty(%%smb_ldap_machine_suffix) + ldap machine suffix = %%smb_ldap_machine_suffix + %end if + %if not %%is_empty(%%smb_ldap_connection_timeout) + ldap connection timeout = %%smb_ldap_connection_timeout + %end if + %if not %%is_empty(%%smb_ldap_group_suffix) + ldap group suffix = %%smb_ldap_group_suffix + %end if + %if not %%is_empty(%%smb_ldap_replication_sleep) + ldap replication sleep = %%smb_ldap_replication_sleep + %end if +%end if +%if %%activer_winbind == "oui" +# pas de shell pour les util winbind + template shell = /bin/false + winbind enum users = Yes + template homedir = /data/bureautique/individuel/%D/%U + winbind enum groups = Yes + allow trusted domains = yes + winbind trusted domains only = yes + winbind sealed pipes = no + require strong key = no + winbind sealed pipes:%%smb_workgroup = yes + require strong key:%%smb_workgroup = yes +### optimisations diverses + idmap cache time = 9000 + idmap negative cache time = %%smb_idmap_negative_cache_time + winbind cache time = 3000 + winbind separator = + + idmap config * : backend = tdb + idmap config * : range = 3000000-4000000 +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-primaire/templates/smbldap.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-primaire/templates/smbldap.conf new file mode 100644 index 0000000000000000000000000000000000000000..6b87eed7ab1f014029e1068407ee0da6025ec865 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-primaire/templates/smbldap.conf @@ -0,0 +1,228 @@ +# $Id: smbldap.conf 139 2012-08-07 11:11:37Z fumiyas $ +# +# smbldap-tools.conf : Q & D configuration file for smbldap-tools + +# This code was developped by IDEALX (http://IDEALX.org/) and +# contributors (their names can be found in the CONTRIBUTORS file). +# +# Copyright (C) 2001-2002 IDEALX +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, +# USA. + +# Purpose : +# . be the configuration file for all smbldap-tools scripts + +############################################################################## +# +# General Configuration +# +############################################################################## + +# Put your own SID. To obtain this number do: "net getlocalsid". +# If not defined, parameter is taking from "net getlocalsid" return +SID="[sambasid]" + +# Domain name the Samba server is in charged. +# If not defined, parameter is taking from smb.conf configuration file +# Ex: sambaDomain="IDEALX-NT" +sambaDomain="%%smb_workgroup" + +############################################################################## +# +# LDAP Configuration +# +############################################################################## + +# Notes: to use to dual ldap servers backend for Samba, you must patch +# Samba with the dual-head patch from IDEALX. If not using this patch +# just use the same server for slaveLDAP and masterLDAP. +# Those two servers declarations can also be used when you have +# . one master LDAP server where all writing operations must be done +# . one slave LDAP server where all reading operations must be done +# (typically a replication directory) + +# Slave LDAP server URI +# Ex: slaveLDAP=ldap://slave.ldap.example.com/ +# If not defined, parameter is set to "ldap://127.0.0.1/" +slaveLDAP="ldap://%%adresse_ip_ldap/" + +# Master LDAP server URI: needed for write operations +# Ex: masterLDAP=ldap://master.ldap.example.com/ +# If not defined, parameter is set to "ldap://127.0.0.1/" +masterLDAP="ldap://%%adresse_ip_ldap/" + +# Use TLS for LDAP +# If set to 1, this option will use start_tls for connection +# (you must also used the LDAP URI "ldap://...", not "ldaps://...") +# If not defined, parameter is set to "0" +ldapTLS="0" + +# How to verify the server's certificate (none, optional or require) +# see "man Net::LDAP" in start_tls section for more details +verify="require" + +# CA certificate +# see "man Net::LDAP" in start_tls section for more details +cafile="/etc/smbldap-tools/ca.pem" + +# certificate to use to connect to the ldap server +# see "man Net::LDAP" in start_tls section for more details +clientcert="/etc/smbldap-tools/smbldap-tools.example.com.pem" + +# key certificate to use to connect to the ldap server +# see "man Net::LDAP" in start_tls section for more details +clientkey="/etc/smbldap-tools/smbldap-tools.example.com.key" + +# LDAP Suffix +# Ex: suffix=dc=IDEALX,dc=ORG +suffix="%%ldap_base_dn" + +# petit hack EOLE +#num_etab est utilise pour le multi-etab +num_etab="%%numero_etab" +etab="ou=${num_etab},ou=%%nom_academie,ou=education" + +# Where are stored Users +# Ex: usersdn="ou=Users,dc=IDEALX,dc=ORG" +# Warning: if 'suffix' is not set here, you must set the full dn for usersdn +usersdn="ou=utilisateurs,${etab},${suffix}" + +# Where are stored Computers +# Ex: computersdn="ou=Computers,dc=IDEALX,dc=ORG" +# Warning: if 'suffix' is not set here, you must set the full dn for computersdn +computersdn="ou=ordinateurs,ou=ressources,${etab},${suffix}" + +# Where are stored Groups +# Ex: groupsdn="ou=Groups,dc=IDEALX,dc=ORG" +# Warning: if 'suffix' is not set here, you must set the full dn for groupsdn +groupsdn="ou=local,ou=Groupes,${etab},${suffix}" + +# Where are stored Idmap entries (used if samba is a domain member server) +# Ex: idmapdn="ou=Idmap,dc=IDEALX,dc=ORG" +# Warning: if 'suffix' is not set here, you must set the full dn for idmapdn +idmapdn="ou=Idmap,${etab},${suffix}" + +# Where to store next uidNumber and gidNumber available for new users and groups +# If not defined, entries are stored in sambaDomainName object. +# Ex: sambaUnixIdPooldn="sambaDomainName=${sambaDomain},${suffix}" +# Ex: sambaUnixIdPooldn="cn=NextFreeUnixId,${suffix}" +sambaUnixIdPooldn="sambaDomainName=${sambaDomain},${suffix}" + +# Default scope Used +scope="sub" + +# Unix password hash scheme (CRYPT, MD5, SMD5, SSHA, SHA, CLEARTEXT) +# If set to "exop", use LDAPv3 Password Modify (RFC 3062) extended operation. +password_hash="SSHA" + +# if password_hash is set to CRYPT, you may set a salt format. +# default is "%s", but many systems will generate MD5 hashed +# passwords if you use "$1$%.8s". This parameter is optional! +password_crypt_salt_format="%s" + +############################################################################## +# +# Unix Accounts Configuration +# +############################################################################## + +# Login defs +# Default Login Shell +# Ex: userLoginShell="/bin/bash" +userLoginShell="/bin/false" + +# Home directory +# Ex: userHome="/home/%U" +userHome="/home" +#FIXME: sur Horus : +#userHome="/home/%U" + +# Default mode used for user homeDirectory +userHomeDirectoryMode="700" + +# Gecos +userGecos="System User" + +# Default User (POSIX and Samba) GID +defaultUserGid="513" + +# Default Computer (Samba) GID +defaultComputerGid="515" + +# Skel dir +skeletonDir="/etc/skel" + +# Treat shadowAccount object or not +shadowAccount="1" + +# Default password validation time (time in days) Comment the next line if +# you don't want password to be enable for defaultMaxPasswordAge days (be +# careful to the sambaPwdMustChange attribute's value) +defaultMaxPasswordAge="%%smb_ldap_max_pwd_age" + +############################################################################## +# +# SAMBA Configuration +# +############################################################################## + +# The UNC path to home drives location (%U username substitution) +# Just set it to a null string if you want to use the smb.conf 'logon home' +# directive and/or disable roaming profiles +# Ex: userSmbHome="\\PDC-SMB3\%U" +userSmbHome="" + +# The UNC path to profiles locations (%U username substitution) +# Just set it to a null string if you want to use the smb.conf 'logon path' +# directive and/or disable roaming profiles +# Ex: userProfile="\\PDC-SMB3\profiles\%U" +userProfile="" + +# The default Home Drive Letter mapping +# (will be automatically mapped at logon time if home directory exist) +# Ex: userHomeDrive="H:" +userHomeDrive="" + +# The default user netlogon script name (%U username substitution) +# if not used, will be automatically username.cmd +# make sure script file is edited under dos +# Ex: userScript="startup.cmd" # make sure script file is edited under dos +#userScript="logon.bat" + +# Domain appended to the users "mail"-attribute +# when smbldap-useradd -M is used +# Ex: mailDomain="idealx.com" +mailDomain="" + +############################################################################## +# +# SMBLDAP-TOOLS Configuration (default are ok for a RedHat) +# +############################################################################## + +# Allows not to use smbpasswd (if with_smbpasswd="0" in smbldap.conf) but +# prefer Crypt::SmbHash library +with_smbpasswd="0" +smbpasswd="/usr/bin/smbpasswd" + +# Allows not to use slappasswd (if with_slappasswd="0" in smbldap.conf) +# but prefer Crypt:: libraries +with_slappasswd="0" +slappasswd="/usr/sbin/slappasswd" + +# comment out the following line to get rid of the default banner +# no_banner="1" + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-primaire/templates/smbldap_bind.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-primaire/templates/smbldap_bind.conf new file mode 100644 index 0000000000000000000000000000000000000000..5fd9fd76465930987c016ae5d065328ba350f093 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-primaire/templates/smbldap_bind.conf @@ -0,0 +1,21 @@ +############################ +# Credential Configuration # +############################ +# Notes: you can specify two differents configuration if you use a +# master ldap for writing access and a slave ldap server for reading access +# By default, we will use the same DN (so it will work for standard Samba +# release) +slaveDN="%%smb_ldap_admin_dn" +slavePw="eole" +masterDN="%%smb_ldap_admin_dn" +masterPw="eole" +%if %%getVar('activer_ad', 'non') == 'oui' +%def %%gen_dc() +%return 'DC='+',DC='.join(%%ad_domain.split('.')) +%end def +adserver = "ldaps://%%ad_server.%%ad_domain"; +adbase = "%%gen_dc()"; +aduser = "CN=%%ad_user,CN=Users,%%gen_dc()"; +adpassword = "[ad_password]"; +%end if + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-primaire/templates/winbind.logrotate b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-primaire/templates/winbind.logrotate new file mode 100644 index 0000000000000000000000000000000000000000..e3fcd5707255ee2c02073f151125b347f703f6ab --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-fichier-primaire/templates/winbind.logrotate @@ -0,0 +1,15 @@ +/var/log/samba/log.winbindd /var/log/samba/log.winbindd*[!g][!z] { + weekly + missingok + rotate 7 + postrotate + if [ -x /usr/bin/smbcontrol ]; then + /usr/bin/smbcontrol winbindd reload-config + elif [ -f /var/run/samba/winbindd.pid ]; then + kill -HUP `cat /var/run/samba/winbindd.pid` + fi + endscript + compress + delaycompress + notifempty +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-flask/dictionaries/00_eole-flask_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-flask/dictionaries/00_eole-flask_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..0f0785a391ef5f2b11acd1afe3486bb9f1c0f3db --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-flask/dictionaries/00_eole-flask_packages.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>eole-flask-admin</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-flask/dictionaries/28_eoleflask.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-flask/dictionaries/28_eoleflask.xml new file mode 100644 index 0000000000000000000000000000000000000000..c496d2fb3f0808d5a8a9b9e0d1d70453a83801a5 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-flask/dictionaries/28_eoleflask.xml @@ -0,0 +1,31 @@ +<?xml version='1.0' encoding='utf-8'?> + +<creole> + + <files> + <file name='/etc/nginx/sites-available/eoleflask.conf'/> + <service>eoleflask</service> + <service>nginx</service> + </files> + + <variables> + + <family name='eoleflask' mode='expert' icon='python'> + <variable name='listen_from_network' type='oui/non' description="En écoute depuis l'extérieur"> + <value>oui</value> + </variable> + </family> + + </variables> + + <constraints> + </constraints> + + <help> + <family name='eoleflask'>Paramétrage du framework d'application web Flask</family> + <variable name="listen_from_network">Le serveur eoleflask doit il être accessible depuis l'extérieur ?</variable> + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-flask/posttemplates/01-eoleflask-nginx b/seed/release/eole-2.7/2.7.1/applicationservice/eole-flask/posttemplates/01-eoleflask-nginx new file mode 100644 index 0000000000000000000000000000000000000000..99a4dbfd492126df074b615e35e78fd697a89484 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-flask/posttemplates/01-eoleflask-nginx @@ -0,0 +1,10 @@ +#!/bin/bash + +ENABLE=`CreoleGet listen_from_network 'non'` + +if [ -L /etc/nginx/sites-enabled/eoleflask.conf ];then + rm /etc/nginx/sites-enabled/eoleflask.conf +fi +if [ "${ENABLE}" = 'oui' ];then + ln -s /etc/nginx/sites-available/eoleflask.conf /etc/nginx/sites-enabled/eoleflask.conf +fi diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-flask/posttemplates/70-eoleflask b/seed/release/eole-2.7/2.7.1/applicationservice/eole-flask/posttemplates/70-eoleflask new file mode 100644 index 0000000000000000000000000000000000000000..be339baa6b50bc82e4e981b9e3abc7b842780c5a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-flask/posttemplates/70-eoleflask @@ -0,0 +1,26 @@ +#!/bin/bash + +# Renouvellement des clés secrètes flask + +# Doit avoir lieu entre l'activation d'eop (posttemplate/51-eop) +# et la copie des clés dans les conteneurs (posttemplate/80-eop) + +############################################ + +mode_conteneur_actif=$(CreoleGet mode_conteneur_actif) +file_renew_key="/usr/share/eole/sbin/renew_key" + +# Renouvellement de la clé secrète flask dans le conteneur maitre +if [ -e "$file_renew_key" ];then + CreoleRun "$file_renew_key" +fi + +# En mode conteneur, renouvelle la clé secrète flask dans les conteneurs concernés +if [ "$mode_conteneur_actif" = "oui" ]; then + for mon_conteneur in $(ls /opt/lxc) + do + if [ -e "/opt/lxc/$mon_conteneur/rootfs/$file_renew_key" ];then + CreoleRun "$file_renew_key" $mon_conteneur + fi + done +fi \ No newline at end of file diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-flask/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-flask/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..d3079c0af4d90dd71b082c0d15fabd05631d4ce1 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-flask/service.yml @@ -0,0 +1,29 @@ +format: '0.1' +name: eole-flask +version: |- + 2.7.0-1 +description: |- + configuration files for eole application server + This package provides configuration files to start + eole application server. + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: [] +packages: + - eole-flask-admin +dictionaries: + - 28_eoleflask.xml +extra_dictionaries: {} +templates: + - eoleflask.conf +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: + - 01-eoleflask-nginx + - 70-eoleflask +files: {} +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-flask/templates/eoleflask.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-flask/templates/eoleflask.conf new file mode 100644 index 0000000000000000000000000000000000000000..6b0d20d2e31fe09d4f5939d9054b85e26ee3d28f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-flask/templates/eoleflask.conf @@ -0,0 +1,48 @@ +upstream eoleflask{ + server 127.0.0.1:5000; +} + +server { + listen 7000 ssl; ## listen for ipv4; this line is default and implied + #listen [::]:80 default ipv6only=on; ## listen for ipv6 + + root /usr/share/eole/flask; + index index.html index.htm; + + ssl_certificate %%server_cert; + ssl_certificate_key %%server_key; + + # Fixes Genconfig Timeout on zephir diff (port 7000) + proxy_connect_timeout 600; + proxy_send_timeout 600; + proxy_read_timeout 600; + send_timeout 600; + + # Default rule + # 1) try the file, should not work since /static/ is more specific + # 2) try to add a trailing / for application root + # 3) Fallback on eoleflask application + location / { + try_files $uri/ @eoleflask; + } + + ## URI with trailing /, try the index.html + location ~ /$ { + try_files $uri @eoleflask; + # index.html est maintenant un template (ref #6461) + # try_files $uri $uri/static/index.html; + } + + # Static files for every applications + location ~ /static/ { + alias /usr/share/eole/flask/$uri; + expires 1d; + } + + # Forward to eoleflask backend + location @eoleflask { + proxy_pass http://eoleflask; + proxy_set_header Host $host:7000; + proxy_set_header X-Forwarded-Proto $scheme; + } +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-gaspacho-agent/dictionaries/52_gaspacho-agent.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gaspacho-agent/dictionaries/52_gaspacho-agent.xml new file mode 100644 index 0000000000000000000000000000000000000000..ab2aa228e218473224be4e75612647474395627d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gaspacho-agent/dictionaries/52_gaspacho-agent.xml @@ -0,0 +1,56 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + <containers> + <container name="gaspacho-agent" id="26"> + <package>gaspacho-agent</package> + <service servicelist="gaspachoagent">gaspacho-agent</service> + <file name='/etc/cron.hourly/gaspacho-agent' filelist="gaspachoagent" source="cron-gaspacho-agent" mode='0755' rm='True'/> + <file name='/etc/gaspacho-agent/gaspacho-agent.conf' filelist="gaspachoagent" mkdir="True"/> + <file name='/etc/pam.d/common-session'/> + </container> + </containers> + <variables> + <family name='services'> + <variable name='activer_gaspacho_agent' type='oui/non' description="Activer l'agent Gaspacho"> + <value>non</value> + </variable> + </family> + <family name='gaspacho-agent' icon='coffee'> + <variable name='adresse_ip_gaspacho' type='domain_strict' description="Nom de domaine du serveur Gaspacho" mandatory='True'/> + + <variable name='gaspacho_https' type='oui/non' description="Forcer l'accès à Gaspacho sur le port 443" exists='False'> + <value>oui</value> + </variable> + <variable name='gaspacho_http_path' type='string' description='Chemin d’accès de l’application Gaspacho' mode='expert' exists='False'> + <value>/gaspacho</value> + </variable> + + + <variable name='gaspacho_agent_requires' type='oui/non' description="Rendre impossible la connexion si l'agent Gaspacho fait une erreur" mode='expert'> + <value>non</value> + </variable> + </family> + </variables> + <constraints> + <condition name="disabled_if_in" source="activer_gaspacho_agent"> + <param>non</param> + <target type="family">gaspacho-agent</target> + <target type="variable">adresse_ip_gaspacho</target> + <target type="variable">gaspacho_agent_requires</target> + <target type="filelist">gaspachoagent</target> + <target type="servicelist">gaspachoagent</target> + </condition> + <condition name="disabled_if_in" source="gaspacho_https"> + <param>non</param> + <target type="variable">gaspacho_http_path</target> + </condition> + </constraints> + <help> + <family name='gaspacho-agent'>Paramétrage de l'agent Gaspacho</family> + <variable name='activer_gaspacho_agent'>Gaspacho est une application qui permet de configurer automatiquement le poste de travail de l'utilisateur selon son profil</variable> + </help> +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-gaspacho-agent/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gaspacho-agent/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..d5542010db969929a26aa2b9d12ded7d78e89a95 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gaspacho-agent/service.yml @@ -0,0 +1,27 @@ +format: '0.1' +name: eole-gaspacho-agent +version: |- + 2.7.0-1 +description: |- + EOlisation de Gaspacho-agent + Gaspacho permet de configurer indifféremment un ensemble de logiciels + et de systèmes avec des choix déterminés par l’administrateur. + . + Ce paquet fourni l’environnement de configuration EOLE de l'agent gaspacho. +depends: [] +packages: [] +dictionaries: + - 52_gaspacho-agent.xml +extra_dictionaries: {} +templates: + - common-session + - cron-gaspacho-agent + - gaspacho-agent.conf +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: [] +files: {} +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-gaspacho-agent/templates/common-session b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gaspacho-agent/templates/common-session new file mode 100644 index 0000000000000000000000000000000000000000..0cb95362b07b17b2300402af7b091c3c987cc4f6 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gaspacho-agent/templates/common-session @@ -0,0 +1,36 @@ +# +# /etc/pam.d/common-session - session-related modules common to all services +# +# This file is included from other service-specific PAM config files, +# and should contain a list of modules that define tasks to be performed +# at the start and end of sessions of *any* kind (both interactive and +# non-interactive). +# +# As of pam 1.0.1-6, this file is managed by pam-auth-update by default. +# To take advantage of this, it is recommended that you configure any +# local modules either before or after the default block, and use +# pam-auth-update to manage selection of other modules. See +# pam-auth-update(8) for details. + +# here are the per-package modules (the "Primary" block) +session [default=1] pam_permit.so +# here's the fallback if no module succeeds +session requisite pam_deny.so +# prime the stack with a positive return value if there isn't one already; +# this avoids us returning an error just because nothing sets a success code +# since the modules above will each just jump around +session required pam_permit.so +# and here are more per-package modules (the "Additional" block) +session required pam_unix.so +session optional pam_ldap.so +#session optional pam_ck_connector.so nox11 +%if %%activer_gaspacho_agent == "oui" +session %slurp +%if %%gaspacho_agent_requires == 'oui' +required %slurp +%else +optional %slurp +%end if +pam_script.so runas=root onsessionopen=/usr/share/gaspacho-agent/user.py +%end if +# end of pam-auth-update config diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-gaspacho-agent/templates/cron-gaspacho-agent b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gaspacho-agent/templates/cron-gaspacho-agent new file mode 100644 index 0000000000000000000000000000000000000000..783334e6fd3643c7db5083b206717da34d29cf9c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gaspacho-agent/templates/cron-gaspacho-agent @@ -0,0 +1,3 @@ +#!/bin/sh + +/usr/share/gaspacho-agent/computer.py diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-gaspacho-agent/templates/gaspacho-agent.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gaspacho-agent/templates/gaspacho-agent.conf new file mode 100644 index 0000000000000000000000000000000000000000..453ef073f7fdae4def981877892c296ed0394605 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gaspacho-agent/templates/gaspacho-agent.conf @@ -0,0 +1,57 @@ +############################################################################### +# GASPACHO-AGENT'S CONFIG FILE +############################################################################### +### Agent + +# hostname +# default : socket.gethostname() +hostname = "%%nom_machine.%%nom_domaine_local" + +# If set in Gaspacho, gaspacho-agent can install packages. +# You can disabled it +# default: True +#allow_install_pkg = True + +### Server + +# Gaspacho server address +# This option MUST be set +gasp_server = '%%adresse_ip_gaspacho' + +# Gaspacho server port +# default: 443 +%if %%gaspacho_https == 'oui' +gasp_port = '443' +%else +gasp_port = '8080' +%end if + +# SSL support +# default: False +# +gasp_tls = True + +# HTTP path +# default: /genconfig +%if %%gaspacho_https == 'oui' +gasp_http_path = '%%gaspacho_http_path' +%else +gasp_http_path = '' +%end if + +### Log and debugging + +# Log level +# must be in 'critical', 'error', 'warning', 'info' or 'debug' +# default: 'error' +#log_level = 'debug' + +# Display log informations in console +# default: False +#display_log = True + +# Use a local file +#ONLY FOR DEBUG: +#gasp_user_filename = '/root/ALL.gasp' +#gasp_computer_filename = '/root/computer.gasp' +#gasp_context_filename = '/root/context.gasp' diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-gaspacho/dictionaries/51_gaspacho.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gaspacho/dictionaries/51_gaspacho.xml new file mode 100644 index 0000000000000000000000000000000000000000..2f151ddf80c9e9104fcd33ca1dd3a0b6eb784804 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gaspacho/dictionaries/51_gaspacho.xml @@ -0,0 +1,119 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + <service method='apache' servicelist='gaspacho_apache'>gaspacho-apache</service> + <file name='/etc/nginx/web.d/gaspacho.conf' source='gaspacho.nginx.conf' mkdir='True' rm='True' filelist='gaspacho_nginx' /> + <file name='/etc/apache2/sites-available/gaspacho-apache.conf' source='gaspacho.apache.conf' filelist='gaspacho_apache' /> + </files> + + <containers> + <container name="gaspacho" id="24" group="fichier"> + <package>gaspacho</package> + <service servicelist="gaspacho">gaspacho</service> + <file name="/etc/gaspacho/gaspacho.conf" filelist="gaspacho" mkdir="True"/> + <file name="/etc/gaspacho/eole.conf" filelist="gaspacho" source="eole_gaspacho.conf"/> + <file name="/etc/default/gaspacho" filelist="gaspacho" rm="True"/> + <service_access service='gaspacho'> + <port>8080</port> + </service_access> + </container> + </containers> + + <variables> + <family name='services'> + + <variable name='test_activer_gaspacho' type='oui/non' description='Vérifier si l’on peut activer Gaspacho' /> + + <variable name='activer_gaspacho' type="oui/non" description="Activer Gaspacho"> + <value>oui</value> + </variable> + + <!-- Workaround when eole-reverseproxy is not installed --> + <variable name='activer_nginx_web' type='oui/non' exists='False' hidden='True'> + <value>non</value> + </variable> + + <variable name='nginx_degrade_http' type='oui/non' exists='False' hidden='True'> + <value>non</value> + </variable> + + <!-- Workaround when eole-web is not installed --> + <variable name='activer_apache' type='oui/non' exists='False' hidden='True'> + <value>non</value> + </variable> + + </family> + <family name='gaspacho' mode='expert' icon='coffee'> + <variable name='gaspacho_force_resolve_dns_name' type="oui/non" description="Utiliser les entrées DNS des clients plutôt que le nom fourni par l'agent"> + <value>non</value> + </variable> + <variable name='gaspacho_https' type='oui/non' description="Forcer l'accès à Gaspacho sur le port 80" hidden='True'> + <value>oui</value> + </variable> + <variable name='gaspacho_http_path' type='string' description='Chemin d’accès de l’application Gaspacho' mode='expert'> + <value>/gaspacho</value> + </variable> + </family> + </variables> + + <constraints> + <condition name="disabled_if_in" source="activer_gaspacho"> + <param>non</param> + <target type="family">gaspacho</target> + <target type="servicelist">gaspacho</target> + <target type="servicelist">gaspacho_apache</target> + <target type="filelist">gaspacho</target> + <target type='filelist'>gaspacho_apache</target> + <target type='filelist'>gaspacho_nginx</target> + </condition> + + <condition name='frozen_if_in' source='activer_gaspacho'> + <param>non</param> + <target type='variable' optional="True">activer_gaspacho_agent</target> + </condition> + + <!-- Check if service can be enabled on master only: + - When container is enabled, check only for activer_nginx_web + - All other cases must check activer_nginx_web and apache + --> + <auto name='activate_master_only_web_app' target='test_activer_gaspacho'> + <param type='eole' name='mode_conteneur_actif'>mode_conteneur_actif</param> + <param type='eole' name='activer_nginx_web' hidden='False'>activer_nginx_web</param> + <param type='eole' name='activer_apache' hidden='False'>activer_apache</param> + </auto> + + <condition name='disabled_if_in' source='test_activer_gaspacho'> + <param>non</param> + <target type='variable'>activer_gaspacho</target> + </condition> + + <!-- Do not configure Nginx if Nginx is disabled --> + <condition name='disabled_if_in' source='activer_nginx_web' fallback='True'> + <param>non</param> + <target type='filelist'>gaspacho_nginx</target> + </condition> + + <!-- Do not configure Apache if we use Nginx --> + <condition name='disabled_if_in' source='activer_nginx_web' fallback='True'> + <param>oui</param> + <target type='filelist'>gaspacho_apache</target> + <target type='servicelist'>gaspacho_apache</target> + </condition> + + <!-- Do not configure Apache if Apache is disabled --> + <condition name='disabled_if_in' source='activer_apache' fallback='True'> + <param>non</param> + <target type='filelist'>gaspacho_apache</target> + <target type='servicelist'>gaspacho_apache</target> + </condition> + + </constraints> + <help> + <family name='gaspacho'>Paramétrage avancé de la configuration des postes de travail</family> + <variable name='activer_gaspacho'>Gaspacho est une application permettant de configurer automatiquement le poste de travail de l'utilisateur selon son profil</variable> + </help> +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-gaspacho/files/usr/share/eole/diagnose/17-gaspacho b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gaspacho/files/usr/share/eole/diagnose/17-gaspacho new file mode 100644 index 0000000000000000000000000000000000000000..6471de1cc1272ca7fb5a1f5b990aabe0d20b4205 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gaspacho/files/usr/share/eole/diagnose/17-gaspacho @@ -0,0 +1,14 @@ +#!/bin/bash + +#si l'agent est local, le test est déjà fourni par conf-eclair +if [ $(CreoleGet activer_gaspacho_agent non) != 'oui' ];then + . /usr/lib/eole/diagnose.sh + EchoGras "*** Serveur Gaspacho" + if [ $(CreoleGet activer_gaspacho) = 'oui' ];then + TestService Gaspacho $(CreoleGet container_ip_gaspacho):8080 + else + Inactif Gaspacho + fi + echo +fi +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-gaspacho/posttemplates/00-gaspacho b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gaspacho/posttemplates/00-gaspacho new file mode 100644 index 0000000000000000000000000000000000000000..8b63f5306198d60cd9815063261583545a77f4fc --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gaspacho/posttemplates/00-gaspacho @@ -0,0 +1,25 @@ +#!/bin/bash + +. /usr/lib/eole/ihm.sh + + +option=$1 +rep=0 + +[ "$(CreoleGet activer_gaspacho)" = "non" ] && exit 0 +gaspdir=$(CreoleGet container_path_gaspacho)/var/lib/gaspacho +mkdir -p $gaspdir +if [ -f "$gaspdir/gaspacho.sqlite" ]; then + if [ "$option" = 'instance' ]; then + Question_ouinon "La base gaspacho a déjà été initialisée, voulez-vous la réinitialiser ?" "True" "non" "warn" + rep=$? + else + rep=1 + fi +fi + +if [ "$rep" = "0" ]; then + CreoleService gaspacho stop -c gaspacho + rm -f $gaspdir/gaspacho.sqlite + CreoleRun "/usr/share/gaspacho/init_gaspacho.py" gaspacho +fi diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-gaspacho/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gaspacho/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..5a49a8d268cb3a61aac083752c6a387b2b6f2df0 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gaspacho/service.yml @@ -0,0 +1,34 @@ +format: '0.1' +name: eole-gaspacho +version: |- + 2.7.0-2 +description: |- + Eolisation de Gaspacho + Gaspacho permet de configurer indifféremment un ensemble de logiciels + et de systèmes avec des choix déterminés par l’administrateur. + . + Ce paquet fournit l’environnement de configuration EOLE du serveur gaspacho. +depends: [] +packages: [] +dictionaries: + - 51_gaspacho.xml +extra_dictionaries: {} +templates: + - eole_gaspacho.conf + - gaspacho + - gaspacho.apache.conf + - gaspacho.conf + - gaspacho.nginx.conf +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: + - 00-gaspacho +files: + /usr/share/eole/diagnose/17-gaspacho: + owner: root + group: root + mode: '0755' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-gaspacho/templates/eole_gaspacho.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gaspacho/templates/eole_gaspacho.conf new file mode 100644 index 0000000000000000000000000000000000000000..ce53d92981ce221a7c38f496d09145c79ad6ea50 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gaspacho/templates/eole_gaspacho.conf @@ -0,0 +1,49 @@ +#liste des fichiers importes +import_files = [ +'/usr/share/gaspacho/import/ubuntu/18.04/firefox.gasp', +'/usr/share/gaspacho/import/ubuntu/18.04/vlc.gasp', +'/usr/share/gaspacho/import/ubuntu/18.04/gajim.gasp', +'/usr/share/gaspacho/import/ubuntu/18.04/mate_general.gasp', +'/usr/share/gaspacho/import/ubuntu/18.04/mate_network.gasp', +'/usr/share/gaspacho/import/ubuntu/18.04/mate_lock.gasp', +] + +#adresse IP +%if %%nombre_interfaces == '1': +adresse_ip="%%adresse_ip_eth0" +proxy_client_bypass="127.0.0.1 %%adresse_network_eth0/%%calc_classe(%%adresse_netmask_eth0)" +%else +adresse_ip="%%adresse_ip_eth1" +proxy_client_bypass="127.0.0.1 %%adresse_network_eth1/%%calc_classe(%%adresse_netmask_eth1)" +%end if + +#proxy +%if %%is_defined('activer_filtrage_proxy') +activer_proxy_client="oui" +proxy_client_adresse="%%adresse_ip_eth1_proxy_link" +proxy_client_port="3128" +%else +activer_proxy_client="%%activer_proxy_client" +%if %%activer_proxy_client == 'oui' +proxy_client_adresse="%%proxy_client_adresse" +proxy_client_port="%%proxy_client_port" +%end if +%end if + +#jabber +%if %%is_defined('activer_ejabberd') +activer_ejabberd="%%activer_ejabberd" + %if %%activer_ejabberd == 'oui' +domain_jabber_etab="%%domain_jabber_etab" + %end if +%else +activer_ejabberd="non" +%end if + +#mail +%if %%is_defined('activer_courier') +activer_courier="%%activer_courier" +domaine_messagerie_etab="%%domaine_messagerie_etab" +%else +activer_courier="non" +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-gaspacho/templates/gaspacho b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gaspacho/templates/gaspacho new file mode 100644 index 0000000000000000000000000000000000000000..50c9344d55a741f41f4077e404349cfcabe79caf --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gaspacho/templates/gaspacho @@ -0,0 +1 @@ +DAEMON_ARGS="-noy /usr/share/gaspacho/website.tac" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-gaspacho/templates/gaspacho.apache.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gaspacho/templates/gaspacho.apache.conf new file mode 100644 index 0000000000000000000000000000000000000000..64d77acf2fea74e480f3a8822dfaac33c6e0c135 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gaspacho/templates/gaspacho.apache.conf @@ -0,0 +1,23 @@ +%if %%gaspacho_http_path == '/' + %set %%http_path = '/' +%else + %set %%http_path = %%gaspacho_http_path + '/' +%end if +SSLProxyEngine On +<Location %%http_path> + RewriteEngine On + RewriteCond %{HTTPS} off + RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] + + ProxyPass https://127.0.0.1:8080/ + ProxyPassReverse https://127.0.0.1:8080/ + RequestHeader set X-Forwarded-Proto "https" + + # Default to Deny + Order Allow,Deny + %if int(%%nombre_interfaces) > 1 + Allow from %%adresse_network_eth1/%%adresse_netmask_eth1 + %else + Allow from %%adresse_network_eth0/%%adresse_netmask_eth0 + %end if +</Location> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-gaspacho/templates/gaspacho.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gaspacho/templates/gaspacho.conf new file mode 100644 index 0000000000000000000000000000000000000000..db46054c5a5ba4331b9d14e1fb9f72b69a026a30 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gaspacho/templates/gaspacho.conf @@ -0,0 +1,94 @@ +############################################################################### +# GASPACHO'S CONFIG FILE +############################################################################### + + +### Server + +# Port +# default: 8080 +# +#serv_port = '8080' + +# SSL support +# default: disabled +# +serv_tls = True +serv_crt = '%%server_cert' +serv_key = '%%server_key' + + +### Servers + +# Directory where data generated when 'apply' are store +# +store_dir_apply = '/var/lib/gaspacho/apply' + +# Directory where static web files are: +serv_static_path = '/usr/share/gaspacho/' + +# SQLITE example +# +database = 'sqlite:////var/lib/gaspacho/gaspacho.sqlite' + +# MYSQL example +# create database on Mysql: +# create database gaspacho; +# GRANT ALL PRIVILEGES ON gaspacho.* TO 'gaspacho'@'localhost'; +# +#database = 'mysql://gaspacho@localhost/gaspacho' + +# Multi site support +# Experimental, active it only if you know what you done +#multi_site = False + +# Client send machin name, but Gaspacho use DNS entry if this option is True +# default: True +%if %%gaspacho_force_resolve_dns_name == 'oui' +#force_resolve_dns_name = False +%else +force_resolve_dns_name = False +%end if + +### Language + +# Language +# +default_serv_lang = 'fr' + +# Language order if not translate in selected language +# +#ordered_lang = 'en', 'fr' + + +### Users + +# User can be internal to Gaspacho (only one user (gaspacho_login)/password +# (gaspacho_password) is allowed) or you can use PAM account. +# If you use PAM accound, don't forget to list allowed user (allowed_pam_user). +# default: internal +# +auth_type = PAM + +# When using PAM account, you set a list of user allowed to connect in. +# None to allow every PAM user to connect +# default: root, gaspacho +# +admin_pam_user = root, eole, admin + +# When disabled PAM, name/password of user +#gaspacho_login = admin +#gaspacho_password = admin + +### Log + +# Log level +# must be in 'critical', 'error', 'warning', 'info' or 'debug' +# default: 'error' +#log_level = 'error' + +# Log file's name +# parent's directory must exist +# default: /var/log/gaspacho/error.log +#log_file = '/var/log/gaspacho/error.log' + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-gaspacho/templates/gaspacho.nginx.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gaspacho/templates/gaspacho.nginx.conf new file mode 100644 index 0000000000000000000000000000000000000000..cf8b4147c9693d30817ed1305b86f09d0ed76795 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gaspacho/templates/gaspacho.nginx.conf @@ -0,0 +1,30 @@ +%if %%gaspacho_http_path == '/' + %set %%http_path = '/' +%else + %set %%http_path = %%gaspacho_http_path + '/' +%end if +location %%http_path { + access_log /var/log/nginx/gaspacho-access.log; + error_log /var/log/nginx/gaspacho-error.log; + proxy_pass https://%%container_ip_gaspacho:8080/; + proxy_set_header X-Forwarded-Proto $scheme; + + %if %%mode_conteneur_actif == 'oui' + # Allow from thin clients in container + allow 192.0.2.0/24; + %end if + %if int(%%nombre_interfaces) > 1 + %set %%net = %%adresse_network_eth1 + '/' + %%calc_classe(%%adresse_netmask_eth1) + %else + %set %%net = %%adresse_network_eth0 + '/' + %%calc_classe(%%adresse_netmask_eth0) + %end if + # Allow from FAT clients + %if %%net == '0.0.0.0/0.0.0.0' + allow all; + %else + allow %%net; + %end if + + # Deny by default + deny all; +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/dictionaries/00_eole-genconfig_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/dictionaries/00_eole-genconfig_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..8649d675cecc6b7a3174b2e318c6eb99d6d458be --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/dictionaries/00_eole-genconfig_packages.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>python-eolegenconfig</package> + <package>eoleflask-aaa</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/dictionaries/29_genconfig.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/dictionaries/29_genconfig.xml new file mode 100644 index 0000000000000000000000000000000000000000..0075b72bb6883b0a010cbb7a2b950eec432625ac --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/dictionaries/29_genconfig.xml @@ -0,0 +1,129 @@ +<?xml version='1.0' encoding='utf-8'?> + +<creole> + + <files> + <service method='apache' servicelist='genconfig_apache'>genconfig</service> + <file name='/etc/nginx/web.d/genconfig.conf' source='genconfig.nginx.conf' mkdir='True' rm='True' filelist='genconfig_nginx' /> + <file name='/etc/apache2/sites-available/genconfig.conf' source='genconfig.apache.conf' filelist='genconfig_apache' /> + </files> + + <variables> + + <family name='Services'> + + <variable name='test_activer_genconfig' type='oui/non' description='Vérifier si l’on peut activer l’interface de configuration du module (GenConfig)' /> + + <variable name='test_activer_genconfig_https' type='oui/non' description='Vérifier si HTTPS Nginx est désactivé pour l’interface de configuration du module (GenConfig)' /> + + <variable name='activer_genconfig' type='oui/non' description='Activer l’interface de configuration du module (GenConfig)' mode='expert'> + <value>oui</value> + </variable> + + <!-- Workaround when eole-reverseproxy is not installed --> + <variable name='activer_nginx_web' type='oui/non' exists='False' hidden='True'> + <value>non</value> + </variable> + + <variable name='nginx_degrade_http' type='oui/non' exists='False' hidden='True'> + <value>non</value> + </variable> + + <!-- Workaround when eole-web is not installed --> + <variable name='activer_apache' type='oui/non' exists='False' hidden='True'> + <value>non</value> + </variable> + + </family> + + <family name='Applications web Nginx'> + + <variable name='genconfig_http_path' type='string' description='Chemin d’accès de l’application GenConfig' mode='expert'> + <value>/genconfig</value> + </variable> + + </family> + + <separators> + <!-- Make GenConfig more readable: each application under its own separator --> + <separator name='genconfig_http_path'>GenConfig</separator> + </separators> + + </variables> + + <constraints> + + <!-- User can disable GenConfig --> + <condition name='disabled_if_in' source='activer_genconfig'> + <param>non</param> + <target type='variable'>genconfig_http_path</target> + <target type='filelist'>genconfig_apache</target> + <target type='filelist'>genconfig_nginx</target> + <target type='servicelist'>genconfig_apache</target> + </condition> + + <!-- Check if service can be enabled on master only: + - When container is enabled, check only for activer_nginx_web + - All other cases must check activer_nginx_web and apache + --> + <auto name='activate_master_only_web_app' target='test_activer_genconfig'> + <param type='eole' name='mode_conteneur_actif'>mode_conteneur_actif</param> + <param type='eole' name='activer_nginx_web' hidden='False'>activer_nginx_web</param> + <param type='eole' name='activer_apache' hidden='False'>activer_apache</param> + </auto> + + <condition name='disabled_if_in' source='test_activer_genconfig'> + <param>non</param> + <target type='variable'>activer_genconfig</target> + </condition> + + <!-- GenConfig requires HTTPS + Use calc_multi_condition to by-pass the absence of: + + “do not disable target if source is disabled†+ --> + <auto name='calc_multi_condition' target='test_activer_genconfig_https'> + <param>non</param> + <param type='eole' name='condition_1' hidden='False'>nginx_degrade_http</param> + <param name='match'>oui</param> + <param name='mismatch'>non</param> + </auto> + + <condition name='disabled_if_in' source='test_activer_genconfig_https'> + <param>non</param> + <target type='variable'>activer_genconfig</target> + </condition> + + <!-- Do not configure Nginx if Nginx is disabled --> + <condition name='disabled_if_in' source='activer_nginx_web' fallback='True'> + <param>non</param> + <target type='filelist'>genconfig_nginx</target> + </condition> + + <!-- Do not configure Apache if we use Nginx --> + <condition name='disabled_if_in' source='activer_nginx_web' fallback='True'> + <param>oui</param> + <target type='filelist'>genconfig_apache</target> + <target type='servicelist'>genconfig_apache</target> + </condition> + + <!-- Do not configure Apache if Apache is disabled --> + <condition name='disabled_if_in' source='activer_apache' fallback='True'> + <param>non</param> + <target type='filelist'>genconfig_apache</target> + <target type='servicelist'>genconfig_apache</target> + </condition> + + </constraints> + + <help> + + <variable name='test_activer_genconfig'>Vérifier que la publication web par Nginx ou Apache est active</variable> + <variable name='activer_genconfig'>Publier l’interface de configuration du module sur le port standard HTTPS (443)</variable> + <variable name='genconfig_http_path'>Chemin absolu (commençant par un /) sous lequel le service GenConfig sera accessible</variable> + + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/etc/chromium-browser/policies/managed/genconfig.json b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/etc/chromium-browser/policies/managed/genconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..e7bd05a2cc699c082921f64ccd310c3aa92e0c18 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/etc/chromium-browser/policies/managed/genconfig.json @@ -0,0 +1,5 @@ +{ + "TranslateEnabled": false, + "HardwareAccelerationModeEnabled": false, + "IncognitoModeAvailability": 2, +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/etc/eole/flask/available/eolegenconfig.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/etc/eole/flask/available/eolegenconfig.conf new file mode 100644 index 0000000000000000000000000000000000000000..68ec17457213d266758e15eb42a06b0b4bb7b92f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/etc/eole/flask/available/eolegenconfig.conf @@ -0,0 +1,10 @@ +{ +"APPNAME":"eolegenconfig", +"MOUNT_POINT":"/genconfig", +"LABEL":"Genconfig", +"DEBUG":"TRUE", +"EOLEAUTH_PLUGIN": "ZephirPAMClient", +"EOLEAUTH_MODE":"LOCAL", +"ALLOWED_USERS":["root"], +"LOG_LEVEL":"INFO" +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/README.txt b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/README.txt new file mode 100644 index 0000000000000000000000000000000000000000..157490a7e408612710b6041c73551e96c491821b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/README.txt @@ -0,0 +1,138 @@ +Event Handling : +---------------- + +- onBlur => Save IF (value != prev_value) + => After Save + => Reload Categories + => Reload Current Category Variables + +- onEnterKeyDown => Save IF (value != prev_value) OR (default_owner) + => Prevent Default + => StopPropagation + => After Save + => Reload Categories + => Reload Current Category Variables + +- onTabKeyDown => Save IF (value != pref_value) + => Prevent Default + => StopPropagation + => After Save + => Reload Categories + => Reload Current Category Variables + => Edit Next/Previous Variable +Variables Types : +----------------- + +- String +- Integer +- IP +- Choice +- OpenChoice +- Multi [String|Integer|IP|Choice|OpenChoice] +- Group [Master|Slaves] + + +Variable View : +--------------- + +define(['vent','templates','kb'], +function(vent, templates, kb){ + + +return Marionette.ItemView.extend({ + + tagName: 'div', + + template: templates.variable, + + ui: { + input: 'input[name="value"], + select[name="value"]' + }, + + events: { + 'blur input[name="value"], + select[name="value"]': 'onBlur', + 'keyup input[name="value"], + select[name="value"]': 'onKeyup', + 'keydown input[name="value"], + select[name="value"]': 'onKeydown' + } + + modelEvents: {}, + collectionEvents: {}, + callbacks: new Backbone.Marionette.Callbacks(), + + initialize: function(){ + + }, + + onRender: function(){ + switch(model.getType()){ + case 'string': + this.ui.input.attr({ type: 'text' }); + break; + case 'int': + this.ui.input.attr({ type: 'number' }); + break; + case 'ip': + this.ui.input.attr({ type: 'text' }); + break; + case 'choice': + this.ui.input.attr({ type: 'text' }).select(); + + case 'string': this.ui.input.attr({ type: 'text' }); + } + }, + + sync: false, + + onBlur: function(e){ + if(this.model.get('value') != this.ui.input.val() && !this.sync) + this.save(); + }, + + onKeyup: function(e){ + + }, + + onKeydown: function(e){ + switch(e.keyCode){ + case kb.TAB: + if(this.model.get('value') != this.ui.input.val()) + this.save(callback); + else + callback(); + break; + case kb.ENTER: + if(this.model.get('value') != this.ui.input.val() || this.model.get('defaut_owner')) + this.save(); + break; + } + }, + + save: function(callback){ + this.model.save({ value: this.ui.input.val() },{ + success : _.bind(this.onSuccess), + error : _.bind(this.onError) + }); + }, + + onSuccess: function(model, reponse){ + + }, + + onError: function(model, response){ + this.ui.saveBtn.button('reset'); + this.$el.addClass('error'); + this.ui.msg.show().empty() + .append($('<i>').addClass('icon-warning-sign')) + .append(' '+response.responseText); + this.focus(); + }, + + templatesHelper: { + + } + +}); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/css/app.css b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/css/app.css new file mode 100644 index 0000000000000000000000000000000000000000..02332a620f8b726373a0fe195d1e93ea077bfb63 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/css/app.css @@ -0,0 +1,3927 @@ +body { + padding: 0px !important; + margin: 0px !important; + color: #555555; + font-family: "ExoRegular","Helvetica Neue",Helvetica,Arial,sans-serif; + font-size: 14px; + line-height: 18px; +} + + +[class^="icon-"], [class*=" icon-"],[class^="icon-"]:hover, [class*=" icon-"]:hover { + background: none !important; +} + +#sidebar .lead { + height: 30px; + margin: 0px; + padding: 5px 0 15px; +} +#sidebar .lead, +#sidebar .lead i { + color: #FFF; + text-shadow:#DDD 0px 1px 0, #888 0 -1px 0; +} + +#top_menu { + margin: 0; + padding: 5px 0 5px 5px; +} + +.navbar .nav.top-menu { + margin: 0; +} + +#header .top-nav .nav.top-menu { + margin: 0; + padding: 5px 0 5px 0; +} + +.visible-ie8 { + display: none; +} + +span.loading i.icon-spin { + font-size: 22px; +} + +span.loading { + padding: 3px 6px; + float: none; + display: block; + width: 20px; +} + +.alert { + margin-bottom: 0px; +} + +.null_value { + color: #FE008F; +} + +.variable.group > .breadcrumb { + clear: both; +} +.variable.group > .view { + margin-top: 6px; + position: relative; + clear: both; +} + +@font-face { + font-family: 'MyriadPro-Bold'; + src: url('../font/myriadprobold.eot'); + src: url('../font/myriadprobold.eot?#iefix') format('embedded-opentype'), + url('../font/myriadprobold.woff') format('woff'), + url('../font/myriadprobold.ttf') format('truetype'), + url('../font/myriadprobold.svg#myriadprobold') format('svg'); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'MyriadPro-It'; + src: url('../font/myriadproit.eot'); + src: url('../font/myriadproit.eot?#iefix') format('embedded-opentype'), + url('../font/myriadproit.woff') format('woff'), + url('../font/myriadproit.ttf') format('truetype'), + url('../font/myriadproit.svg#myriadproit') format('svg'); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'MyriadPro-Light'; + src: url('../font/myriadprolight.eot'); + src: url('../font/myriadprolight.eot?#iefix') format('embedded-opentype'), + url('../font/myriadprolight.woff') format('woff'), + url('../font/myriadprolight.ttf') format('truetype'), + url('../font/myriadprolight.svg#myriadprolight') format('svg'); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'MyriadPro-Regular'; + src: url('../font/myriadproregular.eot'); + src: url('../font/myriadproregular.eot?#iefix') format('embedded-opentype'), + url('../font/myriadproregular.woff') format('woff'), + url('../font/myriadproregular.ttf') format('truetype'), + url('../font/myriadproregular.svg#myriadproregular') format('svg'); + font-weight: normal; + font-style: normal; +} + +/* general typography*/ +h3 small, h2 small, h5 small { + color: #868686; +} + +h1, h2, h3, h4, h5, h6 { + font-weight: normal; +} + + +h1.block, h2.block, h3.block, h4.block, h5.block, h6.block { + padding-bottom: 10px; +} + +.page-title { + font-size: 28px; + display: block; + font-weight: normal !important; + margin: 13px 0px 8px 0px; + color: #555; +} +.page-title small { + font-size: 14px; +} + +/* general tools */ +img.center { + text-align:center; +} +.phone-margin-top-5:before { + display: block; + margin-top: 5px; +} +.no-padding { + padding: 0px !important; +} +.no-margin { + margin: 0px !important; +} +.no-bottom-space { + padding-bottom:0px !important; + margin-bottom: 0px !important; +} +.no-top-space { + padding-top:0px !important; + margin-top: 0px !important; +} +.block-margin-bottom-5 { + display: inline-block; + margin-bottom: 5px; +} +.hide { + display: none; +} +.bold { + font-weight:bold; +} + +.fix-margin { + margin-left: 0px !important +} + +.border { + border: 1px solid #ddd +} + + +.btn-top-space { + margin-top: 5px !important; +} + +.italic { + font-style: italic !important; +} + +i.big { + font-size: 20px; +} + +i.warning { + color: #E74955; +} + +i.critical { + color: #22878E; +} + +i.normal { + color: #A5D16C; +} + +hr { + margin: 15px 0; + border: 0; + border-top: 1px solid #E0DFDF; + border-bottom: 1px solid #FEFEFE; +} + +i.icon, a.icon { + color: #999; +} + +a.icon:hover { + text-decoration: none; + -webkit-transition: all 0.1s ease-in-out; + -moz-transition: all 0.1s ease-in-out; + -o-transition: all 0.1s ease-in-out; + -ms-transition: all 0.1s ease-in-out; + transition: all 0.1s ease-in-out; + opacity: .4; +} + +a.icon.huge i{ + font-size: 16px !important; +} + +.space5 { + display: block; + height: 5px !important; + clear: both; +} + +.space7 { + height: 7px !important; + clear: both; +} + +.space10 { + height: 10px !important; + clear: both; +} + +.space12 { + height: 12px !important; + clear: both; +} + +.space15 { + height: 15px !important; + clear: both; +} + +.space20 { + height: 20px !important; + clear: both; +} + +.mtop5 { + margin-top: 5px +} + +.mtop7 { + margin-top: 7px +} + +.mtop10 { + margin-top: 10px +} + +.no-text-shadow { + text-shadow: none !important; +} + +.notify-row { + float: left; + padding: 5px; +} + +/*fix outlines on click*/ +a,a:focus, a:hover, a:active { + outline: 0; +} + +/*logo*/ +#header .brand { + background:#333333; + margin-top: 0px !important; + opacity:0.6; + filter:alpha(opacity=60); + padding: 14px 35.5px; + width: 144px; +} + +/* header nav bar*/ +#header.navbar { + min-width: 0px; +} +#header .navbar .nav > li > a{ + padding:0px !important; +} + +.navbar .nav > li > a { + padding: 3px 6px; +} + +#header .navbar-inner .nav > li { + margin-left: 0px !important; + margin-right: 0px !important; +} + +#header .navbar-inner li.dropdown .dropdown-toggle i { + font-size: 20px; +} + +#header .navbar-inner li.dropdown .dropdown-toggle .label { + position: relative; + top:-3px; + font-size: 9px !important; + padding-top: 0px !important; + padding-bottom: 0px !important; + margin-top: 0px !important; + display: inline-block !important; +} + +#header .navbar-inner .nav .dropdown-toggle:hover, .navbar-inner .nav .dropdown.open .dropdown-toggle { + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +#header.navbar-inverse .btn-navbar { + margin-top: 7px; + color: white; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background: url("../img/bg-default.jpg") repeat scroll 0 0 #32C2CD !important; /*none repeat scroll 0 0 #333333;*/ + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) #B3B3B3; + outline: medium none; +} + +#header.navbar-inverse .btn-navbar:hover { + background-color: #caced1; +} + +#header .navbar-inner { + top:0px; + width: 100%; + margin: 0px !important; + margin-bottom: -2px !important; + border-top: 0px !important; + border-left: 0px !important; + border-right: 0px !important; + padding: 0px; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +#header.navbar-inverse .navbar-inner { + height: 50px; + border:none !important; +} + +#header.navbar-inverse .divider-vertical { + height: 40px; +} + +#header .navbar-search { + margin-left: 110px; +} + +#header .top-nav .dropdown-menu { + margin-top: 3px; +} + +.top-menu { + padding: 5px; +} + +.navbar .nav .dropdown-toggle .caret { + margin-top: 12px; +} + +.top-nav .nav > li > a > img { + border-radius: 20px; + -moz-border-radius: 20px; + -webkit-border-radius: 20px; +} + +.navbar-inverse .navbar-search .search-query { + background-color: #FFFFFF; + border: 0 none; + box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + color: #333333; + outline: 0 none; + padding: 5px 15px; + text-shadow: none; + +} + +/* main container */ +#container { + +} + +.fixed-top #container { + margin-top: 60px; +} + +/* i8 fix for form input height in fluid rows */ +.ie8 .row-fluid [class*="span"] { + min-height: 20px !important; +} + +/* body container */ +#login-body { + background-color: #f7f7f7 !important; + background-image: url("../img/body-bg.png") !important; +} + +#main-content { + margin-top: 0px; + margin-left: 215px; + min-height: 800px; + background: #f7f7f7 url("../img/body-bg.png"); +} + +/* page container */ +.sidebar-toggler { + -webkit-border-radius: 15px 0px 0px 15px; + -moz-border-radius: 15px 0px 0px 15px; + border-radius: 15px 0px 0px 15px; + cursor: pointer; + display: block; + float: right; + margin-top: 12px; + width: 23px; + height: 25px; + background: #e9ebec url("../img/body-bg.png"); +} + +.sidebar-toggler:before { + margin: 2px 2px 7px 8px; + display: block; + font-size: 18px; + font-family: FontAwesome; + height: auto; + content: "\f104"; + font-weight: 300; + text-shadow:none; +} + +.sidebar-toggler.closed:before, +.sidebar-closed .sidebar-toggler:before { + margin: 2px 2px 7px 10px; + content: "\f105"; +} +/* sidebar menu */ + +[class^="icon-"], [class*=" icon-"] { + margin-top: 0; +} + +ul.sidebar-menu span.icon-box { + background: url("../img/side-bar-list-bg.png") !important; + padding: 6px; + margin-right: 10px; + width:20px; + display: inline-block; +} + +#sidebar .navbar-search { + border: 0px; + -webkit-box-shadow: none !important; + -moz-box-shadow: none !important; + box-shadow: none !important; +} + +#sidebar > ul { + list-style: none; + margin: 0; + padding: 0; + margin: 0; + padding: 0; + -webkit-border-radius: 0px; + -moz-border-radius: 0px; + border-radius: 0px; +} + +#sidebar > ul > li { + display: block; + margin: 0 0 1px 0; + padding: 0; + border: 0px; + background: url("../img/side-bar-list-bg.png"); + line-height: 30px; +} + +#sidebar > ul > li > a { + display: block; + position: relative; + margin: 0; + border: 0px; + padding: 0px 15px 0px 0; + -webkit-border-radius: 0px !important; + -moz-border-radius: 0px !important; + border-radius: 0px !important; + text-decoration: none; + font-size: 14px; + font-weight: normal; +} + +#sidebar > ul > li a i { + color:#eaeaea; + font-size: 18px; +} + +#sidebar > ul > li.active > a{ + border: none; +} + + +#sidebar > ul > li.active > a .arrow { + margin-right: 1px; +} + +#sidebar > ul > li.active > a .arrow.open { + margin-right: 0px; +} + + +#sidebar ul > li > a .arrow { + float: right; + margin-top: 27px; + margin-right: 5px; + width: 0; + height: 0; + border-left: 4px solid #f3f3f3; + border-top: 4px solid transparent; + border-bottom: 4px solid transparent; +} + +#sidebar > ul > li > a .arrow.open { + float: right; + margin-top: 27px; + margin-right: 3px; + width: 0; + height: 0; + border-top: 5px solid #f3f3f3; + border-left: 4px solid transparent; + border-right: 4px solid transparent; +} + +#sidebar > ul > li > ul.sub { + display: none; + list-style: none; + clear: both; + margin: 0px; +} + +#sidebar > ul > li.active > ul.sub { + display: block; +} + +#sidebar > ul > li > ul.sub > li { + background: none !important; + padding: 0px; +} + +#sidebar > ul > li > ul.sub > li > a { + display: block; + position: relative; + padding: 10px 10px 10px 60px; + color: #ccc; + text-decoration: none; + text-shadow: 0 1px 1px #000; + font-size: 13px; + font-weight: normal; +} + +#sidebar > ul > li > ul.sub > li.active > a, #sidebar > ul > li > ul.sub > li > a:hover { + + background: url("../img/submenu_hover.png") !important; +} + +/* ie8, ie9 fixes */ +.ie8 #sidebar .search-query, .ie8 #header .search-query { + padding-top: 7px !important; + padding-bottom: 5px !important; +} + +.ie9 #sidebar .search-query, .ie9 #header .search-query { + padding-bottom: 0px !important; + height: 24px; +} + +.ie9 #sidebar > ul > li.active > a .triangle { + right: -1px; +} + +/* ie10 fixes */ +.ie10 #header .search-input-area > i, .ie10 #sidebar .search-input-area > i { + top:-2px !important; +} + +/* ie8 fixes */ +.ie8 #sidebar { + position: absolute; + width: 215px; +} + +.ie8 #sidebar ul{ + margin-top:47px; + width: 215px; +} + +/* footer container */ + +#footer { + color: #FFFFFF; + font-size: 12px; + padding: 8px 20px 5px; + text-align: center; +}a + +#footer .go-top { + display: block; + font-size: 12px; + text-decoration: none; + color: #fff; + cursor: pointer; + margin-top: -3px; + margin-right: 0px; + margin-bottom: 0px; + font-size: 16px; + background-color: #111; + opacity: 0.8; + padding: 3px 5px 2px 6px; + opacity:0.4; + filter: alpha(opacity = 40); + -webkit-border-radius: 20px; + -moz-border-radius: 20px; + border-radius: 20px; +} + +/* custom wells */ +.well { + background-color: #fafafa; + border: 1px solid #ddd; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: none !important; + -moz-box-shadow: none !important; + box-shadow: none !important; +} + +.well.mini { + padding: 7px !important; +} + + +.tab-content { + padding: 0px; + overflow: hidden; +} + +/* general form */ +form legend { + margin: 15px 0px 10px 0px !important; +} + +.form-actions { + background-color: #fff ; +} + +.widget-body.form form { + margin: 0px !important; + padding: 0px !important; +} + +.widget-body.form .control-group:last-child { + padding-bottom: 0px !important; + margin-bottom: 0px !important; +} + +.widget-body.form .form-actions{ + margin-left:-15px !important; + margin-right:-15px !important; + margin-top: 20px !important; + margin-bottom: -15px !important; + margin-top: 20px; + padding-left: 195px; + -webkit-border-radius: 0px 0px 4px 4px; + -moz-border-radius: 0px 0px 4px 4px; + border-radius: 0px 0px 4px 4px; +} + +.widget-body .dataTables_info, .widget-body .dataTables_paginate { + margin-top: 5px !important; + padding-bottom: 0px !important; + margin-bottom: -4px !important; +} + +.widget-body .table { + padding-bottom: 0px !important; + margin-bottom: 0px !important; +} + +.widget-title > h4, .breadcrumb > li> a:hover, .chats li.in .name { + color: #4C4C4C; + text-shadow: 0 1px 1px #FFFFFF; +} + +/* custom form input error states with icons */ +.input-icon input { + padding-right: 25px !important; +} + +.input-icon .input-error, .input-icon .input-warning, .input-icon .input-success { + display: inline-block !important; + position: relative !important; + top: 4px; + right: 25px !important; + font-size: 16px; +} + +.input-icon .input-error { + color:#B94A48; +} +.input-icon .input-warning { + color: #C09853; +} +.input-icon .input-success { + color: #468847; +} + +/* custom breadcrumb */ +.breadcrumb { + background: none; + margin-left: -15px; + padding: 0; +} +.breadcrumb > li { + height: 30px; + line-height: 30px; + background: url("../img/bread-crumb-bg.jpg") repeat-x; + float: left; + padding: 0 0 0 8px; +} +.breadcrumb > li> a{ + color: #737373; +} +.breadcrumb > li> a:hover{ + text-decoration: none; +} + +.breadcrumb > li > .divider { + display: inline-block; + padding: 0px; + width: 29px; + height: 30px; + line-height: 30px; + background: transparent url("../img/bread-crumb-divider.png") no-repeat; +} +.breadcrumb > li > .divider-last { + display: inline-block; + padding: 0px; + width: 19px; + height: 30px; + line-height: 30px; + background: transparent url("../img/bread-crumb-last.png") no-repeat; +} +.breadcrumb .tooltip { + text-shadow:none !important; +} + +/*general search */ +.breadcrumb > li.search-wrap { + background: none !important; + float: right; +} + +.breadcrumb .search-input-area { + float: right; + position: relative; + width: 94%; +} + +.search-input-area input.search-query { + border: 0px !important; + -webkit-box-shadow: 0 0px 5px #ccc; + -moz-box-shadow: 0 0px 5px #ccc; + box-shadow: 0 0px 5px #ccc; + padding-left: 8px; + padding-right: 20px; +} +.search-input-area input:focus.search-query { + outline: 0; + box-shadow: 0 0 8px rgba(82, 168, 236, 0.6) !important; + -webkit-box-shadow: 0 0 8px rgba(82, 168, 236, 0.6) !important; + -moz-box-shadow: 0 0 8px rgba(82, 168, 236, 0.6) !important; +} + +.breadcrumb .search-input-area > i, #sidebar .search-input-area > i { + cursor: pointer; + display: inline-block !important; + font-size: 18px; + position: absolute !important; + right: -10px !important; + top: 7px !important; +} + +/* widget container */ +.sortable .widget .widget-title { + cursor: move; +} + +.sortable-box-placeholder { + background-color: #f5f5f5; + border: 1px dashed #DDDDDD; + display: block; + margin-top: 0px !important; + margin-left: 1%; + margin-right: 0.6%; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +.sortable-box-placeholder * { + visibility:hidden; +} + +.widget { + background:#fff; + clear: both; + margin-bottom: 20px; + margin-top: 0; + -webkit-box-shadow: 0 0px 5px #ddd; + -moz-box-shadow: 0 0px 5px #ddd; + box-shadow: 0 0px 5px #ddd; +} + +.widget-title { + background: #f2f2f2; + background-image: -webkit-gradient(linear, 0 0%, 0 100%, from(#ffffff), to(#f2f2f2)); + background-image: -webkit-linear-gradient(top, #ffffff 0%, #f2f2f2 100%); + background-image: -moz-linear-gradient(top, #ffffff 0%, #f2f2f2 100%); + background-image: -ms-linear-gradient(top, #ffffff 0%, #f2f2f2 100%); + background-image: -o-linear-gradient(top, #ffffff 0%, #f2f2f2 100%); + /*background-image: -linear-gradient(top, #ffffff 0%, #f2f2f2 100%);*/ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#f2f2f2',GradientType=0 ); + height: 36px; + border-bottom: 1px solid #fff; +} + +.widget-title > h4 { + float: left; + font-size: 13px; + font-weight: bold; + padding: 12px 11px 10px 15px; + line-height: 12px; + margin: 0; +} + +.widget-title > h4 i { + font-size: 14px; + margin-right: 2px; +} + +.widget-title span.tools { + border-left: 1px solid #E0DEDE; + float: right; + margin: 2px 0 0; + padding: 6px 5px 6px 10px; +} + +.widget-title span.tools > a { + display: inline-block; + margin-right: 5px; + color: #979797; + font-size: 14px; + text-decoration: none; +} + +.widget-title span.tools > a:hover { + text-decoration: none; + -webkit-transition: all 0.1s ease-in-out; + -moz-transition: all 0.1s ease-in-out; + -o-transition: all 0.1s ease-in-out; + -ms-transition: all 0.1s ease-in-out; + transition: all 0.1s ease-in-out; + opacity: .6; +} + +.widget-title .btn-group { + margin-right:5px; + margin-top: -2px; +} + +.widget-title .btn-group .caret { + margin-top: 8px; + margin-left: 3px; +} + +.widget-body { + padding: 15px 15px; + -webkit-border-radius: 0px 0px 3px 3px; + -moz-border-radius: 0px 0px 3px 3px; + border-radius: 0px 0px 3px 3px; +} + +/* charts & stats */ +.chart, .pie, .bars { + height: 300px; +} + +.stat { + margin: 0px; + padding: 0px; +} + +.item-list.table .percent { + width: 30px; + float: right; + margin-right: 10px; + margin-top: 3px; +} + +.item-list.table .title { + padding-top: -5px; +} + +.stat .title { + margin-left: 10px; + margin-right: 10px; + font-size1: 13px; +} + +.stat.good .percent { + color: #52e136; + font-size: 16px; + font-weight: bold; +} + +.stat.bad .percent { + color: #d12610; + font-size: 16px; + font-weight: bold; +} + +.stat.ok .percent { + color: #37b7f3; + font-size: 16px; + font-weight: bold; +} + +/* general list for item with picture */ +ul.item-list li .pic { + height: 50px; + width: 50px; + float: left; + margin-top: 3px; + margin-right: 5px; + -webkit-border-radius: 2px !important; + -moz-border-radius: 2px !important; + border-radius: 2px !important; +} +ul.item-list { + margin: 0px; + list-style: none; +} +ul.item-list li { + padding: 5px 0; + list-style: none; + border-top: 1px solid white; + border-bottom: 1px solid #EBEBEB; + font-size: 12px; +} +ul.item-list li:first-child { + border-top: none; + border-bottom: 1px solid #EBEBEB; +} +ul.item-list li:last-child { + border-top: none; + border-bottom: none; +} +ul.item-list li .label { + margin-right: 5px; +} + +/* general purpose block with css3 gradient background */ +.block { + line-height: 18px; + margin: 0 0 20px 0; + padding: 10px; + text-align: center; +} + +/* metro dashboard stats */ +.metro-overview-cont { + padding-top:0px; + margin-bottom: 15px; +} +.metro-overview { + clear: both; + padding: 10px 10px 0px 10px; + margin: 0px; + margin-bottom: 5px; + box-shadow: 1px 0px 1px #fff, 0 0 3px rgba(0, 0, 0, 0.2) inset; + -moz-box-shadow: 1px 0px 1px #fff, 0 0 3px rgba(0, 0, 0, 0.2) inset; + -webkit-box-shadow: 1px 0px 1px #fff, 0 0 3px rgba(0, 0, 0, 0.2) inset; +} + +.metro-overview .display { + margin-right: 5px; + float: left; + font-size: 30px; + color: #fff; +} + +.metro-overview .percent { + color: #fff; + font-size: 12px; +} + +.metro-overview .details { + color:#fff; + text-align:right; +} + +.metro-overview .details .title { + color: #fff; + font-size: 12px; + font-weight: normal; + margin-bottom: 6px; +} +.metro-overview .details .title i { + color: #fff; + margin-right: 2px; +} +.metro-overview .details .numbers { + color: #fff; + font-size: 20px; + margin-bottom: 6px; +} +.metro-overview .progress { + height: 5px; + margin-bottom:10px !important; +} + +/* mini chart and bar containers */ +.bar-chart {display: none} +.line-chart {display: none} + +/* custom label and badges */ +.notify-row .badge { + position: absolute; + top: -5px; + z-index: 100; + right: 1px; +} +.badge { + -webkit-border-radius: 10px!important; + -moz-border-radius: 10px !important; + border-radius: 10px !important; + padding: 2px 6px; +} +.label { + -webkit-border-radius: 0px !important; + -moz-border-radius: 0px !important; + border-radius: 0px !important; + text-shadow: none !important; + padding: 5px !important; +} + +.label-success, .badge-success { + background-color: #a5d16c; + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #a5d16c), color-stop(100%, #a5d16c)); + background-image: -webkit-linear-gradient(top, #a5d16c, #a5d16c); + background-image: -moz-linear-gradient(top, #a5d16c, #a5d16c); + background-image: -ms-linear-gradient(top, #a5d16c, #a5d16c); + background-image: -o-linear-gradient(top, #a5d16c, #a5d16c); + background-image: linear-gradient(top, #a5d16c, #a5d16c); +} + +.label-warning, .badge-warning { + background-color: #fcb322; + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fcb322), color-stop(100%, #fcb322)); + background-image: -webkit-linear-gradient(top, #fcb322, #fcb322); + background-image: -moz-linear-gradient(top, #fcb322, #fcb322); + background-image: -ms-linear-gradient(top, #fcb322, #fcb322); + background-image: -o-linear-gradient(top, #fcb322, #fcb322); + background-image: linear-gradient(top, #fcb322, #fcb322); +} + +.label-important, .badge-important { + background-color: #e74955; + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #e74955), color-stop(100%, #e74955)); + background-image: -webkit-linear-gradient(top, #e74955, #e74955); + background-image: -moz-linear-gradient(top, #e74955, #e74955); + background-image: -ms-linear-gradient(top, #e74955, #e74955); + background-image: -o-linear-gradient(top, #e74955, #e74955); + background-image: linear-gradient(top, #e74955, #e74955); +} + +.label-info, .badge-info { + background-color: #2fa4e7; + /*background-color: #32c2cd; + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #32c2cd), color-stop(100%, #32c2cd)); + background-image: -webkit-linear-gradient(top, #32c2cd, #32c2cd); + background-image: -moz-linear-gradient(top, #32c2cd, #32c2cd); + background-image: -ms-linear-gradient(top, #32c2cd, #32c2cd); + background-image: -o-linear-gradient(top, #32c2cd, #32c2cd); + background-image: linear-gradient(top, #32c2cd, #32c2cd);*/ +} + +.label-mini { + font-size: 11px; +} + +/*progress bar*/ +.progress { + height: 10px; + border-radius: 0; + -moz-border-radius: 0; + -webkit-border-radius: 0; +} + +/*pre loader list */ +.list_items > li { + padding: 0 16px 12px 0; +} +/*pagination */ +.pagination { + margin: 10px 0; +} + +/*slider*/ +.slider { + margin-bottom: 40px; + margin-top: 20px; +} +.slider label { + cursor: text; +} +.jslider .jslider-value { + border: 1px solid #CDCDCD; + border-radius: 10px !important; + -moz-border-radius: 10px !important; + -webkit-border-radius: 10px !important; +} +.jslider .jslider-value, .jslider .jslider-label, .jslider .jslider-scale ins { + font-size: 12px !important; +} +.jslider .jslider-bg i { + height: 6px !important; +} +.jslider .jslider-value { + padding: 3px 5px 0 !important; + top: -28px !important; +} +.jslider_round_plastic .jslider-pointer { + height: 23px !important; + margin-left: -12px !important; + width: 23px !important; +} +.jslider .jslider-pointer { + background-position: 0 -58px !important; + top: -6px !important; +} +.jslider .jslider-pointer { + background-position: 0 -58px !important; + top: -6px !important; +} +.jslider .jslider-pointer-hover { + top: -8px !important; + background-position: -22px -56px !important; +} +.jslider .jslider-value {padding: 3px 5px !important; } + +/*font awesome icon style*/ + +.icon-style-list ul.unstyled li { + /*border: 1px solid #EAEAEA;*/ + font-family: arial; + line-height: 30px; + margin-bottom: 10px; + padding: 0 10px; + font-size: 13px; + background: #eeeeee; + border-radius: 3px; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; +} + +.icon-style-list ul.unstyled li i { + font-size: 16px; + padding-right: 5px; +} + +.icon-style-list h3, .icon-style-list h4 { + font-family: Arial; +} + +ul.icons { + list-style-type: none; + text-indent: -0.75em; + margin-left: 25px; +} +/*alpha listing*/ +.upper-alpha { + list-style: upper-alpha; +} +/*roman list*/ +.roman-list { + list-style: upper-roman; +} +/*glyphicons icon style*/ +.the-icons { + list-style: none; + margin-left: 0; +} + +.the-icons li { + float: left; + line-height: 25px; + width:20%; + line-height: 30px; +} + +/*buttons style*/ + +.btn{ +/* border-radius: 0; + box-shadow:0 0 3px rgba(0, 0, 0, 0.2) inset; + -moz-box-shadow:0 0 3px rgba(0, 0, 0, 0.2) inset; + -webkit-box-shadow:0 0 3px rgba(0, 0, 0, 0.2) inset; + background: #e8e8e8;*/ + outline: none; +background-color: #F5F5F5; + background-image: linear-gradient(to bottom, #FFFFFF, #E6E6E6); + background-repeat: repeat-x; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) #B3B3B3; +} +.btn:hover{ + box-shadow: none; + -moz-box-shadow: none; + -webkit-box-shadow: none; +} +.btn-group > .btn:first-child, +.btn-group > .btn:last-child, +.btn-group > .dropdown-toggle, +.btn-group-vertical > .btn:first-child, +.btn-group-vertical > .btn:last-child { +} + +.btn-primary{ + background: #2fade7; +} +.btn-primary:hover, .btn-primary:focus, .btn-primary:active, .btn-primary.active, .btn-primary.disabled, .btn-primary[disabled] { + background-color: #1DA4E7; +} + +.btn-success{ + background: #87bb33; +} +.btn-success:hover, .btn-success:active, .btn-success.active, .btn-success.disabled, .btn-success[disabled], +.btn-group.open .btn-success.dropdown-toggle{ + background-color: #70BB2E; +} +.btn-info{ + background: #22c0cb; +} +.btn-info:hover, .btn-info:active, .btn-info.active, .btn-info.disabled, .btn-info[disabled], +.btn-group.open .btn-info.dropdown-toggle{ + background-color: #15B4CB; +} +.btn-warning{ + background: #fb9800; +} +.btn-warning:hover, .btn-warning:active, .btn-warning.active, .btn-warning.disabled, .btn-warning[disabled], +.btn-group.open .btn-warning.dropdown-toggle{ + background-color: #FB8E13; +} +.btn-danger{ + background: #dc5d3a; +} +.btn-danger:hover, .btn-danger:active, .btn-danger.active, .btn-danger.disabled, .btn-danger[disabled], +.btn-group.open .btn-danger.dropdown-toggle{ + background-color: #DC4E3B; +} +.btn-inverse{ + background: #484848; +} +.btn-inverse:hover, .btn-inverse:active, .btn-inverse.active, .btn-inverse.disabled, .btn-inverse[disabled], +.btn-group.open .btn-inverse.dropdown-toggle{ + background-color: #292929; +} +.btn-link { + background: none; + box-shadow: none; +} + +.input-prepend .add-on:first-child, .input-prepend .btn:first-child, +.input-prepend.input-append .add-on:first-child, .input-prepend.input-append .btn:first-child, +.input-prepend.input-append .add-on:last-child, .input-prepend.input-append .btn:last-child, +.input-append .add-on:last-child, .input-append .btn:last-child, .input-append .btn-group:last-child > .dropdown-toggle{ +/* border-radius: 0px; */ +} + +.uneditable-input { + width: 135px; +} + +.switch-form input { + width: 110px; +} + + +/*form element */ + +textarea, select, input[type="text"], input[type="password"], input[type="datetime"], input[type="datetime-local"], input[type="date"], input[type="month"], input[type="time"], input[type="week"], input[type="number"], input[type="email"], input[type="url"], input[type="search"], input[type="tel"], input[type="color"], .uneditable-input, .fileupload-new .input-append .btn-file { + box-shadow: 0 0 3px rgba(0, 0, 0, 0.17) inset; + transition: border 0.2s linear 0s, box-shadow 0.2s linear 0s; +} + +textarea:focus, input[type="text"]:focus, input[type="password"]:focus, input[type="datetime"]:focus, input[type="datetime-local"]:focus, input[type="date"]:focus, input[type="month"]:focus, input[type="time"]:focus, input[type="week"]:focus, input[type="number"]:focus, input[type="email"]:focus, input[type="url"]:focus, input[type="search"]:focus, input[type="tel"]:focus, input[type="color"]:focus, .uneditable-input:focus { + background: #fff; + border:1px solid #DDDDDD; + box-shadow: none; +} + +.form-horizontal .control-label { + text-align: left; +} + +/* icon buttons */ +.icon-btn { + height: 70px; + width: 50px; + margin: 10px 0px 10px 0px; + padding: 16px 0px 0px 0px; + font-size: 10px; + background-color: #fff !important; + -webkit-box-shadow: 0 0px 5px #ddd !important; + -moz-box-shadow: 0 0px 5px #ddd!important; + box-shadow: 0 0px 5px #ddd !important; + display:block !important; + color: #646464 !important; + text-align: center; + cursor: pointer; + position: relative; + -webkit-transition: all 0.3s ease !important; + -moz-transition: all 0.3s ease !important; + -ms-transition: all 0.3s ease !important; + -o-transition: all 0.3s ease !important; + transition: all 0.3s ease !important; +} + +.ie8 .icon-btn:hover { + filter: none !important; +} + +.icon-btn:hover { + background: #fff !important; + text-decoration: none !important; + box-shadow: none !important; + color: #444 !important; + -webkit-transition: all 0.3s ease !important; + -moz-transition: all 0.3s ease !important; + -ms-transition: all 0.3s ease !important; + -o-transition: all 0.3s ease !important; + transition: all 0.3s ease !important; + box-shadow:0px 0px 0px #fff , 0 0 1px rgba(0, 0, 0, .6) inset !important; +} + +.icon-btn i { + font-size: 20px; + color: #777 !important; +} + +.icon-btn div { + margin-top: 5px; + margin-bottom: 20px; + font-size: 12px !important; + font-family: Arial; +} + +.icon-btn .badge { + position: absolute; + font-size: 10px !important; + top: 26px; + right: -8px; + height: 14px; + padding: 3px 7px; + color: white !important; + -webkit-border-radius: 10px; + -moz-border-radius: 10px; + border-radius: 10px; + text-shadow: none; + font-family: Arial; +} + +.icon-btn:hover .badge { + -webkit-transition: all 0.3s ease !important; + -moz-transition: all 0.3s ease !important; + -ms-transition: all 0.3s ease !important; + -o-transition: all 0.3s ease !important; + transition: all 0.3s ease !important; +} + +.icon-btn i { + -webkit-transition: all .5s ease-in-out; + -moz-transition: all .5s ease-in-out; + -o-transition: all .5s ease-in-out; + -ms-transition: all .5s ease-in-out; +} + +.icon-btn:hover i { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -o-transform: rotate(360deg); + -ms-transform: rotate(360deg); + color: #fff; + opacity: 1; +} + +/* custom dropdown */ +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + padding: 0px 0; + margin: 2px 0 0; + list-style: none; + text-shadow: none; + background-color: #fcfcfc; + border: 1px solid rgba(0, 2, 1, 0.2); + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + border-radius: 2px; + -webkit-box-shadow: 0 0px 0px rgba(0, 2, 1, 0.4); + -moz-box-shadow: 0 0px 0px rgba(0, 2, 1, 0.4); + box-shadow: 0 0px 0px rgba(0, 2, 1, 0.4); + -webkit-background-clip: padding-box; + -moz-background-clipp: padding; + background-clip: padding-box; + padding: 0px 0; + margin:0px; + list-style: none; + text-shadow: none; +} + +.dropdown-menu.opens-left { + margin-top: 2px; + margin-left: -88px; +} + +.ie8 .dropdown-menu.opens-left { + margin-left: -82px; +} + +.dropdown-menu.extended { + top:40px; + min-width: 160px !important; + max-width: 300px !important; + width: 233px !important; +} + +.dropdown-menu.extended li a{ + display: block; + padding: 5px 10px !important; + clear: both; + font-weight: normal; + line-height: 20px; + white-space: normal !important; +} + +.dropdown-menu.extended .arrow{ + top:-14px; + left: 10px; + position: absolute; + margin-top: 6px; + margin-right: 12px; + width: 0; + height: 0; + border-bottom: 8px solid #f3f3f3; + border-left: 8px solid transparent; + border-right: 8px solid transparent; +} + +.dropdown-menu.extended li i{ + margin-right: 3px; +} + +.dropdown-menu.extended li a{ + padding: 10px; + background-color: #fafafa; +} + +.dropdown-menu.extended li p{ + padding: 10px; + background-color: #eee; + margin: 0px; + color: #666; +} + +.dropdown-menu.extended li a{ + padding: 7px 0 5px 0px; + list-style: none; + border-top: 1px solid white !important; + border-bottom: 1px solid #EBEBEB !important; + font-size: 12px; +} +.dropdown-menu.extended li:first-child a { + border-top: none; + border-bottom: 1px solid #EBEBEB !important; +} +.dropdown-menu.extended li:last-child a { + border-top: 1px solid white !important; + border-bottom: 1px solid #EBEBEB !important; +} + +.dropdown-menu.inbox li a .photo img { + float: left; + height: 40px; + width: 40px; + margin-right: 4px; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + border-radius: 2px; +} + +.dropdown-menu.inbox li a .subject { + display: block; +} + +.dropdown-menu.inbox li a .subject .from { + font-size: 12px; + font-weight: bold; +} + +.dropdown-menu.inbox li a .subject .time { + font-size: 11px; + font-weight: bold; + font-style: italic; + position: absolute; + right: 5px; +} + +.dropdown-menu.inbox li a .message { + display: block !important; + font-size: 11px; +} + +/* star rating */ +.rating { + unicode-bidi: bidi-override; + direction: rtl; + font-size: 30px; +} +.rating span.star, +.rating span.star { + font-family: FontAwesome; + font-weight: normal; + font-style: normal; + display: inline-block; +} +.rating span.star:hover, +.rating span.star:hover { + cursor: pointer; +} +.rating span.star:before, +.rating span.star:before { + content: "\f006"; + padding-right: 5px; + color: #999999; +} +.rating span.star:hover:before, +.rating span.star:hover:before, +.rating span.star:hover ~ span.star:before, +.rating span.star:hover ~ span.star:before { + content: "\f005"; + color: #87bb33; +} + + + +/* adjust uniform components */ +.radio, .checkbox { + padding-left: 0px !important; +} + +.controls > .radio, +.controls > .checkbox { + display: inline-block; + padding: 0 !important; + margin: 0 !important; + margin-top: 0px !important; + margin-right: 15px !important; +} + +.controls > .radio.line, +.controls > .checkbox.line { + display: block; + padding: 0 !important; + margin: 0 !important; + margin-top: 5px !important; +} + +.controls .text { + display: block; + margin-top: 5px; +} + +.checkbox div.checker { + margin-right: 2px !important; +} + +.uploader { + margin-top: 2px !important; +} + +/* item block */ +.item { + overflow: hidden; + display: block; +} +.item:hover .zoom-icon{ + opacity:0.5; + filter: alpha(opacity = 50); +} + +/* zoom icon overlay on images */ +.zoom { + cursor: pointer; + width: 100%; + height: 100%; + position: relative; + z-index: 5; +} + +.zoom .zoom-icon { + background-image:url("../img/overlay-icon.png"); + background-color: #222; + background-repeat: no-repeat; + background-position: 50%; + position: absolute; + width: inherit; + height: inherit; + opacity: 0; + filter: alpha(opacity = 0); + z-index: 6; + top:0; +} + +/* logo page */ +#logo { + width: 247px; + margin: 0 auto; + padding: 15px; + text-align: center; +} + +.login-header { + background: url("../img/top-bg.jpg") repeat-x; + border-width: 0; + height: 60px; + text-align: center; +} + +#login { + + background:#e3e3e3; + box-shadow: 1px 0 1px #FFFFFF, 0 0 3px rgba(0, 0, 0, 0.2) inset; + -moz-box-shadow: 1px 0 1px #FFFFFF, 0 0 3px rgba(0, 0, 0, 0.2) inset; + -webkit-box-shadow: 1px 0 1px #FFFFFF, 0 0 3px rgba(0, 0, 0, 0.2) inset; + width: 370px; + margin: 150px auto 0; + padding: 20px; +} + +.login-btn { + background: url("../img/login-btn.jpg"); + border: none; + box-shadow: 1px 0 1px #FFFFFF, 0 0 3px rgba(0, 0, 0, 0.2) inset; + -moz-box-shadow: 1px 0 1px #FFFFFF, 0 0 3px rgba(0, 0, 0, 0.2) inset; + -webkit-box-shadow: 1px 0 1px #FFFFFF, 0 0 3px rgba(0, 0, 0, 0.2) inset; + border-radius: 0; + -moz-border-radius: 0; + -webkit-border-radius: 0; + font-size: 16px; + color: #fff; + text-shadow: none; + padding: 10px 0; +} + +.login-btn:hover { + opacity: 0.8; + color: #fff; +} + +#login .control-group { + margin-bottom: -11px; +} + +#login .form-actions { + padding: 20px; + margin-left: -20px; + margin-right: -20px; + margin-bottom: 0px; + -webkit-border-radius: 0px 0px 4px 4px; + -moz-border-radius: 0px 0px 4px 4px; + border-radius: 0px 0px 4px 4px; + margin-bottom: -37px; +} + +#login input { + border-radius: 0; + -moz-border-radius: 0; + -webkit-border-radius: 0; +} +#login input[type=checkbox] { + margin-top: -3px; +} +#login span.add-on { + border-radius: 0; + -moz-border-radius: 0; + -webkit-border-radius: 0; + padding: 10px; + color: #828283; + text-shadow: none; +} + +#login input { + padding: 10px; +} + +#login i { + color: #999 !important; +} + +#login #forget-password { + font-size: 11px; +} + +#login-copyright { + text-align: center; + width: 250px; + margin: 0 auto; + padding: 10px 10px 0 10px; + color: #999; + font-size: 11px; +} + +.control-wrap { + width: 266px; + display: inline-block; + margin-bottom: 15px; +} + +#login .lock { + width: 100px; + float: left; + margin-top: 28px; + font-size: 110px; + vertical-align: middle; +} + +#login .lock i { + vertical-align: middle; +} + +#forgotform #input-email { + width: 312px; +} + +/* style switcher */ +#theme-change { + position: fixed; + width: 20px; + height: 22px; + overflow: hidden; + top:70px; + right: 0px; + white-space: nowrap; + padding: 5px 10px 5px 8px; + background-color: #dcdcdc; + z-index: 100; + color: #737373; + -webkit-border-radius: 5px 0px 0px 5px; + -moz-border-radius: 5px 0px 0px 5px; + border-radius: 5px 0px 0px 5px; +} + +#theme-change > i { + font-size: 18px; + cursor: pointer; + display: inline-block; + margin-right: 2px; + margin-top: 2px; +} + +#theme-change:hover, #theme-change > i:hover { + color: #737373; +} + +#theme-change label { + display: inline-block !important; +} + +#theme-change .text { + margin-right: 2px; + font-weight: bold; + font-size: 14px; +} + +#theme-change .settings { + display: none; +} + +#theme-change .colors { +} + +#theme-change .checker { + display: inline-block !important; + margin-top:-1px; +} + +#theme-change .colors span { + display: inline-block; + width: 20px; + height: 20px; + margin: 2px 1px -7px 1px; + border: 2px solid #ddd; + cursor: pointer; +} + +#theme-change .layout { + width: 100px; + margin-top: 7px; + margin-left: 63px; + margin-bottom: 5px; + display: block; +} + +#theme-change .colors span.active, #theme-change .colors span:hover { + border: 2px solid white; +} + +#theme-change .colors .color-default { + background-color: #30c0cb; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} +#theme-change .colors .color-purple { + background-color: #7265ae; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} +#theme-change .colors .color-gray { + background-color: #4d4d4d; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} +#theme-change .colors .color-navy-blue { + background-color: #263849; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + + +/* Circle stats admin lab */ + +.circle-wrap { + text-align: center; + margin-bottom: 20px; + opacity: 1 +} + +.turquoise-color { + background: #4cc5cd; +} + +.red-color { + background: #e17f90; +} + +.green-color { + background: #a8c77b; +} + +.gray-color { + background: #b9baba; +} + +.purple-color { + background: #c8abdb; +} + +.blue-color { + background: #93c4e4; +} + +.stats-circle { + width: 100px; + height: 100px; + border-radius: 70px; + -moz-border-radius: 70px; + -webkit-border-radius: 70px; + display: inline-block; + text-align: center; + color: #fff; + margin-bottom: 10px; + cursor: pointer; + + box-shadow: 1px 0px 1px #fff, 0 0 3px rgba(0, 0, 0, 0.2) inset; + -moz-box-shadow: 1px 0px 1px #fff, 0 0 3px rgba(0, 0, 0, 0.2) inset; + -webkit-box-shadow: 1px 0px 1px #fff, 0 0 3px rgba(0, 0, 0, 0.2) inset; +} + +.circle-wrap p { + color: #888888; + font-size: 13px; + margin: 0; +} + +.circle-wrap p strong { + display: block; + font-size: 18px; + color: #777 +} + +.stats-circle i{ + display: inline-block; + font-size: 3.5em; + margin-top: 26px; + text-shadow: 1px 1px 1px #999; + opacity: .6; +} + +.stats-circle i { + -webkit-transition: all .5s ease-in-out; + -moz-transition: all .5s ease-in-out; + -o-transition: all .5s ease-in-out; + -ms-transition: all .5s ease-in-out; +} + +.stats-circle:hover i { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -o-transform: rotate(360deg); + -ms-transform: rotate(360deg); + color: #fff; + opacity: 1; +} + +.stats-circle span { + display: block; +} + +/* Square stats */ + +.square-state { + +} + +.square-state .icon-btn { + margin-top: 0; + margin-bottom: 20px; +} + + +/* Circle stats */ +.knobify { + border: 0 !important; + width: 0px; +} +.ie8 .knobify { + display: none; +} + +.circle-stats { + position: relative; + margin: 10px 0px 10px 0px; +} + +.circle-stat { + padding:2px; +} + +.circle-stat canvas { +} +.circle-stat:before, +.circle-stat:after { + display: table; + line-height: 0; + content: ""; +} +.circle-stat:after { + clear: both; +} + +.circle-stat .visual { + display: inline-block; + position: relative; +} + +.circle-stat .details { + display:block; + margin-left: 5px; + padding-top: 7px; + clear: both; + text-align: center; +} + +.circle-stat .details .title { + padding: 0px !important; + font-size: 13px; + text-shadow: 0 1px rgba(232, 232, 232, 0.75); + color: #777; +} + +.ie8 .circle-stat .details .title { + margin-top:5px !important; +} +.ie8 .circle-stat .details { + padding-top: 0px !important; + margin-bottom: 5px !important; +} + +.circle-stat .details .title i { + margin-top:2px !important; + color: #52e136; + font-size: 16px; +} + +.circle-stat .details .title i.down { + color: #b63625; +} + +.circle-stat .details .number { + margin: 0px !important; + margin-bottom: 5px !important; + font-size: 18px; + padding: 0px; + font-weight: bold; + text-shadow: 0 1px rgba(244, 244, 244, 0.85); + color: #777; +} + + +/*circle state icon place */ + +.circle-state-overview .span3:first-child {margin-left: 20px;} + +.circle-state-icon { + background: url("../img/body-bg.png") repeat scroll 0 0 #F7F7F7; + border-radius: 60px 60px 60px 60px; + font-size: 38px; + height: 38px; + left: 15px; + opacity: 1; + padding: 15px; + position: absolute; + top: 15px; + width: 38px; + z-index: 10; +} +.circle-state-icon .turquoise-color { + color: #4cc5cd; +} + +.circle-state-icon .red-color { + color: #e17f90; +} + +.circle-state-icon .green-color { + color: #a8c77b; +} + +.circle-state-icon .gray-color { + color: #b9baba; +} + +.circle-state-icon .purple-color { + color: #c8abdb; +} + +.circle-state-icon .blue-color { + color: #93c4e4; +} + +/*map stats*/ + +.map-stat { + margin: 20px; + display: block; +} +.map-stat:before, +.map-stat:after { + display: table; + line-height: 0; + content: ""; +} +.map-stat:after { + clear: both; +} + +.map-stat .visual { + width: 70px; + height: 60px; + margin-right: 5px; + display: block; + float: left; +} + +.map-stat .visual i{ + margin-top: 15px; + display: block; + font-size: 68px; + color: #4d4d4d; +} + +.map-stat .details { + display: block; + float: left; + margin-left: 5px; + padding-top: 0px; +} + +.map-stat .details .title { + margin: 0px 0px 5px 0px !important; + padding: 0px !important; + font-size: 12px; + color: #878787; +} + +.map-stat .details .title i { + margin-top:2px !important; + color: #52e136; + font-size: 16px; +} + +.map-stat .details .title i.down { + color: #b63625; +} + +.map-stat .details .number { + margin: 0px !important; + margin-bottom: 7px !important; + font-size: 42px; + padding: 0px; + font-weight: bold; + color: #35d1fe; +} + +/*scroller padding*/ +.scroller { + padding-right: 10px; +} + + +/*jqvmap changes*/ +.jqvmap-zoomin { + background-color: #666 !important; +} +.jqvmap-zoomout { + background-color: #666 !important; +} +.vmaps { + position: relative; + overflow: hidden; + height: 300px; +} + + +/* google maps */ +.gmaps { + height: 300px; + width: 100%; +} + +/* important! bootstrap sets max-width on img to 100% which conflicts with google map canvas*/ +.gmaps img { + max-width: none; +} + +#gmap_static div{ + background-repeat: no-repeat !important; + background-position: 50% 50% !important; + height:100%; + display:block; + height: 300px; +} + +#gmap_routes_instructions { + margin-top: 10px; + margin-bottom: 0px; +} + +/* advance tables*/ +.table-advance { + margin-bottom: 10px !important; +} + +.table-advance thead { + color: #999; +} + +.table-advance thead tr th{ + background-color: #DDD; + color: #666; +} + +.table-advance div.success, .table-advance div.info, +.table-advance div.important, .table-advance div.warning, .table-advance div.danger { + position: absolute; + margin-top:5px; + float: left; + width: 10px; + height: 10px; + margin-right: 20px !important; +} + +.table-advance tr td { + border-left-width: 0px; +} +.table-advance tr td:first-child { + border-left-width: 1px !important; +} + +.table-advance tr td.highlight:first-child a { + margin-left: 15px; +} + +.table-advance td.highlight div.success { + border-left: 10px solid #A5D16C; +} + +.table-advance td.highlight div.info { + border-left: 10px solid #87ceeb; +} + +.table-advance td.highlight div.important { + border-left: 10px solid #f02c71; +} + +.table-advance td.highlight div.warning { + border-left: 10px solid #fdbb39; +} + +.table-advance td.highlight div.danger { + border-left: 10px solid #e23e29; +} + +/*gritter changes*/ +.gritter-close { + left:auto !important; + right: 3px !important; +} + +/* calendar and calendar form */ +.external-event { + display: inline-block !important; + cursor:move; + margin-bottom: 5px !important; + margin-right: 5px !important; +} + +/* fix full calendar title */ + +.has-toolbar .fc-header-right { + padding-right: 50px !important; +} +.fc-header-title h2 { + font-size: 13px !important; + line-height: 20px; + color: #111; +} +.event-form-title { + margin-top:0px; + margin-bottom: 13px; + font-size: 13px !important; + line-height: 20px; + color: #111; +} + +.fc-event-skin { + border: 0px !important; + background-color: inherit !important; +} + +.fc-event.label { + text-shadow:none !important; + padding: 4px 4px !important; +} + +.label-default { + background-color: #999 !important; +} + +/* fix calendar title for ie8 and ie9 */ +.ie8 .label-success, .ie9 .label-success { + background-color: #5fd02c !important; +} + +.ie8 .label-warning, .ie9 .label-warning { + background-color: #fcb322 !important; +} +.ie8 .label-important, .ie9 .label-important { + background-color: #ed4e2a !important; +} +.ie8 .label-info, .ie9 .label-info { + background-color: #57b5e3 !important; +} +/* hide chosen search box */ +.event_priority_chzn .chzn-search { + display: none !important; +} + +/* portlet tabs */ +.widget-tabs .nav-tabs { + position: relative; + margin-top: -52px; +} + +.widget-tabs .nav-tabs > li { + float: right; + /*border-top: 3px solid transparent;*/ +} + +.widget-tabs .nav-tabs { + border-bottom: none; + margin-right: 5px; +} + +.widget-tabs .nav-tabs > li > a { + padding-top: 9px; + padding-bottom: 10px; + line-height: 16px; + margin-left: 0px; + margin-right: 0px; + border-left: none !important; + border-right: none !important; + -webkit-border-radius: 0px; + -moz-border-radius: 0px; + border-radius: 0px; +} + +.widget-tabs .nav-tabs > li:last-child > a { + border-right:0; +} + +.widget-tabs .nav-tabs > .active { + border-top: 2px solid #4C4C4C; +} +.widget-tabs .nav-tabs > li { + margin-left: -1px; +} +.widget-tabs .nav-tabs > li > a:hover, .widget-tabs .nav-tabs > li > a.active { + margin-bottom: 0px; + border-bottom: 0; + margin-left: 0px; + margin-right: 0px; + border-left: 0; + border-right: 0; + background-color: #fff; +} +.widget-tabs .nav-tabs > .active > a { + color: #555555; + cursor: default; + background-color: #fff; +} +.widget-tabs .widget-body.form { + padding: 0px; +} + +.widget-tabs .widget-body.form .tab-pane { + padding: 15px; + padding-top: 0px; +} + +.widget-tabs .widget-body.form .nav-tabs { + margin-top: -37px; +} +/*TodoList*/ + +.todo-list { + margin: 0px; + padding: 0px; + list-style: none; +} + +.todo-list li { + padding: 1px 0 8px 0px; + margin-bottom: 5px; + border-bottom: 1px solid #EBEBEB; +} + +.todo-list li:first-child { + border-top: none; + border-bottom: 1px solid #EBEBEB; +} + +.todo-list li:last-child { + border-top: none; + border-bottom: none; +} + +.todo-list li:before, +.todo-list li:after { + display: table; + line-height: 0; + content: ""; +} + +.todo-list li:after { + clear: both; +} + +.todo-list .col1 { + float:left; + width:100%; + clear: both; +} + +.todo-list .col2 { + float:left; + width:120px; + margin-left:-120px; + text-align: right; +} + +.todo-list .col1 .cont { + float:left; + margin-right:120px; + overflow:hidden; +} + +/*time line chat*/ +.timeline-messages:before { + background: rgba(0, 0, 0, 0.1); + bottom: 0; + left: 58px; + top: 0; + width: 2px; +} +.timeline-messages:before, .msg-time-chat:before, .msg-time-chat .text:before { + content: ""; + left: 20px; + position: absolute; + top: -2px; +} +.timeline-messages, .msg-time-chat { + position: relative; +} +.msg-time-chat:first-child:before { + margin-top: 16px; +} +.msg-time-chat:before { + background:#CCCCCC; + border: 2px solid #FAFAFA; + border-radius: 100px; + -moz-border-radius: 100px; + -webkit-border-radius: 100px; + height: 10px; + margin: 23px 0 0 47px; + width: 10px; +} +.msg-time-chat:hover:before { + background: #A5D16C; +} +.msg-time-chat:first-child { + padding-top: 0; +} +.message-img { + border-radius: 30px; + -moz-border-radius: 30px; + -webkit-border-radius: 30px; + float: left; + margin-right: 30px; + overflow: hidden; +} +.message-img img { + display: block; + height: 44px; + width: 44px; +} +.message-body { + margin-left: 74px; +} +.msg-time-chat .text { + background: #fbfbfb; + border: 1px solid #E5E5E5; + padding: 10px; +} +.msg-time-chat p { + margin: 0; +} +.msg-time-chat .attribution { + color: #666666; + font-size: 11px; + margin: 0px 0 5px; +} +.msg-time-chat { + overflow: hidden; + padding:8px 0; +} + +.msg-in a{ + color: #22878E; +} +.msg-out a{ + color: #B14C4C; +} + + +/*Chats*/ + +.chats { + margin:0; + padding: 0; + margin-top: -15px; + margin-right: 10px; +} + +.chats li { + list-style: none; + padding: 8px 0 5px; + margin: 7px auto; + font-size: 12px; +} + +.chats li img.avatar { + height: 45px; + width: 45px; + -webkit-border-radius: 50% !important; + -moz-border-radius: 50% !important; + border-radius: 50% !important; +} + +.chats li.in img.avatar { + float: left; + margin-right: 10px; + margin-top: 0px; +} + +.chats li .name { + font-size: 13px; + font-weight: 400; +} + +.chats li .datetime { + color:#adadad; + font-size: 13px; + font-weight: 400; +} + +.chats li.out img.avatar { + float: right; + margin-left: 10px; + margin-top: 0px; +} + +.chats li .message { + display: block; + padding: 5px; + position: relative; +} + +.chats li.in .message { + text-align: left; + margin-left: 65px; +} + +.chats li.in .message .arrow { + display: block; + position: absolute; + top: 8px; + left: -8px; + width: 0; + height: 0; + + border-top: 8px solid transparent; + border-bottom: 8px solid transparent; +} + +.chats li.out .message .arrow { + display: block; + position: absolute; + top: 8px; + right: -8px; + border-top: 8px solid transparent; + border-bottom: 8px solid transparent; + border-left: 8px solid #b14c4c; +} + +.chats li.out .message { + border-right: 2px solid #b14c4c; + margin-right: 65px; + text-align: right; +} + +.chats li.out .name, +.chats li.out .datetime { + text-align: right; +} + +.chats li .message .body { + display: block; +} + +.chat-form { + margin-top: 15px; + padding: 10px; + background-color: #eee; + clear: both; +} + +.chat-form .input-cont { + margin-right: 55px; +} + +.chat-form .input-cont input { + margin-bottom: 0px; +} + +.chat-form .input-cont input{ + border: 1px solid #ddd; + width: 94%; + margin-top:0; + border-radius: 0; + -moz-border-radius: 0; + -webkit-border-radius: 0; +} + +.chat-form .input-cont input { + background-color: #fff !important; +} + +.chat-form .input-cont input:focus{ + border: 1px solid #2FADE7 !important; +} + +.chat-form .btn-cont { + margin-top: -38px; + position: relative; + float: right; +} + +.chat-form .btn-cont .btn { + border-left: 0px; + -webkit-border-radius: 0px; + -moz-border-radius: 0px; + border-radius: 0px; + margin-top: 8px; +} + +/*normal chat*/ +.normal-chat .message { + border: 1px solid #eaeaea; + background: #fbfbfb; + border-left: 1px solid #eaeaea !important; + border-right: 1px solid #eaeaea !important; + padding: 10px !important; + border-radius: 5px; +} +.normal-chat li img.avatar { + border-radius: 5px !important; + -moz-border-radius: 5px !important; + -webkit-border-radius: 5px !important; + height: 45px; + width: 45px; +} + +.normal-chat li.in img.avatar, .normal-chat li.out img.avatar { + margin-top: 0px; +} +.normal-chat li.in .message .arrow { + border-right: 8px solid #eaeaea !important; +} +.normal-chat li.in .message .arrow { + border-bottom: 8px solid transparent; + border-top: 8px solid transparent; + display: block; + height: 0; + left: -8px; + position: absolute; + top: 15px; + width: 0; +} +.normal-chat li.out .message .arrow { + border-left: 8px solid #eaeaea !important; +} +.normal-chat li.out .message .arrow { + border-bottom: 8px solid transparent; + border-top: 8px solid transparent; + display: block; + position: absolute; + right: -8px; + top: 15px; +} + +.normal-chat li.in .name { + color: #FB9800 !important; +} +.normal-chat li.out .name { + color: #2FADE7 !important; +} +.normal-chat li .datetime { + color: #ADADAD; + font-size: 11px !important; + font-weight: 400; +} + +/* Input icons */ + +/* input with right aligned and colored icons */ +.input-icon input { + padding-right: 25px !important; +} + +.input-icon .input-info, +.input-icon .input-error, +.input-icon .input-warning, +.input-icon .input-success { + display: inline-block !important; + position: relative !important; + top: 3px; + right: 25px !important; + font-size: 16px; +} + +.input-icon .input-info { + color:#27a9e3; +} +.input-icon .input-error { + color:#B94A48; +} +.input-icon .input-warning { + color: #C09853; +} +.input-icon .input-success { + color: #468847; +} + +/* input with left aligned icons */ +.input-icon.left i { + color: #ccc; + display: block !important; + position: absolute !important; + z-index: 1; + margin: 6px 2px 4px 10px; + width: 16px; + height: 16px; + border1: 1px solid #ddd; + font-size: 16px; + text-align: center; +} + +.input-icon.left input { + padding-left: 33px !important; +} +/* Modify tags input plugin css */ +div.tagsinput { + height: 40px !important; + margin: 0 !important; + padding: 5px !important; + overflow: auto !important; +} + +div.tagsinput span.tag { + background: #22C0CB !important; + color: #fff !important; + border: 0 !important; + padding: 3px 6px !important; + margin-bottom: 4px !important; + +} + +div.tagsinput input { + padding: 3px 6px !important; +} + +div.tagsinput span.tag a { + color: #fff !important; +} + +div.tagsinput .not_valid { + color: #fff !important; + padding: 3px 6px !important; + background-color: #e02222 !important; +} + +/* File uploader plugin css changes */ + +.fileupload .close { + position: relative; + top:4px !important; +} + +/*Form wizard*/ + +.form-wizard .progress { + margin-bottom: 30px; +} + +.form-wizard .steps { + padding: 10px 0; + margin-bottom: 15px; +} + +.form-wizard .steps .navbar-inner { + background-color: #fff !important; + background-image: none !important; + filter:none !important; + border: 0px; + box-shadow: none !important; +} + +.form-wizard .steps .navbar-inner li a { + background-color: #eee !important; + background-image: none !important; + filter:none !important; + border: 0px; + box-shadow: none !important; + border-radius:30px; + -moz-border-radius: 30px; + -webkit-border-radius: 30px; +} + +.form-wizard .step:hover { + text-decoration: none; +} + +.form-wizard .step .number { + background-color: #ccc; + display: inline-block; + font-size: 16px; + font-weight: 300; + padding: 12px 25px !important; + margin-right: 10px; + -webkit-border-radius: 30px 0 0 30px !important; + -moz-border-radius: 30px 0 0 30px !important; + border-radius: 30px 0 0 30px !important; +} + +.form-wizard .navbar .nav > li > a { + padding: 0; +} + +.form-wizard .step .desc { + display: inline-block; + font-size: 14px; + font-weight: 300; +} + +.form-wizard .active .step .number { + background-color: #A5D16C; + color: #fff; +} + +.form-wizard .active .step .desc { + font-weight: 400; +} + +.form-wizard .step i { + display: none; +} + +.form-wizard .done .step .number { + background-color: #E74955; + color: #fff; +} + +.form-wizard .done .step .desc { + font-weight: 400; +} + +.form-wizard .done .step i { + font-size: 12px; + font-weight: normal; + color: #999; + display: inline-block; +} + +.form-wizard .tab-pane h4 { + margin-bottom: 20px !important; +} + +.form-wizard .tab-pane .chzn-container { + position: absolute !important; +} + +/*Pricing table*/ + +.pricing-table { + border: 1px solid #ddd; +} + +.pricing-head { + text-align: center; +} +.pricing-title { + text-align: center; + padding: 0px 0 30px 0; +} +.pricing-head h3 { + background: #797979; + border-bottom: 1px solid rgba(0, 0, 0, 0.3); + color: #fff; + font-size: 18px; + font-weight: 300; + margin: 0; +} +.green .pricing-head h3 { + background: #93bf40; + border-bottom: 1px solid #598011; + color: #fff; + font-size: 18px; + font-weight: 300; + margin: 0; +} +.pricing-head h3 span, .pricing-head h4 span { + display: block; + font-size: 12px; + font-style: italic; + margin-top: 5px; +} +.pricing-head h4 { + background:#797979; + border-top: 1px solid rgba(255, 255, 255, 0.2); + color: #fff; + font-size: 54px; + font-weight: 300; + padding: 25px 0 10px 0; + margin:0; +} +.green .pricing-head h4 { + background:#93bf40; + border-top: 1px solid #b6e858; + color: #fff; + font-size: 54px; + font-weight: 300; + padding: 25px 0 10px 0; + margin:0; +} + +.pricing-head span.note { + display: inline; + font-size: 17px; + line-height: 0.8em; + position: relative; + top: -28px; +} + +.pricing-table:hover { + border-color: #93bf40; +} + +.pricing-table ul { + margin: 15px 0px; + padding: 0px; + list-style: none; + text-align: center; +} + +.pricing-table ul li { + border-bottom: 1px dotted #CCCCCC; + margin: 0 2em; + padding: 1em 0; + text-align: center; +} + +.pricing-table ul li i { + position: absolute; + margin-right: 0px; + margin-top: -2px; + margin-left: -17px; + color: #35aa47; + font-size: 16px; +} +.price-actions { + border-top: 1px solid #DDDDDD; + padding: 1.15em; + text-align: center; +} + +.pricing-table.selected { + background-color: #35aa47; +} + +.pricing-table.selected:hover { + border-color: #ddd; +} + +.pricing-table.selected .desc { + border-bottom-color: #fff; +} + +.pricing-table.selected h3, +.pricing-table.selected .desc, +.pricing-table.selected ul li, +.pricing-table.selected ul li i, +.pricing-table.selected .rate { + color: #fff; +} + + +/* Date tables plugin changes */ +.dataTable { + clear: both; + margin-top: 5px; +} + +.dataTables_filter label { + line-height: 32px !important; +} + +.dataTables_paginate, +.dataTables_filter { + float: right; +} + + +/*faq list*/ +ul.faq-list li { + line-height: 30px; +} +ul.faq-list li a{ + background: #eee; + margin-bottom: 1px; + color: #868686; +} +ul.faq-list li a:hover, ul.faq-list li a.active{ + margin-bottom: 1px; + color: #fff; +} + + +/*mail-btn*/ + +.mail-btn .btn { + background-image: -moz-linear-gradient(center top , #FDFDFD 0%, #EAEAEA 100%); + box-shadow: none; +} +.mail-btn .btn:hover, .mail-btn .btn:focus { + background: none; + box-shadow: none; +} + +.mail-btn .btn-group > .btn + .btn { + margin-left: 0; +} + +/*alert*/ +.alert { + border-radius: 0; + -moz-border-radius: 0; + -webkit-border-radius: 0; +} + +/*error*/ + +.error-page {display: block; text-align: center;} + +.error-page h1 {color: #adafb2; font-size: 30px; font-weight: bold; line-height: 50px; padding: 20px 0} + +.error-page h1 strong {color: #adafb2; font-size: 60px; font-weight: bold} + +.error-page p {color: #adafb2; font-size: 20px; font-weight: bold;} + +/*profile*/ +.profile-pic { + display: block; + margin-bottom: 10px; +} +.nav-stacked > li > a { + border-radius: 0!important; + -moz-border-radius: 0!important; + -webkit-border-radius: 0!important; +} + +/*gallery*/ + +.thumbnail { + border:none; + border-radius:0; + box-shadow: none; + line-height: 20px; + padding: 5px 0; +} + +/*accordion-group*/ + +.accordion-group a { + text-decoration: none; +} + +.accordion-group { + border-radius: 0!important; + -moz-border-radius: 0!important; + -webkit-border-radius: 0!important; +} + +/*tab*/ + +.tabbable-custom .nav-tabs > li > a { + border-radius: 0!important; + -moz-border-radius: 0!important; + -webkit-border-radius: 0!important; +} + +/*lock*/ + +#lock-body { + background: url("../img/bg-grey.jpg") !important; +} + +.lock-header { + margin-top: 50px; + text-align: center; +} + +#lock { + background: #fff; + margin: 50px auto 0; + padding: 10px 0; + width: 420px; +} + +.lock-title { + text-align: center; +} + +.lock-title i, .lock-title h3 { + display: inline-block; + margin: 0; + padding: 0; +} + +.lock-title i { + font-size: 25px; + padding: 0 5px; +} + +.lock-avatar-row { + display: block; + text-align: center; + margin-top: 20px; + padding: 20px; +} + +.lock-avatar-row img { + border-radius: 300px; + -moz-border-radius: 300px; + -webkit-border-radius: 300px; +} + +.lock-identity { + text-align: center; + display: block; + width: 100%; +} + +.lock-identity h3 { + margin: 20px 0 0 0; + padding: 0; + line-height: 22px; +} + +.lock-form-row { + display: block; + margin-top: 20px; +} +.lock-form-row i { + text-shadow: none; + color: #fff; +} +.lock-form-row .tarquoise{ + margin-left: 10px; + box-shadow: none; +} + +/*coming soon*/ + +#coming-body { + background: url("../img/bg-denim.png") !important; +} + +.coming-soon { + margin-top: 50px; + text-align: center; + color: #c6c6c6; +} + +.coming-soon h1 label{ + color: #2fbfca; + display: inline; + font-size: 40px; +} +.coming-soon h1 span{ + color: #facc5f; + font-size: 60px; +} +.coming-soon h1 { + font-family: 'Alex Brush', cursive; +} + +.coming-soon .input-append { + width: 100%; +} + +.coming-soon .input-append .submit-btn{ + padding: 2px 10px; + border-radius: 0; + text-shadow: none; + border: none; + height: 37px; + margin: 0 10px; +} +.coming-soon .input-append .submit-btn:hover{ + background: #000; + color: #d1d3d3; + transition-duration: 500ms; + transition-property: width, background; + transition-timing-function: ease; + +} + +.circles { + display: block; + height: 152px; + margin: 50px auto 50px !important; + width: 800px; +} + +.email-address { + width: 40%; + height: 27px !important; +} + +.twt-txt { + color: #c6c6c6; +} + + +ul.social-link, ul.social-link li { + display: inline-block; +} + +ul.social-link li { + list-style: none; + margin: 0 5px; + line-height: 33px; +} + +ul.social-link li a { + background: #fff; + padding: 10px; + border-radius: 30px; + -moz-border-radius: 30px; + -webkit-border-radius: 30px; + color: #000; + text-decoration: none; +} + +ul.social-link li a:hover { + color: #fff; + transition-duration: 400ms; + transition-property: width, background; + transition-timing-function: ease; +} + +/*tree view*/ + +.widget-body > .actions { + float: right; + margin: 6px 0 0; + padding: 3px 5px 2px; +} + +/*blog*/ + +.blog img {margin-bottom: 10px; width: 100%} + +.blog h2, .blog h2 a{ + color: #868686 !important; + font-size: 22px; + font-weight: normal; + margin: 0; + padding: 0; + line-height: normal; +} + +.blog .date { + display: block; + text-align: center; + width: 60px; + margin-bottom: 10px; +} + +.blog .date p{ + margin: 0; + padding: 0px; +} + +.blog .date .day { + font-size: 13px; +} + +.blog .date .month { + color: #fff; + font-size: 13px; +} + +.blog ul { + float: left; + margin: 0 0px 10px 0; + padding: 5px; + background: #f4f4f5; + border-radius: 0; + box-shadow: 0 0 3px rgba(0, 0, 0, 0.1) inset; +} + +.blog ul li { float: left; margin-right: 20px; list-style: none} + +.blog ul li a { color: #868686; text-decoration: none;} + +.blog .btn { + background: #767676; +} + +.blog-side-bar h2 { + color: #3b3431; + text-transform: uppercase; + font-size: 14px; + margin: 0; + padding: 0; + line-height: normal; +} + +.blog-side-bar ul { + margin-top: 15px; +} +.blog-side-bar ul li { + border-bottom: 1px solid #dfdfdf; +} + +.blog-side-bar ul li:last-child { + border-bottom: none; +} + +.blog-side-bar ul li a { + color: #837f7e; + display: block; + line-height: 35px; + text-decoration: none; +} + +.blog-side-bar h5, .blog-side-bar h5 a { + margin: 0; + padding: 0; + color: #4a4341; + line-height: normal; +} + +.blog-side-bar ul.tag { + width: 100%; + display: inline-block; +} + +.blog-side-bar ul.tag li { + float: left; + margin-right: 10px; + border-bottom: none; + margin-bottom: 10px; + line-height: 18px; +} + +.blog-side-bar ul.tag li a { + color: #fff; + box-shadow: 0 0 3px rgba(0, 0, 0, 0.1) inset; + padding: 0px 6px; + +} + +.blog-side-bar ul.tag li a:hover { + background: #767676; + color: #fff; + transition-duration: 500ms; + transition-property: width, background; + transition-timing-function: ease; +} + +.show-right { + float: right !important; +} + +.post-comment .color-red { + color: #FF0000; +} + +/*invoice-list*/ + + +.invoice-list h5 { + text-transform: uppercase; +} + +.invoice-block { + text-align: right; +} + +ul.amounts li { + border: 1px solid #eaeaea; + padding:5px 10px; + margin-bottom: 5px; + background: #f1f1f1; +} + +/*about us*/ + +.about-us h3 { + text-align: center; + padding-bottom: 30px; +} +.about-us h4 { + padding-bottom: 10px; +} +.about-us h5 { + padding-bottom: 5px; + margin: 0; +} + +.team-member, .team-member span{ + text-align: center; +} +.team-member span{ + color: #b6b6b6; + text-transform: uppercase; + display: block; +} + +.team-member h3 { + margin: 0; + padding: 0; +} + +.team-member img{ + border: 10px solid #e3e3e3; + border-radius: 500px; +} + +.team-member ul { + display: inline-block; + margin: 10px 0; +} +.team-member ul li { + display: inline-block; +} +.team-member ul li a { + color: #d9d9d9; + font-size: 35px; + text-decoration: none; +} + +.team-member p { + text-align: left; +} + +/*contact us*/ +.contact-us h3 { + text-align: center; + padding-bottom:0px; + margin:0; +} + +.contact-us .feedback p { + text-align: center; +} + +.one-half { + margin-right: 21px; +} + +.feedback .control-group { + margin-bottom: 15px; +} + +.edit, +.editing .show { + display: none; +} + +.editing .edit { + display: block; +} + +.input-append.input-block-level .btn { + float: none !important; + margin-left: 0 !important; +} + +.control-group { + margin-bottom: 0; +} + +.input-append, .input-prepend { + margin-bottom: 0; +} + +.navbar .brand { + padding: 14px 20px 14px; +} + +fieldset legend { + margin-bottom: 10px; + font-size: 14px; +} + +.table .table { + margin-bottom: 0px; +} + +.accordion { + margin-bottom: 0px; +} + +.accordion-heading { + padding: 6px; +background: #ffffff; /* Old browsers */ +background: -moz-linear-gradient(top, #ffffff 0%, #f1f1f1 50%, #e1e1e1 51%, #f6f6f6 100%); /* FF3.6+ */ +background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ffffff), color-stop(50%,#f1f1f1), color-stop(51%,#e1e1e1), color-stop(100%,#f6f6f6)); /* Chrome,Safari4+ */ +background: -webkit-linear-gradient(top, #ffffff 0%,#f1f1f1 50%,#e1e1e1 51%,#f6f6f6 100%); /* Chrome10+,Safari5.1+ */ +background: -o-linear-gradient(top, #ffffff 0%,#f1f1f1 50%,#e1e1e1 51%,#f6f6f6 100%); /* Opera 11.10+ */ +background: -ms-linear-gradient(top, #ffffff 0%,#f1f1f1 50%,#e1e1e1 51%,#f6f6f6 100%); /* IE10+ */ +background: linear-gradient(to bottom, #ffffff 0%,#f1f1f1 50%,#e1e1e1 51%,#f6f6f6 100%); /* W3C */ +filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#f6f6f6',GradientType=0 ); /* IE6-9 */ + +} + +span.tag, +.accordion-heading .accordion-toggle { + font-family: "ExoBold"; + font-weight: normal; + line-height: 30px; +} + +li.tag { + font-family: "ExoBold"; + font-weight: normal; +} + +.mode { + left: 5px; + top: 1px; +/* + margin-left: -12px; + margin-top: 4px;*/ + position: absolute; + transform: rotate(-45deg); + -ms-transform: rotate(-45deg); + -webkit-transform: rotate(-45deg); +} + +.table th, .table td { + line-height: 20px; +} + +.is_hidden { + opacity: 0.67; /* opacity [0-1] */ + -moz-opacity: 0.67; /* opacity [0-1] */ + -webkit-opacity: 0.67; /* opacity [0-1] */ +} + +.is_hidden i.icon-tag:before { + color: #999; +} + +.accordion-heading i.icon-tag:before { + color: #2FA4E7; +} + +table.table-diff td { +} + +table.table-diff td.arrow-td { + vertical-align: middle; + border-top: 1px solid #AAA; + border-bottom: none; + background: #DDD; + width: 16px; +} + +div.add-on.multi { + white-space: normal; + background: #FFF; + padding: 2px; + height: auto; + max-width: 90%; +} + +.add-on.multi .label { +} + +a.removeItem { + color: #FFF; +} + +a.removeItem:hover { + text-decoration: none; + color: #DDD; +} + +.well-tiny { + padding: 5px; + margin: 0px; +} + +a.removeValue { + margin-left: 5px; +} + +.accordion-inner { + border-top: 0; + padding: 0; +} + +.accordion-inner .table td { + padding: 6px ; /*48px 6px 6px;*/ +} + +.accordion-group { + margin-bottom: 8px; +} + +.group { + padding: 8px 0; +} + +.group > .view { +background: url("../img/body-bg.png") repeat scroll 0 0 #F7F7F7; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.05) inset; + border-radius: 8px; + border: 5px double #FFF; + padding: 8px; +} + +input.default, +select.default, +.default .btn, +.default { + color: #2FA4E7; +} + +tr.separator th { + padding: 26px 6px 6px; + background: transparent !important; + font-family: 'ExoLight', sans-serif; + font-weight: normal; + text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.2); + font-size: 20px; + border-top: none; + border-bottom: 2px solid #777; +} + +.bootstrap-select.btn-group, .bootstrap-select.btn-group[class*="span"] { + margin-bottom: 0; +} +.input-prepend.input-append select + .btn-group .btn, +.input-append.input-prepend .bootstrap-select .btn { + border-radius: 0 +} + +ul.dropdown-menu { min-height: 0 !important } + +.breadcrumb.tag { + margin:0; +} + +.input-append, .input-prepend { + position: relative; +} +.input-append .calculated, +.input-prepend .calculated { + font-size: 14px !important; +} + +.calculated { + display: block; + position: absolute; + top: 5px; + right: 40px; + width: 20px; +} + +ul.legendlist li { + margin-bottom: 5px; +} + +.accordion-body.in { overflow: visible; } +.accordion-body.in:hover { overflow: visible; } +.tooltip { + white-space: normal; +} + +.modal-header { + overflow: visible; + overflow-y: auto; +} + +td.alert { + border-radius: 0; +} + +td.diff { + border-top: 5px solid #AAA; + background: url("../img/body-bg.png") repeat scroll 0 0 #F7F7F7; +} + +td.diff .well-tiny { + margin-top: 8px; +} +td.variable > .alert, +.accordion-heading > .alert { + margin-top: 8px; + padding: 5px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +td.diff > .view { + margin: 4px; +} + +.multi-items { + background-color: #FFFFFF; + border: 1px solid #CCCCCC; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075) inset; + transition: border 0.2s linear 0s, box-shadow 0.2s linear 0s; + border-radius: 4px 4px 4px 4px; + color: #555555; + display: inline-block; + font-size: 14px; + line-height: 20px; + padding: 2px; + vertical-align: middle; +/* overflow-x: auto; + white-space: nowrap; */ +} + +.multi-control-group { + margin-left: 4px; +} + +[class^="icon-locale-"], +[class*=" icon-locale-"] { + display: inline-block !important; + width: 17px !important; + height: 18px; + margin: 0; + *margin-right: .3em; + line-height: 14px !important; + vertical-align: baseline; + background-position: bottom center !important; + background-repeat: no-repeat !important; +} +[class^="icon-locale-"]:last-child, +[class*=" icon-locale-"]:last-child { + *margin-left: 0; +} +.icon-locale-en { background-image: url('../img/icons/en.png') !important; } +.icon-locale-fr { background-image: url('../img/icons/fr.png') !important; } + +.dropdown-menu.extended li a.modeItem, +.dropdown-menu.extended li a.modeItem:hover { + color: #FFFFFF; + font-size: 11.844px; + font-weight: bold; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + vertical-align: baseline; +} + +.dropdown-menu.extended li a.modeItem.label-normal { + background-color: #999999; +} + +.dropdown-menu.extended li a.modeItem.label-normal:hover { + background-color: #AAAAAA; +} +.dropdown-menu.extended li a.modeItem.label-success { + background-color: #A5D16C; + background-image: -moz-linear-gradient(center top , #A5D16C, #A5D16C); +} +.dropdown-menu.extended li a.modeItem.label-success:hover { + background-color: #B5E17C; + background-image: -moz-linear-gradient(center top , #B5E17C, #B5E17C); +} + +.dropdown-menu.extended li a.modeItem.label-important { + background-color: #E74955; + background-image: -moz-linear-gradient(center top , #E74955, #E74955) +} +.dropdown-menu.extended li a.modeItem.label-important:hover { + background-color: #F75965; + background-image: -moz-linear-gradient(center top , #F75965, #F75965) +} + +.hero-unit { + background: transparent; +} + + +.accordion { + margin-bottom: 0px; +} + +.accordion-heading { + padding: 6px; +background: #ffffff; /* Old browsers */ +background: -moz-linear-gradient(top, #ffffff 0%, #f1f1f1 50%, #e1e1e1 51%, #f6f6f6 100%); /* FF3.6+ */ +background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ffffff), color-stop(50%,#f1f1f1), color-stop(51%,#e1e1e1), color-stop(100%,#f6f6f6)); /* Chrome,Safari4+ */ +background: -webkit-linear-gradient(top, #ffffff 0%,#f1f1f1 50%,#e1e1e1 51%,#f6f6f6 100%); /* Chrome10+,Safari5.1+ */ +background: -o-linear-gradient(top, #ffffff 0%,#f1f1f1 50%,#e1e1e1 51%,#f6f6f6 100%); /* Opera 11.10+ */ +background: -ms-linear-gradient(top, #ffffff 0%,#f1f1f1 50%,#e1e1e1 51%,#f6f6f6 100%); /* IE10+ */ +background: linear-gradient(to bottom, #ffffff 0%,#f1f1f1 50%,#e1e1e1 51%,#f6f6f6 100%); /* W3C */ +filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#f6f6f6',GradientType=0 ); /* IE6-9 */ + +} + +.accordion-heading +.accordion-toggle { + display: inline-block; + padding: 0; +} + +.editBtn, .saveBtn +.editBtn:hover, .saveBtn:hover { + border-radius: 0 4px 4px 0; +} + +.breadcrumb li.divider { + background: none repeat scroll 0 0 transparent; + margin: 0; + padding: 0; +} + +.uploadConfig { + position: relative; +} + +#fileUpload { + cursor: pointer; + direction: ltr; + font-size: 23px; + margin: 0; + opacity: 0; + position: absolute; + right: 0; + top: 0; +} + +.init.hero-unit { + padding: 30px 60px 0; +} + +@media (min-width: 980px) { + span.visible-desktop { + display: inline-block !important; + } +} + +@media (max-width: 480px) { + #header.navbar .brand { + padding: 14px !important; + width: 24px; + margin-top: 0 !important; + } + #header .navbar-inner, + #header.navbar.navbar-inverse.navbar-fixed-top .navbar-inner { + height: 50px !important; + } + .hidden-phone-portrait { + display: none; + } + input.value, select.value, + input[name='value'], select[name='value'] { + max-width: 120px; + } + .widget-body { + padding: 5px; + } + .bootstrap-select > .btn, .bootstrap-select { + max-width: 150px; + } + div.add-on.multi { + max-width: 83%; + } + .group > .view { + padding: 5px; + } + .table th, .table td { + padding: 5px; + } + .accordion-inner .table td { + padding: 6px; + } +} + + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/css/bootstrap-responsive.css b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/css/bootstrap-responsive.css new file mode 100644 index 0000000000000000000000000000000000000000..73bcfbeee4737a141d2582dd5143cb3855b518d7 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/css/bootstrap-responsive.css @@ -0,0 +1,1110 @@ +/*! + * Bootstrap Responsive v2.3.0 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ + +.clearfix { + *zoom: 1; +} + +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +.clearfix:after { + clear: both; +} + +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} + +.hidden { + display: none; + visibility: hidden; +} + +.visible-phone { + display: none !important; +} + +.visible-tablet { + display: none !important; +} + +.hidden-desktop { + display: none !important; +} + +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + .hidden-desktop { + display: inherit !important; + } + .visible-desktop { + display: none !important ; + } + .visible-tablet { + display: inherit !important; + } + .hidden-tablet { + display: none !important; + } +} + +@media (max-width: 767px) { + .hidden-desktop { + display: inherit !important; + } + .visible-desktop { + display: none !important; + } + .visible-phone { + display: inherit !important; + } + .hidden-phone { + display: none !important; + } +} + +.visible-print { + display: none !important; +} + +@media print { + .visible-print { + display: inherit !important; + } + .hidden-print { + display: none !important; + } +} + +@media (min-width: 1200px) { + .row { + margin-left: -30px; + *zoom: 1; + } + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + .row:after { + clear: both; + } + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 30px; + } + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 1170px; + } + .span12 { + width: 1170px; + } + .span11 { + width: 1070px; + } + .span10 { + width: 970px; + } + .span9 { + width: 870px; + } + .span8 { + width: 770px; + } + .span7 { + width: 670px; + } + .span6 { + width: 570px; + } + .span5 { + width: 470px; + } + .span4 { + width: 370px; + } + .span3 { + width: 270px; + } + .span2 { + width: 170px; + } + .span1 { + width: 70px; + } + .offset12 { + margin-left: 1230px; + } + .offset11 { + margin-left: 1130px; + } + .offset10 { + margin-left: 1030px; + } + .offset9 { + margin-left: 930px; + } + .offset8 { + margin-left: 830px; + } + .offset7 { + margin-left: 730px; + } + .offset6 { + margin-left: 630px; + } + .offset5 { + margin-left: 530px; + } + .offset4 { + margin-left: 430px; + } + .offset3 { + margin-left: 330px; + } + .offset2 { + margin-left: 230px; + } + .offset1 { + margin-left: 130px; + } + .row-fluid { + width: 100%; + *zoom: 1; + } + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + .row-fluid:after { + clear: both; + } + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.564102564102564%; + *margin-left: 2.5109110747408616%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.564102564102564%; + } + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + .row-fluid .span11 { + width: 91.45299145299145%; + *width: 91.39979996362975%; + } + .row-fluid .span10 { + width: 82.90598290598291%; + *width: 82.8527914166212%; + } + .row-fluid .span9 { + width: 74.35897435897436%; + *width: 74.30578286961266%; + } + .row-fluid .span8 { + width: 65.81196581196582%; + *width: 65.75877432260411%; + } + .row-fluid .span7 { + width: 57.26495726495726%; + *width: 57.21176577559556%; + } + .row-fluid .span6 { + width: 48.717948717948715%; + *width: 48.664757228587014%; + } + .row-fluid .span5 { + width: 40.17094017094017%; + *width: 40.11774868157847%; + } + .row-fluid .span4 { + width: 31.623931623931625%; + *width: 31.570740134569924%; + } + .row-fluid .span3 { + width: 23.076923076923077%; + *width: 23.023731587561375%; + } + .row-fluid .span2 { + width: 14.52991452991453%; + *width: 14.476723040552828%; + } + .row-fluid .span1 { + width: 5.982905982905983%; + *width: 5.929714493544281%; + } + .row-fluid .offset12 { + margin-left: 105.12820512820512%; + *margin-left: 105.02182214948171%; + } + .row-fluid .offset12:first-child { + margin-left: 102.56410256410257%; + *margin-left: 102.45771958537915%; + } + .row-fluid .offset11 { + margin-left: 96.58119658119658%; + *margin-left: 96.47481360247316%; + } + .row-fluid .offset11:first-child { + margin-left: 94.01709401709402%; + *margin-left: 93.91071103837061%; + } + .row-fluid .offset10 { + margin-left: 88.03418803418803%; + *margin-left: 87.92780505546462%; + } + .row-fluid .offset10:first-child { + margin-left: 85.47008547008548%; + *margin-left: 85.36370249136206%; + } + .row-fluid .offset9 { + margin-left: 79.48717948717949%; + *margin-left: 79.38079650845607%; + } + .row-fluid .offset9:first-child { + margin-left: 76.92307692307693%; + *margin-left: 76.81669394435352%; + } + .row-fluid .offset8 { + margin-left: 70.94017094017094%; + *margin-left: 70.83378796144753%; + } + .row-fluid .offset8:first-child { + margin-left: 68.37606837606839%; + *margin-left: 68.26968539734497%; + } + .row-fluid .offset7 { + margin-left: 62.393162393162385%; + *margin-left: 62.28677941443899%; + } + .row-fluid .offset7:first-child { + margin-left: 59.82905982905982%; + *margin-left: 59.72267685033642%; + } + .row-fluid .offset6 { + margin-left: 53.84615384615384%; + *margin-left: 53.739770867430444%; + } + .row-fluid .offset6:first-child { + margin-left: 51.28205128205128%; + *margin-left: 51.175668303327875%; + } + .row-fluid .offset5 { + margin-left: 45.299145299145295%; + *margin-left: 45.1927623204219%; + } + .row-fluid .offset5:first-child { + margin-left: 42.73504273504273%; + *margin-left: 42.62865975631933%; + } + .row-fluid .offset4 { + margin-left: 36.75213675213675%; + *margin-left: 36.645753773413354%; + } + .row-fluid .offset4:first-child { + margin-left: 34.18803418803419%; + *margin-left: 34.081651209310785%; + } + .row-fluid .offset3 { + margin-left: 28.205128205128204%; + *margin-left: 28.0987452264048%; + } + .row-fluid .offset3:first-child { + margin-left: 25.641025641025642%; + *margin-left: 25.53464266230224%; + } + .row-fluid .offset2 { + margin-left: 19.65811965811966%; + *margin-left: 19.551736679396257%; + } + .row-fluid .offset2:first-child { + margin-left: 17.094017094017094%; + *margin-left: 16.98763411529369%; + } + .row-fluid .offset1 { + margin-left: 11.11111111111111%; + *margin-left: 11.004728132387708%; + } + .row-fluid .offset1:first-child { + margin-left: 8.547008547008547%; + *margin-left: 8.440625568285142%; + } + input, + textarea, + .uneditable-input { + margin-left: 0; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 30px; + } + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 1156px; + } + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 1056px; + } + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 956px; + } + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 856px; + } + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 756px; + } + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 656px; + } + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 556px; + } + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 456px; + } + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 356px; + } + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 256px; + } + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 156px; + } + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 56px; + } + .thumbnails { + margin-left: -30px; + } + .thumbnails > li { + margin-left: 30px; + } + .row-fluid .thumbnails { + margin-left: 0; + } +} + +@media (min-width: 768px) and (max-width: 979px) { + .row { + margin-left: -20px; + *zoom: 1; + } + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + .row:after { + clear: both; + } + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + .span12 { + width: 724px; + } + .span11 { + width: 662px; + } + .span10 { + width: 600px; + } + .span9 { + width: 538px; + } + .span8 { + width: 476px; + } + .span7 { + width: 414px; + } + .span6 { + width: 352px; + } + .span5 { + width: 290px; + } + .span4 { + width: 228px; + } + .span3 { + width: 166px; + } + .span2 { + width: 104px; + } + .span1 { + width: 42px; + } + .offset12 { + margin-left: 764px; + } + .offset11 { + margin-left: 702px; + } + .offset10 { + margin-left: 640px; + } + .offset9 { + margin-left: 578px; + } + .offset8 { + margin-left: 516px; + } + .offset7 { + margin-left: 454px; + } + .offset6 { + margin-left: 392px; + } + .offset5 { + margin-left: 330px; + } + .offset4 { + margin-left: 268px; + } + .offset3 { + margin-left: 206px; + } + .offset2 { + margin-left: 144px; + } + .offset1 { + margin-left: 82px; + } + .row-fluid { + width: 100%; + *zoom: 1; + } + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + .row-fluid:after { + clear: both; + } + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + input, + textarea, + .uneditable-input { + margin-left: 0; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} + +@media (max-width: 767px) { + body { + padding-right: 20px; + padding-left: 20px; + } + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + .container-fluid { + padding: 0; + } + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + .dl-horizontal dd { + margin-left: 0; + } + .container { + width: auto; + } + .row-fluid { + width: 100%; + } + .row, + .thumbnails { + margin-left: 0; + } + .thumbnails > li { + float: none; + margin-left: 0; + } + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + .modal.fade { + top: -100px; + } + .modal.fade.in { + top: 20px; + } +} + +@media (max-width: 480px) { + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + .page-header h1 small { + display: block; + line-height: 20px; + } + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + .form-horizontal .controls { + margin-left: 0; + } + .form-horizontal .control-list { + padding-top: 0; + } + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + .media-object { + margin-right: 0; + margin-left: 0; + } + .modal { + top: 10px; + right: 10px; + left: 10px; + } + .modal-header .close { + padding: 10px; + margin: -10px; + } + .carousel-caption { + position: static; + } +} + +@media (max-width: 979px) { + body { + padding-top: 0; + padding-bottom: 0; + } + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + .navbar-fixed-top { + margin-bottom: 20px; + } + .navbar-fixed-bottom { + margin-top: 20px; + } + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + .navbar .container { + width: auto; + padding: 0; + } + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + .nav-collapse { + clear: both; + } + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + .nav-collapse .nav > li { + float: none; + } + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + .nav-collapse .nav > .divider-vertical { + display: none; + } + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + .nav-collapse .open > .dropdown-menu { + display: block; + } + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + .nav-collapse .dropdown-menu .divider { + display: none; + } + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + .navbar .btn-navbar { + display: block; + } + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} + +@media (min-width: 980px) { + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/css/bootstrap-responsive.min.css b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/css/bootstrap-responsive.min.css new file mode 100644 index 0000000000000000000000000000000000000000..05978601011d16a1473189fce9ce1090055af2ce --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/css/bootstrap-responsive.min.css @@ -0,0 +1,9 @@ +/*! + * Bootstrap Responsive v2.3.0 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}@-ms-viewport{width:device-width}.hidden{display:none;visibility:hidden}.visible-phone{display:none!important}.visible-tablet{display:none!important}.hidden-desktop{display:none!important}.visible-desktop{display:inherit!important}@media(min-width:768px) and (max-width:979px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-tablet{display:inherit!important}.hidden-tablet{display:none!important}}@media(max-width:767px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-phone{display:inherit!important}.hidden-phone{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:inherit!important}.hidden-print{display:none!important}}@media(min-width:1200px){.row{margin-left:-30px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:30px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px}.span12{width:1170px}.span11{width:1070px}.span10{width:970px}.span9{width:870px}.span8{width:770px}.span7{width:670px}.span6{width:570px}.span5{width:470px}.span4{width:370px}.span3{width:270px}.span2{width:170px}.span1{width:70px}.offset12{margin-left:1230px}.offset11{margin-left:1130px}.offset10{margin-left:1030px}.offset9{margin-left:930px}.offset8{margin-left:830px}.offset7{margin-left:730px}.offset6{margin-left:630px}.offset5{margin-left:530px}.offset4{margin-left:430px}.offset3{margin-left:330px}.offset2{margin-left:230px}.offset1{margin-left:130px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.564102564102564%;*margin-left:2.5109110747408616%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.564102564102564%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.45299145299145%;*width:91.39979996362975%}.row-fluid .span10{width:82.90598290598291%;*width:82.8527914166212%}.row-fluid .span9{width:74.35897435897436%;*width:74.30578286961266%}.row-fluid .span8{width:65.81196581196582%;*width:65.75877432260411%}.row-fluid .span7{width:57.26495726495726%;*width:57.21176577559556%}.row-fluid .span6{width:48.717948717948715%;*width:48.664757228587014%}.row-fluid .span5{width:40.17094017094017%;*width:40.11774868157847%}.row-fluid .span4{width:31.623931623931625%;*width:31.570740134569924%}.row-fluid .span3{width:23.076923076923077%;*width:23.023731587561375%}.row-fluid .span2{width:14.52991452991453%;*width:14.476723040552828%}.row-fluid .span1{width:5.982905982905983%;*width:5.929714493544281%}.row-fluid .offset12{margin-left:105.12820512820512%;*margin-left:105.02182214948171%}.row-fluid .offset12:first-child{margin-left:102.56410256410257%;*margin-left:102.45771958537915%}.row-fluid .offset11{margin-left:96.58119658119658%;*margin-left:96.47481360247316%}.row-fluid .offset11:first-child{margin-left:94.01709401709402%;*margin-left:93.91071103837061%}.row-fluid .offset10{margin-left:88.03418803418803%;*margin-left:87.92780505546462%}.row-fluid .offset10:first-child{margin-left:85.47008547008548%;*margin-left:85.36370249136206%}.row-fluid .offset9{margin-left:79.48717948717949%;*margin-left:79.38079650845607%}.row-fluid .offset9:first-child{margin-left:76.92307692307693%;*margin-left:76.81669394435352%}.row-fluid .offset8{margin-left:70.94017094017094%;*margin-left:70.83378796144753%}.row-fluid .offset8:first-child{margin-left:68.37606837606839%;*margin-left:68.26968539734497%}.row-fluid .offset7{margin-left:62.393162393162385%;*margin-left:62.28677941443899%}.row-fluid .offset7:first-child{margin-left:59.82905982905982%;*margin-left:59.72267685033642%}.row-fluid .offset6{margin-left:53.84615384615384%;*margin-left:53.739770867430444%}.row-fluid .offset6:first-child{margin-left:51.28205128205128%;*margin-left:51.175668303327875%}.row-fluid .offset5{margin-left:45.299145299145295%;*margin-left:45.1927623204219%}.row-fluid .offset5:first-child{margin-left:42.73504273504273%;*margin-left:42.62865975631933%}.row-fluid .offset4{margin-left:36.75213675213675%;*margin-left:36.645753773413354%}.row-fluid .offset4:first-child{margin-left:34.18803418803419%;*margin-left:34.081651209310785%}.row-fluid .offset3{margin-left:28.205128205128204%;*margin-left:28.0987452264048%}.row-fluid .offset3:first-child{margin-left:25.641025641025642%;*margin-left:25.53464266230224%}.row-fluid .offset2{margin-left:19.65811965811966%;*margin-left:19.551736679396257%}.row-fluid .offset2:first-child{margin-left:17.094017094017094%;*margin-left:16.98763411529369%}.row-fluid .offset1{margin-left:11.11111111111111%;*margin-left:11.004728132387708%}.row-fluid .offset1:first-child{margin-left:8.547008547008547%;*margin-left:8.440625568285142%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:30px}input.span12,textarea.span12,.uneditable-input.span12{width:1156px}input.span11,textarea.span11,.uneditable-input.span11{width:1056px}input.span10,textarea.span10,.uneditable-input.span10{width:956px}input.span9,textarea.span9,.uneditable-input.span9{width:856px}input.span8,textarea.span8,.uneditable-input.span8{width:756px}input.span7,textarea.span7,.uneditable-input.span7{width:656px}input.span6,textarea.span6,.uneditable-input.span6{width:556px}input.span5,textarea.span5,.uneditable-input.span5{width:456px}input.span4,textarea.span4,.uneditable-input.span4{width:356px}input.span3,textarea.span3,.uneditable-input.span3{width:256px}input.span2,textarea.span2,.uneditable-input.span2{width:156px}input.span1,textarea.span1,.uneditable-input.span1{width:56px}.thumbnails{margin-left:-30px}.thumbnails>li{margin-left:30px}.row-fluid .thumbnails{margin-left:0}}@media(min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px}.span12{width:724px}.span11{width:662px}.span10{width:600px}.span9{width:538px}.span8{width:476px}.span7{width:414px}.span6{width:352px}.span5{width:290px}.span4{width:228px}.span3{width:166px}.span2{width:104px}.span1{width:42px}.offset12{margin-left:764px}.offset11{margin-left:702px}.offset10{margin-left:640px}.offset9{margin-left:578px}.offset8{margin-left:516px}.offset7{margin-left:454px}.offset6{margin-left:392px}.offset5{margin-left:330px}.offset4{margin-left:268px}.offset3{margin-left:206px}.offset2{margin-left:144px}.offset1{margin-left:82px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.7624309392265194%;*margin-left:2.709239449864817%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.7624309392265194%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.43646408839778%;*width:91.38327259903608%}.row-fluid .span10{width:82.87292817679558%;*width:82.81973668743387%}.row-fluid .span9{width:74.30939226519337%;*width:74.25620077583166%}.row-fluid .span8{width:65.74585635359117%;*width:65.69266486422946%}.row-fluid .span7{width:57.18232044198895%;*width:57.12912895262725%}.row-fluid .span6{width:48.61878453038674%;*width:48.56559304102504%}.row-fluid .span5{width:40.05524861878453%;*width:40.00205712942283%}.row-fluid .span4{width:31.491712707182323%;*width:31.43852121782062%}.row-fluid .span3{width:22.92817679558011%;*width:22.87498530621841%}.row-fluid .span2{width:14.3646408839779%;*width:14.311449394616199%}.row-fluid .span1{width:5.801104972375691%;*width:5.747913483013988%}.row-fluid .offset12{margin-left:105.52486187845304%;*margin-left:105.41847889972962%}.row-fluid .offset12:first-child{margin-left:102.76243093922652%;*margin-left:102.6560479605031%}.row-fluid .offset11{margin-left:96.96132596685082%;*margin-left:96.8549429881274%}.row-fluid .offset11:first-child{margin-left:94.1988950276243%;*margin-left:94.09251204890089%}.row-fluid .offset10{margin-left:88.39779005524862%;*margin-left:88.2914070765252%}.row-fluid .offset10:first-child{margin-left:85.6353591160221%;*margin-left:85.52897613729868%}.row-fluid .offset9{margin-left:79.8342541436464%;*margin-left:79.72787116492299%}.row-fluid .offset9:first-child{margin-left:77.07182320441989%;*margin-left:76.96544022569647%}.row-fluid .offset8{margin-left:71.2707182320442%;*margin-left:71.16433525332079%}.row-fluid .offset8:first-child{margin-left:68.50828729281768%;*margin-left:68.40190431409427%}.row-fluid .offset7{margin-left:62.70718232044199%;*margin-left:62.600799341718584%}.row-fluid .offset7:first-child{margin-left:59.94475138121547%;*margin-left:59.838368402492065%}.row-fluid .offset6{margin-left:54.14364640883978%;*margin-left:54.037263430116376%}.row-fluid .offset6:first-child{margin-left:51.38121546961326%;*margin-left:51.27483249088986%}.row-fluid .offset5{margin-left:45.58011049723757%;*margin-left:45.47372751851417%}.row-fluid .offset5:first-child{margin-left:42.81767955801105%;*margin-left:42.71129657928765%}.row-fluid .offset4{margin-left:37.01657458563536%;*margin-left:36.91019160691196%}.row-fluid .offset4:first-child{margin-left:34.25414364640884%;*margin-left:34.14776066768544%}.row-fluid .offset3{margin-left:28.45303867403315%;*margin-left:28.346655695309746%}.row-fluid .offset3:first-child{margin-left:25.69060773480663%;*margin-left:25.584224756083227%}.row-fluid .offset2{margin-left:19.88950276243094%;*margin-left:19.783119783707537%}.row-fluid .offset2:first-child{margin-left:17.12707182320442%;*margin-left:17.02068884448102%}.row-fluid .offset1{margin-left:11.32596685082873%;*margin-left:11.219583872105325%}.row-fluid .offset1:first-child{margin-left:8.56353591160221%;*margin-left:8.457152932878806%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:710px}input.span11,textarea.span11,.uneditable-input.span11{width:648px}input.span10,textarea.span10,.uneditable-input.span10{width:586px}input.span9,textarea.span9,.uneditable-input.span9{width:524px}input.span8,textarea.span8,.uneditable-input.span8{width:462px}input.span7,textarea.span7,.uneditable-input.span7{width:400px}input.span6,textarea.span6,.uneditable-input.span6{width:338px}input.span5,textarea.span5,.uneditable-input.span5{width:276px}input.span4,textarea.span4,.uneditable-input.span4{width:214px}input.span3,textarea.span3,.uneditable-input.span3{width:152px}input.span2,textarea.span2,.uneditable-input.span2{width:90px}input.span1,textarea.span1,.uneditable-input.span1{width:28px}}@media(max-width:767px){body{padding-right:20px;padding-left:20px}.navbar-fixed-top,.navbar-fixed-bottom,.navbar-static-top{margin-right:-20px;margin-left:-20px}.container-fluid{padding:0}.dl-horizontal dt{float:none;width:auto;clear:none;text-align:left}.dl-horizontal dd{margin-left:0}.container{width:auto}.row-fluid{width:100%}.row,.thumbnails{margin-left:0}.thumbnails>li{float:none;margin-left:0}[class*="span"],.uneditable-input[class*="span"],.row-fluid [class*="span"]{display:block;float:none;width:100%;margin-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.span12,.row-fluid .span12{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="offset"]:first-child{margin-left:0}.input-large,.input-xlarge,.input-xxlarge,input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.input-prepend input,.input-append input,.input-prepend input[class*="span"],.input-append input[class*="span"]{display:inline-block;width:auto}.controls-row [class*="span"]+[class*="span"]{margin-left:0}.modal{position:fixed;top:20px;right:20px;left:20px;width:auto;margin:0}.modal.fade{top:-100px}.modal.fade.in{top:20px}}@media(max-width:480px){.nav-collapse{-webkit-transform:translate3d(0,0,0)}.page-header h1 small{display:block;line-height:20px}input[type="checkbox"],input[type="radio"]{border:1px solid #ccc}.form-horizontal .control-label{float:none;width:auto;padding-top:0;text-align:left}.form-horizontal .controls{margin-left:0}.form-horizontal .control-list{padding-top:0}.form-horizontal .form-actions{padding-right:10px;padding-left:10px}.media .pull-left,.media .pull-right{display:block;float:none;margin-bottom:10px}.media-object{margin-right:0;margin-left:0}.modal{top:10px;right:10px;left:10px}.modal-header .close{padding:10px;margin:-10px}.carousel-caption{position:static}}@media(max-width:979px){body{padding-top:0}.navbar-fixed-top,.navbar-fixed-bottom{position:static}.navbar-fixed-top{margin-bottom:20px}.navbar-fixed-bottom{margin-top:20px}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding:5px}.navbar .container{width:auto;padding:0}.navbar .brand{padding-right:10px;padding-left:10px;margin:0 0 0 -5px}.nav-collapse{clear:both}.nav-collapse .nav{float:none;margin:0 0 10px}.nav-collapse .nav>li{float:none}.nav-collapse .nav>li>a{margin-bottom:2px}.nav-collapse .nav>.divider-vertical{display:none}.nav-collapse .nav .nav-header{color:#777;text-shadow:none}.nav-collapse .nav>li>a,.nav-collapse .dropdown-menu a{padding:9px 15px;font-weight:bold;color:#777;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.nav-collapse .btn{padding:4px 10px 4px;font-weight:normal;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.nav-collapse .dropdown-menu li+li a{margin-bottom:2px}.nav-collapse .nav>li>a:hover,.nav-collapse .nav>li>a:focus,.nav-collapse .dropdown-menu a:hover,.nav-collapse .dropdown-menu a:focus{background-color:#f2f2f2}.navbar-inverse .nav-collapse .nav>li>a,.navbar-inverse .nav-collapse .dropdown-menu a{color:#999}.navbar-inverse .nav-collapse .nav>li>a:hover,.navbar-inverse .nav-collapse .nav>li>a:focus,.navbar-inverse .nav-collapse .dropdown-menu a:hover,.navbar-inverse .nav-collapse .dropdown-menu a:focus{background-color:#111}.nav-collapse.in .btn-group{padding:0;margin-top:5px}.nav-collapse .dropdown-menu{position:static;top:auto;left:auto;display:none;float:none;max-width:none;padding:0;margin:0 15px;background-color:transparent;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.nav-collapse .open>.dropdown-menu{display:block}.nav-collapse .dropdown-menu:before,.nav-collapse .dropdown-menu:after{display:none}.nav-collapse .dropdown-menu .divider{display:none}.nav-collapse .nav>li>.dropdown-menu:before,.nav-collapse .nav>li>.dropdown-menu:after{display:none}.nav-collapse .navbar-form,.nav-collapse .navbar-search{float:none;padding:10px 15px;margin:10px 0;border-top:1px solid #f2f2f2;border-bottom:1px solid #f2f2f2;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}.navbar-inverse .nav-collapse .navbar-form,.navbar-inverse .nav-collapse .navbar-search{border-top-color:#111;border-bottom-color:#111}.navbar .nav-collapse .nav.pull-right{float:none;margin-left:0}.nav-collapse,.nav-collapse.collapse{height:0;overflow:hidden}.navbar .btn-navbar{display:block}.navbar-static .navbar-inner{padding-right:10px;padding-left:10px}}@media(min-width:980px){.nav-collapse.collapse{height:auto!important;overflow:visible!important}} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/css/bootstrap-select.css b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/css/bootstrap-select.css new file mode 100644 index 0000000000000000000000000000000000000000..f3ce6305e6be62570a645cd2803189e92eaf523e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/css/bootstrap-select.css @@ -0,0 +1,52 @@ +.clearfix:after { + visibility: hidden; + display: block; + font-size: 0; + content: " "; + clear: both; + height: 0; +} +.bootstrap-select.btn-group, .bootstrap-select.btn-group[class*="span"] { + float:none; + display: inline-block; + margin-left:0; +} +.bootstrap-select {width: 220px;} +.bootstrap-select .btn {width: 220px;} +.bootstrap-select .btn:focus { + outline: thin dotted #333333 !important; + outline: 5px auto -webkit-focus-ring-color !important; + outline-offset: -2px; +} +.bootstrap-select.btn-group .btn .filter-option { + overflow:hidden; + position:absolute; + left:12px; + right:25px; + text-align:left; +} +.bootstrap-select.btn-group .btn .caret { + position:absolute; + right:12px; +} +.bootstrap-select.btn-group > .disabled, .bootstrap-select.btn-group .dropdown-menu li.disabled > a {cursor: not-allowed;} +.bootstrap-select.btn-group[class*="span"] .btn { + width:100%; +} +.bootstrap-select.btn-group .dropdown-menu { + min-width:100%; + -moz-box-sizing:border-box; + -webkit-box-sizing:border-box; + box-sizing:border-box; +} +.bootstrap-select.btn-group .dropdown-menu dt { + display:block; + padding:3px 20px; + cursor:default; +} +.bootstrap-select.btn-group .div-contain {overflow:hidden;} +.bootstrap-select.btn-group .dropdown-menu li > a.opt {padding-left:35px;} +.bootstrap-select.btn-group .dropdown-menu li > a {min-height:20px;} +.bootstrap-select.btn-group .dropdown-menu li small {padding-left:0.5em;} +.bootstrap-select.btn-group .dropdown-menu li:not(.disabled) > a:hover small {color: #64b1d8; color:rgba(255,255,255,0.4);} +.bootstrap-select.btn-group .dropdown-menu li > dt small {font-weight:normal;} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/css/bootstrap-select2.css b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/css/bootstrap-select2.css new file mode 100644 index 0000000000000000000000000000000000000000..b80d7d295061d748453797ee19aa7e592abb4001 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/css/bootstrap-select2.css @@ -0,0 +1,92 @@ +/** + * Select2 Bootstrap CSS 1.0 + * Compatible with select2 3.3.2 and bootstrap 2.3.1 + * MIT License + */ + +.select2-container { + vertical-align: middle; +} + +.select2-container .select2-choice, +.select2-container-multi .select2-choices { + height: 28px; + line-height: 29px; + border: 1px solid #cccccc; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + background: none; + background-color: #ffffff; + filter: none; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.select2-container .select2-choice div, +.select2-container.select2-container-disabled .select2-choice div { + border-left: none; + background: none; + filter: none; +} + +.control-group.error [class^="select2-choice"] { + border-color: #b94a48; +} + +.select2-container-multi .select2-choices .select2-search-field { + height: 28px; + line-height: 27px; +} + +.select2-container-active .select2-choice, +.select2-container-multi.select2-container-active .select2-choices { + border-color: rgba(82, 168, 236, 0.8); + outline: none; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); +} + +[class^="input-"] .select2-container { + font-size: 14px; +} + +.input-prepend [class^="select2-choice"] { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.input-append [class^="select2-choice"] { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.select2-dropdown-open [class^="select2-choice"] { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} + +.select2-dropdown-open.select2-drop-above [class^="select2-choice"] { + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +[class^="input-"] [class^="select2-choice"] > div { + display: none; +} + +[class^="input-"] .select2-offscreen { + position: absolute; +} + +/** + * This stops the quick flash when a native selectbox is shown and + * then replaced by a select2 input when javascript kicks in. This can be + * removed if javascript is not present + */ +select.select2 { + height: 28px; + visibility: hidden; +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/css/bootstrap.css b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/css/bootstrap.css new file mode 100644 index 0000000000000000000000000000000000000000..a4c456717f781a41e57d7481c6f6f2c27d7e03e1 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/css/bootstrap.css @@ -0,0 +1,6704 @@ +/*! + * Bootstrap v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +@font-face { + font-family: 'ExoThin'; + src: url('../font/Exo-Thin-webfont.eot'); + src: url('../font/Exo-Thin-webfont.eot?#iefix') format('embedded-opentype'), + url('../font/Exo-Thin-webfont.woff') format('woff'), + url('../font/Exo-Thin-webfont.ttf') format('truetype'), + url('../font/Exo-Thin-webfont.svg#ExoThin') format('svg'); + font-weight: normal; + font-style: normal; + +} + +@font-face { + font-family: 'ExoThinItalic'; + src: url('../font/Exo-Thin-Italic-webfont.eot'); + src: url('../font/Exo-Thin-Italic-webfont.eot?#iefix') format('embedded-opentype'), + url('../font/Exo-Thin-Italic-webfont.woff') format('woff'), + url('../font/Exo-Thin-Italic-webfont.ttf') format('truetype'), + url('../font/Exo-Thin-Italic-webfont.svg#ExoThinItalic') format('svg'); + font-weight: normal; + font-style: normal; + +} + +@font-face { + font-family: 'ExoExtraLight'; + src: url('../font/Exo-ExtraLight-webfont.eot'); + src: url('../font/Exo-ExtraLight-webfont.eot?#iefix') format('embedded-opentype'), + url('../font/Exo-ExtraLight-webfont.woff') format('woff'), + url('../font/Exo-ExtraLight-webfont.ttf') format('truetype'), + url('../font/Exo-ExtraLight-webfont.svg#ExoExtraLight') format('svg'); + font-weight: normal; + font-style: normal; + +} + +@font-face { + font-family: 'ExoExtraLightItalic'; + src: url('../font/Exo-ExtraLight-Italic-webfont.eot'); + src: url('../font/Exo-ExtraLight-Italic-webfont.eot?#iefix') format('embedded-opentype'), + url('../font/Exo-ExtraLight-Italic-webfont.woff') format('woff'), + url('../font/Exo-ExtraLight-Italic-webfont.ttf') format('truetype'), + url('../font/Exo-ExtraLight-Italic-webfont.svg#ExoExtraLightItalic') format('svg'); + font-weight: normal; + font-style: normal; + +} + +@font-face { + font-family: 'ExoLight'; + src: url('../font/Exo-Light-webfont.eot'); + src: url('../font/Exo-Light-webfont.eot?#iefix') format('embedded-opentype'), + url('../font/Exo-Light-webfont.woff') format('woff'), + url('../font/Exo-Light-webfont.ttf') format('truetype'), + url('../font/Exo-Light-webfont.svg#ExoLight') format('svg'); + font-weight: normal; + font-style: normal; + +} + +@font-face { + font-family: 'ExoLightItalic'; + src: url('../font/Exo-Light-Italic-webfont.eot'); + src: url('../font/Exo-Light-Italic-webfont.eot?#iefix') format('embedded-opentype'), + url('../font/Exo-Light-Italic-webfont.woff') format('woff'), + url('../font/Exo-Light-Italic-webfont.ttf') format('truetype'), + url('../font/Exo-Light-Italic-webfont.svg#ExoLightItalic') format('svg'); + font-weight: normal; + font-style: normal; + +} + +@font-face { + font-family: 'ExoRegular'; + src: url('../font/Exo-Regular-webfont.eot'); + src: url('../font/Exo-Regular-webfont.eot?#iefix') format('embedded-opentype'), + url('../font/Exo-Regular-webfont.woff') format('woff'), + url('../font/Exo-Regular-webfont.ttf') format('truetype'), + url('../font/Exo-Regular-webfont.svg#ExoRegular') format('svg'); + font-weight: normal; + font-style: normal; + +} + +@font-face { + font-family: 'ExoRegularItalic'; + src: url('../font/Exo-Regular-Italic-webfont.eot'); + src: url('../font/Exo-Regular-Italic-webfont.eot?#iefix') format('embedded-opentype'), + url('../font/Exo-Regular-Italic-webfont.woff') format('woff'), + url('../font/Exo-Regular-Italic-webfont.ttf') format('truetype'), + url('../font/Exo-Regular-Italic-webfont.svg#ExoRegularItalic') format('svg'); + font-weight: normal; + font-style: normal; + +} + +@font-face { + font-family: 'ExoMedium'; + src: url('../font/Exo-Medium-webfont.eot'); + src: url('../font/Exo-Medium-webfont.eot?#iefix') format('embedded-opentype'), + url('../font/Exo-Medium-webfont.woff') format('woff'), + url('../font/Exo-Medium-webfont.ttf') format('truetype'), + url('../font/Exo-Medium-webfont.svg#ExoMedium') format('svg'); + font-weight: normal; + font-style: normal; + +} + +@font-face { + font-family: 'ExoMediumItalic'; + src: url('../font/Exo-Medium-Italic-webfont.eot'); + src: url('../font/Exo-Medium-Italic-webfont.eot?#iefix') format('embedded-opentype'), + url('../font/Exo-Medium-Italic-webfont.woff') format('woff'), + url('../font/Exo-Medium-Italic-webfont.ttf') format('truetype'), + url('../font/Exo-Medium-Italic-webfont.svg#ExoMediumItalic') format('svg'); + font-weight: normal; + font-style: normal; + +} + +@font-face { + font-family: 'ExoDemiBold'; + src: url('../font/Exo-DemiBold-webfont.eot'); + src: url('../font/Exo-DemiBold-webfont.eot?#iefix') format('embedded-opentype'), + url('../font/Exo-DemiBold-webfont.woff') format('woff'), + url('../font/Exo-DemiBold-webfont.ttf') format('truetype'), + url('../font/Exo-DemiBold-webfont.svg#ExoDemiBold') format('svg'); + font-weight: normal; + font-style: normal; + +} + +@font-face { + font-family: 'ExoDemiBoldItalic'; + src: url('../font/Exo-DemiBold-Italic-webfont.eot'); + src: url('../font/Exo-DemiBold-Italic-webfont.eot?#iefix') format('embedded-opentype'), + url('../font/Exo-DemiBold-Italic-webfont.woff') format('woff'), + url('../font/Exo-DemiBold-Italic-webfont.ttf') format('truetype'), + url('../font/Exo-DemiBold-Italic-webfont.svg#ExoDemiBoldItalic') format('svg'); + font-weight: normal; + font-style: normal; + +} + +@font-face { + font-family: 'ExoBold'; + src: url('../font/Exo-Bold-webfont.eot'); + src: url('../font/Exo-Bold-webfont.eot?#iefix') format('embedded-opentype'), + url('../font/Exo-Bold-webfont.woff') format('woff'), + url('../font/Exo-Bold-webfont.ttf') format('truetype'), + url('../font/Exo-Bold-webfont.svg#ExoBold') format('svg'); + font-weight: normal; + font-style: normal; + +} + +@font-face { + font-family: 'ExoBoldItalic'; + src: url('../font/Exo-Bold-Italic-webfont.eot'); + src: url('../font/Exo-Bold-Italic-webfont.eot?#iefix') format('embedded-opentype'), + url('../font/Exo-Bold-Italic-webfont.woff') format('woff'), + url('../font/Exo-Bold-Italic-webfont.ttf') format('truetype'), + url('../font/Exo-Bold-Italic-webfont.svg#ExoBoldItalic') format('svg'); + font-weight: normal; + font-style: normal; + +} + +@font-face { + font-family: 'ExoExtraBold'; + src: url('../font/Exo-ExtraBold-webfont.eot'); + src: url('../font/Exo-ExtraBold-webfont.eot?#iefix') format('embedded-opentype'), + url('../font/Exo-ExtraBold-webfont.woff') format('woff'), + url('../font/Exo-ExtraBold-webfont.ttf') format('truetype'), + url('../font/Exo-ExtraBold-webfont.svg#ExoExtraBold') format('svg'); + font-weight: normal; + font-style: normal; + +} + +@font-face { + font-family: 'ExoExtraBoldItalic'; + src: url('../font/Exo-ExtraBold-Italic-webfont.eot'); + src: url('../font/Exo-ExtraBold-Italic-webfont.eot?#iefix') format('embedded-opentype'), + url('../font/Exo-ExtraBold-Italic-webfont.woff') format('woff'), + url('../font/Exo-ExtraBold-Italic-webfont.ttf') format('truetype'), + url('../font/Exo-ExtraBold-Italic-webfont.svg#ExoExtraBoldItalic') format('svg'); + font-weight: normal; + font-style: normal; + +} + +@font-face { + font-family: 'ExoBlack'; + src: url('../font/Exo-Black-webfont.eot'); + src: url('../font/Exo-Black-webfont.eot?#iefix') format('embedded-opentype'), + url('../font/Exo-Black-webfont.woff') format('woff'), + url('../font/Exo-Black-webfont.ttf') format('truetype'), + url('../font/Exo-Black-webfont.svg#ExoBlack') format('svg'); + font-weight: normal; + font-style: normal; + +} + +@font-face { + font-family: 'ExoBlackItalic'; + src: url('../font/Exo-Black-Italic-webfont.eot'); + src: url('../font/Exo-Black-Italic-webfont.eot?#iefix') format('embedded-opentype'), + url('../font/Exo-Black-Italic-webfont.woff') format('woff'), + url('../font/Exo-Black-Italic-webfont.ttf') format('truetype'), + url('../font/Exo-Black-Italic-webfont.svg#ExoBlackItalic') format('svg'); + font-weight: normal; + font-style: normal; + +} + +.clearfix { + *zoom: 1; +} + +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +.clearfix:after { + clear: both; +} + +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +nav, +section { + display: block; +} + +audio, +canvas, +video { + display: inline-block; + *display: inline; + *zoom: 1; +} + +audio:not([controls]) { + display: none; +} + +html { + font-size: 100%; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} + +a:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +a:hover, +a:active { + outline: 0; +} + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +img { + width: auto\9; + height: auto; + max-width: 100%; + vertical-align: middle; + border: 0; + -ms-interpolation-mode: bicubic; +} + +#map_canvas img, +.google-maps img { + max-width: none; +} + +button, +input, +select, +textarea { + margin: 0; + font-size: 100%; + vertical-align: middle; +} + +button, +input { + *overflow: visible; + line-height: normal; +} + +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} + +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + cursor: pointer; + -webkit-appearance: button; +} + +label, +select, +button, +input[type="button"], +input[type="reset"], +input[type="submit"], +input[type="radio"], +input[type="checkbox"] { + cursor: pointer; +} + +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; +} + +input[type="search"]::-webkit-search-decoration, +input[type="search"]::-webkit-search-cancel-button { + -webkit-appearance: none; +} + +textarea { + overflow: auto; + vertical-align: top; +} + +@media print { + * { + color: #000 !important; + text-shadow: none !important; + background: transparent !important; + box-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + .ir a:after, + a[href^="javascript:"]:after, + a[href^="#"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + @page { + margin: 0.5cm; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } +} + +body { + margin: 0; + font-family: "ExoRegular", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 18px; + color: #555555; + background-color: #ffffff; +} + +a { + color: #2fa4e7; + text-decoration: none; +} + +a:hover, +a:focus { + color: #157ab5; + text-decoration: underline; +} + +.img-rounded { + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.img-polaroid { + padding: 4px; + background-color: #fff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +.img-circle { + -webkit-border-radius: 500px; + -moz-border-radius: 500px; + border-radius: 500px; +} + +.row { + margin-left: -20px; + *zoom: 1; +} + +.row:before, +.row:after { + display: table; + line-height: 0; + content: ""; +} + +.row:after { + clear: both; +} + +[class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; +} + +.container, +.navbar-static-top .container, +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} + +.span12 { + width: 940px; +} + +.span11 { + width: 860px; +} + +.span10 { + width: 780px; +} + +.span9 { + width: 700px; +} + +.span8 { + width: 620px; +} + +.span7 { + width: 540px; +} + +.span6 { + width: 460px; +} + +.span5 { + width: 380px; +} + +.span4 { + width: 300px; +} + +.span3 { + width: 220px; +} + +.span2 { + width: 140px; +} + +.span1 { + width: 60px; +} + +.offset12 { + margin-left: 980px; +} + +.offset11 { + margin-left: 900px; +} + +.offset10 { + margin-left: 820px; +} + +.offset9 { + margin-left: 740px; +} + +.offset8 { + margin-left: 660px; +} + +.offset7 { + margin-left: 580px; +} + +.offset6 { + margin-left: 500px; +} + +.offset5 { + margin-left: 420px; +} + +.offset4 { + margin-left: 340px; +} + +.offset3 { + margin-left: 260px; +} + +.offset2 { + margin-left: 180px; +} + +.offset1 { + margin-left: 100px; +} + +.row-fluid { + width: 100%; + *zoom: 1; +} + +.row-fluid:before, +.row-fluid:after { + display: table; + line-height: 0; + content: ""; +} + +.row-fluid:after { + clear: both; +} + +.row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.127659574468085%; + *margin-left: 2.074468085106383%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.row-fluid [class*="span"]:first-child { + margin-left: 0; +} + +.row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.127659574468085%; +} + +.row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; +} + +.row-fluid .span11 { + width: 91.48936170212765%; + *width: 91.43617021276594%; +} + +.row-fluid .span10 { + width: 82.97872340425532%; + *width: 82.92553191489361%; +} + +.row-fluid .span9 { + width: 74.46808510638297%; + *width: 74.41489361702126%; +} + +.row-fluid .span8 { + width: 65.95744680851064%; + *width: 65.90425531914893%; +} + +.row-fluid .span7 { + width: 57.44680851063829%; + *width: 57.39361702127659%; +} + +.row-fluid .span6 { + width: 48.93617021276595%; + *width: 48.88297872340425%; +} + +.row-fluid .span5 { + width: 40.42553191489362%; + *width: 40.37234042553192%; +} + +.row-fluid .span4 { + width: 31.914893617021278%; + *width: 31.861702127659576%; +} + +.row-fluid .span3 { + width: 23.404255319148934%; + *width: 23.351063829787233%; +} + +.row-fluid .span2 { + width: 14.893617021276595%; + *width: 14.840425531914894%; +} + +.row-fluid .span1 { + width: 6.382978723404255%; + *width: 6.329787234042553%; +} + +.row-fluid .offset12 { + margin-left: 104.25531914893617%; + *margin-left: 104.14893617021275%; +} + +.row-fluid .offset12:first-child { + margin-left: 102.12765957446808%; + *margin-left: 102.02127659574467%; +} + +.row-fluid .offset11 { + margin-left: 95.74468085106382%; + *margin-left: 95.6382978723404%; +} + +.row-fluid .offset11:first-child { + margin-left: 93.61702127659574%; + *margin-left: 93.51063829787232%; +} + +.row-fluid .offset10 { + margin-left: 87.23404255319149%; + *margin-left: 87.12765957446807%; +} + +.row-fluid .offset10:first-child { + margin-left: 85.1063829787234%; + *margin-left: 84.99999999999999%; +} + +.row-fluid .offset9 { + margin-left: 78.72340425531914%; + *margin-left: 78.61702127659572%; +} + +.row-fluid .offset9:first-child { + margin-left: 76.59574468085106%; + *margin-left: 76.48936170212764%; +} + +.row-fluid .offset8 { + margin-left: 70.2127659574468%; + *margin-left: 70.10638297872339%; +} + +.row-fluid .offset8:first-child { + margin-left: 68.08510638297872%; + *margin-left: 67.9787234042553%; +} + +.row-fluid .offset7 { + margin-left: 61.70212765957446%; + *margin-left: 61.59574468085106%; +} + +.row-fluid .offset7:first-child { + margin-left: 59.574468085106375%; + *margin-left: 59.46808510638297%; +} + +.row-fluid .offset6 { + margin-left: 53.191489361702125%; + *margin-left: 53.085106382978715%; +} + +.row-fluid .offset6:first-child { + margin-left: 51.063829787234035%; + *margin-left: 50.95744680851063%; +} + +.row-fluid .offset5 { + margin-left: 44.68085106382979%; + *margin-left: 44.57446808510638%; +} + +.row-fluid .offset5:first-child { + margin-left: 42.5531914893617%; + *margin-left: 42.4468085106383%; +} + +.row-fluid .offset4 { + margin-left: 36.170212765957444%; + *margin-left: 36.06382978723405%; +} + +.row-fluid .offset4:first-child { + margin-left: 34.04255319148936%; + *margin-left: 33.93617021276596%; +} + +.row-fluid .offset3 { + margin-left: 27.659574468085104%; + *margin-left: 27.5531914893617%; +} + +.row-fluid .offset3:first-child { + margin-left: 25.53191489361702%; + *margin-left: 25.425531914893618%; +} + +.row-fluid .offset2 { + margin-left: 19.148936170212764%; + *margin-left: 19.04255319148936%; +} + +.row-fluid .offset2:first-child { + margin-left: 17.02127659574468%; + *margin-left: 16.914893617021278%; +} + +.row-fluid .offset1 { + margin-left: 10.638297872340425%; + *margin-left: 10.53191489361702%; +} + +.row-fluid .offset1:first-child { + margin-left: 8.51063829787234%; + *margin-left: 8.404255319148938%; +} + +[class*="span"].hide, +.row-fluid [class*="span"].hide { + display: none; +} + +[class*="span"].pull-right, +.row-fluid [class*="span"].pull-right { + float: right; +} + +.container { + margin-right: auto; + margin-left: auto; + *zoom: 1; +} + +.container:before, +.container:after { + display: table; + line-height: 0; + content: ""; +} + +.container:after { + clear: both; +} + +.container-fluid { + padding-right: 20px; + padding-left: 20px; + *zoom: 1; +} + +.container-fluid:before, +.container-fluid:after { + display: table; + line-height: 0; + content: ""; +} + +.container-fluid:after { + clear: both; +} + +p { + margin: 0 0 10px; +} + +.lead { + margin-bottom: 20px; + font-size: 21px; + font-weight: 200; + line-height: 30px; +} + +small { + font-size: 85%; +} + +strong { + font-weight: bold; +} + +em { + font-style: italic; +} + +cite { + font-style: normal; +} + +.muted { + color: #999999; +} + +a.muted:hover, +a.muted:focus { + color: #808080; +} + +.text-warning { + color: #dd5600; +} + +a.text-warning:hover, +a.text-warning:focus { + color: #aa4200; +} + +.text-error { + color: #bd4247; +} + +a.text-error:hover, +a.text-error:focus { + color: #983538; +} + +.text-info { + color: #178acc; +} + +a.text-info:hover, +a.text-info:focus { + color: #126b9e; +} + +.text-success { + color: #669533; +} + +a.text-success:hover, +a.text-success:focus { + color: #4c6f26; +} + +.text-left { + text-align: left; +} + +.text-right { + text-align: right; +} + +.text-center { + text-align: center; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 10px 0; + font-family: 'ExoRegular'; + font-weight: bold; + line-height: 20px; + color: #317eac; + text-rendering: optimizelegibility; +} + +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small { + font-weight: normal; + line-height: 1; + color: #999999; +} + +h1, +h2, +h3 { + line-height: 40px; +} + +h1 { + font-size: 38.5px; +} + +h2 { + font-size: 31.5px; +} + +h3 { + font-size: 24.5px; +} + +h4 { + font-size: 17.5px; +} + +h5 { + font-size: 14px; +} + +h6 { + font-size: 11.9px; +} + +h1 small { + font-size: 24.5px; +} + +h2 small { + font-size: 17.5px; +} + +h3 small { + font-size: 14px; +} + +h4 small { + font-size: 14px; +} + +.page-header { + padding-bottom: 9px; + margin: 20px 0 30px; + border-bottom: 1px solid #f5f5f5; +} + +ul, +ol { + padding: 0; + margin: 0 0 10px 25px; +} + +ul ul, +ul ol, +ol ol, +ol ul { + margin-bottom: 0; +} + +li { + line-height: 20px; +} + +ul.unstyled, +ol.unstyled { + margin-left: 0; + list-style: none; +} + +ul.inline, +ol.inline { + margin-left: 0; + list-style: none; +} + +ul.inline > li, +ol.inline > li { + display: inline-block; + *display: inline; + padding-right: 5px; + padding-left: 5px; + *zoom: 1; +} + +dl { + margin-bottom: 20px; +} + +dt, +dd { + line-height: 20px; +} + +dt { + font-weight: bold; +} + +dd { + margin-left: 10px; +} + +.dl-horizontal { + *zoom: 1; +} + +.dl-horizontal:before, +.dl-horizontal:after { + display: table; + line-height: 0; + content: ""; +} + +.dl-horizontal:after { + clear: both; +} + +.dl-horizontal dt { + float: left; + width: 160px; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; +} + +.dl-horizontal dd { + margin-left: 180px; +} + +hr { + margin: 20px 0; + border: 0; + border-top: 1px solid #f5f5f5; + border-bottom: 1px solid #ffffff; +} + +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #999999; +} + +abbr.initialism { + font-size: 90%; + text-transform: uppercase; +} + +blockquote { + padding: 0 0 0 15px; + margin: 0 0 20px; + border-left: 5px solid #f5f5f5; +} + +blockquote p { + margin-bottom: 0; + font-size: 17.5px; + font-weight: 300; + line-height: 1.25; +} + +blockquote small { + display: block; + line-height: 20px; + color: #999999; +} + +blockquote small:before { + content: '\2014 \00A0'; +} + +blockquote.pull-right { + float: right; + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #f5f5f5; + border-left: 0; +} + +blockquote.pull-right p, +blockquote.pull-right small { + text-align: right; +} + +blockquote.pull-right small:before { + content: ''; +} + +blockquote.pull-right small:after { + content: '\00A0 \2014'; +} + +q:before, +q:after, +blockquote:before, +blockquote:after { + content: ""; +} + +address { + display: block; + margin-bottom: 20px; + font-style: normal; + line-height: 20px; +} + +code, +pre { + padding: 0 3px 2px; + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + font-size: 12px; + color: #333333; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +code { + padding: 2px 4px; + color: #d14; + white-space: nowrap; + background-color: #f7f7f9; + border: 1px solid #e1e1e8; +} + +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 20px; + word-break: break-all; + word-wrap: break-word; + white-space: pre; + white-space: pre-wrap; + background-color: #f5f5f5; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.15); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +pre.prettyprint { + margin-bottom: 20px; +} + +pre code { + padding: 0; + color: inherit; + white-space: pre; + white-space: pre-wrap; + background-color: transparent; + border: 0; +} + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} + +form { + margin: 0 0 20px; +} + +fieldset { + padding: 0; + margin: 0; + border: 0; +} + +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: 40px; + color: #333333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} + +legend small { + font-size: 15px; + color: #999999; +} + +label, +input, +button, +select, +textarea { + font-size: 14px; + font-weight: normal; + line-height: 20px; +} + +input, +button, +select, +textarea { + font-family: "ExoRegular", "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +label { + display: block; + margin-bottom: 5px; +} + +select, +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + display: inline-block; + height: 20px; + padding: 4px 6px; + margin-bottom: 10px; + font-size: 14px; + line-height: 20px; + color: #555555; + vertical-align: middle; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +input, +textarea, +.uneditable-input { + width: 206px; +} + +textarea { + height: auto; +} + +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + background-color: #ffffff; + border: 1px solid #cccccc; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; + -moz-transition: border linear 0.2s, box-shadow linear 0.2s; + -o-transition: border linear 0.2s, box-shadow linear 0.2s; + transition: border linear 0.2s, box-shadow linear 0.2s; +} + +textarea:focus, +input[type="text"]:focus, +input[type="password"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="date"]:focus, +input[type="month"]:focus, +input[type="time"]:focus, +input[type="week"]:focus, +input[type="number"]:focus, +input[type="email"]:focus, +input[type="url"]:focus, +input[type="search"]:focus, +input[type="tel"]:focus, +input[type="color"]:focus, +.uneditable-input:focus { + border-color: rgba(82, 168, 236, 0.8); + outline: 0; + outline: thin dotted \9; + /* IE6-9 */ + + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); +} + +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + *margin-top: 0; + line-height: normal; +} + +input[type="file"], +input[type="image"], +input[type="submit"], +input[type="reset"], +input[type="button"], +input[type="radio"], +input[type="checkbox"] { + width: auto; +} + +select, +input[type="file"] { + height: 30px; + /* In IE7, the height of the select element cannot be changed by height, only font-size */ + + *margin-top: 4px; + /* For IE7, add top margin to align select with labels */ + + line-height: 30px; +} + +select { + width: 220px; + background-color: #ffffff; + border: 1px solid #cccccc; +} + +select[multiple], +select[size] { + height: auto; +} + +select:focus, +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +.uneditable-input, +.uneditable-textarea { + color: #999999; + cursor: not-allowed; + background-color: #fcfcfc; + border-color: #cccccc; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); +} + +.uneditable-input { + overflow: hidden; + white-space: nowrap; +} + +.uneditable-textarea { + width: auto; + height: auto; +} + +input:-moz-placeholder, +textarea:-moz-placeholder { + color: #999999; +} + +input:-ms-input-placeholder, +textarea:-ms-input-placeholder { + color: #999999; +} + +input::-webkit-input-placeholder, +textarea::-webkit-input-placeholder { + color: #999999; +} + +.radio, +.checkbox { + min-height: 20px; + padding-left: 20px; +} + +.radio input[type="radio"], +.checkbox input[type="checkbox"] { + float: left; + margin-left: -20px; +} + +.controls > .radio:first-child, +.controls > .checkbox:first-child { + padding-top: 5px; +} + +.radio.inline, +.checkbox.inline { + display: inline-block; + padding-top: 5px; + margin-bottom: 0; + vertical-align: middle; +} + +.radio.inline + .radio.inline, +.checkbox.inline + .checkbox.inline { + margin-left: 10px; +} + +.input-mini { + width: 60px; +} + +.input-small { + width: 90px; +} + +.input-medium { + width: 150px; +} + +.input-large { + width: 210px; +} + +.input-xlarge { + width: 270px; +} + +.input-xxlarge { + width: 530px; +} + +input[class*="span"], +select[class*="span"], +textarea[class*="span"], +.uneditable-input[class*="span"], +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"] { + float: none; + margin-left: 0; +} + +.input-append input[class*="span"], +.input-append .uneditable-input[class*="span"], +.input-prepend input[class*="span"], +.input-prepend .uneditable-input[class*="span"], +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"], +.row-fluid .input-prepend [class*="span"], +.row-fluid .input-append [class*="span"] { + display: inline-block; +} + +input, +textarea, +.uneditable-input { + margin-left: 0; +} + +.controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; +} + +input.span12, +textarea.span12, +.uneditable-input.span12 { + width: 926px; +} + +input.span11, +textarea.span11, +.uneditable-input.span11 { + width: 846px; +} + +input.span10, +textarea.span10, +.uneditable-input.span10 { + width: 766px; +} + +input.span9, +textarea.span9, +.uneditable-input.span9 { + width: 686px; +} + +input.span8, +textarea.span8, +.uneditable-input.span8 { + width: 606px; +} + +input.span7, +textarea.span7, +.uneditable-input.span7 { + width: 526px; +} + +input.span6, +textarea.span6, +.uneditable-input.span6 { + width: 446px; +} + +input.span5, +textarea.span5, +.uneditable-input.span5 { + width: 366px; +} + +input.span4, +textarea.span4, +.uneditable-input.span4 { + width: 286px; +} + +input.span3, +textarea.span3, +.uneditable-input.span3 { + width: 206px; +} + +input.span2, +textarea.span2, +.uneditable-input.span2 { + width: 126px; +} + +input.span1, +textarea.span1, +.uneditable-input.span1 { + width: 46px; +} + +.controls-row { + *zoom: 1; +} + +.controls-row:before, +.controls-row:after { + display: table; + line-height: 0; + content: ""; +} + +.controls-row:after { + clear: both; +} + +.controls-row [class*="span"], +.row-fluid .controls-row [class*="span"] { + float: left; +} + +.controls-row .checkbox[class*="span"], +.controls-row .radio[class*="span"] { + padding-top: 5px; +} + +input[disabled], +select[disabled], +textarea[disabled], +input[readonly], +select[readonly], +textarea[readonly] { + cursor: not-allowed; + background-color: #f5f5f5; +} + +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"][readonly], +input[type="checkbox"][readonly] { + background-color: transparent; +} + +.control-group.warning .control-label, +.control-group.warning .help-block, +.control-group.warning .help-inline { + color: #dd5600; +} + +.control-group.warning .checkbox, +.control-group.warning .radio, +.control-group.warning input, +.control-group.warning select, +.control-group.warning textarea { + color: #dd5600; +} + +.control-group.warning input, +.control-group.warning select, +.control-group.warning textarea { + border-color: #dd5600; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.warning input:focus, +.control-group.warning select:focus, +.control-group.warning textarea:focus { + border-color: #aa4200; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ff8d44; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ff8d44; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ff8d44; +} + +.control-group.warning .input-prepend .add-on, +.control-group.warning .input-append .add-on { + color: #dd5600; + background-color: #f1ceab; + border-color: #dd5600; +} + +.control-group.error .control-label, +.control-group.error .help-block, +.control-group.error .help-inline { + color: #bd4247; +} + +.control-group.error .checkbox, +.control-group.error .radio, +.control-group.error input, +.control-group.error select, +.control-group.error textarea { + color: #bd4247; +} + +.control-group.error input, +.control-group.error select, +.control-group.error textarea { + border-color: #bd4247; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.error input:focus, +.control-group.error select:focus, +.control-group.error textarea:focus { + border-color: #983538; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d88e90; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d88e90; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d88e90; +} + +.control-group.error .input-prepend .add-on, +.control-group.error .input-append .add-on { + color: #bd4247; + background-color: #f2bdb1; + border-color: #bd4247; +} + +.control-group.success .control-label, +.control-group.success .help-block, +.control-group.success .help-inline { + color: #669533; +} + +.control-group.success .checkbox, +.control-group.success .radio, +.control-group.success input, +.control-group.success select, +.control-group.success textarea { + color: #669533; +} + +.control-group.success input, +.control-group.success select, +.control-group.success textarea { + border-color: #669533; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.success input:focus, +.control-group.success select:focus, +.control-group.success textarea:focus { + border-color: #4c6f26; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #99ca63; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #99ca63; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #99ca63; +} + +.control-group.success .input-prepend .add-on, +.control-group.success .input-append .add-on { + color: #669533; + background-color: #d5ecbf; + border-color: #669533; +} + +.control-group.info .control-label, +.control-group.info .help-block, +.control-group.info .help-inline { + color: #178acc; +} + +.control-group.info .checkbox, +.control-group.info .radio, +.control-group.info input, +.control-group.info select, +.control-group.info textarea { + color: #178acc; +} + +.control-group.info input, +.control-group.info select, +.control-group.info textarea { + border-color: #178acc; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.info input:focus, +.control-group.info select:focus, +.control-group.info textarea:focus { + border-color: #126b9e; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #5db8ec; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #5db8ec; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #5db8ec; +} + +.control-group.info .input-prepend .add-on, +.control-group.info .input-append .add-on { + color: #178acc; + background-color: #a7dff1; + border-color: #178acc; +} + +input:focus:invalid, +textarea:focus:invalid, +select:focus:invalid { + color: #b94a48; + border-color: #ee5f5b; +} + +input:focus:invalid:focus, +textarea:focus:invalid:focus, +select:focus:invalid:focus { + border-color: #e9322d; + -webkit-box-shadow: 0 0 6px #f8b9b7; + -moz-box-shadow: 0 0 6px #f8b9b7; + box-shadow: 0 0 6px #f8b9b7; +} + +.form-actions { + padding: 19px 20px 20px; + margin-top: 20px; + margin-bottom: 20px; + background-color: #f5f5f5; + border-top: 1px solid #e5e5e5; + *zoom: 1; +} + +.form-actions:before, +.form-actions:after { + display: table; + line-height: 0; + content: ""; +} + +.form-actions:after { + clear: both; +} + +.help-block, +.help-inline { + color: #7b7b7b; +} + +.help-block { + display: block; + margin-bottom: 10px; +} + +.help-inline { + display: inline-block; + *display: inline; + padding-left: 5px; + vertical-align: middle; + *zoom: 1; +} + +.input-append, +.input-prepend { + display: inline-block; + margin-bottom: 10px; + font-size: 0; + white-space: nowrap; + vertical-align: middle; +} + +.input-append input, +.input-prepend input, +.input-append select, +.input-prepend select, +.input-append .uneditable-input, +.input-prepend .uneditable-input, +.input-append .dropdown-menu, +.input-prepend .dropdown-menu, +.input-append .popover, +.input-prepend .popover { + font-size: 14px; +} + +.input-append input, +.input-prepend input, +.input-append select, +.input-prepend select, +.input-append .uneditable-input, +.input-prepend .uneditable-input { + position: relative; + margin-bottom: 0; + *margin-left: 0; + vertical-align: top; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-append input:focus, +.input-prepend input:focus, +.input-append select:focus, +.input-prepend select:focus, +.input-append .uneditable-input:focus, +.input-prepend .uneditable-input:focus { + z-index: 2; +} + +.input-append .add-on, +.input-prepend .add-on { + display: inline-block; + width: auto; + height: 20px; + min-width: 16px; + padding: 4px 5px; + font-size: 14px; + font-weight: normal; + line-height: 20px; + text-align: center; + text-shadow: 0 1px 0 #ffffff; + background-color: #f5f5f5; + border: 1px solid #ccc; +} + +.input-append .add-on, +.input-prepend .add-on, +.input-append .btn, +.input-prepend .btn, +.input-append .btn-group > .dropdown-toggle, +.input-prepend .btn-group > .dropdown-toggle { + vertical-align: top; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.input-append .active, +.input-prepend .active { + background-color: #bede9c; + border-color: #73a839; +} + +.input-prepend .add-on, +.input-prepend .btn { + margin-right: -1px; +} + +.input-prepend .add-on:first-child, +.input-prepend .btn:first-child { + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.input-append input, +.input-append select, +.input-append .uneditable-input { + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.input-append input + .btn-group .btn:last-child, +.input-append select + .btn-group .btn:last-child, +.input-append .uneditable-input + .btn-group .btn:last-child { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-append .add-on, +.input-append .btn, +.input-append .btn-group { + margin-left: -1px; +} + +.input-append .add-on:last-child, +.input-append .btn:last-child, +.input-append .btn-group:last-child > .dropdown-toggle { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-prepend.input-append input, +.input-prepend.input-append select, +.input-prepend.input-append .uneditable-input { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.input-prepend.input-append input + .btn-group .btn, +.input-prepend.input-append select + .btn-group .btn, +.input-prepend.input-append .uneditable-input + .btn-group .btn { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-prepend.input-append .add-on:first-child, +.input-prepend.input-append .btn:first-child { + margin-right: -1px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.input-prepend.input-append .add-on:last-child, +.input-prepend.input-append .btn:last-child { + margin-left: -1px; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-prepend.input-append .btn-group:first-child { + margin-left: 0; +} + +input.search-query { + padding-right: 14px; + padding-right: 4px \9; + padding-left: 14px; + padding-left: 4px \9; + /* IE7-8 doesn't have border-radius, so don't indent the padding */ + + margin-bottom: 0; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +/* Allow for input prepend/append in search forms */ + +.form-search .input-append .search-query, +.form-search .input-prepend .search-query { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.form-search .input-append .search-query { + -webkit-border-radius: 14px 0 0 14px; + -moz-border-radius: 14px 0 0 14px; + border-radius: 14px 0 0 14px; +} + +.form-search .input-append .btn { + -webkit-border-radius: 0 14px 14px 0; + -moz-border-radius: 0 14px 14px 0; + border-radius: 0 14px 14px 0; +} + +.form-search .input-prepend .search-query { + -webkit-border-radius: 0 14px 14px 0; + -moz-border-radius: 0 14px 14px 0; + border-radius: 0 14px 14px 0; +} + +.form-search .input-prepend .btn { + -webkit-border-radius: 14px 0 0 14px; + -moz-border-radius: 14px 0 0 14px; + border-radius: 14px 0 0 14px; +} + +.form-search input, +.form-inline input, +.form-horizontal input, +.form-search textarea, +.form-inline textarea, +.form-horizontal textarea, +.form-search select, +.form-inline select, +.form-horizontal select, +.form-search .help-inline, +.form-inline .help-inline, +.form-horizontal .help-inline, +.form-search .uneditable-input, +.form-inline .uneditable-input, +.form-horizontal .uneditable-input, +.form-search .input-prepend, +.form-inline .input-prepend, +.form-horizontal .input-prepend, +.form-search .input-append, +.form-inline .input-append, +.form-horizontal .input-append { + display: inline-block; + *display: inline; + margin-bottom: 0; + vertical-align: middle; + *zoom: 1; +} + +.form-search .hide, +.form-inline .hide, +.form-horizontal .hide { + display: none; +} + +.form-search label, +.form-inline label, +.form-search .btn-group, +.form-inline .btn-group { + display: inline-block; +} + +.form-search .input-append, +.form-inline .input-append, +.form-search .input-prepend, +.form-inline .input-prepend { + margin-bottom: 0; +} + +.form-search .radio, +.form-search .checkbox, +.form-inline .radio, +.form-inline .checkbox { + padding-left: 0; + margin-bottom: 0; + vertical-align: middle; +} + +.form-search .radio input[type="radio"], +.form-search .checkbox input[type="checkbox"], +.form-inline .radio input[type="radio"], +.form-inline .checkbox input[type="checkbox"] { + float: left; + margin-right: 3px; + margin-left: 0; +} + +.control-group { + margin-bottom: 10px; +} + +legend + .control-group { + margin-top: 20px; + -webkit-margin-top-collapse: separate; +} + +.form-horizontal .control-group { + margin-bottom: 20px; + *zoom: 1; +} + +.form-horizontal .control-group:before, +.form-horizontal .control-group:after { + display: table; + line-height: 0; + content: ""; +} + +.form-horizontal .control-group:after { + clear: both; +} + +.form-horizontal .control-label { + float: left; + width: 160px; + padding-top: 5px; + text-align: right; +} + +.form-horizontal .controls { + *display: inline-block; + *padding-left: 20px; + margin-left: 180px; + *margin-left: 0; +} + +.form-horizontal .controls:first-child { + *padding-left: 180px; +} + +.form-horizontal .help-block { + margin-bottom: 0; +} + +.form-horizontal input + .help-block, +.form-horizontal select + .help-block, +.form-horizontal textarea + .help-block, +.form-horizontal .uneditable-input + .help-block, +.form-horizontal .input-prepend + .help-block, +.form-horizontal .input-append + .help-block { + margin-top: 10px; +} + +.form-horizontal .form-actions { + padding-left: 180px; +} + +table { + max-width: 100%; + background-color: transparent; + border-collapse: collapse; + border-spacing: 0; +} + +.table { + width: 100%; + margin-bottom: 20px; +} + +.table th, +.table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #dddddd; +} + +.table th { + font-weight: bold; +} + +.table thead th { + vertical-align: bottom; +} + +.table caption + thead tr:first-child th, +.table caption + thead tr:first-child td, +.table colgroup + thead tr:first-child th, +.table colgroup + thead tr:first-child td, +.table thead:first-child tr:first-child th, +.table thead:first-child tr:first-child td { + border-top: 0; +} + +.table tbody + tbody { + border-top: 2px solid #dddddd; +} + +.table .table { + background-color: #ffffff; +} + +.table-condensed th, +.table-condensed td { + padding: 4px 5px; +} + +.table-bordered { + border: 1px solid #dddddd; + border-collapse: separate; + *border-collapse: collapse; + border-left: 0; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.table-bordered th, +.table-bordered td { + border-left: 1px solid #dddddd; +} + +.table-bordered caption + thead tr:first-child th, +.table-bordered caption + tbody tr:first-child th, +.table-bordered caption + tbody tr:first-child td, +.table-bordered colgroup + thead tr:first-child th, +.table-bordered colgroup + tbody tr:first-child th, +.table-bordered colgroup + tbody tr:first-child td, +.table-bordered thead:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child td { + border-top: 0; +} + +.table-bordered thead:first-child tr:first-child > th:first-child, +.table-bordered tbody:first-child tr:first-child > td:first-child, +.table-bordered tbody:first-child tr:first-child > th:first-child { + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; +} + +.table-bordered thead:first-child tr:first-child > th:last-child, +.table-bordered tbody:first-child tr:first-child > td:last-child, +.table-bordered tbody:first-child tr:first-child > th:last-child { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; +} + +.table-bordered thead:last-child tr:last-child > th:first-child, +.table-bordered tbody:last-child tr:last-child > td:first-child, +.table-bordered tbody:last-child tr:last-child > th:first-child, +.table-bordered tfoot:last-child tr:last-child > td:first-child, +.table-bordered tfoot:last-child tr:last-child > th:first-child { + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; +} + +.table-bordered thead:last-child tr:last-child > th:last-child, +.table-bordered tbody:last-child tr:last-child > td:last-child, +.table-bordered tbody:last-child tr:last-child > th:last-child, +.table-bordered tfoot:last-child tr:last-child > td:last-child, +.table-bordered tfoot:last-child tr:last-child > th:last-child { + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-bottomright: 4px; +} + +.table-bordered tfoot + tbody:last-child tr:last-child td:first-child { + -webkit-border-bottom-left-radius: 0; + border-bottom-left-radius: 0; + -moz-border-radius-bottomleft: 0; +} + +.table-bordered tfoot + tbody:last-child tr:last-child td:last-child { + -webkit-border-bottom-right-radius: 0; + border-bottom-right-radius: 0; + -moz-border-radius-bottomright: 0; +} + +.table-bordered caption + thead tr:first-child th:first-child, +.table-bordered caption + tbody tr:first-child td:first-child, +.table-bordered colgroup + thead tr:first-child th:first-child, +.table-bordered colgroup + tbody tr:first-child td:first-child { + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; +} + +.table-bordered caption + thead tr:first-child th:last-child, +.table-bordered caption + tbody tr:first-child td:last-child, +.table-bordered colgroup + thead tr:first-child th:last-child, +.table-bordered colgroup + tbody tr:first-child td:last-child { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; +} + +.table-striped tbody > tr:nth-child(odd) > td, +.table-striped tbody > tr:nth-child(odd) > th { + background-color: #f9f9f9; +} + +.table-hover tbody tr:hover > td, +.table-hover tbody tr:hover > th { + background-color: #f5f5f5; +} + +table td[class*="span"], +table th[class*="span"], +.row-fluid table td[class*="span"], +.row-fluid table th[class*="span"] { + display: table-cell; + float: none; + margin-left: 0; +} + +.table td.span1, +.table th.span1 { + float: none; + width: 44px; + margin-left: 0; +} + +.table td.span2, +.table th.span2 { + float: none; + width: 124px; + margin-left: 0; +} + +.table td.span3, +.table th.span3 { + float: none; + width: 204px; + margin-left: 0; +} + +.table td.span4, +.table th.span4 { + float: none; + width: 284px; + margin-left: 0; +} + +.table td.span5, +.table th.span5 { + float: none; + width: 364px; + margin-left: 0; +} + +.table td.span6, +.table th.span6 { + float: none; + width: 444px; + margin-left: 0; +} + +.table td.span7, +.table th.span7 { + float: none; + width: 524px; + margin-left: 0; +} + +.table td.span8, +.table th.span8 { + float: none; + width: 604px; + margin-left: 0; +} + +.table td.span9, +.table th.span9 { + float: none; + width: 684px; + margin-left: 0; +} + +.table td.span10, +.table th.span10 { + float: none; + width: 764px; + margin-left: 0; +} + +.table td.span11, +.table th.span11 { + float: none; + width: 844px; + margin-left: 0; +} + +.table td.span12, +.table th.span12 { + float: none; + width: 924px; + margin-left: 0; +} + +.table tbody tr.success > td { + background-color: #d5ecbf; +} + +.table tbody tr.error > td { + background-color: #f2bdb1; +} + +.table tbody tr.warning > td { + background-color: #f1ceab; +} + +.table tbody tr.info > td { + background-color: #a7dff1; +} + +.table-hover tbody tr.success:hover > td { + background-color: #c8e6ab; +} + +.table-hover tbody tr.error:hover > td { + background-color: #eeab9b; +} + +.table-hover tbody tr.warning:hover > td { + background-color: #edc195; +} + +.table-hover tbody tr.info:hover > td { + background-color: #91d7ee; +} + +[class^="icon-"], +[class*=" icon-"] { + display: inline-block; + width: 14px; + height: 14px; + margin-top: 1px; + *margin-right: .3em; + line-height: 14px; + vertical-align: text-top; + background-image: url("../img/glyphicons-halflings.png"); + background-position: 14px 14px; + background-repeat: no-repeat; +} + +/* White icons with optional class, or on hover/focus/active states of certain elements */ + +.icon-white, +.nav-pills > .active > a > [class^="icon-"], +.nav-pills > .active > a > [class*=" icon-"], +.nav-list > .active > a > [class^="icon-"], +.nav-list > .active > a > [class*=" icon-"], +.navbar-inverse .nav > .active > a > [class^="icon-"], +.navbar-inverse .nav > .active > a > [class*=" icon-"], +.dropdown-menu > li > a:hover > [class^="icon-"], +.dropdown-menu > li > a:focus > [class^="icon-"], +.dropdown-menu > li > a:hover > [class*=" icon-"], +.dropdown-menu > li > a:focus > [class*=" icon-"], +.dropdown-menu > .active > a > [class^="icon-"], +.dropdown-menu > .active > a > [class*=" icon-"], +.dropdown-submenu:hover > a > [class^="icon-"], +.dropdown-submenu:focus > a > [class^="icon-"], +.dropdown-submenu:hover > a > [class*=" icon-"], +.dropdown-submenu:focus > a > [class*=" icon-"] { + background-image: url("../img/glyphicons-halflings-white.png"); +} + +.icon-glass { + background-position: 0 0; +} + +.icon-music { + background-position: -24px 0; +} + +.icon-search { + background-position: -48px 0; +} + +.icon-envelope { + background-position: -72px 0; +} + +.icon-heart { + background-position: -96px 0; +} + +.icon-star { + background-position: -120px 0; +} + +.icon-star-empty { + background-position: -144px 0; +} + +.icon-user { + background-position: -168px 0; +} + +.icon-film { + background-position: -192px 0; +} + +.icon-th-large { + background-position: -216px 0; +} + +.icon-th { + background-position: -240px 0; +} + +.icon-th-list { + background-position: -264px 0; +} + +.icon-ok { + background-position: -288px 0; +} + +.icon-remove { + background-position: -312px 0; +} + +.icon-zoom-in { + background-position: -336px 0; +} + +.icon-zoom-out { + background-position: -360px 0; +} + +.icon-off { + background-position: -384px 0; +} + +.icon-signal { + background-position: -408px 0; +} + +.icon-cog { + background-position: -432px 0; +} + +.icon-trash { + background-position: -456px 0; +} + +.icon-home { + background-position: 0 -24px; +} + +.icon-file { + background-position: -24px -24px; +} + +.icon-time { + background-position: -48px -24px; +} + +.icon-road { + background-position: -72px -24px; +} + +.icon-download-alt { + background-position: -96px -24px; +} + +.icon-download { + background-position: -120px -24px; +} + +.icon-upload { + background-position: -144px -24px; +} + +.icon-inbox { + background-position: -168px -24px; +} + +.icon-play-circle { + background-position: -192px -24px; +} + +.icon-repeat { + background-position: -216px -24px; +} + +.icon-refresh { + background-position: -240px -24px; +} + +.icon-list-alt { + background-position: -264px -24px; +} + +.icon-lock { + background-position: -287px -24px; +} + +.icon-flag { + background-position: -312px -24px; +} + +.icon-headphones { + background-position: -336px -24px; +} + +.icon-volume-off { + background-position: -360px -24px; +} + +.icon-volume-down { + background-position: -384px -24px; +} + +.icon-volume-up { + background-position: -408px -24px; +} + +.icon-qrcode { + background-position: -432px -24px; +} + +.icon-barcode { + background-position: -456px -24px; +} + +.icon-tag { + background-position: 0 -48px; +} + +.icon-tags { + background-position: -25px -48px; +} + +.icon-book { + background-position: -48px -48px; +} + +.icon-bookmark { + background-position: -72px -48px; +} + +.icon-print { + background-position: -96px -48px; +} + +.icon-camera { + background-position: -120px -48px; +} + +.icon-font { + background-position: -144px -48px; +} + +.icon-bold { + background-position: -167px -48px; +} + +.icon-italic { + background-position: -192px -48px; +} + +.icon-text-height { + background-position: -216px -48px; +} + +.icon-text-width { + background-position: -240px -48px; +} + +.icon-align-left { + background-position: -264px -48px; +} + +.icon-align-center { + background-position: -288px -48px; +} + +.icon-align-right { + background-position: -312px -48px; +} + +.icon-align-justify { + background-position: -336px -48px; +} + +.icon-list { + background-position: -360px -48px; +} + +.icon-indent-left { + background-position: -384px -48px; +} + +.icon-indent-right { + background-position: -408px -48px; +} + +.icon-facetime-video { + background-position: -432px -48px; +} + +.icon-picture { + background-position: -456px -48px; +} + +.icon-pencil { + background-position: 0 -72px; +} + +.icon-map-marker { + background-position: -24px -72px; +} + +.icon-adjust { + background-position: -48px -72px; +} + +.icon-tint { + background-position: -72px -72px; +} + +.icon-edit { + background-position: -96px -72px; +} + +.icon-share { + background-position: -120px -72px; +} + +.icon-check { + background-position: -144px -72px; +} + +.icon-move { + background-position: -168px -72px; +} + +.icon-step-backward { + background-position: -192px -72px; +} + +.icon-fast-backward { + background-position: -216px -72px; +} + +.icon-backward { + background-position: -240px -72px; +} + +.icon-play { + background-position: -264px -72px; +} + +.icon-pause { + background-position: -288px -72px; +} + +.icon-stop { + background-position: -312px -72px; +} + +.icon-forward { + background-position: -336px -72px; +} + +.icon-fast-forward { + background-position: -360px -72px; +} + +.icon-step-forward { + background-position: -384px -72px; +} + +.icon-eject { + background-position: -408px -72px; +} + +.icon-chevron-left { + background-position: -432px -72px; +} + +.icon-chevron-right { + background-position: -456px -72px; +} + +.icon-plus-sign { + background-position: 0 -96px; +} + +.icon-minus-sign { + background-position: -24px -96px; +} + +.icon-remove-sign { + background-position: -48px -96px; +} + +.icon-ok-sign { + background-position: -72px -96px; +} + +.icon-question-sign { + background-position: -96px -96px; +} + +.icon-info-sign { + background-position: -120px -96px; +} + +.icon-screenshot { + background-position: -144px -96px; +} + +.icon-remove-circle { + background-position: -168px -96px; +} + +.icon-ok-circle { + background-position: -192px -96px; +} + +.icon-ban-circle { + background-position: -216px -96px; +} + +.icon-arrow-left { + background-position: -240px -96px; +} + +.icon-arrow-right { + background-position: -264px -96px; +} + +.icon-arrow-up { + background-position: -289px -96px; +} + +.icon-arrow-down { + background-position: -312px -96px; +} + +.icon-share-alt { + background-position: -336px -96px; +} + +.icon-resize-full { + background-position: -360px -96px; +} + +.icon-resize-small { + background-position: -384px -96px; +} + +.icon-plus { + background-position: -408px -96px; +} + +.icon-minus { + background-position: -433px -96px; +} + +.icon-asterisk { + background-position: -456px -96px; +} + +.icon-exclamation-sign { + background-position: 0 -120px; +} + +.icon-gift { + background-position: -24px -120px; +} + +.icon-leaf { + background-position: -48px -120px; +} + +.icon-fire { + background-position: -72px -120px; +} + +.icon-eye-open { + background-position: -96px -120px; +} + +.icon-eye-close { + background-position: -120px -120px; +} + +.icon-warning-sign { + background-position: -144px -120px; +} + +.icon-plane { + background-position: -168px -120px; +} + +.icon-calendar { + background-position: -192px -120px; +} + +.icon-random { + width: 16px; + background-position: -216px -120px; +} + +.icon-comment { + background-position: -240px -120px; +} + +.icon-magnet { + background-position: -264px -120px; +} + +.icon-chevron-up { + background-position: -288px -120px; +} + +.icon-chevron-down { + background-position: -313px -119px; +} + +.icon-retweet { + background-position: -336px -120px; +} + +.icon-shopping-cart { + background-position: -360px -120px; +} + +.icon-folder-close { + width: 16px; + background-position: -384px -120px; +} + +.icon-folder-open { + width: 16px; + background-position: -408px -120px; +} + +.icon-resize-vertical { + background-position: -432px -119px; +} + +.icon-resize-horizontal { + background-position: -456px -118px; +} + +.icon-hdd { + background-position: 0 -144px; +} + +.icon-bullhorn { + background-position: -24px -144px; +} + +.icon-bell { + background-position: -48px -144px; +} + +.icon-certificate { + background-position: -72px -144px; +} + +.icon-thumbs-up { + background-position: -96px -144px; +} + +.icon-thumbs-down { + background-position: -120px -144px; +} + +.icon-hand-right { + background-position: -144px -144px; +} + +.icon-hand-left { + background-position: -168px -144px; +} + +.icon-hand-up { + background-position: -192px -144px; +} + +.icon-hand-down { + background-position: -216px -144px; +} + +.icon-circle-arrow-right { + background-position: -240px -144px; +} + +.icon-circle-arrow-left { + background-position: -264px -144px; +} + +.icon-circle-arrow-up { + background-position: -288px -144px; +} + +.icon-circle-arrow-down { + background-position: -312px -144px; +} + +.icon-globe { + background-position: -336px -144px; +} + +.icon-wrench { + background-position: -360px -144px; +} + +.icon-tasks { + background-position: -384px -144px; +} + +.icon-filter { + background-position: -408px -144px; +} + +.icon-briefcase { + background-position: -432px -144px; +} + +.icon-fullscreen { + background-position: -456px -144px; +} + +.dropup, +.dropdown { + position: relative; +} + +.dropdown-toggle { + *margin-bottom: -3px; +} + +.dropdown-toggle:active, +.open .dropdown-toggle { + outline: 0; +} + +.caret { + display: inline-block; + width: 0; + height: 0; + vertical-align: top; + border-top: 4px solid #000000; + border-right: 4px solid transparent; + border-left: 4px solid transparent; + content: ""; +} + +.dropdown .caret { + margin-top: 8px; + margin-left: 2px; +} + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + list-style: none; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + *border-right-width: 2px; + *border-bottom-width: 2px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; +} + +.dropdown-menu.pull-right { + right: 0; + left: auto; +} + +.dropdown-menu .divider { + *width: 100%; + height: 1px; + margin: 9px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} + +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 20px; + color: #333333; + white-space: nowrap; +} + +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus, +.dropdown-submenu:hover > a, +.dropdown-submenu:focus > a { + color: #ffffff; + text-decoration: none; + background-color: #27a0e5; + background-image: -moz-linear-gradient(top, #2fa4e7, #1a99e2); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#2fa4e7), to(#1a99e2)); + background-image: -webkit-linear-gradient(top, #2fa4e7, #1a99e2); + background-image: -o-linear-gradient(top, #2fa4e7, #1a99e2); + background-image: linear-gradient(to bottom, #2fa4e7, #1a99e2); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2fa4e7', endColorstr='#ff1a99e2', GradientType=0); +} + +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #ffffff; + text-decoration: none; + background-color: #27a0e5; + background-image: -moz-linear-gradient(top, #2fa4e7, #1a99e2); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#2fa4e7), to(#1a99e2)); + background-image: -webkit-linear-gradient(top, #2fa4e7, #1a99e2); + background-image: -o-linear-gradient(top, #2fa4e7, #1a99e2); + background-image: linear-gradient(to bottom, #2fa4e7, #1a99e2); + background-repeat: repeat-x; + outline: 0; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2fa4e7', endColorstr='#ff1a99e2', GradientType=0); +} + +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #999999; +} + +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + cursor: default; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.open { + *z-index: 1000; +} + +.open > .dropdown-menu { + display: block; +} + +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} + +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px solid #000000; + content: ""; +} + +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 1px; +} + +.dropdown-submenu { + position: relative; +} + +.dropdown-submenu > .dropdown-menu { + top: 0; + left: 100%; + margin-top: -6px; + margin-left: -1px; + -webkit-border-radius: 0 6px 6px 6px; + -moz-border-radius: 0 6px 6px 6px; + border-radius: 0 6px 6px 6px; +} + +.dropdown-submenu:hover > .dropdown-menu { + display: block; +} + +.dropup .dropdown-submenu > .dropdown-menu { + top: auto; + bottom: 0; + margin-top: 0; + margin-bottom: -2px; + -webkit-border-radius: 5px 5px 5px 0; + -moz-border-radius: 5px 5px 5px 0; + border-radius: 5px 5px 5px 0; +} + +.dropdown-submenu > a:after { + display: block; + float: right; + width: 0; + height: 0; + margin-top: 5px; + margin-right: -10px; + border-color: transparent; + border-left-color: #cccccc; + border-style: solid; + border-width: 5px 0 5px 5px; + content: " "; +} + +.dropdown-submenu:hover > a:after { + border-left-color: #ffffff; +} + +.dropdown-submenu.pull-left { + float: none; +} + +.dropdown-submenu.pull-left > .dropdown-menu { + left: -100%; + margin-left: 10px; + -webkit-border-radius: 6px 0 6px 6px; + -moz-border-radius: 6px 0 6px 6px; + border-radius: 6px 0 6px 6px; +} + +.dropdown .dropdown-menu .nav-header { + padding-right: 20px; + padding-left: 20px; +} + +.typeahead { + z-index: 1051; + margin-top: 2px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); +} + +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); +} + +.well-large { + padding: 24px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.well-small { + padding: 9px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + -moz-transition: opacity 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} + +.fade.in { + opacity: 1; +} + +.collapse { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition: height 0.35s ease; + -moz-transition: height 0.35s ease; + -o-transition: height 0.35s ease; + transition: height 0.35s ease; +} + +.collapse.in { + height: auto; +} + +.close { + float: right; + font-size: 20px; + font-weight: bold; + line-height: 20px; + color: #000000; + text-shadow: 0 1px 0 #ffffff; + opacity: 0.2; + filter: alpha(opacity=20); +} + +.close:hover, +.close:focus { + color: #000000; + text-decoration: none; + cursor: pointer; + opacity: 0.4; + filter: alpha(opacity=40); +} + +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} + +.btn { + display: inline-block; + *display: inline; + padding: 4px 12px; + margin-bottom: 0; + *margin-left: .3em; + font-size: 14px; + line-height: 20px; + color: #333333; + text-align: center; + text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); + vertical-align: middle; + cursor: pointer; + background-color: #f5f5f5; + *background-color: #e6e6e6; + background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); + background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); + background-image: linear-gradient(to bottom, #ffffff, #e6e6e6); + background-repeat: repeat-x; + border: 1px solid #cccccc; + *border: 0; + border-color: #e6e6e6 #e6e6e6 #bfbfbf; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + border-bottom-color: #b3b3b3; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + *zoom: 1; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn:hover, +.btn:focus, +.btn:active, +.btn.active, +.btn.disabled, +.btn[disabled] { + color: #333333; + background-color: #e6e6e6; + *background-color: #d9d9d9; +} + +.btn:active, +.btn.active { + background-color: #cccccc \9; +} + +.btn:first-child { + *margin-left: 0; +} + +.btn:hover, +.btn:focus { + color: #333333; + text-decoration: none; + background-position: 0 -15px; + -webkit-transition: background-position 0.1s linear; + -moz-transition: background-position 0.1s linear; + -o-transition: background-position 0.1s linear; + transition: background-position 0.1s linear; +} + +.btn:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +.btn.active, +.btn:active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn.disabled, +.btn[disabled] { + cursor: default; + background-image: none; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + +.btn-large { + padding: 11px 19px; + font-size: 17.5px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.btn-large [class^="icon-"], +.btn-large [class*=" icon-"] { + margin-top: 4px; +} + +.btn-small { + padding: 2px 10px; + font-size: 11.9px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.btn-small [class^="icon-"], +.btn-small [class*=" icon-"] { + margin-top: 0; +} + +.btn-mini [class^="icon-"], +.btn-mini [class*=" icon-"] { + margin-top: -1px; +} + +.btn-mini { + padding: 0 6px; + font-size: 10.5px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.btn-block { + display: block; + width: 100%; + padding-right: 0; + padding-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.btn-block + .btn-block { + margin-top: 5px; +} + +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} + +.btn-primary.active, +.btn-warning.active, +.btn-danger.active, +.btn-success.active, +.btn-info.active, +.btn-inverse.active { + color: rgba(255, 255, 255, 0.75); +} + +.btn-primary { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #2f92e7; + *background-color: #2f76e7; + background-image: -moz-linear-gradient(top, #2fa4e7, #2f76e7); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#2fa4e7), to(#2f76e7)); + background-image: -webkit-linear-gradient(top, #2fa4e7, #2f76e7); + background-image: -o-linear-gradient(top, #2fa4e7, #2f76e7); + background-image: linear-gradient(to bottom, #2fa4e7, #2f76e7); + background-repeat: repeat-x; + border-color: #2f76e7 #2f76e7 #1553b5; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2fa4e7', endColorstr='#ff2f76e7', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-primary:hover, +.btn-primary:focus, +.btn-primary:active, +.btn-primary.active, +.btn-primary.disabled, +.btn-primary[disabled] { + color: #ffffff; + background-color: #2f76e7; + *background-color: #1a67e2; +} + +.btn-primary:active, +.btn-primary.active { + background-color: #175dcc \9; +} + +.btn-warning { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #dd5600; + *background-color: #dd5600; + background-image: -moz-linear-gradient(top, #dd5600, #dd5600); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#dd5600), to(#dd5600)); + background-image: -webkit-linear-gradient(top, #dd5600, #dd5600); + background-image: -o-linear-gradient(top, #dd5600, #dd5600); + background-image: linear-gradient(to bottom, #dd5600, #dd5600); + background-repeat: repeat-x; + border-color: #dd5600 #dd5600 #913800; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdd5600', endColorstr='#ffdd5600', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-warning:hover, +.btn-warning:focus, +.btn-warning:active, +.btn-warning.active, +.btn-warning.disabled, +.btn-warning[disabled] { + color: #ffffff; + background-color: #dd5600; + *background-color: #c44c00; +} + +.btn-warning:active, +.btn-warning.active { + background-color: #aa4200 \9; +} + +.btn-danger { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #c32627; + *background-color: #bd362f; + background-image: -moz-linear-gradient(top, #c71c22, #bd362f); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#c71c22), to(#bd362f)); + background-image: -webkit-linear-gradient(top, #c71c22, #bd362f); + background-image: -o-linear-gradient(top, #c71c22, #bd362f); + background-image: linear-gradient(to bottom, #c71c22, #bd362f); + background-repeat: repeat-x; + border-color: #bd362f #bd362f #802420; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffc71c22', endColorstr='#ffbd362f', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-danger:hover, +.btn-danger:focus, +.btn-danger:active, +.btn-danger.active, +.btn-danger.disabled, +.btn-danger[disabled] { + color: #ffffff; + background-color: #bd362f; + *background-color: #a9302a; +} + +.btn-danger:active, +.btn-danger.active { + background-color: #942a25 \9; +} + +.btn-success { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #65a643; + *background-color: #51a351; + background-image: -moz-linear-gradient(top, #73a839, #51a351); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#73a839), to(#51a351)); + background-image: -webkit-linear-gradient(top, #73a839, #51a351); + background-image: -o-linear-gradient(top, #73a839, #51a351); + background-image: linear-gradient(to bottom, #73a839, #51a351); + background-repeat: repeat-x; + border-color: #51a351 #51a351 #387038; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff73a839', endColorstr='#ff51a351', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-success:hover, +.btn-success:focus, +.btn-success:active, +.btn-success.active, +.btn-success.disabled, +.btn-success[disabled] { + color: #ffffff; + background-color: #51a351; + *background-color: #499249; +} + +.btn-success:active, +.btn-success.active { + background-color: #408140 \9; +} + +.btn-info { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #6d76b3; + *background-color: #2f96b4; + background-image: -moz-linear-gradient(top, #9760b3, #2f96b4); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#9760b3), to(#2f96b4)); + background-image: -webkit-linear-gradient(top, #9760b3, #2f96b4); + background-image: -o-linear-gradient(top, #9760b3, #2f96b4); + background-image: linear-gradient(to bottom, #9760b3, #2f96b4); + background-repeat: repeat-x; + border-color: #2f96b4 #2f96b4 #1f6377; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff9760b3', endColorstr='#ff2f96b4', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-info:hover, +.btn-info:focus, +.btn-info:active, +.btn-info.active, +.btn-info.disabled, +.btn-info[disabled] { + color: #ffffff; + background-color: #2f96b4; + *background-color: #2a85a0; +} + +.btn-info:active, +.btn-info.active { + background-color: #24748c \9; +} + +.btn-inverse { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #0f3253; + *background-color: #222222; + background-image: -moz-linear-gradient(top, #033c73, #222222); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#033c73), to(#222222)); + background-image: -webkit-linear-gradient(top, #033c73, #222222); + background-image: -o-linear-gradient(top, #033c73, #222222); + background-image: linear-gradient(to bottom, #033c73, #222222); + background-repeat: repeat-x; + border-color: #222222 #222222 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff033c73', endColorstr='#ff222222', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-inverse:hover, +.btn-inverse:focus, +.btn-inverse:active, +.btn-inverse.active, +.btn-inverse.disabled, +.btn-inverse[disabled] { + color: #ffffff; + background-color: #222222; + *background-color: #151515; +} + +.btn-inverse:active, +.btn-inverse.active { + background-color: #080808 \9; +} + +button.btn, +input[type="submit"].btn { + *padding-top: 3px; + *padding-bottom: 3px; +} + +button.btn::-moz-focus-inner, +input[type="submit"].btn::-moz-focus-inner { + padding: 0; + border: 0; +} + +button.btn.btn-large, +input[type="submit"].btn.btn-large { + *padding-top: 7px; + *padding-bottom: 7px; +} + +button.btn.btn-small, +input[type="submit"].btn.btn-small { + *padding-top: 3px; + *padding-bottom: 3px; +} + +button.btn.btn-mini, +input[type="submit"].btn.btn-mini { + *padding-top: 1px; + *padding-bottom: 1px; +} + +.btn-link, +.btn-link:active, +.btn-link[disabled] { + background-color: transparent; + background-image: none; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + +.btn-link { + color: #2fa4e7; + cursor: pointer; + border-color: transparent; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-link:hover, +.btn-link:focus { + color: #157ab5; + text-decoration: underline; + background-color: transparent; +} + +.btn-link[disabled]:hover, +.btn-link[disabled]:focus { + color: #333333; + text-decoration: none; +} + +.btn-group { + position: relative; + display: inline-block; + *display: inline; + *margin-left: .3em; + font-size: 0; + white-space: nowrap; + vertical-align: middle; + *zoom: 1; +} + +.btn-group:first-child { + *margin-left: 0; +} + +.btn-group + .btn-group { + margin-left: 5px; +} + +.btn-toolbar { + margin-top: 10px; + margin-bottom: 10px; + font-size: 0; +} + +.btn-toolbar > .btn + .btn, +.btn-toolbar > .btn-group + .btn, +.btn-toolbar > .btn + .btn-group { + margin-left: 5px; +} + +.btn-group > .btn { + position: relative; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-group > .btn + .btn { + margin-left: -1px; +} + +.btn-group > .btn, +.btn-group > .dropdown-menu, +.btn-group > .popover { + font-size: 14px; +} + +.btn-group > .btn-mini { + font-size: 10.5px; +} + +.btn-group > .btn-small { + font-size: 11.9px; +} + +.btn-group > .btn-large { + font-size: 17.5px; +} + +.btn-group > .btn:first-child { + margin-left: 0; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-topleft: 4px; +} + +.btn-group > .btn:last-child, +.btn-group > .dropdown-toggle { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-bottomright: 4px; +} + +.btn-group > .btn.large:first-child { + margin-left: 0; + -webkit-border-bottom-left-radius: 6px; + border-bottom-left-radius: 6px; + -webkit-border-top-left-radius: 6px; + border-top-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + -moz-border-radius-topleft: 6px; +} + +.btn-group > .btn.large:last-child, +.btn-group > .large.dropdown-toggle { + -webkit-border-top-right-radius: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + border-bottom-right-radius: 6px; + -moz-border-radius-topright: 6px; + -moz-border-radius-bottomright: 6px; +} + +.btn-group > .btn:hover, +.btn-group > .btn:focus, +.btn-group > .btn:active, +.btn-group > .btn.active { + z-index: 2; +} + +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} + +.btn-group > .btn + .dropdown-toggle { + *padding-top: 5px; + padding-right: 8px; + *padding-bottom: 5px; + padding-left: 8px; + -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn-group > .btn-mini + .dropdown-toggle { + *padding-top: 2px; + padding-right: 5px; + *padding-bottom: 2px; + padding-left: 5px; +} + +.btn-group > .btn-small + .dropdown-toggle { + *padding-top: 5px; + *padding-bottom: 4px; +} + +.btn-group > .btn-large + .dropdown-toggle { + *padding-top: 7px; + padding-right: 12px; + *padding-bottom: 7px; + padding-left: 12px; +} + +.btn-group.open .dropdown-toggle { + background-image: none; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn-group.open .btn.dropdown-toggle { + background-color: #e6e6e6; +} + +.btn-group.open .btn-primary.dropdown-toggle { + background-color: #2f76e7; +} + +.btn-group.open .btn-warning.dropdown-toggle { + background-color: #dd5600; +} + +.btn-group.open .btn-danger.dropdown-toggle { + background-color: #bd362f; +} + +.btn-group.open .btn-success.dropdown-toggle { + background-color: #51a351; +} + +.btn-group.open .btn-info.dropdown-toggle { + background-color: #2f96b4; +} + +.btn-group.open .btn-inverse.dropdown-toggle { + background-color: #222222; +} + +.btn .caret { + margin-top: 8px; + margin-left: 0; +} + +.btn-large .caret { + margin-top: 6px; +} + +.btn-large .caret { + border-top-width: 5px; + border-right-width: 5px; + border-left-width: 5px; +} + +.btn-mini .caret, +.btn-small .caret { + margin-top: 8px; +} + +.dropup .btn-large .caret { + border-bottom-width: 5px; +} + +.btn-primary .caret, +.btn-warning .caret, +.btn-danger .caret, +.btn-info .caret, +.btn-success .caret, +.btn-inverse .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.btn-group-vertical { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; +} + +.btn-group-vertical > .btn { + display: block; + float: none; + max-width: 100%; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-group-vertical > .btn + .btn { + margin-top: -1px; + margin-left: 0; +} + +.btn-group-vertical > .btn:first-child { + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} + +.btn-group-vertical > .btn:last-child { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} + +.btn-group-vertical > .btn-large:first-child { + -webkit-border-radius: 6px 6px 0 0; + -moz-border-radius: 6px 6px 0 0; + border-radius: 6px 6px 0 0; +} + +.btn-group-vertical > .btn-large:last-child { + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; +} + +.alert { + padding: 8px 35px 8px 14px; + margin-bottom: 20px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + background-color: #f1ceab; + border: 1px solid #efb99e; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.alert, +.alert h4 { + color: #dd5600; +} + +.alert h4 { + margin: 0; +} + +.alert .close { + position: relative; + top: -2px; + right: -21px; + line-height: 20px; +} + +.alert-success { + color: #669533; + background-color: #d5ecbf; + border-color: #d2e6ab; +} + +.alert-success h4 { + color: #669533; +} + +.alert-danger, +.alert-error { + color: #bd4247; + background-color: #f2bdb1; + border-color: #f0a5a4; +} + +.alert-danger h4, +.alert-error h4 { + color: #bd4247; +} + +.alert-info { + color: #178acc; + background-color: #a7dff1; + border-color: #88e4ec; +} + +.alert-info h4 { + color: #178acc; +} + +.alert-block { + padding-top: 14px; + padding-bottom: 14px; +} + +.alert-block > p, +.alert-block > ul { + margin-bottom: 0; +} + +.alert-block p + p { + margin-top: 5px; +} + +.nav { + margin-bottom: 20px; + margin-left: 0; + list-style: none; +} + +.nav > li > a { + display: block; +} + +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; + background-color: #f5f5f5; +} + +.nav > li > a > img { + max-width: none; +} + +.nav > .pull-right { + float: right; +} + +.nav-header { + display: block; + padding: 3px 15px; + font-size: 11px; + font-weight: bold; + line-height: 20px; + color: #999999; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + text-transform: uppercase; +} + +.nav li + .nav-header { + margin-top: 9px; +} + +.nav-list { + padding-right: 15px; + padding-left: 15px; + margin-bottom: 0; +} + +.nav-list > li > a, +.nav-list .nav-header { + margin-right: -15px; + margin-left: -15px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); +} + +.nav-list > li > a { + padding: 3px 15px; +} + +.nav-list > .active > a, +.nav-list > .active > a:hover, +.nav-list > .active > a:focus { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); + background-color: #2fa4e7; +} + +.nav-list [class^="icon-"], +.nav-list [class*=" icon-"] { + margin-right: 2px; +} + +.nav-list .divider { + *width: 100%; + height: 1px; + margin: 9px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} + +.nav-tabs, +.nav-pills { + *zoom: 1; +} + +.nav-tabs:before, +.nav-pills:before, +.nav-tabs:after, +.nav-pills:after { + display: table; + line-height: 0; + content: ""; +} + +.nav-tabs:after, +.nav-pills:after { + clear: both; +} + +.nav-tabs > li, +.nav-pills > li { + float: left; +} + +.nav-tabs > li > a, +.nav-pills > li > a { + padding-right: 12px; + padding-left: 12px; + margin-right: 2px; + line-height: 14px; +} + +.nav-tabs { + border-bottom: 1px solid #ddd; +} + +.nav-tabs > li { + margin-bottom: -1px; +} + +.nav-tabs > li > a { + padding-top: 8px; + padding-bottom: 8px; + line-height: 20px; + border: 1px solid transparent; + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} + +.nav-tabs > li > a:hover, +.nav-tabs > li > a:focus { + border-color: #f5f5f5 #f5f5f5 #dddddd; +} + +.nav-tabs > .active > a, +.nav-tabs > .active > a:hover, +.nav-tabs > .active > a:focus { + color: #555555; + cursor: default; + background-color: #ffffff; + border: 1px solid #ddd; + border-bottom-color: transparent; +} + +.nav-pills > li > a { + padding-top: 8px; + padding-bottom: 8px; + margin-top: 2px; + margin-bottom: 2px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} + +.nav-pills > .active > a, +.nav-pills > .active > a:hover, +.nav-pills > .active > a:focus { + color: #ffffff; + background-color: #2fa4e7; +} + +.nav-stacked > li { + float: none; +} + +.nav-stacked > li > a { + margin-right: 0; +} + +.nav-tabs.nav-stacked { + border-bottom: 0; +} + +.nav-tabs.nav-stacked > li > a { + border: 1px solid #ddd; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.nav-tabs.nav-stacked > li:first-child > a { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-topleft: 4px; +} + +.nav-tabs.nav-stacked > li:last-child > a { + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -moz-border-radius-bottomright: 4px; + -moz-border-radius-bottomleft: 4px; +} + +.nav-tabs.nav-stacked > li > a:hover, +.nav-tabs.nav-stacked > li > a:focus { + z-index: 2; + border-color: #ddd; +} + +.nav-pills.nav-stacked > li > a { + margin-bottom: 3px; +} + +.nav-pills.nav-stacked > li:last-child > a { + margin-bottom: 1px; +} + +.nav-tabs .dropdown-menu { + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; +} + +.nav-pills .dropdown-menu { + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.nav .dropdown-toggle .caret { + margin-top: 6px; + border-top-color: #2fa4e7; + border-bottom-color: #2fa4e7; +} + +.nav .dropdown-toggle:hover .caret, +.nav .dropdown-toggle:focus .caret { + border-top-color: #157ab5; + border-bottom-color: #157ab5; +} + +/* move down carets for tabs */ + +.nav-tabs .dropdown-toggle .caret { + margin-top: 8px; +} + +.nav .active .dropdown-toggle .caret { + border-top-color: #fff; + border-bottom-color: #fff; +} + +.nav-tabs .active .dropdown-toggle .caret { + border-top-color: #555555; + border-bottom-color: #555555; +} + +.nav > .dropdown.active > a:hover, +.nav > .dropdown.active > a:focus { + cursor: pointer; +} + +.nav-tabs .open .dropdown-toggle, +.nav-pills .open .dropdown-toggle, +.nav > li.dropdown.open.active > a:hover, +.nav > li.dropdown.open.active > a:focus { + color: #ffffff; + background-color: #999999; + border-color: #999999; +} + +.nav li.dropdown.open .caret, +.nav li.dropdown.open.active .caret, +.nav li.dropdown.open a:hover .caret, +.nav li.dropdown.open a:focus .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; + opacity: 1; + filter: alpha(opacity=100); +} + +.tabs-stacked .open > a:hover, +.tabs-stacked .open > a:focus { + border-color: #999999; +} + +.tabbable { + *zoom: 1; +} + +.tabbable:before, +.tabbable:after { + display: table; + line-height: 0; + content: ""; +} + +.tabbable:after { + clear: both; +} + +.tab-content { + overflow: auto; +} + +.tabs-below > .nav-tabs, +.tabs-right > .nav-tabs, +.tabs-left > .nav-tabs { + border-bottom: 0; +} + +.tab-content > .tab-pane, +.pill-content > .pill-pane { + display: none; +} + +.tab-content > .active, +.pill-content > .active { + display: block; +} + +.tabs-below > .nav-tabs { + border-top: 1px solid #ddd; +} + +.tabs-below > .nav-tabs > li { + margin-top: -1px; + margin-bottom: 0; +} + +.tabs-below > .nav-tabs > li > a { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} + +.tabs-below > .nav-tabs > li > a:hover, +.tabs-below > .nav-tabs > li > a:focus { + border-top-color: #ddd; + border-bottom-color: transparent; +} + +.tabs-below > .nav-tabs > .active > a, +.tabs-below > .nav-tabs > .active > a:hover, +.tabs-below > .nav-tabs > .active > a:focus { + border-color: transparent #ddd #ddd #ddd; +} + +.tabs-left > .nav-tabs > li, +.tabs-right > .nav-tabs > li { + float: none; +} + +.tabs-left > .nav-tabs > li > a, +.tabs-right > .nav-tabs > li > a { + min-width: 74px; + margin-right: 0; + margin-bottom: 3px; +} + +.tabs-left > .nav-tabs { + float: left; + margin-right: 19px; + border-right: 1px solid #ddd; +} + +.tabs-left > .nav-tabs > li > a { + margin-right: -1px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.tabs-left > .nav-tabs > li > a:hover, +.tabs-left > .nav-tabs > li > a:focus { + border-color: #f5f5f5 #dddddd #f5f5f5 #f5f5f5; +} + +.tabs-left > .nav-tabs .active > a, +.tabs-left > .nav-tabs .active > a:hover, +.tabs-left > .nav-tabs .active > a:focus { + border-color: #ddd transparent #ddd #ddd; + *border-right-color: #ffffff; +} + +.tabs-right > .nav-tabs { + float: right; + margin-left: 19px; + border-left: 1px solid #ddd; +} + +.tabs-right > .nav-tabs > li > a { + margin-left: -1px; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.tabs-right > .nav-tabs > li > a:hover, +.tabs-right > .nav-tabs > li > a:focus { + border-color: #f5f5f5 #f5f5f5 #f5f5f5 #dddddd; +} + +.tabs-right > .nav-tabs .active > a, +.tabs-right > .nav-tabs .active > a:hover, +.tabs-right > .nav-tabs .active > a:focus { + border-color: #ddd #ddd #ddd transparent; + *border-left-color: #ffffff; +} + +.nav > .disabled > a { + color: #999999; +} + +.nav > .disabled > a:hover, +.nav > .disabled > a:focus { + text-decoration: none; + cursor: default; + background-color: transparent; +} + +.navbar { + *position: relative; + *z-index: 2; + margin-bottom: 20px; + overflow: visible; +} + +.navbar-inner { + min-height: 50px; + padding-right: 20px; + padding-left: 20px; + background-color: #45aeea; + background-image: -moz-linear-gradient(top, #54b4eb, #2fa4e7); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#54b4eb), to(#2fa4e7)); + background-image: -webkit-linear-gradient(top, #54b4eb, #2fa4e7); + background-image: -o-linear-gradient(top, #54b4eb, #2fa4e7); + background-image: linear-gradient(to bottom, #54b4eb, #2fa4e7); + background-repeat: repeat-x; + border: 1px solid #1990d5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff54b4eb', endColorstr='#ff2fa4e7', GradientType=0); + *zoom: 1; + -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); +} + +.navbar-inner:before, +.navbar-inner:after { + display: table; + line-height: 0; + content: ""; +} + +.navbar-inner:after { + clear: both; +} + +.navbar .container { + width: auto; +} + +.nav-collapse.collapse { + height: auto; + overflow: visible; +} + +.navbar .brand { + display: block; + float: left; + padding: 15px 20px 15px; + margin-left: -20px; + font-size: 20px; + font-weight: 200; + color: #ffffff; + text-shadow: 0 1px 0 #54b4eb; +} + +.navbar .brand:hover, +.navbar .brand:focus { + text-decoration: none; +} + +.navbar-text { + margin-bottom: 0; + line-height: 50px; + color: #f5f5f5; +} + +.navbar-link { + color: #ffffff; +} + +.navbar-link:hover, +.navbar-link:focus { + color: #ffffff; +} + +.navbar .divider-vertical { + height: 50px; + margin: 0 9px; + border-right: 1px solid #54b4eb; + border-left: 1px solid #2fa4e7; +} + +.navbar .btn, +.navbar .btn-group { + margin-top: 10px; +} + +.navbar .btn-group .btn, +.navbar .input-prepend .btn, +.navbar .input-append .btn, +.navbar .input-prepend .btn-group, +.navbar .input-append .btn-group { + margin-top: 0; +} + +.navbar-form { + margin-bottom: 0; + *zoom: 1; +} + +.navbar-form:before, +.navbar-form:after { + display: table; + line-height: 0; + content: ""; +} + +.navbar-form:after { + clear: both; +} + +.navbar-form input, +.navbar-form select, +.navbar-form .radio, +.navbar-form .checkbox { + margin-top: 10px; +} + +.navbar-form input, +.navbar-form select, +.navbar-form .btn { + display: inline-block; + margin-bottom: 0; +} + +.navbar-form input[type="image"], +.navbar-form input[type="checkbox"], +.navbar-form input[type="radio"] { + margin-top: 3px; +} + +.navbar-form .input-append, +.navbar-form .input-prepend { + margin-top: 5px; + white-space: nowrap; +} + +.navbar-form .input-append input, +.navbar-form .input-prepend input { + margin-top: 0; +} + +.navbar-search { + position: relative; + float: left; + margin-top: 10px; + margin-bottom: 0; +} + +.navbar-search .search-query { + padding: 4px 14px; + margin-bottom: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + font-weight: normal; + line-height: 1; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +.navbar-static-top { + position: static; + margin-bottom: 0; +} + +.navbar-static-top .navbar-inner { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; + margin-bottom: 0; +} + +.navbar-fixed-top .navbar-inner, +.navbar-static-top .navbar-inner { + border-width: 0 0 1px; +} + +.navbar-fixed-bottom .navbar-inner { + border-width: 1px 0 0; +} + +.navbar-fixed-top .navbar-inner, +.navbar-fixed-bottom .navbar-inner { + padding-right: 0; + padding-left: 0; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.navbar-static-top .container, +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} + +.navbar-fixed-top { + top: 0; +} + +.navbar-fixed-top .navbar-inner, +.navbar-static-top .navbar-inner { + -webkit-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); +} + +.navbar-fixed-bottom { + bottom: 0; +} + +.navbar-fixed-bottom .navbar-inner { + -webkit-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); + box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); +} + +.navbar .nav { + position: relative; + left: 0; + display: block; + float: left; + margin: 0 10px 0 0; +} + +.navbar .nav.pull-right { + float: right; + margin-right: 0; +} + +.navbar .nav > li { + float: left; +} + +.navbar .nav > li > a { + float: none; + padding: 15px 15px 15px; + color: #ffffff; + text-decoration: none; + text-shadow: 0 1px 0 #54b4eb; +} + +.navbar .nav .dropdown-toggle .caret { + margin-top: 8px; +} + +.navbar .nav > .active > a, +.navbar .nav > .active > a:hover, +.navbar .nav > .active > a:focus { + color: #ffffff; + text-decoration: none; + background-color: #1684c2; + -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); + -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); +} + +.navbar .btn-navbar { + display: none; + float: right; + padding: 7px 10px; + margin-right: 5px; + margin-left: 5px; + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #2fa3e6; + *background-color: #1a99e2; + background-image: -moz-linear-gradient(top, #3daae9, #1a99e2); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#3daae9), to(#1a99e2)); + background-image: -webkit-linear-gradient(top, #3daae9, #1a99e2); + background-image: -o-linear-gradient(top, #3daae9, #1a99e2); + background-image: linear-gradient(to bottom, #3daae9, #1a99e2); + background-repeat: repeat-x; + border-color: #1a99e2 #1a99e2 #126b9e; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3daae9', endColorstr='#ff1a99e2', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); +} + +.navbar .btn-navbar:hover, +.navbar .btn-navbar:focus, +.navbar .btn-navbar:active, +.navbar .btn-navbar.active, +.navbar .btn-navbar.disabled, +.navbar .btn-navbar[disabled] { + color: #ffffff; + background-color: #1a99e2; + *background-color: #178acc; +} + +.navbar .btn-navbar:active, +.navbar .btn-navbar.active { + background-color: #157ab5 \9; +} + +.navbar .btn-navbar .icon-bar { + display: block; + width: 18px; + height: 2px; + background-color: #f5f5f5; + -webkit-border-radius: 1px; + -moz-border-radius: 1px; + border-radius: 1px; + -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); +} + +.btn-navbar .icon-bar + .icon-bar { + margin-top: 3px; +} + +.navbar .nav > li > .dropdown-menu:before { + position: absolute; + top: -7px; + left: 9px; + display: inline-block; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-left: 7px solid transparent; + border-bottom-color: rgba(0, 0, 0, 0.2); + content: ''; +} + +.navbar .nav > li > .dropdown-menu:after { + position: absolute; + top: -6px; + left: 10px; + display: inline-block; + border-right: 6px solid transparent; + border-bottom: 6px solid #ffffff; + border-left: 6px solid transparent; + content: ''; +} + +.navbar-fixed-bottom .nav > li > .dropdown-menu:before { + top: auto; + bottom: -7px; + border-top: 7px solid #ccc; + border-bottom: 0; + border-top-color: rgba(0, 0, 0, 0.2); +} + +.navbar-fixed-bottom .nav > li > .dropdown-menu:after { + top: auto; + bottom: -6px; + border-top: 6px solid #ffffff; + border-bottom: 0; +} + +.navbar .nav li.dropdown > a:hover .caret, +.navbar .nav li.dropdown > a:focus .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.navbar .nav li.dropdown.open > .dropdown-toggle, +.navbar .nav li.dropdown.active > .dropdown-toggle, +.navbar .nav li.dropdown.open.active > .dropdown-toggle { + color: #ffffff; + background-color: #1684c2; +} + +.navbar .nav li.dropdown > .dropdown-toggle .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.navbar .nav li.dropdown.open > .dropdown-toggle .caret, +.navbar .nav li.dropdown.active > .dropdown-toggle .caret, +.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.navbar .pull-right > li > .dropdown-menu, +.navbar .nav > li > .dropdown-menu.pull-right { + right: 0; + left: auto; +} + +.navbar .pull-right > li > .dropdown-menu:before, +.navbar .nav > li > .dropdown-menu.pull-right:before { + right: 12px; + left: auto; +} + +.navbar .pull-right > li > .dropdown-menu:after, +.navbar .nav > li > .dropdown-menu.pull-right:after { + right: 13px; + left: auto; +} + +.navbar .pull-right > li > .dropdown-menu .dropdown-menu, +.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu { + right: 100%; + left: auto; + margin-right: -1px; + margin-left: 0; + -webkit-border-radius: 6px 0 6px 6px; + -moz-border-radius: 6px 0 6px 6px; + border-radius: 6px 0 6px 6px; +} + +.navbar-inverse .navbar-inner { + background-color: #034482; + background-image: -moz-linear-gradient(top, #04498c, #033c73); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#04498c), to(#033c73)); + background-image: -webkit-linear-gradient(top, #04498c, #033c73); + background-image: -o-linear-gradient(top, #04498c, #033c73); + background-image: linear-gradient(to bottom, #04498c, #033c73); + background-repeat: repeat-x; + border-color: #033464; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff04498c', endColorstr='#ff033c73', GradientType=0); +} + +.navbar-inverse .brand, +.navbar-inverse .nav > li > a { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} + +.navbar-inverse .brand:hover, +.navbar-inverse .nav > li > a:hover, +.navbar-inverse .brand:focus, +.navbar-inverse .nav > li > a:focus { + color: #ffffff; +} + +.navbar-inverse .brand { + color: #ffffff; +} + +.navbar-inverse .navbar-text { + color: #ffffff; +} + +.navbar-inverse .divider-vertical { + border-right-color: #04498c; + border-left-color: #033c73; +} + +.navbar-inverse .nav li.dropdown.open > .dropdown-toggle, +.navbar-inverse .nav li.dropdown.active > .dropdown-toggle, +.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle { + color: #ffffff; + background-color: #022c55; +} + +.navbar-inverse .nav li.dropdown > a:hover .caret, +.navbar-inverse .nav li.dropdown > a:focus .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret, +.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret, +.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.navbar-inverse .navbar-search .search-query { + color: #ffffff; + background-color: #ffffff; + border-color: #033c73; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + -webkit-transition: none; + -moz-transition: none; + -o-transition: none; + transition: none; +} + +.navbar-inverse .navbar-search .search-query:-moz-placeholder { + color: #999999; +} + +.navbar-inverse .navbar-search .search-query:-ms-input-placeholder { + color: #999999; +} + +.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder { + color: #999999; +} + +.navbar-inverse .navbar-search .search-query:focus, +.navbar-inverse .navbar-search .search-query.focused { + padding: 5px 15px; + color: #333333; + text-shadow: 0 1px 0 #ffffff; + background-color: #ffffff; + border: 0; + outline: 0; + -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); +} + +.navbar-inverse .btn-navbar { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #033769; + *background-color: #022f5a; + background-image: -moz-linear-gradient(top, #033c73, #022f5a); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#033c73), to(#022f5a)); + background-image: -webkit-linear-gradient(top, #033c73, #022f5a); + background-image: -o-linear-gradient(top, #033c73, #022f5a); + background-image: linear-gradient(to bottom, #033c73, #022f5a); + background-repeat: repeat-x; + border-color: #022f5a #022f5a #000810; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff033c73', endColorstr='#ff022f5a', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.navbar-inverse .btn-navbar:hover, +.navbar-inverse .btn-navbar:focus, +.navbar-inverse .btn-navbar:active, +.navbar-inverse .btn-navbar.active, +.navbar-inverse .btn-navbar.disabled, +.navbar-inverse .btn-navbar[disabled] { + color: #ffffff; + background-color: #022f5a; + *background-color: #022241; +} + +.navbar-inverse .btn-navbar:active, +.navbar-inverse .btn-navbar.active { + background-color: #011528 \9; +} + +.breadcrumb { + padding: 8px 15px; + margin: 0 0 20px; + list-style: none; + background-color: #f5f5f5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.breadcrumb > li { + display: inline-block; + *display: inline; + text-shadow: 0 1px 0 #ffffff; + *zoom: 1; +} + +.breadcrumb > li > .divider { + padding: 0 5px; + color: #ccc; +} + +.breadcrumb > .active { + color: #999999; +} + +.pagination { + margin: 20px 0; +} + +.pagination ul { + display: inline-block; + *display: inline; + margin-bottom: 0; + margin-left: 0; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + *zoom: 1; + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.pagination ul > li { + display: inline; +} + +.pagination ul > li > a, +.pagination ul > li > span { + float: left; + padding: 4px 12px; + line-height: 20px; + text-decoration: none; + background-color: #ffffff; + border: 1px solid #dddddd; + border-left-width: 0; +} + +.pagination ul > li > a:hover, +.pagination ul > li > a:focus, +.pagination ul > .active > a, +.pagination ul > .active > span { + background-color: #f5f5f5; +} + +.pagination ul > .active > a, +.pagination ul > .active > span { + color: #999999; + cursor: default; +} + +.pagination ul > .disabled > span, +.pagination ul > .disabled > a, +.pagination ul > .disabled > a:hover, +.pagination ul > .disabled > a:focus { + color: #999999; + cursor: default; + background-color: transparent; +} + +.pagination ul > li:first-child > a, +.pagination ul > li:first-child > span { + border-left-width: 1px; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-topleft: 4px; +} + +.pagination ul > li:last-child > a, +.pagination ul > li:last-child > span { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-bottomright: 4px; +} + +.pagination-centered { + text-align: center; +} + +.pagination-right { + text-align: right; +} + +.pagination-large ul > li > a, +.pagination-large ul > li > span { + padding: 11px 19px; + font-size: 17.5px; +} + +.pagination-large ul > li:first-child > a, +.pagination-large ul > li:first-child > span { + -webkit-border-bottom-left-radius: 6px; + border-bottom-left-radius: 6px; + -webkit-border-top-left-radius: 6px; + border-top-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + -moz-border-radius-topleft: 6px; +} + +.pagination-large ul > li:last-child > a, +.pagination-large ul > li:last-child > span { + -webkit-border-top-right-radius: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + border-bottom-right-radius: 6px; + -moz-border-radius-topright: 6px; + -moz-border-radius-bottomright: 6px; +} + +.pagination-mini ul > li:first-child > a, +.pagination-small ul > li:first-child > a, +.pagination-mini ul > li:first-child > span, +.pagination-small ul > li:first-child > span { + -webkit-border-bottom-left-radius: 3px; + border-bottom-left-radius: 3px; + -webkit-border-top-left-radius: 3px; + border-top-left-radius: 3px; + -moz-border-radius-bottomleft: 3px; + -moz-border-radius-topleft: 3px; +} + +.pagination-mini ul > li:last-child > a, +.pagination-small ul > li:last-child > a, +.pagination-mini ul > li:last-child > span, +.pagination-small ul > li:last-child > span { + -webkit-border-top-right-radius: 3px; + border-top-right-radius: 3px; + -webkit-border-bottom-right-radius: 3px; + border-bottom-right-radius: 3px; + -moz-border-radius-topright: 3px; + -moz-border-radius-bottomright: 3px; +} + +.pagination-small ul > li > a, +.pagination-small ul > li > span { + padding: 2px 10px; + font-size: 11.9px; +} + +.pagination-mini ul > li > a, +.pagination-mini ul > li > span { + padding: 0 6px; + font-size: 10.5px; +} + +.pager { + margin: 20px 0; + text-align: center; + list-style: none; + *zoom: 1; +} + +.pager:before, +.pager:after { + display: table; + line-height: 0; + content: ""; +} + +.pager:after { + clear: both; +} + +.pager li { + display: inline; +} + +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #f5f5f5; +} + +.pager .next > a, +.pager .next > span { + float: right; +} + +.pager .previous > a, +.pager .previous > span { + float: left; +} + +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #999999; + cursor: default; + background-color: #fff; +} + +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000000; +} + +.modal-backdrop.fade { + opacity: 0; +} + +.modal-backdrop, +.modal-backdrop.fade.in { + opacity: 0.8; + filter: alpha(opacity=80); +} + +.modal { + position: fixed; + top: 10%; + left: 50%; + z-index: 1050; + width: 560px; + margin-left: -280px; + background-color: #ffffff; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, 0.3); + *border: 1px solid #999; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + outline: none; + -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -webkit-background-clip: padding-box; + -moz-background-clip: padding-box; + background-clip: padding-box; +} + +.modal.fade { + top: -25%; + -webkit-transition: opacity 0.3s linear, top 0.3s ease-out; + -moz-transition: opacity 0.3s linear, top 0.3s ease-out; + -o-transition: opacity 0.3s linear, top 0.3s ease-out; + transition: opacity 0.3s linear, top 0.3s ease-out; +} + +.modal.fade.in { + top: 10%; +} + +.modal-header { + padding: 9px 15px; + border-bottom: 1px solid #eee; +} + +.modal-header .close { + margin-top: 2px; +} + +.modal-header h3 { + margin: 0; + line-height: 30px; +} + +.modal-body { + position: relative; + max-height: 400px; + padding: 15px; + overflow-y: auto; +} + +.modal-form { + margin-bottom: 0; +} + +.modal-footer { + padding: 14px 15px 15px; + margin-bottom: 0; + text-align: right; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; + *zoom: 1; + -webkit-box-shadow: inset 0 1px 0 #ffffff; + -moz-box-shadow: inset 0 1px 0 #ffffff; + box-shadow: inset 0 1px 0 #ffffff; +} + +.modal-footer:before, +.modal-footer:after { + display: table; + line-height: 0; + content: ""; +} + +.modal-footer:after { + clear: both; +} + +.modal-footer .btn + .btn { + margin-bottom: 0; + margin-left: 5px; +} + +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} + +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} + +.tooltip { + position: absolute; + z-index: 1020; + display: block; + font-size: 11px; + line-height: 1.4; + opacity: 0; + filter: alpha(opacity=0); + visibility: visible; +} + +.tooltip.in { + opacity: 0.8; + filter: alpha(opacity=80); +} + +.tooltip.top { + padding: 5px 0; + margin-top: -3px; +} + +.tooltip.right { + padding: 0 5px; + margin-left: 3px; +} + +.tooltip.bottom { + padding: 5px 0; + margin-top: 3px; +} + +.tooltip.left { + padding: 0 5px; + margin-left: -3px; +} + +.tooltip-inner { + max-width: 200px; + padding: 8px; + color: #ffffff; + text-align: center; + text-decoration: none; + background-color: #000000; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} + +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-top-color: #000000; + border-width: 5px 5px 0; +} + +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-right-color: #000000; + border-width: 5px 5px 5px 0; +} + +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-left-color: #000000; + border-width: 5px 0 5px 5px; +} + +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-bottom-color: #000000; + border-width: 0 5px 5px; +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1010; + display: none; + max-width: 276px; + padding: 1px; + text-align: left; + white-space: normal; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; +} + +.popover.top { + margin-top: -10px; +} + +.popover.right { + margin-left: 10px; +} + +.popover.bottom { + margin-top: 10px; +} + +.popover.left { + margin-left: -10px; +} + +.popover-title { + padding: 8px 14px; + margin: 0; + font-size: 14px; + font-weight: normal; + line-height: 18px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + -webkit-border-radius: 5px 5px 0 0; + -moz-border-radius: 5px 5px 0 0; + border-radius: 5px 5px 0 0; +} + +.popover-title:empty { + display: none; +} + +.popover-content { + padding: 9px 14px; +} + +.popover .arrow, +.popover .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} + +.popover .arrow { + border-width: 11px; +} + +.popover .arrow:after { + border-width: 10px; + content: ""; +} + +.popover.top .arrow { + bottom: -11px; + left: 50%; + margin-left: -11px; + border-top-color: #999; + border-top-color: rgba(0, 0, 0, 0.25); + border-bottom-width: 0; +} + +.popover.top .arrow:after { + bottom: 1px; + margin-left: -10px; + border-top-color: #ffffff; + border-bottom-width: 0; +} + +.popover.right .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-right-color: #999; + border-right-color: rgba(0, 0, 0, 0.25); + border-left-width: 0; +} + +.popover.right .arrow:after { + bottom: -10px; + left: 1px; + border-right-color: #ffffff; + border-left-width: 0; +} + +.popover.bottom .arrow { + top: -11px; + left: 50%; + margin-left: -11px; + border-bottom-color: #999; + border-bottom-color: rgba(0, 0, 0, 0.25); + border-top-width: 0; +} + +.popover.bottom .arrow:after { + top: 1px; + margin-left: -10px; + border-bottom-color: #ffffff; + border-top-width: 0; +} + +.popover.left .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-left-color: #999; + border-left-color: rgba(0, 0, 0, 0.25); + border-right-width: 0; +} + +.popover.left .arrow:after { + right: 1px; + bottom: -10px; + border-left-color: #ffffff; + border-right-width: 0; +} + +.thumbnails { + margin-left: -20px; + list-style: none; + *zoom: 1; +} + +.thumbnails:before, +.thumbnails:after { + display: table; + line-height: 0; + content: ""; +} + +.thumbnails:after { + clear: both; +} + +.row-fluid .thumbnails { + margin-left: 0; +} + +.thumbnails > li { + float: left; + margin-bottom: 20px; + margin-left: 20px; +} + +.thumbnail { + display: block; + padding: 4px; + line-height: 20px; + border: 1px solid #ddd; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} + +a.thumbnail:hover, +a.thumbnail:focus { + border-color: #2fa4e7; + -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); +} + +.thumbnail > img { + display: block; + max-width: 100%; + margin-right: auto; + margin-left: auto; +} + +.thumbnail .caption { + padding: 9px; + color: #555555; +} + +.media, +.media-body { + overflow: hidden; + *overflow: visible; + zoom: 1; +} + +.media, +.media .media { + margin-top: 15px; +} + +.media:first-child { + margin-top: 0; +} + +.media-object { + display: block; +} + +.media-heading { + margin: 0 0 5px; +} + +.media > .pull-left { + margin-right: 10px; +} + +.media > .pull-right { + margin-left: 10px; +} + +.media-list { + margin-left: 0; + list-style: none; +} + +.label, +.badge { + display: inline-block; + padding: 2px 4px; + font-size: 11.844px; + font-weight: bold; + line-height: 14px; + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + white-space: nowrap; + vertical-align: baseline; + background-color: #999999; +} + +.label { + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.badge { + padding-right: 9px; + padding-left: 9px; + -webkit-border-radius: 9px; + -moz-border-radius: 9px; + border-radius: 9px; +} + +.label:empty, +.badge:empty { + display: none; +} + +a.label:hover, +a.label:focus, +a.badge:hover, +a.badge:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} + +.label-important, +.badge-important { + background-color: #bd4247; +} + +.label-important[href], +.badge-important[href] { + background-color: #983538; +} + +.label-warning, +.badge-warning { + background-color: #dd5600; +} + +.label-warning[href], +.badge-warning[href] { + background-color: #aa4200; +} + +.label-success, +.badge-success { + background-color: #669533; +} + +.label-success[href], +.badge-success[href] { + background-color: #4c6f26; +} + +.label-info, +.badge-info { + background-color: #178acc; +} + +.label-info[href], +.badge-info[href] { + background-color: #126b9e; +} + +.label-inverse, +.badge-inverse { + background-color: #333333; +} + +.label-inverse[href], +.badge-inverse[href] { + background-color: #1a1a1a; +} + +.btn .label, +.btn .badge { + position: relative; + top: -1px; +} + +.btn-mini .label, +.btn-mini .badge { + top: 0; +} + +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-moz-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-ms-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-o-keyframes progress-bar-stripes { + from { + background-position: 0 0; + } + to { + background-position: 40px 0; + } +} + +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +.progress { + height: 20px; + margin-bottom: 20px; + overflow: hidden; + background-color: #f7f7f7; + background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); + background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9); + background-repeat: repeat-x; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0); + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); +} + +.progress .bar { + float: left; + width: 0; + height: 100%; + font-size: 12px; + color: #ffffff; + text-align: center; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #0e90d2; + background-image: -moz-linear-gradient(top, #149bdf, #0480be); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); + background-image: -webkit-linear-gradient(top, #149bdf, #0480be); + background-image: -o-linear-gradient(top, #149bdf, #0480be); + background-image: linear-gradient(to bottom, #149bdf, #0480be); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0); + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + -webkit-transition: width 0.6s ease; + -moz-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; +} + +.progress .bar + .bar { + -webkit-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -moz-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); +} + +.progress-striped .bar { + background-color: #149bdf; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + -moz-background-size: 40px 40px; + -o-background-size: 40px 40px; + background-size: 40px 40px; +} + +.progress.active .bar { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -moz-animation: progress-bar-stripes 2s linear infinite; + -ms-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} + +.progress-danger .bar, +.progress .bar-danger { + background-color: #dd514c; + background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); + background-image: linear-gradient(to bottom, #ee5f5b, #c43c35); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0); +} + +.progress-danger.progress-striped .bar, +.progress-striped .bar-danger { + background-color: #ee5f5b; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-success .bar, +.progress .bar-success { + background-color: #5eb95e; + background-image: -moz-linear-gradient(top, #62c462, #57a957); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); + background-image: -webkit-linear-gradient(top, #62c462, #57a957); + background-image: -o-linear-gradient(top, #62c462, #57a957); + background-image: linear-gradient(to bottom, #62c462, #57a957); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0); +} + +.progress-success.progress-striped .bar, +.progress-striped .bar-success { + background-color: #62c462; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-info .bar, +.progress .bar-info { + background-color: #4bb1cf; + background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); + background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); + background-image: -o-linear-gradient(top, #5bc0de, #339bb9); + background-image: linear-gradient(to bottom, #5bc0de, #339bb9); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0); +} + +.progress-info.progress-striped .bar, +.progress-striped .bar-info { + background-color: #5bc0de; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-warning .bar, +.progress .bar-warning { + background-color: #f16e1a; + background-image: -moz-linear-gradient(top, #ff7d2b, #dd5600); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ff7d2b), to(#dd5600)); + background-image: -webkit-linear-gradient(top, #ff7d2b, #dd5600); + background-image: -o-linear-gradient(top, #ff7d2b, #dd5600); + background-image: linear-gradient(to bottom, #ff7d2b, #dd5600); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff7d2b', endColorstr='#ffdd5600', GradientType=0); +} + +.progress-warning.progress-striped .bar, +.progress-striped .bar-warning { + background-color: #ff7d2b; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.accordion { + margin-bottom: 20px; +} + +.accordion-group { + margin-bottom: 2px; + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.accordion-heading { + border-bottom: 0; +} + +.accordion-heading .accordion-toggle { + display: block; + padding: 8px 15px; +} + +.accordion-toggle { + cursor: pointer; +} + +.accordion-inner { + padding: 9px 15px; + border-top: 1px solid #e5e5e5; +} + +.carousel { + position: relative; + margin-bottom: 20px; + line-height: 1; +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} + +.carousel-inner > .item { + position: relative; + display: none; + -webkit-transition: 0.6s ease-in-out left; + -moz-transition: 0.6s ease-in-out left; + -o-transition: 0.6s ease-in-out left; + transition: 0.6s ease-in-out left; +} + +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + line-height: 1; +} + +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} + +.carousel-inner > .active { + left: 0; +} + +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} + +.carousel-inner > .next { + left: 100%; +} + +.carousel-inner > .prev { + left: -100%; +} + +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} + +.carousel-inner > .active.left { + left: -100%; +} + +.carousel-inner > .active.right { + left: 100%; +} + +.carousel-control { + position: absolute; + top: 40%; + left: 15px; + width: 40px; + height: 40px; + margin-top: -20px; + font-size: 60px; + font-weight: 100; + line-height: 30px; + color: #ffffff; + text-align: center; + background: #222222; + border: 3px solid #ffffff; + -webkit-border-radius: 23px; + -moz-border-radius: 23px; + border-radius: 23px; + opacity: 0.5; + filter: alpha(opacity=50); +} + +.carousel-control.right { + right: 15px; + left: auto; +} + +.carousel-control:hover, +.carousel-control:focus { + color: #ffffff; + text-decoration: none; + opacity: 0.9; + filter: alpha(opacity=90); +} + +.carousel-indicators { + position: absolute; + top: 15px; + right: 15px; + z-index: 5; + margin: 0; + list-style: none; +} + +.carousel-indicators li { + display: block; + float: left; + width: 10px; + height: 10px; + margin-left: 5px; + text-indent: -999px; + background-color: #ccc; + background-color: rgba(255, 255, 255, 0.25); + border-radius: 5px; +} + +.carousel-indicators .active { + background-color: #fff; +} + +.carousel-caption { + position: absolute; + right: 0; + bottom: 0; + left: 0; + padding: 15px; + background: #333333; + background: rgba(0, 0, 0, 0.75); +} + +.carousel-caption h4, +.carousel-caption p { + line-height: 20px; + color: #ffffff; +} + +.carousel-caption h4 { + margin: 0 0 5px; +} + +.carousel-caption p { + margin-bottom: 0; +} + +.hero-unit { + padding: 60px; + margin-bottom: 30px; + font-size: 18px; + font-weight: 200; + line-height: 30px; + color: inherit; + background-color: #f5f5f5; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.hero-unit h1 { + margin-bottom: 0; + font-size: 60px; + line-height: 1; + letter-spacing: -1px; + color: inherit; +} + +.hero-unit li { + line-height: 30px; +} + +.pull-right { + float: right; +} + +.pull-left { + float: left; +} + +.hide { + display: none; +} + +.show { + display: block; +} + +.invisible { + visibility: hidden; +} + +.affix { + position: fixed; +} + +.navbar .brand { + padding: 14px 20px 16px; + font-family: 'ExoRegular'; + text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.2); +} + +.navbar li { + line-height: 20px; +} + +.navbar .nav > li > a { + padding: 16px 10px 14px; + font-family: 'ExoRegular'; + text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.2); +} + +.navbar .search-query { + line-height: normal; + border: 1px solid #178acc; +} + +.navbar .navbar-text { + padding: 19px 10px 18px; + line-height: 13px; + color: rgba(0, 0, 0, 0.5); + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.3); +} + +.navbar-inverse .navbar-search .search-query { + color: #555555; +} + +@media (min-width: 1200px) { + .modal:not(.small){ + width: 960px; + margin-left: -480px; + } +} +/* Portrait tablet to landscape and desktop */ +@media (min-width: 768px) and (max-width: 979px) { + .modal-body { + max-height: 330px; + } + .modal:not(.small){ + width: 760px; + margin-left: -380px; + } +} +/* Landscape phone to portrait tablet */ +@media (max-width: 767px) { + .modal-body { + max-height: 330px; + } +} + +/* Landscape phones and down */ +@media (max-width: 480px) { + .modal-body { + max-height: 330px; + } + .modal:not(.small){ + width: 460px; + margin-left: -230px; + } +} + +@media (max-width: 979px) { + .navbar .nav-collapse .nav li > a { + font-family: 'ExoRegular'; + font-weight: normal; + color: #ffffff; + text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.2); + } + .navbar .nav-collapse .nav li > a:hover { + background-color: #2B7CAC; + } + .navbar .nav-collapse .nav .active > a { + background-color: #2B7CAC; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + .navbar .nav-collapse .dropdown-menu li > a:hover, + .navbar .nav-collapse .dropdown-menu li > a:focus, + .navbar .nav-collapse .dropdown-submenu:hover > a { + background-image: none; + } + .navbar .nav-collapse .navbar-form, + .navbar .nav-collapse .navbar-search { + border: none; + } + .navbar .nav-collapse .nav-header { + color: #2B7CAC; + } + .navbar-inverse .nav-collapse .nav li > a { + color: #ffffff; + } + .navbar-inverse .nav-collapse .nav li > a:hover { + background-color: rgba(0, 0, 0, 0.1); + } + .navbar-inverse .nav-collapse .nav .active > a, + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:hover { + background-color: rgba(0, 0, 0, 0.1) !important; + } +} + +div.subnav { + font-family: 'ExoRegular'; + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.2); +} + +div.subnav-fixed { + top: 51px; +} + +.btn { + background-color: #ffffff; + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(5%, #ffffff), to(#ffffff)); + background-image: -webkit-linear-gradient(#ffffff, #ffffff 5%, #ffffff); + background-image: -moz-linear-gradient(top, #ffffff, #ffffff 5%, #ffffff); + background-image: -o-linear-gradient(#ffffff, #ffffff 5%, #ffffff); + background-image: linear-gradient(#ffffff, #ffffff 5%, #ffffff); + background-repeat: no-repeat; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffffffff', GradientType=0); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn:hover { + background-position: 0 0; +} + +.btn-primary { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #3daae9; + *background-color: #2fa4e7; + background-image: -moz-linear-gradient(top, #46aeea, #2fa4e7); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#46aeea), to(#2fa4e7)); + background-image: -webkit-linear-gradient(top, #46aeea, #2fa4e7); + background-image: -o-linear-gradient(top, #46aeea, #2fa4e7); + background-image: linear-gradient(to bottom, #46aeea, #2fa4e7); + background-repeat: repeat-x; + border-color: #2fa4e7 #2fa4e7 #157ab5; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff46aeea', endColorstr='#ff2fa4e7', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-primary:hover, +.btn-primary:focus, +.btn-primary:active, +.btn-primary.active, +.btn-primary.disabled, +.btn-primary[disabled] { + color: #ffffff; + background-color: #2fa4e7; + *background-color: #1a99e2; +} + +.btn-primary:active, +.btn-primary.active { + background-color: #178acc \9; +} + +.btn-info { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #9e6ab8; + *background-color: #9760b3; + background-image: -moz-linear-gradient(top, #a271bb, #9760b3); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#a271bb), to(#9760b3)); + background-image: -webkit-linear-gradient(top, #a271bb, #9760b3); + background-image: -o-linear-gradient(top, #a271bb, #9760b3); + background-image: linear-gradient(to bottom, #a271bb, #9760b3); + background-repeat: repeat-x; + border-color: #9760b3 #9760b3 #6f4086; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffa271bb', endColorstr='#ff9760b3', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-info:hover, +.btn-info:focus, +.btn-info:active, +.btn-info.active, +.btn-info.disabled, +.btn-info[disabled] { + color: #ffffff; + background-color: #9760b3; + *background-color: #8b51a9; +} + +.btn-info:active, +.btn-info.active { + background-color: #7d4898 \9; +} + +.btn-success { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #7bb33d; + *background-color: #73a839; + background-image: -moz-linear-gradient(top, #80bb3f, #73a839); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#80bb3f), to(#73a839)); + background-image: -webkit-linear-gradient(top, #80bb3f, #73a839); + background-image: -o-linear-gradient(top, #80bb3f, #73a839); + background-image: linear-gradient(to bottom, #80bb3f, #73a839); + background-repeat: repeat-x; + border-color: #73a839 #73a839 #4c6f26; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff80bb3f', endColorstr='#ff73a839', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-success:hover, +.btn-success:focus, +.btn-success:active, +.btn-success.active, +.btn-success.disabled, +.btn-success[disabled] { + color: #ffffff; + background-color: #73a839; + *background-color: #669533; +} + +.btn-success:active, +.btn-success.active { + background-color: #59822c \9; +} + +.btn-warning { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #ec5c00; + *background-color: #dd5600; + background-image: -moz-linear-gradient(top, #f76000, #dd5600); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f76000), to(#dd5600)); + background-image: -webkit-linear-gradient(top, #f76000, #dd5600); + background-image: -o-linear-gradient(top, #f76000, #dd5600); + background-image: linear-gradient(to bottom, #f76000, #dd5600); + background-repeat: repeat-x; + border-color: #dd5600 #dd5600 #913800; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff76000', endColorstr='#ffdd5600', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-warning:hover, +.btn-warning:focus, +.btn-warning:active, +.btn-warning.active, +.btn-warning.disabled, +.btn-warning[disabled] { + color: #ffffff; + background-color: #dd5600; + *background-color: #c44c00; +} + +.btn-warning:active, +.btn-warning.active { + background-color: #aa4200 \9; +} + +.btn-danger { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #d41e24; + *background-color: #c71c22; + background-image: -moz-linear-gradient(top, #dd1f26, #c71c22); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#dd1f26), to(#c71c22)); + background-image: -webkit-linear-gradient(top, #dd1f26, #c71c22); + background-image: -o-linear-gradient(top, #dd1f26, #c71c22); + background-image: linear-gradient(to bottom, #dd1f26, #c71c22); + background-repeat: repeat-x; + border-color: #c71c22 #c71c22 #841317; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdd1f26', endColorstr='#ffc71c22', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-danger:hover, +.btn-danger:focus, +.btn-danger:active, +.btn-danger.active, +.btn-danger.disabled, +.btn-danger[disabled] { + color: #ffffff; + background-color: #c71c22; + *background-color: #b1191e; +} + +.btn-danger:active, +.btn-danger.active { + background-color: #9a161a \9; +} + +.btn-inverse { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #034482; + *background-color: #033c73; + background-image: -moz-linear-gradient(top, #04498c, #033c73); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#04498c), to(#033c73)); + background-image: -webkit-linear-gradient(top, #04498c, #033c73); + background-image: -o-linear-gradient(top, #04498c, #033c73); + background-image: linear-gradient(to bottom, #04498c, #033c73); + background-repeat: repeat-x; + border-color: #033c73 #033c73 #011528; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff04498c', endColorstr='#ff033c73', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-inverse:hover, +.btn-inverse:focus, +.btn-inverse:active, +.btn-inverse.active, +.btn-inverse.disabled, +.btn-inverse[disabled] { + color: #ffffff; + background-color: #033c73; + *background-color: #022f5a; +} + +.btn-inverse:active, +.btn-inverse.active { + background-color: #022241 \9; +} + +i[class^="icon-"] { + opacity: 0.8; +} + +.pull-right { + float: right; +} + +.pull-left { + float: left; +} + +.hide { + display: none; +} + +.show { + display: block; +} + +.invisible { + visibility: hidden; +} + +.affix { + position: fixed; +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/css/bootstrap.min.css b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/css/bootstrap.min.css new file mode 100644 index 0000000000000000000000000000000000000000..0ac6a7f4369ecc0227ef41f38d7ac0de968d0754 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/css/bootstrap.min.css @@ -0,0 +1,9 @@ +@import url(//fonts.googleapis.com/css?family=Telex);/*! + * Bootstrap v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#555;background-color:#fff}a{color:#2fa4e7;text-decoration:none}a:hover,a:focus{color:#157ab5;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}a.muted:hover,a.muted:focus{color:#808080}.text-warning{color:#dd5600}a.text-warning:hover,a.text-warning:focus{color:#aa4200}.text-error{color:#bd4247}a.text-error:hover,a.text-error:focus{color:#983538}.text-info{color:#178acc}a.text-info:hover,a.text-info:focus{color:#126b9e}.text-success{color:#669533}a.text-success:hover,a.text-success:focus{color:#4c6f26}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:'Telex',sans-serif;font-weight:bold;line-height:20px;color:#317eac;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{line-height:40px}h1{font-size:38.5px}h2{font-size:31.5px}h3{font-size:24.5px}h4{font-size:17.5px}h5{font-size:14px}h6{font-size:11.9px}h1 small{font-size:24.5px}h2 small{font-size:17.5px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #f5f5f5}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #f5f5f5;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #f5f5f5}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #f5f5f5;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Menlo,Monaco,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555;vertical-align:middle;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:20px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#f5f5f5}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#dd5600}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#dd5600}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#dd5600;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#aa4200;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ff8d44;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ff8d44;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ff8d44}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#dd5600;background-color:#f1ceab;border-color:#dd5600}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#bd4247}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#bd4247}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#bd4247;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#983538;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d88e90;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d88e90;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d88e90}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#bd4247;background-color:#f2bdb1;border-color:#bd4247}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#669533}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#669533}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#669533;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#4c6f26;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #99ca63;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #99ca63;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #99ca63}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#669533;background-color:#d5ecbf;border-color:#669533}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#178acc}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#178acc}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#178acc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#126b9e;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #5db8ec;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #5db8ec;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #5db8ec}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#178acc;background-color:#a7dff1;border-color:#178acc}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#7b7b7b}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:14px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#f5f5f5;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#bede9c;border-color:#73a839}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#f5f5f5}table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success>td{background-color:#d5ecbf}.table tbody tr.error>td{background-color:#f2bdb1}.table tbody tr.warning>td{background-color:#f1ceab}.table tbody tr.info>td{background-color:#a7dff1}.table-hover tbody tr.success:hover>td{background-color:#c8e6ab}.table-hover tbody tr.error:hover>td{background-color:#eeab9b}.table-hover tbody tr.warning:hover>td{background-color:#edc195}.table-hover tbody tr.info:hover>td{background-color:#91d7ee}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{width:16px;background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#fff;text-decoration:none;background-color:#27a0e5;background-image:-moz-linear-gradient(top,#2fa4e7,#1a99e2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#2fa4e7),to(#1a99e2));background-image:-webkit-linear-gradient(top,#2fa4e7,#1a99e2);background-image:-o-linear-gradient(top,#2fa4e7,#1a99e2);background-image:linear-gradient(to bottom,#2fa4e7,#1a99e2);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2fa4e7',endColorstr='#ff1a99e2',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#27a0e5;background-image:-moz-linear-gradient(top,#2fa4e7,#1a99e2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#2fa4e7),to(#1a99e2));background-image:-webkit-linear-gradient(top,#2fa4e7,#1a99e2);background-image:-o-linear-gradient(top,#2fa4e7,#1a99e2);background-image:linear-gradient(to bottom,#2fa4e7,#1a99e2);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2fa4e7',endColorstr='#ff1a99e2',GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open{*z-index:1000}.open>.dropdown-menu{display:block}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #ccc;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#2f92e7;*background-color:#2f76e7;background-image:-moz-linear-gradient(top,#2fa4e7,#2f76e7);background-image:-webkit-gradient(linear,0 0,0 100%,from(#2fa4e7),to(#2f76e7));background-image:-webkit-linear-gradient(top,#2fa4e7,#2f76e7);background-image:-o-linear-gradient(top,#2fa4e7,#2f76e7);background-image:linear-gradient(to bottom,#2fa4e7,#2f76e7);background-repeat:repeat-x;border-color:#2f76e7 #2f76e7 #1553b5;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2fa4e7',endColorstr='#ff2f76e7',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#2f76e7;*background-color:#1a67e2}.btn-primary:active,.btn-primary.active{background-color:#175dcc \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#dd5600;*background-color:#dd5600;background-image:-moz-linear-gradient(top,#dd5600,#dd5600);background-image:-webkit-gradient(linear,0 0,0 100%,from(#dd5600),to(#dd5600));background-image:-webkit-linear-gradient(top,#dd5600,#dd5600);background-image:-o-linear-gradient(top,#dd5600,#dd5600);background-image:linear-gradient(to bottom,#dd5600,#dd5600);background-repeat:repeat-x;border-color:#dd5600 #dd5600 #913800;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdd5600',endColorstr='#ffdd5600',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#dd5600;*background-color:#c44c00}.btn-warning:active,.btn-warning.active{background-color:#aa4200 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#c32627;*background-color:#bd362f;background-image:-moz-linear-gradient(top,#c71c22,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#c71c22),to(#bd362f));background-image:-webkit-linear-gradient(top,#c71c22,#bd362f);background-image:-o-linear-gradient(top,#c71c22,#bd362f);background-image:linear-gradient(to bottom,#c71c22,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffc71c22',endColorstr='#ffbd362f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#65a643;*background-color:#51a351;background-image:-moz-linear-gradient(top,#73a839,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#73a839),to(#51a351));background-image:-webkit-linear-gradient(top,#73a839,#51a351);background-image:-o-linear-gradient(top,#73a839,#51a351);background-image:linear-gradient(to bottom,#73a839,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff73a839',endColorstr='#ff51a351',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#6d76b3;*background-color:#2f96b4;background-image:-moz-linear-gradient(top,#9760b3,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#9760b3),to(#2f96b4));background-image:-webkit-linear-gradient(top,#9760b3,#2f96b4);background-image:-o-linear-gradient(top,#9760b3,#2f96b4);background-image:linear-gradient(to bottom,#9760b3,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff9760b3',endColorstr='#ff2f96b4',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0f3253;*background-color:#222;background-image:-moz-linear-gradient(top,#033c73,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#033c73),to(#222));background-image:-webkit-linear-gradient(top,#033c73,#222);background-image:-o-linear-gradient(top,#033c73,#222);background-image:linear-gradient(to bottom,#033c73,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff033c73',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#2fa4e7;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#157ab5;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#333;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:14px}.btn-group>.btn-mini{font-size:10.5px}.btn-group>.btn-small{font-size:11.9px}.btn-group>.btn-large{font-size:17.5px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#2f76e7}.btn-group.open .btn-warning.dropdown-toggle{background-color:#dd5600}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#f1ceab;border:1px solid #efb99e;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert,.alert h4{color:#dd5600}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#669533;background-color:#d5ecbf;border-color:#d2e6ab}.alert-success h4{color:#669533}.alert-danger,.alert-error{color:#bd4247;background-color:#f2bdb1;border-color:#f0a5a4}.alert-danger h4,.alert-error h4{color:#bd4247}.alert-info{color:#178acc;background-color:#a7dff1;border-color:#88e4ec}.alert-info h4{color:#178acc}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#f5f5f5}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#2fa4e7}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#f5f5f5 #f5f5f5 #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#fff;background-color:#2fa4e7}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#2fa4e7;border-bottom-color:#2fa4e7}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#157ab5;border-bottom-color:#157ab5}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#f5f5f5 #ddd #f5f5f5 #f5f5f5}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#f5f5f5 #f5f5f5 #f5f5f5 #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible}.navbar-inner{min-height:50px;padding-right:20px;padding-left:20px;background-color:#45aeea;background-image:-moz-linear-gradient(top,#54b4eb,#2fa4e7);background-image:-webkit-gradient(linear,0 0,0 100%,from(#54b4eb),to(#2fa4e7));background-image:-webkit-linear-gradient(top,#54b4eb,#2fa4e7);background-image:-o-linear-gradient(top,#54b4eb,#2fa4e7);background-image:linear-gradient(to bottom,#54b4eb,#2fa4e7);background-repeat:repeat-x;border:1px solid #1990d5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff54b4eb',endColorstr='#ff2fa4e7',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:15px 20px 15px;margin-left:-20px;font-size:20px;font-weight:200;color:#fff;text-shadow:0 1px 0 #54b4eb}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:50px;color:#f5f5f5}.navbar-link{color:#fff}.navbar-link:hover,.navbar-link:focus{color:#fff}.navbar .divider-vertical{height:50px;margin:0 9px;border-right:1px solid #54b4eb;border-left:1px solid #2fa4e7}.navbar .btn,.navbar .btn-group{margin-top:10px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:10px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:10px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,0.1);box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:15px 15px 15px;color:#fff;text-decoration:none;text-shadow:0 1px 0 #54b4eb}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#fff;text-decoration:none;background-color:#1684c2}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#fff;text-decoration:none;background-color:#1684c2;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#2fa3e6;*background-color:#1a99e2;background-image:-moz-linear-gradient(top,#3daae9,#1a99e2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#3daae9),to(#1a99e2));background-image:-webkit-linear-gradient(top,#3daae9,#1a99e2);background-image:-o-linear-gradient(top,#3daae9,#1a99e2);background-image:linear-gradient(to bottom,#3daae9,#1a99e2);background-repeat:repeat-x;border-color:#1a99e2 #1a99e2 #126b9e;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3daae9',endColorstr='#ff1a99e2',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#1a99e2;*background-color:#178acc}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#157ab5 \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#1684c2}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#034482;background-image:-moz-linear-gradient(top,#04498c,#033c73);background-image:-webkit-gradient(linear,0 0,0 100%,from(#04498c),to(#033c73));background-image:-webkit-linear-gradient(top,#04498c,#033c73);background-image:-o-linear-gradient(top,#04498c,#033c73);background-image:linear-gradient(to bottom,#04498c,#033c73);background-repeat:repeat-x;border-color:#033464;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff04498c',endColorstr='#ff033c73',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#fff}.navbar-inverse .navbar-text{color:#fff}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:#022c55}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#022c55}.navbar-inverse .navbar-link{color:#fff}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#04498c;border-left-color:#033c73}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#022c55}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#fff;border-color:#033c73;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#999}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#999}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#999}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#033769;*background-color:#022f5a;background-image:-moz-linear-gradient(top,#033c73,#022f5a);background-image:-webkit-gradient(linear,0 0,0 100%,from(#033c73),to(#022f5a));background-image:-webkit-linear-gradient(top,#033c73,#022f5a);background-image:-o-linear-gradient(top,#033c73,#022f5a);background-image:linear-gradient(to bottom,#033c73,#022f5a);background-repeat:repeat-x;border-color:#022f5a #022f5a #000810;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff033c73',endColorstr='#ff022f5a',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#022f5a;*background-color:#022241}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#011528 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb>li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5}.pagination ul>.active>a,.pagination ul>.active>span{color:#999;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#999;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:10.5px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1020;display:block;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#2fa4e7;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.media,.media-body{overflow:hidden;*overflow:visible;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{margin-left:0;list-style:none}.label,.badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#bd4247}.label-important[href],.badge-important[href]{background-color:#983538}.label-warning,.badge-warning{background-color:#dd5600}.label-warning[href],.badge-warning[href]{background-color:#aa4200}.label-success,.badge-success{background-color:#669533}.label-success[href],.badge-success[href]{background-color:#4c6f26}.label-info,.badge-info{background-color:#178acc}.label-info[href],.badge-info[href]{background-color:#126b9e}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#f16e1a;background-image:-moz-linear-gradient(top,#ff7d2b,#dd5600);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ff7d2b),to(#dd5600));background-image:-webkit-linear-gradient(top,#ff7d2b,#dd5600);background-image:-o-linear-gradient(top,#ff7d2b,#dd5600);background-image:linear-gradient(to bottom,#ff7d2b,#dd5600);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff7d2b',endColorstr='#ffdd5600',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#ff7d2b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255,255,255,0.25);border-radius:5px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#f5f5f5;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}.navbar .brand{padding:14px 20px 16px;font-family:'Telex',sans-serif;text-shadow:1px 1px 0 rgba(0,0,0,0.2)}.navbar li{line-height:20px}.navbar .nav>li>a{padding:16px 10px 14px;font-family:'Telex',sans-serif;text-shadow:1px 1px 0 rgba(0,0,0,0.2)}.navbar .search-query{line-height:normal;border:1px solid #178acc}.navbar .navbar-text{padding:19px 10px 18px;line-height:13px;color:rgba(0,0,0,0.5);text-shadow:1px 1px 0 rgba(255,255,255,0.3)}.navbar-inverse .navbar-search .search-query{color:#555}@media(max-width:979px){.navbar .nav-collapse .nav li>a{font-family:'Telex',sans-serif;font-weight:normal;color:#fff;text-shadow:1px 1px 0 rgba(0,0,0,0.2)}.navbar .nav-collapse .nav li>a:hover{background-color:#2b7cac}.navbar .nav-collapse .nav .active>a{background-color:#2b7cac;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.navbar .nav-collapse .dropdown-menu li>a:hover,.navbar .nav-collapse .dropdown-menu li>a:focus,.navbar .nav-collapse .dropdown-submenu:hover>a{background-image:none}.navbar .nav-collapse .navbar-form,.navbar .nav-collapse .navbar-search{border:0}.navbar .nav-collapse .nav-header{color:#2b7cac}.navbar-inverse .nav-collapse .nav li>a{color:#fff}.navbar-inverse .nav-collapse .nav li>a:hover{background-color:rgba(0,0,0,0.1)}.navbar-inverse .nav-collapse .nav .active>a,.navbar-inverse .nav-collapse .nav>li>a:hover,.navbar-inverse .nav-collapse .dropdown-menu a:hover{background-color:rgba(0,0,0,0.1)!important}}div.subnav{font-family:'Telex',sans-serif;text-shadow:1px 1px 0 rgba(255,255,255,0.2)}div.subnav-fixed{top:51px}.btn{background-color:#fff;background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),color-stop(5%,#fff),to(#fff));background-image:-webkit-linear-gradient(#fff,#fff 5%,#fff);background-image:-moz-linear-gradient(top,#fff,#fff 5%,#fff);background-image:-o-linear-gradient(#fff,#fff 5%,#fff);background-image:linear-gradient(#fff,#fff 5%,#fff);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffffffff',GradientType=0);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover{background-position:0 0}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#3daae9;*background-color:#2fa4e7;background-image:-moz-linear-gradient(top,#46aeea,#2fa4e7);background-image:-webkit-gradient(linear,0 0,0 100%,from(#46aeea),to(#2fa4e7));background-image:-webkit-linear-gradient(top,#46aeea,#2fa4e7);background-image:-o-linear-gradient(top,#46aeea,#2fa4e7);background-image:linear-gradient(to bottom,#46aeea,#2fa4e7);background-repeat:repeat-x;border-color:#2fa4e7 #2fa4e7 #157ab5;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff46aeea',endColorstr='#ff2fa4e7',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#2fa4e7;*background-color:#1a99e2}.btn-primary:active,.btn-primary.active{background-color:#178acc \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#9e6ab8;*background-color:#9760b3;background-image:-moz-linear-gradient(top,#a271bb,#9760b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#a271bb),to(#9760b3));background-image:-webkit-linear-gradient(top,#a271bb,#9760b3);background-image:-o-linear-gradient(top,#a271bb,#9760b3);background-image:linear-gradient(to bottom,#a271bb,#9760b3);background-repeat:repeat-x;border-color:#9760b3 #9760b3 #6f4086;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffa271bb',endColorstr='#ff9760b3',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#9760b3;*background-color:#8b51a9}.btn-info:active,.btn-info.active{background-color:#7d4898 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#7bb33d;*background-color:#73a839;background-image:-moz-linear-gradient(top,#80bb3f,#73a839);background-image:-webkit-gradient(linear,0 0,0 100%,from(#80bb3f),to(#73a839));background-image:-webkit-linear-gradient(top,#80bb3f,#73a839);background-image:-o-linear-gradient(top,#80bb3f,#73a839);background-image:linear-gradient(to bottom,#80bb3f,#73a839);background-repeat:repeat-x;border-color:#73a839 #73a839 #4c6f26;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff80bb3f',endColorstr='#ff73a839',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#73a839;*background-color:#669533}.btn-success:active,.btn-success.active{background-color:#59822c \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ec5c00;*background-color:#dd5600;background-image:-moz-linear-gradient(top,#f76000,#dd5600);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f76000),to(#dd5600));background-image:-webkit-linear-gradient(top,#f76000,#dd5600);background-image:-o-linear-gradient(top,#f76000,#dd5600);background-image:linear-gradient(to bottom,#f76000,#dd5600);background-repeat:repeat-x;border-color:#dd5600 #dd5600 #913800;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff76000',endColorstr='#ffdd5600',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#dd5600;*background-color:#c44c00}.btn-warning:active,.btn-warning.active{background-color:#aa4200 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#d41e24;*background-color:#c71c22;background-image:-moz-linear-gradient(top,#dd1f26,#c71c22);background-image:-webkit-gradient(linear,0 0,0 100%,from(#dd1f26),to(#c71c22));background-image:-webkit-linear-gradient(top,#dd1f26,#c71c22);background-image:-o-linear-gradient(top,#dd1f26,#c71c22);background-image:linear-gradient(to bottom,#dd1f26,#c71c22);background-repeat:repeat-x;border-color:#c71c22 #c71c22 #841317;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdd1f26',endColorstr='#ffc71c22',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#c71c22;*background-color:#b1191e}.btn-danger:active,.btn-danger.active{background-color:#9a161a \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#034482;*background-color:#033c73;background-image:-moz-linear-gradient(top,#04498c,#033c73);background-image:-webkit-gradient(linear,0 0,0 100%,from(#04498c),to(#033c73));background-image:-webkit-linear-gradient(top,#04498c,#033c73);background-image:-o-linear-gradient(top,#04498c,#033c73);background-image:linear-gradient(to bottom,#04498c,#033c73);background-repeat:repeat-x;border-color:#033c73 #033c73 #011528;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff04498c',endColorstr='#ff033c73',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#033c73;*background-color:#022f5a}.btn-inverse:active,.btn-inverse.active{background-color:#022241 \9}i[class^="icon-"]{opacity:.8}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed} \ No newline at end of file diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/css/default.css b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/css/default.css new file mode 100644 index 0000000000000000000000000000000000000000..40a5622fff6496f4d066e4f180f0d760b555b3e9 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/css/default.css @@ -0,0 +1,170 @@ +body { + color: #868686; + background: #32C2CD url(../img/bg-default.jpg) !important; +} +#main-content { + box-shadow: 0 0 10px #757575; + -moz-box-shadow: 0 0 10px #757575; + -webkit-box-shadow:0 0 10px #757575 ; +} +a, a:hover { + text-shadow: none !important; + color: #22878E; +} +ul.faq-list li a:hover, ul.faq-list li a.active{ + background: #22C0CB; +} +#header.navbar-inverse .navbar-inner { + background:#4e4e4e url("../img/top-bg.jpg") repeat-x !important; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#4e4e4e',endColorstr='#4e4e4e',GradientType=0) + border-width: 0; +} + +#header .navbar-inner .nav .dropdown-toggle:hover, +#header .navbar-inner .nav .dropdown-toggle:focus, +.navbar-inner .nav .dropdown.open .dropdown-toggle { + background-color: #333 !important; + border-radius: 4px 4px 4px 4px; +} + +#header.navbar-inverse .divider-vertical { + border-left-color: #2c2d2f; + border-right-color: #181a1b; +} + +#sidebar > ul > li > a { + color: #fff !important; +} + +#sidebar > ul > li a i { + color: #fff !important; +} + +#sidebar > ul > li >a:hover, #sidebar > ul > li:hover>a { + color: #fff !important; + background: url("../img/side-bar-list-bg.png"); +} + +#sidebar > ul > li.active > a{ + background: url("../img/side-bar-list-bg.png"); +} + +#sidebar > ul > li > ul.sub > li > a { + color: #fff; +} + +.dropdown-menu li > a:hover, .dropdown-menu .active > a, .dropdown-menu .active > a:hover { + background-color: #EEEEEE; + background-image: none; + color: #333333; + filter: none; + text-decoration: none; +} + +#sidebar > ul > li > ul.sub > li { + border-bottom: 1px solid #3393A2; +} + +#sidebar > ul > li > ul.sub > li:last-child { + border-bottom:none; +} + +.chats li.out .name { + color: #b14c4c; +} + +.chats li.in .message { + border-left: 2px solid #2f8e95; +} + +.chats li.in .message .arrow { + border-right: 8px solid #2f8e95; +} + +.chats li.out .message .arrow { + border-left: 8px solid #b14c4c; +} + +.chats li.out .message { + border-right: 2px solid #b14c4c; +} + +/* Landscape phone to portrait tablet */ +@media (max-width:979px) { + #sidebar { + } + + #sidebar > ul > li > a { + border-bottom: 1px solid #30c1cb !important; + } + + #sidebar > ul > li.active > a, #sidebar > ul > li:hover > a, #sidebar > ul > li > a:hover { + border-bottom: 1px solid #30c1cb !important; + } +} + +/*----*/ + +/*lock*/ + +.lock-avatar-row, .lock-form-row .tarquoise { + background: #30c1cb; +} + +.lock-avatar-row img { + border:10px solid #5aced6; +} + +.lock-identity span { + color:#30c1cb;; +} + +.lock-form-row .tarquoise { + border:1px solid #30c1cb !important; +} + +/*coming soon*/ + +.coming-soon .input-append .submit-btn { + background: #2fbfca; + color: #195e63; +} + +.twt-color , .twt-color:hover, .blog .date .day{ + color: #2fbfca !important; +} + +ul.social-link li a:hover, .blog .date .month { + background: #2fbfca; +} + + +/*blog*/ + +.blog .date { + border: 1px solid #2fc0ca; +} + +.blog ul li a:hover, .blog-side-bar ul li a:hover { color: #2fc0ca; text-decoration: none;} + +.blog .btn:hover { + background: #2fc0ca; +} + +.blog-side-bar ul.tag li a { + background: #2fc0ca; +} + +/*invoice-list*/ + + +.invoice-list h5 { + color: #2fc0ca; +} + +/*about us*/ + +.about-us h4, .team-member h3, .team-member ul li a:hover, .contact-us h4 { + color: #2badb6; +} + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/css/font-awesome.css b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/css/font-awesome.css new file mode 100644 index 0000000000000000000000000000000000000000..7ede1828a78bfec88156294dbb810c23ed85ca9d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/css/font-awesome.css @@ -0,0 +1,1479 @@ +/*! + * Font Awesome 3.2.1 + * the iconic font designed for Bootstrap + * ------------------------------------------------------------------------------ + * The full suite of pictographic icons, examples, and documentation can be + * found at http://fontawesome.io. Stay up to date on Twitter at + * http://twitter.com/fontawesome. + * + * License + * ------------------------------------------------------------------------------ + * - The Font Awesome font is licensed under SIL OFL 1.1 - + * http://scripts.sil.org/OFL + * - Font Awesome CSS, LESS, and SASS files are licensed under MIT License - + * http://opensource.org/licenses/mit-license.html + * - Font Awesome documentation licensed under CC BY 3.0 - + * http://creativecommons.org/licenses/by/3.0/ + * - Attribution is no longer required in Font Awesome 3.0, but much appreciated: + * "Font Awesome by Dave Gandy - http://fontawesome.io" + * + * Author - Dave Gandy + * ------------------------------------------------------------------------------ + * Email: dave@fontawesome.io + * Twitter: http://twitter.com/davegandy + * Work: Lead Product Designer @ Kyruus - http://kyruus.com + */ +/* FONT PATH + * -------------------------- */ +@font-face { + font-family: 'FontAwesome'; + src: url('../font/fontawesome-webfont.eot?v=3.2.1'); + src: url('../font/fontawesome-webfont.eot?#iefix&v=3.2.1') format('embedded-opentype'), url('../font/fontawesome-webfont.woff?v=3.2.1') format('woff'), url('../font/fontawesome-webfont.ttf?v=3.2.1') format('truetype'), url('../font/fontawesome-webfont.svg#fontawesomeregular?v=3.2.1') format('svg'); + font-weight: normal; + font-style: normal; +} +/* FONT AWESOME CORE + * -------------------------- */ +[class^="icon-"], +[class*=" icon-"] { + font-family: FontAwesome; + font-weight: normal; + font-style: normal; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + *margin-right: .3em; +} +[class^="icon-"]:before, +[class*=" icon-"]:before { + text-decoration: inherit; + display: inline-block; + speak: none; +} +/* makes the font 33% larger relative to the icon container */ +.icon-large:before { + vertical-align: -10%; + font-size: 1.3333333333333333em; +} +/* makes sure icons active on rollover in links */ +a [class^="icon-"], +a [class*=" icon-"] { + display: inline; +} +/* increased font size for icon-large */ +[class^="icon-"].icon-fixed-width, +[class*=" icon-"].icon-fixed-width { + display: inline-block; + width: 1.1428571428571428em; + text-align: right; + padding-right: 0.2857142857142857em; +} +[class^="icon-"].icon-fixed-width.icon-large, +[class*=" icon-"].icon-fixed-width.icon-large { + width: 1.4285714285714286em; +} +.icons-ul { + margin-left: 2.142857142857143em; + list-style-type: none; +} +.icons-ul > li { + position: relative; +} +.icons-ul .icon-li { + position: absolute; + left: -2.142857142857143em; + width: 2.142857142857143em; + text-align: center; + line-height: inherit; +} +[class^="icon-"].hide, +[class*=" icon-"].hide { + display: none; +} +.icon-muted { + color: #eeeeee; +} +.icon-light { + color: #ffffff; +} +.icon-dark { + color: #333333; +} +.icon-border { + border: solid 1px #eeeeee; + padding: .2em .25em .15em; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +.icon-2x { + font-size: 2em; +} +.icon-2x.icon-border { + border-width: 2px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.icon-3x { + font-size: 3em; +} +.icon-3x.icon-border { + border-width: 3px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} +.icon-4x { + font-size: 4em; +} +.icon-4x.icon-border { + border-width: 4px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} +.icon-5x { + font-size: 5em; +} +.icon-5x.icon-border { + border-width: 5px; + -webkit-border-radius: 7px; + -moz-border-radius: 7px; + border-radius: 7px; +} +.pull-right { + float: right; +} +.pull-left { + float: left; +} +[class^="icon-"].pull-left, +[class*=" icon-"].pull-left { + margin-right: .3em; +} +[class^="icon-"].pull-right, +[class*=" icon-"].pull-right { + margin-left: .3em; +} +/* BOOTSTRAP SPECIFIC CLASSES + * -------------------------- */ +/* Bootstrap 2.0 sprites.less reset */ +[class^="icon-"], +[class*=" icon-"] { + display: inline; + width: auto; + height: auto; + line-height: normal; + vertical-align: baseline; + background-image: none; + background-position: 0% 0%; + background-repeat: repeat; + margin-top: 0; +} +/* more sprites.less reset */ +.icon-white, +.nav-pills > .active > a > [class^="icon-"], +.nav-pills > .active > a > [class*=" icon-"], +.nav-list > .active > a > [class^="icon-"], +.nav-list > .active > a > [class*=" icon-"], +.navbar-inverse .nav > .active > a > [class^="icon-"], +.navbar-inverse .nav > .active > a > [class*=" icon-"], +.dropdown-menu > li > a:hover > [class^="icon-"], +.dropdown-menu > li > a:hover > [class*=" icon-"], +.dropdown-menu > .active > a > [class^="icon-"], +.dropdown-menu > .active > a > [class*=" icon-"], +.dropdown-submenu:hover > a > [class^="icon-"], +.dropdown-submenu:hover > a > [class*=" icon-"] { + background-image: none; +} +/* keeps Bootstrap styles with and without icons the same */ +.btn [class^="icon-"].icon-large, +.nav [class^="icon-"].icon-large, +.btn [class*=" icon-"].icon-large, +.nav [class*=" icon-"].icon-large { + line-height: .9em; +} +.btn [class^="icon-"].icon-spin, +.nav [class^="icon-"].icon-spin, +.btn [class*=" icon-"].icon-spin, +.nav [class*=" icon-"].icon-spin { + display: inline-block; +} +.nav-tabs [class^="icon-"], +.nav-pills [class^="icon-"], +.nav-tabs [class*=" icon-"], +.nav-pills [class*=" icon-"], +.nav-tabs [class^="icon-"].icon-large, +.nav-pills [class^="icon-"].icon-large, +.nav-tabs [class*=" icon-"].icon-large, +.nav-pills [class*=" icon-"].icon-large { + line-height: .9em; +} +.btn [class^="icon-"].pull-left.icon-2x, +.btn [class*=" icon-"].pull-left.icon-2x, +.btn [class^="icon-"].pull-right.icon-2x, +.btn [class*=" icon-"].pull-right.icon-2x { + margin-top: .18em; +} +.btn [class^="icon-"].icon-spin.icon-large, +.btn [class*=" icon-"].icon-spin.icon-large { + line-height: .8em; +} +.btn.btn-small [class^="icon-"].pull-left.icon-2x, +.btn.btn-small [class*=" icon-"].pull-left.icon-2x, +.btn.btn-small [class^="icon-"].pull-right.icon-2x, +.btn.btn-small [class*=" icon-"].pull-right.icon-2x { + margin-top: .25em; +} +.btn.btn-large [class^="icon-"], +.btn.btn-large [class*=" icon-"] { + margin-top: 0; +} +.btn.btn-large [class^="icon-"].pull-left.icon-2x, +.btn.btn-large [class*=" icon-"].pull-left.icon-2x, +.btn.btn-large [class^="icon-"].pull-right.icon-2x, +.btn.btn-large [class*=" icon-"].pull-right.icon-2x { + margin-top: .05em; +} +.btn.btn-large [class^="icon-"].pull-left.icon-2x, +.btn.btn-large [class*=" icon-"].pull-left.icon-2x { + margin-right: .2em; +} +.btn.btn-large [class^="icon-"].pull-right.icon-2x, +.btn.btn-large [class*=" icon-"].pull-right.icon-2x { + margin-left: .2em; +} +/* Fixes alignment in nav lists */ +.nav-list [class^="icon-"], +.nav-list [class*=" icon-"] { + line-height: inherit; +} +/* EXTRAS + * -------------------------- */ +/* Stacked and layered icon */ +.icon-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: -35%; +} +.icon-stack [class^="icon-"], +.icon-stack [class*=" icon-"] { + display: block; + text-align: center; + position: absolute; + width: 100%; + height: 100%; + font-size: 1em; + line-height: inherit; + *line-height: 2em; +} +.icon-stack .icon-stack-base { + font-size: 2em; + *line-height: 1em; +} +/* Animated rotating icon */ +.icon-spin { + display: inline-block; + -moz-animation: spin 2s infinite linear; + -o-animation: spin 2s infinite linear; + -webkit-animation: spin 2s infinite linear; + animation: spin 2s infinite linear; +} +/* Prevent stack and spinners from being taken inline when inside a link */ +a .icon-stack, +a .icon-spin { + display: inline-block; + text-decoration: none; +} +@-moz-keyframes spin { + 0% { + -moz-transform: rotate(0deg); + } + 100% { + -moz-transform: rotate(359deg); + } +} +@-webkit-keyframes spin { + 0% { + -webkit-transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + } +} +@-o-keyframes spin { + 0% { + -o-transform: rotate(0deg); + } + 100% { + -o-transform: rotate(359deg); + } +} +@-ms-keyframes spin { + 0% { + -ms-transform: rotate(0deg); + } + 100% { + -ms-transform: rotate(359deg); + } +} +@keyframes spin { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(359deg); + } +} +/* Icon rotations and mirroring */ +.icon-rotate-90:before { + -webkit-transform: rotate(90deg); + -moz-transform: rotate(90deg); + -ms-transform: rotate(90deg); + -o-transform: rotate(90deg); + transform: rotate(90deg); + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); +} +.icon-rotate-180:before { + -webkit-transform: rotate(180deg); + -moz-transform: rotate(180deg); + -ms-transform: rotate(180deg); + -o-transform: rotate(180deg); + transform: rotate(180deg); + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); +} +.icon-rotate-270:before { + -webkit-transform: rotate(270deg); + -moz-transform: rotate(270deg); + -ms-transform: rotate(270deg); + -o-transform: rotate(270deg); + transform: rotate(270deg); + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); +} +.icon-flip-horizontal:before { + -webkit-transform: scale(-1, 1); + -moz-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + -o-transform: scale(-1, 1); + transform: scale(-1, 1); +} +.icon-flip-vertical:before { + -webkit-transform: scale(1, -1); + -moz-transform: scale(1, -1); + -ms-transform: scale(1, -1); + -o-transform: scale(1, -1); + transform: scale(1, -1); +} +/* ensure rotation occurs inside anchor tags */ +a .icon-rotate-90:before, +a .icon-rotate-180:before, +a .icon-rotate-270:before, +a .icon-flip-horizontal:before, +a .icon-flip-vertical:before { + display: inline-block; +} +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ +.icon-glass:before { + content: "\f000"; +} +.icon-music:before { + content: "\f001"; +} +.icon-search:before { + content: "\f002"; +} +.icon-envelope-alt:before { + content: "\f003"; +} +.icon-heart:before { + content: "\f004"; +} +.icon-star:before { + content: "\f005"; +} +.icon-star-empty:before { + content: "\f006"; +} +.icon-user:before { + content: "\f007"; +} +.icon-film:before { + content: "\f008"; +} +.icon-th-large:before { + content: "\f009"; +} +.icon-th:before { + content: "\f00a"; +} +.icon-th-list:before { + content: "\f00b"; +} +.icon-ok:before { + content: "\f00c"; +} +.icon-remove:before { + content: "\f00d"; +} +.icon-zoom-in:before { + content: "\f00e"; +} +.icon-zoom-out:before { + content: "\f010"; +} +.icon-power-off:before, +.icon-off:before { + content: "\f011"; +} +.icon-signal:before { + content: "\f012"; +} +.icon-gear:before, +.icon-cog:before { + content: "\f013"; +} +.icon-trash:before { + content: "\f014"; +} +.icon-home:before { + content: "\f015"; +} +.icon-file-alt:before { + content: "\f016"; +} +.icon-time:before { + content: "\f017"; +} +.icon-road:before { + content: "\f018"; +} +.icon-download-alt:before { + content: "\f019"; +} +.icon-download:before { + content: "\f01a"; +} +.icon-upload:before { + content: "\f01b"; +} +.icon-inbox:before { + content: "\f01c"; +} +.icon-play-circle:before { + content: "\f01d"; +} +.icon-rotate-right:before, +.icon-repeat:before { + content: "\f01e"; +} +.icon-refresh:before { + content: "\f021"; +} +.icon-list-alt:before { + content: "\f022"; +} +.icon-lock:before { + content: "\f023"; +} +.icon-flag:before { + content: "\f024"; +} +.icon-headphones:before { + content: "\f025"; +} +.icon-volume-off:before { + content: "\f026"; +} +.icon-volume-down:before { + content: "\f027"; +} +.icon-volume-up:before { + content: "\f028"; +} +.icon-qrcode:before { + content: "\f029"; +} +.icon-barcode:before { + content: "\f02a"; +} +.icon-tag:before { + content: "\f02b"; +} +.icon-tags:before { + content: "\f02c"; +} +.icon-book:before { + content: "\f02d"; +} +.icon-bookmark:before { + content: "\f02e"; +} +.icon-print:before { + content: "\f02f"; +} +.icon-camera:before { + content: "\f030"; +} +.icon-font:before { + content: "\f031"; +} +.icon-bold:before { + content: "\f032"; +} +.icon-italic:before { + content: "\f033"; +} +.icon-text-height:before { + content: "\f034"; +} +.icon-text-width:before { + content: "\f035"; +} +.icon-align-left:before { + content: "\f036"; +} +.icon-align-center:before { + content: "\f037"; +} +.icon-align-right:before { + content: "\f038"; +} +.icon-align-justify:before { + content: "\f039"; +} +.icon-list:before { + content: "\f03a"; +} +.icon-indent-left:before { + content: "\f03b"; +} +.icon-indent-right:before { + content: "\f03c"; +} +.icon-facetime-video:before { + content: "\f03d"; +} +.icon-picture:before { + content: "\f03e"; +} +.icon-pencil:before { + content: "\f040"; +} +.icon-map-marker:before { + content: "\f041"; +} +.icon-adjust:before { + content: "\f042"; +} +.icon-tint:before { + content: "\f043"; +} +.icon-edit:before { + content: "\f044"; +} +.icon-share:before { + content: "\f045"; +} +.icon-check:before { + content: "\f046"; +} +.icon-move:before { + content: "\f047"; +} +.icon-step-backward:before { + content: "\f048"; +} +.icon-fast-backward:before { + content: "\f049"; +} +.icon-backward:before { + content: "\f04a"; +} +.icon-play:before { + content: "\f04b"; +} +.icon-pause:before { + content: "\f04c"; +} +.icon-stop:before { + content: "\f04d"; +} +.icon-forward:before { + content: "\f04e"; +} +.icon-fast-forward:before { + content: "\f050"; +} +.icon-step-forward:before { + content: "\f051"; +} +.icon-eject:before { + content: "\f052"; +} +.icon-chevron-left:before { + content: "\f053"; +} +.icon-chevron-right:before { + content: "\f054"; +} +.icon-plus-sign:before { + content: "\f055"; +} +.icon-minus-sign:before { + content: "\f056"; +} +.icon-remove-sign:before { + content: "\f057"; +} +.icon-ok-sign:before { + content: "\f058"; +} +.icon-question-sign:before { + content: "\f059"; +} +.icon-info-sign:before { + content: "\f05a"; +} +.icon-screenshot:before { + content: "\f05b"; +} +.icon-remove-circle:before { + content: "\f05c"; +} +.icon-ok-circle:before { + content: "\f05d"; +} +.icon-ban-circle:before { + content: "\f05e"; +} +.icon-arrow-left:before { + content: "\f060"; +} +.icon-arrow-right:before { + content: "\f061"; +} +.icon-arrow-up:before { + content: "\f062"; +} +.icon-arrow-down:before { + content: "\f063"; +} +.icon-mail-forward:before, +.icon-share-alt:before { + content: "\f064"; +} +.icon-resize-full:before { + content: "\f065"; +} +.icon-resize-small:before { + content: "\f066"; +} +.icon-plus:before { + content: "\f067"; +} +.icon-minus:before { + content: "\f068"; +} +.icon-asterisk:before { + content: "\f069"; +} +.icon-exclamation-sign:before { + content: "\f06a"; +} +.icon-gift:before { + content: "\f06b"; +} +.icon-leaf:before { + content: "\f06c"; +} +.icon-fire:before { + content: "\f06d"; +} +.icon-eye-open:before { + content: "\f06e"; +} +.icon-eye-close:before { + content: "\f070"; +} +.icon-warning-sign:before { + content: "\f071"; +} +.icon-plane:before { + content: "\f072"; +} +.icon-calendar:before { + content: "\f073"; +} +.icon-random:before { + content: "\f074"; +} +.icon-comment:before { + content: "\f075"; +} +.icon-magnet:before { + content: "\f076"; +} +.icon-chevron-up:before { + content: "\f077"; +} +.icon-chevron-down:before { + content: "\f078"; +} +.icon-retweet:before { + content: "\f079"; +} +.icon-shopping-cart:before { + content: "\f07a"; +} +.icon-folder-close:before { + content: "\f07b"; +} +.icon-folder-open:before { + content: "\f07c"; +} +.icon-resize-vertical:before { + content: "\f07d"; +} +.icon-resize-horizontal:before { + content: "\f07e"; +} +.icon-bar-chart:before { + content: "\f080"; +} +.icon-twitter-sign:before { + content: "\f081"; +} +.icon-facebook-sign:before { + content: "\f082"; +} +.icon-camera-retro:before { + content: "\f083"; +} +.icon-key:before { + content: "\f084"; +} +.icon-gears:before, +.icon-cogs:before { + content: "\f085"; +} +.icon-comments:before { + content: "\f086"; +} +.icon-thumbs-up-alt:before { + content: "\f087"; +} +.icon-thumbs-down-alt:before { + content: "\f088"; +} +.icon-star-half:before { + content: "\f089"; +} +.icon-heart-empty:before { + content: "\f08a"; +} +.icon-signout:before { + content: "\f08b"; +} +.icon-linkedin-sign:before { + content: "\f08c"; +} +.icon-pushpin:before { + content: "\f08d"; +} +.icon-external-link:before { + content: "\f08e"; +} +.icon-signin:before { + content: "\f090"; +} +.icon-trophy:before { + content: "\f091"; +} +.icon-github-sign:before { + content: "\f092"; +} +.icon-upload-alt:before { + content: "\f093"; +} +.icon-lemon:before { + content: "\f094"; +} +.icon-phone:before { + content: "\f095"; +} +.icon-unchecked:before, +.icon-check-empty:before { + content: "\f096"; +} +.icon-bookmark-empty:before { + content: "\f097"; +} +.icon-phone-sign:before { + content: "\f098"; +} +.icon-twitter:before { + content: "\f099"; +} +.icon-facebook:before { + content: "\f09a"; +} +.icon-github:before { + content: "\f09b"; +} +.icon-unlock:before { + content: "\f09c"; +} +.icon-credit-card:before { + content: "\f09d"; +} +.icon-rss:before { + content: "\f09e"; +} +.icon-hdd:before { + content: "\f0a0"; +} +.icon-bullhorn:before { + content: "\f0a1"; +} +.icon-bell:before { + content: "\f0a2"; +} +.icon-certificate:before { + content: "\f0a3"; +} +.icon-hand-right:before { + content: "\f0a4"; +} +.icon-hand-left:before { + content: "\f0a5"; +} +.icon-hand-up:before { + content: "\f0a6"; +} +.icon-hand-down:before { + content: "\f0a7"; +} +.icon-circle-arrow-left:before { + content: "\f0a8"; +} +.icon-circle-arrow-right:before { + content: "\f0a9"; +} +.icon-circle-arrow-up:before { + content: "\f0aa"; +} +.icon-circle-arrow-down:before { + content: "\f0ab"; +} +.icon-globe:before { + content: "\f0ac"; +} +.icon-wrench:before { + content: "\f0ad"; +} +.icon-tasks:before { + content: "\f0ae"; +} +.icon-filter:before { + content: "\f0b0"; +} +.icon-briefcase:before { + content: "\f0b1"; +} +.icon-fullscreen:before { + content: "\f0b2"; +} +.icon-group:before { + content: "\f0c0"; +} +.icon-link:before { + content: "\f0c1"; +} +.icon-cloud:before { + content: "\f0c2"; +} +.icon-beaker:before { + content: "\f0c3"; +} +.icon-cut:before { + content: "\f0c4"; +} +.icon-copy:before { + content: "\f0c5"; +} +.icon-paperclip:before, +.icon-paper-clip:before { + content: "\f0c6"; +} +.icon-save:before { + content: "\f0c7"; +} +.icon-sign-blank:before { + content: "\f0c8"; +} +.icon-reorder:before { + content: "\f0c9"; +} +.icon-list-ul:before { + content: "\f0ca"; +} +.icon-list-ol:before { + content: "\f0cb"; +} +.icon-strikethrough:before { + content: "\f0cc"; +} +.icon-underline:before { + content: "\f0cd"; +} +.icon-table:before { + content: "\f0ce"; +} +.icon-magic:before { + content: "\f0d0"; +} +.icon-truck:before { + content: "\f0d1"; +} +.icon-pinterest:before { + content: "\f0d2"; +} +.icon-pinterest-sign:before { + content: "\f0d3"; +} +.icon-google-plus-sign:before { + content: "\f0d4"; +} +.icon-google-plus:before { + content: "\f0d5"; +} +.icon-money:before { + content: "\f0d6"; +} +.icon-caret-down:before { + content: "\f0d7"; +} +.icon-caret-up:before { + content: "\f0d8"; +} +.icon-caret-left:before { + content: "\f0d9"; +} +.icon-caret-right:before { + content: "\f0da"; +} +.icon-columns:before { + content: "\f0db"; +} +.icon-sort:before { + content: "\f0dc"; +} +.icon-sort-down:before { + content: "\f0dd"; +} +.icon-sort-up:before { + content: "\f0de"; +} +.icon-envelope:before { + content: "\f0e0"; +} +.icon-linkedin:before { + content: "\f0e1"; +} +.icon-rotate-left:before, +.icon-undo:before { + content: "\f0e2"; +} +.icon-legal:before { + content: "\f0e3"; +} +.icon-dashboard:before { + content: "\f0e4"; +} +.icon-comment-alt:before { + content: "\f0e5"; +} +.icon-comments-alt:before { + content: "\f0e6"; +} +.icon-bolt:before { + content: "\f0e7"; +} +.icon-sitemap:before { + content: "\f0e8"; +} +.icon-umbrella:before { + content: "\f0e9"; +} +.icon-paste:before { + content: "\f0ea"; +} +.icon-lightbulb:before { + content: "\f0eb"; +} +.icon-exchange:before { + content: "\f0ec"; +} +.icon-cloud-download:before { + content: "\f0ed"; +} +.icon-cloud-upload:before { + content: "\f0ee"; +} +.icon-user-md:before { + content: "\f0f0"; +} +.icon-stethoscope:before { + content: "\f0f1"; +} +.icon-suitcase:before { + content: "\f0f2"; +} +.icon-bell-alt:before { + content: "\f0f3"; +} +.icon-coffee:before { + content: "\f0f4"; +} +.icon-food:before { + content: "\f0f5"; +} +.icon-file-text-alt:before { + content: "\f0f6"; +} +.icon-building:before { + content: "\f0f7"; +} +.icon-hospital:before { + content: "\f0f8"; +} +.icon-ambulance:before { + content: "\f0f9"; +} +.icon-medkit:before { + content: "\f0fa"; +} +.icon-fighter-jet:before { + content: "\f0fb"; +} +.icon-beer:before { + content: "\f0fc"; +} +.icon-h-sign:before { + content: "\f0fd"; +} +.icon-plus-sign-alt:before { + content: "\f0fe"; +} +.icon-double-angle-left:before { + content: "\f100"; +} +.icon-double-angle-right:before { + content: "\f101"; +} +.icon-double-angle-up:before { + content: "\f102"; +} +.icon-double-angle-down:before { + content: "\f103"; +} +.icon-angle-left:before { + content: "\f104"; +} +.icon-angle-right:before { + content: "\f105"; +} +.icon-angle-up:before { + content: "\f106"; +} +.icon-angle-down:before { + content: "\f107"; +} +.icon-desktop:before { + content: "\f108"; +} +.icon-laptop:before { + content: "\f109"; +} +.icon-tablet:before { + content: "\f10a"; +} +.icon-mobile-phone:before { + content: "\f10b"; +} +.icon-circle-blank:before { + content: "\f10c"; +} +.icon-quote-left:before { + content: "\f10d"; +} +.icon-quote-right:before { + content: "\f10e"; +} +.icon-spinner:before { + content: "\f110"; +} +.icon-circle:before { + content: "\f111"; +} +.icon-mail-reply:before, +.icon-reply:before { + content: "\f112"; +} +.icon-github-alt:before { + content: "\f113"; +} +.icon-folder-close-alt:before { + content: "\f114"; +} +.icon-folder-open-alt:before { + content: "\f115"; +} +.icon-expand-alt:before { + content: "\f116"; +} +.icon-collapse-alt:before { + content: "\f117"; +} +.icon-smile:before { + content: "\f118"; +} +.icon-frown:before { + content: "\f119"; +} +.icon-meh:before { + content: "\f11a"; +} +.icon-gamepad:before { + content: "\f11b"; +} +.icon-keyboard:before { + content: "\f11c"; +} +.icon-flag-alt:before { + content: "\f11d"; +} +.icon-flag-checkered:before { + content: "\f11e"; +} +.icon-terminal:before { + content: "\f120"; +} +.icon-code:before { + content: "\f121"; +} +.icon-reply-all:before { + content: "\f122"; +} +.icon-mail-reply-all:before { + content: "\f122"; +} +.icon-star-half-full:before, +.icon-star-half-empty:before { + content: "\f123"; +} +.icon-location-arrow:before { + content: "\f124"; +} +.icon-crop:before { + content: "\f125"; +} +.icon-code-fork:before { + content: "\f126"; +} +.icon-unlink:before { + content: "\f127"; +} +.icon-question:before { + content: "\f128"; +} +.icon-info:before { + content: "\f129"; +} +.icon-exclamation:before { + content: "\f12a"; +} +.icon-superscript:before { + content: "\f12b"; +} +.icon-subscript:before { + content: "\f12c"; +} +.icon-eraser:before { + content: "\f12d"; +} +.icon-puzzle-piece:before { + content: "\f12e"; +} +.icon-microphone:before { + content: "\f130"; +} +.icon-microphone-off:before { + content: "\f131"; +} +.icon-shield:before { + content: "\f132"; +} +.icon-calendar-empty:before { + content: "\f133"; +} +.icon-fire-extinguisher:before { + content: "\f134"; +} +.icon-rocket:before { + content: "\f135"; +} +.icon-maxcdn:before { + content: "\f136"; +} +.icon-chevron-sign-left:before { + content: "\f137"; +} +.icon-chevron-sign-right:before { + content: "\f138"; +} +.icon-chevron-sign-up:before { + content: "\f139"; +} +.icon-chevron-sign-down:before { + content: "\f13a"; +} +.icon-html5:before { + content: "\f13b"; +} +.icon-css3:before { + content: "\f13c"; +} +.icon-anchor:before { + content: "\f13d"; +} +.icon-unlock-alt:before { + content: "\f13e"; +} +.icon-bullseye:before { + content: "\f140"; +} +.icon-ellipsis-horizontal:before { + content: "\f141"; +} +.icon-ellipsis-vertical:before { + content: "\f142"; +} +.icon-rss-sign:before { + content: "\f143"; +} +.icon-play-sign:before { + content: "\f144"; +} +.icon-ticket:before { + content: "\f145"; +} +.icon-minus-sign-alt:before { + content: "\f146"; +} +.icon-check-minus:before { + content: "\f147"; +} +.icon-level-up:before { + content: "\f148"; +} +.icon-level-down:before { + content: "\f149"; +} +.icon-check-sign:before { + content: "\f14a"; +} +.icon-edit-sign:before { + content: "\f14b"; +} +.icon-external-link-sign:before { + content: "\f14c"; +} +.icon-share-sign:before { + content: "\f14d"; +} +.icon-compass:before { + content: "\f14e"; +} +.icon-collapse:before { + content: "\f150"; +} +.icon-collapse-top:before { + content: "\f151"; +} +.icon-expand:before { + content: "\f152"; +} +.icon-euro:before, +.icon-eur:before { + content: "\f153"; +} +.icon-gbp:before { + content: "\f154"; +} +.icon-dollar:before, +.icon-usd:before { + content: "\f155"; +} +.icon-rupee:before, +.icon-inr:before { + content: "\f156"; +} +.icon-yen:before, +.icon-jpy:before { + content: "\f157"; +} +.icon-renminbi:before, +.icon-cny:before { + content: "\f158"; +} +.icon-won:before, +.icon-krw:before { + content: "\f159"; +} +.icon-bitcoin:before, +.icon-btc:before { + content: "\f15a"; +} +.icon-file:before { + content: "\f15b"; +} +.icon-file-text:before { + content: "\f15c"; +} +.icon-sort-by-alphabet:before { + content: "\f15d"; +} +.icon-sort-by-alphabet-alt:before { + content: "\f15e"; +} +.icon-sort-by-attributes:before { + content: "\f160"; +} +.icon-sort-by-attributes-alt:before { + content: "\f161"; +} +.icon-sort-by-order:before { + content: "\f162"; +} +.icon-sort-by-order-alt:before { + content: "\f163"; +} +.icon-thumbs-up:before { + content: "\f164"; +} +.icon-thumbs-down:before { + content: "\f165"; +} +.icon-youtube-sign:before { + content: "\f166"; +} +.icon-youtube:before { + content: "\f167"; +} +.icon-xing:before { + content: "\f168"; +} +.icon-xing-sign:before { + content: "\f169"; +} +.icon-youtube-play:before { + content: "\f16a"; +} +.icon-dropbox:before { + content: "\f16b"; +} +.icon-stackexchange:before { + content: "\f16c"; +} +.icon-instagram:before { + content: "\f16d"; +} +.icon-flickr:before { + content: "\f16e"; +} +.icon-adn:before { + content: "\f170"; +} +.icon-bitbucket:before { + content: "\f171"; +} +.icon-bitbucket-sign:before { + content: "\f172"; +} +.icon-tumblr:before { + content: "\f173"; +} +.icon-tumblr-sign:before { + content: "\f174"; +} +.icon-long-arrow-down:before { + content: "\f175"; +} +.icon-long-arrow-up:before { + content: "\f176"; +} +.icon-long-arrow-left:before { + content: "\f177"; +} +.icon-long-arrow-right:before { + content: "\f178"; +} +.icon-apple:before { + content: "\f179"; +} +.icon-windows:before { + content: "\f17a"; +} +.icon-android:before { + content: "\f17b"; +} +.icon-linux:before { + content: "\f17c"; +} +.icon-dribbble:before { + content: "\f17d"; +} +.icon-skype:before { + content: "\f17e"; +} +.icon-foursquare:before { + content: "\f180"; +} +.icon-trello:before { + content: "\f181"; +} +.icon-female:before { + content: "\f182"; +} +.icon-male:before { + content: "\f183"; +} +.icon-gittip:before { + content: "\f184"; +} +.icon-sun:before { + content: "\f185"; +} +.icon-moon:before { + content: "\f186"; +} +.icon-archive:before { + content: "\f187"; +} +.icon-bug:before { + content: "\f188"; +} +.icon-vk:before { + content: "\f189"; +} +.icon-weibo:before { + content: "\f18a"; +} +.icon-renren:before { + content: "\f18b"; +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/css/font-awesome.min.css b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/css/font-awesome.min.css new file mode 100644 index 0000000000000000000000000000000000000000..866437fa415f1874c0855718445c7aff915a915a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/css/font-awesome.min.css @@ -0,0 +1,403 @@ +@font-face{font-family:'FontAwesome';src:url('../font/fontawesome-webfont.eot?v=3.2.1');src:url('../font/fontawesome-webfont.eot?#iefix&v=3.2.1') format('embedded-opentype'),url('../font/fontawesome-webfont.woff?v=3.2.1') format('woff'),url('../font/fontawesome-webfont.ttf?v=3.2.1') format('truetype'),url('../font/fontawesome-webfont.svg#fontawesomeregular?v=3.2.1') format('svg');font-weight:normal;font-style:normal;}[class^="icon-"],[class*=" icon-"]{font-family:FontAwesome;font-weight:normal;font-style:normal;text-decoration:inherit;-webkit-font-smoothing:antialiased;*margin-right:.3em;} +[class^="icon-"]:before,[class*=" icon-"]:before{text-decoration:inherit;display:inline-block;speak:none;} +.icon-large:before{vertical-align:-10%;font-size:1.3333333333333333em;} +a [class^="icon-"],a [class*=" icon-"]{display:inline;} +[class^="icon-"].icon-fixed-width,[class*=" icon-"].icon-fixed-width{display:inline-block;width:1.1428571428571428em;text-align:right;padding-right:0.2857142857142857em;}[class^="icon-"].icon-fixed-width.icon-large,[class*=" icon-"].icon-fixed-width.icon-large{width:1.4285714285714286em;} +.icons-ul{margin-left:2.142857142857143em;list-style-type:none;}.icons-ul>li{position:relative;} +.icons-ul .icon-li{position:absolute;left:-2.142857142857143em;width:2.142857142857143em;text-align:center;line-height:inherit;} +[class^="icon-"].hide,[class*=" icon-"].hide{display:none;} +.icon-muted{color:#eeeeee;} +.icon-light{color:#ffffff;} +.icon-dark{color:#333333;} +.icon-border{border:solid 1px #eeeeee;padding:.2em .25em .15em;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +.icon-2x{font-size:2em;}.icon-2x.icon-border{border-width:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.icon-3x{font-size:3em;}.icon-3x.icon-border{border-width:3px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} +.icon-4x{font-size:4em;}.icon-4x.icon-border{border-width:4px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;} +.icon-5x{font-size:5em;}.icon-5x.icon-border{border-width:5px;-webkit-border-radius:7px;-moz-border-radius:7px;border-radius:7px;} +.pull-right{float:right;} +.pull-left{float:left;} +[class^="icon-"].pull-left,[class*=" icon-"].pull-left{margin-right:.3em;} +[class^="icon-"].pull-right,[class*=" icon-"].pull-right{margin-left:.3em;} +[class^="icon-"],[class*=" icon-"]{display:inline;width:auto;height:auto;line-height:normal;vertical-align:baseline;background-image:none;background-position:0% 0%;background-repeat:repeat;margin-top:0;} +.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"]{background-image:none;} +.btn [class^="icon-"].icon-large,.nav [class^="icon-"].icon-large,.btn [class*=" icon-"].icon-large,.nav [class*=" icon-"].icon-large{line-height:.9em;} +.btn [class^="icon-"].icon-spin,.nav [class^="icon-"].icon-spin,.btn [class*=" icon-"].icon-spin,.nav [class*=" icon-"].icon-spin{display:inline-block;} +.nav-tabs [class^="icon-"],.nav-pills [class^="icon-"],.nav-tabs [class*=" icon-"],.nav-pills [class*=" icon-"],.nav-tabs [class^="icon-"].icon-large,.nav-pills [class^="icon-"].icon-large,.nav-tabs [class*=" icon-"].icon-large,.nav-pills [class*=" icon-"].icon-large{line-height:.9em;} +.btn [class^="icon-"].pull-left.icon-2x,.btn [class*=" icon-"].pull-left.icon-2x,.btn [class^="icon-"].pull-right.icon-2x,.btn [class*=" icon-"].pull-right.icon-2x{margin-top:.18em;} +.btn [class^="icon-"].icon-spin.icon-large,.btn [class*=" icon-"].icon-spin.icon-large{line-height:.8em;} +.btn.btn-small [class^="icon-"].pull-left.icon-2x,.btn.btn-small [class*=" icon-"].pull-left.icon-2x,.btn.btn-small [class^="icon-"].pull-right.icon-2x,.btn.btn-small [class*=" icon-"].pull-right.icon-2x{margin-top:.25em;} +.btn.btn-large [class^="icon-"],.btn.btn-large [class*=" icon-"]{margin-top:0;}.btn.btn-large [class^="icon-"].pull-left.icon-2x,.btn.btn-large [class*=" icon-"].pull-left.icon-2x,.btn.btn-large [class^="icon-"].pull-right.icon-2x,.btn.btn-large [class*=" icon-"].pull-right.icon-2x{margin-top:.05em;} +.btn.btn-large [class^="icon-"].pull-left.icon-2x,.btn.btn-large [class*=" icon-"].pull-left.icon-2x{margin-right:.2em;} +.btn.btn-large [class^="icon-"].pull-right.icon-2x,.btn.btn-large [class*=" icon-"].pull-right.icon-2x{margin-left:.2em;} +.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{line-height:inherit;} +.icon-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:-35%;}.icon-stack [class^="icon-"],.icon-stack [class*=" icon-"]{display:block;text-align:center;position:absolute;width:100%;height:100%;font-size:1em;line-height:inherit;*line-height:2em;} +.icon-stack .icon-stack-base{font-size:2em;*line-height:1em;} +.icon-spin{display:inline-block;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;-webkit-animation:spin 2s infinite linear;animation:spin 2s infinite linear;} +a .icon-stack,a .icon-spin{display:inline-block;text-decoration:none;} +@-moz-keyframes spin{0%{-moz-transform:rotate(0deg);} 100%{-moz-transform:rotate(359deg);}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg);} 100%{-webkit-transform:rotate(359deg);}}@-o-keyframes spin{0%{-o-transform:rotate(0deg);} 100%{-o-transform:rotate(359deg);}}@-ms-keyframes spin{0%{-ms-transform:rotate(0deg);} 100%{-ms-transform:rotate(359deg);}}@keyframes spin{0%{transform:rotate(0deg);} 100%{transform:rotate(359deg);}}.icon-rotate-90:before{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);} +.icon-rotate-180:before{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);} +.icon-rotate-270:before{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);} +.icon-flip-horizontal:before{-webkit-transform:scale(-1, 1);-moz-transform:scale(-1, 1);-ms-transform:scale(-1, 1);-o-transform:scale(-1, 1);transform:scale(-1, 1);} +.icon-flip-vertical:before{-webkit-transform:scale(1, -1);-moz-transform:scale(1, -1);-ms-transform:scale(1, -1);-o-transform:scale(1, -1);transform:scale(1, -1);} +a .icon-rotate-90:before,a .icon-rotate-180:before,a .icon-rotate-270:before,a .icon-flip-horizontal:before,a .icon-flip-vertical:before{display:inline-block;} +.icon-glass:before{content:"\f000";} +.icon-music:before{content:"\f001";} +.icon-search:before{content:"\f002";} +.icon-envelope-alt:before{content:"\f003";} +.icon-heart:before{content:"\f004";} +.icon-star:before{content:"\f005";} +.icon-star-empty:before{content:"\f006";} +.icon-user:before{content:"\f007";} +.icon-film:before{content:"\f008";} +.icon-th-large:before{content:"\f009";} +.icon-th:before{content:"\f00a";} +.icon-th-list:before{content:"\f00b";} +.icon-ok:before{content:"\f00c";} +.icon-remove:before{content:"\f00d";} +.icon-zoom-in:before{content:"\f00e";} +.icon-zoom-out:before{content:"\f010";} +.icon-power-off:before,.icon-off:before{content:"\f011";} +.icon-signal:before{content:"\f012";} +.icon-gear:before,.icon-cog:before{content:"\f013";} +.icon-trash:before{content:"\f014";} +.icon-home:before{content:"\f015";} +.icon-file-alt:before{content:"\f016";} +.icon-time:before{content:"\f017";} +.icon-road:before{content:"\f018";} +.icon-download-alt:before{content:"\f019";} +.icon-download:before{content:"\f01a";} +.icon-upload:before{content:"\f01b";} +.icon-inbox:before{content:"\f01c";} +.icon-play-circle:before{content:"\f01d";} +.icon-rotate-right:before,.icon-repeat:before{content:"\f01e";} +.icon-refresh:before{content:"\f021";} +.icon-list-alt:before{content:"\f022";} +.icon-lock:before{content:"\f023";} +.icon-flag:before{content:"\f024";} +.icon-headphones:before{content:"\f025";} +.icon-volume-off:before{content:"\f026";} +.icon-volume-down:before{content:"\f027";} +.icon-volume-up:before{content:"\f028";} +.icon-qrcode:before{content:"\f029";} +.icon-barcode:before{content:"\f02a";} +.icon-tag:before{content:"\f02b";} +.icon-tags:before{content:"\f02c";} +.icon-book:before{content:"\f02d";} +.icon-bookmark:before{content:"\f02e";} +.icon-print:before{content:"\f02f";} +.icon-camera:before{content:"\f030";} +.icon-font:before{content:"\f031";} +.icon-bold:before{content:"\f032";} +.icon-italic:before{content:"\f033";} +.icon-text-height:before{content:"\f034";} +.icon-text-width:before{content:"\f035";} +.icon-align-left:before{content:"\f036";} +.icon-align-center:before{content:"\f037";} +.icon-align-right:before{content:"\f038";} +.icon-align-justify:before{content:"\f039";} +.icon-list:before{content:"\f03a";} +.icon-indent-left:before{content:"\f03b";} +.icon-indent-right:before{content:"\f03c";} +.icon-facetime-video:before{content:"\f03d";} +.icon-picture:before{content:"\f03e";} +.icon-pencil:before{content:"\f040";} +.icon-map-marker:before{content:"\f041";} +.icon-adjust:before{content:"\f042";} +.icon-tint:before{content:"\f043";} +.icon-edit:before{content:"\f044";} +.icon-share:before{content:"\f045";} +.icon-check:before{content:"\f046";} +.icon-move:before{content:"\f047";} +.icon-step-backward:before{content:"\f048";} +.icon-fast-backward:before{content:"\f049";} +.icon-backward:before{content:"\f04a";} +.icon-play:before{content:"\f04b";} +.icon-pause:before{content:"\f04c";} +.icon-stop:before{content:"\f04d";} +.icon-forward:before{content:"\f04e";} +.icon-fast-forward:before{content:"\f050";} +.icon-step-forward:before{content:"\f051";} +.icon-eject:before{content:"\f052";} +.icon-chevron-left:before{content:"\f053";} +.icon-chevron-right:before{content:"\f054";} +.icon-plus-sign:before{content:"\f055";} +.icon-minus-sign:before{content:"\f056";} +.icon-remove-sign:before{content:"\f057";} +.icon-ok-sign:before{content:"\f058";} +.icon-question-sign:before{content:"\f059";} +.icon-info-sign:before{content:"\f05a";} +.icon-screenshot:before{content:"\f05b";} +.icon-remove-circle:before{content:"\f05c";} +.icon-ok-circle:before{content:"\f05d";} +.icon-ban-circle:before{content:"\f05e";} +.icon-arrow-left:before{content:"\f060";} +.icon-arrow-right:before{content:"\f061";} +.icon-arrow-up:before{content:"\f062";} +.icon-arrow-down:before{content:"\f063";} +.icon-mail-forward:before,.icon-share-alt:before{content:"\f064";} +.icon-resize-full:before{content:"\f065";} +.icon-resize-small:before{content:"\f066";} +.icon-plus:before{content:"\f067";} +.icon-minus:before{content:"\f068";} +.icon-asterisk:before{content:"\f069";} +.icon-exclamation-sign:before{content:"\f06a";} +.icon-gift:before{content:"\f06b";} +.icon-leaf:before{content:"\f06c";} +.icon-fire:before{content:"\f06d";} +.icon-eye-open:before{content:"\f06e";} +.icon-eye-close:before{content:"\f070";} +.icon-warning-sign:before{content:"\f071";} +.icon-plane:before{content:"\f072";} +.icon-calendar:before{content:"\f073";} +.icon-random:before{content:"\f074";} +.icon-comment:before{content:"\f075";} +.icon-magnet:before{content:"\f076";} +.icon-chevron-up:before{content:"\f077";} +.icon-chevron-down:before{content:"\f078";} +.icon-retweet:before{content:"\f079";} +.icon-shopping-cart:before{content:"\f07a";} +.icon-folder-close:before{content:"\f07b";} +.icon-folder-open:before{content:"\f07c";} +.icon-resize-vertical:before{content:"\f07d";} +.icon-resize-horizontal:before{content:"\f07e";} +.icon-bar-chart:before{content:"\f080";} +.icon-twitter-sign:before{content:"\f081";} +.icon-facebook-sign:before{content:"\f082";} +.icon-camera-retro:before{content:"\f083";} +.icon-key:before{content:"\f084";} +.icon-gears:before,.icon-cogs:before{content:"\f085";} +.icon-comments:before{content:"\f086";} +.icon-thumbs-up-alt:before{content:"\f087";} +.icon-thumbs-down-alt:before{content:"\f088";} +.icon-star-half:before{content:"\f089";} +.icon-heart-empty:before{content:"\f08a";} +.icon-signout:before{content:"\f08b";} +.icon-linkedin-sign:before{content:"\f08c";} +.icon-pushpin:before{content:"\f08d";} +.icon-external-link:before{content:"\f08e";} +.icon-signin:before{content:"\f090";} +.icon-trophy:before{content:"\f091";} +.icon-github-sign:before{content:"\f092";} +.icon-upload-alt:before{content:"\f093";} +.icon-lemon:before{content:"\f094";} +.icon-phone:before{content:"\f095";} +.icon-unchecked:before,.icon-check-empty:before{content:"\f096";} +.icon-bookmark-empty:before{content:"\f097";} +.icon-phone-sign:before{content:"\f098";} +.icon-twitter:before{content:"\f099";} +.icon-facebook:before{content:"\f09a";} +.icon-github:before{content:"\f09b";} +.icon-unlock:before{content:"\f09c";} +.icon-credit-card:before{content:"\f09d";} +.icon-rss:before{content:"\f09e";} +.icon-hdd:before{content:"\f0a0";} +.icon-bullhorn:before{content:"\f0a1";} +.icon-bell:before{content:"\f0a2";} +.icon-certificate:before{content:"\f0a3";} +.icon-hand-right:before{content:"\f0a4";} +.icon-hand-left:before{content:"\f0a5";} +.icon-hand-up:before{content:"\f0a6";} +.icon-hand-down:before{content:"\f0a7";} +.icon-circle-arrow-left:before{content:"\f0a8";} +.icon-circle-arrow-right:before{content:"\f0a9";} +.icon-circle-arrow-up:before{content:"\f0aa";} +.icon-circle-arrow-down:before{content:"\f0ab";} +.icon-globe:before{content:"\f0ac";} +.icon-wrench:before{content:"\f0ad";} +.icon-tasks:before{content:"\f0ae";} +.icon-filter:before{content:"\f0b0";} +.icon-briefcase:before{content:"\f0b1";} +.icon-fullscreen:before{content:"\f0b2";} +.icon-group:before{content:"\f0c0";} +.icon-link:before{content:"\f0c1";} +.icon-cloud:before{content:"\f0c2";} +.icon-beaker:before{content:"\f0c3";} +.icon-cut:before{content:"\f0c4";} +.icon-copy:before{content:"\f0c5";} +.icon-paperclip:before,.icon-paper-clip:before{content:"\f0c6";} +.icon-save:before{content:"\f0c7";} +.icon-sign-blank:before{content:"\f0c8";} +.icon-reorder:before{content:"\f0c9";} +.icon-list-ul:before{content:"\f0ca";} +.icon-list-ol:before{content:"\f0cb";} +.icon-strikethrough:before{content:"\f0cc";} +.icon-underline:before{content:"\f0cd";} +.icon-table:before{content:"\f0ce";} +.icon-magic:before{content:"\f0d0";} +.icon-truck:before{content:"\f0d1";} +.icon-pinterest:before{content:"\f0d2";} +.icon-pinterest-sign:before{content:"\f0d3";} +.icon-google-plus-sign:before{content:"\f0d4";} +.icon-google-plus:before{content:"\f0d5";} +.icon-money:before{content:"\f0d6";} +.icon-caret-down:before{content:"\f0d7";} +.icon-caret-up:before{content:"\f0d8";} +.icon-caret-left:before{content:"\f0d9";} +.icon-caret-right:before{content:"\f0da";} +.icon-columns:before{content:"\f0db";} +.icon-sort:before{content:"\f0dc";} +.icon-sort-down:before{content:"\f0dd";} +.icon-sort-up:before{content:"\f0de";} +.icon-envelope:before{content:"\f0e0";} +.icon-linkedin:before{content:"\f0e1";} +.icon-rotate-left:before,.icon-undo:before{content:"\f0e2";} +.icon-legal:before{content:"\f0e3";} +.icon-dashboard:before{content:"\f0e4";} +.icon-comment-alt:before{content:"\f0e5";} +.icon-comments-alt:before{content:"\f0e6";} +.icon-bolt:before{content:"\f0e7";} +.icon-sitemap:before{content:"\f0e8";} +.icon-umbrella:before{content:"\f0e9";} +.icon-paste:before{content:"\f0ea";} +.icon-lightbulb:before{content:"\f0eb";} +.icon-exchange:before{content:"\f0ec";} +.icon-cloud-download:before{content:"\f0ed";} +.icon-cloud-upload:before{content:"\f0ee";} +.icon-user-md:before{content:"\f0f0";} +.icon-stethoscope:before{content:"\f0f1";} +.icon-suitcase:before{content:"\f0f2";} +.icon-bell-alt:before{content:"\f0f3";} +.icon-coffee:before{content:"\f0f4";} +.icon-food:before{content:"\f0f5";} +.icon-file-text-alt:before{content:"\f0f6";} +.icon-building:before{content:"\f0f7";} +.icon-hospital:before{content:"\f0f8";} +.icon-ambulance:before{content:"\f0f9";} +.icon-medkit:before{content:"\f0fa";} +.icon-fighter-jet:before{content:"\f0fb";} +.icon-beer:before{content:"\f0fc";} +.icon-h-sign:before{content:"\f0fd";} +.icon-plus-sign-alt:before{content:"\f0fe";} +.icon-double-angle-left:before{content:"\f100";} +.icon-double-angle-right:before{content:"\f101";} +.icon-double-angle-up:before{content:"\f102";} +.icon-double-angle-down:before{content:"\f103";} +.icon-angle-left:before{content:"\f104";} +.icon-angle-right:before{content:"\f105";} +.icon-angle-up:before{content:"\f106";} +.icon-angle-down:before{content:"\f107";} +.icon-desktop:before{content:"\f108";} +.icon-laptop:before{content:"\f109";} +.icon-tablet:before{content:"\f10a";} +.icon-mobile-phone:before{content:"\f10b";} +.icon-circle-blank:before{content:"\f10c";} +.icon-quote-left:before{content:"\f10d";} +.icon-quote-right:before{content:"\f10e";} +.icon-spinner:before{content:"\f110";} +.icon-circle:before{content:"\f111";} +.icon-mail-reply:before,.icon-reply:before{content:"\f112";} +.icon-github-alt:before{content:"\f113";} +.icon-folder-close-alt:before{content:"\f114";} +.icon-folder-open-alt:before{content:"\f115";} +.icon-expand-alt:before{content:"\f116";} +.icon-collapse-alt:before{content:"\f117";} +.icon-smile:before{content:"\f118";} +.icon-frown:before{content:"\f119";} +.icon-meh:before{content:"\f11a";} +.icon-gamepad:before{content:"\f11b";} +.icon-keyboard:before{content:"\f11c";} +.icon-flag-alt:before{content:"\f11d";} +.icon-flag-checkered:before{content:"\f11e";} +.icon-terminal:before{content:"\f120";} +.icon-code:before{content:"\f121";} +.icon-reply-all:before{content:"\f122";} +.icon-mail-reply-all:before{content:"\f122";} +.icon-star-half-full:before,.icon-star-half-empty:before{content:"\f123";} +.icon-location-arrow:before{content:"\f124";} +.icon-crop:before{content:"\f125";} +.icon-code-fork:before{content:"\f126";} +.icon-unlink:before{content:"\f127";} +.icon-question:before{content:"\f128";} +.icon-info:before{content:"\f129";} +.icon-exclamation:before{content:"\f12a";} +.icon-superscript:before{content:"\f12b";} +.icon-subscript:before{content:"\f12c";} +.icon-eraser:before{content:"\f12d";} +.icon-puzzle-piece:before{content:"\f12e";} +.icon-microphone:before{content:"\f130";} +.icon-microphone-off:before{content:"\f131";} +.icon-shield:before{content:"\f132";} +.icon-calendar-empty:before{content:"\f133";} +.icon-fire-extinguisher:before{content:"\f134";} +.icon-rocket:before{content:"\f135";} +.icon-maxcdn:before{content:"\f136";} +.icon-chevron-sign-left:before{content:"\f137";} +.icon-chevron-sign-right:before{content:"\f138";} +.icon-chevron-sign-up:before{content:"\f139";} +.icon-chevron-sign-down:before{content:"\f13a";} +.icon-html5:before{content:"\f13b";} +.icon-css3:before{content:"\f13c";} +.icon-anchor:before{content:"\f13d";} +.icon-unlock-alt:before{content:"\f13e";} +.icon-bullseye:before{content:"\f140";} +.icon-ellipsis-horizontal:before{content:"\f141";} +.icon-ellipsis-vertical:before{content:"\f142";} +.icon-rss-sign:before{content:"\f143";} +.icon-play-sign:before{content:"\f144";} +.icon-ticket:before{content:"\f145";} +.icon-minus-sign-alt:before{content:"\f146";} +.icon-check-minus:before{content:"\f147";} +.icon-level-up:before{content:"\f148";} +.icon-level-down:before{content:"\f149";} +.icon-check-sign:before{content:"\f14a";} +.icon-edit-sign:before{content:"\f14b";} +.icon-external-link-sign:before{content:"\f14c";} +.icon-share-sign:before{content:"\f14d";} +.icon-compass:before{content:"\f14e";} +.icon-collapse:before{content:"\f150";} +.icon-collapse-top:before{content:"\f151";} +.icon-expand:before{content:"\f152";} +.icon-euro:before,.icon-eur:before{content:"\f153";} +.icon-gbp:before{content:"\f154";} +.icon-dollar:before,.icon-usd:before{content:"\f155";} +.icon-rupee:before,.icon-inr:before{content:"\f156";} +.icon-yen:before,.icon-jpy:before{content:"\f157";} +.icon-renminbi:before,.icon-cny:before{content:"\f158";} +.icon-won:before,.icon-krw:before{content:"\f159";} +.icon-bitcoin:before,.icon-btc:before{content:"\f15a";} +.icon-file:before{content:"\f15b";} +.icon-file-text:before{content:"\f15c";} +.icon-sort-by-alphabet:before{content:"\f15d";} +.icon-sort-by-alphabet-alt:before{content:"\f15e";} +.icon-sort-by-attributes:before{content:"\f160";} +.icon-sort-by-attributes-alt:before{content:"\f161";} +.icon-sort-by-order:before{content:"\f162";} +.icon-sort-by-order-alt:before{content:"\f163";} +.icon-thumbs-up:before{content:"\f164";} +.icon-thumbs-down:before{content:"\f165";} +.icon-youtube-sign:before{content:"\f166";} +.icon-youtube:before{content:"\f167";} +.icon-xing:before{content:"\f168";} +.icon-xing-sign:before{content:"\f169";} +.icon-youtube-play:before{content:"\f16a";} +.icon-dropbox:before{content:"\f16b";} +.icon-stackexchange:before{content:"\f16c";} +.icon-instagram:before{content:"\f16d";} +.icon-flickr:before{content:"\f16e";} +.icon-adn:before{content:"\f170";} +.icon-bitbucket:before{content:"\f171";} +.icon-bitbucket-sign:before{content:"\f172";} +.icon-tumblr:before{content:"\f173";} +.icon-tumblr-sign:before{content:"\f174";} +.icon-long-arrow-down:before{content:"\f175";} +.icon-long-arrow-up:before{content:"\f176";} +.icon-long-arrow-left:before{content:"\f177";} +.icon-long-arrow-right:before{content:"\f178";} +.icon-apple:before{content:"\f179";} +.icon-windows:before{content:"\f17a";} +.icon-android:before{content:"\f17b";} +.icon-linux:before{content:"\f17c";} +.icon-dribbble:before{content:"\f17d";} +.icon-skype:before{content:"\f17e";} +.icon-foursquare:before{content:"\f180";} +.icon-trello:before{content:"\f181";} +.icon-female:before{content:"\f182";} +.icon-male:before{content:"\f183";} +.icon-gittip:before{content:"\f184";} +.icon-sun:before{content:"\f185";} +.icon-moon:before{content:"\f186";} +.icon-archive:before{content:"\f187";} +.icon-bug:before{content:"\f188";} +.icon-vk:before{content:"\f189";} +.icon-weibo:before{content:"\f18a";} +.icon-renren:before{content:"\f18b";} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/css/font-mfizz.css b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/css/font-mfizz.css new file mode 100644 index 0000000000000000000000000000000000000000..7b90271c63bc9967a12f08e9aeff5ca8b7dafecc --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/css/font-mfizz.css @@ -0,0 +1,318 @@ +/* + * Font Mfizz v1.2 + * Copyright 2013 Mfizz Inc, Joe Lauer + * MIT License + * + * Project: http://mfizz.com/oss/font-mfizz + * + * The font designed for technology and software geeks representing programming + * languages, operating systems, software engineering, and technology. + * + * Mfizz Inc + * Web: http://mfizz.com/ + * Twitter: http://twitter.com/mfizz_inc + * + * Joe Lauer + * Web: http://lauer.bz/ + * Twitter: http://twitter.com/jjlauer + */ + +@font-face { + font-family: "FontMfizz"; + src: url("../font/font-mfizz/font-mfizz.eot"); + src: url("../font/font-mfizz/font-mfizz.eot?#iefix") format("embedded-opentype"), + url("../font/font-mfizz/font-mfizz.woff") format("woff"), + url("../font/font-mfizz/font-mfizz.ttf") format("truetype"), + url("../font/font-mfizz/font-mfizz.svg#font-mfizz") format("svg"); + font-weight: normal; + font-style: normal; +} + +.icon-microscope:before, +.icon-cplusplus:before, +.icon-wireless:before, +.icon-fire-alt:before, +.icon-mobile-device:before, +.icon-objc:before, +.icon-redhat:before, +.icon-freebsd:before, +.icon-heroku:before, +.icon-python:before, +.icon-java:before, +.icon-satellite:before, +.icon-debian:before, +.icon-grails:before, +.icon-c:before, +.icon-postgres:before, +.icon-database-alt2:before, +.icon-raspberrypi:before, +.icon-nginx:before, +.icon-ruby-on-rails:before, +.icon-redis:before, +.icon-scala:before, +.icon-gnome:before, +.icon-perl:before, +.icon-mysql:before, +.icon-fedora:before, +.icon-ghost:before, +.icon-google:before, +.icon-netbsd:before, +.icon-aws:before, +.icon-bomb:before, +.icon-looking:before, +.icon-ruby:before, +.icon-mysql-alt:before, +.icon-playframework-alt:before, +.icon-osx:before, +.icon-database:before, +.icon-database-alt:before, +.icon-shell:before, +.icon-script:before, +.icon-antenna:before, +.icon-coffee-bean:before, +.icon-scala-alt:before, +.icon-platter:before, +.icon-java-duke:before, +.icon-iphone:before, +.icon-script-alt:before, +.icon-google-alt:before, +.icon-haskell:before, +.icon-mariadb:before, +.icon-phone-retro:before, +.icon-phone-alt:before, +.icon-csharp:before, +.icon-php:before, +.icon-postgres-alt:before, +.icon-html:before, +.icon-mfizz:before, +.icon-apache:before, +.icon-hadoop:before, +.icon-ruby-on-rails-alt:before, +.icon-mobile-phone-broadcast:before, +.icon-css:before, +.icon-playframework:before, +.icon-clojure:before, +.icon-mobile-phone-alt:before, +.icon-suse:before, +.icon-java-bold:before, +.icon-nginx-alt:before, +.icon-nginx-alt2:before, +.icon-linux-mint:before, +.icon-dreamhost:before, +.icon-blackberry:before, +.icon-javascript:before, +.icon-ubuntu:before, +.icon-php-alt:before, +.icon-centos:before, +.icon-nodejs:before, +.icon-splatter:before, +.icon-3dprint:before, +.icon-line-graph:before, +.icon-cassandra:before, +.icon-solaris:before, +.icon-jetty:before, +.icon-tomcat:before, +.icon-oracle:before, +.icon-oracle-alt:before, +.icon-mssql:before, +.icon-google-developers:before, +.icon-google-code:before, +.icon-kde:before, +.icon-grails-alt:before { + font-family: "FontMfizz"; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + display: inline-block; + text-decoration: inherit; +} + +.icon-microscope:before { content: "\f100"; } +.icon-cplusplus:before { content: "\f101"; } +.icon-wireless:before { content: "\f102"; } +.icon-fire-alt:before { content: "\f103"; } +.icon-mobile-device:before { content: "\f104"; } +.icon-objc:before { content: "\f105"; } +.icon-redhat:before { content: "\f106"; } +.icon-freebsd:before { content: "\f107"; } +.icon-heroku:before { content: "\f108"; } +.icon-python:before { content: "\f109"; } +.icon-java:before { content: "\f10a"; } +.icon-satellite:before { content: "\f10b"; } +.icon-debian:before { content: "\f10c"; } +.icon-grails:before { content: "\f10d"; } +.icon-c:before { content: "\f10e"; } +.icon-postgres:before { content: "\f10f"; } +.icon-database-alt2:before { content: "\f110"; } +.icon-raspberrypi:before { content: "\f111"; } +.icon-nginx:before { content: "\f112"; } +.icon-ruby-on-rails:before { content: "\f113"; } +.icon-redis:before { content: "\f114"; } +.icon-scala:before { content: "\f115"; } +.icon-gnome:before { content: "\f116"; } +.icon-perl:before { content: "\f117"; } +.icon-mysql:before { content: "\f118"; } +.icon-fedora:before { content: "\f119"; } +.icon-ghost:before { content: "\f11a"; } +.icon-google:before { content: "\f11b"; } +.icon-netbsd:before { content: "\f11c"; } +.icon-aws:before { content: "\f11d"; } +.icon-bomb:before { content: "\f11e"; } +.icon-looking:before { content: "\f11f"; } +.icon-ruby:before { content: "\f120"; } +.icon-mysql-alt:before { content: "\f121"; } +.icon-playframework-alt:before { content: "\f122"; } +.icon-osx:before { content: "\f123"; } +.icon-database:before { content: "\f124"; } +.icon-database-alt:before { content: "\f125"; } +.icon-shell:before { content: "\f126"; } +.icon-script:before { content: "\f127"; } +.icon-antenna:before { content: "\f128"; } +.icon-coffee-bean:before { content: "\f129"; } +.icon-scala-alt:before { content: "\f12a"; } +.icon-platter:before { content: "\f12b"; } +.icon-java-duke:before { content: "\f12c"; } +.icon-iphone:before { content: "\f12d"; } +.icon-script-alt:before { content: "\f12e"; } +.icon-google-alt:before { content: "\f12f"; } +.icon-haskell:before { content: "\f130"; } +.icon-mariadb:before { content: "\f131"; } +.icon-phone-retro:before { content: "\f132"; } +.icon-phone-alt:before { content: "\f133"; } +.icon-csharp:before { content: "\f134"; } +.icon-php:before { content: "\f135"; } +.icon-postgres-alt:before { content: "\f136"; } +.icon-html:before { content: "\f137"; } +.icon-mfizz:before { content: "\f138"; } +.icon-apache:before { content: "\f139"; } +.icon-hadoop:before { content: "\f13a"; } +.icon-ruby-on-rails-alt:before { content: "\f13b"; } +.icon-mobile-phone-broadcast:before { content: "\f13c"; } +.icon-css:before { content: "\f13d"; } +.icon-playframework:before { content: "\f13e"; } +.icon-clojure:before { content: "\f13f"; } +.icon-mobile-phone-alt:before { content: "\f140"; } +.icon-suse:before { content: "\f141"; } +.icon-java-bold:before { content: "\f142"; } +.icon-nginx-alt:before { content: "\f143"; } +.icon-nginx-alt2:before { content: "\f144"; } +.icon-linux-mint:before { content: "\f145"; } +.icon-dreamhost:before { content: "\f146"; } +.icon-blackberry:before { content: "\f147"; } +.icon-javascript:before { content: "\f148"; } +.icon-ubuntu:before { content: "\f149"; } +.icon-php-alt:before { content: "\f14a"; } +.icon-centos:before { content: "\f14b"; } +.icon-nodejs:before { content: "\f14c"; } +.icon-splatter:before { content: "\f14d"; } +.icon-3dprint:before { content: "\f14e"; } +.icon-line-graph:before { content: "\f14f"; } +.icon-cassandra:before { content: "\f150"; } +.icon-solaris:before { content: "\f151"; } +.icon-jetty:before { content: "\f152"; } +.icon-tomcat:before { content: "\f153"; } +.icon-oracle:before { content: "\f154"; } +.icon-oracle-alt:before { content: "\f155"; } +.icon-mssql:before { content: "\f156"; } +.icon-google-developers:before { content: "\f157"; } +.icon-google-code:before { content: "\f158"; } +.icon-kde:before { content: "\f159"; } +.icon-grails-alt:before { content: "\f15a"; } + +/* These classes only added to fix FontFamily to display FontMfizz during debug/inspection */ +.icon-osx, +.icon-bomb, +.icon-mobile-phone-broadcast, +.icon-objc, +.icon-nginx-alt2, +.icon-mysql, +.icon-phone-retro, +.icon-netbsd, +.icon-mobile-device, +.icon-ruby-on-rails, +.icon-phone-alt, +.icon-line-graph, +.icon-postgres, +.icon-playframework, +.icon-python, +.icon-ruby-on-rails-alt, +.icon-nginx, +.icon-database-alt2, +.icon-google-alt, +.icon-microscope, +.icon-blackberry, +.icon-dreamhost, +.icon-google, +.icon-centos, +.icon-kde, +.icon-csharp, +.icon-scala, +.icon-redis, +.icon-looking, +.icon-database-alt, +.icon-javascript, +.icon-postgres-alt, +.icon-linux-mint, +.icon-ubuntu, +.icon-apache, +.icon-script-alt, +.icon-mssql, +.icon-c, +.icon-gnome, +.icon-java-duke, +.icon-scala-alt, +.icon-clojure, +.icon-oracle-alt, +.icon-redhat, +.icon-haskell, +.icon-3dprint, +.icon-mariadb, +.icon-java, +.icon-script, +.icon-cplusplus, +.icon-jetty, +.icon-perl, +.icon-heroku, +.icon-nginx-alt, +.icon-iphone, +.icon-splatter, +.icon-shell, +.icon-mysql-alt, +.icon-wireless, +.icon-ruby, +.icon-playframework-alt, +.icon-raspberrypi, +.icon-suse, +.icon-nodejs, +.icon-java-bold, +.icon-google-developers, +.icon-mobile-phone-alt, +.icon-grails-alt, +.icon-coffee-bean, +.icon-cassandra, +.icon-google-code, +.icon-fedora, +.icon-antenna, +.icon-hadoop, +.icon-solaris, +.icon-html, +.icon-css, +.icon-satellite, +.icon-aws, +.icon-mfizz, +.icon-php, +.icon-debian, +.icon-ghost, +.icon-php-alt, +.icon-tomcat, +.icon-database, +.icon-grails, +.icon-freebsd, +.icon-oracle, +.icon-fire-alt, +.icon-platter{ + font-family: "FontMfizz"; +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/css/jasmine.css b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/css/jasmine.css new file mode 100644 index 0000000000000000000000000000000000000000..8c008dc7221b2395341e0a6701f40f02a83a0ca6 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/css/jasmine.css @@ -0,0 +1,82 @@ +body { background-color: #eeeeee; padding: 0; margin: 5px; overflow-y: scroll; } + +#HTMLReporter { font-size: 11px; font-family: Monaco, "Lucida Console", monospace; line-height: 14px; color: #333333; } +#HTMLReporter a { text-decoration: none; } +#HTMLReporter a:hover { text-decoration: underline; } +#HTMLReporter p, #HTMLReporter h1, #HTMLReporter h2, #HTMLReporter h3, #HTMLReporter h4, #HTMLReporter h5, #HTMLReporter h6 { margin: 0; line-height: 14px; } +#HTMLReporter .banner, #HTMLReporter .symbolSummary, #HTMLReporter .summary, #HTMLReporter .resultMessage, #HTMLReporter .specDetail .description, #HTMLReporter .alert .bar, #HTMLReporter .stackTrace { padding-left: 9px; padding-right: 9px; } +#HTMLReporter #jasmine_content { position: fixed; right: 100%; } +#HTMLReporter .version { color: #aaaaaa; } +#HTMLReporter .banner { margin-top: 14px; } +#HTMLReporter .duration { color: #aaaaaa; float: right; } +#HTMLReporter .symbolSummary { overflow: hidden; *zoom: 1; margin: 14px 0; } +#HTMLReporter .symbolSummary li { display: block; float: left; height: 7px; width: 14px; margin-bottom: 7px; font-size: 16px; } +#HTMLReporter .symbolSummary li.passed { font-size: 14px; } +#HTMLReporter .symbolSummary li.passed:before { color: #5e7d00; content: "\02022"; } +#HTMLReporter .symbolSummary li.failed { line-height: 9px; } +#HTMLReporter .symbolSummary li.failed:before { color: #b03911; content: "x"; font-weight: bold; margin-left: -1px; } +#HTMLReporter .symbolSummary li.skipped { font-size: 14px; } +#HTMLReporter .symbolSummary li.skipped:before { color: #bababa; content: "\02022"; } +#HTMLReporter .symbolSummary li.pending { line-height: 11px; } +#HTMLReporter .symbolSummary li.pending:before { color: #aaaaaa; content: "-"; } +#HTMLReporter .exceptions { color: #fff; float: right; margin-top: 5px; margin-right: 5px; } +#HTMLReporter .bar { line-height: 28px; font-size: 14px; display: block; color: #eee; } +#HTMLReporter .runningAlert { background-color: #666666; } +#HTMLReporter .skippedAlert { background-color: #aaaaaa; } +#HTMLReporter .skippedAlert:first-child { background-color: #333333; } +#HTMLReporter .skippedAlert:hover { text-decoration: none; color: white; text-decoration: underline; } +#HTMLReporter .passingAlert { background-color: #a6b779; } +#HTMLReporter .passingAlert:first-child { background-color: #5e7d00; } +#HTMLReporter .failingAlert { background-color: #cf867e; } +#HTMLReporter .failingAlert:first-child { background-color: #b03911; } +#HTMLReporter .results { margin-top: 14px; } +#HTMLReporter #details { display: none; } +#HTMLReporter .resultsMenu, #HTMLReporter .resultsMenu a { background-color: #fff; color: #333333; } +#HTMLReporter.showDetails .summaryMenuItem { font-weight: normal; text-decoration: inherit; } +#HTMLReporter.showDetails .summaryMenuItem:hover { text-decoration: underline; } +#HTMLReporter.showDetails .detailsMenuItem { font-weight: bold; text-decoration: underline; } +#HTMLReporter.showDetails .summary { display: none; } +#HTMLReporter.showDetails #details { display: block; } +#HTMLReporter .summaryMenuItem { font-weight: bold; text-decoration: underline; } +#HTMLReporter .summary { margin-top: 14px; } +#HTMLReporter .summary .suite .suite, #HTMLReporter .summary .specSummary { margin-left: 14px; } +#HTMLReporter .summary .specSummary.passed a { color: #5e7d00; } +#HTMLReporter .summary .specSummary.failed a { color: #b03911; } +#HTMLReporter .description + .suite { margin-top: 0; } +#HTMLReporter .suite { margin-top: 14px; } +#HTMLReporter .suite a { color: #333333; } +#HTMLReporter #details .specDetail { margin-bottom: 28px; } +#HTMLReporter #details .specDetail .description { display: block; color: white; background-color: #b03911; } +#HTMLReporter .resultMessage { padding-top: 14px; color: #333333; } +#HTMLReporter .resultMessage span.result { display: block; } +#HTMLReporter .stackTrace { margin: 5px 0 0 0; max-height: 224px; overflow: auto; line-height: 18px; color: #666666; border: 1px solid #ddd; background: white; white-space: pre; } + +#TrivialReporter { padding: 8px 13px; position: absolute; top: 0; bottom: 0; left: 0; right: 0; overflow-y: scroll; background-color: white; font-family: "Helvetica Neue Light", "Lucida Grande", "Calibri", "Arial", sans-serif; /*.resultMessage {*/ /*white-space: pre;*/ /*}*/ } +#TrivialReporter a:visited, #TrivialReporter a { color: #303; } +#TrivialReporter a:hover, #TrivialReporter a:active { color: blue; } +#TrivialReporter .run_spec { float: right; padding-right: 5px; font-size: .8em; text-decoration: none; } +#TrivialReporter .banner { color: #303; background-color: #fef; padding: 5px; } +#TrivialReporter .logo { float: left; font-size: 1.1em; padding-left: 5px; } +#TrivialReporter .logo .version { font-size: .6em; padding-left: 1em; } +#TrivialReporter .runner.running { background-color: yellow; } +#TrivialReporter .options { text-align: right; font-size: .8em; } +#TrivialReporter .suite { border: 1px outset gray; margin: 5px 0; padding-left: 1em; } +#TrivialReporter .suite .suite { margin: 5px; } +#TrivialReporter .suite.passed { background-color: #dfd; } +#TrivialReporter .suite.failed { background-color: #fdd; } +#TrivialReporter .spec { margin: 5px; padding-left: 1em; clear: both; } +#TrivialReporter .spec.failed, #TrivialReporter .spec.passed, #TrivialReporter .spec.skipped { padding-bottom: 5px; border: 1px solid gray; } +#TrivialReporter .spec.failed { background-color: #fbb; border-color: red; } +#TrivialReporter .spec.passed { background-color: #bfb; border-color: green; } +#TrivialReporter .spec.skipped { background-color: #bbb; } +#TrivialReporter .messages { border-left: 1px dashed gray; padding-left: 1em; padding-right: 1em; } +#TrivialReporter .passed { background-color: #cfc; display: none; } +#TrivialReporter .failed { background-color: #fbb; } +#TrivialReporter .skipped { color: #777; background-color: #eee; display: none; } +#TrivialReporter .resultMessage span.result { display: block; line-height: 2em; color: black; } +#TrivialReporter .resultMessage .mismatch { color: black; } +#TrivialReporter .stackTrace { white-space: pre; font-size: .8em; margin-left: 10px; max-height: 5em; overflow: auto; border: 1px inset red; padding: 1em; background: #eef; } +#TrivialReporter .finished-at { padding-left: 1em; font-size: .6em; } +#TrivialReporter.show-passed .passed, #TrivialReporter.show-skipped .skipped { display: block; } +#TrivialReporter #jasmine_content { position: fixed; right: 100%; } +#TrivialReporter .runner { border: 1px solid gray; display: block; margin: 5px 0; padding: 2px 0 2px 10px; } diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/css/responsive.css b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/css/responsive.css new file mode 100644 index 0000000000000000000000000000000000000000..fc06a57370a458263effd52eb9a7cd9f202dcf63 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/css/responsive.css @@ -0,0 +1,621 @@ +/* Large desktop & notebooks */ + @media (min-width: 980px) { + /* sidebar */ + #sidebar { + position: absolute; + width: 215px; + } + + #sidebar ul{ + margin-top:0px; + width: 215px; + } + #sidebar.closed ul{ + margin-top:50px; + } + + /* body container */ + #main-content { + margin-top: 0px !important; + } + + .fixed-top #main-content { + margin-top: 20px; + } + + #main-content.closed { + margin-left: 32px; + } + + #sidebar.closed, + #sidebar.closed ul { + width: 32px; + } + + #sidebar.closed .hidden-toggle { + display: none; + } + + .sidebar-closed > #sidebar > ul { + display: none; + } +} + + +/* dashboard date range button for all device size */ + +/* General styles for phones and tablets */ +@media (max-width:979px) { + /* header bar */ + #header .navbar-inner li.dropdown i { + display: inline-block; + position: relative; + } + + #header.navbar { + margin-bottom: 0px !important; + } + + #header .navbar-search { + margin-left: 80px !important; + } + + /* page title*/ + .page-title { + margin: 4px 0px 7px 8px !important; + } + + /* body */ + .fixed-top #main-content { + margin-top: 0px; + } + + /* container */ + #container { + margin-top: 0px !important; + } + + .fixed-top #container { + margin-top: 0px !important; + } + + #sidebar .sidebar-toggler { + display: none; + } + + #sidebar.in { + margin-top: 9px !important; + + } + + #sidebar ul { + margin-top:0px !important; + width:100%; + } + + .top-nav .text { + display: none; + } + + /* sidebar menu */ + #sidebar .triangle { + display: none; + } + + #sidebar { + -webkit-border-radius: 4px !important; + -moz-border-radius: 4px !important; + border-radius: 4px !important; + } + + #sidebar > ul > li:first-child > a{ + border-top:0px !important; + } + #sidebar > ul > li:last-child > a { + border-bottom:0px !important; + } + + #sidebar > ul > li:first-child > a:hover, #sidebar > ul > li.active:first-child > a{ + -webkit-border-radius: 4px 4px 0 0 !important; + -moz-border-radius: 4px 4px 0 0 !important; + border-radius: 4px 4px 0 0 !important; + border-top:0px !important; + } + #sidebar > ul > li:last-child > a:hover, #sidebar > ul > li.active:last-child > a { + -webkit-border-radius: 0 0 4px 4px !important; + -moz-border-radius: 0 0 4px 4px !important; + border-radius: 0 0 4px 4px !important; + border-bottom:0px !important; + } + + /* stat overview containers */ + .stats-overview-cont { + margin: 0px; + } + .stats-overview { + margin: 0px; + padding: 10px 10px 0px 10px; + margin-bottom: 20px; + } + + .stats-overview .details .title { + font-size: 13px; + } + + /* cirlce stats */ + .circle-stat .details { + margin-top: 0px !important; + } + .circle-stat .details .title { + margin: 0px !important; + } + + /* style switcher */ + #theme-change { + top:55px; + right:28px; + } +} + +@media (min-width: 768px) and (max-width: 1280px) { + + /*** + Form wizard + ***/ + .form-wizard .step .desc { + margin-top: 10px; + display: inline; + } + + /*** + Pricing tables + ***/ + + .pricing-table .rate .price, + .pricing-table2 .rate .price { + width: 100%; + display: block; + text-align: center; + margin-bottom: 10px; + } + +} + +/* Portrait tablet to landscape and desktop */ +@media (min-width: 768px) and (max-width: 979px) { + /* body */ + body { + padding-top: 0px; + } + + /* body container */ + #main-content { + margin: 7px !important; + position: none !important; + } + + /* sidebar */ + #sidebar { + margin: 0px 7px 10px 7px !important; + } + + /* sidebar collabler */ + #sidebar .btn-navbar.collapsed .arrow { + display: none; + } + + #sidebar .btn-navbar .arrow { + position: absolute; + right: 35px; + width: 0; + height: 0; + top:48px; + border-bottom: 15px solid #282e36; + border-left: 15px solid transparent; + border-right: 15px solid transparent; + } + + #theme-change { + border-radius: 5px !important; + -webkit-border-radius: 5px !important; + -moz-border-radius: 5px !important; + top: 80px !important; + } +} + +/* Landscape phones and down */ +@media (max-width: 767px) { + /* body */ + body { + padding: 0px 5px 5px 5px !important; + } + #header .brand { + padding: 14px 35px !important; + } + + #header.navbar-inverse .navbar-inner { + /* height: 68px !important; + */} + .navbar-inverse .brand, .navbar-inverse .nav > li > a{ + color: #fff !important; + } + + .navbar-inverse .nav li.dropdown > .dropdown-toggle .caret { + border-bottom-color: #FFF !important; + border-top-color: #FFF !important; + } + + #theme-change { + border-radius: 5px !important; + -webkit-border-radius: 5px !important; + -moz-border-radius: 5px !important; + top: 80px !important; + } + + /* header */ + #header { + padding-left: 0px; + padding-right: 0px; + margin: 0px; + margin-left: -5px; + margin-right: -5px; + } + + #footer { + padding-left: 0px; + padding-right: 0px; + } + + #header .navbar-inner { + padding-top: 0px !important; + margin-top: 0px !important; + height: 50px !important; + } + + /* sidebar */ + #sidebar > ul > li:first-child > a:hover, #sidebar > ul > li.active:first-child > a { + -webkit-border-radius: 0px !important; + -moz-border-radius: 0px !important; + border-radius: 0px !important; + } + + /* sidebar */ + #sidebar .btn-navbar .arrow { + display: none; + } + + #sidebar { + margin: 0px 0px 8px 0px !important; + } + + #sidebar .navbar-search { + width: 100% !important; + } + + + #sidebar.in { + margin-top: 7px !important; + } + + /* header */ + #header .top-nav .nav{ + margin-top: 0px; + margin-right: 5px; + } + + #header .navbar-inner { + padding-top: 0px !important; + margin-top: 0px !important; + } + + #main-content .container-fluid { + padding: 5px; + margin: 0px; + } + + /* main container */ + #container { + margin-top: 0px !important; + } + + /* body container */ + #main-content { + margin: 0px !important; + } + + /* style switcher */ + #theme-change { + top:58px; + right:12px; + } + + .breadcrumb { + padding-left: 10px; + padding-right: 10px; + margin-left: -5px; + margin-right: -5px; + } + + #header.navbar .nav > li > .dropdown-menu.notification::after { + margin-right: 110px; + } + + #header.navbar .nav > li > .dropdown-menu.notification { + margin-right: -105px; + } + + #header.navbar .nav > li > .dropdown-menu.inbox::after { + margin-right: 85px; + } + + #header.navbar .nav > li > .dropdown-menu.inbox { + margin-right: -80px; + } + + /* main container */ + #container { + margin-top: 1px !important; + } + + .fixed-top #container { + margin-top: 1px !important; + } + + .widget-body.form .form-actions{ + padding-left: 15px; + } + + /* gritter notification fix */ + #gritter-notice-wrapper { + right:1px !important; + } + + .circle-stats { + margin: 0px 0px !important; + } + /* cirlce stats */ + .circle-stat .details .title { + margin: 10px 0px !important; + } + + /*input error states*/ + .input-icon .input-error, .input-icon .input-warning, .input-icon .input-success { + top:-25px; + float: right; + right:10px !important; + } + + /*table advance*/ + .table-advance tr td.highlight:first-child a { + margin-left: 8px; + } + + /* full calendar fix */ + .fc-header-right { + left:25px; + position: absolute; + } + + .fc-header-left .fc-button { + margin: 0px !important; + top: 5px !important; + } + + .fc-header-right .fc-button { + margin: 0px !important; + top: 50px !important; + } + + .fc-button { + border: none !important; + margin-right: 2px; + } + + .fc-view { + top: 0px !important; + } + + .fc-button .fc-button-inner { + margin: 0px !important; + padding: 2px !important; + border: none !important; + margin-right: 2px !important; + background-color: #fafafa !important; + background-image: -moz-linear-gradient(top, #fafafa, #efefef) !important; + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fafafa), to(#efefef)) !important; + background-image: -webkit-linear-gradient(top, #fafafa, #efefef) !important; + background-image: -o-linear-gradient(top, #fafafa, #efefef) !important; + background-image: linear-gradient(to bottom, #fafafa, #efefef) !important; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fafafa', endColorstr='#efefef', GradientType=0) !important; + -webkit-box-shadow: 0 1px 0px rgba(255, 255, 255, .8) !important; + -moz-box-shadow: 0 1px 0px rgba(255, 255, 255, .8) !important; + box-shadow: 0 1px 0px rgba(255, 255, 255, .8) !important; + -webkit-border-radius: 3px !important; + -moz-border-radius: 3px !important; + border-radius: 3px !important; + color: #646464 !important; + border: 1px solid #ddd !important; + text-shadow: 0 1px 0px rgba(255, 255, 255, .6) !important; + text-align: center; + } + + .fc-button.fc-state-disabled .fc-button-inner { + color: #bcbbbb !important; + } + + .fc-button.fc-state-active .fc-button-inner { + background-color: #e5e4e4 !important; + background-image: -moz-linear-gradient(top, #e5e4e4, #dddcdc) !important; + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#e5e4e4), to(#dddcdc)) !important; + background-image: -webkit-linear-gradient(top, #e5e4e4, #dddcdc) !important; + background-image: -o-linear-gradient(top, #e5e4e4, #dddcdc) !important; + background-image: linear-gradient(to bottom, #e5e4e4, #dddcdc) !important; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#e5e4e4', endColorstr='#dddcdc', GradientType=0) !important; + } + + .fc-content { + margin-top: 50px; + } + + .fc-header-title h2 { + line-height: 40px !important; + font-size: 12px !important; + } + + .fc-header { + margin-bottom:0px !important; + } + + /* footer */ + #footer .go-top { + float: right; + display: block; + margin-top: -22px; + margin-right: 0px; + margin-bottom: 5px !important; + } + + #counter { + width: 300px !important; + } + .points { + display: none ; + } + + .countDays, .countHours, .countMinutes, .countSeconds { + margin: 10px; + } +} + +/* Landscape phones and down */ +@media (max-width: 430px) { + #login .lock{ + display: none !important; + } + #login, #lock { + width: 260px !important; + margin: 50px auto 0 !important; + } + #counter { + width: 300px !important; + } + .points { + display: none ; + } + .countDays, .countHours, .countMinutes, .countSeconds { + margin: 10px; + } + #header .brand { + margin-top: -5px !important; + padding: 22px 35px !important; + } + .dashboard-report-li { + float: left; + width: 100%; + padding: 0px !important; + } + #header.navbar-inverse .navbar-inner { + height: 68px !important; + } + .navbar-inverse .brand, .navbar-inverse .nav > li > a{ + color: #fff !important; + } + + .navbar-inverse .nav li.dropdown > .dropdown-toggle .caret { + border-bottom-color: #FFF !important; + border-top-color: #FFF !important; + } +} + +/* Landscape phones and down */ +@media (max-width: 385px) { + #theme-change { + top:92px !important; + right:12px !important; + } + + #login .lock{ + display: none !important; + } + #login, #lock { + width: 260px !important; + margin: 50px auto 0 !important; + } + .m-wrap { + width: 175px !important; + } + #counter { + width: 300px !important; + } + .points { + display: none ; + } + .countDays, .countHours, .countMinutes, .countSeconds { + margin: 10px; + } + #forgotform #input-email { + width: 203px; + } + /* page title*/ + .page-title small { + display: block; + margin: 0px 0px 18px 0px; + } + + /* sidebar */ + #sidebar.in { + margin-top: 7px !important; + } + + #header .navbar-inner { + padding-top: 0px !important; + margin-top: 0px !important; + height: 84px !important; + } + .navbar-inverse .brand, .navbar-inverse .nav > li > a{ + color: #fff !important; + } + + .navbar-inverse .nav li.dropdown > .dropdown-toggle .caret { + border-bottom-color: #FFF !important; + border-top-color: #FFF !important; + } + + +} + +/* Landscape phones and down */ +@media (max-width: 320px) { + #login .lock { + display: none !important; + } + #login, #lock { + width: 260px !important; + margin: 50px auto 0 !important; + } + .m-wrap { + width: 175px !important; + } + #counter { + width: 300px !important; + } + .points { + display: none ; + } + #forgotform #input-email { + width: 203px; + } + #header .brand { + margin-top: -5px !important; + padding: 22px 22px !important; + } + + .navbar-inverse .brand, .navbar-inverse .nav > li > a{ + color: #fff !important; + } + + .navbar-inverse .nav li.dropdown > .dropdown-toggle .caret { + border-bottom-color: #FFF !important; + border-top-color: #FFF !important; + } +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/css/select2.css b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/css/select2.css new file mode 100644 index 0000000000000000000000000000000000000000..edafabe24ecc99377fd310912a0a61ca2a30fb04 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/css/select2.css @@ -0,0 +1,652 @@ +/* +Version: 3.4.0 Timestamp: Tue May 14 08:27:33 PDT 2013 +*/ +.select2-container { + margin: 0; + position: relative; + display: inline-block; + /* inline-block for ie7 */ + zoom: 1; + *display: inline; + vertical-align: middle; +} + +.select2-container, +.select2-drop, +.select2-search, +.select2-search input{ + /* + Force border-box so that % widths fit the parent + container without overlap because of margin/padding. + + More Info : http://www.quirksmode.org/css/box.html + */ + -webkit-box-sizing: border-box; /* webkit */ + -khtml-box-sizing: border-box; /* konqueror */ + -moz-box-sizing: border-box; /* firefox */ + -ms-box-sizing: border-box; /* ie */ + box-sizing: border-box; /* css3 */ +} + +.select2-container .select2-choice { + display: block; + height: 26px; + padding: 0 0 0 8px; + overflow: hidden; + position: relative; + + border: 1px solid #aaa; + white-space: nowrap; + line-height: 26px; + color: #444; + text-decoration: none; + + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; + + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + + background-color: #fff; + background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eeeeee), color-stop(0.5, white)); + background-image: -webkit-linear-gradient(center bottom, #eeeeee 0%, white 50%); + background-image: -moz-linear-gradient(center bottom, #eeeeee 0%, white 50%); + background-image: -o-linear-gradient(bottom, #eeeeee 0%, #ffffff 50%); + background-image: -ms-linear-gradient(top, #ffffff 0%, #eeeeee 50%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#ffffff', endColorstr = '#eeeeee', GradientType = 0); + background-image: linear-gradient(top, #ffffff 0%, #eeeeee 50%); +} + +.select2-container.select2-drop-above .select2-choice { + border-bottom-color: #aaa; + + -webkit-border-radius:0 0 4px 4px; + -moz-border-radius:0 0 4px 4px; + border-radius:0 0 4px 4px; + + background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eeeeee), color-stop(0.9, white)); + background-image: -webkit-linear-gradient(center bottom, #eeeeee 0%, white 90%); + background-image: -moz-linear-gradient(center bottom, #eeeeee 0%, white 90%); + background-image: -o-linear-gradient(bottom, #eeeeee 0%, white 90%); + background-image: -ms-linear-gradient(top, #eeeeee 0%,#ffffff 90%); + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#eeeeee',GradientType=0 ); + background-image: linear-gradient(top, #eeeeee 0%,#ffffff 90%); +} + +.select2-container.select2-allowclear .select2-choice span { + margin-right: 42px; +} + +.select2-container .select2-choice span { + margin-right: 26px; + display: block; + overflow: hidden; + + white-space: nowrap; + + -ms-text-overflow: ellipsis; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; +} + +.select2-container .select2-choice abbr { + display: none; + width: 12px; + height: 12px; + position: absolute; + right: 24px; + top: 8px; + + font-size: 1px; + text-decoration: none; + + border: 0; + background: url('../img/select2.png') right top no-repeat; + cursor: pointer; + outline: 0; +} + +.select2-container.select2-allowclear .select2-choice abbr { + display: inline-block; +} + +.select2-container .select2-choice abbr:hover { + background-position: right -11px; + cursor: pointer; +} + +.select2-drop-mask { + position: absolute; + left: 0; + top: 0; + z-index: 9998; +} + +.select2-drop { + width: 100%; + margin-top:-1px; + position: absolute; + z-index: 9999; + top: 100%; + + background: #fff; + color: #000; + border: 1px solid #aaa; + border-top: 0; + + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; + + -webkit-box-shadow: 0 4px 5px rgba(0, 0, 0, .15); + -moz-box-shadow: 0 4px 5px rgba(0, 0, 0, .15); + box-shadow: 0 4px 5px rgba(0, 0, 0, .15); +} + +.select2-drop-auto-width { + border-top: 1px solid #aaa; + width: auto; +} + +.select2-drop-auto-width .select2-search { + padding-top: 4px; +} + +.select2-drop.select2-drop-above { + margin-top: 1px; + border-top: 1px solid #aaa; + border-bottom: 0; + + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; + + -webkit-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15); + -moz-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15); + box-shadow: 0 -4px 5px rgba(0, 0, 0, .15); +} + +.select2-container .select2-choice div { + display: inline-block; + width: 18px; + height: 100%; + position: absolute; + right: 0; + top: 0; + + border-left: 1px solid #aaa; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; + + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; + + background: #ccc; + background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #ccc), color-stop(0.6, #eee)); + background-image: -webkit-linear-gradient(center bottom, #ccc 0%, #eee 60%); + background-image: -moz-linear-gradient(center bottom, #ccc 0%, #eee 60%); + background-image: -o-linear-gradient(bottom, #ccc 0%, #eee 60%); + background-image: -ms-linear-gradient(top, #cccccc 0%, #eeeeee 60%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#eeeeee', endColorstr = '#cccccc', GradientType = 0); + background-image: linear-gradient(top, #cccccc 0%, #eeeeee 60%); +} + +.select2-container .select2-choice div b { + display: block; + width: 100%; + height: 100%; + background: url('../img/select2.png') no-repeat 0 1px; +} + +.select2-search { + display: inline-block; + width: 100%; + min-height: 26px; + margin: 0; + padding-left: 4px; + padding-right: 4px; + + position: relative; + z-index: 10000; + + white-space: nowrap; +} + +.select2-search input { + width: 100%; + height: auto !important; + min-height: 26px; + padding: 4px 20px 4px 5px; + margin: 0; + + outline: 0; + font-family: sans-serif; + font-size: 1em; + + border: 1px solid #aaa; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + + background: #fff url('../img/select2.png') no-repeat 100% -22px; + background: url('../img/select2.png') no-repeat 100% -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee)); + background: url('../img/select2.png') no-repeat 100% -22px, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%); + background: url('../img/select2.png') no-repeat 100% -22px, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%); + background: url('../img/select2.png') no-repeat 100% -22px, -o-linear-gradient(bottom, white 85%, #eeeeee 99%); + background: url('../img/select2.png') no-repeat 100% -22px, -ms-linear-gradient(top, #ffffff 85%, #eeeeee 99%); + background: url('../img/select2.png') no-repeat 100% -22px, linear-gradient(top, #ffffff 85%, #eeeeee 99%); +} + +.select2-drop.select2-drop-above .select2-search input { + margin-top: 4px; +} + +.select2-search input.select2-active { + background: #fff url('../img/select2-spinner.gif') no-repeat 100%; + background: url('../img/select2-spinner.gif') no-repeat 100%, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee)); + background: url('../img/select2-spinner.gif') no-repeat 100%, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%); + background: url('../img/select2-spinner.gif') no-repeat 100%, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%); + background: url('../img/select2-spinner.gif') no-repeat 100%, -o-linear-gradient(bottom, white 85%, #eeeeee 99%); + background: url('../img/select2-spinner.gif') no-repeat 100%, -ms-linear-gradient(top, #ffffff 85%, #eeeeee 99%); + background: url('../img/select2-spinner.gif') no-repeat 100%, linear-gradient(top, #ffffff 85%, #eeeeee 99%); +} + +.select2-container-active .select2-choice, +.select2-container-active .select2-choices { + border: 1px solid #5897fb; + outline: none; + + -webkit-box-shadow: 0 0 5px rgba(0,0,0,.3); + -moz-box-shadow: 0 0 5px rgba(0,0,0,.3); + box-shadow: 0 0 5px rgba(0,0,0,.3); +} + +.select2-dropdown-open .select2-choice { + border-bottom-color: transparent; + -webkit-box-shadow: 0 1px 0 #fff inset; + -moz-box-shadow: 0 1px 0 #fff inset; + box-shadow: 0 1px 0 #fff inset; + + -webkit-border-bottom-left-radius: 0; + -moz-border-radius-bottomleft: 0; + border-bottom-left-radius: 0; + + -webkit-border-bottom-right-radius: 0; + -moz-border-radius-bottomright: 0; + border-bottom-right-radius: 0; + + background-color: #eee; + background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, white), color-stop(0.5, #eeeeee)); + background-image: -webkit-linear-gradient(center bottom, white 0%, #eeeeee 50%); + background-image: -moz-linear-gradient(center bottom, white 0%, #eeeeee 50%); + background-image: -o-linear-gradient(bottom, white 0%, #eeeeee 50%); + background-image: -ms-linear-gradient(top, #ffffff 0%,#eeeeee 50%); + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#eeeeee', endColorstr='#ffffff',GradientType=0 ); + background-image: linear-gradient(top, #ffffff 0%,#eeeeee 50%); +} + +.select2-dropdown-open.select2-drop-above .select2-choice, +.select2-dropdown-open.select2-drop-above .select2-choices { + border: 1px solid #5897fb; + border-top-color: transparent; + + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, white), color-stop(0.5, #eeeeee)); + background-image: -webkit-linear-gradient(center top, white 0%, #eeeeee 50%); + background-image: -moz-linear-gradient(center top, white 0%, #eeeeee 50%); + background-image: -o-linear-gradient(top, white 0%, #eeeeee 50%); + background-image: -ms-linear-gradient(bottom, #ffffff 0%,#eeeeee 50%); + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#eeeeee', endColorstr='#ffffff',GradientType=0 ); + background-image: linear-gradient(bottom, #ffffff 0%,#eeeeee 50%); +} + +.select2-dropdown-open .select2-choice div { + background: transparent; + border-left: none; + filter: none; +} +.select2-dropdown-open .select2-choice div b { + background-position: -18px 1px; +} + +/* results */ +.select2-results { + max-height: 200px; + padding: 0 0 0 4px; + margin: 4px 4px 4px 0; + position: relative; + overflow-x: hidden; + overflow-y: auto; + -webkit-tap-highlight-color: rgba(0,0,0,0); +} + +.select2-results ul.select2-result-sub { + margin: 0; + padding-left: 0; +} + +.select2-results ul.select2-result-sub > li .select2-result-label { padding-left: 20px } +.select2-results ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 40px } +.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 60px } +.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 80px } +.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 100px } +.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 110px } +.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 120px } + +.select2-results li { + list-style: none; + display: list-item; + background-image: none; +} + +.select2-results li.select2-result-with-children > .select2-result-label { + font-weight: bold; +} + +.select2-results .select2-result-label { + padding: 3px 7px 4px; + margin: 0; + cursor: pointer; + + min-height: 1em; + + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.select2-results .select2-highlighted { + background: #27A0E5; + color: #fff; +} + +.select2-results li em { + background: #feffde; + font-style: normal; +} + +.select2-results .select2-highlighted em { + background: transparent; +} + +.select2-results .select2-highlighted ul { + background: white; + color: #000; +} + + +.select2-results .select2-no-results, +.select2-results .select2-searching, +.select2-results .select2-selection-limit { + background: #f4f4f4; + display: list-item; +} + +/* +disabled look for disabled choices in the results dropdown +*/ +.select2-results .select2-disabled.select2-highlighted { + color: #666; + background: #f4f4f4; + display: list-item; + cursor: default; +} +.select2-results .select2-disabled { + background: #f4f4f4; + display: list-item; + cursor: default; +} + +.select2-results .select2-selected { + display: none; +} + +.select2-more-results.select2-active { + background: #f4f4f4 url('../img/select2-spinner.gif') no-repeat 100%; +} + +.select2-more-results { + background: #f4f4f4; + display: list-item; +} + +/* disabled styles */ + +.select2-container.select2-container-disabled .select2-choice { + background-color: #f4f4f4; + background-image: none; + border: 1px solid #ddd; + cursor: default; +} + +.select2-container.select2-container-disabled .select2-choice div { + background-color: #f4f4f4; + background-image: none; + border-left: 0; +} + +.select2-container.select2-container-disabled .select2-choice abbr { + display: none; +} + + +/* multiselect */ + +.select2-container-multi .select2-choices { + height: auto !important; + height: 1%; + margin: 0; + padding: 0; + position: relative; + + border: 1px solid #aaa; + cursor: text; + overflow: hidden; + + background-color: #fff; + background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff)); + background-image: -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%); + background-image: -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%); + background-image: -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%); + background-image: -ms-linear-gradient(top, #eeeeee 1%, #ffffff 15%); + background-image: linear-gradient(top, #eeeeee 1%, #ffffff 15%); +} + +.select2-locked { + padding: 3px 5px 3px 5px !important; +} + +.select2-container-multi .select2-choices { + min-height: 26px; +} + +.select2-container-multi.select2-container-active .select2-choices { + border: 1px solid #5897fb; + outline: none; + + -webkit-box-shadow: 0 0 5px rgba(0,0,0,.3); + -moz-box-shadow: 0 0 5px rgba(0,0,0,.3); + box-shadow: 0 0 5px rgba(0,0,0,.3); +} +.select2-container-multi .select2-choices li { + float: left; + list-style: none; +} +.select2-container-multi .select2-choices .select2-search-field { + margin: 0; + padding: 0; + white-space: nowrap; +} + +.select2-container-multi .select2-choices .select2-search-field input { + padding: 5px; + margin: 1px 0; + + font-family: sans-serif; + font-size: 100%; + color: #666; + outline: 0; + border: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + background: transparent !important; +} + +.select2-container-multi .select2-choices .select2-search-field input.select2-active { + background: #fff url('../img/select2-spinner.gif') no-repeat 100% !important; +} + +.select2-default { + color: #999 !important; +} + +.select2-container-multi .select2-choices .select2-search-choice { + padding: 3px 5px 3px 18px; + margin: 3px 0 3px 5px; + position: relative; + + line-height: 13px; + color: #333; + cursor: default; + border: 1px solid #aaaaaa; + + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + + -webkit-box-shadow: 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05); + -moz-box-shadow: 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05); + box-shadow: 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05); + + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; + + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + + background-color: #e4e4e4; + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#eeeeee', endColorstr='#f4f4f4', GradientType=0 ); + background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee)); + background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + background-image: -ms-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + background-image: linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); +} +.select2-container-multi .select2-choices .select2-search-choice span { + cursor: default; +} +.select2-container-multi .select2-choices .select2-search-choice-focus { + background: #d4d4d4; +} + +.select2-search-choice-close { + display: block; + width: 12px; + height: 13px; + position: absolute; + right: 3px; + top: 4px; + + font-size: 1px; + outline: none; + background: url('../img/select2.png') right top no-repeat; +} + +.select2-container-multi .select2-search-choice-close { + left: 3px; +} + +.select2-container-multi .select2-choices .select2-search-choice .select2-search-choice-close:hover { + background-position: right -11px; +} +.select2-container-multi .select2-choices .select2-search-choice-focus .select2-search-choice-close { + background-position: right -11px; +} + +/* disabled styles */ +.select2-container-multi.select2-container-disabled .select2-choices{ + background-color: #f4f4f4; + background-image: none; + border: 1px solid #ddd; + cursor: default; +} + +.select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice { + padding: 3px 5px 3px 5px; + border: 1px solid #ddd; + background-image: none; + background-color: #f4f4f4; +} + +.select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice .select2-search-choice-close { display: none; + background:none; +} +/* end multiselect */ + + +.select2-result-selectable .select2-match, +.select2-result-unselectable .select2-match { + text-decoration: underline; +} + +.select2-offscreen, .select2-offscreen:focus { + clip: rect(0 0 0 0); + width: 1px; + height: 1px; + border: 0; + margin: 0; + padding: 0; + overflow: hidden; + position: absolute; + outline: 0; + left: 0px; +} + +.select2-display-none { + display: none; +} + +.select2-measure-scrollbar { + position: absolute; + top: -10000px; + left: -10000px; + width: 100px; + height: 100px; + overflow: scroll; +} +/* Retina-ize icons */ + +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), only screen and (min-resolution: 144dpi) { + .select2-search input, .select2-search-choice-close, .select2-container .select2-choice abbr, .select2-container .select2-choice div b { + background-image: url('../img/select2x2.png') !important; + background-repeat: no-repeat !important; + background-size: 60px 40px !important; + } + .select2-search input { + background-position: 100% -21px !important; + } +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/css/uniform.css b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/css/uniform.css new file mode 100644 index 0000000000000000000000000000000000000000..122a8c8fa4fd37f7202c203df64560c218486500 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/css/uniform.css @@ -0,0 +1,370 @@ + +div.selector, div.selector span, div.checker span, div.radio span, div.uploader, div.uploader span.action, div.button, div.button span { + background-image: url("../images/sprite.png"); + background-repeat: no-repeat; +} +.selector, .radio, .checker, .uploader, .button, .selector *, .radio *, .checker *, .uploader *, .button * { + margin: 0; + padding: 0; +} +input.text, input.email, input.password, textarea.uniform { + background: url("../images/bg-input.png") repeat-x scroll 0 0 transparent; + border-color: #AAAAAA #CCCCCC #CCCCCC #AAAAAA; + border-radius: 3px 3px 3px 3px; + border-style: solid; + border-width: 1px; + color: #777777; + font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; + font-size: 12px; + font-weight: normal; + outline: 0 none; + padding: 3px; +} +input.text:focus, input.email:focus, input.password:focus, textarea.uniform:focus { + background: url("../images/bg-input-focus.png") repeat-x scroll 0 0 transparent; + border-color: #999999; + box-shadow: 0 0 4px rgba(0, 0, 0, 0.3); +} +div.selector { + background-position: -483px -130px; + height: 26px; + line-height: 26px; +} +div.selector span { + background-position: right 0; + height: 26px; + line-height: 26px; +} +div.selector select { + left: 0; + top: 0; +} +div.selector:active, div.selector.active { + background-position: -483px -156px; +} +div.selector:active span, div.selector.active span { + background-position: right -26px; +} +div.selector.focus, div.selector.hover, div.selector:hover { + background-position: -483px -182px; +} +div.selector.focus span, div.selector.hover span, div.selector:hover span { + background-position: right -52px; +} +div.selector.focus:active, div.selector.focus.active, div.selector:hover:active, div.selector.active:hover { + background-position: -483px -208px; +} +div.selector.focus:active span, div.selector:hover:active span, div.selector.active:hover span, div.selector.focus.active span { + background-position: right -78px; +} +div.selector.disabled { + background-position: -483px -234px; +} +div.selector.disabled span { + background-position: right -104px; +} +div.checker { + height: 19px; + width: 19px; +} +div.checker input { + height: 19px; + width: 19px; +} +div.checker span { + background-position: 0 -260px; + height: 19px; + width: 19px; +} +div.checker:active span, div.checker.active span { + background-position: -19px -260px; +} +div.checker.focus span, div.checker:hover span { + background-position: -38px -260px; +} +div.checker.focus:active span, div.checker:active:hover span, div.checker.active:hover span, div.checker.focus.active span { + background-position: -57px -260px; +} +div.checker span.checked { + background-position: -76px -260px; +} +div.checker:active span.checked, div.checker.active span.checked { + background-position: -95px -260px; +} +div.checker.focus span.checked, div.checker:hover span.checked { + background-position: -114px -260px; +} +div.checker.focus:active span.checked, div.checker:hover:active span.checked, div.checker.active:hover span.checked, div.checker.active.focus span.checked { + background-position: -133px -260px; +} +div.checker.disabled span, div.checker.disabled:active span, div.checker.disabled.active span { + background-position: -152px -260px; +} +div.checker.disabled span.checked, div.checker.disabled:active span.checked, div.checker.disabled.active span.checked { + background-position: -171px -260px; +} +div.radio { + height: 18px; + width: 18px; +} +div.radio input { + height: 18px; + width: 18px; +} +div.radio span { + background-position: 0 -279px; + height: 18px; + width: 18px; +} +div.radio:active span, div.radio.active span { + background-position: -18px -279px; +} +div.radio.focus span, div.radio:hover span { + background-position: -36px -279px; +} +div.radio.focus:active span, div.radio:active:hover span, div.radio.active:hover span, div.radio.active.focus span { + background-position: -54px -279px; +} +div.radio span.checked { + background-position: -72px -279px; +} +div.radio:active span.checked, div.radio.active span.checked { + background-position: -90px -279px; +} +div.radio.focus span.checked, div.radio:hover span.checked { + background-position: -108px -279px; +} +div.radio.focus:active span.checked, div.radio:hover:active span.checked, div.radio.focus.active span.checked, div.radio.active:hover span.checked { + background-position: -126px -279px; +} +div.radio.disabled span, div.radio.disabled:active span, div.radio.disabled.active span { + background-position: -144px -279px; +} +div.radio.disabled span.checked, div.radio.disabled:active span.checked, div.radio.disabled.active span.checked { + background-position: -162px -279px; +} +div.uploader { + background-position: 0 -297px; + height: 28px; +} +div.uploader span.action { + background-position: right -409px; + height: 24px; + line-height: 24px; +} +div.uploader span.filename { + height: 24px; + line-height: 24px; + margin: 2px 0 2px 2px; +} +div.uploader.focus, div.uploader.hover, div.uploader:hover { + background-position: 0 -353px; +} +div.uploader.focus span.action, div.uploader.hover span.action, div.uploader:hover span.action { + background-position: right -437px; +} +div.uploader.active span.action, div.uploader:active span.action { + background-position: right -465px; +} +div.uploader.focus.active span.action, div.uploader.active:focus span.action, div.uploader.focus:active span.action, div.uploader:focus:active span.action { + background-position: right -493px; +} +div.uploader.disabled { + background-position: 0 -325px; +} +div.uploader.disabled span.action { + background-position: right -381px; +} +div.button { + background-position: 0 -523px; +} +div.button span { + background-position: right -643px; +} +div.button.focus, div.button:focus, div.button:hover, div.button.hover { + background-position: 0 -553px; +} +div.button.focus span, div.button:focus span, div.button:hover span, div.button.hover span { + background-position: right -673px; +} +div.button.active, div.button:active { + background-position: 0 -583px; +} +div.button.active span, div.button:active span { + background-position: right -703px; + color: #555555; +} +div.button.disabled, div.button:disabled { + background-position: 0 -613px; +} +div.button.disabled span, div.button:disabled span { + background-position: right -733px; + color: #BBBBBB; + cursor: default; +} +div.button { + height: 30px; +} +div.button span { + font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; + font-size: 12px; + font-weight: bold; + height: 22px; + letter-spacing: 1px; + margin-left: 13px; + padding-left: 2px; + padding-right: 15px; + padding-top: 8px; + text-transform: uppercase; +} +div.selector { + font-size: 12px; + width: 190px; +} +div.selector select { + border: 1px solid #FFFFFF; + font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; + font-size: 12px; + min-width: 190px; +} +div.selector span { + cursor: pointer; + padding: 0 25px 0 2px; +} +div.selector span { + color: #666666; + text-shadow: 0 1px 0 #FFFFFF; + width: 158px; +} +div.selector.disabled span { + color: #BBBBBB; +} +div.checker { + margin-right: 5px; +} +div.radio { + margin-right: 3px; +} +div.uploader { + cursor: pointer; + width: 190px; +} +div.uploader span.action { + background-color: #FFFFFF; + font-size: 11px; + font-weight: bold; + text-align: center; + text-shadow: 0 1px 0 #FFFFFF; + width: 85px; +} +div.uploader span.filename { + border-right: 1px solid #BBBBBB; + color: #777777; + font-size: 11px; + width: 82px; +} +div.uploader input { + width: 190px; +} +div.uploader.disabled span.action { + color: #AAAAAA; +} +div.uploader.disabled span.filename { + border-color: #DDDDDD; + color: #AAAAAA; +} +.selector, .checker, .button, .radio, .uploader { + display: inline-block; + vertical-align: middle; +} +.selector select:focus, .radio input:focus, .checker input:focus, .uploader input:focus { + outline: 0 none; +} +div.button a, div.button button, div.button input { + position: absolute; +} +div.button { + cursor: pointer; + position: relative; +} +div.button span { + display: inline-block; + line-height: 1; + text-align: center; +} +div.selector { + overflow: hidden; + padding-left: 10px; + position: relative; +} +div.selector span { + display: block; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +div.selector select { + background: none repeat scroll 0 0 transparent; + border: medium none; + height: 25px; + opacity: 0; + position: absolute; +} +div.checker { + position: relative; +} +div.checker span { + display: inline-block; + text-align: center; +} +div.checker input { + background: none repeat scroll 0 0 transparent; + display: inline-block; + opacity: 0; +} +div.radio { + position: relative; +} +div.radio span { + display: inline-block; + text-align: center; +} +div.radio input { + background: none repeat scroll 0 0 transparent; + display: inline-block; + opacity: 0; + text-align: center; +} +div.uploader { + cursor: default; + overflow: hidden; + position: relative; +} +div.uploader span.action { + cursor: pointer; + display: inline; + float: left; + overflow: hidden; + padding: 2px 0; +} +div.uploader span.filename { + cursor: default; + display: block; + float: left; + overflow: hidden; + padding: 0 10px; + text-overflow: ellipsis; + white-space: nowrap; +} +div.uploader input { + border: medium none; + bottom: 0; + cursor: default; + float: right; + height: 25px; + opacity: 0; + position: absolute; + right: 0; + top: 0; +} + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo SIL OFL Font License 1.1.txt b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo SIL OFL Font License 1.1.txt new file mode 100644 index 0000000000000000000000000000000000000000..3667d79b1ec924ecd767925872e288becab37de7 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo SIL OFL Font License 1.1.txt @@ -0,0 +1,94 @@ +Copyright (c) 2011, Natanael Gama (http://www.ndiscovered.com |exo(at)ndiscovered.com>), +with Reserved Font Name Exo. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. \ No newline at end of file diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Black-Italic-webfont.eot b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Black-Italic-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..4e4de4c66a91f1cbb3457b7b1b96470817831495 Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Black-Italic-webfont.eot differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Black-Italic-webfont.svg b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Black-Italic-webfont.svg new file mode 100644 index 0000000000000000000000000000000000000000..a269743c2f29cedec8e2aba008264e2ba1717bde --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Black-Italic-webfont.svg @@ -0,0 +1,187 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Copyright c 2011 Natanael Gama exondiscoveredcom with Reserved Font Name Exo +Designer : Natanael Gama +</metadata> +<defs> +<font id="ExoBlackItalic" horiz-adv-x="1136" > +<font-face units-per-em="2048" ascent="1638" descent="-410" /> +<missing-glyph horiz-adv-x="512" /> +<glyph unicode=" " horiz-adv-x="512" /> +<glyph unicode="	" horiz-adv-x="512" /> +<glyph unicode=" " horiz-adv-x="512" /> +<glyph unicode="!" horiz-adv-x="567" d="M117 47l39 240q6 51 57 51h236q47 0 38 -51l-38 -240q-6 -47 -54 -47h-235q-49 0 -43 47zM193 401l137 1096h377l-215 -1096h-299z" /> +<glyph unicode=""" horiz-adv-x="1017" d="M295 1087l18 275l23 137h377l-23 -137l-63 -275h-332zM737 1087l23 275l22 137h377l-22 -137l-64 -275h-336z" /> +<glyph unicode="#" horiz-adv-x="1533" d="M84 393l84 271h301l59 174h-305l86 270h316l139 391h270l-139 -391h180l137 391h271l-137 -391h342l-82 -270h-344l-60 -176h344l-80 -271h-368l-137 -391h-271l137 391l-182 2l-137 -393h-270l137 393h-291zM739 664l193 -2l59 176h-192z" /> +<glyph unicode="$" horiz-adv-x="1159" d="M119 53l49 309q219 -23 465 -22q66 0 96.5 19.5t38.5 64.5l4 33q8 47 -11.5 68.5t-82.5 21.5h-123q-92 0 -160.5 28.5t-103.5 77.5t-55.5 100.5t-21.5 113t0 97t7 70.5l17 125q16 106 59 177t112.5 107t140.5 50t167 18l26 177h222l-27 -177q174 -8 334 -67l-49 -309 q-184 20 -428 20q-90 0 -123 -14.5t-43 -75.5l-4 -23q-8 -53 11 -75.5t97 -22.5h131q111 0 184.5 -53t99.5 -128t36 -159t-6 -145l-11 -68q-16 -106 -53 -183t-80 -119t-105.5 -66.5t-112.5 -30.5t-120 -8l-26 -168h-221l26 168q-27 0 -50.5 1t-40.5 2t-36.5 3t-31 3t-31 6 t-26.5 7t-30.5 9.5t-31 10.5t-38 13t-40.5 14z" /> +<glyph unicode="%" horiz-adv-x="1980" d="M205 1022l37 231q20 131 96 188.5t231 57.5h207q143 0 200.5 -82t37.5 -219l-37 -231q-20 -131 -97 -191.5t-231 -60.5h-207q-143 0 -200 84t-37 223zM391 0l1168 1499h253l-1153 -1499h-268zM469 1011.5q0 -18.5 15.5 -29.5t47.5 -11h105q84 0 94 82l17 108 q8 49 -7.5 65.5t-56.5 16.5h-104q-80 0 -93 -82l-16 -108q-2 -23 -2 -41.5zM1208 303l35 232q20 133 96 194.5t230 61.5h209q143 0 200.5 -84t36.5 -224l-33 -231q-20 -131 -98 -188.5t-233 -57.5h-209q-279 0 -234 297zM1473 344q-6 -41 5 -61.5t58 -20.5h102q84 0 95 82 l16 109q8 49 -7.5 65.5t-55.5 16.5h-103q-82 0 -94 -82z" /> +<glyph unicode="&" horiz-adv-x="1456" d="M160 178q-184 326 145 570l178 133l-65 116q-59 115 -40 220.5t93 183.5t166 94q262 47 616 -41l-47 -295h-272q-113 0 -124 -30.5t48 -129.5l186 -327l283 235l115 -180l-144 -254l-92 -88l219 -385h-442l-94 166l-156 -115q-72 -53 -178 -65.5t-220 35.5t-175 157z M481 397q57 -94 150 -22l88 69l-90 150l-99 -68q-86 -70 -49 -129z" /> +<glyph unicode="'" horiz-adv-x="524" d="M258 1087l21 275l22 137h399l-22 -137l-64 -275h-356z" /> +<glyph unicode="(" horiz-adv-x="843" d="M161.5 285.5q1.5 154.5 28.5 320.5q88 558 417 905q83 88 145 127h350q-16 -20 -46 -57t-107 -155.5t-141.5 -240.5t-129 -298t-90.5 -342q-29 -195 -23 -363t37 -303t64.5 -231.5t60.5 -148.5l27 -52h-351q-6 8 -18 21.5t-45 65.5t-61.5 112.5t-58.5 162t-45 212 t-13.5 265z" /> +<glyph unicode=")" horiz-adv-x="845" d="M-45 -553q16 18 45 52t105.5 146.5t140 233.5t129 303.5t94.5 362.5q75 474 -111 962l-57 131h350q6 -8 18.5 -24.5t44 -73.5t59.5 -120.5t57.5 -167t45 -213t15.5 -256t-25 -300.5q-37 -227 -103.5 -417.5t-136 -300t-134 -186.5t-105.5 -104l-41 -28h-391z" /> +<glyph unicode="*" horiz-adv-x="854" d="M240 1159l22 144l291 38l-21 -192zM291 856l94 283l180 -49l-145 -277zM508 940l131 162l203 -182l-103 -115zM555 1479l143 45l84 -258l-190 -70zM655 1169l271 166l65 -116l-239 -199z" /> +<glyph unicode="+" horiz-adv-x="933" d="M131 571l49 316h266l43 268h316l-43 -268h270l-49 -316h-270l-43 -268h-316l43 268h-266z" /> +<glyph unicode="," horiz-adv-x="520" d="M80 -180l20 127q29 0 44.5 7t19.5 14t6 22l2 10h-22q-51 0 -44 51l37 234q8 55 60 55h227q49 0 41 -55l-49 -308q-12 -72 -51 -113.5t-87 -52t-94.5 -9.5t-77.5 10z" /> +<glyph unicode="-" horiz-adv-x="722" d="M125 436l49 316h643l-49 -316h-643z" /> +<glyph unicode="." horiz-adv-x="524" d="M104 47l39 240q6 51 58 51h231q53 0 43 -51l-39 -240q-8 -47 -57 -47h-232q-49 0 -43 47z" /> +<glyph unicode="/" horiz-adv-x="1030" d="M0 -147l848 1724h407l-847 -1724h-408z" /> +<glyph unicode="0" horiz-adv-x="1267" d="M139 393l111 692q33 207 134 310.5t288 103.5h336q209 0 296 -112.5t60 -280.5l-113 -713q-63 -393 -401 -393h-336q-201 0 -302.5 105.5t-72.5 287.5zM551 477q-8 -53 8 -81.5t36.5 -34t51.5 -5.5h86q59 0 90 21.5t43 97.5l88 549q18 119 -80 119h-116 q-37 0 -62.5 -13.5t-37 -38t-15.5 -36t-6 -31.5z" /> +<glyph unicode="1" horiz-adv-x="776" d="M215 1081l39 252q174 53 272 166h394l-238 -1499h-397l178 1122q-87 -58 -248 -41z" /> +<glyph unicode="2" horiz-adv-x="1187" d="M61 0l56 344q201 121 484.5 349.5t299.5 328.5q14 88 -32 113.5t-181 25.5h-457l48 297q291 61 612 62q229 0 334.5 -156t70.5 -383q-10 -68 -48 -138.5t-74.5 -121.5t-108.5 -117.5t-105.5 -95.5t-111.5 -87.5t-84 -64.5h430l-57 -356h-1076z" /> +<glyph unicode="3" horiz-adv-x="1175" d="M53 43l49 301h447q129 0 168 15.5t49 82.5l2 21q4 29 -2 47t-14.5 28.5t-37 16.5t-48 7t-70.5 5l-332 19l53 323l336 17q57 2 77 4t52.5 7t43 15.5t21.5 27.5t15 46l2 16q6 37 -3 59.5t-39.5 32t-56.5 11.5t-77 2h-473l47 299q197 66 682 57q170 -4 263 -120.5t65 -299.5 l-15 -79q-39 -231 -219 -259q90 -25 117 -124t6 -232l-10 -59q-53 -344 -461 -344h-76h-80q-16 0 -73.5 1t-79 2t-68.5 4t-72.5 7t-63.5 10t-66.5 14.5t-57.5 18.5z" /> +<glyph unicode="4" horiz-adv-x="1300" d="M94 459l596 1040h426l-457 -854h199l45 275l80 159h342l-70 -434h123l-47 -305l-133 -59l-43 -277h-397l43 277h-666z" /> +<glyph unicode="5" horiz-adv-x="1212" d="M94 41l51 317h541q45 0 73.5 9.5t41 31t15.5 32.5t7 36l11 63q8 55 -9.5 82t-72.5 27h-90q-90 0 -105 -92h-381l197 952h948l-57 -356h-562l-40 -209q63 35 141 41t153 0q168 -14 236 -131t45 -291l-31 -234q-53 -328 -477 -327q-211 0 -330 8t-305 41z" /> +<glyph unicode="6" horiz-adv-x="1226" d="M168 425.5q0 159.5 33 401.5q25 158 64.5 276t82.5 188.5t101.5 116.5t107.5 64.5t113 28.5q281 43 671 -43l-47 -303h-448q-55 0 -93 -14.5t-59.5 -31.5t-38 -59t-21.5 -69t-16 -86q59 29 121 36t199 7q377 0 309 -428l-30 -207q-31 -184 -137.5 -244.5t-309.5 -60.5 h-283q-98 0 -164.5 39t-110.5 134t-44 254.5zM570 396q24 -42 126 -42h45q51 0 73 19.5t30 75.5l8 40q14 66 3 89.5t-64 23.5h-220q-25 -164 -1 -206z" /> +<glyph unicode="7" horiz-adv-x="1148" d="M215 1143l57 356h985l70 -160l-680 -1339h-422l586 1143h-596z" /> +<glyph unicode="8" horiz-adv-x="1261" d="M143 408l17 108q29 172 190 199q-66 35 -92.5 99.5t-24 116.5t14.5 132l20 133q16 102 58.5 169t111 96.5t132 38.5t155.5 9h319q182 0 265.5 -101t52.5 -296l-14 -90q-8 -59 -55.5 -121.5t-137.5 -75.5q63 -12 93 -78.5t25 -134t-9 -118.5l-25 -156q-16 -96 -49 -162.5 t-68 -100.5t-97 -51.5t-104 -20.5t-118 -3h-318q-405 0 -342 408zM551 430q-8 -53 9.5 -73.5t70.5 -20.5h106q61 0 84 22.5t29 71.5l12 82q8 47 -6 71.5t-70 24.5h-110q-59 0 -83 -24.5t-30 -71.5zM643 1012q-8 -57 9.5 -73.5t72.5 -16.5h106q63 0 83 19.5t28 70.5l8 61 q0 37 1 57.5t-16 29.5t-28.5 11.5t-36.5 2.5h-106q-53 0 -77.5 -17.5t-35.5 -83.5z" /> +<glyph unicode="9" horiz-adv-x="1224" d="M125 41l47 303h449q68 0 110.5 17.5t65 59.5t32 76.5t21.5 106.5q-59 -29 -121.5 -36t-200.5 -7q-106 0 -177.5 39t-99.5 101.5t-37 143.5t9 165l27 166q29 186 137.5 255.5t304.5 69.5h283q137 0 215 -82t103.5 -275.5t-29.5 -512.5q-25 -158 -65 -271.5t-81 -178 t-101.5 -104.5t-105.5 -54.5t-112 -24.5q-283 -43 -674 43zM612.5 920.5q10.5 -23.5 63.5 -23.5h219q25 160 0 204t-127 44h-43q-51 0 -72.5 -19.5t-29.5 -74.5l-7 -41q-14 -66 -3.5 -89.5z" /> +<glyph unicode=":" horiz-adv-x="526" d="M104 47l39 240q6 51 58 51h231q53 0 43 -51l-39 -240q-8 -47 -57 -47h-232q-49 0 -43 47zM223 797l39 239q6 51 57 51h232q51 0 41 -51l-37 -239q-8 -47 -57 -47h-232q-49 0 -43 47z" /> +<glyph unicode=";" horiz-adv-x="526" d="M80 -180l20 127q29 0 44.5 7t19.5 14t6 22l2 10h-22q-51 0 -44 51l37 234q8 55 60 55h227q49 0 41 -55l-49 -308q-12 -72 -51 -113.5t-87 -52t-94.5 -9.5t-77.5 10zM225 797l37 239q6 51 57 51h232q53 0 43 -51l-37 -239q-8 -47 -59 -47h-232q-47 0 -41 47z" /> +<glyph unicode="<" horiz-adv-x="882" d="M143 545l56 348l811 266l-56 -348l-393 -98l361 -99l-56 -348z" /> +<glyph unicode="=" horiz-adv-x="956" d="M92 332l49 315h875l-49 -315h-875zM164 780l49 316h874l-49 -316h-874z" /> +<glyph unicode=">" horiz-adv-x="880" d="M98 266l56 348l395 127l-365 70l56 348l725 -266l-54 -348z" /> +<glyph unicode="?" horiz-adv-x="1116" d="M205 1155l47 297q291 74 588 61q219 0 324.5 -137t78.5 -303l-18 -145q-27 -209 -138.5 -290t-365.5 -73l-25 -166h-297l72 455h188q80 4 120 35t52 108l5 31q10 66 -29 96.5t-129 30.5h-473zM322 47l38 240q6 51 58 51h231q53 0 43 -51l-39 -240q-8 -47 -57 -47h-231 q-49 0 -43 47z" /> +<glyph unicode="@" horiz-adv-x="1884" d="M82 121l149 946q23 139 74 230.5t135 137.5t175.5 62t222.5 16h727q451 0 366 -569l-92 -622q-25 -172 -121 -244t-313 -72h-254l-49 103q-80 -121 -236 -117q-190 6 -271 169t-40 437q25 164 76 272.5t123.5 159.5t142.5 69.5t160 18.5q178 0 280.5 -31.5t182.5 -109.5 l-97 -676q74 0 96.5 29.5t41.5 154.5l73 500q20 137 -15.5 184.5t-148.5 47.5h-700q-70 0 -117 -18.5t-72.5 -55.5t-37 -71t-19.5 -87l-143 -905q-14 -96 21.5 -144.5t158.5 -48.5h791l-39 -239q-276 -55 -598 -56h-180q-533 1 -453 529zM839 471q-3 -35 1 -85t31.5 -75.5 t78.5 -23.5q180 6 193 143l59 385q-74 10 -162 10q-86 0 -126.5 -57t-63.5 -207q-8 -55 -11 -90z" /> +<glyph unicode="A" horiz-adv-x="1456" d="M51 0l707 1499h469l217 -1499h-408l-43 262h-385l-116 -262h-441zM752 600h215l-47 401z" /> +<glyph unicode="B" horiz-adv-x="1230" d="M92 0l238 1499h631q229 0 323 -124q70 -93 70 -228q0 -46 -8 -98q-16 -102 -89 -182.5t-180 -88.5q111 -18 169 -124q42 -77 42 -177q0 -37 -6 -76q-14 -96 -36.5 -164.5t-61.5 -112.5t-77 -69.5t-105.5 -37t-121 -14.5t-147.5 -3h-641zM543 336h223q55 0 83 36t40 107 q5 29 5 52q0 95 -83 96h-223zM639 942h203q45 0 73.5 29.5t34.5 75.5q3 19 3 35q0 81 -74 81h-2h-203z" /> +<glyph unicode="C" horiz-adv-x="1159" d="M180 817q57 371 199.5 535t439.5 164q213 0 305.5 -15.5t223.5 -66.5l-50 -310l-12 2q-12 2 -33.5 5.5t-50 7.5t-65.5 7t-76 6t-85 5t-89 2h-61q-16 0 -50.5 -5t-46.5 -14.5t-35.5 -28.5t-35 -48t-28 -73t-28.5 -103.5t-24 -136.5q-23 -139 -23 -224q-1 -70 15 -105 q34 -77 188 -77q96 0 200.5 4t161.5 9l58 5l-50 -309q-104 -41 -216 -55q-88 -11 -241 -11q-44 0 -93 1q-423 6 -423 540q0 129 25 289z" /> +<glyph unicode="D" horiz-adv-x="1323" d="M92 0l238 1499h647q426 0 425 -539q0 -125 -22 -278q-31 -213 -80 -348t-127.5 -208t-170 -99.5t-228.5 -26.5h-682zM543 336h213q96 0 145 93t84 316q25 130 25 215q0 32 -4 58q-14 94 -44 119.5t-96 25.5h-192z" /> +<glyph unicode="E" d="M131 354l129 817q16 104 60.5 174t110 102t125.5 42t140 10q387 0 623 -33l-53 -333h-506q-39 0 -62.5 -9.5t-36 -29t-16.5 -33.5t-8 -43l-12 -82l503 -23l-53 -329l-510 -19l-16 -98q-6 -39 0 -62.5t27.5 -31.5t37 -10.5t45.5 -2.5h486l-53 -331q-96 -12 -250 -21.5 t-259 -11.5l-106 -2h-23q-39 0 -76 5q-48 7 -101.5 30.5t-88.5 61.5q-36 37 -54 105q-10 37 -9 82q0 36 6 76z" /> +<glyph unicode="F" horiz-adv-x="1140" d="M82 0l178 1130q16 106 61.5 181t109 114t129 56.5t140.5 17.5q387 0 623 -33l-51 -333h-506q-39 0 -63.5 -9.5t-37 -29t-16.5 -35t-8 -41.5l-14 -90l506 -23l-52 -330l-514 -18l-88 -557h-397z" /> +<glyph unicode="G" horiz-adv-x="1265" d="M152 522q3 146 38 318q37 190 79 309t113 206t173 124t254 37q242 0 326 -11.5t284 -68.5l-49 -301q-2 0 -29.5 5t-74.5 11t-104.5 12t-133.5 11.5t-149 5.5q-139 0 -194.5 -85t-96.5 -341q-18 -113 -24 -172q-6 -52 -6 -98v-14q1 -52 20.5 -72.5t50 -32t88 -11.5 t97.5 23.5t52 47.5l13 24l24 153h-100l39 246q104 51 366 51q66 0 140 -6l-144 -893h-280l-97 100q-55 -59 -104 -80.5t-166 -29.5q-19 -1 -38 -1q-128 0 -211 61q-95 69 -126 198q-30 120 -30 253v21z" /> +<glyph unicode="H" horiz-adv-x="1302" d="M92 0l238 1499h397l-94 -596h348l94 596h398l-238 -1499h-397l86 547h-349l-86 -547h-397z" /> +<glyph unicode="I" horiz-adv-x="577" d="M92 0l238 1499h397l-238 -1499h-397z" /> +<glyph unicode="J" horiz-adv-x="724" d="M47 51l49 316q109 0 158 19.5t65.5 54t30.5 124.5l148 934h397l-184 -1161q-35 -229 -158 -301q-81 -46 -226 -46q-17 0 -35 1q-171 6 -245 59z" /> +<glyph unicode="K" horiz-adv-x="1351" d="M92 0l238 1499h377l-95 -590h62l399 590h477l-530 -784l293 -715h-447l-204 573h-101l-90 -573h-379z" /> +<glyph unicode="L" horiz-adv-x="1075" d="M141 319l187 1180h397l-164 -1036q-6 -39 0 -62.5t27.5 -32t37 -10.5t46.5 -2h422l-58 -356h-606q-152 0 -234 78q-62 58 -62 165q0 35 7 76z" /> +<glyph unicode="M" horiz-adv-x="1738" d="M63 0l398 1499h553l-6 -842l258 842h563l-76 -1499h-391l41 817l-258 -817h-465l-2 817l-213 -817h-402z" /> +<glyph unicode="N" horiz-adv-x="1386" d="M92 0l238 1499h401l307 -776l121 776h397l-237 -1499h-397l-312 756l-118 -756h-400z" /> +<glyph unicode="O" horiz-adv-x="1363" d="M167 532q3 116 26 259q23 147 59.5 260.5t74.5 189.5t97 128t107.5 79t126 41t131 17t145.5 3q82 0 145.5 -8t127 -31.5t108.5 -62.5t80 -101.5t50 -147.5q13 -75 14 -176q0 -14 -1 -28q-2 -118 -24 -266q-23 -139 -57 -246.5t-70.5 -181.5t-92 -124t-105.5 -78.5 t-126 -43t-136.5 -18.5t-152.5 -4q-84 0 -149.5 8t-129 30.5t-107.5 60.5t-78 99q-34 62 -50 144q-13 69 -13 161v37zM576 426q28 -78 174 -78q133 0 190 78t96 313q27 137 27 223q0 22 -2 40q-8 92 -47 121.5t-135.5 29.5t-144.5 -27.5t-81.5 -114t-62.5 -272.5 q-25 -141 -24 -226q-1 -56 10 -87z" /> +<glyph unicode="P" horiz-adv-x="1228" d="M90 0l238 1499h626q86 0 159 -25.5t137 -83.5q66 -58 90 -170q12 -55 12 -122t-13 -146q-16 -100 -45.5 -177t-61.5 -125t-81 -79.5t-85 -46t-94 -18.5q-47 -3 -76 -3h-14q-30 1 -85.5 5t-134 19.5t-89.5 21.5l-86 -549h-397zM621 844h188q104 0 131 164q5 30 5 53 q0 100 -84 100h-1h-188z" /> +<glyph unicode="Q" horiz-adv-x="1363" d="M167 542q3 116 26 259q18 115 43.5 209t53 163.5t68.5 123t75 89t88 59t91 37t102.5 19.5t105.5 7t114 1q80 0 145.5 -9t128 -32.5t107.5 -63.5t80 -104.5t50 -149.5q13 -75 13 -177v-28q-2 -120 -24 -267q-23 -139 -57 -245.5t-70.5 -179.5t-93 -122t-104.5 -75.5 t-127 -41t-135 -17.5t-153 -5q-84 0 -150.5 9t-129 32.5t-107.5 62.5t-78.5 100.5t-48.5 145.5q-13 70 -13 163v37zM573 -68h209v-6q0 -41 26 -62q28 -22 82 -24q15 -1 30 -1q37 0 69 4q45 5 107 18l-45 -287q-53 -10 -105 -10q-43 0 -86 7q-92 15 -162.5 52t-105.5 117 q-24 56 -24 125q0 32 5 67zM576 426q28 -78 174 -78q133 0 190 78t96 313q27 137 27 223q0 21 -2 40q-8 92 -47 121.5t-135.5 29.5t-144.5 -27.5t-81.5 -114t-62.5 -272.5q-25 -141 -25 -226q0 -56 11 -87z" /> +<glyph unicode="R" horiz-adv-x="1226" d="M90 0l238 1499h628q210 0 318 -132q77 -94 78 -258q0 -65 -13 -142q-16 -102 -44.5 -177t-57.5 -114t-69 -64.5t-63.5 -33t-57.5 -11.5l208 -567h-452l-154 551l-74 8l-88 -559h-397zM625 858h178q74 0 98.5 35t38.5 125q5 29 5 52q1 34 -11 56q-18 34 -82 35h-178z" /> +<glyph unicode="S" horiz-adv-x="1200" d="M131 53l49 309q210 -22 482 -22h24q66 0 96.5 19.5t38.5 64.5l4 33q2 14 2 26q0 29 -13 43q-19 22 -83 21h-143q-92 0 -163 25.5t-108.5 69.5t-61.5 90t-29 101.5t-5 90t4 67.5l23 172q12 86 44 149.5t74 100.5t102 58.5t117.5 29.5t135.5 10q46 1 90 1q335 0 514 -68 l-49 -309q-184 20 -469 20q-90 0 -123 -14.5t-43 -75.5l-4 -23q-2 -15 -2 -28q-1 -32 13 -48q20 -22 97 -22h152q111 0 185.5 -45t102 -110.5t41.5 -141.5q7 -37 6 -71q0 -35 -7 -66l-4 -129q-4 -111 -41 -188.5t-84 -117.5t-123 -61.5t-128 -25.5t-132 -4q-246 0 -345.5 10 t-236.5 59z" /> +<glyph unicode="T" horiz-adv-x="1222" d="M221 1143l58 356h1163l-58 -356h-389l-180 -1143h-397l180 1143h-377z" /> +<glyph unicode="U" horiz-adv-x="1335" d="M174 490q2 102 23 227l127 782h397l-133 -844q-14 -97 -18 -165q0 -7 -1 -13q0 -59 36 -93q40 -38 132 -38q66 0 109 19.5t67.5 68.5t36 93t23.5 128l133 844h399l-123 -905q-20 -127 -54 -226.5t-75 -163t-90 -108.5t-102 -64.5t-109 -31.5q-48 -10 -94 -10h-16 q-22 1 -43 1q-32 0 -64 -2q-37 1 -55 1q-61 0 -106.5 3t-101.5 14t-96 33.5t-82 56.5t-66 89q-24 56 -40 128q-13 62 -14 148v28z" /> +<glyph unicode="V" horiz-adv-x="1431" d="M266 1499h418l80 -1012l416 1012h438l-686 -1499h-479z" /> +<glyph unicode="W" horiz-adv-x="2082" d="M266 1499h418l84 -991l350 991h418l-131 -332l90 -659l360 991h418l-604 -1499h-463l-71 494l-189 -494h-493z" /> +<glyph unicode="X" horiz-adv-x="1390" d="M57 0l545 784l-313 715h440l150 -416l280 416h440l-557 -797l310 -702h-441l-143 401l-270 -401h-441z" /> +<glyph unicode="Y" horiz-adv-x="1390" d="M266 1499h432l99 -663l331 663h449l-645 -1089l-66 -410h-397l66 410z" /> +<glyph unicode="Z" horiz-adv-x="1130" d="M41 0l57 356l699 787h-576l58 356h1050l-57 -356l-660 -787h537l-57 -356h-1051z" /> +<glyph unicode="[" horiz-adv-x="706" d="M91 -176.5q3 69.5 11 137.5l211 1280q33 201 141.5 281t340.5 80h163l-49 -316h-61q-61 0 -99 -36t-53 -124l-196 -1204q-14 -88 10.5 -124t85.5 -36h72l-50 -315h-196q-92 0 -159.5 33t-101.5 86t-53.5 120.5t-16.5 137z" /> +<glyph unicode="\" horiz-adv-x="1017" d="M270 1577h402l303 -1724h-402z" /> +<glyph unicode="]" horiz-adv-x="694" d="M-45 -553l49 315h62q61 0 100 36t53 124l191 1204q27 160 -103 160h-61l51 316h172q203 0 286 -132.5t54 -347.5l-184 -1312q-23 -170 -124.5 -266.5t-340.5 -96.5h-205z" /> +<glyph unicode="^" horiz-adv-x="774" d="M229 1087l250 287h269l141 -287h-227l-64 105l-98 -105h-271z" /> +<glyph unicode="_" horiz-adv-x="1378" d="M59 -2l50 315h1298l-49 -315h-1299z" /> +<glyph unicode="`" horiz-adv-x="497" d="M240 1380h297l110 -293h-223z" /> +<glyph unicode="a" horiz-adv-x="1118" d="M141 639q20 94 51 169t63 123t77 83t83 53t92 27.5t91 11.5t94 2q383 0 516 -127l-143 -977h-313l-62 102q-62 -116 -283 -116h-4q-157 0 -241 178q-48 101 -48 240q0 105 27 231zM516 397q2 -47 21.5 -68.5t56.5 -21.5q123 0 133 107l55 389q-18 16 -52 16q-24 0 -56 -8 q-37 -8 -59.5 -23.5t-47.5 -64.5t-37 -133q-10 -70 -13 -108q-2 -23 -2 -49q0 -17 1 -36z" /> +<glyph unicode="b" horiz-adv-x="1144" d="M70 0l254 1608h397l-88 -566q127 61 278 62q141 0 213 -82t76 -226v-36q0 -131 -24 -303q-23 -145 -60 -239.5t-94 -143.5t-122.5 -67.5t-164.5 -18.5q-84 0 -137 26.5t-113 85.5l-75 -100h-340zM524 354q18 -45 127 -45q49 0 77 47t52 203q17 96 17 152q-1 10 -1 18 q-4 57 -18 73.5t-47 16.5q-104 0 -137 -31z" /> +<glyph unicode="c" horiz-adv-x="1001" d="M143 606q25 154 68 257.5t103.5 154.5t124 70.5t149.5 19.5q332 0 518 -74l-37 -233q-121 12 -303 12q-61 0 -90 -5t-58.5 -31.5t-46 -81t-32.5 -154.5q-11 -63 -15 -105q-2 -18 -2 -35q0 -21 4 -37q6 -30 13.5 -45.5t32 -23.5t46 -9t64.5 -1q84 0 165 4t120 8l39 4 l-37 -233q-109 -50 -227 -66q-95 -13 -250 -13q-37 0 -78 1q-162 2 -241 156q-49 95 -49 249q0 94 19 211z" /> +<glyph unicode="d" horiz-adv-x="1124" d="M141 621q45 252 139.5 367.5t303.5 115.5q154 0 260 -62l90 566h397l-254 -1608h-340l-45 100q-78 -57 -139 -84.5t-145 -27.5q-178 0 -248 175q-40 101 -40 239q0 100 21 219zM528 395q4 -55 18.5 -70.5t47.5 -15.5q104 0 139 45l70 434q-23 31 -129 31q-47 0 -75.5 -49 t-55.5 -211q-16 -89 -16 -142q0 -12 1 -22z" /> +<glyph unicode="e" horiz-adv-x="1083" d="M145 651q49 260 160 357.5t402 99.5q90 0 164.5 -12.5t144 -45t108.5 -98.5q37 -62 37 -148v-9q-2 -127 -45 -217.5t-108 -132.5q-66 -41 -140 -63q-61 -18 -121 -18h-26q-74 4 -123 11.5t-74 17.5q-2 -15 -2 -28q0 -45 27 -60q35 -20 147 -20q201 0 391 39l-49 -279 q-205 -67 -444 -67q-82 0 -168 8q-192 16 -264 190q-40 98 -41 237q0 107 24 238zM555 647q6 -2 18.5 -5t42.5 -5q9 -1 18 0q20 0 38 3q26 5 49.5 25.5t30.5 57.5q2 14 2 25q0 28 -14 44q-18 21 -57 21h-7q-59 -2 -84 -43t-37 -123z" /> +<glyph unicode="f" horiz-adv-x="831" d="M150 813l38 240l152 34l33 203q29 178 131 249t297 71q168 0 256 -49l-37 -228l-150 2h-9q-58 0 -75 -25q-18 -28 -32 -114q-2 -18 -4 -29l-13 -80h201l-43 -274h-201l-129 -813h-397l129 813h-147z" /> +<glyph unicode="g" horiz-adv-x="1146" d="M10 -508l41 264h406q174 0 205 195l22 139q-72 -78 -211 -78q-225 0 -300 160q-45 97 -45 248q0 99 19 221q43 272 166 371.5t334 99.5q170 0 342 -20.5t248 -53.5l-182 -1149q-18 -117 -58.5 -202.5t-108 -147t-172.5 -85.5q-68 -16 -149 -16q-47 0 -98 5zM528 362 q13 -63 88 -63q70 0 107 39l80 500h-96q-43 0 -72 -18.5t-46.5 -59.5t-24.5 -72t-17 -92q-22 -123 -22 -190q0 -27 3 -44z" /> +<glyph unicode="h" d="M70 0l254 1602h395l-98 -621q45 37 78.5 60.5t99 44t143.5 20.5q133 0 197.5 -55.5t66.5 -146.5v-21q0 -83 -14 -187l-111 -696h-397l111 705q4 27 4 47q-1 24 -7 36q-12 22 -47 23q-117 0 -161 -76l-117 -735h-397z" /> +<glyph unicode="i" horiz-adv-x="516" d="M59 0l172 1087h398l-172 -1087h-398zM254 1237l37 240q6 51 57 51h307q38 0 38 -37q0 -7 -1 -14l-37 -240q-6 -47 -53 -47h-307q-42 0 -42 37q0 5 1 10z" /> +<glyph unicode="j" horiz-adv-x="542" d="M-12 -553l260 1640h397l-174 -1095q-16 -113 -32.5 -188.5t-54.5 -179t-93 -177.5h-303zM266 1237l39 240q6 51 57 51h308q40 0 40 -37q0 -7 -1 -14l-39 -240q-6 -47 -54 -47h-307q-44 0 -44 37q0 5 1 10z" /> +<glyph unicode="k" horiz-adv-x="1155" d="M70 0l254 1602h397l-139 -873q219 94 307 358h416q-57 -209 -142.5 -320.5t-191.5 -176.5l268 -590h-430l-191 459l-77 -2l-74 -457h-397z" /> +<glyph unicode="l" horiz-adv-x="659" d="M125 387l192 1217h398l-178 -1135q-7 -59 -6 -96q0 -31 4 -45q10 -32 47 -54q78 -43 92 -43l-37 -231h-221q-160 0 -242 92q-58 66 -58 188q0 49 9 107z" /> +<glyph unicode="m" horiz-adv-x="1755" d="M70 0l172 1087h331l50 -106q59 45 87.5 64.5t91 40t140.5 20.5q197 0 246 -125q68 39 108.5 60.5t115.5 43t149 21.5q133 0 197.5 -55.5t66.5 -146.5q0 -10 1 -19q0 -84 -16 -189l-110 -696h-397l112 705q5 28 5 47q0 24 -7 36q-12 22 -49 23q-117 0 -164 -61 q0 -8 -3 -25.5t-5 -28.5l-111 -696h-397l111 705q4 27 4 47q-1 24 -7 36q-12 22 -47 23q-117 0 -161 -76l-117 -735h-397z" /> +<glyph unicode="n" d="M70 0l172 1087h331l50 -106q51 41 82.5 62.5t95 42t141.5 20.5q133 0 197.5 -55.5t66.5 -146.5v-21q0 -83 -14 -187l-111 -696h-397l111 705q4 27 4 47q-1 24 -7 36q-12 22 -47 23q-117 0 -161 -76l-117 -735h-397z" /> +<glyph unicode="o" horiz-adv-x="1132" d="M139 580q27 168 69 270t117.5 158.5t169 76t244.5 19.5q281 0 376 -148q62 -97 62 -271q0 -93 -18 -208q-25 -154 -63.5 -247t-112.5 -147t-170 -73.5t-250 -19.5q-279 0 -375 144q-64 97 -64 265q0 82 15 181zM521 326q11 -40 89 -41q82 0 102.5 34.5t49.5 208.5 q25 134 25 196q-1 20 -3 32q-10 52 -92 53q-80 0 -101.5 -38t-46.5 -195q-5 -32 -7 -48q-19 -115 -19 -169q0 -21 3 -33z" /> +<glyph unicode="p" d="M-16 -553l249 1579q84 33 261.5 53.5t347.5 20.5q197 0 286 -157q58 -102 58 -264q0 -87 -17 -192q-45 -291 -156.5 -399t-348.5 -108q-139 0 -187 79l-96 -612h-397zM516 305q27 -39 94 -39q76 0 105.5 57.5t58.5 239.5q17 63 17 123q0 27 -3 54q-12 85 -92 85h-96z" /> +<glyph unicode="q" horiz-adv-x="1134" d="M143 610q45 289 168 393.5t334 104.5q170 0 340 -20.5t246 -53.5l-250 -1587h-397l96 612q-73 -79 -208 -79h-3q-225 0 -300 160q-45 98 -45 249q0 99 19 221zM524 328q13 -62 88 -62q70 0 107 39l82 529h-96q-35 0 -62 -18.5t-41 -40t-27.5 -65.5t-18.5 -69t-13 -78 q-22 -123 -22 -190q0 -27 3 -45z" /> +<glyph unicode="r" horiz-adv-x="839" d="M70 0l172 1087h352l22 -137q39 59 111 103.5t150 44.5q63 0 94 -11l-60 -380h-161q-41 0 -63.5 -2.5t-53.5 -12.5t-48.5 -37.5t-25.5 -70.5l-92 -584h-397z" /> +<glyph unicode="s" horiz-adv-x="1044" d="M100 66l37 234h473q39 0 45 34l2 10q6 37 -34 37h-195q-145 0 -222 97q-58 73 -58 181q0 35 6 74l16 94q43 270 332 271q385 0 484 -19q94 -17 120 -55l-37 -233h-457q-16 0 -24 -1.5t-16.5 -9.5t-10.5 -26l-2 -13q-2 -12 0 -19t9 -9t13.5 -3t18.5 -1h205q160 1 221 -99 q45 -73 45 -167q0 -34 -6 -70l-18 -121q-41 -262 -316 -262h-72q-131 0 -196.5 1t-155.5 7t-138.5 23.5t-68.5 44.5z" /> +<glyph unicode="t" horiz-adv-x="768" d="M131 815l31 197l166 78l106 303h340l-49 -303h182l-43 -275h-182l-55 -344q-7 -62 -7 -99q0 -30 5 -46q10 -32 45 -54q80 -43 94 -43l-37 -231h-246q-137 0 -216 95q-57 68 -57 191q0 48 9 105l68 426h-154z" /> +<glyph unicode="u" horiz-adv-x="1134" d="M104 183v16q0 85 15 192l110 696h398l-113 -704q-5 -28 -5 -48q0 -24 7 -36q12 -23 49 -23q117 0 162 76l117 735h397l-174 -1087h-332l-47 106q-72 -68 -138.5 -96t-180.5 -28q-133 0 -198 55t-67 146z" /> +<glyph unicode="v" horiz-adv-x="1128" d="M154 1087h421l41 -659l160 381q66 133 76 283h381q6 -36 6 -74q0 -156 -102 -352l-336 -666h-479z" /> +<glyph unicode="w" horiz-adv-x="1746" d="M154 1087h421l41 -659l160 381q66 133 76 283h381q5 -32 5 -67q0 -106 -46 -234l-12 -33l57 -330l160 381q66 133 76 283h380q6 -36 6 -74q0 -156 -102 -352l-336 -666h-454l-47 291l-119 -291h-479z" /> +<glyph unicode="x" horiz-adv-x="1255" d="M29 0l446 573l-274 514h475l82 -249l166 249h475l-453 -589l264 -498h-458l-86 236l-162 -236h-475z" /> +<glyph unicode="y" horiz-adv-x="1177" d="M156 1087h411l17 -688q2 -76 75 -80l177 488q41 113 53 283h381q7 -41 7 -85q0 -150 -81 -341l-266 -664q-240 -561 -727 -619q-16 -1 -25 -4v279q141 66 222 144.5t141 199.5q-315 0 -336 319z" /> +<glyph unicode="z" horiz-adv-x="999" d="M66 2l49 311l477 459h-434l49 315h934l-49 -315l-445 -455h371l-49 -315h-903z" /> +<glyph unicode="{" horiz-adv-x="657" d="M106 420l46 280q123 12 139 109l76 473q29 180 154.5 250t385.5 70l-49 -316q-63 0 -85.5 -43t-45.5 -186l-43 -279q-18 -109 -80.5 -159t-169.5 -58q207 -43 180 -211l-65 -407q-20 -100 -10 -150.5t75 -50.5l-47 -295q-260 0 -360.5 106.5t-67.5 307.5l72 450 q8 53 -19 83t-86 26z" /> +<glyph unicode="|" horiz-adv-x="512" d="M74 -147l272 1724h316l-273 -1724h-315z" /> +<glyph unicode="}" horiz-adv-x="659" d="M-45 -553l47 295q66 0 87.5 43t39.5 158l66 407q27 168 245 211q-104 8 -151 58.5t-29 158.5l43 279q25 139 14.5 184t-71.5 45l51 316q240 0 337 -122t66 -319l-38 -352q-10 -98 106 -109l-45 -280q-117 8 -137 -109l-90 -532q-35 -199 -150 -265.5t-391 -66.5z" /> +<glyph unicode="~" horiz-adv-x="825" d="M250 1225q131 152 276 151q47 0 106.5 -35.5t98.5 -35.5q106 -6 205 81l29 -151q-121 -147 -254 -148q-45 0 -116 36t-110 36q-98 0 -202 -72z" /> +<glyph unicode="¢" horiz-adv-x="989" d="M131 606q25 154 67 255.5t103 151.5t123.5 67.5t150.5 17.5l33 200h221l-32 -204q170 -14 297 -70l-37 -233q-121 12 -303 12q-45 0 -62.5 -1t-47.5 -8.5t-41 -22.5t-28.5 -44t-27.5 -74t-21 -112q-10 -63 -14 -105.5t2 -72t13.5 -45t32 -23.5t46 -9t64.5 -1 q84 0 164.5 4t119.5 8l39 4l-37 -233q-127 -80 -344 -80l-28 -183h-222l31 185q-158 4 -233.5 159.5t-28.5 456.5z" /> +<glyph unicode="£" horiz-adv-x="1171" d="M57 0l49 305l136 51l41 258h-127l30 195l136 55l24 150q18 115 46 197.5t74 135t91 84t123 46t140.5 18.5t170.5 4q51 0 140.5 -8t151.5 -16l63 -9l-50 -321h-376q-94 0 -130 -25.5t-51 -122.5l-20 -133l364 -35l-32 -215h-371l-41 -258h530l-57 -356h-1055z" /> +<glyph unicode="¥" horiz-adv-x="1355" d="M258 1499h432l92 -663l314 663h473l-465 -780h110l-32 -203h-242l-8 -51h242l-33 -203h-242l-41 -262h-397l41 262h-236l33 203h236l8 51h-236l33 203h109z" /> +<glyph unicode="¨" horiz-adv-x="903" d="M246 1192q8 55 54 94t101.5 39t88 -39t24.5 -94q-10 -55 -55 -95t-100.5 -40t-88 40t-24.5 95zM768 1192q8 55 54 94t101.5 39t88 -39t24.5 -94q-10 -55 -55 -95t-100.5 -40t-89 40t-23.5 95z" /> +<glyph unicode="©" horiz-adv-x="1619" d="M180 795q27 162 69 280.5t118.5 219t200.5 152.5t294 52h410q532 0 405 -807q-59 -377 -221 -534.5t-412 -157.5h-409q-285 0 -398.5 219.5t-56.5 575.5zM414 754q-41 -254 18.5 -397.5t229.5 -143.5h389q150 0 248 122t145 419q14 88 20 151.5t2 140t-25.5 125t-71.5 82 t-128 33.5h-410q-74 0 -133 -22.5t-116.5 -78t-100 -163.5t-67.5 -268zM561 782q37 233 126 322.5t239 89.5q254 0 377 -49l-29 -189q-170 25 -299 25q-84 0 -122 -48t-60 -192q-18 -125 12.5 -176t109.5 -51q137 0 306 33l-29 -189q-53 -27 -126 -40t-122 -15t-141 -2 q-137 0 -209 114.5t-33 366.5z" /> +<glyph unicode="«" horiz-adv-x="1220" d="M172 725l487 416l168 -195l-280 -241l213 -246l-223 -160zM655 725l488 416l168 -195l-281 -241l213 -246l-223 -160z" /> +<glyph unicode="­" horiz-adv-x="722" d="M125 436l49 316h643l-49 -316h-643z" /> +<glyph unicode="®" horiz-adv-x="1619" d="M180 795q27 162 69 280.5t118.5 219t200.5 152.5t294 52h410q532 0 405 -807q-59 -377 -221 -534.5t-412 -157.5h-409q-285 0 -398.5 219.5t-56.5 575.5zM414 754q-41 -254 18.5 -397.5t229.5 -143.5h389q150 0 248 122t145 419q14 88 20 151.5t2 140t-25.5 125t-71.5 82 t-128 33.5h-410q-74 0 -133 -22.5t-116.5 -78t-100 -163.5t-67.5 -268zM530 313l140 875h383q274 0 229 -283q-18 -119 -59 -181t-115 -87l121 -324h-248l-109 308l-55 24l-53 -332h-234zM844 817h80q78 0 96 13.5t29 72.5q8 47 -10.5 59.5t-90.5 12.5h-80z" /> +<glyph unicode="´" horiz-adv-x="499" d="M195 1087l204 293h297l-278 -293h-223z" /> +<glyph unicode="¸" horiz-adv-x="487" d="M0 -375l27 162l79 31q45 18 54.5 32.5t19.5 73.5h240q-25 -160 -90.5 -229.5t-204.5 -69.5h-125z" /> +<glyph unicode="»" horiz-adv-x="1218" d="M135 500l287 254l-193 213l209 174l355 -416l-480 -426zM618 500l287 254l-194 213l209 174l356 -416l-479 -426z" /> +<glyph unicode="À" horiz-adv-x="1456" d="M51 0l707 1499h469l217 -1499h-408l-43 262h-385l-116 -262h-441zM717 1925h297l110 -293h-223zM752 600h215l-47 401z" /> +<glyph unicode="Â" horiz-adv-x="1456" d="M51 0l707 1499h469l217 -1499h-408l-43 262h-385l-116 -262h-441zM684 1632l250 287h268l141 -287h-227l-63 105l-119 -105h-250zM752 600h215l-47 401z" /> +<glyph unicode="Æ" horiz-adv-x="2240" d="M35 0l733 1130q80 121 175 201t202.5 116t205 47t216.5 5q389 0 622 -33l-51 -333h-506q-39 0 -63.5 -9.5t-36.5 -29t-16.5 -35t-8.5 -41.5l-14 -90l506 -23l-51 -330l-514 -18l-15 -90q-6 -39 0 -62.5t27.5 -31.5t37 -10.5t46.5 -2.5h485l-53 -331q-96 -12 -247.5 -21.5 t-255.5 -11.5l-103 -2q-49 -2 -98.5 2t-104.5 20.5t-94 44t-60.5 77.5t-11.5 116l14 88h-301l-225 -342h-440zM913 678h142l49 309z" /> +<glyph unicode="Ç" horiz-adv-x="1159" d="M180 817q57 371 199.5 535t439.5 164q213 0 305.5 -15.5t223.5 -66.5l-50 -310l-12 2q-12 2 -33.5 5.5t-50 7.5t-65.5 7t-76 6t-85 5t-89 2h-61q-15 0 -50 -5t-47 -14.5t-35.5 -28.5t-35 -48t-28 -73t-28.5 -103.5t-24 -136.5q-41 -252 -7.5 -329t187.5 -77q96 0 200.5 4 t161.5 9l58 5l-50 -309q-104 -41 -216.5 -55t-333.5 -10q-525 8 -398 829zM338 -373l27 162l79 31q45 18 55.5 32.5t20.5 73.5h240q-25 -160 -91.5 -229.5t-205.5 -69.5h-125z" /> +<glyph unicode="È" d="M131 354l129 817q16 104 60.5 174t110 102t125.5 42t140 10q387 0 623 -33l-53 -333h-506q-39 0 -62.5 -9.5t-36 -29t-16.5 -33.5t-8 -43l-12 -82l503 -23l-53 -329l-510 -19l-16 -98q-6 -39 0 -62.5t27.5 -31.5t37 -10.5t45.5 -2.5h486l-53 -331q-96 -12 -250 -21.5 t-259 -11.5l-106 -2q-51 -2 -99 5t-101.5 30.5t-89 61.5t-53 105.5t-3.5 157.5zM555 1915h297l111 -293h-224z" /> +<glyph unicode="É" d="M131 354l129 817q16 104 60.5 174t110 102t125.5 42t140 10q387 0 623 -33l-53 -333h-506q-39 0 -62.5 -9.5t-36 -29t-16.5 -33.5t-8 -43l-12 -82l503 -23l-53 -329l-510 -19l-16 -98q-6 -39 0 -62.5t27.5 -31.5t37 -10.5t45.5 -2.5h486l-53 -331q-96 -12 -250 -21.5 t-259 -11.5l-106 -2q-51 -2 -99 5t-101.5 30.5t-89 61.5t-53 105.5t-3.5 157.5zM754 1622l204 293h297l-278 -293h-223z" /> +<glyph unicode="Ê" d="M131 354l129 817q16 104 60.5 174t110 102t125.5 42t140 10q387 0 623 -33l-53 -333h-506q-39 0 -62.5 -9.5t-36 -29t-16.5 -33.5t-8 -43l-12 -82l503 -23l-53 -329l-510 -19l-16 -98q-6 -39 0 -62.5t27.5 -31.5t37 -10.5t45.5 -2.5h486l-53 -331q-96 -12 -250 -21.5 t-259 -11.5l-106 -2q-51 -2 -99 5t-101.5 30.5t-89 61.5t-53 105.5t-3.5 157.5zM547 1622l250 287h268l141 -287h-227l-64 104l-98 -104h-270z" /> +<glyph unicode="Ë" d="M131 354l129 817q16 104 60.5 174t110 102t125.5 42t140 10q387 0 623 -33l-53 -333h-506q-39 0 -62.5 -9.5t-36 -29t-16.5 -33.5t-8 -43l-12 -82l503 -23l-53 -329l-510 -19l-16 -98q-6 -39 0 -62.5t27.5 -31.5t37 -10.5t45.5 -2.5h486l-53 -331q-96 -12 -250 -21.5 t-259 -11.5l-106 -2q-51 -2 -99 5t-101.5 30.5t-89 61.5t-53 105.5t-3.5 157.5zM473 1726q8 55 54 94.5t101.5 39.5t88.5 -39t24 -95q-10 -55 -55 -95t-100.5 -40t-89 40t-23.5 95zM995.5 1726.5q8.5 55.5 54.5 94.5t101 39t88 -39t25 -95q-10 -55 -55.5 -95t-100.5 -40 t-88 40t-24.5 95.5z" /> +<glyph unicode="Î" horiz-adv-x="577" d="M92 0l238 1499h397l-238 -1499h-397zM219 1632l250 287h268l142 -287h-228l-63 105l-119 -105h-250z" /> +<glyph unicode="Ï" horiz-adv-x="577" d="M92 0l238 1499h397l-238 -1499h-397zM176 1767.5q8 55.5 54 94.5t101.5 39t88.5 -39t24 -95q-10 -55 -55 -95t-100.5 -40t-88 40t-24.5 95.5zM698 1767q8 55 54.5 94.5t101.5 39.5t88 -39t25 -95q-10 -55 -55.5 -95t-100.5 -40t-89 40t-24 95z" /> +<glyph unicode="Ô" horiz-adv-x="1363" d="M167 532q3 116 26 259q23 147 59.5 260.5t74.5 189.5t97 128t107.5 79t126 41t131 17t145.5 3q82 0 145.5 -8t127 -31.5t108.5 -62.5t80 -101.5t50 -147.5t13 -203.5t-24 -266.5q-23 -139 -57 -246.5t-70.5 -181.5t-92 -124t-105.5 -78.5t-126 -43t-136.5 -18.5 t-152.5 -4q-84 0 -149.5 8t-129 30.5t-107.5 60.5t-78.5 99.5t-50 143.5t-12.5 198zM576.5 425.5q27.5 -77.5 173.5 -77.5q133 0 190 78t96 313q33 170 25 262.5t-47 122t-135.5 29.5t-144.5 -27.5t-81.5 -114t-62.5 -272.5q-41 -236 -13.5 -313.5zM625 1632l249 287h269 l141 -287h-227l-64 105l-119 -105h-249z" /> +<glyph unicode="Ù" horiz-adv-x="1335" d="M174.5 489.5q2.5 102.5 22.5 227.5l127 782h397l-133 -844q-14 -96 -18.5 -164.5t35.5 -106.5t132 -38q66 0 109 19.5t67.5 68.5t36 93t23.5 128l133 844h399l-123 -905q-20 -127 -54 -226.5t-75 -163t-90 -108.5t-102 -64.5t-108.5 -31.5t-110 -10t-107.5 -1 q-37 1 -55 1q-61 0 -106.5 3t-101.5 14t-96 33.5t-82 56.5t-66.5 89.5t-40 128t-13 175zM639 1925h297l111 -293h-224z" /> +<glyph unicode="Û" horiz-adv-x="1335" d="M174.5 489.5q2.5 102.5 22.5 227.5l127 782h397l-133 -844q-14 -96 -18.5 -164.5t35.5 -106.5t132 -38q66 0 109 19.5t67.5 68.5t36 93t23.5 128l133 844h399l-123 -905q-20 -127 -54 -226.5t-75 -163t-90 -108.5t-102 -64.5t-108.5 -31.5t-110 -10t-107.5 -1 q-37 1 -55 1q-61 0 -106.5 3t-101.5 14t-96 33.5t-82 56.5t-66.5 89.5t-40 128t-13 175zM606 1632l250 287h268l142 -287h-228l-63 105l-119 -105h-250z" /> +<glyph unicode="Ü" horiz-adv-x="1335" d="M174.5 489.5q2.5 102.5 22.5 227.5l127 782h397l-133 -844q-14 -96 -18.5 -164.5t35.5 -106.5t132 -38q66 0 109 19.5t67.5 68.5t36 93t23.5 128l133 844h399l-123 -905q-20 -127 -54 -226.5t-75 -163t-90 -108.5t-102 -64.5t-108.5 -31.5t-110 -10t-107.5 -1 q-37 1 -55 1q-61 0 -106.5 3t-101.5 14t-96 33.5t-82 56.5t-66.5 89.5t-40 128t-13 175zM563 1767q8 55 54.5 94.5t101.5 39.5t88 -39t24 -95q-10 -55 -55 -95t-100 -40t-89 40t-24 95zM1085.5 1767.5q8.5 55.5 54.5 94.5t101 39t88 -39t25 -95q-10 -55 -55.5 -95 t-100.5 -40t-88 40t-24.5 95.5z" /> +<glyph unicode="à" horiz-adv-x="1118" d="M141 639q20 94 51 169t63 123t77 83t83 53t92 27.5t91 11.5t94 2q383 0 516 -127l-143 -977h-313l-62 102q-63 -117 -287 -116q-158 0 -241.5 178t-20.5 471zM414 1524h297l110 -293h-223zM516 397q2 -47 21.5 -68.5t56.5 -21.5q123 0 133 107l55 389q-31 27 -108 8 q-37 -8 -59.5 -23.5t-47.5 -64.5t-37 -133q-10 -70 -13 -108t-1 -85z" /> +<glyph unicode="â" horiz-adv-x="1118" d="M141 639q20 94 51 169t63 123t77 83t83 53t92 27.5t91 11.5t94 2q383 0 516 -127l-143 -977h-313l-62 102q-63 -117 -287 -116q-158 0 -241.5 178t-20.5 471zM401 1231l250 287h269l141 -287h-227l-64 104l-119 -104h-250zM516 397q2 -47 21.5 -68.5t56.5 -21.5 q123 0 133 107l55 389q-31 27 -108 8q-37 -8 -59.5 -23.5t-47.5 -64.5t-37 -133q-10 -70 -13 -108t-1 -85z" /> +<glyph unicode="æ" horiz-adv-x="1673" d="M139 651q20 94 50 168t62 122t78 81t80.5 49t91 25.5t90.5 10.5t93 1q201 0 324 -39q109 37 260 39q90 0 169 -12.5t154.5 -45t118.5 -98t41 -157.5q-2 -150 -62.5 -248t-142.5 -134t-177 -44.5t-158.5 2t-94.5 22.5q-10 -68 25 -88t147 -20q178 0 369 39l-49 -279 q-270 -88 -592 -59q-162 14 -240 141q-102 -141 -373 -141q-158 0 -242.5 185t-21.5 480zM527 343q18 -40 65 -40q92 0 121 57q-6 137 22 291q14 76 39 156q-37 18 -102 4q-55 -12 -90.5 -58t-51.5 -167q-27 -192 -3 -243zM1145 647q6 -2 18.5 -5t44 -5t56 3t49 25.5 t30.5 57.5q8 47 -12 69.5t-65 20.5q-59 -2 -84 -43t-37 -123z" /> +<glyph unicode="ç" horiz-adv-x="1001" d="M143 606q25 154 67 255.5t103.5 151.5t124 67.5t150.5 17.5h44h56q17 0 57.5 -1t67.5 -4t70 -8.5t75.5 -13.5t72.5 -20.5t75 -26.5l-37 -233q-121 12 -303 12q-45 0 -62.5 -1t-47 -8.5t-41 -22.5t-29 -44t-27.5 -74t-20 -112q-10 -63 -14.5 -105.5t1.5 -72t13.5 -45 t32 -23.5t46 -9t64.5 -1q84 0 165 4t120 8l39 4l-37 -233q-59 -39 -140 -57.5t-132.5 -21.5t-155 -1t-127.5 2q-162 0 -241 155.5t-30 460.5zM233 -377l25 162l82 31q45 18 54 32.5t20 73.5h239q-25 -160 -90 -229.5t-205 -69.5h-125z" /> +<glyph unicode="è" horiz-adv-x="1083" d="M145 651q49 260 160 357.5t402 99.5q90 0 164.5 -12.5t144 -45t108.5 -98t37 -157.5q-2 -127 -45 -217.5t-108.5 -132.5t-139 -63.5t-147.5 -17t-123 11.5t-74 17q-10 -68 25 -88t147 -20q201 0 391 39l-49 -279q-276 -90 -612 -59q-193 16 -264.5 190t-16.5 475z M436 1524h297l111 -293h-223zM555 647q6 -2 18.5 -5t43 -5t56 3t49 25.5t30.5 57.5q8 47 -11.5 69.5t-64.5 20.5q-59 -2 -84 -43t-37 -123z" /> +<glyph unicode="é" horiz-adv-x="1083" d="M145 651q49 260 160 357.5t402 99.5q90 0 164.5 -12.5t144 -45t108.5 -98t37 -157.5q-2 -127 -45 -217.5t-108.5 -132.5t-139 -63.5t-147.5 -17t-123 11.5t-74 17q-10 -68 25 -88t147 -20q201 0 391 39l-49 -279q-276 -90 -612 -59q-193 16 -264.5 190t-16.5 475z M555 647q6 -2 18.5 -5t43 -5t56 3t49 25.5t30.5 57.5q8 47 -11.5 69.5t-64.5 20.5q-59 -2 -84 -43t-37 -123zM621 1231l204 293h297l-278 -293h-223z" /> +<glyph unicode="ê" horiz-adv-x="1083" d="M145 651q49 260 160 357.5t402 99.5q90 0 164.5 -12.5t144 -45t108.5 -98t37 -157.5q-2 -127 -45 -217.5t-108.5 -132.5t-139 -63.5t-147.5 -17t-123 11.5t-74 17q-10 -68 25 -88t147 -20q201 0 391 39l-49 -279q-276 -90 -612 -59q-193 16 -264.5 190t-16.5 475z M403 1231l250 287h269l141 -287h-227l-64 104l-119 -104h-250zM555 647q6 -2 18.5 -5t43 -5t56 3t49 25.5t30.5 57.5q8 47 -11.5 69.5t-64.5 20.5q-59 -2 -84 -43t-37 -123z" /> +<glyph unicode="ë" horiz-adv-x="1083" d="M145 651q49 260 160 357.5t402 99.5q90 0 164.5 -12.5t144 -45t108.5 -98t37 -157.5q-2 -127 -45 -217.5t-108.5 -132.5t-139 -63.5t-147.5 -17t-123 11.5t-74 17q-10 -68 25 -88t147 -20q201 0 391 39l-49 -279q-276 -90 -612 -59q-193 16 -264.5 190t-16.5 475z M358 1366q8 55 54.5 94t101.5 39t88 -39t25 -94q-10 -55 -55.5 -95t-100.5 -40t-89 40t-24 95zM555 647q6 -2 18.5 -5t43 -5t56 3t49 25.5t30.5 57.5q8 47 -11.5 69.5t-64.5 20.5q-59 -2 -84 -43t-37 -123zM880.5 1366q8.5 55 54.5 94t101.5 39t88 -39t24.5 -94 q-10 -55 -55 -95t-100.5 -40t-88.5 40t-24.5 95z" /> +<glyph unicode="î" horiz-adv-x="516" d="M41 0l172 1087h397l-172 -1087h-397zM100 1227l250 286h268l142 -286h-228l-63 104l-119 -104h-250z" /> +<glyph unicode="ï" horiz-adv-x="516" d="M41 0l172 1087h397l-172 -1087h-397zM57.5 1362q8.5 55 54.5 94t101 39t88 -39t25 -94q-10 -55 -55.5 -95t-100.5 -40t-88 40t-24.5 95zM580 1362q8 55 54 94t101.5 39t88 -39t24.5 -94q-10 -55 -55 -95t-100.5 -40t-89 40t-23.5 95z" /> +<glyph unicode="ô" horiz-adv-x="1132" d="M139 580q27 168 69 270t117.5 158.5t169 76t244.5 19.5q281 0 376 -148.5t44 -478.5q-25 -154 -63.5 -247t-112.5 -147t-170 -73.5t-250 -19.5q-279 0 -375 144.5t-49 445.5zM399 1227l250 286h269l141 -286h-228l-63 104l-119 -104h-250zM521 325.5q11 -40.5 89 -40.5 q82 0 102.5 34.5t49.5 208.5q33 176 22.5 228.5t-92.5 52.5q-80 0 -101.5 -38t-46.5 -195q-5 -32 -7 -48q-27 -162 -16 -202.5z" /> +<glyph unicode="ù" horiz-adv-x="1134" d="M104.5 183q-1.5 91 14.5 208l110 696h398l-113 -704q-10 -61 2 -84t49 -23q117 0 162 76l117 735h397l-174 -1087h-332l-47 106q-72 -68 -138.5 -96t-180.5 -28q-133 0 -198 55t-66.5 146zM461 1520h297l110 -293h-223z" /> +<glyph unicode="û" horiz-adv-x="1134" d="M104.5 183q-1.5 91 14.5 208l110 696h398l-113 -704q-10 -61 2 -84t49 -23q117 0 162 76l117 735h397l-174 -1087h-332l-47 106q-72 -68 -138.5 -96t-180.5 -28q-133 0 -198 55t-66.5 146zM428 1227l250 286h268l141 -286h-227l-63 104l-119 -104h-250z" /> +<glyph unicode="ü" horiz-adv-x="1134" d="M104.5 183q-1.5 91 14.5 208l110 696h398l-113 -704q-10 -61 2 -84t49 -23q117 0 162 76l117 735h397l-174 -1087h-332l-47 106q-72 -68 -138.5 -96t-180.5 -28q-133 0 -198 55t-66.5 146zM383 1362q8 55 54 94t101.5 39t88 -39t24.5 -94q-10 -55 -55 -95t-100.5 -40 t-89 40t-23.5 95zM905 1362q8 55 54.5 94t101.5 39t88 -39t25 -94q-10 -55 -55.5 -95t-100.5 -40t-88 40t-25 95z" /> +<glyph unicode="ÿ" horiz-adv-x="1177" d="M156 1087h411l17 -688q2 -76 75 -80l177 488q41 113 53 283h381q31 -178 -74 -426l-266 -664q-240 -561 -727 -619q-16 -1 -25 -4v279q141 66 222 144.5t141 199.5q-315 0 -336 319zM387 1315q8 55 54 94t101.5 39t88.5 -39t24 -94q-10 -55 -55 -95t-100.5 -40t-89 40 t-23.5 95zM909.5 1315q8.5 55 54.5 94t101 39t88 -39t25 -94q-10 -55 -55.5 -95t-100.5 -40t-88 40t-24.5 95z" /> +<glyph unicode="Œ" horiz-adv-x="2062" d="M124 532q3 116 26 259q23 147 59.5 260.5t74.5 189.5t97 128t107.5 79t126 41t131 17t145.5 3q221 0 338 -71q106 74 287 61q389 0 624 -33l-53 -333h-506q-39 0 -63.5 -9.5t-37 -29t-16.5 -35t-8 -41.5l-12 -82l504 -23l-52 -329l-510 -19l-16 -98q-6 -39 0 -62.5 t26.5 -31.5t36 -10.5t46.5 -2.5h485l-51 -331q-96 -12 -250 -21.5t-259 -11.5l-106 -2q-143 -8 -243 59q-127 -61 -404 -61q-84 0 -149.5 8t-129 30.5t-107.5 60.5t-78.5 99.5t-50 143.5t-12.5 198zM533.5 425.5q27.5 -77.5 173.5 -77.5q133 0 190 78t96 313 q33 170 25 262.5t-47 122t-135.5 29.5t-144.5 -27.5t-81.5 -114t-62.5 -272.5q-41 -236 -13.5 -313.5z" /> +<glyph unicode="œ" horiz-adv-x="1697" d="M129 580q27 168 69 270t117.5 158.5t169 76t244.5 19.5q175 0 277 -55q111 55 340 59q90 0 164.5 -12.5t144 -45t108.5 -98t37 -157.5q-2 -127 -45 -217.5t-108.5 -132.5t-139 -63.5t-147.5 -17t-123 11.5t-74 17q-10 -68 25 -88t147 -20q201 0 391 39l-49 -279 q-276 -90 -612 -59q-95 9 -160 55q-113 -51 -352 -51q-279 0 -375 144.5t-49 445.5zM510.5 325.5q11.5 -40.5 89.5 -40.5q82 0 102.5 34.5t49.5 208.5q33 176 22.5 228.5t-92.5 52.5q-80 0 -101.5 -38t-46.5 -195q-6 -32 -8 -48q-27 -162 -15.5 -202.5zM1192 647 q6 -2 18.5 -5t44 -5t56 3t49 25.5t31.5 57.5q8 47 -11.5 69.5t-64.5 20.5q-59 -2 -85 -44t-38 -122z" /> +<glyph unicode="Ÿ" horiz-adv-x="1390" d="M266 1499h432l99 -663l331 663h449l-645 -1089l-66 -410h-397l66 410zM569.5 1767.5q8.5 55.5 54.5 94.5t101 39t88 -39t25 -95q-10 -55 -55.5 -95t-100.5 -40t-88 40t-24.5 95.5zM1092 1767q8 55 54 94.5t101.5 39.5t88 -39t24.5 -95q-10 -55 -55 -95t-100.5 -40t-89 40 t-23.5 95z" /> +<glyph unicode="ˆ" horiz-adv-x="624" d="M76 1087l250 287h268l141 -287h-227l-64 105l-118 -105h-250z" /> +<glyph unicode="˚" horiz-adv-x="528" d="M250 1294q8 88 72.5 146.5t150.5 58.5t143.5 -59.5t49.5 -145.5q-8 -88 -71 -146t-149 -58q-88 0 -146 59t-50 145zM389 1294q-2 -29 16.5 -48t47 -19t49 19.5t24.5 48t-14 49t-47 20.5t-50.5 -20.5t-25.5 -49.5z" /> +<glyph unicode="˜" horiz-adv-x="827" d="M229 1225q131 152 277 151q47 0 106.5 -35.5t98.5 -35.5q106 -6 204 81l29 -151q-121 -147 -254 -148q-45 0 -115.5 36t-109.5 36q-98 0 -203 -72z" /> +<glyph unicode=" " horiz-adv-x="962" /> +<glyph unicode=" " horiz-adv-x="1925" /> +<glyph unicode=" " horiz-adv-x="962" /> +<glyph unicode=" " horiz-adv-x="1925" /> +<glyph unicode=" " horiz-adv-x="641" /> +<glyph unicode=" " horiz-adv-x="481" /> +<glyph unicode=" " horiz-adv-x="320" /> +<glyph unicode=" " horiz-adv-x="320" /> +<glyph unicode=" " horiz-adv-x="240" /> +<glyph unicode=" " horiz-adv-x="385" /> +<glyph unicode=" " horiz-adv-x="106" /> +<glyph unicode="‐" horiz-adv-x="722" d="M125 436l49 316h643l-49 -316h-643z" /> +<glyph unicode="‑" horiz-adv-x="722" d="M125 436l49 316h643l-49 -316h-643z" /> +<glyph unicode="‒" horiz-adv-x="722" d="M125 436l49 316h643l-49 -316h-643z" /> +<glyph unicode="–" horiz-adv-x="923" d="M121 430l51 318h969l-51 -318h-969z" /> +<glyph unicode="—" horiz-adv-x="1507" d="M129 434l51 318h1426l-52 -318h-1425z" /> +<glyph unicode="‘" horiz-adv-x="509" d="M248 989l51 328q12 76 52 124t89 63.5t97.5 19.5t79.5 -2l32 -6l-24 -148q-61 0 -74 -63l-4 -31h22q51 0 43 -51l-37 -234q-10 -55 -61 -55h-227q-47 0 -39 55z" /> +<glyph unicode="’" horiz-adv-x="509" d="M250 942l22 148q61 0 74 63l6 31h-22q-51 0 -43 51l37 233q8 55 59 56h227q49 0 41 -56l-53 -327q-32 -200 -249 -207q-55 -2 -99 8z" /> +<glyph unicode="‚" horiz-adv-x="509" d="M63 -242l23 148q61 0 74 63l6 31h-23q-51 0 -43 51l37 234q10 55 60 55h227q49 0 41 -55l-53 -328q-32 -200 -249 -207q-56 -2 -100 8z" /> +<glyph unicode="“" horiz-adv-x="884" d="M240 985l51 328q32 200 248 207q56 2 100 -9l-23 -147q-61 0 -73 -64l-4 -30h22q51 0 43 -51l-37 -234q-10 -55 -61 -55h-227q-47 0 -39 55zM631 985l51 328q32 200 249 207q56 2 99 -9l-22 -147q-61 0 -74 -64l-4 -30h22q51 0 43 -51l-37 -234q-8 -55 -61 -55h-227 q-47 0 -39 55z" /> +<glyph unicode="”" horiz-adv-x="884" d="M242 938l22 147q61 0 74 64l6 31h-22q-51 0 -43 51l36 233q8 55 60 56h227q49 0 41 -56l-53 -327q-32 -200 -249 -207q-55 -2 -99 8zM633 938l22 147q61 0 74 64l6 31h-22q-51 0 -43 51l37 233q10 55 59 56h227q49 0 41 -56l-53 -327q-32 -200 -249 -207q-55 -2 -99 8z " /> +<glyph unicode="„" horiz-adv-x="882" d="M55 -242l23 148q61 0 74 63l6 31h-23q-51 0 -43 51l37 234q10 55 59 55h228q49 0 41 -55l-54 -328q-32 -200 -248 -207q-56 -2 -100 8zM446 -242l23 148q61 0 74 63l6 31h-23q-51 0 -43 51l37 234q8 55 60 55h227q49 0 41 -55l-53 -328q-32 -200 -249 -207q-56 -2 -100 8 z" /> +<glyph unicode="…" horiz-adv-x="1636" d="M252 47l39 240q6 51 57 51h232q53 0 43 -51l-39 -240q-8 -47 -58 -47h-231q-49 0 -43 47zM809 47l39 240q6 51 57 51h232q53 0 43 -51l-39 -240q-8 -47 -58 -47h-231q-49 0 -43 47zM1366 47l39 240q6 51 57 51h232q53 0 43 -51l-39 -240q-8 -47 -58 -47h-231 q-49 0 -43 47z" /> +<glyph unicode=" " horiz-adv-x="385" /> +<glyph unicode="‹" horiz-adv-x="569" d="M10 725l488 416l168 -195l-260 -221l192 -225l-223 -201z" /> +<glyph unicode="›" horiz-adv-x="731" d="M172 500l262 225l-188 221l229 195l354 -416l-497 -426z" /> +<glyph unicode=" " horiz-adv-x="481" /> +<glyph unicode="€" horiz-adv-x="1419" d="M92 502l29 178l141 14l12 84l-135 17l27 170l141 18q82 532 604 533q115 0 279 -19.5t272 -62.5l-45 -285q-268 31 -436 31q-92 0 -144.5 -9.5t-79 -40t-34.5 -56t-18 -91.5l477 -14l-29 -176l-481 -15l-13 -84l478 -14l-29 -178q-31 0 -81 -1t-156.5 -4t-176 -5.5 t-67.5 -4.5q-8 -53 2 -90t26.5 -55t54.5 -27.5t61.5 -10.5t72.5 -1q78 0 192.5 14.5t189.5 27.5l74 13l-45 -278q-106 -55 -240 -73.5t-345 -18.5q-61 0 -115.5 7t-128.5 36.5t-121 80t-71.5 147.5t-4.5 228z" /> +<glyph unicode="™" horiz-adv-x="1273" d="M61 1307l31 192h613l-31 -192h-189l-82 -523h-233l82 523h-191zM590 784l209 715h248l2 -346l110 346h256l-8 -715h-233l14 349l-82 -349h-211l12 344l-84 -344h-233z" /> +<glyph unicode="" horiz-adv-x="1085" d="M0 1085h1085v-1085h-1085v1085z" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Black-Italic-webfont.ttf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Black-Italic-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..5206b4df0a5bbb8b99664abafd489f71983bf661 Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Black-Italic-webfont.ttf differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Black-Italic-webfont.woff b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Black-Italic-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..b5234be8c6b224d98f529c470b7892b452614430 Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Black-Italic-webfont.woff differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Black-webfont.eot b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Black-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..6b1ea5f9c06ac84483843e53503d4ac20bc20658 Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Black-webfont.eot differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Black-webfont.svg b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Black-webfont.svg new file mode 100644 index 0000000000000000000000000000000000000000..b4796a6f7f99fa718035641cec925114244047e5 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Black-webfont.svg @@ -0,0 +1,187 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Copyright c 2011 Natanael Gama exondiscoveredcom with Reserved Font Name Exo +Designer : Natanael Gama +</metadata> +<defs> +<font id="ExoBlack" horiz-adv-x="1161" > +<font-face units-per-em="2048" ascent="1638" descent="-410" /> +<missing-glyph horiz-adv-x="512" /> +<glyph unicode=" " horiz-adv-x="512" /> +<glyph unicode="	" horiz-adv-x="512" /> +<glyph unicode=" " horiz-adv-x="512" /> +<glyph unicode="!" horiz-adv-x="567" d="M94 1497h377l-43 -1096h-299zM111 47v240q0 51 49 51h235q47 0 47 -51v-240q0 -47 -47 -47h-235q-49 0 -49 47z" /> +<glyph unicode=""" horiz-adv-x="1017" d="M98 1362v137h377v-137l-20 -275h-332zM545 1362v137h377v-137l-21 -275h-336z" /> +<glyph unicode="#" horiz-adv-x="1533" d="M23 393l40 271h302l32 174h-305l43 270h316l75 391h271l-76 -391h180l74 391h270l-74 -391h342l-38 -270h-345l-32 -176h344l-37 -271h-369l-75 -391h-271l76 391l-182 2l-76 -393h-270l75 393h-290zM635 664l192 -2l33 176h-192z" /> +<glyph unicode="$" horiz-adv-x="1159" d="M63 981v125q0 207 113 303t301 102v177h221v-177q176 -8 344 -67v-309q-186 20 -430 20q-90 0 -120.5 -14.5t-30.5 -75.5v-23q0 -53 22.5 -75.5t100.5 -22.5h131q90 0 159.5 -29.5t110.5 -75.5t67.5 -106.5t36 -114t9.5 -108.5v-68q0 -451 -400 -458v-168h-221v168 q-27 0 -50.5 1t-40.5 2t-37.5 3t-32 3t-31 6t-27.5 7t-32.5 9.5t-32 10.5t-39 13t-43.5 14v309q225 -23 469 -22q66 0 93 19.5t27 64.5v33q0 47 -22.5 68.5t-85.5 21.5h-123q-111 0 -191.5 37t-119.5 86t-62.5 117.5t-28 109.5t-4.5 84z" /> +<glyph unicode="%" horiz-adv-x="1982" d="M49 991v232q0 135 67.5 205.5t217.5 70.5h207q281 0 280 -276v-232q0 -135 -67.5 -205.5t-216.5 -70.5h-207q-281 0 -281 276zM305 1053q0 -41 14.5 -61.5t61.5 -20.5h104q47 0 63.5 21.5t16.5 60.5v108q0 49 -17.5 65.5t-58.5 16.5h-104q-39 0 -59.5 -16.5t-20.5 -65.5 v-108zM393 0l930 1499h254l-915 -1499h-269zM1163 283v231q0 135 66.5 206t216.5 71h209q281 0 280 -277v-231q0 -135 -67.5 -206t-216.5 -71h-209q-279 1 -279 277zM1419 344q0 -41 14.5 -61.5t61.5 -20.5h102q82 0 82 82v109q0 49 -18.5 65.5t-58.5 16.5h-103 q-39 0 -59.5 -16.5t-20.5 -65.5v-109z" /> +<glyph unicode="&" horiz-adv-x="1464" d="M47.5 485.5q32.5 153.5 169.5 276.5l115 102l-86 133q-78 115 -65.5 220.5t83 183.5t160.5 94q72 12 147.5 15t119.5 1t125 -16t96.5 -17t97.5 -24v-295h-273q-68 0 -87 -21.5t-6 -52t52 -86.5l234 -327l262 225l143 -180l-137 -221l-72 -88l314 -408h-467l-125 172 l-123 -104q-63 -53 -174 -74t-237.5 21t-200.5 153q-98 164 -65.5 317.5zM434 397q72 -86 148 -8l53 55l-115 150l-61 -59q-76 -72 -25 -138z" /> +<glyph unicode="'" horiz-adv-x="524" d="M63 1362v137h400v-137l-21 -275h-356z" /> +<glyph unicode="(" horiz-adv-x="845" d="M86 668q0 209 40 399t97.5 311t113.5 212t96 131l40 40h350q-14 -20 -36.5 -57t-81 -155.5t-103.5 -240.5t-82 -298t-37 -342q0 -510 258 -967q47 -84 82 -131h-350q-16 12 -41.5 35.5t-92.5 117t-118 207t-93 312.5t-42 426z" /> +<glyph unicode=")" horiz-adv-x="845" d="M23 -430q14 18 36.5 52t81 146.5t103.5 233.5t81.5 303t36.5 363q0 474 -262 962l-77 131h350q16 -14 41.5 -41.5t92 -127t118 -215t93.5 -308t42 -401.5q0 -166 -21.5 -316.5t-55.5 -258t-76 -199t-83 -149.5t-74.5 -99t-55.5 -59l-21 -17h-350z" /> +<glyph unicode="*" horiz-adv-x="856" d="M57 1159v144l285 38l10 -192zM156 856l51 283l186 -49l-100 -277zM322 1479l137 45l125 -258l-181 -70zM360 940l105 162l233 -182l-86 -115zM471 1169l244 166l84 -116l-207 -199z" /> +<glyph unicode="+" horiz-adv-x="933" d="M41 571v316h266v268h316v-268h270v-316h-270v-268h-316v268h-266z" /> +<glyph unicode="," horiz-adv-x="522" d="M98 51v234q0 55 52 55h227q49 0 49 -55v-308q0 -72 -33 -113.5t-80 -52t-93 -9.5t-79 10l-32 8v127q41 -2 52 10t11 33v10h-22q-52 0 -52 51z" /> +<glyph unicode="-" horiz-adv-x="724" d="M41 436v316h643v-316h-643z" /> +<glyph unicode="." horiz-adv-x="526" d="M98 47v240q0 51 49 51h232q51 0 51 -51v-240q0 -47 -51 -47h-232q-49 0 -49 47z" /> +<glyph unicode="/" horiz-adv-x="1028" d="M23 -147l575 1724h408l-576 -1724h-407z" /> +<glyph unicode="0" horiz-adv-x="1271" d="M80 393v692q0 201 102.5 307.5t294.5 106.5h336q379 0 379 -393v-713q0 -184 -99.5 -288.5t-281.5 -104.5h-336q-197 0 -296 102.5t-99 290.5zM477 477q0 -53 21.5 -81.5t43 -34t52.5 -5.5h86q59 0 87 21.5t28 97.5v549q0 119 -99 119h-116q-102 0 -103 -119v-547z" /> +<glyph unicode="1" horiz-adv-x="776" d="M45 1081v252l246 166h393v-1499h-397v1122z" /> +<glyph unicode="2" horiz-adv-x="1191" d="M45 1161v297q281 61 623 62q231 0 349 -133.5t118 -358.5q0 -98 -45.5 -202.5t-127 -202t-133 -148.5t-124.5 -119h430v-356h-1074v344q180 119 428 348.5t248 329.5q0 88 -49 113.5t-184 25.5h-459z" /> +<glyph unicode="3" horiz-adv-x="1177" d="M35 1147v299q84 29 200.5 43t230.5 15t241 -1q174 -4 280.5 -102t106.5 -277v-80q0 -238 -172 -299q172 -55 172 -315v-59q0 -184 -106.5 -284.5t-295.5 -100.5h-76h-80q-16 0 -73 1t-79 2t-69 4t-73.5 7t-65.5 10t-69.5 14.5t-59.5 18.5l2 301h447q129 0 164.5 15.5 t35.5 82.5v19q0 66 -37.5 82t-150.5 22l-334 15v323l334 21q55 2 75.5 4t51.5 7t40 15.5t17 27.5t8 46v18q0 37 -13 59.5t-45 32t-57.5 11.5t-76.5 2h-473z" /> +<glyph unicode="4" horiz-adv-x="1300" d="M23 459l432 1040h426l-322 -854h199v275l55 159h342v-434h123v-305l-123 -59v-277h-397v277h-666z" /> +<glyph unicode="5" horiz-adv-x="1212" d="M88 41v317h541q45 0 71.5 9.5t37 31t11.5 32.5t1 36v63q0 55 -21.5 82t-77.5 27h-90q-49 0 -69.5 -21.5t-20.5 -70.5h-381l45 952h948v-356h-561l-8 -209q57 35 133 41q78 6 156 0q172 -14 258 -123t86 -279v-192q0 -195 -123 -292t-293 -97q-211 0 -330.5 8t-312.5 41z " /> +<glyph unicode="6" horiz-adv-x="1222" d="M76 786q0 195 28.5 335.5t81 217t109.5 113.5t133 49q274 43 680 -43v-303h-449q-68 0 -107.5 -17.5t-56 -59.5t-19.5 -76.5t-3 -106.5q53 29 114.5 36t198.5 7q209 0 290 -100.5t81 -286.5v-186q0 -367 -391 -367h-283q-80 0 -139 19.5t-111.5 71.5t-86 140t-52 227.5 t-18.5 329.5zM473 602q0 -160 31 -204t133 -44h35q51 0 69.5 19.5t18.5 75.5v40q0 72 -12.5 92.5t-65.5 20.5h-209z" /> +<glyph unicode="7" horiz-adv-x="1148" d="M35 1143v356h985l96 -160l-469 -1339h-422l406 1143h-596z" /> +<glyph unicode="8" horiz-adv-x="1263" d="M86 367v108q0 88 36 157.5t116 82.5q-43 23 -74 51.5t-45.5 53t-22.5 64.5t-9 64.5t-1 73.5v133q0 354 401 354h320q188 0 280.5 -83t92.5 -273v-90q0 -39 -9.5 -83t-46.5 -95t-98 -60q154 -29 154 -290v-156q0 -121 -29 -200t-86 -115.5t-116.5 -50t-143.5 -13.5h-318 q-80 0 -144 14.5t-105 35t-71 54t-45.5 63.5t-23.5 71t-10 66.5t-2 62.5zM483 430q0 -53 21.5 -73.5t75.5 -20.5h106q33 0 53.5 6t29.5 20.5t11 29t2 38.5v82q0 47 -18.5 71.5t-73.5 24.5h-110q-59 0 -78 -23.5t-19 -72.5v-82zM483 1012q0 -57 20.5 -73.5t76.5 -16.5h106 q63 0 79.5 19.5t16.5 70.5v61q0 35 -7 56.5t-23.5 30.5t-28.5 11.5t-37 2.5h-106q-53 0 -75 -17.5t-22 -83.5v-61z" /> +<glyph unicode="9" horiz-adv-x="1222" d="M70 948v187q0 367 391 366h282q80 0 139.5 -19.5t112 -71.5t86 -140t52 -227.5t18.5 -329.5q0 -195 -28.5 -335t-81 -217t-110 -114t-132.5 -49q-274 -43 -680 43v303h448q68 0 108 17.5t56.5 59.5t19.5 76.5t3 106.5q-53 -29 -114.5 -36t-199.5 -7q-209 0 -289.5 100.5 t-80.5 286.5zM467 1010q0 -72 12.5 -92.5t65.5 -20.5h209q0 160 -31 204t-133 44h-35q-51 0 -69.5 -19.5t-18.5 -74.5v-41z" /> +<glyph unicode=":" horiz-adv-x="526" d="M98 47v240q0 51 49 51h232q51 0 51 -51v-240q0 -47 -51 -47h-232q-49 0 -49 47zM98 797v239q0 51 49 51h232q51 0 51 -51v-239q0 -47 -51 -47h-232q-49 0 -49 47z" /> +<glyph unicode=";" horiz-adv-x="526" d="M98 51v234q0 55 52 55h227q49 0 49 -55v-308q0 -72 -33 -113.5t-80 -52t-93 -9.5t-79 10l-32 8v127q41 -2 52 10t11 33v10h-22q-52 0 -52 51zM98 797v239q0 51 49 51h232q51 0 51 -51v-239q0 -47 -51 -47h-232q-49 0 -49 47z" /> +<glyph unicode="<" horiz-adv-x="882" d="M57 545v348l768 266v-348l-379 -88l379 -109v-348z" /> +<glyph unicode="=" horiz-adv-x="956" d="M41 332v315h874v-315h-874zM41 780v316h874v-316h-874z" /> +<glyph unicode=">" horiz-adv-x="882" d="M57 266v348l379 109l-379 88v348l768 -266v-348z" /> +<glyph unicode="?" horiz-adv-x="1114" d="M23 1155v297q279 74 577 61q219 0 344 -126.5t125 -292.5v-105q0 -221 -96 -326.5t-340 -97.5v-166h-297v455h188q80 4 115 35t35 108v31q0 127 -178 127h-473zM317 47v240q0 51 50 51h231q51 0 51 -51v-240q0 -47 -51 -47h-231q-50 0 -50 47z" /> +<glyph unicode="@" horiz-adv-x="1818" d="M76 41v549q0 209 115.5 334t371.5 125h355q70 0 117.5 -5.5t105 -25t91.5 -55t57.5 -102t23.5 -161.5v-700h-242l-49 111l-12 -14q-12 -13 -35 -32.5t-53.5 -38t-78.5 -31.5t-100 -13q-133 0 -197.5 90t-64.5 211v67q0 293 326 293h211q2 31 0 33q0 49 -19.5 63.5 t-70.5 14.5h-365q-90 0 -141 -37t-51 -148v-487q0 -125 58 -178.5t134 -53.5h654q119 0 164.5 58.5t45.5 173.5v844q0 117 -57 180t-153 63h-828v240q281 57 651 55h177q94 0 179 -26.5t160.5 -85t120.5 -168t45 -258.5v-844q0 -279 -124.5 -403.5t-360.5 -124.5h-674 q-211 0 -349 114.5t-138 372.5zM795 350q0 -10 2 -12q0 -33 15 -47.5t56 -14.5q119 0 150 70v88l-160 -12q-35 -4 -48 -14.5t-13 -45.5q-2 -2 -2 -12z" /> +<glyph unicode="A" horiz-adv-x="1456" d="M51 0l469 1499h469l455 -1499h-408l-88 262h-403l-86 -262h-408zM635 600h233l-108 401z" /> +<glyph unicode="B" horiz-adv-x="1251" d="M92 0v1499h651q451 0 451 -409q0 -109 -58.5 -206.5t-160.5 -105.5q113 -18 184.5 -109t71.5 -210q0 -246 -117 -352.5t-360 -106.5h-662zM489 336h244q55 0 78 36t23 107q0 147 -101 148h-244v-291zM489 942h224q45 0 68.5 29.5t23.5 75.5q0 116 -90 116h-2h-224v-221z " /> +<glyph unicode="C" d="M63 754q0 385 114 573.5t405 188.5q213 0 308 -15.5t232 -66.5v-310l-12 2q-12 2 -34.5 5.5t-52.5 7.5t-66.5 7t-76.5 6t-86 5t-89 2q-121 0 -158 -22q-72 -44 -83 -259q-3 -56 -3 -128q0 -254 46 -330t200 -76q96 0 199.5 4t159.5 9l56 5v-309q-98 -41 -208 -55 q-86 -11 -239 -11q-44 0 -93 1q-279 4 -399 191.5t-120 574.5z" /> +<glyph unicode="D" horiz-adv-x="1366" d="M92 0v1499h703q119 0 209 -39t146 -104.5t92 -163.5t49.5 -205.5t13.5 -243.5q0 -389 -125 -566t-385 -177h-703zM489 336h265q86 0 119.5 94t33.5 315q0 178 -19.5 272.5t-50 120t-83.5 25.5h-265v-827z" /> +<glyph unicode="E" d="M82 330v821q0 348 381 348q430 0 670 -33v-333h-547q-49 0 -75 -19.5t-29 -39t-3 -56.5v-90l551 -23v-330l-551 -18v-90q0 -39 10.5 -62.5t33 -31.5t37.5 -10.5t46 -2.5h527v-331q-94 -12 -256 -21.5t-278 -11.5l-116 -2h-21q-52 0 -100 8q-58 10 -127 40t-111 103.5 t-42 184.5z" /> +<glyph unicode="F" d="M82 0v1143q0 100 34 173t92 111.5t121.5 55t133.5 16.5q430 0 670 -33v-333h-547q-49 0 -75 -19.5t-29 -39t-3 -56.5v-90l551 -23v-330l-551 -18v-557h-397z" /> +<glyph unicode="G" horiz-adv-x="1259" d="M63 758q0 184 21.5 313t75 234.5t153 158t248.5 52.5q250 0 335 -10.5t288 -65.5v-305q-2 0 -31 5t-77 11t-106.5 12t-135 11.5t-150.5 5.5q-139 0 -181 -85t-42 -341q0 -260 30.5 -330t161.5 -70q57 0 94 23.5t46 47.5l8 24v153h-101v246q96 51 359 51q66 0 139 -6v-893 h-280l-113 100q-45 -59 -91 -80.5t-163 -29.5q-21 -1 -41 -1q-97 0 -172 31q-90 39 -142.5 106t-83 173.5t-40 212t-9.5 246.5z" /> +<glyph unicode="H" horiz-adv-x="1302" d="M92 0v1499h397v-596h349v596h397v-1499h-397v547h-349v-547h-397z" /> +<glyph unicode="I" horiz-adv-x="557" d="M92 0v1499h397v-1499h-397z" /> +<glyph unicode="J" horiz-adv-x="727" d="M41 51v316q82 0 126 7t65.5 34.5t25.5 57.5t4 99v934h397v-1161q0 -229 -110 -301q-75 -46 -220 -46q-17 0 -35 1q-171 6 -253 59z" /> +<glyph unicode="K" horiz-adv-x="1351" d="M92 0v1499h377v-590h82l305 590h457l-412 -754l412 -745h-457l-305 573h-80v-573h-379z" /> +<glyph unicode="L" horiz-adv-x="1077" d="M92 319v1180h397v-1036q0 -39 10.5 -62.5t33 -32t38 -10.5t45.5 -2h422v-356h-606q-152 0 -246 77.5t-94 241.5z" /> +<glyph unicode="M" horiz-adv-x="1814" d="M63 0l160 1499h553l127 -842l135 842h553l162 -1499h-391l-102 817l-125 -817h-455l-131 817l-94 -817h-392z" /> +<glyph unicode="N" horiz-adv-x="1386" d="M92 0v1499h402l428 -766v766h397v-1499h-397l-430 745v-745h-400z" /> +<glyph unicode="O" horiz-adv-x="1366" d="M76 739q0 147 17.5 263t45 197t73.5 138.5t94 90t117 52t130 24.5t143 5q84 0 146.5 -6t131 -24.5t117 -51t93.5 -90t72.5 -138.5t44 -196.5t16.5 -263.5q0 -195 -31 -332t-80 -216.5t-133 -125t-169 -59.5t-208 -14q-104 0 -174.5 8t-148.5 33.5t-127 77t-90 132.5 t-60.5 204.5t-19.5 291.5zM473 739q0 -244 39 -317.5t184 -73.5q133 0 178.5 78t45.5 313q0 137 -8.5 213t-34 124t-66.5 62.5t-115 14.5q-96 0 -140 -27.5t-63.5 -114t-19.5 -272.5z" /> +<glyph unicode="P" horiz-adv-x="1269" d="M90 0v1499h668q72 0 129 -8t122.5 -38t109.5 -80t73 -142t29 -217q0 -137 -31 -237.5t-77 -153t-112.5 -81t-122.5 -33.5q-31 -3 -64 -3q-27 0 -56 2q-57 4 -159.5 20.5t-111.5 20.5v-549h-397zM487 844h230q104 0 104 164q0 153 -103 153h-1h-230v-317z" /> +<glyph unicode="Q" horiz-adv-x="1366" d="M76 739q0 147 17.5 263t45 197t73.5 138.5t94 90t117 52t130 24.5t143 5q84 0 146.5 -6t131 -24.5t117 -51t93.5 -90t72.5 -138.5t44 -196.5t16.5 -263.5q0 -162 -19.5 -284.5t-60.5 -202.5t-91 -132t-126 -80t-148.5 -37t-175.5 -11q-104 0 -174.5 8t-148.5 33.5 t-127 77t-90 132.5t-60.5 204.5t-19.5 291.5zM473 739q0 -244 39 -317.5t184 -73.5q133 0 178.5 78t45.5 313q0 137 -8.5 213t-34 124t-66.5 62.5t-115 14.5q-96 0 -140 -27.5t-63.5 -114t-19.5 -272.5zM586 -68h209q8 -91 155 -91q69 0 168 20v-287q-59 -9 -115 -9 q-71 0 -135 15q-116 25 -199 115t-83 237z" /> +<glyph unicode="R" horiz-adv-x="1267" d="M90 0v1499h670q217 0 338 -109.5t121 -371.5q0 -127 -17.5 -213t-55.5 -132t-67.5 -65.5t-81.5 -40.5l258 -567h-452l-193 530l-123 29v-559h-397zM489 858h220q72 0 91 35t19 125q0 74 -23.5 108.5t-86.5 34.5h-220v-303z" /> +<glyph unicode="S" horiz-adv-x="1220" d="M76 981v125q0 193 111.5 293t293.5 112q78 5 151 5q285 0 484 -72v-309q-186 20 -491 20q-90 0 -121 -14.5t-31 -75.5v-23q0 -53 22.5 -75.5t100.5 -22.5h192q90 0 160 -29.5t111 -75.5t67.5 -106.5t35.5 -114t9 -108.5v-68q0 -458 -413 -458h-2q-299 0 -391.5 9 t-241.5 60v309q216 -22 505 -22h25q66 0 93.5 19.5t27.5 64.5v33q0 47 -22.5 68.5t-85.5 21.5h-185q-111 0 -191.5 37t-119.5 86t-62.5 117.5t-27.5 109.5t-4 84z" /> +<glyph unicode="T" horiz-adv-x="1243" d="M41 1143v356h1163v-356h-389v-1143h-397v1143h-377z" /> +<glyph unicode="U" horiz-adv-x="1341" d="M92 655v844h397v-844q0 -72 2.5 -107.5t12.5 -81.5t30.5 -67.5t58.5 -37t95 -15.5q53 0 89 16.5t55.5 38t28.5 67.5t11 83t2 104v844h400v-844q0 -109 -12.5 -197.5t-32 -153t-53 -116t-64.5 -83t-79 -55t-81.5 -35t-90 -17.5t-87.5 -7t-86 -1h-19q-110 0 -168.5 4 t-149.5 38t-138 100.5t-84 198t-37 324.5z" /> +<glyph unicode="V" horiz-adv-x="1431" d="M51 1499h418l248 -1012l268 1012h418l-449 -1499h-479z" /> +<glyph unicode="W" horiz-adv-x="2084" d="M51 1499h418l248 -1012l186 1012h418l-76 -311l209 -701l186 1012h418l-366 -1499h-480l-137 489l-121 -489h-479z" /> +<glyph unicode="X" horiz-adv-x="1390" d="M51 1499h441l215 -416l215 416h440l-457 -756l447 -743h-441l-204 401l-209 -401h-441l449 743z" /> +<glyph unicode="Y" horiz-adv-x="1390" d="M51 1499h432l215 -663l232 663h432l-473 -1089v-410h-397v410z" /> +<glyph unicode="Z" horiz-adv-x="1130" d="M41 0v356l586 787h-586v356h1051v-356l-525 -787h525v-356h-1051z" /> +<glyph unicode="[" horiz-adv-x="704" d="M98 25v1286q0 207 96.5 310t305.5 103h184v-315h-61q-61 0 -94 -36t-33 -124v-1204q0 -88 32.5 -124t94.5 -36h61v-315h-184q-402 0 -402 455z" /> +<glyph unicode="\" horiz-adv-x="1028" d="M23 1577h407l576 -1724h-408z" /> +<glyph unicode="]" horiz-adv-x="704" d="M23 -115h61q61 0 94 36t33 124v1204q0 88 -33 124t-94 36h-61v315h184q209 0 305 -103t96 -310v-1286q0 -455 -401 -455h-184v315z" /> +<glyph unicode="^" horiz-adv-x="774" d="M57 1087l205 287h268l187 -287h-228l-100 105l-102 -105h-230z" /> +<glyph unicode="_" horiz-adv-x="1380" d="M41 -2v315h1298v-315h-1298z" /> +<glyph unicode="`" horiz-adv-x="499" d="M23 1380h296l158 -293h-223z" /> +<glyph unicode="a" horiz-adv-x="1062" d="M45 293v84q0 137 81 228t275 91q104 -1 156.5 -1t52.5 1q2 12 0 15q0 33 -6 53t-13 31.5t-27.5 15.5t-34 5t-46.5 1l-401 -22v231q102 49 203.5 65.5t263.5 16.5q233 0 346 -80t113 -297v-731h-320l-78 111q-20 -47 -76 -87q-50 -36 -136 -36h-17q-92 4 -160.5 35.5 t-104.5 79t-53.5 95.5t-17.5 95zM442 358q0 -14 1 -24t5.5 -18.5t7.5 -14.5t10 -9t10 -5t13.5 -3t12.5 -1h13h13q37 0 57.5 16t22.5 34l2 17v123l-106 -10q-31 -2 -45.5 -21.5t-15.5 -32t-1 -38.5v-13z" /> +<glyph unicode="b" horiz-adv-x="1144" d="M70 0v1608h397v-566q117 61 270 62q211 0 282 -128t71 -437q0 -293 -84 -422t-269 -129q-84 0 -141 27.5t-127 84.5l-59 -100h-340zM469 354q27 -45 133 -45q49 0 69.5 47t20.5 203q0 162 -20.5 211t-69.5 49q-104 0 -133 -31v-434z" /> +<glyph unicode="c" horiz-adv-x="1003" d="M57 545q0 301 94.5 427t264.5 126h44h55q17 0 59 -1t69 -4t70 -8.5t76.5 -13.5t75.5 -20.5t79 -26.5v-233q-123 12 -305 12q-66 0 -90.5 -3t-52 -27.5t-34.5 -78t-7 -153.5q0 -96 6 -146.5t31.5 -76t53 -29.5t93.5 -4l319 16v-233q-53 -39 -130.5 -57.5t-127.5 -21.5 q-30 -2 -81 -2q-33 0 -75 1q-104 2 -128 2q-359 0 -359 555z" /> +<glyph unicode="d" horiz-adv-x="1144" d="M57 539q0 317 70 441t283 124q154 0 270 -62v566h397v-1608h-340l-59 100q-70 -57 -127 -84.5t-141 -27.5q-186 0 -269.5 124t-83.5 427zM455 559q0 -156 20.5 -203t69.5 -47q106 0 133 45v434q-29 31 -133 31q-49 0 -69.5 -49t-20.5 -211z" /> +<glyph unicode="e" horiz-adv-x="1075" d="M57 549q0 227 48.5 345t144.5 160t282 42q150 0 234 -12.5t149.5 -55.5t90 -123t24.5 -215q0 -160 -82 -225.5t-239 -65.5h-254q0 -37 9 -60.5t19.5 -35.5t39 -17t47 -5t63.5 1t69 1q154 0 308 22v-258q-29 -14 -66 -24.5t-88 -16.5t-84 -9t-99.5 -5t-86.5 -2h-94h-76 q-201 0 -280 133t-79 426zM455 651h118q27 0 43.5 18.5t16.5 47.5q0 61 -11.5 82.5t-60.5 21.5q-68 -1 -88 -29q-18 -26 -18 -121v-20z" /> +<glyph unicode="f" horiz-adv-x="833" d="M23 813v240l147 34v203q0 178 91 249t286 71q168 0 264 -49v-228l-149 2q-35 0 -54.5 -5t-29 -26.5t-10.5 -41t-1 -68.5v-27v-80h201v-274h-201v-813h-397v813h-147z" /> +<glyph unicode="g" horiz-adv-x="1159" d="M51 188q0 160 131 213q-121 78 -121 304q0 387 396 387h680v-218l-84 -36q22 -63 22 -184v-11q0 -156 -89 -247t-310 -91h-197h-14h-17q-4 0 -14 -1t-15 -3t-11.5 -6t-8.5 -11.5t-2 -15.5q0 -20 12.5 -30.5t27 -11.5t42.5 -1h250q369 0 369 -354v-109q0 -315 -369 -315 h-307q-154 0 -251 80t-97 235v109l106 72q-51 23 -90 85t-39 160zM459 705q0 -70 19.5 -87.5t66.5 -17.5h45q53 0 70.5 17.5t17.5 87.5q0 59 -21.5 75.5t-68.5 16.5h-49q-51 0 -65.5 -21.5t-14.5 -70.5zM473 -72v-102q0 -53 17.5 -68.5t72.5 -15.5h58q31 0 49 5t24 19.5 t7 20.5t1 29v47q0 27 -21.5 45t-57.5 20h-68h-82z" /> +<glyph unicode="h" horiz-adv-x="1136" d="M70 0v1602h395v-621q39 39 69.5 60.5t92 43t139.5 21.5q102 0 167.5 -29.5t96.5 -91t41 -126t10 -163.5v-696h-397v705q0 61 -16.5 83.5t-51.5 22.5q-117 0 -149 -76v-735h-397z" /> +<glyph unicode="i" horiz-adv-x="516" d="M57 1237v240q0 51 49 51h308q45 0 45 -51v-240q0 -47 -45 -47h-308q-49 0 -49 47zM59 0v1087h398v-1087h-398z" /> +<glyph unicode="j" horiz-adv-x="540" d="M70 1237v240q0 51 49 51h307q47 0 47 -51v-240q0 -47 -47 -47h-307q-49 0 -49 47zM74 -553v1640h397v-1095v-29q0 -353 -94 -516h-303z" /> +<glyph unicode="k" horiz-adv-x="1239" d="M70 0v1602h397v-861h41l221 346h488l-347 -483l347 -604h-465l-244 467h-41v-467h-397z" /> +<glyph unicode="l" horiz-adv-x="665" d="M70 387v1217h397v-1135q0 -68 10 -109t24.5 -56t41.5 -30q86 -43 100 -43v-231h-283q-150 0 -220 88t-70 299z" /> +<glyph unicode="m" horiz-adv-x="1755" d="M70 0v1087h331l66 -106q49 45 75.5 64.5t86 40t137.5 20.5q197 0 266 -125q63 41 100 60.5t108 42t144 22.5q102 0 168 -29.5t96.5 -91t41 -126t10.5 -163.5v-696h-397v705q0 61 -16.5 83.5t-51.5 22.5q-117 0 -156 -61q0 -8 1 -25.5t1 -28.5v-696h-397v705 q0 61 -16.5 83.5t-51.5 22.5q-117 0 -149 -76v-735h-397z" /> +<glyph unicode="n" horiz-adv-x="1136" d="M70 0v1087h331l66 -106q45 43 72.5 63.5t88 41t138.5 20.5q102 0 167.5 -29.5t96.5 -91t41 -126t10 -163.5v-696h-397v705q0 61 -16.5 83.5t-51.5 22.5q-117 0 -149 -76v-735h-397z" /> +<glyph unicode="o" horiz-adv-x="1134" d="M57 528q0 328 112 449t398.5 121t398 -123t111.5 -447q0 -305 -109.5 -421.5t-400.5 -116.5q-285 0 -397.5 121.5t-112.5 416.5zM455 528q0 -164 17 -203.5t95 -39.5q82 0 97.5 34.5t15.5 208.5q0 188 -15.5 231.5t-97.5 43.5q-86 0 -99 -41t-13 -234z" /> +<glyph unicode="p" horiz-adv-x="1144" d="M70 -553v1640h340l59 -100q70 57 127 85t141 28q184 0 268.5 -130t84.5 -421q0 -111 -8.5 -192t-31 -154.5t-61.5 -119.5t-102.5 -72.5t-149.5 -26.5q-154 0 -270 61v-598h-397zM469 299q29 -31 133 -31q49 0 69.5 49.5t20.5 210.5q0 156 -20.5 203t-69.5 47 q-106 0 -133 -45v-434z" /> +<glyph unicode="q" horiz-adv-x="1136" d="M57 549q0 295 106.5 423t309.5 128q170 0 343 -20.5t253 -53.5v-1579h-397v612q-60 -79 -196 -79h-3q-229 0 -322.5 133t-93.5 436zM455 563q0 -182 20.5 -239.5t95.5 -57.5q70 0 101 39v520h-97q-43 0 -68.5 -21.5t-36.5 -66.5t-13 -79t-2 -95z" /> +<glyph unicode="r" horiz-adv-x="839" d="M70 0v1087h352l45 -137q29 59 93.5 103.5t141.5 44.5q63 0 97 -11v-380h-162q-41 0 -62.5 -2.5t-51 -12.5t-43 -37.5t-13.5 -70.5v-584h-397z" /> +<glyph unicode="s" horiz-adv-x="1046" d="M45 692v94q0 139 67.5 225.5t215.5 86.5q388 0 491 -19q96 -17 127 -55v-233h-459q-16 0 -24 -1.5t-14.5 -9.5t-6.5 -26v-13q0 -16 7.5 -23t14.5 -8t23 -1h205q162 0 234.5 -81t72.5 -214v-121q0 -156 -77.5 -229.5t-188.5 -73.5h-72q-174 0 -260 2t-183 19.5t-128 54.5 v234h475q25 0 31 7.5t6 26.5v10q0 20 -7 28.5t-30 8.5h-196q-150 0 -237 78.5t-87 232.5z" /> +<glyph unicode="t" horiz-adv-x="788" d="M23 815v197l153 78l57 303h340v-303h183v-275h-183v-344q0 -100 17.5 -139t56.5 -60q86 -43 101 -43v-231h-308q-129 0 -196.5 91t-67.5 300v426h-153z" /> +<glyph unicode="u" horiz-adv-x="1136" d="M57 391v696h398v-704q0 -61 16 -84t51 -23q117 0 150 76v735h397v-1087h-332l-65 106q-20 -12 -61.5 -42.5t-64 -44t-68.5 -25.5t-105 -12q-102 0 -168 29.5t-96.5 91t-41 126t-10.5 162.5z" /> +<glyph unicode="v" horiz-adv-x="1204" d="M23 1087h421l154 -659l164 659h420l-361 -1087h-459z" /> +<glyph unicode="w" horiz-adv-x="1734" d="M23 1087h421l134 -659l122 659h385l-47 -247l133 -412l119 659h424l-299 -1087h-459l-98 281l-78 -281h-458z" /> +<glyph unicode="x" horiz-adv-x="1253" d="M29 0l360 545l-360 542h475l121 -249l125 249h475l-367 -548l350 -539h-458l-123 248l-123 -248h-475z" /> +<glyph unicode="y" horiz-adv-x="1226" d="M25 1087h411l125 -688q14 -76 88 -80l142 768h403l-293 -1431l-145 -209h-295l121 553q-315 0 -387 319z" /> +<glyph unicode="z" horiz-adv-x="1001" d="M35 772v315h934v-315l-371 -455h371v-315h-903v311l403 459h-434z" /> +<glyph unicode="{" horiz-adv-x="659" d="M23 543v280q123 10 122 109v411q0 381 492 381v-315q-63 0 -78.5 -42t-15.5 -187v-279q0 -109 -54.5 -159t-160.5 -58q213 -43 213 -211v-407q0 -115 15 -158t81 -43v-295q-270 0 -382 81t-112 271v512q1 117 -120 109z" /> +<glyph unicode="|" horiz-adv-x="512" d="M98 -147v1724h316v-1724h-316z" /> +<glyph unicode="}" horiz-adv-x="659" d="M23 -135q66 0 81 43t15 158v407q0 168 213 211q-106 8 -160.5 58.5t-54.5 158.5v279q0 145 -15.5 187t-78.5 42v315q492 0 491 -381v-411q0 -98 123 -109v-280q-121 8 -121 -109v-512q0 -190 -111.5 -271t-381.5 -81v295z" /> +<glyph unicode="~" horiz-adv-x="827" d="M57 1225q104 152 252 151q47 0 112.5 -35.5t104.5 -35.5q106 -6 191 81l53 -151q-98 -147 -229 -148q-45 0 -122 36t-116 36q-98 0 -190 -72z" /> +<glyph unicode="¢" horiz-adv-x="993" d="M45 545q0 301 95.5 427t265.5 126v200h221v-204q172 -14 307 -70v-233q-125 12 -307 12q-66 0 -90.5 -3t-52 -27.5t-35 -78t-7.5 -153.5q0 -96 6.5 -146.5t32 -76t53 -29.5t93.5 -4l319 16v-233q-115 -80 -328 -80v-183h-221v185q-352 8 -352 555z" /> +<glyph unicode="£" horiz-adv-x="1171" d="M57 0v305l127 51v258h-127v195l127 55v88q0 170 36 280.5t114 168t175 78t245 20.5q51 0 141 -8t155 -16l64 -9v-321h-377q-94 0 -124.5 -25.5t-30.5 -122.5v-133l370 -35v-215h-370v-258h530v-356h-1055z" /> +<glyph unicode="¥" horiz-adv-x="1355" d="M23 1499h432l215 -663l231 663h432l-340 -780h109v-203h-242v-51h242v-203h-242v-262h-397v262h-236v203h236v51h-236v203h111z" /> +<glyph unicode="¨" horiz-adv-x="905" d="M57 1192q0 55 40 94t95.5 39t94.5 -39t39 -94t-39 -95t-94.5 -40t-95.5 40t-40 95zM580 1192q0 55 39.5 94t95 39t94.5 -39t39 -94t-39 -95t-94.5 -40t-95 40t-39.5 95z" /> +<glyph unicode="©" horiz-adv-x="1622" d="M63 754q0 164 24 287.5t83 232t175 167t286 58.5h409q152 0 256.5 -53t160.5 -156.5t80 -231.5t24 -304q0 -383 -138.5 -568.5t-382.5 -185.5h-409q-287 0 -427.5 200t-140.5 554zM297 754q0 -254 82 -397.5t252 -143.5h389q150 0 228.5 122t78.5 419q0 74 -3 126 t-11 119.5t-28.5 113.5t-50.5 88t-79 63.5t-115 21.5h-409q-158 0 -246 -113.5t-88 -418.5zM444 748q0 238 75 342t220 104q256 0 385 -49v-189q-172 25 -303 25q-84 0 -113.5 -48t-29.5 -192q0 -127 37 -177t121 -50q137 0 301 33v-189q-49 -27 -120 -40t-119 -15t-140 -2 q-314 1 -314 447z" /> +<glyph unicode="«" horiz-adv-x="1243" d="M57 725l422 416l199 -195l-225 -221l227 -225l-191 -201zM563 725l422 416l199 -195l-226 -221l228 -225l-191 -201z" /> +<glyph unicode="­" horiz-adv-x="724" d="M41 436v316h643v-316h-643z" /> +<glyph unicode="®" horiz-adv-x="1622" d="M63 754q0 164 24 287.5t83 232t175 167t286 58.5h409q152 0 256.5 -53t160.5 -156.5t80 -231.5t24 -304q0 -383 -138.5 -568.5t-382.5 -185.5h-409q-287 0 -427.5 200t-140.5 554zM297 754q0 -254 82 -397.5t252 -143.5h389q150 0 228.5 122t78.5 419q0 74 -3 126 t-11 119.5t-28.5 113.5t-50.5 88t-79 63.5t-115 21.5h-409q-158 0 -246 -113.5t-88 -418.5zM485 313v875h383q274 0 275 -283q0 -119 -31 -181t-100 -87l172 -324h-248l-158 308l-59 24v-332h-234zM719 817h80q78 0 94 13.5t16 72.5q0 47 -19.5 59.5t-90.5 12.5h-80v-158z " /> +<glyph unicode="´" horiz-adv-x="499" d="M23 1087l157 293h297l-231 -293h-223z" /> +<glyph unicode="¸" horiz-adv-x="487" d="M57 -213l76 31q43 18 50 32.5t7 73.5h240q0 -160 -54 -229.5t-194 -69.5h-125v162z" /> +<glyph unicode="»" horiz-adv-x="1243" d="M57 500l228 225l-226 221l199 195l422 -416l-432 -426zM563 500l228 225l-226 221l199 195l422 -416l-432 -426z" /> +<glyph unicode="À" horiz-adv-x="1456" d="M51 0l469 1499h469l455 -1499h-408l-88 262h-403l-86 -262h-408zM412 1925h297l157 -293h-223zM635 600h233l-108 401z" /> +<glyph unicode="Â" horiz-adv-x="1456" d="M51 0l469 1499h469l455 -1499h-408l-88 262h-403l-86 -262h-408zM426 1632l205 287h266l188 -287h-229l-98 105l-103 -105h-229zM635 600h233l-108 401z" /> +<glyph unicode="Æ" horiz-adv-x="2009" d="M35 0l555 1130q59 121 143 201t184.5 116t196.5 47t215 5q389 0 629 -33v-333h-506q-49 0 -74.5 -19.5t-28.5 -39t-3 -56.5v-90l509 -23v-330l-509 -18v-90q0 -39 10 -62.5t32.5 -31.5t38 -10.5t46.5 -2.5h485v-331q-211 -29 -608 -35q-63 -4 -125 4t-128.5 31.5 t-107.5 80t-41 138.5v94h-301l-172 -342h-440zM807 678h141v309z" /> +<glyph unicode="Ç" d="M63 754q0 385 114 573.5t405 188.5q213 0 308 -15.5t232 -66.5v-310l-12 2q-12 2 -34.5 5.5t-52.5 7.5t-66.5 7t-76.5 6t-86 5t-89 2q-121 0 -158 -22q-72 -44 -83 -259q-3 -56 -3 -128q0 -254 46 -330t200 -76q96 0 199.5 4t159.5 9l56 5v-309q-98 -41 -208.5 -55 t-331.5 -10q-279 4 -399 191.5t-120 574.5zM383 -211l76 31q43 18 50 32.5t7 73.5h240q0 -160 -54.5 -229.5t-193.5 -69.5h-125v162z" /> +<glyph unicode="È" d="M82 330v821q0 348 381 348q430 0 670 -33v-333h-547q-49 0 -75 -19.5t-29 -39t-3 -56.5v-90l551 -23v-330l-551 -18v-90q0 -39 10.5 -62.5t33 -31.5t37.5 -10.5t46 -2.5h527v-331q-94 -12 -256 -21.5t-278 -11.5l-116 -2q-63 -2 -120.5 8t-127 40t-111.5 103.5t-42 184.5 zM317 1927h297l158 -293h-223z" /> +<glyph unicode="É" d="M82 330v821q0 348 381 348q430 0 670 -33v-333h-547q-49 0 -75 -19.5t-29 -39t-3 -56.5v-90l551 -23v-330l-551 -18v-90q0 -39 10.5 -62.5t33 -31.5t37.5 -10.5t46 -2.5h527v-331q-94 -12 -256 -21.5t-278 -11.5l-116 -2q-63 -2 -120.5 8t-127 40t-111.5 103.5t-42 184.5 zM545 1632l157 293h297l-231 -293h-223z" /> +<glyph unicode="Ê" d="M82 330v821q0 348 381 348q430 0 670 -33v-333h-547q-49 0 -75 -19.5t-29 -39t-3 -56.5v-90l551 -23v-330l-551 -18v-90q0 -39 10.5 -62.5t33 -31.5t37.5 -10.5t46 -2.5h527v-331q-94 -12 -256 -21.5t-278 -11.5l-116 -2q-63 -2 -120.5 8t-127 40t-111.5 103.5t-42 184.5 zM324 1632l204 287h269l186 -287h-227l-101 105l-102 -105h-229z" /> +<glyph unicode="Ë" d="M82 330v821q0 348 381 348q430 0 670 -33v-333h-547q-49 0 -75 -19.5t-29 -39t-3 -56.5v-90l551 -23v-330l-551 -18v-90q0 -39 10.5 -62.5t33 -31.5t37.5 -10.5t46 -2.5h527v-331q-94 -12 -256 -21.5t-278 -11.5l-116 -2q-63 -2 -120.5 8t-127 40t-111.5 103.5t-42 184.5 zM238 1767.5q0 55.5 39.5 94.5t95 39t94.5 -39t39 -94.5t-39 -95.5t-94.5 -40t-95 40t-39.5 95.5zM760 1767.5q0 55.5 40 94.5t95 39t94 -39t39 -94.5t-39 -95.5t-94 -40t-95 40t-40 95.5z" /> +<glyph unicode="Î" horiz-adv-x="557" d="M-39 1632l205 287h268l187 -287h-228l-100 105l-103 -105h-229zM92 0v1499h397v-1499h-397z" /> +<glyph unicode="Ï" horiz-adv-x="557" d="M-104 1767.5q0 55.5 39.5 94.5t95 39t94.5 -39t39 -94.5t-39 -95.5t-94.5 -40t-95 40t-39.5 95.5zM92 0v1499h397v-1499h-397zM418 1767.5q0 55.5 40 94.5t95 39t94 -39t39 -94.5t-39 -95.5t-94 -40t-95 40t-40 95.5z" /> +<glyph unicode="Ô" horiz-adv-x="1366" d="M76 739q0 147 17.5 263t45 197t73.5 138.5t94 90t117 52t130 24.5t143 5q84 0 146.5 -6t131 -24.5t117 -51t93.5 -90t72.5 -138.5t44 -196.5t16.5 -263.5q0 -195 -31 -332t-80 -216.5t-133 -125t-169 -59.5t-208 -14q-104 0 -174.5 8t-148.5 33.5t-127 77t-90 132.5 t-60.5 204.5t-19.5 291.5zM367 1632l204 287h269l186 -287h-227l-101 105l-102 -105h-229zM473 739q0 -244 39 -317.5t184 -73.5q133 0 178.5 78t45.5 313q0 137 -8.5 213t-34 124t-66.5 62.5t-115 14.5q-96 0 -140 -27.5t-63.5 -114t-19.5 -272.5z" /> +<glyph unicode="Ù" horiz-adv-x="1341" d="M92 655v844h397v-844q0 -72 2.5 -107.5t12.5 -81.5t30.5 -67.5t58.5 -37t95 -15.5q53 0 89 16.5t55.5 38t28.5 67.5t11 83t2 104v844h400v-844q0 -109 -12.5 -197.5t-32 -153t-53 -116t-64.5 -83t-79 -55t-81.5 -35t-90 -17.5t-87.5 -7t-86 -1h-19q-110 0 -168.5 4 t-149.5 38t-138 100.5t-84 198t-37 324.5zM340 1925h297l158 -293h-224z" /> +<glyph unicode="Û" horiz-adv-x="1341" d="M92 655v844h397v-844q0 -72 2.5 -107.5t12.5 -81.5t30.5 -67.5t58.5 -37t95 -15.5q53 0 89 16.5t55.5 38t28.5 67.5t11 83t2 104v844h400v-844q0 -109 -12.5 -197.5t-32 -153t-53 -116t-64.5 -83t-79 -55t-81.5 -35t-90 -17.5t-87.5 -7t-86 -1h-19q-110 0 -168.5 4 t-149.5 38t-138 100.5t-84 198t-37 324.5zM352 1632l205 287h270l185 -287h-226l-102 105l-102 -105h-230z" /> +<glyph unicode="Ü" horiz-adv-x="1341" d="M92 655v844h397v-844q0 -72 2.5 -107.5t12.5 -81.5t30.5 -67.5t58.5 -37t95 -15.5q53 0 89 16.5t55.5 38t28.5 67.5t11 83t2 104v844h400v-844q0 -109 -12.5 -197.5t-32 -153t-53 -116t-64.5 -83t-79 -55t-81.5 -35t-90 -17.5t-87.5 -7t-86 -1h-19q-110 0 -168.5 4 t-149.5 38t-138 100.5t-84 198t-37 324.5zM287 1767.5q0 55.5 40 94.5t95 39t95 -39t40 -94.5t-40 -95.5t-95 -40t-95 40t-40 95.5zM811 1767.5q0 55.5 40 94.5t95 39t93 -39t38 -94.5t-38 -95.5t-93 -40t-95 40t-40 95.5z" /> +<glyph unicode="à" horiz-adv-x="1062" d="M45 293v84q0 137 81 228t275 91q209 -2 209 0q2 12 0 15q0 33 -6 53t-13 31.5t-27.5 15.5t-34 5t-46.5 1l-401 -22v231q102 49 203.5 65.5t263.5 16.5q233 0 346 -80t113 -297v-731h-320l-78 111q-20 -47 -75.5 -87t-153.5 -36q-92 4 -160.5 35.5t-104.5 79t-53.5 95.5 t-17.5 95zM205 1524h299l155 -293h-221zM442 358q0 -14 1 -24t5.5 -18.5t7.5 -14.5t10 -9t10 -5t13.5 -3t12.5 -1h13h13q37 0 57.5 16t22.5 34l2 17v123l-106 -10q-31 -2 -45.5 -21.5t-15.5 -32t-1 -38.5v-13z" /> +<glyph unicode="â" horiz-adv-x="1062" d="M45 293v84q0 137 81 228t275 91q209 -2 209 0q2 12 0 15q0 33 -6 53t-13 31.5t-27.5 15.5t-34 5t-46.5 1l-401 -22v231q102 49 203.5 65.5t263.5 16.5q233 0 346 -80t113 -297v-731h-320l-78 111q-20 -47 -75.5 -87t-153.5 -36q-92 4 -160.5 35.5t-104.5 79t-53.5 95.5 t-17.5 95zM219 1231l205 287h268l187 -287h-228l-100 104l-102 -104h-230zM442 358q0 -14 1 -24t5.5 -18.5t7.5 -14.5t10 -9t10 -5t13.5 -3t12.5 -1h13h13q37 0 57.5 16t22.5 34l2 17v123l-106 -10q-31 -2 -45.5 -21.5t-15.5 -32t-1 -38.5v-13z" /> +<glyph unicode="æ" horiz-adv-x="1679" d="M45 293v63q0 137 81 228.5t275 91.5q209 -2 209 0q2 33 0 35q0 33 -6 53t-13 31.5t-27.5 15.5t-34 5t-46.5 1l-401 -24v233q102 49 203.5 65.5t263.5 16.5q225 -8 307 -61q109 49 279 49q285 0 392 -74t107 -307q0 -158 -80.5 -214.5t-242.5 -56.5h-252 q0 -102 58.5 -131.5t189.5 -29.5q154 0 307 22v-258q-29 -14 -66 -24.5t-88 -16.5t-84 -9t-99.5 -5t-86.5 -2h-94h-76q-199 0 -283 139q-27 -59 -139.5 -102t-216.5 -39q-92 4 -160.5 35.5t-104.5 79t-53.5 95.5t-17.5 95zM442 348q0 -25 4.5 -39t15.5 -20t18 -7t25.5 0 t22.5 1q37 0 57.5 16t22.5 34l2 17v103l-106 -11q-31 -2 -45.5 -21.5t-15.5 -31.5t-1 -39v-2zM1059 676h117q27 0 44 18.5t17 46.5q0 55 -11.5 67.5t-62.5 12.5h-15q-34 0 -46 -2t-25.5 -15t-16.5 -43t-1 -85z" /> +<glyph unicode="ç" horiz-adv-x="1003" d="M57 545q0 301 94.5 427t264.5 126h44h55q17 0 59 -1t69 -4t70 -8.5t76.5 -13.5t75.5 -20.5t79 -26.5v-233q-123 12 -305 12q-66 0 -90.5 -3t-52 -27.5t-34.5 -78t-7 -153.5q0 -96 6 -146.5t31.5 -76t53 -29.5t93.5 -4l319 16v-233q-53 -39 -130.5 -57.5t-128 -21.5 t-155 -1t-128.5 2q-359 0 -359 555zM295 -215l76 31q43 18 50 32.5t7 73.5h240q0 -160 -54.5 -229.5t-193.5 -69.5h-125v162z" /> +<glyph unicode="è" horiz-adv-x="1075" d="M57 549q0 227 48.5 345t144.5 160t282 42q150 0 234 -12.5t149.5 -55.5t90 -123t24.5 -215q0 -160 -82 -225.5t-239 -65.5h-254q0 -37 9 -60.5t19.5 -35.5t39 -17t47 -5t63.5 1t69 1q154 0 308 22v-258q-29 -14 -66 -24.5t-88 -16.5t-84 -9t-99.5 -5t-86.5 -2h-94h-76 q-201 0 -280 133t-79 426zM205 1513h295l159 -292h-225zM455 651h118q27 0 43.5 18.5t16.5 47.5q0 61 -11.5 82.5t-60.5 21.5q-68 0 -88 -28.5t-18 -141.5z" /> +<glyph unicode="é" horiz-adv-x="1075" d="M57 549q0 227 48.5 345t144.5 160t282 42q150 0 234 -12.5t149.5 -55.5t90 -123t24.5 -215q0 -160 -82 -225.5t-239 -65.5h-254q0 -37 9 -60.5t19.5 -35.5t39 -17t47 -5t63.5 1t69 1q154 0 308 22v-258q-29 -14 -66 -24.5t-88 -16.5t-84 -9t-99.5 -5t-86.5 -2h-94h-76 q-201 0 -280 133t-79 426zM434 1221l160 292h295l-230 -292h-225zM455 651h118q27 0 43.5 18.5t16.5 47.5q0 61 -11.5 82.5t-60.5 21.5q-68 0 -88 -28.5t-18 -141.5z" /> +<glyph unicode="ê" horiz-adv-x="1075" d="M57 549q0 227 48.5 345t144.5 160t282 42q150 0 234 -12.5t149.5 -55.5t90 -123t24.5 -215q0 -160 -82 -225.5t-239 -65.5h-254q0 -37 9 -60.5t19.5 -35.5t39 -17t47 -5t63.5 1t69 1q154 0 308 22v-258q-29 -14 -66 -24.5t-88 -16.5t-84 -9t-99.5 -5t-86.5 -2h-94h-76 q-201 0 -280 133t-79 426zM203 1221l205 286h268l186 -286h-227l-100 104l-103 -104h-229zM455 651h118q27 0 43.5 18.5t16.5 47.5q0 61 -11.5 82.5t-60.5 21.5q-68 0 -88 -28.5t-18 -141.5z" /> +<glyph unicode="ë" horiz-adv-x="1075" d="M57 549q0 227 48.5 345t144.5 160t282 42q150 0 234 -12.5t149.5 -55.5t90 -123t24.5 -215q0 -160 -82 -225.5t-239 -65.5h-254q0 -37 9 -60.5t19.5 -35.5t39 -17t47 -5t63.5 1t69 1q154 0 308 22v-258q-29 -14 -66 -24.5t-88 -16.5t-84 -9t-99.5 -5t-86.5 -2h-94h-76 q-201 0 -280 133t-79 426zM137 1355.5q0 55.5 40 94.5t95.5 39t94.5 -39t39 -94.5t-39 -95t-94.5 -39.5t-95.5 39.5t-40 95zM455 651h118q27 0 43.5 18.5t16.5 47.5q0 61 -11.5 82.5t-60.5 21.5q-68 0 -88 -28.5t-18 -141.5zM659 1355.5q0 55.5 40 94.5t95.5 39t94.5 -39 t39 -94.5t-39 -95t-94.5 -39.5t-95.5 39.5t-40 95z" /> +<glyph unicode="î" horiz-adv-x="534" d="M-61 1221l204 286h269l186 -286h-227l-101 104l-102 -104h-229zM70 0v1087h397v-1087h-397z" /> +<glyph unicode="ï" horiz-adv-x="534" d="M-127 1355.5q0 55.5 40 94.5t95 39t94 -39t39 -94.5t-39 -95t-94 -39.5t-95 39.5t-40 95zM70 0v1087h397v-1087h-397zM395 1355.5q0 55.5 40 94.5t95.5 39t94.5 -39t39 -94.5t-39 -95t-94.5 -39.5t-95.5 39.5t-40 95z" /> +<glyph unicode="ô" horiz-adv-x="1134" d="M57 528q0 328 112 449t398.5 121t398 -123t111.5 -447q0 -305 -109.5 -421.5t-400.5 -116.5q-285 0 -397.5 121.5t-112.5 416.5zM238 1221l204 286h269l186 -286h-227l-101 104l-102 -104h-229zM455 528q0 -164 17 -203.5t95 -39.5q82 0 97.5 34.5t15.5 208.5 q0 188 -15.5 231.5t-97.5 43.5q-86 0 -99 -41t-13 -234z" /> +<glyph unicode="ù" horiz-adv-x="1136" d="M57 391v696h398v-704q0 -61 16 -84t51 -23q117 0 150 76v735h397v-1087h-332l-65 106q-20 -12 -61.5 -42.5t-64 -44t-68.5 -25.5t-105 -12q-102 0 -168 29.5t-96.5 91t-41 126t-10.5 162.5zM221 1513h295l160 -292h-225z" /> +<glyph unicode="û" horiz-adv-x="1136" d="M57 391v696h398v-704q0 -61 16 -84t51 -23q117 0 150 76v735h397v-1087h-332l-65 106q-20 -12 -61.5 -42.5t-64 -44t-68.5 -25.5t-105 -12q-102 0 -168 29.5t-96.5 91t-41 126t-10.5 162.5zM233 1221l205 286h269l186 -286h-227l-101 104l-102 -104h-230z" /> +<glyph unicode="ü" horiz-adv-x="1136" d="M57 391v696h398v-704q0 -61 16 -84t51 -23q117 0 150 76v735h397v-1087h-332l-65 106q-20 -12 -61.5 -42.5t-64 -44t-68.5 -25.5t-105 -12q-102 0 -168 29.5t-96.5 91t-41 126t-10.5 162.5zM168 1355.5q0 55.5 40 94.5t95 39t94 -39t39 -94.5t-39 -95t-94 -39.5t-95 39.5 t-40 95zM690 1355.5q0 55.5 40 94.5t95.5 39t94 -39t38.5 -94.5t-38.5 -95t-94 -39.5t-95.5 39.5t-40 95z" /> +<glyph unicode="ÿ" horiz-adv-x="1226" d="M25 1087h411l125 -688q14 -76 88 -80l142 768h403l-293 -1431l-145 -209h-295l121 553q-315 0 -387 319zM213 1355.5q0 55.5 40 94.5t95 39t95 -39t40 -94.5t-40 -95t-95 -39.5t-95 39.5t-40 95zM737 1355.5q0 55.5 40 94.5t95.5 39t93.5 -39t38 -94.5t-38 -95 t-93.5 -39.5t-95.5 39.5t-40 95z" /> +<glyph unicode="Œ" horiz-adv-x="1988" d="M76 739q0 147 17.5 263t45 197t73.5 138.5t94 90t117 52t130 24.5t143 5q236 0 357 -61q94 59 245 51q389 0 629 -33v-333h-506q-49 0 -74.5 -19.5t-28.5 -39t-3 -56.5v-90l510 -23v-330l-510 -18v-90q0 -39 10 -62.5t32.5 -31.5t38 -10.5t46.5 -2.5h485v-331 q-211 -29 -608 -35q-178 -10 -279 53q-119 -55 -344 -55q-104 0 -174.5 8t-148.5 33.5t-127 77t-90 132.5t-60.5 204.5t-19.5 291.5zM473 739q0 -244 39 -317.5t184 -73.5q133 0 177.5 77t44.5 314q0 262 -41 338t-181 76q-96 0 -140 -27.5t-63.5 -114t-19.5 -272.5z" /> +<glyph unicode="œ" horiz-adv-x="1697" d="M57 528q0 328 112 449t398 121q190 0 297 -49q96 47 291 47q150 0 234 -12.5t149.5 -55.5t90 -123t24.5 -215q0 -160 -82 -225.5t-240 -65.5h-254q0 -37 9.5 -60.5t19.5 -35.5t39 -17t47 -5t63 1t70 1q154 0 307 22v-258q-29 -14 -65.5 -24.5t-88 -16.5t-84 -9t-99 -5 t-87.5 -2h-94h-76q-109 0 -184 41q-104 -41 -287 -41q-285 0 -397.5 121.5t-112.5 416.5zM455 528q0 -164 17 -203.5t95 -39.5q82 0 97.5 36.5t15.5 195.5v32q0 172 -16.5 213t-96.5 41q-86 0 -99 -41t-13 -234zM1077 651h119q27 0 43 18.5t16 47.5q0 61 -11 82.5t-60 21.5 q-68 0 -88.5 -28.5t-18.5 -141.5z" /> +<glyph unicode="Ÿ" horiz-adv-x="1390" d="M51 1499h432l215 -663l232 663h432l-473 -1089v-410h-397v410zM311 1767.5q0 55.5 40 94.5t95.5 39t94.5 -39t39 -94.5t-39 -95.5t-94.5 -40t-95.5 40t-40 95.5zM834 1767.5q0 55.5 39.5 94.5t95 39t94.5 -39t39 -94.5t-39 -95.5t-94.5 -40t-95 40t-39.5 95.5z" /> +<glyph unicode="ˆ" horiz-adv-x="774" d="M57 1087l205 287h268l187 -287h-228l-100 105l-102 -105h-230z" /> +<glyph unicode="˚" horiz-adv-x="530" d="M57 1294q0 88 61.5 149.5t147.5 61.5t146.5 -61.5t60.5 -149.5t-60.5 -148.5t-146.5 -60.5t-147.5 60.5t-61.5 148.5zM197 1294.5q0 -28.5 20.5 -48t49 -19.5t48 19.5t19.5 48t-19.5 49t-48 20.5t-49 -20.5t-20.5 -49z" /> +<glyph unicode="˜" horiz-adv-x="827" d="M57 1225q104 152 252 151q47 0 112.5 -35.5t104.5 -35.5q106 -6 191 81l53 -151q-98 -147 -229 -148q-45 0 -122 36t-116 36q-98 0 -190 -72z" /> +<glyph unicode=" " horiz-adv-x="963" /> +<glyph unicode=" " horiz-adv-x="1927" /> +<glyph unicode=" " horiz-adv-x="963" /> +<glyph unicode=" " horiz-adv-x="1927" /> +<glyph unicode=" " horiz-adv-x="642" /> +<glyph unicode=" " horiz-adv-x="481" /> +<glyph unicode=" " horiz-adv-x="321" /> +<glyph unicode=" " horiz-adv-x="321" /> +<glyph unicode=" " horiz-adv-x="240" /> +<glyph unicode=" " horiz-adv-x="385" /> +<glyph unicode=" " horiz-adv-x="107" /> +<glyph unicode="‐" horiz-adv-x="724" d="M41 436v316h643v-316h-643z" /> +<glyph unicode="‑" horiz-adv-x="724" d="M41 436v316h643v-316h-643z" /> +<glyph unicode="‒" horiz-adv-x="724" d="M41 436v316h643v-316h-643z" /> +<glyph unicode="–" horiz-adv-x="1050" d="M41 430v318h969v-318h-969z" /> +<glyph unicode="—" horiz-adv-x="1507" d="M41 434v318h1425v-318h-1425z" /> +<glyph unicode="‘" horiz-adv-x="512" d="M92 989v328q0 76 33 124t79 63.5t93 19.5t80 -2l33 -6v-148q-63 0 -64 -63v-31h23q51 0 51 -51v-234q0 -55 -51 -55h-228q-49 0 -49 55z" /> +<glyph unicode="’" horiz-adv-x="512" d="M92 1235v233q0 55 51 56h228q49 0 49 -56v-327q0 -76 -33 -124t-79 -63.5t-93 -19.5t-80 2l-33 6v148q63 0 64 63v31h-23q-51 0 -51 51z" /> +<glyph unicode="‚" horiz-adv-x="512" d="M92 51v234q0 55 51 55h228q49 0 49 -55v-328q0 -76 -33 -124t-79 -63.5t-93 -19.5t-80 2l-33 6v148q63 0 64 63v31h-23q-51 0 -51 51z" /> +<glyph unicode="“" horiz-adv-x="884" d="M84 985v328q0 76 33 124t79 63.5t93 19.5t80 -2l32 -7v-147q-63 0 -63 -64v-30h22q51 0 52 -51v-234q0 -55 -52 -55h-227q-49 0 -49 55zM475 985v328q0 76 33 124t80 63.5t93 19.5t79 -2l33 -7v-147q-63 0 -64 -64v-30h23q51 0 51 -51v-234q0 -55 -51 -55h-228 q-49 0 -49 55z" /> +<glyph unicode="”" horiz-adv-x="884" d="M84 1231v233q0 55 51 56h227q49 0 50 -56v-327q0 -76 -33 -124t-79 -63.5t-93 -19.5t-80 2l-33 6v147q63 0 64 64v31h-23q-51 0 -51 51zM475 1231v233q0 55 51 56h228q49 0 49 -56v-327q0 -76 -33 -124t-80 -63.5t-93 -19.5t-79 2l-33 6v147q63 0 64 64v31h-23 q-51 0 -51 51z" /> +<glyph unicode="„" horiz-adv-x="884" d="M84 51v234q0 55 51 55h227q49 0 50 -55v-328q0 -76 -33 -124t-79 -63.5t-93 -19.5t-80 2l-33 6v148q63 0 64 63v31h-23q-51 0 -51 51zM475 51v234q0 55 51 55h228q49 0 49 -55v-328q0 -76 -33 -124t-80 -63.5t-93 -19.5t-79 2l-33 6v148q63 0 64 63v31h-23q-51 0 -51 51z " /> +<glyph unicode="…" horiz-adv-x="1640" d="M49 47v240q0 51 49 51h232q51 0 51 -51v-240q0 -47 -51 -47h-232q-49 0 -49 47zM606 47v240q0 51 49 51h232q51 0 51 -51v-240q0 -47 -51 -47h-232q-49 0 -49 47zM1163 47v240q0 51 49 51h232q51 0 51 -51v-240q0 -47 -51 -47h-232q-49 0 -49 47z" /> +<glyph unicode=" " horiz-adv-x="385" /> +<glyph unicode="‹" horiz-adv-x="729" d="M57 725l422 416l199 -195l-225 -221l227 -225l-191 -201z" /> +<glyph unicode="›" horiz-adv-x="729" d="M57 500l228 225l-226 221l199 195l422 -416l-432 -426z" /> +<glyph unicode=" " horiz-adv-x="481" /> +<glyph unicode="€" horiz-adv-x="1275" d="M23 502v178l139 14v84l-139 17v170l139 18q0 61 5 113.5t34.5 135.5t81 140.5t155 100.5t244.5 43q115 0 280.5 -19.5t282.5 -62.5v-285q-272 31 -440 31q-92 0 -143.5 -9.5t-73 -40t-25.5 -56t-4 -91.5l479 -14v-176l-479 -15v-84l479 -14v-178q-31 0 -81 -1t-155.5 -4 t-175 -5.5t-67.5 -4.5q0 -53 15.5 -90t35 -55t59.5 -27.5t63.5 -10.5t72.5 -1q78 0 190.5 14.5t185.5 27.5l72 13v-278q-96 -55 -228 -73.5t-343 -18.5q-61 0 -116.5 7t-133.5 36.5t-134 80t-96 147.5t-40 228z" /> +<glyph unicode="™" horiz-adv-x="1466" d="M23 1307v192h612v-192h-189v-523h-233v523h-190zM633 784l96 715h248l67 -366l46 366h256l104 -715h-233l-41 349l-27 -349h-211l-41 344l-31 -344h-233z" /> +<glyph unicode="" horiz-adv-x="1085" d="M0 1085h1085v-1085h-1085v1085z" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Black-webfont.ttf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Black-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..849fee133ff35838e56110aa47405ffd4c7059d3 Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Black-webfont.ttf differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Black-webfont.woff b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Black-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..20d5d9b3d25d3117b12ae51b27ad96ca9b4f1c9b Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Black-webfont.woff differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Bold-Italic-webfont.eot b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Bold-Italic-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..9d770a299b489fb1923ef66fbe0800ce72efedf4 Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Bold-Italic-webfont.eot differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Bold-Italic-webfont.svg b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Bold-Italic-webfont.svg new file mode 100644 index 0000000000000000000000000000000000000000..83ab7fd7135771be28416730759753d792152e8c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Bold-Italic-webfont.svg @@ -0,0 +1,187 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Copyright c 2011 Natanael Gama exondiscoveredcom with Reserved Font Name Exo +Designer : Natanael Gama +</metadata> +<defs> +<font id="ExoBoldItalic" horiz-adv-x="1146" > +<font-face units-per-em="2048" ascent="1638" descent="-410" /> +<missing-glyph horiz-adv-x="512" /> +<glyph unicode=" " horiz-adv-x="512" /> +<glyph unicode="	" horiz-adv-x="512" /> +<glyph unicode=" " horiz-adv-x="512" /> +<glyph unicode="!" horiz-adv-x="555" d="M143 47l29 184q6 51 57 52h181q47 0 39 -52l-29 -184q-6 -47 -53 -47h-181q-49 0 -43 47zM219 406l146 1091h288l-200 -1091h-234z" /> +<glyph unicode=""" horiz-adv-x="909" d="M328 1087l20 275l23 137h276l-22 -137l-64 -275h-233zM696 1087l21 275l22 137h277l-23 -137l-63 -275h-234z" /> +<glyph unicode="#" horiz-adv-x="1476" d="M98 430l62 197h311l80 247h-313l63 197h320l143 428h197l-144 -428h252l141 428h197l-141 -428h350l-62 -197h-352l-80 -249h353l-60 -197h-364l-146 -428h-196l145 428l-254 2l-143 -430h-197l143 430h-305zM668 627l258 -2l80 249h-258z" /> +<glyph unicode="$" horiz-adv-x="1165" d="M139 45l37 219q360 -18 475 -18q184 0 205 131l12 80q6 43 5 74.5t-29.5 49t-89.5 17.5h-189q-96 0 -165.5 33t-100.5 82t-49.5 107.5t-13 111.5t7.5 92l18 129q16 106 58 178t108 110t135.5 53t161.5 17l29 177h174l-27 -179q182 -10 356 -57l-34 -223q-268 18 -457 18 q-102 4 -153.5 -25.5t-67.5 -119.5l-10 -74q-12 -78 15.5 -110.5t125.5 -32.5h190q86 0 148.5 -29t92.5 -74t47 -102t13 -113.5t-8 -107.5l-16 -101q-16 -96 -52 -165.5t-81 -109.5t-106.5 -63.5t-118 -30.5t-126.5 -5l-26 -168h-174l26 172q-192 10 -346 57z" /> +<glyph unicode="%" horiz-adv-x="1974" d="M219 999l39 250q20 133 90 191.5t227 58.5h207q274 0 230 -280l-39 -250q-23 -139 -92.5 -196.5t-225.5 -57.5h-206q-131 0 -190.5 75.5t-39.5 208.5zM422 0l1153 1499h205l-1145 -1499h-213zM426 1016q-10 -55 7.5 -78t74.5 -23h149q63 0 87 23t34 78l27 182 q10 61 -6.5 80.5t-75.5 19.5h-152q-59 0 -84.5 -20.5t-33.5 -79.5zM1202 283l39 249q20 135 90 195.5t225 60.5h209q272 0 230 -284l-39 -250q-20 -137 -91 -193.5t-229 -56.5h-206q-133 0 -190.5 73t-37.5 206zM1407 305q-8 -55 8.5 -77.5t75.5 -22.5h147q63 0 88 22.5 t33 77.5l29 182q8 61 -8.5 81t-75.5 20h-150q-59 0 -84.5 -20.5t-33.5 -80.5z" /> +<glyph unicode="&" horiz-adv-x="1376" d="M123 475.5q39 151.5 201 272.5l186 141l-82 143q-61 115 -39.5 213t94 167t162.5 81q260 35 582 -39l-33 -207h-338q-129 0 -157.5 -40t32.5 -160l277 -478l276 240l86 -119l-145 -248l-95 -90l203 -352h-313l-111 193l-153 -123q-74 -61 -183.5 -79t-222.5 27.5 t-176 151.5q-90 154 -51 305.5zM408 326q43 -63 110.5 -74.5t138.5 43.5l125 108l-159 269l-134 -99q-165 -126 -81 -247z" /> +<glyph unicode="'" horiz-adv-x="458" d="M281 1087l20 275l23 137h288l-22 -137l-64 -275h-245z" /> +<glyph unicode="(" horiz-adv-x="772" d="M194.5 342q1.5 143 26.5 293q89 534 413 933q67 83 116 126h272q-16 -20 -45 -56t-104.5 -153t-139 -239t-129 -299t-96.5 -347q-31 -197 -26 -363.5t36 -303t65.5 -231.5t62.5 -147l28 -53h-266q-6 8 -17.5 24.5t-40 73t-53.5 119t-51.5 164t-39.5 209t-11.5 250.5z" /> +<glyph unicode=")" horiz-adv-x="774" d="M-37 -498q16 18 44 53t103.5 149t139 234.5t130 301t97.5 358.5q31 188 25 352t-36 301.5t-64.5 235.5t-62.5 152l-28 55h267q6 -8 16 -25.5t40 -76t54.5 -123t50 -167t39 -209t11 -246.5t-24.5 -282q-33 -205 -97.5 -389t-132 -302t-131 -206t-103.5 -127l-40 -39h-297z " /> +<glyph unicode="*" horiz-adv-x="874" d="M260 1159l19 115l292 49l-18 -174zM328 852l94 281l164 -43l-154 -273zM541 956l118 146l199 -184l-80 -93zM571 1475l117 38l98 -249l-172 -68zM674 1169l270 162l49 -96l-229 -199z" /> +<glyph unicode="+" horiz-adv-x="989" d="M164 608l39 242h303l47 305h242l-47 -305h307l-39 -242h-307l-50 -305h-241l49 305h-303z" /> +<glyph unicode="," horiz-adv-x="532" d="M115 -180l14 98q61 0 72 53l6 29h-23q-51 0 -43 51l27 178q8 55 61 56h172q47 0 39 -56l-39 -252q-10 -63 -43.5 -103t-73.5 -51t-79 -13.5t-65 4.5z" /> +<glyph unicode="-" horiz-adv-x="722" d="M125 473l37 242h643l-37 -242h-643z" /> +<glyph unicode="." horiz-adv-x="536" d="M139 47l29 184q6 51 57 52h176q53 0 43 -52l-28 -184q-8 -47 -58 -47h-176q-49 0 -43 47z" /> +<glyph unicode="/" horiz-adv-x="933" d="M8 -147l848 1724h297l-848 -1724h-297z" /> +<glyph unicode="0" horiz-adv-x="1288" d="M164 365l121 757q61 377 413 377h336q193 0 272.5 -105.5t55.5 -258.5l-123 -770q-29 -182 -127 -273.5t-272 -91.5h-336q-180 0 -274.5 93.5t-65.5 271.5zM459 327q8 -32 32.5 -44.5t44 -15.5t54.5 -3h198q76 0 116 33t54 113l109 680q12 76 -15.5 110.5t-101.5 34.5 h-215q-143 0 -170 -145l-106 -678q-8 -53 0 -85z" /> +<glyph unicode="1" horiz-adv-x="757" d="M242 1143l28 186q63 0 168 59.5t150 110.5h282l-235 -1499h-287l193 1204q-88 -61 -299 -61z" /> +<glyph unicode="2" horiz-adv-x="1200" d="M78 0l39 252q104 63 233 153.5t280.5 208t258 237.5t121.5 204q16 106 -35 152t-184 46h-531l35 213q313 53 620 54q145 0 238.5 -70t126.5 -178.5t14 -241.5q-10 -90 -68.5 -189.5t-126 -174t-169 -161.5t-158.5 -129t-136 -98q-14 -10 -20 -14h551l-43 -264h-1046z" /> +<glyph unicode="3" horiz-adv-x="1193" d="M66 43l34 209h521q106 0 162.5 29.5t68.5 109.5l10 66q8 53 1 84.5t-36.5 46t-55.5 18.5t-83 6l-405 17l39 231l409 19q111 4 162 35.5t63 111.5l13 72q14 86 -35 113.5t-146 27.5h-546l32 207q88 29 205 43t228.5 15t238.5 -1q162 -4 252 -111.5t64 -271.5l-19 -108 q-41 -233 -203 -267q152 -55 109 -327l-14 -88q-53 -344 -443 -344h-74h-80q-16 0 -72 1t-76.5 2t-68 4t-72 7t-61 10t-65 14.5t-57.5 18.5z" /> +<glyph unicode="4" horiz-adv-x="1269" d="M102 459l699 1040h319l-590 -901h363l55 342l92 158h222l-80 -500h151l-35 -221l-157 -49l-51 -324h-289l49 324h-698z" /> +<glyph unicode="5" horiz-adv-x="1220" d="M125 41l37 225h577q150 0 170 146l21 131q25 152 -113 151h-188q-125 0 -146 -121h-272l192 926h912l-43 -264h-633l-70 -338q61 43 160 51q66 6 211 -2q158 -8 230.5 -115.5t50.5 -273.5l-33 -229q-16 -100 -58.5 -170t-105.5 -105t-128 -48t-146 -13q-203 -2 -319 6 t-306 43z" /> +<glyph unicode="6" horiz-adv-x="1245" d="M193.5 410.5q-1.5 156.5 31.5 398.5q106 668 467 696q297 27 645 -41l-34 -217h-512q-201 0 -265 -379q178 41 420 41q104 0 173 -32.5t95.5 -87t36 -121t-7.5 -131.5l-35 -234q-29 -176 -132 -240.5t-283 -64.5h-291q-90 0 -152.5 36t-108.5 128t-47.5 248.5z M483.5 373.5q26.5 -113.5 139.5 -113.5h163q129 0 150 129l22 137q14 78 -7 104.5t-95 26.5h-364q-35 -170 -8.5 -283.5z" /> +<glyph unicode="7" horiz-adv-x="1134" d="M242 1235l43 264h964l56 -131l-717 -1368h-314l656 1235h-688z" /> +<glyph unicode="8" horiz-adv-x="1275" d="M170 367l23 149q14 92 69 147.5t139 65.5q-164 74 -125 315l23 134q16 102 54 169.5t99.5 102.5t127 47t157.5 12h310q170 0 248.5 -98t50.5 -281l-17 -108q-10 -61 -57 -131t-139 -86q57 -14 87.5 -72.5t30.5 -119t-6 -109.5l-26 -176q-18 -113 -58.5 -183.5t-104 -99.5 t-115.5 -37t-136 -8h-307q-385 0 -328 367zM461 375q-10 -68 18.5 -94.5t108.5 -26.5h192q139 0 156 121l22 143q18 127 -108 127h-209q-137 0 -158 -127zM561 1012q-20 -127 119 -127h205q80 0 110.5 32.5t40.5 94.5l15 96q14 90 -12.5 119.5t-98.5 29.5h-192 q-84 0 -121 -31.5t-49 -117.5z" /> +<glyph unicode="9" horiz-adv-x="1243" d="M147 41l35 217h512q203 0 267 379q-162 -39 -422 -43q-102 0 -171 35t-94.5 91t-35 124.5t5.5 134.5l35 211q27 176 131 245.5t282 69.5h291q92 0 155.5 -39t107.5 -134t45 -256t-31 -402q-31 -195 -82.5 -331t-117 -205.5t-129 -101.5t-136.5 -38q-324 -25 -648 43z M528 979q-14 -78 6.5 -104.5t96.5 -26.5h362q37 168 9.5 282.5t-142.5 114.5h-160q-131 0 -151 -129z" /> +<glyph unicode=":" horiz-adv-x="538" d="M139 47l29 184q6 51 57 52h176q53 0 43 -52l-28 -184q-8 -47 -58 -47h-176q-49 0 -43 47zM266 852l31 184q6 51 57 51h176q51 0 41 -51l-28 -184q-8 -47 -58 -47h-176q-49 0 -43 47z" /> +<glyph unicode=";" horiz-adv-x="538" d="M115 -180l14 98q61 0 72 53l6 29h-23q-23 0 -35 14.5t-8 36.5l27 178q10 55 61 56h172q47 0 39 -56l-39 -252q-10 -63 -43.5 -103t-73.5 -51t-79 -13.5t-65 4.5zM270 854l29 184q6 51 57 52h176q53 0 43 -52l-28 -184q-8 -47 -60 -47h-176q-47 0 -41 47z" /> +<glyph unicode="<" horiz-adv-x="921" d="M170 590l43 264l815 297l-43 -266l-502 -170l447 -178l-43 -263z" /> +<glyph unicode="=" horiz-adv-x="956" d="M100 377l39 241h875l-39 -241h-875zM168 817l39 242h874l-39 -242h-874z" /> +<glyph unicode=">" horiz-adv-x="921" d="M121 274l43 269l508 190l-455 160l41 258l721 -297l-41 -264z" /> +<glyph unicode="?" horiz-adv-x="1110" d="M227 1251l35 211q332 61 586 51q209 0 307 -123.5t72 -287.5l-25 -174q-29 -211 -155.5 -288t-368.5 -56l-14 -90q-14 -90 -15 -95h-231l61 400h236q178 8 203 168l18 108q14 94 -32 135t-167 41h-510zM338 47l31 184q6 51 57 52h176q53 0 43 -52l-31 -184 q-8 -47 -57 -47h-176q-49 0 -43 47z" /> +<glyph unicode="@" horiz-adv-x="1835" d="M104 74l156 993q37 217 164 313.5t358 96.5h746q211 0 287.5 -128t44.5 -350l-101 -667q-10 -70 -31.5 -123t-63.5 -102.5t-116.5 -75t-181.5 -25.5h-190l-48 113q-106 -129 -274 -127q-188 2 -272 147.5t-39 442.5q25 162 76 273.5t119.5 165.5t134 74.5t145.5 20.5 q322 0 463 -135l-107 -743q80 0 113 32.5t51 151.5l90 600q20 141 -17.5 182t-137.5 41h-738q-70 0 -118 -20.5t-72.5 -58.5t-35.5 -68.5t-20 -75.5l-153 -969q-16 -102 19.5 -157.5t158.5 -55.5h791l-29 -174q-276 -55 -598 -55h-191q-233 0 -323.5 132t-59.5 331z M770 309.5q27 -90.5 131 -88.5q168 2 254 135l80 512q-98 20 -225 21q-92 0 -152.5 -74.5t-87.5 -271.5q-27 -143 0 -233.5z" /> +<glyph unicode="A" horiz-adv-x="1409" d="M70 0l743 1499h326l250 -1499h-293l-60 332h-485l-164 -332h-317zM666 586h342l-84 544z" /> +<glyph unicode="B" horiz-adv-x="1226" d="M125 0l237 1499h609q147 0 236 -63.5t115 -155.5q15 -53 15 -114q0 -44 -8 -93q-16 -121 -84.5 -199.5t-171.5 -95.5q87 -14 141 -118q40 -77 40 -179q0 -36 -5 -75q-31 -231 -148.5 -318.5t-363.5 -87.5h-612zM453 254h313q166 0 197 199q4 29 4 54q0 55 -21 97 q-31 60 -115 60h-315zM557 905h303q156 0 182 170q5 29 5 53q1 54 -25 80q-36 37 -109 37h-303z" /> +<glyph unicode="C" horiz-adv-x="1169" d="M184 481q-2 34 -3 69q0 114 24 238q61 379 198.5 553.5t430.5 174.5q281 0 512 -74l-35 -223q-2 0 -35 4t-76 9t-97 9t-118.5 7t-122.5 3h-49q-14 0 -47 -4t-48.5 -12t-43 -24.5t-44 -41t-39 -62.5t-37.5 -88t-32.5 -117.5t-29.5 -151.5q-22 -125 -22.5 -217.5 t22.5 -153.5q45 -121 206 -127q18 0 36 -1q185 0 429 19l-35 -225q-173 -58 -474 -58q-29 0 -58 1q-139 2 -231.5 66.5t-131.5 173t-49 253.5z" /> +<glyph unicode="D" horiz-adv-x="1341" d="M125 0l237 1499h607q125 0 213 -48t134 -124q46 -77 66 -183q18 -93 19 -185q0 -13 -1 -27q-3 -106 -22 -223q-61 -381 -207.5 -545t-418.5 -164h-627zM451 256h301q262 0 340 489q22 135 22 231q0 104 -26 160q-48 110 -191 109h-289z" /> +<glyph unicode="E" d="M162 307l141 893q48 299 359 299h16q504 -14 633 -33l-37 -237h-572q-37 0 -61.5 -9.5t-35.5 -29t-16 -34.5t-9 -42l-37 -229l579 -21l-39 -235l-583 -21l-39 -237q-6 -39 0 -62.5t27.5 -32t37 -10.5t45.5 -2h551l-39 -235q-119 -16 -624 -35h-16q-51 0 -97 11 q-54 13 -104 46t-72 99q-14 40 -13 90q0 32 5 67z" /> +<glyph unicode="F" horiz-adv-x="1148" d="M119 0l186 1176q27 176 129 252q97 72 234 71h14q502 -14 633 -33l-37 -237h-571q-37 0 -61.5 -9.5t-37 -27.5t-17.5 -34.5t-9 -43.5l-37 -233l579 -21l-34 -237l-588 -19l-96 -604h-287z" /> +<glyph unicode="G" horiz-adv-x="1255" d="M185 505v9q0 134 28 287q29 152 59.5 258t78.5 198.5t112.5 145.5t156 83t211.5 30q162 0 275 -15.5t274 -56.5l-34 -219q-276 37 -486 37q-68 0 -114 -15.5t-96 -64.5t-86 -155.5t-62 -274.5q-25 -137 -25 -236q0 -83 17 -138q38 -122 188 -122q63 0 131 25.5t102 51.5 l35 25l45 263h-211l29 182q125 49 367 49q90 0 139 -4l-135 -848h-207l-64 109q-109 -113 -325 -121h-23q-130 0 -217 64q-94 69 -128 192t-35 261z" /> +<glyph unicode="H" horiz-adv-x="1304" d="M129 0l238 1499h286l-102 -643h514l102 643h287l-237 -1499h-287l94 594h-514l-94 -594h-287z" /> +<glyph unicode="I" horiz-adv-x="524" d="M133 0l238 1499h286l-237 -1499h-287z" /> +<glyph unicode="J" horiz-adv-x="729" d="M61 47l39 223q67 -6 120 -6q20 0 38 1q66 3 108 50t58 148l164 1036h286l-184 -1161q-35 -231 -155 -301q-83 -47 -223 -47h-22q-155 4 -229 57z" /> +<glyph unicode="K" horiz-adv-x="1269" d="M125 0l237 1499h275l-98 -627h112l473 627h349l-572 -772l334 -727h-328l-268 618h-139l-99 -618h-276z" /> +<glyph unicode="L" horiz-adv-x="1083" d="M168 291l194 1208h285l-178 -1128q-6 -39 0 -62.5t27.5 -32t37 -10.5t46.5 -2h514l-41 -264h-619q-135 0 -212 70q-59 54 -59 156q0 31 5 65z" /> +<glyph unicode="M" horiz-adv-x="1693" d="M100 0l371 1499h391l90 -1024l408 1024h403l-96 -1499h-285l72 1001l-405 -1001h-326l-92 1001l-242 -1001h-289z" /> +<glyph unicode="N" horiz-adv-x="1370" d="M125 0l237 1499h287l426 -975l154 975h287l-238 -1499h-283l-430 963l-151 -963h-289z" /> +<glyph unicode="O" horiz-adv-x="1363" d="M186 511q2 114 25 257q23 147 56.5 262t71.5 192.5t91 132t101.5 84t120 46t129 20.5t145.5 4q82 0 145.5 -8t126 -29.5t105.5 -58.5t77 -97q32 -62 48 -144q13 -69 13 -162v-37q-3 -117 -26 -262q-31 -195 -81 -329t-107.5 -210t-146.5 -117t-170 -52t-205 -11 q-82 0 -144.5 7t-126 27.5t-106.5 55.5t-78 94q-34 60 -50 140q-14 71 -14 169v26zM472 490v-6q0 -87 28 -139q30 -54 84.5 -71.5t152.5 -17.5q178 0 262 95t129 388q23 139 24 233v13q0 85 -12 135q-12 54 -49.5 81.5t-79.5 35.5t-116 8q-78 0 -122 -7t-92 -33.5t-77 -81 t-56 -148t-50 -236.5q-25 -158 -26 -249z" /> +<glyph unicode="P" horiz-adv-x="1222" d="M119 0l237 1499h627q78 0 142.5 -23.5t120.5 -76.5t78 -155q11 -51 11 -112q0 -60 -10 -128q-20 -135 -61 -229.5t-92.5 -136.5t-111.5 -66q-54 -21 -104 -20h-13q-34 2 -66 2q-22 0 -43 -1q-59 2 -192.5 18.5t-141.5 20.5l-94 -592h-287zM532 807h318q74 0 120 50 t66 177q6 38 6 70q0 141 -122 141h-318z" /> +<glyph unicode="Q" horiz-adv-x="1368" d="M190 516q2 115 25 258q23 147 56.5 261t70.5 192t91 131t102.5 82.5t120 45t129 19.5t145.5 4q82 0 145.5 -8t126 -30.5t105.5 -60.5t76.5 -98.5t48.5 -144.5q12 -74 12 -173v-28q-2 -116 -25 -261q-31 -193 -81 -327t-107 -209t-147.5 -115t-170 -51t-204.5 -11 q-82 0 -144.5 7t-126 28.5t-106.5 57.5t-78 94.5t-50 140.5q-14 72 -14 170v26zM476 490v-6q0 -87 29 -139q30 -54 84 -71.5t152 -17.5q178 0 262 95t130 388q23 139 23 233q1 3 1 7q0 88 -12 141q-12 54 -51 81.5t-81 35.5t-116 8q-76 0 -120 -7t-92 -33.5t-76.5 -81 t-56 -148t-50.5 -236.5q-25 -158 -26 -249zM600 -68h164q34 -82 159 -82q68 0 164 25l-36 -231q-53 -13 -108 -13q-28 0 -56 3q-84 10 -151.5 39.5t-106.5 96.5q-31 54 -31 125q0 18 2 37z" /> +<glyph unicode="R" horiz-adv-x="1234" d="M119 0l237 1499h633q181 0 275 -121q68 -88 69 -246q0 -59 -10 -128q-14 -106 -45 -185.5t-62.5 -119.5t-75.5 -66.5t-67.5 -32.5t-56.5 -10l213 -590h-324l-176 573l-229 19l-94 -592h-287zM537 815h311q84 0 129 51.5t57 165.5q5 43 5 76q1 63 -17 92q-26 45 -100 45 h-318z" /> +<glyph unicode="S" horiz-adv-x="1185" d="M145 45l35 225q176 -22 479 -22h27q186 0 207 129l12 80q3 23 3 43q0 42 -14 64q-22 34 -103 34h-207q-102 0 -175 29.5t-105 77t-52 101.5q-15 42 -15 82q-1 10 1 22q6 50 8 89l20 156q16 111 59.5 184.5t110 109.5t136 49t163.5 13h41q321 0 518 -59l-37 -225 q-291 20 -485 20q-14 1 -27 1q-88 0 -130 -24q-48 -28 -64 -122l-10 -74q-5 -31 -6 -54q-1 -46 21 -64q32 -26 124 -25h213q100 0 170 -39t95.5 -97.5t36.5 -128.5q5 -31 5 -61q0 -37 -8 -72l-12 -135q-8 -100 -46 -171.5t-84 -109.5t-117 -58.5t-122 -24.5t-121 -4 q-355 0 -545 61z" /> +<glyph unicode="T" horiz-adv-x="1204" d="M250 1235l43 264h1108l-43 -264h-418l-195 -1235h-286l194 1235h-403z" /> +<glyph unicode="U" horiz-adv-x="1337" d="M207 452.5q0 98.5 18 219.5l133 827h287l-135 -860q-16 -95 -16 -165q0 -88 25 -135q44 -85 204 -85t231.5 89t104.5 296l137 860h289l-131 -895q-29 -182 -85.5 -304t-144.5 -189.5t-191.5 -94t-246.5 -26.5q-70 0 -127 7t-113.5 26.5t-98.5 52.5t-74.5 85t-49 122.5 t-16.5 169z" /> +<glyph unicode="V" horiz-adv-x="1402" d="M285 1499h301l151 -1122l525 1122h319l-733 -1499h-332z" /> +<glyph unicode="W" horiz-adv-x="2068" d="M285 1499h299l153 -1108l492 1108h307l-193 -414l105 -700l496 1114h303l-686 -1499h-324l-94 616l-287 -616h-340z" /> +<glyph unicode="X" horiz-adv-x="1316" d="M66 0l555 766l-322 733h313l205 -508l367 508h323l-569 -786l315 -713h-315l-197 487l-350 -487h-325z" /> +<glyph unicode="Y" horiz-adv-x="1343" d="M285 1499h309l172 -717l428 717h328l-658 -1034l-73 -465h-287l74 465z" /> +<glyph unicode="Z" horiz-adv-x="1140" d="M55 0l43 264l834 971h-682l43 264h1032l-43 -264l-813 -971h661l-43 -264h-1032z" /> +<glyph unicode="[" horiz-adv-x="684" d="M120 -199.5q-7 76.5 9 142.5l221 1374q29 180 120 260t294 80h164l-39 -242h-107q-63 0 -100 -34.5t-53 -127.5l-213 -1331q-18 -106 4 -142t92 -36h113l-39 -242h-183q-102 0 -168.5 45t-87 111t-27.5 142.5z" /> +<glyph unicode="\" horiz-adv-x="919" d="M279 1577h286l303 -1724h-286z" /> +<glyph unicode="]" horiz-adv-x="677" d="M-37 -498l39 242h107q63 0 101 35t52 127l211 1331q16 104 -7.5 141t-92.5 37h-107l39 242h168q96 0 162.5 -38t93.5 -98.5t37 -135t-4 -150.5l-209 -1391q-23 -164 -109 -253t-294 -89h-187z" /> +<glyph unicode="^" horiz-adv-x="786" d="M250 1087l264 279h213l154 -279h-189l-82 132l-135 -132h-225z" /> +<glyph unicode="_" horiz-adv-x="1378" d="M49 -2l39 242h1298l-38 -242h-1299z" /> +<glyph unicode="`" horiz-adv-x="505" d="M248 1372h244l157 -285h-186z" /> +<glyph unicode="a" horiz-adv-x="1110" d="M158 608q25 129 69.5 223.5t92 144.5t115 80.5t117.5 39t120 12.5q21 1 43 1q113 -1 241 -27q152 -32 224 -101l-144 -979h-221l-43 113q-41 -51 -137 -89t-193 -38q-174 0 -260 152q-50 89 -49 234q0 103 25 234zM432 316q25 -85 115 -85q143 0 250 103l77 524 q-76 28 -144 28q-38 0 -73 -9q-57 -12 -91 -31t-72 -90.5t-58 -200.5q-16 -83 -15 -146q-1 -54 11 -93z" /> +<glyph unicode="b" horiz-adv-x="1138" d="M94 0l254 1608h285l-90 -576q162 72 334 72q111 0 179 -48t93 -138q24 -85 24 -181q-1 -6 -1 -11q-2 -101 -23 -232q-43 -264 -141 -388q-94 -118 -283 -118h-18q-90 2 -175.5 38.5t-134.5 84.5l-67 -111h-236zM428 299q92 -66 244 -66q78 0 122 70t70 246q18 110 18 181 q0 45 -8 74q-18 75 -102 75q-143 0 -258 -41z" /> +<glyph unicode="c" horiz-adv-x="1007" d="M162 578q27 170 70.5 279.5t106 161.5t122 69.5t145.5 17.5q96 0 242.5 -17.5t249.5 -50.5l-29 -178q-195 14 -377 14q-59 0 -88 -7t-61.5 -38.5t-54 -100.5t-42.5 -189q-17 -100 -17 -165q0 -64 16 -94q32 -62 145 -61q84 0 182 5t156 9l57 5l-29 -181 q-187 -68 -463 -68q-26 0 -53 1q-168 2 -248 146q-49 89 -49 238q0 91 19 204z" /> +<glyph unicode="d" horiz-adv-x="1126" d="M150 290q-4 46 -5 97q0 92 15 197q16 98 36.5 170.5t55.5 141.5t81 113t114.5 69.5t156.5 25.5q180 0 320 -72l92 576h284l-256 -1608h-235l-35 111q-168 -123 -336 -123q-125 0 -200.5 85t-87.5 217zM446 303q24 -70 97 -70q150 0 264 66l84 539q-100 41 -248 41 q-72 0 -117.5 -67.5t-76.5 -262.5q-14 -94 -15 -158q1 -55 12 -88z" /> +<glyph unicode="e" horiz-adv-x="1079" d="M162 614q27 137 58.5 220.5t92 150t157.5 95t245 28.5q94 0 168.5 -14.5t137 -48t94.5 -97.5q27 -53 27 -125q0 -14 -1 -28q-10 -139 -80 -230.5t-162 -124.5q-93 -32 -195 -40q-43 -3 -79 -3q-53 1 -93 7q-70 10 -100 22q-7 -46 -8 -81q0 -58 22 -85q34 -43 144 -45 q24 -1 49 -1q172 0 395 36l-35 -205q-211 -63 -449 -63q-58 0 -118 4q-296 14 -296 381q0 108 26 247zM455 614q15 -2 39 -5q18 -2 58 -3q14 0 30 1q64 1 113.5 11.5t95 46t55.5 91.5q3 18 3 33q0 45 -27 65q-33 24 -115 23h-13q-55 0 -97 -17.5t-63.5 -35t-39 -62.5 t-22.5 -67t-17 -81z" /> +<glyph unicode="f" horiz-adv-x="827" d="M168 868l29 183l180 36l22 146q33 209 123 293t273 84q147 0 249 -49l-26 -172l-184 2h-8q-79 0 -103 -40q-25 -42 -47 -186l-12 -78h262l-35 -219h-264l-142 -868h-286l141 868h-172z" /> +<glyph unicode="g" horiz-adv-x="1138" d="M39 -508l31 191h460q80 0 135.5 49t69.5 145l31 199q-127 -78 -283 -78q-154 0 -236.5 77t-94.5 212q-4 43 -4 90q0 103 18 229q78 500 477 500q154 0 319.5 -19.5t247.5 -42.5l-190 -1200q-35 -215 -159 -320q-102 -85 -262 -85q-35 0 -73 4zM432 400q-1 -18 -1 -33 q0 -26 4 -41q7 -25 19.5 -52.5t40 -39t66.5 -11.5q121 0 236 45l98 619h-219q-170 -1 -223 -312q-10 -63 -13.5 -93.5t-7.5 -81.5z" /> +<glyph unicode="h" horiz-adv-x="1126" d="M94 0l254 1604h285l-101 -633q70 45 107 66.5t110.5 45t151.5 23.5q273 0 274 -271q0 -50 -10 -110l-114 -725h-287l115 729q4 24 4 44q0 104 -101 104q-139 0 -278 -95l-123 -782h-287z" /> +<glyph unicode="i" horiz-adv-x="462" d="M88 0l172 1087h287l-172 -1087h-287zM274 1247l27 183q6 51 57 51h215q40 0 40 -37q0 -6 -1 -14l-28 -183q-6 -47 -54 -47h-215q-42 0 -42 37q0 5 1 10z" /> +<glyph unicode="j" horiz-adv-x="497" d="M18 -553l261 1640h286l-174 -1095q-53 -356 -162 -545h-211zM291 1247l31 183q6 51 57 51h215q40 0 40 -37q0 -7 -1 -14l-31 -183q-6 -47 -53 -47h-215q-44 0 -44 37q0 5 1 10z" /> +<glyph unicode="k" horiz-adv-x="1085" d="M94 0l254 1602h287l-146 -910q129 45 249 158t157 237h305q-51 -182 -165.5 -309t-233.5 -188l334 -590h-320l-276 500l-78 -2l-80 -498h-287z" /> +<glyph unicode="l" horiz-adv-x="628" d="M152 387l192 1217h287l-187 -1172q-7 -66 -7 -106q1 -40 7 -56q14 -32 64 -51q111 -41 119 -41l-27 -178h-184q-274 0 -274 272q0 52 10 115z" /> +<glyph unicode="m" horiz-adv-x="1792" d="M94 0l172 1087h230l39 -116q6 4 31.5 20.5t31.5 20.5t29.5 18t33 18.5t32 14.5t35.5 14t34.5 11.5t41 9.5t43 4t48.5 2q98 0 163.5 -41t90.5 -109q227 150 418 150q165 0 229 -104q44 -71 44 -176q0 -48 -9 -103l-115 -721h-286l114 725q4 23 4 42q0 43 -18 69 q-26 36 -82 36q-166 0 -279 -86q-10 -41 -10 -67l-115 -719h-286l114 725q4 22 4 42q0 45 -20 69q-28 36 -82 36q-82 0 -138 -20.5t-132 -71.5l-123 -780h-287z" /> +<glyph unicode="n" horiz-adv-x="1126" d="M94 0l172 1087h230l39 -116q76 49 109.5 68.5t106 43t150.5 23.5q273 0 274 -271q0 -50 -10 -110l-114 -725h-287l115 729q4 24 4 44q0 104 -101 104q-139 0 -278 -95l-123 -782h-287z" /> +<glyph unicode="o" horiz-adv-x="1140" d="M158 557q27 168 68.5 272.5t113.5 166t165 84t236 22.5q271 0 365 -146q62 -96 62 -263q0 -87 -17 -193q-49 -301 -169 -405.5t-402 -104.5q-274 0 -372 135q-66 91 -65 256q0 79 15 176zM429 390v-11q0 -47 8 -78q9 -35 34 -52.5t54.5 -22.5t80.5 -5q88 0 129 16.5 t74 82t55 208.5q19 117 19 189q1 61 -13 89q-30 64 -161 64t-179.5 -61.5t-85.5 -280.5q-14 -84 -15 -138z" /> +<glyph unicode="p" horiz-adv-x="1138" d="M6 -553l260 1597q219 53 568 54q141 0 224 -81t100 -213q7 -58 7 -124q0 -83 -12 -178q-39 -266 -149.5 -393t-327.5 -127q-184 0 -285 77l-98 -612h-287zM422 250q77 -45 170 -45q29 0 59 4q86 6 134.5 75.5t80.5 268.5q14 80 14 140q0 186 -128 186h-226z" /> +<glyph unicode="q" horiz-adv-x="1132" d="M150 266q-4 47 -4 100q0 98 16 216q45 276 164.5 399t320.5 123q154 0 316.5 -19.5t242.5 -42.5l-252 -1595h-286l96 612q-127 -79 -281 -79h-4q-152 0 -233.5 75.5t-95.5 210.5zM434 295q19 -90 127 -90q119 0 234 45l100 635h-225q-55 0 -96.5 -31t-66 -88 t-35.5 -102.5t-21 -106.5q-23 -113 -23 -190q0 -41 6 -72z" /> +<glyph unicode="r" horiz-adv-x="854" d="M94 0l172 1087h242l22 -137q176 147 336 148q92 0 119 -13l-43 -276q-86 6 -156 6q-98 0 -166.5 -24.5t-130.5 -96.5l-108 -694h-287z" /> +<glyph unicode="s" horiz-adv-x="1042" d="M115 45l28 178h512q72 0 84 70l11 55q4 37 -8.5 53.5t-55.5 16.5h-244q-148 0 -220 81q-54 61 -54 162q0 34 6 72l16 98q20 135 98.5 203t231.5 68q483 0 570 -55l-29 -181h-492q-84 0 -96 -75l-8 -54q-6 -14 -2 -25.5t2 -19.5t6 -12t10 -7t13.5 -4t14.5 -1h15h15h249 q147 0 211 -87q47 -64 47 -151q0 -31 -6 -65l-18 -125q-39 -254 -311 -254q-518 0 -596 59z" /> +<glyph unicode="t" horiz-adv-x="770" d="M158 870l24 160l185 60l96 303h239l-49 -303h244l-35 -220h-244l-67 -436q-8 -71 -8 -113q0 -35 6 -51q12 -34 63 -53q111 -39 121 -39l-28 -180h-197q-143 0 -213 96q-49 67 -49 183q0 51 10 112l76 481h-174z" /> +<glyph unicode="u" horiz-adv-x="1124" d="M135 365l115 722h287l-115 -729q-5 -29 -5 -52q1 -42 17 -62q26 -32 84 -31q143 0 279 94l123 780h286l-174 -1087h-229l-37 115q-98 -68 -176 -100.5t-191 -32.5q-274 0 -274 272q0 50 10 111z" /> +<glyph unicode="v" horiz-adv-x="1093" d="M172 1087h303l117 -768l260 541q51 106 66 230h264q8 -36 8 -75q0 -112 -66 -245l-397 -770h-348z" /> +<glyph unicode="w" horiz-adv-x="1695" d="M172 1087h299l117 -763l260 534q51 106 65 229h258q10 -41 10 -84q0 -81 -36 -167l-33 -78l80 -428l268 530q51 106 66 230h260q8 -39 8 -80q0 -115 -65 -240l-414 -770h-318l-77 418l-203 -418h-338z" /> +<glyph unicode="x" horiz-adv-x="1171" d="M37 0l463 563l-291 524h340l153 -325l256 325h349l-465 -575l282 -512h-331l-154 313l-248 -313h-354z" /> +<glyph unicode="y" horiz-adv-x="1153" d="M172 1087h297l68 -761q2 -16 8 -29.5t14 -22t17.5 -13.5t20.5 -8t17.5 -4t16.5 -2l10 -1l277 616q39 94 51 228h266q9 -41 9 -84q0 -112 -58 -238l-350 -768q-61 -135 -134 -239.5t-137.5 -164t-138.5 -101.5t-126 -58.5t-112 -26.5v201q125 68 206 163t147 226 q-119 0 -194 68.5t-89 207.5z" /> +<glyph unicode="z" horiz-adv-x="968" d="M78 2l35 240l579 604h-510l37 241h879l-37 -241l-557 -602h459l-37 -242h-848z" /> +<glyph unicode="{" horiz-adv-x="655" d="M121 516l35 217q47 2 72.5 6t56 28t37.5 64l75 480q29 180 150 263t350 83l-37 -242q-86 0 -131 -49t-65 -180l-58 -371q-29 -172 -227 -197q86 -16 131 -67t33 -127l-74 -453q-20 -133 8.5 -186t116.5 -51l-37 -232q-233 0 -322.5 117t-58.5 307l76 473q8 55 -30 88 t-101 29z" /> +<glyph unicode="|" horiz-adv-x="505" d="M109 -147l272 1724h242l-273 -1724h-241z" /> +<glyph unicode="}" horiz-adv-x="651" d="M-37 -498l37 232q86 -2 130 47t63 166l71 440q25 158 225 195q-90 10 -134 59t-29 137l59 383q25 150 -3 204t-116 50l39 242q223 0 311.5 -125t55.5 -313l-58 -420q-8 -55 32 -86t102 -31l-35 -215q-150 4 -166 -100l-84 -510q-33 -193 -147.5 -274t-352.5 -81z" /> +<glyph unicode="~" horiz-adv-x="856" d="M266 1200q49 47 81 72.5t84 50.5t106 25q45 0 104 -36t100 -36q90 -2 205 82l29 -123q-143 -147 -254 -148q-47 0 -114.5 36t-106.5 36q-18 0 -38 -3t-33 -6t-32.5 -12.5t-29 -14.5t-34 -18t-34.5 -18z" /> +<glyph unicode="¢" horiz-adv-x="993" d="M145 578q29 172 73 280.5t107.5 159.5t125 67.5t153.5 14.5l33 198h178l-35 -204q178 -18 303 -62l-28 -176q-195 12 -377 12q-49 0 -71.5 -3t-54.5 -19.5t-49.5 -51t-37 -97t-35.5 -158.5q-33 -197 -1 -258.5t144 -61.5l398 19l-29 -181q-139 -61 -340 -69l-29 -183 h-176l29 185q-168 2 -249 146.5t-32 441.5z" /> +<glyph unicode="£" horiz-adv-x="1191" d="M78 0l35 221l143 43l59 379h-135l23 148l143 45l31 188q14 96 39.5 170t54.5 125t74 85t85 52.5t103.5 28.5t112.5 12t129 2l373 -33l-35 -229h-381q-143 0 -195.5 -41t-74.5 -182l-29 -178l448 -33l-24 -160h-455l-59 -379h614l-43 -264h-1036z" /> +<glyph unicode="¥" horiz-adv-x="1298" d="M244 285l26 166h283l10 73h-280l26 168h207l-250 807h312l167 -672l416 672h342l-553 -807h234l-27 -168h-307l-10 -73h305l-27 -166h-303l-41 -285h-287l41 285h-284z" /> +<glyph unicode="¨" horiz-adv-x="915" d="M266 1192q8 49 49 84t91 35q51 0 79.5 -35t20.5 -84t-48 -85t-89 -36q-51 0 -81 36t-22 85zM788.5 1192q8.5 49 49.5 84t90 35q51 0 79.5 -35t20.5 -84t-48 -85t-91 -36q-49 0 -79 36t-21.5 85z" /> +<glyph unicode="©" horiz-adv-x="1632" d="M185.5 562.5q3.5 107.5 15.5 213.5q25 158 64.5 278t111.5 225t188.5 162.5t272.5 57.5h465q98 0 171.5 -31.5t116.5 -91t69 -132.5t31 -164t0 -177t-22 -182q-55 -352 -205.5 -536.5t-382.5 -184.5h-465q-115 0 -200.5 47t-131.5 126t-74 180.5t-24.5 209zM387 754 q-39 -250 20.5 -414t225.5 -164h459q137 0 240.5 139.5t150.5 438.5q12 74 17 129t8 126.5t-8 122t-34.5 97.5t-68.5 70.5t-111 23.5h-473q-74 0 -134.5 -24.5t-118.5 -85t-102 -176t-71 -283.5zM571 766q41 244 130.5 336t234.5 92q209 0 369 -49l-23 -152q-170 25 -328 25 q-84 0 -128 -61.5t-68 -215.5q-20 -133 6.5 -198.5t112.5 -65.5q158 0 340 33l-23 -152q-152 -57 -389 -57q-133 0 -202 112.5t-32 352.5z" /> +<glyph unicode="«" horiz-adv-x="1183" d="M193 725l487 416l135 -158l-323 -276l237 -277l-172 -131zM633 725l487 416l135 -158l-323 -276l237 -277l-172 -131z" /> +<glyph unicode="­" horiz-adv-x="722" d="M125 473l37 242h643l-37 -242h-643z" /> +<glyph unicode="®" horiz-adv-x="1632" d="M185.5 562.5q3.5 107.5 15.5 213.5q25 158 64.5 278t111.5 225t188.5 162.5t272.5 57.5h465q98 0 171.5 -31.5t116.5 -91t69 -132.5t31 -164t0 -177t-22 -182q-55 -352 -205.5 -536.5t-382.5 -184.5h-465q-115 0 -200.5 47t-131.5 126t-74 180.5t-24.5 209zM387 754 q-39 -250 20.5 -414t225.5 -164h459q137 0 240.5 139.5t150.5 438.5q12 74 17 129t8 126.5t-8 122t-34.5 97.5t-68.5 70.5t-111 23.5h-473q-74 0 -134.5 -24.5t-118.5 -85t-102 -176t-71 -283.5zM551 313l139 875h375q51 0 93 -12.5t79 -42t53.5 -87t3.5 -137.5 q-18 -137 -68 -189t-134 -73l127 -334h-203l-119 326l-102 25l-56 -351h-188zM815 799h156q78 0 101.5 19.5t35.5 94.5q10 63 -15.5 81t-88.5 18h-154z" /> +<glyph unicode="´" horiz-adv-x="497" d="M203 1087l231 285h250l-295 -285h-186z" /> +<glyph unicode="¸" horiz-adv-x="497" d="M20 -365l21 123l94 31q43 16 57.5 43t24.5 92h195q-25 -160 -85.5 -224.5t-191.5 -64.5h-115z" /> +<glyph unicode="»" horiz-adv-x="1179" d="M150 459l325 284l-227 258l166 140l358 -420l-483 -422zM594 459l326 284l-228 258l164 140l361 -420l-484 -422z" /> +<glyph unicode="À" horiz-adv-x="1409" d="M70 0l743 1499h326l250 -1499h-293l-60 332h-485l-164 -332h-317zM666 586h342l-84 544zM688 1917h244l158 -285h-187z" /> +<glyph unicode="Â" horiz-adv-x="1409" d="M70 0l743 1499h326l250 -1499h-293l-60 332h-485l-164 -332h-317zM666 586h342l-84 544zM682 1632l264 277h213l154 -277h-185l-88 133l-147 -133h-211z" /> +<glyph unicode="Æ" horiz-adv-x="2080" d="M47 0l766 1178q76 115 157 185.5t173 99t161.5 34.5t176.5 2q506 -14 635 -33l-37 -237h-574q-37 0 -60.5 -8.5t-34.5 -29t-15 -33.5t-11 -42l-38 -239l579 -23l-35 -236l-590 -18l-36 -231q-6 -39 1 -62.5t28.5 -32t37 -10.5t45.5 -2h549l-37 -235q-53 -8 -207.5 -16.5 t-283.5 -13.5l-129 -5q-57 -4 -112.5 7t-107 39t-77 83t-13.5 131l23 147h-350l-264 -399h-320zM791 653h231l80 480z" /> +<glyph unicode="Ç" horiz-adv-x="1169" d="M183.5 481q-9.5 145 21.5 307q61 379 198.5 553.5t430.5 174.5q281 0 512 -74l-35 -223q-2 0 -35 4t-76 9t-97 9t-118.5 7t-122.5 3q-39 0 -55 -1t-52 -6t-53.5 -17.5t-47 -35t-48 -59t-41 -89t-40 -126t-31.5 -167.5q-47 -250 -2 -371t206 -127q197 -2 465 18l-35 -225 q-190 -63 -532 -57q-139 2 -231.5 66.5t-132 173t-49 253.5zM360 -365l21 123l94 31q43 14 58.5 43t25.5 94h193q-25 -160 -85.5 -225.5t-191.5 -65.5h-115z" /> +<glyph unicode="È" d="M162 307l141 893q49 307 375 299q504 -14 633 -33l-37 -237h-572q-37 0 -61.5 -9.5t-35.5 -29t-16 -34.5t-9 -42l-37 -229l579 -21l-39 -235l-583 -21l-39 -237q-6 -39 0 -62.5t27.5 -32t37 -10.5t45.5 -2h551l-39 -235q-119 -16 -624 -35q-59 -2 -113.5 11t-103.5 46 t-71.5 98.5t-8.5 157.5zM563 1905h244l158 -283h-187z" /> +<glyph unicode="É" d="M162 307l141 893q49 307 375 299q504 -14 633 -33l-37 -237h-572q-37 0 -61.5 -9.5t-35.5 -29t-16 -34.5t-9 -42l-37 -229l579 -21l-39 -235l-583 -21l-39 -237q-6 -39 0 -62.5t27.5 -32t37 -10.5t45.5 -2h551l-39 -235q-119 -16 -624 -35q-59 -2 -113.5 11t-103.5 46 t-71.5 98.5t-8.5 157.5zM782 1622l230 283h252l-297 -283h-185z" /> +<glyph unicode="Ê" d="M162 307l141 893q49 307 375 299q504 -14 633 -33l-37 -237h-572q-37 0 -61.5 -9.5t-35.5 -29t-16 -34.5t-9 -42l-37 -229l579 -21l-39 -235l-583 -21l-39 -237q-6 -39 0 -62.5t27.5 -32t37 -10.5t45.5 -2h551l-39 -235q-119 -16 -624 -35q-59 -2 -113.5 11t-103.5 46 t-71.5 98.5t-8.5 157.5zM563 1622l264 279h213l156 -279h-188l-84 131l-133 -131h-228z" /> +<glyph unicode="Ë" d="M162 307l141 893q49 307 375 299q504 -14 633 -33l-37 -237h-572q-37 0 -61.5 -9.5t-35.5 -29t-16 -34.5t-9 -42l-37 -229l579 -21l-39 -235l-583 -21l-39 -237q-6 -39 0 -62.5t27.5 -32t37 -10.5t45.5 -2h551l-39 -235q-119 -16 -624 -35q-59 -2 -113.5 11t-103.5 46 t-71.5 98.5t-8.5 157.5zM493.5 1726.5q8.5 49.5 49.5 84t92 34.5q49 0 78.5 -34.5t21.5 -84t-49 -85t-90 -35.5t-80 35.5t-22.5 85zM1016 1726.5q8 49.5 49 84t92 34.5q49 0 79 -34.5t21.5 -84t-49.5 -85t-90 -35.5t-79.5 35.5t-22.5 85z" /> +<glyph unicode="Î" horiz-adv-x="524" d="M133 0l238 1499h286l-237 -1499h-287zM219 1632l264 277h213l156 -277h-186l-86 133l-150 -133h-211z" /> +<glyph unicode="Ï" horiz-adv-x="524" d="M133 0l238 1499h286l-237 -1499h-287zM174 1753q8 49 49 84t90 35q51 0 80 -34t21 -85q-8 -49 -48 -85t-92 -36q-49 0 -78.5 36t-21.5 85zM696.5 1753q8.5 49 49 84t90.5 35q51 0 79.5 -34t20.5 -85q-8 -49 -48 -85t-91 -36q-49 0 -79 36t-21.5 85z" /> +<glyph unicode="Ô" horiz-adv-x="1363" d="M186 511q2 114 25 257q23 147 56.5 262t71.5 192.5t91 132t101.5 84t120 46t129 20.5t145.5 4q82 0 145.5 -8t126 -29.5t105.5 -58.5t76.5 -97.5t49 -143t12.5 -199.5t-26 -262q-31 -195 -81 -329t-107.5 -210t-146.5 -117t-170 -52t-205 -11q-82 0 -144.5 7t-126 27.5 t-106.5 55.5t-78 94.5t-50.5 140t-13.5 194.5zM472 490q-1 -91 28.5 -145t84 -71.5t152.5 -17.5q178 0 262 95t129 388q23 139 24 232.5t-11.5 148t-50 82t-79.5 35.5t-116 8q-78 0 -122 -7t-92 -33.5t-77 -81t-56 -148t-50 -236.5q-25 -158 -26 -249zM631 1632l264 277h213 l154 -277h-185l-86 133l-149 -133h-211z" /> +<glyph unicode="Ù" horiz-adv-x="1337" d="M207 452.5q0 98.5 18 219.5l133 827h287l-135 -860q-35 -215 9 -300t204 -85t231.5 89t104.5 296l137 860h289l-131 -895q-29 -182 -85.5 -304t-144.5 -189.5t-191.5 -94t-246.5 -26.5q-70 0 -127 7t-113.5 26.5t-98.5 52.5t-74.5 85t-49 122.5t-16.5 169zM633 1917h244 l157 -285h-186z" /> +<glyph unicode="Û" horiz-adv-x="1337" d="M207 452.5q0 98.5 18 219.5l133 827h287l-135 -860q-35 -215 9 -300t204 -85t231.5 89t104.5 296l137 860h289l-131 -895q-29 -182 -85.5 -304t-144.5 -189.5t-191.5 -94t-246.5 -26.5q-70 0 -127 7t-113.5 26.5t-98.5 52.5t-74.5 85t-49 122.5t-16.5 169zM627 1632 l264 277h213l153 -277h-184l-88 133l-147 -133h-211z" /> +<glyph unicode="Ü" horiz-adv-x="1337" d="M207 452.5q0 98.5 18 219.5l133 827h287l-135 -860q-35 -215 9 -300t204 -85t231.5 89t104.5 296l137 860h289l-131 -895q-29 -182 -85.5 -304t-144.5 -189.5t-191.5 -94t-246.5 -26.5q-70 0 -127 7t-113.5 26.5t-98.5 52.5t-74.5 85t-49 122.5t-16.5 169zM581.5 1753 q8.5 49 49.5 84t90 35t78.5 -34t21.5 -85q-8 -49 -48 -85t-91 -36q-49 0 -79 36t-21.5 85zM1104 1753q8 49 49 84t90 35t79 -34t21 -85q-8 -49 -48 -85t-91 -36q-49 0 -78.5 36t-21.5 85z" /> +<glyph unicode="à" horiz-adv-x="1110" d="M158 608q25 129 69.5 223.5t92 144.5t115 80.5t117.5 39t120 12.5q133 6 284.5 -25.5t223.5 -101.5l-144 -979h-221l-43 113q-41 -51 -137 -89t-193 -38q-174 0 -259.5 152.5t-24.5 467.5zM414 1516h243l158 -283h-186zM432 316q25 -85 115 -85q143 0 250 103l77 524 q-119 43 -217 19q-57 -12 -91 -31t-72 -90.5t-58 -200.5q-29 -154 -4 -239z" /> +<glyph unicode="â" horiz-adv-x="1110" d="M158 608q25 129 69.5 223.5t92 144.5t115 80.5t117.5 39t120 12.5q133 6 284.5 -25.5t223.5 -101.5l-144 -979h-221l-43 113q-41 -51 -137 -89t-193 -38q-174 0 -259.5 152.5t-24.5 467.5zM408 1233l264 276h213l153 -276h-184l-88 133l-148 -133h-210zM432 316 q25 -85 115 -85q143 0 250 103l77 524q-119 43 -217 19q-57 -12 -91 -31t-72 -90.5t-58 -200.5q-29 -154 -4 -239z" /> +<glyph unicode="æ" horiz-adv-x="1738" d="M113 612q27 133 69.5 226.5t86.5 143.5t110.5 79t112 36t118.5 11q88 6 204 -11.5t192 -52.5q109 61 297 64q203 2 328.5 -69.5t113.5 -243.5q-8 -139 -78 -230.5t-162 -124t-194.5 -40t-172 3t-100.5 22.5q-20 -123 13.5 -166t144.5 -45q178 -6 432 35l-35 -205 q-260 -78 -555 -59q-178 9 -245 141q-61 -70 -177 -105.5t-219 -35.5q-174 0 -259.5 158.5t-24.5 467.5zM383 314q23 -85 119 -85q72 -2 142.5 19.5t98.5 56.5q-10 131 25 309q27 158 70 240q-133 43 -228 23q-43 -8 -68.5 -20.5t-57 -44.5t-54.5 -96.5t-39 -162.5 q-31 -154 -8 -239zM1061 614q14 -2 38.5 -5t88 -2t114 11.5t95.5 46t55 91.5q12 72 -24.5 97.5t-129.5 23.5q-55 0 -96 -16.5t-63.5 -36t-40 -62.5t-22.5 -67t-15 -81z" /> +<glyph unicode="ç" horiz-adv-x="1009" d="M162 578q29 170 73 278.5t106 159.5t121.5 67.5t145.5 16.5q297 0 490 -68l-27 -176q-195 12 -377 12q-49 0 -71.5 -3t-54 -19.5t-49 -51t-37 -97t-36.5 -158.5q-33 -197 0 -258.5t144 -61.5l397 19l-29 -181q-35 -16 -71.5 -28.5t-77.5 -19.5t-70.5 -12t-78 -6t-70.5 -1 h-77h-71q-166 0 -246.5 145.5t-33.5 442.5zM262 -367l21 123l94 31q43 16 58.5 44t25.5 91h192q-25 -160 -84 -224.5t-190 -64.5h-117z" /> +<glyph unicode="è" horiz-adv-x="1079" d="M162 614q27 137 58.5 220.5t92 150t157.5 95t245 28.5q94 0 168.5 -14.5t137 -48t94.5 -97t26 -153.5q-10 -139 -80 -230.5t-162 -124t-194.5 -40t-172 3t-100.5 22.5q-20 -123 13.5 -166t144.5 -45q188 -6 444 35l-35 -205q-262 -78 -567 -59q-383 18 -270 628z M428 1516h244l157 -285h-186zM455 614q14 -2 38.5 -5t88 -2t113.5 11.5t95.5 46t55.5 91.5q12 72 -24 97.5t-128 23.5q-55 0 -97 -17.5t-63.5 -35t-39 -62.5t-22.5 -67t-17 -81z" /> +<glyph unicode="é" horiz-adv-x="1079" d="M162 614q27 137 58.5 220.5t92 150t157.5 95t245 28.5q94 0 168.5 -14.5t137 -48t94.5 -97t26 -153.5q-10 -139 -80 -230.5t-162 -124t-194.5 -40t-172 3t-100.5 22.5q-20 -123 13.5 -166t144.5 -45q188 -6 444 35l-35 -205q-262 -78 -567 -59q-383 18 -270 628zM455 614 q14 -2 38.5 -5t88 -2t113.5 11.5t95.5 46t55.5 91.5q12 72 -24 97.5t-128 23.5q-55 0 -97 -17.5t-63.5 -35t-39 -62.5t-22.5 -67t-17 -81zM643 1231l231 285h250l-295 -285h-186z" /> +<glyph unicode="ê" horiz-adv-x="1079" d="M162 614q27 137 58.5 220.5t92 150t157.5 95t245 28.5q94 0 168.5 -14.5t137 -48t94.5 -97t26 -153.5q-10 -139 -80 -230.5t-162 -124t-194.5 -40t-172 3t-100.5 22.5q-20 -123 13.5 -166t144.5 -45q188 -6 444 35l-35 -205q-262 -78 -567 -59q-383 18 -270 628z M422 1231l264 276h213l154 -276h-185l-88 133l-147 -133h-211zM455 614q14 -2 38.5 -5t88 -2t113.5 11.5t95.5 46t55.5 91.5q12 72 -24 97.5t-128 23.5q-55 0 -97 -17.5t-63.5 -35t-39 -62.5t-22.5 -67t-17 -81z" /> +<glyph unicode="ë" horiz-adv-x="1079" d="M162 614q27 137 58.5 220.5t92 150t157.5 95t245 28.5q94 0 168.5 -14.5t137 -48t94.5 -97t26 -153.5q-10 -139 -80 -230.5t-162 -124t-194.5 -40t-172 3t-100.5 22.5q-20 -123 13.5 -166t144.5 -45q188 -6 444 35l-35 -205q-262 -78 -567 -59q-383 18 -270 628z M375 1352q8 49 49 83.5t90 34.5q51 0 80 -33.5t20 -84.5q-8 -49 -48 -85t-89 -36q-51 0 -80.5 36t-21.5 85zM455 614q14 -2 38.5 -5t88 -2t113.5 11.5t95.5 46t55.5 91.5q12 72 -24 97.5t-128 23.5q-55 0 -97 -17.5t-63.5 -35t-39 -62.5t-22.5 -67t-17 -81zM897 1352 q8 49 49 83.5t90 34.5q51 0 80 -33.5t21 -84.5q-8 -49 -48 -85t-90 -36q-51 0 -80.5 36t-21.5 85z" /> +<glyph unicode="î" horiz-adv-x="462" d="M78 0l172 1087h287l-172 -1087h-287zM94 1225l264 276h213l154 -276h-184l-88 133l-148 -133h-211z" /> +<glyph unicode="ï" horiz-adv-x="462" d="M43 1346q10 49 50 83.5t91 34.5q49 0 79 -34.5t22 -83.5q-8 -51 -49 -86t-90.5 -35t-80 35t-22.5 86zM78 0l172 1087h287l-172 -1087h-287zM565 1346q10 49 50 83.5t92 34.5q49 0 78.5 -34.5t21.5 -83.5q-8 -51 -49 -86t-90.5 -35t-80 35t-22.5 86z" /> +<glyph unicode="ô" horiz-adv-x="1140" d="M158 557q27 168 68.5 272.5t113.5 166t165 84t236 22.5q270 0 364.5 -145.5t45.5 -456.5q-49 -301 -169 -405.5t-402 -104.5q-274 0 -371.5 135t-50.5 432zM429 390q-1 -54 8 -89t34 -52.5t54.5 -22.5t80.5 -5q88 0 129 16.5t74 82t55 208.5q35 215 5.5 278.5 t-160.5 63.5t-179.5 -61.5t-85.5 -280.5q-14 -84 -15 -138zM430 1225l264 276h213l154 -276h-184l-89 133l-147 -133h-211z" /> +<glyph unicode="ù" horiz-adv-x="1124" d="M135 365l115 722h287l-115 -729q-14 -82 11.5 -113.5t84.5 -31.5q143 0 279 94l123 780h286l-174 -1087h-229l-37 115q-98 -68 -176 -100.5t-191 -32.5q-325 0 -264 383zM440 1507h244l158 -282h-187z" /> +<glyph unicode="û" horiz-adv-x="1124" d="M135 365l115 722h287l-115 -729q-14 -82 11.5 -113.5t84.5 -31.5q143 0 279 94l123 780h286l-174 -1087h-229l-37 115q-98 -68 -176 -100.5t-191 -32.5q-325 0 -264 383zM434 1225l264 276h213l154 -276h-184l-88 133l-148 -133h-211z" /> +<glyph unicode="ü" horiz-adv-x="1124" d="M135 365l115 722h287l-115 -729q-14 -82 11.5 -113.5t84.5 -31.5q143 0 279 94l123 780h286l-174 -1087h-229l-37 115q-98 -68 -176 -100.5t-191 -32.5q-325 0 -264 383zM387 1346q8 49 49 83.5t90 34.5q51 0 81 -34.5t22 -83.5q-8 -51 -49 -86t-91 -35q-51 0 -80.5 35 t-21.5 86zM909 1346q8 49 49 83.5t91 34.5q51 0 80.5 -34.5t21.5 -83.5q-8 -51 -49 -86t-90 -35q-51 0 -81 35t-22 86z" /> +<glyph unicode="ÿ" horiz-adv-x="1153" d="M172 1087h297l68 -761q2 -16 8 -29.5t14 -22t17.5 -13.5t20.5 -8t17.5 -4t16.5 -2l10 -1l277 616q39 94 51 228h266q31 -147 -49 -322l-350 -768q-61 -135 -134 -239.5t-137.5 -164t-138.5 -101.5t-126 -58.5t-112 -26.5v201q125 68 206 163t147 226q-119 0 -194 68.5 t-89 207.5zM377 1315q10 49 50 84t91 35q49 0 79 -35t21.5 -84t-49.5 -85t-90 -36t-79.5 36t-22.5 85zM901 1315q8 49 48 84t91 35q49 0 79 -35t22 -84t-48 -85t-92 -36q-49 0 -78.5 36t-21.5 85z" /> +<glyph unicode="Œ" horiz-adv-x="2125" d="M153.5 511q1.5 114 24.5 257q23 147 56.5 262t71.5 192.5t91.5 132t101.5 84t119.5 46t129 20.5t145.5 4q274 0 381 -114q88 115 280 104q504 -14 633 -33l-37 -237h-571q-37 0 -61.5 -9.5t-37 -27.5t-17.5 -34.5t-9 -43.5l-35 -229l578 -21l-35 -235l-586 -21l-39 -237 q-6 -39 0 -62.5t27.5 -32t37 -10.5t46.5 -2h549l-37 -235q-53 -8 -209 -16.5t-285 -13.5l-129 -5q-166 -8 -239 96q-135 -98 -428 -98q-82 0 -144.5 7t-125 27.5t-105.5 55.5t-79 94.5t-50 140t-12.5 194.5zM441.5 530.5q-3.5 -81.5 7 -138t45 -85t83 -40t125.5 -11.5 q121 0 192 37t121 141.5t81 304.5q23 139 23.5 232.5t-11.5 148t-51 82t-81 35.5t-116 8q-76 0 -120 -7t-92 -33.5t-76.5 -81t-56 -148t-50.5 -236.5q-20 -127 -23.5 -208.5z" /> +<glyph unicode="œ" horiz-adv-x="1787" d="M145 559q51 326 175 434.5t409 108.5q223 0 320 -109q115 113 378 115q94 0 169 -14.5t138.5 -48t94.5 -97t24 -153.5q-8 -117 -58 -201t-123 -123t-155.5 -58.5t-161.5 -15.5t-133.5 11.5t-76.5 17.5q-20 -123 13.5 -167t144.5 -44q229 0 444 35l-33 -205 q-264 -78 -567 -59q-141 6 -205 98q-117 -94 -377 -94q-272 0 -369.5 136t-50.5 433zM417 390q-1 -54 7 -89t33.5 -52.5t55.5 -22.5t79 -5q88 0 130 17.5t73.5 82t56.5 207.5q33 215 3 278.5t-159 63.5q-131 0 -179 -61.5t-85 -280.5q-14 -84 -15 -138zM1167 614 q14 -2 39 -5t88.5 -2t113.5 11.5t96 46t57 91.5q12 72 -25 97.5t-129 23.5q-55 0 -97 -17.5t-63.5 -35t-39 -62.5t-23 -67t-17.5 -81z" /> +<glyph unicode="Ÿ" horiz-adv-x="1343" d="M246 1499h309l172 -717l428 717h328l-658 -1034l-73 -465h-287l74 465zM522 1749q8 49 49 84t91 35q51 0 80.5 -35t21.5 -84q-10 -49 -50 -85t-89 -36q-51 0 -81 36t-22 85zM1044.5 1749q8.5 49 49.5 84t90 35q51 0 80.5 -35t21.5 -84q-10 -49 -50 -85t-89 -36 q-51 0 -81 36t-21.5 85z" /> +<glyph unicode="ˆ" horiz-adv-x="649" d="M102 1087l265 277h213l155 -277h-186l-86 134l-150 -134h-211z" /> +<glyph unicode="˚" horiz-adv-x="565" d="M266 1294q8 88 74 147.5t152 59.5t142 -60.5t48 -146.5q-8 -88 -71.5 -147.5t-149.5 -59.5t-144.5 60.5t-50.5 146.5zM387 1294q-2 -37 21.5 -61.5t58.5 -24.5q37 0 64.5 24.5t31.5 61.5t-19.5 62.5t-60.5 25.5t-65.5 -25.5t-30.5 -62.5z" /> +<glyph unicode="˜" horiz-adv-x="862" d="M250 1200q152 143 270 143q49 -2 110.5 -36.5t94.5 -34.5q47 -2 110.5 24.5t94.5 53.5l28 -123q-49 -43 -77.5 -66.5t-80.5 -48.5t-98 -25q-53 2 -116.5 37t-100.5 35q-12 0 -24 -1t-21.5 -2t-21.5 -5t-19.5 -6t-20.5 -7t-18.5 -7.5t-19.5 -10.5t-18.5 -10t-20.5 -11 t-20 -12z" /> +<glyph unicode=" " horiz-adv-x="958" /> +<glyph unicode=" " horiz-adv-x="1917" /> +<glyph unicode=" " horiz-adv-x="958" /> +<glyph unicode=" " horiz-adv-x="1917" /> +<glyph unicode=" " horiz-adv-x="639" /> +<glyph unicode=" " horiz-adv-x="479" /> +<glyph unicode=" " horiz-adv-x="319" /> +<glyph unicode=" " horiz-adv-x="319" /> +<glyph unicode=" " horiz-adv-x="239" /> +<glyph unicode=" " horiz-adv-x="383" /> +<glyph unicode=" " horiz-adv-x="106" /> +<glyph unicode="‐" horiz-adv-x="722" d="M125 473l37 242h643l-37 -242h-643z" /> +<glyph unicode="‑" horiz-adv-x="722" d="M125 473l37 242h643l-37 -242h-643z" /> +<glyph unicode="‒" horiz-adv-x="722" d="M125 473l37 242h643l-37 -242h-643z" /> +<glyph unicode="–" horiz-adv-x="927" d="M121 467l41 244h968l-40 -244h-969z" /> +<glyph unicode="—" horiz-adv-x="1507" d="M125 471l39 244h1425l-39 -244h-1425z" /> +<glyph unicode="‘" horiz-adv-x="528" d="M291 1049l43 270q10 70 46 114t78 59t82 19.5t67 -0.5l28 -4l-19 -114q-66 2 -77 -66l-7 -43h25q53 0 45 -53l-29 -182q-10 -59 -65 -60h-176q-49 1 -41 60z" /> +<glyph unicode="’" horiz-adv-x="528" d="M293 995l18 115q63 -2 76 66l8 43h-24q-53 0 -45 53l30 182q10 59 62 59h176q53 0 43 -59l-43 -270q-10 -70 -46 -114t-78 -59.5t-82 -19.5t-67 0z" /> +<glyph unicode="‚" horiz-adv-x="528" d="M100 -223l17 112q66 0 78 68l6 43h-23q-53 0 -45 53l29 183q10 59 63 59h176q51 0 43 -59l-45 -271q-10 -70 -45 -114t-76.5 -59t-82.5 -19t-68 0z" /> +<glyph unicode="“" horiz-adv-x="866" d="M281 1047l41 270q10 70 45.5 114t77.5 58t82 19t68 0l28 -5l-17 -112q-66 2 -78 -66l-6 -43h23q53 0 45 -53l-29 -182q-10 -59 -63 -60h-176q-51 1 -41 60zM643 1047l41 270q12 70 47 114t77 58t83 19t67 0l27 -5l-16 -112q-66 2 -78 -66l-6 -43h22q53 0 45 -53l-28 -182 q-10 -59 -64 -60h-176q-51 1 -41 60z" /> +<glyph unicode="”" horiz-adv-x="868" d="M281 993l18 115q63 -2 76 66l8 43h-25q-51 0 -43 53l29 182q10 59 62 59h178q51 0 41 -59l-43 -270q-10 -70 -46 -114t-78 -59.5t-82 -19.5t-68 0zM643 993l19 115q63 -2 75 66l8 43h-24q-51 0 -43 53l29 182q10 59 61 59h178q51 0 41 -59l-43 -270q-10 -70 -46 -114 t-78 -59.5t-82 -19.5t-67 0z" /> +<glyph unicode="„" horiz-adv-x="866" d="M88 -223l18 114q63 -2 76 68l6 41h-22q-53 0 -45 53l29 185q10 57 63 57h176q51 0 43 -57l-45 -273q-10 -68 -45 -113t-77 -59t-83 -19t-67 -1zM451 -223l18 114q63 -2 76 68l6 41h-23q-53 0 -45 53l29 185q10 57 63 57h177q51 0 43 -57l-45 -273q-10 -68 -45 -113 t-77 -59t-83 -19t-68 -1z" /> +<glyph unicode="…" horiz-adv-x="1603" d="M272 47l31 184q6 51 57 52h177q49 0 43 -52l-31 -184q-8 -47 -57 -47h-177q-49 0 -43 47zM829 47l31 184q6 51 58 52h176q49 0 43 -52l-31 -184q-8 -47 -57 -47h-177q-49 0 -43 47zM1386 47l31 184q6 51 58 52h176q49 0 43 -52l-31 -184q-8 -47 -57 -47h-176 q-50 0 -44 47z" /> +<glyph unicode=" " horiz-adv-x="383" /> +<glyph unicode="‹" horiz-adv-x="589" d="M41 725l487 416l136 -158l-314 -264l228 -266l-172 -154z" /> +<glyph unicode="›" horiz-adv-x="733" d="M193 459l313 268l-225 264l176 150l358 -420l-491 -422z" /> +<glyph unicode=" " horiz-adv-x="479" /> +<glyph unicode="€" horiz-adv-x="1441" d="M115 512l22 139l162 17l20 139l-153 16l20 131l160 21q6 45 13.5 77.5t27 93t44 104.5t69.5 97.5t102 87t143 57.5t189 24q96 0 258 -20.5t266 -53.5l-33 -209q-297 29 -464 29q-80 0 -136.5 -15.5t-88 -36t-54.5 -63.5t-31 -77t-18 -95l477 -17l-23 -139l-481 -12 l-20 -139l475 -17l-23 -139q-31 0 -81 -2t-156.5 -5t-176 -5t-67.5 -4q-6 -59 -6 -101.5t17.5 -72t37 -48t54 -28.5t65.5 -13.5t74 -3.5q82 0 202.5 11.5t200.5 22.5l80 11l-35 -204q-209 -82 -555 -82q-59 0 -112.5 8t-124 39t-115.5 82t-67.5 149.5t-2.5 229.5z" /> +<glyph unicode="™" horiz-adv-x="1286" d="M78 1335l24 164h576l-25 -164h-194l-86 -551h-187l86 551h-194zM600 784l191 715h190l53 -412l170 412h203l-27 -715h-186l23 377l-138 -377h-166l-34 377l-91 -377h-188z" /> +<glyph unicode="" horiz-adv-x="1085" d="M0 1085h1085v-1085h-1085v1085z" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Bold-Italic-webfont.ttf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Bold-Italic-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..21044f67c922e9c092093b22e844c1c3118ed662 Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Bold-Italic-webfont.ttf differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Bold-Italic-webfont.woff b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Bold-Italic-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..3ab8810ed3d05168561a1ec9385ab1284951d9ff Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Bold-Italic-webfont.woff differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Bold-webfont.eot b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Bold-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..87a5eb981aa06fd2659b2280bcb643b383d0695b Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Bold-webfont.eot differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Bold-webfont.svg b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Bold-webfont.svg new file mode 100644 index 0000000000000000000000000000000000000000..1b88dbbf05c03b76377990fb553290e7df8e10ac --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Bold-webfont.svg @@ -0,0 +1,187 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Copyright c 2011 Natanael Gama exondiscoveredcom with Reserved Font Name Exo +Designer : Natanael Gama +</metadata> +<defs> +<font id="ExoBold" horiz-adv-x="1161" > +<font-face units-per-em="2048" ascent="1638" descent="-410" /> +<missing-glyph horiz-adv-x="512" /> +<glyph unicode=" " horiz-adv-x="512" /> +<glyph unicode="	" horiz-adv-x="512" /> +<glyph unicode=" " horiz-adv-x="512" /> +<glyph unicode="!" horiz-adv-x="559" d="M133 1497h289l-31 -1096h-233zM137 47v184q0 51 49 52h181q47 0 47 -52v-184q0 -47 -47 -47h-181q-49 0 -49 47z" /> +<glyph unicode=""" horiz-adv-x="909" d="M133 1362v137h277v-137l-21 -275h-233zM502 1362v137h276v-137l-20 -275h-234z" /> +<glyph unicode="#" horiz-adv-x="1476" d="M31 430l30 197h312l43 247h-316l33 197h318l75 428h197l-76 -428h254l74 428h196l-73 -428h350l-29 -197h-354l-41 -249h352l-26 -197h-367l-76 -428h-196l75 428l-254 2l-75 -430h-197l76 430h-305zM569 627l258 -2l41 249h-256z" /> +<glyph unicode="$" horiz-adv-x="1167" d="M86 995v129q2 377 401 387v177h175v-179q184 -10 366 -57v-223q-266 18 -459 18q-104 4 -150 -23.5t-46 -121.5v-74q0 -80 40 -111.5t124 -31.5h190q86 0 151.5 -25.5t103.5 -65.5t61.5 -95.5t31.5 -105.5t8 -106v-100q0 -412 -421 -403v-168h-175v172q-195 10 -354 57 v221q369 -18 477 -18q186 0 187 129v80q0 70 -30 105.5t-108 35.5h-186q-100 0 -174 29.5t-114 72.5t-63.5 101.5t-29.5 102.5t-6 91z" /> +<glyph unicode="%" horiz-adv-x="1970" d="M66 983v250q0 135 63.5 200.5t212.5 65.5h207q145 0 207.5 -66.5t62.5 -199.5v-250q0 -137 -62.5 -202.5t-211.5 -65.5h-207q-147 0 -209.5 65.5t-62.5 202.5zM266 1016q0 -55 20.5 -78t78.5 -23h151q63 0 82.5 23t19.5 78v182q0 59 -21.5 79.5t-76.5 20.5h-151 q-59 0 -81 -20.5t-22 -79.5v-182zM426 0l915 1499h205l-907 -1499h-213zM1153 272v250q0 137 62.5 203t211.5 66h207q145 0 209 -67t64 -202v-250q0 -135 -63.5 -200.5t-213.5 -65.5h-207q-145 0 -207.5 65.5t-62.5 200.5zM1354 307q0 -55 20.5 -77.5t77.5 -22.5h150 q66 0 85 22.5t19 77.5v182q0 59 -22.5 80t-77.5 21h-150q-59 0 -80.5 -20.5t-21.5 -80.5v-182z" /> +<glyph unicode="&" horiz-adv-x="1390" d="M58.5 480.5q29.5 154.5 166.5 275.5l142 125l-105 151q-78 113 -65.5 212t78 169t149.5 82q86 12 167 13t157.5 -9t123 -18t119.5 -27v-209h-336q-117 0 -134 -47t61 -154l346 -473l248 234l100 -121l-123 -219l-76 -90l279 -375h-336l-146 197l-133 -119 q-72 -63 -184.5 -83t-231 23.5t-192.5 149.5q-104 158 -74.5 312.5zM369 332q29 -37 67.5 -58.5t86.5 -16.5t89 44l105 100l-207 275l-107 -94q-138 -119 -34 -250z" /> +<glyph unicode="'" horiz-adv-x="458" d="M86 1362v137h289v-137l-21 -275h-245z" /> +<glyph unicode="(" horiz-adv-x="772" d="M117 668q0 518 265 958q53 87 93 135h268q-14 -20 -36.5 -59t-81 -159t-103.5 -241.5t-82 -297t-37 -336.5q0 -501 260 -967q46 -83 80 -131h-268q-14 14 -38.5 43t-86 130t-108.5 218t-86 308.5t-39 398.5z" /> +<glyph unicode=")" horiz-adv-x="772" d="M31 -430q14 18 36.5 54t81 149.5t103.5 234.5t82 301t37 359q0 462 -265 962q-76 131 -75 131h268q14 -18 38.5 -51t86 -142.5t109 -228t86 -302t38.5 -369.5q0 -207 -36.5 -396.5t-90 -311.5t-105.5 -215t-89 -134l-37 -41h-268z" /> +<glyph unicode="*" horiz-adv-x="874" d="M78 1159v115l284 49l11 -174zM195 852l49 281l170 -43l-111 -273zM340 1475l111 38l137 -249l-162 -68zM389 956l96 146l230 -184l-66 -93zM489 1169l246 162l64 -96l-197 -199z" /> +<glyph unicode="+" horiz-adv-x="989" d="M70 608v242h303v305h241v-305h308v-242h-308v-305h-241v305h-303z" /> +<glyph unicode="," horiz-adv-x="534" d="M133 51v178q0 55 51 56h172q49 0 50 -56v-252q0 -63 -27 -103t-66 -51t-77.5 -13.5t-65.5 4.5l-27 6v98q63 0 64 53v29h-23q-51 0 -51 51z" /> +<glyph unicode="-" horiz-adv-x="724" d="M41 473v242h643v-242h-643z" /> +<glyph unicode="." horiz-adv-x="538" d="M133 47v184q0 51 49 52h176q51 0 52 -52v-184q0 -47 -52 -47h-176q-49 0 -49 47z" /> +<glyph unicode="/" horiz-adv-x="933" d="M31 -147l575 1724h297l-575 -1724h-297z" /> +<glyph unicode="0" horiz-adv-x="1290" d="M109 365v757q0 180 101 278.5t275 98.5h336q193 0 278 -101.5t85 -262.5v-770q0 -178 -95.5 -271.5t-269.5 -93.5h-336q-176 0 -275 92.5t-99 272.5zM395 412q0 -147 154 -148h199q76 0 112.5 33t36.5 113v680q0 145 -139 145h-215q-84 0 -116 -44t-32 -101v-678z" /> +<glyph unicode="1" horiz-adv-x="759" d="M61 1143v186l291 170h285v-1499h-287v1214z" /> +<glyph unicode="2" horiz-adv-x="1204" d="M61 1253v213q303 53 623 54q219 0 331.5 -131.5t112.5 -331.5q0 -338 -565 -793h565v-264h-1050v252q90 61 202.5 149t247 208t223.5 241t89 205q0 102 -57.5 150t-188.5 48h-533z" /> +<glyph unicode="3" horiz-adv-x="1193" d="M47 1239v207q84 29 198.5 43t225.5 15t238 -1q170 -4 270 -100t100 -260v-107q0 -233 -155 -291q156 -68 155 -307v-86q0 -178 -99 -272t-286 -94h-74h-80q-16 0 -72 1t-76.5 2t-68 4t-73 7t-63 10t-68.5 14.5t-60 18.5l2 209h521q117 0 163 24.5t46 114.5v66 q0 86 -48.5 117.5t-148.5 35.5l-408 17v229l408 21q111 6 156 36.5t45 110.5v74q0 141 -201 141h-547z" /> +<glyph unicode="4" horiz-adv-x="1269" d="M31 459l534 1040h316l-449 -901h371v342l65 158h222v-500h151v-221l-151 -49v-324h-287v324h-703z" /> +<glyph unicode="5" horiz-adv-x="1220" d="M119 41v225h577q150 0 150 146v137q0 31 -4 52.5t-17.5 45t-42 35.5t-73.5 12h-193q-125 0 -125 -121h-270l45 926h911v-264h-635l-16 -338q53 41 141 49q61 8 226 0q172 -8 256 -107.5t84 -265.5v-211q0 -100 -35 -174.5t-93.5 -115.5t-122 -60.5t-130.5 -19.5 q-209 0 -324.5 8t-308.5 41z" /> +<glyph unicode="6" horiz-adv-x="1245" d="M102 786q0 195 29 338.5t81 221t111.5 115.5t131.5 44q283 25 651 -41v-217h-512q-205 0 -205 -379q170 41 414 41q203 0 277.5 -91t74.5 -257v-225q0 -338 -362 -338h-293q-96 0 -164 34t-123 117.5t-83 242t-28 394.5zM389 657q0 -90 6 -151.5t25.5 -121.5t59.5 -91 t104 -31h155q70 0 100.5 25.5t30.5 101.5v137q0 76 -29.5 103.5t-95.5 27.5h-356z" /> +<glyph unicode="7" horiz-adv-x="1134" d="M47 1235v264h965l78 -131l-502 -1368h-314l461 1235h-688z" /> +<glyph unicode="8" horiz-adv-x="1277" d="M117 344v150q0 92 43 153.5t119 77.5q-68 29 -106 80t-47 100t-9 117v133q0 354 383 354h309q178 0 266 -84t88 -272v-109q0 -25 -4 -56.5t-18.5 -71t-48 -70.5t-82.5 -39q45 -8 77.5 -41t48 -77t21.5 -84t6 -79v-176q0 -109 -30.5 -182.5t-86 -107t-111.5 -47 t-128 -13.5h-307q-106 0 -182 26.5t-114 61.5t-59.5 89t-24.5 88t-3 79zM403 375q0 -63 34 -92t114 -29h190q135 0 136 121v143q0 127 -129 127h-207q-137 0 -138 -127v-143zM403 1012q0 -127 138 -127h204q80 0 106 32.5t26 94.5v96q0 86 -33 117.5t-101 31.5h-192 q-80 0 -114 -27.5t-34 -121.5v-96z" /> +<glyph unicode="9" horiz-adv-x="1245" d="M94 944v223q0 338 363 338h293q96 0 163.5 -33.5t123 -117.5t83 -243t27.5 -394q0 -195 -30 -337t-82 -221t-110.5 -117t-129.5 -44q-322 -29 -652 41v217h512q66 0 110 35t62.5 98.5t25.5 117.5t7 130q-166 -43 -414 -43q-201 0 -276.5 92t-75.5 258zM379 977 q0 -76 29.5 -103.5t95.5 -27.5h356q0 90 -6 151.5t-25.5 122t-59.5 91t-103 30.5h-158q-70 0 -99.5 -25.5t-29.5 -101.5v-137z" /> +<glyph unicode=":" horiz-adv-x="538" d="M133 47v184q0 51 49 52h176q51 0 52 -52v-184q0 -47 -52 -47h-176q-49 0 -49 47zM133 852v184q0 51 49 51h176q51 0 52 -51v-184q0 -47 -52 -47h-176q-49 0 -49 47z" /> +<glyph unicode=";" horiz-adv-x="540" d="M133 51v178q0 55 51 56h172q49 0 50 -56v-252q0 -63 -27 -103t-66 -51t-77.5 -13.5t-65.5 4.5l-27 6v98q63 0 64 53v29h-23q-23 0 -37 14t-14 37zM135 854v184q0 51 49 52h176q51 0 52 -52v-184q0 -47 -52 -47h-176q-49 0 -49 47z" /> +<glyph unicode="<" horiz-adv-x="921" d="M78 590v264l768 297v-266l-463 -162l463 -180v-269z" /> +<glyph unicode="=" horiz-adv-x="956" d="M41 377v241h874v-241h-874zM41 817v242h874v-242h-874z" /> +<glyph unicode=">" horiz-adv-x="921" d="M78 274v269l463 180l-463 162v266l768 -297v-264z" /> +<glyph unicode="?" horiz-adv-x="1110" d="M31 1247v215q322 61 577 51q219 0 331 -117.5t112 -283.5v-149q0 -418 -465 -379v-185h-232v400h234q178 8 178 168v108q0 90 -54.5 131t-170.5 41h-510zM332 47v184q0 51 49 52h178q49 0 49 -52v-184q0 -47 -49 -47h-178q-49 0 -49 47z" /> +<glyph unicode="@" horiz-adv-x="1777" d="M102 23v622q0 57 10.5 109.5t38 108t72.5 95t123 65.5t178 26h394q74 0 130 -11.5t112.5 -43t86 -98.5t29.5 -167v-729h-184l-41 119l-16 -15q-15 -14 -43.5 -34.5t-65.5 -40t-88.5 -33.5t-104.5 -14q-123 -2 -192.5 78.5t-69.5 193.5v86q0 137 79 211t220 74h277 q2 86 0 88q0 63 -30 84.5t-97 21.5h-396q-90 0 -141 -37t-51 -147v-590q0 -125 57 -173t135 -48h682q119 0 165 54t46 167v936q0 115 -57 177.5t-154 62.5h-827v174q279 57 622 55h205q190 -2 315.5 -115.5t125.5 -353.5v-936q0 -455 -430 -455h-693q-188 0 -305 106 t-117 327zM713 291q0 -33 26.5 -56.5t69.5 -21.5q141 -4 238 86v164l-244 -23q-90 -8 -90 -94v-55z" /> +<glyph unicode="A" horiz-adv-x="1417" d="M70 0l505 1499h326l488 -1499h-306l-106 332h-492l-108 -332h-307zM561 586h348l-168 536z" /> +<glyph unicode="B" horiz-adv-x="1236" d="M125 0v1499h618q217 0 319.5 -111.5t102.5 -289.5q0 -115 -51 -208t-153 -112q98 -18 163.5 -109t65.5 -229q0 -440 -442 -440h-623zM412 254h325q166 0 166 199q0 92 -41 151.5t-125 59.5h-325v-410zM412 905h313q158 0 158 170t-158 170h-313v-340z" /> +<glyph unicode="C" horiz-adv-x="1169" d="M86 754q0 190 22.5 323t79 235.5t157.5 153t251 50.5q291 0 522 -68v-225l-15 2q-15 2 -41 4t-59.5 5t-75.5 6t-85 5t-90 4t-88 2q-88 0 -136.5 -14t-87.5 -65.5t-53 -151.5t-14 -270q0 -266 60.5 -382t230.5 -116q96 0 209.5 4t179.5 8l65 4v-223q-182 -58 -467 -58 q-27 0 -55 1q-272 2 -391 196.5t-119 569.5z" /> +<glyph unicode="D" horiz-adv-x="1355" d="M125 0v1499h637q520 0 520 -756q0 -346 -128 -544.5t-392 -198.5h-637zM412 256h327q256 0 256 489q0 285 -63.5 392.5t-192.5 107.5h-327v-989z" /> +<glyph unicode="E" d="M119 295v893q0 92 29.5 157.5t81 97.5t103.5 44t111 12q528 -14 660 -33v-237h-592q-49 0 -74.5 -19.5t-28.5 -39t-3 -56.5v-233l606 -21v-237l-606 -19v-233q0 -39 10 -62.5t32.5 -32t38 -10.5t45.5 -2h572v-235q-117 -16 -639 -35h-21q-46 0 -90 7q-52 9 -110 37 t-91.5 93.5t-33.5 163.5z" /> +<glyph unicode="F" d="M119 0v1184q0 168 95 244q90 72 217 71h13q528 -14 660 -33v-237h-592q-49 0 -74.5 -19.5t-28.5 -39t-3 -56.5v-233l606 -21v-237l-606 -19v-604h-287z" /> +<glyph unicode="G" horiz-adv-x="1257" d="M86 757.5q0 141.5 11.5 248t44 206t86 164t141.5 102.5t206 38q309 0 576 -66v-223q-2 0 -34 4t-84 9t-113.5 9t-136 8.5t-140.5 4.5q-164 0 -217 -109t-53 -399q0 -295 50 -394.5t206 -101.5q63 0 127.5 23.5t97.5 47.5l33 23v269h-209v182q117 49 356 49q90 0 140 -4 v-848h-205l-78 100q-111 -102 -318 -110h-23q-108 0 -190 34q-90 39 -142 105t-83 171.5t-40 210.5t-9 246.5z" /> +<glyph unicode="H" horiz-adv-x="1302" d="M125 0v1499h287v-643h514v643h286v-1499h-286v594h-514v-594h-287z" /> +<glyph unicode="I" horiz-adv-x="501" d="M125 0v1499h287v-1499h-287z" /> +<glyph unicode="J" horiz-adv-x="729" d="M55 47l4 223q68 -6 121 -6q20 0 38 1q65 3 99.5 49t34.5 149v1036h287v-1161q0 -231 -109 -301q-76 -47 -215 -47h-23q-155 4 -237 57z" /> +<glyph unicode="K" horiz-adv-x="1286" d="M125 0v1499h274v-627h121l381 627h334l-459 -751l459 -748h-334l-381 618h-119v-618h-276z" /> +<glyph unicode="L" horiz-adv-x="1103" d="M125 291v1208h287v-1128q0 -39 10 -62.5t32.5 -32t38 -10.5t46.5 -2h514v-264h-617q-311 0 -311 291z" /> +<glyph unicode="M" horiz-adv-x="1734" d="M86 0l131 1499h399l250 -1024l248 1024h397l140 -1499h-283l-98 1001l-242 -1001h-319l-252 1001l-88 -1001h-283z" /> +<glyph unicode="N" horiz-adv-x="1388" d="M125 0v1499h291l594 -969v969h286v-1499h-286l-596 958v-958h-289z" /> +<glyph unicode="O" horiz-adv-x="1374" d="M102 739q0 205 32 349.5t80 225.5t132 126t163 57t196 12q100 0 168.5 -8t143.5 -34.5t123 -79t89 -136.5t59.5 -212t18.5 -300q0 -195 -29 -332t-76 -217.5t-128 -125t-164 -58.5t-205 -14q-102 0 -173 8t-146 33.5t-122 77t-87 132.5t-57.5 204.5t-17.5 291.5zM389 739 q0 -209 26.5 -309t90 -137t199.5 -37q127 0 191.5 37t94 140.5t29.5 305.5q0 174 -15.5 275.5t-58.5 153t-94 64.5t-147 13q-76 0 -119 -7t-87 -33.5t-63.5 -81t-33 -148t-13.5 -236.5z" /> +<glyph unicode="P" horiz-adv-x="1232" d="M104 0v1499h646q82 0 146.5 -16.5t130 -62.5t102 -143t36.5 -241q0 -131 -27.5 -225t-67.5 -144.5t-100.5 -78t-109.5 -32.5q-35 -4 -76 -4q-16 0 -34 1q-57 2 -204 19.5t-155 21.5v-594h-287zM391 807h336q74 0 112 50t38 177q-2 211 -150 211h-336v-438z" /> +<glyph unicode="Q" horiz-adv-x="1374" d="M102 739q0 205 31 349.5t79 225.5t131 126t162 57t197 12q84 0 145.5 -6t129 -24.5t114 -51t89.5 -90t69.5 -138.5t42 -196.5t15.5 -263.5q0 -162 -18.5 -284.5t-57.5 -203.5t-87 -133t-122 -79t-146.5 -37t-173.5 -10q-76 0 -132 4t-116.5 16.5t-103.5 36t-86 61 t-69.5 94t-49 131.5t-33 176t-10.5 228zM389 739q0 -211 26.5 -310t90 -136t196.5 -37q127 0 191.5 37t95.5 140.5t31 305.5q0 174 -15.5 275.5t-59.5 153t-95 64.5t-148 13q-76 0 -118.5 -7t-85.5 -33.5t-63.5 -81t-33 -148t-12.5 -236.5zM614 -68h162q49 -82 174 -82 q68 0 160 25v-231q-52 -13 -107 -13q-28 0 -56 3q-85 10 -156.5 39.5t-121 97t-55.5 161.5z" /> +<glyph unicode="R" horiz-adv-x="1243" d="M104 0v1499h656q193 0 301 -106.5t108 -360.5q0 -106 -18 -186t-39.5 -122t-61.5 -74t-61.5 -40t-58.5 -20l284 -590h-323l-248 567l-252 29v-596h-287zM393 821h340q80 0 114 41t34 170q0 121 -37 167t-111 46h-340v-424z" /> +<glyph unicode="S" horiz-adv-x="1208" d="M102 995v129q0 209 107.5 296t298.5 91q30 1 59 0q314 0 520 -59v-225q-219 20 -501 20h-16q-97 1 -137 -23q-44 -26 -44 -122v-74q0 -86 35 -114.5t125 -28.5h237q104 0 178 -37t110 -100.5t51.5 -127t15.5 -133.5v-100q0 -121 -35 -205t-97.5 -125t-130 -57t-151.5 -16 q-367 0 -580 61v225q216 -22 498 -22h25q184 0 184 129v80q0 72 -28.5 106.5t-106.5 34.5h-230q-387 0 -387 397z" /> +<glyph unicode="T" horiz-adv-x="1214" d="M63 1235v264h1108v-264h-415v-1235h-287v1235h-406z" /> +<glyph unicode="U" horiz-adv-x="1359" d="M125 655v844h287v-844q0 -170 29.5 -257t88 -115.5t172.5 -28.5q152 0 215.5 82t63.5 319v844h289v-844q0 -109 -12.5 -197.5t-30 -153t-50 -116t-61.5 -83t-76 -55t-79.5 -35t-87 -17.5t-85 -7t-86.5 -1h-19q-110 0 -166 4t-144 38t-133 100.5t-80 198t-35 324.5z" /> +<glyph unicode="V" horiz-adv-x="1402" d="M70 1499h305l334 -1122l352 1122h305l-494 -1499h-331z" /> +<glyph unicode="W" horiz-adv-x="2031" d="M70 1499h305l332 -1112l270 1112h307l-104 -387l237 -731l275 1118h303l-412 -1499h-332l-202 614l-177 -614h-331z" /> +<glyph unicode="X" horiz-adv-x="1312" d="M70 1499h317l283 -512l288 512h318l-451 -747l441 -752h-318l-278 504l-277 -504h-317l440 752z" /> +<glyph unicode="Y" horiz-adv-x="1343" d="M70 1499h311l293 -719l321 719h312l-494 -1034v-465h-287v465z" /> +<glyph unicode="Z" horiz-adv-x="1138" d="M55 0v264l686 971h-686v264h1032v-264l-653 -971h653v-264h-1032z" /> +<glyph unicode="[" horiz-adv-x="681" d="M133 -20v1359q0 385 346 385h174v-241h-106q-127 0 -127 -178v-1315q0 -178 127 -178h106v-242h-174q-346 0 -346 410z" /> +<glyph unicode="\" horiz-adv-x="933" d="M31 1577h297l575 -1724h-297z" /> +<glyph unicode="]" horiz-adv-x="681" d="M31 -188h108q127 0 127 178v1315q0 178 -127 178h-108v241h176q96 0 165.5 -30.5t107.5 -86t55.5 -122t17.5 -146.5v-1359q0 -410 -346 -410h-176v242z" /> +<glyph unicode="^" horiz-adv-x="786" d="M78 1087l221 277h213l197 -277h-191l-119 123l-129 -123h-192z" /> +<glyph unicode="_" horiz-adv-x="1380" d="M41 -2v242h1298v-242h-1298z" /> +<glyph unicode="`" horiz-adv-x="497" d="M31 1372h252l184 -285h-186z" /> +<glyph unicode="a" horiz-adv-x="1062" d="M61 276v103q0 131 78 215t242 84q160 -1 239.5 -1t79.5 1q1 34 1 51.5t-1 18.5q0 82 -34.5 107.5t-110.5 25.5q-133 0 -457 -23v178q186 72 496 72q188 0 290.5 -79t102.5 -271v-758h-227l-60 119q-8 -14 -52 -45q-44 -32 -124 -60q-75 -27 -145 -26h-10 q-147 4 -227.5 88.5t-80.5 199.5zM348 317q0 -61 26.5 -80.5t76.5 -19.5q117 0 249 86v199l-264 -21q-88 -6 -88 -110v-54z" /> +<glyph unicode="b" horiz-adv-x="1138" d="M94 0v1608h285v-576q150 72 330 72q209 0 281.5 -140.5t72.5 -424.5q0 -264 -82 -407.5t-272 -143.5q-88 0 -178.5 36.5t-149.5 86.5l-51 -111h-236zM381 299q104 -66 254 -66q72 0 106.5 71t34.5 245q0 197 -33.5 263.5t-107.5 66.5q-150 0 -254 -41v-539z" /> +<glyph unicode="c" horiz-adv-x="1011" d="M78 545q0 215 48 341t123 169t187 43q303 0 500 -66v-176q-195 12 -377 12q-59 0 -88 -6t-57.5 -36.5t-38.5 -99.5t-10 -187q0 -201 38.5 -259.5t155.5 -58.5l391 19v-181q-45 -23 -93 -38t-112.5 -21t-94 -8t-114.5 -2h-100q-82 0 -142.5 24.5t-111.5 84t-77.5 171 t-26.5 275.5z" /> +<glyph unicode="d" horiz-adv-x="1138" d="M78 539q0 141 13 236t50 174t109 117t182 38q176 0 330 -72v576h287v-1608h-238l-49 111q-156 -123 -330 -123q-190 0 -272 141.5t-82 409.5zM365 549q0 -174 34.5 -245t108.5 -71q150 0 254 66v539q-109 41 -254 41q-76 0 -109.5 -66.5t-33.5 -263.5z" /> +<glyph unicode="e" horiz-adv-x="1075" d="M78 549q0 176 24.5 282.5t86 166t144.5 79t220 19.5q133 0 208 -11.5t138.5 -51.5t89 -119.5t25.5 -213.5q0 -274 -303 -274h-346q0 -135 49 -171t180 -36q258 0 399 23v-195q-154 -57 -557 -57q-203 0 -280.5 127t-77.5 432zM365 633h272q90 0 90 82q0 104 -27.5 133 t-130.5 29q-68 0 -98.5 -5.5t-60 -29t-37.5 -72.5t-8 -137z" /> +<glyph unicode="f" horiz-adv-x="825" d="M31 868v185l170 34v203q0 152 73.5 236t247.5 84q154 0 275 -49v-170l-197 2q-43 0 -66.5 -8.5t-32.5 -36t-11.5 -49t-2.5 -76.5v-136h248v-219h-248v-868h-286v868h-170z" /> +<glyph unicode="g" horiz-adv-x="1146" d="M72 209q0 154 127 194q-119 76 -119 302q0 387 377 387h661v-170l-121 -37q2 -2 9.5 -21.5t9.5 -27t8 -28t8 -35.5t4 -43t2 -58q0 -66 -16 -125.5t-54 -116.5t-116 -91t-186 -34h-252q-82 0 -82 -47q0 -55 82 -55h334q152 0 236.5 -81t84.5 -241v-119q0 -135 -78 -225 t-262 -90h-307q-152 0 -246 80t-94 235v138l96 100q-106 62 -106 209zM367 705q0 -168 131 -168h114q139 0 140 168q-4 86 -35 120.5t-107 34.5h-108q-80 0 -107.5 -40.5t-27.5 -114.5zM371 -23v-180q0 -74 31.5 -97.5t97.5 -23.5h168q72 0 94 29t22 86v80q0 98 -106 100 h-221z" /> +<glyph unicode="h" horiz-adv-x="1126" d="M94 0v1604h285v-633q63 47 96 67.5t102.5 44t147.5 23.5q326 0 326 -381v-725h-287v729q0 147 -121 148q-82 0 -138 -21.5t-124 -73.5v-782h-287z" /> +<glyph unicode="i" horiz-adv-x="464" d="M78 1249v181q0 53 49 53h215q45 0 45 -53v-181q0 -47 -45 -47h-215q-49 0 -49 47zM88 0v1087h287v-1087h-287z" /> +<glyph unicode="j" horiz-adv-x="495" d="M94 1249v181q0 53 49 53h215q47 0 48 -53v-181q0 -47 -48 -47h-215q-49 0 -49 47zM106 -553v1640h287v-1095v-35q0 -342 -76 -510h-211z" /> +<glyph unicode="k" horiz-adv-x="1140" d="M94 0v1602h287v-879h59l308 364h364l-407 -473l407 -614h-342l-330 504h-59v-504h-287z" /> +<glyph unicode="l" horiz-adv-x="641" d="M94 387v1217h287v-1172q0 -109 22.5 -152.5t71.5 -60.5q123 -43 137 -43v-176h-237q-139 0 -210 89t-71 298z" /> +<glyph unicode="m" horiz-adv-x="1792" d="M94 0v1087h230l57 -116q70 51 98.5 69.5t96 41t143.5 22.5q211 0 282 -141q190 141 392 141q324 0 323 -383v-721h-286v725q0 147 -121 147q-164 0 -267 -86q0 -4 1 -30.5t1 -32.5v-723h-286v725q0 147 -121 147q-80 0 -134 -20.5t-122 -71.5v-780h-287z" /> +<glyph unicode="n" horiz-adv-x="1126" d="M94 0v1087h230l57 -116q66 47 97.5 67.5t100 44t146.5 23.5q326 0 326 -381v-725h-287v729q0 147 -121 148q-82 0 -138 -21.5t-124 -73.5v-782h-287z" /> +<glyph unicode="o" horiz-adv-x="1146" d="M78 528q0 328 108.5 449t386.5 121q281 0 388.5 -123t107.5 -447q0 -305 -105.5 -421.5t-390.5 -116.5q-279 0 -387 121.5t-108 416.5zM365 528q0 -139 22.5 -205.5t62 -84t123.5 -17.5q90 0 129 17.5t59.5 82t20.5 207.5q0 119 -7 182.5t-33.5 101.5t-62.5 47t-106 9 q-92 0 -132 -22.5t-58 -92t-18 -225.5z" /> +<glyph unicode="p" horiz-adv-x="1138" d="M94 -553v1640h236l49 -108q59 47 150.5 84t179.5 37q354 0 354 -551q0 -131 -13.5 -224.5t-50 -175t-109.5 -123.5t-181 -42q-178 0 -330 69v-606h-285zM379 250q109 -41 256 -41q74 0 107.5 66.5t33.5 261.5q0 176 -34.5 246.5t-106.5 70.5q-152 0 -256 -66v-538z" /> +<glyph unicode="q" horiz-adv-x="1136" d="M78 549q0 551 397 551q154 0 320 -19.5t249 -42.5v-1591h-286v612q-116 -79 -279 -79h-4q-223 0 -310 140t-87 429zM365 557q0 -78 1 -118t10 -93t25.5 -78.5t49 -44t79.5 -18.5q117 0 228 45v631h-226q-57 0 -94 -30t-51 -88t-18 -100.5t-4 -105.5z" /> +<glyph unicode="r" horiz-adv-x="854" d="M94 0v1087h242l45 -137q147 147 311 148q92 0 121 -13v-276q-86 6 -158 6q-98 0 -161.5 -24.5t-112.5 -96.5v-694h-287z" /> +<glyph unicode="s" horiz-adv-x="1040" d="M61 711v94q0 293 283 293q487 0 582 -56v-180h-494q-51 0 -67.5 -17.5t-16.5 -58.5v-49q0 -33 12.5 -48t27.5 -18t44 -3h258q147 0 218 -77t71 -206v-111q0 -154 -76 -219t-190 -65q-514 0 -607 59v178h515q72 0 71 70v51q0 37 -14 53.5t-57 16.5h-254q-306 0 -306 293z " /> +<glyph unicode="t" horiz-adv-x="780" d="M31 870v160l176 60l47 303h240v-303h243v-220h-243v-436q0 -111 22.5 -153.5t69.5 -61.5q123 -43 137 -43v-176h-250q-266 0 -266 389v481h-176z" /> +<glyph unicode="u" horiz-adv-x="1126" d="M78 365v722h287v-729q0 -145 120 -145q82 0 139.5 21.5t123.5 72.5v780h286v-1087h-231l-55 115q-12 -8 -73 -45t-83.5 -48.5t-76.5 -25.5t-114 -14q-323 0 -323 383z" /> +<glyph unicode="v" horiz-adv-x="1155" d="M31 1087h307l237 -751l244 751h307l-395 -1087h-321z" /> +<glyph unicode="w" horiz-adv-x="1691" d="M31 1087h307l217 -751l195 751h286l-75 -292l180 -459l215 751h307l-352 -1087h-320l-164 393l-122 -393h-326z" /> +<glyph unicode="x" horiz-adv-x="1171" d="M37 0l377 545l-377 542h348l199 -325l204 325h347l-381 -548l364 -539h-330l-202 322l-201 -322h-348z" /> +<glyph unicode="y" horiz-adv-x="1183" d="M33 1087h301l188 -761q6 -20 15.5 -36t18.5 -23t22.5 -12t21.5 -6t20 -2l11 -1l217 841h299l-377 -1431l-149 -209h-205l153 553q-250 0 -323 276z" /> +<glyph unicode="z" horiz-adv-x="970" d="M47 846v241h879v-241l-467 -602h467v-242h-848v240l487 604h-518z" /> +<glyph unicode="{" horiz-adv-x="657" d="M31 575v216q43 4 70.5 10t54 31.5t26.5 66.5v444q0 174 112 277.5t333 103.5v-241q-84 0 -121 -48.5t-37 -181.5v-370q0 -174 -197 -199q90 -16 142.5 -66.5t52.5 -125.5v-492q0 -102 37 -152.5t123 -48.5v-229q-240 0 -343.5 91t-103.5 261v545q0 55 -43 83.5t-106 24.5 z" /> +<glyph unicode="|" horiz-adv-x="505" d="M133 -147v1724h242v-1724h-242z" /> +<glyph unicode="}" horiz-adv-x="657" d="M31 -201q86 -2 124 48.5t38 152.5v492q0 76 52 126t142 66q-197 25 -197 199v370q0 133 -37.5 181.5t-121.5 48.5v241q223 0 334.5 -103t111.5 -278v-444q0 -59 41 -80.5t109 -27.5v-216q-63 4 -105.5 -24.5t-42.5 -83.5v-545q0 -168 -104.5 -260t-343.5 -92v229z" /> +<glyph unicode="~" horiz-adv-x="858" d="M78 1200q43 47 69.5 72.5t75.5 50.5t101 25q45 0 110.5 -36t106.5 -36q90 -2 190 82l49 -123q-123 -147 -231 -148q-47 0 -120 36t-112 36q-18 0 -37.5 -3t-31.5 -6t-31.5 -12.5t-27 -13.5t-31 -18t-31.5 -19z" /> +<glyph unicode="¢" horiz-adv-x="997" d="M61 545q0 319 96.5 439t278.5 116v198h176v-204q182 -18 310 -62v-176q-197 12 -379 12q-47 0 -72 -3t-52.5 -20.5t-40.5 -51t-21.5 -96t-8.5 -158.5q0 -139 19.5 -208t57.5 -90.5t118 -21.5q84 0 182 5t155 9l56 5v-181q-127 -63 -328 -67v-185h-176v183 q-86 0 -149.5 23.5t-115.5 83t-79 172t-27 278.5z" /> +<glyph unicode="£" horiz-adv-x="1191" d="M78 0v221l135 43v379h-135v148l135 45v153q0 166 35 270.5t109.5 155.5t159.5 67.5t220 16.5q51 0 146.5 -8t164.5 -16l68 -9v-229h-387q-76 0 -111.5 -5t-67.5 -26.5t-41 -66.5t-9 -125v-178l454 -33v-160h-454v-379h614v-264h-1036z" /> +<glyph unicode="¥" horiz-adv-x="1298" d="M31 1499h313l291 -676l317 676h316l-420 -807h227v-168h-301v-73h301v-166h-301v-285h-287v285h-286v166h286v73h-286v168h217z" /> +<glyph unicode="¨" horiz-adv-x="917" d="M78 1192q0 49 36 84t85 35q51 0 84.5 -35t33.5 -84t-34.5 -85t-83.5 -36t-85 36t-36 85zM600 1192q0 49 36 84t85 35q51 0 85 -35t34 -84t-35 -85t-84 -36t-85 36t-36 85z" /> +<glyph unicode="©" horiz-adv-x="1638" d="M86 754q0 121 12.5 221t46 200.5t90 169t151.5 111.5t220 43h475q145 0 244.5 -63.5t147 -179t64.5 -233.5t17 -269q0 -356 -121.5 -555t-351.5 -199h-475q-139 0 -243.5 64.5t-163 174t-86 239t-27.5 276.5zM272 754q0 -252 84 -415t250 -163h463q139 0 219 139.5 t80 438.5q0 74 -3 129t-11 126.5t-28.5 122t-50.5 97.5t-79 70.5t-115 23.5h-475q-74 0 -130 -24.5t-104 -85t-74 -176t-26 -283.5zM457 748q0 446 295 446q213 0 376 -49v-152q-172 25 -331 25q-84 0 -118 -61.5t-34 -215.5q0 -135 36 -199.5t124 -64.5q158 0 336 33v-152 q-145 -57 -379 -57q-139 0 -222 98.5t-83 348.5z" /> +<glyph unicode="«" horiz-adv-x="1187" d="M78 725l422 416l157 -156l-268 -260l273 -268l-152 -158zM526 725l422 416l158 -156l-266 -260l272 -268l-154 -158z" /> +<glyph unicode="­" horiz-adv-x="724" d="M41 473v242h643v-242h-643z" /> +<glyph unicode="®" horiz-adv-x="1638" d="M86 754q0 121 12.5 221t46 200.5t90 169t151.5 111.5t220 43h475q145 0 244.5 -63.5t147 -179t64.5 -233.5t17 -269q0 -356 -121.5 -555t-351.5 -199h-475q-139 0 -243.5 64.5t-163 174t-86 239t-27.5 276.5zM272 754q0 -252 84 -415t250 -163h463q139 0 219 139.5 t80 438.5q0 74 -3 129t-11 126.5t-28.5 122t-50.5 97.5t-79 70.5t-115 23.5h-475q-74 0 -130 -24.5t-104 -85t-74 -176t-26 -283.5zM508 313v875h373q274 0 274 -275q0 -131 -43 -188t-117 -78l179 -334h-203l-170 326l-107 25v-351h-186zM694 799h154q80 0 100.5 20.5 t20.5 93.5q0 63 -28 81t-93 18h-154v-213z" /> +<glyph unicode="´" horiz-adv-x="497" d="M31 1087l186 285h250l-250 -285h-186z" /> +<glyph unicode="¸" horiz-adv-x="499" d="M78 -242l90 31q41 16 51 44t10 91h193q0 -160 -49 -224.5t-180 -64.5h-115v123z" /> +<glyph unicode="»" horiz-adv-x="1187" d="M78 457l272 268l-266 260l156 156l422 -416l-433 -426zM526 457l273 268l-267 260l158 156l422 -416l-432 -426z" /> +<glyph unicode="À" horiz-adv-x="1417" d="M70 0l505 1499h326l488 -1499h-306l-106 332h-492l-108 -332h-307zM395 1917h252l184 -285h-186zM561 586h348l-168 536z" /> +<glyph unicode="Â" horiz-adv-x="1417" d="M70 0l505 1499h326l488 -1499h-306l-106 332h-492l-108 -332h-307zM422 1632l221 277h213l199 -277h-191l-121 123l-129 -123h-192zM561 586h348l-168 536z" /> +<glyph unicode="Æ" horiz-adv-x="1953" d="M47 0l580 1178q57 115 126.5 185.5t156.5 99t157 34.5t176 2q510 -14 641 -33v-237h-573q-37 0 -59.5 -8.5t-31 -29t-10.5 -33.5t-4 -42v-239l584 -23v-236l-584 -18v-231q0 -39 9.5 -61.5t34 -31t36.5 -9.5t47 -1h551v-239q-51 -8 -205.5 -16.5t-283.5 -13.5l-129 -5 q-59 -4 -113.5 4t-111 32.5t-89 81t-32.5 138.5v149h-359l-196 -397h-318zM682 651h238v492z" /> +<glyph unicode="Ç" horiz-adv-x="1169" d="M86 754q0 190 22.5 323t79 235.5t157.5 153t251 50.5q291 0 522 -68v-225l-15 2q-15 2 -41 4t-59.5 5t-75.5 6t-85 5t-90 4t-88 2q-88 0 -136.5 -14t-87.5 -65.5t-53 -151.5t-14 -270q0 -266 60.5 -382t230.5 -116q96 0 209.5 4t179.5 8l65 4v-223q-199 -63 -522 -57 q-272 2 -391 196.5t-119 569.5zM233 -242l91 31q41 16 51 44t10 91h193q0 -160 -49.5 -224.5t-180.5 -64.5h-115v123z" /> +<glyph unicode="È" d="M119 295v893q0 92 29.5 157.5t81 97.5t103.5 44t111 12q528 -14 660 -33v-237h-592q-49 0 -74.5 -19.5t-28.5 -39t-3 -56.5v-233l606 -21v-237l-606 -19v-233q0 -39 10 -62.5t32.5 -32t38 -10.5t45.5 -2h572v-235q-117 -16 -639 -35q-59 -2 -111.5 7t-110 37t-91 93.5 t-33.5 163.5zM336 1913h252l184 -285h-186z" /> +<glyph unicode="É" d="M119 295v893q0 92 29.5 157.5t81 97.5t103.5 44t111 12q528 -14 660 -33v-237h-592q-49 0 -74.5 -19.5t-28.5 -39t-3 -56.5v-233l606 -21v-237l-606 -19v-233q0 -39 10 -62.5t32.5 -32t38 -10.5t45.5 -2h572v-235q-117 -16 -639 -35q-59 -2 -111.5 7t-110 37t-91 93.5 t-33.5 163.5zM563 1628l187 283h249l-249 -283h-187z" /> +<glyph unicode="Ê" d="M119 295v893q0 92 29.5 157.5t81 97.5t103.5 44t111 12q528 -14 660 -33v-237h-592q-49 0 -74.5 -19.5t-28.5 -39t-3 -56.5v-233l606 -21v-237l-606 -19v-233q0 -39 10 -62.5t32.5 -32t38 -10.5t45.5 -2h572v-235q-117 -16 -639 -35q-59 -2 -111.5 7t-110 37t-91 93.5 t-33.5 163.5zM334 1632l221 277h213l199 -277h-191l-121 123l-129 -123h-192z" /> +<glyph unicode="Ë" d="M119 295v893q0 92 29.5 157.5t81 97.5t103.5 44t111 12q528 -14 660 -33v-237h-592q-49 0 -74.5 -19.5t-28.5 -39t-3 -56.5v-233l606 -21v-237l-606 -19v-233q0 -39 10 -62.5t32.5 -32t38 -10.5t45.5 -2h572v-235q-117 -16 -639 -35q-59 -2 -111.5 7t-110 37t-91 93.5 t-33.5 163.5zM258 1749q0 49 36 84t87 35q49 0 84 -35t35 -84t-35 -85t-84 -36q-51 0 -87 36t-36 85zM780 1749q0 49 36 84t87 35q49 0 84 -35t35 -84t-35 -85t-84 -36q-51 0 -87 36t-36 85z" /> +<glyph unicode="Î" horiz-adv-x="501" d="M-49 1632l221 277h213l199 -277h-191l-121 123l-129 -123h-192zM125 0v1499h287v-1499h-287z" /> +<glyph unicode="Ï" horiz-adv-x="501" d="M-115 1753q0 51 36 85t87 34q49 0 84 -34t35 -85q0 -49 -35 -85t-84 -36q-51 0 -87 36t-36 85zM125 0v1499h287v-1499h-287zM410 1753q0 51 34.5 85t85.5 34q49 0 84 -34t35 -85q0 -49 -34.5 -85t-84.5 -36q-51 0 -85.5 36t-34.5 85z" /> +<glyph unicode="Ô" horiz-adv-x="1374" d="M102 739q0 205 32 349.5t80 225.5t132 126t163 57t196 12q100 0 168.5 -8t143.5 -34.5t123 -79t89 -136.5t59.5 -212t18.5 -300q0 -195 -29 -332t-76 -217.5t-128 -125t-164 -58.5t-205 -14q-102 0 -173 8t-146 33.5t-122 77t-87 132.5t-57.5 204.5t-17.5 291.5zM389 739 q0 -209 26.5 -309t90 -137t199.5 -37q127 0 191.5 37t94 140.5t29.5 305.5q0 174 -15.5 275.5t-58.5 153t-94 64.5t-147 13q-76 0 -119 -7t-87 -33.5t-63.5 -81t-33 -148t-13.5 -236.5zM389 1632l219 277h213l199 -277h-191l-120 123l-127 -123h-193z" /> +<glyph unicode="Ù" horiz-adv-x="1359" d="M125 655v844h287v-844q0 -170 29.5 -257t88 -115.5t172.5 -28.5q152 0 215.5 82t63.5 319v844h289v-844q0 -109 -12.5 -197.5t-30 -153t-50 -116t-61.5 -83t-76 -55t-79.5 -35t-87 -17.5t-85 -7t-86.5 -1h-19q-110 0 -166 4t-144 38t-133 100.5t-80 198t-35 324.5z M354 1917h250l187 -285h-187z" /> +<glyph unicode="Û" horiz-adv-x="1359" d="M125 655v844h287v-844q0 -170 29.5 -257t88 -115.5t172.5 -28.5q152 0 215.5 82t63.5 319v844h289v-844q0 -109 -12.5 -197.5t-30 -153t-50 -116t-61.5 -83t-76 -55t-79.5 -35t-87 -17.5t-85 -7t-86.5 -1h-19q-110 0 -166 4t-144 38t-133 100.5t-80 198t-35 324.5z M381 1632l221 277h213l197 -277h-189l-121 123l-129 -123h-192z" /> +<glyph unicode="Ü" horiz-adv-x="1359" d="M125 655v844h287v-844q0 -170 29.5 -257t88 -115.5t172.5 -28.5q152 0 215.5 82t63.5 319v844h289v-844q0 -109 -12.5 -197.5t-30 -153t-50 -116t-61.5 -83t-76 -55t-79.5 -35t-87 -17.5t-85 -7t-86.5 -1h-19q-110 0 -166 4t-144 38t-133 100.5t-80 198t-35 324.5z M315 1753q0 49 36 84t85 35q51 0 86 -34t35 -85q0 -49 -35 -85t-86 -36q-49 0 -85 36t-36 85zM838 1753q0 49 35.5 84t84.5 35q51 0 85 -34t34 -85q0 -49 -34.5 -85t-84 -36t-85 36t-35.5 85z" /> +<glyph unicode="à" horiz-adv-x="1062" d="M61 276v103q0 131 78 215t242 84q319 -2 319 0q2 68 0 70q0 82 -34.5 107.5t-110.5 25.5q-133 0 -457 -23v178q186 72 496 72q188 0 290.5 -79t102.5 -271v-758h-227l-60 119q-8 -14 -52 -45t-124 -59.5t-155 -26.5q-147 4 -227.5 88.5t-80.5 199.5zM205 1516h250 l186 -285h-186zM348 317q0 -61 26.5 -80.5t76.5 -19.5q117 0 249 86v199l-264 -21q-88 -6 -88 -110v-54z" /> +<glyph unicode="â" horiz-adv-x="1062" d="M61 276v103q0 131 78 215t242 84q319 -2 319 0q2 68 0 70q0 82 -34.5 107.5t-110.5 25.5q-133 0 -457 -23v178q186 72 496 72q188 0 290.5 -79t102.5 -271v-758h-227l-60 119q-8 -14 -52 -45t-124 -59.5t-155 -26.5q-147 4 -227.5 88.5t-80.5 199.5zM229 1231l220 276 h213l198 -276h-190l-121 123l-127 -123h-193zM348 317q0 -61 26.5 -80.5t76.5 -19.5q117 0 249 86v199l-264 -21q-88 -6 -88 -110v-54z" /> +<glyph unicode="æ" horiz-adv-x="1724" d="M61 283v71q0 131 78 215t242 84q319 -2 319 0q2 98 0 101q0 80 -34.5 106.5t-110.5 26.5q-88 0 -457 -25v178q168 70 496 74q203 -4 285 -88q100 76 323 76q131 0 208 -12.5t140.5 -51.5t89 -116.5t25.5 -202.5q0 -141 -76 -201.5t-229 -60.5h-344q0 -139 52 -185.5 t177 -46.5q260 0 400 21v-193q-154 -57 -558 -57q-113 0 -179 35t-117 106q-18 -39 -165 -92t-257 -51q-147 2 -227.5 88t-80.5 201zM348 317q0 -61 25.5 -77.5t77.5 -16.5q53 0 115.5 21.5t98.5 42.5l35 20v174l-264 -20q-88 -6 -88 -111v-33zM1016 651h270q92 0 92 82 q0 102 -26.5 126t-132.5 24q-72 0 -98.5 -3t-57.5 -24.5t-39 -69t-8 -135.5z" /> +<glyph unicode="ç" horiz-adv-x="1011" d="M78 545q0 164 25.5 275.5t75.5 171t111.5 84t145.5 24.5q297 0 500 -68v-176q-195 12 -377 12q-59 0 -88 -6t-57.5 -36.5t-38.5 -99.5t-10 -187q0 -139 19 -208t57 -90.5t118 -21.5l391 19v-181q-39 -18 -84 -32.5t-79.5 -20.5t-91 -10t-84 -5t-91.5 -1h-84 q-170 0 -264 122t-94 435zM324 -244l90 31q41 16 51 44t10 91h193q0 -160 -49.5 -224.5t-180.5 -64.5h-114v123z" /> +<glyph unicode="è" horiz-adv-x="1075" d="M78 549q0 176 24.5 282.5t86 166t144.5 79t220 19.5q133 0 208 -11.5t138.5 -51.5t89 -119.5t25.5 -213.5q0 -274 -303 -274h-346q0 -135 49 -171t180 -36q258 0 399 23v-195q-154 -57 -557 -57q-203 0 -280.5 127t-77.5 432zM217 1503h252l184 -282h-186zM365 633h272 q90 0 90 82q0 104 -27.5 133t-130.5 29q-68 0 -98.5 -5.5t-60 -29t-37.5 -72.5t-8 -137z" /> +<glyph unicode="é" horiz-adv-x="1075" d="M78 549q0 176 24.5 282.5t86 166t144.5 79t220 19.5q133 0 208 -11.5t138.5 -51.5t89 -119.5t25.5 -213.5q0 -274 -303 -274h-346q0 -135 49 -171t180 -36q258 0 399 23v-195q-154 -57 -557 -57q-203 0 -280.5 127t-77.5 432zM365 633h272q90 0 90 82q0 104 -27.5 133 t-130.5 29q-68 0 -98.5 -5.5t-60 -29t-37.5 -72.5t-8 -137zM459 1221l184 282h252l-250 -282h-186z" /> +<glyph unicode="ê" horiz-adv-x="1075" d="M78 549q0 176 24.5 282.5t86 166t144.5 79t220 19.5q133 0 208 -11.5t138.5 -51.5t89 -119.5t25.5 -213.5q0 -274 -303 -274h-346q0 -135 49 -171t180 -36q258 0 399 23v-195q-154 -57 -557 -57q-203 0 -280.5 127t-77.5 432zM229 1221l222 278h213l198 -278h-190 l-121 122l-129 -122h-193zM365 633h272q90 0 90 82q0 104 -27.5 133t-130.5 29q-68 0 -98.5 -5.5t-60 -29t-37.5 -72.5t-8 -137z" /> +<glyph unicode="ë" horiz-adv-x="1075" d="M78 549q0 176 24.5 282.5t86 166t144.5 79t220 19.5q133 0 208 -11.5t138.5 -51.5t89 -119.5t25.5 -213.5q0 -274 -303 -274h-346q0 -135 49 -171t180 -36q258 0 399 23v-195q-154 -57 -557 -57q-203 0 -280.5 127t-77.5 432zM162 1341q0 51 35.5 86t85 35t84 -34.5 t34.5 -86.5q0 -49 -34.5 -84.5t-84 -35.5t-85 35.5t-35.5 84.5zM365 633h272q90 0 90 82q0 104 -27.5 133t-130.5 29q-68 0 -98.5 -5.5t-60 -29t-37.5 -72.5t-8 -137zM684 1341q0 51 36 86t85 35t84 -34.5t35 -86.5q0 -49 -35 -84.5t-84 -35.5t-85 35.5t-36 84.5z" /> +<glyph unicode="î" horiz-adv-x="471" d="M-80 1221l221 278h213l199 -278h-191l-120 122l-129 -122h-193zM94 0v1087h287v-1087h-287z" /> +<glyph unicode="ï" horiz-adv-x="471" d="M-145 1341q0 51 35.5 86t86.5 35q49 0 84 -34.5t35 -86.5q0 -49 -34.5 -84.5t-84.5 -35.5q-51 0 -86.5 35.5t-35.5 84.5zM94 0v1087h287v-1087h-287zM377 1341q0 51 36 86t87 35q49 0 83.5 -34.5t34.5 -86.5q0 -49 -34.5 -84.5t-83.5 -35.5q-51 0 -87 35.5t-36 84.5z" /> +<glyph unicode="ô" horiz-adv-x="1146" d="M78 528q0 328 108.5 449t386.5 121q281 0 388.5 -123t107.5 -447q0 -305 -105.5 -421.5t-390.5 -116.5q-279 0 -387 121.5t-108 416.5zM262 1221l221 278h213l199 -278h-190l-121 122l-129 -122h-193zM365 528q0 -139 22.5 -205.5t62 -84t123.5 -17.5q90 0 129 17.5 t59.5 82t20.5 207.5q0 119 -7 182.5t-33.5 101.5t-62.5 47t-106 9q-92 0 -132 -22.5t-58 -92t-18 -225.5z" /> +<glyph unicode="ù" horiz-adv-x="1126" d="M78 365v722h287v-729q0 -145 120 -145q82 0 139.5 21.5t123.5 72.5v780h286v-1087h-231l-55 115q-12 -8 -73 -45t-83.5 -48.5t-76.5 -25.5t-114 -14q-323 0 -323 383zM221 1503h252l184 -282h-186z" /> +<glyph unicode="û" horiz-adv-x="1126" d="M78 365v722h287v-729q0 -145 120 -145q82 0 139.5 21.5t123.5 72.5v780h286v-1087h-231l-55 115q-12 -8 -73 -45t-83.5 -48.5t-76.5 -25.5t-114 -14q-323 0 -323 383zM240 1221l221 278h213l198 -278h-190l-121 122l-129 -122h-192z" /> +<glyph unicode="ü" horiz-adv-x="1126" d="M78 365v722h287v-729q0 -145 120 -145q82 0 139.5 21.5t123.5 72.5v780h286v-1087h-231l-55 115q-12 -8 -73 -45t-83.5 -48.5t-76.5 -25.5t-114 -14q-323 0 -323 383zM174 1341q0 51 36 86t85 35q51 0 86 -34.5t35 -86.5q0 -49 -35 -84.5t-86 -35.5q-49 0 -85 35.5 t-36 84.5zM696 1341q0 51 36 86t85 35q51 0 86 -34.5t35 -86.5q0 -49 -35 -84.5t-86 -35.5q-49 0 -85 35.5t-36 84.5z" /> +<glyph unicode="ÿ" horiz-adv-x="1183" d="M33 1087h301l188 -761q6 -20 15.5 -36t18.5 -23t22.5 -12t21.5 -6t20 -2l11 -1l217 841h299l-377 -1431l-149 -209h-205l153 553q-250 0 -323 276zM209 1341q0 51 36 86t85 35t84 -34.5t35 -86.5q0 -49 -35 -84.5t-84 -35.5t-85 35.5t-36 84.5zM731 1341q0 51 36 86 t85 35t84 -34.5t35 -86.5q0 -49 -35 -84.5t-84 -35.5t-85 35.5t-36 84.5z" /> +<glyph unicode="Œ" horiz-adv-x="2064" d="M102 739q0 205 32 349.5t80 225.5t132 126t163 57t196 12q281 0 397 -102q76 100 241 92q506 -14 639 -33v-237h-571q-49 0 -74.5 -19.5t-28.5 -39t-3 -56.5v-233l583 -21v-237l-583 -19v-233q0 -51 22.5 -76t43 -28t61.5 -3h550v-235q-51 -8 -205.5 -16.5t-283.5 -13.5 l-129 -5q-193 -8 -270 92q-119 -94 -389 -94q-102 0 -173 8t-146 33.5t-122 77t-87 132.5t-57.5 204.5t-17.5 291.5zM389 739q0 -209 26.5 -309t90 -137t199.5 -37q125 0 189 37t94 140.5t30 305.5q0 141 -12.5 232.5t-32 147t-61.5 83t-87 35.5t-120 8q-78 0 -120 -7 t-86 -33.5t-64.5 -81t-33 -148t-12.5 -236.5z" /> +<glyph unicode="œ" horiz-adv-x="1777" d="M78 528q0 328 108.5 449t386.5 121q238 0 342 -92q51 51 131 70.5t211.5 19.5t206 -11.5t138 -51.5t89 -119.5t25.5 -213.5q0 -274 -303 -274h-344q-2 -129 49 -168t180 -39q258 0 398 23v-195q-152 -57 -557 -57q-160 0 -232 84q-100 -84 -334 -84q-279 0 -387 121.5 t-108 416.5zM365 528q0 -139 22.5 -205.5t62 -84t123.5 -17.5q141 0 175 57.5t34 270.5q0 201 -38.5 260t-170.5 59q-92 0 -132 -22.5t-58 -92t-18 -225.5zM1069 633h270q90 0 91 82q0 104 -27 133t-129 29q-125 0 -168 -42t-37 -202z" /> +<glyph unicode="Ÿ" horiz-adv-x="1343" d="M70 1499h311l293 -719l321 719h312l-494 -1034v-465h-287v465zM307 1753q0 49 36 84t85 35t84 -34t35 -85q0 -49 -35 -85t-84 -36t-85 36t-36 85zM829 1753q0 49 36 84t85 35t84 -34t35 -85q0 -49 -35 -85t-84 -36t-85 36t-36 85z" /> +<glyph unicode="ˆ" horiz-adv-x="786" d="M78 1087l221 277h213l197 -277h-191l-121 123l-127 -123h-192z" /> +<glyph unicode="˚" horiz-adv-x="569" d="M78 1294q0 88 61.5 149.5t147.5 61.5t146.5 -61.5t60.5 -149.5t-60.5 -148.5t-146.5 -60.5t-147.5 60.5t-61.5 148.5zM197 1294q0 -37 26.5 -61.5t63.5 -24.5t61.5 24.5t24.5 61.5t-24.5 62.5t-61.5 25.5t-63.5 -25.5t-26.5 -62.5z" /> +<glyph unicode="˜" horiz-adv-x="858" d="M78 1200q131 143 248 143q49 -2 115.5 -36.5t101.5 -34.5q80 -4 188 78l49 -123q-129 -139 -231 -140q-51 2 -122 37t-108 35q-25 0 -44 -3t-40.5 -12t-33 -14.5t-38 -20.5t-36.5 -22z" /> +<glyph unicode=" " horiz-adv-x="958" /> +<glyph unicode=" " horiz-adv-x="1917" /> +<glyph unicode=" " horiz-adv-x="958" /> +<glyph unicode=" " horiz-adv-x="1917" /> +<glyph unicode=" " horiz-adv-x="639" /> +<glyph unicode=" " horiz-adv-x="479" /> +<glyph unicode=" " horiz-adv-x="319" /> +<glyph unicode=" " horiz-adv-x="319" /> +<glyph unicode=" " horiz-adv-x="239" /> +<glyph unicode=" " horiz-adv-x="383" /> +<glyph unicode=" " horiz-adv-x="106" /> +<glyph unicode="‐" horiz-adv-x="724" d="M41 473v242h643v-242h-643z" /> +<glyph unicode="‑" horiz-adv-x="724" d="M41 473v242h643v-242h-643z" /> +<glyph unicode="‒" horiz-adv-x="724" d="M41 473v242h643v-242h-643z" /> +<glyph unicode="–" horiz-adv-x="1050" d="M41 467v244h969v-244h-969z" /> +<glyph unicode="—" horiz-adv-x="1507" d="M41 471v244h1425v-244h-1425z" /> +<glyph unicode="‘" horiz-adv-x="530" d="M125 1057v272q0 175 175 191q52 5 95 -4v-113q-68 0 -67 -68v-43h24q53 0 54 -51v-184q0 -57 -54 -58h-176q-51 1 -51 58z" /> +<glyph unicode="’" horiz-adv-x="530" d="M125 1282v182q0 57 53 58h176q51 0 52 -58v-272q0 -175 -175 -191q-52 -5 -96 5v112q68 0 68 68v41h-25q-53 0 -53 55z" /> +<glyph unicode="‚" horiz-adv-x="530" d="M125 53v183q0 59 53 59h176q51 0 52 -59v-271q0 -177 -175 -193q-52 -5 -96 5v112q68 0 68 68v43h-25q-53 0 -53 53z" /> +<glyph unicode="“" horiz-adv-x="870" d="M113 1055v272q0 175 174 191q52 5 96 -5v-112q-66 0 -66 -68v-41h25q53 0 53 -55v-182q0 -57 -53 -58h-178q-51 1 -51 58zM477 1055v272q0 68 27.5 113t68.5 59t81 18.5t68 0.5l28 -5v-112q-68 0 -68 -68v-41h25q53 0 53 -55v-182q0 -57 -53 -58h-177q-53 1 -53 58z" /> +<glyph unicode="”" horiz-adv-x="870" d="M113 1278v184q0 57 53 58h178q51 0 51 -58v-272q0 -68 -27.5 -113t-68.5 -59t-81 -18.5t-67 -0.5l-28 5v112q68 -2 67 68v41h-24q-53 0 -53 53zM477 1278v184q0 57 55 58h177q51 0 51 -58v-272q0 -175 -175 -191q-52 -5 -96 5v112q66 -2 66 68v41h-23q-55 0 -55 53z" /> +<glyph unicode="„" horiz-adv-x="870" d="M113 53v183q0 59 53 59h178q51 0 51 -59v-271q0 -70 -27.5 -114t-68.5 -59t-81 -19t-67 0l-28 4v112q68 0 67 68v43h-24q-53 0 -53 53zM477 53v183q0 59 55 59h177q51 0 51 -59v-271q0 -177 -175 -193q-52 -5 -96 5v112q66 0 66 68v43h-23q-55 0 -55 53z" /> +<glyph unicode="…" horiz-adv-x="1652" d="M606 47v184q0 51 49 52h56h57h63h56h57q51 0 51 -52v-184q0 -47 -51 -47h-57h-56h-63h-57h-56q-49 0 -49 47z" /> +<glyph unicode=" " horiz-adv-x="383" /> +<glyph unicode="‹" horiz-adv-x="729" d="M78 725l422 416l157 -156l-268 -260l273 -268l-152 -158z" /> +<glyph unicode="›" horiz-adv-x="729" d="M78 457l272 268l-266 260l156 156l422 -416l-433 -426z" /> +<glyph unicode=" " horiz-adv-x="479" /> +<glyph unicode="€" horiz-adv-x="1263" d="M31 512v139l157 17v139l-157 16v131l157 21q0 47 1 77.5t11.5 92t28 105.5t54 97.5t89 87t134.5 57.5t184 24q96 0 261 -20.5t276 -53.5v-209q-301 29 -469 29q-57 0 -101.5 -7.5t-75 -17.5t-50 -31.5t-31 -41t-17.5 -54.5t-7 -61.5t-1 -73.5l479 -17v-139l-479 -12v-139 l479 -17v-139q-31 0 -81 -2t-155.5 -5t-175 -5t-67.5 -4q0 -156 75 -211.5t208 -55.5q82 0 201.5 11.5t197.5 22.5l78 11v-204q-195 -82 -545 -82q-59 0 -113.5 8t-129 39t-129 82t-92.5 149.5t-38 229.5z" /> +<glyph unicode="™" horiz-adv-x="1443" d="M31 1335v164h575v-164h-192v-551h-189v551h-194zM641 784l78 715h194l123 -420l99 420h200l86 -715h-186l-39 377l-76 -377h-166l-94 377l-31 -377h-188z" /> +<glyph unicode="" horiz-adv-x="1085" d="M0 1085h1085v-1085h-1085v1085z" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Bold-webfont.ttf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Bold-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1302b858777cb0b6e549afd842eb70dc5e0bcec0 Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Bold-webfont.ttf differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Bold-webfont.woff b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Bold-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..03a0408d9ee80ca07848a633ac98e74e1d5b5bf9 Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Bold-webfont.woff differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-DemiBold-Italic-webfont.eot b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-DemiBold-Italic-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..0711eddc16f7c39d7e6e3ed878d4ca914cd39070 Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-DemiBold-Italic-webfont.eot differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-DemiBold-Italic-webfont.svg b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-DemiBold-Italic-webfont.svg new file mode 100644 index 0000000000000000000000000000000000000000..a46b9c91b3d08bf9bc1d4cf28f3b59b2e7d145c0 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-DemiBold-Italic-webfont.svg @@ -0,0 +1,187 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Copyright c 2011 Natanael Gama exondiscoveredcom with Reserved Font Name Exo +Designer : Natanael Gama +</metadata> +<defs> +<font id="ExoDemiBoldItalic" horiz-adv-x="1150" > +<font-face units-per-em="2048" ascent="1638" descent="-410" /> +<missing-glyph horiz-adv-x="512" /> +<glyph unicode=" " horiz-adv-x="512" /> +<glyph unicode="	" horiz-adv-x="512" /> +<glyph unicode=" " horiz-adv-x="512" /> +<glyph unicode="!" horiz-adv-x="550" d="M154 47l26 160q6 51 58 51h155q47 0 39 -51l-26 -160q-6 -47 -54 -47h-155q-49 0 -43 47zM229 408l152 1089h250l-197 -1089h-205z" /> +<glyph unicode=""" horiz-adv-x="862" d="M342 1087l20 275l23 137h231l-22 -137l-64 -275h-188zM678 1087l20 275l23 137h231l-22 -137l-64 -275h-188z" /> +<glyph unicode="#" horiz-adv-x="1449" d="M104 446l52 164h315l90 281h-317l53 164h321l146 444h164l-146 -444h283l145 444h164l-145 -444h356l-53 -164h-356l-91 -283h357l-49 -164h-365l-145 -444h-164l145 444l-284 2l-146 -446h-164l146 446h-312zM635 610l287 -2l90 283h-287z" /> +<glyph unicode="$" horiz-adv-x="1169" d="M147 41l31 178q25 0 111 -4t185 -7t183 -3t154 33.5t84 117.5l16 103q6 49 7.5 85t-30.5 56.5t-102 20.5h-215q-92 0 -158.5 28.5t-98 72.5t-51 97t-16.5 105.5t7 95.5l20 131q31 201 148 277.5t307 82.5l29 177h155l-28 -181q172 -10 366 -51l-30 -186q-369 20 -467 20 q-109 4 -169.5 -32.5t-76.5 -139.5l-14 -96q-12 -88 18.5 -126t136.5 -38h219q104 0 172 -39t89.5 -98t29.5 -130t-8 -132l-18 -115q-59 -373 -490 -360l-27 -168h-153l26 174q-201 14 -342 51z" /> +<glyph unicode="%" horiz-adv-x="1972" d="M225 989l41 258q20 135 87 193.5t227 58.5h206q137 0 191.5 -67.5t34.5 -204.5l-41 -258q-23 -141 -90.5 -197.5t-221.5 -56.5h-206q-127 0 -187.5 71.5t-40.5 202.5zM406 999q-10 -61 8 -84.5t82 -23.5h172q70 0 94 22.5t37 85.5l32 215q10 68 -7 88.5t-85 20.5h-170 q-70 0 -95 -22.5t-36 -86.5zM436 0l1147 1499h182l-1140 -1499h-189zM1198 272l41 258q20 137 87 196.5t226 59.5h207q266 0 226 -274l-39 -258q-23 -139 -91.5 -195.5t-224.5 -56.5h-207q-127 0 -186 70.5t-39 199.5zM1378 287q-10 -63 8.5 -86t83.5 -23h170 q70 0 95.5 23.5t36.5 85.5l32 215q10 68 -7 88t-85 20h-170q-70 0 -95.5 -22.5t-35.5 -85.5z" /> +<glyph unicode="&" horiz-adv-x="1341" d="M130 473.5q42 153.5 204 276.5l188 143l-88 154q-63 115 -41.5 211t94 159.5t162.5 73.5q262 33 565 -37l-26 -168h-367q-135 0 -173 -45t28 -172l313 -547l277 242l71 -88l-143 -246l-96 -92l196 -338h-256l-120 205l-152 -129q-78 -66 -187.5 -84.5t-221 26 t-177.5 150.5q-92 152 -50 305.5zM375 293q51 -74 134 -85t159 52l143 125l-193 322l-147 -113q-200 -149 -96 -301z" /> +<glyph unicode="'" horiz-adv-x="430" d="M291 1087l20 275l23 137h239l-22 -137l-64 -275h-196z" /> +<glyph unicode="(" horiz-adv-x="739" d="M210 366.5q3 139.5 26 280.5q31 186 95 365.5t134 301.5t134.5 217t106.5 141l42 46h239q-16 -20 -44 -56t-103.5 -152.5t-139 -237.5t-130 -299t-97.5 -348q-33 -197 -27.5 -364t36 -303t65.5 -231.5t63 -147.5l29 -52h-229q-6 8 -16.5 25.5t-38 75t-51 121t-48.5 164.5 t-37 207.5t-9 246z" /> +<glyph unicode=")" horiz-adv-x="743" d="M-33 -473q16 18 44 54t103.5 149.5t139 234.5t130.5 301t97 357q31 190 27 356t-35 302t-65.5 233.5t-63.5 150.5l-29 53h230q6 -10 16 -27.5t38 -77t50.5 -124t47 -166.5t36.5 -206.5t10 -242t-24 -274.5q-33 -193 -95.5 -374t-130 -303t-130 -215t-102.5 -137l-40 -44 h-254z" /> +<glyph unicode="*" horiz-adv-x="882" d="M268 1159l17 103l293 53l-17 -166zM346 850l92 278l156 -38l-158 -271zM555 963l113 139l198 -184l-71 -84zM580 1473l104 36l104 -247l-163 -66zM684 1169l270 160l39 -88l-225 -199z" /> +<glyph unicode="+" horiz-adv-x="1013" d="M178 625l35 209h319l50 321h209l-50 -321h324l-35 -209h-323l-52 -322h-209l52 322h-320z" /> +<glyph unicode="," horiz-adv-x="538" d="M129 -180l14 86q61 0 72 57l6 37h-22q-51 0 -43 51l24 154q8 55 60 55h147q49 0 41 -55l-37 -228q-10 -59 -41 -98t-66.5 -50t-71.5 -15t-59 1z" /> +<glyph unicode="-" horiz-adv-x="724" d="M123 489l35 209h643l-35 -209h-643z" /> +<glyph unicode="." horiz-adv-x="542" d="M154 47l26 160q6 51 58 51h151q53 0 43 -51l-26 -160q-8 -47 -58 -47h-151q-49 0 -43 47z" /> +<glyph unicode="/" horiz-adv-x="892" d="M10 -147l848 1724h248l-848 -1724h-248z" /> +<glyph unicode="0" horiz-adv-x="1296" d="M176 352l125 787q57 360 410 360h336q184 0 260.5 -102.5t52.5 -249.5l-125 -795q-29 -180 -127 -266t-272 -86h-336q-170 0 -261.5 88t-62.5 264zM418 291q8 -35 35.5 -48.5t48 -16.5t61.5 -3h248q164 0 190 158l117 737q12 84 -17.5 121t-115.5 37h-260 q-168 0 -190 -158l-117 -735q-8 -57 0 -92z" /> +<glyph unicode="1" horiz-adv-x="751" d="M254 1169l25 158q86 0 191 63.5t146 108.5h234l-236 -1499h-237l198 1241q-45 -33 -135 -52.5t-186 -19.5z" /> +<glyph unicode="2" horiz-adv-x="1206" d="M84 0l35 211q90 55 189.5 121.5t233.5 167t238.5 193.5t184 195.5t92.5 180.5q16 115 -35 170t-184 55h-564l29 176q317 49 625 50q205 0 297 -136.5t69 -332.5q-10 -98 -79.5 -211t-145.5 -195t-198.5 -182.5t-175 -139t-142.5 -100.5h602l-35 -223h-1036z" /> +<glyph unicode="3" horiz-adv-x="1202" d="M70 43l28 168h553q215 0 240 158l14 86q4 31 5 55.5t-5 41.5t-12 30.5t-21.5 21.5t-26.5 13.5t-34 8.5t-37 4t-43 3l-438 16l31 191l442 18q109 4 164 43t69 123l15 98q14 94 -35 126t-145 32h-580l25 166q90 31 205.5 44t226 14t237.5 -1q156 -4 245 -106.5t62 -259.5 l-18 -121q-39 -238 -195 -271q70 -31 95.5 -113.5t7.5 -201.5l-19 -100q-51 -344 -432 -344h-74h-80q-16 0 -72 1t-76.5 2t-66.5 4t-71 7t-61.5 10t-65 14.5t-57.5 18.5z" /> +<glyph unicode="4" horiz-adv-x="1257" d="M106 459l742 1040h274l-651 -921h438l60 372l96 156h170l-84 -528h162l-29 -185l-170 -45l-53 -344h-242l53 344h-714z" /> +<glyph unicode="5" horiz-adv-x="1226" d="M137 39l31 184h594q92 0 134 49.5t50 112.5l27 164q29 170 -125 170h-234q-59 0 -105 -34t-56 -99h-226l189 913h895l-35 -223h-666l-82 -395q57 47 168 55q61 6 238 -2q150 -4 225.5 -109.5t52.5 -265.5l-32 -227q-31 -193 -141.5 -266.5t-278.5 -75.5q-209 0 -322 8 t-301 41z" /> +<glyph unicode="6" horiz-adv-x="1255" d="M205 403.5q-2 155.5 31 397.5q59 373 186 535.5t280 170.5q307 18 633 -39l-28 -180h-541q-205 0 -281 -432q223 41 465 41q82 2 142.5 -19.5t90 -57.5t48 -82t16.5 -94t-6 -95l-37 -246q-27 -170 -129 -236.5t-272 -66.5h-295q-86 0 -147.5 35t-107.5 124t-48 244.5z M457 682q-76 -463 135 -463h213q150 0 174 143l27 181q14 84 -11.5 111.5t-109.5 27.5h-428z" /> +<glyph unicode="7" horiz-adv-x="1128" d="M254 1276l35 223h956l49 -119l-733 -1380h-266l688 1276h-729z" /> +<glyph unicode="8" horiz-adv-x="1282" d="M174 274.5q2 34.5 8 73.5l25 168q16 96 74.5 151.5t142.5 67.5q-172 70 -133 301l20 133q31 197 137.5 268.5t292.5 71.5h308q164 0 240.5 -96t49.5 -272l-20 -119q-2 -23 -12.5 -53.5t-32 -67.5t-61 -65.5t-91.5 -38.5q80 -23 105.5 -113t11.5 -176l-29 -184 q-18 -111 -57 -179.5t-101.5 -98.5t-113.5 -38t-131 -8h-305q-102 0 -172 27.5t-100.5 65.5t-44 92.5t-11.5 89zM422 352q-12 -76 20.5 -105.5t126.5 -29.5h232q154 0 172 135l28 168q10 70 -23.5 106t-100.5 36h-250q-156 0 -178 -142zM526 1012q-12 -80 29 -112t104 -32 h248q150 0 170 144l19 112q16 100 -13.5 135t-111.5 35h-232q-96 0 -138 -37.5t-58 -132.5z" /> +<glyph unicode="9" horiz-adv-x="1253" d="M158 39l28 180h543q63 0 114.5 43t83 113.5t51 136.5t32.5 139q-217 -39 -467 -43q-100 0 -168 34t-92.5 86t-33.5 115.5t5 121.5l37 231q27 172 128 241.5t271 69.5h295q88 0 149.5 -36.5t107.5 -129t47 -250t-32 -399.5q-106 -672 -464 -692q-336 -20 -635 39zM489 965 q-14 -84 11.5 -112t109.5 -28h428q14 119 19.5 221.5t-32.5 172t-122 69.5h-215q-150 0 -172 -143z" /> +<glyph unicode=":" horiz-adv-x="544" d="M154 47l26 160q6 51 58 51h151q53 0 43 -51l-26 -160q-8 -47 -58 -47h-151q-49 0 -43 47zM287 879l24 159q6 51 58 52h151q53 0 43 -52l-24 -159q-8 -47 -60 -48h-151q-47 1 -41 48z" /> +<glyph unicode=";" horiz-adv-x="544" d="M129 -180l14 86q61 0 72 57l6 37h-22q-20 0 -33.5 14.5t-9.5 36.5l24 154q4 23 20.5 39t39.5 16h147q49 0 41 -55l-37 -228q-10 -59 -41 -98t-66.5 -50t-71.5 -15t-59 1zM289 879l24 159q6 51 58 52h151q53 0 43 -52l-24 -159q-8 -47 -58 -48h-151q-49 1 -43 48z" /> +<glyph unicode="<" horiz-adv-x="937" d="M182 608l37 230l815 309l-35 -229l-550 -203l485 -213l-37 -223z" /> +<glyph unicode="=" horiz-adv-x="956" d="M102 397l35 209h875l-35 -209h-875zM170 834l35 208h874l-35 -208h-874z" /> +<glyph unicode=">" horiz-adv-x="940" d="M131 279l37 231l557 221l-494 199l37 217l717 -309l-35 -230z" /> +<glyph unicode="?" horiz-adv-x="1107" d="M238 1294l28 172q354 57 586 47q203 0 298 -118.5t69 -280.5l-27 -186q-33 -213 -166 -288t-369 -48q0 -2 -7 -48t-14 -93.5t-7 -51.5h-205l59 375q129 -4 254 0q84 4 144.5 47t74.5 131l23 146q16 106 -33 151t-182 45h-526zM346 47l25 160q6 51 57 51h152q53 0 43 -51 l-25 -160q-8 -47 -57 -47h-152q-49 0 -43 47z" /> +<glyph unicode="@" horiz-adv-x="1814" d="M115 53l159 1014q63 393 486 393h753q193 0 269 -116.5t45 -319.5l-103 -688q-8 -63 -26.5 -113.5t-57 -103.5t-113.5 -83t-179 -30h-160l-49 117q-106 -131 -289 -131q-399 0 -311 583q84 541 460 541q326 0 465 -133l-112 -774q82 0 120.5 33.5t55.5 150.5l96 645 q2 51 6 88t-9 61.5t-22.5 39t-34 20.5t-43 8t-48.5 2h-754q-211 0 -244 -219l-158 -997q-16 -102 20 -161.5t157 -59.5h790l-24 -146q-276 -55 -598 -55h-195q-207 0 -295 124t-57 310zM735 535q-23 -182 5 -262t139 -80q166 2 282 131l88 567q-100 25 -254 24 q-96 0 -163.5 -81.5t-96.5 -298.5z" /> +<glyph unicode="A" horiz-adv-x="1386" d="M78 0l760 1499h262l264 -1499h-242l-67 362h-531l-184 -362h-262zM627 580h399l-100 606z" /> +<glyph unicode="B" horiz-adv-x="1224" d="M139 0l238 1499h598q111 0 186.5 -36t112.5 -96t48 -131q6 -37 5 -77q0 -36 -4 -74q-16 -129 -85 -208.5t-167 -98.5q76 -12 129 -114q40 -77 40 -182q0 -36 -5 -74q-29 -215 -144.5 -311.5t-351.5 -96.5h-600zM412 217h356q193 0 229 225q5 31 5 59q0 64 -26 112 q-36 69 -136 69h-355zM520 891h346q188 0 219 196q4 31 4 57q1 67 -29 97q-42 41 -128 41h-350z" /> +<glyph unicode="C" horiz-adv-x="1173" d="M196 483q-2 33 -3 67q0 110 24 226q31 190 74 319.5t113.5 227.5t178 145.5t257.5 47.5q252 0 506 -70l-31 -186q-227 32 -429 32h-34q-43 0 -60.5 -1t-60.5 -11t-65.5 -28.5t-59.5 -57.5t-59.5 -95.5t-48 -145.5t-43.5 -203q-22 -124 -22 -220q0 -104 26 -176 q49 -135 213 -143q26 -1 57 0q155 0 428 16l-29 -186q-172 -53 -480 -53h-44q-139 0 -231 66.5t-129.5 177t-47.5 251.5z" /> +<glyph unicode="D" horiz-adv-x="1351" d="M139 0l238 1497q0 2 590 2q127 0 217 -51t134 -129q44 -77 64 -185q17 -93 16 -181v-27q-3 -100 -22 -205q-59 -369 -209.5 -545t-425.5 -176h-602zM412 219h338q156 0 254 143.5t135 382.5q21 133 21 231q0 118 -30 184q-56 122 -219 122h-331z" /> +<glyph unicode="E" d="M176 287l148 925q45 287 329 287h19q553 -20 635 -33l-31 -194h-598q-37 0 -61.5 -9.5t-37 -27.5t-17.5 -34.5t-9 -43.5l-47 -295l612 -20l-31 -195l-618 -18l-47 -301q-6 -39 0 -62.5t27.5 -32t37 -10.5t45.5 -2h580l-33 -192l-626 -35h-20q-115 0 -195 64 q-68 54 -68 162q0 31 6 67z" /> +<glyph unicode="F" horiz-adv-x="1155" d="M135 0l189 1196q49 303 332 303h18q553 -20 637 -33l-31 -194h-600q-68 0 -92.5 -31t-32.5 -84l-45 -297l612 -20l-30 -195l-621 -20l-98 -625h-238z" /> +<glyph unicode="G" horiz-adv-x="1253" d="M199 554q4 109 24 228q33 193 75 319t111.5 224t175 143t257.5 45h13q226 0 507 -65l-29 -184q-213 31 -479 34q-53 0 -90 -6t-87 -36.5t-85 -86t-70 -162t-57 -257.5q-24 -126 -24 -226q0 -97 23 -168q45 -143 200 -143h4q66 0 144.5 26.5t124.5 53.5l46 26l53 310h-260 l25 153q143 49 366 49q88 0 138 -4l-131 -827h-175l-47 111q-123 -121 -352 -123h-10q-108 0 -188 44q-83 46 -127 123.5t-62 182.5q-15 87 -15 176q0 20 1 40z" /> +<glyph unicode="H" horiz-adv-x="1323" d="M145 0l238 1499h238l-107 -663h588l106 663h238l-238 -1499h-237l98 614h-588l-98 -614h-238z" /> +<glyph unicode="I" horiz-adv-x="499" d="M152 0l237 1499h238l-238 -1499h-237z" /> +<glyph unicode="J" horiz-adv-x="731" d="M68 45l34 182q86 -8 158 -12h11q65 0 115 45q54 49 71 158l172 1081h237l-184 -1161q-35 -231 -156 -301q-85 -48 -221 -48h-16q-147 3 -221 56z" /> +<glyph unicode="K" horiz-adv-x="1232" d="M139 0l238 1499h229l-102 -643h137l506 643h291l-590 -768l352 -731h-274l-297 639h-158l-100 -639h-232z" /> +<glyph unicode="L" horiz-adv-x="1087" d="M180 279l197 1220h235l-186 -1169q-6 -39 1 -62.5t28.5 -32t37 -10.5t46.5 -2h555l-35 -223h-623q-129 0 -204 68q-57 52 -57 148q0 29 5 63z" /> +<glyph unicode="M" horiz-adv-x="1675" d="M117 0l358 1499h320l135 -1106l473 1106h332l-107 -1499h-235l84 1083l-471 -1083h-263l-133 1081l-254 -1081h-239z" /> +<glyph unicode="N" horiz-adv-x="1361" d="M139 0l238 1499h235l480 -1063l168 1063h237l-237 -1499h-234l-481 1055l-166 -1055h-240z" /> +<glyph unicode="O" horiz-adv-x="1363" d="M196 501q2 114 25 257q23 147 55.5 262t69.5 194.5t88 134t98.5 86t117 48t129 21.5t145.5 5q82 0 144 -7t124.5 -28.5t104.5 -58.5t76 -96q35 -59 49 -141q13 -72 12 -170v-27q-2 -115 -25 -260q-25 -162 -61.5 -283t-87 -200.5t-103.5 -129t-130 -75t-147.5 -33.5 t-170.5 -8q-82 0 -142.5 6t-123 26.5t-105.5 54.5t-78 91t-50 137q-14 73 -14 174v20zM434 511q0 -12 -1 -23q1 -76 13 -128q14 -60 53.5 -91t92.5 -42.5t139 -11.5q133 0 212 38t136.5 153.5t91.5 332.5q24 148 24 249v8q-1 104 -16.5 161t-61.5 86t-91 36t-125 7 q-86 0 -132 -6t-101.5 -34.5t-88 -86t-64 -161t-56.5 -259.5q-23 -137 -25 -228z" /> +<glyph unicode="P" horiz-adv-x="1220" d="M131 0l238 1499h626q72 0 133.5 -22.5t114.5 -73.5t73 -147q11 -51 12 -114q0 -54 -9 -116q-16 -113 -47 -197t-69 -130t-83 -76.5t-91 -37.5t-92 -13q-22 -3 -43 -2q-23 0 -44 3q-63 4 -219 19.5t-164 19.5l-98 -612h-238zM494 791h374q82 0 135.5 53t75.5 200 q7 47 7 84q0 74 -26 106q-39 48 -114 48h-375z" /> +<glyph unicode="Q" horiz-adv-x="1370" d="M200 504q2 115 25 258q23 147 55.5 261t69.5 192.5t88 134t99.5 86t118 48t128 21.5t144.5 4q82 0 145.5 -7t125 -29.5t104.5 -58.5t76.5 -96.5t46.5 -143.5q12 -71 12 -168v-29q-2 -115 -25 -260q-29 -195 -78 -329t-106.5 -211t-144.5 -119t-166.5 -54t-202.5 -12 q-82 0 -142.5 6t-124 26.5t-106.5 55.5t-78 92t-50 137q-14 73 -14 174v21zM438 511v-23q0 -76 12 -128q13 -61 54 -91.5t94 -42t139 -11.5q133 0 211 38t135.5 152.5t92.5 333.5q20 129 25 221q1 26 1 49q0 60 -9 103q-13 59 -33.5 95t-63.5 53.5t-82 21.5t-107 4 q-72 0 -112.5 -4t-90 -20.5t-79 -51t-62.5 -95t-56.5 -153t-43.5 -223.5q-23 -137 -25 -228zM612 -68h142q54 -78 171 -78q68 0 158 27l-32 -207q-53 -17 -109 -17q-21 0 -43 3q-80 8 -145.5 33.5t-106.5 88.5q-36 56 -36 128q0 11 1 22z" /> +<glyph unicode="R" horiz-adv-x="1241" d="M131 0l238 1499h635q168 -1 256 -115q65 -85 65 -243q0 -56 -8 -121q-12 -109 -44 -188.5t-64.5 -120.5t-80 -68t-70 -33t-54.5 -10l213 -600h-267l-184 584l-301 22l-96 -606h-238zM498 795h370q184 0 209 243q5 48 5 86q0 78 -20 110q-28 48 -110 48h-379z" /> +<glyph unicode="S" horiz-adv-x="1179" d="M152 41l28 186q172 -20 506 -20q215 0 238 149l16 103q4 29 4 53q0 45 -14 70q-22 39 -113 39h-235q-98 0 -169 26.5t-103 69.5t-50 94q-15 40 -14 80q0 11 1 21q5 50 7 92l22 149q16 113 59.5 187.5t109 110.5t135.5 49q60 11 137 11h24q317 0 539 -55l-29 -186 q-35 2 -159.5 7t-220 8t-115.5 3h-25q-97 0 -147 -28q-56 -32 -72 -142l-14 -96q-4 -31 -5 -54.5t3 -41t9 -28.5t19.5 -19.5t23.5 -12.5t30.5 -6t33.5 -2h39h240q96 0 162.5 -36t92.5 -92t36 -124q4 -29 4 -56q0 -37 -8 -73l-17 -137q-10 -96 -48 -166t-84 -105.5 t-113.5 -56t-117.5 -24.5t-118 -4q-340 0 -528 57z" /> +<glyph unicode="T" horiz-adv-x="1198" d="M262 1276l37 223h1083l-36 -223h-428l-203 -1276h-238l203 1276h-418z" /> +<glyph unicode="U" horiz-adv-x="1339" d="M220 418q2 102 18 235l135 846h239l-137 -868q-16 -100 -17 -174q0 -102 32 -154q54 -90 227.5 -90t259.5 95t121 323l137 868h240l-134 -889q-51 -324 -201.5 -472t-451.5 -148q-82 0 -148.5 12t-127 42t-99.5 78t-67 122q-26 70 -26 164v10z" /> +<glyph unicode="V" horiz-adv-x="1392" d="M293 1499h250l182 -1169l573 1169h267l-754 -1499h-266z" /> +<glyph unicode="W" horiz-adv-x="2062" d="M293 1499h246l186 -1161l551 1161h258l-219 -450l110 -717l557 1167h254l-725 -1499h-260l-106 670l-328 -670h-272z" /> +<glyph unicode="X" horiz-adv-x="1286" d="M70 0l559 760l-326 739h256l232 -549l403 549h272l-573 -780l315 -719h-258l-219 526l-387 -526h-274z" /> +<glyph unicode="Y" horiz-adv-x="1325" d="M293 1499h256l205 -739l469 739h274l-661 -1010l-78 -489h-238l78 489z" /> +<glyph unicode="Z" horiz-adv-x="1144" d="M61 0l35 223l895 1053h-729l37 223h1024l-37 -223l-880 -1053h714l-35 -223h-1024z" /> +<glyph unicode="[" horiz-adv-x="673" d="M131 -192q-6 72 8 129l228 1413q29 170 110.5 250.5t272.5 80.5h163l-32 -208h-129q-63 0 -100.5 -35t-51.5 -127l-223 -1389q-18 -113 2 -149.5t94 -36.5h131l-33 -209h-174q-98 0 -160.5 42t-81 104.5t-24.5 134.5z" /> +<glyph unicode="\" horiz-adv-x="876" d="M283 1577h235l303 -1724h-235z" /> +<glyph unicode="]" horiz-adv-x="669" d="M-33 -473l33 209h129q63 0 100 34.5t54 127.5l219 1388q18 113 -3.5 150t-95.5 37h-129l35 208h166q94 0 156.5 -37.5t84 -96t30 -129t-6.5 -134.5l-217 -1425q-25 -162 -103.5 -247t-273.5 -85h-178z" /> +<glyph unicode="^" horiz-adv-x="792" d="M258 1087l272 275h189l160 -275h-172l-93 144l-149 -144h-207z" /> +<glyph unicode="_" horiz-adv-x="1378" d="M45 -2l35 209h1298l-35 -209h-1298z" /> +<glyph unicode="`" horiz-adv-x="512" d="M250 1368h221l178 -281h-170z" /> +<glyph unicode="a" horiz-adv-x="1107" d="M166 594q25 129 66.5 224t87 147.5t109 84t111.5 42t113 16.5q29 2 60 3q103 -1 225 -27q158 -34 231 -103l-143 -979h-180l-37 115q-45 -47 -147.5 -88t-200.5 -41q-318 0 -318 376q0 101 23 230zM396 281q30 -84 132 -84q92 0 158 24.5t143 75.5l89 586 q-105 32 -189 32q-41 0 -78 -8q-51 -10 -80.5 -22.5t-66.5 -48t-63 -108t-44 -187.5q-16 -89 -16 -155q0 -64 15 -105z" /> +<glyph unicode="b" horiz-adv-x="1136" d="M104 0l254 1608h236l-92 -580q182 76 360 76q113 0 181.5 -49t92 -139.5t23.5 -186.5t-20 -219q-20 -125 -49 -212t-78 -164q-49 -78 -129 -114q-72 -33 -168 -32h-21q-92 4 -190 44t-146 83l-65 -115h-189zM385 276q127 -77 291 -77h4q90 0 141 80.5t80 265.5 q20 109 20 185q1 51 -9 87q-22 88 -121 88q-170 0 -314 -45z" /> +<glyph unicode="c" horiz-adv-x="1009" d="M168 565q29 176 74 289t107.5 165t120.5 68.5t144 16.5q90 0 233.5 -17.5t246.5 -46.5l-25 -153q-225 16 -407 16q-57 0 -87 -8t-65 -42t-59.5 -109.5t-47.5 -204.5q-17 -103 -17 -172t17 -106q35 -73 144 -73l430 21l-25 -156q-196 -65 -476 -65h-25q-168 2 -250 142 q-51 88 -51 236q0 89 18 199z" /> +<glyph unicode="d" horiz-adv-x="1126" d="M159 288q-4 45 -4 93q0 88 13 186q20 123 48 211t78 167t130 119t190 40q182 0 344 -76l93 580h235l-256 -1608h-188l-31 115q-66 -45 -167 -86t-191 -41q-129 0 -206 86t-88 214zM408 545q-15 -89 -15 -155q0 -191 127 -191q166 0 318 77l92 584q-127 45 -299 45 q-82 0 -135 -74.5t-88 -285.5z" /> +<glyph unicode="e" horiz-adv-x="1077" d="M170 598q20 111 43 182.5t61.5 139t95 105.5t142.5 60.5t205 22.5q96 0 171 -15.5t135 -49t88 -95.5q21 -47 21 -111q0 -20 -2 -42q-10 -113 -63 -194t-130 -119t-163 -56q-70 -15 -138 -15q-15 0 -30 1q-82 4 -138 11t-79 17q-11 -62 -11 -108q0 -62 20 -92 q34 -54 145 -56q41 -3 85 -3q166 0 382 36l-27 -172q-207 -61 -456 -61q-45 0 -91 2q-195 6 -258 158q-34 81 -34 206q0 108 26 248zM412 600q18 -2 48 -5q18 -2 52 -2q23 0 55 1q78 2 139.5 16.5t117 55.5t65.5 104q3 19 3 36q0 54 -34 74q-42 26 -143 25h-15 q-82 0 -136 -21.5t-81.5 -66.5t-41 -87t-25.5 -106q-2 -16 -4 -24z" /> +<glyph unicode="f" horiz-adv-x="827" d="M174 893l27 158l190 36l21 119q35 223 117.5 312.5t261.5 89.5q147 0 249 -49l-22 -144h-203q-90 0 -119.5 -47t-54.5 -205l-12 -76h291l-31 -194h-291l-147 -893h-238l145 893h-184z" /> +<glyph unicode="g" horiz-adv-x="1136" d="M53 -508l25 158h485q78 0 134.5 50t70.5 144l35 226q-158 -78 -314 -78q-227 0 -293 156q-41 94 -41 237q0 92 17 205q82 514 469 514q291 0 557 -55l-194 -1225q-33 -203 -151 -301q-100 -83 -246 -83q-27 0 -56 3zM398 291q26 -100 141 -101q139 0 290 48l109 671h-276 q-195 0 -250 -344q-20 -132 -20 -208q0 -42 6 -66z" /> +<glyph unicode="h" horiz-adv-x="1120" d="M104 0l254 1604h238l-102 -637q160 94 236 117q74 22 153 22q169 0 233 -104q45 -73 45 -174q0 -43 -8 -91l-117 -737h-237l116 739q4 26 4 49q0 117 -120 117q-92 0 -159 -22.5t-171 -79.5l-127 -803h-238z" /> +<glyph unicode="i" horiz-adv-x="438" d="M100 0l172 1087h238l-172 -1087h-238zM283 1253l24 156q6 51 58 51h174q38 0 37 -35q0 -7 -1 -16l-22 -156q-6 -47 -55 -47h-174q-42 0 -42 37q0 5 1 10z" /> +<glyph unicode="j" horiz-adv-x="477" d="M33 -553l260 1640h237l-174 -1095q-51 -344 -153 -545h-170zM303 1253l25 156q6 51 57 51h174q40 0 40 -37q0 -7 -1 -14l-25 -156q-6 -47 -55 -47h-174q-42 0 -42 37q0 5 1 10z" /> +<glyph unicode="k" horiz-adv-x="1054" d="M104 0l254 1602h238l-147 -926q133 45 274 169t174 242h256q-49 -170 -178 -304t-250 -193l362 -590h-270l-315 518l-78 -2l-82 -516h-238z" /> +<glyph unicode="l" horiz-adv-x="616" d="M162 387l192 1217h238l-186 -1188q-13 -57 -13 -98q0 -20 3 -36q10 -48 25 -61.5t54 -25.5q125 -39 131 -39l-24 -156h-168q-262 0 -262 271q0 53 10 116z" /> +<glyph unicode="m" horiz-adv-x="1808" d="M104 0l172 1087h185l35 -122q6 4 41.5 25.5t44 26.5t40 22.5t45 21.5t43 15t51 14.5t51.5 7.5t60 4q96 0 165 -43t93 -115q227 158 441 158q155 0 225 -102q51 -74 50 -182q0 -41 -7 -87l-115 -731h-237l117 733q3 20 3 38q0 52 -26 85q-35 45 -96 45q-184 0 -330 -96 q0 -2 -5 -37t-5 -39l-117 -729h-237l116 733q3 20 3 38q0 52 -26 85q-34 45 -96 45q-92 0 -154.5 -21.5t-166.5 -80.5l-125 -799h-238z" /> +<glyph unicode="n" horiz-adv-x="1120" d="M104 0l172 1087h185l35 -120q82 51 118.5 70.5t113.5 44t155 24.5q169 0 233 -104q45 -73 45 -174q0 -43 -8 -91l-117 -737h-237l116 739q4 26 4 49q0 117 -120 117q-92 0 -159 -22.5t-171 -79.5l-127 -803h-238z" /> +<glyph unicode="o" horiz-adv-x="1146" d="M168 547q51 328 174 440.5t401 112.5q265 0 359 -142q62 -94 62 -259q0 -85 -17 -189q-49 -303 -166 -411.5t-395 -108.5q-270 0 -368 132q-66 89 -65 251q0 79 15 174zM392 376v-5q0 -59 10 -93q12 -36 42.5 -54.5t66.5 -24.5t93 -6q76 0 117 8t81 41.5t63.5 101.5 t43.5 184q18 109 18 182q0 79 -21 117q-40 72 -189 72q-78 0 -123 -11t-84 -51t-61.5 -112t-42.5 -197q-14 -90 -14 -152z" /> +<glyph unicode="p" horiz-adv-x="1140" d="M16 -553l265 1606q233 43 550 43q111 0 186 -50.5t103.5 -132.5t36.5 -187q2 -30 2 -61q0 -76 -14 -157q-35 -254 -145.5 -390t-319.5 -136q-199 0 -328 77l-98 -612h-238zM381 227q105 -50 211 -50q39 0 78 7q92 10 149.5 82t89.5 281q13 81 13 144q0 210 -148 210h-282 z" /> +<glyph unicode="q" horiz-adv-x="1132" d="M172 569q82 532 477 533q281 0 547 -55l-252 -1600h-237l96 612q-158 -79 -316 -79h-4q-221 0 -289 153q-40 92 -40 230q0 93 18 206zM388 356q-1 -14 -1 -27q0 -33 6 -51q8 -24 23.5 -51.5t46.5 -38t76 -10.5q139 0 290 47l107 682h-283q-192 0 -243 -354 q-10 -74 -14.5 -108.5t-7.5 -88.5z" /> +<glyph unicode="r" horiz-adv-x="862" d="M104 0l172 1087h193l23 -137q72 47 114.5 73t114.5 51.5t141 25.5q94 0 129 -15l-37 -231q-53 8 -153 8q-102 0 -178 -26.5t-164 -94.5l-117 -741h-238z" /> +<glyph unicode="s" horiz-adv-x="1040" d="M121 35l24 155h531q86 0 100 84l12 76q3 14 3 26q0 24 -11 38q-16 22 -65 22h-266q-273 0 -273 226q0 33 6 71l17 101q23 135 98.5 202.5t228.5 67.5q440 0 557 -47l-24 -158h-508q-102 0 -117 -90l-10 -74q2 -20 -3 -35.5t4 -24.5t10 -15.5t16.5 -8.5t18.5 -2h20h20h272 q141 0 205 -83q48 -62 49 -148q0 -28 -6 -58l-18 -127q-10 -63 -35 -110t-54.5 -73.5t-69.5 -42t-75 -19.5t-76 -4q-156 0 -345 13t-236 38z" /> +<glyph unicode="t" horiz-adv-x="770" d="M168 895l22 143l195 52l92 303h193l-47 -303h270l-31 -195h-270l-76 -479q-6 -70 -10 -109q-1 -9 -1 -17q0 -28 11 -46q14 -24 27.5 -32.5t42.5 -16.5q127 -39 133 -39l-25 -156h-176q-254 0 -254 269q0 54 10 118l80 508h-186z" /> +<glyph unicode="u" horiz-adv-x="1118" d="M143 352l115 735h238l-117 -739q-4 -28 -4 -51q-1 -52 21 -77q32 -36 102 -36q94 0 161.5 22.5t167.5 80.5l125 800h238l-172 -1087h-187l-30 119q-80 -49 -122 -71.5t-116 -44t-151 -21.5q-170 0 -233 101q-44 71 -44 174q0 45 8 95z" /> +<glyph unicode="v" horiz-adv-x="1079" d="M178 1087h252l152 -817l303 613q47 98 61 207h213q8 -38 8 -77q0 -94 -49 -196l-422 -817h-293z" /> +<glyph unicode="w" horiz-adv-x="1673" d="M178 1087h248l147 -808l306 600q47 98 61 206h205q11 -41 11 -82q0 -72 -32 -147l-43 -96l93 -475l313 598q47 98 61 207h207q10 -42 10 -84q0 -95 -51 -189l-446 -817h-256l-94 475l-238 -475h-277z" /> +<glyph unicode="x" horiz-adv-x="1136" d="M41 0l471 557l-299 530h281l184 -358l297 358h293l-471 -569l288 -518h-274l-182 348l-287 -348h-301z" /> +<glyph unicode="y" horiz-adv-x="1142" d="M180 1087h246l90 -792q10 -80 119 -80l317 670q37 80 54 207h213q11 -43 11 -87q0 -93 -48 -192l-387 -811q-240 -510 -602 -577v167q201 117 350 408q-100 0 -173 60.5t-89 197.5z" /> +<glyph unicode="z" horiz-adv-x="956" d="M82 2l31 207l624 670h-542l28 208h854l-28 -208l-609 -668h498l-33 -209h-823z" /> +<glyph unicode="{" horiz-adv-x="655" d="M127 559l31 189q41 2 57 3t49 9t50.5 28.5t21.5 53.5l76 481q57 358 481 358l-33 -208q-96 2 -149.5 -49.5t-73.5 -180.5l-66 -412q-25 -160 -219 -188q82 -14 126 -64.5t32 -121.5l-76 -473q-23 -143 14 -200.5t138 -53.5l-33 -203q-223 0 -307 121t-53 307l77 483 q10 57 -33.5 91t-109.5 30z" /> +<glyph unicode="|" horiz-adv-x="503" d="M125 -147l272 1724h209l-272 -1724h-209z" /> +<glyph unicode="}" horiz-adv-x="649" d="M-33 -473l33 203q94 -2 147.5 48t73.5 171l74 457q23 150 215 184q-84 10 -127 60t-29 130l68 426q25 154 -11 212.5t-137 54.5l35 208q215 0 298 -125.5t52 -312.5l-65 -448q-8 -57 37 -90t108 -31l-30 -187q-49 0 -79 -4t-61.5 -26.5t-38.5 -65.5l-81 -500 q-33 -190 -146 -277t-336 -87z" /> +<glyph unicode="~" horiz-adv-x="870" d="M274 1190q6 4 30 25.5t32 27.5t29.5 22.5t32 22.5t31 17.5t35.5 15.5t35.5 8t41.5 4q45 0 104.5 -35.5t99.5 -35.5q78 0 205 81l31 -108l-18 -17q-18 -17 -21.5 -20.5t-22 -19t-24.5 -20.5t-24.5 -18.5t-27.5 -17.5t-26.5 -13t-31 -12t-29 -6.5t-31.5 -3.5 q-47 0 -113.5 36t-105.5 36q-29 0 -56.5 -7t-45 -15.5t-49 -24.5t-50.5 -25z" /> +<glyph unicode="¢" horiz-adv-x="995" d="M152 565q25 145 60.5 246.5t75.5 159t97 87t108.5 37t124.5 5.5l33 198h158l-35 -206q174 -18 303 -56l-24 -151q-225 14 -408 14q-57 0 -87 -7t-64.5 -41t-59 -108.5t-47.5 -203.5q-35 -205 0 -278t143 -73l431 21l-25 -156q-150 -57 -340 -63l-27 -187h-157l28 185 q-174 4 -255.5 143t-32.5 434z" /> +<glyph unicode="£" horiz-adv-x="1202" d="M86 0l31 184l145 39l68 432h-140l21 127l147 41l31 205q18 113 47 194t73 132t86 80.5t111.5 44t121 17.5t139.5 3l381 -33l-29 -188h-381q-166 0 -226.5 -47t-84.5 -209l-31 -199l483 -32l-20 -136h-492l-67 -432h651l-37 -223h-1028z" /> +<glyph unicode="¥" horiz-adv-x="1273" d="M233 295l25 149h301l12 84h-301l27 152h248l-275 819h256l203 -676l463 676h283l-594 -819h290l-26 -152h-336l-12 -84h336l-25 -149h-332l-41 -295h-237l41 295h-306z" /> +<glyph unicode="¨" horiz-adv-x="921" d="M274 1192q8 47 47 80t86.5 33t75 -33t21.5 -80q-8 -47 -46 -81t-85 -34t-76 34t-23 81zM797 1192q8 47 47 80t86 33t75.5 -33t20.5 -80t-47 -81t-86 -34t-74.5 34t-21.5 81z" /> +<glyph unicode="©" horiz-adv-x="1638" d="M194.5 572.5q4.5 103.5 14.5 195.5q18 123 46 222.5t77 197.5t113.5 163.5t162 106.5t219.5 41h490q115 0 194.5 -50t117.5 -127t52.5 -183.5t8 -202.5t-22.5 -203q-55 -344 -200.5 -538.5t-370.5 -194.5h-490q-113 0 -196.5 51t-125.5 133t-68 183.5t-21.5 205zM366 464 q9 -132 75.5 -218t176.5 -86h492q133 0 237.5 147.5t151.5 446.5q14 90 21.5 156.5t4.5 153.5t-22.5 142.5t-69 94t-126.5 38.5h-504q-156 0 -265.5 -127.5t-160.5 -457.5q-20 -158 -11 -290zM578 760q41 246 131 340t233 94q172 0 363 -49l-21 -135q-170 25 -338 24 q-84 0 -131 -68.5t-74 -224.5q-20 -137 4.5 -208.5t114.5 -71.5q152 0 354 33l-20 -136q-172 -57 -387 -57q-133 0 -199.5 113t-29.5 346z" /> +<glyph unicode="«" horiz-adv-x="1167" d="M201 725l487 416l121 -140l-342 -292l250 -291l-152 -119zM623 725l487 416l121 -140l-342 -292l250 -291l-152 -119z" /> +<glyph unicode="­" horiz-adv-x="724" d="M123 489l35 209h643l-35 -209h-643z" /> +<glyph unicode="®" horiz-adv-x="1638" d="M194.5 572.5q4.5 103.5 14.5 195.5q18 123 46 222.5t77 197.5t113.5 163.5t162 106.5t219.5 41h490q115 0 194.5 -50t117.5 -127t52.5 -183.5t8 -202.5t-22.5 -203q-55 -344 -200.5 -538.5t-370.5 -194.5h-490q-113 0 -196.5 51t-125.5 133t-68 183.5t-21.5 205zM366 464 q9 -132 75.5 -218t176.5 -86h492q133 0 237.5 147.5t151.5 446.5q14 90 21.5 156.5t4.5 153.5t-22.5 142.5t-69 94t-126.5 38.5h-504q-156 0 -265.5 -127.5t-160.5 -457.5q-20 -158 -11 -290zM561 313l139 875h369q109 0 180.5 -62.5t50.5 -214.5q-8 -63 -26.5 -110 t-34.5 -70.5t-52 -43t-48.5 -22.5t-53.5 -14l127 -338h-182l-123 334l-123 25l-57 -359h-166zM803 791h188q80 0 105.5 23.5t38.5 103.5q6 39 0.5 62.5t-23.5 32.5t-35.5 12t-48.5 3h-186z" /> +<glyph unicode="´" horiz-adv-x="495" d="M207 1087l242 281h231l-303 -281h-170z" /> +<glyph unicode="¸" horiz-adv-x="503" d="M29 -360l18 104l100 31q43 16 60.5 50t28.5 99h172q-25 -160 -82.5 -222t-184.5 -62h-112z" /> +<glyph unicode="»" horiz-adv-x="1161" d="M156 440l344 297l-242 281l143 123l363 -422l-485 -420zM582 440l344 297l-242 281l145 123l361 -422l-483 -420z" /> +<glyph unicode="À" horiz-adv-x="1386" d="M78 0l760 1499h262l264 -1499h-242l-67 362h-531l-184 -362h-262zM627 580h399l-100 606zM676 1913h219l180 -281h-170z" /> +<glyph unicode="Â" horiz-adv-x="1386" d="M78 0l760 1499h262l264 -1499h-242l-67 362h-531l-184 -362h-262zM627 580h399l-100 606zM680 1632l272 273h189l159 -273h-165l-99 148l-162 -148h-194z" /> +<glyph unicode="Æ" horiz-adv-x="2009" d="M51 0l783 1200q59 90 121.5 150.5t120 89t121 45t122.5 15.5t125 -1q557 -20 639 -33l-31 -194h-602q-37 0 -59.5 -8.5t-35 -27.5t-16.5 -33.5t-10 -41.5l-49 -307l614 -23l-30 -192l-623 -21l-45 -294q-6 -39 0 -62.5t27.5 -32t37 -10.5t46.5 -2h579l-33 -190 q-74 -10 -624 -35q-55 -4 -107.5 8t-97.5 40t-67.5 82t-10.5 128l27 176h-373l-281 -426h-268zM737 641h271l92 557z" /> +<glyph unicode="Ç" horiz-adv-x="1173" d="M195.5 483q-9.5 141 21.5 293q31 190 74 319.5t113.5 227.5t178 145.5t257.5 47.5q252 0 506 -70l-31 -186q-246 35 -463 32q-119 -2 -175 -35q-155 -93 -220 -507q-43 -262 4 -396.5t211 -142.5q158 -4 485 16l-29 -186q-184 -57 -524 -53q-139 0 -231 66.5t-130 177 t-47.5 251.5zM371 -360l16 106l100 31q43 12 60.5 46t27.5 101h175q-25 -160 -83.5 -222t-185.5 -62h-110z" /> +<glyph unicode="È" d="M176 287l148 925q47 297 348 287q553 -20 635 -33l-31 -194h-598q-37 0 -61.5 -9.5t-37 -27.5t-17.5 -34.5t-9 -43.5l-47 -295l612 -20l-31 -195l-618 -18l-47 -301q-6 -39 0 -62.5t27.5 -32t37 -10.5t45.5 -2h580l-33 -192l-626 -35q-127 -6 -214.5 63.5t-62.5 229.5z M565 1901h221l179 -279h-170z" /> +<glyph unicode="É" d="M176 287l148 925q47 297 348 287q553 -20 635 -33l-31 -194h-598q-37 0 -61.5 -9.5t-37 -27.5t-17.5 -34.5t-9 -43.5l-47 -295l612 -20l-31 -195l-618 -18l-47 -301q-6 -39 0 -62.5t27.5 -32t37 -10.5t45.5 -2h580l-33 -192l-626 -35q-127 -6 -214.5 63.5t-62.5 229.5z M795 1622l241 279h230l-303 -279h-168z" /> +<glyph unicode="Ê" d="M176 287l148 925q47 297 348 287q553 -20 635 -33l-31 -194h-598q-37 0 -61.5 -9.5t-37 -27.5t-17.5 -34.5t-9 -43.5l-47 -295l612 -20l-31 -195l-618 -18l-47 -301q-6 -39 0 -62.5t27.5 -32t37 -10.5t45.5 -2h580l-33 -192l-626 -35q-127 -6 -214.5 63.5t-62.5 229.5z M571 1622l271 274h188l160 -274h-170l-92 143l-150 -143h-207z" /> +<glyph unicode="Ë" d="M176 287l148 925q47 297 348 287q553 -20 635 -33l-31 -194h-598q-37 0 -61.5 -9.5t-37 -27.5t-17.5 -34.5t-9 -43.5l-47 -295l612 -20l-31 -195l-618 -18l-47 -301q-6 -39 0 -62.5t27.5 -32t37 -10.5t45.5 -2h580l-33 -192l-626 -35q-127 -6 -214.5 63.5t-62.5 229.5z M504 1726.5q8 47.5 47 80t86 32.5t74.5 -32.5t19.5 -80.5q-6 -47 -45 -80.5t-86 -33.5t-75.5 33.5t-20.5 81zM1026 1726.5q8 47.5 47 80t86 32.5t75 -32.5t19 -80.5q-6 -47 -45 -80.5t-86 -33.5t-75.5 33.5t-20.5 81z" /> +<glyph unicode="Î" horiz-adv-x="499" d="M152 0l237 1499h238l-238 -1499h-237zM219 1632l273 273h188l160 -273h-166l-99 148l-161 -148h-195z" /> +<glyph unicode="Ï" horiz-adv-x="499" d="M152 0l237 1499h238l-238 -1499h-237zM172 1747q8 47 47 80t86 33t76 -33t20.5 -80t-46.5 -81t-85 -34t-75.5 34t-22.5 81zM694 1747q8 47 47 80t86 33t76 -33t20.5 -80t-46 -81t-85 -34t-76 34t-22.5 81z" /> +<glyph unicode="Ô" horiz-adv-x="1363" d="M196.5 501q1.5 114 24.5 257q23 147 55.5 262t69.5 194.5t88 134t98.5 86t117 48t129 21.5t145.5 5q82 0 144 -7t124.5 -28.5t104.5 -58.5t76 -96t48.5 -141t12.5 -197t-25 -260q-25 -162 -61.5 -283t-87 -200.5t-103.5 -129t-130 -75t-147.5 -33.5t-170.5 -8 q-82 0 -142.5 6t-123 26.5t-105.5 54.5t-78 91t-50 137t-13.5 194zM434 511q-2 -91 11.5 -151.5t53.5 -91t93 -42t139 -11.5q133 0 212 38t136.5 153.5t91.5 332.5q25 154 24 257.5t-16.5 160.5t-61.5 86t-91 36t-125 7q-86 0 -132 -6t-101.5 -34.5t-88 -86t-64 -161 t-56.5 -259.5q-23 -137 -25 -228zM633 1632l272 273h189l159 -273h-166l-98 148l-162 -148h-194z" /> +<glyph unicode="Ù" horiz-adv-x="1339" d="M220.5 418.5q1.5 101.5 17.5 234.5l135 846h239l-137 -868q-39 -238 14.5 -328t227.5 -90t260 95t121 323l137 868h240l-134 -889q-51 -324 -201.5 -472t-451.5 -148q-82 0 -148.5 12t-127 42t-99.5 78t-66.5 121.5t-26 175zM631 1913h219l180 -281h-170z" /> +<glyph unicode="Û" horiz-adv-x="1339" d="M220.5 418.5q1.5 101.5 17.5 234.5l135 846h239l-137 -868q-39 -238 14.5 -328t227.5 -90t260 95t121 323l137 868h240l-134 -889q-51 -324 -201.5 -472t-451.5 -148q-82 0 -148.5 12t-127 42t-99.5 78t-66.5 121.5t-26 175zM635 1632l272 273h189l159 -273h-165l-99 148 l-162 -148h-194z" /> +<glyph unicode="Ü" horiz-adv-x="1339" d="M220.5 418.5q1.5 101.5 17.5 234.5l135 846h239l-137 -868q-39 -238 14.5 -328t227.5 -90t260 95t121 323l137 868h240l-134 -889q-51 -324 -201.5 -472t-451.5 -148q-82 0 -148.5 12t-127 42t-99.5 78t-66.5 121.5t-26 175zM588 1747q8 47 47 80t86 33t75.5 -33 t20.5 -80t-46 -81t-85 -34t-75.5 34t-22.5 81zM1110 1747q8 47 47 80t86 33t76 -33t20.5 -80t-46.5 -81t-85 -34t-75.5 34t-22.5 81z" /> +<glyph unicode="à" horiz-adv-x="1107" d="M166 594q25 129 66.5 224t87 147.5t109 84t111.5 42t113 16.5q127 10 285 -23.5t231 -103.5l-143 -979h-180l-37 115q-45 -47 -147.5 -88t-200.5 -41q-404 0 -295 606zM396 281q30 -84 132 -84q92 0 158 24.5t143 75.5l89 586q-156 47 -267 24q-51 -10 -80.5 -22.5 t-66.5 -48t-63 -108t-44 -187.5q-31 -176 -1 -260zM414 1513h219l180 -280h-170z" /> +<glyph unicode="â" horiz-adv-x="1107" d="M166 594q25 129 66.5 224t87 147.5t109 84t111.5 42t113 16.5q127 10 285 -23.5t231 -103.5l-143 -979h-180l-37 115q-45 -47 -147.5 -88t-200.5 -41q-404 0 -295 606zM396 281q30 -84 132 -84q92 0 158 24.5t143 75.5l89 586q-156 47 -267 24q-51 -10 -80.5 -22.5 t-66.5 -48t-63 -108t-44 -187.5q-31 -176 -1 -260zM418 1233l272 274h189l159 -274h-166l-98 147l-162 -147h-194z" /> +<glyph unicode="æ" horiz-adv-x="1777" d="M109 594q27 133 68.5 229.5t84.5 147.5t104.5 82.5t106.5 40t113 14.5q94 8 220 -12.5t206 -63.5q117 76 317 76q451 0 422 -313q-12 -135 -86 -223.5t-170 -119t-202.5 -37.5t-178.5 3t-102 22q-25 -147 8 -200.5t143 -55.5q188 -12 463 33l-29 -172q-244 -72 -538 -59 q-184 6 -252 143q-57 -63 -179 -103t-225 -40q-182 0 -267.5 146.5t-26.5 461.5zM334.5 281q27.5 -84 136.5 -86q88 0 174 23.5t121 62.5q-12 119 25 317q35 184 83 279q-178 49 -282 30q-49 -10 -79 -23.5t-66.5 -49t-62.5 -108t-44 -187.5q-33 -174 -5.5 -258zM1032 600 q8 -2 24.5 -3t62.5 -3t89 0t96.5 13t94.5 28.5t72.5 52.5t39.5 82q14 82 -30.5 109.5t-157.5 25.5q-68 0 -117 -17.5t-75.5 -39t-47 -66.5t-27.5 -73.5t-20 -87.5q-2 -15 -4 -21z" /> +<glyph unicode="ç" horiz-adv-x="1011" d="M172 565q25 141 60.5 241.5t73.5 157t92.5 88t102.5 40t115 8.5q264 0 480 -64l-25 -151q-225 14 -407 14q-57 0 -87 -7t-65 -41t-58.5 -108.5t-45.5 -203.5q-37 -205 -2.5 -278t145.5 -73q84 0 190.5 5.5t171.5 10.5l66 5l-25 -156q-80 -33 -177 -48t-148 -16t-174 -1 q-168 2 -251 143t-32 434zM276 -362l17 106l102 31q43 16 59.5 49t26.5 100h174q-25 -160 -82 -223t-186 -63h-111z" /> +<glyph unicode="è" horiz-adv-x="1077" d="M170 598q20 111 43 182.5t61.5 139t95 105.5t142.5 60.5t205 22.5q96 0 171 -15.5t135 -49t88 -96t19 -152.5q-10 -113 -63 -194t-130 -119t-163 -56t-168 -14t-138 11t-79 17q-25 -147 9 -200.5t145 -55.5q193 -12 467 33l-27 -172q-244 -72 -547 -59q-195 6 -258 158.5 t-8 453.5zM412 600q18 -2 47.5 -5t107.5 -1t139.5 16.5t117 55.5t65.5 104q14 82 -31 109.5t-158 25.5q-82 0 -136 -21.5t-81.5 -66.5t-41 -87t-25.5 -106q-2 -16 -4 -24zM424 1511h221l178 -280h-170z" /> +<glyph unicode="é" horiz-adv-x="1077" d="M170 598q20 111 43 182.5t61.5 139t95 105.5t142.5 60.5t205 22.5q96 0 171 -15.5t135 -49t88 -96t19 -152.5q-10 -113 -63 -194t-130 -119t-163 -56t-168 -14t-138 11t-79 17q-25 -147 9 -200.5t145 -55.5q193 -12 467 33l-27 -172q-244 -72 -547 -59q-195 6 -258 158.5 t-8 453.5zM412 600q18 -2 47.5 -5t107.5 -1t139.5 16.5t117 55.5t65.5 104q14 82 -31 109.5t-158 25.5q-82 0 -136 -21.5t-81.5 -66.5t-41 -87t-25.5 -106q-2 -16 -4 -24zM653 1231l244 280h229l-303 -280h-170z" /> +<glyph unicode="ê" horiz-adv-x="1077" d="M170 598q20 111 43 182.5t61.5 139t95 105.5t142.5 60.5t205 22.5q96 0 171 -15.5t135 -49t88 -96t19 -152.5q-10 -113 -63 -194t-130 -119t-163 -56t-168 -14t-138 11t-79 17q-25 -147 9 -200.5t145 -55.5q193 -12 467 33l-27 -172q-244 -72 -547 -59q-195 6 -258 158.5 t-8 453.5zM412 600q18 -2 47.5 -5t107.5 -1t139.5 16.5t117 55.5t65.5 104q14 82 -31 109.5t-158 25.5q-82 0 -136 -21.5t-81.5 -66.5t-41 -87t-25.5 -106q-2 -16 -4 -24zM430 1231l270 272h189l160 -272h-166l-99 147l-161 -147h-193z" /> +<glyph unicode="ë" horiz-adv-x="1077" d="M170 598q20 111 43 182.5t61.5 139t95 105.5t142.5 60.5t205 22.5q96 0 171 -15.5t135 -49t88 -96t19 -152.5q-10 -113 -63 -194t-130 -119t-163 -56t-168 -14t-138 11t-79 17q-25 -147 9 -200.5t145 -55.5q193 -12 467 33l-27 -172q-244 -72 -547 -59q-195 6 -258 158.5 t-8 453.5zM383 1346q6 47 45 79.5t86 32.5t75.5 -32.5t20.5 -80t-46 -81t-85 -33.5t-75.5 34t-20.5 81zM412 600q18 -2 47.5 -5t107.5 -1t139.5 16.5t117 55.5t65.5 104q14 82 -31 109.5t-158 25.5q-82 0 -136 -21.5t-81.5 -66.5t-41 -87t-25.5 -106q-2 -16 -4 -24z M905 1346q6 47 45 79.5t86 32.5t76 -32.5t20.5 -80t-46 -81t-85 -33.5t-76 34t-20.5 81z" /> +<glyph unicode="î" horiz-adv-x="438" d="M90 1223l270 274h189l162 -274h-168l-97 147l-161 -147h-195zM94 0l172 1087h238l-172 -1087h-238z" /> +<glyph unicode="ï" horiz-adv-x="438" d="M39 1337q6 47 46 81t87 34t74.5 -34t19.5 -81t-46 -80.5t-85 -33.5t-75.5 33.5t-20.5 80.5zM94 0l172 1087h238l-172 -1087h-238zM561 1337q6 47 46 81t87 34t75 -34t19.5 -81t-46 -80.5t-85 -33.5t-76 33.5t-20.5 80.5z" /> +<glyph unicode="ô" horiz-adv-x="1146" d="M168 547q51 328 174 440.5t401 112.5q264 0 358.5 -142.5t45.5 -447.5q-49 -303 -166 -411.5t-395 -108.5q-270 0 -367.5 132t-50.5 425zM391.5 376.5q-0.5 -61.5 11 -98t42 -55t66.5 -24.5t93 -6q76 0 117 8t81 41.5t63.5 101.5t43.5 184q37 227 -3 299t-189 72 q-78 0 -123 -11t-84 -51t-61.5 -112t-42.5 -197q-14 -90 -14.5 -151.5zM442 1223l273 274h188l160 -274h-166l-98 147l-162 -147h-195z" /> +<glyph unicode="ù" horiz-adv-x="1118" d="M143 352l115 735h238l-117 -739q-14 -92 17.5 -128t101.5 -36q94 0 161.5 22.5t167.5 80.5l125 800h238l-172 -1087h-187l-30 119q-80 -49 -122 -71.5t-116 -44t-151 -21.5q-170 0 -233 101t-36 269zM432 1503h219l180 -280h-169z" /> +<glyph unicode="û" horiz-adv-x="1118" d="M143 352l115 735h238l-117 -739q-14 -92 17.5 -128t101.5 -36q94 0 161.5 22.5t167.5 80.5l125 800h238l-172 -1087h-187l-30 119q-80 -49 -122 -71.5t-116 -44t-151 -21.5q-170 0 -233 101t-36 269zM436 1223l273 274h188l160 -274h-166l-98 147l-162 -147h-195z" /> +<glyph unicode="ü" horiz-adv-x="1118" d="M143 352l115 735h238l-117 -739q-14 -92 17.5 -128t101.5 -36q94 0 161.5 22.5t167.5 80.5l125 800h238l-172 -1087h-187l-30 119q-80 -49 -122 -71.5t-116 -44t-151 -21.5q-170 0 -233 101t-36 269zM389 1337q8 47 47 81t86 34t75 -34t19 -81q-6 -47 -45 -80.5 t-86 -33.5t-75.5 33.5t-20.5 80.5zM911.5 1337q8.5 47 47 81t86 34t75 -34t19.5 -81q-6 -47 -45 -80.5t-86 -33.5t-76 33.5t-20.5 80.5z" /> +<glyph unicode="ÿ" horiz-adv-x="1142" d="M180 1087h246l90 -792q10 -80 119 -80l317 670q37 80 54 207h213q33 -133 -37 -279l-387 -811q-240 -510 -602 -577v167q201 117 350 408q-100 0 -173 60.5t-89 197.5zM373 1315q8 47 47 79.5t86 32.5t75.5 -32.5t20.5 -79.5t-46 -81t-85 -34t-75.5 34t-22.5 81z M897 1315q6 47 45 79.5t86 32.5t76 -32.5t20.5 -79.5t-46.5 -81t-85 -34t-75.5 34t-20.5 81z" /> +<glyph unicode="Œ" horiz-adv-x="2152" d="M165.5 501q1.5 114 24.5 257q23 147 56 262t69.5 193.5t88 134t99.5 87t117.5 48t128 21.5t144.5 5q297 0 401 -135q78 135 277 125q555 -20 637 -33l-31 -194h-598q-37 0 -61.5 -9.5t-37 -27.5t-17.5 -34.5t-9 -43.5l-47 -295l612 -20l-28 -195l-621 -18l-47 -301 q-6 -39 0 -62.5t27.5 -32t37 -10.5t46.5 -2h577l-31 -192l-626 -35q-74 -4 -139.5 24.5t-98.5 90.5q-80 -68 -183.5 -92.5t-252.5 -24.5q-82 0 -142.5 6t-124 26.5t-106.5 54.5t-77.5 91t-50 137t-14 194zM403 511q-2 -91 11.5 -151.5t53.5 -91t93 -42t139 -11.5 q135 0 213 38t135.5 152.5t92.5 333.5q20 129 25 221.5t-8 151.5t-33.5 95t-63.5 53.5t-82 21.5t-107 4q-72 0 -112.5 -4t-89.5 -20.5t-79 -51t-62.5 -95t-56.5 -153t-44 -223.5q-23 -137 -25 -228z" /> +<glyph unicode="œ" horiz-adv-x="1828" d="M154 551q51 326 173 437.5t402 111.5q248 0 338 -133q119 141 397 141q96 0 171 -15.5t135.5 -49t88 -96t19.5 -152.5q-10 -113 -63.5 -194t-130 -119t-162.5 -56t-168 -14t-138.5 11t-78.5 17q-25 -147 8 -201.5t143 -54.5q266 0 469 33l-28 -172q-242 -72 -547 -59 q-162 2 -224 116q-115 -113 -387 -112q-270 0 -367 133t-50 428zM377 376.5q0 -61.5 11 -98t42 -55t66.5 -24.5t93.5 -6q76 0 117 8t80.5 41.5t63 101.5t44.5 184q37 227 -3 299t-190 72q-78 0 -122.5 -11t-83.5 -51t-62 -112t-43 -197q-14 -90 -14 -151.5zM1157 600 q8 -2 24.5 -3t62.5 -3t89 0t96.5 13t94.5 28.5t72.5 52.5t39.5 82q12 82 -31.5 109.5t-156.5 25.5q-68 0 -117 -17.5t-75.5 -39t-47 -66.5t-27.5 -73.5t-20 -87.5q-2 -15 -4 -21z" /> +<glyph unicode="Ÿ" horiz-adv-x="1325" d="M236 1499h256l204 -739l469 739h275l-662 -1010l-78 -489h-237l78 489zM502 1741q8 47 47 79.5t86 32.5t74.5 -32.5t19.5 -79.5q-6 -47 -45 -81t-86 -34t-75.5 34t-20.5 81zM1024 1741q8 47 47 79.5t86 32.5t75 -32.5t19 -79.5q-6 -47 -45 -81t-86 -34t-75.5 34t-20.5 81 z" /> +<glyph unicode="ˆ" horiz-adv-x="659" d="M115 1087l270 273h188l160 -273h-166l-98 148l-160 -148h-194z" /> +<glyph unicode="˚" horiz-adv-x="581" d="M274 1294q8 88 74 148.5t152 60.5t142 -60.5t48 -148.5t-72.5 -147.5t-150.5 -59.5t-143.5 60.5t-49.5 146.5zM385 1294q-2 -39 23.5 -67.5t66.5 -28.5q39 0 69.5 27.5t35 68.5t-22.5 70t-65.5 29t-70.5 -29t-36 -70z" /> +<glyph unicode="˜" horiz-adv-x="878" d="M258 1190q164 139 268 139q53 -2 114.5 -37t90.5 -35q41 -2 110.5 26t94.5 48l29 -108q-6 -6 -28 -22.5t-31 -24t-29.5 -22.5t-33 -21.5t-31.5 -16.5t-33.5 -15t-33 -8t-36.5 -3q-55 0 -118 34.5t-97 34.5q-25 0 -46.5 -4t-45 -13t-35 -14.5t-40 -20.5t-36.5 -20z" /> +<glyph unicode=" " horiz-adv-x="956" /> +<glyph unicode=" " horiz-adv-x="1913" /> +<glyph unicode=" " horiz-adv-x="956" /> +<glyph unicode=" " horiz-adv-x="1913" /> +<glyph unicode=" " horiz-adv-x="637" /> +<glyph unicode=" " horiz-adv-x="478" /> +<glyph unicode=" " horiz-adv-x="318" /> +<glyph unicode=" " horiz-adv-x="318" /> +<glyph unicode=" " horiz-adv-x="239" /> +<glyph unicode=" " horiz-adv-x="382" /> +<glyph unicode=" " horiz-adv-x="106" /> +<glyph unicode="‐" horiz-adv-x="724" d="M123 489l35 209h643l-35 -209h-643z" /> +<glyph unicode="‑" horiz-adv-x="724" d="M123 489l35 209h643l-35 -209h-643z" /> +<glyph unicode="‒" horiz-adv-x="724" d="M123 489l35 209h643l-35 -209h-643z" /> +<glyph unicode="–" horiz-adv-x="929" d="M123 483l33 211h968l-32 -211h-969z" /> +<glyph unicode="—" horiz-adv-x="1507" d="M123 487l35 211h1425l-35 -211h-1425z" /> +<glyph unicode="‘" horiz-adv-x="536" d="M311 1075l37 246q28 178 210 187q70 -4 71 -5l-17 -98q-66 0 -77 -68l-9 -49h25q53 0 45 -53l-25 -160q-8 -59 -65 -59h-154q-51 0 -41 59z" /> +<glyph unicode="’" horiz-adv-x="536" d="M313 1020l15 98q66 0 78 68l8 47h-25q-53 0 -45 55l27 160q8 59 63 59h154q53 0 43 -59l-39 -246q-10 -66 -43 -108.5t-72 -57t-77 -19.5t-62 -1z" /> +<glyph unicode="‚" horiz-adv-x="536" d="M115 -215l16 98q66 -2 78 70l8 45h-24q-53 0 -46 55l27 162q10 59 64 59h153q55 0 43 -59l-39 -248q-30 -178 -210 -186z" /> +<glyph unicode="“" horiz-adv-x="860" d="M299 1073l37 246q10 66 43 108.5t71.5 57t75.5 19.5t63 1l25 -4l-14 -98q-66 2 -78 -68l-8 -49h25q53 0 45 -53l-25 -160q-10 -59 -65 -59h-154q-51 0 -41 59zM647 1073l39 246q10 66 43 108.5t72 57t75.5 19.5t62.5 1l26 -4l-15 -98q-68 2 -80 -68l-6 -49h25 q53 0 45 -53l-25 -160q-10 -59 -65 -59h-154q-51 0 -43 59z" /> +<glyph unicode="”" horiz-adv-x="860" d="M299 1018l16 100q66 -2 78 68l6 45h-22q-25 0 -38 14.5t-9 40.5l26 162q10 59 64 59h153q53 0 45 -59l-40 -248q-10 -66 -43 -108.5t-72 -57t-76 -19.5t-62 -1zM649 1018l17 100q63 -2 75 68l9 45h-25q-53 0 -45 55l27 162q10 59 63 59h154q55 0 43 -59l-39 -248 q-10 -66 -43 -108.5t-72 -57t-76 -19.5t-62 -1z" /> +<glyph unicode="„" horiz-adv-x="858" d="M102 -213l17 98q63 -2 76 68l8 47h-25q-23 0 -36 14.5t-9 40.5l27 160q10 59 63 59h154q53 0 43 -59l-39 -246q-10 -66 -43 -108.5t-72 -57t-75.5 -19.5t-62.5 -1zM453 -213l14 98q66 -2 78 68l8 47h-25q-53 0 -45 55l27 160q10 59 63 59h154q53 0 43 -59l-39 -246 q-10 -66 -43 -108.5t-71.5 -57t-76.5 -19.5t-63 -1z" /> +<glyph unicode="…" horiz-adv-x="1589" d="M283 47l24 160q6 51 58 51h151q53 0 43 -51l-24 -160q-10 -47 -60 -47h-151q-47 0 -41 47zM840 47l24 160q6 51 58 51h151q53 0 43 -51l-24 -160q-10 -47 -60 -47h-151q-47 0 -41 47zM1397 47l24 160q6 51 58 51h151q53 0 43 -51l-24 -160q-10 -47 -60 -47h-151 q-47 0 -41 47z" /> +<glyph unicode=" " horiz-adv-x="382" /> +<glyph unicode="‹" horiz-adv-x="598" d="M53 725l488 416l121 -140l-334 -286l241 -283l-151 -133z" /> +<glyph unicode="›" horiz-adv-x="733" d="M201 440l336 287l-240 283l152 131l360 -422l-490 -420z" /> +<glyph unicode=" " horiz-adv-x="478" /> +<glyph unicode="€" horiz-adv-x="1452" d="M125 516l20 123l168 16l27 164l-164 17l19 114l167 21q8 47 13.5 77.5t25 93t43 106.5t68.5 98.5t101.5 88t142.5 57.5t188 24q88 0 248 -20.5t264 -49.5l-29 -176q-307 29 -475 28q-102 0 -168.5 -23.5t-102.5 -75.5t-51.5 -98t-29.5 -130l477 -17l-18 -123l-481 -12 l-27 -164l477 -16l-20 -123q-31 0 -81 -2t-156.5 -5t-176.5 -5t-68 -4q-29 -178 39 -240.5t213 -62.5l494 41l-27 -172q-225 -78 -543 -78q-39 0 -75.5 4t-88 16t-89 35t-78.5 60.5t-59.5 92t-31 130t8.5 174.5z" /> +<glyph unicode="™" horiz-adv-x="1292" d="M84 1348l25 151h559l-25 -151h-194l-89 -564h-167l88 564h-197zM606 784l182 715h164l76 -442l195 442h182l-35 -715h-168l27 392l-162 -392h-143l-60 392l-92 -392h-166z" /> +<glyph unicode="" horiz-adv-x="1085" d="M0 1085h1085v-1085h-1085v1085z" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-DemiBold-Italic-webfont.ttf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-DemiBold-Italic-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..49826ebb17fc88e1971b64d734bb31f1155209b4 Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-DemiBold-Italic-webfont.ttf differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-DemiBold-Italic-webfont.woff b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-DemiBold-Italic-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..06a435866e71f650e1f9fdf5fb0210529f7685f0 Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-DemiBold-Italic-webfont.woff differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-DemiBold-webfont.eot b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-DemiBold-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..3efd25910a2905d13b3361c5163a9cabb80334d3 Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-DemiBold-webfont.eot differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-DemiBold-webfont.svg b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-DemiBold-webfont.svg new file mode 100644 index 0000000000000000000000000000000000000000..55c931d3321de79839bb6238f2e12f5dc773dfe7 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-DemiBold-webfont.svg @@ -0,0 +1,187 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Copyright c 2011 Natanael Gama exondiscoveredcom with Reserved Font Name Exo +Designer : Natanael Gama +</metadata> +<defs> +<font id="ExoDemiBold" horiz-adv-x="1161" > +<font-face units-per-em="2048" ascent="1638" descent="-410" /> +<missing-glyph horiz-adv-x="512" /> +<glyph unicode=" " horiz-adv-x="512" /> +<glyph unicode="	" horiz-adv-x="512" /> +<glyph unicode=" " horiz-adv-x="512" /> +<glyph unicode="!" horiz-adv-x="555" d="M147 47v160q0 51 50 51h155q47 0 47 -51v-160q0 -47 -47 -47h-155q-50 0 -50 47zM150 1497h251l-24 -1096h-205z" /> +<glyph unicode=""" horiz-adv-x="860" d="M147 1362v137h232v-137l-21 -275h-188zM483 1362v137h232v-137l-21 -275h-188z" /> +<glyph unicode="#" horiz-adv-x="1449" d="M35 446l24 164h318l45 281h-318l27 164h322l75 444h164l-76 -444h283l74 444h164l-74 -444h356l-26 -164h-357l-45 -283h357l-25 -164h-365l-75 -444h-164l76 444l-285 2l-76 -446h-164l76 446h-311zM541 610l286 -2l45 283h-286z" /> +<glyph unicode="$" horiz-adv-x="1169" d="M96 1001v132q2 203 106.5 288.5t289.5 89.5v177h155v-181q170 -10 375 -51v-186q-375 20 -471 20q-111 4 -164 -29.5t-53 -142.5v-96q0 -164 180 -164h219q344 0 344 -381v-115q0 -113 -36.5 -191.5t-100 -118.5t-135.5 -55t-158 -13v-168h-155v174q-199 14 -349 51v182 q328 -16 482 -16q215 0 215 149v103q0 80 -33 121t-117 41h-215q-94 0 -165.5 26.5t-111.5 66.5t-63.5 94t-31 99t-7.5 94z" /> +<glyph unicode="%" horiz-adv-x="1964" d="M74 979v258q0 135 60.5 198.5t209.5 63.5h207q145 0 206.5 -64.5t61.5 -197.5v-258q0 -137 -61.5 -200.5t-210.5 -63.5h-207q-145 0 -205.5 63.5t-60.5 200.5zM250 999q0 -61 22.5 -84.5t85.5 -23.5h170q72 0 93.5 23.5t21.5 84.5v215q0 66 -23.5 87.5t-87.5 21.5h-170 q-68 0 -90 -22.5t-22 -86.5v-215zM440 0l908 1499h184l-903 -1499h-189zM1147 268v258q0 135 60.5 198.5t209.5 63.5h209q145 0 205.5 -63t60.5 -199v-258q0 -137 -60 -200.5t-210 -63.5h-209q-145 0 -205.5 64.5t-60.5 199.5zM1323 289q0 -61 22.5 -85t86.5 -24h172 q72 0 92 23.5t20 85.5v215q0 66 -23.5 87t-84.5 21h-172q-68 0 -90.5 -21.5t-22.5 -86.5v-215z" /> +<glyph unicode="&" horiz-adv-x="1359" d="M63.5 479.5q26.5 155.5 163.5 274.5l156 133l-115 160q-78 113 -65.5 209t76 162.5t145.5 76.5q250 33 559 -41v-170h-365q-125 0 -148.5 -50t60.5 -169l396 -537l243 238l80 -96l-114 -219l-80 -91l264 -360h-279l-153 209l-139 -127q-76 -68 -187.5 -87.5t-228.5 25 t-189 148.5q-106 156 -79.5 311.5zM340 301q53 -68 131 -85t156 46l125 119l-248 330l-125 -107q-164 -141 -39 -303z" /> +<glyph unicode="'" horiz-adv-x="428" d="M96 1362v137h240v-137l-21 -275h-196z" /> +<glyph unicode="(" horiz-adv-x="741" d="M129 668q0 176 36 353t87 304t102.5 229.5t86.5 154.5l36 52h230q-14 -20 -37 -59t-81.5 -161t-103.5 -243.5t-81.5 -296t-36.5 -333.5q0 -497 259 -967q46 -83 81 -131h-230q-14 16 -37.5 47t-83 136.5t-105.5 223t-84 306t-38 385.5z" /> +<glyph unicode=")" horiz-adv-x="741" d="M35 -430q14 18 36.5 54t81 150.5t103.5 236.5t82 301.5t37 355.5q0 458 -266 963l-74 130h229q14 -18 38 -54t83 -149.5t105.5 -234.5t84 -300t37.5 -355q0 -546 -256 -968q-52 -85 -92 -130h-229z" /> +<glyph unicode="*" horiz-adv-x="884" d="M86 1159v103l285 53l10 -166zM211 850l51 278l160 -38l-113 -271zM346 1473l100 36l144 -247l-154 -66zM403 963l91 139l229 -184l-59 -84zM500 1169l243 160l56 -88l-193 -199z" /> +<glyph unicode="+" horiz-adv-x="1013" d="M82 625v209h319v321h209v-321h324v-209h-324v-322h-209v322h-319z" /> +<glyph unicode="," horiz-adv-x="540" d="M147 51v154q0 55 52 55h147q49 0 49 -55v-228q0 -155 -155 -164q-45 -2 -82 7v86q41 0 52 16.5t11 40.5v37h-22q-52 0 -52 51z" /> +<glyph unicode="-" horiz-adv-x="724" d="M41 489v209h643v-209h-643z" /> +<glyph unicode="." horiz-adv-x="544" d="M147 47v160q0 51 50 51h151q51 0 51 -51v-160q0 -47 -51 -47h-151q-50 0 -50 47z" /> +<glyph unicode="/" horiz-adv-x="890" d="M35 -147l575 1724h248l-575 -1724h-248z" /> +<glyph unicode="0" horiz-adv-x="1300" d="M121 352v787q0 174 100.5 267t267.5 93h336q186 0 270.5 -98t84.5 -254v-795q0 -176 -93.5 -264t-263.5 -88h-336q-168 0 -267 88t-99 264zM358 383q0 -160 172 -160h248q164 0 164 158v737q0 158 -158 158h-260q-88 0 -127 -47t-39 -111v-735z" /> +<glyph unicode="1" horiz-adv-x="751" d="M70 1169v158l309 172h235v-1499h-237v1255z" /> +<glyph unicode="2" horiz-adv-x="1210" d="M70 1294v176q311 49 622 50q215 0 323.5 -129t108.5 -322q0 -102 -53 -217t-123.5 -205t-169 -185t-158 -144.5t-120.5 -94.5h624v-223h-1040v211q100 68 215 158t258 216t236.5 257t93.5 227q0 225 -254 225h-563z" /> +<glyph unicode="3" horiz-adv-x="1202" d="M51 1280v166q84 31 197.5 44t224.5 14t238 -1q168 -2 265 -99t97 -253v-119q0 -229 -147 -287q147 -72 147 -303v-98q0 -174 -95 -266t-282 -92h-74h-80q-16 0 -72 1t-76.5 2t-66.5 4t-73 7t-63.5 10t-67.5 14.5t-60 18.5l3 168h552q113 0 164.5 28.5t51.5 129.5v86 q0 96 -52.5 134t-150.5 42l-441 16v189l441 20q109 6 158 45t49 123v98q0 158 -207 158h-580z" /> +<glyph unicode="4" horiz-adv-x="1257" d="M35 459l577 1040h267l-504 -921h448v372l68 156h170v-528h162v-185l-162 -45v-344h-238v344h-719z" /> +<glyph unicode="5" horiz-adv-x="1226" d="M131 41v184h594q164 0 164 162v168q0 33 -4 55.5t-18.5 50t-48.5 43t-85 15.5h-235q-61 0 -101.5 -33t-40.5 -100h-221l45 913h893v-223h-667l-19 -395q49 45 145 53q59 8 254 0q174 -4 257 -101.5t83 -259.5v-219q0 -100 -34.5 -174t-91 -112.5t-116 -57t-122.5 -18.5 q-209 0 -323.5 8t-307.5 41z" /> +<glyph unicode="6" horiz-adv-x="1255" d="M113 786q0 375 100 544t252 177q287 16 641 -39v-180h-543q-207 0 -213 -432q215 41 461 41q197 0 270.5 -88t73.5 -244v-241q0 -326 -352 -326h-297q-94 0 -160.5 34t-122 117.5t-83 242t-27.5 394.5zM350 682q0 -92 6 -159.5t25.5 -143.5t65 -117t112.5 -41h211 q76 0 112 29t36 112v181q0 80 -36 109.5t-108 29.5h-424z" /> +<glyph unicode="7" horiz-adv-x="1128" d="M51 1276v223h957l69 -119l-516 -1380h-266l485 1276h-729z" /> +<glyph unicode="8" horiz-adv-x="1286" d="M129 334v168q0 184 168 227q-168 68 -168 293v133q0 195 99.5 274.5t275.5 79.5h307q174 0 260 -84t86 -270v-119q2 -37 -5 -79t-45 -94t-103 -64q80 -14 117.5 -102.5t35.5 -174.5v-184q0 -338 -348 -338h-305q-88 0 -154.5 16.5t-105.5 48t-63.5 63.5t-35 76 t-13.5 69.5t-3 60.5zM367 352q0 -70 39.5 -102.5t130.5 -32.5h231q70 0 111 34t41 101v168q0 70 -40 106t-108 36h-250q-156 0 -155 -142v-168zM367 1012q0 -143 155 -144h250q86 0 117 40t31 104v112q0 96 -38 133t-114 37h-231q-90 0 -130 -32.5t-40 -137.5v-112z" /> +<glyph unicode="9" horiz-adv-x="1255" d="M104 942v240q0 326 351 325h299q92 0 159.5 -33.5t122 -117.5t82 -243t27.5 -394q0 -375 -100.5 -544t-251.5 -177q-348 -20 -639 41v178h540q207 0 213 434q-225 -43 -458 -43q-199 0 -272 88t-73 246zM340 963q0 -78 37 -109t108 -31h422q0 94 -6 160t-24.5 142.5 t-63.5 117.5t-115 41h-211q-76 0 -111.5 -27.5t-35.5 -113.5v-180z" /> +<glyph unicode=":" horiz-adv-x="544" d="M147 47v160q0 51 50 51h151q51 0 51 -51v-160q0 -47 -51 -47h-151q-50 0 -50 47zM147 879v159q0 51 50 52h151q51 0 51 -52v-159q0 -47 -51 -48h-151q-50 1 -50 48z" /> +<glyph unicode=";" horiz-adv-x="548" d="M147 51v154q0 23 14.5 39t37.5 16h147q49 0 49 -55v-228q0 -155 -155 -164q-45 -2 -82 7v86q41 0 52 16.5t11 40.5v37h-22q-23 0 -37.5 14t-14.5 37zM150 879v159q0 51 49 52h151q51 0 51 -52v-159q0 -47 -51 -48h-151q-49 1 -49 48z" /> +<glyph unicode="<" horiz-adv-x="940" d="M86 608v230l768 309v-229l-500 -193l500 -215v-231z" /> +<glyph unicode="=" horiz-adv-x="956" d="M41 397v209h874v-209h-874zM41 834v208h874v-208h-874z" /> +<glyph unicode=">" horiz-adv-x="940" d="M86 279v231l500 215l-500 193v229l768 -309v-230z" /> +<glyph unicode="?" horiz-adv-x="1110" d="M35 1288v178q344 57 577 47q217 0 322.5 -112.5t105.5 -280.5v-170q0 -205 -122.5 -294t-352.5 -64v-193h-205v375h256q84 4 136.5 47t52.5 131v146q0 100 -57.5 145t-186.5 45h-526zM338 47v160q0 51 49 51h154q49 0 49 -51v-160q0 -47 -49 -47h-154q-49 0 -49 47z" /> +<glyph unicode="@" horiz-adv-x="1759" d="M113 14v656q0 49 7 93t31.5 98t65.5 94t116 67t175 27h410q342 0 342 -308v-741h-160l-35 123l-17 -14q-17 -14 -49 -35t-71 -42.5t-92.5 -35.5t-106.5 -14q-119 -2 -190.5 74.5t-71.5 185.5v94q0 133 74.5 206.5t212.5 73.5h307q2 113 0 113q0 70 -34 94.5t-109 24.5 h-410q-90 0 -141.5 -37t-51.5 -147v-635q0 -217 193 -217h692q121 0 166 53t45 164v977q0 115 -57.5 176t-153.5 61h-827v146q279 57 612 55h215q182 -2 298 -109.5t116 -328.5v-977q0 -422 -406 -422h-700q-178 0 -286.5 101t-108.5 306zM676 270q0 -33 30.5 -60.5 t75.5 -25.5q141 -2 279 95v196l-283 -26q-102 -10 -102 -111v-68z" /> +<glyph unicode="A" horiz-adv-x="1400" d="M78 0l522 1499h262l502 -1499h-260l-115 362h-530l-117 -362h-264zM526 580h402l-197 596z" /> +<glyph unicode="B" horiz-adv-x="1230" d="M139 0v1499h602q213 0 312.5 -114.5t99.5 -282.5q0 -119 -48 -210t-151 -114q90 -18 153.5 -109t63.5 -237q0 -432 -426 -432h-606zM377 217h362q195 0 195 225q0 102 -48 170t-147 68h-362v-463zM377 889h354q186 0 187 198q0 195 -187 195h-354v-393z" /> +<glyph unicode="C" horiz-adv-x="1175" d="M96 754q0 387 108.5 574.5t397.5 187.5q268 0 514 -62v-186l-16 1q-16 1 -44 3t-64 5t-80 6t-88 5t-91 3t-88 1q-123 0 -184.5 -37.5t-94 -154.5t-32.5 -350q0 -272 66.5 -405.5t244.5 -133.5q96 0 214 4t188 8l69 4v-186q-197 -53 -475 -53h-39q-270 2 -388 199.5 t-118 566.5z" /> +<glyph unicode="D" horiz-adv-x="1351" d="M139 0v1499h609q524 0 524 -756q0 -156 -30 -286.5t-91 -235t-164.5 -163t-238.5 -58.5h-609zM377 219h356q154 0 227.5 142.5t73.5 383.5q0 295 -75.5 416t-225.5 121h-356v-1063z" /> +<glyph unicode="E" d="M135 279v925q0 162 88 230q83 65 199 65h14q571 -20 656 -33v-194h-613q-49 0 -74.5 -19.5t-28.5 -39t-3 -56.5v-297l628 -20v-195l-628 -20v-297q0 -51 22.5 -76t43 -28t61.5 -3h592v-192l-635 -35q-14 -1 -28 -1q-294 0 -294 286z" /> +<glyph unicode="F" d="M135 0v1202q0 158 87 230q82 68 201 67h13q571 -20 656 -33v-194h-613q-49 0 -74.5 -19.5t-28.5 -39t-3 -56.5v-297l628 -20v-195l-628 -20v-625h-238z" /> +<glyph unicode="G" horiz-adv-x="1257" d="M96 758q0 174 19.5 300t70 235.5t149.5 166t247 56.5q283 0 555 -62v-186q-2 0 -36 3t-87 7t-115.5 9t-137.5 8t-136 3q-176 0 -233.5 -119.5t-57.5 -424.5q0 -313 58.5 -425t225.5 -114q66 0 143 23.5t121 47.5l44 23v320h-258v153q137 49 356 49q90 0 139 -4v-827h-172 l-61 100q-133 -106 -346 -110h-23q-108 0 -190 34q-90 39 -142.5 105t-83 171.5t-40 210t-9.5 247.5z" /> +<glyph unicode="H" horiz-adv-x="1304" d="M139 0v1499h238v-663h588v663h237v-1499h-237v614h-588v-614h-238z" /> +<glyph unicode="I" horiz-adv-x="479" d="M139 0v1499h238v-1499h-238z" /> +<glyph unicode="J" horiz-adv-x="731" d="M61 45l5 182q93 -12 151 -12q48 0 72 8q100 32 102 195v1081h238v-1161q0 -231 -109 -301q-77 -48 -214 -48h-16q-149 3 -229 56z" /> +<glyph unicode="K" horiz-adv-x="1259" d="M139 0v1499h230v-643h139l412 643h280l-479 -749l479 -750h-280l-412 639h-137v-639h-232z" /> +<glyph unicode="L" horiz-adv-x="1118" d="M139 279v1220h238v-1169q0 -39 10 -62.5t32.5 -32t38 -10.5t46.5 -2h555v-223h-621q-299 0 -299 279z" /> +<glyph unicode="M" horiz-adv-x="1699" d="M96 0l119 1499h330l303 -1106l299 1106h328l131 -1499h-234l-96 1081l-295 -1081h-260l-303 1081l-86 -1081h-236z" /> +<glyph unicode="N" horiz-adv-x="1388" d="M139 0v1499h242l668 -1059v1059h237v-1499h-237l-670 1053v-1053h-240z" /> +<glyph unicode="O" horiz-adv-x="1376" d="M113 739q0 172 19.5 301t60 212t88 135.5t122 79t142 34.5t164.5 8q121 0 199.5 -12t159.5 -56t127 -126t75.5 -225.5t29.5 -350.5q0 -195 -27.5 -332t-73.5 -217.5t-125 -125t-161 -58.5t-204 -14q-125 0 -205 12t-162 55t-127 123t-73.5 218t-28.5 339zM350 739 q0 -174 15.5 -273t59.5 -157.5t107.5 -76t176.5 -17.5q141 0 212.5 39t106.5 151.5t35 333.5q0 156 -14.5 257.5t-38 159.5t-72.5 87t-96 36t-133 7t-131.5 -6t-96.5 -34.5t-74.5 -86t-40 -161t-16.5 -259.5z" /> +<glyph unicode="P" horiz-adv-x="1216" d="M111 0v1499h634q78 0 139.5 -17.5t124 -61.5t97.5 -139t35 -234q0 -129 -27 -221.5t-64.5 -140.5t-95 -74.5t-103.5 -32.5q-35 -5 -79 -5h-27q-57 2 -223 19.5t-174 21.5v-614h-237zM348 791h383q82 0 126 53t44 200q-2 238 -170 238h-383v-491z" /> +<glyph unicode="Q" horiz-adv-x="1376" d="M113 739q0 172 18.5 300t58 212t87 136.5t121 79t142 34.5t167.5 8q100 0 168.5 -8t142.5 -34.5t120 -79t86 -136.5t58 -212t18 -300q0 -195 -27.5 -331t-73.5 -216.5t-126 -126t-162 -59.5t-204 -14q-88 0 -149.5 5t-128.5 23.5t-112 51t-87 88t-65.5 133.5t-37.5 190.5 t-14 255.5zM350 739q0 -229 33 -338.5t103.5 -147.5t220.5 -38q141 0 213.5 39t107.5 151.5t35 333.5q0 156 -15.5 257.5t-38 159.5t-72.5 87t-97 36t-133 7t-132.5 -6t-96.5 -34.5t-73.5 -86t-39 -161t-15.5 -259.5zM627 -68h143q64 -78 181 -78q69 0 155 27v-207 q-51 -17 -107 -17q-21 0 -43 3q-79 8 -150 33.5t-121 89t-58 149.5z" /> +<glyph unicode="R" horiz-adv-x="1232" d="M111 0v1499h651q385 0 385 -461q0 -109 -20.5 -189.5t-43 -122.5t-65.5 -71.5t-61.5 -37t-55.5 -17.5l295 -600h-266l-273 584l-309 28v-612h-237zM350 805h393q86 0 125 43t39 190q0 141 -43 192.5t-121 51.5h-393v-477z" /> +<glyph unicode="S" horiz-adv-x="1204" d="M113 1001v132q0 209 107.5 292.5t297.5 85.5h26q119 0 275 -16q174 -18 254 -39v-188q-262 20 -504 20h-26q-97 0 -142 -26q-51 -30 -51 -144v-96q0 -100 41 -132t137 -32h258q100 0 172 -35t107 -94t49 -120.5t14 -131.5v-115q0 -115 -34.5 -193.5t-98 -116.5t-130 -53 t-152.5 -15q-338 0 -553 57v188q216 -22 494 -22h24q213 0 213 149v103q0 78 -33 120t-115 42h-251h-2q-377 0 -377 380z" /> +<glyph unicode="T" horiz-adv-x="1204" d="M74 1276v223h1083v-223h-428v-1276h-237v1276h-418z" /> +<glyph unicode="U" horiz-adv-x="1370" d="M139 655v844h238v-844q0 -121 14.5 -202.5t37 -130t67.5 -72t91 -30.5t122 -7q66 0 108.5 8t86.5 34t68.5 74t40 129t15.5 197v844h240v-844q0 -137 -19.5 -244.5t-47 -177t-77 -117.5t-90.5 -73t-108.5 -37t-107.5 -14t-109 -2h-20q-110 0 -165 4t-142 38t-130 100.5 t-78 198t-35 324.5z" /> +<glyph unicode="V" horiz-adv-x="1392" d="M78 1499h254l373 -1171l391 1171h254l-514 -1499h-267z" /> +<glyph unicode="W" horiz-adv-x="2009" d="M78 1499h254l370 -1157l306 1157h258l-117 -420l250 -745l315 1165h254l-434 -1499h-266l-230 670l-202 -670h-267z" /> +<glyph unicode="X" horiz-adv-x="1280" d="M78 1499h262l315 -555l320 555h262l-449 -745l439 -754h-262l-310 551l-309 -551h-262l436 754z" /> +<glyph unicode="Y" horiz-adv-x="1325" d="M78 1499h258l328 -743l360 743h258l-502 -1010v-489h-237v489z" /> +<glyph unicode="Z" horiz-adv-x="1144" d="M61 0v223l732 1053h-732v223h1024v-223l-710 -1053h710v-223h-1024z" /> +<glyph unicode="[" horiz-adv-x="673" d="M147 -41v1393q0 158 73 265t249 107h172v-208h-129q-59 0 -93 -48.5t-34 -138.5v-1364q0 -90 34 -138t93 -48h129v-209h-172q-322 0 -322 389z" /> +<glyph unicode="\" horiz-adv-x="890" d="M35 1577h248l575 -1724h-248z" /> +<glyph unicode="]" horiz-adv-x="673" d="M35 -221h127q59 0 93 48t34 138v1364q0 90 -34 138.5t-93 48.5h-127v208h170q94 0 160.5 -32.5t99.5 -89t47 -118t14 -132.5v-1393q0 -389 -321 -389h-170v209z" /> +<glyph unicode="^" horiz-adv-x="792" d="M86 1087l227 273h189l205 -273h-175l-129 132l-141 -132h-176z" /> +<glyph unicode="_" horiz-adv-x="1380" d="M41 -2v209h1298v-209h-1298z" /> +<glyph unicode="`" horiz-adv-x="495" d="M35 1368h229l199 -281h-170z" /> +<glyph unicode="a" horiz-adv-x="1062" d="M70 270v111q0 129 74.5 209t226.5 80q184 -1 276 -1t92 1q1 46 1 69.5t-1 24.5q0 84 -37.5 114.5t-115.5 30.5q-127 0 -482 -22v153q188 63 508 68h8q357 0 357 -338v-770h-184l-54 123q-6 -10 -60 -42t-145.5 -62.5t-168.5 -30.5q-137 2 -216 82.5t-79 199.5zM307 299 q0 -63 29 -87t80 -24q134 0 323 93v233l-331 -25q-100 -10 -101 -118v-72z" /> +<glyph unicode="b" horiz-adv-x="1136" d="M104 0v1608h236v-580q170 76 356 76q111 0 183.5 -42t109.5 -124t50.5 -175t13.5 -224q0 -551 -357 -551q-90 0 -194.5 42t-159.5 85l-49 -115h-189zM342 276q140 -78 305 -78h2q166 0 166 347q0 211 -40 285.5t-126 74.5q-172 0 -307 -45v-584z" /> +<glyph unicode="c" horiz-adv-x="1015" d="M86 545q0 168 25.5 279.5t77 170t111.5 81t144 22.5q272 0 490 -62v-151q-229 12 -412 12q-45 0 -70.5 -4t-53 -22.5t-42 -56.5t-23.5 -105.5t-9 -169.5q0 -211 42 -278.5t156 -67.5q84 0 190.5 4t171.5 9l64 5v-156q-27 -10 -53.5 -19t-57 -15.5t-52 -11.5t-59.5 -8 t-53.5 -5t-59.5 -3t-54 -2t-59 -1h-56q-82 0 -142 23.5t-111.5 81t-78 171t-26.5 279.5z" /> +<glyph unicode="d" horiz-adv-x="1136" d="M86 539q0 104 8 183t30.5 153.5t61.5 123t103.5 77t152.5 28.5q186 0 357 -76v580h235v-1608h-188l-47 115q-57 -45 -162 -86t-195 -41q-356 0 -356 551zM324 545q0 -346 165 -346q164 0 310 77v584q-137 45 -310 45q-86 0 -125.5 -74.5t-39.5 -285.5z" /> +<glyph unicode="e" horiz-adv-x="1075" d="M86 549q0 176 24.5 284.5t87 166t144.5 77t219 19.5q82 0 136.5 -4.5t109.5 -17.5t88 -38.5t60.5 -68.5t39 -107.5t11.5 -154.5q0 -266 -295 -267h-387q0 -154 48 -201t173 -47q299 0 440 23v-166q-170 -57 -541 -57q-205 0 -281.5 124t-76.5 435zM324 625h340 q104 0 104 88q0 123 -34 155.5t-161 32.5q-80 0 -116.5 -5t-73.5 -31.5t-48 -83t-11 -156.5z" /> +<glyph unicode="f" horiz-adv-x="823" d="M35 893v160l180 34v203q0 319 295 320q147 0 281 -49v-146l-218 2q-45 0 -70.5 -9t-35.5 -35.5t-12 -50.5t-2 -75v-160h268v-194h-268v-893h-238v893h-180z" /> +<glyph unicode="g" horiz-adv-x="1142" d="M82 219q0 66 31.5 117t93.5 67q-121 78 -121 302q0 193 95 290t274 97h653v-150l-137 -37q2 -4 10 -21.5t11 -25.5t10.5 -28.5t10.5 -38t5 -46t2 -61.5q0 -49 -8 -96t-32 -100.5t-61.5 -92.5t-104 -64.5t-152.5 -25.5h-277q-84 0 -84 -53q0 -59 84 -59h371q141 0 221 -79 t80 -229v-123q0 -59 -14.5 -110t-49.5 -99.5t-102.5 -77t-163.5 -28.5h-307q-152 0 -243 80t-91 235v152l90 111q-94 61 -94 194zM324 0v-215q0 -84 39.5 -110.5t107.5 -26.5h219q76 0 102.5 33.5t26.5 99.5v94q0 59 -25.5 87t-93.5 28h-288zM324 705q0 -197 153 -197h146 q90 0 127 56q32 51 32 125v16q-4 98 -38.5 141t-122.5 43h-138q-159 0 -159 -184z" /> +<glyph unicode="h" horiz-adv-x="1120" d="M104 0v1604h238v-637q139 92 209 115q73 24 156 24q170 0 249.5 -103.5t79.5 -265.5v-737h-237v739q0 166 -144 166q-92 0 -156.5 -22.5t-156.5 -79.5v-803h-238z" /> +<glyph unicode="i" horiz-adv-x="442" d="M86 1253v156q0 53 49 53h174q47 0 47 -53v-156q0 -47 -47 -47h-174q-49 0 -49 47zM100 0v1087h238v-1087h-238z" /> +<glyph unicode="j" horiz-adv-x="477" d="M104 1253v156q0 53 50 53h174q47 0 47 -53v-156q0 -47 -47 -47h-174q-50 0 -50 47zM121 -553v1640h237v-1095v-39q0 -337 -67 -506h-170z" /> +<glyph unicode="k" horiz-adv-x="1097" d="M104 0v1602h238v-887h68l348 372h307l-436 -469l436 -618h-285l-370 520h-68v-520h-238z" /> +<glyph unicode="l" horiz-adv-x="630" d="M104 387v1217h238v-1188q0 -115 25.5 -160t76.5 -61q139 -43 154 -43v-152h-217q-135 0 -206 90t-71 297z" /> +<glyph unicode="m" horiz-adv-x="1808" d="M104 0v1087h185l53 -122q78 53 108.5 71.5t101.5 42t146 23.5q102 0 178 -39t111 -109q190 147 408 148q160 0 244.5 -101.5t84.5 -269.5v-731h-237v733q0 80 -39 124t-105 44q-186 0 -315 -96v-72v-733h-237v733q0 80 -40 124t-106 44q-90 0 -150.5 -22.5t-152.5 -79.5 v-799h-238z" /> +<glyph unicode="n" horiz-adv-x="1120" d="M104 0v1087h185l53 -120q78 51 109.5 70.5t104.5 44t151 24.5q170 0 249.5 -103.5t79.5 -265.5v-737h-237v739q0 166 -144 166q-92 0 -156.5 -22.5t-156.5 -79.5v-803h-238z" /> +<glyph unicode="o" horiz-adv-x="1153" d="M86 528q0 330 107.5 450t384.5 120q279 0 384 -123t105 -447q0 -305 -105.5 -421.5t-383.5 -116.5q-276 0 -384 121.5t-108 416.5zM324 528q0 -115 13 -183.5t49 -101t77 -41.5t115 -9q78 0 117.5 8t74.5 41.5t47 101.5t12 184q0 168 -24.5 246t-72.5 100.5t-154.5 22.5 t-154.5 -22.5t-73.5 -100.5t-25.5 -246z" /> +<glyph unicode="p" horiz-adv-x="1136" d="M104 -553v1640h189l47 -112q55 43 160.5 84t195.5 41q356 0 357 -551q0 -125 -13.5 -217t-50.5 -176t-110.5 -128t-182.5 -44q-182 0 -356 73v-610h-236zM340 227q135 -45 309 -45q86 0 126 75t40 284q0 348 -166 348q-164 0 -309 -78v-584z" /> +<glyph unicode="q" horiz-adv-x="1136" d="M86 549q0 551 391 551q299 0 555 -58v-1595h-237v612q-143 -79 -314 -79h-4q-221 0 -306 143t-85 426zM324 553q0 -68 1 -97.5t5 -84t16 -81t32.5 -57t53.5 -43t80 -12.5q139 0 283 47v680h-283q-51 0 -89 -25.5t-56.5 -60.5t-28.5 -89t-12 -90t-2 -87z" /> +<glyph unicode="r" horiz-adv-x="860" d="M104 0v1087h193l45 -137q59 45 100 73t108.5 52.5t137.5 24.5q94 0 131 -15v-231q-53 8 -153 8q-102 0 -175 -26.5t-149 -94.5v-741h-238z" /> +<glyph unicode="s" horiz-adv-x="1038" d="M70 719v94q0 285 282 285q438 0 563 -47v-158h-507q-66 0 -83.5 -20.5t-17.5 -71.5v-66q0 -31 7.5 -49t22.5 -25.5t29.5 -9.5t41.5 -2h282q141 0 211 -75.5t70 -200.5v-107q0 -276 -266 -276q-156 0 -347.5 13t-242.5 38v156h530q88 0 88 84v69q0 45 -19.5 65.5 t-68.5 20.5h-278q-150 0 -223.5 64.5t-73.5 218.5z" /> +<glyph unicode="t" horiz-adv-x="778" d="M35 895v143l184 52l45 303h193v-303h270v-195h-270v-477q0 -115 24.5 -160t77.5 -63q139 -43 154 -43v-152h-226q-268 0 -268 389v506h-184z" /> +<glyph unicode="u" horiz-adv-x="1120" d="M86 352v735h238v-739q0 -164 143 -164q94 0 158.5 22.5t154.5 80.5v800h238v-1087h-184l-54 119q-14 -8 -62 -38t-69.5 -40t-62.5 -28.5t-82 -24.5t-88 -6q-170 0 -250 103t-80 267z" /> +<glyph unicode="v" horiz-adv-x="1134" d="M35 1087h256l274 -792l281 792h254l-410 -1087h-258z" /> +<glyph unicode="w" horiz-adv-x="1673" d="M35 1087h256l254 -792l227 792h242l-88 -313l200 -479l258 792h256l-374 -1087h-260l-191 444l-143 -444h-269z" /> +<glyph unicode="x" horiz-adv-x="1134" d="M41 0l383 545l-383 542h291l233 -358l240 358h289l-385 -548l368 -539h-272l-238 356l-235 -356h-291z" /> +<glyph unicode="y" horiz-adv-x="1165" d="M37 1087h252l215 -792q6 -20 15 -35.5t19.5 -24t20.5 -13.5t21.5 -6t18.5 -2t15 0l9 1l251 872h252l-413 -1431l-152 -209h-164l168 553q-223 0 -297 258z" /> +<glyph unicode="z" horiz-adv-x="956" d="M51 879v208h854v-208l-508 -668h508v-209h-823v207l526 670h-557z" /> +<glyph unicode="{" horiz-adv-x="655" d="M35 590v186q49 4 75.5 9.5t56.5 31t30 68.5v458q0 170 107.5 275.5t318.5 105.5v-208q-94 0 -141.5 -49.5t-47.5 -180.5v-412q0 -162 -188 -190q84 -14 135 -63.5t51 -120.5v-529q0 -207 191 -200v-201q-428 0 -428 352v559q0 57 -47 85t-113 24z" /> +<glyph unicode="|" horiz-adv-x="503" d="M150 -147v1724h208v-1724h-208z" /> +<glyph unicode="}" horiz-adv-x="655" d="M35 -229q92 -2 140 49t48 151v529q0 72 51.5 121t135.5 63q-188 29 -189 190v412q0 131 -47 180.5t-139 49.5v208q211 0 317.5 -105.5t106.5 -275.5v-458q0 -33 14 -55.5t44 -33t49.5 -13.5t56.5 -7v-186q-66 4 -114 -23.5t-48 -85.5v-559q0 -160 -99.5 -256t-326.5 -96 v201z" /> +<glyph unicode="~" horiz-adv-x="872" d="M86 1190l26 26q19 19 27 26t25.5 23.5t29 22.5t29 17.5t32.5 15.5t34.5 8t40.5 4q47 0 112.5 -35.5t104.5 -35.5q82 0 190 81l49 -108q-41 -45 -62.5 -67.5t-71.5 -51.5t-99 -29q-47 0 -119 36t-110 36q-29 0 -54.5 -7t-42 -15.5t-46 -24.5t-48.5 -25z" /> +<glyph unicode="¢" horiz-adv-x="999" d="M70 545q0 170 26.5 283.5t78.5 172t116.5 81t157.5 18.5v198h157v-206q176 -18 312 -56v-151q-229 14 -412 14q-57 0 -87 -8t-59.5 -42t-41 -108.5t-11.5 -201.5q0 -213 42 -282t157 -69q84 0 189.5 5.5t169.5 10.5l65 5v-156q-133 -57 -326 -63v-187h-158v185 q-90 0 -153.5 21.5t-116.5 79.5t-79.5 172t-26.5 284z" /> +<glyph unicode="£" horiz-adv-x="1202" d="M86 0v184l141 39v432h-141v127l141 41v183q0 131 24.5 223t63.5 144t109 81t136.5 37t168.5 8q51 0 148.5 -8t168.5 -16l70 -9v-188h-389q-59 0 -91 -2t-68 -10.5t-50 -23.5t-29.5 -44t-19.5 -71t-4 -105v-199l489 -32v-136h-489v-432h649v-223h-1028z" /> +<glyph unicode="¥" horiz-adv-x="1271" d="M35 1499h258l328 -682l354 682h264l-455 -819h279v-152h-326v-84h326v-149h-326v-295h-237v295h-312v149h312v84h-312v152h267z" /> +<glyph unicode="¨" horiz-adv-x="923" d="M86 1192q0 47 35 80t82 33t79.5 -33t32.5 -80t-32.5 -81t-79.5 -34t-82 34t-35 81zM608 1192q0 47 35 80t82 33t80 -33t33 -80t-33 -81t-80 -34t-82 34t-35 81z" /> +<glyph unicode="©" horiz-adv-x="1646" d="M96 754q0 745 500 745h504q98 0 174 -31.5t124 -91t79.5 -129t47 -160t21.5 -166t6 -167.5q0 -346 -114.5 -550t-337.5 -204h-504q-137 0 -238.5 68.5t-156 183.5t-80 241t-25.5 261zM262 754q0 -250 85 -421t249 -173h496q133 2 213.5 148.5t80.5 445.5q0 90 -4 156.5 t-20 153.5t-45 142.5t-84 94t-133 38.5h-504q-74 0 -130 -25.5t-104.5 -87t-74 -181t-25.5 -291.5zM463 748q0 446 295 446q172 0 372 -49v-135q-172 25 -344 24q-84 0 -119.5 -68.5t-35.5 -224.5q0 -139 34.5 -209.5t127.5 -70.5q147 0 350 33v-136q-164 -57 -379 -57 q-139 0 -220 97.5t-81 349.5z" /> +<glyph unicode="«" horiz-adv-x="1165" d="M86 725l422 416l139 -137l-285 -279l293 -287l-137 -139zM512 725l422 416l137 -137l-285 -279l293 -287l-135 -139z" /> +<glyph unicode="­" horiz-adv-x="724" d="M41 489v209h643v-209h-643z" /> +<glyph unicode="®" horiz-adv-x="1646" d="M96 754q0 745 500 745h504q98 0 174 -31.5t124 -91t79.5 -129t47 -160t21.5 -166t6 -167.5q0 -346 -114.5 -550t-337.5 -204h-504q-137 0 -238.5 68.5t-156 183.5t-80 241t-25.5 261zM262 754q0 -250 85 -421t249 -173h496q133 2 213.5 148.5t80.5 445.5q0 90 -4 156.5 t-20 153.5t-45 142.5t-84 94t-133 38.5h-504q-74 0 -130 -25.5t-104.5 -87t-74 -181t-25.5 -291.5zM518 313v875h369q274 0 274 -270q0 -74 -15.5 -126.5t-44 -79t-53 -38.5t-61.5 -23l182 -338h-182l-176 334l-127 25v-359h-166zM684 791h186q80 0 102.5 23.5t22.5 103.5 q0 39 -9 62.5t-28.5 32.5t-38 12t-49.5 3h-186v-237z" /> +<glyph unicode="´" horiz-adv-x="495" d="M35 1087l196 281h232l-258 -281h-170z" /> +<glyph unicode="¸" horiz-adv-x="505" d="M86 -256l98 31q39 16 50.5 49t11.5 100h174q0 -160 -47 -222t-174 -62h-113v104z" /> +<glyph unicode="»" horiz-adv-x="1165" d="M86 438l293 287l-285 279l139 137l422 -416l-432 -426zM512 438l291 287l-285 279l139 137l422 -416l-432 -426z" /> +<glyph unicode="À" horiz-adv-x="1400" d="M78 0l522 1499h262l502 -1499h-260l-115 362h-530l-117 -362h-264zM389 1913h229l199 -281h-170zM526 580h402l-197 596z" /> +<glyph unicode="Â" horiz-adv-x="1400" d="M78 0l522 1499h262l502 -1499h-260l-115 362h-530l-117 -362h-264zM422 1632l227 273h189l202 -273h-174l-129 131l-139 -131h-176zM526 580h402l-197 596z" /> +<glyph unicode="Æ" horiz-adv-x="1929" d="M51 0l592 1200q45 90 97.5 150.5t106.5 89t114.5 45t120 15.5t124.5 -1q561 -20 645 -33v-194h-602q-37 0 -59.5 -8.5t-30.5 -27.5t-10 -32.5t-4 -42.5v-307l616 -23v-192l-616 -21v-294q0 -18 2 -33t8 -24t9 -17t14.5 -12.5t15.5 -7.5t18.5 -4t18.5 -1h21h20l577 -2 v-196l-620 -35q-322 -18 -322 256v174h-385l-209 -422h-262zM627 639h280v573z" /> +<glyph unicode="Ç" horiz-adv-x="1175" d="M96 754q0 387 108.5 574.5t397.5 187.5q268 0 514 -62v-186l-16 1q-16 1 -44 3t-64 5t-80 6t-88 5t-91 3t-88 1q-123 0 -184.5 -37.5t-94 -154.5t-32.5 -350q0 -272 66.5 -405.5t244.5 -133.5q96 0 214 4t188 8l69 4v-186q-211 -57 -514 -53q-270 2 -388 199.5 t-118 566.5zM311 -254l97 31q39 16 51 50t12 99h172q0 -160 -47 -223t-174 -63h-111v106z" /> +<glyph unicode="È" d="M135 279v925q0 162 88 230.5t213 64.5q571 -20 656 -33v-194h-613q-49 0 -74.5 -19.5t-28.5 -39t-3 -56.5v-297l628 -20v-195l-628 -20v-297q0 -51 22.5 -76t43 -28t61.5 -3h592v-192l-635 -35q-322 -14 -322 285zM346 1907h229l199 -281h-170z" /> +<glyph unicode="É" d="M135 279v925q0 162 88 230.5t213 64.5q571 -20 656 -33v-194h-613q-49 0 -74.5 -19.5t-28.5 -39t-3 -56.5v-297l628 -20v-195l-628 -20v-297q0 -51 22.5 -76t43 -28t61.5 -3h592v-192l-635 -35q-322 -14 -322 285zM573 1626l197 279h231l-258 -279h-170z" /> +<glyph unicode="Ê" d="M135 279v925q0 162 88 230.5t213 64.5q571 -20 656 -33v-194h-613q-49 0 -74.5 -19.5t-28.5 -39t-3 -56.5v-297l628 -20v-195l-628 -20v-297q0 -51 22.5 -76t43 -28t61.5 -3h592v-192l-635 -35q-322 -14 -322 285zM340 1632l227 273h189l202 -273h-174l-129 131 l-139 -131h-176z" /> +<glyph unicode="Ë" d="M135 279v925q0 162 88 230.5t213 64.5q571 -20 656 -33v-194h-613q-49 0 -74.5 -19.5t-28.5 -39t-3 -56.5v-297l628 -20v-195l-628 -20v-297q0 -51 22.5 -76t43 -28t61.5 -3h592v-192l-635 -35q-322 -14 -322 285zM268 1741q0 47 34 79.5t81 32.5t80 -32.5t33 -79.5 t-33 -81t-80 -34t-81 34t-34 81zM791 1741q0 47 33.5 79.5t80.5 32.5t80 -32.5t33 -79.5t-33 -81t-80 -34t-80.5 34t-33.5 81z" /> +<glyph unicode="Î" horiz-adv-x="479" d="M-53 1632l229 273h189l202 -273h-174l-129 131l-141 -131h-176zM139 0v1499h238v-1499h-238z" /> +<glyph unicode="Ï" horiz-adv-x="479" d="M-119 1747q0 47 35 80t82 33t80 -33t33 -80t-33 -81t-80 -34t-82 34t-35 81zM139 0v1499h238v-1499h-238zM406 1747q0 47 33.5 80t80.5 33t80 -33t33 -80t-33 -81t-80 -34t-80.5 34t-33.5 81z" /> +<glyph unicode="Ô" horiz-adv-x="1376" d="M113 739q0 172 19.5 301t60 212t88 135.5t122 79t142 34.5t164.5 8q121 0 199.5 -12t159.5 -56t127 -126t75.5 -225.5t29.5 -350.5q0 -195 -27.5 -332t-73.5 -217.5t-125 -125t-161 -58.5t-204 -14q-125 0 -205 12t-162 55t-127 123t-73.5 218t-28.5 339zM350 739 q0 -174 15.5 -273t59.5 -157.5t107.5 -76t176.5 -17.5q141 0 212.5 39t106.5 151.5t35 333.5q0 156 -14.5 257.5t-38 159.5t-72.5 87t-96 36t-133 7t-131.5 -6t-96.5 -34.5t-74.5 -86t-40 -161t-16.5 -259.5zM399 1632l228 273h188l203 -273h-174l-129 131l-140 -131h-176z " /> +<glyph unicode="Ù" horiz-adv-x="1370" d="M139 655v844h238v-844q0 -121 14.5 -202.5t37 -130t67.5 -72t91 -30.5t122 -7q66 0 108.5 8t86.5 34t68.5 74t40 129t15.5 197v844h240v-844q0 -137 -19.5 -244.5t-47 -177t-77 -117.5t-90.5 -73t-108.5 -37t-107.5 -14t-109 -2h-20q-110 0 -165 4t-142 38t-130 100.5 t-78 198t-35 324.5zM360 1913h230l198 -281h-170z" /> +<glyph unicode="Û" horiz-adv-x="1370" d="M139 655v844h238v-844q0 -121 14.5 -202.5t37 -130t67.5 -72t91 -30.5t122 -7q66 0 108.5 8t86.5 34t68.5 74t40 129t15.5 197v844h240v-844q0 -137 -19.5 -244.5t-47 -177t-77 -117.5t-90.5 -73t-108.5 -37t-107.5 -14t-109 -2h-20q-110 0 -165 4t-142 38t-130 100.5 t-78 198t-35 324.5zM393 1632l228 273h188l203 -273h-172l-131 131l-140 -131h-176z" /> +<glyph unicode="Ü" horiz-adv-x="1370" d="M139 655v844h238v-844q0 -121 14.5 -202.5t37 -130t67.5 -72t91 -30.5t122 -7q66 0 108.5 8t86.5 34t68.5 74t40 129t15.5 197v844h240v-844q0 -137 -19.5 -244.5t-47 -177t-77 -117.5t-90.5 -73t-108.5 -37t-107.5 -14t-109 -2h-20q-110 0 -165 4t-142 38t-130 100.5 t-78 198t-35 324.5zM328 1747q0 47 33.5 80t80.5 33t81 -33t34 -80t-34 -81t-81 -34t-80.5 34t-33.5 81zM850 1747q0 47 34 80t81 33t79.5 -33t32.5 -80t-32.5 -81t-79.5 -34t-81 34t-34 81z" /> +<glyph unicode="à" horiz-adv-x="1062" d="M70 270v111q0 129 74.5 209t226.5 80q369 -2 368 0q2 92 0 94q0 84 -37.5 114.5t-115.5 30.5q-127 0 -482 -22v153q188 63 508 68q365 4 365 -338v-770h-184l-54 123q-6 -10 -60 -42t-145.5 -62.5t-168.5 -30.5q-137 2 -216 82.5t-79 199.5zM205 1511h229l199 -280h-170z M307 299q0 -63 29 -87t80 -24q134 0 323 93v233l-331 -25q-100 -10 -101 -118v-72z" /> +<glyph unicode="â" horiz-adv-x="1062" d="M70 270v111q0 129 74.5 209t226.5 80q369 -2 368 0q2 92 0 94q0 84 -37.5 114.5t-115.5 30.5q-127 0 -482 -22v153q188 63 508 68q365 4 365 -338v-770h-184l-54 123q-6 -10 -60 -42t-145.5 -62.5t-168.5 -30.5q-137 2 -216 82.5t-79 199.5zM233 1231l228 272h188 l203 -272h-174l-129 131l-139 -131h-177zM307 299q0 -63 29 -87t80 -24q134 0 323 93v233l-331 -25q-100 -10 -101 -118v-72z" /> +<glyph unicode="æ" horiz-adv-x="1746" d="M70 279v75q0 129 74.5 209t226.5 80q369 -2 368 0q2 127 0 129q0 84 -37.5 115t-115.5 31q-162 0 -482 -25v154q170 66 508 69q190 0 277 -98q98 86 344 86q123 0 194.5 -11.5t135 -50t89 -116.5t25.5 -205q0 -135 -72.5 -196.5t-222.5 -61.5h-387q0 -158 49.5 -211 t172.5 -53q301 0 440 20v-164q-170 -57 -541 -57q-115 0 -181.5 34t-121.5 107q-16 -29 -177 -87t-271 -56q-137 2 -216 83t-79 200zM307 305q0 -66 27.5 -87t81.5 -21q134 0 323 92v207l-331 -25q-100 -10 -101 -119v-47zM995 641h340q104 0 105 88q0 123 -33 151.5 t-162 28.5q-51 0 -71.5 -1t-55.5 -5t-48 -14t-32.5 -28.5t-25.5 -48.5t-11.5 -72t-5.5 -99z" /> +<glyph unicode="ç" horiz-adv-x="1015" d="M86 545q0 135 17.5 233.5t48 159.5t76.5 98t97.5 50.5t118.5 13.5q266 0 490 -64v-151q-229 14 -412 14q-57 0 -86.5 -8t-59.5 -42t-41 -109.5t-11 -200.5q0 -213 42 -282t156 -69q84 0 190.5 5.5t171.5 10.5l64 5v-156q-33 -14 -66.5 -25.5t-76.5 -17.5t-66.5 -11 t-79 -7t-66.5 -2t-77.5 -1t-71.5 -1q-82 0 -142 23.5t-111.5 82t-78 172t-26.5 279.5zM336 -256l98 31q39 16 50.5 49t11.5 100h174q0 -160 -47.5 -223t-173.5 -63h-113v106z" /> +<glyph unicode="è" horiz-adv-x="1075" d="M86 549q0 176 24.5 284.5t87 166t144.5 77t219 19.5q82 0 136.5 -4.5t109.5 -17.5t88 -38.5t60.5 -68.5t39 -107.5t11.5 -154.5q0 -266 -295 -267h-387q0 -154 48 -201t173 -47q299 0 440 23v-166q-170 -57 -541 -57q-205 0 -281.5 124t-76.5 435zM223 1499h232l196 -278 h-170zM324 625h340q104 0 104 88q0 123 -34 155.5t-161 32.5q-80 0 -116.5 -5t-73.5 -31.5t-48 -83t-11 -156.5z" /> +<glyph unicode="é" horiz-adv-x="1075" d="M86 549q0 176 24.5 284.5t87 166t144.5 77t219 19.5q82 0 136.5 -4.5t109.5 -17.5t88 -38.5t60.5 -68.5t39 -107.5t11.5 -154.5q0 -266 -295 -267h-387q0 -154 48 -201t173 -47q299 0 440 23v-166q-170 -57 -541 -57q-205 0 -281.5 124t-76.5 435zM324 625h340 q104 0 104 88q0 123 -34 155.5t-161 32.5q-80 0 -116.5 -5t-73.5 -31.5t-48 -83t-11 -156.5zM469 1221l197 278h231l-258 -278h-170z" /> +<glyph unicode="ê" horiz-adv-x="1075" d="M86 549q0 176 24.5 284.5t87 166t144.5 77t219 19.5q82 0 136.5 -4.5t109.5 -17.5t88 -38.5t60.5 -68.5t39 -107.5t11.5 -154.5q0 -266 -295 -267h-387q0 -154 48 -201t173 -47q299 0 440 23v-166q-170 -57 -541 -57q-205 0 -281.5 124t-76.5 435zM242 1221l227 274h188 l203 -274h-174l-129 131l-139 -131h-176zM324 625h340q104 0 104 88q0 123 -34 155.5t-161 32.5q-80 0 -116.5 -5t-73.5 -31.5t-48 -83t-11 -156.5z" /> +<glyph unicode="ë" horiz-adv-x="1075" d="M86 549q0 176 24.5 284.5t87 166t144.5 77t219 19.5q82 0 136.5 -4.5t109.5 -17.5t88 -38.5t60.5 -68.5t39 -107.5t11.5 -154.5q0 -266 -295 -267h-387q0 -154 48 -201t173 -47q299 0 440 23v-166q-170 -57 -541 -57q-205 0 -281.5 124t-76.5 435zM172 1335q0 47 34 81 t81 34t79.5 -34t32.5 -81t-32.5 -80.5t-79.5 -33.5t-81 33.5t-34 80.5zM324 625h340q104 0 104 88q0 123 -34 155.5t-161 32.5q-80 0 -116.5 -5t-73.5 -31.5t-48 -83t-11 -156.5zM694 1335q0 47 34 81t81 34t80 -34t33 -81t-33 -80.5t-80 -33.5t-81 33.5t-34 80.5z" /> +<glyph unicode="î" horiz-adv-x="444" d="M-86 1221l227 274h189l202 -274h-174l-129 131l-139 -131h-176zM104 0v1087h238v-1087h-238z" /> +<glyph unicode="ï" horiz-adv-x="444" d="M-152 1335q0 47 34 81t81 34t80 -34t33 -81t-33 -80.5t-80 -33.5t-81 33.5t-34 80.5zM104 0v1087h238v-1087h-238zM371 1335q0 47 33.5 81t80.5 34t80 -34t33 -81t-33 -80.5t-80 -33.5t-80.5 33.5t-33.5 80.5z" /> +<glyph unicode="ô" horiz-adv-x="1153" d="M86 528q0 330 107.5 450t384.5 120q279 0 384 -123t105 -447q0 -305 -105.5 -421.5t-383.5 -116.5q-276 0 -384 121.5t-108 416.5zM274 1221l228 274h188l203 -274h-174l-129 131l-139 -131h-177zM324 528q0 -115 13 -183.5t49 -101t77 -41.5t115 -9q78 0 117.5 8 t74.5 41.5t47 101.5t12 184q0 168 -24.5 246t-72.5 100.5t-154.5 22.5t-154.5 -22.5t-73.5 -100.5t-25.5 -246z" /> +<glyph unicode="ù" horiz-adv-x="1120" d="M86 352v735h238v-739q0 -164 143 -164q94 0 158.5 22.5t154.5 80.5v800h238v-1087h-184l-54 119q-14 -8 -62 -38t-69.5 -40t-62.5 -28.5t-82 -24.5t-88 -6q-170 0 -250 103t-80 267zM223 1499h230l198 -278h-170z" /> +<glyph unicode="û" horiz-adv-x="1120" d="M86 352v735h238v-739q0 -164 143 -164q94 0 158.5 22.5t154.5 80.5v800h238v-1087h-184l-54 119q-14 -8 -62 -38t-69.5 -40t-62.5 -28.5t-82 -24.5t-88 -6q-170 0 -250 103t-80 267zM244 1221l227 274h188l203 -274h-174l-129 131l-139 -131h-176z" /> +<glyph unicode="ü" horiz-adv-x="1120" d="M86 352v735h238v-739q0 -164 143 -164q94 0 158.5 22.5t154.5 80.5v800h238v-1087h-184l-54 119q-14 -8 -62 -38t-69.5 -40t-62.5 -28.5t-82 -24.5t-88 -6q-170 0 -250 103t-80 267zM178 1335q0 47 34 81t81 34t80 -34t33 -81t-33 -80.5t-80 -33.5t-81 33.5t-34 80.5z M700 1335q0 47 34 81t81 34t80 -34t33 -81t-33 -80.5t-80 -33.5t-81 33.5t-34 80.5z" /> +<glyph unicode="ÿ" horiz-adv-x="1165" d="M37 1087h252l215 -792q6 -20 15 -35.5t19.5 -24t20.5 -13.5t21.5 -6t18.5 -2t15 0l9 1l251 872h252l-413 -1431l-152 -209h-164l168 553q-223 0 -297 258zM207 1335q0 47 33.5 81t81 34t80 -34t32.5 -81t-32.5 -80.5t-80 -33.5t-81 33.5t-33.5 80.5zM729 1335q0 47 34 81 t81 34t79.5 -34t32.5 -81t-32.5 -80.5t-79.5 -33.5t-81 33.5t-34 80.5z" /> +<glyph unicode="Œ" horiz-adv-x="2099" d="M113 739q0 205 30.5 349.5t77.5 225.5t129 126t161 57t196 12q147 0 246.5 -24.5t168.5 -95.5q72 121 242 110q557 -20 641 -33v-194h-598q-49 0 -74.5 -19.5t-29 -39t-3.5 -56.5v-297l617 -20v-195l-617 -20v-297q0 -51 23 -76t43 -28t61 -3h578v-192l-621 -35 q-199 -12 -268 110q-121 -113 -409 -112q-88 0 -149.5 5t-128.5 23.5t-112 51t-87 88t-65.5 133.5t-37.5 190.5t-14 255.5zM350 739q0 -229 33 -338.5t103.5 -147.5t220.5 -38q143 0 214.5 39t106.5 150.5t35 334.5q0 156 -15.5 257.5t-38 159.5t-72.5 87t-97 36t-133 7 q-61 0 -96.5 -3t-78.5 -13t-67.5 -33t-49 -61.5t-36.5 -97t-20.5 -142.5t-8.5 -197z" /> +<glyph unicode="œ" horiz-adv-x="1814" d="M86 528q0 330 107.5 450t384.5 120q258 0 360 -113q51 66 136 88.5t229 22.5q125 0 195.5 -11.5t133 -49.5t88 -117.5t25.5 -212.5q0 -266 -295 -267h-385q-2 -145 47 -196.5t174 -51.5q299 0 438 23v-166q-170 -57 -540 -57q-178 0 -252 102q-102 -102 -354 -102 q-276 0 -384 121.5t-108 416.5zM324 528q0 -115 13 -183.5t49 -101t77 -41.5t115 -9q166 0 207.5 64.5t41.5 291.5q0 217 -48 282.5t-201 65.5q-106 0 -154.5 -22.5t-74 -100.5t-25.5 -246zM1065 625h338q104 0 104 88q0 123 -33.5 155.5t-160.5 32.5q-78 0 -119 -7t-76 -35 t-45 -83t-8 -151z" /> +<glyph unicode="Ÿ" horiz-adv-x="1325" d="M78 1499h258l328 -743l360 743h258l-502 -1010v-489h-237v489zM305 1747q0 47 34 80t81 33t79.5 -33t32.5 -80t-32.5 -81t-79.5 -34t-81 34t-34 81zM827 1747q0 47 34 80t81 33t80 -33t33 -80t-33 -81t-80 -34t-81 34t-34 81z" /> +<glyph unicode="ˆ" horiz-adv-x="792" d="M86 1087l227 273h189l205 -273h-175l-131 132l-139 -132h-176z" /> +<glyph unicode="˚" horiz-adv-x="587" d="M86 1294q0 88 61.5 149.5t147.5 61.5t146.5 -61.5t60.5 -149.5t-60.5 -148.5t-146.5 -60.5t-147.5 60.5t-61.5 148.5zM199 1294q0 -41 27.5 -68.5t68.5 -27.5t68.5 27.5t27.5 68.5t-28.5 70t-67.5 29t-67.5 -29t-28.5 -70z" /> +<glyph unicode="˜" horiz-adv-x="872" d="M86 1190q143 139 246 139q53 -2 120.5 -37t98.5 -35q68 -4 186 76l49 -108q-45 -43 -69.5 -64.5t-72.5 -47.5t-91 -23q-55 2 -123 35.5t-102 33.5q-41 0 -68 -8t-72 -32.5t-55 -31.5z" /> +<glyph unicode=" " horiz-adv-x="956" /> +<glyph unicode=" " horiz-adv-x="1913" /> +<glyph unicode=" " horiz-adv-x="956" /> +<glyph unicode=" " horiz-adv-x="1913" /> +<glyph unicode=" " horiz-adv-x="637" /> +<glyph unicode=" " horiz-adv-x="478" /> +<glyph unicode=" " horiz-adv-x="318" /> +<glyph unicode=" " horiz-adv-x="318" /> +<glyph unicode=" " horiz-adv-x="239" /> +<glyph unicode=" " horiz-adv-x="382" /> +<glyph unicode=" " horiz-adv-x="106" /> +<glyph unicode="‐" horiz-adv-x="724" d="M41 489v209h643v-209h-643z" /> +<glyph unicode="‑" horiz-adv-x="724" d="M41 489v209h643v-209h-643z" /> +<glyph unicode="‒" horiz-adv-x="724" d="M41 489v209h643v-209h-643z" /> +<glyph unicode="–" horiz-adv-x="1050" d="M41 483v211h969v-211h-969z" /> +<glyph unicode="—" horiz-adv-x="1507" d="M41 487v211h1425v-211h-1425z" /> +<glyph unicode="‘" horiz-adv-x="538" d="M139 1087v246q0 66 25.5 109t62.5 57t74 19.5t63 1.5l25 -4v-99q-68 2 -67 -67v-47h22q55 0 55 -56v-160q0 -59 -55 -59h-154q-51 0 -51 59z" /> +<glyph unicode="’" horiz-adv-x="538" d="M139 1303v159q0 59 56 60h153q51 0 51 -60v-248q0 -66 -25.5 -107.5t-62.5 -56t-73.5 -20.5t-62.5 -2l-25 4v98q68 0 67 70v47h-22q-56 1 -56 56z" /> +<glyph unicode="‚" horiz-adv-x="538" d="M139 53v162q0 59 56 59h153q51 0 51 -59v-248q0 -66 -25.5 -108.5t-62.5 -57t-73.5 -19.5t-62.5 -1l-25 4v98q68 -2 67 70v45h-22q-56 0 -56 55z" /> +<glyph unicode="“" horiz-adv-x="864" d="M127 1085v248q0 169 164 184q46 4 86 -4v-98q-68 2 -68 -67v-45h23q55 0 55 -56v-162q0 -59 -55 -59h-154q-51 0 -51 59zM479 1085v248q0 169 164 184q46 4 86 -4v-98q-68 2 -67 -67v-45h24q53 0 53 -56v-162q0 -59 -53 -59h-154q-53 0 -53 59z" /> +<glyph unicode="”" horiz-adv-x="864" d="M127 1300v160q0 59 53 60h154q53 0 53 -60v-246q0 -66 -25.5 -108.5t-62.5 -57t-74 -19.5t-62 -1l-26 4v96q68 0 68 70v47h-25q-53 0 -53 55zM479 1300v160q0 59 56 60h153q51 0 51 -60v-246q0 -66 -25.5 -108.5t-62.5 -57t-72.5 -19.5t-61.5 -1l-25 4v96q68 0 67 70v47 h-24q-56 0 -56 55z" /> +<glyph unicode="„" horiz-adv-x="864" d="M127 53v162q0 59 53 59h154q53 0 53 -59v-248q0 -66 -25.5 -108.5t-62.5 -57t-74 -19.5t-62 -1l-26 4v98q68 -2 68 70v45h-25q-53 0 -53 55zM479 53v162q0 59 56 59h153q51 0 51 -59v-248q0 -66 -25.5 -108.5t-62.5 -57t-72.5 -19.5t-61.5 -1l-25 4v98q68 -2 67 70v45 h-24q-56 0 -56 55z" /> +<glyph unicode="…" horiz-adv-x="1658" d="M520 47v160q0 51 49 51h152h8h8h152h8h6h152q51 0 51 -51v-160q0 -47 -51 -47h-152h-6h-8h-152h-8h-8h-152q-49 0 -49 47z" /> +<glyph unicode=" " horiz-adv-x="382" /> +<glyph unicode="‹" horiz-adv-x="729" d="M86 725l422 416l139 -137l-285 -279l293 -287l-137 -139z" /> +<glyph unicode="›" horiz-adv-x="729" d="M86 438l293 287l-285 279l139 137l422 -416l-432 -426z" /> +<glyph unicode=" " horiz-adv-x="478" /> +<glyph unicode="€" horiz-adv-x="1259" d="M35 516v123l166 16v164l-166 17v114l166 21q0 51 1 78.5t10 92t25.5 106.5t53.5 98.5t87 89t132 56.5t184 24q88 0 251 -20.5t272 -49.5v-176q-311 29 -480 28q-104 0 -166.5 -20.5t-90 -69.5t-35 -98t-7.5 -139l480 -17v-123l-480 -12v-164l480 -16v-123q-31 0 -81.5 -2 t-156 -5t-175 -5t-67.5 -4q0 -168 79 -235.5t220 -67.5q84 0 206 10t202 20l80 11v-172q-211 -78 -531 -78q-57 0 -112.5 8t-128 40t-126 83t-90 150.5t-36.5 230.5z" /> +<glyph unicode="™" horiz-adv-x="1433" d="M35 1348v151h559v-151h-195v-564h-168v564h-196zM645 784l70 715h170l147 -444l123 444h176l78 -715h-168l-37 392l-98 -392h-143l-121 392l-31 -392h-166z" /> +<glyph unicode="" horiz-adv-x="1085" d="M0 1085h1085v-1085h-1085v1085z" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-DemiBold-webfont.ttf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-DemiBold-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..6f709ca56eb023a84f95d5a7dbcbc4953cafd4b9 Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-DemiBold-webfont.ttf differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-DemiBold-webfont.woff b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-DemiBold-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..fd480b42263c63310cb3dee7de5f5bcae9250255 Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-DemiBold-webfont.woff differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-ExtraBold-Italic-webfont.eot b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-ExtraBold-Italic-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..6f248f53e581e084bca7990c1409aacca9036fb6 Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-ExtraBold-Italic-webfont.eot differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-ExtraBold-Italic-webfont.svg b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-ExtraBold-Italic-webfont.svg new file mode 100644 index 0000000000000000000000000000000000000000..8fdec32868abf40c0e2d23cbc976c114501ef1ef --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-ExtraBold-Italic-webfont.svg @@ -0,0 +1,187 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Copyright c 2011 Natanael Gama exondiscoveredcom with Reserved Font Name Exo +Designer : Natanael Gama +</metadata> +<defs> +<font id="ExoExtraBoldItalic" horiz-adv-x="1142" > +<font-face units-per-em="2048" ascent="1638" descent="-410" /> +<missing-glyph horiz-adv-x="512" /> +<glyph unicode=" " horiz-adv-x="512" /> +<glyph unicode="	" horiz-adv-x="512" /> +<glyph unicode=" " horiz-adv-x="512" /> +<glyph unicode="!" horiz-adv-x="561" d="M131 47l33 209q6 51 57 51h205q49 0 41 -51l-35 -209q-6 -47 -53 -47h-205q-49 0 -43 47zM207 403l141 1094h330l-209 -1094h-262z" /> +<glyph unicode=""" horiz-adv-x="958" d="M313 1087l19 275l22 137h322l-23 -137l-63 -275h-277zM715 1087l22 275l21 137h321l-22 -137l-64 -275h-278z" /> +<glyph unicode="#" horiz-adv-x="1501" d="M92 414l72 229h307l70 215h-310l74 229h318l141 412h229l-141 -412h219l141 412h230l-142 -412h349l-72 -229h-348l-72 -217h350l-69 -229h-367l-141 -412h-230l142 412l-221 2l-142 -414h-229l141 414h-299zM700 643l228 -2l71 217h-229z" /> +<glyph unicode="$" horiz-adv-x="1163" d="M131 49l41 258q266 -20 471 -20q156 0 174 110l8 60q10 63 -8 90.5t-96 27.5h-160q-102 0 -174 38t-103.5 88.5t-46 120t-12.5 115.5t8 91l19 127q16 106 58 178t109.5 109t137.5 51t164 18l29 177h194l-26 -179q178 -8 346 -61l-41 -260q-221 18 -445 18 q-96 2 -140 -21.5t-56 -99.5l-9 -51q-10 -68 14.5 -95.5t112.5 -27.5h166q106 0 178 -48t96.5 -116.5t34 -147.5t-7.5 -140l-12 -86q-20 -125 -68.5 -207t-119 -119t-137 -50t-154.5 -13l-27 -168h-194l26 170q-119 4 -182.5 16t-167.5 47z" /> +<glyph unicode="%" horiz-adv-x="1976" d="M213 1010l37 241q23 131 95.5 189.5t227.5 58.5h207q279 0 232 -291l-37 -241q-23 -133 -95.5 -192.5t-226.5 -59.5h-207q-137 0 -195 80t-38 215zM410 0l1159 1499h225l-1147 -1499h-237zM446 1032q-8 -49 6.5 -70.5t65.5 -21.5h131q55 0 78 22.5t31 69.5l22 150 q8 55 -8 73.5t-67 18.5h-130q-51 0 -74.5 -18.5t-31.5 -73.5zM1204 291l37 241q20 135 93 195.5t229 60.5h206q279 0 234 -292l-35 -242q-20 -135 -95 -192.5t-231 -57.5h-208q-137 0 -193.5 77t-36.5 210zM1436 322q-6 -49 8 -71t67 -22h127q57 0 80 22.5t29 70.5l22 149 q8 55 -7 73.5t-66 18.5h-129q-51 0 -76 -18.5t-33 -73.5z" /> +<glyph unicode="&" horiz-adv-x="1411" d="M116 477.5q38 149.5 199 270.5l183 137l-74 131q-61 115 -41 216t94 174t164 87q260 41 598 -39l-39 -246h-309q-123 0 -143.5 -36.5t40.5 -145.5l236 -412l279 238l98 -145l-144 -250l-94 -90l211 -367h-370l-103 180l-156 -119q-74 -57 -181 -72.5t-220 30.5t-176 155 q-90 154 -52 303.5zM440 356q35 -53 87.5 -63t117.5 39l109 90l-129 215l-117 -84q-129 -103 -68 -197z" /> +<glyph unicode="'" horiz-adv-x="487" d="M270 1087l21 275l22 137h338l-22 -137l-64 -275h-295z" /> +<glyph unicode="(" horiz-adv-x="802" d="M181 316.5q3 148.5 28 306.5q23 145 65.5 282t92 238.5t103.5 190.5t103.5 149.5t89 103.5t63.5 63l24 19h307q-16 -20 -45 -57t-106 -155t-140.5 -238.5t-129 -298t-91.5 -345.5q-31 -197 -25 -363.5t36 -302.5t63.5 -231.5t61.5 -147.5l28 -52h-303q-6 8 -17.5 23.5 t-43.5 69.5t-57.5 115.5t-53 163t-42 210t-11.5 257z" /> +<glyph unicode=")" horiz-adv-x="806" d="M-41 -522q16 18 45 53t104.5 147.5t139 233.5t129 302t96.5 359q29 184 22.5 348t-37 301.5t-64.5 237t-60 154.5l-27 55h303q6 -8 17.5 -25.5t42 -75t56.5 -122t53.5 -166.5t42 -209.5t13.5 -251t-26 -291.5q-25 -156 -67 -298t-88 -245.5t-97 -191.5t-96 -144.5 t-82 -96t-58 -57.5l-22 -17h-340z" /> +<glyph unicode="*" horiz-adv-x="864" d="M250 1159l20 127l293 45l-18 -182zM311 854l95 281l172 -45l-152 -275zM526 948l125 154l201 -184l-90 -103zM565 1477l127 41l92 -254l-180 -68zM666 1169l270 164l55 -106l-233 -199z" /> +<glyph unicode="+" horiz-adv-x="964" d="M150 592l43 274h286l45 289h275l-45 -289h290l-43 -274h-290l-47 -289h-275l47 289h-286z" /> +<glyph unicode="," horiz-adv-x="526" d="M98 -180l19 110q41 0 54 13.5t17 36.5l2 20h-22q-51 0 -43 51l33 203q10 55 59 55h197q49 0 41 -55l-45 -277q-28 -181 -228 -170q-48 2 -84 13z" /> +<glyph unicode="-" horiz-adv-x="722" d="M125 457l43 274h643l-43 -274h-643z" /> +<glyph unicode="." horiz-adv-x="530" d="M123 47l35 209q6 51 57 51h201q53 0 43 -51l-35 -209q-8 -47 -57 -47h-201q-49 0 -43 47z" /> +<glyph unicode="/" horiz-adv-x="976" d="M4 -147l848 1724h346l-848 -1724h-346z" /> +<glyph unicode="0" horiz-adv-x="1277" d="M154 377l116 729q61 393 416 393h336q201 0 282.5 -108.5t57.5 -268.5l-117 -745q-61 -377 -401 -377h-336q-188 0 -285.5 98.5t-68.5 278.5zM500 363.5q8 -29.5 29.5 -41t39 -14.5t45.5 -3h150q68 0 104.5 27.5t49.5 105.5l100 623q10 72 -14.5 102.5t-85.5 30.5h-173 q-129 0 -147 -133l-98 -621q-8 -47 0 -76.5z" /> +<glyph unicode="1" horiz-adv-x="765" d="M229 1114l33 217q43 0 145.5 54.5t153.5 113.5h332l-238 -1499h-336l187 1167q-76 -53 -277 -53z" /> +<glyph unicode="2" horiz-adv-x="1193" d="M70 0l47 293q135 82 308 206t347 286.5t189 254.5q16 98 -33 135t-183 37h-497l39 250q303 57 618 58q219 0 320.5 -148.5t68.5 -363.5q-8 -55 -33.5 -114.5t-55 -108t-84 -106.5t-89.5 -93t-101.5 -90.5t-92 -75t-90 -66.5t-66.5 -49h498l-50 -305h-1060z" /> +<glyph unicode="3" horiz-adv-x="1185" d="M59 43l41 250h488q117 0 166 22.5t61 98.5l6 45q6 45 0 71.5t-34.5 39t-55 16.5t-84.5 6l-373 18l45 273l377 16q113 4 160 28.5t59 98.5l7 47q10 55 -15.5 84t-61.5 35t-102 6h-514l39 248q88 29 207 43t231.5 15t239.5 -1q164 -4 255 -115.5t65 -283.5l-17 -96 q-37 -231 -209 -263q160 -51 115 -339l-12 -76q-55 -344 -451 -344h-76h-80q-16 0 -72 1t-77.5 2t-69 4t-73 7t-62.5 10t-65.5 14.5t-57.5 18.5z" /> +<glyph unicode="4" horiz-adv-x="1284" d="M98 459l654 1040h366l-530 -881h289l51 314l88 158h274l-76 -472h140l-41 -258l-148 -53l-47 -303h-336l45 303h-684z" /> +<glyph unicode="5" horiz-adv-x="1216" d="M111 41l43 266h561q61 0 97 23.5t45 47t13 58.5l17 101q20 133 -99 133h-145q-109 0 -127 -109h-319l192 938h928l-49 -305h-600l-58 -281q57 37 152 48q59 6 186 -3q162 -10 232.5 -121.5t48.5 -281.5l-33 -231q-53 -332 -455 -332q-211 0 -327.5 8t-302.5 41z" /> +<glyph unicode="6" horiz-adv-x="1236" d="M180 416.5q0 158.5 33 400.5q31 195 82 332t117.5 209t130 104.5t139.5 40.5q289 33 657 -41l-41 -256h-483q-53 0 -94 -20.5t-65.5 -48t-43 -76.5t-26.5 -86t-19 -94q133 41 375 41q106 0 176 -34t97.5 -90.5t37 -128t-7.5 -145.5l-33 -221q-29 -180 -134 -242.5 t-296 -62.5h-286q-94 0 -159 37t-111 130t-46 251.5zM521 385q26 -82 134 -82h111q55 0 87 23.5t42 89.5l16 94q12 74 -3 98.5t-81 24.5h-299q-33 -166 -7 -248z" /> +<glyph unicode="7" horiz-adv-x="1140" d="M229 1194l50 305h974l62 -143l-701 -1356h-362l625 1194h-648z" /> +<glyph unicode="8" horiz-adv-x="1269" d="M158 385l20 131q14 86 65.5 140.5t135.5 66.5q-66 31 -96.5 89t-27.5 117.5t9 123.5l21 133q12 82 42.5 142.5t70.5 95t97.5 54t110.5 25.5t125 6h316q176 0 255.5 -99t51.5 -288l-17 -100q-10 -61 -56 -127t-138 -80q86 -20 107.5 -120.5t2.5 -194.5l-24 -168 q-12 -78 -35 -136.5t-57.5 -94t-67.5 -57t-84 -31t-86 -11.5t-94 -2h-313q-393 0 -334 385zM502 399q-10 -61 12.5 -84.5t91.5 -23.5h156q121 0 135 108l18 117q16 113 -94 113h-164q-121 0 -137 -113zM598 1012q-10 -66 16.5 -88.5t85.5 -22.5h160q74 0 99.5 26.5 t35.5 84.5l11 82q12 80 -12.5 103.5t-84.5 23.5h-155q-70 0 -100.5 -26t-43.5 -101z" /> +<glyph unicode="9" horiz-adv-x="1234" d="M137 41l41 254h484q66 0 111.5 26.5t72 81t40 100.5t25.5 120q-131 -43 -376 -43q-104 0 -174 36.5t-96.5 95t-36 132.5t7.5 147l30 193q27 182 133.5 250.5t292.5 68.5h287q129 0 205 -76.5t104.5 -265t-26.5 -506.5q-25 -158 -65 -275.5t-83 -185t-100.5 -111.5 t-106.5 -60.5t-110 -24.5q-300 -35 -660 43zM567 991q-12 -74 3.5 -98.5t80.5 -24.5h299q31 166 4.5 249t-135.5 83h-108q-55 0 -87 -23.5t-42 -89.5z" /> +<glyph unicode=":" horiz-adv-x="532" d="M123 47l35 209q6 51 57 51h201q53 0 43 -51l-35 -209q-8 -47 -57 -47h-201q-49 0 -43 47zM248 827l33 209q6 51 57 51h201q49 0 43 -51l-33 -209q-8 -47 -57 -47h-201q-49 0 -43 47z" /> +<glyph unicode=";" horiz-adv-x="532" d="M98 -180l19 110q41 0 54 13.5t17 36.5l2 20h-22q-23 0 -35 13.5t-8 37.5l33 203q10 55 59 55h197q49 0 41 -55l-45 -277q-28 -181 -228 -170q-48 2 -84 13zM250 827l33 209q6 53 57 54h201q53 0 43 -54l-33 -209q-8 -45 -59 -45h-201q-47 0 -41 45z" /> +<glyph unicode="<" horiz-adv-x="903" d="M158 569l49 303l813 283l-49 -303l-453 -139l408 -142l-47 -301z" /> +<glyph unicode="=" horiz-adv-x="956" d="M96 356l43 275h875l-43 -275h-875zM166 801l43 274h876l-45 -274h-874z" /> +<glyph unicode=">" horiz-adv-x="903" d="M111 270l49 303l456 164l-413 119l47 299l723 -283l-47 -303z" /> +<glyph unicode="?" horiz-adv-x="1112" d="M217 1208l41 250q313 68 586 55q213 0 314.5 -129t74.5 -294l-21 -162q-29 -211 -149.5 -290t-366.5 -63q0 -2 -13 -88t-13 -88h-260l65 424h215q166 6 191 156l10 76q14 82 -30 117.5t-150 35.5h-494zM332 47l33 209q6 51 57 51h201q53 0 43 -51l-35 -209 q-6 -47 -58 -47h-200q-47 0 -41 47z" /> +<glyph unicode="@" horiz-adv-x="1857" d="M87 -51.5q-1 71.5 7 145.5l154 973q39 238 176 332t383 94h737q422 0 348 -518l-98 -647q-23 -160 -113 -241t-299 -81h-217l-49 109q-92 -125 -256 -123q-190 4 -272 156.5t-39 441.5q25 162 76 272.5t120.5 163.5t137 72.5t151.5 19.5q317 0 465 -139l-102 -713 q78 0 105.5 32t45.5 153l82 555q20 139 -16.5 183t-143.5 44h-720q-129 0 -178.5 -62.5t-65.5 -164.5l-150 -940q-16 -100 20 -152.5t159 -52.5h790l-33 -203q-276 -55 -598 -55h-186q-111 0 -193 27.5t-128 74.5t-72.5 109.5t-27.5 134zM794 404.5q-3 -68.5 27.5 -112.5 t100.5 -42q174 6 229 139l70 455q-86 16 -197 16q-90 0 -141 -67.5t-76 -241.5q-10 -78 -13 -146.5z" /> +<glyph unicode="A" horiz-adv-x="1429" d="M61 0l727 1499h390l235 -1499h-344l-53 301h-441l-141 -301h-373zM705 592h284l-67 481z" /> +<glyph unicode="B" horiz-adv-x="1228" d="M111 0l237 1499h619q221 0 310 -123q67 -93 68 -224q0 -43 -8 -89q-16 -115 -86.5 -193.5t-175.5 -91.5q97 -16 153 -120q41 -77 41 -179q0 -37 -5 -76q-18 -129 -57.5 -209.5t-109 -122.5t-151.5 -56.5t-211 -14.5h-624zM492 291h274q137 0 164 174q5 28 5 53 q1 44 -15 77q-24 52 -97 52h-274zM594 922h258q61 0 100 37.5t49 103.5q4 22 4 41q0 104 -108 104h-258z" /> +<glyph unicode="C" horiz-adv-x="1165" d="M180 384q-6 62 -7 131q0 130 22 286q59 375 198 545t434 170q180 0 289 -16.5t232 -61.5l-43 -262q-204 34 -401 34h-32q-47 0 -65.5 -1t-56 -8t-55 -23.5t-47.5 -49t-46 -82t-35.5 -124t-36.5 -172.5q-24 -132 -24 -223q0 -83 20 -131q41 -102 199 -103q18 0 37 -1 q188 0 407 19l-41 -262q-165 -62 -475 -62q-32 0 -65 1q-182 2 -286 109.5t-122 286.5z" /> +<glyph unicode="D" horiz-adv-x="1333" d="M111 0l237 1499h625q152 0 250 -68.5t134 -180.5t44 -256q2 -30 1 -59q0 -116 -24 -239q-59 -393 -201.5 -544.5t-414.5 -151.5h-651zM492 291h262q119 0 187.5 112.5t102.5 341.5q24 130 24 220q0 38 -4 69q-15 103 -56 138.5t-123 35.5h-248z" /> +<glyph unicode="E" d="M147 328l138 860q16 96 55 161.5t97.5 96.5t116.5 42t132 11q453 -8 629 -33l-45 -280h-541q-39 0 -63.5 -9.5t-37 -29t-16.5 -34.5t-8 -42l-24 -164l544 -22l-45 -277l-551 -18l-28 -176q-6 -39 0 -62.5t27.5 -32t37 -10.5t45.5 -2h523l-46 -278q-74 -8 -228 -17.5 t-273 -13.5l-119 -4h-16q-53 0 -103 11q-58 13 -112 47t-78 105q-16 45 -16 102q0 33 5 69z" /> +<glyph unicode="F" horiz-adv-x="1144" d="M102 0l183 1155q31 188 141 267q108 77 256 77h8q451 -8 629 -33l-45 -280h-541q-37 0 -61.5 -9.5t-36.5 -29t-17.5 -34.5t-9.5 -42l-26 -170l546 -20l-43 -279l-555 -18l-92 -584h-336z" /> +<glyph unicode="G" horiz-adv-x="1259" d="M171 512q1 141 32 305q37 190 78 312t111.5 214.5t174 132.5t254.5 40q197 0 296.5 -13.5t279.5 -62.5l-41 -256q-2 0 -60.5 8t-117 14t-146.5 12.5t-164 6.5q-94 0 -149 -32t-101.5 -137.5t-76.5 -303.5q-27 -149 -27 -245q0 -65 12 -107q31 -101 172 -101 q59 0 114.5 24.5t80.5 50.5l25 25l36 213h-161l32 211q115 49 367 49q90 0 139 -4l-139 -868h-240l-75 104q-55 -57 -121 -83.5t-183 -32.5h-23q-134 0 -220 64q-94 69 -127 194q-32 121 -32 258v8z" /> +<glyph unicode="H" horiz-adv-x="1302" d="M113 0l237 1499h336l-98 -622h440l98 622h336l-237 -1499h-336l90 573h-440l-90 -573h-336z" /> +<glyph unicode="I" horiz-adv-x="546" d="M115 0l237 1499h336l-237 -1499h-336z" /> +<glyph unicode="J" horiz-adv-x="727" d="M55 49l43 264q29 -1 55 -1q112 0 159 28q59 35 79 168l158 991h336l-185 -1161q-39 -231 -157 -301q-82 -46 -224 -46h-28q-162 5 -236 58z" /> +<glyph unicode="K" horiz-adv-x="1306" d="M111 0l237 1499h320l-97 -610h91l440 610h405l-553 -778l316 -721h-381l-240 598h-123l-94 -598h-321z" /> +<glyph unicode="L" horiz-adv-x="1079" d="M156 303l190 1196h336l-172 -1087q-6 -39 0 -62.5t27.5 -32t37 -10.5t46.5 -2h473l-50 -305h-612q-143 0 -222 74q-60 56 -60 159q0 32 6 70z" /> +<glyph unicode="M" horiz-adv-x="1714" d="M84 0l383 1499h463l47 -942l342 942h473l-88 -1499h-330l58 920l-340 -920h-387l-54 920l-229 -920h-338z" /> +<glyph unicode="N" horiz-adv-x="1376" d="M111 0l237 1499h338l373 -887l139 887h336l-238 -1499h-333l-377 870l-137 -870h-338z" /> +<glyph unicode="O" horiz-adv-x="1363" d="M178 520q2 114 25 258q20 129 48 232.5t64.5 178.5t73.5 129t89 89t96 56.5t111 30.5t117 12t128 3q82 0 145.5 -8t126 -30.5t106.5 -60.5t78 -100q36 -61 50 -145q13 -74 12 -173v-28q-2 -116 -25 -264q-25 -162 -62.5 -281.5t-90.5 -196.5t-107.5 -124t-136.5 -69.5 t-151.5 -29.5t-174.5 -7q-84 0 -147.5 7t-127 28.5t-107.5 58.5t-78 96q-36 60 -50 142q-13 72 -12 169v27zM534 381q38 -84 207 -84q160 0 233 88t113 354q19 125 23 208q1 22 1 41q0 56 -7 94q-10 52 -41 78t-71 35t-105 9q-113 0 -169 -26.5t-101 -127t-78 -311.5 q-23 -146 -23 -239q1 -80 18 -119z" /> +<glyph unicode="P" horiz-adv-x="1224" d="M106 0l238 1499h627q80 0 148.5 -24.5t128.5 -80.5q58 -56 82 -162q12 -54 12 -117q0 -62 -11 -134q-16 -115 -50 -200t-76 -131t-91 -76.5t-100 -35.5q-50 -6 -102 -9q-17 -1 -34 -1q-32 0 -61 4q-59 4 -167.5 20.5t-117.5 20.5l-90 -573h-336zM571 823h260q66 0 106 46 t56 153q5 34 5 62q0 124 -105 124h-260z" /> +<glyph unicode="Q" horiz-adv-x="1366" d="M180 528q2 115 25 258q23 147 57.5 260t72.5 190t94 129t104.5 81t123 43t130 17t145.5 3q82 0 145.5 -8t126 -31.5t106.5 -62.5t77.5 -101.5t48.5 -146.5q14 -74 14 -175v-26q-2 -118 -25 -266q-23 -139 -54.5 -245.5t-68 -180t-91 -125t-102.5 -80t-123 -44t-133 -19.5 t-151 -6q-82 0 -146 8t-127.5 29.5t-108 59.5t-79 98.5t-49.5 142.5q-12 72 -12 170v28zM536 381q37 -84 209 -84q158 0 231 87t114 355q20 125 23 207q1 20 1 39q0 56 -7 97q-9 53 -41 78.5t-71 34.5t-106 9q-113 0 -169 -26.5t-101 -127t-78 -311.5q-23 -146 -23 -239 q0 -80 18 -119zM588 -68h184q17 -85 151 -85q69 0 169 22l-41 -256q-64 -12 -123 -12q-56 0 -108 11q-109 21 -178 104q-57 67 -57 168q0 23 3 48z" /> +<glyph unicode="R" horiz-adv-x="1230" d="M106 0l238 1499h631q195 0 295 -126q72 -91 72 -251q0 -62 -11 -135q-14 -104 -45 -181t-60.5 -117t-72.5 -65.5t-66.5 -31.5t-56.5 -12l211 -580h-381l-166 563l-162 15l-90 -578h-336zM575 834h252q78 0 115 44t51 148q4 36 4 64q0 52 -14 78q-22 40 -92 40h-256z" /> +<glyph unicode="S" horiz-adv-x="1191" d="M139 49l41 262q173 -22 479 -22h27q158 0 174 108l8 60q3 20 3 37q0 32 -13 52q-20 28 -94 29h-178q-90 0 -157 23t-103.5 62.5t-60 82.5t-29.5 95q-5 44 -4 76v11q1 36 6 70l20 164q16 109 58 181.5t111 108.5t137.5 49t164.5 13h59q335 0 519 -63l-41 -262 q-246 20 -480 20h-17q-87 0 -124 -20q-41 -22 -53 -101l-8 -51q-4 -24 -4 -42q0 -42 18 -58q26 -24 111 -23h186q104 0 177 -42t98.5 -103t37.5 -134q6 -33 6 -64q0 -37 -8 -70l-8 -133q-6 -104 -44 -179t-84 -113t-119.5 -59.5t-125 -25.5t-125.5 -4q-211 0 -327.5 12 t-233.5 53z" /> +<glyph unicode="T" horiz-adv-x="1212" d="M238 1194l49 305h1132l-49 -305h-405l-189 -1194h-336l189 1194h-391z" /> +<glyph unicode="U" horiz-adv-x="1337" d="M193 456.5q0 104.5 20 235.5l129 807h338l-135 -852q-15 -93 -15 -160q0 -73 18 -113q34 -78 181 -79q143 0 202.5 82t88.5 270l135 852h338l-127 -899q-27 -166 -78 -281.5t-110.5 -179t-148.5 -98.5t-162.5 -43t-182.5 -8q-70 0 -125 6t-114.5 24.5t-101.5 49t-79 84 t-54 126t-17 177z" /> +<glyph unicode="V" horiz-adv-x="1415" d="M276 1499h355l119 -1073l475 1073h372l-712 -1499h-398z" /> +<glyph unicode="W" horiz-adv-x="2074" d="M276 1499h353l123 -1057l428 1057h356l-166 -377l98 -682l437 1059h354l-649 -1499h-385l-86 561l-242 -561h-410z" /> +<glyph unicode="X" horiz-adv-x="1349" d="M61 0l551 774l-317 725h369l180 -467l327 467h377l-563 -790l311 -709h-370l-172 451l-316 -451h-377z" /> +<glyph unicode="Y" horiz-adv-x="1363" d="M276 1499h365l139 -692l385 692h381l-651 -1059l-72 -440h-336l72 440z" /> +<glyph unicode="Z" horiz-adv-x="1136" d="M49 0l49 305l774 889h-634l49 305h1040l-49 -305l-746 -889h607l-49 -305h-1041z" /> +<glyph unicode="[" horiz-adv-x="694" d="M107 -204q-8 83 10 155l217 1331q31 188 130 269t314 81h164l-45 -274h-86q-63 0 -100 -36t-52 -126l-206 -1274q-16 -98 7 -134t89 -36h94l-43 -274h-188q-106 0 -177 47t-95.5 117.5t-32.5 153.5z" /> +<glyph unicode="\" horiz-adv-x="962" d="M274 1577h338l303 -1724h-337z" /> +<glyph unicode="]" horiz-adv-x="684" d="M-41 -522l43 274h88q63 0 100 36t54 126l200 1274q16 96 -8 133t-92 37h-86l43 274h170q100 0 170 -36.5t101.5 -99t44 -143.5t-4.5 -169l-196 -1356q-25 -166 -118 -258t-314 -92h-195z" /> +<glyph unicode="^" horiz-adv-x="780" d="M242 1087l258 283h237l148 -283h-205l-76 119l-117 -119h-245z" /> +<glyph unicode="_" horiz-adv-x="1378" d="M53 -2l45 274h1299l-45 -274h-1299z" /> +<glyph unicode="`" horiz-adv-x="501" d="M244 1376h268l135 -289h-201z" /> +<glyph unicode="a" horiz-adv-x="1114" d="M152 623q27 129 72.5 222t95 142t121 77t122.5 35t127 9q16 0 33 1q125 1 253 -27q146 -30 218 -101l-143 -977h-263l-51 107q-39 -55 -128 -89t-183 -34q-166 0 -250 164q-49 95 -50 239q0 103 26 232zM470 351q18 -87 99 -87q135 0 197 105l70 465q-52 22 -106 22 q-32 0 -64 -8q-47 -10 -77 -27.5t-62 -79t-48 -170.5q-16 -79 -16 -142q-1 -43 7 -78z" /> +<glyph unicode="b" horiz-adv-x="1140" d="M82 0l254 1608h336l-90 -572q152 68 311 68q143 0 215 -85t75 -225v-30q0 -128 -22 -287q-45 -271 -144 -381q-97 -109 -291 -108h-7q-162 2 -283 118l-71 -106h-283zM471 324q57 -57 193 -58q63 0 100 59.5t63 227.5q17 113 17 179q0 38 -6 60q-16 60 -84 60 q-129 0 -205 -37z" /> +<glyph unicode="c" horiz-adv-x="1003" d="M154 590q27 164 69.5 270.5t104 157.5t123 69.5t147.5 18.5q307 0 504 -70l-33 -202q-162 14 -344 14q-78 0 -114 -13.5t-67.5 -81t-56.5 -212.5q-12 -81 -14 -133q0 -12 -1 -24q0 -36 5 -60q6 -32 28.5 -49t50.5 -22t75 -5q84 0 175 5t140 9l49 4l-32 -205 q-115 -45 -231 -60q-92 -12 -228 -12q-36 0 -76 1q-166 2 -244 150q-48 91 -49 241q0 93 19 209z" /> +<glyph unicode="d" horiz-adv-x="1124" d="M152 600q23 125 51 210t77.5 155.5t128 104.5t187.5 34q164 0 293 -68l90 572h336l-256 -1608h-281l-41 106q-157 -118 -308 -118h-3q-184 0 -252 173q-41 103 -41 238q0 93 19 201zM486 324q18 -58 79 -58q133 0 209 58l78 491q-61 37 -195 37q-61 0 -98.5 -59.5 t-66.5 -239.5q-14 -99 -14 -160q0 -45 8 -69z" /> +<glyph unicode="e" horiz-adv-x="1081" d="M156 631q33 180 83 275t162.5 148.5t309.5 53.5h11q190 0 310 -68q117 -66 118 -224q0 -10 -1 -21q-6 -143 -71.5 -237.5t-153.5 -128.5t-188 -42q-44 -4 -81 -4q-47 0 -85 6q-67 10 -97 23q-5 -32 -5 -57q0 -54 24 -76q34 -33 145 -33h35q179 0 385 37l-41 -238 q-211 -64 -450 -64q-67 0 -136 5q-300 19 -300 393q0 110 26 252zM500 629q10 -2 30 -5q19 -2 68 -4q7 0 13 -1q41 1 75 9q39 10 75 38t44 75q3 16 3 29q0 38 -22 56q-26 22 -89 22h-11q-53 0 -87 -16.5t-53.5 -52.5t-27.5 -65.5t-18 -84.5z" /> +<glyph unicode="f" horiz-adv-x="829" d="M160 844l33 209l167 34l27 170q31 195 127 274t283 79q158 0 254 -49l-31 -197l-170 2h-8q-71 0 -92 -35q-21 -37 -41 -166l-13 -78h234l-37 -243h-236l-137 -844h-336l135 844h-159z" /> +<glyph unicode="g" d="M27 -508l34 223h437q80 0 135 49.5t69 145.5l27 172q-104 -78 -250 -78q-227 0 -297 159q-43 95 -43 242q0 98 19 218q43 266 164.5 376.5t322.5 110.5q160 0 330 -20.5t248 -47.5l-187 -1177q-69 -427 -453 -427q-40 0 -83 5zM478 343q14 -85 108 -85q96 0 178 41 l90 565h-166q-51 0 -87 -25.5t-56.5 -73.5t-30.5 -86t-18 -95q-23 -108 -23 -182q0 -33 5 -59z" /> +<glyph unicode="h" horiz-adv-x="1130" d="M82 0l254 1602h336l-101 -627q59 43 95 64.5t106 44t148 22.5q96 0 157.5 -31t84 -84t27.5 -125q1 -17 1 -34q0 -56 -12 -119l-113 -713h-336l113 717q3 24 3 44q-1 37 -13 57q-20 30 -66 30q-131 0 -225 -86l-123 -762h-336z" /> +<glyph unicode="i" horiz-adv-x="485" d="M76 0l172 1087h336l-172 -1087h-336zM266 1243l31 207q6 51 57 51h256q38 0 38 -37q0 -7 -1 -14l-31 -207q-6 -47 -55 -47h-254q-42 0 -42 37q0 5 1 10z" /> +<glyph unicode="j" horiz-adv-x="518" d="M4 -553l262 1640h336l-176 -1095q-49 -358 -168 -545h-254zM281 1243l32 207q6 51 58 51h256q40 0 40 -37q0 -7 -1 -14l-33 -207q-6 -47 -55 -47h-254q-44 0 -44 37q0 5 1 10z" /> +<glyph unicode="k" horiz-adv-x="1116" d="M82 0l254 1602h336l-142 -893q121 47 221.5 147t141.5 231h352q-94 -344 -368 -497l303 -590h-369l-238 481l-77 -2l-78 -479h-336z" /> +<glyph unicode="l" horiz-adv-x="643" d="M139 387l193 1217h336l-183 -1155q-6 -62 -6 -100q-1 -37 5 -53q12 -32 57 -52q96 -41 106 -41l-31 -203h-200q-156 0 -233 93q-54 65 -54 183q0 51 10 111z" /> +<glyph unicode="m" horiz-adv-x="1775" d="M82 0l172 1087h276l43 -112q68 47 100 67.5t98.5 41t143.5 20.5q199 0 250 -137q219 137 400 137q178 0 232 -104q36 -68 35 -172q0 -54 -9 -119l-115 -709h-336l115 717q4 24 4 44q0 85 -80 85q-145 0 -227 -76l-10 -61l-113 -709h-336l113 717q3 22 3 41q0 88 -79 88 q-125 0 -223 -86l-121 -760h-336z" /> +<glyph unicode="n" horiz-adv-x="1130" d="M82 0l172 1087h276l43 -112q63 45 97.5 65.5t103 43t146.5 22.5q96 0 157.5 -31t84 -84t27.5 -125q1 -17 1 -34q0 -56 -12 -119l-113 -713h-336l113 717q3 21 3 39q0 92 -79 92q-131 0 -225 -86l-123 -762h-336z" /> +<glyph unicode="o" horiz-adv-x="1136" d="M150 567q27 168 68.5 271.5t115.5 163t167 80t240 20.5q275 0 369 -146q62 -96 62 -269q0 -89 -17 -198q-49 -299 -170 -399t-414 -100q-276 0 -372 139q-64 93 -64 259q0 81 15 179zM482 295q24 -45 126 -45q76 0 109 16.5t56.5 72.5t45.5 189q20 120 20 189 q-1 45 -9 69q-22 58 -130 58t-145 -55.5t-70 -260.5q-14 -100 -14 -159q0 -53 11 -74z" /> +<glyph unicode="p" horiz-adv-x="1138" d="M-4 -553l256 1589q207 61 586 62q203 0 284 -161q52 -105 52 -260q0 -84 -15 -181q-41 -276 -151.5 -396t-337.5 -120q-162 0 -240 79l-98 -612h-336zM463 274q53 -43 136 -43q16 0 34 2q82 4 122 70t70 254q17 73 17 132q0 44 -10 80q-21 85 -105 85h-168z" /> +<glyph unicode="q" horiz-adv-x="1132" d="M154 594q45 283 166.5 397.5t326.5 114.5q162 0 328 -19.5t242 -48.5l-250 -1591h-336l96 612q-105 -79 -248 -79h-4q-225 0 -297 158q-43 95 -43 241q0 96 19 215zM474 310q15 -77 110 -77q96 0 178 41l90 588h-168q-49 0 -85 -27.5t-56.5 -80t-30.5 -92.5t-20 -103 q-23 -118 -23 -192q0 -33 5 -57z" /> +<glyph unicode="r" horiz-adv-x="847" d="M82 0l172 1087h291l24 -137q139 147 301 148q80 0 109 -13l-51 -321q-31 2 -158 2q-92 0 -151.5 -22.5t-98.5 -98.5l-102 -645h-336z" /> +<glyph unicode="s" horiz-adv-x="1042" d="M109 53l30 205h496q57 0 67 53l7 35q4 29 -6.5 42t-45.5 13h-221q-147 -1 -222 89q-56 67 -56 170q0 34 6 73l16 96q45 270 332 271q125 0 191.5 -1t163 -6.5t152.5 -19.5t79 -37l-33 -205h-475q-70 0 -78 -57l-4 -35q-2 -10 -2 -19t1 -14.5t6 -9.5t6 -6t10.5 -3t11.5 -1 h13h11h232q152 0 214 -92q47 -70 47 -163q0 -30 -5 -62l-21 -123q-37 -258 -311 -258q-127 0 -196.5 1t-172 7t-161.5 20t-82 37z" /> +<glyph unicode="t" horiz-adv-x="768" d="M145 846l27 176l178 68l101 303h282l-47 -303h215l-37 -244h-217l-63 -395q-6 -64 -6 -104q0 -36 5 -52q11 -33 54 -53q98 -41 108 -41l-30 -203h-219q-141 0 -215 95q-51 66 -51 182q0 52 10 114l71 457h-166z" /> +<glyph unicode="u" horiz-adv-x="1128" d="M120 176q-2 29 -2 61q0 64 9 140l115 710h336l-115 -718q-5 -28 -4 -49q0 -34 11 -50q19 -28 69 -28q133 0 227 86l119 759h336l-172 -1087h-277l-41 111q-86 -68 -158.5 -98.5t-187.5 -30.5q-127 0 -192.5 53t-72.5 141z" /> +<glyph unicode="v" horiz-adv-x="1110" d="M164 1087h356l82 -718l217 469q57 127 70 252h315q6 -36 6 -73q0 -133 -80 -292l-370 -725h-408z" /> +<glyph unicode="w" horiz-adv-x="1718" d="M164 1087h354l82 -716l215 465q59 121 70 254h315q7 -37 7 -75q0 -96 -42 -200l-22 -57l69 -385l220 465q57 121 69 252h314q8 -39 8 -80q0 -133 -82 -285l-379 -725h-379l-63 360l-166 -360h-402z" /> +<glyph unicode="x" horiz-adv-x="1208" d="M33 0l456 567l-284 520h401l121 -292l215 292h406l-459 -581l274 -506h-389l-123 279l-209 -279h-409z" /> +<glyph unicode="y" horiz-adv-x="1163" d="M164 1087h348l45 -729q6 -74 92 -79l232 559q37 90 53 252h315q8 -41 8 -85q0 -129 -67 -284l-313 -721q-55 -127 -120 -226.5t-132.5 -161t-125 -103t-125 -65.5t-103 -32t-87.5 -16v235q131 66 212 155t145 214q-281 0 -308 295z" /> +<glyph unicode="z" horiz-adv-x="983" d="M72 2l43 272l532 539h-475l41 274h903l-41 -274l-508 -537h420l-43 -274h-872z" /> +<glyph unicode="{" horiz-adv-x="655" d="M115 473l39 246q139 8 153 102l78 477q27 180 150.5 257t365.5 77l-41 -274q-76 0 -111.5 -47t-56.5 -183l-51 -329q-31 -184 -238 -205q197 -41 170 -203l-69 -432q-18 -123 1 -173t97 -48l-41 -260q-469 0 -401 420l73 462q8 55 -24.5 86t-93.5 27z" /> +<glyph unicode="|" horiz-adv-x="507" d="M94 -147l271 1724h274l-270 -1724h-275z" /> +<glyph unicode="}" horiz-adv-x="655" d="M-41 -522l41 260q78 -2 111.5 45t52.5 162l69 426q25 162 234 202q-201 16 -170 205l51 336q25 147 5.5 196.5t-95.5 47.5l43 274q231 0 322.5 -124t60.5 -316l-49 -389q-6 -55 28.5 -83t94.5 -30l-41 -244q-133 6 -152 -104l-88 -520q-33 -195 -147.5 -269.5 t-370.5 -74.5z" /> +<glyph unicode="~" horiz-adv-x="841" d="M258 1212q147 147 274 148q45 0 104.5 -36t100.5 -36q96 -2 205 82l29 -135q-133 -147 -254 -148q-47 0 -116 36t-107.5 36t-74.5 -10t-58.5 -22.5t-69.5 -39.5z" /> +<glyph unicode="¢" horiz-adv-x="991" d="M139 590q27 164 70 269.5t105.5 156.5t125 67.5t152.5 14.5l33 200h196l-33 -204q178 -18 299 -66l-32 -201q-162 12 -342 13q-61 0 -89 -5.5t-61 -33t-52 -89t-38 -171.5q-12 -80 -14 -132.5t4 -85t28.5 -49t50 -21.5t74.5 -5q84 0 175.5 5t140.5 9l49 4l-33 -205 q-133 -70 -342 -73l-28 -183h-197l31 185q-164 2 -243 151.5t-30 448.5z" /> +<glyph unicode="£" horiz-adv-x="1183" d="M70 0l41 258l139 47l51 326h-133l29 168l139 49l26 172q16 98 41 172t54.5 125t76 85t87.5 53.5t107.5 29.5t117.5 12t137 2l365 -33l-43 -270h-379q-121 0 -166 -34t-64 -154l-24 -160l409 -33l-28 -184h-416l-51 -326h577l-49 -305h-1044z" /> +<glyph unicode="¥" horiz-adv-x="1323" d="M254 274l29 183h262l8 63h-260l31 185h161l-223 794h365l135 -668l371 668h399l-514 -794h180l-31 -185h-278l-8 -63h276l-29 -183h-276l-41 -274h-336l41 274h-262z" /> +<glyph unicode="¨" horiz-adv-x="909" d="M258 1192q8 51 50 88t95 37q51 0 83 -36t24 -89t-51 -90t-94 -37q-53 0 -84 38t-23 89zM778 1192q8 51 51 88t96.5 37t84 -37t22.5 -88q-10 -53 -53 -90t-94 -37t-83 37t-24 90z" /> +<glyph unicode="©" horiz-adv-x="1626" d="M178.5 495.5q-14.5 141.5 14.5 288.5q25 160 66.5 279t114 223.5t192.5 158.5t282 54h442q147 0 241.5 -68.5t127.5 -179t39 -253t-25 -289.5q-115 -709 -608 -709h-440q-143 0 -243.5 66.5t-144.5 177t-58.5 252zM399 754q-41 -252 18.5 -406.5t227.5 -154.5h428 q305 0 393 561q10 74 16.5 127t8.5 123.5t-10.5 118.5t-36 93.5t-68.5 68t-110 22.5h-445q-74 0 -133 -23.5t-117.5 -82t-101.5 -171t-70 -276.5zM567 774q39 240 128 330t237 90q231 0 371 -49l-25 -168q-170 25 -315 24q-84 0 -125 -55t-64 -205q-41 -248 119 -247 q139 0 326 32l-27 -168q-133 -57 -387 -57q-135 0 -206 113.5t-32 359.5z" /> +<glyph unicode="«" horiz-adv-x="1200" d="M184 725l488 416l147 -174l-303 -260l227 -265l-194 -143zM643 725l487 416l150 -174l-305 -260l227 -265l-194 -143z" /> +<glyph unicode="­" horiz-adv-x="722" d="M125 457l43 274h643l-43 -274h-643z" /> +<glyph unicode="®" horiz-adv-x="1626" d="M178.5 495.5q-14.5 141.5 14.5 288.5q25 160 66.5 279t114 223.5t192.5 158.5t282 54h442q147 0 241.5 -68.5t127.5 -179t39 -253t-25 -289.5q-115 -709 -608 -709h-440q-143 0 -243.5 66.5t-144.5 177t-58.5 252zM399 754q-41 -252 18.5 -406.5t227.5 -154.5h428 q305 0 393 561q10 74 16.5 127t8.5 123.5t-10.5 118.5t-36 93.5t-68.5 68t-110 22.5h-445q-74 0 -133 -23.5t-117.5 -82t-101.5 -171t-70 -276.5zM543 313l139 875h377q117 0 185.5 -62.5t45.5 -218.5q-18 -127 -65 -184t-125 -80l123 -330h-224l-114 318l-80 24l-55 -342 h-207zM827 807h123q78 0 99.5 16.5t31.5 85.5q8 55 -13 70.5t-89 15.5h-121z" /> +<glyph unicode="´" horiz-adv-x="497" d="M199 1087l219 289h272l-289 -289h-202z" /> +<glyph unicode="¸" horiz-adv-x="493" d="M12 -369l23 140l88 30q43 18 55 39t23 84h215q-25 -160 -87.5 -226.5t-197.5 -66.5h-119z" /> +<glyph unicode="»" horiz-adv-x="1196" d="M143 477l308 271l-211 239l184 154l358 -418l-483 -424zM604 477l309 271l-213 239l185 154l358 -418l-481 -424z" /> +<glyph unicode="À" horiz-adv-x="1429" d="M61 0l727 1499h390l235 -1499h-344l-53 301h-441l-141 -301h-373zM700 1921h269l137 -289h-203zM705 592h284l-67 481z" /> +<glyph unicode="Â" horiz-adv-x="1429" d="M61 0l727 1499h390l235 -1499h-344l-53 301h-441l-141 -301h-373zM682 1632l258 281h238l149 -281h-205l-75 121l-136 -121h-229zM705 592h284l-67 481z" /> +<glyph unicode="Æ" horiz-adv-x="2150" d="M41 0l752 1157q76 117 163.5 191.5t187 106.5t182.5 40t194 4q455 -8 628 -33l-43 -280h-542q-37 0 -61.5 -8.5t-37 -29t-16.5 -33.5t-10 -42l-27 -174l547 -22l-43 -277l-555 -18l-27 -170q-6 -39 0 -62.5t27.5 -32t37 -10.5t46.5 -2h522l-45 -276q-72 -10 -225.5 -19.5 t-271.5 -13.5l-117 -4q-59 -4 -119 6t-116 36.5t-85 83t-16 134.5l20 123h-329l-246 -375h-375zM846 664h190l66 405z" /> +<glyph unicode="Ç" horiz-adv-x="1165" d="M179.5 384q-17.5 179 15.5 417q59 375 198 545t434 170q180 0 289 -16.5t232 -61.5l-43 -262q-221 37 -433 34q-47 0 -65.5 -1t-56 -8t-55 -23.5t-47.5 -49t-46 -82t-35.5 -124t-36.5 -172.5q-43 -252 -3 -353.5t198 -103.5q203 -2 444 18l-41 -262q-182 -68 -540 -61 q-182 2 -286.5 109.5t-122 286.5zM350 -369l23 142l88 30q45 16 57 38t23 85h215q-25 -160 -88.5 -227.5t-196.5 -67.5h-121z" /> +<glyph unicode="È" d="M147 328l138 860q16 96 55 161.5t97.5 96.5t116.5 42t132 11q453 -8 629 -33l-45 -280h-541q-39 0 -63.5 -9.5t-37 -29t-16.5 -34.5t-8 -42l-24 -164l544 -22l-45 -277l-551 -18l-28 -176q-6 -39 0 -62.5t27.5 -32t37 -10.5t45.5 -2h523l-46 -278q-74 -8 -228 -17.5 t-273 -13.5l-119 -4q-61 -2 -118.5 11t-112 47t-79 105t-10.5 171zM559 1909h268l136 -287h-201z" /> +<glyph unicode="É" d="M147 328l138 860q16 96 55 161.5t97.5 96.5t116.5 42t132 11q453 -8 629 -33l-45 -280h-541q-39 0 -63.5 -9.5t-37 -29t-16.5 -34.5t-8 -42l-24 -164l544 -22l-45 -277l-551 -18l-28 -176q-6 -39 0 -62.5t27.5 -32t37 -10.5t45.5 -2h523l-46 -278q-74 -8 -228 -17.5 t-273 -13.5l-119 -4q-61 -2 -118.5 11t-112 47t-79 105t-10.5 171zM770 1622l217 287h273l-289 -287h-201z" /> +<glyph unicode="Ê" d="M147 328l138 860q16 96 55 161.5t97.5 96.5t116.5 42t132 11q453 -8 629 -33l-45 -280h-541q-39 0 -63.5 -9.5t-37 -29t-16.5 -34.5t-8 -42l-24 -164l544 -22l-45 -277l-551 -18l-28 -176q-6 -39 0 -62.5t27.5 -32t37 -10.5t45.5 -2h523l-46 -278q-74 -8 -228 -17.5 t-273 -13.5l-119 -4q-61 -2 -118.5 11t-112 47t-79 105t-10.5 171zM557 1622l258 283h238l147 -283h-205l-75 119l-117 -119h-246z" /> +<glyph unicode="Ë" d="M147 328l138 860q16 96 55 161.5t97.5 96.5t116.5 42t132 11q453 -8 629 -33l-45 -280h-541q-39 0 -63.5 -9.5t-37 -29t-16.5 -34.5t-8 -42l-24 -164l544 -22l-45 -277l-551 -18l-28 -176q-6 -39 0 -62.5t27.5 -32t37 -10.5t45.5 -2h523l-46 -278q-74 -8 -228 -17.5 t-273 -13.5l-119 -4q-61 -2 -118.5 11t-112 47t-79 105t-10.5 171zM485.5 1726.5q8.5 51.5 50.5 88t95 36.5t83.5 -36.5t22.5 -88.5q-8 -53 -51 -90t-94 -37q-53 0 -84 38t-22.5 89.5zM1007.5 1726.5q8.5 51.5 51.5 88t96 36.5t83 -36.5t22 -88.5q-8 -53 -51.5 -90 t-94.5 -37q-53 0 -84 38t-22.5 89.5z" /> +<glyph unicode="Î" horiz-adv-x="546" d="M115 0l237 1499h336l-237 -1499h-336zM219 1632l258 281h238l149 -281h-205l-75 121l-135 -121h-230z" /> +<glyph unicode="Ï" horiz-adv-x="546" d="M115 0l237 1499h336l-237 -1499h-336zM174 1759q8 51 51 88t97 37q51 0 82.5 -36t23.5 -89q-10 -53 -53 -90t-94.5 -37t-83 37t-23.5 90zM696 1759q8 51 51.5 88t96.5 37q51 0 82.5 -36t23.5 -89q-10 -53 -53 -90t-94 -37t-83 37t-24 90z" /> +<glyph unicode="Ô" horiz-adv-x="1363" d="M178 520.5q2 114.5 25 257.5q20 129 48 232.5t64.5 178.5t73.5 129t89 89t96 56.5t111 30.5t117 12t128 3q82 0 145.5 -8t126 -30.5t106.5 -60.5t78.5 -99.5t49 -145.5t12.5 -200.5t-25 -264.5q-25 -162 -62.5 -281.5t-90.5 -196.5t-107.5 -124t-136.5 -69.5 t-151.5 -29.5t-174.5 -7q-84 0 -147.5 7t-127 28.5t-107.5 58.5t-78.5 96.5t-49 141.5t-12.5 196.5zM533.5 381q37.5 -84 207.5 -84q160 0 233 88t113 354q20 125 23.5 208t-6.5 135.5t-41 78t-71 34.5t-105 9q-113 0 -169 -26.5t-101 -127t-78 -311.5q-43 -274 -5.5 -358z M629 1632l258 281h237l148 -281h-203l-78 121l-135 -121h-227z" /> +<glyph unicode="Ù" horiz-adv-x="1337" d="M193 456.5q0 104.5 20 235.5l129 807h338l-135 -852q-31 -195 3 -273.5t181 -78.5q143 0 202.5 82t88.5 270l135 852h338l-127 -899q-27 -166 -78 -281.5t-110.5 -179t-148.5 -98.5t-162.5 -43t-182.5 -8q-70 0 -125 6t-114.5 24.5t-101.5 49t-79 84t-54 126t-17 177z M635 1921h268l137 -289h-202z" /> +<glyph unicode="Û" horiz-adv-x="1337" d="M193 456.5q0 104.5 20 235.5l129 807h338l-135 -852q-31 -195 3 -273.5t181 -78.5q143 0 202.5 82t88.5 270l135 852h338l-127 -899q-27 -166 -78 -281.5t-110.5 -179t-148.5 -98.5t-162.5 -43t-182.5 -8q-70 0 -125 6t-114.5 24.5t-101.5 49t-79 84t-54 126t-17 177z M616 1632l258 281h238l150 -281h-205l-76 121l-135 -121h-230z" /> +<glyph unicode="Ü" horiz-adv-x="1337" d="M193 456.5q0 104.5 20 235.5l129 807h338l-135 -852q-31 -195 3 -273.5t181 -78.5q143 0 202.5 82t88.5 270l135 852h338l-127 -899q-27 -166 -78 -281.5t-110.5 -179t-148.5 -98.5t-162.5 -43t-182.5 -8q-70 0 -125 6t-114.5 24.5t-101.5 49t-79 84t-54 126t-17 177z M573.5 1759q8.5 51 51.5 88t96 37t83 -37t21 -88q-8 -53 -51 -90t-94 -37q-53 0 -84 38t-22.5 89zM1095.5 1759q8.5 51 51.5 88t96 37t83 -37t22 -88q-8 -53 -51.5 -90t-94.5 -37q-53 0 -84 38t-22.5 89z" /> +<glyph unicode="à" horiz-adv-x="1114" d="M152 623q27 129 72.5 222t95 142t121 77t122.5 35t127 9q141 4 286.5 -26.5t217.5 -100.5l-143 -977h-263l-51 107q-39 -55 -128 -89t-183 -34q-166 0 -250.5 164t-23.5 471zM418 1520h266l137 -289h-203zM470.5 351q18.5 -87 98.5 -87q135 0 197 105l70 465 q-84 35 -170 14q-47 -10 -77 -27.5t-62 -79t-48 -170.5q-27 -133 -8.5 -220z" /> +<glyph unicode="â" horiz-adv-x="1114" d="M152 623q27 129 72.5 222t95 142t121 77t122.5 35t127 9q141 4 286.5 -26.5t217.5 -100.5l-143 -977h-263l-51 107q-39 -55 -128 -89t-183 -34q-166 0 -250.5 164t-23.5 471zM395 1231l258 282h238l149 -282h-204l-76 121l-135 -121h-230zM470.5 351q18.5 -87 98.5 -87 q135 0 197 105l70 465q-84 35 -170 14q-47 -10 -77 -27.5t-62 -79t-48 -170.5q-27 -133 -8.5 -220z" /> +<glyph unicode="æ" horiz-adv-x="1699" d="M115 629q27 133 72.5 225t91 140t116 75t115.5 32t125 7q213 8 362 -53q106 51 281 53q92 0 170 -13.5t148.5 -46t108.5 -98t34 -155.5q-6 -143 -71.5 -237.5t-154 -128.5t-187.5 -42t-165.5 2t-97.5 23q-14 -100 19.5 -133t146.5 -33q178 -4 403 37l-41 -238 q-270 -82 -571 -59q-174 12 -244 141q-59 -76 -169.5 -108.5t-215.5 -32.5q-166 0 -251.5 171t-24.5 472zM433 348q16 -86 99 -86q139 0 189 68q-8 125 22 301q23 125 58 203q-88 33 -172 14q-72 -14 -116 -68.5t-69 -212.5q-27 -133 -11 -219zM1090 629q10 -2 29.5 -5 t68.5 -4.5t88 8t74.5 38t44.5 75.5q12 61 -18.5 85t-102.5 22q-51 0 -86 -16.5t-54.5 -52.5t-26.5 -64.5t-17 -85.5z" /> +<glyph unicode="ç" horiz-adv-x="1005" d="M154 590q23 131 56.5 225t72.5 148.5t93 85t104 40t118 9.5q322 0 504 -70l-33 -201q-160 12 -342 13q-63 0 -90 -5.5t-59.5 -33t-52 -89t-38.5 -171.5q-12 -80 -14 -132.5t4 -85t28.5 -49t50.5 -21.5t75 -5q84 0 175 5t140 9l49 4l-32 -205q-49 -27 -100.5 -43t-117 -22 t-100.5 -7t-115.5 0t-99.5 1q-164 0 -244.5 149.5t-31.5 450.5zM250 -371l20 140l90 30q45 18 57.5 40t22.5 83h213q-25 -160 -87 -226.5t-197 -66.5h-119z" /> +<glyph unicode="è" horiz-adv-x="1081" d="M156 631q33 180 83 275t162.5 148.5t309.5 53.5q197 2 321.5 -68.5t116.5 -244.5q-6 -143 -71.5 -237.5t-153.5 -128.5t-187.5 -42t-166 2t-97.5 23q-16 -100 18.5 -133t145.5 -33q193 -4 420 37l-41 -238q-270 -82 -586 -59q-389 24 -274 645zM432 1520h266l138 -289 h-203zM500 629q10 -2 29.5 -5t68.5 -4.5t88 8t75 38t44 75.5q10 61 -18.5 85t-100.5 22q-53 0 -87 -16.5t-53.5 -52.5t-27.5 -65.5t-18 -84.5z" /> +<glyph unicode="é" horiz-adv-x="1081" d="M156 631q33 180 83 275t162.5 148.5t309.5 53.5q197 2 321.5 -68.5t116.5 -244.5q-6 -143 -71.5 -237.5t-153.5 -128.5t-187.5 -42t-166 2t-97.5 23q-16 -100 18.5 -133t145.5 -33q193 -4 420 37l-41 -238q-270 -82 -586 -59q-389 24 -274 645zM500 629q10 -2 29.5 -5 t68.5 -4.5t88 8t75 38t44 75.5q10 61 -18.5 85t-100.5 22q-53 0 -87 -16.5t-53.5 -52.5t-27.5 -65.5t-18 -84.5zM633 1231l219 289h272l-288 -289h-203z" /> +<glyph unicode="ê" horiz-adv-x="1081" d="M156 631q33 180 83 275t162.5 148.5t309.5 53.5q197 2 321.5 -68.5t116.5 -244.5q-6 -143 -71.5 -237.5t-153.5 -128.5t-187.5 -42t-166 2t-97.5 23q-16 -100 18.5 -133t145.5 -33q193 -4 420 37l-41 -238q-270 -82 -586 -59q-389 24 -274 645zM414 1231l258 280h237 l148 -280h-203l-78 121l-135 -121h-227zM500 629q10 -2 29.5 -5t68.5 -4.5t88 8t75 38t44 75.5q10 61 -18.5 85t-100.5 22q-53 0 -87 -16.5t-53.5 -52.5t-27.5 -65.5t-18 -84.5z" /> +<glyph unicode="ë" horiz-adv-x="1081" d="M156 631q33 180 83 275t162.5 148.5t309.5 53.5q197 2 321.5 -68.5t116.5 -244.5q-6 -143 -71.5 -237.5t-153.5 -128.5t-187.5 -42t-166 2t-97.5 23q-16 -100 18.5 -133t145.5 -33q193 -4 420 37l-41 -238q-270 -82 -586 -59q-389 24 -274 645zM367 1358q8 51 51 88 t96 37q51 0 83 -36t24 -89q-10 -53 -53.5 -90t-94.5 -37t-82.5 37t-23.5 90zM500 629q10 -2 29.5 -5t68.5 -4.5t88 8t75 38t44 75.5q10 61 -18.5 85t-100.5 22q-53 0 -87 -16.5t-53.5 -52.5t-27.5 -65.5t-18 -84.5zM889 1358q8 51 51 88t96 37q51 0 83 -36t24 -89 q-10 -53 -53 -90t-94.5 -37t-83 37t-23.5 90z" /> +<glyph unicode="î" horiz-adv-x="485" d="M61 0l172 1087h336l-172 -1087h-336zM96 1225l258 282h238l149 -282h-204l-76 121l-135 -121h-230z" /> +<glyph unicode="ï" horiz-adv-x="485" d="M49 1352q10 53 53 90t94.5 37t83 -37t23.5 -90q-10 -53 -53 -90t-94.5 -37t-83 37t-23.5 90zM61 0l172 1087h336l-172 -1087h-336zM571 1352q10 53 53.5 90t94.5 37t83 -37t23 -90q-10 -53 -53 -90t-94 -37t-83 37t-24 90z" /> +<glyph unicode="ô" horiz-adv-x="1136" d="M150 567q27 168 68.5 271.5t115.5 163t167 80t240 20.5q274 0 368.5 -146.5t45.5 -466.5q-49 -299 -170 -399t-414 -100q-276 0 -372 139t-49 438zM416 1225l258 282h237l150 -282h-205l-76 121l-135 -121h-229zM482 295q24 -45 126 -45q76 0 109 16.5t56.5 72.5 t45.5 189q33 199 11.5 257.5t-130 58.5t-145.5 -55.5t-70 -260.5q-27 -188 -3 -233z" /> +<glyph unicode="ù" horiz-adv-x="1128" d="M120 176q-7 88 7 201l115 710h336l-115 -718q-12 -72 7 -99.5t69 -27.5q133 0 227 86l119 759h336l-172 -1087h-277l-41 111q-86 -68 -158.5 -98.5t-187.5 -30.5q-127 0 -192.5 53t-72.5 141zM449 1513h268l137 -288h-203z" /> +<glyph unicode="û" horiz-adv-x="1128" d="M120 176q-7 88 7 201l115 710h336l-115 -718q-12 -72 7 -99.5t69 -27.5q133 0 227 86l119 759h336l-172 -1087h-277l-41 111q-86 -68 -158.5 -98.5t-187.5 -30.5q-127 0 -192.5 53t-72.5 141zM432 1225l258 282h238l147 -282h-203l-77 121l-136 -121h-227z" /> +<glyph unicode="ü" horiz-adv-x="1128" d="M120 176q-7 88 7 201l115 710h336l-115 -718q-12 -72 7 -99.5t69 -27.5q133 0 227 86l119 759h336l-172 -1087h-277l-41 111q-86 -68 -158.5 -98.5t-187.5 -30.5q-127 0 -192.5 53t-72.5 141zM385 1352q10 53 53 90t94.5 37t83 -37t23.5 -90q-10 -53 -53 -90t-94.5 -37 t-83 37t-23.5 90zM907 1352q10 53 53.5 90t94.5 37t82.5 -37t23.5 -90q-10 -53 -53 -90t-94 -37t-83 37t-24 90z" /> +<glyph unicode="ÿ" horiz-adv-x="1163" d="M164 1087h348l45 -729q6 -74 92 -79l232 559q37 90 53 252h315q31 -160 -59 -369l-313 -721q-55 -127 -120 -226.5t-132.5 -161t-125 -103t-125 -65.5t-103 -32t-87.5 -16v235q131 66 212 155t145 214q-281 0 -308 295zM381 1315q8 51 51 88t96.5 37t84 -37t22.5 -88 q-10 -53 -53 -90t-94.5 -37t-83 37t-23.5 90zM905 1315q8 51 50 88t96 37q51 0 82.5 -36t23.5 -89t-51 -90t-94 -37q-53 0 -84 38t-23 89z" /> +<glyph unicode="Œ" horiz-adv-x="2097" d="M141 520.5q2 114.5 25 257.5q20 129 48 232.5t64.5 178.5t73.5 129t89.5 89t96.5 56.5t110.5 30.5t116.5 12t128 3q252 0 360 -96q94 98 283 86q455 -8 631 -33l-45 -280h-541q-39 0 -63.5 -9.5t-37 -29t-17.5 -34.5t-9 -42l-24 -164l544 -22l-41 -277l-553 -18l-28 -176 q-6 -39 0 -62.5t27.5 -32t36 -10.5t46.5 -2h520l-43 -278q-74 -8 -228.5 -17.5t-272.5 -13.5l-119 -4q-154 -8 -242 80q-131 -82 -415 -82q-82 0 -146.5 7t-127 28.5t-106.5 58.5t-79 96.5t-49.5 141.5t-12.5 196.5zM478 460.5q11 -98.5 60.5 -131t166.5 -32.5 q158 0 230.5 87t115.5 355q20 125 23 208t-7 135.5t-41 78t-71 34.5t-105 9q-113 0 -169 -26.5t-101 -127t-78 -311.5q-35 -180 -24 -278.5z" /> +<glyph unicode="œ" horiz-adv-x="1746" d="M139 569q27 168 68 270.5t114.5 162t167 80t240.5 20.5q203 0 299 -84q117 88 363 90q92 0 167.5 -13.5t141 -46t100.5 -97t31 -156.5q-6 -143 -71.5 -237.5t-153.5 -128.5t-187.5 -42t-167 2t-98.5 23q-16 -100 18.5 -133t145.5 -33q211 0 422 37l-41 -238 q-272 -82 -588 -59q-119 6 -184 80q-115 -76 -365 -76q-276 0 -372.5 140t-49.5 439zM471 295q23 -45 125 -45q76 0 108.5 16.5t56 72.5t46.5 189q33 199 12.5 257.5t-129.5 58.5q-111 0 -146.5 -54.5t-68.5 -261.5q-27 -188 -4 -233zM1180 629q10 -2 29.5 -5t68.5 -4.5 t88 8t75 38t44 75.5q10 61 -18.5 85t-100.5 22q-53 0 -87 -16.5t-53.5 -52.5t-27.5 -65.5t-18 -84.5z" /> +<glyph unicode="Ÿ" horiz-adv-x="1363" d="M254 1499h364l140 -692l385 692h381l-652 -1059l-69 -440h-336l70 440zM543 1757q8 51 51 88t96 37q51 0 83 -36t24 -89q-10 -53 -53.5 -90t-94.5 -37t-82.5 37t-23.5 90zM1065 1757q8 51 51 88t96 37q51 0 83 -36t24 -89q-10 -53 -53 -90t-94.5 -37t-83 37t-23.5 90z " /> +<glyph unicode="ˆ" horiz-adv-x="636" d="M90 1087l258 281h238l149 -281h-205l-75 121l-136 -121h-229z" /> +<glyph unicode="˚" horiz-adv-x="548" d="M260 1294q8 88 72.5 147.5t150.5 59.5t143.5 -60.5t49.5 -146.5q-8 -88 -71.5 -146t-149.5 -58q-88 0 -145.5 59t-49.5 145zM387 1294.5q-2 -32.5 18.5 -55t55.5 -22.5t59.5 22.5t26.5 54.5q4 35 -17.5 57.5t-54.5 22.5q-35 0 -60.5 -23.5t-27.5 -56z" /> +<glyph unicode="˜" horiz-adv-x="845" d="M242 1212q141 145 272 146q47 -2 107.5 -37t97.5 -35q51 -2 109.5 22.5t95.5 57.5l28 -135q-139 -143 -256 -144q-49 2 -115.5 37t-105.5 35q-84 0 -203 -72z" /> +<glyph unicode=" " horiz-adv-x="960" /> +<glyph unicode=" " horiz-adv-x="1921" /> +<glyph unicode=" " horiz-adv-x="960" /> +<glyph unicode=" " horiz-adv-x="1921" /> +<glyph unicode=" " horiz-adv-x="640" /> +<glyph unicode=" " horiz-adv-x="480" /> +<glyph unicode=" " horiz-adv-x="320" /> +<glyph unicode=" " horiz-adv-x="320" /> +<glyph unicode=" " horiz-adv-x="240" /> +<glyph unicode=" " horiz-adv-x="384" /> +<glyph unicode=" " horiz-adv-x="106" /> +<glyph unicode="‐" horiz-adv-x="722" d="M125 457l43 274h643l-43 -274h-643z" /> +<glyph unicode="‑" horiz-adv-x="722" d="M125 457l43 274h643l-43 -274h-643z" /> +<glyph unicode="‒" horiz-adv-x="722" d="M125 457l43 274h643l-43 -274h-643z" /> +<glyph unicode="–" horiz-adv-x="925" d="M121 451l45 276h969l-45 -276h-969z" /> +<glyph unicode="—" horiz-adv-x="1507" d="M127 455l45 276h1425l-45 -276h-1425z" /> +<glyph unicode="‘" horiz-adv-x="520" d="M272 1022l45 297q12 72 49 118t83.5 60t89.5 19.5t72 0.5l30 -6l-20 -129q-63 0 -76 -65l-6 -37h22q53 0 45 -53l-33 -205q-8 -57 -61 -57h-201q-51 0 -39 57z" /> +<glyph unicode="’" horiz-adv-x="520" d="M274 971l21 131q61 -2 74 63l8 37h-25q-23 0 -35 14.5t-8 38.5l33 205q8 57 59 58h201q49 0 41 -58l-47 -297q-12 -72 -49 -118t-82 -60t-89 -19t-73 0z" /> +<glyph unicode="‚" horiz-adv-x="520" d="M84 -231l18 129q63 0 76 65l6 37h-22q-51 0 -43 53l33 205q10 57 61 57h199q53 0 41 -57l-47 -297q-12 -72 -49.5 -118t-82.5 -60t-89 -19.5t-72 -0.5z" /> +<glyph unicode="“" horiz-adv-x="874" d="M262 1020l45 295q12 72 49 118t83 60t89 19.5t73 -0.5l30 -5l-21 -129q-63 2 -75 -63l-7 -39h25q51 0 43 -51l-31 -205q-12 -57 -63 -57h-199q-49 0 -41 57zM637 1020l47 295q12 72 49 118t82 60t89 19.5t73 -0.5l29 -5l-21 -129q-63 2 -76 -63l-4 -39h23q23 0 36 -13.5 t7 -37.5l-31 -205q-8 -57 -63 -57h-199q-47 0 -41 57z" /> +<glyph unicode="”" horiz-adv-x="874" d="M264 969l19 129q63 0 75 65l7 37h-23q-51 0 -43 53l33 205q10 57 61 58h199q53 0 41 -58l-47 -297q-12 -72 -49 -118t-82 -61t-89 -19.5t-73 1.5zM639 969l20 129q61 0 74 65l8 37h-24q-51 0 -43 53l33 205q10 57 61 58h199q53 0 41 -58l-47 -297q-12 -72 -49.5 -118 t-82.5 -61t-89 -19.5t-72 1.5z" /> +<glyph unicode="„" horiz-adv-x="872" d="M74 -231l20 129q61 0 74 65l8 37h-24q-51 0 -43 53l32 205q10 57 60 57h200q49 0 41 -57l-47 -297q-12 -72 -49 -118t-82 -60t-89 -19.5t-73 -0.5zM449 -231l20 129q63 0 76 65l6 37h-23q-53 0 -45 53l33 205q10 57 62 57h198q51 0 43 -57l-49 -297q-12 -72 -49 -118 t-82 -61t-89 -19.5t-73 0.5z" /> +<glyph unicode="…" horiz-adv-x="1617" d="M264 47l33 209q6 51 57 51h201q53 0 43 -51l-33 -209q-8 -47 -57 -47h-201q-49 0 -43 47zM821 47l33 209q6 51 57 51h201q53 0 43 -51l-33 -209q-8 -47 -57 -47h-201q-49 0 -43 47zM1378 47l33 209q6 51 57 51h201q53 0 43 -51l-33 -209q-8 -47 -57 -47h-201 q-49 0 -43 47z" /> +<glyph unicode=" " horiz-adv-x="384" /> +<glyph unicode="‹" horiz-adv-x="579" d="M27 725l487 416l150 -174l-289 -246l211 -248l-195 -174z" /> +<glyph unicode="›" horiz-adv-x="731" d="M184 477l289 248l-207 246l199 170l356 -418l-493 -424z" /> +<glyph unicode=" " horiz-adv-x="480" /> +<glyph unicode="€" horiz-adv-x="1431" d="M104 508l27 156l152 16l16 115l-145 16l22 147l152 21q10 66 22 115t54 135t100.5 142t168 100.5t251.5 44.5q104 0 267 -19.5t269 -58.5l-39 -242q-283 29 -450 29q-96 0 -154.5 -14.5t-88.5 -53.5t-41 -72.5t-23 -105.5l479 -16l-27 -156l-481 -12l-17 -115l476 -16 l-25 -156q-31 0 -81 -2t-156.5 -5t-176 -5t-67.5 -4q-12 -76 0 -125.5t51 -71t79 -27.5t101 -6q80 0 198 12.5t195 24.5l78 12l-39 -237q-195 -86 -569 -86q-59 0 -113.5 7t-126 37.5t-117.5 81t-70 148.5t-3 230z" /> +<glyph unicode="™" horiz-adv-x="1280" d="M70 1323l28 176h592l-28 -176h-191l-84 -539h-209l84 539h-192zM596 784l199 715h215l30 -383l144 383h227l-18 -715h-209l20 365l-112 -365h-187l-14 363l-88 -363h-207z" /> +<glyph unicode="" horiz-adv-x="1085" d="M0 1085h1085v-1085h-1085v1085z" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-ExtraBold-Italic-webfont.ttf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-ExtraBold-Italic-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d2bc510da08ce81a516f5a592898c3ae2deb66f4 Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-ExtraBold-Italic-webfont.ttf differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-ExtraBold-Italic-webfont.woff b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-ExtraBold-Italic-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..863177cecaf9d7a1b1c146c53bd414dc2d07a3c6 Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-ExtraBold-Italic-webfont.woff differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-ExtraBold-webfont.eot b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-ExtraBold-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..56fae30ca801e5b5f8d6c03a9498b374e8694658 Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-ExtraBold-webfont.eot differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-ExtraBold-webfont.svg b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-ExtraBold-webfont.svg new file mode 100644 index 0000000000000000000000000000000000000000..ccb83f7babf08aa58b50f71c5cf4bbe1dd473711 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-ExtraBold-webfont.svg @@ -0,0 +1,187 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Copyright c 2011 Natanael Gama exondiscoveredcom with Reserved Font Name Exo +Designer : Natanael Gama +</metadata> +<defs> +<font id="ExoExtraBold" horiz-adv-x="1161" > +<font-face units-per-em="2048" ascent="1638" descent="-410" /> +<missing-glyph horiz-adv-x="512" /> +<glyph unicode=" " horiz-adv-x="512" /> +<glyph unicode="	" horiz-adv-x="512" /> +<glyph unicode=" " horiz-adv-x="512" /> +<glyph unicode="!" horiz-adv-x="563" d="M115 1497h329l-36 -1096h-263zM125 47v209q0 51 49 51h205q47 0 47 -51v-209q0 -47 -47 -47h-205q-49 0 -49 47z" /> +<glyph unicode=""" horiz-adv-x="956" d="M117 1362v137h321v-137l-20 -275h-277zM520 1362v137h322v-137l-21 -275h-278z" /> +<glyph unicode="#" horiz-adv-x="1501" d="M27 414l34 229h308l39 215h-312l37 229h318l75 412h230l-76 -412h221l74 412h229l-74 -412h347l-33 -229h-350l-37 -217h348l-31 -229h-366l-78 -412h-230l78 412l-223 2l-76 -414h-229l76 414h-299zM598 643l229 -2l37 217h-227z" /> +<glyph unicode="$" horiz-adv-x="1163" d="M76 989v127q2 381 407 395v177h195v-179q176 -8 356 -61v-260q-225 18 -444 18q-98 2 -138 -20.5t-40 -100.5v-51q0 -68 32.5 -95.5t112.5 -27.5h164q109 0 185.5 -40t114.5 -106.5t53.5 -132t15.5 -134.5v-86q0 -428 -412 -428v-168h-195v170q-117 4 -183.5 16 t-176.5 47v260q272 -20 475 -20q156 0 156 108v60q0 59 -26 88.5t-97 29.5h-160q-104 0 -181 34t-117 79t-63.5 107.5t-28.5 105.5t-5 88z" /> +<glyph unicode="%" horiz-adv-x="1974" d="M57 987v242q0 135 65.5 202.5t215.5 67.5h207q145 0 209.5 -68.5t64.5 -201.5v-242q0 -137 -64.5 -204.5t-213.5 -67.5h-207q-147 0 -212 67.5t-65 204.5zM283 1032q0 -49 18 -70.5t72 -21.5h129q57 0 74.5 21.5t17.5 70.5v150q0 55 -19.5 73.5t-68.5 18.5h-129 q-51 0 -72.5 -19.5t-21.5 -72.5v-150zM412 0l921 1499h228l-912 -1499h-237zM1157 276v242q0 135 64.5 204t214.5 69h206q145 0 211 -69t66 -204v-242q0 -135 -64.5 -202.5t-216.5 -67.5h-206q-145 0 -210 67.5t-65 202.5zM1382 324q0 -49 18.5 -71t69.5 -22h129 q57 0 76 22.5t19 70.5v149q0 55 -20.5 73.5t-69.5 18.5h-129q-51 0 -72 -18.5t-21 -73.5v-149z" /> +<glyph unicode="&" horiz-adv-x="1423" d="M53.5 482.5q30.5 154.5 167.5 275.5l131 114l-98 144q-78 113 -65.5 215t80 176t155.5 88t169 16t162 -10t123 -20t121 -27v-246h-307q-109 0 -119 -46t60 -138l295 -408l256 230l119 -148l-129 -219l-76 -90l295 -389h-394l-137 186l-129 -112q-68 -59 -179.5 -80 t-234 22t-194.5 152q-102 160 -71.5 314.5zM397 360q25 -31 54.5 -48t69.5 -13t77 41l82 80l-166 219l-86 -78q-111 -99 -31 -201z" /> +<glyph unicode="'" horiz-adv-x="487" d="M76 1362v137h338v-137l-21 -275h-295z" /> +<glyph unicode="(" horiz-adv-x="804" d="M102 668q0 197 38 382t93.5 308t110.5 219t93 140l38 44h303q-14 -20 -36.5 -58t-81 -157t-103.5 -240.5t-82 -298t-37 -339.5q0 -505 259 -967q47 -84 81 -131h-303q-14 12 -39.5 38.5t-90 125t-114 214t-89.5 309.5t-40 411z" /> +<glyph unicode=")" horiz-adv-x="804" d="M27 -430q14 18 36.5 53t81 148.5t103.5 234.5t82 302t37 360q0 468 -264 962q-77 131 -76 131h305q14 -16 39.5 -47t89 -136t113 -222t89 -304.5t39.5 -383.5q0 -584 -262 -967q-61 -88 -108 -131h-305z" /> +<glyph unicode="*" horiz-adv-x="866" d="M70 1159v127l282 45l13 -182zM176 854l51 281l179 -45l-107 -275zM332 1477l123 41l131 -254l-170 -68zM377 948l98 154l234 -184l-76 -103zM481 1169l244 164l74 -106l-201 -199z" /> +<glyph unicode="+" horiz-adv-x="964" d="M57 592v274h287v289h274v-289h291v-274h-291v-289h-274v289h-287z" /> +<glyph unicode="," horiz-adv-x="528" d="M117 51v203q0 55 51 55h197q49 0 49 -55v-277q0 -68 -30 -108.5t-72 -51t-84 -11.5t-71 7l-30 7v110q41 0 52 13.5t11 36.5v20h-22q-51 0 -51 51z" /> +<glyph unicode="-" horiz-adv-x="724" d="M41 457v274h643v-274h-643z" /> +<glyph unicode="." horiz-adv-x="532" d="M117 47v209q0 51 49 51h201q51 0 51 -51v-209q0 -47 -51 -47h-201q-49 0 -49 47z" /> +<glyph unicode="/" horiz-adv-x="974" d="M27 -147l575 1724h346l-575 -1724h-346z" /> +<glyph unicode="0" horiz-adv-x="1282" d="M96 377v729q0 188 101.5 290.5t283.5 102.5h336q371 0 371 -377v-745q0 -180 -97.5 -278.5t-275.5 -98.5h-336q-184 0 -283.5 96.5t-99.5 280.5zM432 440q0 -135 137 -135h148q70 0 102.5 27.5t32.5 105.5v623q0 133 -123 133h-170q-127 0 -127 -133v-621z" /> +<glyph unicode="1" horiz-adv-x="765" d="M53 1114v217l271 168h333v-1499h-335v1174z" /> +<glyph unicode="2" horiz-adv-x="1198" d="M53 1212v250q297 57 623 58q225 0 339.5 -132.5t114.5 -343.5q0 -313 -503 -739h503v-305h-1060v293q80 53 191.5 141t236.5 199.5t211 224.5t86 182q0 96 -55.5 134t-186.5 38h-500z" /> +<glyph unicode="3" horiz-adv-x="1185" d="M41 1198v248q84 29 199.5 43t228.5 15t240 -1q172 -4 274 -101t102 -267v-95q0 -236 -161 -295q162 -61 161 -311v-74q0 -180 -101 -277t-290 -97h-76h-80q-16 0 -72 1t-77.5 2t-69 4t-74 7t-64.5 10t-68.5 14.5t-59.5 18.5l2 250h488q123 0 165 20.5t42 100.5v45 q0 78 -45.5 102.5t-149.5 28.5l-375 16v271l375 20q115 6 157 29.5t42 97.5v49q0 76 -51.5 100.5t-147.5 24.5h-514z" /> +<glyph unicode="4" horiz-adv-x="1284" d="M27 459l489 1040h365l-394 -881h295v314l62 158h274v-472h139v-258l-139 -53v-303h-336v303h-686z" /> +<glyph unicode="5" horiz-adv-x="1216" d="M104 41v266h562q47 0 76.5 11.5t42 34t15.5 40t3 43.5v105q0 59 -24.5 94t-94.5 35h-147q-111 0 -111 -109h-320l46 938h927v-305h-602l-12 -281q57 41 137 45q66 8 195 0q172 -10 257 -113.5t85 -271.5v-202q0 -193 -119 -286t-277 -93q-211 0 -328.5 8t-310.5 41z" /> +<glyph unicode="6" horiz-adv-x="1234" d="M90 786q0 676 352 717q279 33 664 -41v-256h-483q-53 0 -91 -20.5t-58.5 -49t-32 -76.5t-13.5 -85t-2 -94q125 41 369 41q205 0 282.5 -95.5t77.5 -269.5v-209q0 -350 -375 -350h-288q-78 0 -135.5 19.5t-109.5 72.5t-85 140t-52.5 226.5t-19.5 329.5zM426 633 q0 -174 36 -252t144 -78h103q61 0 86.5 22.5t25.5 90.5v94q0 72 -21.5 97.5t-82.5 25.5h-291z" /> +<glyph unicode="7" horiz-adv-x="1140" d="M41 1194v305h975l86 -143l-488 -1356h-362l436 1194h-647z" /> +<glyph unicode="8" horiz-adv-x="1271" d="M102 354v131q0 90 41 156t117 80q-53 25 -86 57.5t-48 74.5t-19.5 79t-4.5 90v133q0 354 392 354h315q182 0 272 -83t90 -273v-100q0 -27 -5 -57.5t-19 -71.5t-48 -72t-81 -37q47 -8 79.5 -41t47 -79t20.5 -85t6 -80v-168q0 -92 -21.5 -159.5t-54 -105.5t-82.5 -60.5 t-97.5 -29.5t-108.5 -7h-313q-109 0 -187 26.5t-115.5 61.5t-59 90t-26 91t-4.5 85zM438 399q0 -59 28 -83.5t97 -24.5h154q66 0 92.5 26.5t26.5 81.5v117q0 113 -115 113h-164q-119 0 -119 -113v-117zM438 1012q0 -66 30 -88.5t89 -22.5h162q72 0 94.5 26.5t22.5 84.5v82 q0 76 -30 101.5t-89 25.5h-154q-68 0 -96.5 -23.5t-28.5 -103.5v-82z" /> +<glyph unicode="9" horiz-adv-x="1234" d="M82 946v207q0 350 377 350h289q98 0 166.5 -33.5t124 -117.5t83 -243t27.5 -394q0 -672 -352 -717q-164 -16 -339 -3t-327 46v254h485q66 0 108 26.5t60.5 82t23.5 99.5t5 120q-125 -43 -371 -43q-205 0 -282.5 95t-77.5 271zM418 991q0 -72 22.5 -97.5t81.5 -25.5h291 q0 174 -36 252t-146 78h-103q-61 0 -85.5 -22.5t-24.5 -90.5v-94z" /> +<glyph unicode=":" horiz-adv-x="532" d="M117 47v209q0 51 49 51h201q51 0 51 -51v-209q0 -47 -51 -47h-201q-49 0 -49 47zM117 827v209q0 51 49 51h201q51 0 51 -51v-209q0 -47 -51 -47h-201q-49 0 -49 47z" /> +<glyph unicode=";" horiz-adv-x="534" d="M117 51v203q0 55 51 55h197q49 0 49 -55v-277q0 -68 -30 -108.5t-72 -51t-84 -11.5t-71 7l-30 7v110q41 0 52 13.5t11 36.5v20h-22q-51 0 -51 51zM119 827v209q0 53 49 54h201q51 0 51 -54v-209q0 -45 -51 -45h-201q-49 0 -49 45z" /> +<glyph unicode="<" horiz-adv-x="905" d="M70 569v303l766 283v-303l-424 -129l424 -150v-303z" /> +<glyph unicode="=" horiz-adv-x="956" d="M41 356v275h874v-275h-874zM41 801v274h874v-274h-874z" /> +<glyph unicode=">" horiz-adv-x="905" d="M70 270v303l424 150l-424 129v303l766 -283v-303z" /> +<glyph unicode="?" horiz-adv-x="1112" d="M27 1206v252q303 68 577 55q219 0 337 -121.5t118 -287.5v-129q0 -215 -107.5 -314.5t-345.5 -85.5v-176h-260v424h213q166 6 166 156v76q0 80 -50 115.5t-155 35.5h-493zM326 47v209q0 51 49 51h200q51 0 52 -51v-209q0 -47 -52 -47h-200q-49 0 -49 47z" /> +<glyph unicode="@" horiz-adv-x="1796" d="M90 31v590q0 86 21.5 157.5t69.5 135t140.5 99.5t219.5 36h377q63 0 110 -5.5t100.5 -26t86 -55t55 -97t22.5 -148.5v-717h-211l-43 115l-14 -14q-14 -13 -40 -33.5t-60.5 -40t-83.5 -32.5t-103 -13q-127 -2 -194.5 84t-67.5 200v78q0 143 81 216t230 73h248q2 61 0 63 q0 57 -24.5 76t-85.5 19h-383q-90 0 -141.5 -37t-51.5 -148v-545q0 -125 57.5 -175t135.5 -50h669q119 0 165 56.5t46 168.5v895q0 115 -57 178.5t-154 63.5h-827v203q279 57 637 55h190q199 0 334 -119.5t135 -380.5v-895q0 -252 -113.5 -369.5t-340.5 -117.5h-684 q-197 0 -324 109.5t-127 347.5zM750 311q0 -74 86 -69q135 -4 198 77v132l-207 -19q-41 -4 -59 -21.5t-18 -58.5v-41z" /> +<glyph unicode="A" horiz-adv-x="1433" d="M61 0l490 1499h389l473 -1499h-350l-98 301h-453l-98 -301h-353zM594 592h297l-141 477z" /> +<glyph unicode="B" horiz-adv-x="1243" d="M111 0v1499h632q223 0 329 -109.5t106 -295.5q0 -111 -54.5 -206t-156.5 -110q104 -18 172.5 -109t68.5 -220q0 -229 -111.5 -339t-346.5 -110h-639zM446 291h289q137 0 137 174q0 80 -32.5 131t-104.5 51h-289v-356zM446 922h275q61 0 94 37.5t33 103.5q0 145 -127 145 h-275v-286z" /> +<glyph unicode="C" horiz-adv-x="1165" d="M76 754q0 385 111.5 573.5t402.5 188.5q182 0 291.5 -15.5t238.5 -58.5v-262l-14 2q-14 2 -38 4t-56.5 6t-72.5 7t-81 5t-88 4t-88 2q-68 0 -104.5 -6t-73.5 -29.5t-54.5 -73.5t-27.5 -135t-10 -216q0 -260 54 -358.5t218 -98.5l436 18v-262q-169 -62 -467 -62 q-31 0 -63 1q-274 2 -394 193.5t-120 572.5z" /> +<glyph unicode="D" horiz-adv-x="1359" d="M111 0v1499h665q123 0 215 -42t148.5 -109.5t91.5 -168t48 -205t13 -231.5q0 -743 -516 -743h-665zM446 291h299q113 0 162 112.5t49 341.5q0 272 -51 367.5t-160 95.5h-299v-917z" /> +<glyph unicode="E" d="M102 311v860q0 82 24 142.5t58.5 95.5t83.5 56.5t92 27.5t93 6q485 -8 663 -33v-280h-571q-49 0 -75 -19.5t-29 -39t-3 -56.5v-170l582 -20v-279l-582 -18v-170q0 -39 10.5 -62.5t33 -32t38 -10.5t45.5 -2h551v-278q-70 -8 -230.5 -17.5t-286.5 -13.5l-126 -4 q-16 -1 -31 -1q-30 0 -59 3q-43 4 -97.5 22.5t-92 51t-64.5 95t-27 146.5z" /> +<glyph unicode="F" d="M102 0v1165q0 178 104 258q99 76 233 76h14q485 -8 663 -33v-280h-571q-49 0 -75 -19.5t-29 -39t-3 -56.5v-170l582 -20v-279l-582 -18v-584h-336z" /> +<glyph unicode="G" horiz-adv-x="1257" d="M76 757.5q0 141.5 12 250t45 208t87 163t142.5 100.5t206.5 37q205 0 310.5 -12.5t285.5 -57.5v-260q-2 0 -32.5 4t-79.5 9t-109.5 11.5t-136.5 10.5t-145 4q-154 0 -202 -98.5t-48 -372.5q0 -279 41 -366t186 -87h5q122 0 200 90l4 4v217h-160v211q109 49 356 49 q90 0 140 -4v-868h-238l-94 100q-49 -55 -108.5 -79.5t-180.5 -30.5q-17 -1 -33 -1q-102 0 -180 33q-90 39 -142 105t-83 172.5t-40 211.5t-9 246.5z" /> +<glyph unicode="H" horiz-adv-x="1302" d="M111 0v1499h335v-622h441v622h336v-1499h-336v573h-441v-573h-335z" /> +<glyph unicode="I" horiz-adv-x="526" d="M111 0v1499h335v-1499h-335z" /> +<glyph unicode="J" horiz-adv-x="729" d="M49 49l2 264q30 -2 56 -2q112 0 153 28q51 34 51 169v991h336v-1161q0 -231 -108 -301q-75 -46 -217 -46h-28q-163 5 -245 58z" /> +<glyph unicode="K" horiz-adv-x="1314" d="M111 0v1499h319v-610h105l346 610h389l-439 -751l439 -748h-389l-346 598h-103v-598h-321z" /> +<glyph unicode="L" horiz-adv-x="1091" d="M111 303v1196h335v-1087q0 -39 10.5 -62.5t33 -32t38 -10.5t45.5 -2h474v-305h-613q-143 0 -233 71.5t-90 231.5z" /> +<glyph unicode="M" horiz-adv-x="1769" d="M76 0l145 1499h467l195 -942l198 942h465l150 -1499h-330l-100 920l-191 -920h-379l-198 920l-90 -920h-332z" /> +<glyph unicode="N" horiz-adv-x="1386" d="M111 0v1499h340l520 -878v878h336v-1499h-336l-522 864v-864h-338z" /> +<glyph unicode="O" horiz-adv-x="1370" d="M90 739q0 172 20.5 301t62.5 212t92 135.5t126 79t144.5 34.5t164.5 8q100 0 170 -8t146 -34.5t124 -79t90 -135.5t61.5 -212t19.5 -301q0 -195 -30 -332t-78 -216.5t-130 -125t-166 -59.5t-207 -14q-88 0 -150.5 5t-131 23.5t-114.5 51t-89 88t-68.5 133.5t-41 190.5 t-15.5 255.5zM426 739q0 -276 51 -359t223 -83q164 0 219.5 86t55.5 356q0 207 -27.5 306.5t-81 129t-166.5 29.5q-68 0 -107.5 -7t-75.5 -32.5t-53.5 -77t-27.5 -135.5t-10 -213z" /> +<glyph unicode="P" horiz-adv-x="1249" d="M98 0v1499h656q86 0 153.5 -16.5t136 -62.5t107.5 -145t39 -249q0 -133 -30 -230.5t-71.5 -148.5t-104.5 -79q-64 -28 -116 -34q-32 -4 -68 -4q-22 0 -46 2q-57 4 -184.5 20.5t-135.5 20.5v-573h-336zM434 823h289q129 0 129 199q0 186 -129 186h-289v-385z" /> +<glyph unicode="Q" horiz-adv-x="1370" d="M90 739q0 205 32 349.5t82 225.5t134 126t164 57t198 12q100 0 170 -8t146 -34.5t124 -79t90 -135.5t61.5 -212t19.5 -301q0 -162 -18.5 -283.5t-58.5 -202.5t-89 -133t-124 -80t-146.5 -37t-174.5 -11q-88 0 -150.5 5t-131 23.5t-114.5 51t-89 88t-68.5 133.5t-41 190.5 t-15.5 255.5zM426 739q0 -276 51 -359t223 -83q162 0 218.5 86t56.5 356q0 207 -27.5 306.5t-81 129t-166.5 29.5q-86 0 -131 -12t-81.5 -59.5t-49 -139.5t-12.5 -254zM602 -68h182q30 -85 165 -85q69 0 165 22v-256q-63 -12 -123 -12q-56 0 -109 11q-112 21 -194 104 t-86 216z" /> +<glyph unicode="R" horiz-adv-x="1253" d="M98 0v1499h662q203 0 317.5 -107.5t114.5 -365.5q0 -104 -16.5 -183t-37 -122t-58.5 -75t-59.5 -42t-59.5 -24l272 -580h-381l-223 551l-195 29v-580h-336zM436 838h285q78 0 104.5 37.5t26.5 150.5q0 98 -30.5 140t-100.5 42h-285v-370z" /> +<glyph unicode="S" horiz-adv-x="1214" d="M90 989v127q0 387 406 395q47 1 91 1q324 0 513 -64v-262q-219 20 -498 20h-17q-87 0 -121 -20q-38 -22 -38 -101v-51q0 -72 29.5 -97.5t113.5 -25.5h217q86 0 154 -27.5t107.5 -70.5t64.5 -100.5t34 -108.5t9 -106v-86q0 -129 -35 -217.5t-98.5 -132.5t-131 -61 t-151.5 -17q-244 0 -358.5 12t-243.5 53v262q216 -22 502 -22h25q156 0 155 108v60q0 59 -25.5 88.5t-97.5 29.5h-211q-106 0 -184 33t-117 78t-62.5 108.5t-27.5 105.5t-4 89z" /> +<glyph unicode="T" horiz-adv-x="1226" d="M53 1194v305h1133v-305h-404v-1194h-336v1194h-393z" /> +<glyph unicode="U" horiz-adv-x="1351" d="M111 655v844h335v-844q0 -213 49.5 -286.5t200.5 -73.5q137 0 187.5 79t50.5 281v844h338v-844q0 -109 -12.5 -197.5t-31 -153t-52 -116t-62.5 -83t-77 -55t-80.5 -35t-88 -17.5t-86 -7t-86.5 -1h-19q-91 0 -139.5 3t-127 20.5t-121.5 60.5t-90 112.5t-67.5 188 t-20.5 280.5z" /> +<glyph unicode="V" horiz-adv-x="1415" d="M61 1499h355l297 -1073l315 1073h354l-473 -1499h-397z" /> +<glyph unicode="W" horiz-adv-x="2056" d="M61 1499h355l295 -1067l233 1067h356l-92 -352l226 -719l235 1071h354l-393 -1499h-397l-172 559l-152 -559h-397z" /> +<glyph unicode="X" horiz-adv-x="1347" d="M61 1499h373l252 -469l256 469h373l-455 -751l443 -748h-371l-246 459l-248 -459h-370l444 748z" /> +<glyph unicode="Y" horiz-adv-x="1363" d="M61 1499h365l258 -694l283 694h364l-483 -1059v-440h-336v440z" /> +<glyph unicode="Z" horiz-adv-x="1134" d="M49 0v305l641 889h-641v305h1041v-305l-596 -889h596v-305h-1041z" /> +<glyph unicode="[" horiz-adv-x="692" d="M117 0v1327q0 397 370 397h181v-274h-88q-127 0 -127 -170v-1266q0 -170 127 -170h88v-274h-181q-370 0 -370 430z" /> +<glyph unicode="\" horiz-adv-x="974" d="M27 1577h346l575 -1724h-346z" /> +<glyph unicode="]" horiz-adv-x="692" d="M27 -156h88q127 0 127 170v1266q0 170 -127 170h-88v274h180q371 0 371 -397v-1327q0 -430 -371 -430h-180v274z" /> +<glyph unicode="^" horiz-adv-x="780" d="M70 1087l213 281h237l193 -281h-207l-111 115l-116 -115h-209z" /> +<glyph unicode="_" horiz-adv-x="1380" d="M41 -2v274h1298v-274h-1298z" /> +<glyph unicode="`" horiz-adv-x="497" d="M27 1376h272l172 -289h-203z" /> +<glyph unicode="a" horiz-adv-x="1062" d="M53 285v94q0 133 79 220t257 87q135 -1 202.5 -1t67.5 1q2 43 0 45q0 78 -30.5 99.5t-106.5 21.5q-162 0 -432 -23v203q182 76 483 76q209 0 315.5 -80t106.5 -283v-745h-266l-70 115q-16 -35 -99 -82q-80 -45 -177 -45h-8q-160 6 -241 95t-81 202zM389 336 q0 -41 16.5 -62.5t33 -24.5t46.5 -3q47 0 90 19.5t64 38.5l20 20v165l-192 -16q-78 -6 -78 -102v-35z" /> +<glyph unicode="b" horiz-adv-x="1140" d="M82 0v1608h336v-572q139 68 303 68q211 0 282.5 -135t71.5 -430q0 -276 -83 -413.5t-271 -137.5q-158 0 -301 118l-55 -106h-283zM420 324q68 -57 201 -58q61 0 89.5 60.5t28.5 226.5q0 180 -27.5 239.5t-90.5 59.5q-129 0 -201 -37v-491z" /> +<glyph unicode="c" horiz-adv-x="1007" d="M70 545q0 309 92 431t264 122q322 0 514 -70v-201q-164 12 -346 13q-61 0 -88 -5.5t-55.5 -34t-36.5 -89t-8 -170.5q0 -193 35.5 -242t152.5 -49l360 16v-203q-45 -27 -95 -43t-111.5 -22t-102.5 -8q-27 -1 -70 -1h-45q-74 1 -104 1q-168 0 -262 124t-94 431z" /> +<glyph unicode="d" horiz-adv-x="1140" d="M70 539q0 303 70.5 434t281.5 131q164 0 303 -68v572h336v-1608h-283l-53 106q-142 -118 -300 -118h-3q-188 0 -270 133t-82 418zM406 553q0 -166 28.5 -226.5t89.5 -60.5q131 0 201 58v491q-72 37 -201 37q-63 0 -90.5 -59.5t-27.5 -239.5z" /> +<glyph unicode="e" horiz-adv-x="1075" d="M70 549q0 174 23.5 280.5t85 166t144.5 80t222 20.5q111 0 179.5 -7.5t132 -30t95 -66.5t50 -115.5t18.5 -180.5q0 -152 -79 -217t-232 -65h-303q0 -49 10 -81t23.5 -49.5t47 -25.5t57 -9t79.5 -1h20q217 0 356 22v-223q-139 -57 -543 -57h-30q-201 0 -278.5 129 t-77.5 430zM406 641h202q76 0 76 74q0 86 -20.5 111.5t-98.5 25.5q-101 0 -131 -35q-29 -33 -28 -159v-17z" /> +<glyph unicode="f" horiz-adv-x="829" d="M27 844v209l161 34v203q0 162 82 241t262 79q162 0 271 -49v-197l-176 4q-72 0 -87.5 -29.5t-15.5 -121.5v-19v-111h226v-243h-226v-844h-336v844h-161z" /> +<glyph unicode="g" horiz-adv-x="1153" d="M63 201q0 158 130 200q-121 78 -121 304q0 387 385 387h669v-191l-104 -37q33 -84 33 -205q0 -152 -86 -253t-299 -101h-228q-82 0 -82 -43q0 -31 20.5 -40t61.5 -9h297q342 0 342 -336v-115q0 -141 -81.5 -228t-270.5 -87h-307q-154 0 -249 80t-95 235v125l100 88 q-49 25 -82 82.5t-33 143.5zM408 705q0 -76 25.5 -108t84.5 -32h84q66 0 91.5 32t25.5 108q-2 74 -28.5 100t-90.5 26h-82q-68 0 -89 -32.5t-21 -93.5zM416 -45v-145q0 -66 25.5 -85.5t86.5 -19.5h119q45 0 68.5 15.5t28 33t4.5 49.5v64q0 84 -95 84h-153z" /> +<glyph unicode="h" horiz-adv-x="1130" d="M82 0v1602h336v-627q53 43 85 64.5t97.5 44t142.5 22.5q184 0 253 -103.5t69 -289.5v-713h-336v717q0 131 -98 131q-127 0 -213 -86v-762h-336z" /> +<glyph unicode="i" horiz-adv-x="487" d="M70 1243v207q0 53 49 53h254q47 0 47 -53v-207q0 -47 -47 -47h-254q-49 0 -49 47zM76 0v1087h336v-1087h-336z" /> +<glyph unicode="j" horiz-adv-x="516" d="M82 1243v207q0 53 49 53h258q45 0 45 -53v-207q0 -47 -45 -47h-258q-49 0 -49 47zM92 -553v1640h336v-1095v-32q0 -348 -84 -513h-252z" /> +<glyph unicode="k" horiz-adv-x="1183" d="M82 0v1602h336v-871h53l268 356h420l-381 -477l381 -610h-397l-291 487h-53v-487h-336z" /> +<glyph unicode="l" horiz-adv-x="651" d="M82 387v1217h336v-1155q0 -102 21.5 -143.5t64.5 -61.5q106 -43 123 -43v-201h-258q-143 0 -215 89t-72 298z" /> +<glyph unicode="m" horiz-adv-x="1775" d="M82 0v1087h276l60 -112q59 47 89 67.5t92.5 41t139.5 20.5q205 0 277 -133q190 133 373 133q180 0 249.5 -103.5t69.5 -291.5v-709h-336v717q0 129 -96 129q-143 0 -217 -76q0 -6 1 -28.5t1 -30.5v-711h-336v717q0 129 -98 129q-123 0 -209 -86v-760h-336z" /> +<glyph unicode="n" horiz-adv-x="1130" d="M82 0v1087h276l60 -112q57 45 87 65.5t95.5 43t142.5 22.5q184 0 253 -103.5t69 -289.5v-713h-336v717q0 131 -98 131q-127 0 -213 -86v-762h-336z" /> +<glyph unicode="o" horiz-adv-x="1140" d="M70 528q0 330 109.5 450t392 120t392 -123t109.5 -447q0 -305 -107.5 -421.5t-394.5 -116.5q-281 0 -391 121.5t-110 416.5zM406 528q0 -182 31.5 -230t133.5 -48q76 0 107 16.5t45 72.5t14 189q0 205 -28.5 258.5t-137.5 53.5q-111 0 -138 -52.5t-27 -259.5z" /> +<glyph unicode="p" horiz-adv-x="1140" d="M82 -553v1640h283l55 -104q141 117 301 117q188 0 271 -138.5t83 -412.5q0 -106 -8 -185t-30.5 -154t-61.5 -122t-102.5 -75.5t-151.5 -28.5q-162 0 -303 65v-602h-336zM420 270q70 -34 194 -34h7q63 0 90.5 58t27.5 238q0 168 -28.5 228.5t-89.5 60.5q-133 0 -201 -57 v-494z" /> +<glyph unicode="q" horiz-adv-x="1136" d="M70 549q0 551 405 551q162 0 331 -19.5t249 -48.5v-1585h-336v612q-91 -79 -240 -79h-4q-227 0 -316 137t-89 432zM406 559q0 -78 1 -118t9 -88t22.5 -68.5t42 -36t68.5 -15.5q96 0 170 41v582h-168q-41 0 -69.5 -20.5t-43 -47t-22.5 -72.5t-9 -77t-1 -80z" /> +<glyph unicode="r" horiz-adv-x="847" d="M82 0v1087h291l45 -137q115 147 278 148q80 0 111 -13v-321q-31 2 -160 2q-92 0 -146.5 -22.5t-82.5 -98.5v-645h-336z" /> +<glyph unicode="s" horiz-adv-x="1042" d="M53 702v95q0 137 67.5 219t215.5 82q168 0 258 -2t197.5 -17t142.5 -45v-205h-477q-39 0 -53.5 -11t-14.5 -46v-33q0 -25 10.5 -37t21.5 -14t36 -2h235q154 0 224.5 -79t70.5 -210v-114q0 -154 -76.5 -223.5t-189.5 -69.5q-545 0 -623 67v203h498q55 0 55 53v33 q0 31 -11 43t-44 12h-227q-316 0 -316 301z" /> +<glyph unicode="t" horiz-adv-x="784" d="M27 846v176l166 68l53 303h282v-303h217v-244h-217v-395q0 -106 20.5 -147.5t65.5 -61.5q106 -41 119 -41v-201h-274q-266 0 -266 389v457h-166z" /> +<glyph unicode="u" horiz-adv-x="1130" d="M70 377v710h336v-718q0 -127 96 -127q131 0 211 86v759h336v-1087h-275l-61 111q-16 -10 -66.5 -44t-74 -46.5t-73.5 -25.5t-110 -13q-184 0 -251.5 104.5t-67.5 290.5z" /> +<glyph unicode="v" horiz-adv-x="1177" d="M27 1087h358l201 -710l209 710h356l-381 -1087h-381z" /> +<glyph unicode="w" horiz-adv-x="1710" d="M27 1087h358l180 -710l164 710h328l-62 -272l160 -438l172 710h359l-328 -1087h-383l-133 344l-105 -344h-385z" /> +<glyph unicode="x" horiz-adv-x="1208" d="M33 0l368 545l-368 542h405l164 -292l168 292h406l-375 -548l358 -539h-389l-166 289l-166 -289h-405z" /> +<glyph unicode="y" horiz-adv-x="1202" d="M29 1087h350l160 -729q18 -74 100 -79l184 808h344l-340 -1431l-147 -209h-244l139 553q-281 0 -352 295z" /> +<glyph unicode="z" horiz-adv-x="983" d="M41 813v274h903v-274l-424 -537h424v-274h-872v272l450 539h-481z" /> +<glyph unicode="{" horiz-adv-x="657" d="M27 561v244q139 12 139 108v430q0 180 115.5 280.5t349.5 100.5v-274q-74 0 -101.5 -46t-27.5 -183v-330q0 -186 -205 -207q96 -18 149.5 -69.5t53.5 -131.5v-454q0 -104 27.5 -152.5t103.5 -48.5v-258q-252 0 -359.5 87t-107.5 265v531q0 55 -38 83.5t-99 24.5z" /> +<glyph unicode="|" horiz-adv-x="507" d="M119 -147v1724h274v-1724h-274z" /> +<glyph unicode="}" horiz-adv-x="657" d="M27 -172q76 0 104.5 48t28.5 153v454q0 80 53 131.5t149 69.5q-205 20 -204 207v330q0 137 -29 183t-102 46v274q236 0 351.5 -100t115.5 -281v-430q0 -96 137 -108v-244q-61 4 -98 -24.5t-37 -83.5v-531q0 -178 -108.5 -265t-360.5 -87v258z" /> +<glyph unicode="~" horiz-adv-x="843" d="M70 1212q119 147 247 148q47 0 113 -36t105 -36q98 -2 190 82l51 -135q-109 -147 -231 -148q-45 0 -120 36t-114 36q-82 0 -190 -72z" /> +<glyph unicode="¢" horiz-adv-x="995" d="M53 545q0 311 96.5 434t272.5 119v200h196v-204q180 -18 310 -66v-201q-166 12 -348 13q-61 0 -89 -5.5t-55.5 -34t-37 -90t-9.5 -169.5q0 -193 37 -243t154 -50l360 18v-205q-121 -70 -328 -73v-183h-196v183q-82 2 -144.5 28.5t-114 87t-78 171t-26.5 270.5z" /> +<glyph unicode="£" horiz-adv-x="1183" d="M70 0v258l131 47v326h-131v168l131 49v125q0 168 34.5 275.5t111.5 160.5t167 71.5t231 18.5q51 0 143.5 -8t159.5 -16l66 -9v-270h-381q-121 0 -158.5 -31.5t-37.5 -156.5v-160l417 -33v-184h-417v-326h577v-305h-1044z" /> +<glyph unicode="¥" horiz-adv-x="1323" d="M27 1499h366l258 -672l279 672h366l-383 -794h174v-185h-274v-63h274v-183h-274v-274h-336v274h-264v183h264v63h-264v185h170z" /> +<glyph unicode="¨" horiz-adv-x="911" d="M70 1192q0 51 36.5 88t90 37t89.5 -36t36 -89t-37 -90t-88 -37q-53 0 -90 37t-37 90zM590 1192q0 51 38 88t91 37q51 0 88 -36t37 -89t-37 -90t-88 -37q-53 0 -91 38t-38 89z" /> +<glyph unicode="©" horiz-adv-x="1630" d="M76 753.5q0 157.5 22.5 280.5t78.5 233.5t168 171t273 60.5h445q147 0 248.5 -58.5t153 -169t71.5 -233.5t20 -284q0 -367 -129 -560.5t-364 -193.5h-445q-141 0 -248.5 59.5t-170 165t-93 238.5t-30.5 290.5zM283 754q0 -252 84 -406.5t251 -154.5h431q301 0 301 561 q0 90 -4.5 153.5t-20.5 145.5t-45 132t-84 86t-133 36h-445q-76 0 -132 -23.5t-104 -82t-73.5 -171t-25.5 -276.5zM451 747.5q0 446.5 294 446.5q231 0 381 -49v-168q-172 25 -319 24q-84 0 -116 -55t-32 -205q0 -131 37 -189t123 -58q137 0 320 32v-168q-127 -57 -379 -57 q-309 0 -309 446.5z" /> +<glyph unicode="«" horiz-adv-x="1212" d="M70 725l422 416l174 -172l-248 -244l252 -250l-170 -176zM543 725l422 416l176 -172l-248 -244l252 -250l-170 -176z" /> +<glyph unicode="­" horiz-adv-x="724" d="M41 457v274h643v-274h-643z" /> +<glyph unicode="®" horiz-adv-x="1630" d="M76 753.5q0 157.5 22.5 280.5t78.5 233.5t168 171t273 60.5h445q147 0 248.5 -58.5t153 -169t71.5 -233.5t20 -284q0 -367 -129 -560.5t-364 -193.5h-445q-141 0 -248.5 59.5t-170 165t-93 238.5t-30.5 290.5zM283 754q0 -252 84 -406.5t251 -154.5h431q301 0 301 561 q0 90 -4.5 153.5t-20.5 145.5t-45 132t-84 86t-133 36h-445q-76 0 -132 -23.5t-104 -82t-73.5 -171t-25.5 -276.5zM498 313v875h379q274 0 274 -279q0 -221 -147 -266l174 -330h-224l-163 318l-86 24v-342h-207zM705 807h122q78 0 96.5 16.5t18.5 85.5q0 57 -23.5 71.5 t-91.5 14.5h-122v-188z" /> +<glyph unicode="´" horiz-adv-x="497" d="M27 1087l174 289h270l-242 -289h-202z" /> +<glyph unicode="¸" horiz-adv-x="493" d="M70 -229l82 30q41 18 51 40t10 83h213q0 -160 -51 -226.5t-187 -66.5h-118v140z" /> +<glyph unicode="»" horiz-adv-x="1212" d="M70 475l252 250l-248 244l174 172l422 -416l-432 -426zM543 475l252 250l-248 244l176 172l422 -416l-432 -426z" /> +<glyph unicode="À" horiz-adv-x="1433" d="M61 0l490 1499h389l473 -1499h-350l-98 301h-453l-98 -301h-353zM403 1921h271l174 -289h-203zM594 592h297l-141 477z" /> +<glyph unicode="Â" horiz-adv-x="1433" d="M61 0l490 1499h389l473 -1499h-350l-98 301h-453l-98 -301h-353zM424 1632l213 281h237l193 -281h-207l-110 115l-117 -115h-209zM594 592h297l-141 477z" /> +<glyph unicode="Æ" horiz-adv-x="1978" d="M41 0l569 1157q57 117 134 191.5t170.5 106.5t174 40t193.5 4q455 -8 635 -33v-280h-543q-37 0 -59.5 -8.5t-31.5 -29t-11 -33.5t-4 -42v-174l551 -22v-277l-551 -18v-170q0 -51 22.5 -76t42 -27t62.5 -2h522v-278q-72 -10 -225.5 -19.5t-271.5 -13.5l-117 -4 q-61 -4 -119 4t-118 32.5t-97 81t-37 138.5v125h-334l-184 -373h-373zM737 664h195v409z" /> +<glyph unicode="Ç" horiz-adv-x="1165" d="M76 754q0 385 111.5 573.5t402.5 188.5q182 0 291.5 -15.5t238.5 -58.5v-262l-14 2q-14 2 -38 4t-56.5 6t-72.5 7t-81 5t-88 4t-88 2q-68 0 -104.5 -6t-73.5 -29.5t-54.5 -73.5t-27.5 -135t-10 -216q0 -260 54 -358.5t218 -98.5l436 18v-262q-186 -68 -530 -61 q-274 2 -394 193.5t-120 572.5zM156 -229l82 30q41 18 51 40t10 83h213q0 -160 -51 -226.5t-187 -66.5h-118v140z" /> +<glyph unicode="È" d="M102 311v860q0 82 24 142.5t58.5 95.5t83.5 56.5t92 27.5t93 6q485 -8 663 -33v-280h-571q-49 0 -75 -19.5t-29 -39t-3 -56.5v-170l582 -20v-279l-582 -18v-170q0 -39 10.5 -62.5t33 -32t38 -10.5t45.5 -2h551v-278q-70 -8 -230.5 -17.5t-286.5 -13.5l-126 -4 q-47 -2 -90 2t-97.5 22.5t-92 51t-64.5 95t-27 146.5zM328 1919h272l172 -289h-203z" /> +<glyph unicode="É" d="M102 311v860q0 82 24 142.5t58.5 95.5t83.5 56.5t92 27.5t93 6q485 -8 663 -33v-280h-571q-49 0 -75 -19.5t-29 -39t-3 -56.5v-170l582 -20v-279l-582 -18v-170q0 -39 10.5 -62.5t33 -32t38 -10.5t45.5 -2h551v-278q-70 -8 -230.5 -17.5t-286.5 -13.5l-126 -4 q-47 -2 -90 2t-97.5 22.5t-92 51t-64.5 95t-27 146.5zM555 1630l174 287h270l-241 -287h-203z" /> +<glyph unicode="Ê" d="M102 311v860q0 82 24 142.5t58.5 95.5t83.5 56.5t92 27.5t93 6q485 -8 663 -33v-280h-571q-49 0 -75 -19.5t-29 -39t-3 -56.5v-170l582 -20v-279l-582 -18v-170q0 -39 10.5 -62.5t33 -32t38 -10.5t45.5 -2h551v-278q-70 -8 -230.5 -17.5t-286.5 -13.5l-126 -4 q-47 -2 -90 2t-97.5 22.5t-92 51t-64.5 95t-27 146.5zM330 1632l213 281h237l195 -281h-209l-111 115l-116 -115h-209z" /> +<glyph unicode="Ë" d="M102 311v860q0 82 24 142.5t58.5 95.5t83.5 56.5t92 27.5t93 6q485 -8 663 -33v-280h-571q-49 0 -75 -19.5t-29 -39t-3 -56.5v-170l582 -20v-279l-582 -18v-170q0 -39 10.5 -62.5t33 -32t38 -10.5t45.5 -2h551v-278q-70 -8 -230.5 -17.5t-286.5 -13.5l-126 -4 q-47 -2 -90 2t-97.5 22.5t-92 51t-64.5 95t-27 146.5zM250 1757q0 51 37 88t90 37t89 -36t36 -89t-37 -90t-88 -37q-53 0 -90 37t-37 90zM772 1757q0 51 37 88t90 37q51 0 88 -36t37 -89t-37 -90t-88 -37t-89 37t-38 90z" /> +<glyph unicode="Î" horiz-adv-x="526" d="M-45 1632l215 281h238l192 -281h-207l-110 115l-119 -115h-209zM111 0v1499h335v-1499h-335z" /> +<glyph unicode="Ï" horiz-adv-x="526" d="M-111 1759q0 51 38 88t91 37q51 0 88 -37t37 -88q0 -53 -36.5 -90t-88.5 -37q-53 0 -91 38t-38 89zM111 0v1499h335v-1499h-335zM414 1759q0 51 36.5 88t90 37t89.5 -37t36 -88q0 -53 -37 -90t-88 -37q-53 0 -90 38t-37 89z" /> +<glyph unicode="Ô" horiz-adv-x="1370" d="M90 739q0 172 20.5 301t62.5 212t92 135.5t126 79t144.5 34.5t164.5 8q100 0 170 -8t146 -34.5t124 -79t90 -135.5t61.5 -212t19.5 -301q0 -195 -30 -332t-78 -216.5t-130 -125t-166 -59.5t-207 -14q-88 0 -150.5 5t-131 23.5t-114.5 51t-89 88t-68.5 133.5t-41 190.5 t-15.5 255.5zM379 1632l213 281h237l195 -281h-209l-110 115l-117 -115h-209zM426 739q0 -276 51 -359t223 -83q164 0 219.5 86t55.5 356q0 207 -27.5 306.5t-81 129t-166.5 29.5q-68 0 -107.5 -7t-75.5 -32.5t-53.5 -77t-27.5 -135.5t-10 -213z" /> +<glyph unicode="Ù" horiz-adv-x="1351" d="M111 655v844h335v-844q0 -213 49.5 -286.5t200.5 -73.5q137 0 187.5 79t50.5 281v844h338v-844q0 -109 -12.5 -197.5t-31 -153t-52 -116t-62.5 -83t-77 -55t-80.5 -35t-88 -17.5t-86 -7t-86.5 -1h-19q-91 0 -139.5 3t-127 20.5t-121.5 60.5t-90 112.5t-67.5 188 t-20.5 280.5zM348 1921h270l175 -289h-203z" /> +<glyph unicode="Û" horiz-adv-x="1351" d="M111 655v844h335v-844q0 -213 49.5 -286.5t200.5 -73.5q137 0 187.5 79t50.5 281v844h338v-844q0 -109 -12.5 -197.5t-31 -153t-52 -116t-62.5 -83t-77 -55t-80.5 -35t-88 -17.5t-86 -7t-86.5 -1h-19q-91 0 -139.5 3t-127 20.5t-121.5 60.5t-90 112.5t-67.5 188 t-20.5 280.5zM369 1632l213 281h237l193 -281h-205l-113 115l-116 -115h-209z" /> +<glyph unicode="Ü" horiz-adv-x="1351" d="M111 655v844h335v-844q0 -213 49.5 -286.5t200.5 -73.5q137 0 187.5 79t50.5 281v844h338v-844q0 -109 -12.5 -197.5t-31 -153t-52 -116t-62.5 -83t-77 -55t-80.5 -35t-88 -17.5t-86 -7t-86.5 -1h-19q-91 0 -139.5 3t-127 20.5t-121.5 60.5t-90 112.5t-67.5 188 t-20.5 280.5zM303 1759q0 51 37 88t90 37t90 -37t37 -88t-37 -89t-90 -38t-90 38t-37 89zM825 1759q0 51 37 88t90 37q51 0 88 -37t37 -88q0 -53 -36.5 -90t-88 -37t-89.5 38t-38 89z" /> +<glyph unicode="à" horiz-adv-x="1062" d="M53 285v94q0 133 79 220t257 87q270 -2 270 0q2 43 0 45q0 78 -30.5 99.5t-106.5 21.5q-162 0 -432 -23v203q182 76 483 76q209 0 315.5 -80t106.5 -283v-745h-266l-70 115q-16 -35 -99 -82t-185 -45q-160 6 -241 95t-81 202zM205 1520h272l172 -289h-203zM389 336 q0 -41 16.5 -62.5t33 -24.5t46.5 -3q47 0 90 19.5t64 38.5l20 20v165l-192 -16q-78 -6 -78 -102v-35z" /> +<glyph unicode="â" horiz-adv-x="1062" d="M53 285v94q0 133 79 220t257 87q270 -2 270 0q2 43 0 45q0 78 -30.5 99.5t-106.5 21.5q-162 0 -432 -23v203q182 76 483 76q209 0 315.5 -80t106.5 -283v-745h-266l-70 115q-16 -35 -99 -82t-185 -45q-160 6 -241 95t-81 202zM225 1231l213 280h238l192 -280h-206 l-113 115l-115 -115h-209zM389 336q0 -41 16.5 -62.5t33 -24.5t46.5 -3q47 0 90 19.5t64 38.5l20 20v165l-192 -16q-78 -6 -78 -102v-35z" /> +<glyph unicode="æ" horiz-adv-x="1703" d="M53 287v69q0 133 79 220.5t257 87.5q270 -2 270 0q2 70 0 69q0 80 -30.5 101.5t-106.5 21.5q-125 0 -432 -25v203q172 76 483 76q211 -4 295 -74q98 61 303 62q137 0 218 -13.5t145.5 -53.5t90.5 -115.5t26 -198.5q0 -147 -77 -206.5t-235 -59.5h-305q0 -123 55.5 -162 t182.5 -39q205 0 358 22v-223q-143 -57 -573 -57q-195 0 -291 141q-23 -49 -153 -96t-238 -45q-160 4 -241 93t-81 202zM389 332q0 -25 7 -42.5t12.5 -25.5t25 -11t22.5 -3h29q47 0 90 19.5t64 38.5l20 20v141l-192 -16q-78 -6 -78 -103v-18zM1034 664h203q78 0 78 73 q0 82 -19.5 100.5t-101.5 18.5q-59 0 -78.5 -2t-45.5 -19.5t-31 -57t-5 -113.5z" /> +<glyph unicode="ç" horiz-adv-x="1007" d="M70 545q0 309 92 431t264 122q322 0 514 -70v-201q-164 12 -346 13q-61 0 -88 -5.5t-55.5 -34t-36.5 -89t-8 -170.5q0 -193 35.5 -243t152.5 -50l360 18v-205q-55 -33 -123.5 -50t-134 -19t-137.5 -3t-133 -1q-168 0 -262 125t-94 432zM311 -231l84 30q41 18 50.5 40 t9.5 83h213q0 -160 -51.5 -226.5t-186.5 -66.5h-119v140z" /> +<glyph unicode="è" horiz-adv-x="1075" d="M70 549q0 174 23.5 280.5t85 166t144.5 80t222 20.5q111 0 179.5 -7.5t132 -30t95 -66.5t50 -115.5t18.5 -180.5q0 -152 -79 -217t-232 -65h-303q0 -49 10 -81t23.5 -49.5t47 -25.5t57 -9t79.5 -1h20q217 0 356 22v-223q-139 -57 -543 -57h-30q-201 0 -278.5 129 t-77.5 430zM211 1507h272l172 -286h-202zM406 641h202q76 0 76 74q0 86 -20.5 111.5t-98.5 25.5q-100 0 -130.5 -35t-28.5 -176z" /> +<glyph unicode="é" horiz-adv-x="1075" d="M70 549q0 174 23.5 280.5t85 166t144.5 80t222 20.5q111 0 179.5 -7.5t132 -30t95 -66.5t50 -115.5t18.5 -180.5q0 -152 -79 -217t-232 -65h-303q0 -49 10 -81t23.5 -49.5t47 -25.5t57 -9t79.5 -1h20q217 0 356 22v-223q-139 -57 -543 -57h-30q-201 0 -278.5 129 t-77.5 430zM406 641h202q76 0 76 74q0 86 -20.5 111.5t-98.5 25.5q-100 0 -130.5 -35t-28.5 -176zM449 1221l172 286h272l-242 -286h-202z" /> +<glyph unicode="ê" horiz-adv-x="1075" d="M70 549q0 174 23.5 280.5t85 166t144.5 80t222 20.5q111 0 179.5 -7.5t132 -30t95 -66.5t50 -115.5t18.5 -180.5q0 -152 -79 -217t-232 -65h-303q0 -49 10 -81t23.5 -49.5t47 -25.5t57 -9t79.5 -1h20q217 0 356 22v-223q-139 -57 -543 -57h-30q-201 0 -278.5 129 t-77.5 430zM217 1221l213 282h238l194 -282h-207l-112 114l-117 -114h-209zM406 641h202q76 0 76 74q0 86 -20.5 111.5t-98.5 25.5q-100 0 -130.5 -35t-28.5 -176z" /> +<glyph unicode="ë" horiz-adv-x="1075" d="M70 549q0 174 23.5 280.5t85 166t144.5 80t222 20.5q111 0 179.5 -7.5t132 -30t95 -66.5t50 -115.5t18.5 -180.5q0 -152 -79 -217t-232 -65h-303q0 -49 10 -81t23.5 -49.5t47 -25.5t57 -9t79.5 -1h20q217 0 356 22v-223q-139 -57 -543 -57h-30q-201 0 -278.5 129 t-77.5 430zM152 1347.5q0 53.5 36.5 90.5t90.5 37q51 0 87.5 -37t36.5 -90.5t-36.5 -90t-87.5 -36.5q-53 0 -90 36.5t-37 90zM406 641h202q76 0 76 74q0 86 -20.5 111.5t-98.5 25.5q-100 0 -130.5 -35t-28.5 -176zM672 1347.5q0 51.5 38 89.5t91 38q51 0 88 -37t37 -90.5 t-37 -90t-88 -36.5q-53 0 -91 37.5t-38 89z" /> +<glyph unicode="î" horiz-adv-x="499" d="M-72 1221l215 282h238l192 -282h-206l-113 114l-117 -114h-209zM82 0v1087h336v-1087h-336z" /> +<glyph unicode="ï" horiz-adv-x="499" d="M-137 1347.5q0 51.5 38 89.5t91 38q51 0 88 -37t37 -90.5t-37 -90t-88 -36.5q-53 0 -91 37.5t-38 89zM82 0v1087h336v-1087h-336zM385 1347.5q0 53.5 37 90.5t90 37t90 -37t37 -90.5t-37 -90t-90 -36.5t-90 36.5t-37 90z" /> +<glyph unicode="ô" horiz-adv-x="1140" d="M70 528q0 330 109.5 450t392 120t392 -123t109.5 -447q0 -305 -107.5 -421.5t-394.5 -116.5q-281 0 -391 121.5t-110 416.5zM252 1221l213 282h237l193 -282h-207l-110 114l-117 -114h-209zM406 528q0 -182 31.5 -230t133.5 -48q76 0 107 16.5t45 72.5t14 189 q0 205 -28.5 258.5t-137.5 53.5q-111 0 -138 -52.5t-27 -259.5z" /> +<glyph unicode="ù" horiz-adv-x="1130" d="M70 377v710h336v-718q0 -127 96 -127q131 0 211 86v759h336v-1087h-275l-61 111q-16 -10 -66.5 -44t-74 -46.5t-73.5 -25.5t-110 -13q-184 0 -251.5 104.5t-67.5 290.5zM221 1507h271l174 -286h-203z" /> +<glyph unicode="û" horiz-adv-x="1130" d="M70 377v710h336v-718q0 -127 96 -127q131 0 211 86v759h336v-1087h-275l-61 111q-16 -10 -66.5 -44t-74 -46.5t-73.5 -25.5t-110 -13q-184 0 -251.5 104.5t-67.5 290.5zM238 1221l213 282h237l193 -282h-207l-111 114l-117 -114h-208z" /> +<glyph unicode="ü" horiz-adv-x="1130" d="M70 377v710h336v-718q0 -127 96 -127q131 0 211 86v759h336v-1087h-275l-61 111q-16 -10 -66.5 -44t-74 -46.5t-73.5 -25.5t-110 -13q-184 0 -251.5 104.5t-67.5 290.5zM172 1347.5q0 53.5 37 90.5t90 37q51 0 88 -37t37 -90.5t-37 -90t-88 -36.5q-53 0 -90 36.5t-37 90z M694 1347.5q0 53.5 38 90.5t89 37t88 -37t37 -90.5t-37 -90t-88 -36.5t-89 36.5t-38 90z" /> +<glyph unicode="ÿ" horiz-adv-x="1202" d="M29 1087h350l160 -729q18 -74 100 -79l184 808h344l-340 -1431l-147 -209h-244l139 553q-281 0 -352 295zM211 1347.5q0 53.5 38 90.5t89 37t88 -37t37 -90.5t-37 -90t-88 -36.5t-89 36.5t-38 90zM733 1347.5q0 53.5 37 90.5t90 37t90 -37t37 -90.5t-37 -90t-90 -36.5 t-90 36.5t-37 90z" /> +<glyph unicode="Œ" horiz-adv-x="2031" d="M90 739q0 172 20.5 301t62.5 212t92 135.5t126 79t144.5 34.5t164.5 8q262 0 379 -84q86 80 244 74q455 -8 635 -33v-280h-543q-49 0 -74.5 -19.5t-28.5 -39t-3 -56.5v-170l551 -20v-279l-551 -18v-170q0 -51 22.5 -76t43 -28t61.5 -3h522v-278q-72 -8 -225.5 -17.5 t-271.5 -13.5l-118 -4q-184 -10 -274 76q-119 -78 -369 -78q-88 0 -150.5 5t-131 23.5t-114.5 51t-89 88t-68.5 133.5t-41 190.5t-15.5 255.5zM426 739q0 -276 51 -359t223 -83q111 0 167.5 35t81 128t24.5 279q0 207 -26.5 306.5t-80 129t-166.5 29.5q-68 0 -107.5 -7 t-75.5 -32.5t-53.5 -77t-27.5 -135.5t-10 -213z" /> +<glyph unicode="œ" horiz-adv-x="1742" d="M70 528q0 330 109.5 450t391.5 120q217 0 322 -74q90 72 319 72q111 0 179.5 -7.5t132 -30t95.5 -66.5t50.5 -115.5t18.5 -180.5q0 -152 -79 -217t-233 -65h-303q0 -49 11.5 -82t24.5 -49.5t51 -24.5t63.5 -9t87.5 -1q217 0 356 22v-223q-139 -57 -543 -57h-30 q-137 0 -209 63q-104 -63 -314 -63q-281 0 -391 121.5t-110 416.5zM406 528q0 -182 31.5 -230t133.5 -48q117 0 141.5 50t24.5 249q0 186 -28.5 238.5t-137.5 52.5q-111 0 -138 -52.5t-27 -259.5zM1073 641h203q76 0 76 74q0 86 -20.5 111.5t-98.5 25.5q-98 0 -131 -37 t-29 -174z" /> +<glyph unicode="Ÿ" horiz-adv-x="1363" d="M61 1499h365l258 -694l283 694h364l-483 -1059v-440h-336v440zM309 1759q0 51 37 88t90 37q51 0 88 -37t37 -88q0 -53 -37 -90t-88 -37t-89 38t-38 89zM831 1759q0 51 37 88t90.5 37t89 -37t35.5 -88q0 -53 -36.5 -90t-88.5 -37q-53 0 -90 38t-37 89z" /> +<glyph unicode="ˆ" horiz-adv-x="780" d="M70 1087l213 281h237l193 -281h-207l-113 115l-114 -115h-209z" /> +<glyph unicode="˚" horiz-adv-x="552" d="M70 1294q0 88 61.5 149.5t147.5 61.5t145 -61.5t59 -149.5t-59 -148.5t-145 -60.5t-147.5 60.5t-61.5 148.5zM197 1294.5q0 -32.5 23.5 -55t58.5 -22.5q33 0 55 22.5t22 55t-22.5 56t-54.5 23.5q-35 0 -58.5 -23.5t-23.5 -56z" /> +<glyph unicode="˜" horiz-adv-x="843" d="M70 1212q117 145 247 146q49 -2 116 -37t104 -35q92 -4 188 80l51 -135q-115 -143 -231 -144q-49 2 -122 37t-112 35t-73.5 -11t-53 -21.5t-63.5 -39.5z" /> +<glyph unicode=" " horiz-adv-x="960" /> +<glyph unicode=" " horiz-adv-x="1921" /> +<glyph unicode=" " horiz-adv-x="960" /> +<glyph unicode=" " horiz-adv-x="1921" /> +<glyph unicode=" " horiz-adv-x="640" /> +<glyph unicode=" " horiz-adv-x="480" /> +<glyph unicode=" " horiz-adv-x="320" /> +<glyph unicode=" " horiz-adv-x="320" /> +<glyph unicode=" " horiz-adv-x="240" /> +<glyph unicode=" " horiz-adv-x="384" /> +<glyph unicode=" " horiz-adv-x="106" /> +<glyph unicode="‐" horiz-adv-x="724" d="M41 457v274h643v-274h-643z" /> +<glyph unicode="‑" horiz-adv-x="724" d="M41 457v274h643v-274h-643z" /> +<glyph unicode="‒" horiz-adv-x="724" d="M41 457v274h643v-274h-643z" /> +<glyph unicode="–" horiz-adv-x="1050" d="M41 451v276h969v-276h-969z" /> +<glyph unicode="—" horiz-adv-x="1507" d="M41 455v276h1425v-276h-1425z" /> +<glyph unicode="‘" horiz-adv-x="522" d="M111 1028v295q0 72 29.5 118t72.5 60.5t86 19.5t73 0l29 -5v-130q-66 2 -65 -63v-39h24q51 0 52 -51v-205q0 -57 -52 -57h-200q-49 0 -49 57z" /> +<glyph unicode="’" horiz-adv-x="522" d="M111 1262v204q0 57 53 58h198q49 0 50 -58v-297q0 -72 -30 -117.5t-73 -61t-86 -19.5t-72 1l-30 5v129q66 0 65 65v37h-22q-53 1 -53 54z" /> +<glyph unicode="‚" horiz-adv-x="522" d="M111 53v205q0 57 53 57h198q49 0 50 -57v-297q0 -72 -30 -118t-73 -61t-86 -19.5t-72 0.5l-30 6v129q66 0 65 65v37h-22q-53 0 -53 53z" /> +<glyph unicode="“" horiz-adv-x="876" d="M100 1024v297q0 182 185 197q57 4 106 -7v-127q-63 0 -63 -65v-37h22q51 0 51 -53v-205q0 -57 -51 -57h-198q-52 0 -52 57zM477 1024v297q0 182 185 197q57 4 106 -7v-127q-66 0 -66 -65v-37h25q51 0 51 -53v-205q0 -57 -51 -57h-199q-51 0 -51 57z" /> +<glyph unicode="”" horiz-adv-x="876" d="M100 1257v205q0 57 52 58h200q49 0 49 -58v-295q0 -72 -29.5 -119t-72.5 -61t-86 -18t-73 1l-29 5v127q66 0 65 65v37h-24q-52 0 -52 53zM477 1257v205q0 57 51 58h201q49 0 49 -58v-295q0 -72 -29.5 -119t-72.5 -61t-86 -18t-73 1l-30 5v127q66 0 66 65v37h-25 q-51 0 -51 53z" /> +<glyph unicode="„" horiz-adv-x="876" d="M100 53v205q0 57 52 57h200q49 0 49 -57v-297q0 -72 -29.5 -118t-72.5 -61t-86 -19.5t-73 0.5l-29 6v129q66 0 65 65v37h-24q-52 0 -52 53zM477 53v205q0 57 51 57h201q49 0 49 -57v-297q0 -72 -29.5 -118t-72.5 -61t-86 -19.5t-73 0.5l-30 6v129q66 0 66 65v37h-25 q-51 0 -51 53z" /> +<glyph unicode="…" horiz-adv-x="1646" d="M358 47v209q0 51 50 51h200q29 0 41 -14q14 14 37 14h201q29 0 41 -14q14 14 37 14h200q51 0 52 -51v-209q0 -47 -52 -47h-200q-18 0 -37 14q-12 -14 -41 -14h-201q-18 0 -37 14q-12 -14 -41 -14h-200q-50 0 -50 47z" /> +<glyph unicode=" " horiz-adv-x="384" /> +<glyph unicode="‹" horiz-adv-x="729" d="M70 725l422 416l174 -172l-248 -244l252 -250l-170 -176z" /> +<glyph unicode="›" horiz-adv-x="729" d="M70 475l252 250l-248 244l174 172l422 -416l-432 -426z" /> +<glyph unicode=" " horiz-adv-x="480" /> +<glyph unicode="€" horiz-adv-x="1269" d="M27 508v156l149 16v115l-149 16v147l149 21q0 537 510 537q106 0 271 -19.5t278 -58.5v-242q-289 29 -457 29q-96 0 -151.5 -13.5t-80 -51.5t-29.5 -72.5t-5 -108.5l479 -16v-156l-479 -12v-115l479 -16v-156q-31 0 -81 -2t-155.5 -5t-175 -5t-67.5 -4 q0 -139 69.5 -184.5t196.5 -45.5q82 0 198 12.5t191 24.5l76 12v-237q-180 -86 -557 -86q-59 0 -114.5 7t-132.5 37.5t-131 81t-93 148.5t-39 230z" /> +<glyph unicode="™" horiz-adv-x="1454" d="M27 1323v176h591v-176h-190v-539h-207v539h-194zM637 784l86 715h219l98 -397l74 397h225l95 -715h-207l-39 365l-55 -365h-187l-69 363l-31 -363h-209z" /> +<glyph unicode="" horiz-adv-x="1085" d="M0 1085h1085v-1085h-1085v1085z" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-ExtraBold-webfont.ttf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-ExtraBold-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..fe67518f6a3f66566f448891d7acc0f9cd692b8f Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-ExtraBold-webfont.ttf differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-ExtraBold-webfont.woff b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-ExtraBold-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..4606692e1bf3477eaab35f60686004429de6554c Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-ExtraBold-webfont.woff differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-ExtraLight-Italic-webfont.eot b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-ExtraLight-Italic-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..09750ad5025bd5fc3626345cb7315b17e7bf31ac Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-ExtraLight-Italic-webfont.eot differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-ExtraLight-Italic-webfont.svg b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-ExtraLight-Italic-webfont.svg new file mode 100644 index 0000000000000000000000000000000000000000..0a22d578cab80a12316fccc0e52ff8b5d1e22dd1 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-ExtraLight-Italic-webfont.svg @@ -0,0 +1,187 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Copyright c 2011 Natanael Gama exondiscoveredcom with Reserved Font Name Exo +Designer : Natanael Gama +</metadata> +<defs> +<font id="ExoExtraLightItalic" horiz-adv-x="415" > +<font-face units-per-em="2048" ascent="1638" descent="-410" /> +<missing-glyph horiz-adv-x="489" /> +<glyph unicode=" " horiz-adv-x="489" /> +<glyph unicode="	" horiz-adv-x="489" /> +<glyph unicode=" " horiz-adv-x="489" /> +<glyph unicode="!" horiz-adv-x="501" d="M172 33l21 123q4 33 38 32h52q33 0 28 -32l-20 -123q-2 -33 -37 -33h-53q-33 0 -29 33zM252 403l162 1094h92l-184 -1094h-70z" /> +<glyph unicode=""" horiz-adv-x="651" d="M270 1087l27 275l22 137h87l-23 -137l-57 -275h-56zM500 1087l26 275l23 137h86l-23 -137l-57 -275h-55z" /> +<glyph unicode="#" horiz-adv-x="1331" d="M115 500l16 51h352l123 393h-352l18 51h353l159 504h52l-160 -504h366l160 504h51l-157 -504h362l-18 -51h-363l-123 -395h363l-17 -51h-362l-160 -498h-51l158 498l-367 2l-158 -500h-53l158 500h-350zM537 551l364 -2l123 395h-365z" /> +<glyph unicode="$" horiz-adv-x="1175" d="M164 20l10 58q258 -12 467 -12q322 0 360 253l21 140q20 127 -22 180t-185 53h-227q-358 0 -307 320l22 135q33 209 146.5 285.5t324.5 78.5l27 177h65l-28 -181q178 -8 366 -39l-8 -57l-426 19q-168 6 -262 -53.5t-121 -229.5l-22 -135q-20 -131 37 -182.5t196 -51.5 h231q100 0 164 -26.5t88.5 -70.5t31.5 -101.5t-7 -120.5l-21 -140q-16 -106 -63 -177.5t-117.5 -104.5t-143.5 -44t-165 -9l-27 -166h-63l26 170q-276 18 -368 32z" /> +<glyph unicode="%" horiz-adv-x="2000" d="M236 971l43 272q20 137 84.5 196.5t218.5 59.5h206q141 0 191.5 -60.5t30.5 -195.5l-43 -272q-23 -141 -86.5 -198.5t-214.5 -57.5h-207q-137 0 -190 62.5t-33 193.5zM301 971q-18 -109 19.5 -150t146.5 -41h207q111 0 160 39t67 152l43 272q16 106 -16.5 148.5 t-147.5 42.5h-207q-113 0 -162 -39t-67 -152zM461 0l1134 1499h78l-1134 -1499h-78zM1143 260l43 272q20 137 83.5 196.5t217.5 59.5h207q143 0 193 -60t30 -196l-43 -272q-23 -139 -87.5 -197.5t-215.5 -58.5h-207q-137 0 -189 62.5t-32 193.5zM1208 260 q-18 -109 20 -149.5t144 -40.5h207q111 0 161 38.5t68 151.5l43 272q16 106 -17.5 148.5t-147.5 42.5h-207q-113 0 -161 -39t-67 -152z" /> +<glyph unicode="&" horiz-adv-x="1363" d="M145.5 475.5q47.5 153.5 204.5 274.5l199 149l-100 174q-70 119 -52.5 207t79 140.5t151.5 66.5q231 37 573 -14l-8 -52h-430q-186 0 -257 -77.5t13 -239.5l436 -760l340 289l25 -25l-160 -196l-160 -138l162 -274h-84l-137 227l-164 -137q-86 -72 -196.5 -92.5t-218 23 t-173.5 145.5q-90 156 -42.5 309.5zM221.5 455.5q-39.5 -125.5 34.5 -244.5q72 -117 209 -137.5t256 76.5l176 145l-309 532l-180 -135q-147 -111 -186.5 -236.5z" /> +<glyph unicode="'" horiz-adv-x="307" d="M225 1087l27 275l22 137h86l-22 -137l-57 -275h-56z" /> +<glyph unicode="(" horiz-adv-x="604" d="M234.5 498q3.5 133 23.5 264q76 469 406 960q87 122 88 121h96q-16 -20 -45 -59t-104.5 -159t-139 -241.5t-128 -297t-91.5 -336.5q-29 -190 -23.5 -356.5t35 -302.5t63.5 -233.5t60 -151.5l27 -54h-92q-6 10 -14.5 28.5t-33 80t-45 127t-43 168t-33 206t-7 236.5z" /> +<glyph unicode=")" horiz-adv-x="606" d="M-27 -348q16 20 44 56t104 151.5t138.5 236.5t128 300t93.5 352q27 178 22 339.5t-35 300t-62.5 240t-59.5 158.5l-27 57h91q6 -10 14 -30.5t31.5 -85t44 -133t42 -173t33 -206t9.5 -228.5t-21 -246q-29 -178 -90 -356t-127.5 -305t-129 -227.5t-103.5 -150.5l-41 -50 h-99z" /> +<glyph unicode="*" horiz-adv-x="958" d="M285 1194l6 47l295 25l-11 -82zM385 842l104 274l84 -16l-147 -273zM596 1001l57 74l207 -176l-31 -37zM604 1477l47 16l105 -248l-86 -37zM709 1143l260 166l18 -41l-231 -189z" /> +<glyph unicode="+" horiz-adv-x="1067" d="M205 688l14 82h363l57 365h84l-57 -365h364l-14 -82h-365l-57 -364h-84l57 364h-362z" /> +<glyph unicode="," d="M135 -154l4 31q43 0 49 41l15 82h-17q-35 0 -28 35l18 121q6 37 41 37h49q31 0 27 -37l-35 -213q-16 -103 -108 -98z" /> +<glyph unicode="-" horiz-adv-x="694" d="M123 553l14 82h602l-14 -82h-602z" /> +<glyph unicode="." horiz-adv-x="419" d="M158 33l18 123q6 33 39 32h51q35 0 29 -32l-21 -123q-2 -33 -36 -33h-52q-34 0 -28 33z" /> +<glyph unicode="/" horiz-adv-x="671" d="M16 -147l848 1724h84l-848 -1724h-84z" /> +<glyph unicode="0" horiz-adv-x="1323" d="M215 332l133 835q25 164 134.5 248t269.5 84h295q176 0 244.5 -93t45.5 -239l-133 -835q-53 -332 -395 -332h-295q-154 0 -240 80t-59 252zM299 332q-37 -248 229 -248h295q260 0 297 248l133 835q37 248 -219 248h-295q-129 0 -208.5 -65.5t-98.5 -182.5z" /> +<glyph unicode="1" horiz-adv-x="798" d="M274 1257l11 58q183 0 415 169q21 16 21 15h80l-234 -1499h-84l224 1393q-68 -47 -186 -91.5t-247 -44.5z" /> +<glyph unicode="2" horiz-adv-x="1189" d="M96 0l13 78q1001 676 1056 1014q31 180 -41.5 261t-240.5 81h-574l8 59q215 27 588 27q209 0 292 -119t54 -314q-14 -109 -111.5 -244.5t-212 -245.5t-269 -231.5t-232.5 -177t-154 -104.5h818l-13 -84h-981z" /> +<glyph unicode="3" horiz-adv-x="1196" d="M80 20l10 52h576q121 0 211 61.5t112 202.5l21 121q37 236 -238 245l-455 15l9 59l460 15q121 4 210 65.5t108 173.5l22 141q20 131 -45 189.5t-188 58.5h-604l8 51q164 41 621 33q166 -2 241.5 -96t50.5 -242l-22 -141q-20 -131 -99 -198.5t-153 -77.5q72 -25 126 -97.5 t36 -199.5l-21 -121q-53 -344 -418 -344q-464 -1 -579 34z" /> +<glyph unicode="4" horiz-adv-x="1191" d="M113 477l798 1022h103l-774 -995h702l74 463l65 153h45l-98 -616h184l-8 -60l-188 -26l-66 -414h-86l66 414h-787z" /> +<glyph unicode="5" horiz-adv-x="1265" d="M162 20l8 58h614q109 0 195 73.5t106 192.5l33 201q43 264 -203 264h-311q-92 0 -174 -64.5t-96 -156.5h-80l188 911h867l-13 -84h-786l-131 -633q29 37 92.5 73t149.5 38h301q162 0 233.5 -94t46.5 -250l-35 -209q-16 -100 -57 -172t-98.5 -108.5t-114.5 -52t-119 -15.5 q-411 -5 -616 28z" /> +<glyph unicode="6" horiz-adv-x="1290" d="M224 398q-3 152 30 388q59 373 187 549t280 176q385 0 573 -24l-10 -60h-559q-82 0 -151.5 -63.5t-114.5 -164.5t-74 -196.5t-43 -187.5q229 27 559 31q98 0 165 -25.5t93.5 -68.5t37.5 -97.5t-3 -109.5l-37 -242q-27 -164 -117 -234.5t-243 -70.5h-269q-86 0 -147.5 35 t-107.5 124t-49 241zM334 760q-111 -680 198 -680h265q240 0 276 225l35 230q23 131 -30.5 178t-180.5 47h-563z" /> +<glyph unicode="7" horiz-adv-x="1110" d="M274 1415l15 84h911l29 -65l-733 -1434h-99l725 1415h-848z" /> +<glyph unicode="8" horiz-adv-x="1308" d="M198 250.5q5 37.5 5 64.5l30 203q16 106 90 166.5t148 63.5q-195 45 -158 284l21 133q31 195 131 269.5t276 74.5h260q166 0 239 -92t46 -272l-22 -133q-10 -76 -69.5 -148.5t-147.5 -85.5q174 -53 137 -262l-31 -201q-49 -315 -375 -315h-256q-98 0 -167.5 24.5 t-99.5 62.5t-46 82t-11 81.5zM287 309q-18 -119 48 -172t200 -53h247q98 0 181.5 54.5t101.5 170.5l35 215q10 66 -4.5 109t-50 61.5t-68.5 24.5t-78 6h-291q-90 0 -180 -49t-106 -152zM395 1012q-10 -66 5.5 -109t53.5 -62.5t75.5 -26.5t86.5 -7h287q123 0 193.5 63.5 t81.5 141.5l22 139q25 150 -28.5 212t-184.5 62h-256q-150 0 -221.5 -64.5t-93.5 -209.5z" /> +<glyph unicode="9" horiz-adv-x="1290" d="M176 16l8 60h561q84 0 154 63.5t115 166t71.5 196.5t42.5 186q-227 -27 -567 -31q-334 0 -285 310l37 239q47 299 379 299h258q393 0 269 -800q-59 -371 -187.5 -542t-279.5 -171q-410 -1 -576 24zM358 958q-20 -127 37.5 -171t184.5 -44h557q111 680 -193 680h-264 q-250 0 -285 -225z" /> +<glyph unicode=":" horiz-adv-x="428" d="M164 33l20 123q4 33 37 32h53q33 0 27 -32l-18 -123q-6 -33 -39 -33h-51q-33 0 -29 33zM299 928l20 125q4 35 37 34h54q33 0 28 -34l-20 -125q-6 -31 -39 -31h-51q-33 0 -29 31z" /> +<glyph unicode=";" horiz-adv-x="421" d="M135 -154l4 31q43 0 49 41l15 82h-17q-33 0 -28 35l18 121q6 37 41 37h49q31 0 27 -37l-35 -213q-16 -103 -108 -98zM301 930l18 125q6 33 39 32h52q35 0 28 -32l-18 -125q-6 -31 -39 -31h-51q-35 0 -29 31z" /> +<glyph unicode="<" horiz-adv-x="966" d="M203 684l12 84l789 373l-17 -92l-680 -326l574 -350l-13 -84z" /> +<glyph unicode="=" horiz-adv-x="948" d="M109 434l14 84h874l-14 -84h-874zM186 930l15 84h874l-14 -84h-875z" /> +<glyph unicode=">" horiz-adv-x="968" d="M147 289l15 92l690 348l-584 332l15 80l667 -373l-12 -84z" /> +<glyph unicode="?" horiz-adv-x="1107" d="M256 1432l8 55q283 33 535 26q217 2 300 -98t54 -280l-31 -207q-33 -209 -173 -281t-408 -39l-17 -103q-16 -103 -16 -106h-88l43 279q31 -2 119 -2t118 2q295 0 338 250l33 207q25 162 -41.5 229.5t-249.5 67.5h-524zM352 33l21 123q4 33 39 32h51q33 0 29 -32l-21 -123 q-6 -33 -39 -33h-51q-33 0 -29 33z" /> +<glyph unicode="@" horiz-adv-x="1820" d="M131 18l166 1049q59 365 420 365h768q168 0 240.5 -94.5t46.5 -270.5l-109 -725q-4 -31 -9 -53.5t-19.5 -68.5t-39 -77.5t-60.5 -65.5t-92.5 -52.5t-125.5 -18.5h-76l-14 123q-49 -53 -163 -94t-224 -43q-190 -4 -275.5 121t-36.5 450q82 526 441 551q127 8 259 -23.5 t206 -103.5l-131 -899q45 0 80.5 7t78.5 31t74 78t43 138l109 725q25 166 -32 223.5t-175 57.5h-772q-156 0 -233 -81t-95 -200l-166 -1049q-23 -137 39.5 -219t194.5 -82h788l-8 -51q-164 -33 -596 -33h-201q-158 0 -243 109.5t-58 275.5zM600 295q4 -86 41 -135t80 -66.5 t108 -17.5q236 -4 404 123l115 766q-152 70 -365 65q-314 -12 -375 -510q-12 -139 -8 -225z" /> +<glyph unicode="A" horiz-adv-x="1327" d="M92 0l795 1499h98l295 -1499h-84l-96 483h-658l-256 -483h-94zM487 567h596l-159 828z" /> +<glyph unicode="B" horiz-adv-x="1212" d="M164 0l237 1499h539q338 0 338 -287q0 -38 -6 -82q-20 -143 -106.5 -236t-188.5 -110q79 -18 145 -120q49 -75 48 -181q0 -37 -5 -77q-57 -406 -463 -406h-538zM262 86h455q311 0 364 334q5 32 5 62q0 96 -56 168q-72 93 -203 93h-6h-454zM381 827h455q133 0 228 80 t122 221q10 52 10 94q0 90 -45 132q-66 62 -223 61h-455z" /> +<glyph unicode="C" horiz-adv-x="1163" d="M216 526q2 110 22 238q31 190 70.5 319t109 232.5t177 152t259.5 48.5q174 0 453 -54l-9 -59q-233 29 -429 29h-25q-98 0 -170 -25t-142.5 -94.5t-123 -209.5t-86.5 -353q-22 -137 -22 -247q0 -425 327 -431h27q166 0 438 22l-9 -61q-215 -45 -467 -45q-111 0 -191.5 42 t-125.5 114t-65 172q-18 90 -19 187q1 11 1 23z" /> +<glyph unicode="D" horiz-adv-x="1353" d="M164 0l237 1499h531q133 0 225 -53t136 -133q43 -79 61 -187q14 -84 14 -160q0 -22 -1 -42q-5 -94 -24 -191q-61 -334 -215.5 -533.5t-422.5 -199.5h-541zM262 86h451q121 0 219 59.5t162.5 158.5t105.5 209t62 232q22 131 22 237q0 433 -366 433h-447z" /> +<glyph unicode="E" horiz-adv-x="1153" d="M201 258l155 981q43 260 281 260h18l619 -24l-8 -60h-623q-174 0 -203 -182l-71 -447l712 -14l-10 -59l-715 -15l-71 -446q-4 -25 -3 -47q0 -27 5 -48q10 -38 38.5 -53.5t56.5 -20.5t71 -5h602l-11 -60l-606 -24q-11 -1 -21 -1q-103 0 -169 55q-53 44 -53 138q0 33 6 72z " /> +<glyph unicode="F" horiz-adv-x="1144" d="M164 0l192 1227q45 272 282 272h19l619 -24l-8 -60h-625q-174 0 -201 -182l-69 -447l712 -14l-10 -59l-717 -15l-110 -698h-84z" /> +<glyph unicode="G" horiz-adv-x="1288" d="M221 472q2 126 29 294q25 143 50.5 245.5t69.5 204t104.5 163t151.5 99.5t210 38q193 0 491 -58l-10 -67q-309 39 -494 41q-203 0 -316.5 -154t-170.5 -526q-27 -170 -27 -296q0 -135 31 -220q59 -164 274 -164q159 0 465 106l86 533h-405l8 53q125 33 356 33 q66 0 140 -6l-125 -791h-60l-6 113q-63 -39 -207.5 -82t-263.5 -43q-145 0 -234 62.5t-119 179.5q-28 109 -28 226v16z" /> +<glyph unicode="H" horiz-adv-x="1327" d="M174 0l238 1499h84l-117 -733h838l116 733h84l-237 -1499h-84l108 684h-837l-109 -684h-84z" /> +<glyph unicode="I" d="M184 0l238 1499h84l-238 -1499h-84z" /> +<glyph unicode="J" horiz-adv-x="679" d="M78 43l16 57q74 -23 134 -28q16 -2 34 -2q45 0 94 10q70 14 118 78.5t67 179.5l184 1161h84l-184 -1161q-33 -225 -154 -301q-75 -49 -190 -49h-9q-122 2 -194 55z" /> +<glyph unicode="K" horiz-adv-x="1110" d="M164 0l237 1499h84l-112 -704h268l588 704h106l-620 -749l383 -750h-101l-360 709h-275l-112 -709h-86z" /> +<glyph unicode="L" horiz-adv-x="1110" d="M203 258l198 1241h82l-196 -1241q-5 -28 -5 -52t5 -43q10 -38 39.5 -53.5t57.5 -20.5t71 -5h585l-12 -84h-582q-248 0 -248 197q0 28 5 61z" /> +<glyph unicode="M" horiz-adv-x="1617" d="M145 0l381 1499h113l213 -1358l631 1358h123l-86 -1499h-84l77 1364l-634 -1364h-93l-206 1358l-349 -1358h-86z" /> +<glyph unicode="N" horiz-adv-x="1327" d="M164 0l237 1499h84l641 -1345l213 1345h84l-237 -1499h-80l-643 1346l-215 -1346h-84z" /> +<glyph unicode="O" horiz-adv-x="1388" d="M209 457q4 125 31 293q33 207 81 348t101 222t136 124t160 54t197 11q98 0 165 -10t131.5 -37.5t100.5 -82t58 -139.5q19 -71 19 -171q-1 -20 -1 -41q-4 -127 -30 -299q-31 -197 -76 -331t-99.5 -214t-135 -123t-161.5 -56t-202 -13q-98 0 -164.5 9t-132 35.5t-100.5 79 t-59 134.5q-20 70 -20 172q0 17 1 35zM294 446v-10q0 -109 20 -181q20 -75 75 -114t124 -52t181 -13q133 0 218 23.5t160 93t122 201.5t80 345q23 137 28 241q2 42 2 79q0 55 -4 99q-8 73 -33.5 122t-55 77.5t-82 44t-100.5 19.5t-122 4q-76 0 -121 -3t-104 -17t-96 -41 t-80 -76t-73 -121.5t-58 -180.5t-51 -247q-29 -177 -30 -293z" /> +<glyph unicode="P" horiz-adv-x="1202" d="M154 0l237 1499h586q303 0 303 -307q0 -51 -8 -111q-18 -123 -57 -211t-78 -131t-99.5 -66.5t-97.5 -26.5t-98 -3q-66 0 -278 11.5t-220 15.5l-106 -670h-84zM352 729h502q129 0 214 71.5t118 282.5q6 75 8 129v10q0 48 -16 80q-18 36 -37 58t-52.5 33.5t-61.5 15.5 t-64 4h-502z" /> +<glyph unicode="Q" horiz-adv-x="1398" d="M217 457q4 125 31 293q33 207 81 348t101 222t136 124t160 54t198 11q98 0 164.5 -10t131 -37.5t100.5 -82t58 -139.5q20 -72 20 -175q0 -18 -1 -37q-4 -127 -31 -299q-31 -197 -76 -331t-99 -214t-135 -123t-162 -56t-202 -13q-98 0 -164.5 9t-132 35.5t-100.5 79 t-59 134.5q-20 70 -20 172q0 17 1 35zM302 446v-10q0 -109 20 -181q20 -75 75.5 -114t124 -52t180.5 -13q133 0 218.5 23.5t160 93t121.5 201.5t80 345q23 137 28 241q2 42 2 79q0 55 -4 99q-8 73 -33.5 122t-55 77.5t-82 44t-100.5 19.5t-122 4q-76 0 -120.5 -3t-104 -17 t-96.5 -41t-80 -76t-72.5 -121.5t-58 -180.5t-51.5 -247q-29 -176 -30 -293zM647 -68h55q29 -68 88 -98q52 -26 106 -26h14q61 4 130 26l-14 -88q-59 -20 -124 -21h-6q-61 0 -114 19q-57 20 -95 69t-40 119z" /> +<glyph unicode="R" horiz-adv-x="1251" d="M154 0l237 1499h590q298 0 298 -313q0 -53 -9 -115q-14 -111 -48 -192.5t-69 -123.5t-86 -67.5t-85 -32t-81 -8.5l221 -647h-92l-217 641q-57 2 -262 11.5t-207 11.5l-106 -664h-84zM354 729h502q129 0 214 72.5t114 273.5q9 65 9 116q-1 109 -41 155q-58 66 -183 67 h-506z" /> +<glyph unicode="S" horiz-adv-x="1161" d="M162 20l8 62q154 -14 494 -14q317 0 356 251l20 140q5 35 5 64q1 73 -31 113q-44 56 -180 56h-248q-115 0 -186.5 29t-95.5 75t-32 104q-2 19 -3 39q0 39 10 79l22 135q16 111 57 184.5t104.5 110.5t132.5 50t161 13q225 -4 467 -43l-9 -57l-471 16q-14 1 -28 1 q-137 0 -217 -56q-88 -61 -113 -225l-23 -135q-6 -41 -6 -74q0 -84 42 -116q59 -44 198 -44h252q283 0 283 -242q0 -38 -7 -83l-20 -140q-14 -86 -49 -148.5t-77 -97t-102.5 -54t-111.5 -24.5t-117 -5q-90 0 -256 12t-229 24z" /> +<glyph unicode="T" horiz-adv-x="1255" d="M285 1415l14 84h1081l-14 -84h-506l-223 -1415h-84l223 1415h-491z" /> +<glyph unicode="U" horiz-adv-x="1376" d="M245 418q1 100 21 225l135 856h84l-135 -856q-18 -113 -20 -200v-37q0 -63 5 -110q7 -60 32.5 -102t53.5 -66t77 -36t92 -15t108 -3q86 0 146.5 10t126 44t109.5 94.5t83 166t64 254.5l135 856h84l-135 -856q-31 -199 -83 -328t-132 -200.5t-173.5 -98t-226.5 -26.5 q-72 0 -124 5t-108 20.5t-93 43t-69 76.5t-45 117q-12 63 -12 152v14z" /> +<glyph unicode="V" horiz-adv-x="1368" d="M307 1499h88l273 -1380l731 1380h96l-795 -1499h-98z" /> +<glyph unicode="W" horiz-adv-x="2021" d="M307 1499h84l275 -1380l708 1380h94l-294 -581l174 -805l708 1386h92l-768 -1499h-98l-172 797l-410 -797h-98z" /> +<glyph unicode="X" horiz-adv-x="1150" d="M78 0l563 748l-332 751h92l299 -676l519 676h102l-582 -762l330 -737h-92l-295 659l-500 -659h-104z" /> +<glyph unicode="Y" horiz-adv-x="1286" d="M307 1499h90l301 -860l615 860h100l-684 -967l-84 -532h-84l84 532z" /> +<glyph unicode="Z" horiz-adv-x="1077" d="M72 0l14 84l1067 1331h-858l14 84h969l-14 -84l-1067 -1331h858l-15 -84h-968z" /> +<glyph unicode="[" horiz-adv-x="581" d="M151 -101.5q-5 60.5 7 105.5l231 1462q51 340 334 340h121l-13 -84h-122q-193 0 -236 -256l-231 -1462q-20 -133 13.5 -200.5t137.5 -67.5h125l-14 -84h-123q-86 0 -140.5 38t-69.5 93t-20 115.5z" /> +<glyph unicode="\" horiz-adv-x="856" d="M289 1577h76l303 -1724h-76z" /> +<glyph unicode="]" horiz-adv-x="587" d="M-27 -348l15 84h123q193 0 235 254l232 1464q23 143 -16.5 205.5t-137.5 62.5h-123l14 84h123q72 0 120 -25.5t71.5 -62.5t33 -88t7.5 -92t-8 -84l-232 -1464q-10 -68 -28.5 -120t-53.5 -105.5t-99.5 -83t-152.5 -29.5h-123z" /> +<glyph unicode="^" horiz-adv-x="849" d="M274 1087l304 267h77l191 -267h-72l-164 211l-254 -211h-82z" /> +<glyph unicode="_" horiz-adv-x="1343" d="M39 -2l14 84h1258l-15 -84h-1257z" /> +<glyph unicode="`" horiz-adv-x="471" d="M256 1360h96l209 -273h-67z" /> +<glyph unicode="a" horiz-adv-x="1112" d="M162 324q-2 21 -1 43q0 88 23 204q23 133 63 230.5t81 152t98 89t102 46t105 19.5q33 4 69 4q88 0 193 -24q147 -34 221 -107l-143 -981h-55l-7 123q-66 -43 -185.5 -90t-223.5 -47q-76 0 -131.5 14t-105.5 52t-72.5 104t-30.5 168zM260 508q-13 -83 -13 -150 q0 -290 245 -290q29 0 54 1t53 7t45.5 8t49 12t41.5 13.5t47 17.5t42 16t47 20.5t44 18.5l113 776q-166 72 -311 72q-41 0 -80 -6q-164 -23 -249 -129t-128 -387z" /> +<glyph unicode="b" horiz-adv-x="1122" d="M123 0l254 1608h80l-92 -586q98 37 219 59.5t196 22.5q303 0 303 -372q0 -91 -18 -204q-16 -104 -46 -191t-81 -172t-135 -132q-81 -45 -186 -45h-9q-96 2 -221 48t-164 85l-45 -121h-55zM233 178q213 -106 385 -106q131 0 228.5 116.5t134.5 350.5q16 106 16 187 q1 118 -33 184q-56 110 -196 110q-172 0 -410 -59z" /> +<glyph unicode="c" horiz-adv-x="1007" d="M166 274q-1 21 -1 44q0 98 19 237q29 178 73 290.5t105.5 166t121 71t147.5 17.5q168 0 418 -56l-11 -57q-240 29 -422 29q-70 0 -115.5 -15.5t-93 -62.5t-82 -146.5t-59.5 -254.5q-17 -135 -17 -225v-10q1 -92 33.5 -142.5t75.5 -69t109 -18.5l446 37l-8 -62 q-211 -57 -444 -57q-82 0 -140.5 24.5t-103.5 87t-51 172.5z" /> +<glyph unicode="d" horiz-adv-x="1087" d="M170 356q-2 28 -2 56q0 70 14 137q18 117 48 208t82.5 174t136 128t194.5 45q76 0 190.5 -22.5t200.5 -59.5l92 586h80l-254 -1608h-55l-8 121q-55 -41 -186.5 -87t-227.5 -46q-104 0 -175 52t-96.5 134t-33.5 182zM266 539q-14 -88 -13 -159q1 -120 39 -192 q62 -116 193 -116q168 0 412 106l125 783q-217 59 -389 59q-133 0 -228.5 -104.5t-138.5 -376.5z" /> +<glyph unicode="e" horiz-adv-x="1089" d="M180 569q18 111 37 180.5t56.5 145.5t90 118t138.5 68.5t203 26.5q207 0 308 -72q83 -59 83 -183q0 -27 -4 -58q-16 -127 -102.5 -206t-197 -104.5t-229.5 -27.5h-33q-96 0 -166 10q-80 12 -112 25q-15 -102 -15 -178q0 -92 22 -146q40 -98 183 -100q21 -1 43 -1 q167 0 453 39l-10 -61q-217 -59 -490 -59q-193 0 -252 140q-31 74 -31 193q0 107 25 250zM260 549q14 -2 40 -5q26 -2 98 -8q61 -5 120 -5h20q68 1 152 15.5t146.5 41t110.5 80t59 127.5q4 25 4 48q0 91 -60 131q-74 50 -237 50q-104 0 -180 -26.5t-118 -54.5t-75 -101.5 t-42 -112.5t-30 -142q-6 -26 -8 -38z" /> +<glyph unicode="f" horiz-adv-x="763" d="M188 1004l9 57l192 26l25 160q12 72 20 110t28.5 93t49.5 84t78 51.5t115 24.5q170 0 272 -33l-6 -51h-271q-98 0 -138 -63.5t-64 -215.5l-25 -160h356l-14 -83h-356l-160 -1004h-84l160 1004h-187z" /> +<glyph unicode="g" horiz-adv-x="1103" d="M76 -508l8 53l485 -20h15q84 0 162 63q85 68 106 199l43 272q-96 -37 -216 -58t-198 -21q-152 0 -229.5 79.5t-82.5 208.5q-1 24 -1 49q0 111 18 246q41 260 158 398.5t301 138.5q76 0 158 -4t133 -9.5t117.5 -11.5t85.5 -8l-203 -1280q-29 -180 -140 -269 q-95 -77 -206 -77q-17 0 -35 2zM253 299q3 -109 60.5 -172.5t171.5 -63.5q152 0 420 66l142 881l-396 6h-5q-156 0 -250 -131q-95 -133 -126 -332q-17 -126 -17 -225v-29z" /> +<glyph unicode="h" horiz-adv-x="1107" d="M123 0l254 1606h84l-103 -645q260 145 457 145q155 0 227 -102q55 -78 55 -181q0 -31 -5 -65l-121 -758h-84l121 758q4 29 4 56q0 82 -42 136q-56 72 -173 72q-121 0 -214.5 -27.5t-232.5 -95.5l-143 -899h-84z" /> +<glyph unicode="i" horiz-adv-x="329" d="M123 0l172 1087h84l-172 -1087h-84zM313 1296l15 95q4 34 37 34h2h51q25 0 25 -25q0 -4 -1 -9l-14 -95q-4 -32 -35 -32h-2h-49h-2q-28 0 -27 25v7z" /> +<glyph unicode="j" horiz-adv-x="354" d="M57 -553l260 1640h84l-174 -1095q-53 -348 -118 -545h-52zM334 1296l16 95q4 34 35 34h2h51q27 0 27 -27v-7l-16 -95q-4 -32 -35 -32h-2h-50h-2q-26 0 -26 25v7z" /> +<glyph unicode="k" horiz-adv-x="980" d="M123 0l254 1602h84l-156 -981q246 12 418 156.5t215 309.5h92q-51 -188 -186 -314t-283 -177l371 -596h-101l-354 571q-45 -10 -99 -13q-32 -2 -55 -2q-15 0 -26 1l-90 -557h-84z" /> +<glyph unicode="l" horiz-adv-x="624" d="M182 387l193 1217h84l-193 -1217q-10 -68 -12 -119v-16q0 -40 8 -66q10 -30 19.5 -49.5t33 -31t33.5 -14.5t37 -7q139 -27 150 -27l-11 -57h-135q-137 0 -189 94q-31 57 -31 154q0 61 13 139z" /> +<glyph unicode="m" horiz-adv-x="1869" d="M123 0l172 1087h55l8 -129q260 145 447 146q98 0 168.5 -47t95.5 -123q100 68 239.5 119t260.5 51q149 0 227 -102q59 -77 59 -178q0 -33 -6 -68l-118 -756h-84l118 756q4 27 4 52q0 78 -43 136q-57 76 -170 76q-211 0 -471 -133q7 -21 6 -59q0 -31 -4 -74l-120 -754h-84 l121 756q3 25 3 47q-1 81 -45 141q-58 76 -169 76q-123 0 -214.5 -26.5t-230.5 -94.5l-141 -899h-84z" /> +<glyph unicode="n" horiz-adv-x="1107" d="M123 0l172 1087h55l8 -126q260 145 453 145q155 0 229 -102q57 -79 57 -182q0 -31 -5 -64l-121 -758h-84l121 758q4 28 4 54q0 80 -42 136q-56 74 -173 74q-121 0 -214.5 -27.5t-232.5 -95.5l-143 -899h-84z" /> +<glyph unicode="o" horiz-adv-x="1148" d="M184 539q51 326 170 442.5t377 116.5q256 0 338 -140q52 -89 52 -243q0 -88 -17 -197q-49 -301 -164 -414.5t-375 -113.5q-262 0 -345 126q-53 80 -53 231q0 85 17 192zM251 354v-8q1 -68 15 -116q16 -50 40 -80.5t67 -48t88 -22.5t112 -5q100 0 166 15t124.5 62.5 t95 139.5t61.5 237q19 95 19 167q1 22 -1 42q-8 86 -25.5 140.5t-63.5 84t-98 41t-132 11.5q-102 0 -163.5 -14.5t-123 -62.5t-99.5 -147.5t-65 -261.5q-16 -100 -17 -174z" /> +<glyph unicode="p" horiz-adv-x="1099" d="M35 -553l264 1628q158 23 483 23q199 0 266 -158q43 -100 43 -239q0 -80 -14 -173q-18 -123 -50 -216t-84 -171t-134 -118.5t-191 -40.5q-80 0 -199.5 20.5t-203.5 56.5l-96 -612h-84zM227 123q208 -58 358 -58q21 0 40 1q154 4 241.5 117.5t126.5 361.5q15 96 15 172 q0 297 -236 297h-401z" /> +<glyph unicode="q" horiz-adv-x="1130" d="M172 266q-2 28 -2 59q0 107 18 236q86 539 465 539q256 0 482 -29l-256 -1624h-84l96 612q-206 -79 -405 -79h-5q-150 0 -226.5 78.5t-82.5 207.5zM252 292q4 -108 62.5 -168.5t174.5 -60.5q168 0 412 60l141 893h-401q-160 0 -249 -133t-120 -334q-20 -130 -20 -228v-29 z" /> +<glyph unicode="r" horiz-adv-x="827" d="M123 0l172 1087h53l8 -137q100 51 146.5 74t137.5 49.5t173 26.5q113 0 150 -17l-15 -82q-68 14 -149 15q-37 0 -70 -3t-68.5 -11.5t-57 -14.5t-63.5 -22.5t-58.5 -23.5t-68 -30.5t-67.5 -29.5l-139 -881h-84z" /> +<glyph unicode="s" horiz-adv-x="1034" d="M131 12l8 58h523q37 0 58 3t57 16t58.5 50t32.5 97l19 102q3 18 3 34q0 51 -29 84q-38 44 -128 44h-280q-155 0 -215 50q-43 36 -43 123q0 34 6 75l16 98q20 131 95 193.5t229 62.5q242 0 491 -25l-10 -57h-494q-113 0 -163 -46t-64 -136l-16 -99q-4 -27 -4 -48t1 -36.5 t10 -28t14 -19.5t22.5 -12t24.5 -8t33 -4t34 -1h39h278q123 0 187 -69q50 -54 51 -135q0 -23 -4 -48l-19 -109q-12 -80 -42.5 -130t-79 -71.5t-87 -27.5t-98.5 -6q-72 0 -263.5 10t-250.5 16z" /> +<glyph unicode="t" horiz-adv-x="727" d="M188 1006l11 61l186 23l70 303h61l-47 -303h344l-14 -84h-344l-99 -621q-10 -68 -11 -119v-9q-1 -45 9 -73q10 -30 19.5 -49.5t32 -31t34 -14.5t35.5 -7q139 -27 150 -27l-9 -57h-133q-222 0 -222 258q0 58 11 129l99 621h-183z" /> +<glyph unicode="u" horiz-adv-x="1105" d="M154 332l120 758h84l-120 -758q-4 -29 -4 -56q0 -82 42 -136q56 -72 173 -72q123 0 217 27.5t231 92.5l141 902h84l-172 -1088h-55l-8 127q-256 -145 -451 -145q-156 0 -230 100q-57 77 -57 181q0 32 5 67z" /> +<glyph unicode="v" horiz-adv-x="1077" d="M193 1087h86l245 -978l457 811q57 111 68 170h61q5 -17 5 -37q0 -62 -48 -152l-504 -901h-102z" /> +<glyph unicode="w" horiz-adv-x="1644" d="M193 1087h83l242 -976l453 802q61 111 71 170h58q4 -14 4 -32q0 -60 -47 -156l-107 -193l144 -591l460 807q61 109 72 172h57q6 -20 6 -43q0 -64 -49 -146l-516 -901h-88l-145 600l-338 -600h-92z" /> +<glyph unicode="x" horiz-adv-x="964" d="M49 0l479 547l-307 540h103l268 -471l414 471h108l-479 -546l305 -541h-102l-265 467l-411 -467h-113z" /> +<glyph unicode="y" horiz-adv-x="1105" d="M193 1087h86l155 -849q14 -78 58 -115q44 -36 79 -36h2l37 1l412 842q43 88 55 168h62q7 -22 7 -48q0 -61 -40 -143l-442 -905q-138 -271 -232 -388q-126 -157 -233 -165v55q37 8 80 47t77.5 86.5t74.5 111t63.5 108.5t48 93t24.5 50q-25 2 -49 9t-61 27.5t-67 69 t-42 119.5z" /> +<glyph unicode="z" horiz-adv-x="923" d="M92 2l12 84l811 918h-694l12 83h811l-12 -83l-809 -918h662q-12 -84 -13 -84h-780z" /> +<glyph unicode="{" horiz-adv-x="573" d="M137 729l13 84q188 10 206 129l78 492q57 373 408 372l-15 -84q-131 2 -208.5 -66.5t-102.5 -230.5l-76 -483q-12 -72 -67.5 -118t-128.5 -58q68 -10 108.5 -58.5t30.5 -111.5l-90 -563q-27 -166 28.5 -233.5t192.5 -65.5l-14 -82q-352 0 -289 389l86 547 q12 66 -40 105.5t-120 35.5z" /> +<glyph unicode="|" horiz-adv-x="460" d="M152 -147l272 1724h84l-272 -1724h-84z" /> +<glyph unicode="}" horiz-adv-x="567" d="M-27 -348l15 82q133 0 208.5 62.5t100.5 215.5l88 555q10 66 65.5 114t127.5 58q-70 10 -110 57.5t-30 116.5l80 492q27 176 -28.5 250t-188.5 71l14 80q100 0 167 -35.5t92.5 -94t33.5 -131t-8 -148.5l-76 -479q-12 -72 40 -107t122 -37l-14 -82q-70 2 -132.5 -29.5 t-72.5 -99.5l-88 -557q-27 -164 -116 -259t-290 -95z" /> +<glyph unicode="~" horiz-adv-x="964" d="M287 1171q6 4 26.5 20.5t27.5 22t25.5 18.5t27.5 18t25.5 14.5t28 13.5t25.5 9t28.5 7t28.5 2q43 0 118 -61t110 -61q23 0 45 5t51 20t40 21.5t45 29.5l34 24l16 -39q-2 -2 -26.5 -22.5t-29.5 -24.5t-27.5 -21.5t-32 -22.5t-29 -16.5t-32.5 -14.5t-31.5 -7t-35.5 -4 q-45 0 -118.5 61.5t-108.5 61.5q-27 0 -57.5 -9.5t-47 -18.5t-56.5 -32.5t-54 -31.5z" /> +<glyph unicode="¢" horiz-adv-x="985" d="M144.5 316.5q-7.5 99.5 19.5 238.5q31 182 76 297t111.5 167t130 66.5t163.5 14.5l29 176h65l-28 -182q172 -14 319 -50l-10 -57q-240 29 -422 29q-70 0 -116 -15.5t-93 -62.5t-81 -146.5t-60 -254.5q-18 -143 -17.5 -234.5t33.5 -142.5t76 -69.5t109 -18.5q84 0 195.5 9 t181.5 18l71 10l-10 -62q-180 -49 -350 -55l-27 -170h-66l25 168q-74 0 -128 13t-102.5 50t-67.5 100.5t-26.5 163z" /> +<glyph unicode="£" horiz-adv-x="1169" d="M102 0l9 59l153 25l96 618h-147l8 52l152 22l41 258q14 92 38.5 165t52 121t69.5 83t79 53.5t92.5 28.5t99.5 12t109 2q51 0 141.5 -6t153.5 -11l64 -5l-13 -60h-350q-113 0 -180.5 -12t-126.5 -51t-92 -116t-53 -204l-41 -258l579 -22l-10 -52h-582l-96 -618h742 l-15 -84h-973z" /> +<glyph unicode="¥" horiz-adv-x="1206" d="M217 375l8 59h381l25 164h-379l10 59h373l-346 842h92l311 -754l600 754h103l-668 -842h410l-11 -59h-411l-25 -164h410l-8 -59h-410l-55 -375h-84l55 375h-381z" /> +<glyph unicode="¨" horiz-adv-x="915" d="M289 1192q4 25 24.5 41t45 16t39 -16t10 -41t-23.5 -42t-44 -17t-40 17t-11 42zM811 1192q4 25 24.5 41t45 16t39 -16t10.5 -41t-23.5 -42t-44 -17t-40 17t-11.5 42z" /> +<glyph unicode="©" horiz-adv-x="1730" d="M212 579.5q1 94.5 15 178.5q23 141 63 263t108.5 234.5t178 178t250.5 65.5h529q94 0 163.5 -37t106.5 -102.5t57.5 -140t21.5 -164.5t-4 -162t-18 -145q-33 -207 -102.5 -371t-188 -270.5t-266.5 -106.5h-528q-109 0 -188.5 54.5t-119.5 138t-59.5 188t-18.5 199z M276.5 514q10.5 -123 41 -222t105.5 -164t179 -65h533q162 0 297 181.5t188 509.5q23 139 22.5 252.5t-24 215t-90 158t-172.5 56.5h-537q-182 0 -324.5 -155.5t-203.5 -526.5q-25 -117 -14.5 -240zM586 752q72 442 366 442q145 0 357 -39l-6 -49q-170 25 -361 24 q-231 0 -293 -389q-61 -377 170 -376q223 0 383 32l-8 -49q-176 -47 -383 -47q-297 0 -225 451z" /> +<glyph unicode="«" horiz-adv-x="1144" d="M217 725l485 418l54 -62l-422 -364l307 -365l-61 -55zM600 725l485 418l54 -62l-426 -362l313 -369l-63 -53z" /> +<glyph unicode="­" horiz-adv-x="694" d="M123 553l14 82h602l-14 -82h-602z" /> +<glyph unicode="®" horiz-adv-x="1730" d="M212 578.5q1 93.5 15 177.5q16 111 44 210t77 199.5t112.5 172t159 116.5t207.5 45h529q94 0 163.5 -37t106.5 -102.5t57.5 -140t21.5 -164.5t-4 -162t-18 -145q-33 -207 -102.5 -371t-188 -270.5t-266.5 -106.5h-528q-109 0 -188.5 54.5t-119.5 137t-59.5 188t-18.5 199 zM275.5 514q9.5 -123 40 -222t104.5 -164t178 -65h537q162 0 297 181.5t188 509.5q23 139 22.5 252.5t-24 215t-90 158t-172.5 56.5h-537q-182 0 -324.5 -155.5t-203.5 -526.5q-25 -117 -15.5 -240zM586 313l137 875h362q260 0 220 -268q-8 -57 -26.5 -100.5t-37 -66 t-50.5 -35.5t-48.5 -16.5t-52 -6.5t-39.5 -3l155 -379h-71l-154 379l-270 15l-62 -394h-63zM717 750h311q102 0 149.5 34.5t63.5 141.5q18 111 -22.5 154.5t-128.5 43.5h-312z" /> +<glyph unicode="´" horiz-adv-x="434" d="M213 1087l281 273h102l-315 -273h-68z" /> +<glyph unicode="¸" horiz-adv-x="540" d="M45 -354l6 35l84 18q78 14 116 59t54 166h70q-25 -160 -77 -219t-175 -59h-78z" /> +<glyph unicode="»" horiz-adv-x="1138" d="M166 360l432 371l-303 356l61 56l357 -422l-494 -424zM551 360l432 369l-303 361l61 53l357 -422l-494 -424z" /> +<glyph unicode="À" horiz-adv-x="1327" d="M92 0l795 1499h98l295 -1499h-84l-96 483h-658l-256 -483h-94zM487 567h596l-159 828zM686 1905h96l209 -273h-67z" /> +<glyph unicode="Â" horiz-adv-x="1327" d="M92 0l795 1499h98l295 -1499h-84l-96 483h-658l-256 -483h-94zM487 567h596l-159 828zM672 1632l303 266h78l190 -266h-67l-168 213l-256 -213h-80z" /> +<glyph unicode="Æ" horiz-adv-x="1851" d="M61 0l910 1219q129 174 222 229t249 51l577 -24l-8 -60h-584q-31 0 -56 -2t-43.5 -9t-32 -11t-23.5 -19.5t-16.5 -21.5t-11.5 -27.5t-7 -30t-6 -36t-6 -37.5l-70 -439l672 -12l-10 -61l-676 -13l-72 -446q-16 -106 31 -140t137 -34h561l-8 -58l-555 -26q-55 -2 -100 8 t-86 35.5t-58.5 80t-5.5 132.5l41 254h-491l-373 -502h-101zM596 586h444l119 747z" /> +<glyph unicode="Ç" horiz-adv-x="1163" d="M215.5 526.5q2.5 110.5 22.5 237.5q31 190 70.5 319t109 232.5t177 152t259.5 48.5q174 0 453 -54l-9 -59q-248 31 -454 29q-98 0 -170 -25t-142.5 -94.5t-123 -209.5t-84.5 -353q-106 -670 303 -678q170 -2 465 22l-9 -61q-215 -45 -467 -45q-111 0 -191.5 42 t-125.5 113.5t-65.5 172t-18 211zM393 -352l6 35l82 16q78 12 115 58t55 169h70q-25 -160 -76 -219t-174 -59h-78z" /> +<glyph unicode="È" horiz-adv-x="1153" d="M201 258l155 981q45 270 299 260l619 -24l-8 -60h-623q-174 0 -203 -182l-71 -447l712 -14l-10 -59l-715 -15l-71 -446q-8 -57 2 -95t38.5 -53.5t56.5 -20.5t71 -5h602l-11 -60l-606 -24q-119 -6 -190.5 54t-46.5 210zM612 1894h97l209 -272h-66z" /> +<glyph unicode="É" horiz-adv-x="1153" d="M201 258l155 981q45 270 299 260l619 -24l-8 -60h-623q-174 0 -203 -182l-71 -447l712 -14l-10 -59l-715 -15l-71 -446q-8 -57 2 -95t38.5 -53.5t56.5 -20.5t71 -5h602l-11 -60l-606 -24q-119 -6 -190.5 54t-46.5 210zM829 1622l281 272h100l-315 -272h-66z" /> +<glyph unicode="Ê" horiz-adv-x="1153" d="M201 258l155 981q45 270 299 260l619 -24l-8 -60h-623q-174 0 -203 -182l-71 -447l712 -14l-10 -59l-715 -15l-71 -446q-8 -57 2 -95t38.5 -53.5t56.5 -20.5t71 -5h602l-11 -60l-606 -24q-119 -6 -190.5 54t-46.5 210zM596 1622l303 266h78l190 -266h-71l-164 211 l-254 -211h-82z" /> +<glyph unicode="Ë" horiz-adv-x="1153" d="M201 258l155 981q45 270 299 260l619 -24l-8 -60h-623q-174 0 -203 -182l-71 -447l712 -14l-10 -59l-715 -15l-71 -446q-8 -57 2 -95t38.5 -53.5t56.5 -20.5t71 -5h602l-11 -60l-606 -24q-119 -6 -190.5 54t-46.5 210zM559 1726.5q4 24.5 24.5 41t45 16.5t39 -16.5 t10.5 -41t-23.5 -42t-44 -17.5t-40 17.5t-11.5 42zM1081 1726.5q4 24.5 24.5 41t45.5 16.5t39 -16.5t10 -41t-23.5 -42t-44 -17.5t-40 17.5t-11.5 42z" /> +<glyph unicode="Î" d="M184 0l238 1499h84l-238 -1499h-84zM201 1632l301 266h78l190 -266h-68l-165 213l-256 -213h-80z" /> +<glyph unicode="Ï" d="M174 1691.5q4 24.5 24.5 41t45 16.5t39 -16.5t10.5 -41t-23.5 -42t-44 -17.5t-40 17.5t-11.5 42zM184 0l238 1499h84l-238 -1499h-84zM696 1691.5q4 24.5 24.5 41t45.5 16.5t39 -16.5t10 -41t-23.5 -42t-44 -17.5t-40 17.5t-11.5 42z" /> +<glyph unicode="Ô" horiz-adv-x="1388" d="M209 457q4 125 31 293q33 207 81 348t101 222t136 124t160 54t197 11q98 0 165 -10t131.5 -37.5t100.5 -82t58.5 -139.5t18 -212t-30.5 -299q-31 -197 -76 -331t-99.5 -214t-135 -123t-161.5 -56t-202 -13q-98 0 -164.5 9t-132 35.5t-100.5 79t-58.5 134.5t-19.5 207z M294 446.5q-1 -116.5 19.5 -191.5t75.5 -114t124 -52t181 -13q133 0 218 23.5t160 93t122 201.5t80 345q23 137 28 241.5t-2.5 177.5t-33 122t-55 77.5t-82 44t-100.5 19.5t-122 4q-76 0 -121 -3t-104 -17t-96 -41t-80 -76t-73 -121.5t-58 -180.5t-51 -247 q-29 -176 -30 -292.5zM651 1632l303 266h78l189 -266h-68l-166 213l-256 -213h-80z" /> +<glyph unicode="Ù" horiz-adv-x="1376" d="M245 418.5q1 99.5 21 224.5l135 856h84l-135 -856q-18 -113 -20 -200t5 -147t32.5 -102t53.5 -66t77 -36t92 -15t108 -3q86 0 146.5 10t126 44t109.5 94.5t83 166t64 254.5l135 856h84l-135 -856q-31 -199 -83 -328t-132 -200.5t-173.5 -98t-226.5 -26.5q-72 0 -124 5 t-108 20.5t-93 43t-69 76.5t-45 116.5t-12 167zM674 1905h96l209 -273h-68z" /> +<glyph unicode="Û" horiz-adv-x="1376" d="M245 418.5q1 99.5 21 224.5l135 856h84l-135 -856q-18 -113 -20 -200t5 -147t32.5 -102t53.5 -66t77 -36t92 -15t108 -3q86 0 146.5 10t126 44t109.5 94.5t83 166t64 254.5l135 856h84l-135 -856q-31 -199 -83 -328t-132 -200.5t-173.5 -98t-226.5 -26.5q-72 0 -124 5 t-108 20.5t-93 43t-69 76.5t-45 116.5t-12 167zM659 1632l304 266h77l191 -266h-70l-166 213l-256 -213h-80z" /> +<glyph unicode="Ü" horiz-adv-x="1376" d="M245 418.5q1 99.5 21 224.5l135 856h84l-135 -856q-18 -113 -20 -200t5 -147t32.5 -102t53.5 -66t77 -36t92 -15t108 -3q86 0 146.5 10t126 44t109.5 94.5t83 166t64 254.5l135 856h84l-135 -856q-31 -199 -83 -328t-132 -200.5t-173.5 -98t-226.5 -26.5q-72 0 -124 5 t-108 20.5t-93 43t-69 76.5t-45 116.5t-12 167zM635 1692q2 25 23.5 41t46 16t38 -16.5t9.5 -41t-23.5 -42t-44.5 -17.5t-39 17.5t-10 42.5zM1157 1692q2 25 23.5 41t46 16t38 -16.5t9.5 -41t-23.5 -42t-44 -17.5t-39 17.5t-10.5 42.5z" /> +<glyph unicode="à" horiz-adv-x="1112" d="M162.5 323.5q-7.5 102.5 21.5 247.5q23 133 63 230.5t81 152t98 89t102 46t105 19.5q115 14 262 -20.5t221 -106.5l-143 -981h-55l-7 123q-66 -43 -185.5 -90t-223.5 -47q-76 0 -131.5 14t-105.5 52t-72.5 103.5t-30 168zM260 508q-70 -440 232 -440q29 0 54 1t53 7 t45.5 8t49 12t41.5 13.5t47 17.5t42 16t47 20.5t44 18.5l113 776q-213 92 -391 66q-164 -23 -249 -129t-128 -387zM457 1507h94l209 -272h-66z" /> +<glyph unicode="â" horiz-adv-x="1112" d="M162.5 323.5q-7.5 102.5 21.5 247.5q23 133 63 230.5t81 152t98 89t102 46t105 19.5q115 14 262 -20.5t221 -106.5l-143 -981h-55l-7 123q-66 -43 -185.5 -90t-223.5 -47q-76 0 -131.5 14t-105.5 52t-72.5 103.5t-30 168zM260 508q-70 -440 232 -440q29 0 54 1t53 7 t45.5 8t49 12t41.5 13.5t47 17.5t42 16t47 20.5t44 18.5l113 776q-213 92 -391 66q-164 -23 -249 -129t-128 -387zM442 1235l303 266h78l189 -266h-68l-166 213l-256 -213h-80z" /> +<glyph unicode="æ" horiz-adv-x="1929" d="M80.5 326.5q-7.5 101.5 21.5 242.5q25 135 65 233.5t81 153t99.5 88t101.5 45t104 19.5q102 12 249.5 -23.5t235.5 -97.5q115 121 365 121q207 0 308 -71.5t79 -241.5q-16 -127 -102 -206t-197 -104.5t-229.5 -27.5t-199.5 10t-112 25q-31 -225 10 -323.5t185 -100.5 q170 -6 493 38l-10 -61q-217 -59 -489 -59q-203 0 -260 157q-260 -158 -459 -157q-74 0 -130.5 15t-106.5 53t-72.5 104.5t-30 168zM178 508q-35 -223 20.5 -330.5t211.5 -109.5q193 0 452 137q-25 135 17 364q45 250 114 365q-266 117 -438 90q-162 -23 -248 -130 t-129 -386zM958 549q14 -2 40 -5t98.5 -8.5t140.5 -4.5t152 15.5t147 41t111.5 80t58.5 127.5q18 129 -57.5 179t-239.5 50q-76 0 -135.5 -13.5t-100 -29.5t-73.5 -54t-51.5 -65.5t-37 -86t-25.5 -91.5t-22 -105z" /> +<glyph unicode="ç" horiz-adv-x="1013" d="M170.5 273.5q-5.5 109.5 17.5 281.5q29 178 73 290.5t105.5 166t121 71t147.5 17.5q168 0 418 -56l-11 -57q-240 29 -421 29q-70 0 -116 -15.5t-93 -62.5t-82 -146.5t-60 -254.5q-18 -143 -17 -234.5t33.5 -142.5t76 -69.5t108.5 -18.5l447 37l-9 -62q-211 -57 -444 -57 q-82 0 -140.5 24.5t-103.5 87t-50.5 172zM256 -352l6 37l84 16q78 14 116 59t54 166h70q-25 -158 -77 -218t-175 -60h-78z" /> +<glyph unicode="è" horiz-adv-x="1089" d="M180 569q18 111 37 180.5t56.5 145.5t90 118t138.5 68.5t203 26.5q207 0 308 -71.5t79 -241.5q-16 -127 -102.5 -206t-197 -104.5t-229.5 -27.5t-199.5 10t-111.5 25q-33 -225 7 -323.5t183 -100.5q172 -6 496 38l-10 -61q-217 -59 -490 -59q-193 0 -252 140t-6 443z M260 549q14 -2 40 -5t98.5 -8.5t140 -4.5t151.5 15.5t146.5 41t110.5 80t59 127.5q18 129 -55.5 179t-237.5 50q-104 0 -180 -26.5t-118 -54.5t-75 -101.5t-42 -112.5t-30 -142q-6 -26 -8 -38zM453 1503h96l209 -272h-68z" /> +<glyph unicode="é" horiz-adv-x="1089" d="M180 569q18 111 37 180.5t56.5 145.5t90 118t138.5 68.5t203 26.5q207 0 308 -71.5t79 -241.5q-16 -127 -102.5 -206t-197 -104.5t-229.5 -27.5t-199.5 10t-111.5 25q-33 -225 7 -323.5t183 -100.5q172 -6 496 38l-10 -61q-217 -59 -490 -59q-193 0 -252 140t-6 443z M260 549q14 -2 40 -5t98.5 -8.5t140 -4.5t151.5 15.5t146.5 41t110.5 80t59 127.5q18 129 -55.5 179t-237.5 50q-104 0 -180 -26.5t-118 -54.5t-75 -101.5t-42 -112.5t-30 -142q-6 -26 -8 -38zM690 1231l281 272h102l-315 -272h-68z" /> +<glyph unicode="ê" horiz-adv-x="1089" d="M180 569q18 111 37 180.5t56.5 145.5t90 118t138.5 68.5t203 26.5q207 0 308 -71.5t79 -241.5q-16 -127 -102.5 -206t-197 -104.5t-229.5 -27.5t-199.5 10t-111.5 25q-33 -225 7 -323.5t183 -100.5q172 -6 496 38l-10 -61q-217 -59 -490 -59q-193 0 -252 140t-6 443z M260 549q14 -2 40 -5t98.5 -8.5t140 -4.5t151.5 15.5t146.5 41t110.5 80t59 127.5q18 129 -55.5 179t-237.5 50q-104 0 -180 -26.5t-118 -54.5t-75 -101.5t-42 -112.5t-30 -142q-6 -26 -8 -38zM438 1231l303 266h78l191 -266h-68l-168 213l-256 -213h-80z" /> +<glyph unicode="ë" horiz-adv-x="1089" d="M180 569q18 111 37 180.5t56.5 145.5t90 118t138.5 68.5t203 26.5q207 0 308 -71.5t79 -241.5q-16 -127 -102.5 -206t-197 -104.5t-229.5 -27.5t-199.5 10t-111.5 25q-33 -225 7 -323.5t183 -100.5q172 -6 496 38l-10 -61q-217 -59 -490 -59q-193 0 -252 140t-6 443z M260 549q14 -2 40 -5t98.5 -8.5t140 -4.5t151.5 15.5t146.5 41t110.5 80t59 127.5q18 129 -55.5 179t-237.5 50q-104 0 -180 -26.5t-118 -54.5t-75 -101.5t-42 -112.5t-30 -142q-6 -26 -8 -38zM414 1290.5q4 24.5 24.5 41t45 16.5t38 -16.5t8.5 -41.5q-2 -25 -22.5 -42 t-45 -17t-38.5 17.5t-10 42zM936 1290.5q4 24.5 24.5 41t45 16.5t38 -16.5t9.5 -41.5q-2 -25 -22.5 -42t-45 -17t-39 17.5t-10.5 42z" /> +<glyph unicode="î" horiz-adv-x="358" d="M12 1221l303 266h78l191 -266h-68l-166 213l-256 -213h-82zM123 0l172 1087h84l-172 -1087h-84z" /> +<glyph unicode="ï" horiz-adv-x="358" d="M-14 1280q4 25 24.5 41t45 16t37.5 -16t9 -41t-22.5 -42t-44.5 -17q-25 0 -39 17t-10 42zM123 0l172 1087h84l-172 -1087h-84zM508 1280q4 25 24.5 41t45 16t38 -16t9.5 -41t-22.5 -42t-45.5 -17q-25 0 -39 17t-10 42z" /> +<glyph unicode="ô" horiz-adv-x="1148" d="M184 539q51 326 170 442.5t377 116.5q256 0 338 -140.5t35 -439.5q-49 -301 -164 -414.5t-375 -113.5q-262 0 -345 126t-36 423zM251 354.5q-1 -73.5 14.5 -124t40 -81t67.5 -48t88 -22.5t112 -5q100 0 166 15t124.5 62.5t95 139.5t61.5 237q25 123 17.5 209t-25 140.5 t-63.5 84t-98 41t-132 11.5q-102 0 -163.5 -14.5t-123 -62.5t-99.5 -147.5t-65 -261.5q-16 -100 -17 -173.5zM467 1221l303 266h78l188 -266h-67l-166 213l-256 -213h-80z" /> +<glyph unicode="ù" horiz-adv-x="1105" d="M154 332l120 758h84l-120 -758q-18 -121 38 -192.5t173 -71.5q123 0 217 27.5t231 92.5l141 902h84l-172 -1088h-55l-8 127q-256 -145 -451 -145q-156 0 -230.5 100.5t-51.5 247.5zM449 1493h96l209 -272h-68z" /> +<glyph unicode="û" horiz-adv-x="1105" d="M154 332l120 758h84l-120 -758q-18 -121 38 -192.5t173 -71.5q123 0 217 27.5t231 92.5l141 902h84l-172 -1088h-55l-8 127q-256 -145 -451 -145q-156 0 -230.5 100.5t-51.5 247.5zM434 1221l303 266h78l191 -266h-68l-168 213l-256 -213h-80z" /> +<glyph unicode="ü" horiz-adv-x="1105" d="M154 332l120 758h84l-120 -758q-18 -121 38 -192.5t173 -71.5q123 0 217 27.5t231 92.5l141 902h84l-172 -1088h-55l-8 127q-256 -145 -451 -145q-156 0 -230.5 100.5t-51.5 247.5zM410 1280q4 25 24.5 41t45 16t37.5 -16t9 -41t-22.5 -42t-44.5 -17q-25 0 -39 17t-10 42 zM932 1280q4 25 24.5 41t45 16t38 -16t9 -41t-22.5 -42t-45 -17q-25 0 -39 17t-10 42z" /> +<glyph unicode="ÿ" horiz-adv-x="1105" d="M193 1087h86l155 -849q14 -78 58.5 -115t80.5 -36l37 1l412 842q43 88 55 168h62q23 -76 -33 -191l-442 -905q-138 -271 -232 -388q-126 -157 -233 -165v55q37 8 80 47t77.5 86.5t74.5 111t63.5 108.5t48 93t24.5 50q-25 2 -49 9t-61 27.5t-67 69t-42 119.5zM375 1314.5 q4 24.5 24.5 41t45 16.5t38 -16.5t9 -41t-22.5 -42t-45 -17.5q-25 0 -39 17.5t-10 42zM897 1314.5q4 24.5 24.5 41t45 16.5t38 -16.5t9.5 -41t-22.5 -42t-45.5 -17.5q-25 0 -39 17.5t-10 42z" /> +<glyph unicode="Œ" horiz-adv-x="2134" d="M200.5 457q3.5 125 30.5 293q33 207 81 348t101.5 222t136.5 124t159.5 54t197.5 11q129 0 209 -16t145.5 -75.5t90.5 -166.5q43 258 295 248l575 -24l-8 -60h-582q-174 0 -202 -182l-72 -447l672 -14l-9 -59l-678 -15l-69 -446q-8 -57 2 -95t38.5 -53.5t56.5 -20.5 t71 -5h561l-10 -60l-566 -24q-111 -6 -180 49t-55 184q-82 -143 -201 -189t-315 -46q-98 0 -165 9t-132.5 35.5t-100 79t-58 134.5t-20 207zM285.5 446.5q-0.5 -116.5 19 -191.5t74.5 -114t123.5 -52t181.5 -13q135 0 220 23.5t160 93t122 201.5t80 345q20 137 25 241.5 t-1 177.5t-31.5 122t-55 77.5t-82 44t-100.5 19.5t-122 4q-76 0 -121 -3t-104.5 -17t-96 -41t-79.5 -76t-73 -121.5t-58.5 -180.5t-51.5 -247q-29 -176 -29.5 -292.5z" /> +<glyph unicode="œ" horiz-adv-x="1951" d="M180 541q51 326 170 441.5t377 115.5q168 0 257 -61.5t116 -184.5q51 125 155.5 189.5t292.5 66.5q207 2 308.5 -70.5t78.5 -242.5q-16 -127 -102 -206t-196.5 -104.5t-229.5 -27.5t-200 10t-111 25q-37 -221 7 -321.5t183 -102.5q201 -2 496 38l-10 -61 q-217 -59 -490 -59q-240 0 -272 231q-59 -123 -165 -175t-286 -52q-262 0 -344 126t-35 425zM247 354.5q-1 -73.5 13 -124t39 -81t68 -48t88 -22.5t112 -5q100 0 166 15t124 62.5t95 139.5t62 237q25 123 17.5 209t-25 140.5t-62.5 84t-98 41t-131 11.5q-82 0 -134.5 -8.5 t-107.5 -36t-90 -79.5t-67 -141.5t-52 -220.5q-16 -100 -17 -173.5zM1106 549q10 -4 76.5 -11.5t176 -6.5t212 20.5t183.5 81t95 162.5q18 129 -55.5 179t-237.5 50q-125 0 -208.5 -30.5t-131 -99.5t-71 -145.5t-39.5 -199.5z" /> +<glyph unicode="Ÿ" horiz-adv-x="1286" d="M276 1499h93l299 -860l616 860h100l-686 -967l-84 -532h-84l84 532zM541 1690q4 25 24.5 41t45 16t39 -16.5t9.5 -40.5q-4 -27 -23.5 -44.5t-44 -17.5t-39.5 17.5t-11 44.5zM1063 1690q4 25 24.5 41t45 16t39 -16.5t10.5 -40.5q-4 -27 -23.5 -44.5t-44 -17.5t-40 17.5 t-11.5 44.5z" /> +<glyph unicode="ˆ" horiz-adv-x="681" d="M135 1087l303 267h78l191 -267h-70l-166 213l-256 -213h-80z" /> +<glyph unicode="˚" horiz-adv-x="681" d="M287 1294q12 88 81.5 149.5t155.5 61.5t138.5 -61.5t40 -149.5t-80 -148.5t-153.5 -60.5t-140 61.5t-42 147.5zM340 1294q-8 -63 31 -109t104 -46q63 0 114.5 45t62 110.5t-29.5 111.5t-103.5 46t-116 -46t-62.5 -112z" /> +<glyph unicode="˜" horiz-adv-x="976" d="M274 1171q162 123 244 123q47 -2 123 -62.5t104 -60.5q78 0 216 97l16 -39q-2 -2 -25.5 -20.5t-28.5 -21.5t-25.5 -18.5t-28 -19.5t-25 -14.5t-27.5 -14.5t-26.5 -9t-29.5 -7t-28 -2q-49 0 -120.5 61.5t-104.5 61.5q-25 0 -45.5 -4t-47 -16.5t-37.5 -18.5t-45 -27.5 t-42 -25.5z" /> +<glyph unicode=" " horiz-adv-x="952" /> +<glyph unicode=" " horiz-adv-x="1905" /> +<glyph unicode=" " horiz-adv-x="952" /> +<glyph unicode=" " horiz-adv-x="1905" /> +<glyph unicode=" " horiz-adv-x="635" /> +<glyph unicode=" " horiz-adv-x="476" /> +<glyph unicode=" " horiz-adv-x="317" /> +<glyph unicode=" " horiz-adv-x="317" /> +<glyph unicode=" " horiz-adv-x="238" /> +<glyph unicode=" " horiz-adv-x="381" /> +<glyph unicode=" " horiz-adv-x="105" /> +<glyph unicode="‐" horiz-adv-x="694" d="M123 553l14 82h602l-14 -82h-602z" /> +<glyph unicode="‑" horiz-adv-x="694" d="M123 553l14 82h602l-14 -82h-602z" /> +<glyph unicode="‒" horiz-adv-x="694" d="M123 553l14 82h602l-14 -82h-602z" /> +<glyph unicode="–" horiz-adv-x="901" d="M123 545l14 86h969l-14 -86h-969z" /> +<glyph unicode="—" horiz-adv-x="1513" d="M121 549l14 86h1426l-15 -86h-1425z" /> +<glyph unicode="‘" d="M330 1178l32 208q19 117 124 113l20 -2l-6 -35q-51 2 -58 -49l-10 -70h19q39 0 32 -40l-20 -125q-6 -43 -47 -43h-56q-36 0 -30 43z" /> +<glyph unicode="’" d="M332 1137l6 34q49 -2 55 48l13 71h-19q-39 0 -33 39l21 127q10 43 47 43h53q41 0 33 -43l-35 -211q-10 -61 -45 -88t-66 -23z" /> +<glyph unicode="‚" d="M127 -156l6 35q49 -2 55 49l13 72h-19q-39 0 -32 39l20 127q6 43 45 43h55q39 0 31 -43l-33 -211q-19 -116 -123 -113z" /> +<glyph unicode="“" horiz-adv-x="632" d="M319 1178l31 208q19 116 121 113q20 -2 21 -2l-5 -35q-31 2 -42 -12t-15 -37l-10 -70h16q16 0 26.5 -11t8.5 -29l-20 -125q-6 -43 -48 -43h-55q-37 0 -29 43zM559 1178l33 208q19 116 121 113l20 -2l-4 -35q-51 2 -57 -49l-10 -70h16q39 0 33 -40l-19 -125 q-6 -43 -47 -43h-53q-39 0 -33 43z" /> +<glyph unicode="”" horiz-adv-x="630" d="M319 1137l7 34q16 0 27.5 3.5t16.5 14.5t6 14t5 16l10 71h-16q-39 0 -33 39l20 127q6 43 46 43h55q37 0 31 -43l-33 -211q-10 -61 -45 -88t-66 -23zM561 1137l4 34q51 -2 58 48l10 71h-17q-39 0 -32 39l20 127q6 43 45 43h56q37 0 30 -43l-33 -211q-10 -61 -44.5 -88 t-65.5 -23z" /> +<glyph unicode="„" horiz-adv-x="630" d="M115 -152l6 35q23 0 35 9.5t14 16.5t6 23l10 70h-16q-39 0 -33 41l21 125q6 45 45 45h55q39 0 31 -45l-33 -209q-19 -116 -121 -113zM356 -152l4 35q51 -2 58 49l10 70h-16q-39 0 -33 41l20 125q6 45 45 45h56q39 0 30 -45l-32 -209q-19 -116 -121 -113z" /> +<glyph unicode="…" horiz-adv-x="1523" d="M299 33l23 123q4 33 38 32h52q33 0 28 -32l-22 -123q-6 -33 -37 -33h-53q-33 0 -29 33zM856 33l23 123q4 33 39 32h51q33 0 28 -32l-22 -123q-6 -33 -37 -33h-51q-35 0 -31 33zM1411 33l21 123q6 33 38 32h54q33 0 26 -32l-20 -123q-6 -33 -37 -33h-53q-33 0 -29 33z" /> +<glyph unicode=" " horiz-adv-x="381" /> +<glyph unicode="‹" horiz-adv-x="583" d="M78 725l487 416l53 -60l-428 -364l314 -363l-62 -55z" /> +<glyph unicode="›" horiz-adv-x="755" d="M217 360l434 369l-305 361l57 51l361 -420l-496 -422z" /> +<glyph unicode=" " horiz-adv-x="476" /> +<glyph unicode="€" horiz-adv-x="1482" d="M143 545l9 51l182 10l41 260l-178 11l8 47l180 12q33 219 100 333q143 247 471 247q209 0 455 -48l-10 -61q-33 2 -84 7t-173 11.5t-198 6.5q-127 0 -217 -40t-140 -117t-76 -152.5t-44 -186.5l547 -10l-8 -49l-549 -11l-41 -260l545 -10l-9 -51q-35 0 -92 -1t-178 -3 t-201 -3t-77 -3q-39 -221 47 -340t274 -123q215 -4 475 28l-10 -59q-213 -53 -469 -53q-47 0 -90 7t-100.5 27.5t-97.5 58.5t-76.5 98.5t-43 147.5t6.5 208z" /> +<glyph unicode="™" horiz-adv-x="1292" d="M96 1436l10 63h531l-10 -63h-234l-102 -652h-64l105 652h-236zM604 784l168 715h53l166 -610l332 610h66l-50 -715h-61l39 570l-311 -570h-50l-157 572l-133 -572h-62z" /> +<glyph unicode="" horiz-adv-x="1085" d="M0 1085h1085v-1085h-1085v1085z" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-ExtraLight-Italic-webfont.ttf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-ExtraLight-Italic-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a249c91762932a48d4a23c6582a18d8487e2dc4e Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-ExtraLight-Italic-webfont.ttf differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-ExtraLight-Italic-webfont.woff b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-ExtraLight-Italic-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..38deb131e1709493a575add2ad1e967395726743 Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-ExtraLight-Italic-webfont.woff differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-ExtraLight-webfont.eot b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-ExtraLight-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..ff8d423cadc5785e40339d4ab70f56f4db9b822f Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-ExtraLight-webfont.eot differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-ExtraLight-webfont.svg b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-ExtraLight-webfont.svg new file mode 100644 index 0000000000000000000000000000000000000000..1a2ff71f9af1c11b060621e6d89f72ea45270621 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-ExtraLight-webfont.svg @@ -0,0 +1,187 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Copyright c 2011 Natanael Gama exondiscoveredcom with Reserved Font Name Exo +Designer : Natanael Gama +</metadata> +<defs> +<font id="ExoExtraLight" horiz-adv-x="1179" > +<font-face units-per-em="2048" ascent="1638" descent="-410" /> +<missing-glyph horiz-adv-x="550" /> +<glyph unicode=" " horiz-adv-x="550" /> +<glyph unicode="	" horiz-adv-x="550" /> +<glyph unicode=" " horiz-adv-x="550" /> +<glyph unicode="!" horiz-adv-x="538" d="M207 33v123q0 33 33 32h53q33 0 33 -32v-123q0 -33 -33 -33h-53q-33 0 -33 33zM219 1497h92l-12 -1096h-68z" /> +<glyph unicode=""" horiz-adv-x="618" d="M152 1362v137h86v-137l-15 -275h-53zM381 1362v137h86v-137l-14 -275h-54z" /> +<glyph unicode="#" horiz-adv-x="1361" d="M51 500l8 51h353l61 393h-352l10 51h350l80 504h53l-82 -504h369l78 504h53l-80 -504h363l-8 -51h-365l-61 -395h362l-8 -51h-363l-77 -498h-54l80 498l-368 2l-78 -500h-51l77 500h-350zM463 551l366 -2l62 395h-367z" /> +<glyph unicode="$" horiz-adv-x="1189" d="M139 1012v135q2 213 107.5 291t306.5 73v177h63v-181q139 -10 375 -39v-57l-454 16q-156 6 -235 -54t-79 -226v-135q0 -133 69.5 -183.5t201.5 -50.5h231q190 0 259 -86t69 -233v-140q0 -106 -36 -177.5t-101.5 -104.5t-136 -44t-163.5 -9v-166h-63v170q-301 20 -375 32 v60q176 -12 471 -12q68 0 119 9t99 34.5t75 78t27 129.5v140q0 119 -56.5 176t-187.5 57h-229q-111 0 -185.5 28t-109.5 77t-48.5 99t-13.5 116z" /> +<glyph unicode="%" horiz-adv-x="1953" d="M106 971v272q0 135 57.5 195.5t207.5 60.5h207q145 0 202.5 -60.5t57.5 -195.5v-272q0 -135 -57.5 -195.5t-207.5 -60.5h-206q-145 0 -203 60.5t-58 195.5zM172 971q0 -109 44 -150t151 -41h206q113 0 156 40t43 151v272q0 106 -42 148.5t-152 42.5h-207q-113 0 -156 -39 t-43 -152v-272zM485 0l897 1499h78l-897 -1499h-78zM1118 262v273q0 135 57.5 195.5t206.5 60.5h207q145 0 202.5 -60.5t57.5 -195.5v-273q0 -135 -57 -195.5t-207 -60.5h-207q-145 0 -202.5 60.5t-57.5 195.5zM1184 262q0 -109 44 -149.5t150 -40.5h207q113 0 156 40 t43 150v273q0 106 -42 148t-153 42h-207q-113 0 -155.5 -39t-42.5 -151v-273z" /> +<glyph unicode="&" horiz-adv-x="1325" d="M89 477.5q24 153.5 163 272.5l176 149l-129 174q-80 111 -68.5 199t70.5 145.5t139 71.5q195 33 547 -16v-54h-416q-98 0 -166.5 -34.5t-86 -105.5t62.5 -177l553 -752l289 285l26 -27l-127 -192l-135 -131l209 -285h-102l-168 227l-148 -137q-121 -119 -302 -98.5 t-298 176.5q-113 156 -89 309.5zM169 459.5q-15 -125.5 79 -242.5q88 -115 223 -139.5t244 69.5l157 148l-397 532l-160 -133q-131 -109 -146 -234.5z" /> +<glyph unicode="'" horiz-adv-x="280" d="M98 1362v137h86v-137l-14 -275h-55z" /> +<glyph unicode="(" horiz-adv-x="657" d="M188 668q0 158 34 327.5t82 300.5t95 240t81 167l34 58h94q-14 -23 -36.5 -61.5t-80 -161.5t-102.5 -246t-81 -296t-36 -328q0 -172 35 -348.5t84 -305.5t98.5 -233.5t83.5 -157.5l35 -53h-94q-12 18 -34.5 52t-79 146.5t-99.5 233.5t-78 303.5t-35 362.5z" /> +<glyph unicode=")" horiz-adv-x="657" d="M51 -430q14 20 37 56t80 153t101 237.5t80 300t36 351.5q0 156 -35 325.5t-84 300.5t-97 241t-83 168l-35 58h92q12 -23 35 -61.5t79 -160.5t99 -245t78 -296t35 -330q0 -180 -34 -360.5t-81 -307.5t-95 -228.5t-82 -151.5l-34 -50h-92z" /> +<glyph unicode="*" horiz-adv-x="940" d="M127 1194v47l289 25l4 -82zM283 842l61 274l84 -16l-102 -273zM401 1477l45 16l142 -248l-80 -37zM467 1001l45 74l238 -176l-27 -37zM557 1143l236 166l24 -41l-203 -189z" /> +<glyph unicode="+" horiz-adv-x="1062" d="M127 688v82h360v365h84v-365h367v-82h-367v-364h-84v364h-360z" /> +<glyph unicode="," horiz-adv-x="417" d="M152 35v121q0 37 34 37h50q33 0 32 -37v-213q0 -98 -87 -99l-23 2v31q45 0 45 41v82h-17q-34 0 -34 35z" /> +<glyph unicode="-" horiz-adv-x="702" d="M51 553v82h602v-82h-602z" /> +<glyph unicode="." horiz-adv-x="421" d="M152 33v123q0 33 34 32h52q33 0 32 -32v-123q0 -33 -32 -33h-52q-14 0 -24 9.5t-10 23.5z" /> +<glyph unicode="/" horiz-adv-x="755" d="M51 -147l576 1724h80l-576 -1724h-80z" /> +<glyph unicode="0" horiz-adv-x="1341" d="M176 332v835q0 160 99.5 246t252.5 86h295q176 0 260 -92t84 -240v-835q0 -332 -344 -332h-295q-154 0 -253 80t-99 252zM260 332q0 -125 73 -186.5t195 -61.5h295q260 0 260 248v835q0 248 -260 248h-295q-127 0 -197.5 -66.5t-70.5 -181.5v-835z" /> +<glyph unicode="1" horiz-adv-x="729" d="M100 1270v55l344 174h84v-1499h-84v1405z" /> +<glyph unicode="2" horiz-adv-x="1222" d="M100 1434v59q211 27 582 27q213 0 314.5 -119t101.5 -311q0 -106 -77 -242.5t-178.5 -250.5t-233.5 -232.5t-206.5 -178t-134.5 -102.5h830v-84h-983v78q897 678 897 1014q0 342 -332 342h-580z" /> +<glyph unicode="3" horiz-adv-x="1222" d="M76 1419v51q158 41 610 33q172 -2 261 -96t89 -242v-141q0 -127 -66.5 -193.5t-140.5 -82.5q76 -27 141.5 -98.5t65.5 -198.5v-121q0 -344 -364 -344q-463 0 -584 34l2 52h576q127 0 204.5 55t77.5 203v121q0 129 -85 188t-191 63l-457 15v59l457 15q123 4 201.5 62 t78.5 171v141q0 127 -77.5 190.5t-196.5 63.5h-602z" /> +<glyph unicode="4" horiz-adv-x="1196" d="M51 477l637 1022h98l-616 -995h709v463l39 153h45v-616h184v-60l-184 -26v-414h-84v414h-789z" /> +<glyph unicode="5" horiz-adv-x="1296" d="M193 23v57h622q111 0 180.5 70.5t69.5 193.5v205q0 260 -252 260h-313q-86 0 -157 -64.5t-71 -156.5h-77l45 911h866v-84h-789l-30 -633q23 35 82 72t137 39h309q334 0 334 -340v-213q0 -98 -33 -171t-87 -108.5t-107.5 -52t-106.5 -16.5q-417 0 -622 31z" /> +<glyph unicode="6" horiz-adv-x="1292" d="M164 786q0 373 100.5 549t251.5 176q379 0 578 -24v-60h-564q-82 0 -141 -63.5t-88 -166.5t-41 -195.5t-12 -186.5q260 31 565 31q190 0 260 -79t70 -222v-242q0 -305 -330 -305h-264q-88 0 -154.5 36t-121 122t-82 243.5t-27.5 386.5zM248 760q0 -678 301 -678h264 q248 0 248 223v240q0 127 -64.5 171t-183.5 44h-565z" /> +<glyph unicode="7" horiz-adv-x="1101" d="M76 1415v84h911l39 -65l-506 -1434h-98l502 1415h-848z" /> +<glyph unicode="8" horiz-adv-x="1325" d="M188 315v203q0 104 61.5 161.5t133.5 65.5q-195 41 -195 277v133q0 195 94.5 274.5t266.5 79.5h258q168 0 250 -84t82 -270v-133q0 -49 -17.5 -98.5t-59.5 -92.5t-99 -51q176 -45 176 -264v-201q0 -94 -33 -160.5t-87 -98t-105.5 -44t-108.5 -12.5h-256q-100 0 -172 25.5 t-108 59.5t-55 84t-22.5 79.5t-3.5 66.5zM272 309q0 -225 277 -225h256q98 0 174 55.5t76 169.5v215q0 201 -244 201h-285q-90 0 -172 -49t-82 -152v-215zM272 1012q0 -205 254 -205h285q125 0 184.5 62.5t59.5 142.5v139q0 147 -60.5 210.5t-187.5 63.5h-258 q-147 0 -212 -62.5t-65 -211.5v-139z" /> +<glyph unicode="9" horiz-adv-x="1292" d="M152 958v242q0 305 329 305h264q88 0 155 -35.5t121 -121.5t81.5 -244t27.5 -387q0 -373 -100 -549t-252 -176q-422 0 -577 24v60h565q82 0 141.5 63.5t87 166t40 194.5t12.5 186q-244 -29 -566 -29q-190 0 -259.5 79t-69.5 222zM233 958q0 -127 64.5 -171t183.5 -44h566 q0 678 -302 678h-264q-248 0 -248 -223v-240z" /> +<glyph unicode=":" horiz-adv-x="428" d="M152 33v123q0 33 34 32h52q33 0 32 -32v-123q0 -33 -32 -33h-52q-14 0 -24 9.5t-10 23.5zM152 928v125q0 35 34 34h52q33 0 32 -34v-125q0 -31 -32 -31h-52q-34 0 -34 31z" /> +<glyph unicode=";" horiz-adv-x="421" d="M152 35v121q0 37 34 37h50q33 0 32 -37v-213q0 -98 -87 -99l-23 2v31q45 0 45 41v82h-17q-14 0 -24 10.5t-10 24.5zM154 930v125q0 33 32 32h52q35 0 34 -32v-125q0 -31 -34 -31h-52q-32 0 -32 31z" /> +<glyph unicode="<" horiz-adv-x="978" d="M127 684v84l725 373v-92l-616 -322l616 -344v-94z" /> +<glyph unicode="=" horiz-adv-x="974" d="M51 434v84h875v-84h-875zM51 930v84h875v-84h-875z" /> +<glyph unicode=">" horiz-adv-x="978" d="M127 289v94l616 344l-616 322v92l725 -373v-84z" /> +<glyph unicode="?" horiz-adv-x="1095" d="M51 1430v57q276 33 537 26q225 2 316 -96t91 -282v-207q0 -203 -131 -276.5t-399 -43.5v-209h-88v279h244q291 4 290 250v207q0 162 -77.5 228.5t-255.5 66.5h-527zM362 33v123q0 33 33 32h54q31 0 30 -32v-123q0 -33 -30 -33h-54q-33 0 -33 33z" /> +<glyph unicode="@" horiz-adv-x="1757" d="M164 0v713q0 35 3 64.5t21.5 83.5t51 91t102.5 67t166 30h420q129 0 221 -67t92 -220v-762h-59l-21 131l-27 -15q-28 -15 -72 -37t-97.5 -44.5t-117 -37.5t-114.5 -15q-113 -2 -188.5 66.5t-73.5 172.5v109q0 125 69.5 198.5t194.5 73.5h424q2 154 0 156q0 207 -237 207 h-414q-260 0 -260 -252v-713q0 -152 76.5 -215.5t183.5 -63.5h674q145 0 211.5 69t66.5 210v1049q0 139 -72.5 220t-205.5 81h-807v51q174 37 590 33h217q168 -4 265 -101.5t97 -283.5v-1049q0 -365 -362 -365h-674q-160 0 -252 94.5t-92 270.5zM553 279.5q0 -44.5 2 -46.5 q0 -74 53.5 -120.5t139.5 -46.5q150 -2 411 122v359l-414 -25q-190 -14 -190 -196q-2 -2 -2 -46.5z" /> +<glyph unicode="A" horiz-adv-x="1355" d="M115 0l557 1499h96l535 -1499h-97l-168 483h-653l-172 -483h-98zM416 567h592l-289 822z" /> +<glyph unicode="B" horiz-adv-x="1222" d="M201 0v1499h538q209 0 299 -104.5t90 -274.5q0 -133 -66.5 -225t-170.5 -111q86 -20 166 -114.5t80 -251.5q0 -84 -18.5 -154.5t-61.5 -132t-124 -96.5t-194 -35h-538zM287 86h452q313 0 314 336q1 135 -89 228q-88 91 -219 91h-6h-452v-655zM287 827h452q137 0 220 77 t85 216v15q0 280 -305 280h-452v-588z" /> +<glyph unicode="C" horiz-adv-x="1171" d="M139 754q0 152 12.5 262t44 208.5t87 160t143.5 96.5t211 35q195 0 459 -50v-61l-17 1q-16 1 -42.5 4t-62.5 5t-78 5t-85 6.5t-89 4.5t-85 1q-152 0 -238 -56.5t-131 -206t-45 -419.5q0 -678 416 -678q96 0 210 5t180 10l67 5v-59q-242 -45 -459 -45q-498 0 -498 766z " /> +<glyph unicode="D" horiz-adv-x="1363" d="M201 0v1499h532q133 0 232.5 -50t155 -126t89 -182.5t44 -198.5t10.5 -199q0 -135 -30 -261t-90.5 -236.5t-167 -178t-243.5 -67.5h-532zM285 86h448q150 0 255.5 103.5t148.5 248t43 307.5q0 670 -447 670h-448v-1329z" /> +<glyph unicode="E" d="M201 252v981q-1 141 73 205q69 61 172 61h13l622 -24v-60h-622q-174 0 -174 -182v-447l714 -14v-59l-714 -15v-446q0 -57 16 -95t47 -53.5t59.5 -20.5t71.5 -5h602v-60l-602 -24h-22q-44 0 -79 6q-44 8 -87 32.5t-66.5 81t-23.5 138.5z" /> +<glyph unicode="F" d="M201 0v1233q-1 141 73 205q69 61 172 61h13l622 -24v-60h-622q-174 0 -174 -182v-447l714 -14v-59l-714 -15v-698h-84z" /> +<glyph unicode="G" horiz-adv-x="1263" d="M139 758q0 139 8.5 238.5t36 204t75.5 169t133 105.5t204 41q80 0 242.5 -17.5t271.5 -38.5v-67q-2 0 -38 4t-92 10t-120.5 11t-136.5 9.5t-127 4.5q-94 0 -160.5 -30t-107.5 -83t-64.5 -140t-32 -186.5t-8.5 -238.5q0 -377 81 -527.5t302 -152.5q70 0 183.5 24.5 t191.5 48.5l78 25v539h-406v53q119 33 351 33q66 0 139 -6v-791h-58l-22 106q-70 -39 -202 -77.5t-255 -38.5h-11q-116 0 -200 39q-88 41 -137 104.5t-76.5 171t-35 208t-7.5 245.5z" /> +<glyph unicode="H" horiz-adv-x="1341" d="M201 0v1499h84v-733h839v733h84v-1499h-84v684h-839v-684h-84z" /> +<glyph unicode="I" horiz-adv-x="417" d="M201 0v1499h84v-1499h-84z" /> +<glyph unicode="J" horiz-adv-x="720" d="M88 43l8 57q61 -18 108 -26q35 -6 76 -6q16 0 32 1q61 3 99 27.5t65.5 86t27.5 155.5v1161h84v-1161q0 -225 -107 -301q-69 -49 -183 -49h-10q-120 2 -200 55z" /> +<glyph unicode="K" horiz-adv-x="1212" d="M201 0v1499h84v-704h264l485 704h103l-512 -747l512 -752h-105l-485 709h-260v-709h-86z" /> +<glyph unicode="L" horiz-adv-x="1142" d="M201 258v1241h84v-1241q0 -57 16 -95t47 -53.5t59.5 -20.5t71.5 -5h588v-84h-588q-59 0 -102 8t-86 33t-66.5 80t-23.5 137z" /> +<glyph unicode="M" horiz-adv-x="1634" d="M139 0l142 1499h120l424 -1358l414 1358h121l153 -1499h-83l-142 1366l-418 -1366h-90l-426 1366l-131 -1366h-84z" /> +<glyph unicode="N" horiz-adv-x="1372" d="M201 0v1499h88l866 -1341v1341h84v-1499h-84l-870 1341v-1341h-84z" /> +<glyph unicode="O" horiz-adv-x="1382" d="M164 739q0 207 26.5 349.5t68.5 225.5t119 127t152.5 56t194.5 12q98 0 164.5 -8t136.5 -34.5t112 -79t77.5 -136.5t51 -211t15.5 -301q0 -197 -23.5 -332t-64.5 -216.5t-114.5 -126t-153.5 -58.5t-201 -14q-102 0 -170 8t-138.5 33.5t-111.5 76t-75.5 132.5t-50 205.5 t-15.5 291.5zM248 739q0 -219 23.5 -349t85 -200.5t143.5 -92t225 -21.5q137 0 219 23.5t143.5 93t86 200.5t24.5 346q0 193 -21.5 321t-54 200.5t-98.5 109.5t-128 46t-171 9q-66 0 -105.5 -2t-92 -11t-83 -28.5t-66.5 -52.5t-56.5 -84t-39 -120.5t-26.5 -167t-8 -220.5z " /> +<glyph unicode="P" horiz-adv-x="1191" d="M152 0v1499h581q70 0 126 -15.5t113.5 -55t89.5 -128t32 -219.5q0 -121 -25 -207t-57.5 -130t-88 -68.5t-94 -28.5t-96.5 -4q-63 0 -276 12.5t-221 16.5v-672h-84zM236 729h497q129 -1 203 71q72 70 72 270v11q0 106 -25 177t-68 103t-85 42t-97 10h-497v-684z" /> +<glyph unicode="Q" horiz-adv-x="1382" d="M164 739q0 150 13 264.5t36 195.5t61.5 138.5t79.5 90t104.5 51t122 24.5t142.5 6q121 0 196.5 -12t151.5 -56t118 -127t67.5 -225.5t25.5 -349.5q0 -197 -24.5 -332t-65.5 -216.5t-114.5 -126t-153.5 -58.5t-201 -14q-102 0 -170 8t-137.5 33.5t-111.5 76t-76.5 132.5 t-49 204.5t-14.5 292.5zM248 739q0 -219 22.5 -349t84 -200.5t143.5 -92t225 -21.5q111 0 181.5 14t132 54t94 115t50 191.5t17.5 288.5q0 160 -12 275.5t-43 190.5t-65 120t-95 66.5t-115.5 27.5t-144.5 6q-76 0 -120 -3t-101.5 -17t-90 -41t-68.5 -76t-53.5 -121.5 t-29.5 -180.5t-12 -247zM690 -68h55q39 -68 103 -98q58 -26 113 -26h13q62 4 128 26v-88q-57 -20 -122 -21h-6q-62 0 -118 19q-59 20 -105.5 69t-60.5 119z" /> +<glyph unicode="R" horiz-adv-x="1187" d="M152 0v1499h589q57 0 104.5 -9t95.5 -37t81 -74t54.5 -122.5t21.5 -181.5q0 -111 -21.5 -192.5t-51.5 -124.5t-75 -68.5t-78.5 -33t-76.5 -9.5l323 -647h-88l-328 645q-453 12 -466 23v-668h-84zM236 733h505q61 0 102.5 10.5t83.5 43t63.5 104.5t21.5 184 q0 203 -74 270.5t-197 67.5h-505v-680z" /> +<glyph unicode="S" horiz-adv-x="1198" d="M164 1012v135q0 207 103.5 285.5t295.5 78.5q197 0 473 -43v-59l-473 18q-14 1 -28 1q-135 0 -207 -55q-80 -60 -80 -226v-135q0 -143 65.5 -188.5t204.5 -45.5h252q186 0 257 -86t71 -233v-140q0 -104 -33 -173.5t-94.5 -103.5t-125 -46t-149.5 -12q-80 0 -252 12 t-239 24v64q176 -16 491 -16q63 0 113.5 9t99.5 33.5t77 78t28 130.5v140q0 119 -56.5 176t-187.5 57h-248q-115 0 -190.5 25.5t-110.5 75t-46 98.5t-11 121z" /> +<glyph unicode="T" horiz-adv-x="1218" d="M94 1415v84h1055v-84h-492v-1415h-84v1415h-479z" /> +<glyph unicode="U" horiz-adv-x="1392" d="M201 655v844h84v-844q0 -211 28.5 -334.5t102 -175t132 -61.5t186.5 -10h3q72 0 116 5t101.5 21.5t92 55.5t67.5 100t47.5 162.5t14.5 236.5v844h86v-844q0 -109 -10.5 -197.5t-27 -153t-45 -115t-54 -84t-68.5 -56t-73 -34t-81 -17.5t-81.5 -7t-84.5 -1h-12q-61 0 -91 1 t-84 6t-83 16.5t-72 35t-66.5 56t-52 83t-42 116t-23.5 154t-10 197.5z" /> +<glyph unicode="V" horiz-adv-x="1355" d="M115 1499h90l491 -1384l514 1384h93l-560 -1499h-96z" /> +<glyph unicode="W" horiz-adv-x="1980" d="M115 1499h90l491 -1376l457 1376h94l-186 -569l311 -811l467 1380h88l-504 -1499h-96l-311 797l-273 -797h-96z" /> +<glyph unicode="X" horiz-adv-x="1177" d="M115 1499h98l403 -678l410 678h98l-452 -749l442 -750h-98l-400 670l-397 -670h-98l440 750z" /> +<glyph unicode="Y" horiz-adv-x="1273" d="M115 1499h92l440 -864l479 864h95l-533 -967v-532h-84v532z" /> +<glyph unicode="Z" horiz-adv-x="1132" d="M88 0v84l860 1331h-860v84h969v-84l-860 -1331h860v-84h-969z" /> +<glyph unicode="[" horiz-adv-x="663" d="M215 -78v1450q0 57 9 108.5t36 112t86.5 96t147.5 35.5h122v-84h-122q-90 0 -142.5 -67.5t-52.5 -200.5v-1450q0 -121 48 -194.5t147 -73.5h122v-84h-122q-88 0 -147.5 36t-86.5 96t-36 111.5t-9 108.5z" /> +<glyph unicode="\" horiz-adv-x="755" d="M51 1577h80l576 -1724h-80z" /> +<glyph unicode="]" horiz-adv-x="663" d="M51 -346h123q98 0 146.5 73.5t48.5 194.5v1450q0 133 -52.5 200.5t-142.5 67.5h-123v84h123q88 0 147.5 -35.5t86 -96t36 -111.5t9.5 -109v-1450q0 -57 -9.5 -108.5t-36 -111.5t-86 -96t-147.5 -36h-123v84z" /> +<glyph unicode="^" horiz-adv-x="821" d="M127 1087l260 267h76l235 -267h-73l-201 205l-223 -205h-74z" /> +<glyph unicode="_" horiz-adv-x="1357" d="M51 -2v84h1258v-84h-1258z" /> +<glyph unicode="`" horiz-adv-x="438" d="M51 1360h101l237 -273h-65z" /> +<glyph unicode="a" horiz-adv-x="1062" d="M100 258v125q0 127 73 199.5t200 72.5q240 -1 360.5 -1t120.5 1q1 68 1 102.5t-1 35.5q0 233 -231 235h-16q-167 0 -472 -39v55q236 61 490 64h7q132 0 218 -77q88 -79 88 -238v-793h-57l-27 131l-32 -14q-32 -14 -84 -36t-111.5 -43.5t-129 -35.5t-124.5 -14 q-117 0 -195 71.5t-78 198.5zM184 268q0 -102 55.5 -148t133.5 -48q74 0 193.5 28.5t203.5 58.5l84 29v408l-481 -25q-188 -8 -189 -192v-111z" /> +<glyph unicode="b" horiz-adv-x="1130" d="M152 0v1608h79v-586q92 37 210 59.5t194 22.5q371 0 371 -565q0 -102 -17.5 -192.5t-56.5 -175.5t-115 -134t-182 -49q-96 0 -225 47t-177 86l-28 -121h-53zM233 178q225 -106 402 -106q127 0 207 116.5t80 350.5q0 272 -77 376.5t-210 104.5q-174 0 -402 -59v-783z" /> +<glyph unicode="c" horiz-adv-x="1024" d="M127 545q0 172 24.5 285.5t76 170t110.5 77t145 20.5q178 0 426 -54v-57q-244 27 -426 27q-70 0 -113.5 -15.5t-82.5 -63.5t-57.5 -146.5t-18.5 -251.5q0 -186 36 -291t91 -138.5t145 -33.5q84 0 194.5 9t179.5 18l69 10v-62q-199 -57 -443 -59q-84 0 -142 20.5 t-110.5 76.5t-78 171t-25.5 287z" /> +<glyph unicode="d" horiz-adv-x="1130" d="M127 539q0 565 371 565q76 0 193.5 -22.5t209.5 -59.5v586h80v-1608h-55l-27 121q-47 -39 -176 -86t-225 -47q-106 0 -182 49t-115 134t-56.5 175.5t-17.5 192.5zM211 539q0 -240 79 -353.5t208 -113.5q176 0 401 106v783q-227 59 -401 59q-135 0 -211 -103.5t-76 -377.5 z" /> +<glyph unicode="e" horiz-adv-x="1075" d="M127 549q0 180 22.5 288.5t79 166t130 75t202.5 17.5q72 0 118 -4.5t99 -16.5t85 -37.5t59.5 -66.5t40 -106.5t12.5 -153.5q0 -117 -68.5 -166t-210.5 -49h-485q0 -174 35 -269.5t89 -124t148 -28.5q233 0 471 35v-62q-200 -57 -439 -57h-32q-205 2 -280.5 124t-75.5 435 zM211 578h485q94 0 144.5 26.5t50.5 106.5q0 102 -16.5 162.5t-61.5 91t-99.5 39t-152.5 8.5q-111 0 -169 -12.5t-104 -57.5t-61.5 -129.5t-15.5 -234.5z" /> +<glyph unicode="f" horiz-adv-x="796" d="M51 1004v59l185 24v203q0 45 2 77t13 82t32.5 82t62.5 55.5t100 23.5q199 0 302 -31v-53l-279 2q-94 0 -122 -57.5t-28 -180.5v-203h345v-83h-345v-1004h-83v1004h-185z" /> +<glyph unicode="g" horiz-adv-x="1159" d="M115 -51l43 188q-37 35 -37 105q0 53 40 98t115 51q-157 74 -157 311q0 202 87 296t265 94h639v-58l-207 -26q104 -98 105 -303q0 -43 -7.5 -86.5t-29 -95.5t-57 -92t-99 -66.5t-145.5 -26.5h-320q-27 0 -55.5 -5t-61 -29.5t-32.5 -63.5q0 -49 44 -75t93 -26h426 q137 0 212 -74.5t75 -199.5v-117q0 -301 -308 -301h-307q-147 0 -234 82t-87 233v187zM199 102v-340q0 -57 17 -101t43 -68.5t60.5 -40t62.5 -19.5t54 -4h307q225 0 226 219v113q0 196 -211 196h-2h-414q-96 0 -143 45zM201 705q0 -135 65.5 -209t190.5 -74h207 q137 0 199.5 83t62.5 200q-2 150 -56.5 226.5t-148.5 76.5h-264q-143 0 -199.5 -80t-56.5 -223z" /> +<glyph unicode="h" horiz-adv-x="1124" d="M152 0v1606h84v-645q231 145 428 145q156 0 245.5 -102.5t89.5 -245.5v-758h-84v758q0 121 -67.5 192.5t-183.5 71.5q-121 0 -210 -27.5t-218 -95.5v-899h-84z" /> +<glyph unicode="i" horiz-adv-x="366" d="M127 1270v123q0 32 31 32h2h49q31 0 31 -32v-123q0 -31 -31 -31h-49q-33 0 -33 31zM139 0v1087h84v-1087h-84z" /> +<glyph unicode="j" horiz-adv-x="415" d="M152 1270v123q0 32 30 32h2h49q33 0 33 -32v-123q0 -31 -33 -31h-49q-32 0 -32 31zM168 -553v1640h84v-1095v-62q0 -295 -35 -483h-49z" /> +<glyph unicode="k" horiz-adv-x="1019" d="M152 0v1602h84v-934h108l504 419h123l-545 -464l543 -623h-111l-514 582h-108v-582h-84z" /> +<glyph unicode="l" horiz-adv-x="610" d="M152 387v1217h84v-1217q0 -96 15 -159.5t44 -91t50.5 -37t53.5 -15.5q147 -29 162 -29v-55h-151q-129 0 -193.5 92t-64.5 295z" /> +<glyph unicode="m" horiz-adv-x="1882" d="M152 0v1087h55l29 -129q231 145 423 146q100 0 178 -45t117 -121q88 68 218.5 117t250.5 49q152 0 244 -100.5t92 -247.5v-756h-84v756q0 113 -68.5 188.5t-183.5 75.5q-221 0 -450 -133q22 -49 22 -124v-7v-756h-84v756q0 113 -68.5 188.5t-183.5 75.5 q-121 0 -209 -27.5t-214 -93.5v-899h-84z" /> +<glyph unicode="n" horiz-adv-x="1124" d="M152 0v1087h55l29 -126q231 145 428 145q156 0 245.5 -102.5t89.5 -245.5v-758h-84v758q0 117 -68.5 190.5t-182.5 73.5q-121 0 -210 -27.5t-218 -95.5v-899h-84z" /> +<glyph unicode="o" horiz-adv-x="1169" d="M127 528q0 328 100.5 449t356.5 121q262 0 361 -130t99 -440q0 -301 -99 -419.5t-361 -118.5q-266 0 -361.5 119.5t-95.5 418.5zM211 528q0 -150 22.5 -242.5t74.5 -138t112.5 -59.5t163 -14t165 15t114.5 62.5t75 139.5t23 237q0 158 -23 256.5t-75 147.5t-114.5 65.5 t-165 16.5t-162 -13.5t-112.5 -61.5t-75.5 -147.5t-22.5 -263.5z" /> +<glyph unicode="p" horiz-adv-x="1130" d="M152 -551v1638h53l28 -120q47 39 176.5 86t225.5 47q106 0 182 -49.5t115 -134.5t56.5 -175t17.5 -192q0 -565 -371 -565q-76 0 -192.5 22.5t-209.5 59.5v-617h-81zM233 127q227 -59 402 -59q133 0 210 104t77 377q0 233 -80 350t-207 117q-176 0 -402 -107v-782z" /> +<glyph unicode="q" horiz-adv-x="1138" d="M127 549q0 264 94 407.5t283 143.5q262 0 487 -33v-1620h-84v612q-92 -37 -208.5 -58t-194.5 -21q-115 0 -190.5 41.5t-115.5 122.5t-55.5 177.5t-15.5 227.5zM211 549q0 -115 11 -196t42 -150.5t90.5 -104.5t149.5 -35q168 0 403 60v893h-403q-293 0 -293 -467z" /> +<glyph unicode="r" horiz-adv-x="868" d="M152 0v1087h53l31 -137q90 51 134 74t130 49.5t168 26.5q113 0 151 -17v-82q-72 14 -151 15q-37 0 -70 -3t-67.5 -11.5t-56 -14.5t-59.5 -22.5t-53.5 -23.5t-63.5 -29.5t-62 -30.5v-881h-84z" /> +<glyph unicode="s" horiz-adv-x="1032" d="M100 739v95q0 131 65.5 197.5t217.5 66.5q260 0 494 -23v-59h-494q-113 0 -156 -43t-43 -139v-95q0 -55 11.5 -88t42 -47t58.5 -17t87 -3h283q123 0 194.5 -65.5t71.5 -180.5v-100q0 -80 -21.5 -132.5t-63.5 -76t-83 -31.5t-98 -8q-72 0 -265.5 10t-255.5 16v58h521 q31 0 45 1t44.5 9t47 23.5t31 49t14.5 81.5v100q0 72 -46 117t-136 45h-283q-158 0 -220.5 44.5t-62.5 194.5z" /> +<glyph unicode="t" horiz-adv-x="735" d="M51 1006v61l182 23l23 303h61v-303h345v-84h-345v-619q0 -96 15.5 -159.5t44.5 -91t50.5 -37t53.5 -15.5q147 -29 162 -29v-55h-151q-129 0 -194 92t-65 295v619h-182z" /> +<glyph unicode="u" horiz-adv-x="1124" d="M127 332v758h84v-758q0 -117 68.5 -190.5t183.5 -73.5q123 0 212 27.5t216 92.5v902h84v-1088h-55l-29 127q-231 -145 -428 -145q-156 0 -246 102.5t-90 245.5z" /> +<glyph unicode="v" horiz-adv-x="1075" d="M51 1087h88l396 -966l401 966h90l-448 -1087h-86z" /> +<glyph unicode="w" horiz-adv-x="1607" d="M51 1087h90l373 -970l354 970h88l-137 -387l264 -583l387 970h89l-429 -1087h-88l-264 592l-217 -592h-90z" /> +<glyph unicode="x" horiz-adv-x="1011" d="M59 0l394 545l-394 542h109l338 -471l340 471h108l-395 -544l389 -543h-102l-340 469l-338 -469h-109z" /> +<glyph unicode="y" horiz-adv-x="1099" d="M53 1087h90l291 -849q29 -80 74 -117q43 -35 74 -35h3l31 2l338 999h90l-477 -1431l-114 -209h-50l185 553q-174 8 -242 225z" /> +<glyph unicode="z" horiz-adv-x="958" d="M76 1004v83h811v-83l-672 -918h672v-84h-781v84l672 918h-702z" /> +<glyph unicode="{" horiz-adv-x="632" d="M51 641v84q184 16 185 135v483q0 168 79.5 274.5t268.5 106.5v-84q-131 0 -198 -67.5t-67 -229.5v-483q0 -72 -48 -118t-119 -58q70 -10 117.5 -58t47.5 -112v-592q0 -145 67 -207.5t200 -60.5v-84q-109 0 -182.5 30.5t-108.5 87t-47.5 111t-12.5 123.5v584 q0 66 -57 102.5t-125 32.5z" /> +<glyph unicode="|" horiz-adv-x="512" d="M217 -147v1724h84v-1724h-84z" /> +<glyph unicode="}" horiz-adv-x="632" d="M51 -346q133 -2 199.5 60.5t66.5 207.5v592q0 63 48.5 111.5t117.5 58.5q-72 12 -120 58t-48 118v483q0 162 -66.5 229.5t-197.5 67.5v84q188 0 268 -106.5t80 -274.5v-483q0 -119 185 -135v-84q-68 4 -125.5 -33t-57.5 -102v-584q0 -70 -12 -124t-47 -110.5t-108.5 -87 t-182.5 -30.5v84z" /> +<glyph unicode="~" horiz-adv-x="944" d="M127 1171q4 4 26.5 23.5t27.5 24t24.5 19.5t28 20.5t27 15.5t30.5 13t28.5 6t32.5 3q43 0 126 -61t118 -61q18 0 38.5 5t36 12t37 19.5t31 20.5t31 23.5t25.5 19.5l24 -39q-4 -4 -19.5 -18.5t-19.5 -19.5t-18 -18.5t-21.5 -17.5t-21.5 -15t-22.5 -15.5t-23 -11.5 t-25.5 -10t-24.5 -5t-27.5 -2q-47 0 -129 61.5t-117 61.5q-27 0 -55.5 -9.5t-45 -18.5t-52 -32.5t-50.5 -31.5z" /> +<glyph unicode="¢" horiz-adv-x="999" d="M100 545q0 178 27 293.5t83 171t120.5 74t163.5 16.5v176h65v-182q176 -14 326 -50v-57q-244 29 -426 29q-70 0 -114 -16.5t-84 -63.5t-58.5 -146.5t-18.5 -252.5q0 -141 18.5 -234.5t57.5 -142.5t85 -68.5t114 -19.5q84 0 193.5 9t177.5 18l69 10v-62q-166 -49 -340 -55 v-170h-65v166q-78 0 -132.5 9t-107.5 43t-84 93.5t-50.5 163t-19.5 248.5z" /> +<glyph unicode="£" horiz-adv-x="1226" d="M127 0v59l147 25v618h-147v52l147 22v258q0 92 12.5 164t33 120t55.5 83t69.5 53.5t88 28.5t97.5 13t111 3q51 0 141.5 -6t154.5 -11l65 -5v-60h-357q-90 0 -143 -6t-106.5 -26.5t-79 -62.5t-42 -111.5t-16.5 -176.5v-258l580 -22v-52h-580v-618h740v-84h-971z" /> +<glyph unicode="¥" horiz-adv-x="1206" d="M51 1499h94l439 -758l473 758h100l-530 -842h405v-59h-407v-164h407v-59h-407v-375h-84v375h-383v59h383v164h-383v59h381z" /> +<glyph unicode="¨" horiz-adv-x="888" d="M127 1192q0 25 16.5 41t41 16t42 -16t17.5 -41t-17.5 -42t-42 -17t-41 17t-16.5 42zM647 1192q0 25 17.5 41t42 16t42 -16t17.5 -41t-17.5 -42t-42 -17t-42 17t-17.5 42z" /> +<glyph unicode="©" horiz-adv-x="1730" d="M139 754q0 139 21.5 260t72 235.5t150.5 182t240 67.5h534q436 0 436 -745q0 -207 -43 -372t-144 -273.5t-249 -108.5h-534q-109 0 -195 52t-138 133t-88 185.5t-49.5 199t-13.5 184.5zM203 754q0 -121 24.5 -240t74.5 -221.5t133 -166t188 -63.5h534q162 0 267.5 181.5 t105.5 509.5q0 137 -17.5 251.5t-57.5 216t-115.5 158t-182.5 56.5h-534q-86 0 -156 -33t-131.5 -106.5t-96 -211.5t-36.5 -331zM500 748q0 233 79.5 339.5t215.5 106.5q147 0 364 -39v-49q-172 25 -364 24q-231 0 -232 -389q0 -182 53.5 -279t178.5 -97q221 0 376 32v-49 q-168 -47 -376 -47q-137 0 -216 97.5t-79 349.5z" /> +<glyph unicode="«" horiz-adv-x="1122" d="M127 725l420 418l59 -60l-362 -358l374 -367l-61 -61zM506 725l422 418l57 -60l-362 -358l372 -367l-59 -61z" /> +<glyph unicode="­" horiz-adv-x="702" d="M51 553v82h602v-82h-602z" /> +<glyph unicode="®" horiz-adv-x="1730" d="M139 754q0 139 21.5 260t72 235.5t150.5 182t240 67.5h534q436 0 436 -745q0 -207 -43 -372t-144 -273.5t-249 -108.5h-534q-109 0 -195 52t-138 133t-88 185.5t-49.5 199t-13.5 184.5zM203 754q0 -121 24.5 -240t74.5 -221.5t133 -166t188 -63.5h534q162 0 267.5 181.5 t105.5 509.5q0 137 -17.5 251.5t-57.5 216t-115.5 158t-182.5 56.5h-534q-86 0 -156 -33t-131.5 -106.5t-96 -211.5t-36.5 -331zM567 313v875h363q119 0 189.5 -55.5t70.5 -204.5q0 -43 -7 -78t-16.5 -57.5t-29 -41t-30.5 -27.5t-37 -16.5t-34 -8.5t-34.5 -4t-28.5 -3 l215 -379h-74l-213 379l-270 15v-394h-64zM631 750h311q102 0 143 34.5t41 141.5q0 111 -48 154.5t-136 43.5h-311v-374z" /> +<glyph unicode="´" horiz-adv-x="438" d="M51 1087l238 273h100l-272 -273h-66z" /> +<glyph unicode="¸" horiz-adv-x="534" d="M127 -319l80 18q74 14 104.5 58t28.5 167h70q0 -160 -42 -219t-165 -59h-76v35z" /> +<glyph unicode="»" horiz-adv-x="1122" d="M127 358l373 367l-361 358l58 60l421 -418l-432 -428zM506 358l373 367l-363 358l62 60l417 -418l-430 -428z" /> +<glyph unicode="À" horiz-adv-x="1355" d="M115 0l557 1499h96l535 -1499h-97l-168 483h-653l-172 -483h-98zM416 567h592l-289 822zM416 1905h100l238 -273h-66z" /> +<glyph unicode="Â" horiz-adv-x="1355" d="M115 0l557 1499h96l535 -1499h-97l-168 483h-653l-172 -483h-98zM416 567h592l-289 822zM434 1632l260 266h76l236 -266h-74l-201 205l-223 -205h-74z" /> +<glyph unicode="Æ" horiz-adv-x="1900" d="M76 0l715 1219q100 174 185 229t241 51l585 -24v-60h-585q-35 0 -62 -4t-45 -8t-30.5 -18.5t-19.5 -20.5t-10 -29.5t-4.5 -31t-1.5 -41.5v-41v-439l676 -12v-61l-676 -13v-446q0 -57 15.5 -94t48.5 -52.5t60.5 -19.5t70.5 -4h563v-62l-563 -26q-123 -6 -200.5 47 t-77.5 209v252h-496l-293 -500h-96zM512 582h449v759z" /> +<glyph unicode="Ç" horiz-adv-x="1171" d="M139 754q0 152 12.5 262t44 208.5t87 160t143.5 96.5t211 35q195 0 459 -50v-61l-17 1q-16 1 -42.5 4t-62.5 5t-78 5t-85 6.5t-89 4.5t-85 1q-152 0 -238 -56.5t-131 -206t-45 -419.5q0 -678 416 -678q96 0 210 5t180 10l67 5v-59q-242 -45 -459 -45q-498 0 -498 766z M440 -317l80 18q74 14 104.5 58t28.5 167h70q0 -160 -42 -219t-165 -59h-76v35z" /> +<glyph unicode="È" d="M201 252v981q0 141 73.5 205.5t184.5 60.5l622 -24v-60h-622q-174 0 -174 -182v-447l714 -14v-59l-714 -15v-446q0 -57 16 -95t47 -53.5t59.5 -20.5t71.5 -5h602v-60l-602 -24q-57 -2 -101 6t-87 32.5t-66.5 81t-23.5 138.5zM393 1894h101l237 -272h-65z" /> +<glyph unicode="É" d="M201 252v981q0 141 73.5 205.5t184.5 60.5l622 -24v-60h-622q-174 0 -174 -182v-447l714 -14v-59l-714 -15v-446q0 -57 16 -95t47 -53.5t59.5 -20.5t71.5 -5h602v-60l-602 -24q-57 -2 -101 6t-87 32.5t-66.5 81t-23.5 138.5zM649 1622l238 272h100l-272 -272h-66z" /> +<glyph unicode="Ê" d="M201 252v981q0 141 73.5 205.5t184.5 60.5l622 -24v-60h-622q-174 0 -174 -182v-447l714 -14v-59l-714 -15v-446q0 -57 16 -95t47 -53.5t59.5 -20.5t71.5 -5h602v-60l-602 -24q-57 -2 -101 6t-87 32.5t-66.5 81t-23.5 138.5zM389 1632l260 266h76l236 -266h-74l-201 205 l-223 -205h-74z" /> +<glyph unicode="Ë" d="M201 252v981q0 141 73.5 205.5t184.5 60.5l622 -24v-60h-622q-174 0 -174 -182v-447l714 -14v-59l-714 -15v-446q0 -57 16 -95t47 -53.5t59.5 -20.5t71.5 -5h602v-60l-602 -24q-57 -2 -101 6t-87 32.5t-66.5 81t-23.5 138.5zM340 1726.5q0 24.5 16.5 41t41 16.5t42 -16.5 t17.5 -41t-17.5 -42t-42 -17.5t-41 17.5t-16.5 42zM860 1726.5q0 24.5 17.5 41t42 16.5t42 -16.5t17.5 -41t-17.5 -42t-42 -17.5t-42 17.5t-17.5 42z" /> +<glyph unicode="Î" horiz-adv-x="417" d="M-41 1632l260 266h76l235 -266h-73l-201 205l-223 -205h-74zM201 0v1499h84v-1499h-84z" /> +<glyph unicode="Ï" horiz-adv-x="417" d="M-76 1691.5q0 24.5 16.5 41t41 16.5t42 -16.5t17.5 -41t-17.5 -42t-42 -17.5t-41 17.5t-16.5 42zM201 0v1499h84v-1499h-84zM444 1691.5q0 24.5 17.5 41t42 16.5t42 -16.5t17.5 -41t-17.5 -42t-42 -17.5t-42 17.5t-17.5 42z" /> +<glyph unicode="Ô" horiz-adv-x="1382" d="M164 739q0 207 26.5 349.5t68.5 225.5t119 127t152.5 56t194.5 12q98 0 164.5 -8t136.5 -34.5t112 -79t77.5 -136.5t51 -211t15.5 -301q0 -197 -23.5 -332t-64.5 -216.5t-114.5 -126t-153.5 -58.5t-201 -14q-102 0 -170 8t-138.5 33.5t-111.5 76t-75.5 132.5t-50 205.5 t-15.5 291.5zM248 739q0 -219 23.5 -349t85 -200.5t143.5 -92t225 -21.5q137 0 219 23.5t143.5 93t86 200.5t24.5 346q0 193 -21.5 321t-54 200.5t-98.5 109.5t-128 46t-171 9q-66 0 -105.5 -2t-92 -11t-83 -28.5t-66.5 -52.5t-56.5 -84t-39 -120.5t-26.5 -167t-8 -220.5z M438 1632l260 266h76l236 -266h-74l-201 205l-223 -205h-74z" /> +<glyph unicode="Ù" horiz-adv-x="1392" d="M201 655v844h84v-844q0 -211 28.5 -334.5t102 -175t132 -61.5t186.5 -10h3q72 0 116 5t101.5 21.5t92 55.5t67.5 100t47.5 162.5t14.5 236.5v844h86v-844q0 -109 -10.5 -197.5t-27 -153t-45 -115t-54 -84t-68.5 -56t-73 -34t-81 -17.5t-81.5 -7t-84.5 -1h-12q-61 0 -91 1 t-84 6t-83 16.5t-72 35t-66.5 56t-52 83t-42 116t-23.5 154t-10 197.5zM426 1905h100l238 -273h-66z" /> +<glyph unicode="Û" horiz-adv-x="1392" d="M201 655v844h84v-844q0 -211 28.5 -334.5t102 -175t132 -61.5t186.5 -10h3q72 0 116 5t101.5 21.5t92 55.5t67.5 100t47.5 162.5t14.5 236.5v844h86v-844q0 -109 -10.5 -197.5t-27 -153t-45 -115t-54 -84t-68.5 -56t-73 -34t-81 -17.5t-81.5 -7t-84.5 -1h-12q-61 0 -91 1 t-84 6t-83 16.5t-72 35t-66.5 56t-52 83t-42 116t-23.5 154t-10 197.5zM446 1632l261 266h75l236 -266h-74l-201 205l-223 -205h-74z" /> +<glyph unicode="Ü" horiz-adv-x="1392" d="M201 655v844h84v-844q0 -211 28.5 -334.5t102 -175t132 -61.5t186.5 -10h3q72 0 116 5t101.5 21.5t92 55.5t67.5 100t47.5 162.5t14.5 236.5v844h86v-844q0 -109 -10.5 -197.5t-27 -153t-45 -115t-54 -84t-68.5 -56t-73 -34t-81 -17.5t-81.5 -7t-84.5 -1h-12q-61 0 -91 1 t-84 6t-83 16.5t-72 35t-66.5 56t-52 83t-42 116t-23.5 154t-10 197.5zM412 1691.5q0 24.5 16 41t41 16.5t42 -16.5t17 -41t-17 -42t-42 -17.5t-41 17.5t-16 42zM932 1691.5q0 24.5 17.5 41t42 16.5t42 -16.5t17.5 -41t-17.5 -42t-42 -17.5t-42 17.5t-17.5 42z" /> +<glyph unicode="à" horiz-adv-x="1062" d="M100 258v125q0 127 73 199.5t200 72.5q481 -2 481 0q2 135 0 138q0 233 -231 235q-168 2 -488 -39v55q236 61 490 64q137 2 225 -77t88 -238v-793h-57l-27 131l-32 -14q-32 -14 -84 -36t-111.5 -43.5t-129 -35.5t-124.5 -14q-117 0 -195 71.5t-78 198.5zM184 268 q0 -102 55.5 -148t133.5 -48q74 0 193.5 28.5t203.5 58.5l84 29v408l-481 -25q-188 -8 -189 -192v-111zM248 1503h100l238 -272h-66z" /> +<glyph unicode="â" horiz-adv-x="1062" d="M100 258v125q0 127 73 199.5t200 72.5q481 -2 481 0q2 135 0 138q0 233 -231 235q-168 2 -488 -39v55q236 61 490 64q137 2 225 -77t88 -238v-793h-57l-27 131l-32 -14q-32 -14 -84 -36t-111.5 -43.5t-129 -35.5t-124.5 -14q-117 0 -195 71.5t-78 198.5zM184 268 q0 -102 55.5 -148t133.5 -48q74 0 193.5 28.5t203.5 58.5l84 29v408l-481 -25q-188 -8 -189 -192v-111zM262 1231l260 266h76l236 -266h-74l-201 205l-223 -205h-74z" /> +<glyph unicode="æ" horiz-adv-x="1806" d="M100 262v68q0 127 73 199.5t200 72.5q481 -2 481 0q2 193 0 195q0 233 -231 235q-164 2 -488 -39v56q215 61 490 63q102 2 180 -44t108 -140q37 98 128.5 134t250.5 36q66 0 103 -1t88 -8.5t78.5 -21.5t60.5 -41t48.5 -65.5t26.5 -96t11 -133.5q0 -117 -69.5 -167 t-211.5 -50h-487q0 -100 1 -153.5t10.5 -112t25.5 -84t48 -50t77 -31.5t112 -7q219 -2 474 35v-62q-203 -57 -474 -57q-68 0 -121 11t-81.5 21.5t-58 38t-36 35.5t-26.5 37l-36 -14q-36 -14 -93 -36t-123 -43.5t-138.5 -35.5t-127.5 -14q-117 0 -195 71.5t-78 198.5z M184 272q0 -102 55.5 -148t133.5 -48q74 0 193.5 31.5t203.5 63.5l84 32v338l-481 -19q-188 -8 -189 -192v-58zM940 596h487q98 0 147.5 26.5t49.5 108.5q0 59 -6 102.5t-15.5 74t-33 51t-43 31.5t-61.5 16.5t-74.5 6.5t-96.5 1q-147 0 -217.5 -29t-102.5 -117t-34 -272z " /> +<glyph unicode="ç" horiz-adv-x="1024" d="M127 545q0 172 24.5 285.5t76 171t110.5 78t145 20.5q170 0 426 -56v-57q-244 29 -426 29q-70 0 -113.5 -16.5t-82.5 -63.5t-57.5 -146.5t-18.5 -252.5q0 -270 67.5 -367.5t204.5 -97.5q84 0 194.5 9t179.5 18l69 10v-62q-199 -57 -443 -59q-84 0 -142 20.5t-110.5 77.5 t-78 172t-25.5 287zM336 -315l82 16q74 14 104.5 59t28.5 166h70q0 -160 -42 -219t-165 -59h-78v37z" /> +<glyph unicode="è" horiz-adv-x="1075" d="M127 549q0 180 22.5 288.5t79 166t130 75t202.5 17.5q72 0 118 -4.5t99 -16.5t85 -37.5t59.5 -66.5t40 -106.5t12.5 -153.5q0 -117 -68.5 -166t-210.5 -49h-485q0 -174 35 -269.5t89 -124t148 -28.5q233 0 471 35v-62q-213 -61 -471 -57q-205 2 -280.5 124t-75.5 435z M211 578h485q94 0 144.5 26.5t50.5 106.5q0 102 -16.5 162.5t-61.5 91t-99.5 39t-152.5 8.5q-111 0 -169 -12.5t-104 -57.5t-61.5 -129.5t-15.5 -234.5zM276 1487h101l237 -273h-65z" /> +<glyph unicode="é" horiz-adv-x="1075" d="M127 549q0 180 22.5 288.5t79 166t130 75t202.5 17.5q72 0 118 -4.5t99 -16.5t85 -37.5t59.5 -66.5t40 -106.5t12.5 -153.5q0 -117 -68.5 -166t-210.5 -49h-485q0 -174 35 -269.5t89 -124t148 -28.5q233 0 471 35v-62q-213 -61 -471 -57q-205 2 -280.5 124t-75.5 435z M211 578h485q94 0 144.5 26.5t50.5 106.5q0 102 -16.5 162.5t-61.5 91t-99.5 39t-152.5 8.5q-111 0 -169 -12.5t-104 -57.5t-61.5 -129.5t-15.5 -234.5zM535 1214l237 273h100l-272 -273h-65z" /> +<glyph unicode="ê" horiz-adv-x="1075" d="M127 549q0 180 22.5 288.5t79 166t130 75t202.5 17.5q72 0 118 -4.5t99 -16.5t85 -37.5t59.5 -66.5t40 -106.5t12.5 -153.5q0 -117 -68.5 -166t-210.5 -49h-485q0 -174 35 -269.5t89 -124t148 -28.5q233 0 471 35v-62q-213 -61 -471 -57q-205 2 -280.5 124t-75.5 435z M211 578h485q94 0 144.5 26.5t50.5 106.5q0 102 -16.5 162.5t-61.5 91t-99.5 39t-152.5 8.5q-111 0 -169 -12.5t-104 -57.5t-61.5 -129.5t-15.5 -234.5zM272 1214l260 267h76l236 -267h-74l-201 205l-223 -205h-74z" /> +<glyph unicode="ë" horiz-adv-x="1075" d="M127 549q0 180 22.5 288.5t79 166t130 75t202.5 17.5q72 0 118 -4.5t99 -16.5t85 -37.5t59.5 -66.5t40 -106.5t12.5 -153.5q0 -117 -68.5 -166t-210.5 -49h-485q0 -174 35 -269.5t89 -124t148 -28.5q233 0 471 35v-62q-213 -61 -471 -57q-205 2 -280.5 124t-75.5 435z M211 578h485q94 0 144.5 26.5t50.5 106.5q0 102 -16.5 162.5t-61.5 91t-99.5 39t-152.5 8.5q-111 0 -169 -12.5t-104 -57.5t-61.5 -129.5t-15.5 -234.5zM246 1318.5q0 24.5 16.5 41t41 16.5t41.5 -16.5t17 -41t-17 -41.5t-41.5 -17t-41 17t-16.5 41.5zM766 1318.5 q0 24.5 17.5 41t42 16.5t42 -16.5t17.5 -41t-17.5 -41.5t-42 -17t-42 17t-17.5 41.5z" /> +<glyph unicode="î" horiz-adv-x="385" d="M-92 1221l260 266h76l235 -266h-73l-201 204l-223 -204h-74zM152 0v1087h84v-1087h-84z" /> +<glyph unicode="ï" horiz-adv-x="385" d="M-125 1280q0 25 16.5 41t41 16t42 -16t17.5 -41t-17.5 -42t-42 -17t-41 17t-16.5 42zM152 0v1087h84v-1087h-84zM395 1280q0 25 17.5 41t42 16t42 -16t17.5 -41t-17.5 -42t-42 -17t-42 17t-17.5 42z" /> +<glyph unicode="ô" horiz-adv-x="1169" d="M127 528q0 328 100.5 449t356.5 121q262 0 361 -130t99 -440q0 -301 -99 -419.5t-361 -118.5q-266 0 -361.5 119.5t-95.5 418.5zM211 528q0 -150 22.5 -242.5t74.5 -138t112.5 -59.5t163 -14t165 15t114.5 62.5t75 139.5t23 237q0 158 -23 256.5t-75 147.5t-114.5 65.5 t-165 16.5t-162 -13.5t-112.5 -61.5t-75.5 -147.5t-22.5 -263.5zM303 1221l260 266h76l235 -266h-73l-201 204l-223 -204h-74z" /> +<glyph unicode="ù" horiz-adv-x="1124" d="M127 332v758h84v-758q0 -117 68.5 -190.5t183.5 -73.5q123 0 212 27.5t216 92.5v902h84v-1088h-55l-29 127q-231 -145 -428 -145q-156 0 -246 102.5t-90 245.5zM252 1493h100l238 -272h-66z" /> +<glyph unicode="û" horiz-adv-x="1124" d="M127 332v758h84v-758q0 -117 68.5 -190.5t183.5 -73.5q123 0 212 27.5t216 92.5v902h84v-1088h-55l-29 127q-231 -145 -428 -145q-156 0 -246 102.5t-90 245.5zM266 1221l260 266h76l236 -266h-74l-201 204l-223 -204h-74z" /> +<glyph unicode="ü" horiz-adv-x="1124" d="M127 332v758h84v-758q0 -117 68.5 -190.5t183.5 -73.5q123 0 212 27.5t216 92.5v902h84v-1088h-55l-29 127q-231 -145 -428 -145q-156 0 -246 102.5t-90 245.5zM231 1280q0 25 16.5 41t41 16t42 -16t17.5 -41t-17.5 -42t-42 -17t-41 17t-16.5 42zM752 1280q0 25 17 41 t42 16t42 -16t17 -41t-17 -42t-42 -17t-42 17t-17 42z" /> +<glyph unicode="ÿ" horiz-adv-x="1099" d="M53 1087h90l291 -849q29 -80 74 -117t77 -35l31 2l338 999h90l-477 -1431l-114 -209h-50l185 553q-174 8 -242 225zM229 1280q0 25 16.5 41t41 16t42 -16t17.5 -41t-17.5 -42t-42 -17t-41 17t-16.5 42zM750 1280q0 25 17 41t42 16t42 -16t17 -41t-17 -42t-42 -17t-42 17 t-17 42z" /> +<glyph unicode="Œ" horiz-adv-x="2158" d="M164 739q0 207 26.5 349.5t68.5 225.5t118 127t151.5 56t194.5 12q197 0 309.5 -48t171.5 -197q8 125 78 182t174 53l582 -24v-60h-582q-174 0 -174 -182q-2 -346 0 -447l674 -14v-59l-674 -15v-446q0 -57 16.5 -95t47 -53.5t59.5 -20.5t72 -5h561v-60l-561 -24 q-119 -6 -192 44t-83 191q-59 -141 -170.5 -189t-308.5 -48q-102 0 -170 8t-137.5 33.5t-111.5 76t-76.5 132.5t-49 204.5t-14.5 292.5zM248 739q0 -219 22.5 -349t84 -200.5t143.5 -92t225 -21.5q115 0 190.5 16.5t134 58.5t89 119.5t46 193.5t15.5 288q0 154 -12 264 t-41 185t-63.5 120t-94 67.5t-117 29.5t-147.5 7q-76 0 -120 -3t-101.5 -17t-90 -41t-68.5 -76t-53.5 -121.5t-29.5 -180.5t-12 -247z" /> +<glyph unicode="œ" horiz-adv-x="1908" d="M127 528q0 328 100.5 449t356.5 121q172 0 270 -56.5t141 -175.5q37 139 127 184.5t273 45.5q72 0 118 -4.5t99 -16.5t85 -37.5t59.5 -66.5t39.5 -106.5t12 -153.5q0 -117 -68.5 -166t-209.5 -49h-486q-2 -248 64 -335t209 -87q233 0 471 35v-62q-213 -61 -471 -57 q-135 2 -211 54t-109 169q-43 -121 -140 -172t-273 -51q-266 0 -361.5 119.5t-95.5 418.5zM211 528q0 -150 22.5 -242.5t74.5 -138t112.5 -59.5t163.5 -14q143 0 219 34.5t115.5 135t39.5 291.5q0 150 -22.5 246t-72.5 146t-114.5 68.5t-164.5 18.5q-102 0 -162 -13.5 t-113 -61.5t-75.5 -147.5t-22.5 -263.5zM1044 578h486q94 0 144 26.5t50 106.5q0 102 -16 162.5t-61 91t-99.5 39t-152.5 8.5q-145 0 -214 -28t-104 -120.5t-33 -285.5z" /> +<glyph unicode="Ÿ" horiz-adv-x="1273" d="M115 1499h92l440 -864l479 864h95l-533 -967v-532h-84v532zM348 1691.5q0 24.5 16.5 41t41 16.5t42 -16.5t17.5 -41t-17.5 -42t-42 -17.5t-41 17.5t-16.5 42zM868 1691.5q0 24.5 17.5 41t42 16.5t42 -16.5t17.5 -41t-17.5 -42t-42 -17.5t-42 17.5t-17.5 42z" /> +<glyph unicode="ˆ" horiz-adv-x="821" d="M127 1087l260 267h76l235 -267h-73l-201 205l-223 -205h-74z" /> +<glyph unicode="˚" horiz-adv-x="667" d="M127 1294q0 88 61.5 149.5t147.5 61.5t145.5 -61.5t59.5 -149.5t-59.5 -148.5t-145.5 -60.5t-147.5 60.5t-61.5 148.5zM178 1294q0 -63 46 -109t112 -46q63 0 108 45t45 110.5t-45 111.5t-108 46q-66 0 -112 -46t-46 -112z" /> +<glyph unicode="˜" horiz-adv-x="944" d="M127 1171q49 41 75.5 62.5t68.5 41t81 19.5q47 -2 132 -62.5t114 -60.5q16 0 35.5 5.5t34 11.5t36 18.5t30.5 19.5t33 23.5t28 18.5l24 -39q-49 -45 -71.5 -63.5t-67.5 -41t-84 -22.5q-51 2 -132 62.5t-114 60.5q-29 0 -57.5 -9.5t-45 -18.5t-50 -31.5t-50.5 -32.5z" /> +<glyph unicode=" " horiz-adv-x="952" /> +<glyph unicode=" " horiz-adv-x="1905" /> +<glyph unicode=" " horiz-adv-x="952" /> +<glyph unicode=" " horiz-adv-x="1905" /> +<glyph unicode=" " horiz-adv-x="635" /> +<glyph unicode=" " horiz-adv-x="476" /> +<glyph unicode=" " horiz-adv-x="317" /> +<glyph unicode=" " horiz-adv-x="317" /> +<glyph unicode=" " horiz-adv-x="238" /> +<glyph unicode=" " horiz-adv-x="381" /> +<glyph unicode=" " horiz-adv-x="105" /> +<glyph unicode="‐" horiz-adv-x="702" d="M51 553v82h602v-82h-602z" /> +<glyph unicode="‑" horiz-adv-x="702" d="M51 553v82h602v-82h-602z" /> +<glyph unicode="‒" horiz-adv-x="702" d="M51 553v82h602v-82h-602z" /> +<glyph unicode="–" horiz-adv-x="1069" d="M51 545v86h969v-86h-969z" /> +<glyph unicode="—" horiz-adv-x="1525" d="M51 549v86h1426v-86h-1426z" /> +<glyph unicode="‘" horiz-adv-x="415" d="M143 1184v209q0 110 94 113q29 -2 29 -3v-33q-49 2 -49 -51v-67h19q39 0 38 -41v-127q0 -43 -38 -43h-56q-37 0 -37 43z" /> +<glyph unicode="’" horiz-adv-x="415" d="M143 1335v129q0 41 41 41h54q39 0 38 -41l-2 -211q0 -110 -93 -113q-29 2 -29 3v35q49 -2 49 49v69h-19q-39 0 -39 39z" /> +<glyph unicode="‚" horiz-adv-x="415" d="M143 39v127q0 43 39 43h56q37 0 36 -43v-211q0 -110 -93 -113l-29 2v35q49 -2 49 49v72h-19q-39 0 -39 39z" /> +<glyph unicode="“" horiz-adv-x="634" d="M131 1184v209q0 110 94 113q29 -2 29 -3v-33q-49 2 -49 -51v-67h16q16 0 28.5 -11.5t12.5 -29.5v-127q0 -43 -41 -43h-53q-37 0 -37 43zM373 1184v209q0 111 96 113q29 -2 29 -3v-33q-49 2 -49 -51v-67h18q39 0 39 -41v-127q0 -43 -39 -43h-53q-41 0 -41 43z" /> +<glyph unicode="”" horiz-adv-x="632" d="M131 1335v129q0 41 39 41h53q39 0 39 -41v-211q0 -110 -94 -113q-29 2 -29 3v35q47 -2 47 49v69h-16q-39 0 -39 39zM373 1335v129q0 41 41 41h55q37 0 37 -41v-211q0 -111 -96 -113q-29 2 -29 3v35q51 -2 51 49v69h-18q-41 0 -41 39z" /> +<glyph unicode="„" horiz-adv-x="632" d="M131 41v127q0 43 39 43h53q39 0 39 -43v-209q0 -110 -94 -113l-29 2v33q47 -2 47 51v70h-16q-39 0 -39 39zM373 41v127q0 43 41 43h55q37 0 37 -43v-209q0 -111 -96 -113l-29 2v33q51 -2 51 51v70h-18q-41 0 -41 39z" /> +<glyph unicode="…" horiz-adv-x="1658" d="M205 33v123q0 33 35 32h51q33 0 33 -32v-123q0 -33 -33 -33h-51q-14 0 -24.5 9.5t-10.5 23.5zM762 33v123q0 33 35 32h51q33 0 33 -32v-123q0 -33 -33 -33h-51q-14 0 -24.5 9.5t-10.5 23.5zM1319 33v123q0 33 35 32h51q33 0 33 -32v-123q0 -33 -33 -33h-51 q-14 0 -24.5 9.5t-10.5 23.5z" /> +<glyph unicode=" " horiz-adv-x="381" /> +<glyph unicode="‹" horiz-adv-x="727" d="M127 725l422 416l57 -58l-364 -358l376 -367l-61 -59z" /> +<glyph unicode="›" horiz-adv-x="727" d="M127 358l373 367l-365 358l62 58l421 -416l-434 -426z" /> +<glyph unicode=" " horiz-adv-x="476" /> +<glyph unicode="€" horiz-adv-x="1228" d="M51 545v51l180 10v260l-180 11v47l180 12v17q0 51 1 83.5t10.5 97t26 109.5t51 100.5t85 90t129 58.5t177.5 24q207 0 460 -48v-61q-33 2 -86 7t-176 11.5t-198 6.5q-104 0 -178 -28t-116 -70t-65.5 -110.5t-30 -133t-6.5 -154.5l547 -10v-49l-547 -11v-260l547 -10v-51 q-35 0 -92 -1t-178 -3t-200 -3t-77 -3q-4 -209 103.5 -335t292.5 -128q96 -2 212.5 5t186.5 15l70 8v-59q-215 -53 -469 -53q-55 0 -111.5 11t-125 48t-120 94.5t-87.5 159.5t-36 234z" /> +<glyph unicode="™" horiz-adv-x="1431" d="M51 1436v63h531v-63h-234v-652h-63v652h-234zM662 784l55 715h57l262 -606l236 606h61l64 -715h-62l-51 570l-221 -570h-51l-246 572l-43 -572h-61z" /> +<glyph unicode="" horiz-adv-x="1085" d="M0 1085h1085v-1085h-1085v1085z" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-ExtraLight-webfont.ttf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-ExtraLight-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..26d0c89f742458e18413ecc8af29ae8ef853d157 Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-ExtraLight-webfont.ttf differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-ExtraLight-webfont.woff b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-ExtraLight-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..3bdb5b987ff0b0bc7e4f4e88b8b27e83665378d6 Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-ExtraLight-webfont.woff differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Light-Italic-webfont.eot b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Light-Italic-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..59a745fee582bc605944ba5623087b778175d8b7 Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Light-Italic-webfont.eot differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Light-Italic-webfont.svg b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Light-Italic-webfont.svg new file mode 100644 index 0000000000000000000000000000000000000000..7308192a6b2dcd9f2ffabe13a0ff9b061a225168 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Light-Italic-webfont.svg @@ -0,0 +1,187 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Copyright c 2011 Natanael Gama exondiscoveredcom with Reserved Font Name Exo +Designer : Natanael Gama +</metadata> +<defs> +<font id="ExoLightItalic" horiz-adv-x="1359" > +<font-face units-per-em="2048" ascent="1638" descent="-410" /> +<missing-glyph horiz-adv-x="499" /> +<glyph unicode=" " horiz-adv-x="499" /> +<glyph unicode="	" horiz-adv-x="499" /> +<glyph unicode=" " horiz-adv-x="499" /> +<glyph unicode="!" horiz-adv-x="522" d="M174 39l19 121q6 43 47 43h84q41 0 32 -43l-18 -121q-6 -39 -45 -39h-84q-41 0 -35 39zM252 408l160 1089h137l-187 -1089h-110z" /> +<glyph unicode=""" horiz-adv-x="714" d="M319 1087l25 275l23 137h118l-22 -137l-62 -275h-82zM573 1087l23 275l22 137h121l-22 -137l-62 -275h-82z" /> +<glyph unicode="#" horiz-adv-x="1368" d="M115 487l24 80h340l115 365h-340l29 80h335l156 487h80l-156 -487h355l151 487h80l-151 -487h362l-29 -80h-362l-115 -367h363l-25 -80h-362l-156 -485h-80l156 485l-355 2l-153 -487h-80l156 487h-338zM557 567l352 -2l115 367h-352z" /> +<glyph unicode="$" horiz-adv-x="1175" d="M164 29l14 82q20 0 110.5 -4.5t187.5 -6.5t181 -2q51 0 98.5 9.5t97.5 32t85 68.5t45 111l21 140q18 119 -12.5 168t-160.5 49h-247q-104 0 -175 31.5t-98.5 81t-38 108.5t3.5 115l21 135q35 207 148.5 284.5t310.5 79.5l28 177h90l-26 -181q72 -6 217 -22.5t158 -18.5 l-15 -90l-456 21q-143 4 -228.5 -49.5t-107.5 -200.5l-23 -135q-18 -119 30 -168t179 -49h248q100 0 163.5 -29t87 -76t30 -107.5t-8.5 -123.5l-22 -140q-55 -356 -494 -335l-26 -166h-93l29 174q-264 23 -352 37z" /> +<glyph unicode="%" horiz-adv-x="1984" d="M236 971l43 272q20 137 83.5 196.5t221.5 59.5h207q139 0 189 -59.5t30 -196.5l-43 -272q-23 -143 -85.5 -199.5t-215.5 -56.5h-207q-262 0 -223 256zM336 971q-14 -92 15.5 -124t119.5 -32h207q98 0 137 31t53 125l41 272q16 94 -9.5 126t-123.5 32h-207q-98 0 -137 -33 t-55 -125zM461 0l1134 1499h113l-1135 -1499h-112zM1167 258l43 272q20 137 84 196.5t219 59.5h207q139 0 190.5 -59t31.5 -197l-44 -272q-23 -143 -86 -199.5t-217 -56.5h-206q-261 0 -222 256zM1268 258q-14 -92 15.5 -125t119.5 -33h207q96 0 136 32t54 126l43 272 q14 92 -12.5 124t-124.5 32h-207q-98 0 -136 -31.5t-52 -124.5z" /> +<glyph unicode="&" horiz-adv-x="1323" d="M143 473.5q45 155.5 207 276.5l195 149l-101 174q-68 117 -47 206t88.5 143.5t155.5 66.5q260 29 555 -25l-12 -75h-422q-109 0 -174.5 -29t-83 -91.5t42.5 -164.5l411 -711l306 266l36 -32l-151 -217l-131 -117l174 -293h-121l-135 227l-156 -137q-82 -72 -193.5 -93.5 t-221 21t-175.5 146.5q-92 154 -47 309.5zM250 440.5q-33 -117.5 37 -215.5q68 -104 190.5 -121.5t227.5 70.5l174 150l-277 473l-178 -135q-141 -104 -174 -221.5z" /> +<glyph unicode="'" horiz-adv-x="344" d="M266 1087l25 275l22 137h119l-22 -137l-62 -275h-82z" /> +<glyph unicode="(" horiz-adv-x="645" d="M235 454q2 132 25 261q29 168 89.5 342t127 302t129 232.5t103.5 157.5l41 53h137q-16 -20 -44 -57t-102.5 -154.5t-138 -238.5t-129 -298t-96.5 -345q-33 -193 -28 -360t35 -303t64.5 -232.5t63.5 -149.5l29 -53h-129q-6 10 -14.5 28.5t-34 79t-46 127t-42 168t-32 205 t-8.5 235.5z" /> +<glyph unicode=")" horiz-adv-x="647" d="M-27 -389q16 18 44 54t103 151.5t138.5 236.5t130 299t96.5 353q31 188 26 353t-35 301t-64.5 235.5t-62.5 153.5l-27 54h127q6 -10 14 -29.5t32.5 -82t45 -130t42 -170t33 -205t9.5 -230.5t-23 -253q-31 -176 -92 -353t-127 -305t-128 -229.5t-102 -152.5l-40 -51h-140z " /> +<glyph unicode="*" horiz-adv-x="929" d="M285 1178l10 63l293 43l-10 -119zM381 844l98 276l113 -26l-156 -269zM588 987l80 100l202 -180l-43 -51zM598 1473l66 24l110 -246l-117 -49zM702 1157l267 160l22 -55l-225 -195z" /> +<glyph unicode="+" horiz-adv-x="1060" d="M205 670l18 118h357l55 357h119l-58 -357h359l-19 -118h-358l-57 -357h-117l57 357h-356z" /> +<glyph unicode="," horiz-adv-x="481" d="M145 -166l7 47q53 -2 63 53l10 66h-20q-41 0 -35 43l18 117q6 45 50 45h77q41 0 33 -45l-31 -201q-10 -70 -53 -100.5t-81 -27.5z" /> +<glyph unicode="-" horiz-adv-x="710" d="M123 535l18 118h623l-19 -118h-622z" /> +<glyph unicode="." horiz-adv-x="487" d="M168 39l20 121q4 43 48 43h79q43 0 37 -43l-20 -121q-6 -39 -47 -39h-80q-41 0 -37 39z" /> +<glyph unicode="/" horiz-adv-x="745" d="M16 -147l848 1724h123l-848 -1724h-123z" /> +<glyph unicode="0" horiz-adv-x="1318" d="M195 332l133 835q53 332 403 332h316q174 0 243.5 -95t46.5 -237l-133 -835q-29 -176 -128 -254t-267 -78h-315q-154 0 -240 80t-59 252zM311 332q-20 -127 34 -170t167 -43h315q223 0 260 213l134 835q16 109 -27 161t-166 52h-315q-233 0 -267 -213z" /> +<glyph unicode="1" horiz-adv-x="768" d="M274 1237l15 84q182 0 383 162l20 16h115l-234 -1499h-118l215 1348q-53 -39 -159 -75t-237 -36z" /> +<glyph unicode="2" horiz-adv-x="1204" d="M96 0l19 109q981 631 1038 983q49 309 -254 309h-596l14 84q279 35 609 35q201 0 284.5 -122t61.5 -311q-12 -106 -99.5 -237t-194 -236.5t-246.5 -219t-221 -171t-155 -104.5h756l-18 -119h-998z" /> +<glyph unicode="3" horiz-adv-x="1206" d="M80 31l12 75h594q102 0 185 54.5t104 173.5l18 121q12 74 -1 122t-49 69.5t-70.5 29.5t-86.5 10l-475 14l17 88l479 19q115 4 190.5 60.5t92.5 158.5l20 141q37 217 -209 217h-618l10 74q182 53 641 45q156 -2 236.5 -97t58.5 -241l-23 -141q-20 -123 -83.5 -193.5 t-133.5 -85.5q66 -29 106 -102.5t21 -191.5l-20 -121q-53 -344 -418 -344q-166 0 -238.5 1t-183 11t-176.5 33z" /> +<glyph unicode="4" horiz-adv-x="1212" d="M113 467l811 1032h145l-764 -977h635l70 445l86 153h59l-94 -598h184l-14 -90l-189 -33l-63 -395h-121l62 395h-764z" /> +<glyph unicode="5" horiz-adv-x="1249" d="M162 31l14 84h617q102 0 171.5 66.5t84.5 160.5l34 211q39 233 -176 233h-311q-80 0 -149.5 -52t-81.5 -136h-111l188 901h867l-21 -119h-753l-117 -563q74 82 211 88q74 2 116.5 2t100 -2t76.5 -2q152 0 226.5 -96t51.5 -250l-33 -219q-55 -344 -389 -348 q-378 0 -616 41z" /> +<glyph unicode="6" horiz-adv-x="1280" d="M254 786q59 375 188 550t279 175q365 0 592 -32l-13 -86h-577q-72 0 -134.5 -60.5t-103.5 -154t-67.5 -182.5t-38.5 -171q303 35 551 35q98 2 163.5 -26.5t90 -73.5t35 -99.5t-1.5 -103.5l-39 -254q-27 -164 -121 -233.5t-248 -69.5h-287q-393 0 -268 786zM365 743 q-98 -631 167 -630h285q213 0 244 196l39 244q18 111 -26 150.5t-159 39.5h-550z" /> +<glyph unicode="7" horiz-adv-x="1114" d="M274 1380l19 119h926l34 -82l-747 -1417h-139l733 1380h-826z" /> +<glyph unicode="8" horiz-adv-x="1300" d="M197 251.5q0 30.5 6 63.5l30 201q16 106 85 165.5t149 66.5q-100 27 -134 107.5t-20 170.5l23 133q31 197 131 273.5t281 76.5h278q160 0 233.5 -92t47.5 -266l-23 -133q-8 -70 -62.5 -146.5t-146.5 -91.5q82 -27 114 -102.5t15 -161.5l-30 -201q-16 -100 -56.5 -167.5 t-97.5 -97.5t-109.5 -40t-117.5 -10h-277q-98 0 -165.5 26.5t-98.5 61.5t-43 84t-12 79.5zM319 309q-16 -104 38.5 -147t179.5 -43h270q86 0 158.5 45t87.5 145l34 215q16 102 -37 142.5t-139 40.5h-307q-86 0 -160.5 -43t-89.5 -140zM430 1012q-18 -106 41 -147.5 t150 -41.5h305q113 0 169 56.5t70 132.5l23 139q20 135 -23 188.5t-159 53.5h-277q-137 0 -198.5 -56.5t-79.5 -185.5z" /> +<glyph unicode="9" horiz-adv-x="1280" d="M176 29l14 86h576q74 0 136.5 59t103.5 154.5t66.5 182.5t39.5 171q-303 -35 -557 -35q-98 -2 -162.5 28t-89 75t-34 99t2.5 103l41 256q47 299 377 299h281q391 0 266 -792q-59 -375 -188 -547t-279 -172q-404 0 -594 33zM389 950q-16 -111 30 -148.5t159 -37.5h548 q98 631 -165 631h-287q-217 0 -248 -197z" /> +<glyph unicode=":" horiz-adv-x="491" d="M172 39l18 121q6 43 50 43h79q45 0 35 -43l-18 -121q-8 -39 -47 -39h-82q-16 0 -26.5 11.5t-8.5 27.5zM309 926l19 121q6 41 49 40h80q45 0 35 -40l-19 -121q-6 -39 -49 -39h-80q-41 0 -35 39z" /> +<glyph unicode=";" horiz-adv-x="489" d="M145 -166l7 47q53 -2 63 53l10 66h-20q-16 0 -27.5 13.5t-7.5 29.5l18 117q2 18 16.5 31.5t33.5 13.5h77q41 0 33 -45l-31 -201q-10 -70 -53 -100.5t-81 -27.5zM311 926l21 121q4 43 47 43h80q43 0 37 -43l-21 -121q-6 -39 -47 -39h-80q-41 0 -37 39z" /> +<glyph unicode="<" horiz-adv-x="968" d="M203 664l20 122l803 353l-20 -127l-658 -293l561 -313l-18 -119z" /> +<glyph unicode="=" horiz-adv-x="952" d="M109 434l20 119h875l-21 -119h-874zM180 897l21 117h874l-20 -117h-875z" /> +<glyph unicode=">" horiz-adv-x="970" d="M147 287l21 131l670 309l-576 301l21 111l690 -353l-19 -122z" /> +<glyph unicode="?" horiz-adv-x="1105" d="M256 1401l14 78q328 41 557 34q207 0 294 -104t59 -274l-33 -207q-33 -213 -175.5 -284t-387.5 -38l-18 -101q-17 -101 -15 -106h-121l47 306q176 -4 264 0q113 2 193 56t96 167l33 207q23 145 -37.5 205.5t-228.5 60.5h-541zM356 39l19 121q6 43 47 43h80q43 0 37 -43 l-19 -121q-8 -39 -49 -39h-80q-41 0 -35 39z" /> +<glyph unicode="@" horiz-adv-x="1798" d="M131 18l166 1049q59 365 420 365h768q168 0 240.5 -94.5t46.5 -270.5l-109 -725q-6 -39 -12 -69.5t-30 -85t-57.5 -90.5t-98 -63.5t-148.5 -27.5h-94l-31 123q-49 -55 -147.5 -95t-204.5 -42q-190 -4 -275.5 121t-36.5 450q25 162 76 275.5t115.5 170t124 80t125.5 25.5 q131 4 262 -26.5t203 -100.5l-127 -864q43 0 74.5 6t67.5 26.5t60.5 67.5t34.5 119l111 725q4 57 6 98t-13.5 68t-28.5 43t-40 24.5t-48.5 10.5t-53.5 2h-777q-74 0 -130 -23.5t-86.5 -63.5t-46 -78t-23.5 -81l-164 -1049q-20 -121 29 -194.5t174 -73.5h788l-12 -74 q-215 -43 -596 -43h-201q-158 0 -243 109.5t-58 275.5zM637.5 265q21.5 -91 66 -122.5t130.5 -31.5q199 -8 368 122l109 715q-143 53 -334 49q-279 -6 -336 -477q-25 -164 -3.5 -255z" /> +<glyph unicode="A" horiz-adv-x="1339" d="M92 0l793 1499h123l292 -1499h-118l-88 451h-633l-238 -451h-131zM524 569h547l-145 772z" /> +<glyph unicode="B" horiz-adv-x="1216" d="M164 0l237 1499h560q207 1 279 -109q55 -83 55 -198q0 -36 -5 -76q-18 -141 -93 -227t-175 -109q68 -12 127 -114q43 -74 43 -176q0 -38 -6 -80q-51 -410 -463 -410h-559zM303 119h438q279 0 328 301q5 32 5 61q0 90 -46 158q-60 88 -184 88h-6h-441zM418 844h440 q125 0 208 70.5t105 203.5q8 47 8 85q-1 84 -41 122q-60 55 -194 55h-442z" /> +<glyph unicode="C" horiz-adv-x="1173" d="M217 480q-2 30 -2 60q0 110 23 220q31 193 71.5 321.5t109 232t176 153t257.5 49.5q174 0 473 -58l-14 -90q-223 29 -423 29h-48q-53 0 -92 -6.5t-90.5 -27t-91.5 -64.5t-81 -112.5t-74.5 -179t-56.5 -257.5q-20 -124 -20 -226q0 -140 38 -239q64 -170 255 -179 q28 -1 64 -1q149 0 427 20l-12 -90q-190 -47 -488 -47q-139 0 -231 67.5t-127 176t-43 248.5z" /> +<glyph unicode="D" d="M164 0l237 1497q0 2 545 2q131 0 223.5 -54t136.5 -135q44 -80 61 -188q14 -87 14 -165q0 -19 -1 -37q-4 -94 -20 -183q-133 -737 -647 -737h-549zM301 123h428q109 0 200 53t152.5 144.5t101.5 198t60 226.5q20 127 20 229q-1 158 -49 252q-80 154 -288 154h-426z" /> +<glyph unicode="E" horiz-adv-x="1157" d="M201 256l155 981q43 262 283 262h18l631 -29l-14 -90h-635q-143 0 -164 -147l-69 -428l692 -17l-15 -90l-696 -18l-68 -428q-4 -22 -4 -41q-1 -22 5 -38q10 -30 34.5 -43t46 -16t58.5 -3h614l-14 -86l-621 -31q-10 -1 -20 -1q-102 -1 -168 57q-54 47 -55 141q0 30 6 65z " /> +<glyph unicode="F" horiz-adv-x="1153" d="M164 0l194 1231q41 268 282 268h19l631 -29l-14 -90h-637q-78 0 -115 -36.5t-49 -110.5l-65 -428l690 -17l-15 -90l-696 -18l-106 -680h-119z" /> +<glyph unicode="G" horiz-adv-x="1267" d="M222 480q-1 21 -1 41q0 118 25 237q25 147 52.5 254.5t73.5 207t108.5 161t154.5 97t211 35.5h21q165 0 462 -57l-12 -94q-219 31 -486 35q-63 0 -114 -12.5t-107.5 -53.5t-98.5 -109.5t-81 -188.5t-63 -283q-22 -141 -22 -253q0 -134 32 -227q58 -166 246 -166h4 q72 0 179 28t180 55l73 28l78 461h-377l14 80q156 41 361 41q63 0 137 -6l-125 -791h-86l-14 115q-55 -43 -186.5 -85t-246.5 -42q-141 0 -232 67.5t-123 177t-37 247.5z" /> +<glyph unicode="H" horiz-adv-x="1308" d="M174 0l238 1499h116l-112 -715h776l115 715h118l-237 -1499h-119l107 666h-779l-106 -666h-117z" /> +<glyph unicode="I" horiz-adv-x="438" d="M184 0l238 1499h119l-238 -1499h-119z" /> +<glyph unicode="J" horiz-adv-x="708" d="M78 43l22 84q47 -12 83 -19.5t85 -11.5q12 -1 23 -1q35 0 63 9q37 13 74 37.5t62.5 74.5t37.5 122l185 1161h116l-184 -1161q-35 -229 -153 -301q-81 -49 -203 -49h-10q-129 2 -201 55z" /> +<glyph unicode="K" horiz-adv-x="1140" d="M164 0l237 1499h119l-110 -688h223l575 688h148l-623 -754l385 -745h-141l-354 692h-230l-110 -692h-119z" /> +<glyph unicode="L" horiz-adv-x="1101" d="M203 258l198 1241h117l-199 -1241q-4 -21 -4 -40q-1 -22 5 -38q10 -30 35.5 -42.5t47 -15.5t58.5 -3h606l-18 -119h-605q-120 0 -192 58q-54 44 -55 136q0 30 6 64z" /> +<glyph unicode="M" horiz-adv-x="1619" d="M145 0l359 1499h153l211 -1302l611 1302h166l-105 -1499h-119l95 1296l-611 -1296h-123l-207 1290l-311 -1290h-119z" /> +<glyph unicode="N" horiz-adv-x="1339" d="M164 0l237 1499h115l606 -1280l205 1280h117l-238 -1499h-112l-609 1282l-202 -1282h-119z" /> +<glyph unicode="O" horiz-adv-x="1376" d="M209 450q2 124 29 293q33 207 81 349.5t102 224.5t137 125t161 55t199 12q96 0 164.5 -10t134 -37.5t103.5 -82t62 -138.5q23 -78 23 -192v-19q-2 -127 -29 -295q-23 -141 -52.5 -249.5t-63 -186.5t-80.5 -133t-94.5 -89t-113 -53.5t-127 -25.5t-145.5 -6q-96 0 -161.5 8 t-134 34.5t-106.5 78t-64 132.5q-25 75 -25 188v17zM348 278q20 -70 71.5 -106.5t116 -48.5t171.5 -12q127 0 207.5 22.5t151.5 88t116 191.5t78 326q20 133 25 235q2 42 2 78q0 52 -4 92q-7 68 -32.5 115.5t-53.5 74t-79 39.5t-93 16.5t-114 3.5q-74 0 -115.5 -3.5 t-100 -15.5t-92.5 -37.5t-76 -71.5t-69.5 -116t-55.5 -172.5t-48 -237.5q-27 -165 -26 -275q0 -115 20 -186z" /> +<glyph unicode="P" horiz-adv-x="1210" d="M154 0l237 1499h606q147 0 237 -95q65 -69 65 -214q0 -53 -9 -117q-14 -92 -37.5 -164.5t-49 -119t-63.5 -79t-67 -49t-74 -24.5t-69.5 -9t-69.5 -1q-61 0 -268 13t-215 17l-107 -657h-116zM389 745h488q53 0 93 11.5t82 43t71.5 100.5t45.5 173q7 72 9 122v12 q0 42 -16 72q-18 34 -33 54.5t-44.5 30.5t-52 13t-53.5 3h-490z" /> +<glyph unicode="Q" horiz-adv-x="1386" d="M217 450q2 125 29 293q33 207 81 349.5t102 224.5t137 125t161 55t199 12q96 0 164.5 -10t134 -37.5t103.5 -82t62 -138.5q23 -78 23 -192v-19q-2 -127 -29 -295q-23 -141 -52 -249.5t-63 -186.5t-81 -133t-94 -89t-113 -53.5t-127 -25.5t-145 -6q-96 0 -162 8 t-134.5 34.5t-106.5 78t-64 132.5q-25 75 -25 188v17zM356 278q19 -69 71 -106t116.5 -49t171.5 -12q127 0 208 22.5t151.5 88t115.5 191.5t78 326q20 133 25 235q2 42 2 78q0 52 -4 92q-7 68 -32.5 115.5t-53 74t-79 39.5t-93.5 16.5t-113 3.5q-74 0 -116 -3.5 t-100.5 -15.5t-92 -37.5t-75.5 -71.5t-70 -116t-56 -172.5t-48 -237.5q-27 -165 -27 -275q0 -114 21 -186zM639 -68h82q71 -96 194 -96q65 0 144 27l-21 -127q-72 -20 -146 -20q-13 0 -26 1q-88 4 -156.5 62.5t-70.5 152.5z" /> +<glyph unicode="R" horiz-adv-x="1249" d="M154 0l237 1499h615q288 0 288 -326q0 -53 -8 -114q-47 -406 -346 -426l219 -633h-129l-209 623q-27 0 -235.5 11t-210.5 13l-105 -647h-116zM391 745h488q254 0 288 318q9 51 9 93q0 28 -4 50q-9 58 -20 91.5t-40 52t-56.5 24.5t-68.5 6h-495z" /> +<glyph unicode="S" horiz-adv-x="1165" d="M162 27l14 92q141 -16 498 -17q291 0 325 217l23 140q5 35 5 65q1 63 -23 99q-34 53 -156 53h-266q-115 0 -186.5 30.5t-96.5 80t-32 108.5q-2 20 -2 39q0 40 9 80l21 135q18 113 60 188.5t106.5 112.5t133.5 50q60 11 137 12q12 0 24 -1q217 -4 483 -45l-14 -90l-490 17 q-15 1 -29 1q-122 0 -192 -46q-78 -52 -100 -201l-23 -135q-6 -35 -6 -64.5t3 -51.5t13.5 -38t18.5 -26.5t26.5 -17.5t32 -11t38 -6t39.5 -2h44h266q280 0 280 -252q0 -41 -7 -88l-23 -140q-16 -109 -64 -179t-120 -101t-134.5 -41t-144.5 -10q-96 0 -260.5 15.5 t-230.5 27.5z" /> +<glyph unicode="T" horiz-adv-x="1220" d="M285 1380l18 119h1061l-18 -119h-478l-219 -1380h-117l218 1380h-465z" /> +<glyph unicode="U" d="M244 400q2 100 18 231l137 868h121l-139 -868q-17 -115 -19 -200v-15q0 -76 14 -128q16 -58 41 -94t71.5 -54.5t94.5 -26t117 -7.5q106 0 180 22t139.5 77t107.5 160.5t69 265.5l137 868h119l-137 -868q-27 -164 -68 -276.5t-111.5 -197.5t-179 -126t-262.5 -41 q-84 0 -148.5 11t-122.5 38t-94 74q-35 47 -61 117q-24 65 -24 156v14z" /> +<glyph unicode="V" horiz-adv-x="1370" d="M307 1499h125l254 -1319l694 1319h136l-793 -1499h-123z" /> +<glyph unicode="W" horiz-adv-x="2035" d="M307 1499h119l256 -1317l686 1317h133l-280 -549l147 -776l686 1325h129l-780 -1499h-123l-150 780l-407 -780h-123z" /> +<glyph unicode="X" horiz-adv-x="1189" d="M78 0l565 745l-334 754h125l287 -649l493 649h144l-582 -766l324 -733h-125l-279 627l-475 -627h-143z" /> +<glyph unicode="Y" horiz-adv-x="1288" d="M307 1499h125l281 -819l581 819h140l-678 -967l-84 -532h-119l84 532z" /> +<glyph unicode="Z" horiz-adv-x="1116" d="M72 0l18 119l1034 1261h-833l18 119h989l-18 -119l-1034 -1261h833l-18 -119h-989z" /> +<glyph unicode="[" horiz-adv-x="618" d="M151 -142.5q-5 60.5 7 105.5l233 1475q12 72 29.5 122t52.5 101t98.5 77.5t151.5 26.5h143l-18 -118h-143q-78 0 -127.5 -47.5t-67.5 -161.5l-234 -1475q-20 -129 6.5 -182t118.5 -53h144l-21 -117h-143q-86 0 -141.5 38t-69.5 93t-19 115.5z" /> +<glyph unicode="\" horiz-adv-x="827" d="M289 1577h110l303 -1724h-110z" /> +<glyph unicode="]" horiz-adv-x="622" d="M-27 -389l19 117h143q162 0 195 211l233 1474q23 135 -6 184.5t-117 49.5h-143l18 118h144q72 0 121 -25.5t71.5 -63.5t31.5 -89t7 -91t-8 -83l-233 -1474q-25 -154 -94.5 -241t-237.5 -87h-144z" /> +<glyph unicode="^" horiz-adv-x="825" d="M274 1087l293 269h111l180 -269h-104l-136 189l-217 -189h-127z" /> +<glyph unicode="_" d="M39 -2l18 117h1278l-18 -117h-1278z" /> +<glyph unicode="`" horiz-adv-x="495" d="M256 1360h137l213 -273h-104z" /> +<glyph unicode="a" horiz-adv-x="1110" d="M164 322q-2 23 -2 48q0 87 22 199q23 131 61 227.5t80 152t98 91t101 48t105 20.5q34 4 71 4q92 0 204 -24q158 -34 231 -107l-144 -981h-82l-14 123q-70 -45 -181.5 -91t-213.5 -46q-76 0 -130.5 14t-105.5 51t-71.5 103t-28.5 168zM295 510q-14 -89 -13 -157 q0 -99 27 -155q47 -97 185 -96q78 0 154.5 17.5t116.5 33t136 56.5l111 733q-164 55 -291 55q-43 0 -82 -6q-72 -10 -118 -31.5t-92 -70.5t-78.5 -142.5t-55.5 -236.5z" /> +<glyph unicode="b" horiz-adv-x="1128" d="M123 0l254 1608h115l-95 -586q215 82 410 82q303 0 303 -368q0 -90 -18 -201q-14 -88 -32 -156t-53.5 -147.5t-80.5 -131.5t-120 -84q-67 -29 -147 -28h-20q-96 4 -219 50t-162 83l-53 -121h-82zM272 205q213 -98 385 -99q248 0 316 433q18 111 18 193q0 92 -22 148 q-41 108 -174 107q-178 0 -408 -57z" /> +<glyph unicode="c" horiz-adv-x="1011" d="M182 549q25 147 62 250.5t75.5 161t93 90t101.5 41t115 8.5q158 0 438 -56l-14 -83q-249 22 -428 22h-15q-61 0 -100 -12.5t-81 -55.5t-72.5 -136t-57.5 -242q-19 -115 -19 -197q0 -92 24 -142q46 -94 167 -94l465 29l-12 -86q-219 -59 -459 -59q-301 3 -301 363 q0 88 18 198z" /> +<glyph unicode="d" horiz-adv-x="1107" d="M170 352q-2 28 -2 56q0 69 14 137q20 121 49 211t79 174t133 129t194 45q76 0 189.5 -22.5t199.5 -59.5l94 586h113l-254 -1608h-82l-14 121q-55 -39 -184.5 -86t-223.5 -47q-102 0 -173 52t-97.5 133t-34.5 179zM299 539q-14 -86 -14 -156q1 -102 31 -167 q52 -110 167 -110q170 0 414 99l115 725q-211 57 -391 57q-117 0 -199 -97t-123 -351z" /> +<glyph unicode="e" horiz-adv-x="1081" d="M180 569q20 113 40 183.5t58.5 145.5t92 116t139.5 67.5t203 26.5q207 0 309 -72q84 -59 84 -184q0 -27 -4 -57q-16 -127 -100 -207t-190 -108q-107 -28 -223 -32q-33 -1 -62 -1q-76 1 -134 9q-80 12 -108 23q-16 -99 -15 -170q0 -78 18 -123q36 -86 163 -88q34 -2 72 -2 q171 0 429 37l-12 -88q-217 -59 -500 -59q-195 0 -255 140q-31 73 -31 190q0 108 26 253zM297 561q14 -2 36.5 -4t90.5 -5q34 -2 66.5 -2t62.5 2q61 3 139 16.5t136.5 39t102.5 73.5t54 114q3 23 3 43q0 82 -52 114q-66 40 -223 39q-119 0 -196 -26.5t-119 -95t-57 -115.5 t-36 -154q-6 -27 -8 -39z" /> +<glyph unicode="f" horiz-adv-x="794" d="M188 971l15 84l203 32l18 117q33 213 96.5 307.5t224.5 96.5h10q101 0 249 -39l-11 -78h-250q-100 0 -138 -59.5t-64 -227.5l-19 -117h348l-20 -116h-348l-158 -971h-119l158 971h-195z" /> +<glyph unicode="g" horiz-adv-x="1118" d="M76 -508l12 76l506 -10h5q81 0 151 57q71 59 90 172l43 272q-200 -77 -389 -77h-5q-154 0 -233.5 78.5t-85.5 207.5q-1 28 -1 57q0 108 17 238q41 258 159 397.5t296 139.5q96 0 198.5 -8.5t201 -19.5t116.5 -13l-201 -1272q-29 -180 -139 -269q-95 -77 -207 -77 q-17 0 -35 2zM286 337v-18q0 -89 45 -152q50 -69 158 -69q172 0 408 58l131 823l-383 4q-80 0 -143.5 -43t-102.5 -113.5t-61.5 -138t-34.5 -137.5q-12 -113 -17 -214z" /> +<glyph unicode="h" horiz-adv-x="1110" d="M123 0l254 1606h119l-103 -645q84 47 140.5 72.5t139.5 49t161 23.5q156 0 228 -102q55 -78 56 -179q0 -32 -6 -67l-121 -758h-117l121 758q4 27 4 51q0 73 -37 118q-49 60 -149 60q-117 0 -203 -25.5t-231 -93.5l-137 -868h-119z" /> +<glyph unicode="i" horiz-adv-x="364" d="M123 0l172 1087h119l-172 -1087h-119zM307 1280l15 102q6 41 47 41h77q33 0 33 -33v-8l-16 -102q-6 -41 -47 -41h-76q-34 0 -34 31q0 5 1 10z" /> +<glyph unicode="j" horiz-adv-x="399" d="M57 -553l260 1640h117l-172 -1095q-55 -344 -131 -545h-74zM328 1280l16 102q6 41 49 41h76q34 0 34 -29q0 -5 -1 -12l-17 -102q-6 -41 -47 -41h-76q-35 0 -35 31q0 5 1 10z" /> +<glyph unicode="k" horiz-adv-x="991" d="M123 0l254 1602h119l-154 -967q190 25 366.5 170t211.5 282h131q-47 -170 -192.5 -306t-280.5 -189l391 -592h-142l-368 561q-23 -6 -70 -8t-59 0l-88 -553h-119z" /> +<glyph unicode="l" horiz-adv-x="608" d="M182 387l193 1217h117l-193 -1217q-8 -59 -10 -102v-18q0 -31 5 -54q7 -29 14 -45t25.5 -26.5t31 -14.5t36.5 -8q145 -33 152 -33l-14 -86h-138q-229 0 -229 263q0 56 10 124z" /> +<glyph unicode="m" horiz-adv-x="1853" d="M123 0l172 1087h80l18 -129q92 51 138.5 74t128 46.5t161.5 23.5q94 0 167 -49t97 -125q240 174 488 174q141 0 222 -100q63 -78 63 -186q0 -31 -5 -64l-120 -752h-117l119 752q4 24 4 46q0 70 -39 120q-51 66 -148 65q-223 0 -444 -123q2 -12 0 -53t-6 -57l-119 -750 h-117l119 752q3 22 3 41q0 73 -40 125q-51 66 -147 65q-117 0 -198 -24.5t-226 -92.5l-135 -866h-119z" /> +<glyph unicode="n" horiz-adv-x="1110" d="M123 0l172 1087h80l18 -126q86 47 140.5 72.5t137.5 49t160 23.5q156 0 230 -102q56 -78 57 -180q0 -32 -6 -66l-121 -758h-117l121 758q4 26 4 49q0 73 -38 119q-50 62 -148 61q-117 0 -203 -25.5t-231 -93.5l-137 -868h-119z" /> +<glyph unicode="o" horiz-adv-x="1150" d="M184 532q51 328 171 447t384 119q254 0 342 -140q57 -91 57 -247q0 -84 -16 -187q-51 -305 -164.5 -419.5t-375.5 -114.5q-264 0 -354 124q-60 82 -60 237q0 81 16 181zM285 366v-17q0 -57 12 -98q14 -46 36.5 -75t63.5 -44t83 -20.5t106 -5.5q96 0 155.5 13.5 t114.5 56.5t90 128t58 224q16 94 18 165v21q0 58 -10 100q-12 50 -34 82t-60.5 50.5t-84 25.5t-108.5 7q-98 0 -157.5 -13.5t-116 -58.5t-91 -136t-59.5 -243q-14 -94 -16 -162z" /> +<glyph unicode="p" horiz-adv-x="1122" d="M35 -553l268 1624q203 25 500 25q111 0 183.5 -51.5t98 -132.5t32.5 -183q2 -26 2 -53q0 -76 -15 -152q-76 -542 -448 -542h-1q-82 0 -201.5 20.5t-203.5 56.5l-98 -612h-117zM268 154q182 -56 322 -56q39 0 74 4q127 10 205.5 105.5t117.5 335.5q15 92 15 164 q0 270 -207 270h-394z" /> +<glyph unicode="q" horiz-adv-x="1130" d="M168 328q-1 18 -1 35q0 91 19 192q88 545 465 545q205 0 504 -39l-254 -1614h-119l97 612q-206 -79 -389 -79h-5q-115 0 -186.5 44t-99 121.5t-31.5 182.5zM285 316v-8q0 -95 48 -152q50 -58 161 -58q184 0 401 54l131 831h-393q-78 0 -138.5 -41t-97.5 -110.5 t-58.5 -138t-33.5 -144.5q-18 -133 -20 -233z" /> +<glyph unicode="r" horiz-adv-x="849" d="M123 0l172 1087h80l14 -137q8 4 50 26.5t54.5 28t50.5 24t55 24.5t52 18t60.5 16.5t57.5 8.5t65 4q111 0 149 -17l-18 -116q-57 14 -150 14q-25 0 -50.5 -2t-44 -3t-45 -8t-39.5 -9.5t-42 -12.5t-39 -13t-44 -18.5t-41 -18.5t-47 -20.5t-48 -21.5l-133 -854h-119z" /> +<glyph unicode="s" horiz-adv-x="1036" d="M131 16l14 84h541q147 0 170 138l16 108q4 19 4 36q0 99 -128 99h-291q-155 1 -217 57q-46 41 -45 130q0 33 6 73l14 101q23 135 97.5 198.5t228.5 63.5q238 0 510 -27l-15 -88h-514q-168 0 -188 -151l-17 -101q-4 -25 -5 -44t4.5 -33.5t7.5 -24.5t15 -16.5t17 -10.5 t24 -6t24 -2h28h29h293q128 0 192 -70q50 -54 50 -137q0 -24 -5 -51l-18 -121q-12 -80 -44 -131t-80 -72.5t-88 -27.5t-95 -6q-70 0 -269.5 13t-265.5 19z" /> +<glyph unicode="t" horiz-adv-x="749" d="M188 971l15 88l196 31l78 303h88l-47 -303h332l-21 -119h-329l-92 -584q-12 -67 -11 -115q1 -52 7 -80q6 -26 26.5 -42.5t33.5 -21.5t44 -11q145 -33 151 -33l-12 -84h-137q-144 0 -198 93q-35 59 -34 162q0 59 11 132l92 584h-193z" /> +<glyph unicode="u" horiz-adv-x="1107" d="M156 330l118 757h119l-121 -757q-5 -31 -4 -58q0 -72 35 -114q49 -58 152 -58q117 0 202.5 26t231.5 93l137 868h117l-172 -1087h-80l-17 127q-90 -49 -142 -73.5t-135 -48t-161 -23.5q-158 0 -232 100q-55 75 -54 176q0 35 6 72z" /> +<glyph unicode="v" horiz-adv-x="1064" d="M193 1087h122l228 -940l420 775q49 94 61 165h90q9 -27 9 -56q0 -60 -36 -132l-485 -899h-147z" /> +<glyph unicode="w" horiz-adv-x="1638" d="M193 1087h118l224 -933l417 761q51 98 64 168h84q8 -25 8 -53q0 -61 -37 -135l-82 -164l127 -571l430 760q53 111 62 167h86q10 -30 10 -61q0 -62 -39 -127l-510 -899h-119l-133 588l-319 -588h-129z" /> +<glyph unicode="x" horiz-adv-x="1017" d="M49 0l481 547l-309 540h139l252 -444l392 444h151l-479 -552l303 -535h-137l-252 438l-381 -438h-160z" /> +<glyph unicode="y" horiz-adv-x="1114" d="M193 1087h122l142 -849q10 -61 50 -90q37 -27 70 -27h4l33 2l404 805q41 80 53 168h94q10 -31 10 -64q0 -62 -36 -131l-447 -899q-51 -102 -95 -176t-108.5 -165t-138.5 -146.5t-149 -65.5v82q23 10 47 28.5t44.5 38t45 49t41 51t39 58.5t35 56.5t33 57.5t27.5 50t25 46 l17 34q-25 0 -51.5 7t-63.5 28.5t-64.5 70t-39.5 119.5z" /> +<glyph unicode="z" horiz-adv-x="927" d="M92 2l14 117l760 852h-649l16 116h811l-16 -116l-752 -852h615l-4 -29q-4 -29 -9 -58l-6 -30h-780z" /> +<glyph unicode="{" horiz-adv-x="614" d="M137 682l19 111q4 0 26.5 1t31.5 2t30.5 4t32 7t28 12t25.5 18.5t17 27t11 36.5l76 488q61 377 430 376l-18 -116q-123 0 -197 -60.5t-96 -204.5l-76 -483q-12 -70 -67.5 -116t-133.5 -58q72 -10 113 -59.5t31 -112.5l-86 -537q-27 -164 26.5 -229t180.5 -61l-19 -117 q-106 0 -178 38t-98.5 97t-36.5 133t6 146l86 522q10 63 -43 101t-121 34z" /> +<glyph unicode="|" horiz-adv-x="481" d="M152 -147l272 1724h117l-271 -1724h-118z" /> +<glyph unicode="}" horiz-adv-x="606" d="M-27 -389l19 117q125 -2 196.5 55t94.5 199l84 520q12 68 66 112.5t130 57.5q-70 10 -110.5 60t-30.5 116l80 500q29 168 -25.5 236.5t-179.5 64.5l18 116q102 0 173 -37.5t99.5 -97t39 -136.5t-8.5 -153l-77 -489q-10 -66 43 -101.5t121 -33.5l-19 -111 q-184 6 -203 -108l-84 -518q-55 -369 -426 -369z" /> +<glyph unicode="~" horiz-adv-x="929" d="M287 1171q14 10 49 38t51 39.5t45 27.5t54.5 22.5t54.5 6.5q45 0 111.5 -49.5t103.5 -49.5q23 0 45 5.5t46.5 17.5t40 20t42 25.5t35.5 21.5l24 -61q-6 -6 -41 -36t-50 -41t-45 -29.5t-57.5 -26.5t-56.5 -8q-47 0 -115.5 49t-105.5 49t-66.5 -10.5t-74.5 -36t-68 -35.5z " /> +<glyph unicode="¢" horiz-adv-x="993" d="M164 549q27 152 63.5 257t76.5 163.5t98.5 89.5t110.5 37t130 4l31 188h94l-33 -194q143 -14 314 -50l-13 -83q-262 23 -444 22q-61 0 -100 -12.5t-81 -55.5t-73 -136t-57 -242q-41 -244 5 -338.5t167 -94.5l467 29l-15 -86q-174 -49 -344 -57l-26 -176h-95l27 174 q-188 0 -272 125t-31 436z" /> +<glyph unicode="£" horiz-adv-x="1193" d="M102 0l15 90l151 29l90 571h-147l12 70l152 28l39 246q14 94 39.5 167t53.5 122t69.5 83t78.5 52.5t93.5 27.5t98.5 11t107 2q51 0 145.5 -7t163.5 -14l68 -8l-14 -86h-369q-213 0 -297 -65.5t-119 -284.5l-38 -246l563 -28l-13 -70h-569l-88 -571h727l-18 -119h-994z " /> +<glyph unicode="¥" horiz-adv-x="1218" d="M217 344l14 90h359l20 133h-358l14 90h350l-331 842h125l286 -717l572 717h143l-668 -842h398l-15 -90h-399l-20 -133h399l-14 -90h-396l-49 -344h-117l50 344h-363z" /> +<glyph unicode="¨" horiz-adv-x="923" d="M291 1192q4 33 31.5 56.5t62.5 23.5q33 0 52.5 -22.5t15.5 -57.5q-4 -33 -32 -57.5t-62.5 -24.5t-54 24.5t-13.5 57.5zM813 1192q4 33 31.5 56.5t62.5 23.5q33 0 52.5 -22.5t15.5 -57.5q-4 -33 -32 -57.5t-62.5 -24.5t-54 24.5t-13.5 57.5z" /> +<glyph unicode="©" horiz-adv-x="1689" d="M212 586q1 90 13 170q117 743 594 743h529q94 0 163.5 -37t105.5 -101.5t56.5 -139t20.5 -164.5t-5.5 -161t-17.5 -144q-53 -326 -191.5 -539t-355.5 -213h-528q-111 0 -190.5 56.5t-118.5 140.5t-57.5 191.5t-17.5 197.5zM309 523.5q8 -115.5 35 -211t93.5 -155 t160.5 -59.5h539q145 0 266 171t172 485q100 647 -227 647h-545q-377 0 -479 -647q-23 -115 -15 -230.5zM586 750q41 246 134 345t230 99q115 0 359 -45l-13 -76q-190 25 -360 25q-197 0 -254 -357q-25 -166 4 -255t139 -89q160 0 383 33l-12 -76q-199 -53 -387 -53 q-133 0 -196.5 108t-26.5 341z" /> +<glyph unicode="«" horiz-adv-x="1140" d="M217 725l488 416l71 -84l-397 -342l287 -342l-84 -74zM602 725l488 416l73 -84l-399 -342l289 -342l-86 -74z" /> +<glyph unicode="­" horiz-adv-x="710" d="M123 535l18 118h623l-19 -118h-622z" /> +<glyph unicode="®" horiz-adv-x="1689" d="M212 586q1 90 13 170q117 743 594 743h529q94 0 163.5 -37t105.5 -101.5t56.5 -139t20.5 -164.5t-5.5 -161t-17.5 -144q-53 -326 -191.5 -539t-355.5 -213h-528q-111 0 -190.5 56.5t-118.5 140.5t-57.5 191.5t-17.5 197.5zM309 523.5q8 -115.5 35 -211t93.5 -155 t160.5 -59.5h539q145 0 266 171t172 485q100 647 -225 647h-547q-377 0 -479 -647q-23 -115 -15 -230.5zM582 313l139 875h362q106 0 175 -60.5t51 -212.5q-8 -59 -25.5 -103t-36 -66.5t-49.5 -39t-47 -20.5t-49 -8t-39 -4l141 -361h-108l-142 363l-215 20l-61 -383h-96z M750 762h278q90 0 129 32.5t53.5 131t-22.5 131.5t-109 33h-276z" /> +<glyph unicode="´" horiz-adv-x="464" d="M213 1087l272 273h148l-316 -273h-104z" /> +<glyph unicode="¸" horiz-adv-x="526" d="M45 -354l8 55l99 25q59 14 88.5 59t44.5 139h102q-25 -158 -77 -218t-175 -60h-90z" /> +<glyph unicode="»" horiz-adv-x="1134" d="M166 385l403 344l-286 338l86 74l360 -422l-489 -420zM557 385l404 344l-287 338l86 74l360 -422l-489 -420z" /> +<glyph unicode="À" horiz-adv-x="1339" d="M92 0l793 1499h123l292 -1499h-118l-88 451h-633l-238 -451h-131zM524 569h547l-145 772zM670 1905h137l213 -273h-105z" /> +<glyph unicode="Â" horiz-adv-x="1339" d="M92 0l793 1499h123l292 -1499h-118l-88 451h-633l-238 -451h-131zM524 569h547l-145 772zM676 1632l293 266h110l181 -266h-101l-141 193l-221 -193h-121z" /> +<glyph unicode="Æ" horiz-adv-x="1867" d="M61 0l859 1227q68 96 125 154.5t119.5 83t111.5 30.5t133 4l614 -29l-14 -90h-620q-20 0 -39 -2t-32 -4t-24.5 -10t-18.5 -11t-14.5 -16.5t-10.5 -16.5t-7 -20.5t-5 -20.5t-5 -24.5t-4 -25.5l-70 -430l674 -19l-14 -90l-678 -16l-68 -424q-8 -47 0 -78t34 -44t47.5 -16 t57.5 -3h596l-16 -89l-594 -28q-117 -6 -190.5 54t-53.5 202l37 237h-450l-342 -485h-138zM618 604h394l116 719z" /> +<glyph unicode="Ç" horiz-adv-x="1173" d="M217 479.5q-8 139.5 21 280.5q31 193 71.5 321.5t109 232t176 153t257.5 49.5q174 0 473 -58l-14 -90q-250 33 -471 29q-63 0 -109.5 -8.5t-108 -45t-106.5 -103t-88 -191.5t-72 -299q-49 -295 15.5 -465t255.5 -179q147 -6 491 19l-12 -90q-190 -47 -488 -47 q-139 0 -231 67.5t-127 176t-43 248zM391 -354l8 55l99 25q59 12 87.5 57t43.5 141h104q-25 -158 -77 -218t-175 -60h-90z" /> +<glyph unicode="È" horiz-adv-x="1157" d="M201 256l155 981q45 272 301 262l631 -29l-14 -90h-635q-143 0 -164 -147l-69 -428l692 -17l-15 -90l-696 -18l-68 -428q-8 -49 1.5 -79t34 -43t46 -16t58.5 -3h614l-14 -86l-621 -31q-117 -6 -188.5 56.5t-48.5 205.5zM592 1894h137l213 -272h-104z" /> +<glyph unicode="É" horiz-adv-x="1157" d="M201 256l155 981q45 272 301 262l631 -29l-14 -90h-635q-143 0 -164 -147l-69 -428l692 -17l-15 -90l-696 -18l-68 -428q-8 -49 1.5 -79t34 -43t46 -16t58.5 -3h614l-14 -86l-621 -31q-117 -6 -188.5 56.5t-48.5 205.5zM821 1622l273 272h147l-315 -272h-105z" /> +<glyph unicode="Ê" horiz-adv-x="1157" d="M201 256l155 981q45 272 301 262l631 -29l-14 -90h-635q-143 0 -164 -147l-69 -428l692 -17l-15 -90l-696 -18l-68 -428q-8 -49 1.5 -79t34 -43t46 -16t58.5 -3h614l-14 -86l-621 -31q-117 -6 -188.5 56.5t-48.5 205.5zM590 1622l293 268h110l181 -268h-105l-135 188 l-217 -188h-127z" /> +<glyph unicode="Ë" horiz-adv-x="1157" d="M201 256l155 981q45 272 301 262l631 -29l-14 -90h-635q-143 0 -164 -147l-69 -428l692 -17l-15 -90l-696 -18l-68 -428q-8 -49 1.5 -79t34 -43t46 -16t58.5 -3h614l-14 -86l-621 -31q-117 -6 -188.5 56.5t-48.5 205.5zM541 1726q4 33 31.5 56.5t62.5 23.5 q33 0 52.5 -22.5t14.5 -57.5q-6 -35 -33.5 -58t-60.5 -23q-35 0 -54 24t-13 57zM1063 1726q4 33 31.5 56.5t62.5 23.5q33 0 52.5 -22.5t15.5 -57.5q-6 -35 -34 -58t-61 -23q-35 0 -54 24t-13 57z" /> +<glyph unicode="Î" horiz-adv-x="438" d="M184 0l238 1499h119l-238 -1499h-119zM211 1632l291 266h112l181 -266h-101l-141 193l-221 -193h-121z" /> +<glyph unicode="Ï" horiz-adv-x="438" d="M172 1714q6 33 33.5 56.5t62.5 23.5q33 0 52.5 -22.5t15.5 -57.5q-6 -35 -34 -58.5t-60.5 -23.5t-53 23.5t-16.5 58.5zM184 0l238 1499h119l-238 -1499h-119zM694 1714q6 33 34 56.5t63 23.5q33 0 52 -22.5t15 -57.5q-6 -35 -33.5 -58.5t-60.5 -23.5t-53.5 23.5 t-16.5 58.5z" /> +<glyph unicode="Ô" horiz-adv-x="1376" d="M209 450.5q2 124.5 29 292.5q33 207 81 349.5t102 224.5t137 125t161 55t199 12q96 0 164.5 -10t134 -37.5t103.5 -82t62.5 -138.5t22.5 -211t-29 -295q-23 -141 -52.5 -249.5t-63 -186.5t-80.5 -133t-94.5 -89t-113 -53.5t-127 -25.5t-145.5 -6q-96 0 -161.5 8 t-134 34.5t-106.5 78t-64.5 132.5t-24.5 205.5zM327.5 459.5q0.5 -111.5 20 -181t71.5 -106.5t116.5 -49t171.5 -12q127 0 207.5 22.5t151.5 88t116 191.5t78 326q20 133 25 234.5t-2 170t-32.5 116t-53.5 74t-79 39.5t-93 16.5t-114 3.5q-74 0 -115.5 -3.5t-100 -15.5 t-92.5 -37.5t-76 -71.5t-69.5 -116t-55.5 -172.5t-48 -237.5q-27 -168 -26.5 -279.5zM645 1632l293 266h111l180 -266h-101l-141 193l-221 -193h-121z" /> +<glyph unicode="Ù" d="M244 400.5q2 99.5 18 230.5l137 868h121l-139 -868q-18 -115 -19.5 -200t14 -142.5t41 -94t72 -55t94.5 -26t117 -7.5q106 0 180 22t139.5 77t107.5 160.5t69 265.5l137 868h119l-137 -868q-27 -164 -68 -276.5t-111.5 -197.5t-179 -126t-262.5 -41q-84 0 -148.5 11 t-122.5 38t-94 74t-61.5 117.5t-23.5 170zM649 1905h137l213 -273h-104z" /> +<glyph unicode="Û" d="M244 400.5q2 99.5 18 230.5l137 868h121l-139 -868q-18 -115 -19.5 -200t14 -142.5t41 -94t72 -55t94.5 -26t117 -7.5q106 0 180 22t139.5 77t107.5 160.5t69 265.5l137 868h119l-137 -868q-27 -164 -68 -276.5t-111.5 -197.5t-179 -126t-262.5 -41q-84 0 -148.5 11 t-122.5 38t-94 74t-61.5 117.5t-23.5 170zM655 1632l293 266h111l180 -266h-100l-142 193l-221 -193h-121z" /> +<glyph unicode="Ü" d="M244 400.5q2 99.5 18 230.5l137 868h121l-139 -868q-18 -115 -19.5 -200t14 -142.5t41 -94t72 -55t94.5 -26t117 -7.5q106 0 180 22t139.5 77t107.5 160.5t69 265.5l137 868h119l-137 -868q-27 -164 -68 -276.5t-111.5 -197.5t-179 -126t-262.5 -41q-84 0 -148.5 11 t-122.5 38t-94 74t-61.5 117.5t-23.5 170zM618 1714q4 33 32 56.5t63 23.5q33 0 52 -22.5t15 -57.5t-31.5 -58.5t-60.5 -23.5t-53.5 23.5t-16.5 58.5zM1141 1714q4 33 31.5 56.5t62.5 23.5q33 0 52.5 -22.5t15 -57.5t-32 -58.5t-60 -23.5t-53 23.5t-16.5 58.5z" /> +<glyph unicode="à" horiz-adv-x="1110" d="M163.5 321.5q-8.5 102.5 20.5 247.5q23 131 61 227.5t80 152t98 91t101 48t105 20.5q117 14 274.5 -20.5t231.5 -106.5l-144 -981h-82l-14 123q-70 -45 -181.5 -91t-213.5 -46q-76 0 -130.5 14t-105.5 51t-71.5 102.5t-29 168zM295 510q-33 -215 14 -311.5t185 -96.5 q78 0 154.5 17.5t116.5 33t136 56.5l111 733q-219 74 -373 49q-72 -10 -118 -31.5t-92 -70.5t-78.5 -142.5t-55.5 -236.5zM434 1507h137l213 -272h-104z" /> +<glyph unicode="â" horiz-adv-x="1110" d="M163.5 321.5q-8.5 102.5 20.5 247.5q23 131 61 227.5t80 152t98 91t101 48t105 20.5q117 14 274.5 -20.5t231.5 -106.5l-144 -981h-82l-14 123q-70 -45 -181.5 -91t-213.5 -46q-76 0 -130.5 14t-105.5 51t-71.5 102.5t-29 168zM295 510q-33 -215 14 -311.5t185 -96.5 q78 0 154.5 17.5t116.5 33t136 56.5l111 733q-219 74 -373 49q-72 -10 -118 -31.5t-92 -70.5t-78.5 -142.5t-55.5 -236.5zM440 1235l293 266h111l180 -266h-100l-142 192l-221 -192h-121z" /> +<glyph unicode="æ" horiz-adv-x="1888" d="M81.5 323.5q-6.5 100.5 22.5 241.5q29 166 78 276.5t114.5 164t120 73t132.5 29.5q100 12 247.5 -18.5t235.5 -90.5q119 109 357 109q207 0 309 -71.5t80 -241.5q-16 -127 -100.5 -207t-192 -107.5t-223 -32t-195.5 7t-109 23.5q-33 -207 4 -293t164 -88q186 -10 502 35 l-14 -88q-217 -59 -498 -59q-201 0 -258 151q-80 -55 -205 -103t-235 -48q-76 0 -131.5 15t-104.5 53t-71.5 103.5t-29 166zM213 510q-35 -219 10 -312.5t189 -95.5q109 0 231.5 36t192.5 83q-20 129 20 348q45 246 111 355q-272 90 -410 67q-70 -12 -116 -32.5t-93 -69.5 t-79.5 -142.5t-55.5 -236.5zM971 561q14 -2 36.5 -4t90 -5t129 0t139.5 16.5t136.5 39t102.5 73.5t54 114q16 117 -49.5 156.5t-223.5 39.5q-70 0 -125 -12t-93 -27.5t-69.5 -51.5t-48 -59.5t-33 -76.5t-22.5 -80t-18 -91q-4 -22 -6 -32z" /> +<glyph unicode="ç" horiz-adv-x="1015" d="M186 549q25 147 62 250.5t75.5 161t93 90t101.5 41t115 8.5q158 0 438 -56l-14 -83q-260 23 -443 22q-61 0 -100 -12.5t-81 -55.5t-72.5 -136t-57.5 -242q-41 -244 5 -338.5t167 -94.5l465 29l-12 -86q-219 -59 -459 -59q-375 4 -283 561zM276 -352l11 55l98 23 q59 16 88 61t43 139h105q-25 -160 -77 -219t-175 -59h-93z" /> +<glyph unicode="è" horiz-adv-x="1081" d="M180 569q20 113 40 183.5t58.5 145.5t92 116t139.5 67.5t203 26.5q207 0 309 -71.5t80 -241.5q-16 -127 -100 -207t-190.5 -107.5t-222.5 -32t-196 7t-108 23.5q-33 -207 3 -293t163 -88q186 -10 501 35l-12 -88q-217 -59 -500 -59q-195 0 -255 140t-5 443zM297 561 q14 -2 36.5 -4t90.5 -5t129 0t139 16.5t136.5 39t102.5 73.5t54 114q16 117 -49.5 156.5t-222.5 39.5q-119 0 -196 -26.5t-119 -95t-57 -115.5t-36 -154q-6 -27 -8 -39zM436 1503h135l213 -272h-102z" /> +<glyph unicode="é" horiz-adv-x="1081" d="M180 569q20 113 40 183.5t58.5 145.5t92 116t139.5 67.5t203 26.5q207 0 309 -71.5t80 -241.5q-16 -127 -100 -207t-190.5 -107.5t-222.5 -32t-196 7t-108 23.5q-33 -207 3 -293t163 -88q186 -10 501 35l-12 -88q-217 -59 -500 -59q-195 0 -255 140t-5 443zM297 561 q14 -2 36.5 -4t90.5 -5t129 0t139 16.5t136.5 39t102.5 73.5t54 114q16 117 -49.5 156.5t-222.5 39.5q-119 0 -196 -26.5t-119 -95t-57 -115.5t-36 -154q-6 -27 -8 -39zM682 1231l270 272h148l-316 -272h-102z" /> +<glyph unicode="ê" horiz-adv-x="1081" d="M180 569q20 113 40 183.5t58.5 145.5t92 116t139.5 67.5t203 26.5q207 0 309 -71.5t80 -241.5q-16 -127 -100 -207t-190.5 -107.5t-222.5 -32t-196 7t-108 23.5q-33 -207 3 -293t163 -88q186 -10 501 35l-12 -88q-217 -59 -500 -59q-195 0 -255 140t-5 443zM297 561 q14 -2 36.5 -4t90.5 -5t129 0t139 16.5t136.5 39t102.5 73.5t54 114q16 117 -49.5 156.5t-222.5 39.5q-119 0 -196 -26.5t-119 -95t-57 -115.5t-36 -154q-6 -27 -8 -39zM440 1231l293 266h113l180 -266h-100l-144 192l-219 -192h-123z" /> +<glyph unicode="ë" horiz-adv-x="1081" d="M180 569q20 113 40 183.5t58.5 145.5t92 116t139.5 67.5t203 26.5q207 0 309 -71.5t80 -241.5q-16 -127 -100 -207t-190.5 -107.5t-222.5 -32t-196 7t-108 23.5q-33 -207 3 -293t163 -88q186 -10 501 35l-12 -88q-217 -59 -500 -59q-195 0 -255 140t-5 443zM297 561 q14 -2 36.5 -4t90.5 -5t129 0t139 16.5t136.5 39t102.5 73.5t54 114q16 117 -49.5 156.5t-222.5 39.5q-119 0 -196 -26.5t-119 -95t-57 -115.5t-36 -154q-6 -27 -8 -39zM403 1313q6 33 34 56.5t63 23.5q33 0 52 -22.5t15 -57.5q-6 -35 -33.5 -58.5t-60.5 -23.5t-53.5 23.5 t-16.5 58.5zM926 1313q6 33 33.5 56.5t62.5 23.5q33 0 52.5 -22.5t15.5 -57.5q-6 -35 -34 -58.5t-60.5 -23.5t-53 23.5t-16.5 58.5z" /> +<glyph unicode="î" horiz-adv-x="378" d="M49 1221l293 266h111l180 -266h-101l-141 192l-219 -192h-123zM123 0l172 1087h119l-172 -1087h-119z" /> +<glyph unicode="ï" horiz-adv-x="378" d="M6 1303q6 33 34 56t62.5 23t53 -23.5t12.5 -55.5q-4 -35 -31.5 -58.5t-60.5 -23.5t-53.5 23.5t-16.5 58.5zM123 0l172 1087h119l-172 -1087h-119zM528 1303q6 33 34 56t62.5 23t53 -23.5t12.5 -55.5q-4 -35 -31.5 -58.5t-60.5 -23.5t-53.5 23.5t-16.5 58.5z" /> +<glyph unicode="ô" horiz-adv-x="1150" d="M184 532q51 328 171 447t384 119q254 0 342 -139.5t41 -434.5q-51 -305 -164.5 -419.5t-375.5 -114.5q-264 0 -354.5 124.5t-43.5 417.5zM285 365.5q-2 -68.5 12 -114.5t36.5 -75t63.5 -44t83 -20.5t106 -5.5q96 0 155.5 13.5t114.5 56.5t90 128t58 224q16 94 18 165 t-9.5 121t-34 82t-61 50.5t-84 25.5t-108.5 7q-98 0 -157.5 -13.5t-116 -58.5t-91 -136t-59.5 -243q-14 -94 -16 -162.5zM467 1221l293 266h110l181 -266h-101l-141 192l-221 -192h-121z" /> +<glyph unicode="ù" horiz-adv-x="1107" d="M156 330l118 757h119l-121 -757q-18 -115 31 -172.5t152 -57.5q117 0 202.5 26t231.5 93l137 868h117l-172 -1087h-80l-17 127q-90 -49 -142 -73.5t-135 -48t-161 -23.5q-158 0 -231.5 100.5t-48.5 247.5zM432 1493h137l213 -272h-104z" /> +<glyph unicode="û" horiz-adv-x="1107" d="M156 330l118 757h119l-121 -757q-18 -115 31 -172.5t152 -57.5q117 0 202.5 26t231.5 93l137 868h117l-172 -1087h-80l-17 127q-90 -49 -142 -73.5t-135 -48t-161 -23.5q-158 0 -231.5 100.5t-48.5 247.5zM438 1221l293 266h111l180 -266h-100l-142 192l-221 -192h-121z " /> +<glyph unicode="ü" horiz-adv-x="1107" d="M156 330l118 757h119l-121 -757q-18 -115 31 -172.5t152 -57.5q117 0 202.5 26t231.5 93l137 868h117l-172 -1087h-80l-17 127q-90 -49 -142 -73.5t-135 -48t-161 -23.5q-158 0 -231.5 100.5t-48.5 247.5zM401 1303q4 33 32 56t63 23q33 0 52 -22.5t15 -57t-31.5 -58 t-62.5 -23.5t-54.5 24.5t-13.5 57.5zM924 1303q4 33 31.5 56t62.5 23q33 0 52.5 -22.5t15 -57t-32 -58t-62.5 -23.5t-54 24.5t-13 57.5z" /> +<glyph unicode="ÿ" horiz-adv-x="1114" d="M193 1087h122l142 -849q10 -61 50 -90t74 -27l33 2l404 805q41 80 53 168h94q29 -90 -26 -195l-447 -899q-51 -102 -95 -176t-108.5 -165t-138.5 -146.5t-149 -65.5v82q23 10 47 28.5t44.5 38t45 49t41 51t39 58.5t35 56.5t33 57.5t27.5 50t25 46l17 34q-25 0 -51.5 7 t-63.5 28.5t-64.5 70t-39.5 119.5zM371 1315q4 33 31.5 56.5t62.5 23.5t54.5 -22.5t12.5 -57.5q-4 -35 -31.5 -58.5t-60 -23.5t-53 23.5t-16.5 58.5zM893 1315q4 33 31.5 56.5t62.5 23.5t54.5 -23.5t13.5 -56.5q-4 -35 -32 -58.5t-60.5 -23.5t-53 23.5t-16.5 58.5z" /> +<glyph unicode="Œ" horiz-adv-x="2168" d="M192 450.5q2 124.5 29 292.5q33 207 81 349.5t102.5 224.5t137.5 125t160.5 55t198.5 12q180 0 286.5 -44t153.5 -169q51 213 283 203l610 -29l-14 -90h-614q-141 0 -166 -147l-66 -428l670 -17l-14 -90l-676 -18l-70 -428q-6 -49 2 -79t34 -43t47.5 -16t57.5 -3h594 l-14 -86l-598 -31q-98 -6 -165.5 40t-70.5 148q-82 -113 -195.5 -151.5t-291.5 -38.5q-96 0 -161.5 8t-134.5 34.5t-106.5 78t-64.5 132.5t-25 205.5zM312 459.5q-1 -111.5 18.5 -181t72 -106.5t118 -49t171.5 -12q125 0 206 22.5t151.5 88t115.5 191.5t78 326 q20 133 25.5 234.5t-1.5 170t-33 116t-53.5 74t-78.5 39.5t-93 16.5t-114 3.5q-57 0 -91 -1t-81 -7.5t-76 -18.5t-66.5 -34.5t-61 -56.5t-52.5 -82t-49.5 -112.5t-41 -150t-36.5 -191.5q-27 -168 -28 -279.5z" /> +<glyph unicode="œ" horiz-adv-x="1925" d="M172 537q51 328 171 444.5t384 116.5q305 0 373 -209q113 217 438 219q207 2 309.5 -70.5t79.5 -242.5q-16 -127 -100 -207t-191.5 -107.5t-223.5 -32t-195.5 7t-108.5 23.5q-35 -207 4 -293t164 -88q254 0 502 35l-13 -88q-217 -59 -501 -59q-217 0 -267 190 q-61 -100 -161.5 -143t-264.5 -43q-264 0 -355 126t-44 421zM273.5 365.5q-1.5 -68.5 13 -114.5t37 -75t63.5 -44t83 -20.5t105 -5.5q96 0 156 13.5t115 56.5t90 128t57 224q16 94 18.5 165t-9 121t-34 82t-61.5 50.5t-84 25.5t-110 7q-98 0 -156.5 -13.5t-115 -58.5 t-91 -136t-59.5 -243q-16 -94 -17.5 -162.5zM1122 561h5q33 -4 68.5 -6t120.5 -4t156.5 10t148.5 36t127 75t60 123q16 117 -48 156.5t-222 39.5q-98 0 -169 -23.5t-110.5 -56t-68.5 -97t-40.5 -114t-27.5 -139.5z" /> +<glyph unicode="Ÿ" horiz-adv-x="1288" d="M248 1499h125l282 -819l580 819h139l-678 -967l-84 -532h-118l84 532zM504 1708q4 33 31.5 56.5t62.5 23.5q33 0 52.5 -22.5t15.5 -57.5q-6 -35 -34 -58.5t-61 -23.5q-35 0 -54 24.5t-13 57.5zM1026 1708q4 33 31.5 56.5t62.5 23.5q33 0 52.5 -22.5t15.5 -57.5 q-6 -35 -34 -58.5t-60 -23.5q-35 0 -54.5 24.5t-13.5 57.5z" /> +<glyph unicode="ˆ" horiz-adv-x="679" d="M135 1087l293 267h111l180 -267h-101l-141 193l-219 -193h-123z" /> +<glyph unicode="˚" horiz-adv-x="647" d="M287 1294q10 88 78.5 149.5t154.5 61.5t139.5 -61.5t42.5 -149.5q-8 -88 -75.5 -148.5t-153.5 -60.5t-140 60.5t-46 148.5zM362 1294q-8 -55 28 -94t91.5 -39t98.5 39t49 94.5t-28 95.5t-89 40t-99.5 -40.5t-50.5 -95.5z" /> +<glyph unicode="˜" horiz-adv-x="942" d="M274 1171q59 43 90 64.5t78 42t86 20.5q51 -2 121 -49t94 -47q39 -2 111 30t98 52l25 -61l-49 -35q-35 -25 -52.5 -37t-45 -27.5t-53 -21.5t-50.5 -6q-57 2 -121.5 49t-97.5 47q-31 0 -61.5 -9t-48 -17.5t-52.5 -28t-49 -27.5z" /> +<glyph unicode=" " horiz-adv-x="952" /> +<glyph unicode=" " horiz-adv-x="1905" /> +<glyph unicode=" " horiz-adv-x="952" /> +<glyph unicode=" " horiz-adv-x="1905" /> +<glyph unicode=" " horiz-adv-x="635" /> +<glyph unicode=" " horiz-adv-x="476" /> +<glyph unicode=" " horiz-adv-x="317" /> +<glyph unicode=" " horiz-adv-x="317" /> +<glyph unicode=" " horiz-adv-x="238" /> +<glyph unicode=" " horiz-adv-x="381" /> +<glyph unicode=" " horiz-adv-x="105" /> +<glyph unicode="‐" horiz-adv-x="710" d="M123 535l18 118h623l-19 -118h-622z" /> +<glyph unicode="‑" horiz-adv-x="710" d="M123 535l18 118h623l-19 -118h-622z" /> +<glyph unicode="‒" horiz-adv-x="710" d="M123 535l18 118h623l-19 -118h-622z" /> +<glyph unicode="–" horiz-adv-x="917" d="M123 528l18 121h969l-18 -121h-969z" /> +<glyph unicode="—" horiz-adv-x="1509" d="M121 532l18 121h1426l-19 -121h-1425z" /> +<glyph unicode="‘" horiz-adv-x="483" d="M338 1149l31 207q23 140 156 142l36 -3l-8 -51q-57 2 -70 -60l-10 -63h23q20 0 31.5 -13.5t7.5 -35.5l-19 -123q-10 -53 -57 -53h-84q-49 0 -37 53z" /> +<glyph unicode="’" horiz-adv-x="483" d="M338 1098l10 55q57 -2 68 59l10 62h-23q-47 0 -38 49l20 125q8 51 55 51h86q49 0 37 -51l-33 -207q-23 -142 -156 -146z" /> +<glyph unicode="‚" horiz-adv-x="483" d="M135 -178l8 53q57 -2 70 62l8 61h-20q-47 0 -41 49l20 123q10 53 58 53h84q47 0 38 -53l-32 -205q-23 -142 -157 -146z" /> +<glyph unicode="“" horiz-adv-x="739" d="M324 1149l32 207q8 49 31 80.5t49.5 43t52 15.5t41.5 2l17 -2l-8 -51q-61 2 -68 -60l-10 -63h20q47 0 41 -49l-20 -123q-6 -53 -58 -53h-84q-44 0 -36 53zM608 1149l33 207q8 49 30.5 80.5t49.5 43t52.5 15.5t41.5 2l16 -2l-8 -51q-57 2 -69 -60l-9 -63h21q47 0 41 -49 l-21 -123q-6 -53 -57 -53h-84q-45 0 -37 53z" /> +<glyph unicode="”" horiz-adv-x="739" d="M324 1098l10 55q57 -2 67 59l11 62h-21q-20 0 -32.5 13t-8.5 36l21 125q8 51 55 51h84q51 0 39 -51l-33 -207q-23 -142 -157 -146zM608 1098l10 55q57 -2 68 59l10 62h-22q-47 0 -39 49l20 125q6 51 56 51h86q49 0 37 -51l-33 -207q-23 -142 -157 -146z" /> +<glyph unicode="„" horiz-adv-x="739" d="M121 -174l8 51q61 -2 68 62l10 63h-21q-47 0 -41 47l21 125q8 51 57 51h84q47 0 39 -51l-35 -207q-21 -142 -154 -144zM406 -174l8 51q57 -2 69 62l9 63h-21q-47 0 -41 47l21 125q8 51 57 51h84q47 0 39 -51l-35 -207q-23 -142 -155 -144z" /> +<glyph unicode="…" horiz-adv-x="1544" d="M299 39l20 121q6 43 48 43h79q41 0 35 -43l-18 -121q-8 -39 -49 -39h-80q-41 0 -35 39zM856 39l21 121q6 43 47 43h80q41 0 34 -43l-18 -121q-8 -39 -49 -39h-80q-16 0 -26.5 11.5t-8.5 27.5zM1411 39l21 121q6 43 47 43h82q41 0 34 -43l-20 -121q-6 -39 -47 -39h-80 q-41 0 -37 39z" /> +<glyph unicode=" " horiz-adv-x="381" /> +<glyph unicode="‹" horiz-adv-x="600" d="M78 725l487 416l74 -84l-401 -342l290 -340l-86 -76z" /> +<glyph unicode="›" horiz-adv-x="745" d="M217 385l406 344l-289 338l86 74l360 -422l-491 -420z" /> +<glyph unicode=" " horiz-adv-x="476" /> +<glyph unicode="€" horiz-adv-x="1476" d="M143 535l11 73l184 10l37 236l-178 12l10 68l182 14q32 213 96 323q141 244 473 245q184 0 474 -56l-15 -90q-35 4 -90 8t-183 11.5t-202 7.5q-96 0 -169 -25.5t-116 -64.5t-74.5 -103.5t-46 -120t-28.5 -135.5l510 -10l-10 -74l-516 -10l-35 -236l508 -12l-11 -74 q-33 0 -87 -1t-167.5 -3t-188.5 -3t-73 -3q-72 -416 297 -416q92 0 215 7.5t201 15.5l78 8l-15 -88q-246 -61 -493 -61q-39 0 -76 5t-85 18.5t-86 38t-77 64.5t-57 96t-28.5 134t10.5 178z" /> +<glyph unicode="™" horiz-adv-x="1298" d="M96 1401l15 98h530l-14 -98h-215l-99 -617h-96l96 617h-217zM608 784l168 715h88l142 -551l284 551h103l-50 -715h-94l33 492l-256 -492h-80l-127 494l-112 -494h-99z" /> +<glyph unicode="" horiz-adv-x="1085" d="M0 1085h1085v-1085h-1085v1085z" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Light-Italic-webfont.ttf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Light-Italic-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b48877fae3684122b1303f3e1513cd447310e97e Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Light-Italic-webfont.ttf differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Light-Italic-webfont.woff b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Light-Italic-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..9b05561f400451afedc33775afd8be88cbfc7ab4 Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Light-Italic-webfont.woff differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Light-webfont.eot b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Light-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..92187541b1bde940147b974b00d98c017a2208e9 Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Light-webfont.eot differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Light-webfont.svg b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Light-webfont.svg new file mode 100644 index 0000000000000000000000000000000000000000..1fb0538403dc859ad579985f17e543306b7dbe09 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Light-webfont.svg @@ -0,0 +1,187 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Copyright c 2011 Natanael Gama exondiscoveredcom with Reserved Font Name Exo +Designer : Natanael Gama +</metadata> +<defs> +<font id="ExoLight" horiz-adv-x="1171" > +<font-face units-per-em="2048" ascent="1638" descent="-410" /> +<missing-glyph horiz-adv-x="532" /> +<glyph unicode=" " horiz-adv-x="532" /> +<glyph unicode="	" horiz-adv-x="532" /> +<glyph unicode=" " horiz-adv-x="532" /> +<glyph unicode="!" horiz-adv-x="542" d="M188 39v121q0 43 41 43h82q39 0 39 -43v-121q0 -39 -39 -39h-82q-41 0 -41 39zM201 1497h135l-12 -1096h-111z" /> +<glyph unicode=""" horiz-adv-x="694" d="M164 1362v137h119v-137l-19 -275h-82zM416 1362v137h119v-137l-19 -275h-82z" /> +<glyph unicode="#" horiz-adv-x="1382" d="M45 487l12 80h340l58 365h-340l14 80h338l78 487h80l-78 -487h352l78 487h78l-76 -487h362l-14 -80h-362l-58 -367h363l-13 -80h-362l-78 -485h-78l76 485l-352 2l-78 -487h-78l76 487h-338zM477 567l350 -2l58 367h-350z" /> +<glyph unicode="$" horiz-adv-x="1183" d="M125 1012v135q2 207 106.5 285.5t294.5 78.5v177h92v-181q74 -6 219.5 -22.5t161.5 -18.5v-88l-471 19q-141 6 -213.5 -46.5t-72.5 -203.5v-135q0 -123 65.5 -170t177.5 -47h248q100 0 168 -28t100.5 -79t45 -104.5t12.5 -124.5v-140q0 -356 -441 -335v-166h-92v174 q-262 20 -356 37v84q20 0 110.5 -4.5t187.5 -6.5t181 -2q293 0 293 219v140q0 109 -48 163t-161 54h-246q-362 0 -362 336z" /> +<glyph unicode="%" horiz-adv-x="1953" d="M96 971v272q0 135 57.5 195.5t206.5 60.5h207q145 0 202.5 -60.5t57.5 -195.5v-272q0 -135 -57 -195.5t-207 -60.5h-207q-145 0 -202.5 60.5t-57.5 195.5zM195 971q0 -92 35.5 -125t125.5 -33h207q98 0 132 33t34 125v272q0 90 -35 124t-127 34h-207q-98 0 -131.5 -33 t-33.5 -125v-272zM475 0l897 1499h111l-897 -1499h-111zM1128 260v272q0 135 57.5 195.5t207.5 60.5h206q145 0 203 -60t58 -196v-272q0 -135 -57.5 -195.5t-207.5 -60.5h-206q-145 0 -203 60.5t-58 195.5zM1227 260q0 -92 35.5 -125t126.5 -33h206q98 0 132 33t34 125v272 q0 90 -34.5 124t-127.5 34h-206q-98 0 -132 -32.5t-34 -125.5v-272z" /> +<glyph unicode="&" horiz-adv-x="1314" d="M79.5 477.5q24.5 155.5 162.5 272.5l176 149l-129 174q-80 111 -68 201t72.5 148.5t138.5 68.5q236 29 545 -27v-78h-416q-96 0 -152.5 -28.5t-65.5 -92t67 -163.5l520 -703l260 265l39 -39l-119 -203l-109 -113l224 -309h-142l-168 227l-147 -137q-82 -76 -192.5 -95.5 t-222 26t-185.5 147.5q-113 154 -88.5 309.5zM266 233q78 -100 199 -123.5t219 60.5l160 149l-359 484l-159 -133q-240 -201 -60 -437z" /> +<glyph unicode="'" horiz-adv-x="327" d="M104 1362v137h119v-137l-16 -275h-82z" /> +<glyph unicode="(" horiz-adv-x="671" d="M172 668q0 158 34 327.5t82 300.5t95 240t81 167l34 58h127q-14 -23 -37 -61.5t-80 -161.5t-102.5 -246t-81 -296t-35.5 -328q0 -489 260 -968q45 -83 78 -130h-129q-12 18 -35 52t-79 146.5t-99 233.5t-78 303.5t-35 362.5z" /> +<glyph unicode=")" horiz-adv-x="669" d="M45 -430q14 20 36.5 56t81 153t102.5 237.5t81 300t37 351.5q0 449 -266 964l-72 129h129q12 -23 34.5 -61.5t79 -160.5t99.5 -245t78 -296t35 -330q0 -180 -34 -360.5t-82 -307.5t-95 -228.5t-81 -151.5l-34 -50h-129z" /> +<glyph unicode="*" horiz-adv-x="919" d="M115 1178v63l286 41l7 -115zM262 844l55 276l117 -26l-112 -269zM381 1473l61 24l150 -246l-109 -49zM449 987l63 100l229 -180l-32 -51zM537 1157l239 160l31 -55l-193 -195z" /> +<glyph unicode="+" horiz-adv-x="1058" d="M115 672v114h356v359h117v-359h358v-114h-358v-359h-117v359h-356z" /> +<glyph unicode="," horiz-adv-x="483" d="M164 43v117q0 45 41 45h76q41 0 41 -45v-201q0 -70 -38 -100.5t-75 -27.5l-37 3v47q33 -2 42 14.5t9 38.5v66h-18q-41 0 -41 43z" /> +<glyph unicode="-" horiz-adv-x="712" d="M45 537v114h623v-114h-623z" /> +<glyph unicode="." horiz-adv-x="487" d="M164 39v121q0 43 39 43h80q43 0 43 -43v-121q0 -39 -43 -39h-80q-39 0 -39 39z" /> +<glyph unicode="/" horiz-adv-x="786" d="M45 -147l576 1724h120l-575 -1724h-121z" /> +<glyph unicode="0" horiz-adv-x="1329" d="M160 332v835q0 160 99 246t253 86h315q176 0 259 -92t83 -240v-835q0 -332 -342 -332h-315q-154 0 -253 80t-99 252zM276 332q0 -111 66 -163t170 -52h315q225 0 226 215v835q0 215 -226 215h-315q-115 0 -175.5 -58t-60.5 -157v-835z" /> +<glyph unicode="1" horiz-adv-x="735" d="M92 1245v80l344 174h117v-1499h-117v1366z" /> +<glyph unicode="2" horiz-adv-x="1222" d="M92 1401v84q272 35 602 35q209 0 312.5 -123t103.5 -307q0 -111 -70.5 -244t-165 -240.5t-217 -219.5t-196.5 -169t-135 -100h784v-117h-1004v109q94 68 178.5 131t223.5 183t236.5 223.5t172 227t74.5 220.5q0 147 -75.5 227t-225.5 80h-598z" /> +<glyph unicode="3" horiz-adv-x="1220" d="M68 1386v72q174 53 630 45q168 -2 260.5 -96t92.5 -242v-141q0 -117 -52.5 -186.5t-121.5 -92.5q174 -86 174 -294v-121q0 -344 -365 -344q-166 0 -238.5 1t-185 11t-182.5 33l4 73h592q115 0 184.5 46.5t69.5 179.5v121q0 119 -72 175t-172 60l-479 14v88l479 19 q115 4 181.5 59.5t66.5 157.5v141q0 111 -70.5 166t-175.5 55h-620z" /> +<glyph unicode="4" horiz-adv-x="1214" d="M45 467l649 1032h137l-610 -977h647v445l58 153h59v-598h184v-90l-184 -31v-397h-117v397h-768z" /> +<glyph unicode="5" horiz-adv-x="1265" d="M174 31v84h623q104 0 161.5 64.5t57.5 164.5v215q0 227 -219 227h-316q-76 0 -136 -52t-60 -136h-107l45 901h864v-117h-755l-29 -565q23 29 73 55.5t113 30.5q55 4 115 4t118 -2t75 -2q174 0 255 -91t81 -249v-223q0 -98 -34 -171t-88.5 -108.5t-107.5 -52t-106 -16.5 q-379 0 -623 39z" /> +<glyph unicode="6" horiz-adv-x="1284" d="M150 786q0 375 101 550t251 175q348 0 598 -32v-84h-580q-74 0 -127 -59.5t-78.5 -156t-37 -182.5t-11.5 -172q295 35 553 35q190 0 260 -81t70 -222v-254q0 -305 -330 -305h-284q-90 0 -156 35t-120 120t-81.5 243.5t-27.5 389.5zM266 743q0 -629 269 -628h284 q100 0 157.5 40t57.5 154v248q0 106 -57 146t-158 40h-553z" /> +<glyph unicode="7" horiz-adv-x="1110" d="M68 1382v117h925l49 -82l-524 -1417h-139l514 1382h-825z" /> +<glyph unicode="8" horiz-adv-x="1312" d="M172 315v201q0 186 184 223q-184 51 -184 283v133q0 195 94 274.5t266 79.5h279q168 0 250 -84t82 -270v-133q0 -31 -7.5 -64.5t-24.5 -71.5t-52 -66.5t-82 -37.5q84 -18 125 -97t41 -169v-201q0 -94 -33 -160.5t-87 -98t-105.5 -44t-108.5 -12.5h-277 q-100 0 -171.5 25.5t-107.5 59.5t-55.5 84t-22.5 79.5t-3 66.5zM289 309q0 -193 243 -192h277q86 0 151.5 48t65.5 144v215q0 184 -211 185h-305q-86 0 -153.5 -44t-67.5 -141v-215zM289 1012q0 -188 221 -189h305q113 0 162 57.5t49 131.5v139q0 129 -52 185.5t-163 56.5 h-279q-129 0 -186 -51.5t-57 -190.5v-139z" /> +<glyph unicode="9" horiz-adv-x="1284" d="M137 948v254q0 305 330 305h285q90 0 155.5 -34.5t119.5 -119.5t82 -244t28 -390q0 -373 -101.5 -549t-251.5 -176q-416 0 -598 33v84h578q76 0 129 59t78.5 155.5t37 183.5t11.5 173q-313 -37 -553 -37q-190 0 -260 81t-70 222zM252 948q0 -106 57.5 -146t157.5 -40h553 q0 629 -268 629h-285q-100 0 -157.5 -40t-57.5 -155v-248z" /> +<glyph unicode=":" horiz-adv-x="489" d="M164 39v121q0 43 39 43h80q43 0 43 -43v-121q0 -39 -43 -39h-80q-39 0 -39 39zM164 926v121q0 41 39 40h80q43 0 43 -40v-121q0 -39 -43 -39h-80q-39 0 -39 39z" /> +<glyph unicode=";" horiz-adv-x="489" d="M164 43v117q0 18 11 31.5t30 13.5h76q41 0 41 -45v-201q0 -70 -38 -100.5t-75 -27.5l-37 3v47q33 -2 42 14.5t9 38.5v66h-18q-16 0 -28.5 13.5t-12.5 29.5zM166 926v121q0 43 41 43h80q41 0 41 -43v-121q0 -39 -41 -39h-80q-41 0 -41 39z" /> +<glyph unicode="<" horiz-adv-x="974" d="M115 666v120l747 353v-127l-592 -287l592 -307v-131z" /> +<glyph unicode="=" horiz-adv-x="964" d="M45 434v117h875v-117h-875zM45 897v117h875v-117h-875z" /> +<glyph unicode=">" horiz-adv-x="974" d="M115 287v131l592 307l-592 287v127l747 -353v-120z" /> +<glyph unicode="?" horiz-adv-x="1099" d="M45 1395v84q326 41 557 34q408 2 408 -378v-207q0 -389 -514 -322v-207h-119v303h264q254 8 254 226v207q0 141 -71.5 200.5t-235.5 59.5h-543zM354 39v121q0 43 41 43h84q39 0 39 -43v-121q0 -39 -39 -39h-84q-16 0 -28.5 11.5t-12.5 27.5z" /> +<glyph unicode="@" horiz-adv-x="1742" d="M150 0v713q0 35 3 64.5t21.5 83.5t51 91t102 67t166.5 30h430q129 0 221 -67t92 -220v-762h-88l-23 131l-24 -15q-25 -15 -65 -37t-88 -44.5t-108.5 -37.5t-111.5 -15q-113 -2 -188.5 66.5t-73.5 172.5v109q0 125 69.5 198.5t194.5 73.5h391q2 156 0 156q0 96 -51 135 t-153 39h-424q-106 0 -167 -47t-61 -172v-713q0 -246 228 -246h694q133 0 189.5 59.5t56.5 186.5v1049q0 127 -65.5 197.5t-180.5 70.5h-817v74q221 45 590 43h227q168 -4 265 -101.5t97 -283.5v-1049q0 -365 -362 -365h-694q-160 0 -252 94.5t-92 270.5zM582 279.5 q0 -44.5 2 -46.5q0 -53 46 -95t113 -40q131 -2 379 117v307l-381 -28q-68 -6 -113.5 -47t-43.5 -121q-2 -2 -2 -46.5z" /> +<glyph unicode="A" horiz-adv-x="1363" d="M102 0l555 1499h125l529 -1499h-137l-148 453h-627l-155 -453h-142zM442 569h543l-266 760z" /> +<glyph unicode="B" horiz-adv-x="1222" d="M184 0v1499h557q141 0 232.5 -59.5t124 -141t32.5 -184.5q0 -127 -56 -218t-159 -116q82 -18 152 -111.5t70 -250.5q0 -418 -396 -418h-557zM301 117h440q279 0 279 305q0 129 -76 217q-74 86 -197 86h-6h-440v-608zM301 844h440q127 0 199 69.5t74 200.5v8 q0 144 -74 201q-76 59 -199 59h-440v-538z" /> +<glyph unicode="C" horiz-adv-x="1177" d="M125 754q0 190 21.5 322t74.5 235.5t153.5 154t250.5 50.5q203 0 479 -52v-88l-18 1q-17 1 -45.5 3t-66.5 5.5t-83 5.5t-89 4t-91 3t-86 1q-141 0 -221 -52.5t-121 -194.5t-41 -402q0 -645 383 -646q96 0 216 5.5t191 9.5l72 4v-90q-242 -45 -479 -45q-500 0 -500 766z " /> +<glyph unicode="D" horiz-adv-x="1353" d="M184 0v1499h543q133 0 232.5 -50t154.5 -126t90 -182.5t45.5 -199.5t10.5 -198q0 -135 -30 -261t-90.5 -236.5t-167 -178t-245.5 -67.5h-543zM301 121h426q139 0 236.5 93t138.5 230.5t41 300.5q0 637 -416 637h-426v-1261z" /> +<glyph unicode="E" d="M184 252v981q0 141 74 205q70 61 171 61h13l633 -29v-88h-633q-80 0 -110.5 -37.5t-30.5 -111.5v-428l692 -17v-90l-692 -16v-430q0 -49 13.5 -79t40 -43t49 -16t59.5 -3h612v-86l-612 -31h-22q-43 0 -79 6q-44 8 -87.5 32.5t-67 81t-23.5 138.5z" /> +<glyph unicode="F" d="M184 0v1233q0 141 74 205q70 61 171 61h13l633 -29v-88h-633q-80 0 -110.5 -37.5t-30.5 -111.5v-428l692 -17v-90l-692 -16v-682h-117z" /> +<glyph unicode="G" horiz-adv-x="1261" d="M125 758q0 135 9 237.5t39 205t80 168t136 106.5t205 41q80 0 243.5 -17.5t272.5 -38.5v-92q-2 0 -38 3t-92 8t-120.5 9.5t-137.5 7.5t-128 3q-209 0 -280.5 -151.5t-71.5 -493.5q0 -358 77.5 -503t282.5 -147q70 0 176.5 25t177.5 49l72 25v475h-377v78q150 41 355 41 q66 0 139 -6v-791h-86l-27 104q-205 -114 -426 -114h-4h-12q-115 0 -200 38q-89 40 -139 104.5t-80 170t-38 208t-8 247.5z" /> +<glyph unicode="H" horiz-adv-x="1323" d="M184 0v1499h117v-717h778v717h117v-1499h-117v668h-778v-668h-117z" /> +<glyph unicode="I" horiz-adv-x="428" d="M184 0v1499h117v-1499h-117z" /> +<glyph unicode="J" horiz-adv-x="727" d="M80 43l8 82q51 -14 86 -20.5t87 -11.5q16 -2 30 -2q32 0 56 9q34 11 68 35.5t51 76.5t17 126v1161h117v-1161q0 -229 -106 -301q-75 -49 -196 -49h-10q-128 2 -208 55z" /> +<glyph unicode="K" horiz-adv-x="1210" d="M184 0v1499h117v-688h215l479 688h142l-512 -747l512 -752h-142l-479 692h-213v-692h-119z" /> +<glyph unicode="L" horiz-adv-x="1140" d="M184 258v1241h117v-1241q0 -49 13.5 -78.5t40 -43t49 -16.5t59.5 -3h604v-117h-604q-59 0 -102.5 8t-86.5 33t-66.5 80t-23.5 137z" /> +<glyph unicode="M" horiz-adv-x="1636" d="M125 0l123 1499h162l411 -1304l402 1304h163l134 -1499h-117l-117 1298l-401 -1298h-121l-414 1298l-108 -1298h-117z" /> +<glyph unicode="N" horiz-adv-x="1380" d="M184 0v1499h119l834 -1280v1280h116v-1499h-116l-836 1280v-1280h-117z" /> +<glyph unicode="O" horiz-adv-x="1382" d="M150 739q0 207 27.5 350.5t71.5 225.5t122 126t154.5 56t193.5 12q98 0 165.5 -8t138.5 -34.5t115 -79t80.5 -136.5t53 -212t16.5 -300q0 -197 -25.5 -332t-67.5 -216.5t-118 -126t-156.5 -58.5t-201.5 -14q-102 0 -171 8t-139.5 33.5t-113.5 76t-79 132.5t-51 205.5 t-15 291.5zM266 739q0 -168 15.5 -278.5t45 -182t88 -108.5t126 -49t178.5 -12q176 0 267 44t138 180t47 406q0 156 -11 266.5t-40.5 182.5t-61.5 113.5t-91.5 61t-109.5 25t-138 5.5q-57 0 -91 -1t-80 -7.5t-72.5 -18.5t-60.5 -34.5t-53.5 -56.5t-40 -82t-30.5 -112.5 t-17.5 -150t-7.5 -191.5z" /> +<glyph unicode="P" horiz-adv-x="1191" d="M137 0v1499h600q358 0 359 -426q0 -121 -23.5 -208t-57.5 -132t-87.5 -70.5t-93 -30.5t-97.5 -5q-61 0 -268 15t-215 20v-662h-117zM254 745h483q115 0 179 66q62 64 61 250v12q0 100 -22.5 167t-62.5 94.5t-74 36.5t-81 9h-483v-635z" /> +<glyph unicode="Q" horiz-adv-x="1382" d="M150 739q0 172 16 300t53 212t81 136.5t114.5 79t137 34.5t165.5 8q121 0 197.5 -12t154.5 -56t122 -127t70.5 -225.5t26.5 -349.5q0 -197 -25.5 -332t-68.5 -216.5t-119 -126t-156.5 -58.5t-201.5 -14q-102 0 -171 8t-139.5 33.5t-112.5 76t-78 132.5t-51 205.5 t-15 291.5zM266 739q0 -209 21.5 -332.5t79 -190t135.5 -87t215 -20.5q88 0 148.5 9t114.5 33.5t88 68.5t58.5 115t34.5 169t10 235q0 117 -7 208t-23.5 159t-35 116t-52 79.5t-62 50t-79 28t-90.5 11.5t-105 2q-74 0 -115 -3.5t-97 -15.5t-86 -37.5t-63.5 -71.5t-50 -116 t-28 -172.5t-11.5 -237.5zM672 -68h80q86 -97 210 -97q64 0 138 26v-125q-58 -22 -121 -22q-68 0 -142 27q-140 52 -165 191z" /> +<glyph unicode="R" horiz-adv-x="1200" d="M137 0v1499h615q350 0 350 -436q0 -410 -283 -430l322 -633h-127l-320 629q-436 25 -440 26v-655h-117zM254 754h498q53 0 86.5 8t70.5 35.5t55.5 94t18.5 171.5q0 102 -19.5 168.5t-55.5 97.5t-71.5 41t-84.5 10h-498v-626z" /> +<glyph unicode="S" horiz-adv-x="1196" d="M150 1012v135q0 207 104 285.5t297 78.5q178 0 493 -45v-90q-494 18 -493 19q-15 1 -29 1q-120 0 -184 -46q-72 -52 -72 -203v-135q0 -135 57.5 -176t182.5 -41h272q98 0 165 -28t99.5 -79t46 -105.5t13.5 -123.5v-140q0 -104 -34 -173.5t-96.5 -103.5t-128 -46 t-151.5 -12q-74 0 -252 16t-250 29v90q195 -18 502 -19q293 0 293 219v140q0 109 -47 163t-160 54h-268q-117 0 -192.5 27.5t-110.5 80t-46 103.5t-11 125z" /> +<glyph unicode="T" horiz-adv-x="1200" d="M94 1382v117h1047v-117h-471v-1382h-117v1382h-459z" /> +<glyph unicode="U" horiz-adv-x="1390" d="M184 655v844h117v-844q0 -90 7 -162.5t16.5 -127t31 -96.5t38 -68.5t50 -45t56 -28.5t67.5 -14t72 -5.5t80 -1.5h8q84 0 131 5.5t109.5 35t95.5 85t57.5 162t24.5 261.5v844h117v-844q0 -137 -18.5 -244.5t-43 -177t-72 -117.5t-85 -73t-103.5 -37t-104.5 -14t-108.5 -2 h-17q-90 0 -136 3t-119.5 20.5t-111.5 59.5t-81 112.5t-60.5 189t-17.5 280.5z" /> +<glyph unicode="V" horiz-adv-x="1363" d="M102 1499h129l465 -1323l488 1323h127l-553 -1499h-125z" /> +<glyph unicode="W" horiz-adv-x="1976" d="M102 1499h129l463 -1309l416 1309h131l-164 -526l295 -791l424 1317h127l-485 -1499h-125l-297 780l-258 -780h-125z" /> +<glyph unicode="X" horiz-adv-x="1198" d="M102 1499h131l388 -655l393 655h131l-447 -745l437 -754h-131l-383 651l-381 -651h-131l436 754z" /> +<glyph unicode="Y" horiz-adv-x="1282" d="M102 1499h129l414 -825l457 825h127l-524 -967v-532h-117v532z" /> +<glyph unicode="Z" horiz-adv-x="1142" d="M80 0v117l838 1265h-838v117h989v-117l-838 -1265h838v-117h-989z" /> +<glyph unicode="[" horiz-adv-x="661" d="M195 -78v1450q0 57 9 108.5t35.5 112t86 96t147.5 35.5h143v-116h-143q-74 0 -118 -61.5t-44 -174.5v-1450q0 -106 41 -170.5t121 -64.5h143v-117h-143q-88 0 -147.5 36t-86 96t-35.5 111.5t-9 108.5z" /> +<glyph unicode="\" horiz-adv-x="786" d="M45 1577h121l575 -1724h-120z" /> +<glyph unicode="]" horiz-adv-x="661" d="M45 -313h143q80 0 121 64.5t41 170.5v1450q0 113 -43 174.5t-119 61.5h-143v116h143q88 0 147.5 -35.5t86.5 -96t36 -111.5t9 -109v-1450q0 -57 -9 -108.5t-36 -111.5t-86.5 -96t-147.5 -36h-143v117z" /> +<glyph unicode="^" horiz-adv-x="813" d="M115 1087l250 267h110l223 -267h-108l-172 177l-193 -177h-110z" /> +<glyph unicode="_" horiz-adv-x="1368" d="M45 -2v117h1278v-117h-1278z" /> +<glyph unicode="`" horiz-adv-x="466" d="M45 1360h148l229 -273h-105z" /> +<glyph unicode="a" horiz-adv-x="1062" d="M92 258v125q0 127 73 199.5t200 72.5q234 -1 351.5 -1t117.5 1q1 68 1 102.5t-1 35.5q0 202 -201 202h-2q-193 0 -504 -32v84q215 59 510 61h7q132 0 218 -77q88 -79 88 -238v-793h-86l-30 131l-31 -14q-31 -14 -82 -36t-109.5 -43.5t-126 -35.5t-120.5 -14 q-117 0 -195 71.5t-78 198.5zM209 268q0 -86 44 -125t112 -39h6q162 0 463 111v352l-469 -28q-156 -10 -156 -164v-107z" /> +<glyph unicode="b" horiz-adv-x="1132" d="M137 0v1608h113v-586q92 37 210 59.5t193 22.5q111 0 186.5 -47t113.5 -133t52.5 -177.5t14.5 -207.5q0 -82 -9.5 -155t-35 -147.5t-65.5 -128t-105.5 -87t-151.5 -33.5q-94 0 -224 47t-177 86l-33 -121h-82zM252 205q225 -100 401 -101q115 0 182.5 110t67.5 325 q0 254 -64.5 351t-185.5 97q-190 0 -401 -55v-727z" /> +<glyph unicode="c" horiz-adv-x="1024" d="M115 545q0 172 25.5 285.5t76.5 170t110.5 77t145.5 20.5q168 0 447 -54v-81q-264 18 -447 18q-61 0 -100 -13.5t-74 -56.5t-51.5 -135t-16.5 -239q0 -250 57.5 -340.5t184.5 -90.5l461 29v-86q-199 -55 -461 -59q-84 0 -142.5 20.5t-110.5 76.5t-78.5 171t-26.5 287z " /> +<glyph unicode="d" horiz-adv-x="1132" d="M115 539q0 117 14 208t51 177t113 133t186 47q76 0 194 -22.5t210 -59.5v586h112v-1608h-80l-34 121q-47 -39 -177.5 -86t-224.5 -47q-106 0 -181 49t-113 134t-54 174.5t-16 193.5zM231 539q0 -219 67 -327t181 -108q180 0 402 101v727q-213 55 -402 55 q-121 0 -184.5 -96t-63.5 -352z" /> +<glyph unicode="e" horiz-adv-x="1075" d="M115 549q0 180 23.5 288.5t84 166t137 75t209.5 17.5q88 0 142.5 -5.5t113 -27t89 -62t51 -112.5t20.5 -178q0 -119 -68.5 -175.5t-211.5 -56.5h-474q0 -223 54.5 -298t187.5 -75q309 0 492 27v-86q-203 -57 -492 -57q-207 2 -282.5 123t-75.5 436zM231 594h474 q80 0 121.5 25.5t41.5 91.5q0 92 -13 145t-52 81t-88 35t-144 7q-72 0 -112.5 -3t-84.5 -16.5t-66.5 -38t-42 -67.5t-27 -105.5t-7.5 -154.5z" /> +<glyph unicode="f" horiz-adv-x="806" d="M45 971v86l193 30v203q0 45 2 77t14 82t35.5 82t70 55.5t109.5 23.5q164 0 293 -41v-74h-264h-7q-86 0 -111 -48q-26 -50 -26 -157v-203h324v-116h-324v-971h-116v971h-193z" /> +<glyph unicode="g" horiz-adv-x="1146" d="M102 -57l64 161q-57 44 -57 136q0 55 35.5 103t103.5 56q-139 72 -139 306q0 387 354 387h639v-86l-187 -31q2 -2 11.5 -14.5t13.5 -18.5t13.5 -21.5t14.5 -27.5t12 -33.5t10 -43t6 -50.5t3 -61q0 -57 -13 -113.5t-46 -122.5t-104.5 -106.5t-173.5 -40.5h-320 q-117 0 -117 -80q0 -43 34 -64.5t77 -21.5h432q131 0 202.5 -76t71.5 -203v-121q0 -309 -307 -309h-307q-150 0 -238 81t-88 234v181zM221 72v-310q0 -198 205 -198h2h307q190 0 191 192v115q0 86 -38 128t-138 42h-412q-35 0 -63.5 8t-41.5 16zM225 705q0 -115 54.5 -191 t169.5 -76h202q125 0 179 81q53 78 53 179v7q-4 135 -51.5 202.5t-151.5 67.5h-223q-232 0 -232 -270z" /> +<glyph unicode="h" horiz-adv-x="1118" d="M137 0v1606h117v-645q78 47 129 72.5t130 49t157 23.5q156 0 246 -102.5t90 -245.5v-758h-117v758q0 109 -59.5 170t-159.5 61q-117 0 -200 -25.5t-216 -93.5v-870h-117z" /> +<glyph unicode="i" horiz-adv-x="382" d="M115 1268v114q0 43 41 43h75q39 0 39 -43v-114q0 -41 -39 -41h-75q-41 0 -41 41zM131 0v1087h117v-1087h-117z" /> +<glyph unicode="j" horiz-adv-x="430" d="M137 1268v114q0 43 41 43h76q39 0 39 -43v-114q0 -41 -39 -41h-76q-41 0 -41 41zM156 -553v1640h116v-1095v-57q0 -316 -41 -488h-75z" /> +<glyph unicode="k" horiz-adv-x="1021" d="M137 0v1602h117v-918h96l461 403h166l-516 -462l516 -625h-150l-477 565h-96v-565h-117z" /> +<glyph unicode="l" horiz-adv-x="612" d="M137 387v1217h117v-1217q0 -82 11 -135t35 -80t44.5 -38t50.5 -17q158 -37 172 -37v-80h-166q-264 0 -264 387z" /> +<glyph unicode="m" horiz-adv-x="1861" d="M137 0v1087h80l37 -129q78 47 127 73t126 48.5t152 22.5q100 0 181.5 -44t117.5 -118q88 70 209 116t244 46q147 0 241.5 -99.5t94.5 -250.5v-752h-117v752q0 102 -60.5 167.5t-158.5 65.5q-225 0 -424 -125q10 -27 10 -104v-756h-116v752q0 102 -61.5 167.5t-160.5 65.5 q-113 0 -191.5 -25.5t-213.5 -93.5v-866h-117z" /> +<glyph unicode="n" horiz-adv-x="1118" d="M137 0v1087h80l37 -126q78 47 129 72.5t130 49t157 23.5q156 0 246 -102.5t90 -245.5v-758h-117v758q0 106 -60.5 168.5t-158.5 62.5q-117 0 -200 -25.5t-216 -93.5v-870h-117z" /> +<glyph unicode="o" horiz-adv-x="1165" d="M115 528q0 328 102 449t367 121q268 0 368.5 -126t100.5 -444q0 -303 -101.5 -420.5t-367.5 -117.5q-268 0 -368.5 120.5t-100.5 417.5zM231 528q0 -141 21.5 -228t72 -128t106.5 -53.5t153 -12.5q98 0 155.5 13.5t106.5 56.5t69.5 128t20.5 224q0 152 -19.5 243 t-67.5 137t-106.5 59.5t-158.5 13.5q-80 0 -128 -7t-96.5 -31.5t-73 -73t-40 -132.5t-15.5 -209z" /> +<glyph unicode="p" horiz-adv-x="1132" d="M137 -551v1638h82l33 -120q47 39 177 86t224 47q86 0 151.5 -34t105.5 -87t65.5 -128t35 -147.5t9.5 -154.5q0 -117 -14.5 -208t-52.5 -177t-113.5 -133t-186.5 -47q-76 0 -193.5 22.5t-209.5 59.5v-617h-113zM252 156q211 -55 401 -56q121 0 185.5 97.5t64.5 351.5 q0 215 -67.5 324.5t-182.5 109.5q-180 0 -401 -100v-727z" /> +<glyph unicode="q" horiz-adv-x="1138" d="M115 549q0 264 94 407.5t283 143.5q143 0 509 -39v-1614h-116v612q-195 -79 -388 -79h-5q-115 0 -191 41.5t-116 122.5t-55 177.5t-15 227.5zM231 549q0 -80 4.5 -136.5t18.5 -121t42 -103t77 -65.5t119 -27q174 0 393 56v831h-393q-261 0 -261 -434z" /> +<glyph unicode="r" horiz-adv-x="870" d="M137 0v1087h80l37 -137q4 2 36 20.5t39 22.5t36.5 20.5t41 20.5t39 17.5t43 17.5t41 12.5t46 10.5t46 5t52.5 3q111 0 151 -17v-114q-49 12 -151 12q-80 0 -156 -19.5t-116 -37t-148 -68.5v-856h-117z" /> +<glyph unicode="s" horiz-adv-x="1034" d="M92 737v94q0 131 65.5 199t217.5 68q215 0 514 -29v-86h-514q-102 0 -134 -36t-32 -116v-94q0 -92 38 -115.5t128 -23.5h303q127 0 196.5 -67.5t69.5 -184.5v-100q0 -152 -72.5 -204t-193.5 -52q-70 0 -271.5 13t-269.5 20v83h541h5h4q141 0 140 140v100q0 137 -149 137 h-303q-154 0 -218.5 51t-64.5 203z" /> +<glyph unicode="t" horiz-adv-x="753" d="M45 973v86l193 31l30 303h86v-303h332v-117h-332v-586q0 -104 23.5 -165.5t50.5 -79t68 -25.5q158 -35 172 -35v-82h-166q-264 0 -264 387v586h-193z" /> +<glyph unicode="u" horiz-adv-x="1118" d="M115 330v757h116v-757q0 -106 60.5 -169t159.5 -63q117 0 197.5 27t217.5 94v868h117v-1087h-80l-37 127q-78 -47 -129 -72.5t-130 -49t-156 -23.5q-156 0 -246 102.5t-90 245.5z" /> +<glyph unicode="v" horiz-adv-x="1085" d="M45 1087h127l369 -917l374 917h125l-442 -1087h-119z" /> +<glyph unicode="w" horiz-adv-x="1624" d="M45 1087h129l348 -917l318 917h127l-125 -368l252 -549l358 917h127l-422 -1087h-119l-254 563l-198 -563h-127z" /> +<glyph unicode="x" horiz-adv-x="1042" d="M55 0l394 545l-394 542h146l317 -444l324 444h145l-395 -546l385 -541h-135l-320 442l-321 -442h-146z" /> +<glyph unicode="y" horiz-adv-x="1116" d="M47 1087h129l277 -849q23 -66 63 -96q34 -25 61 -25h7l28 4l326 966h129l-479 -1431l-133 -209h-70l186 553q-176 0 -243 225z" /> +<glyph unicode="z" horiz-adv-x="946" d="M68 971v116h811v-116l-627 -852h627v-117h-779v117l633 852h-665z" /> +<glyph unicode="{" horiz-adv-x="643" d="M45 629v108q39 4 59.5 7.5t55.5 15.5t52 36.5t17 63.5v483q0 164 89.5 272.5t279.5 108.5v-116q-121 0 -186.5 -58.5t-65.5 -206.5v-483q0 -72 -48 -118t-122 -58q72 -10 120 -58t48 -112v-592q0 -246 254 -235v-117q-109 0 -185.5 31.5t-114.5 86t-54.5 111t-16.5 123.5 v584q0 63 -57 96t-125 27z" /> +<glyph unicode="|" horiz-adv-x="507" d="M197 -147v1724h116v-1724h-116z" /> +<glyph unicode="}" horiz-adv-x="643" d="M45 -313q254 -10 254 235v592q0 63 48 111.5t120 58.5q-74 12 -122 58t-48 118v483q0 147 -65.5 206t-186.5 59v116q190 0 279.5 -108.5t89.5 -272.5v-483q0 -39 17.5 -63.5t52 -36.5t55 -15.5t59.5 -7.5v-108q-68 6 -125 -27t-57 -96v-584q0 -68 -16.5 -124 t-54.5 -110.5t-114.5 -86t-185.5 -31.5v117z" /> +<glyph unicode="~" horiz-adv-x="919" d="M115 1171q12 10 42.5 38t45 39.5t40 27.5t50 22.5t53.5 6.5q45 0 120 -49.5t112 -49.5q23 0 44 5.5t46.5 18.5t36 19t39 25.5t30.5 21.5l33 -61q-4 -4 -29.5 -28.5t-35 -34t-34 -29t-41 -27.5t-41 -15t-48.5 -7q-47 0 -123 49t-113 49q-35 0 -63.5 -10.5t-71.5 -36 t-62 -35.5z" /> +<glyph unicode="¢" horiz-adv-x="1001" d="M92 545q0 178 26.5 292.5t82 172t120 76t162.5 14.5v188h95v-194q139 -14 319 -50v-81q-264 20 -446 20q-61 0 -100.5 -13.5t-74 -57.5t-51 -136t-16.5 -239q0 -250 57.5 -341.5t184.5 -91.5l460 29v-86q-152 -45 -333 -55v-178h-95v174q-78 -2 -131 8t-106 43t-84 93.5 t-50.5 164t-19.5 248.5z" /> +<glyph unicode="£" horiz-adv-x="1222" d="M115 0v90l147 27v573h-147v70l147 28v246q0 92 12.5 164t33 120t55 83t69.5 53.5t88 28.5t97.5 13t111.5 3q51 0 146.5 -7t164.5 -14l70 -8v-86h-377q-74 0 -117 -3t-89 -14t-69.5 -33.5t-44 -61.5t-27.5 -96.5t-7 -141.5v-246l569 -28v-70h-569v-573h729v-117h-993z" /> +<glyph unicode="¥" horiz-adv-x="1216" d="M45 1499h131l412 -725l450 725h133l-522 -842h387v-90h-389v-133h389v-90h-389v-344h-117v344h-368v90h368v133h-368v90h366z" /> +<glyph unicode="¨" horiz-adv-x="911" d="M115 1192q0 33 23.5 56.5t58.5 23.5q33 0 55 -23.5t22 -56.5q0 -35 -22.5 -58.5t-55 -23.5t-57 24.5t-24.5 57.5zM637 1192q0 33 23.5 56.5t58.5 23.5q33 0 55.5 -23.5t22.5 -56.5q0 -35 -22.5 -58.5t-55.5 -23.5q-35 0 -58.5 24.5t-23.5 57.5z" /> +<glyph unicode="©" horiz-adv-x="1697" d="M125 754q0 111 11 207t43 198.5t83 175t138 118.5t200 46h543q430 0 430 -745q0 -209 -41 -373t-141.5 -272.5t-247.5 -108.5h-543q-133 0 -231.5 77t-148.5 198.5t-72.5 241.5t-22.5 237zM221 754q0 -162 38 -305.5t127 -248t214 -104.5h543q145 2 239.5 173t94.5 485 q0 649 -334 649h-543q-377 0 -379 -649zM485 748q0 233 80 339.5t215 106.5q113 0 365 -45v-76q-172 25 -365 25q-199 0 -198 -357q0 -166 44 -255t154 -89q195 0 377 33v-76q-188 -53 -377 -53q-137 0 -216 97.5t-79 349.5z" /> +<glyph unicode="«" horiz-adv-x="1122" d="M115 725l420 416l83 -82l-339 -334l350 -344l-82 -82zM494 725l421 416l82 -82l-340 -334l353 -344l-84 -82z" /> +<glyph unicode="­" horiz-adv-x="712" d="M45 537v114h623v-114h-623z" /> +<glyph unicode="®" horiz-adv-x="1697" d="M125 754q0 111 11 207t43 198.5t83 175t138 118.5t200 46h543q430 0 430 -745q0 -209 -41 -373t-141.5 -272.5t-247.5 -108.5h-543q-133 0 -231.5 77t-148.5 198.5t-72.5 241.5t-22.5 237zM221 754q0 -162 38 -305.5t127 -248t214 -104.5h543q145 2 239.5 173t94.5 485 q0 649 -334 649h-543q-377 0 -379 -649zM551 313v875h362q268 0 269 -260q0 -78 -18.5 -130.5t-54.5 -76t-58.5 -30.5t-62.5 -13q-9 -2 -13 -2l199 -363h-109l-201 363l-217 20v-383h-96zM647 762h279q92 0 125.5 32.5t33.5 131t-43 132.5t-116 34h-279v-330z" /> +<glyph unicode="´" horiz-adv-x="466" d="M45 1087l229 273h148l-272 -273h-105z" /> +<glyph unicode="¸" horiz-adv-x="526" d="M115 -299l94 23q55 16 78.5 61t21.5 139h103q0 -158 -42 -218t-165 -60h-90v55z" /> +<glyph unicode="»" horiz-adv-x="1122" d="M115 381l352 344l-342 334l82 82l422 -416l-430 -426zM494 381l352 344l-340 334l82 82l422 -416l-432 -426z" /> +<glyph unicode="À" horiz-adv-x="1363" d="M102 0l555 1499h125l529 -1499h-137l-148 453h-627l-155 -453h-142zM395 1905h148l227 -273h-102zM442 569h543l-266 760z" /> +<glyph unicode="Â" horiz-adv-x="1363" d="M102 0l555 1499h125l529 -1499h-137l-148 453h-627l-155 -453h-142zM428 1632l250 266h108l226 -266h-109l-174 176l-192 -176h-109zM442 569h543l-266 760z" /> +<glyph unicode="Æ" horiz-adv-x="1894" d="M68 0l665 1227q98 182 190.5 229t256.5 43l618 -29v-90h-618q-49 0 -79 -9t-42 -29.5t-15.5 -41t-2.5 -56.5q0 -9 -1 -15v-430l676 -19v-88l-676 -18v-424q0 -49 12.5 -79t41 -41t48 -13t60.5 -2l594 -2v-93l-594 -28q-279 -16 -278 256v235h-463l-262 -483h-131z M522 598h402v741z" /> +<glyph unicode="Ç" horiz-adv-x="1177" d="M125 754q0 190 21.5 322t74.5 235.5t153.5 154t250.5 50.5q203 0 479 -52v-88l-18 1q-17 1 -45.5 3t-66.5 5.5t-83 5.5t-89 4t-91 3t-86 1q-141 0 -221 -52.5t-121 -194.5t-41 -402q0 -645 383 -646q96 0 216 5.5t191 9.5l72 4v-90q-242 -45 -479 -45q-500 0 -500 766z M442 -297l95 23q57 16 79.5 61t20.5 139h102q0 -158 -42 -218t-165 -60h-90v55z" /> +<glyph unicode="È" d="M184 252v981q0 141 74 205.5t184 60.5l633 -29v-88h-633q-80 0 -110.5 -37.5t-30.5 -111.5v-428l692 -17v-90l-692 -16v-430q0 -49 13.5 -79t40 -43t49 -16t59.5 -3h612v-86l-612 -31q-57 -2 -101.5 6t-87.5 32.5t-66.5 81t-23.5 138.5zM377 1894h147l228 -272h-103z" /> +<glyph unicode="É" d="M184 252v981q0 141 74 205.5t184 60.5l633 -29v-88h-633q-80 0 -110.5 -37.5t-30.5 -111.5v-428l692 -17v-90l-692 -16v-430q0 -49 13.5 -79t40 -43t49 -16t59.5 -3h612v-86l-612 -31q-57 -2 -101.5 6t-87.5 32.5t-66.5 81t-23.5 138.5zM618 1622l230 272h147l-272 -272 h-105z" /> +<glyph unicode="Ê" d="M184 252v981q0 141 74 205.5t184 60.5l633 -29v-88h-633q-80 0 -110.5 -37.5t-30.5 -111.5v-428l692 -17v-90l-692 -16v-430q0 -49 13.5 -79t40 -43t49 -16t59.5 -3h612v-86l-612 -31q-57 -2 -101.5 6t-87.5 32.5t-66.5 81t-23.5 138.5zM369 1632l249 266h111l223 -266 h-108l-174 176l-191 -176h-110z" /> +<glyph unicode="Ë" d="M184 252v981q0 141 74 205.5t184 60.5l633 -29v-88h-633q-80 0 -110.5 -37.5t-30.5 -111.5v-428l692 -17v-90l-692 -16v-430q0 -49 13.5 -79t40 -43t49 -16t59.5 -3h612v-86l-612 -31q-57 -2 -101.5 6t-87.5 32.5t-66.5 81t-23.5 138.5zM313 1726.5q0 34.5 23.5 57 t56.5 22.5t56.5 -22.5t23.5 -57t-23.5 -58t-56.5 -23.5t-56.5 23.5t-23.5 58zM834 1726q0 33 23.5 56.5t58 23.5t57 -22.5t22.5 -57t-23.5 -58t-56.5 -23.5q-35 0 -58 23t-23 58z" /> +<glyph unicode="Î" horiz-adv-x="428" d="M-51 1632l252 266h108l226 -266h-109l-174 176l-193 -176h-110zM184 0v1499h117v-1499h-117z" /> +<glyph unicode="Ï" horiz-adv-x="428" d="M-100 1714q0 33 23.5 56.5t58 23.5t57 -22.5t22.5 -57.5t-23.5 -58.5t-55.5 -23.5q-35 0 -58.5 23.5t-23.5 58.5zM184 0v1499h117v-1499h-117zM422 1714q0 33 23.5 56.5t58.5 23.5q33 0 56.5 -22.5t23.5 -57.5t-23.5 -58.5t-56.5 -23.5t-57.5 23.5t-24.5 58.5z" /> +<glyph unicode="Ô" horiz-adv-x="1382" d="M150 739q0 207 27.5 350.5t71.5 225.5t122 126t154.5 56t193.5 12q98 0 165.5 -8t138.5 -34.5t115 -79t80.5 -136.5t53 -212t16.5 -300q0 -197 -25.5 -332t-67.5 -216.5t-118 -126t-156.5 -58.5t-201.5 -14q-102 0 -171 8t-139.5 33.5t-113.5 76t-79 132.5t-51 205.5 t-15 291.5zM266 739q0 -168 15.5 -278.5t45 -182t88 -108.5t126 -49t178.5 -12q176 0 267 44t138 180t47 406q0 156 -11 266.5t-40.5 182.5t-61.5 113.5t-91.5 61t-109.5 25t-138 5.5q-57 0 -91 -1t-80 -7.5t-72.5 -18.5t-60.5 -34.5t-53.5 -56.5t-40 -82t-30.5 -112.5 t-17.5 -150t-7.5 -191.5zM428 1632l250 266h110l224 -266h-109l-174 176l-192 -176h-109z" /> +<glyph unicode="Ù" horiz-adv-x="1390" d="M184 655v844h117v-844q0 -90 7 -162.5t16.5 -127t31 -96.5t38 -68.5t50 -45t56 -28.5t67.5 -14t72 -5.5t80 -1.5h8q84 0 131 5.5t109.5 35t95.5 85t57.5 162t24.5 261.5v844h117v-844q0 -137 -18.5 -244.5t-43 -177t-72 -117.5t-85 -73t-103.5 -37t-104.5 -14t-108.5 -2 h-17q-90 0 -136 3t-119.5 20.5t-111.5 59.5t-81 112.5t-60.5 189t-17.5 280.5zM399 1905h146l229 -273h-102z" /> +<glyph unicode="Û" horiz-adv-x="1390" d="M184 655v844h117v-844q0 -90 7 -162.5t16.5 -127t31 -96.5t38 -68.5t50 -45t56 -28.5t67.5 -14t72 -5.5t80 -1.5h8q84 0 131 5.5t109.5 35t95.5 85t57.5 162t24.5 261.5v844h117v-844q0 -137 -18.5 -244.5t-43 -177t-72 -117.5t-85 -73t-103.5 -37t-104.5 -14t-108.5 -2 h-17q-90 0 -136 3t-119.5 20.5t-111.5 59.5t-81 112.5t-60.5 189t-17.5 280.5zM430 1632l250 266h111l225 -266h-109l-174 176l-192 -176h-111z" /> +<glyph unicode="Ü" horiz-adv-x="1390" d="M184 655v844h117v-844q0 -90 7 -162.5t16.5 -127t31 -96.5t38 -68.5t50 -45t56 -28.5t67.5 -14t72 -5.5t80 -1.5h8q84 0 131 5.5t109.5 35t95.5 85t57.5 162t24.5 261.5v844h117v-844q0 -137 -18.5 -244.5t-43 -177t-72 -117.5t-85 -73t-103.5 -37t-104.5 -14t-108.5 -2 h-17q-90 0 -136 3t-119.5 20.5t-111.5 59.5t-81 112.5t-60.5 189t-17.5 280.5zM381 1714q0 33 23.5 56.5t58.5 23.5q33 0 56.5 -22.5t23.5 -57.5t-23.5 -58.5t-56.5 -23.5t-57.5 23.5t-24.5 58.5zM903 1714q0 33 23.5 56.5t58.5 23.5t57.5 -22.5t22.5 -57.5t-23.5 -58.5 t-56.5 -23.5q-35 0 -58.5 23.5t-23.5 58.5z" /> +<glyph unicode="à" horiz-adv-x="1062" d="M92 258v125q0 127 73 199.5t200 72.5q469 -2 469 0q2 135 0 138q0 203 -203 202q-193 0 -504 -32v84q215 59 510 61q137 2 225 -77t88 -238v-793h-86l-30 131l-31 -14q-31 -14 -82 -36t-109.5 -43.5t-126 -35.5t-120.5 -14q-117 0 -195 71.5t-78 198.5zM209 268 q0 -86 44 -125t112 -39q162 -2 469 111v352l-469 -28q-156 -10 -156 -164v-107zM225 1503h146l229 -272h-102z" /> +<glyph unicode="â" horiz-adv-x="1062" d="M92 258v125q0 127 73 199.5t200 72.5q469 -2 469 0q2 135 0 138q0 203 -203 202q-193 0 -504 -32v84q215 59 510 61q137 2 225 -77t88 -238v-793h-86l-30 131l-31 -14q-31 -14 -82 -36t-109.5 -43.5t-126 -35.5t-120.5 -14q-117 0 -195 71.5t-78 198.5zM209 268 q0 -86 44 -125t112 -39q162 -2 469 111v352l-469 -28q-156 -10 -156 -164v-107zM250 1231l252 266h108l226 -266h-109l-174 176l-193 -176h-110z" /> +<glyph unicode="æ" horiz-adv-x="1796" d="M92 266v74q0 127 73 199.5t200 72.5q469 -2 469 0q2 186 0 189q0 203 -203 203q-186 0 -504 -33v84q193 57 510 61q201 4 274 -151q45 82 134.5 110.5t242.5 28.5q90 0 142.5 -4t112 -24.5t90 -59.5t51 -110.5t20.5 -178.5q0 -119 -68.5 -175t-212.5 -56h-471 q-2 -236 41 -308.5t201 -72.5q287 -4 489 26v-86q-203 -57 -489 -57q-98 0 -165.5 23.5t-93.5 47t-63 70.5l-34 -14q-35 -14 -91.5 -35.5t-121 -43t-136 -36t-124.5 -14.5q-117 0 -195 71.5t-78 198.5zM209 276q0 -86 44 -124.5t112 -38.5q162 -2 469 114v303l-469 -26 q-156 -8 -156 -164v-64zM952 610h471q84 0 124 24.5t40 92.5q0 76 -10 122t-26.5 75.5t-56.5 42t-82 16.5t-122 4q-72 0 -114.5 -4t-85.5 -16.5t-66 -37t-41 -67.5t-24.5 -103.5t-6.5 -148.5z" /> +<glyph unicode="ç" horiz-adv-x="1024" d="M115 545q0 172 25.5 285.5t76.5 171t110.5 78t145.5 20.5q158 0 447 -56v-81q-264 20 -447 20q-61 0 -100 -13.5t-74 -57.5t-51.5 -136t-16.5 -239q0 -250 57.5 -341.5t184.5 -91.5l461 29v-86q-199 -55 -461 -59q-84 0 -142.5 20.5t-110.5 77.5t-78.5 172t-26.5 287z M348 -299l94 25q55 16 78 61t23 139h102q0 -160 -42 -219t-165 -59h-90v53z" /> +<glyph unicode="è" horiz-adv-x="1075" d="M115 549q0 180 23.5 288.5t84 166t137 75t209.5 17.5q88 0 142.5 -5.5t113 -27t89 -62t51 -112.5t20.5 -178q0 -119 -68.5 -175.5t-211.5 -56.5h-474q0 -223 54.5 -298t187.5 -75q309 0 492 27v-86q-203 -57 -492 -57q-207 2 -282.5 123t-75.5 436zM231 594h474 q80 0 121.5 25.5t41.5 91.5q0 92 -13 145t-52 81t-88 35t-144 7q-72 0 -112.5 -3t-84.5 -16.5t-66.5 -38t-42 -67.5t-27 -105.5t-7.5 -154.5zM256 1489h145l230 -272h-103z" /> +<glyph unicode="é" horiz-adv-x="1075" d="M115 549q0 180 23.5 288.5t84 166t137 75t209.5 17.5q88 0 142.5 -5.5t113 -27t89 -62t51 -112.5t20.5 -178q0 -119 -68.5 -175.5t-211.5 -56.5h-474q0 -223 54.5 -298t187.5 -75q309 0 492 27v-86q-203 -57 -492 -57q-207 2 -282.5 123t-75.5 436zM231 594h474 q80 0 121.5 25.5t41.5 91.5q0 92 -13 145t-52 81t-88 35t-144 7q-72 0 -112.5 -3t-84.5 -16.5t-66.5 -38t-42 -67.5t-27 -105.5t-7.5 -154.5zM510 1217l229 272h148l-273 -272h-104z" /> +<glyph unicode="ê" horiz-adv-x="1075" d="M115 549q0 180 23.5 288.5t84 166t137 75t209.5 17.5q88 0 142.5 -5.5t113 -27t89 -62t51 -112.5t20.5 -178q0 -119 -68.5 -175.5t-211.5 -56.5h-474q0 -223 54.5 -298t187.5 -75q309 0 492 27v-86q-203 -57 -492 -57q-207 2 -282.5 123t-75.5 436zM231 594h474 q80 0 121.5 25.5t41.5 91.5q0 92 -13 145t-52 81t-88 35t-144 7q-72 0 -112.5 -3t-84.5 -16.5t-66.5 -38t-42 -67.5t-27 -105.5t-7.5 -154.5zM266 1217l250 266h111l225 -266h-109l-174 176l-192 -176h-111z" /> +<glyph unicode="ë" horiz-adv-x="1075" d="M115 549q0 180 23.5 288.5t84 166t137 75t209.5 17.5q88 0 142.5 -5.5t113 -27t89 -62t51 -112.5t20.5 -178q0 -119 -68.5 -175.5t-211.5 -56.5h-474q0 -223 54.5 -298t187.5 -75q309 0 492 27v-86q-203 -57 -492 -57q-207 2 -282.5 123t-75.5 436zM219 1321 q0 35 23.5 57.5t56.5 22.5t56.5 -22.5t23.5 -57.5t-23.5 -57.5t-56.5 -22.5t-56.5 22.5t-23.5 57.5zM231 594h474q80 0 121.5 25.5t41.5 91.5q0 92 -13 145t-52 81t-88 35t-144 7q-72 0 -112.5 -3t-84.5 -16.5t-66.5 -38t-42 -67.5t-27 -105.5t-7.5 -154.5zM739 1321 q0 33 23.5 56.5t58.5 23.5t57.5 -22.5t22.5 -57.5t-22.5 -57.5t-57.5 -22.5t-58.5 23.5t-23.5 56.5z" /> +<glyph unicode="î" horiz-adv-x="391" d="M-96 1221l250 266h110l223 -266h-108l-174 176l-191 -176h-110zM137 0v1087h117v-1087h-117z" /> +<glyph unicode="ï" horiz-adv-x="391" d="M-145 1302.5q0 32.5 23.5 56t56 23.5t56 -23.5t23.5 -55.5q0 -35 -23.5 -58.5t-56 -23.5t-56 24.5t-23.5 57zM137 0v1087h117v-1087h-117zM377 1302.5q0 32.5 23.5 56t56.5 23.5q35 0 57.5 -23.5t22.5 -55.5q0 -35 -24 -58.5t-56.5 -23.5t-56 24.5t-23.5 57z" /> +<glyph unicode="ô" horiz-adv-x="1165" d="M115 528q0 328 102 449t367 121q268 0 368.5 -126t100.5 -444q0 -303 -101.5 -420.5t-367.5 -117.5q-268 0 -368.5 120.5t-100.5 417.5zM231 528q0 -141 21.5 -228t72 -128t106.5 -53.5t153 -12.5q98 0 155.5 13.5t106.5 56.5t69.5 128t20.5 224q0 152 -19.5 243 t-67.5 137t-106.5 59.5t-158.5 13.5q-80 0 -128 -7t-96.5 -31.5t-73 -73t-40 -132.5t-15.5 -209zM297 1221l250 266h110l226 -266h-109l-174 176l-192 -176h-111z" /> +<glyph unicode="ù" horiz-adv-x="1118" d="M115 330v757h116v-757q0 -106 60.5 -169t159.5 -63q117 0 197.5 27t217.5 94v868h117v-1087h-80l-37 127q-78 -47 -129 -72.5t-130 -49t-156 -23.5q-156 0 -246 102.5t-90 245.5zM238 1493h147l229 -272h-104z" /> +<glyph unicode="û" horiz-adv-x="1118" d="M115 330v757h116v-757q0 -106 60.5 -169t159.5 -63q117 0 197.5 27t217.5 94v868h117v-1087h-80l-37 127q-78 -47 -129 -72.5t-130 -49t-156 -23.5q-156 0 -246 102.5t-90 245.5zM256 1221l252 266h108l226 -266h-109l-174 176l-192 -176h-111z" /> +<glyph unicode="ü" horiz-adv-x="1118" d="M115 330v757h116v-757q0 -106 60.5 -169t159.5 -63q117 0 197.5 27t217.5 94v868h117v-1087h-80l-37 127q-78 -47 -129 -72.5t-130 -49t-156 -23.5q-156 0 -246 102.5t-90 245.5zM207 1302.5q0 32.5 23.5 56t58.5 23.5t57.5 -23.5t22.5 -55.5q0 -35 -23.5 -58.5 t-56.5 -23.5q-35 0 -58.5 24.5t-23.5 57zM729 1302.5q0 32.5 23.5 56t58.5 23.5q33 0 56.5 -23.5t23.5 -55.5q0 -35 -23.5 -58.5t-56.5 -23.5t-57.5 24.5t-24.5 57z" /> +<glyph unicode="ÿ" horiz-adv-x="1116" d="M47 1087h129l277 -849q23 -66 62.5 -95.5t68.5 -25.5l28 4l326 966h129l-479 -1431l-133 -209h-70l186 553q-176 0 -243 225zM215 1302.5q0 32.5 23.5 56t58.5 23.5t57.5 -23.5t22.5 -55.5q0 -35 -23.5 -58.5t-56.5 -23.5q-35 0 -58.5 24.5t-23.5 57zM737 1302.5 q0 32.5 23.5 56t58.5 23.5q33 0 56.5 -23.5t23.5 -55.5q0 -35 -23.5 -58.5t-56.5 -23.5t-57.5 24.5t-24.5 57z" /> +<glyph unicode="Œ" horiz-adv-x="2158" d="M150 739q0 172 17 300t54 212t81 136.5t114.5 79t137.5 34.5t165 8q180 0 289.5 -38.5t175.5 -161.5q18 102 83.5 148t159.5 42l615 -29v-88h-615q-80 0 -110.5 -38.5t-30.5 -110.5q0 -377 2 -428l672 -17v-90l-672 -16l-2 -430q0 -49 13.5 -79t40 -43t49 -16t59.5 -3 h594v-86l-594 -31q-233 -12 -266 190q-66 -113 -175.5 -152.5t-287.5 -39.5q-102 0 -171 8t-139.5 33.5t-113.5 76t-79 132.5t-51 205.5t-15 291.5zM266 739q0 -168 15.5 -278.5t45 -182t88 -108.5t126 -49t178.5 -12q90 0 152.5 9t115.5 35.5t86 70.5t55.5 117t31.5 170 t9 234q0 154 -11 262.5t-39.5 179t-60.5 112.5t-90.5 62.5t-109.5 26t-139 5.5q-57 0 -91 -1t-80 -7.5t-72.5 -18.5t-60.5 -34.5t-53.5 -56.5t-40 -82t-30.5 -112.5t-17.5 -150t-7.5 -191.5z" /> +<glyph unicode="œ" horiz-adv-x="1892" d="M115 528q0 328 102 449t367 121q162 0 258 -45t145 -146q43 113 135 151t264 38q88 0 142.5 -5.5t113 -27t89 -62t51 -112.5t20.5 -178q0 -119 -68.5 -175.5t-211.5 -56.5h-471q-2 -213 53 -293t186 -80q309 0 492 27v-86q-203 -57 -492 -57q-123 0 -195.5 43t-109.5 137 q-47 -96 -143.5 -138t-257.5 -42q-268 0 -368.5 120.5t-100.5 417.5zM231 528q0 -141 21.5 -228t72 -128t106.5 -53.5t153 -12.5q209 0 279.5 85t70.5 352q0 137 -18.5 223t-63.5 134t-106.5 64.5t-161.5 16.5q-80 0 -128 -7t-96.5 -31.5t-73 -73t-40 -132.5t-15.5 -209z M1051 594h471q80 0 122 25.5t42 91.5q0 92 -13.5 145t-52.5 81t-88 35t-143 7q-70 0 -114 -4t-86 -17.5t-66.5 -39t-43 -68.5t-24.5 -105.5t-4 -150.5z" /> +<glyph unicode="Ÿ" horiz-adv-x="1282" d="M102 1499h129l414 -825l457 825h127l-524 -967v-532h-117v532zM326 1714q0 35 23.5 57.5t56 22.5t56 -22.5t23.5 -57.5t-23.5 -58.5t-56 -23.5t-56 23.5t-23.5 58.5zM846 1714q0 33 23.5 56.5t58.5 23.5t57.5 -22.5t22.5 -57.5t-23.5 -58.5t-56.5 -23.5q-35 0 -58.5 23.5 t-23.5 58.5z" /> +<glyph unicode="ˆ" horiz-adv-x="813" d="M115 1087l250 267h110l223 -267h-108l-174 177l-191 -177h-110z" /> +<glyph unicode="˚" horiz-adv-x="643" d="M115 1294q0 88 61.5 149.5t147.5 61.5t146 -61.5t60 -149.5t-60 -148.5t-146 -60.5t-147.5 60.5t-61.5 148.5zM188 1294.5q0 -55.5 40 -94.5t95.5 -39t94.5 39t39 94.5t-39 95.5t-94.5 40t-95.5 -40t-40 -95.5z" /> +<glyph unicode="˜" horiz-adv-x="919" d="M115 1171q51 43 79.5 64.5t71.5 42t82 20.5q51 -2 129 -50t105 -48q51 -2 192 86l33 -61q-6 -4 -25.5 -21.5t-28 -23.5t-26.5 -20.5t-28.5 -22t-28 -17.5t-30.5 -14t-29.5 -7t-32.5 -3q-55 2 -127 49t-105 47q-39 0 -68.5 -11.5t-70.5 -36t-62 -34.5z" /> +<glyph unicode=" " horiz-adv-x="952" /> +<glyph unicode=" " horiz-adv-x="1905" /> +<glyph unicode=" " horiz-adv-x="952" /> +<glyph unicode=" " horiz-adv-x="1905" /> +<glyph unicode=" " horiz-adv-x="635" /> +<glyph unicode=" " horiz-adv-x="476" /> +<glyph unicode=" " horiz-adv-x="317" /> +<glyph unicode=" " horiz-adv-x="317" /> +<glyph unicode=" " horiz-adv-x="238" /> +<glyph unicode=" " horiz-adv-x="381" /> +<glyph unicode=" " horiz-adv-x="105" /> +<glyph unicode="‐" horiz-adv-x="712" d="M45 537v114h623v-114h-623z" /> +<glyph unicode="‑" horiz-adv-x="712" d="M45 537v114h623v-114h-623z" /> +<glyph unicode="‒" horiz-adv-x="712" d="M45 537v114h623v-114h-623z" /> +<glyph unicode="–" horiz-adv-x="1058" d="M45 528v119h969v-119h-969z" /> +<glyph unicode="—" horiz-adv-x="1515" d="M45 532v119h1425v-119h-1425z" /> +<glyph unicode="‘" horiz-adv-x="481" d="M154 1163v207q0 49 17 81t42 43t48.5 15t40.5 2l17 -2v-53q-59 2 -59 -57v-64h23q47 0 47 -49v-123q0 -51 -47 -51h-84q-45 0 -45 51z" /> +<glyph unicode="’" horiz-adv-x="481" d="M154 1337v123q0 53 49 53h82q47 0 47 -53l-2 -207q0 -49 -17.5 -80.5t-42 -43t-48 -15.5t-41.5 -2l-17 2v51q59 -2 59 60v63h-22q-47 0 -47 49z" /> +<glyph unicode="‚" horiz-adv-x="481" d="M154 47v123q0 53 47 53h84q45 0 45 -53v-205q0 -135 -120 -143l-46 2v51q59 -2 59 62v61h-22q-47 0 -47 49z" /> +<glyph unicode="“" horiz-adv-x="741" d="M139 1163v207q0 49 17.5 81t42 43t49 15t42.5 2l17 -2v-53q-59 2 -59 -57v-64h20q49 0 49 -49v-123q0 -51 -49 -51h-84q-45 0 -45 51zM426 1163v207q0 49 17.5 81t42 43t49 15t42.5 2l17 -2v-53q-59 2 -59 -57v-64h22q45 0 45 -49v-123q0 -51 -45 -51h-84q-47 0 -47 51z " /> +<glyph unicode="”" horiz-adv-x="741" d="M139 1337v123q0 53 47 53h84q47 0 47 -53v-207q0 -49 -17 -80.5t-42 -43t-49.5 -15.5t-41.5 -2l-17 2v51q57 -2 57 60v63h-21q-47 0 -47 49zM426 1337v123q0 53 49 53h84q43 0 43 -53v-207q0 -49 -17.5 -80.5t-42 -43t-48 -15.5t-40.5 -2l-18 2v51q59 -2 60 60v63h-21 q-49 0 -49 49z" /> +<glyph unicode="„" horiz-adv-x="741" d="M139 49v123q0 53 47 53h84q47 0 47 -53v-207q0 -49 -17 -82t-42 -44t-49.5 -15t-41.5 -2l-17 2v53q57 -2 57 60v63h-21q-47 0 -47 49zM426 49v123q0 53 49 53h84q43 0 43 -53v-207q0 -135 -120 -143l-46 2v53q59 -2 60 60v63h-21q-49 0 -49 49z" /> +<glyph unicode="…" horiz-adv-x="1665" d="M190 39v121q0 43 41 43h80q41 0 41 -43v-121q0 -39 -41 -39h-80q-41 0 -41 39zM748 39v121q0 43 40 43h80q41 0 41 -43v-121q0 -39 -41 -39h-80q-40 0 -40 39zM1305 39v121q0 43 41 43h79q41 0 41 -43v-121q0 -39 -41 -39h-79q-41 0 -41 39z" /> +<glyph unicode=" " horiz-adv-x="381" /> +<glyph unicode="‹" horiz-adv-x="727" d="M115 725l422 416l81 -82l-342 -334l353 -344l-82 -82z" /> +<glyph unicode="›" horiz-adv-x="727" d="M115 381l352 344l-342 334l82 82l422 -416l-432 -426z" /> +<glyph unicode=" " horiz-adv-x="476" /> +<glyph unicode="€" horiz-adv-x="1239" d="M45 535v73l180 10v236l-180 12v68l180 14v17q0 51 1 82.5t10.5 95t26 107.5t51 98.5t85 87t129 56.5t177.5 24q184 0 481 -56v-88q-311 27 -481 27q-96 0 -165 -23.5t-107 -60.5t-58.5 -99.5t-26.5 -121t-6 -146.5l514 -10v-74l-514 -10v-236l514 -12v-74q-33 0 -87 -1 t-167 -3t-187.5 -3t-72.5 -3q-2 -203 95.5 -309.5t267.5 -108.5q92 0 213.5 7.5t198.5 15.5l77 8v-86q-238 -61 -489 -61q-55 0 -110.5 10t-125.5 45t-121 90t-87 156.5t-36 232.5z" /> +<glyph unicode="™" horiz-adv-x="1425" d="M45 1403v96h530v-96h-215v-619h-96v619h-219zM655 784l56 715h94l225 -549l201 549h96l64 -715h-95l-43 494l-180 -494h-80l-205 496l-36 -496h-97z" /> +<glyph unicode="" horiz-adv-x="1085" d="M0 1085h1085v-1085h-1085v1085z" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Light-webfont.ttf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Light-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..091bf9c75056953cdfacc4a76c9cdd31e23defd8 Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Light-webfont.ttf differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Light-webfont.woff b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Light-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..723aa491d82f9d9fb1637c8fe8e8d2b57c95b5b0 Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Light-webfont.woff differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Medium-Italic-webfont.eot b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Medium-Italic-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..117b67ff3781ae5fe4cbaa7eb28d61596ab6505c Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Medium-Italic-webfont.eot differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Medium-Italic-webfont.svg b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Medium-Italic-webfont.svg new file mode 100644 index 0000000000000000000000000000000000000000..621d3dcc7454148ac405384b2e649af9af0ab65b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Medium-Italic-webfont.svg @@ -0,0 +1,187 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Copyright c 2011 Natanael Gama exondiscoveredcom with Reserved Font Name Exo +Designer : Natanael Gama +</metadata> +<defs> +<font id="ExoMediumItalic" horiz-adv-x="1157" > +<font-face units-per-em="2048" ascent="1638" descent="-410" /> +<missing-glyph horiz-adv-x="512" /> +<glyph unicode=" " horiz-adv-x="512" /> +<glyph unicode="	" horiz-adv-x="512" /> +<glyph unicode=" " horiz-adv-x="512" /> +<glyph unicode="!" horiz-adv-x="544" d="M166 47l20 135q6 51 58 51h131q47 0 39 -51l-21 -135q-6 -47 -53 -47h-131q-49 0 -43 47zM242 408l153 1089h213l-192 -1089h-174z" /> +<glyph unicode=""" horiz-adv-x="815" d="M358 1087l19 275l22 137h189l-23 -137l-63 -275h-144zM659 1087l21 275l22 137h187l-23 -137l-63 -275h-144z" /> +<glyph unicode="#" horiz-adv-x="1425" d="M111 463l41 131h321l98 313h-321l43 131h323l148 461h131l-147 -461h315l145 461h131l-145 -461h360l-45 -131h-358l-100 -315h360l-41 -131h-362l-150 -461h-131l150 461l-318 2l-149 -463h-131l149 463h-317zM604 594l316 -2l100 315h-318z" /> +<glyph unicode="$" horiz-adv-x="1171" d="M158 37l24 139q23 0 112 -4t188.5 -7t183.5 -3q37 0 74.5 7t80.5 25.5t74 54.5t39 87l18 123q8 55 10.5 96t-31.5 64.5t-110 23.5h-246q-106 0 -177.5 37t-98.5 92t-38 120.5t3 123.5l21 133q33 201 147.5 279.5t300.5 82.5l29 177h135l-29 -183q127 -8 375 -45l-22 -147 q-47 0 -163 5t-212 9t-105 4q-113 4 -182.5 -40t-87.5 -156l-16 -119q-16 -98 18.5 -141.5t149.5 -43.5h247q332 0 273 -372l-21 -129q-59 -367 -495 -346l-27 -168h-133l27 176q-186 16 -336 45z" /> +<glyph unicode="%" horiz-adv-x="1970" d="M231 979l41 266q20 137 85 195.5t225 58.5h206q135 0 188.5 -62.5t33.5 -199.5l-41 -266q-23 -145 -87.5 -200.5t-219.5 -55.5h-207q-123 0 -183.5 68.5t-40.5 195.5zM385 983q-12 -68 9.5 -92.5t90.5 -24.5h193q76 0 102.5 23.5t38.5 93.5l39 248q10 74 -7 95.5 t-93 21.5h-193q-78 0 -104.5 -25t-36.5 -92zM451 0l1138 1499h162l-1137 -1499h-163zM1196 262l41 266q20 137 84.5 196.5t224.5 59.5h207q135 0 188.5 -62.5t32.5 -199.5l-41 -266q-23 -143 -87 -199.5t-222 -56.5h-207q-123 0 -182 67.5t-39 194.5zM1350 268 q-12 -68 9 -92t91 -24h190q78 0 105 23.5t39 92.5l39 248q10 74 -7.5 95.5t-95.5 21.5h-190q-80 0 -105.5 -23.5t-35.5 -93.5z" /> +<glyph unicode="&" horiz-adv-x="1306" d="M138 471.5q42 155.5 204 278.5l193 147l-97 164q-63 117 -40.5 209t94 151.5t161.5 67.5q274 29 549 -35l-20 -127h-394q-92 0 -144 -20.5t-66.5 -73.5t43.5 -143l352 -613l274 244l60 -62l-146 -243l-98 -94l190 -322h-198l-127 217l-154 -133q-78 -68 -187.5 -89.5 t-221 22t-177.5 147.5q-92 152 -50 307.5zM342 262q57 -84 155.5 -96t182.5 59l160 142l-224 372l-163 -125q-236 -174 -111 -352z" /> +<glyph unicode="'" horiz-adv-x="401" d="M299 1087l20 275l23 137h190l-22 -137l-64 -275h-147z" /> +<glyph unicode="(" horiz-adv-x="708" d="M224 390q3 134 26 269q31 180 93.5 357.5t129 302.5t129 225.5t103.5 149.5l40 49h207q-16 -18 -43.5 -54t-102.5 -152t-138.5 -236.5t-130 -300t-99.5 -351.5q-33 -197 -28.5 -364.5t35 -303t66.5 -231.5t64 -147l29 -52h-194q-6 10 -15.5 28t-36 77t-48 123.5t-44 166 t-34 206t-8.5 238.5z" /> +<glyph unicode=")" horiz-adv-x="712" d="M-29 -449q16 18 44 54.5t103 151t138 234.5t130 300t99 354q33 195 29 362t-36 303t-66.5 232t-63.5 149l-29 52h193q6 -10 15.5 -27.5t35 -78t48 -126t45 -167t33.5 -205t9 -236.5t-24 -266q-31 -182 -93.5 -361.5t-129 -304.5t-128 -224t-101.5 -147l-40 -49h-211z" /> +<glyph unicode="*" horiz-adv-x="892" d="M279 1159l12 90l295 58l-15 -158zM362 850l93 276l149 -36l-162 -269zM569 969l109 133l194 -187l-59 -71zM586 1470l94 35l111 -245l-156 -64zM692 1169l271 158l32 -80l-221 -198z" /> +<glyph unicode="+" horiz-adv-x="1038" d="M195 641l26 176h336l53 338h176l-53 -338h340l-26 -176h-340l-56 -338h-176l55 338h-335z" /> +<glyph unicode="," horiz-adv-x="542" d="M143 -180l13 74q63 0 73 61l7 45h-23q-51 0 -43 51l20 129q10 55 62 56h123q47 0 39 -56l-33 -203q-24 -159 -185 -161z" /> +<glyph unicode="-" horiz-adv-x="724" d="M123 506l29 176h643l-29 -176h-643z" /> +<glyph unicode="." horiz-adv-x="548" d="M168 47l22 135q6 51 58 51h127q53 0 43 -51l-23 -135q-8 -47 -57 -47h-127q-49 0 -43 47z" /> +<glyph unicode="/" horiz-adv-x="849" d="M14 -147l848 1724h199l-848 -1724h-199z" /> +<glyph unicode="0" horiz-adv-x="1306" d="M186 340l129 815q55 344 408 344h336q178 0 250.5 -100.5t48.5 -239.5l-129 -819q-29 -178 -127 -259t-271 -81h-335q-160 0 -248.5 83t-61.5 257zM373 302q0 -23 2 -40.5t12 -30t15.5 -21.5t21.5 -14.5t24.5 -8.5t30 -4t28.5 -1h30h299q178 0 206 170l127 795 q12 88 -19.5 129t-129.5 41h-303q-188 0 -213 -170l-127 -793q-4 -29 -4 -52z" /> +<glyph unicode="1" horiz-adv-x="743" d="M266 1196l19 131q78 0 166 42t132 77t60 53h184l-233 -1499h-188l202 1278q-43 -33 -135 -57.5t-207 -24.5z" /> +<glyph unicode="2" horiz-adv-x="1212" d="M90 0l29 170q102 63 202.5 129t244 172.5t251 203.5t190.5 208.5t97 199.5q39 252 -221 252h-596l22 140q326 45 629 45q199 0 287 -130t67 -317q-35 -375 -805 -891h656l-29 -182h-1024z" /> +<glyph unicode="3" horiz-adv-x="1210" d="M76 43l20 127h586q92 0 162.5 43t85.5 133l18 107q6 35 6 62.5t-6 47t-13 34.5t-22.5 24.5t-27 15.5t-35 9t-37.5 4t-41 3l-471 15l25 149l475 21q211 8 241 186l19 123q16 100 -35 137t-147 37h-613l19 125q90 31 204.5 44t224 14t236.5 -1q152 -4 238 -101t63 -249 l-22 -133q-37 -236 -185 -275q131 -63 95 -303l-19 -112q-55 -344 -424 -344h-74h-80q-16 0 -71 1t-75.5 2t-66.5 4t-71 7t-60.5 10t-64 14.5t-57.5 18.5z" /> +<glyph unicode="4" horiz-adv-x="1243" d="M111 459l786 1040h225l-708 -942h510l65 404l103 153h114l-88 -557h174l-22 -147l-183 -41l-55 -365h-194l57 365h-731z" /> +<glyph unicode="5" horiz-adv-x="1230" d="M152 39l22 143h610q94 0 142.5 55.5t58.5 122.5l31 195q33 188 -139 188h-277q-66 0 -117 -35.5t-63 -109.5h-178l188 901h879l-29 -182h-698l-95 -453q55 51 177 60q55 6 264 -2q143 -2 222 -103.5t56 -257.5l-35 -225q-31 -195 -135 -269.5t-266 -76.5q-203 -2 -314 6 t-304 43z" /> +<glyph unicode="6" horiz-adv-x="1263" d="M246 793q59 375 188 543.5t279 172.5q326 10 622 -39l-24 -141h-570q-63 0 -116.5 -50t-88 -132t-56 -154.5t-36.5 -148.5q297 41 510 41q80 2 139.5 -19.5t89 -55.5t47 -77t16.5 -87t-5 -85l-41 -258q-27 -166 -126 -234.5t-263 -68.5h-297q-393 0 -268 793zM422 707 q-84 -530 137 -531h266q170 0 195 160l35 223q14 88 -17.5 118t-124.5 30h-491z" /> +<glyph unicode="7" horiz-adv-x="1122" d="M266 1317l29 182h946l45 -106l-751 -1393h-218l719 1317h-770z" /> +<glyph unicode="8" horiz-adv-x="1288" d="M187.5 262q1.5 33 7.5 68l28 186q16 102 77.5 158.5t145.5 66.5q-94 33 -125.5 115t-17.5 172l23 133q31 197 134 272.5t288 75.5h303q158 0 233.5 -94t48.5 -266l-22 -127q-2 -33 -18.5 -77t-64.5 -95t-116 -64q78 -25 105.5 -109.5t13.5 -164.5l-31 -193 q-16 -106 -55 -174.5t-99.5 -97.5t-110.5 -38t-126 -9h-301q-98 0 -167 27.5t-99.5 63.5t-43 87t-11 84zM383 328q-14 -84 24.5 -116t143.5 -32h268q72 0 126 35t67 113l30 194q12 76 -27.5 116t-109.5 40h-293q-174 0 -198 -156zM489 1012q-14 -86 34 -123t116 -37h291 q164 0 190 160l21 127q18 113 -13.5 152.5t-123.5 39.5h-271q-113 0 -159 -43t-64 -149z" /> +<glyph unicode="9" horiz-adv-x="1261" d="M168 39l22 141h572q63 0 116.5 50.5t88 132t56 155.5t36.5 150q-287 -43 -512 -43q-80 -2 -138.5 19.5t-88 56t-47 77.5t-15.5 87t6 85l39 254q49 305 387 305h299q395 0 268 -798q-31 -195 -84 -338.5t-117.5 -221t-130 -113.5t-134.5 -38q-365 -10 -623 39zM449 950 q-14 -88 17.5 -117.5t123.5 -29.5h491q84 530 -137 530h-266q-170 0 -195 -159z" /> +<glyph unicode=":" horiz-adv-x="550" d="M168 47l22 135q6 51 58 51h127q53 0 43 -51l-23 -135q-8 -47 -57 -47h-127q-49 0 -43 47zM305 903l21 135q6 51 57 52h127q53 0 43 -52l-21 -135q-8 -47 -59 -47h-127q-47 0 -41 47z" /> +<glyph unicode=";" horiz-adv-x="550" d="M143 -180l13 74q63 0 73 61l7 45h-23q-20 0 -33.5 15.5t-9.5 35.5l20 129q4 23 21.5 39.5t40.5 16.5h123q47 0 39 -56l-33 -203q-24 -159 -185 -161zM309 905l21 135q6 51 57 52h127q53 0 43 -52l-20 -135q-8 -47 -58 -47h-127q-49 0 -43 47z" /> +<glyph unicode="<" horiz-adv-x="956" d="M195 629l30 190l817 324l-28 -193l-598 -233l522 -250l-31 -184z" /> +<glyph unicode="=" horiz-adv-x="956" d="M106 418l29 176h875l-29 -176h-875zM172 850l31 176h874l-30 -176h-875z" /> +<glyph unicode=">" horiz-adv-x="958" d="M139 283l33 196l608 248l-534 240l30 176l717 -324l-30 -190z" /> +<glyph unicode="?" horiz-adv-x="1105" d="M248 1335l22 135l74 10q59 9 74.5 11t66 8t72 7t65.5 5.5t76 4.5h73q42 0 85 -3q199 0 291 -112.5t65 -274.5l-30 -198q-23 -147 -99.5 -230.5t-188.5 -98.5t-255 1l-16 -97q-16 -97 -15 -104h-176l55 351q182 -4 275 0q86 4 151.5 50t81.5 138l29 180q18 121 -34 169 t-199 48h-543zM352 47l23 135q6 51 57 51h127q53 0 43 -51l-22 -135q-8 -47 -58 -47h-127q-49 0 -43 47z" /> +<glyph unicode="@" horiz-adv-x="1792" d="M123 33l164 1034q61 377 448 377h762q180 0 253 -103.5t46 -291.5l-106 -709q-8 -57 -23.5 -103.5t-51.5 -104.5t-108.5 -92t-177.5 -34h-131l-47 121q-117 -133 -307 -135q-92 0 -156.5 26.5t-112 92t-55.5 178t12 280.5q25 162 76 275.5t117 169t127 78t129 22.5 q330 0 465 -129l-117 -805q84 0 128 34t63 151l102 690q6 45 6 79.5t-4 57t-18.5 38t-24.5 24t-32.5 11.5t-35 4t-38.5 1h-770q-213 0 -244 -215l-164 -1026q-16 -104 19.5 -167t156.5 -63h791l-21 -116q-276 -55 -598 -56h-199q-178 0 -264 116t-59 290zM700 526 q-27 -203 6 -281.5t150 -80.5q88 0 158.5 27.5t152.5 99.5l99 622q-115 31 -285 31q-228 0 -281 -418z" /> +<glyph unicode="A" horiz-adv-x="1366" d="M86 0l776 1499h199l278 -1499h-192l-74 395h-575l-205 -395h-207zM588 573h456l-116 670z" /> +<glyph unicode="B" horiz-adv-x="1222" d="M154 0l237 1499h588q109 0 182.5 -36t108.5 -97t45 -128q6 -37 6 -77q0 -32 -4 -65q-35 -266 -248 -318q66 -10 118 -112q38 -73 37 -174q0 -39 -5 -82q-27 -201 -138.5 -305.5t-339.5 -104.5h-587zM373 180h395q223 0 262 250q5 34 5 64q-1 74 -31 128q-44 76 -154 76 h-395zM483 874h391q215 0 252 226q6 38 6 68q0 72 -34 105q-48 46 -150 46h-395z" /> +<glyph unicode="C" horiz-adv-x="1179" d="M208 486q-2 34 -3 68q0 105 22 210q33 190 75 320t111.5 232.5t177 151t257.5 48.5q209 0 495 -66l-22 -147q-284 31 -438 31q-22 0 -41 -1q-41 0 -58.5 -1t-61.5 -12t-69.5 -30.5t-66.5 -62.5t-67.5 -103.5t-54.5 -156t-48 -217.5q-22 -126 -22 -225q0 -337 253 -355 q35 -2 83 -2q146 0 419 18l-21 -149q-176 -49 -516 -49q-137 0 -230 68.5t-128.5 179t-45.5 250.5z" /> +<glyph unicode="D" horiz-adv-x="1359" d="M154 0l237 1497q0 2 572 2q129 0 220 -53t135 -134q44 -80 62 -188q15 -88 16 -168q0 -16 -1 -34q-4 -94 -21 -189q-59 -358 -213.5 -545.5t-429.5 -187.5h-577zM371 184h379q174 0 286.5 158t151.5 403q20 127 20 225q0 134 -38 212q-64 136 -244 137h-375z" /> +<glyph unicode="E" d="M190 266l152 959q45 274 302 274h20q604 -29 639 -33l-23 -151h-629q-66 0 -91 -31t-34 -84l-57 -360l647 -21l-24 -151l-652 -21l-59 -362q-4 -39 2 -62.5t27.5 -32t37 -10.5t46.5 -2h608l-27 -149l-631 -35h-19q-106 0 -179 62q-61 52 -61 149q0 29 5 61z" /> +<glyph unicode="F" horiz-adv-x="1159" d="M152 0l192 1217q45 282 302 282h20q604 -29 641 -33l-25 -151h-627q-68 0 -92 -31t-33 -84l-57 -360l645 -21l-22 -153l-654 -21l-102 -645h-188z" /> +<glyph unicode="G" horiz-adv-x="1249" d="M210 544q3 107 21 220q33 193 75 321.5t111.5 231t176 149.5t256.5 47h11q183 0 482 -61l-20 -149q-180 27 -477 32q-37 0 -60.5 -2t-64.5 -13t-68.5 -32.5t-65.5 -64.5t-64.5 -103.5t-52.5 -156t-44 -215.5q-19 -127 -19 -231q0 -36 3 -69q8 -129 69.5 -203.5 t173.5 -74.5q68 0 158 27.5t146 55.5l57 28l63 356h-309l20 125q176 49 367 49q88 0 137 -4l-129 -807h-141l-31 115q-53 -49 -158.5 -88t-218.5 -41q-113 0 -194.5 46t-125.5 122.5t-66 179.5q-18 91 -18 184v26z" /> +<glyph unicode="H" horiz-adv-x="1306" d="M162 0l237 1499h189l-111 -684h662l110 684h189l-238 -1499h-188l102 635h-661l-103 -635h-188z" /> +<glyph unicode="I" horiz-adv-x="477" d="M170 0l238 1499h188l-238 -1499h-188z" /> +<glyph unicode="J" horiz-adv-x="735" d="M74 45l28 141q51 -10 81 -15t78 -8q10 -1 20 -1q35 0 59 9q31 11 64.5 31.5t54 64.5t30.5 106l179 1126h188l-184 -1161q-35 -231 -154 -301q-85 -48 -215 -48h-15q-140 3 -214 56z" /> +<glyph unicode="K" horiz-adv-x="1198" d="M154 0l237 1499h184l-104 -659h162l538 659h232l-608 -762l370 -737h-223l-324 659h-174l-104 -659h-186z" /> +<glyph unicode="L" horiz-adv-x="1091" d="M193 266l198 1233h189l-195 -1210q-6 -39 1 -62.5t28.5 -32t37 -10.5t46.5 -2h596l-29 -182h-627q-121 0 -193 64q-56 50 -56 146q0 26 4 56z" /> +<glyph unicode="M" horiz-adv-x="1656" d="M133 0l346 1499h250l176 -1186l541 1186h260l-117 -1499h-186l96 1165l-534 -1165h-203l-172 1163l-268 -1163h-189z" /> +<glyph unicode="N" horiz-adv-x="1355" d="M154 0l237 1499h184l533 -1151l182 1151h189l-238 -1499h-182l-535 1147l-180 -1147h-190z" /> +<glyph unicode="O" horiz-adv-x="1363" d="M204 492q2 113 25 256q23 150 54.5 264t67.5 194t85 136.5t96.5 89t115 50t127 22.5t145.5 5q82 0 144 -7t123.5 -27.5t103.5 -56.5t75 -94t47 -140q12 -72 12 -168v-28q-2 -114 -24 -257q-25 -164 -60.5 -284.5t-85 -201.5t-102.5 -131.5t-127 -77t-144.5 -35.5 t-168.5 -9q-80 0 -139.5 6t-122 24.5t-104.5 51t-78 90t-51 136.5q-14 72 -14 172v20zM392 490v-11q0 -91 16 -151q16 -64 61 -97.5t103.5 -45t152.5 -11.5q147 0 234.5 40t152 165t100.5 360q18 121 22 213q2 49 3 89q0 35 -2 65q-4 62 -28.5 104.5t-47 65t-70 35t-83 14.5 t-99.5 2q-59 0 -92 -2t-80 -9t-73.5 -23.5t-61.5 -44t-56.5 -70.5t-46 -103.5t-44 -145t-35.5 -190.5q-25 -150 -26 -249z" /> +<glyph unicode="P" horiz-adv-x="1218" d="M143 0l238 1499h627q152 1 245 -105q69 -78 69 -229q0 -53 -9 -116q-14 -96 -39 -171t-50.5 -123t-66.5 -81t-68.5 -48.5t-76.5 -23.5t-73 -8h-73q-61 2 -242.5 17.5t-189.5 19.5l-102 -631h-189zM455 774h430q92 0 151.5 56.5t85.5 226.5q6 61 7 104v6q0 39 -12 66 q-13 29 -25.5 46t-36 26.5t-41 11.5t-41.5 2h-432z" /> +<glyph unicode="Q" horiz-adv-x="1372" d="M211 493q2 114 25 257q27 172 63.5 299t86.5 209.5t102.5 134t128 76t143 32.5t168.5 8q82 0 144.5 -7t123.5 -28.5t102 -57.5t75 -94t47 -139q12 -71 12 -167v-29q-2 -115 -25 -258q-29 -195 -77 -330t-104.5 -215t-140.5 -123t-164.5 -56t-199.5 -13q-80 0 -139.5 6 t-123 24.5t-105.5 51t-77.5 90t-51.5 136.5q-13 70 -13 167v26zM399 490v-21q0 -85 15 -141q16 -64 62 -97.5t104.5 -45t152.5 -11.5q147 0 233.5 40t151 165t101.5 360q25 154 25 261v20q-3 113 -21.5 174t-71.5 91t-99 36t-137 6q-51 0 -81.5 -1t-73.5 -7t-67.5 -16.5 t-57.5 -31t-54.5 -50t-46 -73.5t-42 -102.5t-36 -134.5t-32.5 -172q-23 -150 -25 -249zM625 -68h120q71 -72 182 -72q69 0 152 27l-28 -182q-52 -20 -110 -20q-15 0 -31 1q-74 7 -139.5 29.5t-106.5 79.5q-39 54 -39 130v7z" /> +<glyph unicode="R" horiz-adv-x="1245" d="M143 0l238 1499h639q154 1 236 -109q62 -83 61 -244q0 -51 -6 -110q-10 -92 -33 -164.5t-56.5 -116.5t-62.5 -73t-68.5 -43t-57 -19.5t-44.5 -9.5l215 -610h-209l-194 594l-371 27l-98 -621h-189zM457 776h432q207 0 231 268q4 50 4 89q0 55 -8 91q-14 62 -45 78.5 t-88 16.5h-440z" /> +<glyph unicode="S" horiz-adv-x="1173" d="M158 37l22 149q143 -20 506 -20q244 0 268 170l21 123q5 47 5 84v12q-1 41 -35 64.5t-103 23.5h-262q-324 0 -324 275q0 42 8 90l21 141q18 115 60 190.5t107.5 112.5t135.5 49q60 10 136 10h26q102 -2 266 -18t250 -33l-23 -149q-47 0 -168 5t-223 9t-111 4q-17 1 -33 1 q-100 0 -154 -32q-62 -38 -81 -163l-18 -119q-6 -35 -7.5 -61.5t5 -46t10.5 -33t19.5 -21.5t23.5 -13t30 -7q24 -3 34 -3h37h16h266q92 0 155.5 -33.5t89.5 -85.5q24 -52 34 -118q4 -25 4 -51q0 -39 -9 -76l-18 -139q-16 -115 -66.5 -188.5t-127.5 -105.5t-138 -41t-143 -9 q-129 0 -284.5 17.5t-227.5 35.5z" /> +<glyph unicode="T" horiz-adv-x="1189" d="M274 1317l31 182h1059l-31 -182h-440l-209 -1317h-188l209 1317h-431z" /> +<glyph unicode="U" horiz-adv-x="1341" d="M250 633l137 866h191l-138 -874q-16 -104 -17 -181q1 -118 39 -176q62 -96 247 -96q193 0 291 101.5t137 351.5l137 874h190l-135 -885q-18 -115 -43.5 -199.5t-73 -168.5t-114 -137.5t-170 -86t-238.5 -32.5q-262 0 -378 148q-79 101 -79 296q0 90 17 199z" /> +<glyph unicode="V" horiz-adv-x="1380" d="M301 1499h199l213 -1218l622 1218h213l-774 -1499h-201z" /> +<glyph unicode="W" horiz-adv-x="2056" d="M301 1499h193l217 -1212l614 1212h209l-246 -487l117 -736l616 1223h203l-760 -1499h-198l-117 725l-371 -725h-205z" /> +<glyph unicode="X" horiz-adv-x="1253" d="M74 0l563 752l-330 747h201l256 -590l440 590h221l-579 -776l319 -723h-202l-244 565l-424 -565h-221z" /> +<glyph unicode="Y" horiz-adv-x="1304" d="M301 1499h201l237 -762l512 762h222l-668 -985l-82 -514h-188l81 514z" /> +<glyph unicode="Z" horiz-adv-x="1150" d="M68 0l28 182l955 1135h-777l31 182h1016l-31 -182l-948 -1135h770l-29 -182h-1015z" /> +<glyph unicode="[" horiz-adv-x="663" d="M142.5 -186.5q-4.5 65.5 9.5 114.5l231 1456q27 162 100.5 242t251.5 80h164l-29 -176h-147q-63 0 -100 -35t-54 -129l-229 -1444q-20 -121 0 -157.5t96 -36.5h150l-29 -177h-168q-92 0 -150.5 40t-75 98.5t-21 124z" /> +<glyph unicode="\" horiz-adv-x="831" d="M287 1577h182l303 -1724h-182z" /> +<glyph unicode="]" horiz-adv-x="663" d="M-29 -449l27 177h149q63 0 100.5 34.5t53.5 128.5l229 1444q18 121 -2 158t-96 37h-147l28 176h164q90 0 149.5 -38t76 -95t23.5 -120.5t-7 -117.5l-227 -1462q-25 -158 -97.5 -240t-253.5 -82h-170z" /> +<glyph unicode="^" horiz-adv-x="796" d="M268 1087l277 271h164l165 -271h-153l-100 156l-166 -156h-187z" /> +<glyph unicode="_" horiz-adv-x="1378" d="M41 -2l29 176h1298l-29 -176h-1298z" /> +<glyph unicode="`" horiz-adv-x="516" d="M254 1364h197l200 -277h-153z" /> +<glyph unicode="a" horiz-adv-x="1105" d="M152 333q-2 21 -1 44q0 89 23 203q29 160 79 267t118.5 159.5t128 73t137.5 28.5q35 4 73 4q96 0 212 -26q162 -36 237 -105l-143 -981h-139l-29 121q-59 -47 -162.5 -91t-204.5 -44q-74 0 -128 15t-102 55t-69.5 106.5t-29.5 170.5zM356 526q-14 -91 -14 -158 q0 -78 19 -122q36 -84 149 -84q100 0 173 23.5t179 76.5l99 645q-129 37 -229 37q-47 0 -87 -8q-57 -10 -91 -24.5t-76 -53.5t-72 -121t-50 -211z" /> +<glyph unicode="b" horiz-adv-x="1134" d="M115 0l254 1608h184l-90 -584q201 80 385 80q299 0 299 -363q0 -95 -21 -215q-16 -94 -32.5 -162.5t-51 -146.5t-78.5 -126q-44 -47 -117 -77q-64 -26 -143 -26h-22q-94 4 -205.5 48t-157.5 83l-61 -119h-143zM342 252q184 -88 348 -88q102 0 160.5 92t87.5 285 q21 111 21 191q-1 56 -11 98q-24 102 -139 102q-184 0 -367 -49z" /> +<glyph unicode="c" horiz-adv-x="1011" d="M176 553q25 147 61.5 250.5t75.5 161t94.5 89t101.5 40t114 8.5q207 0 467 -60l-21 -129q-258 16 -440 17q-55 0 -86 -9.5t-67 -45t-62.5 -117.5t-51.5 -221q-20 -109 -20 -184q0 -71 18 -111q37 -82 146 -82q84 0 198.5 5t188.5 10l74 5l-21 -131q-206 -61 -466 -61h-17 q-172 2 -255 138q-51 84 -51 228q0 88 19 199z" /> +<glyph unicode="d" horiz-adv-x="1128" d="M164 350q-2 29 -2 58q0 72 14 143q20 123 49 212t78 172t130 126t192 43q74 0 180 -21.5t188 -58.5l94 584h185l-256 -1608h-144l-24 119q-59 -43 -174 -87t-207 -44q-100 0 -170 50t-97.5 131t-35.5 181zM365 541q-15 -90 -14 -159q0 -218 147 -218q164 0 372 88 l101 631q-168 49 -355 49q-92 0 -153 -83t-98 -308z" /> +<glyph unicode="e" horiz-adv-x="1075" d="M176 582q27 141 56.5 226t89 159.5t156.5 107.5t243 33q207 0 313 -72q89 -60 90 -188q0 -25 -4 -53q-14 -129 -92 -214t-179 -115t-211 -36q-44 -2 -82 -2q-58 0 -104 5q-76 9 -104 22q-14 -82 -14 -139q0 -62 17 -96q32 -64 143 -66q47 -3 100 -3q167 0 393 33 l-22 -139q-215 -60 -472 -60q-27 0 -55 1q-195 2 -256 148q-32 77 -32 197q0 108 26 251zM367 586q20 -2 56 -5q15 -1 41 -1q34 0 87 2q92 4 164.5 20t138.5 62.5t78 119.5q4 22 4 41q0 60 -40 82q-49 27 -170 27h-17q-98 0 -162 -22.5t-98.5 -81t-46 -93.5t-30.5 -124 q-3 -19 -5 -27z" /> +<glyph unicode="f" horiz-adv-x="825" d="M182 918l23 131l203 38l16 93q39 240 114.5 334t249.5 94q113 0 246 -49l-18 -119h-217q-98 0 -131 -53.5t-60 -225.5l-12 -74h317l-26 -169h-320l-151 -918h-189l150 918h-195z" /> +<glyph unicode="g" horiz-adv-x="1134" d="M66 -508l20 125h510q78 0 134 50t71 145l39 251q-180 -77 -342 -77h-4q-119 0 -195 45t-104.5 125t-33.5 188q-1 18 -1 37q0 91 20 194q43 258 162 392.5t297 134.5q211 0 547 -51l-197 -1248q-31 -190 -143 -283q-96 -79 -223 -79q-22 0 -45 2zM354 285 q25 -129 158 -129h2q164 0 348 49l117 727h-332q-215 0 -278 -377q-19 -135 -19 -212q0 -35 4 -58z" /> +<glyph unicode="h" horiz-adv-x="1116" d="M115 0l254 1606h188l-102 -643q92 51 132 72.5t120.5 46t158.5 24.5q160 0 230 -104q52 -77 51 -179q0 -35 -6 -73l-119 -750h-188l118 750q4 26 4 47q0 57 -26 91q-36 46 -115 46q-72 0 -137.5 -15.5t-108.5 -33t-135 -62.5l-131 -823h-188z" /> +<glyph unicode="i" horiz-adv-x="415" d="M113 0l172 1087h188l-172 -1087h-188zM293 1257l18 132q6 51 58 51h133q40 0 40 -37q0 -6 -1 -14l-19 -132q-6 -47 -55 -47h-133q-42 0 -42 37q0 5 1 10z" /> +<glyph unicode="j" horiz-adv-x="458" d="M47 -553l260 1640h189l-174 -1095q-49 -330 -146 -545h-129zM313 1257l21 132q6 51 57 51h133q40 0 40 -37q0 -7 -1 -14l-20 -132q-6 -47 -56 -47h-133q-42 0 -42 37q0 5 1 10z" /> +<glyph unicode="k" horiz-adv-x="1026" d="M115 0l254 1602h188l-149 -943q141 45 302.5 180.5t188.5 247.5h207q-45 -158 -187.5 -298t-267.5 -199l389 -590h-221l-352 535l-78 -3l-86 -532h-188z" /> +<glyph unicode="l" horiz-adv-x="602" d="M174 387l193 1217h188l-190 -1205q-5 -75 -11 -115q-1 -10 -2 -19q0 -27 12 -45q16 -24 31 -33t47 -17q141 -37 144 -37l-21 -133h-151q-250 0 -250 268q0 54 10 119z" /> +<glyph unicode="m" horiz-adv-x="1824" d="M115 0l172 1087h141l27 -126q16 8 53 29.5t53.5 29.5t50 24.5t55 23.5t53.5 16.5t64.5 12.5t67.5 3q92 0 165 -47t95 -121q238 168 461 168q143 0 222 -100q60 -76 60 -186q0 -35 -6 -73l-118 -741h-189l119 743q3 21 3 40q0 57 -31 95q-42 50 -111 50q-117 0 -200 -22.5 t-181 -84.5q0 -2 -5.5 -42t-7.5 -42l-116 -737h-189l117 743q4 21 4 40q0 57 -32 95q-42 50 -111 50q-72 0 -134.5 -15.5t-99.5 -31t-135 -62.5l-129 -819h-188z" /> +<glyph unicode="n" horiz-adv-x="1116" d="M115 0l172 1087h141l27 -124q179 99 262 122q74 21 149 21q160 0 230 -104q52 -77 51 -179q0 -35 -6 -73l-119 -750h-188l118 750q4 25 4 47q0 58 -28 91q-38 46 -113 46q-72 0 -137.5 -15.5t-108.5 -33t-135 -62.5l-131 -823h-188z" /> +<glyph unicode="o" horiz-adv-x="1150" d="M176 537q51 328 173 444.5t396 116.5q259 0 353 -140q62 -93 62 -253q0 -83 -17 -185q-49 -305 -165 -417.5t-386 -112.5q-268 0 -364 128q-66 87 -66 250q0 76 14 169zM348 386v-19q0 -47 10 -81q12 -40 31 -64.5t53.5 -37t70.5 -16.5t89 -4q84 0 132 9t95.5 45 t76 110.5t48.5 199.5q22 103 22 177q0 43 -8 75q-20 88 -74 117t-171 29q-88 0 -139.5 -12.5t-96.5 -53.5t-72 -120t-50 -212q-15 -82 -17 -142z" /> +<glyph unicode="p" horiz-adv-x="1142" d="M27 -553l270 1614q219 33 530 33q324 0 324 -407q0 -79 -12 -173q-33 -242 -142.5 -386t-310.5 -144q-215 0 -373 75l-100 -612h-186zM338 203q138 -52 259 -52q46 0 89 7q47 8 80 22.5t70.5 51t66.5 114.5t47 197q14 85 14 151q0 230 -165 230h-340z" /> +<glyph unicode="q" horiz-adv-x="1132" d="M166 259q-4 38 -4 79q0 99 18 219q88 545 471 545q76 0 165 -7.5t144.5 -13.5t134.5 -17t91 -13l-254 -1604h-189l97 612q-188 -79 -349 -79h-4q-152 0 -231.5 75.5t-89.5 203.5zM347 348q-1 -16 -1 -28q0 -39 7 -58q9 -24 26.5 -56t51.5 -43t83 -11q164 0 350 49 l115 731h-340q-68 0 -120 -39t-81.5 -104.5t-45 -121t-23.5 -116.5q-10 -80 -14.5 -111.5t-7.5 -91.5z" /> +<glyph unicode="r" horiz-adv-x="868" d="M115 0l172 1087h143l23 -137q8 4 36.5 21.5t38 22.5t37 19.5t39.5 20.5t38 17.5t41 16.5t40 12t44 10.5t44 6.5t47 3q109 0 141 -17l-30 -184q-45 10 -152 10q-109 0 -190.5 -26.5t-198.5 -91.5l-125 -791h-188z" /> +<glyph unicode="s" horiz-adv-x="1040" d="M127 25l20 131h549q102 0 117 100l16 94q3 18 3 32q0 28 -12 45q-19 26 -77 26h-286q-270 0 -270 213q0 31 6 67l16 103q23 137 97.5 203.5t228.5 66.5q111 0 292 -12.5t250 -26.5l-22 -133h-523q-121 0 -137 -109l-14 -90q-8 -23 -4 -40t4 -28.5t10 -18.5t13.5 -11 t17.5 -5t20.5 -2t20.5 0t20 1h293q134 0 198 -78q49 -61 50 -146q0 -24 -4 -51l-19 -129q-12 -80 -44.5 -132t-80 -74.5t-89.5 -30.5t-95 -8q-102 0 -307 15.5t-258 27.5z" /> +<glyph unicode="t" horiz-adv-x="772" d="M180 920l21 127l202 43l86 303h150l-47 -303h297l-29 -170h-297l-82 -521q-6 -75 -10 -115q-1 -8 -1 -15q0 -29 12 -49q16 -24 30 -33t47 -17q141 -39 146 -39l-19 -131h-156q-248 0 -248 265q0 55 11 122l82 533h-195z" /> +<glyph unicode="u" horiz-adv-x="1114" d="M150 340l118 747h189l-119 -749q-5 -31 -5 -55q1 -58 27 -87q38 -40 117 -40q104 0 179 23.5t202 86.5l129 821h189l-172 -1087h-142l-28 123q-175 -97 -256 -120q-74 -21 -152 -21q-164 0 -232 99q-50 73 -51 178q0 38 7 81z" /> +<glyph unicode="v" horiz-adv-x="1064" d="M186 1087h199l186 -864l349 684q41 86 55 180h160q13 -43 13 -85q0 -70 -36 -138l-448 -864h-234z" /> +<glyph unicode="w" horiz-adv-x="1650" d="M186 1087h193l182 -856l348 670q45 92 58 182h151q13 -44 13 -87q0 -62 -27 -119l-53 -117l102 -518l363 665q45 92 55 180h153q13 -46 13 -89q0 -70 -35 -134l-481 -864h-195l-108 530l-275 -530h-213z" /> +<glyph unicode="x" horiz-adv-x="1099" d="M45 0l477 553l-305 534h221l215 -393l336 393h238l-477 -561l297 -526h-218l-213 383l-325 -383h-246z" /> +<glyph unicode="y" horiz-adv-x="1130" d="M186 1087h197l113 -825q2 -16 8 -28.5t14 -20.5t17.5 -14t19.5 -9.5t19.5 -5.5t19.5 -3t16 0t12 1h5l362 727q35 74 51 183h164q11 -39 11 -79q0 -75 -37 -153l-426 -858q-131 -268 -263.5 -400t-291.5 -163v133q80 49 150.5 130t108.5 142.5t87 155.5q-80 0 -150.5 52 t-89.5 188z" /> +<glyph unicode="z" horiz-adv-x="942" d="M88 2l23 176l671 733h-577l24 176h830l-25 -176l-657 -733h536q-27 -176 -26 -176h-799z" /> +<glyph unicode="{" horiz-adv-x="655" d="M133 602l25 160h36q33 0 42.5 1t36 7t38 14.5t23.5 25.5t16 42l76 483q59 371 463 371l-27 -176q-106 2 -169.5 -49t-84.5 -181l-69 -452q-27 -150 -211 -178q78 -12 119.5 -62.5t31.5 -118.5l-80 -493q-25 -154 20.5 -215.5t155.5 -54.5l-26 -175q-211 0 -290 125 t-50 308l80 493q10 59 -40 94t-116 31z" /> +<glyph unicode="|" horiz-adv-x="501" d="M139 -147l273 1724h176l-273 -1724h-176z" /> +<glyph unicode="}" horiz-adv-x="647" d="M-29 -449l27 175q104 -2 167.5 49t84.5 174l76 473q23 143 206 178q-78 10 -118.5 59.5t-30.5 120.5l76 473q27 158 -18.5 219.5t-155.5 57.5l28 176q207 0 286 -128t48 -308l-74 -479q-10 -59 40.5 -94t115.5 -31l-24 -158h-28q-24 0 -31 -1t-28.5 -3t-30.5 -6 t-24.5 -10.5t-24 -15.5t-16.5 -23.5t-10 -32.5l-80 -492q-60 -373 -461 -373z" /> +<glyph unicode="~" horiz-adv-x="884" d="M281 1180q14 12 49 39.5t52 40t47 30t57.5 24.5t58.5 7q45 0 104.5 -36t100.5 -36q16 0 32.5 2t34 8.5t29.5 10.5t30.5 14t26.5 15.5t27.5 17.5t23.5 14l31 -96l-37 -34q-37 -34 -51 -43t-47 -31.5t-61.5 -31t-59.5 -8.5q-47 0 -111.5 36t-103.5 36q-37 0 -66.5 -10 t-70.5 -30.5t-66 -31.5z" /> +<glyph unicode="¢" horiz-adv-x="999" d="M154.5 221q-35.5 125 5.5 332q27 152 63.5 256t75.5 162.5t96.5 89.5t108.5 37t127 4l33 196h137l-33 -206q178 -23 305 -52l-22 -127q-258 14 -441 15q-55 0 -84.5 -8.5t-65.5 -44t-62.5 -117.5t-51.5 -221q-39 -213 -2 -295t145 -82q84 0 199 5t189 10l73 5l-22 -131 q-156 -53 -336 -59l-27 -187h-139l29 185q-117 2 -191 55t-109.5 178z" /> +<glyph unicode="£" horiz-adv-x="1212" d="M96 0l23 147l151 35l76 486h-145l16 106l152 37l34 221q14 94 40 168t54.5 123t71.5 83t81 52.5t96.5 27.5t101.5 11t113 2q51 0 148 -8t169 -16l72 -9l-25 -147h-381q-188 0 -255.5 -54.5t-96.5 -236.5l-35 -217l520 -33l-16 -110h-526l-76 -486h686l-29 -182h-1020z " /> +<glyph unicode="¥" horiz-adv-x="1249" d="M225 305l21 133h321l15 94h-322l23 136h292l-301 831h201l238 -680l508 680h225l-633 -831h344l-22 -136h-365l-14 -94h364l-20 -133h-361l-41 -305h-188l41 305h-326z" /> +<glyph unicode="¨" horiz-adv-x="927" d="M285 1192q6 45 43 75.5t82 30.5t70.5 -30.5t19.5 -75.5t-42 -77t-81 -32t-72.5 32t-19.5 77zM807 1192q6 45 43 75.5t82 30.5t71.5 -30.5t18.5 -75.5q-6 -45 -43 -77t-82 -32t-71.5 32t-18.5 77z" /> +<glyph unicode="©" horiz-adv-x="1642" d="M206 582.5q1 93.5 13 177.5q23 154 61.5 274.5t105.5 231t176.5 172t254.5 61.5h514q96 0 166 -36t107.5 -98t58 -136t23 -164t-4 -165t-18.5 -155q-53 -334 -191.5 -539.5t-359.5 -205.5h-514q-113 0 -193.5 55.5t-121.5 138t-59.5 189t-17.5 200zM354.5 464 q7.5 -136 74.5 -228.5t177 -92.5h520q131 0 237.5 156t154.5 455q12 74 18 131t9 133t-8 130t-32.5 104.5t-66.5 77t-111 26.5h-532q-154 0 -265.5 -132t-164.5 -470q-18 -154 -10.5 -290zM582 754q41 250 133 345t231 95t361 -49l-19 -119q-170 25 -352 25 q-162 0 -209 -310q-27 -129 -2 -213t117 -84q131 0 372 33l-18 -119q-199 -57 -387 -57q-131 0 -197.5 112t-29.5 341z" /> +<glyph unicode="«" horiz-adv-x="1150" d="M211 725l487 416l105 -123l-361 -307l260 -305l-127 -107zM614 725l488 416l104 -123l-360 -307l260 -305l-127 -107z" /> +<glyph unicode="­" horiz-adv-x="724" d="M123 506l29 176h643l-29 -176h-643z" /> +<glyph unicode="®" horiz-adv-x="1642" d="M206 582.5q1 93.5 13 177.5q23 154 61.5 274.5t105.5 231t176.5 172t254.5 61.5h514q96 0 166 -36t107.5 -98t58 -136t23 -164t-4 -165t-18.5 -155q-53 -334 -191.5 -539.5t-359.5 -205.5h-514q-113 0 -193.5 55.5t-121.5 138t-59.5 189t-17.5 200zM354.5 464 q7.5 -136 74.5 -228.5t177 -92.5h520q131 0 237.5 156t154.5 455q12 74 18 131t9 133t-8 130t-32.5 104.5t-66.5 77t-111 26.5h-532q-154 0 -265.5 -132t-164.5 -470q-18 -154 -10.5 -290zM571 313l140 875h364q106 0 178 -61.5t54 -215.5q-6 -43 -16.5 -78.5t-20.5 -59 t-28.5 -43t-30 -30t-36 -19.5t-32.5 -12t-34 -8.5t-30 -5.5l129 -342h-164l-126 342l-142 25l-59 -367h-146zM791 782h221q80 0 107.5 27t39.5 113q10 35 2 58.5t-14 36.5t-25.5 19t-33 7t-35.5 1h-219z" /> +<glyph unicode="´" horiz-adv-x="495" d="M211 1087l252 277h211l-309 -277h-154z" /> +<glyph unicode="¸" horiz-adv-x="509" d="M39 -356l14 88l107 30q72 29 92 162h151q-25 -160 -79 -220t-179 -60h-106z" /> +<glyph unicode="»" horiz-adv-x="1144" d="M162 424l360 309l-256 299l125 109l363 -424l-486 -418zM571 424l363 309l-258 299l125 109l364 -424l-487 -418z" /> +<glyph unicode="À" horiz-adv-x="1366" d="M86 0l776 1499h199l278 -1499h-192l-74 395h-575l-205 -395h-207zM588 573h456l-116 670zM664 1909h194l203 -277h-154z" /> +<glyph unicode="Â" horiz-adv-x="1366" d="M86 0l776 1499h199l278 -1499h-192l-74 395h-575l-205 -395h-207zM588 573h456l-116 670zM680 1632l276 269h164l166 -269h-147l-109 160l-174 -160h-176z" /> +<glyph unicode="Æ" horiz-adv-x="1937" d="M57 0l797 1221q57 86 114.5 144t109.5 84t108.5 39t109 11t109.5 0q610 -29 645 -33l-22 -153h-633q-37 0 -59.5 -7.5t-35 -28t-16.5 -31.5t-10 -42l-60 -375l648 -20l-25 -152l-653 -20l-58 -356q-6 -39 1.5 -62.5t29 -32t36.5 -10.5t46 -2h608l-26 -149l-631 -35 q-117 -6 -197 58.5t-59 199.5l29 205h-396l-295 -453h-215zM682 631h311l105 631z" /> +<glyph unicode="Ç" horiz-adv-x="1179" d="M207.5 485.5q-9.5 139.5 19.5 278.5q33 190 75 320t111.5 232.5t177 151t257.5 48.5q209 0 495 -66l-22 -147q-324 35 -479 30q-41 0 -57.5 -1t-61.5 -12t-70.5 -30.5t-65.5 -62.5t-65.5 -103.5t-54.5 -156t-47 -217.5q-96 -557 227 -580q139 -8 502 16l-21 -149 q-176 -49 -516 -49q-137 0 -230 68.5t-129 179t-45.5 250zM379 -356l14 88l109 30q43 12 62.5 52.5t29.5 109.5h151q-25 -160 -79 -220t-179 -60h-108z" /> +<glyph unicode="È" d="M190 266l152 959q47 285 322 274q604 -29 639 -33l-23 -151h-629q-66 0 -91 -31t-34 -84l-57 -360l647 -21l-24 -151l-652 -21l-59 -362q-4 -39 2 -62.5t27.5 -32t37 -10.5t46.5 -2h608l-27 -149l-631 -35q-119 -6 -198 61.5t-56 210.5zM569 1896h197l201 -274h-154z" /> +<glyph unicode="É" d="M190 266l152 959q47 285 322 274q604 -29 639 -33l-23 -151h-629q-66 0 -91 -31t-34 -84l-57 -360l647 -21l-24 -151l-652 -21l-59 -362q-4 -39 2 -62.5t27.5 -32t37 -10.5t46.5 -2h608l-27 -149l-631 -35q-119 -6 -198 61.5t-56 210.5zM807 1622l252 274h211l-312 -274 h-151z" /> +<glyph unicode="Ê" d="M190 266l152 959q47 285 322 274q604 -29 639 -33l-23 -151h-629q-66 0 -91 -31t-34 -84l-57 -360l647 -21l-24 -151l-652 -21l-59 -362q-4 -39 2 -62.5t27.5 -32t37 -10.5t46.5 -2h608l-27 -149l-631 -35q-119 -6 -198 61.5t-56 210.5zM578 1622l278 270h164l166 -270 h-154l-100 156l-166 -156h-188z" /> +<glyph unicode="Ë" d="M190 266l152 959q47 285 322 274q604 -29 639 -33l-23 -151h-629q-66 0 -91 -31t-34 -84l-57 -360l647 -21l-24 -151l-652 -21l-59 -362q-4 -39 2 -62.5t27.5 -32t37 -10.5t46.5 -2h608l-27 -149l-631 -35q-119 -6 -198 61.5t-56 210.5zM514 1726q6 45 43 76t82 31 t70.5 -30.5t19.5 -76t-43 -77t-82 -31.5t-71.5 31.5t-18.5 76.5zM1036 1726q6 45 43 76t82 31t70.5 -30.5t19.5 -76t-43 -77t-82 -31.5t-71.5 31.5t-18.5 76.5z" /> +<glyph unicode="Î" horiz-adv-x="477" d="M170 0l238 1499h188l-238 -1499h-188zM219 1632l279 269h164l165 -269h-147l-109 160l-174 -160h-178z" /> +<glyph unicode="Ï" horiz-adv-x="477" d="M170 0l238 1499h188l-238 -1499h-188zM172 1741q6 45 43 75.5t82 30.5t71.5 -30.5t18.5 -75.5q-6 -45 -42 -77t-81 -32t-71.5 32t-20.5 77zM694 1741q6 45 43 75.5t82 30.5t72 -30.5t18 -75.5q-6 -45 -42 -77t-81 -32t-71.5 32t-20.5 77z" /> +<glyph unicode="Ô" horiz-adv-x="1363" d="M204.5 492q1.5 113 24.5 256q23 150 54.5 264t67.5 194t85 136.5t96.5 89t115 50t127 22.5t145.5 5q82 0 144 -7t123.5 -27.5t103.5 -56.5t75 -94t47 -140t12 -196t-24 -257q-25 -164 -60.5 -284.5t-85 -201.5t-102.5 -131.5t-127 -77t-144.5 -35.5t-168.5 -9 q-80 0 -139.5 6t-122 24.5t-104.5 51t-78 90t-51 136.5t-13.5 192zM392 490q-1 -99 15.5 -162.5t61.5 -97t103.5 -45t152.5 -11.5q147 0 234.5 40t152 165t100.5 360q18 121 22.5 213t0.5 154.5t-28.5 104.5t-47 64.5t-70 35t-83 14.5t-99.5 2q-59 0 -92 -2t-80 -9 t-73.5 -23.5t-61.5 -44t-56.5 -70.5t-46 -103.5t-44 -145t-35.5 -190.5q-25 -150 -26 -249zM637 1632l276 269h164l166 -269h-147l-109 160l-174 -160h-176z" /> +<glyph unicode="Ù" horiz-adv-x="1341" d="M250 633l137 866h191l-138 -874q-41 -262 21.5 -357.5t247.5 -95.5q193 0 291 101.5t137 351.5l137 874h190l-135 -885q-18 -115 -43.5 -199.5t-73 -168.5t-114 -137.5t-170 -86t-238.5 -32.5q-262 0 -377.5 147.5t-62.5 495.5zM627 1909h196l201 -277h-154z" /> +<glyph unicode="Û" horiz-adv-x="1341" d="M250 633l137 866h191l-138 -874q-41 -262 21.5 -357.5t247.5 -95.5q193 0 291 101.5t137 351.5l137 874h190l-135 -885q-18 -115 -43.5 -199.5t-73 -168.5t-114 -137.5t-170 -86t-238.5 -32.5q-262 0 -377.5 147.5t-62.5 495.5zM645 1632l277 269h163l166 -269h-147 l-109 160l-174 -160h-176z" /> +<glyph unicode="Ü" horiz-adv-x="1341" d="M250 633l137 866h191l-138 -874q-41 -262 21.5 -357.5t247.5 -95.5q193 0 291 101.5t137 351.5l137 874h190l-135 -885q-18 -115 -43.5 -199.5t-73 -168.5t-114 -137.5t-170 -86t-238.5 -32.5q-262 0 -377.5 147.5t-62.5 495.5zM596 1741q6 43 44 74.5t83 31.5 t70.5 -30.5t19.5 -75.5q-8 -45 -44 -77t-81 -32t-71.5 32t-20.5 77zM1118 1741q6 43 44 74.5t83 31.5t70.5 -30.5t19.5 -75.5q-8 -45 -44 -77t-81 -32t-71.5 32t-20.5 77z" /> +<glyph unicode="à" horiz-adv-x="1105" d="M152.5 333q-7.5 104 21.5 247q29 160 79 267t118.5 159.5t128 73t137.5 28.5q123 14 285.5 -21.5t236.5 -105.5l-143 -981h-139l-29 121q-59 -47 -162.5 -91t-204.5 -44q-74 0 -128 15t-102 55t-69.5 106.5t-29 170.5zM356 526q-31 -197 5 -280.5t149 -83.5 q100 0 173 23.5t179 76.5l99 645q-190 55 -316 29q-57 -10 -91 -24.5t-76 -53.5t-72 -121t-50 -211zM414 1509h194l203 -274h-154z" /> +<glyph unicode="â" horiz-adv-x="1105" d="M152.5 333q-7.5 104 21.5 247q29 160 79 267t118.5 159.5t128 73t137.5 28.5q123 14 285.5 -21.5t236.5 -105.5l-143 -981h-139l-29 121q-59 -47 -162.5 -91t-204.5 -44q-74 0 -128 15t-102 55t-69.5 106.5t-29 170.5zM356 526q-31 -197 5 -280.5t149 -83.5 q100 0 173 23.5t179 76.5l99 645q-190 55 -316 29q-57 -10 -91 -24.5t-76 -53.5t-72 -121t-50 -211zM430 1235l279 268h163l164 -268h-145l-111 160l-174 -160h-176z" /> +<glyph unicode="æ" horiz-adv-x="1816" d="M106 575q25 135 65 232.5t81 152t100.5 87t103.5 44t107 17.5q98 12 234.5 -12.5t222.5 -73.5q119 86 334 86q207 0 315.5 -71.5t89.5 -241.5q-14 -129 -93 -214t-179.5 -115t-211 -36t-186 3t-104.5 22q-27 -172 5 -235.5t143 -65.5q195 -14 489 30l-23 -139 q-238 -66 -522 -59q-190 2 -254 143q-59 -55 -185 -99t-226 -44q-415 -1 -306 589zM285.5 245.5q31.5 -81.5 152.5 -83.5q98 -2 204 25.5t149 68.5q-14 119 22 326q43 217 98 315q-223 63 -336 39q-57 -10 -89.5 -24.5t-75.5 -53.5t-73 -122t-50 -212q-33 -197 -1.5 -278.5z M1004 586q20 -2 56 -5t128 1t164.5 20t138 62.5t78.5 119.5q16 94 -36 123t-187 27q-96 0 -161 -24.5t-97.5 -75t-48 -96.5t-29.5 -119q-4 -23 -6 -33z" /> +<glyph unicode="ç" horiz-adv-x="1015" d="M180 553q31 182 76 298t108.5 168t120 67.5t142.5 15.5q219 0 465 -62l-19 -127q-258 14 -440 15q-57 0 -87 -8.5t-66 -44t-62.5 -117.5t-50.5 -221q-39 -213 -2.5 -295t145.5 -82q84 0 198.5 5t188.5 10l74 5l-21 -131q-197 -66 -483 -61q-172 2 -255 138t-32 427z M289 -358l14 90l109 30q70 27 90 162h153q-25 -160 -79 -221t-179 -61h-108z" /> +<glyph unicode="è" horiz-adv-x="1075" d="M176 582q27 141 56.5 226t89 159.5t156.5 107.5t243 33q207 0 313.5 -71.5t85.5 -241.5q-14 -129 -92 -214t-179 -115t-211 -36t-185.5 3t-104.5 22q-29 -172 3 -235.5t143 -65.5q195 -14 493 30l-22 -139q-238 -66 -527 -59q-195 2 -256 148.5t-6 447.5zM367 586 q20 -2 56 -5t128 1t164.5 20t138.5 62.5t78 119.5q16 94 -36 123t-187 27q-98 0 -162 -22.5t-98.5 -81t-46 -93.5t-30.5 -124q-3 -19 -5 -27zM420 1507h196l201 -276h-153z" /> +<glyph unicode="é" horiz-adv-x="1075" d="M176 582q27 141 56.5 226t89 159.5t156.5 107.5t243 33q207 0 313.5 -71.5t85.5 -241.5q-14 -129 -92 -214t-179 -115t-211 -36t-185.5 3t-104.5 22q-29 -172 3 -235.5t143 -65.5q195 -14 493 30l-22 -139q-238 -66 -527 -59q-195 2 -256 148.5t-6 447.5zM367 586 q20 -2 56 -5t128 1t164.5 20t138.5 62.5t78 119.5q16 94 -36 123t-187 27q-98 0 -162 -22.5t-98.5 -81t-46 -93.5t-30.5 -124q-3 -19 -5 -27zM664 1231l254 276h210l-311 -276h-153z" /> +<glyph unicode="ê" horiz-adv-x="1075" d="M176 582q27 141 56.5 226t89 159.5t156.5 107.5t243 33q207 0 313.5 -71.5t85.5 -241.5q-14 -129 -92 -214t-179 -115t-211 -36t-185.5 3t-104.5 22q-29 -172 3 -235.5t143 -65.5q195 -14 493 30l-22 -139q-238 -66 -527 -59q-195 2 -256 148.5t-6 447.5zM367 586 q20 -2 56 -5t128 1t164.5 20t138.5 62.5t78 119.5q16 94 -36 123t-187 27q-98 0 -162 -22.5t-98.5 -81t-46 -93.5t-30.5 -124q-3 -19 -5 -27zM438 1231l277 268h164l165 -268h-147l-109 160l-174 -160h-176z" /> +<glyph unicode="ë" horiz-adv-x="1075" d="M176 582q27 141 56.5 226t89 159.5t156.5 107.5t243 33q207 0 313.5 -71.5t85.5 -241.5q-14 -129 -92 -214t-179 -115t-211 -36t-185.5 3t-104.5 22q-29 -172 3 -235.5t143 -65.5q195 -14 493 30l-22 -139q-238 -66 -527 -59q-195 2 -256 148.5t-6 447.5zM367 586 q20 -2 56 -5t128 1t164.5 20t138.5 62.5t78 119.5q16 94 -36 123t-187 27q-98 0 -162 -22.5t-98.5 -81t-46 -93.5t-30.5 -124q-3 -19 -5 -27zM389 1339q6 45 43 76t84 31q45 0 70.5 -31t19.5 -76q-8 -45 -44 -76.5t-81 -31.5t-71.5 31.5t-20.5 76.5zM911.5 1339 q6.5 45 43 76t83.5 31q45 0 71 -31t19 -76q-8 -45 -43.5 -76.5t-81 -31.5t-72 31.5t-20 76.5z" /> +<glyph unicode="î" horiz-adv-x="415" d="M88 1221l277 270h163l166 -270h-147l-109 161l-174 -161h-176zM111 0l172 1087h188l-172 -1087h-188z" /> +<glyph unicode="ï" horiz-adv-x="415" d="M33 1331q6 45 43 76t82 31t71.5 -31t18.5 -76q-6 -45 -42 -77.5t-81 -32.5q-47 0 -73.5 32.5t-18.5 77.5zM111 0l172 1087h188l-172 -1087h-188zM555 1331q6 45 43 76t82 31t71.5 -31t18.5 -76q-6 -45 -42 -77.5t-81 -32.5t-72.5 32.5t-19.5 77.5z" /> +<glyph unicode="ô" horiz-adv-x="1150" d="M176 537q51 328 173 444.5t396 116.5q258 0 352.5 -140.5t45.5 -437.5q-49 -305 -165 -417.5t-386 -112.5q-268 0 -364.5 128t-51.5 419zM348.5 386q-2.5 -60 10 -100t31 -64.5t53 -37t70.5 -16.5t89 -4q84 0 132 9t95.5 45t76 110.5t48.5 199.5q35 164 14.5 252 t-74.5 117t-171 29q-88 0 -139.5 -12.5t-96.5 -53.5t-72 -120t-50 -212q-14 -82 -16.5 -142zM457 1221l276 270h164l166 -270h-148l-108 161l-174 -161h-176z" /> +<glyph unicode="ù" horiz-adv-x="1114" d="M150 340l118 747h189l-119 -749q-16 -102 21.5 -142t117.5 -40q104 0 179 23.5t202 86.5l129 821h189l-172 -1087h-142l-28 123q-175 -97 -256 -120q-74 -21 -152 -21q-164 0 -232.5 99t-43.5 259zM422 1497h196l201 -276h-153z" /> +<glyph unicode="û" horiz-adv-x="1114" d="M150 340l118 747h189l-119 -749q-16 -102 21.5 -142t117.5 -40q104 0 179 23.5t202 86.5l129 821h189l-172 -1087h-142l-28 123q-175 -97 -256 -120q-74 -21 -152 -21q-164 0 -232.5 99t-43.5 259zM438 1221l279 270h164l166 -270h-148l-108 161l-175 -161h-178z" /> +<glyph unicode="ü" horiz-adv-x="1114" d="M150 340l118 747h189l-119 -749q-16 -102 21.5 -142t117.5 -40q104 0 179 23.5t202 86.5l129 821h189l-172 -1087h-142l-28 123q-175 -97 -256 -120q-74 -21 -152 -21q-164 0 -232.5 99t-43.5 259zM391 1331q6 45 43 76t82 31t71.5 -31t18.5 -76q-6 -45 -42 -77.5 t-81 -32.5t-71.5 31.5t-20.5 78.5zM913 1331q6 45 43 76t82 31t72 -31t18 -76q-6 -45 -41.5 -77.5t-80.5 -32.5t-72 31.5t-21 78.5z" /> +<glyph unicode="ÿ" horiz-adv-x="1130" d="M186 1087h197l113 -825q2 -16 8 -28.5t14 -20.5t17.5 -14t19.5 -9.5t19.5 -5.5t19.5 -3t16 0t12 1h5l362 727q35 74 51 183h164q31 -111 -26 -232l-426 -858q-131 -268 -263.5 -400t-291.5 -163v133q80 49 150.5 130t108.5 142.5t87 155.5q-80 0 -150.5 52t-89.5 188z M369 1315q8 45 45 75.5t82 30.5t70.5 -30.5t19.5 -75.5t-43 -77t-82 -32t-71.5 32t-20.5 77zM893 1315q6 45 43 75.5t82 30.5t70.5 -30.5t19.5 -75.5t-43 -77t-82 -32t-71.5 32t-18.5 77z" /> +<glyph unicode="Œ" horiz-adv-x="2181" d="M178 492q2 113 25 256q27 172 63.5 300t86.5 209.5t102.5 134t128 77t143.5 32.5t168 8q156 0 258 -32.5t162 -120.5q70 154 274 143q604 -29 639 -33l-22 -151h-629q-66 0 -91.5 -31t-33.5 -84l-55 -360l645 -21l-23 -151l-653 -21l-59 -362q-4 -39 2 -62.5t27.5 -32 t37 -10.5t45.5 -2h609l-27 -149l-629 -35q-80 -4 -145.5 28.5t-91.5 102.5q-80 -78 -187.5 -105.5t-259.5 -27.5q-80 0 -139.5 6t-123 24.5t-105 51t-77.5 90t-51.5 136.5t-13.5 192zM366.5 490q-1.5 -99 14.5 -162.5t62 -97t104.5 -45t152.5 -11.5q147 0 233.5 40t151 165 t101.5 360q27 168 24.5 281t-21 174t-71.5 91t-99 36t-136 6q-80 0 -122 -4t-98.5 -20.5t-89 -53.5t-69.5 -101.5t-63.5 -166t-49.5 -242.5q-23 -150 -24.5 -249z" /> +<glyph unicode="œ" horiz-adv-x="1869" d="M160 541q51 328 173 442.5t396 114.5q268 0 356 -156q119 166 416 166q207 0 313.5 -71.5t86.5 -241.5q-14 -129 -92 -214t-179.5 -115t-211 -36t-185.5 3t-105 22q-29 -172 3 -236.5t143 -64.5q287 0 493 30l-22 -139q-238 -66 -526 -59q-182 0 -244 135 q-117 -131 -397 -131q-268 0 -365.5 130t-52.5 421zM332 386q-2 -60 10 -100t30.5 -64.5t53.5 -37t70.5 -16.5t89.5 -4q86 0 134 9t95 45t76 110.5t49 199.5q41 244 -9 321t-222 77q-88 0 -139.5 -12.5t-97.5 -53.5t-73.5 -120t-50.5 -212q-14 -82 -16 -142zM1147 586 q20 -2 56 -5t128 1t165 20t137.5 62.5t76.5 119.5q16 94 -35 123t-186 27q-98 0 -161.5 -22.5t-98.5 -81t-46.5 -93.5t-30.5 -124q-3 -19 -5 -27z" /> +<glyph unicode="Ÿ" horiz-adv-x="1304" d="M225 1499h201l238 -762l514 762h219l-668 -985l-80 -514h-188l80 514zM481 1733q6 45 43 75.5t82 30.5t70.5 -30.5t19.5 -75.5t-43 -77t-82 -32t-71.5 32t-18.5 77zM1004 1733q6 45 42.5 75.5t82 30.5t71 -30.5t19 -75.5t-43 -77t-81.5 -32t-71.5 32t-18.5 77z" /> +<glyph unicode="ˆ" horiz-adv-x="669" d="M127 1087l276 269h164l166 -269h-147l-109 160l-174 -160h-176z" /> +<glyph unicode="˚" horiz-adv-x="598" d="M282.5 1294q8.5 88 74 149.5t151.5 61.5t142.5 -61.5t48 -149.5t-74 -148.5t-151.5 -60.5t-142.5 60.5t-48 148.5zM385 1294q-4 -43 24.5 -73.5t71.5 -30.5t77 30.5t36 73.5q4 43 -23.5 75t-70.5 32t-78 -32t-37 -75z" /> +<glyph unicode="˜" horiz-adv-x="894" d="M268 1180q57 45 90 67.5t82 44t92 21.5q55 -2 117 -36t88 -34q35 -2 111 27.5t94 44.5l31 -96l-49 -35q-35 -25 -53.5 -37t-47 -28.5t-55.5 -22.5t-53 -6q-59 2 -118.5 35.5t-92.5 33.5q-31 0 -61.5 -8t-48 -16.5t-49.5 -24.5l-46 -23z" /> +<glyph unicode=" " horiz-adv-x="954" /> +<glyph unicode=" " horiz-adv-x="1909" /> +<glyph unicode=" " horiz-adv-x="954" /> +<glyph unicode=" " horiz-adv-x="1909" /> +<glyph unicode=" " horiz-adv-x="636" /> +<glyph unicode=" " horiz-adv-x="477" /> +<glyph unicode=" " horiz-adv-x="318" /> +<glyph unicode=" " horiz-adv-x="318" /> +<glyph unicode=" " horiz-adv-x="238" /> +<glyph unicode=" " horiz-adv-x="381" /> +<glyph unicode=" " horiz-adv-x="106" /> +<glyph unicode="‐" horiz-adv-x="724" d="M123 506l29 176h643l-29 -176h-643z" /> +<glyph unicode="‑" horiz-adv-x="724" d="M123 506l29 176h643l-29 -176h-643z" /> +<glyph unicode="‒" horiz-adv-x="724" d="M123 506l29 176h643l-29 -176h-643z" /> +<glyph unicode="–" horiz-adv-x="933" d="M123 500l29 178h968l-28 -178h-969z" /> +<glyph unicode="—" horiz-adv-x="1507" d="M123 504l29 178h1425l-29 -178h-1425z" /> +<glyph unicode="‘" horiz-adv-x="544" d="M330 1100l32 223q10 61 41 102t67 55.5t70.5 19.5t58.5 2l24 -3l-15 -84q-68 2 -80 -69l-8 -54h25q55 0 47 -53l-23 -139q-10 -59 -65 -60h-131q-55 1 -43 60z" /> +<glyph unicode="’" horiz-adv-x="544" d="M332 1042l14 86q66 -2 78 68l8 51h-24q-53 0 -46 58l23 137q8 61 64 61h133q55 0 43 -61l-35 -221q-28 -171 -197 -181z" /> +<glyph unicode="‚" horiz-adv-x="544" d="M131 -207l14 84q66 -2 78 70l8 51h-24q-53 0 -45 57l22 138q8 61 66 61h131q55 0 43 -61l-35 -222q-28 -171 -197 -181z" /> +<glyph unicode="“" horiz-adv-x="851" d="M315 1100l35 221q10 61 40 102t66 55.5t70.5 19.5t58.5 2l23 -3l-12 -82q-70 2 -82 -69l-6 -54h24q53 0 46 -55l-21 -137q-8 -59 -68 -60h-131q-51 1 -43 60zM653 1100l35 221q10 61 40 102t65.5 55.5t70.5 19.5t58 2l22 -3l-12 -82q-68 2 -80 -69l-8 -54h24q55 0 47 -55 l-20 -137q-8 -59 -68 -60h-131q-53 1 -43 60z" /> +<glyph unicode="”" horiz-adv-x="854" d="M317 1042l13 84q31 0 49 13.5t23.5 26t7.5 30.5l8 51h-25q-55 0 -47 58l23 137q8 61 65 61h131q57 0 45 -61l-37 -221q-10 -61 -39.5 -102.5t-65.5 -56.5t-71 -20.5t-57 -2.5zM653 1042l15 84q66 0 77 70l9 51h-25q-53 0 -45 58l23 137q10 61 65 61h131q55 0 43 -61 l-35 -221q-28 -171 -197 -181z" /> +<glyph unicode="„" horiz-adv-x="851" d="M117 -205l14 82q66 0 78 72l8 51h-24q-55 0 -48 57l25 138q10 59 63 59h132q55 0 45 -59l-35 -222q-28 -172 -197 -181zM453 -205l14 82q68 0 80 72l8 51h-25q-55 0 -47 57l23 138q10 59 65 59h131q55 0 46 -59l-37 -222q-27 -172 -197 -181z" /> +<glyph unicode="…" horiz-adv-x="1574" d="M291 47l20 135q10 51 60 51h127q51 0 41 -51l-21 -135q-8 -47 -57 -47h-127q-49 0 -43 47zM848 47l20 135q10 51 60 51h127q51 0 41 -51l-21 -135q-8 -47 -57 -47h-127q-49 0 -43 47zM1405 47l20 135q10 51 60 51h127q51 0 41 -51l-21 -135q-8 -47 -57 -47h-127 q-49 0 -43 47z" /> +<glyph unicode=" " horiz-adv-x="381" /> +<glyph unicode="‹" horiz-adv-x="608" d="M68 725l487 416l104 -123l-356 -305l256 -301l-127 -113z" /> +<glyph unicode="›" horiz-adv-x="735" d="M211 424l356 305l-256 301l129 111l363 -424l-488 -418z" /> +<glyph unicode=" " horiz-adv-x="477" /> +<glyph unicode="€" horiz-adv-x="1462" d="M135 520l17 107l178 16l30 188l-172 17l17 98l176 21q6 43 9 58t14.5 68.5t23.5 82t35.5 80t51.5 81t72 68.5t94 59.5t120.5 36t150.5 15.5t238 -20.5t264 -45.5l-22 -143q-322 29 -490 28q-86 0 -148.5 -21.5t-99.5 -51t-63.5 -84t-37.5 -97.5t-24 -114l478 -17 l-17 -106l-481 -13l-31 -188l475 -16l-16 -107q-31 0 -81 -2t-156.5 -5t-176 -5t-67.5 -4q-33 -195 37.5 -267.5t224.5 -72.5l506 37l-23 -140q-246 -74 -530 -73q-39 0 -76 4t-86 17.5t-86 36t-77 60t-58.5 93t-29.5 131.5t9 174z" /> +<glyph unicode="™" horiz-adv-x="1298" d="M90 1360l23 139h542l-22 -139h-197l-90 -576h-147l92 576h-201zM610 784l174 715h140l98 -471l221 471h158l-43 -715h-146l29 404l-186 -404h-123l-80 406l-94 -406h-148z" /> +<glyph unicode="" horiz-adv-x="1085" d="M0 1085h1085v-1085h-1085v1085z" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Medium-Italic-webfont.ttf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Medium-Italic-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ccfc2494a96f14cc1e0feb85f3b6812a49cb8569 Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Medium-Italic-webfont.ttf differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Medium-Italic-webfont.woff b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Medium-Italic-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..2bc36be136280b08404b0e1bbfcf59f2a6fd2898 Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Medium-Italic-webfont.woff differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Medium-webfont.eot b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Medium-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..1078ef77c53030f83ef0064490bd352b22e2ca2c Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Medium-webfont.eot differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Medium-webfont.svg b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Medium-webfont.svg new file mode 100644 index 0000000000000000000000000000000000000000..9a839accfa343dcdab8f61edb45af2c91bdc983d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Medium-webfont.svg @@ -0,0 +1,187 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Copyright c 2011 Natanael Gama exondiscoveredcom with Reserved Font Name Exo +Designer : Natanael Gama +</metadata> +<defs> +<font id="ExoMedium" horiz-adv-x="1161" > +<font-face units-per-em="2048" ascent="1638" descent="-410" /> +<missing-glyph horiz-adv-x="512" /> +<glyph unicode=" " horiz-adv-x="512" /> +<glyph unicode="	" horiz-adv-x="512" /> +<glyph unicode=" " horiz-adv-x="512" /> +<glyph unicode="!" horiz-adv-x="552" d="M160 47v135q0 51 49 51h131q47 0 47 -51v-135q0 -47 -47 -47h-131q-49 0 -49 47zM168 1497h211l-19 -1096h-176z" /> +<glyph unicode=""" horiz-adv-x="813" d="M162 1362v137h188v-137l-20 -275h-144zM465 1362v137h186v-137l-20 -275h-144z" /> +<glyph unicode="#" horiz-adv-x="1425" d="M39 463l18 131h324l49 313h-321l20 131h324l75 461h131l-75 -461h315l74 461h131l-74 -461h361l-23 -131h-360l-50 -315h361l-21 -131h-362l-76 -461h-131l76 461l-318 2l-75 -463h-131l75 463h-317zM512 594l315 -2l50 315h-316z" /> +<glyph unicode="$" horiz-adv-x="1173" d="M104 1008v133q2 203 105.5 284.5t286.5 85.5v177h135v-183q121 -8 383 -45v-147q-47 0 -163 5t-213 9t-106 4q-121 4 -180 -35t-59 -161v-119q0 -184 201 -185h245q330 0 330 -364v-129q0 -86 -25.5 -150.5t-66.5 -104.5t-99.5 -63.5t-119 -31.5t-127.5 -4v-168h-135v176 q-182 16 -344 45v143q23 0 112.5 -4t190 -7t184.5 -3q242 0 242 170v123q0 90 -35 137t-125 47h-246q-111 0 -188.5 34t-114.5 92t-52.5 115.5t-15.5 123.5z" /> +<glyph unicode="%" horiz-adv-x="1957" d="M80 975v266q0 135 59.5 196.5t208.5 61.5h207q145 0 203.5 -61.5t58.5 -196.5v-266q0 -137 -58.5 -198.5t-207.5 -61.5h-207q-145 0 -204.5 61.5t-59.5 198.5zM231 983q0 -68 26 -92.5t95 -24.5h191q80 0 101.5 23.5t21.5 93.5v248q0 70 -25 93.5t-94 23.5h-191 q-78 0 -101.5 -24t-23.5 -93v-248zM455 0l901 1499h162l-900 -1499h-163zM1143 264v266q0 135 58.5 196.5t207.5 61.5h207q145 0 204.5 -61t59.5 -197v-266q0 -135 -59.5 -197.5t-208.5 -62.5h-207q-145 0 -203.5 62.5t-58.5 197.5zM1294 272q0 -70 24.5 -93t94.5 -23h191 q80 0 102.5 24.5t22.5 91.5v248q0 70 -26 93.5t-95 23.5h-191q-78 0 -100.5 -23.5t-22.5 -93.5v-248z" /> +<glyph unicode="&" horiz-adv-x="1327" d="M68.5 477.5q25.5 157.5 162.5 274.5l166 141l-123 168q-78 113 -66.5 207t75 156.5t141.5 70.5q256 29 551 -41v-131h-393q-135 0 -164 -52t63 -186l443 -602l239 242l62 -70l-111 -219l-82 -92l250 -344h-221l-162 219l-145 -133q-78 -72 -190.5 -90.5t-226 26 t-183.5 146.5q-111 152 -85.5 309.5zM311 272q59 -78 152.5 -97t177.5 48l147 139l-288 386l-146 -123q-195 -160 -43 -353z" /> +<glyph unicode="'" horiz-adv-x="399" d="M104 1362v137h191v-137l-21 -275h-147z" /> +<glyph unicode="(" horiz-adv-x="708" d="M143 668q0 166 35 339t84 302t98.5 235.5t83.5 161.5l35 55h193q-14 -23 -37 -61.5t-81 -160.5t-103 -245t-82 -296t-37 -330q0 -491 260 -967q46 -83 80 -131h-193q-14 16 -36.5 49t-80 143.5t-102.5 229.5t-81 303.5t-36 372.5z" /> +<glyph unicode=")" horiz-adv-x="708" d="M39 -430q14 20 36.5 56t81 152t103.5 236.5t82 300t37 353.5q0 454 -267 964l-73 129h192q14 -20 37 -58t80.5 -157t102.5 -240.5t80.5 -296.5t35.5 -341q0 -188 -34.5 -370.5t-84 -308.5t-98.5 -224.5t-84 -146.5l-35 -48h-192z" /> +<glyph unicode="*" horiz-adv-x="892" d="M96 1159v90l285 58l10 -158zM229 850l50 276l153 -36l-119 -269zM354 1470l88 35l150 -245l-146 -64zM416 969l88 133l225 -187l-49 -71zM508 1169l246 158l45 -80l-189 -198z" /> +<glyph unicode="+" horiz-adv-x="1038" d="M94 641v176h336v338h176v-338h340v-176h-340v-338h-176v338h-336z" /> +<glyph unicode="," horiz-adv-x="546" d="M162 51v129q0 55 51 56h123q49 0 49 -56v-203q0 -57 -21.5 -94t-53 -49t-63.5 -16t-53 -1l-22 3v74q63 0 64 61v45h-23q-51 0 -51 51z" /> +<glyph unicode="-" horiz-adv-x="724" d="M41 506v176h643v-176h-643z" /> +<glyph unicode="." horiz-adv-x="550" d="M162 47v135q0 51 49 51h127q51 0 51 -51v-135q0 -47 -51 -47h-127q-49 0 -49 47z" /> +<glyph unicode="/" horiz-adv-x="849" d="M39 -147l575 1724h199l-575 -1724h-199z" /> +<glyph unicode="0" horiz-adv-x="1308" d="M133 340v815q0 166 100.5 255t260.5 89h335q180 0 263.5 -95t83.5 -245v-819q0 -340 -349 -340h-335q-160 0 -259.5 83t-99.5 257zM322 354q0 -92 54 -132t134 -40h299q178 0 178 170v795q0 170 -176 170h-303q-96 0 -141 -49t-45 -121v-793z" /> +<glyph unicode="1" horiz-adv-x="745" d="M76 1196v131l330 172h188v-1499h-188v1296z" /> +<glyph unicode="2" horiz-adv-x="1216" d="M76 1335v140q319 45 622 45q211 0 317.5 -128t106.5 -311q0 -109 -59 -231.5t-139 -221t-185.5 -197.5t-173 -152.5t-129.5 -96.5h686v-182h-1032v170q111 76 227.5 165t269 224t249 275.5t96.5 248.5q0 117 -63.5 184.5t-196.5 67.5h-596z" /> +<glyph unicode="3" horiz-adv-x="1210" d="M57 1321v125q84 31 197 44t222.5 14t236.5 -1q166 -2 260 -97t94 -247v-131q0 -227 -139 -283q139 -80 139 -299v-110q0 -350 -369 -350h-74h-80q-16 0 -71 1t-75.5 2t-66.5 4t-72 7t-62.5 10t-67.5 14.5t-59 18.5l2 127h585q106 0 163 34t57 142v107q0 190 -207 198 l-473 17v147l473 21q211 12 211 188v123q0 90 -60.5 132t-150.5 42h-613z" /> +<glyph unicode="4" horiz-adv-x="1243" d="M39 459l623 1040h217l-560 -942h525v404l71 153h117v-557h174v-147l-174 -41v-365h-188v365h-735z" /> +<glyph unicode="5" horiz-adv-x="1230" d="M145 41v143h611q94 0 134 52.5t40 125.5v201q0 35 -4 58.5t-18.5 55.5t-51.5 49t-96 17h-283q-66 0 -110.5 -35.5t-44.5 -109.5h-172l45 901h876v-182h-700l-23 -453q43 47 150 58q57 8 284 0q174 -2 255 -95.5t81 -253.5v-227q0 -100 -33.5 -173t-89 -110.5t-111 -54 t-112.5 -16.5q-207 0 -319.5 8t-307.5 41z" /> +<glyph unicode="6" horiz-adv-x="1267" d="M125 786q0 195 29.5 340.5t82 225.5t113 117.5t127.5 39.5q305 8 627 -39v-141h-569q-66 0 -112 -50t-68.5 -132t-32 -154.5t-9.5 -148.5q291 41 504 41q195 0 265.5 -84t70.5 -232v-258q0 -313 -338 -313h-303q-72 0 -127 20.5t-105.5 72.5t-83 139t-52 227.5 t-19.5 328.5zM313 707q0 -76 2 -132.5t15.5 -136.5t35 -131t65.5 -89t106 -38h264q84 0 125 31t41 125v223q0 147 -164 148h-490z" /> +<glyph unicode="7" horiz-adv-x="1122" d="M57 1317v182h947l61 -106l-530 -1393h-218l510 1317h-770z" /> +<glyph unicode="8" horiz-adv-x="1292" d="M143 324v186q0 170 170 223q-170 63 -170 289v133q0 195 96.5 274.5t270.5 79.5h303q170 0 254 -84t84 -270v-127q0 -27 -4 -54.5t-17.5 -69.5t-47 -72.5t-85.5 -40.5q78 -14 116 -101.5t38 -171.5v-192q0 -80 -22.5 -140.5t-56.5 -94.5t-82 -55.5t-90 -28.5t-89 -7h-301 q-102 0 -175 26.5t-109 59.5t-56 85t-23.5 83t-3.5 70zM332 328q0 -147 192 -148h269q72 0 121 38t49 110v194q0 76 -47.5 116t-116.5 40h-295q-172 0 -172 -156v-194zM332 1012q0 -86 52 -123t120 -37h293q166 0 166 160v127q0 104 -42 148t-126 44h-271q-102 0 -147 -37 t-45 -155v-127z" /> +<glyph unicode="9" horiz-adv-x="1267" d="M115 940v256q0 313 340 313h301q92 0 157.5 -33.5t121 -117.5t83 -243t27.5 -394q0 -375 -102.5 -547t-249.5 -176q-399 -8 -629 39v141h571q66 0 112 50.5t67.5 133t30.5 153.5t11 151q-281 -43 -505 -43q-193 0 -264.5 85t-71.5 232zM301 948q0 -147 166 -147h489 q0 96 -6 168.5t-25.5 164t-68.5 142.5t-123 51h-266q-84 0 -125 -30.5t-41 -125.5v-223z" /> +<glyph unicode=":" horiz-adv-x="550" d="M162 47v135q0 51 49 51h127q51 0 51 -51v-135q0 -47 -51 -47h-127q-49 0 -49 47zM162 903v135q0 51 49 52h127q51 0 51 -52v-135q0 -47 -51 -47h-127q-49 0 -49 47z" /> +<glyph unicode=";" horiz-adv-x="555" d="M162 51v129q0 23 14 39.5t37 16.5h123q49 0 49 -56v-203q0 -57 -21.5 -94t-53 -49t-63.5 -16t-53 -1l-22 3v74q63 0 64 61v45h-23q-20 0 -35.5 15.5t-15.5 35.5zM166 905v135q0 51 49 52h127q51 0 51 -52v-135q0 -47 -51 -47h-127q-49 0 -49 47z" /> +<glyph unicode="<" horiz-adv-x="958" d="M96 629v190l768 324v-193l-538 -225l538 -246v-196z" /> +<glyph unicode="=" horiz-adv-x="956" d="M41 418v176h874v-176h-874zM41 850v176h874v-176h-874z" /> +<glyph unicode=">" horiz-adv-x="958" d="M96 283v196l537 246l-537 225v193l768 -324v-190z" /> +<glyph unicode="?" horiz-adv-x="1107" d="M39 1329v141q12 2 71.5 10.5t73 10.5t63.5 8t70.5 7t64.5 5.5t74 4.5h74q43 0 86 -3q217 0 316.5 -108.5t99.5 -276.5v-190q0 -201 -132 -285t-355 -53v-201h-176v351h276q84 4 142.5 50t58.5 138v180q0 113 -62.5 162t-201.5 49h-543zM344 47v135q0 51 49 51h129 q49 0 49 -51v-135q0 -47 -49 -47h-129q-49 0 -49 47z" /> +<glyph unicode="@" horiz-adv-x="1740" d="M125 6v688q0 41 4 77t25.5 90t58.5 92t108.5 67t167.5 29h429q63 0 116 -13.5t102.5 -44t78 -91t28.5 -146.5v-754h-133l-33 127l-19 -15q-19 -15 -53 -36t-75 -42.5t-96.5 -36.5t-108.5 -15q-115 -2 -188.5 69.5t-73.5 177.5v103q0 129 71.5 202.5t202.5 73.5h336 q2 137 0 137q0 78 -38 105t-122 27h-424q-90 0 -141 -37t-51 -148v-680q0 -213 192 -213h707q121 0 166 51.5t45 161.5v1018q0 115 -57.5 175.5t-153.5 60.5h-827v116q279 57 598 56h229q174 -2 278.5 -103.5t104.5 -304.5v-1018q0 -389 -381 -389h-709q-168 0 -266 97.5 t-98 285.5zM639 250q0 -35 36 -65.5t83 -28.5q123 -2 315 102v229l-319 -30q-115 -12 -115 -125v-82z" /> +<glyph unicode="A" horiz-adv-x="1384" d="M86 0l539 1499h198l516 -1499h-215l-123 395h-567l-129 -395h-219zM494 573h450l-221 656z" /> +<glyph unicode="B" horiz-adv-x="1224" d="M154 0v1499h587q109 0 190 -34.5t125 -94t64.5 -125t20.5 -139.5q0 -274 -195 -328q84 -16 145.5 -108t61.5 -246q0 -424 -410 -424h-589zM344 180h395q225 0 226 250q0 115 -56.5 190.5t-169.5 75.5h-395v-516zM344 872h393q215 0 215 228q0 219 -215 219h-393v-447z " /> +<glyph unicode="C" horiz-adv-x="1179" d="M104 754q0 389 107.5 575.5t396.5 186.5q254 0 506 -56v-149l-17 1q-17 1 -47 3t-68 5t-84 5t-91 4t-93 3t-87 1q-129 0 -197 -45t-102.5 -171t-34.5 -367q0 -276 74.5 -428t259.5 -152l487 14v-147q-225 -49 -506 -49q-504 0 -504 766z" /> +<glyph unicode="D" horiz-adv-x="1347" d="M154 0v1499h577q131 0 229.5 -48t153.5 -123t90 -179.5t46.5 -200.5t11.5 -205q0 -143 -30 -271t-90.5 -236.5t-166 -172t-244.5 -63.5h-577zM342 184h383q176 0 262 156t86 405q0 307 -88 440.5t-260 133.5h-383v-1135z" /> +<glyph unicode="E" d="M152 264v957q0 152 78 218q72 60 178 60h20q614 -29 651 -33v-151h-633q-49 0 -74.5 -19.5t-28.5 -39t-3 -56.5v-360l653 -21v-153l-653 -21v-360q0 -51 22.5 -76t43 -28t61.5 -3h612v-149l-630 -35q-18 -1 -36 -1q-261 0 -261 271z" /> +<glyph unicode="F" d="M152 0v1219q0 150 78 217q74 63 185 63h13q614 -29 651 -33v-151h-633q-49 0 -74.5 -19.5t-28.5 -39t-3 -56.5v-360l653 -21v-153l-653 -21v-645h-188z" /> +<glyph unicode="G" horiz-adv-x="1257" d="M104 758q0 135 11.5 239.5t42 206t83 167t140.5 105.5t207 40q248 0 534 -58v-149q-2 0 -36.5 3t-90 7t-119 7t-137 6t-133.5 3q-186 0 -249.5 -132t-63.5 -449q0 -328 67.5 -454t247.5 -128h6q147 0 351 94v371h-308v125q168 49 357 49q90 0 139 -4v-807h-139l-45 100 q-174 -109 -377 -110h-12q-115 0 -201 37q-90 39 -142.5 103.5t-83 170t-40 210t-9.5 247.5z" /> +<glyph unicode="H" horiz-adv-x="1304" d="M154 0v1499h188v-684h662v684h188v-1499h-188v635h-662v-635h-188z" /> +<glyph unicode="I" horiz-adv-x="454" d="M154 0v1499h188v-1499h-188z" /> +<glyph unicode="J" horiz-adv-x="733" d="M68 45l6 141q45 -8 56 -11t53 -9t56.5 -5t48.5 2t48 11t36.5 25.5t32 39t17.5 57.5t8 77v1126h188v-1161q0 -233 -106 -301q-77 -48 -207 -48h-15q-140 3 -222 56z" /> +<glyph unicode="K" horiz-adv-x="1230" d="M154 0v1499h184v-659h156l446 659h225l-501 -747l501 -752h-225l-446 659h-154v-659h-186z" /> +<glyph unicode="L" horiz-adv-x="1130" d="M154 266v1233h188v-1210q0 -39 10 -62.5t33 -32t38 -10.5t46 -2h596v-182h-625q-129 0 -207.5 55t-78.5 211z" /> +<glyph unicode="M" horiz-adv-x="1665" d="M104 0l109 1499h260l358 -1186l351 1186h258l121 -1499h-187l-94 1163l-346 -1163h-201l-356 1163l-84 -1163h-189z" /> +<glyph unicode="N" horiz-adv-x="1390" d="M154 0v1499h192l744 -1149v1149h188v-1499h-188l-746 1147v-1147h-190z" /> +<glyph unicode="O" horiz-adv-x="1380" d="M125 739q0 172 18.5 301t58.5 212t87 135.5t119.5 79t140 34.5t164.5 8q121 0 198.5 -12t157.5 -56t125 -126t73.5 -225.5t28.5 -350.5q0 -195 -26.5 -332t-71.5 -217.5t-123 -125t-158.5 -58.5t-203.5 -14q-102 0 -172 8t-143.5 33.5t-119 77t-83 132.5t-54 204.5 t-16.5 291.5zM313 739q0 -150 13.5 -249t39 -163.5t76 -96t111.5 -44t160 -12.5q158 0 237.5 41t118.5 162t39 362q0 123 -9 213t-22.5 153.5t-42 105.5t-54.5 65.5t-75 35t-87 13.5t-105 2q-59 0 -92 -2t-79 -9t-71 -23.5t-55.5 -44t-46 -70.5t-29.5 -103.5t-20.5 -145 t-6.5 -190.5z" /> +<glyph unicode="P" horiz-adv-x="1200" d="M119 0v1499h622q375 0 375 -442q0 -125 -24.5 -215t-60.5 -137.5t-91 -74t-98 -31.5t-101 -5q-57 2 -241.5 19.5t-192.5 21.5v-635h-188zM307 774h428q92 0 141.5 56.5t49.5 226.5q-2 86 -20.5 143t-50.5 81t-58.5 31t-61.5 7h-428v-545z" /> +<glyph unicode="Q" horiz-adv-x="1380" d="M125 739q0 172 17.5 300t56.5 212t85 136.5t118.5 79t140 34.5t166.5 8q121 0 198.5 -12t158.5 -56t127 -126t74.5 -225.5t28.5 -350.5q0 -195 -26.5 -332t-72.5 -217.5t-124 -125t-160 -58.5t-204 -14q-102 0 -172 8t-142.5 33.5t-117 76t-82 132.5t-54 205.5 t-16.5 291.5zM313 739q0 -152 12.5 -249t38 -162.5t75.5 -97t110.5 -44t159.5 -12.5q158 0 238.5 41t120.5 163t40 361q0 123 -9 214t-22.5 153.5t-43 104.5t-55.5 65.5t-76 35t-88 13.5t-105.5 2t-104.5 -2t-86 -13.5t-74.5 -35t-55.5 -64.5t-43 -104.5t-22.5 -154.5 t-9.5 -214zM639 -68h123q81 -72 192 -72q68 0 148 27v-182q-47 -20 -105 -20q-15 0 -31 1q-77 7 -145.5 29.5t-120 79.5t-61.5 137z" /> +<glyph unicode="R" horiz-adv-x="1220" d="M119 0v1499h643q362 0 362 -455q0 -109 -21.5 -191.5t-47 -123.5t-69.5 -70.5t-63.5 -35t-52.5 -13.5l308 -610h-207l-297 600l-367 29v-629h-188zM307 788h447q45 0 70.5 6.5t54 29t42 77.5t13.5 143q0 164 -49 219.5t-131 55.5h-447v-531z" /> +<glyph unicode="S" horiz-adv-x="1198" d="M125 1008v133q0 207 106.5 288.5t298.5 81.5h18q92 0 252 -17q178 -19 261 -34v-151q-328 20 -510 20q-17 1 -33 1q-96 0 -146 -32q-58 -36 -59 -163v-119q0 -117 45 -151t150 -34h276q330 0 330 -364v-129q0 -109 -35 -183.5t-98 -109.5t-129 -48t-152 -13 q-106 0 -276 17t-254 36v151q216 -22 490 -22h24q45 0 77 4t75 18.5t66.5 52.5t23.5 95v123q0 90 -35 137t-125 47h-270q-96 0 -168 23.5t-110 57.5t-59.5 86t-27.5 96.5t-6 101.5z" /> +<glyph unicode="T" horiz-adv-x="1191" d="M84 1317v182h1059v-182h-441v-1317h-188v1317h-430z" /> +<glyph unicode="U" horiz-adv-x="1378" d="M154 655v844h188v-844q0 -88 6 -157.5t20.5 -119.5t29 -85t44 -57.5t52 -36t65.5 -19.5t71.5 -7t84.5 -1q59 0 96 4t84 18.5t75.5 46t54.5 84t38 135.5t12 195v844h191v-844q0 -190 -37 -322t-83 -197.5t-133 -100.5t-142.5 -40t-155.5 -5h-19q-91 0 -137.5 3 t-122.5 20.5t-115.5 59.5t-83.5 112.5t-63.5 189t-19.5 280.5z" /> +<glyph unicode="V" horiz-adv-x="1380" d="M86 1499h203l411 -1220l430 1220h203l-534 -1499h-201z" /> +<glyph unicode="W" horiz-adv-x="1986" d="M86 1499h203l409 -1202l342 1202h209l-129 -455l262 -757l355 1212h202l-452 -1499h-201l-260 725l-227 -725h-201z" /> +<glyph unicode="X" horiz-adv-x="1245" d="M86 1499h207l346 -596l352 596h207l-444 -741l434 -758h-207l-342 596l-340 -596h-207l432 758z" /> +<glyph unicode="Y" horiz-adv-x="1304" d="M86 1499h205l362 -768l400 768h204l-512 -985v-514h-188v514z" /> +<glyph unicode="Z" horiz-adv-x="1148" d="M68 0v182l776 1135h-776v182h1015v-182l-768 -1135h768v-182h-1015z" /> +<glyph unicode="[" horiz-adv-x="663" d="M162 -61v1425q0 61 12 117.5t41 115t91.5 93t152.5 34.5h168v-176h-150q-59 0 -93 -51t-34 -143v-1413q0 -92 34 -143.5t93 -51.5h150v-176h-168q-92 0 -155.5 37t-92.5 98.5t-39 117t-10 116.5z" /> +<glyph unicode="\" horiz-adv-x="849" d="M39 1577h199l575 -1724h-199z" /> +<glyph unicode="]" horiz-adv-x="663" d="M39 -254h147q59 0 93 51t34 144v1413q0 92 -33.5 143t-93.5 51h-147v176h166q90 0 152.5 -34.5t92 -93t41 -114t11.5 -118.5v-1425q0 -61 -10.5 -116.5t-39 -117t-92 -98.5t-155.5 -37h-166v176z" /> +<glyph unicode="^" horiz-adv-x="796" d="M96 1087l234 269h164l208 -269h-157l-137 140l-152 -140h-160z" /> +<glyph unicode="_" horiz-adv-x="1380" d="M41 -2v176h1298v-176h-1298z" /> +<glyph unicode="`" horiz-adv-x="495" d="M39 1364h209l211 -277h-154z" /> +<glyph unicode="a" horiz-adv-x="1062" d="M76 264v119q0 125 74.5 202t209.5 77q209 -1 313.5 -1t104.5 1q1 58 1 88t-1 30q0 88 -41 123t-121 35q-195 0 -505 -23v129q203 59 522 64h7q145 0 235 -78q92 -80 92 -248v-782h-144l-45 127q-8 -8 -69.5 -39t-166 -65.5t-184.5 -34.5q-125 2 -203.5 77.5t-78.5 198.5z M264 283q0 -123 117 -123q151 0 397 100v266l-401 -28q-113 -10 -113 -127v-88z" /> +<glyph unicode="b" horiz-adv-x="1134" d="M115 0v1608h184v-584q86 37 197.5 58.5t187.5 21.5q111 0 184.5 -45t109.5 -130t49 -175t13 -215q0 -551 -356 -551q-94 0 -213 45t-170 86l-43 -119h-143zM301 252q201 -88 363 -88q188 0 188 377q0 227 -46 309t-142 82q-186 0 -363 -49v-631z" /> +<glyph unicode="c" horiz-adv-x="1019" d="M96 545q0 170 25.5 282.5t77 170t111 79t145.5 21.5q236 0 475 -58v-127q-260 12 -443 13q-55 0 -85.5 -9.5t-61.5 -46t-43 -117.5t-12 -216q0 -221 44 -297t158 -76q84 0 198 5t186 10l73 5v-133q-170 -57 -489 -61q-84 0 -143.5 21.5t-110.5 78.5t-78 171t-27 284z" /> +<glyph unicode="d" horiz-adv-x="1134" d="M96 539q0 98 7.5 173.5t30 152.5t60 126t103 81t156.5 32q190 0 383 -80v584h186v-1608h-143l-43 119q-51 -41 -170 -86t-213 -45q-357 0 -357 551zM285 541q0 -377 188 -377q162 0 363 88v631q-176 49 -363 49q-96 0 -142 -82t-46 -309z" /> +<glyph unicode="e" horiz-adv-x="1075" d="M96 549q0 180 24.5 288.5t88 166t143.5 75t219 17.5q94 0 150.5 -5.5t116 -27t91.5 -62t51 -113.5t19 -179q0 -258 -286 -258h-428q0 -176 45 -232.5t168 -56.5q340 0 481 22v-137q-190 -57 -524 -57q-205 0 -282 122t-77 437zM285 616h407q119 0 119 95q0 143 -41 179 t-192 36q-96 0 -138.5 -5.5t-85.5 -35t-56 -93t-13 -176.5z" /> +<glyph unicode="f" horiz-adv-x="821" d="M39 918v135l190 34v203q0 59 8.5 106.5t34 100.5t84 83t144.5 30q139 0 282 -49v-119l-235 2q-45 0 -73 -10.5t-39 -38t-14 -52t-3 -71.5v-185h287v-169h-287v-918h-189v918h-190z" /> +<glyph unicode="g" horiz-adv-x="1136" d="M90 -74l84 125q-82 55 -82 178q0 59 31 110.5t90 66.5q-119 76 -119 299q0 193 94.5 290t266.5 97h645v-129l-154 -37q0 -2 13.5 -25.5t17.5 -35t12 -38t11.5 -58.5t3.5 -73q0 -45 -7.5 -92t-30 -102.5t-59.5 -97.5t-101.5 -70.5t-148.5 -28.5h-301q-84 0 -84 -57 q0 -66 84 -66h408q131 0 205.5 -77.5t74.5 -215.5v-127q0 -57 -12 -106t-44 -99.5t-99.5 -80t-161.5 -29.5h-307q-150 0 -240 80t-90 235v164zM279 23v-250q0 -66 27.5 -102t59 -44t76.5 -8h269q82 0 113.5 39t31.5 113v108q0 70 -26.5 99.5t-104.5 29.5h-356zM283 705 q0 -225 174 -226h176q102 0 144 69q38 62 38 142v15q-4 111 -43 162t-141 51h-164q-184 0 -184 -213z" /> +<glyph unicode="h" horiz-adv-x="1116" d="M115 0v1606h188v-643q82 51 119 72.5t113.5 46t154.5 24.5q160 0 246 -103.5t86 -252.5v-750h-188v750q0 92 -45.5 138t-120.5 46q-104 0 -174 -23.5t-191 -87.5v-823h-188z" /> +<glyph unicode="i" horiz-adv-x="419" d="M96 1260v129q0 53 49 53h134q47 0 47 -53v-129q0 -47 -47 -48h-134q-49 1 -49 48zM113 0v1087h188v-1087h-188z" /> +<glyph unicode="j" horiz-adv-x="458" d="M115 1260v129q0 53 49 53h133q47 0 47 -53v-129q0 -47 -47 -48h-133q-49 1 -49 48zM135 -553v1640h189v-1095v-42q0 -331 -60 -503h-129z" /> +<glyph unicode="k" horiz-adv-x="1054" d="M115 0v1602h188v-895h76l387 380h252l-463 -464l463 -623h-230l-409 537h-76v-537h-188z" /> +<glyph unicode="l" horiz-adv-x="620" d="M115 387v1217h188v-1205q0 -119 27.5 -166t83.5 -63q156 -43 170 -43v-127h-195q-274 0 -274 387z" /> +<glyph unicode="m" horiz-adv-x="1824" d="M115 0v1087h141l47 -126q8 6 33.5 21t35 20.5t33 19.5t35 19.5t34 15.5t36.5 14t36.5 11.5t41 10.5t42 5t48.5 2q100 0 180 -41t115 -113q190 154 426 154q152 0 242 -98.5t90 -260.5v-741h-189v743q0 84 -46 134.5t-120 50.5q-211 0 -364 -107v-76v-745h-189v743 q0 84 -47 134.5t-121 50.5q-100 0 -165.5 -22.5t-186.5 -86.5v-819h-188z" /> +<glyph unicode="n" horiz-adv-x="1116" d="M115 0v1087h141l47 -124q157 97 233 120q74 23 154 23q160 0 246 -103.5t86 -252.5v-750h-188v750q0 92 -46.5 138t-119.5 46q-104 0 -174 -23.5t-191 -87.5v-823h-188z" /> +<glyph unicode="o" horiz-adv-x="1157" d="M96 528q0 330 104.5 450t379.5 120q276 0 379.5 -123t103.5 -447q0 -305 -103.5 -421.5t-379.5 -116.5q-272 0 -378 120.5t-106 417.5zM285 528q0 -125 16 -199.5t59 -110.5t89.5 -45t130.5 -9q88 0 134 9t88 46t57 110.5t15 198.5q0 137 -13 216t-53 120t-88 51.5 t-140 10.5q-90 0 -137.5 -10.5t-88.5 -50.5t-55 -120t-14 -217z" /> +<glyph unicode="p" horiz-adv-x="1134" d="M115 -553v1640h143l43 -116q51 39 170 84t213 45q356 0 356 -551q0 -96 -7 -171t-29.5 -151.5t-60.5 -128t-104.5 -83t-154.5 -31.5q-74 0 -185.5 21.5t-199.5 55.5v-614h-184zM301 205q174 -49 363 -49q96 0 142 81.5t46 307.5q0 379 -188 379q-166 0 -363 -88v-631z " /> +<glyph unicode="q" horiz-adv-x="1136" d="M96 549q0 268 96.5 409.5t286.5 141.5q193 0 543 -51v-1602h-188v612q-176 -79 -351 -79h-4q-115 0 -191.5 40.5t-117.5 120.5t-57.5 176.5t-16.5 231.5zM285 470q0 -21 4 -77.5t11 -79t21.5 -61.5t37 -55.5t56.5 -30.5t79 -14q164 0 340 49v729h-340q-72 0 -118 -38 t-63.5 -106.5t-22.5 -116.5t-5 -118v-81z" /> +<glyph unicode="r" horiz-adv-x="866" d="M115 0v1087h143l45 -137q82 53 118 75t112.5 48.5t150.5 26.5q109 0 143 -17v-184q-45 10 -153.5 10t-186 -26.5t-184.5 -91.5v-791h-188z" /> +<glyph unicode="s" horiz-adv-x="1036" d="M76 727v94q0 133 65.5 205t216.5 72q111 0 293.5 -12.5t253.5 -26.5v-135h-522q-41 0 -66.5 -7.5t-36 -23.5t-13.5 -31.5t-3 -44.5v-82q0 -49 17.5 -72.5t38 -27.5t63.5 -4h305q135 0 204 -74t69 -197v-102q0 -268 -267 -268q-104 0 -311 15t-262 30v131h549 q102 0 102 98v86q0 53 -21.5 78t-80.5 25h-305q-150 0 -219.5 60t-69.5 214z" /> +<glyph unicode="t" horiz-adv-x="776" d="M39 920v127l194 43l41 303h148v-303h297v-170h-297v-519q0 -121 27.5 -168t82.5 -61q156 -43 170 -43v-127h-198q-270 0 -271 387v531h-194z" /> +<glyph unicode="u" horiz-adv-x="1116" d="M96 340v747h189v-749q0 -92 45 -137t121 -45q104 0 173.5 23.5t190.5 86.5v821h189v-1087h-142l-47 123q-10 -6 -49 -28.5t-53.5 -31t-47 -26t-54 -23.5t-53.5 -16t-63.5 -13t-66.5 -3q-162 0 -247 103t-85 255z" /> +<glyph unicode="v" horiz-adv-x="1112" d="M39 1087h203l313 -833l317 833h203l-424 -1087h-198z" /> +<glyph unicode="w" horiz-adv-x="1652" d="M39 1087h203l295 -833l258 833h196l-100 -333l221 -500l301 833h203l-397 -1087h-199l-219 496l-164 -496h-207z" /> +<glyph unicode="x" horiz-adv-x="1099" d="M45 0l389 545l-389 542h234l268 -393l276 393h232l-393 -548l376 -539h-215l-272 389l-272 -389h-234z" /> +<glyph unicode="y" horiz-adv-x="1146" d="M41 1087h203l241 -825q6 -18 13.5 -31.5t16.5 -22.5t18.5 -15.5t18.5 -9.5t18.5 -4t16.5 -1t13 1t10 2l4 1l287 905h205l-453 -1431l-151 -209h-125l182 553q-195 0 -266 240z" /> +<glyph unicode="z" horiz-adv-x="942" d="M57 911v176h830v-176l-551 -733h551v-176h-799v176l563 733h-594z" /> +<glyph unicode="{" horiz-adv-x="655" d="M39 604v158q111 10 143 36q31 25 31 72v473q0 166 102.5 273.5t302.5 107.5v-176q-102 0 -159.5 -50t-57.5 -179v-453q0 -78 -49 -124t-131 -58q80 -12 129 -60.5t49 -115.5v-565q0 -98 58.5 -151.5t160.5 -49.5v-172q-217 0 -312 101.5t-95 250.5v574q0 59 -52 86.5 t-120 21.5z" /> +<glyph unicode="|" horiz-adv-x="501" d="M164 -147v1724h176v-1724h-176z" /> +<glyph unicode="}" horiz-adv-x="655" d="M39 -258q100 -4 158.5 49t58.5 152v565q0 68 50 116t128 60q-82 12 -131 59.5t-49 122.5v453q0 129 -56.5 179t-158.5 50v176q199 0 301 -107.5t102 -273.5v-473q0 -94 163 -107q10 -1 13 -1v-158q-70 6 -122 -21.5t-52 -86.5v-574q0 -70 -20.5 -129t-64.5 -111.5 t-125.5 -82t-194.5 -29.5v172z" /> +<glyph unicode="~" horiz-adv-x="884" d="M96 1180q12 10 42 38.5t45.5 41t42 30t53 24.5t59.5 7q47 0 112.5 -36t104.5 -36q18 0 38.5 4t34 9.5t33 15.5t28.5 16t29.5 19.5t26.5 17.5l46 -96q-6 -6 -28 -28.5t-33 -34t-34.5 -31t-42 -28.5t-45 -17.5t-51.5 -8.5q-47 0 -116.5 36t-108.5 36q-37 0 -65.5 -10 t-65.5 -30.5t-60 -31.5z" /> +<glyph unicode="¢" horiz-adv-x="1001" d="M76 545q0 174 26.5 288.5t81 173t120 79t159.5 16.5v196h137v-206q176 -20 311 -52v-127q-260 14 -442 15q-55 0 -87 -10.5t-62.5 -47t-43 -117.5t-12.5 -216q0 -221 45 -299t160 -78q84 0 197.5 5t186.5 10l73 5v-131q-143 -51 -326 -57v-189h-139v183 q-94 0 -157.5 19.5t-119 76.5t-82 172t-26.5 291z" /> +<glyph unicode="£" horiz-adv-x="1212" d="M96 0v147l144 35v486h-144v106l144 37v211q0 129 24.5 219t62.5 140.5t105.5 77t130 33.5t160.5 7q51 0 150.5 -8t172.5 -16l72 -9v-147h-395q-68 0 -102.5 -2t-74.5 -11.5t-57.5 -26.5t-34 -50t-21.5 -81t-5 -120v-217l528 -33v-110h-528v-486h688v-182h-1020z" /> +<glyph unicode="¥" horiz-adv-x="1247" d="M39 1499h205l362 -688l393 688h211l-489 -831h330v-136h-353v-94h353v-133h-353v-305h-188v305h-334v133h334v94h-334v136h313z" /> +<glyph unicode="¨" horiz-adv-x="927" d="M96 1192q0 45 32 75.5t77 30.5t75.5 -30.5t30.5 -75.5t-30.5 -77t-75.5 -32t-77 32t-32 77zM618 1192q0 45 32 75.5t77 30.5t76 -30.5t31 -75.5t-31 -77t-76 -32t-77 32t-32 77z" /> +<glyph unicode="©" horiz-adv-x="1654" d="M104 754q0 745 482 745h530q84 0 151.5 -27.5t111.5 -70.5t77 -107.5t50.5 -127t27.5 -142.5t13 -139.5t3 -130.5q0 -336 -107.5 -545t-326.5 -209h-530q-135 0 -234.5 73.5t-149.5 192.5t-74 241t-24 247zM252 754q0 -158 33.5 -291t111.5 -226.5t189 -93.5h528 q129 2 209 156t80 455q0 90 -4 158.5t-20.5 157.5t-45 146.5t-84 98.5t-133.5 41h-530q-74 0 -130.5 -26.5t-104.5 -90t-73.5 -186.5t-25.5 -299zM469 748q0 446 295 446q137 0 366 -49v-119q-172 25 -354 25q-162 0 -162 -310q0 -143 36 -220t128 -77q135 0 365 33v-119 q-186 -57 -377 -57q-137 0 -217 97.5t-80 349.5z" /> +<glyph unicode="«" horiz-adv-x="1140" d="M96 725l422 416l119 -119l-303 -297l313 -305l-119 -121zM496 725l422 416l120 -119l-305 -297l314 -305l-119 -121z" /> +<glyph unicode="­" horiz-adv-x="724" d="M41 506v176h643v-176h-643z" /> +<glyph unicode="®" horiz-adv-x="1654" d="M104 754q0 745 482 745h530q84 0 151.5 -27.5t111.5 -70.5t77 -107.5t50.5 -127t27.5 -142.5t13 -139.5t3 -130.5q0 -336 -107.5 -545t-326.5 -209h-530q-135 0 -234.5 73.5t-149.5 192.5t-74 241t-24 247zM252 754q0 -158 33.5 -291t111.5 -226.5t189 -93.5h528 q129 2 209 156t80 455q0 90 -4 158.5t-20.5 157.5t-45 146.5t-84 98.5t-133.5 41h-530q-74 0 -130.5 -26.5t-104.5 -90t-73.5 -186.5t-25.5 -299zM526 313v875h367q274 0 274 -266q0 -80 -17 -133.5t-51 -80t-56.5 -35.5t-61.5 -18l184 -342h-164l-182 342l-145 25v-367 h-148zM674 782h219q80 0 103.5 27t23.5 113q0 43 -10.5 69.5t-32 36.5t-38.5 13t-46 3h-219v-262z" /> +<glyph unicode="´" horiz-adv-x="495" d="M39 1087l209 277h211l-266 -277h-154z" /> +<glyph unicode="¸" horiz-adv-x="509" d="M96 -268l103 30q66 29 65 162h152q0 -160 -44 -220t-169 -60h-107v88z" /> +<glyph unicode="»" horiz-adv-x="1140" d="M96 420l312 305l-304 297l121 119l422 -416l-432 -426zM496 420l311 305l-303 297l121 119l422 -416l-433 -426z" /> +<glyph unicode="À" horiz-adv-x="1384" d="M86 0l539 1499h198l516 -1499h-215l-123 395h-567l-129 -395h-219zM381 1909h211l209 -277h-154zM494 573h450l-221 656z" /> +<glyph unicode="Â" horiz-adv-x="1384" d="M86 0l539 1499h198l516 -1499h-215l-123 395h-567l-129 -395h-219zM420 1632l235 269h164l209 -269h-158l-139 140l-151 -140h-160zM494 573h450l-221 656z" /> +<glyph unicode="Æ" horiz-adv-x="1904" d="M57 0l602 1221q43 86 92.5 144t97.5 84t102.5 39t106.5 11t109 0q614 -29 652 -33v-153h-633q-37 0 -58.5 -8.5t-29.5 -26.5t-10.5 -31.5t-4.5 -42.5v-375l650 -20v-152l-650 -20v-356q0 -18 2 -33t8.5 -24t9.5 -17t14 -12.5t15.5 -7.5t18.5 -4t19 -1h21h19l607 -2v-155 l-625 -35q-297 -18 -297 258v198h-412l-219 -446h-207zM571 627h324v655z" /> +<glyph unicode="Ç" horiz-adv-x="1179" d="M104 754q0 389 107.5 575.5t396.5 186.5q254 0 506 -56v-149l-17 1q-17 1 -47 3t-68 5t-84 5t-91 4t-93 3t-87 1q-129 0 -197 -45t-102.5 -171t-34.5 -367q0 -276 74.5 -428t259.5 -152l487 14v-147q-225 -49 -506 -49q-504 0 -504 766zM389 -266l103 30q66 29 65 162 h152q0 -160 -45.5 -221t-167.5 -61h-107v90z" /> +<glyph unicode="È" d="M152 264v957q0 152 78.5 218t197.5 60q614 -29 651 -33v-151h-633q-49 0 -74.5 -19.5t-28.5 -39t-3 -56.5v-360l653 -21v-153l-653 -21v-360q0 -51 22.5 -76t43 -28t61.5 -3h612v-149l-630 -35q-297 -19 -297 270zM354 1898h209l211 -274h-153z" /> +<glyph unicode="É" d="M152 264v957q0 152 78.5 218t197.5 60q614 -29 651 -33v-151h-633q-49 0 -74.5 -19.5t-28.5 -39t-3 -56.5v-360l653 -21v-153l-653 -21v-360q0 -51 22.5 -76t43 -28t61.5 -3h612v-149l-630 -35q-297 -19 -297 270zM582 1624l209 274h210l-266 -274h-153z" /> +<glyph unicode="Ê" d="M152 264v957q0 152 78.5 218t197.5 60q614 -29 651 -33v-151h-633q-49 0 -74.5 -19.5t-28.5 -39t-3 -56.5v-360l653 -21v-153l-653 -21v-360q0 -51 22.5 -76t43 -28t61.5 -3h612v-149l-630 -35q-297 -19 -297 270zM344 1632l236 269h163l209 -269h-157l-140 140 l-151 -140h-160z" /> +<glyph unicode="Ë" d="M152 264v957q0 152 78.5 218t197.5 60q614 -29 651 -33v-151h-633q-49 0 -74.5 -19.5t-28.5 -39t-3 -56.5v-360l653 -21v-153l-653 -21v-360q0 -51 22.5 -76t43 -28t61.5 -3h612v-149l-630 -35q-297 -19 -297 270zM279 1733q0 45 31.5 75.5t76.5 30.5t76 -30.5t31 -75.5 t-31 -77t-76 -32t-76.5 32t-31.5 77zM801 1733q0 45 31.5 75.5t76.5 30.5t76 -30.5t31 -75.5t-31 -77t-76 -32t-76.5 32t-31.5 77z" /> +<glyph unicode="Î" horiz-adv-x="454" d="M-57 1632l235 269h164l209 -269h-158l-139 140l-152 -140h-159zM154 0v1499h188v-1499h-188z" /> +<glyph unicode="Ï" horiz-adv-x="454" d="M-123 1741q0 45 33 75.5t78 30.5t75.5 -30.5t30.5 -75.5t-30.5 -77t-75.5 -32t-78 32t-33 77zM154 0v1499h188v-1499h-188zM401 1741q0 45 32 75.5t77 30.5t75.5 -30.5t30.5 -75.5t-30.5 -77t-75.5 -32t-77 32t-32 77z" /> +<glyph unicode="Ô" horiz-adv-x="1380" d="M125 739q0 172 18.5 301t58.5 212t87 135.5t119.5 79t140 34.5t164.5 8q121 0 198.5 -12t157.5 -56t125 -126t73.5 -225.5t28.5 -350.5q0 -195 -26.5 -332t-71.5 -217.5t-123 -125t-158.5 -58.5t-203.5 -14q-102 0 -172 8t-143.5 33.5t-119 77t-83 132.5t-54 204.5 t-16.5 291.5zM313 739q0 -150 13.5 -249t39 -163.5t76 -96t111.5 -44t160 -12.5q158 0 237.5 41t118.5 162t39 362q0 123 -9 213t-22.5 153.5t-42 105.5t-54.5 65.5t-75 35t-87 13.5t-105 2q-59 0 -92 -2t-79 -9t-71 -23.5t-55.5 -44t-46 -70.5t-29.5 -103.5t-20.5 -145 t-6.5 -190.5zM408 1632l235 269h164l209 -269h-158l-139 140l-152 -140h-159z" /> +<glyph unicode="Ù" horiz-adv-x="1378" d="M154 655v844h188v-844q0 -88 6 -157.5t20.5 -119.5t29 -85t44 -57.5t52 -36t65.5 -19.5t71.5 -7t84.5 -1q59 0 96 4t84 18.5t75.5 46t54.5 84t38 135.5t12 195v844h191v-844q0 -190 -37 -322t-83 -197.5t-133 -100.5t-142.5 -40t-155.5 -5h-19q-91 0 -137.5 3 t-122.5 20.5t-115.5 59.5t-83.5 112.5t-63.5 189t-19.5 280.5zM367 1909h208l211 -277h-153z" /> +<glyph unicode="Û" horiz-adv-x="1378" d="M154 655v844h188v-844q0 -88 6 -157.5t20.5 -119.5t29 -85t44 -57.5t52 -36t65.5 -19.5t71.5 -7t84.5 -1q59 0 96 4t84 18.5t75.5 46t54.5 84t38 135.5t12 195v844h191v-844q0 -190 -37 -322t-83 -197.5t-133 -100.5t-142.5 -40t-155.5 -5h-19q-91 0 -137.5 3 t-122.5 20.5t-115.5 59.5t-83.5 112.5t-63.5 189t-19.5 280.5zM406 1632l233 269h164l209 -269h-156l-139 140l-152 -140h-159z" /> +<glyph unicode="Ü" horiz-adv-x="1378" d="M154 655v844h188v-844q0 -88 6 -157.5t20.5 -119.5t29 -85t44 -57.5t52 -36t65.5 -19.5t71.5 -7t84.5 -1q59 0 96 4t84 18.5t75.5 46t54.5 84t38 135.5t12 195v844h191v-844q0 -190 -37 -322t-83 -197.5t-133 -100.5t-142.5 -40t-155.5 -5h-19q-91 0 -137.5 3 t-122.5 20.5t-115.5 59.5t-83.5 112.5t-63.5 189t-19.5 280.5zM340 1741q0 45 31.5 75.5t77 30.5t77 -30.5t31.5 -75.5t-31.5 -77t-77 -32t-77 32t-31.5 77zM862 1741q0 45 32 75.5t77 30.5t75.5 -30.5t30.5 -75.5t-30.5 -77t-75.5 -32t-77 32t-32 77z" /> +<glyph unicode="à" horiz-adv-x="1062" d="M76 264v119q0 125 74.5 202t209.5 77q418 -2 418 0q2 117 0 118q0 88 -41 123t-121 35q-195 0 -505 -23v129q203 59 522 64q150 2 242 -78t92 -248v-782h-144l-45 127q-8 -8 -69.5 -39t-166 -65.5t-184.5 -34.5q-125 2 -203.5 77.5t-78.5 198.5zM203 1507h211l209 -276 h-154zM264 283q0 -123 117 -123q151 0 397 100v266l-401 -28q-113 -10 -113 -127v-88z" /> +<glyph unicode="â" horiz-adv-x="1062" d="M76 264v119q0 125 74.5 202t209.5 77q418 -2 418 0q2 117 0 118q0 88 -41 123t-121 35q-195 0 -505 -23v129q203 59 522 64q150 2 242 -78t92 -248v-782h-144l-45 127q-8 -8 -69.5 -39t-166 -65.5t-184.5 -34.5q-125 2 -203.5 77.5t-78.5 198.5zM238 1231l233 268h164 l209 -268h-158l-139 139l-150 -139h-159zM264 283q0 -123 117 -123q151 0 397 100v266l-401 -28q-113 -10 -113 -127v-88z" /> +<glyph unicode="æ" horiz-adv-x="1767" d="M76 274v78q0 127 73.5 204t210.5 77q418 -2 418 0q2 156 0 158q0 88 -41 123.5t-121 35.5q-158 0 -505 -24v129q174 59 522 63q182 4 266 -110q55 59 140 78.5t225 19.5q94 0 150 -6t115.5 -27.5t91.5 -62.5t51.5 -113t19.5 -176q0 -252 -287 -252h-428q0 -176 46 -236.5 t167 -60.5q328 0 481 23v-138q-188 -57 -524 -57q-119 0 -184.5 35t-126.5 108q-6 -8 -84 -41.5t-196 -68.5t-198 -35q-125 2 -203.5 77.5t-78.5 198.5zM264 291q0 -119 117 -119q151 0 397 98v238l-401 -29q-59 -6 -86 -42t-27 -85v-61zM977 631h407q119 0 119 94 q0 143 -40 177t-193 34q-57 0 -83 -1t-66 -6t-56 -17.5t-37.5 -33t-30 -54t-14.5 -80.5t-6 -113z" /> +<glyph unicode="ç" horiz-adv-x="1019" d="M96 545q0 170 25.5 283.5t77 171t111 80t145.5 22.5q219 0 475 -62v-127q-260 14 -443 15q-55 0 -85.5 -10.5t-61.5 -47t-43 -117.5t-12 -216q0 -221 44 -299t158 -78q84 0 198 5t186 10l73 5v-131q-170 -59 -489 -63q-84 0 -143.5 22.5t-110.5 79.5t-78 172t-27 285z M348 -268l105 30q39 16 51 55.5t12 106.5h154q0 -160 -45 -221t-168 -61h-109v90z" /> +<glyph unicode="è" horiz-adv-x="1075" d="M96 549q0 180 24.5 288.5t88 166t143.5 75t219 17.5q94 0 150.5 -5.5t116 -27t91.5 -62t51 -113.5t19 -179q0 -258 -286 -258h-428q0 -176 45 -232.5t168 -56.5q340 0 481 22v-137q-190 -57 -524 -57q-205 0 -282 122t-77 437zM229 1495h211l209 -274h-153zM285 616h407 q119 0 119 95q0 143 -41 179t-192 36q-96 0 -138.5 -5.5t-85.5 -35t-56 -93t-13 -176.5z" /> +<glyph unicode="é" horiz-adv-x="1075" d="M96 549q0 180 24.5 288.5t88 166t143.5 75t219 17.5q94 0 150.5 -5.5t116 -27t91.5 -62t51 -113.5t19 -179q0 -258 -286 -258h-428q0 -176 45 -232.5t168 -56.5q340 0 481 22v-137q-190 -57 -524 -57q-205 0 -282 122t-77 437zM285 616h407q119 0 119 95q0 143 -41 179 t-192 36q-96 0 -138.5 -5.5t-85.5 -35t-56 -93t-13 -176.5zM479 1221l209 274h211l-266 -274h-154z" /> +<glyph unicode="ê" horiz-adv-x="1075" d="M96 549q0 180 24.5 288.5t88 166t143.5 75t219 17.5q94 0 150.5 -5.5t116 -27t91.5 -62t51 -113.5t19 -179q0 -258 -286 -258h-428q0 -176 45 -232.5t168 -56.5q340 0 481 22v-137q-190 -57 -524 -57q-205 0 -282 122t-77 437zM254 1221l233 270h164l209 -270h-158 l-139 139l-149 -139h-160zM285 616h407q119 0 119 95q0 143 -41 179t-192 36q-96 0 -138.5 -5.5t-85.5 -35t-56 -93t-13 -176.5z" /> +<glyph unicode="ë" horiz-adv-x="1075" d="M96 549q0 180 24.5 288.5t88 166t143.5 75t219 17.5q94 0 150.5 -5.5t116 -27t91.5 -62t51 -113.5t19 -179q0 -258 -286 -258h-428q0 -176 45 -232.5t168 -56.5q340 0 481 22v-137q-190 -57 -524 -57q-205 0 -282 122t-77 437zM182 1329q0 45 32 77t77 32t76.5 -32 t31.5 -77t-31.5 -76.5t-76.5 -31.5t-77 31.5t-32 76.5zM285 616h407q119 0 119 95q0 143 -41 179t-192 36q-96 0 -138.5 -5.5t-85.5 -35t-56 -93t-13 -176.5zM705 1329q0 45 31.5 77t76.5 32t77 -32t32 -77t-32 -76.5t-77 -31.5t-76.5 31.5t-31.5 76.5z" /> +<glyph unicode="î" horiz-adv-x="417" d="M-94 1221l233 270h164l209 -270h-158l-137 139l-151 -139h-160zM115 0v1087h188v-1087h-188z" /> +<glyph unicode="ï" horiz-adv-x="417" d="M-160 1329q0 45 32 77t77 32t75.5 -32t30.5 -77t-30.5 -76.5t-75.5 -31.5t-77 31.5t-32 76.5zM115 0v1087h188v-1087h-188zM362 1329q0 45 32 77t77 32t76 -32t31 -77t-31 -76.5t-76 -31.5t-77 31.5t-32 76.5z" /> +<glyph unicode="ô" horiz-adv-x="1157" d="M96 528q0 330 104.5 450t379.5 120q276 0 379.5 -123t103.5 -447q0 -305 -103.5 -421.5t-379.5 -116.5q-272 0 -378 120.5t-106 417.5zM285 528q0 -125 16 -199.5t59 -110.5t89.5 -45t130.5 -9q88 0 134 9t88 46t57 110.5t15 198.5q0 137 -13 216t-53 120t-88 51.5 t-140 10.5q-90 0 -137.5 -10.5t-88.5 -50.5t-55 -120t-14 -217zM285 1221l233 270h164l209 -270h-158l-137 139l-152 -139h-159z" /> +<glyph unicode="ù" horiz-adv-x="1116" d="M96 340v747h189v-749q0 -92 45 -137t121 -45q104 0 173.5 23.5t190.5 86.5v821h189v-1087h-142l-47 123q-10 -6 -49 -28.5t-53.5 -31t-47 -26t-54 -23.5t-53.5 -16t-63.5 -13t-66.5 -3q-162 0 -247 103t-85 255zM223 1495h211l209 -274h-154z" /> +<glyph unicode="û" horiz-adv-x="1116" d="M96 340v747h189v-749q0 -92 45 -137t121 -45q104 0 173.5 23.5t190.5 86.5v821h189v-1087h-142l-47 123q-10 -6 -49 -28.5t-53.5 -31t-47 -26t-54 -23.5t-53.5 -16t-63.5 -13t-66.5 -3q-162 0 -247 103t-85 255zM246 1221l233 270h164l209 -270h-158l-137 139l-151 -139 h-160z" /> +<glyph unicode="ü" horiz-adv-x="1116" d="M96 340v747h189v-749q0 -92 45 -137t121 -45q104 0 173.5 23.5t190.5 86.5v821h189v-1087h-142l-47 123q-10 -6 -49 -28.5t-53.5 -31t-47 -26t-54 -23.5t-53.5 -16t-63.5 -13t-66.5 -3q-162 0 -247 103t-85 255zM180 1329q0 45 32 77t77 32t75.5 -32t30.5 -77 t-30.5 -76.5t-75.5 -31.5t-77 31.5t-32 76.5zM702 1329q0 45 32 77t77 32t76 -32t31 -77t-31 -76.5t-76 -31.5t-77 31.5t-32 76.5z" /> +<glyph unicode="ÿ" horiz-adv-x="1146" d="M41 1087h203l241 -825q6 -18 13.5 -31.5t16.5 -22.5t18.5 -15.5t18.5 -9.5t18.5 -4t16.5 -1t13 1t10 2l4 1l287 905h205l-453 -1431l-151 -209h-125l182 553q-195 0 -266 240zM203 1329q0 45 32.5 77t77.5 32t76 -32t31 -77t-31 -76.5t-76 -31.5t-77.5 31.5t-32.5 76.5z M725 1329q0 45 33 77t78 32t75.5 -32t30.5 -77t-30.5 -76.5t-75.5 -31.5t-78 31.5t-33 76.5z" /> +<glyph unicode="Œ" horiz-adv-x="2134" d="M125 739q0 172 18.5 300t58.5 212t86 136.5t118.5 79t140 34.5t164.5 8q158 0 261 -27.5t173 -109.5q61 137 239 127q610 -29 646 -33v-151h-627q-49 0 -74.5 -19.5t-29 -39t-3.5 -56.5v-360l650 -21v-153l-650 -21v-360q0 -51 22.5 -76t43 -28t61.5 -3h607v-149 l-625 -35q-207 -12 -266 129q-68 -76 -171.5 -103.5t-256.5 -27.5q-102 0 -172 8t-142.5 33.5t-118 76t-83 132.5t-54 205.5t-16.5 291.5zM313 739q0 -188 17.5 -296.5t68 -170t120 -80t192.5 -18.5q119 0 188.5 20.5t119.5 82t69.5 171t19.5 291.5q0 106 -5 189.5 t-20.5 145t-30 104.5t-45 70.5t-55 44t-69.5 23.5t-79 9t-93 2q-51 0 -82 -1t-72 -7t-64.5 -16.5t-53 -31t-46 -50t-34 -73.5t-25.5 -102.5t-14.5 -134.5t-6.5 -172z" /> +<glyph unicode="œ" horiz-adv-x="1849" d="M96 528q0 330 104.5 450t379.5 120q279 0 381 -131q51 76 141 102.5t246 26.5q94 0 150 -5.5t114.5 -27t90.5 -62t51.5 -113.5t19.5 -179q0 -258 -287 -258h-426q-4 -162 43 -225.5t170 -63.5q340 0 479 22v-137q-188 -57 -524 -57q-199 0 -275 121q-100 -121 -374 -121 q-272 0 -378 120.5t-106 417.5zM285 528q0 -125 16 -199.5t59 -110.5t89.5 -45t130.5 -9q190 0 241 71.5t51 313.5q0 231 -58 304t-234 73q-90 0 -137.5 -10.5t-88.5 -50.5t-55 -120t-14 -217zM1061 616h407q117 0 117 95q0 143 -41 179t-192 36q-90 0 -137.5 -8.5 t-89.5 -38t-55 -93.5t-9 -170z" /> +<glyph unicode="Ÿ" horiz-adv-x="1304" d="M86 1499h205l362 -768l400 768h204l-512 -985v-514h-188v514zM303 1741q0 45 32 75.5t77 30.5t75.5 -30.5t30.5 -75.5t-30.5 -77t-75.5 -32t-77 32t-32 77zM825 1741q0 45 32 75.5t77 30.5t75.5 -30.5t30.5 -75.5t-30.5 -77t-75.5 -32t-77 32t-32 77z" /> +<glyph unicode="ˆ" horiz-adv-x="796" d="M96 1087l234 269h164l208 -269h-157l-139 140l-150 -140h-160z" /> +<glyph unicode="˚" horiz-adv-x="606" d="M96 1294q0 88 61.5 149.5t147.5 61.5t146.5 -61.5t60.5 -149.5t-60.5 -148.5t-146.5 -60.5t-147.5 60.5t-61.5 148.5zM199 1294q0 -43 30.5 -73.5t75.5 -30.5q43 0 74 30.5t31 73.5t-31 75t-74 32q-45 0 -75.5 -32t-30.5 -75z" /> +<glyph unicode="˜" horiz-adv-x="884" d="M96 1180q72 66 127.5 99.5t114.5 33.5q55 -2 123.5 -37t95.5 -35q55 -2 188 76l46 -96q-4 -4 -32 -28t-38 -32t-37 -26.5t-43 -25.5t-39.5 -13t-44.5 -6q-59 2 -123.5 35.5t-99.5 33.5q-39 0 -68.5 -10t-65.5 -30.5t-59 -31.5z" /> +<glyph unicode=" " horiz-adv-x="954" /> +<glyph unicode=" " horiz-adv-x="1909" /> +<glyph unicode=" " horiz-adv-x="954" /> +<glyph unicode=" " horiz-adv-x="1909" /> +<glyph unicode=" " horiz-adv-x="636" /> +<glyph unicode=" " horiz-adv-x="477" /> +<glyph unicode=" " horiz-adv-x="318" /> +<glyph unicode=" " horiz-adv-x="318" /> +<glyph unicode=" " horiz-adv-x="238" /> +<glyph unicode=" " horiz-adv-x="381" /> +<glyph unicode=" " horiz-adv-x="106" /> +<glyph unicode="‐" horiz-adv-x="724" d="M41 506v176h643v-176h-643z" /> +<glyph unicode="‑" horiz-adv-x="724" d="M41 506v176h643v-176h-643z" /> +<glyph unicode="‒" horiz-adv-x="724" d="M41 506v176h643v-176h-643z" /> +<glyph unicode="–" horiz-adv-x="1050" d="M41 500v178h969v-178h-969z" /> +<glyph unicode="—" horiz-adv-x="1507" d="M41 504v178h1425v-178h-1425z" /> +<glyph unicode="‘" horiz-adv-x="546" d="M154 1118v221q0 164 154 179q40 4 73 -2v-84q-68 2 -68 -68v-53h25q55 0 55 -56v-137q0 -61 -55 -61h-133q-51 0 -51 61z" /> +<glyph unicode="’" horiz-adv-x="546" d="M154 1323v137q0 59 55 60h133q51 0 51 -60v-221q0 -63 -23.5 -104t-57 -55.5t-66.5 -19.5t-57 -2l-23 3v82q68 0 67 71v52h-24q-55 0 -55 57z" /> +<glyph unicode="‚" horiz-adv-x="546" d="M154 55v138q0 61 55 61h133q51 0 51 -61v-222q0 -63 -23.5 -104t-57 -55.5t-66.5 -19.5t-57 -2l-23 3v84q68 -2 67 70v51h-24q-55 0 -55 57z" /> +<glyph unicode="“" horiz-adv-x="860" d="M139 1118v221q0 61 23.5 102.5t57.5 55.5t68 19.5t57 2.5l24 -3v-84q-70 2 -70 -68v-53h25q57 0 57 -56v-137q0 -61 -57 -61h-131q-54 0 -54 61zM481 1118v221q0 61 23.5 102.5t57.5 55.5t68 19.5t57 2.5l24 -3v-84q-70 2 -70 -68v-53h25q55 0 55 -56v-137q0 -61 -55 -61 h-131q-54 0 -54 61z" /> +<glyph unicode="”" horiz-adv-x="860" d="M139 1321v137q0 61 56 62h131q55 0 55 -62v-221q0 -61 -23.5 -102t-57.5 -55.5t-68.5 -19.5t-58.5 -2l-23 3v82q70 -2 69 69v54h-24q-56 0 -56 55zM481 1321v137q0 61 56 62h131q53 0 53 -62v-221q0 -61 -23.5 -102t-57.5 -55.5t-67.5 -19.5t-57.5 -2l-23 3v82 q70 -2 69 69v54h-24q-56 0 -56 55z" /> +<glyph unicode="„" horiz-adv-x="860" d="M139 55v138q0 61 56 61h131q55 0 55 -61v-222q0 -165 -156 -180q-41 -4 -75 2v84q70 -2 69 70v51h-24q-56 0 -56 57zM481 55v138q0 61 56 61h131q53 0 53 -61v-222q0 -166 -157 -180q-40 -4 -72 2v84q70 -2 69 70v51h-24q-56 0 -56 57z" /> +<glyph unicode="…" horiz-adv-x="1665" d="M322 47v135q0 51 49 51h127q51 0 51 -51v-135q0 -47 -51 -47h-127q-49 0 -49 47zM713 47v135q0 51 49 51h127q51 0 51 -51v-135q0 -47 -51 -47h-127q-49 0 -49 47zM1102 47v135q0 51 49 51h127q51 0 51 -51v-135q0 -47 -51 -47h-127q-49 0 -49 47z" /> +<glyph unicode=" " horiz-adv-x="381" /> +<glyph unicode="‹" horiz-adv-x="729" d="M96 725l422 416l119 -119l-303 -297l313 -305l-119 -121z" /> +<glyph unicode="›" horiz-adv-x="729" d="M96 420l312 305l-304 297l121 119l422 -416l-432 -426z" /> +<glyph unicode=" " horiz-adv-x="477" /> +<glyph unicode="€" horiz-adv-x="1253" d="M39 520v107l174 16v188l-174 17v98l174 21q0 210 50 319q106 230 435 230q80 0 240 -20.5t270 -45.5v-143q-324 29 -491 28q-88 0 -147.5 -18.5t-92.5 -46t-50 -79.5t-21.5 -99.5t-4.5 -124.5l480 -17v-106l-480 -13v-188l480 -16v-107q-31 0 -81 -2t-155.5 -5t-175.5 -5 t-68 -4q0 -340 316 -340q86 0 211 9t207 18l82 10v-140q-233 -74 -519 -73q-57 0 -111.5 8t-126 41t-122.5 85t-88 151.5t-37 230.5z" /> +<glyph unicode="™" horiz-adv-x="1423" d="M39 1360v139h543v-139h-199v-576h-145v576h-199zM649 784l62 715h145l172 -467l148 467h151l70 -715h-148l-35 404l-120 -404h-125l-144 406l-30 -406h-146z" /> +<glyph unicode="" horiz-adv-x="1085" d="M0 1085h1085v-1085h-1085v1085z" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Medium-webfont.ttf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Medium-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a08c0d9e99021f111382110275aff46422c04b3b Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Medium-webfont.ttf differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Medium-webfont.woff b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Medium-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..53523a893bd3c13d1df73d0684ce5b516b0408a6 Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Medium-webfont.woff differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Regular-Italic-webfont.eot b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Regular-Italic-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..61436d15fac254f1dd0cfed5c4f4d0a4993356c6 Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Regular-Italic-webfont.eot differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Regular-Italic-webfont.svg b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Regular-Italic-webfont.svg new file mode 100644 index 0000000000000000000000000000000000000000..8aad38c216feca9303b820fa58bfe09595c35e4d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Regular-Italic-webfont.svg @@ -0,0 +1,187 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Copyright c 2011 Natanael Gama exondiscoveredcom with Reserved Font Name Exo +Designer : Natanael Gama +</metadata> +<defs> +<font id="ExoRegularItalic" horiz-adv-x="1161" > +<font-face units-per-em="2048" ascent="1638" descent="-410" /> +<missing-glyph horiz-adv-x="512" /> +<glyph unicode=" " horiz-adv-x="512" /> +<glyph unicode="	" horiz-adv-x="512" /> +<glyph unicode=" " horiz-adv-x="512" /> +<glyph unicode="!" horiz-adv-x="542" d="M174 47l19 117q6 51 57 51h112q47 0 39 -51l-18 -117q-6 -47 -53 -47h-113q-49 0 -43 47zM250 410l158 1087h182l-187 -1087h-153z" /> +<glyph unicode=""" horiz-adv-x="780" d="M369 1087l20 275l23 137h153l-22 -137l-64 -275h-110zM645 1087l21 275l22 137h154l-23 -137l-63 -275h-111z" /> +<glyph unicode="#" horiz-adv-x="1406" d="M115 475l32 107h326l107 338h-326l37 106h323l150 473h106l-149 -473h340l147 473h107l-148 -473h363l-37 -106h-363l-106 -340h362l-32 -107h-363l-151 -473h-107l152 473l-340 2l-152 -475h-106l151 475h-323zM580 582l338 -2l106 340h-338z" /> +<glyph unicode="$" horiz-adv-x="1175" d="M164 35l20 108q27 0 203 -6t285 -6q37 0 78 8t88 26.5t81.5 58.5t43.5 95l22 140q8 59 11 104t-31.5 70.5t-118.5 25.5h-266q-193 0 -262.5 104.5t-45.5 248.5l21 135q35 203 147.5 281.5t296.5 82.5l29 177h119l-29 -183q76 -6 222.5 -23.5t160.5 -19.5l-18 -119 l-488 19q-252 10 -289 -215l-20 -135q-16 -109 21.5 -155t158.5 -46h266q100 0 164 -31.5t85.5 -82t26.5 -113t-9 -125.5l-23 -140q-20 -133 -102 -213.5t-180.5 -104.5t-217.5 -17l-26 -168h-119l29 178q-55 6 -126 15t-131.5 16.5t-76.5 9.5z" /> +<glyph unicode="%" horiz-adv-x="1970" d="M236 971l43 272q23 139 83 197.5t222 58.5h207q135 0 187 -59.5t32 -196.5l-43 -272q-25 -147 -86.5 -201.5t-216.5 -54.5h-207q-119 0 -179 65.5t-42 190.5zM369 971q-12 -74 11 -98.5t97 -24.5h207q82 0 109.5 23.5t40.5 99.5l43 272q12 78 -5.5 100.5t-101.5 22.5 h-207q-86 0 -112.5 -24.5t-38.5 -98.5zM461 0l1134 1499h146l-1135 -1499h-145zM1194 256l43 272q23 139 83 197.5t222 58.5h207q135 0 187.5 -59t31.5 -197l-43 -272q-25 -145 -87 -200.5t-218 -55.5h-207q-119 0 -178 65.5t-41 190.5zM1327 256q-12 -74 10.5 -98.5 t96.5 -24.5h206q82 0 111 23.5t41 99.5l43 272q12 78 -6.5 100.5t-102.5 22.5h-206q-84 0 -111 -24.5t-39 -98.5z" /> +<glyph unicode="&" horiz-adv-x="1282" d="M142.5 470.5q43.5 156.5 205.5 279.5l195 149l-101 174q-66 117 -42 207t95.5 145.5t159.5 63.5q279 25 539 -35l-16 -98h-416q-328 0 -184 -250l383 -664l272 246l49 -41l-145 -241l-99 -95l185 -311h-156l-133 227l-152 -137q-80 -72 -190.5 -93.5t-220.5 20 t-178 145.5q-94 152 -50.5 308.5zM279 426.5q-28 -106.5 38 -188.5q63 -92 173 -104.5t198 65.5l172 153l-246 414l-176 -135q-131 -98 -159 -204.5z" /> +<glyph unicode="'" horiz-adv-x="380" d="M307 1087l21 275l22 137h154l-23 -137l-63 -275h-111z" /> +<glyph unicode="(" horiz-adv-x="686" d="M234 407.5q3 131.5 26 260.5q86 503 403 978q83 115 82 115h181q-16 -18 -44 -54t-101.5 -151.5t-137 -235.5t-131.5 -299t-100 -353q-35 -197 -31 -365t34.5 -303t66.5 -231.5t66 -147.5l30 -51h-166q-6 10 -15.5 28.5t-34 79t-45 126t-43 167t-33 203.5t-7.5 233.5z " /> +<glyph unicode=")" horiz-adv-x="690" d="M-27 -430q16 18 44 54t102 151.5t137 235.5t131 299t100 354q35 197 31 364.5t-34.5 302.5t-66.5 231.5t-66 147.5l-29 51h165q6 -10 15.5 -28.5t34 -79t45 -126t43 -166.5t33 -203.5t7.5 -233.5t-26 -260q-86 -503 -403 -979q-83 -115 -82 -115h-181z" /> +<glyph unicode="*" horiz-adv-x="901" d="M285 1159l12 82l295 59l-14 -151zM375 848l92 276l143 -34l-164 -267zM580 975l104 127l195 -187l-54 -65zM592 1468l84 33l117 -241l-150 -64zM698 1169l271 156l26 -72l-217 -198z" /> +<glyph unicode="+" horiz-adv-x="1056" d="M205 653l24 152h349l55 350h151l-55 -350h352l-24 -152h-352l-56 -350h-151l55 350h-348z" /> +<glyph unicode="," horiz-adv-x="548" d="M156 -180l10 65q61 -2 74 64l8 51h-23q-51 0 -43 51l17 111q10 55 61 55h105q47 0 38 -55l-28 -185q-8 -55 -34 -91t-56.5 -49t-60 -18t-49.5 -2z" /> +<glyph unicode="-" horiz-adv-x="727" d="M123 518l24 152h644l-25 -152h-643z" /> +<glyph unicode="." horiz-adv-x="555" d="M180 47l19 117q6 51 57 51h109q53 0 43 -51l-19 -117q-8 -47 -57 -47h-109q-49 0 -43 47z" /> +<glyph unicode="/" horiz-adv-x="819" d="M16 -147l848 1724h162l-848 -1724h-162z" /> +<glyph unicode="0" horiz-adv-x="1314" d="M195 332l133 835q51 332 403 332h336q172 0 242.5 -97t48.5 -235l-133 -835q-29 -178 -126.5 -255t-269.5 -77h-335q-154 0 -240 80t-59 252zM344 228.5q8 -40.5 39 -55.5t54.5 -18t71.5 -3h9h336q188 0 219 180l133 835q14 92 -19.5 136.5t-142.5 44.5h-335 q-203 0 -230 -181l-133 -835q-10 -63 -2 -103.5z" /> +<glyph unicode="1" horiz-adv-x="739" d="M274 1217l17 108q90 0 183 44t141 87l49 43h147l-233 -1499h-152l209 1305q-43 -33 -136.5 -60.5t-224.5 -27.5z" /> +<glyph unicode="2" horiz-adv-x="1218" d="M96 0l23 139q145 90 278 180.5t312.5 229.5t296 282.5t135.5 262.5q41 272 -223 272h-621l18 113q328 41 631 41q195 0 279 -125t67 -305q-10 -109 -87 -235t-174 -227.5t-226 -207t-210 -162.5t-157 -106h697l-25 -152h-1014z" /> +<glyph unicode="3" horiz-adv-x="1216" d="M100 43l17 96h610q86 0 161 48.5t91 142.5l20 121q12 43 6 75.5t-7 55t-19 39t-29.5 24.5t-37 13.5t-43 6.5t-46.5 3l-495 14l20 119l500 20q215 10 246 203l22 141q29 186 -184 187h-637l14 94q90 31 204 44t222.5 14t235.5 -1q150 -4 234.5 -98t62.5 -240l-23 -141 q-39 -240 -180 -279q125 -72 90 -294l-20 -121q-53 -344 -418 -344h-75h-80q-15 0 -69.5 1t-75 2t-65.5 4t-69.5 7t-60.5 10t-64.5 14.5t-57.5 18.5z" /> +<glyph unicode="4" horiz-adv-x="1234" d="M113 459l821 1040h190l-753 -956h565l68 424l106 153h76l-92 -577h184l-18 -121l-191 -39l-59 -379h-158l59 379h-741z" /> +<glyph unicode="5" horiz-adv-x="1234" d="M162 39l18 113h623q96 0 147 58t64 132l35 217q35 203 -150 203h-309q-68 0 -125 -39t-70 -115h-141l186 891h867l-25 -151h-721l-104 -496q49 53 182 63q68 4 107.5 4.5t98 -3t77.5 -3.5q141 0 221 -99t57 -251l-35 -225q-31 -195 -130 -270.5t-259 -77.5 q-201 -2 -311 6t-303 43z" /> +<glyph unicode="6" horiz-adv-x="1271" d="M254 786q59 375 190 550t277 175q358 0 612 -38l-18 -113h-592q-61 0 -116.5 -56.5t-93.5 -144.5t-61.5 -169t-37.5 -156q352 41 544 43q80 2 137.5 -18.5t86 -54.5t46 -75t15.5 -82t-4 -76l-41 -268q-49 -303 -379 -303h-301q-389 0 -264 786zM395 725 q-92 -580 140 -580h305q70 0 133 37t78 133l39 256q14 90 -21 122t-135 32h-539z" /> +<glyph unicode="7" horiz-adv-x="1118" d="M274 1348l25 151h940l39 -98l-764 -1401h-180l741 1348h-801z" /> +<glyph unicode="8" horiz-adv-x="1294" d="M216 251.5q1 30.5 7 63.5l31 201q16 106 81.5 163.5t147.5 65.5q-63 20 -101 69.5t-47 102t-1 105.5l22 133q31 199 131.5 276.5t284.5 77.5h299q154 0 228.5 -93t48.5 -261l-23 -133q-2 -33 -18.5 -77t-64.5 -97t-118 -68q76 -25 106 -105.5t15 -158.5l-31 -201 q-16 -104 -55 -170.5t-97 -96.5t-109.5 -39t-123.5 -9h-297q-98 0 -164.5 26.5t-96 61.5t-43 84t-12.5 79.5zM373 309q-14 -88 27.5 -122.5t156.5 -34.5h297q74 0 134.5 36.5t72.5 120.5l35 215q12 82 -32 124t-118 42h-325q-186 0 -213 -166zM483 1012q-14 -92 38 -132 t122 -40h326q174 0 202 172l23 139q20 121 -13.5 164t-133.5 43h-299q-123 0 -173.5 -47t-68.5 -160z" /> +<glyph unicode="9" horiz-adv-x="1269" d="M176 39l19 113h591q61 0 116.5 56t93.5 144t61.5 169t38.5 157q-352 -41 -545 -43q-80 -2 -137.5 18.5t-86 54t-46 74.5t-15.5 82t4 76l41 268q49 303 379 303h301q389 0 264 -786q-59 -375 -190 -550t-277 -175q-407 0 -612 39zM420 940q-14 -90 20.5 -122t134.5 -32 h539q92 580 -139 580h-305q-70 0 -133.5 -37t-77.5 -133z" /> +<glyph unicode=":" horiz-adv-x="557" d="M180 47l19 117q6 51 57 51h109q53 0 43 -51l-19 -117q-8 -47 -57 -47h-109q-49 0 -43 47zM319 922l19 116q6 51 57 52h109q53 0 43 -52l-19 -116q-8 -47 -59 -48h-109q-47 1 -41 48z" /> +<glyph unicode=";" horiz-adv-x="557" d="M156 -180l10 65q61 -2 74 64l8 51h-23q-20 0 -33.5 16.5t-9.5 34.5l17 111q4 23 21.5 39t39.5 16h105q47 0 38 -55l-28 -185q-8 -55 -34 -91t-56.5 -49t-60 -18t-49.5 -2zM324 924l18 116q6 51 57 52h109q53 0 43 -52l-19 -116q-8 -47 -57 -47h-108q-49 0 -43 47z" /> +<glyph unicode="<" horiz-adv-x="970" d="M203 643l26 164l820 332l-25 -164l-635 -258l551 -277l-27 -153z" /> +<glyph unicode="=" horiz-adv-x="956" d="M109 434l26 152h875l-27 -152h-874zM174 862l27 152h874l-26 -152h-875z" /> +<glyph unicode=">" horiz-adv-x="972" d="M147 287l27 168l647 270l-565 270l27 144l714 -332l-24 -164z" /> +<glyph unicode="?" horiz-adv-x="1105" d="M256 1368l18 105q29 4 102 13t93 11l90 9q70 7 91.5 7t98 3.5t109.5 -3.5q197 0 286 -109.5t62 -268.5l-32 -207q-63 -399 -549 -322l-18 -99q-17 -99 -15 -108h-154l51 332q195 -4 291 0q86 4 157 53.5t87 143.5l33 207q20 129 -35 181t-211 52h-555zM358 47l19 117 q6 51 57 51h109q53 0 43 -51l-19 -117q-8 -47 -57 -47h-109q-49 0 -43 47z" /> +<glyph unicode="@" horiz-adv-x="1777" d="M131 18l166 1049q59 365 420 365h768q168 0 240.5 -94.5t46.5 -270.5l-109 -725q-6 -43 -13.5 -72.5t-31 -85t-57 -89.5t-97 -61.5t-147.5 -27.5h-111l-47 123q-123 -135 -319 -137q-190 -4 -275.5 121t-36.5 450q25 162 76 276.5t115.5 171t125 80t124.5 23.5 q332 0 465 -127l-121 -829q86 0 133 34.5t65 149.5l109 725q6 45 6 79t-4 56.5t-17.5 36.5t-22.5 22.5t-30.5 12.5t-31.5 4h-35h-10h-783q-209 0 -243 -211l-166 -1049q-37 -233 174 -233h790l-16 -96q-276 -55 -598 -56h-201q-158 0 -243 109.5t-58 275.5zM674 520 q-27 -219 9 -297t157 -80q88 -2 161.5 25t169.5 98l105 666q-123 33 -305 33q-242 -1 -297 -445z" /> +<glyph unicode="A" horiz-adv-x="1351" d="M92 0l789 1499h151l289 -1499h-154l-80 418h-608l-221 -418h-166zM559 569h500l-129 717z" /> +<glyph unicode="B" horiz-adv-x="1222" d="M164 0l237 1499h580q106 0 180 -37t105 -97q32 -61 42 -125q6 -37 7 -75q0 -30 -4 -61q-33 -266 -244 -326q57 -10 109 -110q38 -73 37 -176q0 -38 -5 -80q-51 -412 -465 -412h-579zM342 152h426q244 0 287 270q6 36 6 68q0 79 -35 138q-49 83 -170 83h-426zM455 862h426 q238 0 276 248q6 38 6 69q0 83 -38 119q-52 50 -164 50h-429z" /> +<glyph unicode="C" horiz-adv-x="1183" d="M216 540q2 104 20 214q33 193 73.5 323.5t110 235t176 154t256.5 49.5q170 0 491 -62l-18 -121q-233 31 -443 31h-48q-39 0 -56.5 -1t-63.5 -12.5t-74 -33t-71 -66.5t-71.5 -107.5t-59 -163.5t-51.5 -230q-20 -126 -20 -231q1 -37 3 -71q10 -132 75 -216.5t182 -92.5 q39 -3 95 -3q151 0 423 20l-17 -121q-174 -47 -510 -47q-113 0 -193.5 47t-124.5 121q-44 76 -66 178q-19 92 -19 184q1 11 1 22z" /> +<glyph unicode="D" horiz-adv-x="1368" d="M164 0l237 1497q0 2 560 2q131 0 223 -55t135 -137q43 -81 61 -189q15 -92 14 -172v-26q-3 -90 -20 -177q-129 -743 -651 -743h-559zM340 158h408q188 0 311 169t164 418q20 126 20 225q0 144 -42 231q-71 147 -265 147h-408z" /> +<glyph unicode="E" d="M201 252l155 981q43 267 276 267q12 0 25 -1l643 -33l-18 -118h-649q-66 0 -91.5 -31t-33.5 -84l-66 -410l672 -20l-20 -121l-676 -20l-66 -410q-4 -39 2 -62.5t27.5 -31.5t37 -10.5t46.5 -2.5h629l-21 -116l-635 -35q-10 -1 -19 -1q-100 -1 -166 59q-56 50 -56 145 q0 26 4 55z" /> +<glyph unicode="F" horiz-adv-x="1163" d="M164 0l194 1233q43 267 276 267q12 0 25 -1l644 -33l-19 -118h-649q-66 0 -91.5 -31t-33.5 -84l-64 -410l670 -20l-18 -121l-678 -20l-105 -662h-151z" /> +<glyph unicode="G" horiz-adv-x="1247" d="M220 538q2 105 20 214q33 193 73.5 323.5t111.5 235t177.5 153.5t255.5 49h10q147 0 463 -59l-16 -121q-143 20 -475 29q-20 -2 -44 0t-50.5 -5t-54 -14.5t-56.5 -30t-55.5 -51t-53 -76.5t-50 -107.5t-44 -144.5t-35.5 -185q-18 -114 -18 -210q0 -131 33 -230 q58 -171 225 -171h4q157 1 397 113l70 393h-346l16 102q195 51 367 52q63 0 137 -6l-125 -791h-117l-20 117q-53 -49 -169 -90t-226.5 -41t-191.5 47t-126 122.5t-67 176.5q-20 95 -20 193v13z" /> +<glyph unicode="H" horiz-adv-x="1318" d="M174 0l238 1499h151l-112 -698h716l113 698h152l-238 -1499h-152l105 649h-717l-104 -649h-152z" /> +<glyph unicode="I" horiz-adv-x="460" d="M184 0l238 1499h151l-237 -1499h-152z" /> +<glyph unicode="J" horiz-adv-x="737" d="M78 43l26 111q49 -12 79 -18.5t81 -11.5q17 -2 32 -2q30 0 53 7q34 10 71 30.5t60.5 66.5t33.5 112l184 1161h152l-184 -1161q-35 -231 -154 -301q-87 -49 -215 -49h-10q-135 2 -209 55z" /> +<glyph unicode="K" horiz-adv-x="1171" d="M164 0l237 1499h152l-107 -672h179l563 672h188l-622 -758l385 -741h-183l-346 676h-186l-107 -676h-153z" /> +<glyph unicode="L" horiz-adv-x="1095" d="M203 258l200 1241h150l-199 -1241q-6 -39 1 -62.5t29 -31.5t37 -10t46 -2h627l-23 -152h-631q-117 0 -187 62q-54 49 -54 140q0 26 4 56z" /> +<glyph unicode="M" horiz-adv-x="1642" d="M145 0l336 1499h197l209 -1247l590 1247h206l-122 -1499h-152l107 1227l-584 -1227h-156l-203 1225l-276 -1225h-152z" /> +<glyph unicode="N" horiz-adv-x="1351" d="M164 0l237 1499h148l571 -1216l193 1216h151l-237 -1499h-144l-573 1217l-193 -1217h-153z" /> +<glyph unicode="O" horiz-adv-x="1366" d="M211 484q2 112 25 255q33 207 81 349.5t102 225.5t137 127t162 56t200 12q82 0 144 -7t123.5 -27.5t102.5 -55.5t74 -92t46 -138q11 -70 11 -164v-29q-2 -112 -24 -257q-25 -164 -60 -284.5t-83 -202.5t-100 -134t-125 -80t-143.5 -37t-166.5 -9q-80 0 -137.5 5 t-121 23.5t-105.5 50t-77.5 88t-51.5 134.5q-14 69 -13 165v26zM361 475v-11q-1 -100 17 -162q18 -66 69 -101t112.5 -46.5t161.5 -11.5q119 0 194.5 21.5t143 85t111.5 182.5t73 307q16 100 21.5 182.5t5.5 143.5t-13.5 107.5t-26.5 77t-43 52t-52.5 33t-66.5 16.5t-72.5 6 t-82.5 1q-74 0 -111.5 -2t-94 -13.5t-87 -35t-70.5 -67.5t-65.5 -110.5t-51.5 -164t-46 -226.5q-25 -158 -26 -264z" /> +<glyph unicode="P" horiz-adv-x="1218" d="M154 0l237 1499h627q143 -1 232 -103q67 -77 66 -224q0 -50 -7 -107q-12 -96 -37 -170t-49.5 -122t-63.5 -81t-66.5 -48t-74.5 -23.5t-69.5 -9.5t-69.5 -1q-59 0 -260 15.5t-209 19.5l-105 -645h-151zM426 762h473q98 0 162.5 59.5t93.5 243.5q8 40 8 73q0 14 -1 27 q-5 43 -9 73t-20.5 50.5t-29.5 31.5t-36 17t-38 7.5t-36 1.5h-475z" /> +<glyph unicode="Q" horiz-adv-x="1374" d="M219 484q2 112 25 255q33 207 81 349.5t102 225.5t137 127t162 56t200 12q82 0 144.5 -7t123.5 -27.5t102 -55.5t74 -92t46 -138q12 -68 12 -159v-34q-3 -113 -25 -257q-25 -164 -59.5 -284.5t-83 -202.5t-100.5 -134t-124.5 -80t-143.5 -37t-167 -9q-80 0 -137.5 5 t-121 23.5t-105.5 50t-77.5 88t-51.5 134.5q-13 69 -13 165v26zM370 475q-1 -3 -1 -6q0 -102 19 -167q18 -66 68 -101t111.5 -46.5t161.5 -11.5q119 0 194.5 21.5t143.5 85t112 182.5t72 307q16 100 21.5 182.5t5.5 143.5t-13.5 107.5t-26.5 77t-43 52t-52.5 33t-66.5 16.5 t-72.5 6t-81.5 1q-74 0 -112 -2t-94.5 -13.5t-87 -35t-70.5 -67.5t-65.5 -110.5t-51.5 -164t-46 -226.5q-25 -158 -25 -264zM633 -68h106q80 -63 165 -70q14 -1 28 -1q71 0 145 30l-26 -163q-69 -19 -144 -19q-17 0 -33 1q-94 5 -167.5 65.5t-73.5 156.5z" /> +<glyph unicode="R" horiz-adv-x="1249" d="M154 0l237 1499h639q280 0 280 -348q0 -48 -5 -102q-39 -391 -326 -431l217 -618h-166l-203 602l-421 29l-101 -631h-151zM428 762h475q96 0 166 66.5t82 220.5q6 47 6 85q0 27 -3 49q-7 54 -14 87t-31 49t-45.5 21.5t-57.5 5.5h-486z" /> +<glyph unicode="S" horiz-adv-x="1169" d="M162 33l18 123q147 -20 506 -21q264 0 293 184l22 140q6 41 6 73q0 48 -14 78q-24 49 -131 49h-284q-316 0 -316 264q0 41 8 89l21 135q18 115 61 191.5t108 113.5q64 36 134 50q51 10 113 11q23 0 47 -2q227 -8 501 -49l-18 -121l-508 19q-17 1 -32 1q-107 0 -167 -36 q-68 -41 -88 -178l-20 -135q-6 -43 -6 -76t6 -53.5t17.5 -36t25.5 -21.5t32.5 -10t38.5 -4h43h23h285q90 0 151.5 -31.5t85.5 -81.5q25 -52 34 -114q4 -24 3 -48q0 -38 -8 -77l-23 -140q-14 -90 -53 -154.5t-84 -98t-109.5 -53t-112.5 -24.5t-109 -5q-104 0 -268 17.5 t-232 31.5z" /> +<glyph unicode="T" horiz-adv-x="1185" d="M285 1348l24 151h1041l-25 -151h-451l-212 -1348h-152l213 1348h-438z" /> +<glyph unicode="U" horiz-adv-x="1343" d="M260 618l139 881h154l-139 -881q-16 -127 -16 -215v-23q2 -93 45.5 -146.5t103 -73t158.5 -19.5q205 0 312 105.5t148 371.5l140 881h153l-139 -881q-16 -106 -34.5 -178.5t-62.5 -166t-106.5 -148.5t-171 -95t-252.5 -40q-260 0 -372 149q-77 102 -76 290q0 85 16 189z " /> +<glyph unicode="V" horiz-adv-x="1372" d="M307 1499h160l238 -1255l657 1255h174l-788 -1499h-152z" /> +<glyph unicode="W" horiz-adv-x="2052" d="M307 1499h154l239 -1251l662 1251h172l-266 -516l121 -747l661 1263h166l-789 -1499h-151l-125 766l-403 -766h-152z" /> +<glyph unicode="X" horiz-adv-x="1230" d="M78 0l565 745l-334 754h160l274 -620l469 620h183l-584 -772l322 -727h-160l-262 594l-451 -594h-182z" /> +<glyph unicode="Y" horiz-adv-x="1290" d="M307 1499h160l262 -780l545 780h180l-672 -967l-84 -532h-151l84 532z" /> +<glyph unicode="Z" horiz-adv-x="1155" d="M72 0l24 152l1000 1196h-811l24 151h1010l-25 -151l-999 -1196h811l-25 -152h-1009z" /> +<glyph unicode="[" horiz-adv-x="657" d="M152 -181.5q-4 60.5 8 103.5l235 1487q25 156 92.5 235.5t237.5 79.5h164l-25 -151h-164q-63 0 -100 -35t-53 -129l-236 -1487q-18 -129 0.5 -165t96.5 -36h163l-24 -151h-164q-88 0 -143.5 39t-69.5 94t-18 115.5z" /> +<glyph unicode="\" horiz-adv-x="800" d="M289 1577h145l303 -1724h-145z" /> +<glyph unicode="]" horiz-adv-x="659" d="M-27 -430l25 151h164q63 0 100 35t53 129l236 1487q18 129 -0.5 165t-95.5 36h-164l24 151h164q88 0 143.5 -38.5t70 -94t18.5 -116t-9 -103.5l-235 -1487q-25 -156 -92.5 -235.5t-237.5 -79.5h-164z" /> +<glyph unicode="^" horiz-adv-x="802" d="M274 1087l283 269h145l170 -269h-141l-106 164l-179 -164h-172z" /> +<glyph unicode="_" horiz-adv-x="1378" d="M39 -2l24 152h1299l-25 -152h-1298z" /> +<glyph unicode="`" horiz-adv-x="520" d="M256 1360h178l217 -273h-141z" /> +<glyph unicode="a" horiz-adv-x="1107" d="M162 355q2 93 22 214q27 158 75 267.5t113.5 163t123 77t131.5 31.5q34 4 71 3q94 -1 214 -25q166 -36 241 -105l-143 -981h-109l-22 123q-209 -137 -381 -137q-63 0 -110.5 9t-92.5 31.5t-73 65.5q-26 42 -44 106q-16 57 -16 138v19zM330 514q-15 -96 -15 -165 q0 -82 21 -128q39 -84 162 -84q106 0 186 22.5t205 76.5l106 690q-150 40 -260 40q-50 0 -92 -8q-51 -10 -78.5 -18t-69.5 -35.5t-68 -72t-52.5 -125t-44.5 -193.5z" /> +<glyph unicode="b" horiz-adv-x="1134" d="M123 0l254 1608h147l-92 -586q215 82 404 82q301 0 301 -360q0 -91 -19 -205q-16 -94 -30.5 -157t-49 -147.5t-77.5 -134.5t-118 -84q-64 -28 -142 -29q-14 0 -29 1q-94 6 -216 52t-165 81l-60 -121h-108zM309 233q219 -94 387 -94q113 0 176.5 99.5t94.5 300.5 q18 127 20 219v9q0 86 -37 134q-39 51 -127 51q-195 0 -407 -53z" /> +<glyph unicode="c" horiz-adv-x="1015" d="M182 545q33 186 79 304t108.5 170t118 67.5t141.5 15.5q158 0 456 -58l-16 -110q-283 16 -465 16q-43 0 -68.5 -5t-57.5 -26.5t-54.5 -64.5t-46 -122t-45.5 -195q-20 -111 -19 -189q0 -76 18 -120q38 -90 144 -91q84 0 205 5t201 12l80 6l-19 -115q-216 -57 -455 -57h-16 q-172 2 -256 135q-52 83 -52 226q0 87 19 196z" /> +<glyph unicode="d" horiz-adv-x="1130" d="M171 348q-3 30 -3 60q0 66 14 131q20 123 48 213t77 176t131 131t193 45q76 0 189.5 -22.5t199.5 -59.5l94 586h148l-256 -1608h-109l-20 121q-61 -41 -184.5 -87t-215.5 -46q-102 0 -173 51t-97.5 131t-35.5 178zM334 539q-15 -87 -15 -156q0 -82 21 -139 q39 -105 141 -105q170 0 414 94l104 666q-195 53 -393 53q-100 0 -166.5 -88.5t-105.5 -324.5z" /> +<glyph unicode="e" horiz-adv-x="1075" d="M182 569q27 143 56.5 228.5t87 163t155 112.5t242.5 35q207 0 311 -72q85 -58 85 -182q0 -28 -5 -59q-16 -127 -97 -209t-185 -111q-106 -29 -218 -35q-44 -2 -81 -2q-61 0 -109 6q-78 10 -107 21q-17 -95 -17 -161q0 -64 16 -99q32 -72 143 -74q52 -4 111 -4 q168 0 399 33l-17 -115q-217 -59 -512 -59q-195 0 -254 141q-31 73 -31 189q0 108 27 253zM334 575q26 -2 64 -5q16 -1 44 -1q38 0 98 2q104 4 184.5 22.5t153 70t85.5 131.5q4 23 4 41q-1 66 -45 90q-56 30 -207 30q-109 0 -180.5 -24.5t-109.5 -87t-51.5 -101 t-32.5 -131.5q-5 -25 -7 -37z" /> +<glyph unicode="f" horiz-adv-x="825" d="M188 936l19 113l213 38l12 74q41 252 111.5 349.5t242.5 97.5q86 0 244 -49l-14 -101h-230q-102 0 -139 -57.5t-63 -239.5l-13 -74h338l-24 -151h-340l-156 -936h-151l153 936h-203z" /> +<glyph unicode="g" horiz-adv-x="1132" d="M76 -508l16 100h529q76 0 133 50.5t71 144.5l43 272q-200 -77 -366 -77h-4q-156 0 -238 78.5t-89 207.5q-2 31 -2 64q0 105 17 231q41 256 160 396.5t291 140.5q96 0 205.5 -9.5t211 -22.5t124.5 -15l-201 -1266q-29 -180 -139 -268q-96 -77 -210 -77q-16 0 -32 1z M317 356v-19q0 -42 7 -69q10 -32 27.5 -67t54 -52.5t90.5 -17.5q182 0 391 51l123 766h-373q-76 0 -135.5 -47t-92 -120.5t-48 -127t-23.5 -104.5q-2 -8 -4 -28q-8 -52 -11.5 -81.5t-5.5 -83.5z" /> +<glyph unicode="h" horiz-adv-x="1114" d="M123 0l254 1606h151l-102 -645q6 4 49 26.5t53.5 27.5t48 22.5t53 23.5t49.5 17.5t57.5 15.5t54 8t61.5 4q156 0 230 -102q57 -79 56 -182q0 -31 -5 -64l-121 -758h-152l121 758q3 24 3 46q0 64 -31 101q-42 49 -126 49q-78 0 -149.5 -16t-116.5 -33.5t-153 -66.5 l-134 -838h-151z" /> +<glyph unicode="i" horiz-adv-x="399" d="M123 0l172 1087h151l-172 -1087h-151zM299 1262l16 110q6 51 58 51h102q40 0 40 -37q0 -6 -1 -14l-16 -110q-6 -47 -56 -48h-102q-42 1 -42 38q0 5 1 10z" /> +<glyph unicode="j" horiz-adv-x="444" d="M57 -553l260 1640h152l-174 -1095q-47 -317 -139 -545h-99zM322 1262l18 110q6 51 57 51h103q40 0 40 -37q0 -7 -1 -14l-19 -110q-6 -47 -55 -48h-103q-41 1 -41 38q0 5 1 10z" /> +<glyph unicode="k" horiz-adv-x="1003" d="M123 0l254 1602h151l-151 -955q143 43 322.5 186.5t201.5 253.5h170q-43 -150 -196.5 -296t-280.5 -201l412 -590h-185l-381 549l-78 -2l-88 -547h-151z" /> +<glyph unicode="l" horiz-adv-x="593" d="M182 387l193 1217h151l-192 -1217q-10 -59 -11 -100v-16q0 -31 3 -49q4 -24 19 -38t29.5 -20t43.5 -12q152 -37 153 -37l-18 -115h-139q-242 0 -242 268q0 54 10 119z" /> +<glyph unicode="m" horiz-adv-x="1839" d="M123 0l172 1087h106l25 -131q12 6 74.5 40t83 43.5t69.5 28.5t91 25.5t92 6.5q92 0 166.5 -50.5t97.5 -125.5q242 176 475 176q135 0 220 -100q66 -77 65 -184q0 -32 -5 -66l-118 -750h-152l119 750q3 21 3 39q0 62 -35 104q-46 55 -122 55q-129 0 -218 -24.5t-202 -89.5 l-12 -89l-119 -745h-151l119 750q3 20 3 39q0 62 -36 104q-47 55 -123 55q-27 0 -50.5 -1t-49 -5t-40 -6t-42 -11.5t-37.5 -11.5t-44 -16t-41 -17t-49 -22.5t-52 -23.5l-132 -834h-151z" /> +<glyph unicode="n" horiz-adv-x="1114" d="M123 0l172 1087h106l25 -126q6 4 49 26.5t53.5 27.5t48 22.5t53 23.5t49.5 17.5t57.5 15.5t54 8t61.5 4q156 0 230 -102q57 -79 56 -182q0 -31 -5 -64l-121 -758h-152l121 758q3 24 3 45q0 65 -32 102q-43 49 -125 49q-78 0 -149.5 -16t-116.5 -33.5t-153 -66.5 l-134 -838h-151z" /> +<glyph unicode="o" horiz-adv-x="1155" d="M182 528q51 330 172 450t391 120q257 0 351 -140q62 -92 61 -249q0 -82 -16 -181q-51 -307 -165 -422.5t-378 -115.5q-266 0 -364 124q-67 84 -66 247q0 75 14 167zM318 378q0 -9 -1 -19q1 -52 13 -88q14 -42 34.5 -68.5t59.5 -39.5t78 -17.5t98 -4.5q92 0 144.5 10.5 t105.5 48.5t85 117.5t54 210.5q18 109 18 187q0 103 -32 149q-57 82 -246 82q-96 0 -151.5 -12t-106.5 -55t-81.5 -126.5t-55.5 -224.5q-14 -86 -16 -150z" /> +<glyph unicode="p" horiz-adv-x="1144" d="M35 -553l272 1620q225 27 518 27q320 0 320 -406q0 -77 -12 -170q-31 -233 -140.5 -383.5t-302.5 -150.5q-82 0 -201.5 19.5t-203.5 55.5l-101 -612h-149zM307 184q160 -53 293 -53q52 0 100 8q49 8 82 22.5t75 53.5t73 120t51 204q15 90 15 160q0 243 -179 243h-383z " /> +<glyph unicode="q" horiz-adv-x="1132" d="M172 257q-2 37 -2 77q0 98 16 215q88 551 465 551q96 0 203 -9.5t204 -22.5t120 -15l-254 -1606h-152l96 612q-206 -79 -372 -79h-4q-150 0 -230 75.5t-90 201.5zM324 252q27 -121 174 -121q182 0 391 51l121 766h-383q-72 0 -128.5 -42t-88 -110.5t-48 -127 t-24.5 -119.5q-20 -147 -20 -228q0 -44 6 -69z" /> +<glyph unicode="r" horiz-adv-x="874" d="M123 0l172 1087h106l23 -137q12 6 56 30t60.5 32t55.5 26.5t62.5 25.5t59.5 17.5t68.5 14.5t67.5 4q119 0 150 -17l-25 -149q-49 12 -150 12q-78 0 -150.5 -16.5t-117.5 -34.5t-155 -68l-132 -827h-151z" /> +<glyph unicode="s" horiz-adv-x="1040" d="M131 18l19 113h561q12 -2 31.5 0t55.5 28.5t44 82.5l18 110q3 19 3 34q1 32 -13 51q-20 28 -86 28h-303q-153 1 -219 61q-49 45 -49 137q0 32 6 70l16 105q23 137 97.5 203.5t228.5 66.5q197 0 530 -33l-18 -117h-535q-45 0 -76.5 -12t-46 -33.5t-19.5 -37t-9 -37.5 l-17 -105q-8 -27 -4 -45t4 -31.5t11.5 -20.5t15.5 -12.5t19.5 -6.5t21.5 -2t22.5 0t22.5 1h307q132 0 196 -74q50 -57 50 -141q0 -23 -4 -49l-19 -129q-12 -80 -45 -132t-81 -74.5t-88 -29.5t-93 -7h-10q-194 0 -545 38z" /> +<glyph unicode="t" horiz-adv-x="774" d="M188 938l19 115l209 37l84 303h114l-47 -303h318l-25 -152h-317l-86 -551q-5 -78 -11 -120l-2 -20q0 -29 12 -47q16 -24 33 -32t52 -16q152 -37 153 -37l-16 -115h-139q-149 0 -207 94q-37 61 -38 166q0 57 11 127l86 551h-203z" /> +<glyph unicode="u" horiz-adv-x="1112" d="M156 330l118 757h152l-119 -757q-4 -30 -4 -55q0 -66 30 -98q42 -44 128 -44q78 0 149.5 16.5t116.5 34t154 66.5l131 837h151l-172 -1087h-106l-25 127q-10 -6 -49 -26.5t-52.5 -26.5t-48 -23.5t-52 -24t-50.5 -17.5t-56.5 -15t-54 -8t-61.5 -4q-158 0 -232 98 q-55 73 -54 176q0 35 6 74z" /> +<glyph unicode="v" horiz-adv-x="1054" d="M193 1087h157l213 -901l381 738q41 84 53 163h121q14 -43 14 -84q0 -53 -24 -104l-469 -899h-190z" /> +<glyph unicode="w" horiz-adv-x="1634" d="M193 1087h151l207 -890l383 721q41 84 53 163h111q14 -42 14 -83q0 -54 -25 -105l-59 -133l111 -551l397 715q41 84 53 163h113q15 -46 15 -88q0 -54 -25 -100l-506 -899h-150l-118 573l-302 -573h-167z" /> +<glyph unicode="x" horiz-adv-x="1073" d="M49 0l481 549l-309 538h174l240 -417l366 417h195l-481 -557l303 -530h-174l-236 410l-354 -410h-205z" /> +<glyph unicode="y" horiz-adv-x="1124" d="M193 1087h157l131 -849q8 -45 43 -64q32 -18 60 -18h6l31 2l395 770q37 70 51 164h125q13 -38 13 -77q0 -60 -31 -120l-453 -893q-135 -264 -248 -393t-272 -160v109q59 39 110 91t96.5 119.5t72 113.5t63.5 118q-27 0 -53.5 7t-63.5 27.5t-65.5 70t-38.5 120.5z" /> +<glyph unicode="z" horiz-adv-x="933" d="M92 2l19 152l706 782h-604l20 151h811l-20 -151l-694 -782h565l-23 -152h-780z" /> +<glyph unicode="{" horiz-adv-x="655" d="M137 635l23 137h44q40 0 54 2t42 10.5t42 26.5t18 49l76 483q61 381 451 381l-25 -151q-238 4 -274 -230l-76 -483q-12 -70 -67.5 -114t-135.5 -58q72 -10 114 -60t32 -114l-82 -508q-27 -162 25.5 -226.5t170.5 -58.5l-24 -151q-139 0 -220 67.5t-101.5 162t-2.5 206.5 l82 500q10 61 -44 97t-122 32z" /> +<glyph unicode="|" horiz-adv-x="501" d="M152 -147l272 1724h151l-272 -1724h-151z" /> +<glyph unicode="}" horiz-adv-x="645" d="M-27 -430l25 151q236 -4 272 230l78 483q12 70 66.5 114t134.5 58q-72 10 -113 60.5t-30 113.5l81 508q27 162 -25 226.5t-171 58.5l24 151q139 0 220 -67.5t101.5 -161.5t2.5 -207l-82 -500q-10 -61 44 -97t122 -32l-23 -137h-44q-40 0 -54 -2t-42 -10t-42 -26.5 t-18 -49.5l-78 -483q-62 -381 -449 -381z" /> +<glyph unicode="~" horiz-adv-x="897" d="M287 1171q16 12 61 48t65.5 49.5t58.5 28t77 14.5q45 0 104.5 -36t100.5 -36q29 0 60.5 9t47 17.5t53 30t43.5 25.5l31 -86q-6 -4 -49 -42t-65.5 -53.5t-63.5 -34t-80 -18.5q-47 0 -110.5 36t-102.5 36q-35 0 -65.5 -11t-69.5 -30.5t-66 -30.5z" /> +<glyph unicode="¢" horiz-adv-x="1001" d="M164 545q27 156 64.5 262t77.5 165.5t98.5 90.5t108.5 37t128 2l33 196h123l-35 -206q158 -18 307 -48l-18 -110q-283 16 -465 16q-43 0 -68.5 -5t-57.5 -26.5t-54.5 -64.5t-46 -122t-46.5 -195q-39 -219 -1 -309.5t145 -90.5q84 0 204.5 5t200.5 12l80 6l-18 -115 q-164 -45 -336 -55l-27 -187h-123l27 185q-397 4 -301 557z" /> +<glyph unicode="£" horiz-adv-x="1220" d="M102 0l19 121l153 31l82 524h-147l14 92l154 35l37 231q14 94 39.5 168t54.5 123t72 83t78.5 51.5t93 26.5t97.5 11t105 2q51 0 150.5 -8t172.5 -16l73 -9l-19 -116h-383q-205 0 -277.5 -58.5t-105.5 -257.5l-37 -231l549 -35l-14 -92h-555l-82 -524h715l-25 -152h-1014z " /> +<glyph unicode="¥" horiz-adv-x="1230" d="M217 313l19 121h337l15 103h-336l20 120h326l-319 842h159l262 -682l543 682h182l-663 -842h385l-21 -120h-387l-14 -103h385l-18 -121h-381l-41 -313h-152l41 313h-342z" /> +<glyph unicode="¨" horiz-adv-x="933" d="M291 1192q6 43 42 72.5t79 29.5t67.5 -29.5t18.5 -72.5t-41 -74t-78 -31t-68.5 31t-19.5 74zM813 1192q6 43 42 72.5t79 29.5t67.5 -29.5t18.5 -72.5t-41 -74t-78 -31t-68.5 31t-19.5 74z" /> +<glyph unicode="©" horiz-adv-x="1648" d="M212 590q1 88 13 164q113 745 584 745h532q113 0 188 -54t107.5 -133t42 -187.5t3 -193.5t-20.5 -177q-25 -156 -68 -286t-107.5 -237.5t-156.5 -169t-205 -61.5h-532q-113 0 -191.5 58.5t-116.5 143.5t-55.5 192.5t-16.5 195.5zM341 532.5q5 -110.5 29.5 -199.5 t83 -145.5t142.5 -56.5h545q127 0 234.5 161t154.5 462q14 92 21.5 160.5t5 159.5t-21.5 150.5t-67.5 101.5t-126.5 42h-553q-154 0 -266.5 -135t-165.5 -479q-20 -111 -15 -221.5zM586 748q41 254 133 350t231 96q90 0 357 -49l-17 -107q-170 25 -360 25q-164 0 -215 -322 q-29 -129 -4.5 -219t118.5 -90q147 0 383 33l-16 -107q-213 -57 -387 -57q-131 0 -195.5 111t-27.5 336z" /> +<glyph unicode="«" horiz-adv-x="1138" d="M217 725l488 416l94 -111l-375 -319l268 -316l-110 -96zM606 725l488 416l94 -111l-375 -319l268 -316l-110 -96z" /> +<glyph unicode="­" horiz-adv-x="727" d="M123 518l24 152h644l-25 -152h-643z" /> +<glyph unicode="®" horiz-adv-x="1648" d="M212 590q1 88 13 164q113 745 584 745h532q113 0 188 -54t107.5 -133t42 -187.5t3 -193.5t-20.5 -177q-25 -156 -68 -286t-107.5 -237.5t-156.5 -169t-205 -61.5h-532q-113 0 -191.5 58.5t-116.5 143.5t-55.5 192.5t-16.5 195.5zM341 532.5q5 -110.5 29.5 -199.5 t83 -145.5t142.5 -56.5h545q127 0 234.5 161t154.5 462q14 92 21.5 160.5t5 159.5t-21.5 150.5t-67.5 101.5t-126.5 42h-553q-154 0 -266.5 -135t-165.5 -479q-20 -111 -15 -221.5zM578 313l139 875h362q45 0 86 -12.5t79 -40t57.5 -85t9.5 -137.5q-6 -61 -23.5 -106 t-34 -69.5t-47 -42t-45 -21.5t-49.5 -10.5t-39 -6.5l131 -344h-147l-131 349l-158 24l-59 -373h-131zM782 776h244q80 0 109.5 29t44.5 119q8 45 1 74.5t-29 41t-38 14.5t-43 3h-244z" /> +<glyph unicode="´" horiz-adv-x="495" d="M213 1087l262 273h195l-316 -273h-141z" /> +<glyph unicode="¸" horiz-adv-x="514" d="M45 -354l12 75l113 31q72 29 94 172h137q-25 -160 -78 -219t-173 -59h-105z" /> +<glyph unicode="»" horiz-adv-x="1132" d="M166 410l375 319l-269 315l111 97l365 -426l-488 -416zM563 410l375 319l-268 315l110 97l365 -426l-488 -416z" /> +<glyph unicode="À" horiz-adv-x="1351" d="M92 0l789 1499h151l289 -1499h-154l-80 418h-608l-221 -418h-166zM559 569h500l-129 717zM653 1905h178l218 -273h-142z" /> +<glyph unicode="Â" horiz-adv-x="1351" d="M92 0l789 1499h151l289 -1499h-154l-80 418h-608l-221 -418h-166zM559 569h500l-129 717zM678 1632l283 266h145l170 -266h-133l-117 170l-184 -170h-164z" /> +<glyph unicode="Æ" horiz-adv-x="1886" d="M61 0l807 1237q35 53 72 95t64.5 70t67.5 47t58.5 29.5t63.5 15.5t57.5 6t64.5 0t60 -1l649 -33l-18 -120h-655q-35 0 -57.5 -7.5t-35 -28t-16.5 -31.5t-10 -42l-68 -424l672 -20l-18 -121l-680 -21l-64 -403q-6 -39 1 -62.5t28.5 -32t37 -10.5t46.5 -2h629l-21 -116 l-635 -35q-113 -6 -185.5 58.5t-51.5 199.5l32 223h-411l-309 -471h-175zM641 623h342l115 688z" /> +<glyph unicode="Ç" horiz-adv-x="1183" d="M215.5 539.5q2.5 103.5 20.5 214.5q33 193 73.5 323.5t110 235t176 154t256.5 49.5q170 0 491 -62l-18 -121q-260 35 -491 31q-31 0 -42.5 -1t-47 -6t-54 -14.5t-54.5 -31t-57.5 -50t-53 -75.5t-53 -107.5t-43 -144.5t-38.5 -184q-27 -170 -18.5 -302.5t73 -216.5 t181.5 -92q145 -10 518 17l-17 -121q-174 -47 -510 -47q-113 0 -193.5 47t-124.5 121.5t-65.5 177t-19 206zM387 -354l12 75l113 31q70 18 94 172h137q-25 -160 -78 -219t-173 -59h-105z" /> +<glyph unicode="È" d="M201 252l155 981q45 281 301 266l643 -33l-18 -118h-649q-66 0 -91.5 -31t-33.5 -84l-66 -410l672 -20l-20 -121l-676 -20l-66 -410q-4 -39 2 -62.5t27.5 -31.5t37 -10.5t46.5 -2.5h629l-21 -116l-635 -35q-113 -6 -185 58.5t-52 199.5zM571 1894h179l217 -272h-142z" /> +<glyph unicode="É" d="M201 252l155 981q45 281 301 266l643 -33l-18 -118h-649q-66 0 -91.5 -31t-33.5 -84l-66 -410l672 -20l-20 -121l-676 -20l-66 -410q-4 -39 2 -62.5t27.5 -31.5t37 -10.5t46.5 -2.5h629l-21 -116l-635 -35q-113 -6 -185 58.5t-52 199.5zM815 1622l262 272h195l-316 -272 h-141z" /> +<glyph unicode="Ê" d="M201 252l155 981q45 281 301 266l643 -33l-18 -118h-649q-66 0 -91.5 -31t-33.5 -84l-66 -410l672 -20l-20 -121l-676 -20l-66 -410q-4 -39 2 -62.5t27.5 -31.5t37 -10.5t46.5 -2.5h629l-21 -116l-635 -35q-113 -6 -185 58.5t-52 199.5zM584 1622l282 268h146l170 -268 h-142l-106 164l-178 -164h-172z" /> +<glyph unicode="Ë" d="M201 252l155 981q45 281 301 266l643 -33l-18 -118h-649q-66 0 -91.5 -31t-33.5 -84l-66 -410l672 -20l-20 -121l-676 -20l-66 -410q-4 -39 2 -62.5t27.5 -31.5t37 -10.5t46.5 -2.5h629l-21 -116l-635 -35q-113 -6 -185 58.5t-52 199.5zM520 1726q6 43 42 73t79 30 t67.5 -30t18.5 -73t-41 -73.5t-78 -30.5t-68.5 30.5t-19.5 73.5zM1042.5 1726q6.5 43 42 73t78.5 30t67.5 -30t18.5 -73t-40.5 -73.5t-78 -30.5t-69 30.5t-19 73.5z" /> +<glyph unicode="Î" horiz-adv-x="460" d="M184 0l238 1499h151l-237 -1499h-152zM219 1632l283 266h145l170 -266h-133l-117 170l-184 -170h-164z" /> +<glyph unicode="Ï" horiz-adv-x="460" d="M172 1737q6 43 42 72.5t79 29.5t67.5 -29.5t18.5 -72.5t-41 -74t-78 -31t-68.5 31t-19.5 74zM184 0l238 1499h151l-237 -1499h-152zM694 1737q6 43 42 72.5t79 29.5t67.5 -29.5t18.5 -72.5t-41 -74t-78 -31t-68.5 31t-19.5 74z" /> +<glyph unicode="Ô" horiz-adv-x="1366" d="M211 483.5q2 112.5 25 255.5q33 207 81 349.5t102 225.5t137 127t162 56t200 12q82 0 144 -7t123.5 -27.5t102.5 -55.5t74 -92t46 -138t11 -193.5t-24 -256.5q-25 -164 -60 -284.5t-83 -202.5t-100 -134t-125 -80t-143.5 -37t-166.5 -9q-80 0 -137.5 5t-121 23.5 t-105.5 50t-77.5 88t-51 134.5t-13.5 190.5zM361 475q-1 -106 17.5 -172.5t69 -101.5t112 -46.5t161.5 -11.5q119 0 194.5 21.5t143 85t111.5 182.5t73 307q16 100 21.5 182.5t5.5 143.5t-13.5 107.5t-26.5 77t-43 52t-52.5 33t-66.5 16.5t-72.5 6t-82.5 1q-74 0 -111.5 -2 t-94 -13.5t-87 -35t-70.5 -67.5t-65.5 -110.5t-51.5 -164t-46 -226.5q-25 -158 -26 -264zM639 1632l283 266h145l170 -266h-133l-117 170l-184 -170h-164z" /> +<glyph unicode="Ù" horiz-adv-x="1343" d="M260 618l139 881h154l-139 -881q-18 -145 -15.5 -238t45.5 -146.5t102.5 -73t158.5 -19.5q205 0 312 105.5t148 371.5l140 881h153l-139 -881q-16 -106 -34.5 -178.5t-62.5 -166t-106.5 -148.5t-171 -95t-252.5 -40q-260 0 -371.5 149t-60.5 479zM625 1905h178l217 -273 h-141z" /> +<glyph unicode="Û" horiz-adv-x="1343" d="M260 618l139 881h154l-139 -881q-18 -145 -15.5 -238t45.5 -146.5t102.5 -73t158.5 -19.5q205 0 312 105.5t148 371.5l140 881h153l-139 -881q-16 -106 -34.5 -178.5t-62.5 -166t-106.5 -148.5t-171 -95t-252.5 -40q-260 0 -371.5 149t-60.5 479zM651 1632l283 266h145 l170 -266h-133l-117 170l-184 -170h-164z" /> +<glyph unicode="Ü" horiz-adv-x="1343" d="M260 618l139 881h154l-139 -881q-18 -145 -15.5 -238t45.5 -146.5t102.5 -73t158.5 -19.5q205 0 312 105.5t148 371.5l140 881h153l-139 -881q-16 -106 -34.5 -178.5t-62.5 -166t-106.5 -148.5t-171 -95t-252.5 -40q-260 0 -371.5 149t-60.5 479zM602 1737q6 43 42 72.5 t79 29.5t67.5 -29.5t18.5 -72.5t-41 -74t-78 -31t-68.5 31t-19.5 74zM1124 1737q6 43 42 72.5t79 29.5t67.5 -29.5t18.5 -72.5t-41 -74t-78 -31t-68.5 31t-19.5 74z" /> +<glyph unicode="à" horiz-adv-x="1107" d="M162 355q2 93 22 214q27 158 75 267.5t113.5 163t123 77t131.5 31.5q119 14 285.5 -21.5t240.5 -105.5l-143 -981h-109l-22 123q-209 -137 -381 -137q-63 0 -110.5 9t-92.5 31.5t-72.5 65.5t-45 106.5t-15.5 156.5zM330 514q-33 -209 6 -293t162 -84q106 0 186 22.5 t205 76.5l106 690q-219 59 -352 32q-51 -10 -78.5 -18t-69.5 -35.5t-68 -72t-52.5 -125t-44.5 -193.5zM414 1507h178l217 -272h-141z" /> +<glyph unicode="â" horiz-adv-x="1107" d="M162 355q2 93 22 214q27 158 75 267.5t113.5 163t123 77t131.5 31.5q119 14 285.5 -21.5t240.5 -105.5l-143 -981h-109l-22 123q-209 -137 -381 -137q-63 0 -110.5 9t-92.5 31.5t-72.5 65.5t-45 106.5t-15.5 156.5zM330 514q-33 -209 6 -293t162 -84q106 0 186 22.5 t205 76.5l106 690q-219 59 -352 32q-51 -10 -78.5 -18t-69.5 -35.5t-68 -72t-52.5 -125t-44.5 -193.5zM438 1235l283 266h145l170 -266h-133l-117 170l-184 -170h-164z" /> +<glyph unicode="æ" horiz-adv-x="1847" d="M81.5 323.5q-6.5 100.5 22.5 239.5q25 135 64 233.5t79 154t95 91t99 47t104 19.5q100 12 245.5 -13.5t235.5 -80.5q117 94 346 94q207 0 310.5 -71.5t80.5 -241.5q-16 -127 -97 -209t-185.5 -111t-217 -35t-190.5 3.5t-106 21.5q-33 -188 -1.5 -260t142.5 -74 q199 -16 512 29l-18 -115q-217 -59 -510 -59q-195 0 -256 143q-63 -51 -190.5 -97t-229.5 -46q-76 0 -131.5 15t-104.5 53t-70.5 103.5t-28 166zM248 219q35 -80 168 -82q109 -2 226.5 27t164.5 74q-14 123 24 331q45 240 109 344q-258 70 -379 45q-49 -10 -77.5 -18 t-69.5 -35.5t-66.5 -72t-53.5 -125t-46 -193.5q-35 -215 0 -295zM983 575q25 -2 63.5 -5t142 1t184.5 22.5t153.5 70t85.5 131.5q16 102 -40 131.5t-208 29.5q-109 0 -180.5 -24.5t-109.5 -87t-51 -101t-33 -131.5q-5 -25 -7 -37z" /> +<glyph unicode="ç" horiz-adv-x="1019" d="M186 545q33 186 79 304t108.5 170t118 67.5t141.5 15.5q158 0 457 -58l-17 -110q-283 16 -465 16q-43 0 -68.5 -5t-57 -26.5t-54 -64.5t-46.5 -122t-46 -195q-39 -219 -1 -309.5t144 -90.5q84 0 205 5t201 12l80 6l-19 -115q-223 -59 -471 -57q-172 2 -256 135t-33 422z M299 -354l12 75l113 31q72 29 94 172h137q-25 -160 -78 -219t-174 -59h-104z" /> +<glyph unicode="è" horiz-adv-x="1075" d="M182 569q27 143 56.5 228.5t87 163t155 112.5t242.5 35q207 0 310.5 -71.5t80.5 -241.5q-16 -127 -97 -209t-185.5 -111t-217 -35t-190.5 3.5t-107 21.5q-33 -188 -1 -260t143 -74q197 -16 510 29l-17 -115q-217 -59 -512 -59q-195 0 -254 141t-4 442zM334 575 q25 -2 63.5 -5t142 1t184.5 22.5t153.5 70t85.5 131.5q16 102 -40.5 131.5t-207.5 29.5q-109 0 -180.5 -24.5t-109.5 -87t-51.5 -101t-32.5 -131.5q-5 -25 -7 -37zM418 1503h178l217 -272h-141z" /> +<glyph unicode="é" horiz-adv-x="1075" d="M182 569q27 143 56.5 228.5t87 163t155 112.5t242.5 35q207 0 310.5 -71.5t80.5 -241.5q-16 -127 -97 -209t-185.5 -111t-217 -35t-190.5 3.5t-107 21.5q-33 -188 -1 -260t143 -74q197 -16 510 29l-17 -115q-217 -59 -512 -59q-195 0 -254 141t-4 442zM334 575 q25 -2 63.5 -5t142 1t184.5 22.5t153.5 70t85.5 131.5q16 102 -40.5 131.5t-207.5 29.5q-109 0 -180.5 -24.5t-109.5 -87t-51.5 -101t-32.5 -131.5q-5 -25 -7 -37zM672 1231l262 272h194l-315 -272h-141z" /> +<glyph unicode="ê" horiz-adv-x="1075" d="M182 569q27 143 56.5 228.5t87 163t155 112.5t242.5 35q207 0 310.5 -71.5t80.5 -241.5q-16 -127 -97 -209t-185.5 -111t-217 -35t-190.5 3.5t-107 21.5q-33 -188 -1 -260t143 -74q197 -16 510 29l-17 -115q-217 -59 -512 -59q-195 0 -254 141t-4 442zM334 575 q25 -2 63.5 -5t142 1t184.5 22.5t153.5 70t85.5 131.5q16 102 -40.5 131.5t-207.5 29.5q-109 0 -180.5 -24.5t-109.5 -87t-51.5 -101t-32.5 -131.5q-5 -25 -7 -37zM444 1231l283 266h145l170 -266h-133l-116 170l-185 -170h-164z" /> +<glyph unicode="ë" horiz-adv-x="1075" d="M182 569q27 143 56.5 228.5t87 163t155 112.5t242.5 35q207 0 310.5 -71.5t80.5 -241.5q-16 -127 -97 -209t-185.5 -111t-217 -35t-190.5 3.5t-107 21.5q-33 -188 -1 -260t143 -74q197 -16 510 29l-17 -115q-217 -59 -512 -59q-195 0 -254 141t-4 442zM334 575 q25 -2 63.5 -5t142 1t184.5 22.5t153.5 70t85.5 131.5q16 102 -40.5 131.5t-207.5 29.5q-109 0 -180.5 -24.5t-109.5 -87t-51.5 -101t-32.5 -131.5q-5 -25 -7 -37zM395 1335q6 43 42 73t79 30t67.5 -30t18.5 -73t-41 -73.5t-78 -30.5t-68.5 30.5t-19.5 73.5zM917.5 1335 q6.5 43 42 73t78.5 30t67.5 -30t18.5 -73t-40.5 -73.5t-77.5 -30.5t-69 30.5t-19.5 73.5z" /> +<glyph unicode="î" horiz-adv-x="399" d="M84 1221l283 266h145l170 -266h-133l-117 170l-184 -170h-164zM123 0l172 1087h151l-172 -1087h-151z" /> +<glyph unicode="ï" horiz-adv-x="399" d="M29 1325q6 43 41.5 72.5t79 29.5t68 -29.5t18 -72.5t-41 -73.5t-77.5 -30.5t-68.5 30.5t-19.5 73.5zM123 0l172 1087h151l-172 -1087h-151zM551 1325q6 43 42 72.5t79 29.5t67.5 -29.5t18.5 -72.5t-41 -73.5t-78 -30.5t-68.5 30.5t-19.5 73.5z" /> +<glyph unicode="ô" horiz-adv-x="1155" d="M182 528q51 330 172 450t391 120q256 0 350.5 -139.5t45.5 -430.5q-51 -307 -165 -422.5t-378 -115.5q-266 0 -363.5 123.5t-52.5 414.5zM317.5 377.5q-2.5 -64.5 12 -106.5t35 -68.5t59.5 -39.5t78 -17.5t98 -4.5q92 0 144.5 10.5t105.5 48.5t85 117.5t54 210.5 q43 254 -14 336t-246 82q-96 0 -151.5 -12t-106.5 -55t-81.5 -126.5t-55.5 -224.5q-14 -86 -16.5 -150.5zM467 1221l283 266h145l170 -266h-133l-117 170l-184 -170h-164z" /> +<glyph unicode="ù" horiz-adv-x="1112" d="M156 330l118 757h152l-119 -757q-16 -109 26 -153t128 -44q78 0 149.5 16.5t116.5 34t154 66.5l131 837h151l-172 -1087h-106l-25 127q-10 -6 -49 -26.5t-52.5 -26.5t-48 -23.5t-52 -24t-50.5 -17.5t-56.5 -15t-54 -8t-61.5 -4q-158 0 -231.5 98t-48.5 250zM416 1493h178 l217 -272h-141z" /> +<glyph unicode="û" horiz-adv-x="1112" d="M156 330l118 757h152l-119 -757q-16 -109 26 -153t128 -44q78 0 149.5 16.5t116.5 34t154 66.5l131 837h151l-172 -1087h-106l-25 127q-10 -6 -49 -26.5t-52.5 -26.5t-48 -23.5t-52 -24t-50.5 -17.5t-56.5 -15t-54 -8t-61.5 -4q-158 0 -231.5 98t-48.5 250zM440 1221 l283 266h145l170 -266h-133l-117 170l-184 -170h-164z" /> +<glyph unicode="ü" horiz-adv-x="1112" d="M156 330l118 757h152l-119 -757q-16 -109 26 -153t128 -44q78 0 149.5 16.5t116.5 34t154 66.5l131 837h151l-172 -1087h-106l-25 127q-10 -6 -49 -26.5t-52.5 -26.5t-48 -23.5t-52 -24t-50.5 -17.5t-56.5 -15t-54 -8t-61.5 -4q-158 0 -231.5 98t-48.5 250zM393 1325 q6 43 42 72.5t79 29.5t67.5 -29.5t18.5 -72.5t-41 -73.5t-78 -30.5t-68.5 30.5t-19.5 73.5zM915.5 1325q6.5 43 42 72.5t78.5 29.5t67.5 -29.5t18.5 -72.5t-40.5 -73.5t-77.5 -30.5t-69 30.5t-19.5 73.5z" /> +<glyph unicode="ÿ" horiz-adv-x="1124" d="M193 1087h157l131 -849q8 -45 43 -64.5t66 -17.5l31 2l395 770q37 70 51 164h125q33 -98 -18 -197l-453 -893q-135 -264 -248 -393t-272 -160v109q59 39 110 91t96.5 119.5t72 113.5t63.5 118q-27 0 -53.5 7t-63.5 27.5t-65.5 70t-38.5 120.5zM366.5 1315q6.5 43 42 72.5 t78.5 29.5t68 -29.5t18.5 -72.5t-41 -74t-77.5 -31t-69 31t-19.5 74zM889 1315q6 43 42 72.5t79 29.5t67.5 -29.5t18.5 -72.5t-41 -74t-78 -31t-68.5 31t-19.5 74z" /> +<glyph unicode="Œ" horiz-adv-x="2203" d="M188 483.5q2 112.5 25 255.5q33 207 81 349.5t102.5 225.5t137 127t161.5 56t200 12q164 0 270.5 -35.5t165.5 -132.5q61 168 271 158l643 -33l-19 -118h-649q-66 0 -91.5 -31t-33.5 -84l-63 -410l669 -20l-18 -121l-678 -20l-66 -410q-4 -39 2.5 -62.5t28 -31.5 t36.5 -10.5t46 -2.5h629l-21 -116l-633 -35q-84 -4 -149.5 31.5t-85.5 111.5q-80 -84 -188.5 -114.5t-266.5 -30.5q-80 0 -137 5t-120.5 23.5t-105.5 50t-78 88t-51.5 134.5t-13.5 190.5zM339 475q-1 -106 17.5 -172.5t68.5 -101.5t111.5 -46.5t161.5 -11.5q119 0 195 21.5 t143.5 85t111.5 182.5t73 307q16 100 21 182.5t5 143.5t-13 107.5t-26.5 77t-43 52t-52 33t-67 16.5t-73 6t-81.5 1q-74 0 -112 -2t-94 -13.5t-87 -35t-71 -67.5t-65.5 -110.5t-51 -164t-45.5 -226.5q-25 -158 -26 -264z" /> +<glyph unicode="œ" horiz-adv-x="1900" d="M166 535q51 330 172 446.5t391 116.5q285 0 371 -174q117 184 428 184q207 0 310.5 -71.5t80.5 -241.5q-16 -127 -97 -209t-185.5 -111t-217 -35t-190.5 3.5t-107 21.5q-33 -188 -1 -261t143 -73q307 0 510 29l-17 -115q-217 -59 -512 -59q-197 0 -258 149 q-117 -145 -405 -145q-266 0 -363.5 127t-52.5 418zM301 377.5q-2 -64.5 12.5 -106.5t35 -68.5t59 -39.5t77.5 -17.5t99 -4.5q92 0 144 10.5t105.5 48.5t85 117.5t54.5 210.5q43 254 -14.5 336t-245.5 82q-96 0 -151.5 -12t-107 -55t-82 -126.5t-55.5 -224.5 q-14 -86 -16 -150.5zM1139 575q25 -2 63.5 -5t142 1t184.5 22.5t153.5 70t84.5 131.5q16 102 -40 131.5t-207 29.5q-109 0 -180.5 -24.5t-109.5 -87t-51.5 -101t-32.5 -131.5q-5 -25 -7 -37z" /> +<glyph unicode="Ÿ" horiz-adv-x="1290" d="M219 1499h160l262 -780l545 780h180l-672 -967l-84 -532h-151l84 532zM465 1726q6 43 42 73t79 30t67.5 -30t18.5 -73t-41 -73.5t-78 -30.5t-68.5 30.5t-19.5 73.5zM987 1726q6 43 42 73t79 30t67.5 -30t18.5 -73t-41 -73.5t-78 -30.5t-68.5 30.5t-19.5 73.5z" /> +<glyph unicode="ˆ" horiz-adv-x="679" d="M135 1087l283 267h145l170 -267h-133l-117 170l-184 -170h-164z" /> +<glyph unicode="˚" horiz-adv-x="612" d="M287 1294q8 88 74.5 149.5t152.5 61.5t141.5 -61.5t47 -149.5t-74 -148.5t-151.5 -60.5t-142 60.5t-48 148.5zM383 1294q-2 -45 27.5 -77.5t77 -32.5t82 32.5t36.5 77.5q4 47 -25.5 80t-74.5 33t-82 -33t-41 -80z" /> +<glyph unicode="˜" horiz-adv-x="907" d="M274 1171q61 45 93 67t81.5 43.5t88.5 21.5q57 -4 118.5 -37t85.5 -33q33 -2 111 28.5t94 41.5l31 -86q-18 -12 -62.5 -42t-68 -44.5t-60 -27.5t-67.5 -13q-61 2 -118.5 35.5t-90.5 33.5q-41 0 -72.5 -10t-76 -32.5t-56.5 -29.5z" /> +<glyph unicode=" " horiz-adv-x="952" /> +<glyph unicode=" " horiz-adv-x="1905" /> +<glyph unicode=" " horiz-adv-x="952" /> +<glyph unicode=" " horiz-adv-x="1905" /> +<glyph unicode=" " horiz-adv-x="635" /> +<glyph unicode=" " horiz-adv-x="476" /> +<glyph unicode=" " horiz-adv-x="317" /> +<glyph unicode=" " horiz-adv-x="317" /> +<glyph unicode=" " horiz-adv-x="238" /> +<glyph unicode=" " horiz-adv-x="381" /> +<glyph unicode=" " horiz-adv-x="105" /> +<glyph unicode="‐" horiz-adv-x="727" d="M123 518l24 152h644l-25 -152h-643z" /> +<glyph unicode="‑" horiz-adv-x="727" d="M123 518l24 152h644l-25 -152h-643z" /> +<glyph unicode="‒" horiz-adv-x="727" d="M123 518l24 152h644l-25 -152h-643z" /> +<glyph unicode="–" horiz-adv-x="935" d="M123 512l24 154h969l-24 -154h-969z" /> +<glyph unicode="—" horiz-adv-x="1507" d="M121 516l24 154h1426l-25 -154h-1425z" /> +<glyph unicode="‘" horiz-adv-x="552" d="M344 1120l31 203q10 59 38.5 99t62.5 54.5t66.5 19.5t54.5 2l21 -3l-12 -72q-70 2 -82 -69l-8 -58h25q55 0 47 -55l-19 -121q-8 -61 -67 -61h-115q-55 0 -43 61z" /> +<glyph unicode="’" horiz-adv-x="552" d="M346 1061l12 74q68 -2 80 69l8 56h-24q-55 0 -47 57l20 121q10 61 66 61h114q57 0 46 -61l-33 -203q-10 -59 -39 -99t-61.5 -54.5t-65.5 -20.5t-54 -3z" /> +<glyph unicode="‚" horiz-adv-x="550" d="M143 -201l13 72q68 -2 80 72l8 55h-25q-55 0 -47 57l21 121q8 61 65 62h115q57 0 45 -62l-33 -203q-10 -59 -39 -99t-61.5 -54.5t-65.5 -20.5t-54 -3z" /> +<glyph unicode="“" horiz-adv-x="847" d="M330 1120l30 203q27 166 188 175l54 -3l-10 -72q-70 2 -82 -69l-8 -58h24q55 0 47 -55l-18 -121q-10 -61 -68 -61h-114q-55 0 -43 61zM657 1120l31 203q27 166 188 175l54 -3l-10 -72q-70 2 -82 -69l-9 -58h25q55 0 47 -55l-18 -121q-10 -61 -68 -61h-115q-55 0 -43 61z " /> +<glyph unicode="”" horiz-adv-x="849" d="M330 1061l12 74q68 -2 80 69l8 56h-24q-55 0 -48 57l21 121q10 61 65 61h115q57 0 45 -61l-33 -203q-10 -59 -38.5 -99t-61.5 -54.5t-65.5 -20.5t-54.5 -3zM657 1061l13 74q68 -2 80 69l8 56h-25q-55 0 -47 57l21 121q10 61 65 61h115q57 0 45 -61l-33 -203 q-10 -59 -39 -99t-61.5 -54.5t-65.5 -20.5t-54 -3z" /> +<glyph unicode="„" horiz-adv-x="847" d="M127 -199l12 72q68 -2 80 72l8 55h-24q-55 0 -47 57l20 121q8 61 66 62h114q57 0 45 -62l-32 -203q-10 -59 -39 -99t-61.5 -54.5t-65.5 -20.5t-55 -3zM455 -199l12 72q68 -2 80 72l8 55h-25q-55 0 -47 57l21 121q8 61 65 62h115q57 0 45 -62l-33 -203q-10 -59 -38.5 -99 t-61.5 -54.5t-65.5 -20.5t-54.5 -3z" /> +<glyph unicode="…" horiz-adv-x="1564" d="M297 47l18 117q10 51 58 51h108q53 0 43 -51l-18 -117q-8 -47 -57 -47h-109q-47 0 -43 47zM854 47l18 117q10 51 58 51h108q53 0 43 -51l-18 -117q-8 -47 -57 -47h-109q-47 0 -43 47zM1411 47l19 117q10 51 57 51h108q53 0 43 -51l-18 -117q-8 -47 -57 -47h-109 q-47 0 -43 47z" /> +<glyph unicode=" " horiz-adv-x="381" /> +<glyph unicode="‹" horiz-adv-x="616" d="M78 725l487 416l94 -111l-374 -319l268 -316l-111 -96z" /> +<glyph unicode="›" horiz-adv-x="737" d="M217 410l375 319l-268 315l110 97l365 -426l-488 -416z" /> +<glyph unicode=" " horiz-adv-x="476" /> +<glyph unicode="€" horiz-adv-x="1470" d="M143 522l15 96l184 15l33 207l-178 16l14 88l182 19q31 206 93 312q139 241 475 241q170 0 491 -62l-18 -121q-330 31 -498 31q-88 0 -154.5 -23.5t-104.5 -57.5t-66.5 -93.5t-40 -105.5t-25.5 -121l477 -15l-14 -94l-482 -14l-32 -207l475 -15l-15 -96q-31 0 -81 -1 t-156.5 -4t-176 -5t-67.5 -4q-37 -209 36 -289t232 -80q88 0 217 8.5t214 17.5l85 9l-18 -115q-264 -72 -520 -71q-39 0 -76 4t-85 17.5t-85 37t-76 62t-57 94t-28.5 131.5t10.5 174z" /> +<glyph unicode="™" horiz-adv-x="1304" d="M96 1368l21 131h530l-20 -131h-199l-92 -584h-131l92 584h-201zM614 784l168 715h119l117 -493l239 493h142l-49 -715h-131l30 414l-202 -414h-109l-96 416l-97 -416h-131z" /> +<glyph unicode="" horiz-adv-x="1085" d="M0 1085h1085v-1085h-1085v1085z" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Regular-Italic-webfont.ttf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Regular-Italic-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..6456d4bc8c6bd50a506e5597b7646833272c7d76 Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Regular-Italic-webfont.ttf differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Regular-Italic-webfont.woff b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Regular-Italic-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..e4ad3bb40cc2383e2a5c4df041007ed4b82ac36a Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Regular-Italic-webfont.woff differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Regular-webfont.eot b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Regular-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..67dd9bbbb536552c1a714a328a76e6e4d3ecaebc Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Regular-webfont.eot differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Regular-webfont.svg b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Regular-webfont.svg new file mode 100644 index 0000000000000000000000000000000000000000..9f172eb87b8845750061cb243b3b8ce504a1b17f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Regular-webfont.svg @@ -0,0 +1,187 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Copyright c 2011 Natanael Gama exondiscoveredcom with Reserved Font Name Exo +Designer : Natanael Gama +</metadata> +<defs> +<font id="ExoRegular" horiz-adv-x="1161" > +<font-face units-per-em="2048" ascent="1638" descent="-410" /> +<missing-glyph horiz-adv-x="512" /> +<glyph unicode=" " horiz-adv-x="512" /> +<glyph unicode="	" horiz-adv-x="512" /> +<glyph unicode=" " horiz-adv-x="512" /> +<glyph unicode="!" horiz-adv-x="550" d="M168 47v117q0 51 49 51h113q47 0 47 -51v-117q0 -47 -47 -47h-113q-49 0 -49 47zM180 1497h182l-14 -1096h-153z" /> +<glyph unicode=""" horiz-adv-x="778" d="M174 1362v137h154v-137l-21 -275h-110zM451 1362v137h153v-137l-20 -275h-111z" /> +<glyph unicode="#" horiz-adv-x="1406" d="M41 475l16 107h326l53 338h-325l18 106h324l75 473h107l-76 -473h340l74 473h106l-73 -473h362l-18 -106h-363l-53 -340h362l-16 -107h-362l-76 -473h-107l76 473l-340 2l-76 -475h-106l76 475h-324zM489 582l338 -2l54 340h-338z" /> +<glyph unicode="$" horiz-adv-x="1177" d="M113 1012v135q2 203 103 281.5t284 82.5v177h118v-183q76 -6 225.5 -23.5t166.5 -19.5v-119l-492 19q-59 2 -101 -4t-79 -27.5t-55.5 -67.5t-18.5 -116v-135q0 -201 213 -201h266q100 0 168 -29.5t99.5 -85t43 -111t11.5 -126.5v-140q0 -102 -38 -172.5t-104.5 -106.5 t-141 -48t-163.5 -8v-168h-118v178q-76 8 -204 24.5t-136 16.5v112q27 0 204 -6t285 -6q264 0 264 184v140q0 201 -170 200h-266q-106 0 -182 31t-114 85t-53 111.5t-15 125.5z" /> +<glyph unicode="%" horiz-adv-x="1955" d="M86 971v272q0 135 57.5 195.5t206.5 60.5h207q145 0 202.5 -60.5t57.5 -195.5v-272q0 -135 -57.5 -195.5t-206.5 -60.5h-207q-145 0 -202.5 60.5t-57.5 195.5zM219 971q0 -74 26.5 -98.5t100.5 -24.5h207q86 0 108.5 24.5t22.5 98.5v272q0 74 -26.5 98.5t-100.5 24.5 h-207q-84 0 -107.5 -24.5t-23.5 -98.5v-272zM465 0l897 1499h145l-897 -1499h-145zM1139 260v272q0 135 57 195.5t207 60.5h207q145 0 202.5 -60t57.5 -196v-272q0 -135 -57.5 -195.5t-206.5 -60.5h-207q-145 0 -202.5 60.5t-57.5 195.5zM1272 260q0 -74 26.5 -98.5 t100.5 -24.5h207q86 0 108.5 24.5t22.5 98.5v272q0 74 -27 98.5t-100 24.5h-207q-84 0 -107.5 -24.5t-23.5 -98.5v-272z" /> +<glyph unicode="&" horiz-adv-x="1304" d="M72.5 475.5q23.5 157.5 160.5 274.5l177 149l-129 174q-78 113 -67 204t72.5 150.5t137.5 67.5q264 25 545 -41v-102h-416q-92 0 -139 -21.5t-43 -79t71 -149.5l482 -651l233 243l47 -49l-104 -219l-84 -92l239 -334h-180l-168 227l-147 -137q-123 -117 -308.5 -96.5 t-291.5 174.5q-111 150 -87.5 307.5zM289 250q66 -84 170 -105.5t192 50.5l164 153l-319 426l-160 -133q-215 -176 -47 -391z" /> +<glyph unicode="'" horiz-adv-x="378" d="M113 1362v137h153v-137l-20 -275h-111z" /> +<glyph unicode="(" horiz-adv-x="686" d="M154 668q0 158 33.5 327.5t80.5 300.5t95.5 240t81.5 167l34 58h166q-14 -23 -36.5 -61.5t-81 -161.5t-103.5 -246t-82 -296t-37 -328q0 -488 261 -966q46 -83 79 -132h-166q-12 18 -34.5 52t-79 146.5t-99.5 233.5t-77.5 303.5t-34.5 362.5z" /> +<glyph unicode=")" horiz-adv-x="686" d="M41 -430q14 20 36.5 56t81 153t103.5 237.5t82 300t37 351.5q0 449 -267 963q-73 131 -73 130h166q12 -23 34.5 -61.5t79 -160.5t99.5 -245t77.5 -296t34.5 -330q0 -180 -33.5 -360.5t-81.5 -307.5t-95.5 -228.5t-80.5 -151.5l-34 -50h-166z" /> +<glyph unicode="*" horiz-adv-x="901" d="M102 1159v82l285 59l10 -151zM242 848l49 276l147 -34l-121 -267zM360 1468l80 33l154 -241l-139 -64zM426 975l84 127l225 -187l-43 -65zM514 1169l246 156l39 -72l-187 -198z" /> +<glyph unicode="+" horiz-adv-x="1056" d="M102 653v152h349v350h151v-350h352v-152h-352v-350h-151v350h-349z" /> +<glyph unicode="," horiz-adv-x="552" d="M174 51v111q0 55 51 55h105q49 0 49 -55v-185q0 -147 -138 -159l-57 2v65q63 -2 64 64v51h-23q-51 0 -51 51z" /> +<glyph unicode="-" horiz-adv-x="724" d="M41 518v152h643v-152h-643z" /> +<glyph unicode="." horiz-adv-x="557" d="M174 47v117q0 51 49 51h109q51 0 51 -51v-117q0 -47 -51 -47h-109q-49 0 -49 47z" /> +<glyph unicode="/" horiz-adv-x="819" d="M41 -147l575 1724h162l-575 -1724h-162z" /> +<glyph unicode="0" horiz-adv-x="1316" d="M143 332v835q0 160 99.5 246t253.5 86h335q176 0 259.5 -93t83.5 -239v-835q0 -332 -343 -332h-335q-154 0 -253.5 80t-99.5 252zM295 332q0 -94 58.5 -137t142.5 -43h335q190 0 191 180v835q0 180 -191 181h-335q-102 0 -151.5 -50.5t-49.5 -130.5v-835z" /> +<glyph unicode="1" horiz-adv-x="741" d="M82 1217v108l344 174h152v-1499h-152v1327z" /> +<glyph unicode="2" horiz-adv-x="1222" d="M82 1366v113q322 41 623 41q207 0 311 -127t104 -303q0 -113 -63.5 -242t-149.5 -232.5t-198.5 -207t-185 -159.5t-134.5 -97h731v-152h-1024v139q90 61 178 126t222.5 176.5t230.5 214t168 222t72 216.5q0 121 -65.5 196.5t-199.5 75.5h-620z" /> +<glyph unicode="3" horiz-adv-x="1216" d="M61 1352v94q84 31 196 44t220.5 14t235.5 -1q164 -2 257 -97t93 -241v-141q0 -225 -135 -279q135 -86 135 -294v-121q0 -344 -365 -344h-76h-78q-14 0 -69 1t-75.5 2t-66.5 4t-70.5 7t-61.5 10t-68 14.5t-59 18.5l2 96h610q47 0 81 6.5t68.5 24.5t53 58t18.5 102v121 q0 209 -209 217l-497 14v119l497 20q213 10 213 203v141q0 92 -62.5 139.5t-150.5 47.5h-637z" /> +<glyph unicode="4" horiz-adv-x="1234" d="M41 459l657 1040h181l-603 -956h582v424l76 153h76v-577h184v-121l-184 -39v-379h-152v379h-747z" /> +<glyph unicode="5" horiz-adv-x="1234" d="M156 41v113h622q96 0 140.5 55t44.5 135v225q0 37 -4.5 60.5t-19.5 59.5t-56 54.5t-105 18.5h-315q-68 0 -118 -39t-50 -115h-135l45 891h864v-151h-725l-25 -496q39 47 152 61q49 6 108.5 6.5t121 -3t77.5 -3.5q174 0 255 -91t81 -249v-233q0 -98 -33.5 -171t-88 -108.5 t-108 -52t-106.5 -16.5q-207 0 -317 8t-305 41z" /> +<glyph unicode="6" horiz-adv-x="1275" d="M133 786q0 375 103.5 550t248.5 175q334 0 619 -38v-113h-592q-66 0 -113 -55.5t-69.5 -145.5t-32.5 -168t-12 -157q367 43 538 43q190 0 260 -82t70 -224v-268q0 -305 -330 -305h-305q-90 0 -155.5 34t-120 117.5t-82 242t-27.5 394.5zM285 725q0 -63 2 -111.5t8 -122 t22.5 -128t40 -106.5t65.5 -79.5t95 -27.5h305q90 0 135.5 32.5t45.5 132.5v256q0 154 -181 154h-538z" /> +<glyph unicode="7" horiz-adv-x="1118" d="M61 1348v151h940l56 -98l-543 -1401h-180l528 1348h-801z" /> +<glyph unicode="8" horiz-adv-x="1298" d="M154 315v201q0 70 28.5 118t61 66.5t84.5 34.5q-90 31 -132 112t-42 175v133q0 195 94 274.5t266 79.5h299q168 0 250 -84t82 -270v-133q2 -25 -2 -53.5t-17.5 -69.5t-48.5 -72.5t-86 -42.5q76 -14 116 -100t38 -168v-201q0 -94 -33 -160.5t-87 -98t-105.5 -44 t-108.5 -12.5h-297q-100 0 -172 25.5t-107.5 59.5t-55 84t-22.5 79.5t-3 66.5zM305 309q0 -158 209 -157h297q74 0 128 40.5t54 116.5v215q0 82 -51 124t-125 42h-325q-80 0 -133.5 -39t-53.5 -127v-215zM305 1012q0 -92 58.5 -132t128.5 -40h325q176 0 176 172v139 q0 111 -44 159t-136 48h-299q-111 0 -160 -39t-49 -168v-139z" /> +<glyph unicode="9" horiz-adv-x="1275" d="M123 938v268q0 305 330 305h305q90 0 155.5 -33.5t119.5 -117.5t82 -243t28 -394q0 -375 -103.5 -550t-248.5 -175q-430 0 -619 39v113h592q66 0 113 55t69.5 145t32.5 168t12 158q-365 -43 -538 -43q-190 0 -260 82t-70 223zM272 938q0 -154 181 -154h538q0 63 -2 111.5 t-8 122.5t-22.5 128t-40 106.5t-65.5 80t-95 27.5h-305q-90 0 -135.5 -33t-45.5 -133v-256z" /> +<glyph unicode=":" horiz-adv-x="557" d="M174 47v117q0 51 49 51h109q51 0 51 -51v-117q0 -47 -51 -47h-109q-49 0 -49 47zM174 922v116q0 51 49 52h109q51 0 51 -52v-116q0 -47 -51 -48h-109q-49 1 -49 48z" /> +<glyph unicode=";" horiz-adv-x="561" d="M174 51v111q0 23 14.5 39t36.5 16h105q23 0 36 -15.5t13 -39.5v-185q0 -147 -138 -159l-57 2v65q63 -2 64 64v51h-23q-20 0 -35.5 16.5t-15.5 34.5zM178 924v116q0 51 49 52h109q51 0 51 -52v-116q0 -47 -51 -47h-109q-49 0 -49 47z" /> +<glyph unicode="<" horiz-adv-x="972" d="M102 643v164l768 332v-164l-565 -250l565 -270v-168z" /> +<glyph unicode="=" horiz-adv-x="956" d="M41 434v152h874v-152h-874zM41 862v152h874v-152h-874z" /> +<glyph unicode=">" horiz-adv-x="972" d="M102 287v168l566 270l-566 250v164l768 -332v-164z" /> +<glyph unicode="?" horiz-adv-x="1107" d="M41 1360v113q27 4 98.5 13t92 11t89 9t90 7t97.5 3.5t110 -3.5q217 0 312.5 -105t95.5 -273v-207q0 -199 -138 -278t-360 -44v-207h-153v332h291q86 4 148.5 53.5t62.5 143.5v207q0 119 -66 172t-215 53h-555zM348 47v117q0 51 49 51h113q47 0 47 -51v-117q0 -47 -47 -47 h-113q-49 0 -49 47z" /> +<glyph unicode="@" horiz-adv-x="1728" d="M133 0v713q0 35 3 64.5t21.5 83.5t51.5 91t102.5 67t165.5 30h441q129 0 221 -67t92 -220v-762h-115l-29 131l-20 -15q-20 -15 -56 -37t-80 -44.5t-100.5 -37.5t-107.5 -15q-113 -2 -188.5 66.5t-73.5 172.5v109q0 125 69.5 198.5t194.5 73.5h358q2 156 0 156 q0 82 -41 110.5t-131 28.5h-434q-90 0 -141 -37t-51 -147v-713q0 -211 192 -211h715q121 0 166 50t45 161v1049q0 115 -57.5 174t-153.5 59h-827v96q276 57 589 56h238q168 -4 265 -101.5t97 -283.5v-1049q0 -365 -362 -365h-715q-160 0 -252 94.5t-92 270.5zM612 233 q0 -35 38 -68.5t87 -31.5q55 0 127 20.5t104.5 36t114.5 54.5v252l-348 -33q-59 -6 -92 -44t-31 -93v-93z" /> +<glyph unicode="A" horiz-adv-x="1372" d="M92 0l551 1499h152l526 -1499h-180l-129 418h-598l-135 -418h-187zM469 569h489l-241 699z" /> +<glyph unicode="B" horiz-adv-x="1220" d="M164 0v1499h577q203 0 296 -118.5t93 -270.5q0 -272 -188 -332q78 -18 137.5 -109t59.5 -251q0 -84 -18.5 -154.5t-61.5 -132t-124 -96.5t-194 -35h-577zM317 152h424q246 0 246 270q0 123 -61.5 205t-184.5 82h-424v-557zM317 860h424q238 0 238 250q0 238 -238 238 h-424v-488z" /> +<glyph unicode="C" horiz-adv-x="1183" d="M113 754q0 389 105.5 575.5t393.5 186.5q223 0 500 -52v-121l-18 2q-18 1 -49 3t-71 4t-87 4t-93 4t-94.5 3t-87.5 1q-133 0 -205.5 -50t-107.5 -182.5t-35 -381.5q0 -610 348 -611l500 15v-121q-242 -45 -500 -45q-499 0 -499 766z" /> +<glyph unicode="D" horiz-adv-x="1345" d="M164 0v1499h557q133 0 232.5 -50t154.5 -126t90 -182.5t45 -199.5t10 -198q0 -106 -17 -207.5t-57 -199.5t-99.5 -172t-151.5 -119t-207 -45h-557zM315 158h406q129 0 217 83t126 211t38 293q0 317 -97.5 460t-283.5 143h-406v-1190z" /> +<glyph unicode="E" d="M164 252v981q0 141 72 205q68 61 173 61h13l647 -33v-118h-647q-49 0 -74.5 -19.5t-29 -39t-3.5 -56.5v-410l672 -20v-121l-672 -20v-410q0 -51 22.5 -75.5t43 -28t61.5 -3.5h627v-116l-627 -35q-15 -1 -30 -1q-248 0 -248 259z" /> +<glyph unicode="F" d="M164 0v1233q0 141 72 205q68 61 173 61h13l647 -33v-118h-647q-49 0 -74.5 -19.5t-29 -39t-3.5 -56.5v-410l672 -20v-121l-672 -20v-662h-151z" /> +<glyph unicode="G" horiz-adv-x="1257" d="M113 758q0 170 18.5 294t67.5 235.5t147 170t246 58.5q80 0 247 -17.5t273 -38.5v-121q-2 0 -38 2t-92 6.5t-121.5 8.5t-138.5 6t-130 2q-195 0 -261.5 -140.5t-66.5 -469.5q0 -342 74 -477.5t262 -137.5q70 0 168 23.5t162 47.5l63 23v410h-344v102q186 51 357 52 q66 0 139 -6v-791h-115l-33 100q-199 -110 -393 -110h-4h-12q-115 0 -201 38q-90 40 -142 104.5t-83 167.5t-40 209t-9 249z" /> +<glyph unicode="H" horiz-adv-x="1306" d="M164 0v1499h151v-698h717v698h152v-1499h-152v649h-717v-649h-151z" /> +<glyph unicode="I" horiz-adv-x="438" d="M164 0v1499h151v-1499h-151z" /> +<glyph unicode="J" horiz-adv-x="735" d="M72 43l8 111q131 -32 205 -32q27 0 46 4q128 29 130 212v1161h151v-1161q0 -233 -106 -301q-79 -49 -208 -49h-10q-136 2 -216 55z" /> +<glyph unicode="K" horiz-adv-x="1210" d="M164 0v1499h151v-672h168l471 672h185l-516 -747l516 -752h-185l-471 676h-166v-676h-153z" /> +<glyph unicode="L" horiz-adv-x="1140" d="M164 258v1241h151v-1241q0 -39 10.5 -62.5t33 -31.5t38 -10t45.5 -2h627v-152h-627q-59 0 -102 8t-86 33t-66.5 80t-23.5 137z" /> +<glyph unicode="M" horiz-adv-x="1640" d="M113 0l98 1499h209l399 -1247l387 1247h207l115 -1499h-152l-92 1225l-385 -1225h-156l-397 1225l-82 -1225h-151z" /> +<glyph unicode="N" horiz-adv-x="1392" d="M164 0v1499h155l799 -1216v1216h152v-1499h-152l-801 1217v-1217h-153z" /> +<glyph unicode="O" horiz-adv-x="1384" d="M133 739q0 172 18.5 300t57.5 212t85 136.5t117.5 79t139 34.5t164.5 8q84 0 144.5 -6t125 -24.5t107.5 -51t84 -90t64.5 -138.5t37.5 -195.5t14 -264.5q0 -195 -25.5 -331t-69.5 -217.5t-121 -126t-158.5 -58.5t-202.5 -14q-102 0 -172 8t-141.5 33.5t-116.5 76 t-82 132.5t-53.5 205.5t-16.5 291.5zM285 739q0 -199 19.5 -315.5t75.5 -180t130 -82t205 -18.5q102 0 167.5 13.5t119 49.5t82 103.5t43 171t14.5 258.5q0 102 -6.5 183.5t-14.5 142.5t-28.5 107.5t-37 77t-49 52t-56 33t-69.5 16.5t-77 6t-88.5 1t-87 -1t-75.5 -6 t-70.5 -16.5t-57.5 -33t-50.5 -52t-38 -77t-29.5 -107.5t-15 -143.5t-6 -182.5z" /> +<glyph unicode="P" horiz-adv-x="1189" d="M123 0v1499h616q358 0 359 -434q0 -123 -23.5 -211t-57.5 -134t-87 -71.5t-94 -32t-97 -6.5q-59 0 -257.5 18.5t-207.5 22.5v-651h-151zM274 762h465q98 0 151.5 59.5t53.5 243.5q-2 94 -22.5 155.5t-56.5 86t-62.5 32t-63.5 7.5h-465v-584z" /> +<glyph unicode="Q" horiz-adv-x="1384" d="M133 739q0 207 27.5 350.5t73 225.5t124 126t156.5 56t197 12q100 0 167.5 -8t139.5 -34.5t118 -79t83.5 -136.5t55 -212t17.5 -300q0 -195 -26.5 -331t-70.5 -217.5t-122 -126t-160 -58.5t-202 -14q-102 0 -172 8t-141.5 33.5t-114.5 76t-80 132.5t-53.5 205.5 t-16.5 291.5zM285 739q0 -199 19.5 -315.5t73.5 -180t128 -82t205 -18.5q129 0 203.5 21.5t130 86t76 180.5t20.5 308q0 102 -6.5 183.5t-15.5 142.5t-28.5 107.5t-37 77t-50 52t-56 33t-71 16.5t-78 6t-88 1t-87 -1t-75.5 -6t-69.5 -16.5t-56.5 -33t-49.5 -52t-37 -77 t-29.5 -107.5t-15 -143.5t-6 -182.5zM649 -68h107q90 -63 175 -70q14 -1 28 -1q71 0 141 30v-163q-67 -19 -142 -19q-17 0 -34 1q-93 5 -176 65.5t-99 156.5z" /> +<glyph unicode="R" horiz-adv-x="1214" d="M123 0v1499h639q346 0 346 -450q0 -393 -260 -431l315 -618h-164l-315 612l-410 29v-641h-151zM274 776h488q37 0 57.5 2t50 15.5t45 41t27.5 82t12 132.5q0 180 -53 238.5t-139 58.5h-488v-570z" /> +<glyph unicode="S" horiz-adv-x="1196" d="M133 1012v135q0 207 106.5 285.5t299.5 78.5q139 0 512 -49v-123l-512 21q-17 1 -33 1q-104 0 -158 -35q-62 -40 -63 -179v-135q0 -127 50 -164t159 -37h290q319 0 320 -352v-140q0 -104 -35 -173.5t-98.5 -103.5t-129 -46t-151.5 -12q-72 0 -253 18t-259 33v123 q225 -23 512 -23q262 0 262 184v140q0 96 -36.5 148t-131.5 52h-286q-117 0 -194 29t-111.5 84t-47 109.5t-12.5 130.5z" /> +<glyph unicode="T" horiz-adv-x="1183" d="M92 1348v151h1041v-151h-451v-1348h-152v1348h-438z" /> +<glyph unicode="U" horiz-adv-x="1386" d="M164 655v844h151v-844q0 -186 23.5 -295.5t87 -154.5t115 -54.5t162.5 -9.5h16q43 0 67.5 1t63.5 5.5t61.5 13.5t53 26.5t49 43t39 64.5t32 89t18.5 118.5t7 152.5v844h154v-844q0 -190 -36 -322t-82 -197.5t-131 -100.5t-140.5 -40t-155.5 -5h-19q-55 0 -82.5 1t-78 4 t-77 12t-68.5 24.5t-65.5 41t-54 60.5t-47 85t-33 112.5t-23.5 144.5t-7 180z" /> +<glyph unicode="V" horiz-adv-x="1372" d="M92 1499h166l438 -1257l459 1257h166l-551 -1499h-152z" /> +<glyph unicode="W" horiz-adv-x="1970" d="M92 1499h166l436 -1235l371 1235h172l-139 -479l272 -768l383 1247h166l-469 -1499h-152l-280 766l-248 -766h-152z" /> +<glyph unicode="X" horiz-adv-x="1220" d="M92 1499h166l369 -629l377 629h165l-442 -739l432 -760h-166l-366 631l-363 -631h-166l428 760z" /> +<glyph unicode="Y" horiz-adv-x="1290" d="M92 1499h166l387 -786l428 786h166l-518 -967v-532h-152v532z" /> +<glyph unicode="Z" horiz-adv-x="1153" d="M72 0v152l811 1196h-811v151h1009v-151l-811 -1196h811v-152h-1009z" /> +<glyph unicode="[" horiz-adv-x="657" d="M174 -78v1450q0 57 9.5 108.5t36 112t86 96t147.5 35.5h163v-151h-163q-57 0 -92 -54.5t-35 -146.5v-1450q0 -92 34.5 -146.5t92.5 -54.5h163v-151h-163q-88 0 -147.5 36t-86 96t-36 111.5t-9.5 108.5z" /> +<glyph unicode="\" horiz-adv-x="819" d="M41 1577h162l575 -1724h-162z" /> +<glyph unicode="]" horiz-adv-x="657" d="M41 -279h164q57 0 92 54.5t35 146.5v1450q0 92 -35 146.5t-92 54.5h-164v151h164q88 0 147.5 -35.5t86 -96t35.5 -111.5t9 -109v-1450q0 -57 -9 -108.5t-35.5 -111.5t-86 -96t-147.5 -36h-164v151z" /> +<glyph unicode="^" horiz-adv-x="802" d="M102 1087l240 267h145l213 -267h-145l-143 146l-162 -146h-148z" /> +<glyph unicode="_" horiz-adv-x="1380" d="M41 -2v152h1298v-152h-1298z" /> +<glyph unicode="`" horiz-adv-x="495" d="M41 1360h195l219 -273h-142z" /> +<glyph unicode="a" horiz-adv-x="1062" d="M82 258v125q0 125 72.5 198.5t199.5 73.5q228 -1 341.5 -1t113.5 1q1 68 1 102.5t-1 35.5q0 168 -168 168q-184 0 -524 -25v111q207 57 530 61h7q132 0 218 -77q88 -79 89 -238v-793h-113l-39 131l-30 -14q-30 -14 -79 -36t-106 -43.5t-122.5 -35.5t-117.5 -14 q-117 0 -194.5 71.5t-77.5 198.5zM233 268q0 -129 121 -129q163 0 455 105v293l-455 -33q-61 -6 -91 -43t-30 -90v-103z" /> +<glyph unicode="b" horiz-adv-x="1134" d="M123 0v1608h147v-586q92 37 210 59.5t194 22.5q111 0 185.5 -47t110.5 -134t49 -176.5t13 -207.5q0 -104 -15.5 -193.5t-52 -174.5t-110.5 -134t-180 -49q-94 0 -222 48t-180 85l-41 -121h-108zM272 233q231 -94 402 -94q207 0 207 400q0 238 -50.5 325.5t-156.5 87.5 q-197 0 -402 -53v-666z" /> +<glyph unicode="c" horiz-adv-x="1024" d="M102 545q0 172 26 285.5t77 170t110.5 77t145.5 20.5q180 0 467 -54v-110q-285 12 -467 12q-55 0 -86 -10t-62.5 -48t-45 -124t-13.5 -227q0 -229 46 -312.5t161 -83.5q84 0 203.5 5.5t198.5 11.5l79 6v-115q-197 -55 -481 -59q-84 0 -142.5 20.5t-110.5 76.5t-79 171 t-27 287z" /> +<glyph unicode="d" horiz-adv-x="1134" d="M102 539q0 119 13.5 208t49.5 176t110.5 134t185.5 47q76 0 192.5 -22.5t208.5 -59.5v586h150v-1608h-109l-41 121q-51 -37 -179 -85t-222 -48q-106 0 -180 49t-111 134t-52.5 174.5t-15.5 193.5zM254 539q0 -399 207 -400q170 0 401 94v666q-205 53 -401 53 q-106 0 -156.5 -87.5t-50.5 -325.5z" /> +<glyph unicode="e" horiz-adv-x="1075" d="M102 549q0 180 25 289.5t89.5 166t143 74t218.5 17.5q113 0 176 -10.5t124.5 -47.5t88 -116.5t26.5 -210.5q0 -250 -280 -250h-459q0 -190 43 -255t164 -65q373 0 512 21v-115q-203 -57 -512 -57q-207 0 -283 118.5t-76 440.5zM254 610h459q129 0 129 101 q0 158 -46 195.5t-216 37.5q-72 0 -106 -2t-80 -11t-65.5 -29.5t-41 -57.5t-27.5 -94.5t-6 -139.5z" /> +<glyph unicode="f" horiz-adv-x="819" d="M41 936v117l199 34v203q0 45 2 77t16 82t39 82t75 55.5t120 23.5q127 0 286 -49v-101l-252 2q-47 0 -75.5 -11t-41 -39t-15.5 -52.5t-3 -69.5v-203h303v-151h-303v-936h-151v936h-199z" /> +<glyph unicode="g" horiz-adv-x="1134" d="M92 -63l82 133q-76 53 -76 166q0 57 31 107t90 63q-119 76 -119 299q0 190 93.5 288.5t261.5 98.5h639v-115l-166 -37q2 -4 14 -25.5t18.5 -35t14.5 -39t12 -59t4 -76.5q0 -57 -13 -117t-46 -128.5t-104.5 -111.5t-174.5 -43h-319q-84 0 -84 -61q0 -70 84 -70h436 q125 0 194.5 -77t69.5 -206v-129q0 -55 -11 -102t-41 -99.5t-95.5 -83t-159.5 -30.5h-307q-150 0 -239 80t-89 235v175zM244 39v-277q0 -163 174 -163h2h307q156 0 156 163v119q0 78 -28 110t-112 32h-407q-29 0 -51.5 4t-31.5 8zM252 705q0 -43 8 -82t26.5 -79t58.5 -63.5 t95 -23.5h201q111 0 157 77q42 72 42 156v15q-6 119 -47 177t-154 58h-184h-2q-201 0 -201 -235z" /> +<glyph unicode="h" horiz-adv-x="1114" d="M123 0v1606h151v-645q6 2 45 25.5t48.5 27.5t44 23.5t49 23.5t47.5 16.5t54.5 16.5t52 8t61.5 4q156 0 246 -102.5t90 -245.5v-758h-152v758q0 98 -50 147t-134 49q-78 0 -147.5 -16t-111.5 -33.5t-143 -66.5v-838h-151z" /> +<glyph unicode="i" horiz-adv-x="403" d="M102 1264v110q0 51 50 51h102q47 0 47 -51v-110q0 -47 -47 -47h-102q-50 0 -50 47zM123 0v1087h151v-1087h-151z" /> +<glyph unicode="j" horiz-adv-x="444" d="M123 1264v110q0 51 49 51h102q47 0 48 -51v-110q0 -47 -48 -47h-102q-49 0 -49 47zM145 -553v1640h152v-1095v-46q0 -326 -53 -499h-99z" /> +<glyph unicode="k" horiz-adv-x="1024" d="M123 0v1602h151v-902h82l416 387h211l-483 -462l483 -625h-188l-439 549h-82v-549h-151z" /> +<glyph unicode="l" horiz-adv-x="614" d="M123 387v1217h151v-1217q0 -125 29 -173t88 -62q168 -43 182 -43v-109h-180q-270 0 -270 387z" /> +<glyph unicode="m" horiz-adv-x="1839" d="M123 0v1087h106l45 -131q12 8 50 30t53.5 31t49.5 25.5t55.5 23.5t52 17.5t62.5 13.5t65 3q102 0 184 -43t117 -117q193 160 438 160q143 0 239.5 -98.5t96.5 -251.5v-750h-152v750q0 90 -52 144t-132 54q-123 0 -212 -24.5t-190 -89.5v-80v-754h-151v750q0 90 -52.5 144 t-133.5 54q-76 0 -142.5 -16.5t-103.5 -31.5t-142 -66v-834h-151z" /> +<glyph unicode="n" horiz-adv-x="1114" d="M123 0v1087h106l45 -126q6 2 45 25.5t48.5 27.5t44 23.5t49 23.5t47.5 16.5t54.5 16.5t52 8t61.5 4q156 0 246 -102.5t90 -245.5v-758h-152v758q0 96 -51 146t-133 50q-78 0 -147.5 -16t-111.5 -33.5t-143 -66.5v-838h-151z" /> +<glyph unicode="o" horiz-adv-x="1163" d="M102 528q0 330 104.5 450t375.5 120q274 0 376.5 -122t102.5 -448q0 -305 -102.5 -421.5t-376.5 -116.5q-270 0 -375 120.5t-105 417.5zM254 528q0 -133 19.5 -212.5t67.5 -116.5t98 -47.5t143 -10.5q94 0 146 10.5t98 48.5t64.5 116.5t18.5 211.5q0 145 -15 229.5 t-60.5 126.5t-97.5 52t-154 10q-78 0 -123 -6t-90 -28.5t-66.5 -67.5t-35 -122t-13.5 -194z" /> +<glyph unicode="p" horiz-adv-x="1134" d="M123 -553v1640h108l39 -120q51 37 180.5 85t223.5 48q106 0 180 -49.5t110.5 -134.5t52 -174t15.5 -193q0 -119 -13 -208t-49 -176t-111 -134t-185 -47q-76 0 -194 22.5t-210 59.5v-619h-147zM270 188q205 -53 404 -53q106 0 156.5 88t50.5 326q0 399 -207 399 q-172 0 -404 -94v-666z" /> +<glyph unicode="q" horiz-adv-x="1136" d="M102 549q0 264 94.5 407.5t282.5 143.5q96 0 204 -9.5t207 -22.5t124 -15v-1606h-152v612q-195 -79 -378 -79h-5q-115 0 -190.5 41.5t-115.5 122.5t-55.5 177.5t-15.5 227.5zM254 549q0 -210 29 -288q49 -130 196 -130q115 0 185.5 9.5t197.5 41.5v766h-383 q-225 0 -225 -399z" /> +<glyph unicode="r" horiz-adv-x="872" d="M123 0v1087h106l45 -137q10 6 52.5 31t55.5 32t50 25.5t58.5 25.5t55.5 17.5t66.5 14.5t67.5 4q119 0 151 -17v-149q-49 12 -151 12q-78 0 -148.5 -16.5t-112.5 -34.5t-145 -68v-827h-151z" /> +<glyph unicode="s" horiz-adv-x="1036" d="M82 733v94q0 133 65.5 202t217.5 69q195 0 534 -33v-117h-534q-47 0 -76 -8t-40 -27.5t-13.5 -36t-2.5 -49.5v-94q0 -41 9.5 -65.5t30 -34.5t39 -13.5t53.5 -3.5h323q129 0 197.5 -72.5t68.5 -191.5v-100q0 -152 -73.5 -207t-192.5 -55q-193 0 -561 39v112h561 q0 2 11.5 0t28.5 4.5t33.5 14.5t29 32.5t12.5 59.5v100q0 57 -25.5 85t-89.5 28h-323q-150 0 -216.5 57t-66.5 211z" /> +<glyph unicode="t" horiz-adv-x="774" d="M41 938v115l203 37l37 303h114v-303h318v-152h-318v-549q0 -125 29 -173t88 -62q168 -43 182 -43v-109h-180q-270 0 -270 387v549h-203z" /> +<glyph unicode="u" horiz-adv-x="1114" d="M102 330v757h152v-757q0 -96 51 -146.5t133 -50.5q78 0 147.5 16.5t111.5 34t143 66.5v837h151v-1087h-106l-45 127q-6 -2 -45 -25.5t-48.5 -27.5t-44 -23.5t-49 -23.5t-47.5 -16.5t-54.5 -16.5t-52 -8t-61.5 -4q-156 0 -246 102.5t-90 245.5z" /> +<glyph unicode="v" horiz-adv-x="1097" d="M41 1087h166l340 -864l344 864h166l-436 -1087h-152z" /> +<glyph unicode="w" horiz-adv-x="1640" d="M41 1087h166l321 -864l283 864h164l-111 -348l238 -516l332 864h165l-415 -1087h-152l-241 532l-179 -532h-163z" /> +<glyph unicode="x" horiz-adv-x="1073" d="M49 0l393 545l-393 542h189l294 -417l304 417h188l-397 -548l381 -539h-172l-299 414l-299 -414h-189z" /> +<glyph unicode="y" horiz-adv-x="1134" d="M43 1087h166l264 -849q16 -51 50 -72t60 -14l25 6l312 929h170l-480 -1431l-153 -209h-95l193 553q-176 0 -246 225z" /> +<glyph unicode="z" horiz-adv-x="933" d="M61 936v151h811v-151l-581 -782h581v-152h-780v152l592 782h-623z" /> +<glyph unicode="{" horiz-adv-x="655" d="M41 614v138q4 0 26.5 2t32 3t30 4t29.5 8t24.5 13.5t22.5 18.5t13 25.5t6 33.5v483q0 162 98.5 271.5t290.5 109.5v-151q-111 0 -174 -50t-63 -180v-483q0 -72 -48 -117t-126 -59q74 -10 123 -58t49 -112v-592q0 -98 65.5 -152.5t173.5 -48.5v-151q-109 0 -188.5 31.5 t-121.5 85t-61.5 112t-19.5 123.5v584q0 59 -56 86.5t-126 21.5z" /> +<glyph unicode="|" horiz-adv-x="501" d="M176 -147v1724h152v-1724h-152z" /> +<glyph unicode="}" horiz-adv-x="655" d="M41 -279q109 -6 174.5 48.5t65.5 152.5v592q0 63 49 111.5t123 58.5q-78 14 -126 59t-48 117v483q0 129 -63.5 179.5t-174.5 50.5v151q193 0 291 -109.5t98 -271.5v-483q0 -18 6 -33.5t13.5 -25.5t22.5 -18.5t24.5 -13.5t30 -8t29.5 -4t31.5 -3t26.5 -2v-138 q-70 6 -126 -21.5t-56 -86.5v-584q0 -66 -19.5 -124t-61.5 -111.5t-121.5 -85t-188.5 -31.5v151z" /> +<glyph unicode="~" horiz-adv-x="897" d="M102 1171q16 12 55.5 48t57.5 49.5t53 28t74 14.5q47 0 112.5 -36t104.5 -36q23 0 44.5 5t43 15.5t35.5 18.5t36.5 22.5t31.5 20.5l45 -86q-4 -4 -43 -42t-57.5 -53.5t-57.5 -34t-78 -18.5q-47 0 -115.5 36t-107.5 36q-35 0 -64.5 -11t-65.5 -30.5t-61 -30.5z" /> +<glyph unicode="¢" horiz-adv-x="1003" d="M82 545q0 178 26.5 293.5t82 173t120 76t162.5 14.5v196h123v-206q154 -18 311 -48v-110q-285 16 -467 16q-43 0 -69.5 -6t-55 -28.5t-45 -65.5t-27 -122t-10.5 -191q0 -229 47.5 -314.5t159.5 -85.5q84 0 204 5t199 12l79 6v-115q-150 -43 -326 -53v-189h-123v183 q-98 -2 -161.5 16t-120 74.5t-83 172.5t-26.5 296z" /> +<glyph unicode="£" horiz-adv-x="1220" d="M102 0v121l148 31v524h-148v92l148 35v231q0 92 12 164t32.5 120t55.5 83t70 53.5t88 28.5t97 13t112 3l401 -33v-116h-397q-76 0 -112 -2t-81 -11.5t-62 -28t-35.5 -55t-24 -89t-5.5 -130.5v-231l555 -35v-92h-555v-524h715v-152h-1014z" /> +<glyph unicode="¥" horiz-adv-x="1228" d="M41 1499h166l387 -692l422 692h172l-516 -842h370v-120h-372v-103h372v-121h-372v-313h-152v313h-350v121h350v103h-350v120h348z" /> +<glyph unicode="¨" horiz-adv-x="933" d="M102 1192q0 43 31 72.5t74 29.5t72.5 -29.5t29.5 -72.5t-29.5 -74t-72.5 -31t-74 31t-31 74zM625 1192q0 43 30.5 72.5t73.5 29.5t72.5 -29.5t29.5 -72.5t-29.5 -74t-72.5 -31t-73.5 31t-30.5 74z" /> +<glyph unicode="©" horiz-adv-x="1660" d="M113 754q0 745 465 745h552q84 0 150 -28.5t109 -72.5t74.5 -112.5t47 -130t24.5 -143.5t11 -135.5t2 -122.5q0 -156 -22.5 -286t-69.5 -237.5t-130 -169t-196 -61.5h-552q-109 0 -193 53t-134 133t-83 184.5t-44 198t-11 185.5zM244 754q0 -246 86 -433.5t248 -189.5 h552q127 2 207 162t80 461q0 90 -4 159.5t-20.5 160.5t-45 150.5t-84 101.5t-133.5 42h-552q-156 0 -245 -135t-89 -479zM473 748q0 233 80 339.5t215 106.5q90 0 365 -49v-107q-172 25 -365 25q-164 0 -164 -322q0 -147 35 -228t129 -81q147 0 377 33v-107 q-205 -57 -377 -57q-137 0 -216 97.5t-79 349.5z" /> +<glyph unicode="«" horiz-adv-x="1124" d="M102 725l422 416l107 -107l-318 -309l328 -319l-106 -107zM483 725l422 416l107 -107l-318 -309l328 -319l-107 -107z" /> +<glyph unicode="­" horiz-adv-x="724" d="M41 518v152h643v-152h-643z" /> +<glyph unicode="®" horiz-adv-x="1660" d="M113 754q0 745 465 745h552q84 0 150 -28.5t109 -72.5t74.5 -112.5t47 -130t24.5 -143.5t11 -135.5t2 -122.5q0 -156 -22.5 -286t-69.5 -237.5t-130 -169t-196 -61.5h-552q-109 0 -193 53t-134 133t-83 184.5t-44 198t-11 185.5zM244 754q0 -246 86 -433.5t248 -189.5 h552q127 2 207 162t80 461q0 90 -4 159.5t-20.5 160.5t-45 150.5t-84 101.5t-133.5 42h-552q-156 0 -245 -135t-89 -479zM535 313v875h362q274 0 274 -262q0 -84 -18 -139.5t-57 -81t-58.5 -32.5t-62.5 -16l186 -344h-147l-187 349l-161 24v-373h-131zM666 776h243 q80 0 105.5 29t25.5 119q0 45 -12 74.5t-34.5 41t-40 14.5t-44.5 3h-243v-281z" /> +<glyph unicode="´" horiz-adv-x="495" d="M41 1087l219 273h195l-273 -273h-141z" /> +<glyph unicode="¸" horiz-adv-x="516" d="M102 -279l109 31q66 29 65 172h138q0 -160 -43 -219t-164 -59h-105v75z" /> +<glyph unicode="»" horiz-adv-x="1124" d="M102 406l328 319l-317 309l106 107l422 -416l-432 -426zM483 406l328 319l-317 309l106 107l422 -416l-432 -426z" /> +<glyph unicode="À" horiz-adv-x="1372" d="M92 0l551 1499h152l526 -1499h-180l-129 418h-598l-135 -418h-187zM377 1905h192l222 -273h-144zM469 569h489l-241 699z" /> +<glyph unicode="Â" horiz-adv-x="1372" d="M92 0l551 1499h152l526 -1499h-180l-129 418h-598l-135 -418h-187zM420 1632l239 266h146l213 -266h-146l-145 146l-160 -146h-147zM469 569h489l-241 699z" /> +<glyph unicode="Æ" horiz-adv-x="1886" d="M61 0l611 1237q25 49 48 87t51 64.5t48.5 47t52 32t50 19.5t54.5 10t51 3t56 0t56 -1l655 -33v-120h-655q-35 0 -56.5 -7.5t-31 -28t-11.5 -31.5t-4 -42v-424l676 -20v-121l-676 -21v-403q0 -20 3 -35.5t7.5 -26t14.5 -17.5t15 -10t20.5 -5t20.5 -2h23h23l629 -2v-125 l-629 -35q-279 -16 -278 258v217h-430l-228 -465h-166zM530 616h355v719z" /> +<glyph unicode="Ç" horiz-adv-x="1183" d="M113 754q0 389 105.5 575.5t393.5 186.5q223 0 500 -52v-121l-18 2q-18 1 -49 3t-71 4t-87 4t-93 4t-94.5 3t-87.5 1q-133 0 -205.5 -50t-107.5 -182.5t-35 -381.5q0 -610 348 -611l500 15v-121q-242 -45 -500 -45q-499 0 -499 766zM446 -276l109 30q66 29 66 172h137 q0 -160 -43 -219t-164 -59h-105v76z" /> +<glyph unicode="È" d="M164 252v981q0 141 72.5 205.5t185.5 60.5l647 -33v-118h-647q-49 0 -74.5 -19.5t-29 -39t-3.5 -56.5v-410l672 -20v-121l-672 -20v-410q0 -51 22.5 -75.5t43 -28t61.5 -3.5h627v-116l-627 -35q-278 -16 -278 258zM360 1894h195l219 -272h-141z" /> +<glyph unicode="É" d="M164 252v981q0 141 72.5 205.5t185.5 60.5l647 -33v-118h-647q-49 0 -74.5 -19.5t-29 -39t-3.5 -56.5v-410l672 -20v-121l-672 -20v-410q0 -51 22.5 -75.5t43 -28t61.5 -3.5h627v-116l-627 -35q-278 -16 -278 258zM588 1622l219 272h194l-272 -272h-141z" /> +<glyph unicode="Ê" d="M164 252v981q0 141 72.5 205.5t185.5 60.5l647 -33v-118h-647q-49 0 -74.5 -19.5t-29 -39t-3.5 -56.5v-410l672 -20v-121l-672 -20v-410q0 -51 22.5 -75.5t43 -28t61.5 -3.5h627v-116l-627 -35q-278 -16 -278 258zM348 1632l240 266h145l213 -266h-145l-146 146 l-159 -146h-148z" /> +<glyph unicode="Ë" d="M164 252v981q0 141 72.5 205.5t185.5 60.5l647 -33v-118h-647q-49 0 -74.5 -19.5t-29 -39t-3.5 -56.5v-410l672 -20v-121l-672 -20v-410q0 -51 22.5 -75.5t43 -28t61.5 -3.5h627v-116l-627 -35q-278 -16 -278 258zM285 1726q0 43 30.5 73t73.5 30t73 -30t30 -73 t-30 -73.5t-73 -30.5t-73.5 30.5t-30.5 73.5zM807 1726q0 43 30.5 73t73.5 30t73 -30t30 -73t-30 -73.5t-73 -30.5t-73.5 30.5t-30.5 73.5z" /> +<glyph unicode="Î" horiz-adv-x="438" d="M-59 1632l239 266h146l213 -266h-146l-145 146l-160 -146h-147zM164 0v1499h151v-1499h-151z" /> +<glyph unicode="Ï" horiz-adv-x="438" d="M-125 1737q0 43 31 72.5t74 29.5t72.5 -29.5t29.5 -72.5t-29.5 -74t-72.5 -31t-74 31t-31 74zM164 0v1499h151v-1499h-151zM397 1737q0 43 31 72.5t74 29.5t72.5 -29.5t29.5 -72.5t-29.5 -74t-72.5 -31t-74 31t-31 74z" /> +<glyph unicode="Ô" horiz-adv-x="1384" d="M133 739q0 172 18.5 300t57.5 212t85 136.5t117.5 79t139 34.5t164.5 8q84 0 144.5 -6t125 -24.5t107.5 -51t84 -90t64.5 -138.5t37.5 -195.5t14 -264.5q0 -195 -25.5 -331t-69.5 -217.5t-121 -126t-158.5 -58.5t-202.5 -14q-102 0 -172 8t-141.5 33.5t-116.5 76 t-82 132.5t-53.5 205.5t-16.5 291.5zM285 739q0 -199 19.5 -315.5t75.5 -180t130 -82t205 -18.5q102 0 167.5 13.5t119 49.5t82 103.5t43 171t14.5 258.5q0 102 -6.5 183.5t-14.5 142.5t-28.5 107.5t-37 77t-49 52t-56 33t-69.5 16.5t-77 6t-88.5 1t-87 -1t-75.5 -6 t-70.5 -16.5t-57.5 -33t-50.5 -52t-38 -77t-29.5 -107.5t-15 -143.5t-6 -182.5zM416 1632l239 266h146l213 -266h-146l-145 146l-160 -146h-147z" /> +<glyph unicode="Ù" horiz-adv-x="1386" d="M164 655v844h151v-844q0 -186 23.5 -295.5t87 -154.5t115 -54.5t162.5 -9.5h16q43 0 67.5 1t63.5 5.5t61.5 13.5t53 26.5t49 43t39 64.5t32 89t18.5 118.5t7 152.5v844h154v-844q0 -190 -36 -322t-82 -197.5t-131 -100.5t-140.5 -40t-155.5 -5h-19q-55 0 -82.5 1t-78 4 t-77 12t-68.5 24.5t-65.5 41t-54 60.5t-47 85t-33 112.5t-23.5 144.5t-7 180zM371 1905h194l219 -273h-141z" /> +<glyph unicode="Û" horiz-adv-x="1386" d="M164 655v844h151v-844q0 -186 23.5 -295.5t87 -154.5t115 -54.5t162.5 -9.5h16q43 0 67.5 1t63.5 5.5t61.5 13.5t53 26.5t49 43t39 64.5t32 89t18.5 118.5t7 152.5v844h154v-844q0 -190 -36 -322t-82 -197.5t-131 -100.5t-140.5 -40t-155.5 -5h-19q-55 0 -82.5 1t-78 4 t-77 12t-68.5 24.5t-65.5 41t-54 60.5t-47 85t-33 112.5t-23.5 144.5t-7 180zM414 1632l241 266h144l213 -266h-144l-147 146l-160 -146h-147z" /> +<glyph unicode="Ü" horiz-adv-x="1386" d="M164 655v844h151v-844q0 -186 23.5 -295.5t87 -154.5t115 -54.5t162.5 -9.5h16q43 0 67.5 1t63.5 5.5t61.5 13.5t53 26.5t49 43t39 64.5t32 89t18.5 118.5t7 152.5v844h154v-844q0 -190 -36 -322t-82 -197.5t-131 -100.5t-140.5 -40t-155.5 -5h-19q-55 0 -82.5 1t-78 4 t-77 12t-68.5 24.5t-65.5 41t-54 60.5t-47 85t-33 112.5t-23.5 144.5t-7 180zM348 1737q0 43 32 72.5t75 29.5t72.5 -29.5t29.5 -72.5t-29.5 -74t-72.5 -31t-75 31t-32 74zM872 1737q0 43 30 72.5t73 29.5t72.5 -29.5t29.5 -72.5t-29.5 -74t-72.5 -31t-73 31t-30 74z" /> +<glyph unicode="à" horiz-adv-x="1062" d="M82 258v125q0 125 72.5 198.5t199.5 73.5q455 -2 455 0q2 135 0 138q0 168 -168 168q-184 0 -524 -25v111q207 57 530 61q137 2 225.5 -77t88.5 -238v-793h-113l-39 131l-30 -14q-30 -14 -79 -36t-106 -43.5t-122.5 -35.5t-117.5 -14q-117 0 -194.5 71.5t-77.5 198.5z M203 1503h194l219 -272h-141zM233 268q0 -129 121 -129q163 0 455 105v293l-455 -33q-61 -6 -91 -43t-30 -90v-103z" /> +<glyph unicode="â" horiz-adv-x="1062" d="M82 258v125q0 125 72.5 198.5t199.5 73.5q455 -2 455 0q2 135 0 138q0 168 -168 168q-184 0 -524 -25v111q207 57 530 61q137 2 225.5 -77t88.5 -238v-793h-113l-39 131l-30 -14q-30 -14 -79 -36t-106 -43.5t-122.5 -35.5t-117.5 -14q-117 0 -194.5 71.5t-77.5 198.5z M233 268q0 -129 121 -129q163 0 455 105v293l-455 -33q-61 -6 -91 -43t-30 -90v-103zM240 1231l239 266h146l213 -266h-146l-145 145l-160 -145h-147z" /> +<glyph unicode="æ" horiz-adv-x="1783" d="M82 270v82q0 125 72.5 199t199.5 74q455 -2 455 0q2 178 0 180q0 168 -168 168q-174 0 -524 -25v111q174 57 530 61q176 4 260 -119q53 63 142.5 85t236.5 22q113 0 176.5 -10.5t125 -47t88 -116.5t26.5 -211q0 -250 -281 -250h-458q0 -190 43 -254.5t163 -64.5 q373 0 512 20v-115q-203 -57 -512 -57q-123 0 -186 34t-129 109l-35 -15q-35 -15 -90 -35.5t-118.5 -42t-134 -37t-122.5 -15.5q-117 0 -194.5 71.5t-77.5 198.5zM233 281q0 -129 121 -129q163 0 455 104v262l-455 -33q-61 -6 -91 -42.5t-30 -90.5v-71zM963 623h458 q129 0 129 100q0 158 -46 195.5t-216 37.5q-72 0 -105.5 -2t-79.5 -11t-65.5 -29.5t-41 -57.5t-27.5 -94t-6 -139z" /> +<glyph unicode="ç" horiz-adv-x="1024" d="M102 545q0 172 26 286.5t77 171t110.5 78t145.5 21.5q158 0 467 -58v-110q-285 16 -467 16q-43 0 -69.5 -6t-55.5 -28.5t-45.5 -65.5t-26.5 -122t-10 -191q0 -229 47 -314.5t160 -85.5q84 0 203.5 5t198.5 12l79 6v-115q-197 -55 -481 -59q-84 0 -143.5 21.5t-110.5 78.5 t-78 172t-27 287zM358 -279l109 31q66 29 65 172h138q0 -160 -43 -219t-164 -59h-105v75z" /> +<glyph unicode="è" horiz-adv-x="1075" d="M102 549q0 180 25 289.5t89.5 166t143 74t218.5 17.5q113 0 176 -10.5t124.5 -47.5t88 -116.5t26.5 -210.5q0 -250 -280 -250h-459q0 -190 43 -255t164 -65q373 0 512 21v-115q-203 -57 -512 -57q-207 0 -283 118.5t-76 440.5zM233 1493h197l217 -272h-139zM254 610h459 q129 0 129 101q0 158 -46 195.5t-216 37.5q-72 0 -106 -2t-80 -11t-65.5 -29.5t-41 -57.5t-27.5 -94.5t-6 -139.5z" /> +<glyph unicode="é" horiz-adv-x="1075" d="M102 549q0 180 25 289.5t89.5 166t143 74t218.5 17.5q113 0 176 -10.5t124.5 -47.5t88 -116.5t26.5 -210.5q0 -250 -280 -250h-459q0 -190 43 -255t164 -65q373 0 512 21v-115q-203 -57 -512 -57q-207 0 -283 118.5t-76 440.5zM254 610h459q129 0 129 101 q0 158 -46 195.5t-216 37.5q-72 0 -106 -2t-80 -11t-65.5 -29.5t-41 -57.5t-27.5 -94.5t-6 -139.5zM487 1221l218 272h196l-274 -272h-140z" /> +<glyph unicode="ê" horiz-adv-x="1075" d="M102 549q0 180 25 289.5t89.5 166t143 74t218.5 17.5q113 0 176 -10.5t124.5 -47.5t88 -116.5t26.5 -210.5q0 -250 -280 -250h-459q0 -190 43 -255t164 -65q373 0 512 21v-115q-203 -57 -512 -57q-207 0 -283 118.5t-76 440.5zM254 610h459q129 0 129 101 q0 158 -46 195.5t-216 37.5q-72 0 -106 -2t-80 -11t-65.5 -29.5t-41 -57.5t-27.5 -94.5t-6 -139.5zM262 1221l240 266h145l213 -266h-145l-146 145l-159 -145h-148z" /> +<glyph unicode="ë" horiz-adv-x="1075" d="M102 549q0 180 25 289.5t89.5 166t143 74t218.5 17.5q113 0 176 -10.5t124.5 -47.5t88 -116.5t26.5 -210.5q0 -250 -280 -250h-459q0 -190 43 -255t164 -65q373 0 512 21v-115q-203 -57 -512 -57q-207 0 -283 118.5t-76 440.5zM190 1325q0 43 31 72.5t74 29.5t72.5 -29.5 t29.5 -72.5t-29.5 -73.5t-72.5 -30.5t-74 30.5t-31 73.5zM254 610h459q129 0 129 101q0 158 -46 195.5t-216 37.5q-72 0 -106 -2t-80 -11t-65.5 -29.5t-41 -57.5t-27.5 -94.5t-6 -139.5zM713 1325q0 43 30.5 72.5t73.5 29.5t73 -29.5t30 -72.5t-30 -73.5t-73 -30.5 t-73.5 30.5t-30.5 73.5z" /> +<glyph unicode="î" horiz-adv-x="397" d="M-100 1221l239 266h146l213 -266h-146l-145 145l-160 -145h-147zM123 0v1087h151v-1087h-151z" /> +<glyph unicode="ï" horiz-adv-x="397" d="M-166 1325q0 43 31 72.5t74 29.5t72.5 -29.5t29.5 -72.5t-29.5 -73.5t-72.5 -30.5t-74 30.5t-31 73.5zM123 0v1087h151v-1087h-151zM356 1325q0 43 31 72.5t74 29.5t72.5 -29.5t29.5 -72.5t-29.5 -73.5t-72.5 -30.5t-74 30.5t-31 73.5z" /> +<glyph unicode="ô" horiz-adv-x="1163" d="M102 528q0 330 104.5 450t375.5 120q274 0 376.5 -122t102.5 -448q0 -305 -102.5 -421.5t-376.5 -116.5q-270 0 -375 120.5t-105 417.5zM254 528q0 -133 19.5 -212.5t67.5 -116.5t98 -47.5t143 -10.5q94 0 146 10.5t98 48.5t64.5 116.5t18.5 211.5q0 145 -15 229.5 t-60.5 126.5t-97.5 52t-154 10q-78 0 -123 -6t-90 -28.5t-66.5 -67.5t-35 -122t-13.5 -194zM293 1221l239 266h146l213 -266h-146l-145 145l-160 -145h-147z" /> +<glyph unicode="ù" horiz-adv-x="1114" d="M102 330v757h152v-757q0 -96 51 -146.5t133 -50.5q78 0 147.5 16.5t111.5 34t143 66.5v837h151v-1087h-106l-45 127q-6 -2 -45 -25.5t-48.5 -27.5t-44 -23.5t-49 -23.5t-47.5 -16.5t-54.5 -16.5t-52 -8t-61.5 -4q-156 0 -246 102.5t-90 245.5zM225 1493h193l221 -272 h-143z" /> +<glyph unicode="û" horiz-adv-x="1114" d="M102 330v757h152v-757q0 -96 51 -146.5t133 -50.5q78 0 147.5 16.5t111.5 34t143 66.5v837h151v-1087h-106l-45 127q-6 -2 -45 -25.5t-48.5 -27.5t-44 -23.5t-49 -23.5t-47.5 -16.5t-54.5 -16.5t-52 -8t-61.5 -4q-156 0 -246 102.5t-90 245.5zM248 1221l239 266h146 l213 -266h-146l-145 145l-160 -145h-147z" /> +<glyph unicode="ü" horiz-adv-x="1114" d="M102 330v757h152v-757q0 -96 51 -146.5t133 -50.5q78 0 147.5 16.5t111.5 34t143 66.5v837h151v-1087h-106l-45 127q-6 -2 -45 -25.5t-48.5 -27.5t-44 -23.5t-49 -23.5t-47.5 -16.5t-54.5 -16.5t-52 -8t-61.5 -4q-156 0 -246 102.5t-90 245.5zM182 1325q0 43 31 72.5 t74 29.5t72.5 -29.5t29.5 -72.5t-29.5 -73.5t-72.5 -30.5t-74 30.5t-31 73.5zM705 1325q0 43 30.5 72.5t73.5 29.5t72.5 -29.5t29.5 -72.5t-29.5 -73.5t-72.5 -30.5t-73.5 30.5t-30.5 73.5z" /> +<glyph unicode="ÿ" horiz-adv-x="1134" d="M43 1087h166l264 -849q16 -51 50 -72t60 -14l25 6l312 929h170l-480 -1431l-153 -209h-95l193 553q-176 0 -246 225zM201 1325q0 43 31.5 72.5t74.5 29.5t73 -29.5t30 -72.5t-30 -73.5t-73 -30.5t-74.5 30.5t-31.5 73.5zM725 1325q0 43 29.5 72.5t72.5 29.5t73 -29.5 t30 -72.5t-30 -73.5t-73 -30.5t-72.5 30.5t-29.5 73.5z" /> +<glyph unicode="Œ" horiz-adv-x="2160" d="M133 739q0 205 28.5 349.5t75 226.5t126 126t156.5 56t194 12q166 0 272.5 -30.5t175.5 -120.5q55 152 238 141l649 -33v-118h-649q-49 0 -75 -19.5t-29 -39t-3 -56.5v-410l674 -20v-121l-674 -20v-410q0 -51 22.5 -75.5t43 -28t61.5 -3.5h629v-116l-629 -35 q-213 -12 -262 141q-70 -84 -176.5 -113.5t-267.5 -29.5q-102 0 -172 8t-141.5 33.5t-115.5 76t-81 132.5t-53.5 205.5t-16.5 291.5zM285 739q0 -199 19.5 -315.5t74.5 -180t129 -82t205 -18.5q129 0 203.5 21.5t129 86t75 180.5t20.5 308q0 102 -6.5 183.5t-15.5 142.5 t-28.5 107.5t-36 77t-49 52t-57 33t-71 16.5t-77 6t-87.5 1q-74 0 -111 -2t-92 -13.5t-82 -35t-59.5 -67.5t-48 -110.5t-25.5 -164t-10 -226.5z" /> +<glyph unicode="œ" horiz-adv-x="1878" d="M102 528q0 330 104.5 450t375.5 120q295 0 395 -146q51 86 144 115t259 29q113 0 176.5 -10.5t125 -47.5t88 -116.5t26.5 -210.5q0 -250 -280 -250h-457q-6 -176 39 -248t166 -72q373 0 512 21v-115q-203 -57 -512 -57q-215 0 -291 135q-100 -135 -391 -135 q-270 0 -375 120.5t-105 417.5zM254 528q0 -133 19.5 -212.5t67.5 -116.5t98 -47.5t143 -10.5q207 0 265 77t58 331q0 244 -65.5 320.5t-257.5 76.5q-78 0 -123 -6t-90 -28.5t-66.5 -67.5t-35 -122t-13.5 -194zM1059 610h457q129 0 129 101q0 158 -46.5 195.5t-216.5 37.5 q-80 0 -126 -5t-91 -22.5t-66.5 -54.5t-32.5 -98.5t-7 -153.5z" /> +<glyph unicode="Ÿ" horiz-adv-x="1290" d="M92 1499h166l387 -786l428 786h166l-518 -967v-532h-152v532zM301 1737q0 43 30.5 72.5t74 29.5t73 -29.5t29.5 -72.5t-29.5 -74t-73 -31t-74 31t-30.5 74zM823 1737q0 43 31 72.5t74 29.5t72.5 -29.5t29.5 -72.5t-29.5 -74t-72.5 -31t-74 31t-31 74z" /> +<glyph unicode="ˆ" horiz-adv-x="802" d="M102 1087l240 267h145l213 -267h-145l-145 146l-160 -146h-148z" /> +<glyph unicode="˚" horiz-adv-x="620" d="M102 1294q0 88 61.5 149.5t147.5 61.5t146.5 -61.5t60.5 -149.5t-60.5 -148.5t-146.5 -60.5t-147.5 60.5t-61.5 148.5zM199 1294q0 -45 32.5 -77.5t79.5 -32.5q45 0 78 32.5t33 77.5q0 47 -33 80t-78 33t-78.5 -34t-33.5 -79z" /> +<glyph unicode="˜" horiz-adv-x="897" d="M102 1171q55 45 83 67t74 43.5t85 21.5q57 -4 126 -38t93 -34q45 -2 187 74l45 -86q-6 -4 -50.5 -40t-63.5 -48.5t-55 -28t-67 -12.5q-61 4 -122.5 36.5t-96.5 32.5q-41 0 -70.5 -11t-63.5 -30.5t-61 -30.5z" /> +<glyph unicode=" " horiz-adv-x="952" /> +<glyph unicode=" " horiz-adv-x="1905" /> +<glyph unicode=" " horiz-adv-x="952" /> +<glyph unicode=" " horiz-adv-x="1905" /> +<glyph unicode=" " horiz-adv-x="635" /> +<glyph unicode=" " horiz-adv-x="476" /> +<glyph unicode=" " horiz-adv-x="317" /> +<glyph unicode=" " horiz-adv-x="317" /> +<glyph unicode=" " horiz-adv-x="238" /> +<glyph unicode=" " horiz-adv-x="381" /> +<glyph unicode=" " horiz-adv-x="105" /> +<glyph unicode="‐" horiz-adv-x="724" d="M41 518v152h643v-152h-643z" /> +<glyph unicode="‑" horiz-adv-x="724" d="M41 518v152h643v-152h-643z" /> +<glyph unicode="‒" horiz-adv-x="724" d="M41 518v152h643v-152h-643z" /> +<glyph unicode="–" horiz-adv-x="1050" d="M41 512v154h969v-154h-969z" /> +<glyph unicode="—" horiz-adv-x="1507" d="M41 516v154h1425v-154h-1425z" /> +<glyph unicode="‘" horiz-adv-x="552" d="M164 1141v202q0 160 148 175l65 -2v-72q-70 2 -70 -70v-57h25q57 0 57 -55v-121q0 -61 -57 -62h-115q-53 1 -53 62z" /> +<glyph unicode="’" horiz-adv-x="552" d="M164 1337v121q0 61 57 62h115q53 0 53 -62v-203q0 -160 -148 -175l-65 1v72q70 -2 70 72v55h-25q-57 0 -57 57z" /> +<glyph unicode="‚" horiz-adv-x="552" d="M164 55v121q0 61 57 62h115q53 0 53 -62v-203q0 -161 -148 -176q-36 -3 -65 2v72q70 -2 70 72v55h-25q-57 0 -57 57z" /> +<glyph unicode="“" horiz-adv-x="856" d="M150 1141v202q0 160 148 175q65 -2 64 -2v-72q-70 2 -69 -70v-55h24q57 0 58 -57v-121q0 -61 -58 -62h-114q-53 1 -53 62zM481 1141v202q0 59 22.5 99.5t54.5 54.5t62.5 19.5t53.5 2.5l22 -3v-72q-72 2 -71 -70v-55h26q55 0 56 -57v-121q0 -61 -56 -62h-114q-56 1 -56 62 z" /> +<glyph unicode="”" horiz-adv-x="856" d="M150 1337v121q0 61 55 62h114q55 0 56 -62v-203q0 -59 -22.5 -99t-54.5 -54.5t-62.5 -20.5t-53.5 -3l-22 3v72q70 -2 69 72v55h-24q-55 0 -55 57zM481 1337v121q0 61 58 62h114q53 0 54 -62v-203q0 -160 -149 -175q-65 1 -64 1v72q70 -2 69 72v55h-24q-58 0 -58 57z" /> +<glyph unicode="„" horiz-adv-x="856" d="M150 55v121q0 61 55 62h114q55 0 56 -62v-203q0 -59 -22.5 -100t-54.5 -54.5t-62.5 -19.5t-53.5 -3l-22 3v72q70 -2 69 72v55h-24q-55 0 -55 57zM481 55v121q0 61 58 62h114q53 0 54 -62v-203q0 -161 -149 -176q-36 -3 -64 2v72q70 -2 69 72v55h-24q-58 0 -58 57z" /> +<glyph unicode="…" horiz-adv-x="1671" d="M174 47v117q0 51 49 51h109q51 0 51 -51v-117q0 -47 -51 -47h-109q-49 0 -49 47zM731 47v117q0 51 49 51h109q51 0 51 -51v-117q0 -47 -51 -47h-109q-49 0 -49 47zM1288 47v117q0 51 49 51h109q51 0 51 -51v-117q0 -47 -51 -47h-109q-49 0 -49 47z" /> +<glyph unicode=" " horiz-adv-x="381" /> +<glyph unicode="‹" horiz-adv-x="731" d="M102 725l422 416l107 -107l-318 -309l328 -319l-106 -107z" /> +<glyph unicode="›" horiz-adv-x="731" d="M102 406l328 319l-317 309l106 107l422 -416l-432 -426z" /> +<glyph unicode=" " horiz-adv-x="476" /> +<glyph unicode="€" horiz-adv-x="1251" d="M41 522v96l180 15v207l-180 16v88l180 19v16q0 51 1 82t10.5 93.5t25.5 104t51 95t85 85t128 54.5t178 23q170 0 502 -62v-121q-334 31 -502 31q-111 0 -179 -26.5t-99 -87t-40 -122t-9 -165.5l479 -15v-94l-479 -14v-207l479 -15v-96q-31 0 -81 -1t-155.5 -4t-175 -5 t-67.5 -4q0 -369 327 -369q88 0 216 8.5t211 17.5l83 9v-115q-252 -72 -510 -71q-57 0 -111 9t-124 42t-121 86t-87 152.5t-36 230.5z" /> +<glyph unicode="™" horiz-adv-x="1417" d="M41 1368v131h530v-131h-198v-584h-131v584h-201zM651 784l56 715h129l190 -485l164 485h133l63 -715h-131l-34 414l-138 -414h-108l-162 416l-31 -416h-131z" /> +<glyph unicode="" horiz-adv-x="1085" d="M0 1085h1085v-1085h-1085v1085z" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Regular-webfont.ttf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Regular-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..dd0b7befdda9a222b8b8b152afe7821773b4f3b8 Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Regular-webfont.ttf differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Regular-webfont.woff b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Regular-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..30e161cbd75b8467d65ec3517fec11ef5bc720a3 Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Regular-webfont.woff differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Thin-Italic-webfont.eot b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Thin-Italic-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..9e6d81bff8d2652902622a7ab290d6b846974758 Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Thin-Italic-webfont.eot differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Thin-Italic-webfont.svg b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Thin-Italic-webfont.svg new file mode 100644 index 0000000000000000000000000000000000000000..5cbbc6a4cf0236dff953986264d81c5f71dc4777 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Thin-Italic-webfont.svg @@ -0,0 +1,187 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Copyright c 2011 Natanael Gama exondiscoveredcom with Reserved Font Name Exo +Designer : Natanael Gama +</metadata> +<defs> +<font id="ExoThinItalic" horiz-adv-x="1148" > +<font-face units-per-em="2048" ascent="1638" descent="-410" /> +<missing-glyph horiz-adv-x="479" /> +<glyph unicode=" " horiz-adv-x="479" /> +<glyph unicode="	" horiz-adv-x="479" /> +<glyph unicode=" " horiz-adv-x="479" /> +<glyph unicode="!" horiz-adv-x="483" d="M172 25l21 127q4 25 28 24h23q25 0 20 -24l-20 -127q-2 -25 -29 -25h-22q-25 0 -21 25zM254 401l164 1096h45l-184 -1096h-25z" /> +<glyph unicode=""" horiz-adv-x="587" d="M221 1087l29 275l22 137h52l-23 -137l-55 -275h-25zM426 1087l29 275l22 137h51l-22 -137l-55 -275h-25z" /> +<glyph unicode="#" horiz-adv-x="1292" d="M115 512l8 25h366l132 419h-367l10 25h365l166 518h24l-166 -518h381l164 518h25l-164 -518h362l-8 -25h-364l-131 -421h362l-8 -25h-363l-161 -510h-25l162 510l-381 2l-162 -512h-25l162 512h-364zM514 537l379 -2l131 421h-379z" /> +<glyph unicode="$" horiz-adv-x="1175" d="M164 14l4 31q131 -12 459 -12q170 0 270 60.5t125 225.5l20 140q23 139 -31.5 195.5t-209.5 56.5h-209q-90 0 -155.5 19.5t-96.5 50t-48.5 70.5t-14 81t7.5 80l22 135q33 213 147.5 288.5t338.5 75.5l26 177h37l-27 -179q180 -10 359 -36l-4 -27l-393 18 q-193 8 -298.5 -58.5t-136.5 -258.5l-22 -135q-23 -143 44.5 -197.5t217.5 -54.5h213q188 0 246.5 -79t36.5 -222l-21 -140q-14 -88 -48 -151.5t-78 -99t-106.5 -55t-119.5 -25.5t-131 -4l-27 -164h-37l27 166q-291 10 -387 28z" /> +<glyph unicode="%" horiz-adv-x="2017" d="M236 971l43 272q20 135 86.5 195.5t216.5 60.5h206q145 0 193.5 -60.5t28.5 -195.5l-43 -272q-20 -137 -85 -196.5t-214 -59.5h-207q-147 0 -196 60.5t-29 195.5zM266 971q-20 -129 25 -177.5t170 -48.5h207q125 0 186 47.5t82 178.5l43 272q18 123 -23 174t-170 51h-206 q-127 0 -188.5 -47t-82.5 -178zM461 0l1134 1499h43l-1134 -1499h-43zM1116 262l43 273q20 137 85 196.5t214 59.5h207q147 0 196.5 -60.5t28.5 -195.5l-43 -273q-20 -137 -85.5 -196.5t-215.5 -59.5h-207q-145 0 -194 60.5t-29 195.5zM1147 262q-20 -129 25 -177t167 -48 h207q125 0 187.5 47t83.5 178l43 273q18 123 -24 174t-171 51h-207q-127 0 -187.5 -47t-80.5 -178z" /> +<glyph unicode="&" horiz-adv-x="1409" d="M145.5 478.5q49.5 152.5 206.5 271.5l199 149l-100 174q-72 121 -57.5 208t71.5 136t147 70q152 33 590 -4l-4 -29h-436q-207 0 -286 -90t11 -262l465 -807l373 309l14 -16l-168 -172l-192 -160l151 -256h-49l-139 227l-168 -137q-88 -72 -199.5 -92.5t-218.5 23 t-170 147.5q-90 158 -40.5 310.5zM190 470q-45 -134 33 -271q78 -131 229.5 -157t286.5 81l176 143l-340 592l-182 -135q-158 -119 -203 -253z" /> +<glyph unicode="'" horiz-adv-x="270" d="M184 1087l29 275l23 137h51l-23 -137l-55 -275h-25z" /> +<glyph unicode="(" horiz-adv-x="563" d="M234.5 546q3.5 134 23.5 265q25 158 85 326t129 296t133.5 233.5t107.5 161.5l43 56h51q-16 -23 -45 -61.5t-105.5 -161.5t-139 -246t-126 -296t-88.5 -328q-27 -186 -20.5 -350.5t35 -301.5t61.5 -236.5t58 -154.5l26 -55h-53q-6 10 -14.5 28.5t-33 80t-45 128t-42 170 t-33 208t-8 238.5z" /> +<glyph unicode=")" horiz-adv-x="565" d="M-27 -307q16 20 45 56t104 152.5t138.5 237.5t128 300t90.5 352q71 450 -110 966q-50 128 -50 127h52q4 -12 13 -32.5t32.5 -87t43 -137.5t41 -175t33 -205.5t10.5 -225.5t-20 -239q-29 -180 -90 -359t-127.5 -305t-130 -226.5t-104.5 -149.5l-41 -49h-58z" /> +<glyph unicode="*" horiz-adv-x="989" d="M285 1212l4 29l293 8l-7 -49zM391 838l111 274l51 -8l-137 -275zM604 1014l33 47l215 -170l-21 -23zM610 1481l29 8l96 -252l-51 -23zM713 1130l256 170l14 -24l-240 -184z" /> +<glyph unicode="+" horiz-adv-x="1073" d="M205 705l8 49h371l57 370h49l-57 -370h371l-9 -49h-370l-60 -371h-49l59 371h-370z" /> +<glyph unicode="," horiz-adv-x="350" d="M123 -139l2 12q35 0 39 31l14 96h-12q-25 0 -21 27l21 127q2 27 29 26h20q25 0 21 -26l-37 -230q-6 -37 -24.5 -52t-35.5 -13z" /> +<glyph unicode="-" horiz-adv-x="677" d="M123 569l8 49h582l-8 -49h-582z" /> +<glyph unicode="." horiz-adv-x="352" d="M145 25l21 127q2 25 29 24h22q25 0 21 -24l-21 -127q-4 -25 -29 -25h-22q-25 0 -21 25z" /> +<glyph unicode="/" horiz-adv-x="595" d="M16 -147l848 1724h45l-848 -1724h-45z" /> +<glyph unicode="0" horiz-adv-x="1329" d="M248 332l133 835q25 160 137.5 246t265.5 86h275q178 0 245.5 -90t45.5 -242l-133 -835q-53 -332 -396 -332h-274q-154 0 -240 80t-59 252zM297 332q-20 -139 48.5 -211t209.5 -72h274q295 0 338 283l133 835q43 283 -249 283h-275q-139 0 -232 -75t-114 -208z" /> +<glyph unicode="1" horiz-adv-x="831" d="M274 1280l9 31q90 0 207.5 47t189.5 94l72 47h45l-234 -1499h-49l229 1438q-80 -53 -210 -105.5t-259 -52.5z" /> +<glyph unicode="2" horiz-adv-x="1175" d="M96 0l8 47q4 2 82 57.5t113 81t124 92t141 109.5t138 113.5t139.5 123t120 121t105.5 123t70.5 113.5t40.5 109q35 207 -46 292.5t-268 85.5h-549l4 31q166 20 566 21q217 0 299 -116t47 -319q-61 -365 -1043 -1036h879l-8 -49h-963z" /> +<glyph unicode="3" horiz-adv-x="1185" d="M80 8l6 29h559q311 0 361 303l18 121q12 72 -10.5 125t-68.5 80.5t-93 40t-96 14.5l-434 14l4 29l438 12q131 2 234.5 67.5t121.5 188.5l21 142q23 143 -50 211.5t-208 68.5h-586l4 29q158 29 598 20q174 -2 244.5 -95t46.5 -243l-21 -141q-10 -61 -37.5 -110.5 t-61.5 -79t-73 -50t-67.5 -27.5t-50.5 -9q76 -12 147.5 -85t50.5 -212l-18 -121q-53 -344 -418 -344q-455 -1 -561 22z" /> +<glyph unicode="4" horiz-adv-x="1171" d="M113 485l788 1014h55l-784 -1016h774l76 484l45 153h29l-101 -637h185l-4 -28l-189 -21l-67 -430h-50l68 430h-809z" /> +<glyph unicode="5" horiz-adv-x="1284" d="M162 12l4 29h608q119 0 222.5 80t125.5 223l31 195q47 295 -229 295h-314q-104 0 -198.5 -78t-108.5 -178h-49l190 921h867l-8 -49h-820l-145 -702q18 25 46 50t91.5 55t134.5 30h312q172 0 238.5 -91.5t41.5 -248.5l-33 -203q-16 -98 -61 -171t-104.5 -108.5t-114.5 -52 t-109 -16.5q-475 0 -618 20z" /> +<glyph unicode="6" horiz-adv-x="1300" d="M225 401.5q-2 151.5 29 384.5q59 373 185 549t282 176q395 0 553 -18l-4 -31h-545q-92 0 -169 -67.5t-126 -176t-78.5 -210t-46.5 -201.5q197 23 565 22q193 0 258.5 -79.5t42.5 -219.5l-36 -227q-27 -166 -112 -235.5t-237 -69.5h-254q-88 0 -151.5 36t-108.5 126 t-47 241.5zM301 778q-117 -731 229 -731h244q268 0 309 252l35 217q25 152 -36.5 207t-202.5 55h-578z" /> +<glyph unicode="7" horiz-adv-x="1105" d="M274 1450l9 49h897l24 -47l-717 -1452h-57l717 1450h-873z" /> +<glyph unicode="8" horiz-adv-x="1318" d="M243 250.5q5 37.5 5 64.5l31 203q16 106 93 169t148 63q-201 35 -162 286l21 133q31 193 130 266.5t273 73.5h238q346 0 289 -368l-21 -133q-14 -86 -78.5 -155t-148.5 -75q180 -53 147 -262l-30 -201q-12 -76 -43 -134t-68 -92t-85 -54.5t-90 -27.5t-85 -7h-236 q-100 0 -169.5 24.5t-99.5 62.5t-47 82t-12 81.5zM297 309q-23 -133 58 -196.5t225 -63.5h221q111 0 206 62.5t115 197.5l35 215q12 76 -4 124t-61 66.5t-76 22.5t-86 4h-273q-98 0 -202.5 -53t-122.5 -164zM406 1012q-12 -74 5 -122t60 -68.5t85 -27t103 -6.5h265 q137 0 219 70t94 154l23 139q25 164 -38 236.5t-210 72.5h-234q-166 0 -247.5 -73.5t-104.5 -235.5z" /> +<glyph unicode="9" horiz-adv-x="1302" d="M205 6l4 31h545q94 0 170.5 67.5t126 177t78 209t45.5 201.5q-197 -23 -580 -22q-190 0 -249.5 83t-37.5 226l37 227q27 162 123 228.5t254 66.5h237q395 0 269 -807q-59 -371 -185.5 -538.5t-281.5 -167.5q-397 0 -555 18zM356 969q-12 -78 2.5 -129.5t54.5 -76 t86 -33.5t111 -9h568q117 731 -220 731h-245q-283 0 -322 -252z" /> +<glyph unicode=":" horiz-adv-x="362" d="M156 25l20 127q4 25 29 24h22q25 0 21 -24l-21 -127q-2 -25 -28 -25h-23q-24 0 -20 25zM289 932l20 129q2 25 29 24h22q25 0 21 -24l-21 -129q-2 -23 -28 -23h-23q-24 0 -20 23z" /> +<glyph unicode=";" horiz-adv-x="352" d="M123 -139l2 12q35 0 39 31l14 96h-12q-25 0 -21 27l21 127q2 27 29 26h20q25 0 21 -26l-37 -230q-6 -37 -24.5 -52t-35.5 -13zM289 932l20 129q2 25 29 24h22q25 0 21 -24l-21 -129q-2 -23 -28 -23h-23q-24 0 -20 23z" /> +<glyph unicode="<" horiz-adv-x="966" d="M203 707l6 41l770 393l-10 -54l-705 -362l586 -387l-6 -49z" /> +<glyph unicode="=" horiz-adv-x="946" d="M109 434l8 49h874l-8 -49h-874zM193 965l8 49h874l-8 -49h-874z" /> +<glyph unicode=">" horiz-adv-x="968" d="M147 289l9 55l712 387l-594 363l9 47l643 -393l-6 -41z" /> +<glyph unicode="?" horiz-adv-x="1112" d="M256 1464l4 29q180 20 508 20q229 2 309 -93t49 -285l-30 -207q-33 -205 -170.5 -276.5t-427.5 -43.5l-33 -209h-53l39 250h208q168 0 264.5 64.5t120.5 214.5l33 207q27 178 -46 253.5t-265 75.5h-510zM350 25l21 127q2 25 28 24h23q25 0 20 -24l-20 -127 q-4 -25 -29 -25h-22q-25 0 -21 25z" /> +<glyph unicode="@" horiz-adv-x="1845" d="M131 18l166 1049q59 365 420 365h768q168 0 240.5 -94.5t46.5 -270.5l-109 -725q-4 -35 -11 -63.5t-31 -84t-57.5 -92t-98 -66.5t-148.5 -30h-60l5 123q-47 -51 -178.5 -93t-243.5 -44q-190 -4 -275.5 121t-36.5 450q80 516 441 551q129 12 259 -21.5t206 -105.5 l-138 -934q274 0 318 289l108 725q27 174 -37.5 244.5t-201.5 70.5h-766q-322 0 -371 -315l-166 -1049q-25 -158 51 -246.5t213 -88.5h787l-4 -29q-102 -20 -594 -21h-201q-158 0 -243 109.5t-58 275.5zM564 314q11 -85 29.5 -138t58.5 -83t79 -41t92 -11q270 -4 441 123 l120 817q-166 88 -395 82q-350 -13 -416 -543q-20 -121 -9 -206z" /> +<glyph unicode="A" horiz-adv-x="1316" d="M92 0l799 1499h70l299 -1499h-50l-104 518h-682l-274 -518h-58zM451 567h645l-176 885z" /> +<glyph unicode="B" horiz-adv-x="1208" d="M164 0l237 1499h519q216 0 288 -90q52 -64 52 -172q0 -43 -9 -94q-23 -141 -119 -242.5t-200 -114.5q86 -20 160 -124q56 -78 57 -186q0 -35 -6 -73q-63 -403 -461 -403h-518zM221 51h469q346 0 406 367q5 29 5 57q1 105 -69 187q-84 99 -218 98h-11h-469zM342 809h469 q143 0 250.5 89t138.5 239q12 58 12 104q0 95 -48 141q-72 68 -253 68h-469z" /> +<glyph unicode="C" horiz-adv-x="1155" d="M240 770q31 190 69.5 317t108 229.5t176 151t260.5 48.5q176 0 434 -50l-4 -28l-14 2q-14 2 -40 4t-58.5 5t-72.5 6t-81 5t-85 4t-83 2q-160 0 -262.5 -58t-178 -217t-120.5 -441q-23 -143 -22 -257q0 -456 360 -456q96 0 205.5 6t171.5 12l61 6l-4 -28 q-250 -45 -445 -45q-400 0 -400 503q0 124 24 279z" /> +<glyph unicode="D" horiz-adv-x="1347" d="M164 0l237 1499h517q133 0 225 -52t137 -131q44 -78 62 -186q13 -80 13 -155q0 -25 -1 -49q-6 -96 -25 -199q-29 -156 -78 -280.5t-123.5 -228t-185.5 -161t-248 -57.5h-530zM221 49h473q133 0 240.5 64.5t175.5 172t110 221.5t62 238q22 134 22 242q0 181 -61 289 q-98 174 -336 174h-465z" /> +<glyph unicode="E" d="M201 262l155 981q23 139 106 199q78 57 179 57h14l607 -20l-5 -29h-608q-209 0 -243 -217l-74 -465l733 -10l-4 -29l-737 -10l-74 -467q-5 -34 -6 -62q0 -76 41 -106q55 -41 161 -41h588l-4 -29l-592 -20h-16q-112 0 -176 53q-51 42 -52 138q0 35 7 77z" /> +<glyph unicode="F" horiz-adv-x="1136" d="M164 0l192 1225q25 162 104 220q74 54 182 54h15l607 -20l-4 -29h-613q-104 0 -162.5 -51t-76.5 -166l-74 -465l735 -10l-6 -29l-735 -10l-115 -719h-49z" /> +<glyph unicode="G" horiz-adv-x="1310" d="M219 381q0 98 9.5 184t27.5 207q23 141 45.5 237.5t65.5 200t100 165t147.5 101.5t208.5 40q80 0 239 -17.5t263 -38.5l-6 -39l-87 12q-87 11 -209 22t-208 11q-238 0 -345.5 -172t-164.5 -540q-35 -199 -35 -339q0 -129 30 -209q62 -167 300 -167q72 0 197 25.5 t215 51.5l90 25l94 604h-438l6 29q86 23 350 23q66 0 139 -6l-125 -791h-28v111q-72 -35 -229.5 -78t-278.5 -43q-102 0 -176 25.5t-115 82t-61.5 121t-20.5 162.5z" /> +<glyph unicode="H" horiz-adv-x="1333" d="M174 0l238 1499h49l-119 -749h901l119 749h49l-237 -1499h-50l111 700h-901l-111 -700h-49z" /> +<glyph unicode="I" horiz-adv-x="393" d="M184 0l238 1499h49l-238 -1499h-49z" /> +<glyph unicode="J" horiz-adv-x="653" d="M78 43l12 29q98 -32 176 -32q239 0 289 298l184 1161h49l-184 -1161q-33 -221 -153 -301q-71 -47 -179 -47h-8q-114 2 -186 53z" /> +<glyph unicode="K" horiz-adv-x="1081" d="M164 0l237 1499h50l-115 -723h313l602 723h62l-619 -745l383 -754h-57l-371 727h-319l-115 -727h-51z" /> +<glyph unicode="L" horiz-adv-x="1120" d="M203 258l196 1241h50l-197 -1241q-5 -33 -5 -61q0 -77 41 -107q56 -41 161 -41h565l-8 -49h-555q-59 0 -102.5 8t-85.5 33t-57 80q-8 31 -8 69q0 32 5 68z" /> +<glyph unicode="M" horiz-adv-x="1576" d="M145 0l404 1499h69l216 -1415l651 1415h80l-66 -1499h-51l65 1436l-663 -1436h-57l-211 1425l-385 -1425h-52z" /> +<glyph unicode="N" horiz-adv-x="1314" d="M164 0l237 1499h52l675 -1411l226 1411h49l-238 -1499h-49l-678 1413l-225 -1413h-49z" /> +<glyph unicode="O" horiz-adv-x="1400" d="M210 412v9q0 136 32 333q33 207 81 348t101 221t136 122t159 53t196 11q98 0 164 -9t128.5 -37.5t94.5 -82.5q34 -53 54 -139q16 -69 16 -165q0 -23 -1 -49q-5 -128 -32 -302q-31 -197 -75.5 -331t-98 -213t-134.5 -122t-160.5 -55t-202.5 -12t-198 13t-141.5 58.5 t-92 128t-26.5 220.5zM260 432v-21q0 -109 20 -181q22 -78 79 -119t129.5 -55.5t191.5 -14.5q113 0 189.5 14.5t147 56.5t119 119.5t87.5 201.5t67 306q30 191 30 322v8q-1 133 -24.5 211t-85 118t-128 51t-177.5 11q-68 0 -110.5 -3t-97 -12t-91.5 -30.5t-80 -55.5 t-73.5 -88t-61.5 -128t-55.5 -175.5t-44.5 -228.5q-29 -184 -31 -307z" /> +<glyph unicode="P" horiz-adv-x="1196" d="M154 0l237 1499h565q45 0 82 -5t80 -19.5t68.5 -42t50.5 -73.5q24 -44 24 -106v-5q-1 -66 -10 -158q-16 -100 -42.5 -176t-64.5 -121t-73 -74t-85 -40t-82 -14t-81 -3q-70 0 -288 8t-224 12l-108 -682h-49zM315 711h516q68 0 121.5 14t105.5 53t89 118t53 196q8 80 9 136 v5q-1 53 -19 91q-20 40 -40 64.5t-56.5 38t-69.5 17.5t-76 4h-516z" /> +<glyph unicode="Q" horiz-adv-x="1413" d="M218 412v9q0 136 32 333q33 207 81 348t101 221t136 122t159 53t197 11q98 0 163.5 -9t128 -37.5t95 -82t53.5 -139.5q16 -69 16 -165q0 -24 -1 -49q-5 -128 -31 -302q-31 -197 -76 -331t-98.5 -213t-134.5 -122t-160.5 -55t-202.5 -12t-198 13t-141.5 58.5t-92 128 t-26.5 220.5zM268 432v-21q0 -109 20 -181q21 -78 78.5 -119t130 -55.5t191.5 -14.5q113 0 189.5 14.5t147.5 56.5t119 119.5t87 201.5t67 306q30 191 30 322v8q-1 133 -24.5 211t-85 118t-128 51t-177.5 11q-68 0 -110.5 -3t-97 -12t-91 -30.5t-79.5 -55.5t-74 -88 t-61.5 -128t-55.5 -175.5t-45 -228.5q-29 -184 -31 -307zM653 -68h29q16 -78 74 -116q53 -35 115 -35h13q68 4 138 22l-8 -49q-72 -22 -141 -22h-19q-78 4 -137.5 56t-63.5 144z" /> +<glyph unicode="R" horiz-adv-x="1253" d="M154 0l237 1499h565q45 0 82 -5t79 -21.5t68.5 -45t50.5 -74.5q24 -47 25 -113v-11q0 -63 -10 -148q-23 -137 -63.5 -226t-100 -128t-107.5 -51t-120 -14l223 -662h-53l-223 662q-481 8 -496 20l-108 -682h-49zM315 711h516q70 0 121.5 13t103.5 51t89 117t55 198 q8 80 9 136v5q-1 53 -19 91q-20 40 -40 64.5t-56.5 38t-69.5 18.5t-76 5h-516z" /> +<glyph unicode="S" horiz-adv-x="1157" d="M162 14l4 31q133 -12 485 -12q76 0 134.5 11t113.5 41t92 89t49 145l21 140q5 35 5 66q0 83 -40 127q-55 60 -207 59h-229q-115 0 -185.5 25.5t-96.5 68.5q-24 43 -32 99q-2 19 -3 38q0 38 10 78l22 135q33 207 145.5 281.5t307.5 74.5q215 0 448 -38l-4 -27 q-453 16 -452 16h-26q-152 0 -242 -66q-98 -72 -128 -249l-22 -135q-6 -39 -6 -72q0 -91 48 -129q64 -51 220 -51h233q188 0 247 -83q42 -60 42 -152q0 -36 -6 -76l-20 -140q-16 -104 -59.5 -172.5t-110 -99.5t-130 -42t-151.5 -11q-86 0 -250 9t-227 21z" /> +<glyph unicode="T" horiz-adv-x="1292" d="M285 1450l8 49h1102l-9 -49h-532l-229 -1450h-50l230 1450h-520z" /> +<glyph unicode="U" horiz-adv-x="1394" d="M244 376v9q0 115 24 270l133 844h50l-134 -844q-14 -89 -21 -165q-4 -48 -4 -90q0 -24 1 -44q4 -58 10 -103.5t25.5 -78.5t36 -56.5t50.5 -37.5t56.5 -23.5t67.5 -12.5t73.5 -4t81.5 -1q63 0 107.5 3t99.5 17.5t94 39t82 69.5t74 109.5t59.5 159.5t46.5 218l134 844h49 l-133 -844q-16 -98 -36 -179t-44.5 -143.5t-49 -112.5t-58.5 -85t-61.5 -60.5t-68.5 -41t-68.5 -24.5t-73.5 -13t-72.5 -5t-76.5 -1q-202 0 -278 30q-173 68 -176 356z" /> +<glyph unicode="V" horiz-adv-x="1368" d="M307 1499h51l289 -1446l772 1446h56l-799 -1499h-70z" /> +<glyph unicode="W" horiz-adv-x="2007" d="M307 1499h49l291 -1448l733 1448h54l-308 -616l199 -834l735 1450h54l-758 -1499h-70l-196 811l-414 -811h-70z" /> +<glyph unicode="X" horiz-adv-x="1110" d="M78 0l563 748l-332 751h58l311 -704l543 704h63l-582 -756l334 -743h-57l-311 694l-527 -694h-63z" /> +<glyph unicode="Y" horiz-adv-x="1286" d="M307 1499h55l320 -901l651 901h60l-693 -967l-84 -532h-49l84 532z" /> +<glyph unicode="Z" horiz-adv-x="1038" d="M72 0l8 49l1104 1401h-883l8 49h948l-8 -49l-1104 -1401h883l-8 -49h-948z" /> +<glyph unicode="[" horiz-adv-x="542" d="M150 -61.5q-6 61.5 6 106.5l229 1450q10 59 27.5 112.5t53.5 112t101.5 93t153.5 34.5h100l-6 -49h-102q-106 0 -180 -73.5t-99 -229.5l-229 -1450q-23 -135 19 -219t163 -84h102l-8 -49h-102q-84 0 -137.5 38t-69.5 92t-22 115.5z" /> +<glyph unicode="\" horiz-adv-x="884" d="M289 1577h39l303 -1724h-39z" /> +<glyph unicode="]" horiz-adv-x="552" d="M-27 -307l9 49h102q119 0 186.5 84t89.5 219l230 1450q25 156 -24.5 229.5t-155.5 73.5h-103l8 49h103q86 0 140 -37.5t69.5 -92t19.5 -116t-8 -106.5l-229 -1450q-55 -352 -334 -352h-103z" /> +<glyph unicode="^" horiz-adv-x="874" d="M274 1087l314 267h43l200 -267h-34l-193 236l-293 -236h-37z" /> +<glyph unicode="_" horiz-adv-x="1327" d="M39 -2l8 49h1237l-8 -49h-1237z" /> +<glyph unicode="`" horiz-adv-x="448" d="M256 1360h53l205 -273h-29z" /> +<glyph unicode="a" horiz-adv-x="1116" d="M162 326q-2 21 -1 43q0 88 23 202q25 135 64 233.5t81 152t100 88t101 45t105 18.5q33 4 68 4q86 0 183 -24q136 -34 212 -107l-144 -981h-28l2 123q-63 -41 -191.5 -89t-232.5 -48q-76 0 -131.5 15t-106.5 53t-73.5 104t-30.5 168zM223 504q-12 -80 -12 -146 q1 -125 43 -204q66 -121 233 -121q37 0 71 3t73 12t58.5 12t65.5 21.5t54 21.5t62.5 27t56.5 24l119 821q-145 91 -318 91q-47 0 -96 -7q-182 -25 -273.5 -144.5t-136.5 -410.5z" /> +<glyph unicode="b" horiz-adv-x="1116" d="M123 0l254 1608h45l-92 -586q98 37 221 59.5t201 22.5q303 0 303 -371q0 -93 -19 -209q-16 -102 -48 -190t-85 -170t-137 -129t-191 -47q-98 0 -224 46t-163 87l-38 -121h-27zM195 150q205 -113 383 -113q141 0 254.5 125t154.5 377q14 124 14 212q0 24 -1 46 q-5 100 -48 157.5t-93 79t-120 21.5q-166 0 -411 -62z" /> +<glyph unicode="c" horiz-adv-x="1005" d="M164 318l-2 40q0 87 22 201q27 172 71 283.5t104.5 165t122 72t149.5 18.5q170 0 397 -54l-6 -28q-217 33 -399 33q-78 0 -132.5 -18.5t-106.5 -71t-90 -157t-63 -265.5q-20 -102 -21 -180q0 -17 2 -33q6 -88 21 -144.5t53 -87.5t79 -42t98 -11q84 0 190.5 11t170.5 22 l65 10l-4 -33q-209 -57 -430 -59q-66 0 -114 13t-91 49t-61.5 101t-24.5 165z" /> +<glyph unicode="d" horiz-adv-x="1067" d="M169 360q-2 26 -2 52q0 73 15 143q88 549 467 549q76 0 190.5 -22.5t200.5 -59.5l93 586h45l-254 -1608h-27l-2 121q-51 -41 -187.5 -87t-234.5 -46q-106 0 -176 53t-95.5 136t-32.5 183zM231 539q-14 -91 -15 -165q0 -137 50 -216q76 -121 221 -121q174 0 412 113 l135 843q-225 61 -387 62q-72 0 -130 -21.5t-115.5 -75t-101.5 -159.5t-69 -260z" /> +<glyph unicode="e" horiz-adv-x="1099" d="M178 569q18 111 35.5 178.5t54.5 144.5t88.5 119t136.5 69.5t201 27.5q208 0 308 -72q82 -58 81 -181q0 -28 -4 -60q-16 -127 -104 -205t-202 -100.5t-236.5 -22.5t-205.5 13.5t-114 25.5q-14 -103 -14 -182q0 -112 27 -176q46 -112 204 -113h15q167 0 473 43l-7 -33 q-217 -59 -477 -59q-193 0 -252 140q-32 75 -32 197q0 106 24 246zM221 535q16 -2 43 -7.5t107 -11.5t152.5 -6t163.5 14.5t159.5 43t120 87t61.5 140.5q3 26 3 49q1 104 -67 154q-82 60 -253 61q-82 0 -146.5 -14.5t-108.5 -32t-80 -58.5t-55.5 -69.5t-40 -93t-27.5 -99.5 t-24 -116q-6 -27 -8 -41z" /> +<glyph unicode="f" horiz-adv-x="735" d="M188 1038l5 29l182 20l31 203q0 2 6 39t8 46t10 44t16.5 48.5t21.5 41t30.5 40t41 28.5t54.5 23.5t68 9.5q33 1 62 1q145 0 226 -24l-4 -26h-291q-96 0 -138 -67t-62 -204l-31 -203h364l-8 -49h-364l-164 -1038h-49l164 1038h-179z" /> +<glyph unicode="g" horiz-adv-x="1089" d="M76 -508l4 29l463 -31q9 -1 19 -1q89 0 180 69q100 77 124 229l43 272q-96 -37 -226 -58t-210 -21q-150 0 -225.5 79.5t-79.5 208.5q-1 20 -1 41q0 114 19 254q86 537 463 537q162 0 469 -27l-203 -1286q-29 -178 -141 -268q-97 -78 -205 -78q-17 0 -34 2zM236 555 q-19 -120 -19 -212q0 -117 31 -188q55 -126 231 -126q72 0 150 11t122 21.5t164 38.5l152 940l-408 11h-10q-165 0 -268 -127q-106 -131 -145 -369z" /> +<glyph unicode="h" horiz-adv-x="1105" d="M123 0l254 1606h49l-102 -645q248 145 473 145q157 0 227 -102q53 -77 53 -178q0 -33 -6 -68l-121 -758h-49l121 758q5 32 5 61q-1 92 -49 155q-64 83 -196 83q-127 0 -228 -29t-235 -96l-147 -932h-49z" /> +<glyph unicode="i" horiz-adv-x="294" d="M123 0l172 1087h49l-172 -1087h-49zM322 1315l12 86q2 24 26 24h2h25q20 0 19 -17v-7l-13 -86q-4 -25 -28 -25h-23q-21 0 -21 18q0 3 1 7z" /> +<glyph unicode="j" horiz-adv-x="309" d="M57 -553l260 1640h50l-174 -1095q-55 -362 -109 -545h-27zM340 1315l14 86q2 24 27 24h2h25q19 0 19 -16q0 -4 -1 -8l-14 -86q-2 -25 -27 -25h-23q-23 0 -23 19q0 3 1 6z" /> +<glyph unicode="k" horiz-adv-x="970" d="M123 0l254 1602h49l-158 -994q158 0 284 43t205 117t127 152.5t74 166.5h52q-104 -377 -467 -489l352 -598h-57l-342 584q-101 -23 -183 -23q-27 0 -51 2l-90 -563h-49z" /> +<glyph unicode="l" horiz-adv-x="641" d="M182 387l193 1217h49l-193 -1217q-10 -66 -11 -119v-17q0 -42 4 -70q5 -34 20.5 -59.5t27 -37.5t35 -20.5t30.5 -10.5t30 -4q127 -22 146 -22h1l-4 -27h-133q-131 0 -179 93q-29 55 -29 149q0 64 13 145z" /> +<glyph unicode="m" horiz-adv-x="1886" d="M123 0l172 1087h29v-126q248 145 467 145q201 0 264 -168q96 63 245.5 115.5t266.5 52.5q155 0 229 -102q56 -78 57 -180q0 -32 -6 -66l-121 -758h-49l121 758q5 31 5 59q0 89 -48 154q-63 86 -196 86q-205 0 -496 -144q12 -45 13 -94q0 -30 -5 -61l-121 -758h-49 l121 758q5 30 5 58q-1 89 -49 155q-64 86 -196 86q-127 0 -228 -29t-235 -96l-147 -932h-49z" /> +<glyph unicode="n" horiz-adv-x="1105" d="M123 0l172 1087h29v-126q248 145 467 145q155 0 229 -102q56 -78 57 -180q0 -32 -6 -66l-121 -758h-49l121 758q5 30 5 58q-1 89 -49 155q-64 86 -196 86q-127 0 -228 -29t-235 -96l-147 -932h-49z" /> +<glyph unicode="o" horiz-adv-x="1146" d="M186 543q51 326 169 440.5t370 114.5q256 0 332 -140q46 -85 46 -229q0 -95 -20 -215q-47 -299 -161.5 -411.5t-372.5 -112.5q-262 0 -336 125q-45 76 -45 219q0 91 18 209zM218 342q0 -11 -1 -21q1 -66 15 -112q16 -53 41.5 -87t71.5 -52.5t94 -24.5t120 -6 q106 0 177 18.5t133.5 70.5t101.5 149.5t63 250.5q20 98 20 175q0 27 -2 51q-10 92 -29 149.5t-68.5 90t-104.5 44t-135 11.5q-104 0 -170 -15.5t-131.5 -65.5t-107 -158t-70.5 -282q-16 -106 -18 -186z" /> +<glyph unicode="p" horiz-adv-x="1079" d="M35 -553l260 1632q131 20 465 21q188 0 260 -150q45 -95 45 -233q0 -83 -16 -182q-20 -131 -51 -225.5t-83.5 -172.5t-135.5 -117.5t-197 -39.5q-80 0 -198 21.5t-204 57.5l-96 -612h-49zM186 92q242 -63 400 -63q182 0 276 129t137 391q15 89 15 165q0 116 -35 200 q-57 137 -231 137h-410z" /> +<glyph unicode="q" horiz-adv-x="1130" d="M170 271q-1 21 -1 44q0 113 19 252q86 532 465 533q336 0 459 -21l-258 -1632h-49l96 612q-96 -37 -221 -58t-205 -21q-150 0 -225.5 80.5t-79.5 210.5zM238 549q-19 -116 -19 -206q0 -113 30 -185q54 -129 236 -129q162 0 422 63l152 959h-412q-174 0 -273 -136.5 t-136 -365.5z" /> +<glyph unicode="r" horiz-adv-x="804" d="M123 0l172 1087h24l3 -137q92 49 146 74t146.5 50.5t178.5 25.5q104 0 149 -17l-8 -47q-66 14 -150 15q-45 0 -89 -6.5t-72.5 -12.5t-78.5 -24.5t-68.5 -26.5t-81 -35.5t-79.5 -36.5l-143 -909h-49z" /> +<glyph unicode="s" horiz-adv-x="1032" d="M131 10l4 29h500q49 0 77.5 4t68.5 20.5t65.5 58.5t36.5 109l16 101q3 17 3 32q0 59 -36 100q-45 52 -149 52h-268q-157 0 -213 45q-39 32 -40 116q0 35 7 79l14 94q20 129 94 188.5t230 59.5q283 0 471 -19l-6 -28h-474q-127 0 -188 -50.5t-78 -162.5l-14 -95 q-6 -33 -6 -58.5t5 -43.5t12 -31.5t23.5 -21.5t30 -12.5t39.5 -7.5q28 -3 46 -3h55h262q119 -1 183 -67q50 -51 51 -130q0 -23 -5 -49l-16 -100q-10 -63 -34 -108t-50.5 -69t-70.5 -36t-74.5 -14t-79.5 -2q-304 0 -492 20z" /> +<glyph unicode="t" horiz-adv-x="704" d="M188 1040l7 33l174 17l63 303h33l-47 -303h358l-8 -50h-358l-105 -655q-10 -66 -11 -119v-17q0 -42 4 -70q5 -34 20.5 -59.5t26.5 -37.5t34.5 -20.5t31 -10.5t29.5 -4q127 -22 147 -22h1l-4 -27h-129q-131 0 -181 93q-31 56 -31 152q0 63 13 142l104 655h-172z" /> +<glyph unicode="u" horiz-adv-x="1103" d="M154 332l120 758h50l-121 -758q-5 -31 -4 -59q0 -89 47 -154q63 -86 196 -86q127 0 228.5 28.5t234.5 96.5l148 932h49l-172 -1088h-29v127q-248 -145 -465 -145q-156 0 -230 102q-57 78 -57 181q0 31 5 65z" /> +<glyph unicode="v" horiz-adv-x="1091" d="M193 1087h49l262 -1019l495 850q68 119 76 172h31q2 -9 2 -19q0 -56 -61 -170l-523 -901h-57z" /> +<glyph unicode="w" horiz-adv-x="1650" d="M193 1087h49l260 -1021l489 845q74 129 80 174h31q2 -8 2 -18q0 -54 -64 -170l-129 -223l158 -613l496 852q74 127 80 177h30q2 -8 2 -18q0 -55 -63 -171l-522 -901h-56l-159 614l-357 -614h-53z" /> +<glyph unicode="x" horiz-adv-x="909" d="M49 0l479 545l-307 542h66l282 -497l439 497h65l-479 -542l307 -545h-65l-281 498l-440 -498h-66z" /> +<glyph unicode="y" horiz-adv-x="1097" d="M193 1087h49l168 -849q12 -59 35.5 -100.5t50 -58t51 -23.5t41.5 -6l16 1l420 879q47 104 57 172h31q4 -15 4 -33q0 -59 -45 -156l-436 -911q-10 -23 -27.5 -59.5t-70 -132t-102.5 -169t-115.5 -133t-120.5 -59.5v29h1q117 0 324 408q55 114 56 114q-23 2 -48.5 9 t-61.5 27.5t-64.5 70t-43.5 118.5z" /> +<glyph unicode="z" horiz-adv-x="919" d="M92 2l8 49l867 987h-742l8 49h811l-8 -49l-868 -987h713q-8 -49 -9 -49h-780z" /> +<glyph unicode="{" horiz-adv-x="532" d="M137 778l8 56q188 16 209 149l78 498q27 170 113 268t274 98l-8 -47q-141 0 -222 -76.5t-110 -257.5l-76 -483q-12 -72 -66 -119t-126 -57q66 -10 105.5 -58.5t29.5 -111.5l-94 -592q-27 -170 30.5 -237.5t202.5 -67.5l-8 -47q-109 0 -175 34.5t-84.5 88t-23 119 t10.5 124.5l90 570q12 70 -39 111.5t-119 37.5z" /> +<glyph unicode="|" horiz-adv-x="440" d="M152 -147l272 1724h49l-272 -1724h-49z" /> +<glyph unicode="}" horiz-adv-x="528" d="M-27 -307l9 47q145 0 223 67.5t104 237.5l94 592q10 63 65.5 111.5t123.5 58.5q-68 10 -108 57t-27 119l75 483q29 182 -28.5 260t-196.5 78l8 43q326 0 265 -395l-74 -469q-6 -41 7 -70.5t41 -46t54.5 -23.5t57.5 -9l-9 -56q-66 4 -130 -38t-76 -111l-95 -594 q-10 -72 -27.5 -123t-57.5 -106.5t-114.5 -84t-183.5 -28.5z" /> +<glyph unicode="~" horiz-adv-x="999" d="M287 1171q154 119 235 119q41 0 124 -74.5t114 -74.5q14 0 30.5 3t30 7t30.5 13.5t27.5 15.5t29 18t25.5 17.5t25.5 18.5t20.5 15l10 -14q-53 -45 -80.5 -65.5t-70.5 -41t-84 -20.5q-45 0 -125 74.5t-111 74.5q-16 0 -31.5 -2t-33 -9t-29.5 -12t-31.5 -17.5t-30 -17.5 t-35 -21.5t-32.5 -22.5z" /> +<glyph unicode="¢" horiz-adv-x="978" d="M141.5 346q2.5 92 22.5 213q18 121 45 211t62.5 147.5t73.5 94.5t90 55t99.5 24.5t112.5 6.5l27 168h37l-27 -170q160 -10 326 -52l-4 -28q-219 33 -402 33q-78 0 -131 -18.5t-105.5 -71t-90 -157t-62.5 -265.5q-25 -125 -19.5 -213t20.5 -144.5t52 -87.5t78 -42t98 -11 l428 43l-6 -33q-186 -51 -356 -57l-27 -160h-37l25 158q-63 -2 -110.5 6t-91.5 29.5t-70.5 62.5t-43 103.5t-14 154.5z" /> +<glyph unicode="£" horiz-adv-x="1144" d="M102 0l4 29l152 20l104 668h-147l6 28l150 17l43 272q20 127 59 216t83 137.5t114.5 74t130 31.5t153.5 6l338 -18l-6 -29h-336q-92 0 -151.5 -7t-120 -31.5t-98 -70t-68.5 -122t-49 -187.5l-43 -272l594 -17l-6 -28h-596l-105 -668h756l-8 -49h-953z" /> +<glyph unicode="¥" horiz-adv-x="1193" d="M217 406l4 28h402l30 195h-401l4 28h399l-360 842h55l338 -790l629 790h63l-671 -842h421l-4 -28h-424l-30 -195h424l-4 -28h-424l-64 -406h-49l63 406h-401z" /> +<glyph unicode="¨" horiz-adv-x="907" d="M289 1192q6 35 43 35q35 0 28 -35q-8 -37 -41 -37q-16 0 -24 11.5t-6 25.5zM811 1192q6 35 43 35q35 0 29 -35q-8 -37 -41 -37q-16 0 -24.5 11.5t-6.5 25.5z" /> +<glyph unicode="©" horiz-adv-x="1775" d="M214 574.5q5 99.5 13 185.5q16 109 45 206t80 197.5t115.5 173t161 117.5t209.5 45h524q115 0 191.5 -55t110.5 -135t45 -189.5t5 -196.5t-20 -178q-51 -319 -199.5 -532t-368.5 -213h-524q-109 0 -188.5 52t-118.5 136t-62.5 185.5t-18.5 201zM241.5 505 q12.5 -128 48.5 -234.5t117.5 -174t196.5 -67.5h526q182 0 331 191.5t204 533.5q27 201 17.5 359.5t-91.5 257.5t-229 99h-528q-197 0 -354.5 -166.5t-223.5 -549.5q-27 -121 -14.5 -249zM586 754q72 440 366 440q170 0 359 -35l-2 -18q-170 25 -361 24q-266 0 -334 -424 q-33 -203 13.5 -307t187.5 -104q238 0 383 32l-4 -18q-160 -43 -383 -43q-137 0 -200.5 100.5t-24.5 352.5z" /> +<glyph unicode="«" horiz-adv-x="1150" d="M217 725l485 418l31 -35l-446 -387l327 -391l-34 -33zM596 725l485 418l31 -35l-450 -385l335 -395l-39 -31z" /> +<glyph unicode="­" horiz-adv-x="677" d="M123 569l8 49h582l-8 -49h-582z" /> +<glyph unicode="®" horiz-adv-x="1775" d="M214 573.5q5 98.5 13 184.5q16 109 45 207t80 197.5t115.5 172t161 118.5t209.5 46h524q115 0 191.5 -55t110.5 -135t45 -189.5t5 -196.5t-20 -178q-51 -319 -199.5 -532t-368.5 -213h-524q-109 0 -188.5 52t-118.5 135t-62.5 185.5t-18.5 201zM241.5 505 q12.5 -128 46.5 -234.5t115.5 -174t196.5 -67.5h530q182 0 331 191.5t204 533.5q27 201 17.5 359.5t-90.5 257.5t-228 99h-530q-197 0 -354.5 -166.5t-223.5 -549.5q-27 -121 -14.5 -249zM590 313l137 875h363q117 0 177 -58.5t36 -207.5q-8 -55 -29 -96.5t-39 -63 t-52 -33.5t-51.5 -15t-51 -4t-40.5 -1l166 -396h-30l-166 394l-328 10l-64 -404h-28zM684 735h346q113 0 169 38t75 155q20 125 -26 178t-150 53h-346z" /> +<glyph unicode="´" horiz-adv-x="403" d="M213 1087l291 273h53l-315 -273h-29z" /> +<glyph unicode="¸" horiz-adv-x="555" d="M45 -354l2 14l70 10q68 10 100.5 24.5t63 69t45.5 160.5h34q-25 -158 -76 -218t-175 -60h-64z" /> +<glyph unicode="»" horiz-adv-x="1144" d="M166 334l461 397l-322 379l37 33l352 -418l-497 -428zM545 334l463 395l-324 383l37 31l352 -418l-498 -428z" /> +<glyph unicode="À" horiz-adv-x="1316" d="M92 0l799 1499h70l299 -1499h-50l-104 518h-682l-274 -518h-58zM451 567h645l-176 885zM702 1905h54l205 -273h-29z" /> +<glyph unicode="Â" horiz-adv-x="1316" d="M92 0l799 1499h70l299 -1499h-50l-104 518h-682l-274 -518h-58zM451 567h645l-176 885zM668 1632l313 266h43l201 -266h-35l-193 236l-292 -236h-37z" /> +<glyph unicode="Æ" horiz-adv-x="1835" d="M61 0l961 1208q134 168 182 210q104 89 271 81l542 -20l-4 -29h-547q-45 0 -78.5 -5t-56 -9t-40 -20.5t-28 -25t-17.5 -36t-10 -38.5t-8 -50t-7 -54l-72 -444l674 -10l-6 -29l-674 -10l-76 -467q-20 -127 35 -168t162 -41h526l-4 -29l-512 -20q-57 -2 -102.5 6 t-88.5 31.5t-60 79t-5 137.5l43 268h-531l-407 -516h-62zM571 565h498l123 781z" /> +<glyph unicode="Ç" horiz-adv-x="1155" d="M240 770q31 190 69.5 317t108 229.5t176 151t260.5 48.5q176 0 434 -50l-4 -28l-14 2q-14 2 -40 4t-58.5 5t-72.5 6t-81 5t-85 4t-83 2q-160 0 -262.5 -58t-178 -217t-120.5 -441q-113 -713 338 -713q96 0 205.5 6t171.5 12l61 6l-4 -28q-250 -45 -445 -45 q-499 0 -376 782zM397 -352l2 14l68 10q68 10 100.5 24.5t63.5 69t45 160.5h35q-25 -160 -76 -219t-174 -59h-64z" /> +<glyph unicode="È" d="M201 262l155 981q23 139 106 199.5t193 56.5l607 -20l-5 -29h-608q-209 0 -243 -217l-74 -465l733 -10l-4 -29l-737 -10l-74 -467q-20 -127 35 -168t161 -41h588l-4 -29l-592 -20q-123 -4 -192.5 53t-44.5 215zM635 1894h53l205 -272h-29z" /> +<glyph unicode="É" d="M201 262l155 981q23 139 106 199.5t193 56.5l607 -20l-5 -29h-608q-209 0 -243 -217l-74 -465l733 -10l-4 -29l-737 -10l-74 -467q-20 -127 35 -168t161 -41h588l-4 -29l-592 -20q-123 -4 -192.5 53t-44.5 215zM836 1622l290 272h54l-316 -272h-28z" /> +<glyph unicode="Ê" d="M201 262l155 981q23 139 106 199.5t193 56.5l607 -20l-5 -29h-608q-209 0 -243 -217l-74 -465l733 -10l-4 -29l-737 -10l-74 -467q-20 -127 35 -168t161 -41h588l-4 -29l-592 -20q-123 -4 -192.5 53t-44.5 215zM602 1622l313 266h43l201 -266h-35l-192 236l-293 -236h-37 z" /> +<glyph unicode="Ë" d="M201 262l155 981q23 139 106 199.5t193 56.5l607 -20l-5 -29h-608q-209 0 -243 -217l-74 -465l733 -10l-4 -29l-737 -10l-74 -467q-20 -127 35 -168t161 -41h588l-4 -29l-592 -20q-123 -4 -192.5 53t-44.5 215zM580 1726q6 35 43 35q35 0 28 -35q-8 -37 -41 -36 q-16 0 -24 11t-6 25zM1102 1726q6 35 43 35q35 0 29 -35q-8 -37 -41 -36q-16 0 -24.5 11t-6.5 25z" /> +<glyph unicode="Î" horiz-adv-x="393" d="M184 0l238 1499h49l-238 -1499h-49zM188 1632l314 266h43l200 -266h-34l-193 236l-293 -236h-37z" /> +<glyph unicode="Ï" horiz-adv-x="393" d="M176 1669q6 35 43 35q35 0 29 -35q-8 -37 -41 -37q-16 0 -24.5 11.5t-6.5 25.5zM184 0l238 1499h49l-238 -1499h-49zM698 1669q6 35 43 35q35 0 29 -35q-8 -37 -41 -37q-16 0 -24.5 11.5t-6.5 25.5z" /> +<glyph unicode="Ô" horiz-adv-x="1400" d="M210 412.5q-1 138.5 32 341.5q33 207 81 348t101 221t136 122t159 53t196 11q98 0 164 -9t128.5 -37.5t95 -82t53 -139.5t15.5 -214t-32 -302q-31 -197 -75.5 -331t-98 -213t-134.5 -122t-160.5 -55t-202.5 -12t-198 13t-141.5 58.5t-92 128t-26.5 221zM260 432 q-2 -123 19.5 -201.5t79 -119.5t130 -55.5t191.5 -14.5q113 0 189.5 14.5t147 56.5t119 119.5t87.5 201.5t67 306q31 197 30 330t-24.5 211t-85 118t-128 51t-177.5 11q-68 0 -110.5 -3t-97 -12t-91.5 -30.5t-80 -55.5t-73.5 -88t-61.5 -128t-55.5 -175.5t-44.5 -228.5 q-29 -184 -31 -307zM657 1632l314 266h43l200 -266h-34l-193 236l-293 -236h-37z" /> +<glyph unicode="Ù" horiz-adv-x="1394" d="M244 376q-1 118 24 279l133 844h50l-134 -844q-14 -90 -21 -165.5t-3 -134t10 -103.5t25.5 -78t36 -56.5t50.5 -37.5t56.5 -23.5t67.5 -12.5t73.5 -4t81.5 -1q63 0 107.5 3t99.5 17.5t94 39t82 69.5t74 109.5t59.5 159.5t46.5 218l134 844h49l-133 -844q-16 -98 -36 -179 t-44.5 -143.5t-49 -112.5t-58.5 -85t-61.5 -60.5t-68.5 -41t-68.5 -24.5t-73.5 -13t-72.5 -5t-76.5 -1q-202 0 -278 30q-173 68 -176 356zM698 1905h54l204 -273h-28z" /> +<glyph unicode="Û" horiz-adv-x="1394" d="M244 376q-1 118 24 279l133 844h50l-134 -844q-14 -90 -21 -165.5t-3 -134t10 -103.5t25.5 -78t36 -56.5t50.5 -37.5t56.5 -23.5t67.5 -12.5t73.5 -4t81.5 -1q63 0 107.5 3t99.5 17.5t94 39t82 69.5t74 109.5t59.5 159.5t46.5 218l134 844h49l-133 -844q-16 -98 -36 -179 t-44.5 -143.5t-49 -112.5t-58.5 -85t-61.5 -60.5t-68.5 -41t-68.5 -24.5t-73.5 -13t-72.5 -5t-76.5 -1q-202 0 -278 30q-173 68 -176 356zM664 1632l313 266h43l201 -266h-35l-193 236l-293 -236h-36z" /> +<glyph unicode="Ü" horiz-adv-x="1394" d="M244 376q-1 118 24 279l133 844h50l-134 -844q-14 -90 -21 -165.5t-3 -134t10 -103.5t25.5 -78t36 -56.5t50.5 -37.5t56.5 -23.5t67.5 -12.5t73.5 -4t81.5 -1q63 0 107.5 3t99.5 17.5t94 39t82 69.5t74 109.5t59.5 159.5t46.5 218l134 844h49l-133 -844q-16 -98 -36 -179 t-44.5 -143.5t-49 -112.5t-58.5 -85t-61.5 -60.5t-68.5 -41t-68.5 -24.5t-73.5 -13t-72.5 -5t-76.5 -1q-202 0 -278 30q-173 68 -176 356zM651 1669q6 35 43 35q35 0 29 -35q-8 -37 -41 -37q-16 0 -24.5 11.5t-6.5 25.5zM1174 1669q6 35 43 35q35 0 28 -35q-8 -37 -41 -37 q-16 0 -24 11.5t-6 25.5z" /> +<glyph unicode="à" horiz-adv-x="1116" d="M162.5 325.5q-7.5 102.5 21.5 245.5q25 135 64 233.5t81 152t100 88t101 45t105 18.5q115 14 251 -20.5t212 -106.5l-144 -981h-28l2 123q-63 -41 -191.5 -89t-232.5 -48q-76 0 -131.5 15t-106.5 53t-73.5 103.5t-30 168zM223 504q-35 -229 30.5 -350t233.5 -121 q37 0 71 3t73 12t58.5 12t65.5 21.5t54 21.5t62.5 27t56.5 24l119 821q-184 115 -414 84q-182 -25 -273.5 -144.5t-136.5 -410.5zM477 1507h53l205 -272h-28z" /> +<glyph unicode="â" horiz-adv-x="1116" d="M162.5 325.5q-7.5 102.5 21.5 245.5q25 135 64 233.5t81 152t100 88t101 45t105 18.5q115 14 251 -20.5t212 -106.5l-144 -981h-28l2 123q-63 -41 -191.5 -89t-232.5 -48q-76 0 -131.5 15t-106.5 53t-73.5 103.5t-30 168zM223 504q-35 -229 30.5 -350t233.5 -121 q37 0 71 3t73 12t58.5 12t65.5 21.5t54 21.5t62.5 27t56.5 24l119 821q-184 115 -414 84q-182 -25 -273.5 -144.5t-136.5 -410.5zM442 1235l314 266h43l200 -266h-34l-193 235l-293 -235h-37z" /> +<glyph unicode="æ" horiz-adv-x="1972" d="M80.5 325.5q-7.5 102.5 21.5 245.5q25 135 65 233.5t82 152t101.5 88t102.5 45t104 18.5q102 12 251.5 -28t235.5 -107q117 135 375 135q207 0 307.5 -71.5t77.5 -241.5q-16 -127 -104 -205t-202 -100.5t-236.5 -22.5t-205.5 13.5t-114 25.5q-20 -156 -9 -260.5 t66.5 -156.5t163.5 -54q164 -2 484 43l-7 -33q-217 -59 -477 -59q-207 0 -262 166q-8 -4 -56 -31t-71.5 -38t-74 -33.5t-88.5 -34t-89 -20.5t-100 -9q-76 0 -131 15t-106.5 53t-74 103.5t-30 168zM141 504q-35 -229 31 -350t234 -121q59 0 135.5 19.5t112.5 32.5t134.5 57 t102.5 46q-29 133 12 381q43 248 117 375q-260 143 -469 115q-182 -25 -273.5 -144.5t-136.5 -410.5zM946 535q16 -2 43 -7.5t107 -11.5t152.5 -6t163.5 14.5t159.5 43t120 87t61.5 140.5q18 143 -64.5 203.5t-254.5 60.5q-113 0 -194 -29t-126 -59.5t-81 -114.5t-47 -130 t-36 -172q-2 -13 -4 -19z" /> +<glyph unicode="ç" horiz-adv-x="1011" d="M167.5 317.5q-6.5 100.5 20.5 241.5q27 172 71 283.5t104.5 165t122 72t149.5 18.5q170 0 397 -54l-6 -28q-217 33 -399 33q-78 0 -132.5 -18.5t-106.5 -71t-90 -157t-62 -265.5q-25 -125 -20 -213t20.5 -144.5t53.5 -87.5t79 -42t98 -11q84 0 190.5 11t170.5 22l65 10 l-4 -33q-209 -57 -430 -59q-66 0 -114 13t-91 49t-61.5 100.5t-25 165zM233 -350l3 14l69 10q68 10 100.5 24.5t63.5 69t45 160.5h35q-25 -158 -76 -218t-176 -60h-64z" /> +<glyph unicode="è" horiz-adv-x="1099" d="M178 569q18 111 35.5 178.5t54.5 144.5t88.5 119t136.5 69.5t201 27.5q207 0 307.5 -71.5t77.5 -241.5q-16 -127 -104 -205t-202 -100.5t-236.5 -22.5t-205.5 13.5t-114 25.5q-33 -246 13 -357.5t204 -113.5q168 -2 488 43l-7 -33q-217 -59 -477 -59q-193 0 -252 140 t-8 443zM221 535q16 -2 43 -7.5t107 -11.5t152.5 -6t163.5 14.5t159.5 43t120 87t61.5 140.5q18 143 -64.5 203.5t-252.5 60.5q-82 0 -146.5 -14.5t-108.5 -32t-80 -58.5t-55.5 -69.5t-40 -93t-27.5 -99.5t-24 -116q-6 -27 -8 -41zM471 1503h53l205 -272h-29z" /> +<glyph unicode="é" horiz-adv-x="1099" d="M178 569q18 111 35.5 178.5t54.5 144.5t88.5 119t136.5 69.5t201 27.5q207 0 307.5 -71.5t77.5 -241.5q-16 -127 -104 -205t-202 -100.5t-236.5 -22.5t-205.5 13.5t-114 25.5q-33 -246 13 -357.5t204 -113.5q168 -2 488 43l-7 -33q-217 -59 -477 -59q-193 0 -252 140 t-8 443zM221 535q16 -2 43 -7.5t107 -11.5t152.5 -6t163.5 14.5t159.5 43t120 87t61.5 140.5q18 143 -64.5 203.5t-252.5 60.5q-82 0 -146.5 -14.5t-108.5 -32t-80 -58.5t-55.5 -69.5t-40 -93t-27.5 -99.5t-24 -116q-6 -27 -8 -41zM700 1231l291 272h53l-315 -272h-29z" /> +<glyph unicode="ê" horiz-adv-x="1099" d="M178 569q18 111 35.5 178.5t54.5 144.5t88.5 119t136.5 69.5t201 27.5q207 0 307.5 -71.5t77.5 -241.5q-16 -127 -104 -205t-202 -100.5t-236.5 -22.5t-205.5 13.5t-114 25.5q-33 -246 13 -357.5t204 -113.5q168 -2 488 43l-7 -33q-217 -59 -477 -59q-193 0 -252 140 t-8 443zM221 535q16 -2 43 -7.5t107 -11.5t152.5 -6t163.5 14.5t159.5 43t120 87t61.5 140.5q18 143 -64.5 203.5t-252.5 60.5q-82 0 -146.5 -14.5t-108.5 -32t-80 -58.5t-55.5 -69.5t-40 -93t-27.5 -99.5t-24 -116q-6 -27 -8 -41zM436 1231l314 266h43l200 -266h-35 l-192 235l-293 -235h-37z" /> +<glyph unicode="ë" horiz-adv-x="1099" d="M178 569q18 111 35.5 178.5t54.5 144.5t88.5 119t136.5 69.5t201 27.5q207 0 307.5 -71.5t77.5 -241.5q-16 -127 -104 -205t-202 -100.5t-236.5 -22.5t-205.5 13.5t-114 25.5q-33 -246 13 -357.5t204 -113.5q168 -2 488 43l-7 -33q-217 -59 -477 -59q-193 0 -252 140 t-8 443zM221 535q16 -2 43 -7.5t107 -11.5t152.5 -6t163.5 14.5t159.5 43t120 87t61.5 140.5q18 143 -64.5 203.5t-252.5 60.5q-82 0 -146.5 -14.5t-108.5 -32t-80 -58.5t-55.5 -69.5t-40 -93t-27.5 -99.5t-24 -116q-6 -27 -8 -41zM424 1268q6 35 43 35q35 0 29 -35 q-8 -37 -41 -37q-16 0 -24.5 11.5t-6.5 25.5zM946 1268q6 35 43 35q35 0 29 -35q-8 -37 -41 -37q-16 0 -24.5 11.5t-6.5 25.5z" /> +<glyph unicode="î" horiz-adv-x="337" d="M-25 1221l314 266h43l200 -266h-34l-193 235l-293 -235h-37zM123 0l172 1087h49l-172 -1087h-49z" /> +<glyph unicode="ï" horiz-adv-x="337" d="M-37 1257q6 35 43 35q35 0 29 -35q-8 -37 -41 -36q-16 0 -24.5 11t-6.5 25zM123 0l172 1087h49l-172 -1087h-49zM485 1257q6 35 43 35q35 0 29 -35q-8 -37 -41 -36q-16 0 -24.5 11t-6.5 25z" /> +<glyph unicode="ô" horiz-adv-x="1146" d="M186 543q51 326 169 440.5t370 114.5q256 0 332 -140.5t26 -443.5q-47 -299 -161.5 -411.5t-372.5 -112.5q-262 0 -336 125t-27 428zM217.5 342q-2.5 -80 14 -133t42 -87t71.5 -52.5t94 -24.5t120 -6q106 0 177 18.5t133.5 70.5t101.5 149.5t63 250.5q27 133 17.5 225.5 t-28.5 150t-68.5 90t-104.5 44t-135 11.5q-104 0 -170 -15.5t-131.5 -65.5t-107 -158t-70.5 -282q-16 -106 -18.5 -186zM467 1221l313 266h43l201 -266h-35l-192 235l-293 -235h-37z" /> +<glyph unicode="ù" horiz-adv-x="1103" d="M154 332l120 758h50l-121 -758q-20 -127 43 -213t196 -86q127 0 228.5 28.5t234.5 96.5l148 932h49l-172 -1088h-29v127q-248 -145 -465 -145q-156 0 -230.5 102.5t-51.5 245.5zM465 1493h53l205 -272h-29z" /> +<glyph unicode="û" horiz-adv-x="1103" d="M154 332l120 758h50l-121 -758q-20 -127 43 -213t196 -86q127 0 228.5 28.5t234.5 96.5l148 932h49l-172 -1088h-29v127q-248 -145 -465 -145q-156 0 -230.5 102.5t-51.5 245.5zM430 1221l313 266h43l201 -266h-35l-192 235l-293 -235h-37z" /> +<glyph unicode="ü" horiz-adv-x="1103" d="M154 332l120 758h50l-121 -758q-20 -127 43 -213t196 -86q127 0 228.5 28.5t234.5 96.5l148 932h49l-172 -1088h-29v127q-248 -145 -465 -145q-156 0 -230.5 102.5t-51.5 245.5zM418 1257q6 35 43 35q35 0 28 -35q-8 -37 -40 -36q-16 0 -24.5 11t-6.5 25zM940 1257 q6 35 43 35q35 0 29 -35q-8 -37 -41 -36q-16 0 -24.5 11t-6.5 25z" /> +<glyph unicode="ÿ" horiz-adv-x="1097" d="M193 1087h49l168 -849q12 -59 35.5 -100.5t50 -58t51 -23.5t41.5 -6l16 1l420 879q47 104 57 172h31q18 -63 -41 -189l-436 -911q-10 -23 -27.5 -59.5t-70 -132t-102.5 -169t-115.5 -133t-120.5 -59.5v29q117 -2 325 408q55 114 56 114q-23 2 -48.5 9t-61.5 27.5 t-64.5 70t-43.5 118.5zM379 1315q6 35 43 35q35 0 29 -35q-8 -37 -41 -37q-16 0 -24.5 11.5t-6.5 25.5zM901 1315q6 35 43 35q35 0 29 -35q-8 -37 -41 -37q-16 0 -24.5 11.5t-6.5 25.5z" /> +<glyph unicode="Œ" horiz-adv-x="2099" d="M208 412.5q-1 138.5 32 341.5q33 207 81 348t101 221t136 122t159 53t196 11q209 0 315.5 -60t133.5 -245q14 156 97 227.5t210 67.5l543 -20l-4 -29h-547q-209 0 -244 -217l-74 -465l672 -10l-4 -29l-676 -10l-73 -467q-20 -127 35 -168t161 -41h527l-5 -29l-530 -20 q-125 -6 -195.5 58.5t-40.5 219.5q-82 -172 -206.5 -226t-341.5 -54q-123 0 -198 13t-141.5 58.5t-92 128t-26.5 221zM258 432q-2 -123 19.5 -201.5t79 -119.5t130 -55.5t191.5 -14.5q113 0 189.5 14.5t147 56.5t119 119.5t87.5 201.5t67 306q31 197 30 330t-24.5 211 t-85 118t-128 51t-177.5 11q-68 0 -110.5 -3t-97 -12t-91.5 -30.5t-80 -55.5t-73.5 -88t-61.5 -128t-55.5 -175.5t-44.5 -228.5q-29 -184 -31 -307z" /> +<glyph unicode="œ" horiz-adv-x="1978" d="M186 543q51 326 169 440.5t370 114.5q180 0 269 -70t106 -213q49 143 154.5 217t304.5 76q205 4 306 -69.5t79 -243.5q-16 -127 -104.5 -205t-202 -100.5t-236.5 -22.5t-206 13.5t-114 25.5q-39 -238 11.5 -353.5t205.5 -117.5q168 -2 488 43l-6 -33q-217 -59 -477 -59 q-135 0 -204 66.5t-79 207.5q-57 -147 -167 -208.5t-304 -61.5q-262 0 -336 125t-27 428zM217.5 342q-2.5 -80 14 -133t42 -87t71.5 -52.5t94 -24.5t120 -6q106 0 177 18.5t133.5 70.5t101.5 149.5t63 250.5q27 133 17.5 225.5t-28.5 150t-68.5 90t-104.5 44t-135 11.5 q-104 0 -170 -15.5t-131.5 -65.5t-107 -158t-70.5 -282q-16 -106 -18.5 -186zM1087 535q20 -4 64.5 -9.5t141 -13.5t188.5 3t183 35.5t153.5 87t74.5 157.5q18 143 -64.5 203.5t-252.5 60.5q-131 0 -219 -32t-141.5 -102.5t-81.5 -159.5t-46 -230z" /> +<glyph unicode="Ÿ" horiz-adv-x="1286" d="M307 1499h55l320 -901l651 901h60l-693 -967l-84 -532h-49l84 532zM580 1669q6 35 43 35q35 0 28 -35q-8 -37 -41 -37q-16 0 -24 11.5t-6 25.5zM1102 1669q6 35 43 35q35 0 29 -35q-8 -37 -41 -37q-16 0 -24.5 11.5t-6.5 25.5z" /> +<glyph unicode="ˆ" horiz-adv-x="684" d="M135 1087l314 267h43l200 -267h-35l-192 236l-293 -236h-37z" /> +<glyph unicode="˚" horiz-adv-x="718" d="M286.5 1294q14.5 88 86 149.5t157.5 61.5t136.5 -61.5t36 -149.5t-84 -148.5t-155.5 -60.5t-138.5 60.5t-38 148.5zM317.5 1294.5q-12.5 -73.5 32.5 -126t119 -52.5t133.5 52.5t71.5 126t-32 127t-117.5 53.5t-134 -53.5t-73 -127z" /> +<glyph unicode="˜" horiz-adv-x="1015" d="M274 1171q154 119 236 119q41 0 124 -74.5t114 -74.5q14 0 30.5 3t29.5 7t30.5 13.5t28 15.5t28.5 18t25.5 17.5t26 18.5t20.5 15l10 -14q-53 -45 -81 -65.5t-71 -41t-84 -20.5q-45 0 -124.5 74.5t-110.5 74.5q-16 0 -31.5 -2t-32.5 -9l-30 -12q-13 -5 -32.5 -17.5 t-29.5 -17.5t-34.5 -21.5t-32.5 -22.5z" /> +<glyph unicode=" " horiz-adv-x="952" /> +<glyph unicode=" " horiz-adv-x="1905" /> +<glyph unicode=" " horiz-adv-x="952" /> +<glyph unicode=" " horiz-adv-x="1905" /> +<glyph unicode=" " horiz-adv-x="635" /> +<glyph unicode=" " horiz-adv-x="476" /> +<glyph unicode=" " horiz-adv-x="317" /> +<glyph unicode=" " horiz-adv-x="317" /> +<glyph unicode=" " horiz-adv-x="238" /> +<glyph unicode=" " horiz-adv-x="381" /> +<glyph unicode=" " horiz-adv-x="105" /> +<glyph unicode="‐" horiz-adv-x="677" d="M123 569l8 49h582l-8 -49h-582z" /> +<glyph unicode="‑" horiz-adv-x="677" d="M123 569l8 49h582l-8 -49h-582z" /> +<glyph unicode="‒" horiz-adv-x="677" d="M123 569l8 49h582l-8 -49h-582z" /> +<glyph unicode="–" horiz-adv-x="884" d="M123 563l8 51h969l-8 -51h-969z" /> +<glyph unicode="—" horiz-adv-x="1517" d="M121 567l8 51h1425l-8 -51h-1425z" /> +<glyph unicode="‘" horiz-adv-x="346" d="M324 1206l34 213q6 45 29 64.5t42 16.5l20 -3l-5 -14q-33 2 -45 -39l-10 -76h14q31 0 25 -33l-20 -129q-6 -33 -35 -32h-25q-28 -1 -24 32z" /> +<glyph unicode="’" horiz-adv-x="346" d="M324 1176l2 14q39 -2 45 37l12 78h-14q-29 0 -27 30l25 131q6 33 34 33h23q31 0 27 -33l-37 -215q-8 -45 -31 -63.5t-41 -15.5z" /> +<glyph unicode="‚" horiz-adv-x="346" d="M119 -131l2 14q39 -2 45 39l12 78h-14q-29 0 -27 31l21 129q6 35 37 35h22q33 0 25 -35l-33 -213q-8 -45 -30.5 -64.5t-41.5 -16.5z" /> +<glyph unicode="“" horiz-adv-x="522" d="M313 1206l33 213q8 45 29.5 64.5t40.5 16.5l18 -3l-2 -14q-37 2 -43 -39l-12 -76h12q12 0 21.5 -9t7.5 -24l-21 -129q-6 -33 -39 -32h-22q-31 -1 -23 32zM510 1206l33 213q8 45 30.5 64.5t40.5 16.5l19 -3l-2 -14q-39 2 -45 -39l-13 -76h15q31 0 26 -33l-20 -129 q-6 -33 -37 -32h-22q-33 -1 -25 32z" /> +<glyph unicode="”" horiz-adv-x="520" d="M313 1176l2 14q37 -2 43 37l13 78h-13q-31 0 -24 30l20 131q6 33 35 33h23q31 0 26 -33l-35 -215q-8 -45 -30.5 -63.5t-40.5 -15.5zM510 1176l2 14q39 -2 45 37l12 78h-14q-31 0 -25 30l21 131q6 33 35 33h24q29 0 25 -33l-35 -215q-8 -45 -30.5 -63.5t-41.5 -15.5z" /> +<glyph unicode="„" horiz-adv-x="520" d="M109 -127l2 14q37 -2 43 39l12 78h-12q-31 0 -27 31l20 129q6 35 37 35h23q29 0 24 -35l-32 -213q-8 -45 -31 -64.5t-41 -16.5zM305 -127l2 14q39 -2 45 39l13 78h-15q-31 0 -26 31l20 129q6 35 37 35h25q27 0 22 -35l-33 -213q-8 -45 -30.5 -64.5t-40.5 -16.5z" /> +<glyph unicode="…" horiz-adv-x="1503" d="M301 25l23 127q4 25 28 24h23q25 0 20 -24l-22 -127q-4 -25 -27 -25h-24q-25 0 -21 25zM858 25l23 127q4 25 28 24h25q23 0 18 -24l-22 -127q-4 -25 -27 -25h-22q-27 0 -23 25zM1411 25l23 127q4 25 28 24h25q23 0 18 -24l-22 -127q-4 -25 -27 -25h-22q-27 0 -23 25z" /> +<glyph unicode=" " horiz-adv-x="381" /> +<glyph unicode="‹" horiz-adv-x="567" d="M78 725l487 416l31 -33l-455 -387l336 -389l-35 -33z" /> +<glyph unicode="›" horiz-adv-x="768" d="M217 334l465 395l-326 383l33 29l356 -416l-499 -426z" /> +<glyph unicode=" " horiz-adv-x="476" /> +<glyph unicode="€" horiz-adv-x="1490" d="M143 557l4 29l183 6l45 289l-178 6l4 26l180 9q34 224 101 341q144 252 472 253q219 0 435 -41l-5 -29q-29 2 -76.5 6t-163.5 9t-192 5q-111 0 -196.5 -31.5t-140 -79.5t-93.5 -123t-58.5 -145.5t-33.5 -164.5l582 -7l-4 -28l-584 -6l-45 -289l579 -8l-4 -29h-98 q-61 0 -189 -1t-213 -2t-83 -3q-41 -231 52 -369.5t298 -142.5q98 -2 212 4t177 13l64 7l-7 -30q-190 -43 -442 -43q-39 0 -77 5t-86 20.5t-86 41t-77 67.5t-57 101.5t-28.5 140t8.5 185.5z" /> +<glyph unicode="™" horiz-adv-x="1288" d="M96 1470l4 29h531l-4 -29h-250l-109 -686h-28l108 686h-252zM598 784l168 715h20l193 -670l379 670h24l-49 -715h-24l43 650l-367 -650h-20l-189 652l-151 -652h-27z" /> +<glyph unicode="" horiz-adv-x="1085" d="M0 1085h1085v-1085h-1085v1085z" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Thin-Italic-webfont.ttf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Thin-Italic-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d55e88d1b5ffefa951bd3eb3496f327a1d62cdd5 Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Thin-Italic-webfont.ttf differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Thin-Italic-webfont.woff b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Thin-Italic-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..29ff68c02b61b8b0924badee2ce7ff94bc198baf Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Thin-Italic-webfont.woff differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Thin-webfont.eot b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Thin-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..a8f2541a52c60cc869a9ac4b1ff15d07c8458ecf Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Thin-webfont.eot differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Thin-webfont.svg b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Thin-webfont.svg new file mode 100644 index 0000000000000000000000000000000000000000..ea897b67152ffbf2efcab37a67d2f2bcfb75e4d4 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Thin-webfont.svg @@ -0,0 +1,187 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Copyright c 2011 Natanael Gama exondiscoveredcom with Reserved Font Name Exo +Designer : Natanael Gama +</metadata> +<defs> +<font id="ExoThin" horiz-adv-x="1130" > +<font-face units-per-em="2048" ascent="1638" descent="-410" /> +<missing-glyph horiz-adv-x="573" /> +<glyph unicode=" " horiz-adv-x="573" /> +<glyph unicode="	" horiz-adv-x="573" /> +<glyph unicode=" " horiz-adv-x="573" /> +<glyph unicode="!" horiz-adv-x="532" d="M227 25v127q0 25 25 24h22q25 0 25 -24v-127q0 -25 -25 -25h-22q-25 0 -25 25zM240 1497h45l-11 -1096h-24z" /> +<glyph unicode=""" horiz-adv-x="536" d="M141 1362v137h52v-137l-13 -275h-24zM346 1362v137h51v-137l-12 -275h-25z" /> +<glyph unicode="#" horiz-adv-x="1339" d="M55 512l4 25h367l66 419h-367l6 25h365l84 518h24l-84 -518h381l82 518h25l-82 -518h362l-4 -25h-364l-66 -421h363l-5 -25h-362l-80 -510h-25l80 510l-381 2l-79 -512h-25l80 512h-365zM451 537l378 -2l66 421h-379z" /> +<glyph unicode="$" horiz-adv-x="1198" d="M152 1012v135q0 217 109.5 294t318.5 70v177h36v-179q182 -10 365 -36v-27l-434 16q-172 6 -259 -62.5t-87 -252.5v-135q0 -145 74.5 -198.5t226.5 -53.5h213q188 0 260 -79t72 -222v-140q0 -88 -25 -151.5t-62.5 -99t-97 -55t-116 -25.5t-130.5 -4v-164h-36v166 q-287 10 -392 28v31q135 -12 461 -12q168 0 258 60.5t90 225.5v140q0 133 -65.5 192.5t-216.5 59.5h-209q-92 0 -158.5 18.5t-103.5 45t-58.5 69.5t-27.5 81t-6 87z" /> +<glyph unicode="%" horiz-adv-x="1953" d="M117 971v272q0 135 57 195.5t207 60.5h207q145 0 202.5 -60.5t57.5 -195.5v-272q0 -135 -57.5 -195.5t-206.5 -60.5h-207q-145 0 -202.5 60.5t-57.5 195.5zM147 971q0 -129 53.5 -177.5t176.5 -48.5h207q125 0 179 47.5t54 178.5v272q0 123 -50 174t-179 51h-207 q-127 0 -180.5 -47t-53.5 -178v-272zM496 0l897 1499h43l-897 -1499h-43zM1108 262v273q0 135 57.5 195.5t206.5 60.5h207q145 0 202.5 -60.5t57.5 -195.5v-273q0 -135 -57.5 -195.5t-206.5 -60.5h-207q-145 0 -202.5 60.5t-57.5 195.5zM1139 262q0 -129 53 -177t176 -48 h207q125 0 179 47t54 178v273q0 123 -50 174t-179 51h-207q-127 0 -180 -47t-53 -178v-273z" /> +<glyph unicode="&" horiz-adv-x="1337" d="M96 478.5q25 152.5 164 271.5l176 149l-129 174q-82 109 -69.5 196t71 141t140.5 75q133 33 546 -2v-29h-415q-102 0 -182.5 -41t-107 -118.5t57.5 -192.5l592 -803l315 305l19 -16l-141 -176l-160 -152l192 -260h-63l-168 227l-148 -137q-121 -119 -299 -99.5 t-301 177.5q-115 158 -90 310.5zM145.5 471q-20.5 -137 79.5 -272q98 -131 251 -157t272 81l153 143l-436 590l-160 -133q-139 -115 -159.5 -252z" /> +<glyph unicode="'" horiz-adv-x="231" d="M90 1362v137h51v-137l-12 -275h-25z" /> +<glyph unicode="(" horiz-adv-x="645" d="M207 668q0 158 33.5 327.5t81 300.5t95.5 240t82 167l33 58h56q-14 -23 -36 -61.5t-79 -161.5t-101 -246t-80 -296t-36 -328q0 -172 35 -348.5t83 -305.5t97 -233.5t84 -157.5l35 -53h-58q-12 18 -34.5 52t-79 146.5t-99.5 233.5t-77.5 303.5t-34.5 362.5z" /> +<glyph unicode=")" horiz-adv-x="643" d="M55 -430q14 20 36 56t79 153t101 237.5t80 300t36 351.5q0 451 -263 967l-69 126h56q12 -23 34.5 -61.5t79 -160.5t99.5 -245t77.5 -296t34.5 -330q0 -180 -33.5 -360.5t-81 -307.5t-95.5 -228.5t-82 -151.5l-33 -50h-56z" /> +<glyph unicode="*" horiz-adv-x="960" d="M139 1212v29l291 8v-49zM303 838l68 274l53 -8l-94 -275zM422 1481l27 8l137 -252l-49 -23zM489 1014l25 47l242 -170l-17 -23zM580 1130l229 170l16 -24l-209 -184z" /> +<glyph unicode="+" horiz-adv-x="1067" d="M139 705v49h369v370h49v-370h373v-49h-373v-371h-49v371h-369z" /> +<glyph unicode="," horiz-adv-x="350" d="M141 27v127q0 27 25 26h20q25 0 25 -26v-230q0 -67 -53 -65l-13 2v12q33 0 33 31v96h-12q-25 0 -25 27z" /> +<glyph unicode="-" horiz-adv-x="692" d="M55 569v49h582v-49h-582z" /> +<glyph unicode="." horiz-adv-x="352" d="M141 25v127q0 25 25 24h22q25 0 25 -24v-127q0 -25 -25 -25h-22q-25 0 -25 25z" /> +<glyph unicode="/" horiz-adv-x="724" d="M55 -147l576 1724h39l-576 -1724h-39z" /> +<glyph unicode="0" horiz-adv-x="1355" d="M193 332v835q0 160 99 246t253 86h274q178 0 261 -91t83 -241v-835q0 -332 -344 -332h-274q-154 0 -253 80t-99 252zM242 332q0 -139 80.5 -211t222.5 -72h274q295 0 295 283v835q0 283 -295 283h-274q-139 0 -221 -75t-82 -208v-835z" /> +<glyph unicode="1" horiz-adv-x="724" d="M111 1298v27l344 174h49v-1499h-49v1444z" /> +<glyph unicode="2" horiz-adv-x="1224" d="M111 1468v31q162 20 561 21q416 0 415 -430q0 -104 -86 -246t-189 -255.5t-256 -248.5t-215 -184.5t-136 -106.5h882v-49h-962v47q2 2 72.5 58.5t100.5 81t110.5 92t126 109.5t120 113.5t119.5 123t101.5 121t87 124t52 113.5t21.5 109q0 203 -95 289.5t-273 86.5h-557z " /> +<glyph unicode="3" horiz-adv-x="1228" d="M82 1454v29q152 29 590 20q176 -2 264 -95t88 -243v-141q0 -61 -19.5 -110.5t-48 -79t-64.5 -50t-63.5 -27.5t-50.5 -9q31 -4 68 -21.5t79 -50.5t70.5 -92.5t28.5 -132.5v-121q0 -344 -365 -344q-455 0 -565 22l4 29h557q315 0 316 293v121q0 72 -32 127t-81 83.5t-99 43 t-100 16.5l-438 14v29l438 12q133 2 224.5 63.5t91.5 184.5v141q0 143 -86 216t-221 73h-586z" /> +<glyph unicode="4" horiz-adv-x="1177" d="M55 485l629 1014h55l-624 -1016h774v484l20 153h29v-637h184v-28l-184 -21v-430h-49v430h-809z" /> +<glyph unicode="5" horiz-adv-x="1329" d="M211 12v29h623q117 0 200.5 79t83.5 224v195q0 37 -5 70.5t-22.5 76.5t-46 74t-84 52.5t-129.5 21.5h-313q-94 0 -175 -78t-81 -178h-49l45 921h866v-49h-819l-35 -702q20 39 89 87t165 48h310q334 0 333 -340v-203q0 -98 -32.5 -171t-87 -108.5t-107.5 -52t-106 -16.5 q-476 0 -623 20z" /> +<glyph unicode="6" horiz-adv-x="1302" d="M180 786q0 373 98.5 549t253.5 176q397 0 558 -18v-31h-551q-92 0 -158 -67.5t-96.5 -177t-43 -209t-12.5 -201.5q193 23 580 22q190 0 260 -77.5t70 -221.5v-227q0 -305 -330 -305h-244q-88 0 -154.5 37t-120.5 124t-82 244.5t-28 382.5zM229 778q0 -731 336 -731h244 q283 0 283 252v231q0 147 -73 197.5t-210 50.5h-580z" /> +<glyph unicode="7" horiz-adv-x="1095" d="M82 1450v49h897l33 -47l-488 -1452h-57l487 1450h-872z" /> +<glyph unicode="8" horiz-adv-x="1341" d="M207 315v203q0 106 66.5 169t138.5 63q-205 35 -205 272v133q0 195 94 274.5t266 79.5h238q168 0 250 -84t82 -270v-133q0 -88 -53.5 -163t-135.5 -81q188 -53 189 -262v-201q0 -94 -33 -160.5t-87 -98t-105.5 -44t-108.5 -12.5h-236q-100 0 -171.5 25.5t-107.5 59.5 t-55.5 84t-22.5 79.5t-3 66.5zM256 309q0 -135 85 -197.5t226 -62.5h236q113 0 198.5 62.5t85.5 197.5v215q0 76 -26.5 124t-77.5 66.5t-85 22.5t-89 4h-264q-96 0 -192.5 -53t-96.5 -164v-215zM256 1012q0 -74 24.5 -122t71.5 -68.5t89 -27t104 -6.5h264q135 0 206.5 70 t71.5 154v139q0 166 -68.5 237.5t-213.5 71.5h-238q-166 0 -238.5 -73.5t-72.5 -235.5v-139z" /> +<glyph unicode="9" horiz-adv-x="1302" d="M166 969v227q0 305 330 305h243q88 0 155 -37t121 -124t81.5 -244.5t27.5 -382.5q0 -373 -98 -549t-254 -176q-397 0 -557 18v31h551q92 0 157.5 67.5t96.5 177t43 209t12 201.5q-190 -23 -579 -22q-190 0 -260 78t-70 221zM213 969q0 -147 72.5 -197.5t210.5 -50.5h579 q0 731 -336 731h-243q-283 0 -283 -252v-231z" /> +<glyph unicode=":" horiz-adv-x="362" d="M141 25v127q0 25 25 24h22q25 0 25 -24v-127q0 -25 -25 -25h-22q-25 0 -25 25zM141 932v129q0 25 25 24h22q25 0 25 -24v-129q0 -23 -25 -23h-22q-25 0 -25 23z" /> +<glyph unicode=";" horiz-adv-x="352" d="M141 27v127q0 27 25 26h20q25 0 25 -26v-230q0 -67 -53 -65l-13 2v12q33 0 33 31v96h-12q-25 0 -25 27zM141 932v129q0 25 25 24h22q25 0 25 -24v-129q0 -23 -25 -23h-22q-25 0 -25 23z" /> +<glyph unicode="<" horiz-adv-x="983" d="M139 707v41l705 393v-56l-643 -358l643 -381v-57z" /> +<glyph unicode="=" horiz-adv-x="985" d="M55 434v49h875v-49h-875zM55 965v49h875v-49h-875z" /> +<glyph unicode=">" horiz-adv-x="983" d="M139 289v57l643 381l-643 358v56l705 -393v-41z" /> +<glyph unicode="?" horiz-adv-x="1089" d="M55 1464v29q178 20 516 20q229 4 318.5 -90t89.5 -288v-207q0 -205 -127 -276.5t-420 -43.5v-209h-53v250h217q166 0 250 64.5t84 214.5v207q0 182 -83 255.5t-278 73.5h-514zM369 25v127q0 25 24 24h25q23 0 22 -24v-127q0 -25 -22 -25h-25q-24 0 -24 25z" /> +<glyph unicode="@" horiz-adv-x="1773" d="M180 0v713q0 35 3 64.5t21.5 83.5t51.5 91t102.5 67t165.5 30h410q129 0 221 -67t92 -220v-762h-33l-14 131l-31 -15q-31 -15 -80 -37t-107 -44.5t-124.5 -37.5t-118.5 -15q-113 -2 -188.5 66.5t-73.5 172.5v109q0 125 69.5 198.5t194.5 73.5h457q2 154 0 156 q0 123 -71.5 182t-198.5 59h-404q-295 0 -295 -286v-713q0 -166 86 -239.5t209 -73.5h654q313 0 313 313v1049q0 152 -80 243.5t-233 91.5h-797v29q117 25 590 21h207q168 -4 265 -101.5t97 -283.5v-1049q0 -365 -362 -365h-654q-160 0 -252 94.5t-92 270.5zM524 279.5 q0 -44.5 2 -46.5q0 -92 61.5 -147t166.5 -55q82 -2 216 41t228 88v413l-446 -20q-39 -2 -71 -10t-71 -29.5t-61.5 -69t-22.5 -118.5q-2 -2 -2 -46.5z" /> +<glyph unicode="A" horiz-adv-x="1349" d="M125 0l561 1499h70l536 -1499h-53l-186 518h-682l-193 -518h-53zM389 567h645l-313 883z" /> +<glyph unicode="B" horiz-adv-x="1226" d="M221 0v1499h518q213 0 301 -97t88 -278q0 -139 -79.5 -232t-184.5 -106q90 -20 180.5 -116.5t90.5 -251.5q0 -418 -396 -418h-518zM270 51h469q346 0 346 371q0 142 -102 242q-98 97 -233 96h-11h-469v-709zM270 809h469q147 0 241.5 84t98.5 231v22q0 157 -81 228 q-87 76 -259 76h-469v-641z" /> +<glyph unicode="C" horiz-adv-x="1167" d="M152 754q0 190 19 320t72.5 235.5t154 156t251.5 50.5q174 0 438 -50v-28l-14 2q-14 2 -39.5 4t-59.5 5t-74 6t-81 5t-86 4t-84 2q-160 0 -253 -58t-144 -217t-51 -441q0 -713 450 -713l436 24v-28q-242 -45 -438 -45q-497 0 -497 766z" /> +<glyph unicode="D" horiz-adv-x="1374" d="M221 0v1499h518q133 0 232.5 -50t155 -126t89 -182.5t44 -198.5t10.5 -199q0 -133 -31 -260t-91.5 -237.5t-167 -178t-241.5 -67.5h-518zM270 49h469q123 0 219.5 65.5t151.5 170t83 223.5t28 237q0 354 -124 529.5t-358 175.5h-469v-1401z" /> +<glyph unicode="E" horiz-adv-x="1191" d="M221 252v981q0 139 74 205q70 62 171 61h13l608 -20v-29h-608q-209 0 -209 -217v-465l736 -10v-29l-736 -10v-467q0 -127 61.5 -168t168.5 -41h587v-29l-585 -20h-17q-113 0 -186 49q-78 53 -78 209z" /> +<glyph unicode="F" horiz-adv-x="1191" d="M221 0v1233q0 139 74 205q70 62 171 61h13l608 -20v-29h-608q-209 0 -209 -217v-465l736 -10v-29l-736 -10v-719h-49z" /> +<glyph unicode="G" horiz-adv-x="1269" d="M152 758q0 98 3 172t14 156.5t29.5 142t52.5 117t80 92.5t113.5 56.5t153.5 21.5q213 0 510 -56v-39l-89 12q-89 11 -212 22t-209 11q-100 0 -172 -32.5t-115 -89t-68.5 -149.5t-33.5 -195.5t-8 -245.5q0 -393 85 -554t322 -161q159 0 486 102v604h-439v29q82 23 349 23 q66 0 139 -6v-791h-29l-16 111q-66 -35 -216.5 -78t-273.5 -43q-102 0 -180 24.5t-127 80t-80 117.5t-45 158.5t-19 180.5t-5 207z" /> +<glyph unicode="H" horiz-adv-x="1359" d="M221 0v1499h49v-749h901v749h50v-1499h-50v700h-901v-700h-49z" /> +<glyph unicode="I" horiz-adv-x="409" d="M221 0v1499h49v-1499h-49z" /> +<glyph unicode="J" horiz-adv-x="714" d="M96 43l8 29q63 -18 114 -28q34 -6 72 -6q20 0 40 2q61 5 101 33.5t67.5 95.5t27.5 169v1161h49v-1161q0 -223 -106 -301q-63 -47 -171 -47h-8q-114 2 -194 53z" /> +<glyph unicode="K" horiz-adv-x="1214" d="M221 0v1499h49v-723h312l493 723h60l-508 -747l508 -752h-62l-493 727h-308v-727h-51z" /> +<glyph unicode="L" horiz-adv-x="1144" d="M221 258v1241h49v-1241q0 -127 62.5 -168t167.5 -41h565v-49h-565q-59 0 -102.5 8t-86.5 33t-66.5 80t-23.5 137z" /> +<glyph unicode="M" horiz-adv-x="1632" d="M152 0l165 1499h74l436 -1415l428 1415h78l172 -1499h-49l-166 1440l-434 -1440h-55l-443 1440l-157 -1440h-49z" /> +<glyph unicode="N" horiz-adv-x="1361" d="M221 0v1499h51l902 -1405v1405h49v-1499h-49l-904 1405v-1405h-49z" /> +<glyph unicode="O" horiz-adv-x="1382" d="M180 739q0 207 24.5 349.5t65.5 225.5t116 127t149.5 56t193.5 12q98 0 165 -8t134.5 -34.5t109.5 -79t75.5 -136.5t49 -211t15.5 -301q0 -197 -22.5 -332t-62.5 -216.5t-112.5 -126t-151.5 -58.5t-200 -14q-125 0 -200.5 12t-149.5 54t-113 123t-62.5 218t-23.5 340z M229 739q0 -184 18.5 -307t51.5 -201.5t97.5 -119.5t139 -55.5t193.5 -14.5q143 0 228 24.5t152 97.5t93.5 212t26.5 364q0 164 -13.5 284t-44 198.5t-68.5 127t-100.5 73t-122 31.5t-151.5 7q-68 0 -109.5 -3t-95 -12t-87.5 -30.5t-70.5 -55.5t-59 -88t-42 -128t-28 -175.5 t-8.5 -228.5z" /> +<glyph unicode="P" horiz-adv-x="1196" d="M166 0v1499h565q72 0 126 -13t112.5 -52t90.5 -126t32 -218q0 -119 -25 -204t-57.5 -128t-88 -65.5t-93 -26.5t-97.5 -4q-72 0 -291 8t-225 12v-682h-49zM215 711h516q145 -1 228 77q81 76 81 292v10q0 92 -17 158.5t-45 104.5t-71 59.5t-83 28.5t-93 7h-516v-737z" /> +<glyph unicode="Q" horiz-adv-x="1382" d="M180 739q0 207 24.5 349.5t65.5 225.5t116 127t149.5 56t193.5 12q98 0 165 -8t134.5 -34.5t109.5 -79t75.5 -136.5t49 -211t15.5 -301q0 -197 -22.5 -332t-62.5 -216.5t-112.5 -126t-151.5 -58.5t-200 -14q-125 0 -200.5 12t-149.5 54t-113 123t-62.5 218t-23.5 340z M229 739q0 -184 18.5 -307t51.5 -201.5t97.5 -119.5t139 -55.5t193.5 -14.5q143 0 228 24.5t152 97.5t93.5 212t26.5 364q0 164 -13.5 284t-44 198.5t-68.5 127t-100.5 73t-122 31.5t-151.5 7q-68 0 -109.5 -3t-95 -12t-87.5 -30.5t-70.5 -55.5t-59 -88t-42 -128t-28 -175.5 t-8.5 -228.5zM713 -68h28q29 -78 95 -116q59 -35 120 -35h12q68 4 134 22v-49q-68 -22 -138 -22h-19q-79 4 -146.5 56t-85.5 144z" /> +<glyph unicode="R" horiz-adv-x="1175" d="M166 0v1499h565q72 0 126 -13t112.5 -52t90.5 -126t32 -218q0 -137 -29 -227.5t-81 -131.5t-100 -54t-116 -15l330 -662h-52l-331 662q-479 8 -498 20v-682h-49zM215 711h516q70 0 119 13t95 51t70.5 117t24.5 198q0 92 -17 158.5t-45 104.5t-71 59.5t-83 28.5t-93 7 h-516v-737z" /> +<glyph unicode="S" horiz-adv-x="1200" d="M180 1012v135q0 207 101.5 285.5t293.5 78.5q217 0 455 -38v-27l-455 16h-26q-151 0 -232 -66q-88 -72 -88 -249v-135q0 -150 73 -201t228 -51h234q188 0 260 -79t72 -222v-140q0 -104 -32 -173.5t-92.5 -103.5t-124 -46t-149.5 -12t-250.5 9t-230.5 21v31 q135 -12 481 -12q162 0 255.5 61.5t93.5 224.5v140q0 133 -66 192.5t-217 59.5h-229q-115 0 -189 23.5t-108.5 68.5t-46 92t-11.5 117z" /> +<glyph unicode="T" horiz-adv-x="1236" d="M96 1450v49h1061v-49h-512v-1450h-49v1450h-500z" /> +<glyph unicode="U" horiz-adv-x="1398" d="M221 655v844h49v-844q0 -90 5.5 -165.5t18.5 -134t25.5 -103.5t38 -78t45 -56.5t56.5 -37.5t61.5 -23.5t69.5 -12.5t73.5 -4t81.5 -1q76 0 125.5 5t108.5 24.5t96 60.5t71 106.5t49 171t15 248.5v844h50v-844q0 -98 -7.5 -180t-24 -143.5t-32.5 -111.5t-46 -85 t-53.5 -60.5t-63.5 -41t-66.5 -24.5t-72.5 -13t-72.5 -5t-76.5 -1q-201 0 -280 30q-177 67 -224 350q-20 120 -20 285z" /> +<glyph unicode="V" horiz-adv-x="1349" d="M125 1499h53l518 -1450l543 1450h53l-561 -1499h-69z" /> +<glyph unicode="W" horiz-adv-x="1988" d="M125 1499h53l518 -1450l502 1450h53l-211 -616l334 -834l508 1450h49l-520 -1499h-70l-327 811l-283 -811h-69z" /> +<glyph unicode="X" horiz-adv-x="1157" d="M125 1499h63l422 -704l426 704h64l-457 -756l447 -743h-64l-416 690l-415 -690h-64l449 743z" /> +<glyph unicode="Y" horiz-adv-x="1267" d="M125 1499h55l467 -903l508 903h55l-538 -967v-532h-49v532z" /> +<glyph unicode="Z" horiz-adv-x="1124" d="M96 0v49l887 1401h-887v49h948v-49l-886 -1401h886v-49h-948z" /> +<glyph unicode="[" horiz-adv-x="669" d="M236 -78v1450q0 57 9 108.5t35.5 112t86 96t147.5 35.5h102v-49h-102q-106 0 -167.5 -73.5t-61.5 -229.5v-1450q0 -135 55 -219t174 -84h102v-49h-102q-88 0 -147.5 36t-86 96t-35.5 111.5t-9 108.5z" /> +<glyph unicode="\" horiz-adv-x="724" d="M55 1577h39l576 -1724h-39z" /> +<glyph unicode="]" horiz-adv-x="669" d="M55 -381h103q119 0 174 84t55 219v1450q0 156 -61.5 229.5t-167.5 73.5h-103v49h103q88 0 147.5 -35.5t86 -96t35.5 -111.5t9 -109v-1450q0 -57 -9 -108.5t-35.5 -111.5t-86 -96t-147.5 -36h-103v49z" /> +<glyph unicode="^" horiz-adv-x="833" d="M139 1087l271 267h41l245 -267h-37l-229 236l-254 -236h-37z" /> +<glyph unicode="_" horiz-adv-x="1347" d="M55 -2v49h1237v-49h-1237z" /> +<glyph unicode="`" horiz-adv-x="411" d="M55 1360h54l247 -273h-28z" /> +<glyph unicode="a" horiz-adv-x="1064" d="M111 258v125q0 129 72.5 200.5t199.5 71.5q248 -1 372 -1t124 1q1 68 1 102.5t-1 35.5q0 268 -267 270h-12q-148 0 -455 -47v28q250 61 469 64h7q133 0 219 -77q88 -79 88 -238v-793h-31l-18 131l-33 -14q-33 -14 -86 -36t-115.5 -43.5t-134.5 -35.5t-127 -14 q-117 0 -194.5 71.5t-77.5 198.5zM160 268q0 -119 66.5 -174t156.5 -57h9q72 1 189 29q124 30 211 62l87 32v467l-496 -21q-223 -8 -223 -223v-115z" /> +<glyph unicode="b" d="M166 0v1608h45v-586q92 37 210 59.5t193 22.5q379 0 379 -565q0 -102 -18.5 -193.5t-59.5 -175.5t-117.5 -133t-183.5 -49q-98 0 -227 46t-174 87l-20 -121h-27zM213 150q221 -113 401 -113q141 0 235.5 125t94.5 377q0 289 -90 402.5t-240 113.5q-166 0 -401 -62v-843z " /> +<glyph unicode="c" horiz-adv-x="1026" d="M139 545q0 172 24.5 285.5t76 170t111 77t145.5 20.5q170 0 405 -54v-28q-223 33 -405 33q-78 0 -128.5 -18.5t-94.5 -71t-64.5 -157t-20.5 -265.5q0 -154 22.5 -255.5t67 -152.5t95.5 -70.5t123 -19.5l422 43v-33q-201 -57 -422 -59q-84 0 -142.5 20.5t-111 76.5 t-78 171t-25.5 287z" /> +<glyph unicode="d" d="M139 539q0 565 377 565q76 0 194.5 -22.5t211.5 -59.5v586h43v-1608h-27l-20 121q-45 -41 -174.5 -87t-227.5 -46q-106 0 -183 49t-117 133t-58.5 175.5t-18.5 193.5zM188 539q0 -260 92.5 -381t235.5 -121q180 0 402 113v843q-236 61 -402 62q-72 0 -125 -21.5t-102 -75 t-75 -159.5t-26 -260z" /> +<glyph unicode="e" horiz-adv-x="1077" d="M139 549q0 145 15.5 241.5t42 158t80 93t116 43t160.5 11.5q86 0 139 -5.5t111.5 -27t90.5 -61t52.5 -112.5t20.5 -179q0 -115 -68 -157t-211 -42h-500q0 -150 21.5 -247t67 -145t95.5 -64.5t124 -16.5q172 0 450 41v-33q-206 -57 -434 -57h-16q-205 2 -281 127t-76 432z M188 559h500q53 0 86 4t70 17.5t55.5 46t18.5 84.5q0 113 -22 181.5t-73 102t-109.5 43t-160.5 9.5q-152 0 -224.5 -34t-106.5 -136.5t-34 -317.5z" /> +<glyph unicode="f" horiz-adv-x="786" d="M55 1038v29l178 20v203q0 45 2.5 77t12.5 82t28.5 82t56.5 55.5t91 23.5q225 0 307 -23v-26h-291q-96 0 -126.5 -67t-30.5 -204v-203h364v-49h-364v-1038h-50v1038h-178z" /> +<glyph unicode="g" horiz-adv-x="1171" d="M125 -45l25 215q-19 25 -19 76t45 94t129 45q-178 72 -178 320q0 203 83 295t269 92h639v-29l-227 -21q125 -90 125 -337q0 -55 -13.5 -108.5t-46 -112t-104.5 -94.5t-174 -36h-320q-18 0 -42.5 -4t-59.5 -14t-57.5 -36t-22.5 -62q0 -55 54.5 -85t109.5 -30h422 q141 0 219 -74t78 -199v-108q0 -295 -307 -295h-308q-147 0 -233 83t-86 232v193zM176 135v-373q0 -80 30 -137t76 -82.5t85 -36t77 -10.5h308q258 0 258 246v108q0 100 -59.5 163t-188.5 63h-418q-109 0 -168 59zM176 705q0 -299 289 -299h209q154 0 223.5 84.5t69.5 214.5 q0 164 -60.5 250.5t-144.5 86.5h-303q-160 0 -221.5 -86.5t-61.5 -250.5z" /> +<glyph unicode="h" d="M166 0v1606h49v-645q221 145 442 145q156 0 246 -102.5t90 -245.5v-758h-49v758q0 133 -76.5 216t-210.5 83q-127 0 -223 -29t-219 -96v-932h-49z" /> +<glyph unicode="i" horiz-adv-x="348" d="M139 1274v127q0 24 23 24h2h22q23 0 23 -24v-127q0 -25 -23 -25h-22q-25 0 -25 25zM147 0v1087h50v-1087h-50z" /> +<glyph unicode="j" horiz-adv-x="403" d="M166 1274v127q0 24 22 24h2h23q25 0 25 -24v-127q0 -25 -25 -25h-23q-24 0 -24 25zM178 -553v1640h49v-1095q1 -47 1 -91q0 -285 -23 -454h-27z" /> +<glyph unicode="k" horiz-adv-x="1019" d="M166 0v1602h49v-953h123l549 438h78l-578 -464l576 -623h-72l-553 600h-123v-600h-49z" /> +<glyph unicode="l" horiz-adv-x="610" d="M166 387v1217h49v-1217q0 -92 15.5 -157.5t32 -98.5t49 -52.5t47 -22.5t44.5 -7q131 -22 151 -22h1v-27h-137q-129 0 -190.5 93t-61.5 294z" /> +<glyph unicode="m" horiz-adv-x="1906" d="M166 0v1087h29l20 -126q221 145 442 145q203 0 293 -168q86 66 226.5 117t257.5 51q156 0 245.5 -102.5t89.5 -245.5v-758h-49v758q0 127 -77.5 213t-208.5 86q-205 0 -473 -144q33 -78 32 -155v-758h-49v758q0 127 -78 213t-209 86q-127 0 -223 -29t-219 -96v-932h-49z " /> +<glyph unicode="n" d="M166 0v1087h29l20 -126q221 145 442 145q156 0 246 -102.5t90 -245.5v-758h-49v758q0 127 -78 213t-209 86q-127 0 -223 -29t-219 -96v-932h-49z" /> +<glyph unicode="o" horiz-adv-x="1173" d="M139 528q0 328 98.5 449t348.5 121q256 0 353 -134.5t97 -435.5t-97 -419.5t-353 -118.5q-262 0 -354.5 118.5t-92.5 419.5zM188 528q0 -160 24 -259t79 -148t120.5 -65.5t174.5 -16.5q106 0 174.5 18.5t123 70.5t79 149.5t24.5 250.5q0 162 -26.5 267.5t-83 160t-123 74 t-168.5 19.5q-104 0 -168 -15.5t-121 -65.5t-83 -158t-26 -282z" /> +<glyph unicode="p" d="M166 -549v1636h27l22 -120q45 41 173 87t226 46q106 0 183 -49.5t118 -133t59.5 -175t18.5 -193.5q0 -565 -379 -565q-76 0 -192.5 22.5t-208.5 59.5v-615h-47zM215 94q236 -61 399 -61q150 0 240 113.5t90 402.5q0 252 -94 377t-236 125q-178 0 -399 -113v-844z" /> +<glyph unicode="q" horiz-adv-x="1142" d="M139 549q0 264 94.5 407.5t282.5 143.5q311 0 463 -25v-1628h-49v612q-90 -37 -212 -58t-202 -21q-115 0 -190.5 41.5t-115.5 122.5t-55.5 177.5t-15.5 227.5zM188 549q0 -262 73 -391t255 -129q162 0 414 63v959h-414q-328 0 -328 -502z" /> +<glyph unicode="r" horiz-adv-x="868" d="M166 0v1087h24l25 -137q84 47 134 73t138 51.5t175 25.5q104 0 151 -17v-47q-70 14 -151 15q-45 0 -88.5 -6.5t-71 -12.5t-75.5 -25.5t-64.5 -26.5t-75 -36t-72.5 -35v-909h-49z" /> +<glyph unicode="s" horiz-adv-x="1032" d="M111 743v95q0 131 64.5 195.5t217.5 64.5q281 0 473 -19v-28h-473q-127 0 -180 -50.5t-53 -162.5v-95q0 -51 11 -85.5t25.5 -53t49.5 -27t62.5 -10.5t84.5 -2h262q121 0 194 -60.5t73 -172.5v-101q0 -80 -21.5 -131t-64.5 -73.5t-82 -29.5t-99 -7q-305 0 -499 20v29h499 q49 0 77 4t66 20.5t56 58.5t18 109v101q0 80 -56 132t-161 52h-262q-160 0 -221 40t-61 187z" /> +<glyph unicode="t" horiz-adv-x="716" d="M55 1040v33l172 17l17 303h32v-303h359v-50h-359v-655q0 -92 15.5 -157.5t32 -98.5t49.5 -52.5t47 -22.5t45 -7q131 -22 150 -22h1v-27h-137q-129 0 -190.5 93t-61.5 294v655h-172z" /> +<glyph unicode="u" d="M139 332v758h49v-758q0 -127 78 -213t209 -86q127 0 223.5 28.5t219.5 96.5v932h49v-1088h-29l-20 127q-221 -145 -443 -145q-156 0 -246 102.5t-90 245.5z" /> +<glyph unicode="v" horiz-adv-x="1064" d="M55 1087h49l424 -1019l433 1019h49l-455 -1087h-53z" /> +<glyph unicode="w" horiz-adv-x="1591" d="M55 1087h51l402 -1026l391 1026h49l-151 -407l278 -619l414 1026h47l-434 -1087h-53l-277 623l-237 -623h-54z" /> +<glyph unicode="x" horiz-adv-x="983" d="M66 0l393 545l-393 542h65l361 -497l360 497h66l-394 -542l394 -545h-66l-360 498l-361 -498h-65z" /> +<glyph unicode="y" horiz-adv-x="1083" d="M57 1087h54l303 -849q61 -170 177 -186q30 0 30 -1l350 1036h51l-477 -1431l-94 -209h-25l178 553q-172 8 -239 225z" /> +<glyph unicode="z" horiz-adv-x="972" d="M82 1038v49h811v-49l-717 -987h717v-49h-778v49l712 987h-745z" /> +<glyph unicode="{" horiz-adv-x="622" d="M55 655v56q184 16 185 149v483q0 82 13 144.5t47 119t101.5 87t165.5 30.5v-49q-141 0 -209.5 -75.5t-68.5 -256.5v-483q0 -72 -47 -119t-117 -57q68 -10 115 -58t47 -112v-592q0 -170 67.5 -236.5t212.5 -66.5v-49q-109 0 -179.5 30.5t-101 88t-39.5 108.5t-9 125v584 q0 70 -58.5 111.5t-124.5 37.5z" /> +<glyph unicode="|" horiz-adv-x="520" d="M238 -147v1724h49v-1724h-49z" /> +<glyph unicode="}" horiz-adv-x="622" d="M55 -381q145 0 213 66.5t68 236.5v592q0 63 47 111.5t115 58.5q-70 10 -117 57t-47 119v483q0 180 -68.5 256t-210.5 76v49q98 0 166 -30.5t101.5 -87t47 -119t13.5 -144.5v-483q0 -133 184 -149v-56q-66 4 -124 -38t-58 -111v-584q0 -74 -9 -125t-40 -108.5t-101.5 -88 t-179.5 -30.5v49z" /> +<glyph unicode="~" horiz-adv-x="968" d="M139 1171q45 39 72 59.5t67.5 40t77.5 19.5q41 0 134.5 -74.5t123.5 -74.5q74 0 205 108l12 -14q-41 -41 -68.5 -64.5t-67.5 -43t-81 -19.5q-45 0 -136 74.5t-122 74.5q-16 0 -31.5 -2t-32 -9t-26.5 -11t-30.5 -17.5t-27.5 -18.5t-30.5 -22.5t-30.5 -21.5z" /> +<glyph unicode="¢" horiz-adv-x="999" d="M111 545q0 143 19.5 245.5t50 162t83.5 92t107.5 43t132.5 10.5v168h37v-170q166 -10 333 -52v-28q-223 33 -405 33q-78 0 -129 -18.5t-95 -71t-64.5 -157t-20.5 -265.5q0 -154 22.5 -255.5t67.5 -152.5t96 -70.5t123 -19.5q84 0 188.5 11t167.5 22l64 10v-33 q-178 -51 -348 -57v-160h-37v158q-80 0 -133.5 9t-106.5 42t-83.5 92.5t-50 162t-19.5 249.5z" /> +<glyph unicode="£" horiz-adv-x="1230" d="M139 0v29l148 20v668h-148v28l148 17v272q0 92 12 164t32.5 120t55.5 83t70 53.5t88 28.5t97 13t112 3l340 -18v-29h-336q-115 0 -183.5 -12.5t-128 -54.5t-85 -126.5t-25.5 -224.5v-272l594 -17v-28h-594v-668h754v-49h-951z" /> +<glyph unicode="¥" horiz-adv-x="1196" d="M55 1499h60l463 -790l501 790h62l-537 -842h422v-28h-424v-195h424v-28h-424v-406h-49v406h-401v28h401v195h-401v28h399z" /> +<glyph unicode="¨" horiz-adv-x="868" d="M139 1192q0 35 35 35t35 -35q0 -37 -35 -37t-35 37zM659 1192q0 35 37 35q35 0 35 -35q0 -37 -35 -37q-16 0 -26.5 10.5t-10.5 26.5z" /> +<glyph unicode="©" horiz-adv-x="1769" d="M152 754q0 109 13 207t48 198.5t88 174t142 119.5t202 46h524q115 0 201 -54t131 -133t74 -187.5t36 -193.5t7 -177q0 -205 -46 -371t-150.5 -274.5t-252.5 -108.5h-524q-133 0 -234.5 78t-154.5 198.5t-78.5 241.5t-25.5 236zM180 754q-2 -125 27 -250t84 -232.5 t147 -175t207 -67.5h524q182 0 301 191.5t119 533.5q0 207 -39 361.5t-136 254.5t-245 100h-524q-72 0 -135.5 -20t-124.5 -72.5t-104 -131.5t-71 -204.5t-30 -287.5zM512 748q0 233 80 339.5t215 106.5q170 0 364 -35v-18q-172 25 -364 24q-266 0 -266 -424 q0 -203 62.5 -307t203.5 -104q238 0 377 32v-18q-154 -43 -377 -43q-137 0 -216 97.5t-79 349.5z" /> +<glyph unicode="«" horiz-adv-x="1122" d="M139 725l418 418l37 -35l-385 -383l397 -391l-37 -37zM516 725l422 418l33 -35l-385 -383l397 -391l-37 -37z" /> +<glyph unicode="­" horiz-adv-x="692" d="M55 569v49h582v-49h-582z" /> +<glyph unicode="®" horiz-adv-x="1769" d="M152 754q0 109 13 207t48 198.5t88 174t142 119.5t202 46h524q115 0 201 -54t131 -133t74 -187.5t36 -193.5t7 -177q0 -205 -46 -371t-150.5 -274.5t-252.5 -108.5h-524q-133 0 -234.5 78t-154.5 198.5t-78.5 241.5t-25.5 236zM180 754q-2 -125 27 -250t84 -232.5 t147 -175t207 -67.5h524q182 0 301 191.5t119 533.5q0 207 -39 361.5t-136 254.5t-245 100h-524q-72 0 -135.5 -20t-124.5 -72.5t-104 -131.5t-71 -204.5t-30 -287.5zM584 313v875h362q119 0 186.5 -54.5t67.5 -203.5q0 -49 -8 -86t-25.5 -59.5t-33 -38t-43 -22.5t-42 -10 t-43 -4t-32.5 -1l227 -396h-35l-227 394l-326 10v-404h-28zM612 735h346q113 0 163 38t50 155q0 127 -54 179t-159 52h-346v-424z" /> +<glyph unicode="´" horiz-adv-x="411" d="M55 1087l248 273h53l-272 -273h-29z" /> +<glyph unicode="¸" horiz-adv-x="546" d="M139 -340l66 10q49 8 73.5 16.5t51 33t36 74.5t7.5 130h35q0 -158 -41 -218t-166 -60h-62v14z" /> +<glyph unicode="»" horiz-adv-x="1122" d="M139 334l398 391l-385 383l32 35l422 -418l-430 -428zM516 334l397 391l-385 383l37 35l418 -418l-430 -428z" /> +<glyph unicode="À" horiz-adv-x="1349" d="M125 0l561 1499h70l536 -1499h-53l-186 518h-682l-193 -518h-53zM389 567h645l-313 883zM434 1905h53l248 -273h-28z" /> +<glyph unicode="Â" horiz-adv-x="1349" d="M125 0l561 1499h70l536 -1499h-53l-186 518h-682l-193 -518h-53zM389 567h645l-313 883zM442 1632l271 266h41l245 -266h-36l-230 236l-254 -236h-37z" /> +<glyph unicode="Æ" horiz-adv-x="1910" d="M82 0l770 1208q107 169 151 212q90 87 254 79l549 -20v-29h-549q-39 0 -69.5 -2t-52 -10t-38 -14.5t-25.5 -23t-14 -25.5t-7 -33.5t-3 -37t0 -44t1 -48.5v-444l675 -10v-29l-675 -10v-467q0 -127 61 -168t168 -41h528v-29l-528 -20q-123 -4 -201 47t-78 207v268h-528 l-328 -516h-61zM504 565h495v781z" /> +<glyph unicode="Ç" horiz-adv-x="1167" d="M152 754q0 190 19 320t72.5 235.5t154 156t251.5 50.5q174 0 438 -50v-28l-14 2q-14 2 -39.5 4t-59.5 5t-74 6t-81 5t-86 4t-84 2q-160 0 -253 -58t-144 -217t-51 -441q0 -713 450 -713l436 24v-28q-242 -45 -438 -45q-497 0 -497 766zM436 -338l66 10q49 8 73.5 16.5 t51 33t36 74.5t7.5 130h35q0 -158 -41 -218t-166 -60h-62v14z" /> +<glyph unicode="È" horiz-adv-x="1191" d="M221 252v981q0 139 74 204.5t184 61.5l608 -20v-29h-608q-209 0 -209 -217v-465l736 -10v-29l-736 -10v-467q0 -127 61.5 -168t168.5 -41h587v-29l-585 -20q-125 -4 -203 49t-78 209zM410 1894h53l248 -272h-29z" /> +<glyph unicode="É" horiz-adv-x="1191" d="M221 252v981q0 139 74 204.5t184 61.5l608 -20v-29h-608q-209 0 -209 -217v-465l736 -10v-29l-736 -10v-467q0 -127 61.5 -168t168.5 -41h587v-29l-585 -20q-125 -4 -203 49t-78 209zM680 1622l248 272h53l-272 -272h-29z" /> +<glyph unicode="Ê" horiz-adv-x="1191" d="M221 252v981q0 139 74 204.5t184 61.5l608 -20v-29h-608q-209 0 -209 -217v-465l736 -10v-29l-736 -10v-467q0 -127 61.5 -168t168.5 -41h587v-29l-585 -20q-125 -4 -203 49t-78 209zM410 1632l270 266h41l246 -266h-37l-230 236l-254 -236h-36z" /> +<glyph unicode="Ë" horiz-adv-x="1191" d="M221 252v981q0 139 74 204.5t184 61.5l608 -20v-29h-608q-209 0 -209 -217v-465l736 -10v-29l-736 -10v-467q0 -127 61.5 -168t168.5 -41h587v-29l-585 -20q-125 -4 -203 49t-78 209zM367 1726q0 35 34.5 35t34.5 -35q0 -37 -34.5 -37t-34.5 37zM887 1726q0 35 37 35 q35 0 34 -35q0 -37 -34 -36q-14 0 -25.5 11t-11.5 25z" /> +<glyph unicode="Î" horiz-adv-x="409" d="M-33 1632l271 266h41l245 -266h-37l-229 236l-254 -236h-37zM221 0v1499h49v-1499h-49z" /> +<glyph unicode="Ï" horiz-adv-x="409" d="M-49 1669q0 35 33 35q37 0 36 -35q0 -14 -10 -25.5t-26 -11.5q-33 0 -33 37zM221 0v1499h49v-1499h-49zM471 1669q0 35 37 35q33 0 33 -35q0 -37 -33 -37q-16 0 -26.5 11.5t-10.5 25.5z" /> +<glyph unicode="Ô" horiz-adv-x="1382" d="M180 739q0 207 24.5 349.5t65.5 225.5t116 127t149.5 56t193.5 12q98 0 165 -8t134.5 -34.5t109.5 -79t75.5 -136.5t49 -211t15.5 -301q0 -197 -22.5 -332t-62.5 -216.5t-112.5 -126t-151.5 -58.5t-200 -14q-125 0 -200.5 12t-149.5 54t-113 123t-62.5 218t-23.5 340z M229 739q0 -184 18.5 -307t51.5 -201.5t97.5 -119.5t139 -55.5t193.5 -14.5q143 0 228 24.5t152 97.5t93.5 212t26.5 364q0 164 -13.5 284t-44 198.5t-68.5 127t-100.5 73t-122 31.5t-151.5 7q-68 0 -109.5 -3t-95 -12t-87.5 -30.5t-70.5 -55.5t-59 -88t-42 -128t-28 -175.5 t-8.5 -228.5zM451 1632l270 266h41l246 -266h-37l-230 236l-254 -236h-36z" /> +<glyph unicode="Ù" horiz-adv-x="1398" d="M221 655v844h49v-844q0 -90 5.5 -165.5t18.5 -134t25.5 -103.5t38 -78t45 -56.5t56.5 -37.5t61.5 -23.5t69.5 -12.5t73.5 -4t81.5 -1q76 0 125.5 5t108.5 24.5t96 60.5t71 106.5t49 171t15 248.5v844h50v-844q0 -98 -7.5 -180t-24 -143.5t-32.5 -111.5t-46 -85 t-53.5 -60.5t-63.5 -41t-66.5 -24.5t-72.5 -13t-72.5 -5t-76.5 -1q-201 0 -280 30q-177 67 -224 350q-20 120 -20 285zM455 1905h53l246 -273h-29z" /> +<glyph unicode="Û" horiz-adv-x="1398" d="M221 655v844h49v-844q0 -90 5.5 -165.5t18.5 -134t25.5 -103.5t38 -78t45 -56.5t56.5 -37.5t61.5 -23.5t69.5 -12.5t73.5 -4t81.5 -1q76 0 125.5 5t108.5 24.5t96 60.5t71 106.5t49 171t15 248.5v844h50v-844q0 -98 -7.5 -180t-24 -143.5t-32.5 -111.5t-46 -85 t-53.5 -60.5t-63.5 -41t-66.5 -24.5t-72.5 -13t-72.5 -5t-76.5 -1q-201 0 -280 30q-177 67 -224 350q-20 120 -20 285zM463 1632l270 266h41l246 -266h-37l-229 236l-254 -236h-37z" /> +<glyph unicode="Ü" horiz-adv-x="1398" d="M221 655v844h49v-844q0 -90 5.5 -165.5t18.5 -134t25.5 -103.5t38 -78t45 -56.5t56.5 -37.5t61.5 -23.5t69.5 -12.5t73.5 -4t81.5 -1q76 0 125.5 5t108.5 24.5t96 60.5t71 106.5t49 171t15 248.5v844h50v-844q0 -98 -7.5 -180t-24 -143.5t-32.5 -111.5t-46 -85 t-53.5 -60.5t-63.5 -41t-66.5 -24.5t-72.5 -13t-72.5 -5t-76.5 -1q-201 0 -280 30q-177 67 -224 350q-20 120 -20 285zM444 1669q0 35 35 35t35 -35q0 -37 -35 -37t-35 37zM965 1669q0 35 36 35q35 0 35 -35q0 -37 -35 -37q-14 0 -25 11.5t-11 25.5z" /> +<glyph unicode="à" horiz-adv-x="1064" d="M111 258v125q0 129 72.5 200.5t199.5 71.5q496 -2 496 0q2 135 0 138q0 268 -267 270q-147 2 -467 -47v28q250 61 469 64q137 2 225.5 -77t88.5 -238v-793h-31l-18 131l-33 -14q-33 -14 -86 -36t-115.5 -43.5t-134.5 -35.5t-127 -14q-117 0 -194.5 71.5t-77.5 198.5z M160 268q0 -119 66.5 -174t156.5 -57q74 -2 198 28.5t211 62.5l87 32v467l-496 -21q-223 -8 -223 -223v-115zM268 1503h54l247 -272h-28z" /> +<glyph unicode="â" horiz-adv-x="1064" d="M111 258v125q0 129 72.5 200.5t199.5 71.5q496 -2 496 0q2 135 0 138q0 268 -267 270q-147 2 -467 -47v28q250 61 469 64q137 2 225.5 -77t88.5 -238v-793h-31l-18 131l-33 -14q-33 -14 -86 -36t-115.5 -43.5t-134.5 -35.5t-127 -14q-117 0 -194.5 71.5t-77.5 198.5z M160 268q0 -119 66.5 -174t156.5 -57q74 -2 198 28.5t211 62.5l87 32v467l-496 -21q-223 -8 -223 -223v-115zM272 1231l271 266h41l245 -266h-36l-230 235l-254 -235h-37z" /> +<glyph unicode="æ" horiz-adv-x="1820" d="M111 258v59q0 129 72.5 201t199.5 72q496 -2 496 0q2 201 0 203q0 268 -267 270q-147 2 -467 -47v28q250 61 469 64q113 2 195 -52.5t109 -164.5q29 117 118.5 160t257.5 43q70 0 103 -1t87 -7.5t79.5 -19.5t59.5 -39t49.5 -63.5t26.5 -95t11 -133.5q0 -115 -68.5 -156.5 t-211.5 -41.5h-500q-4 -117 0 -202t14 -141.5t45 -91t93.5 -49t156.5 -16.5q160 -2 451 41v-33q-203 -57 -451 -57q-92 0 -158.5 14t-100.5 43t-46 43t-25 41l-36 -14q-36 -14 -94 -35t-124.5 -42.5t-141.5 -35.5t-130 -14q-117 0 -194.5 71.5t-77.5 198.5zM160 268 q0 -119 66.5 -174t156.5 -57q158 -4 491 135q4 2 5 2v379l-496 -12q-223 -6 -223 -224v-49zM930 584h500q57 0 91.5 4t70.5 17t52.5 46t16.5 84q0 76 -8 129.5t-32 88t-45.5 53t-73.5 26.5t-89 10t-117 2q-227 0 -294.5 -85.5t-71.5 -374.5z" /> +<glyph unicode="ç" horiz-adv-x="1026" d="M139 545q0 172 24.5 285.5t76 170t111 77t145.5 20.5q170 0 405 -54v-28q-223 33 -405 33q-78 0 -128.5 -18.5t-94.5 -71t-64.5 -157t-20.5 -265.5q0 -154 22.5 -255.5t67 -152.5t95.5 -70.5t123 -19.5l422 43v-33q-201 -57 -422 -59q-84 0 -142.5 20.5t-111 76.5 t-78 171t-25.5 287zM326 -336l67 10q49 8 74 16.5t51.5 33t35.5 74.5t7 130h35q0 -158 -41 -218t-166 -60h-63v14z" /> +<glyph unicode="è" horiz-adv-x="1077" d="M139 549q0 145 15.5 241.5t42 158t80 93t116 43t160.5 11.5q86 0 139 -5.5t111.5 -27t90.5 -61t52.5 -112.5t20.5 -179q0 -115 -68 -157t-211 -42h-500q0 -150 21.5 -247t67 -145t95.5 -64.5t124 -16.5q172 0 450 41v-33q-213 -59 -450 -57q-205 2 -281 127t-76 432z M188 559h500q53 0 86 4t70 17.5t55.5 46t18.5 84.5q0 113 -22 181.5t-73 102t-109.5 43t-160.5 9.5q-152 0 -224.5 -34t-106.5 -136.5t-34 -317.5zM297 1483h53l248 -273h-29z" /> +<glyph unicode="é" horiz-adv-x="1077" d="M139 549q0 145 15.5 241.5t42 158t80 93t116 43t160.5 11.5q86 0 139 -5.5t111.5 -27t90.5 -61t52.5 -112.5t20.5 -179q0 -115 -68 -157t-211 -42h-500q0 -150 21.5 -247t67 -145t95.5 -64.5t124 -16.5q172 0 450 41v-33q-213 -59 -450 -57q-205 2 -281 127t-76 432z M188 559h500q53 0 86 4t70 17.5t55.5 46t18.5 84.5q0 113 -22 181.5t-73 102t-109.5 43t-160.5 9.5q-152 0 -224.5 -34t-106.5 -136.5t-34 -317.5zM557 1210l248 273h53l-272 -273h-29z" /> +<glyph unicode="ê" horiz-adv-x="1077" d="M139 549q0 145 15.5 241.5t42 158t80 93t116 43t160.5 11.5q86 0 139 -5.5t111.5 -27t90.5 -61t52.5 -112.5t20.5 -179q0 -115 -68 -157t-211 -42h-500q0 -150 21.5 -247t67 -145t95.5 -64.5t124 -16.5q172 0 450 41v-33q-213 -59 -450 -57q-205 2 -281 127t-76 432z M188 559h500q53 0 86 4t70 17.5t55.5 46t18.5 84.5q0 113 -22 181.5t-73 102t-109.5 43t-160.5 9.5q-152 0 -224.5 -34t-106.5 -136.5t-34 -317.5zM276 1210l271 267h41l246 -267h-37l-230 236l-254 -236h-37z" /> +<glyph unicode="ë" horiz-adv-x="1077" d="M139 549q0 145 15.5 241.5t42 158t80 93t116 43t160.5 11.5q86 0 139 -5.5t111.5 -27t90.5 -61t52.5 -112.5t20.5 -179q0 -115 -68 -157t-211 -42h-500q0 -150 21.5 -247t67 -145t95.5 -64.5t124 -16.5q172 0 450 41v-33q-213 -59 -450 -57q-205 2 -281 127t-76 432z M188 559h500q53 0 86 4t70 17.5t55.5 46t18.5 84.5q0 113 -22 181.5t-73 102t-109.5 43t-160.5 9.5q-152 0 -224.5 -34t-106.5 -136.5t-34 -317.5zM272 1315q0 35 35 35t35 -35q0 -37 -35 -37t-35 37zM793 1315q0 35 36 35q35 0 35 -35q0 -37 -35 -37q-14 0 -25 10.5 t-11 26.5z" /> +<glyph unicode="î" horiz-adv-x="380" d="M-88 1221l270 266h41l246 -266h-37l-229 235l-254 -235h-37zM166 0v1087h49v-1087h-49z" /> +<glyph unicode="ï" horiz-adv-x="380" d="M-106 1257q0 35 36 35q33 0 33 -35q0 -37 -33 -36q-16 0 -26 10t-10 26zM166 0v1087h49v-1087h-49zM414 1257q0 35 36.5 35t36.5 -35q0 -16 -10 -26t-26.5 -10t-26.5 10t-10 26z" /> +<glyph unicode="ô" horiz-adv-x="1173" d="M139 528q0 328 98.5 449t348.5 121q256 0 353 -134.5t97 -435.5t-97 -419.5t-353 -118.5q-262 0 -354.5 118.5t-92.5 419.5zM188 528q0 -160 24 -259t79 -148t120.5 -65.5t174.5 -16.5q106 0 174.5 18.5t123 70.5t79 149.5t24.5 250.5q0 162 -26.5 267.5t-83 160t-123 74 t-168.5 19.5q-104 0 -168 -15.5t-121 -65.5t-83 -158t-26 -282zM307 1221l271 266h40l246 -266h-37l-229 235l-254 -235h-37z" /> +<glyph unicode="ù" d="M139 332v758h49v-758q0 -127 78 -213t209 -86q127 0 223.5 28.5t219.5 96.5v932h49v-1088h-29l-20 127q-221 -145 -443 -145q-156 0 -246 102.5t-90 245.5zM266 1493h53l248 -272h-28z" /> +<glyph unicode="û" d="M139 332v758h49v-758q0 -127 78 -213t209 -86q127 0 223.5 28.5t219.5 96.5v932h49v-1088h-29l-20 127q-221 -145 -443 -145q-156 0 -246 102.5t-90 245.5zM274 1221l271 266h41l245 -266h-36l-230 235l-254 -235h-37z" /> +<glyph unicode="ü" d="M139 332v758h49v-758q0 -127 78 -213t209 -86q127 0 223.5 28.5t219.5 96.5v932h49v-1088h-29l-20 127q-221 -145 -443 -145q-156 0 -246 102.5t-90 245.5zM258 1257q0 35 33 35q37 0 37 -35q0 -16 -10.5 -26t-26.5 -10q-33 -1 -33 36zM778 1257q0 35 37 35q33 0 33 -35 q0 -37 -33 -36q-16 0 -26.5 10t-10.5 26z" /> +<glyph unicode="ÿ" horiz-adv-x="1083" d="M57 1087h54l303 -849q61 -170 177 -186q30 0 30 -1l350 1036h51l-477 -1431l-94 -209h-25l178 553q-172 8 -239 225zM244 1257q0 35 34.5 35t34.5 -35q0 -37 -34.5 -37t-34.5 37zM764 1257q0 35 37 35q35 0 35 -35q0 -37 -35 -36q-14 0 -25.5 10t-11.5 26z" /> +<glyph unicode="Œ" horiz-adv-x="2158" d="M180 739q0 207 24.5 349.5t65.5 225.5t116 127t149.5 56t193.5 12q104 0 173 -9t136.5 -38.5t113.5 -90t75 -157.5q0 150 71.5 219.5t186.5 65.5l547 -20v-29h-547q-209 0 -209 -217q0 -313 2 -465l672 -10v-29l-672 -10l-2 -467q0 -127 61.5 -168t167.5 -41h527v-29 l-527 -20q-131 -6 -204.5 54.5t-73.5 230.5q-55 -172 -170 -229.5t-328 -57.5q-125 0 -200.5 12t-149.5 54t-113 123t-62.5 218t-23.5 340zM229 739q0 -184 18.5 -307t51.5 -201.5t97.5 -119.5t139 -55.5t193.5 -14.5q203 0 305.5 56.5t147.5 208t45 452.5q0 186 -20.5 312 t-55.5 204t-100.5 119t-137 54t-184.5 13q-68 0 -109.5 -3t-95 -12t-87.5 -30.5t-70.5 -55.5t-59 -88t-42 -128t-28 -175.5t-8.5 -228.5z" /> +<glyph unicode="œ" horiz-adv-x="1925" d="M139 528q0 328 98.5 449t348.5 121q182 0 282.5 -67.5t137.5 -209.5q31 168 118.5 221.5t276.5 53.5q86 0 139 -5.5t111.5 -27t90.5 -61t52.5 -112.5t20.5 -179q0 -115 -68 -157t-211 -42h-500q0 -150 21.5 -247t66.5 -145t95.5 -64.5t123.5 -16.5q172 0 451 41v-33 q-213 -59 -451 -57q-147 2 -225 64.5t-108 203.5q-37 -145 -135.5 -206.5t-288.5 -61.5q-262 0 -354.5 118.5t-92.5 419.5zM188 528q0 -160 24 -259t79 -148t120.5 -65.5t174.5 -16.5q106 0 174.5 18.5t123 70.5t79 149.5t24.5 250.5q0 162 -26.5 267.5t-83 160t-123 74 t-168.5 19.5q-104 0 -168 -15.5t-121 -65.5t-83 -158t-26 -282zM1036 559h500q53 0 86 4t70 17.5t55 46t18 84.5q0 113 -21.5 181.5t-72.5 102t-109.5 43t-160.5 9.5q-152 0 -224.5 -34t-106.5 -136.5t-34 -317.5z" /> +<glyph unicode="Ÿ" horiz-adv-x="1267" d="M125 1499h55l467 -903l508 903h55l-538 -967v-532h-49v532zM373 1669q0 35 33 35q37 0 36 -35q0 -14 -10 -25.5t-26 -11.5q-33 0 -33 37zM893 1669q0 35 37 35q33 0 33 -35q0 -37 -33 -37q-16 0 -26.5 11.5t-10.5 25.5z" /> +<glyph unicode="ˆ" horiz-adv-x="833" d="M139 1087l271 267h41l245 -267h-37l-229 236l-254 -236h-37z" /> +<glyph unicode="˚" horiz-adv-x="692" d="M139 1294q0 88 61.5 149.5t147.5 61.5t145.5 -61.5t59.5 -149.5t-59.5 -148.5t-145.5 -60.5t-147.5 60.5t-61.5 148.5zM168 1294.5q0 -73.5 53 -126t127 -52.5t125 52.5t51 126t-51 127t-125 53.5t-127 -53.5t-53 -127z" /> +<glyph unicode="˜" horiz-adv-x="968" d="M139 1171q45 39 72 59.5t67.5 40t77.5 19.5q41 0 134.5 -74.5t123.5 -74.5q74 0 205 108l12 -14q-41 -41 -68.5 -64.5t-67.5 -43t-81 -19.5q-45 0 -136 74.5t-122 74.5q-16 0 -31.5 -2t-32 -9t-26.5 -11t-30.5 -17.5t-27.5 -18.5t-30.5 -22.5t-30.5 -21.5z" /> +<glyph unicode=" " horiz-adv-x="952" /> +<glyph unicode=" " horiz-adv-x="1905" /> +<glyph unicode=" " horiz-adv-x="952" /> +<glyph unicode=" " horiz-adv-x="1905" /> +<glyph unicode=" " horiz-adv-x="635" /> +<glyph unicode=" " horiz-adv-x="476" /> +<glyph unicode=" " horiz-adv-x="317" /> +<glyph unicode=" " horiz-adv-x="317" /> +<glyph unicode=" " horiz-adv-x="238" /> +<glyph unicode=" " horiz-adv-x="381" /> +<glyph unicode=" " horiz-adv-x="105" /> +<glyph unicode="‐" horiz-adv-x="692" d="M55 569v49h582v-49h-582z" /> +<glyph unicode="‑" horiz-adv-x="692" d="M55 569v49h582v-49h-582z" /> +<glyph unicode="‒" horiz-adv-x="692" d="M55 569v49h582v-49h-582z" /> +<glyph unicode="–" horiz-adv-x="1079" d="M55 563v51h969v-51h-969z" /> +<glyph unicode="—" horiz-adv-x="1536" d="M55 567v51h1426v-51h-1426z" /> +<glyph unicode="‘" horiz-adv-x="346" d="M133 1206v213q0 82 62 80l16 -2v-14q-39 2 -39 -39v-76h14q31 0 31 -33v-129q0 -33 -31 -32h-24q-29 -1 -29 32z" /> +<glyph unicode="’" horiz-adv-x="346" d="M131 1335l2 131q0 33 31 33h22q31 0 31 -33l-2 -215q0 -45 -19.5 -63.5t-38.5 -15.5l-20 4v14q39 -2 39 37v78h-14q-31 -1 -31 30z" /> +<glyph unicode="‚" horiz-adv-x="346" d="M133 31v129q0 35 31 35h22q31 0 31 -35v-213q0 -82 -62 -80l-16 2v14q39 -2 39 39v78h-14q-31 0 -31 31z" /> +<glyph unicode="“" horiz-adv-x="522" d="M121 1206v213q0 45 19.5 64.5t37.5 16.5l19 -3v-14q-37 2 -37 -39v-76h12q33 0 33 -33v-129q0 -33 -33 -32h-22q-29 -1 -29 32zM317 1206v213q0 82 62 80l16 -2v-14q-39 2 -39 -39v-76h15q31 0 30 -33v-129q0 -33 -30 -32h-23q-31 -1 -31 32z" /> +<glyph unicode="”" horiz-adv-x="520" d="M121 1335v131q0 33 31 33h22q31 0 31 -33v-215q0 -45 -19.5 -63.5t-39.5 -15.5l-19 4v14q37 -2 37 37v78h-12q-31 -1 -31 30zM317 1335v131q0 33 31 33h25q29 0 28 -33v-215q0 -45 -19.5 -63.5t-38.5 -15.5l-19 4v14q39 -2 38 37v78h-14q-31 -1 -31 30z" /> +<glyph unicode="„" horiz-adv-x="520" d="M121 35v129q0 35 31 35h22q31 0 31 -35v-213q0 -82 -62 -80l-16 2v14q37 -2 37 39v78h-12q-31 0 -31 31zM317 35v129q0 35 31 35h25q29 0 28 -35v-213q0 -82 -62 -80q-16 2 -15 2v14q39 -2 38 39v78h-14q-31 0 -31 31z" /> +<glyph unicode="…" horiz-adv-x="1654" d="M223 25v127q0 25 25 24h22q25 0 25 -24v-127q0 -25 -25 -25h-22q-25 0 -25 25zM780 25v127q0 25 25 24h22q25 0 25 -24v-127q0 -25 -25 -25h-22q-25 0 -25 25zM1337 25v127q0 25 25 24h22q25 0 25 -24v-127q0 -25 -25 -25h-22q-25 0 -25 25z" /> +<glyph unicode=" " horiz-adv-x="381" /> +<glyph unicode="‹" horiz-adv-x="724" d="M139 725l422 416l33 -33l-389 -383l401 -391l-37 -35z" /> +<glyph unicode="›" horiz-adv-x="724" d="M139 334l398 391l-390 383l37 33l422 -416l-434 -426z" /> +<glyph unicode=" " horiz-adv-x="476" /> +<glyph unicode="€" horiz-adv-x="1218" d="M55 557v29l181 6v289l-181 6v26l181 9q0 6 -1 16q0 51 1.5 84t10.5 100.5t25.5 112.5t51 102.5t85 93t129 60.5t177.5 25q219 0 440 -41v-29q-31 2 -80 6t-166.5 9t-193.5 5q-111 0 -192 -31.5t-126 -78.5t-71.5 -123t-33.5 -146.5t-7 -164.5l581 -7v-28l-581 -6v-289 l581 -8v-29h-97q-60 0 -189 -1t-213 -2t-82 -3q-4 -215 112.5 -361.5t317.5 -150.5q223 -6 448 24v-30q-184 -43 -448 -43q-53 0 -110.5 13t-126 52t-121 98.5t-87 163t-34.5 234.5z" /> +<glyph unicode="™" horiz-adv-x="1441" d="M55 1470v29h531v-29h-250v-686h-29v686h-252zM666 784l55 715h22l297 -670l273 670h24l64 -715h-25l-59 650l-264 -650h-23l-289 652l-49 -652h-26z" /> +<glyph unicode="" horiz-adv-x="1085" d="M0 1085h1085v-1085h-1085v1085z" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Thin-webfont.ttf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Thin-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..4e5499fd36d6b430e23f824b5c129e05f0245246 Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Thin-webfont.ttf differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Thin-webfont.woff b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Thin-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..40a72388d8898cece477e3ad64c8f4b4183530bd Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/Exo-Thin-webfont.woff differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/FontAwesome.otf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/FontAwesome.otf new file mode 100644 index 0000000000000000000000000000000000000000..f7936cc1e789eea5438d576d6b12de20191da09d Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/FontAwesome.otf differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/font-mfizz/LICENSE.txt b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/font-mfizz/LICENSE.txt new file mode 100644 index 0000000000000000000000000000000000000000..7581869cec4bb11a6278f947357f4290348b0813 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/font-mfizz/LICENSE.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2013 Mfizz Inc + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/font-mfizz/README.md b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/font-mfizz/README.md new file mode 100644 index 0000000000000000000000000000000000000000..10f2b6213c68481b6bf146c5acf3c96766ae7c0f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/font-mfizz/README.md @@ -0,0 +1,17 @@ +Font Mfizz - Vector Icons for Technology and Software Geeks +=========================================================== + +Font Mfizz provides scalable vector icons representing programming languages, +operating systems, software engineering, and technology. It was designed as an +extension to Font Awesome, it is an iconic font designed for technology and software +geeks. It can instantly be customized — size, color, drop shadow, and anything that +can be done with the power of CSS. + +For full documentation and packages to download (rather than use master), +visit http://mfizz.com/oss/font-mfizz + +Designed by [Mfizz Inc](http://mfizz.com/), [Joe Lauer](http://lauer.bz/). + +Updates tweeted [@mfizz_inc](http://twitter.com/mfizz_inc) + + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/font-mfizz/RELEASE-NOTES.md b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/font-mfizz/RELEASE-NOTES.md new file mode 100644 index 0000000000000000000000000000000000000000..83687033a781ddf9eacd1ba84e0d741dbb62147d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/font-mfizz/RELEASE-NOTES.md @@ -0,0 +1,24 @@ +Font Mfizz Release Notes +=========================================================== + +## 1.2 - 2013-07-23 + - Moved project to GitHub + - 14 new icons covering 12 new topics + - added icon-aws: Amazon Web Services Brand + - added icon-grails, grails-alt: Grails Framework + - added icon-c: C programming language + - added icon-haskell: Haskell Programming Language + - added icon-ruby-on-rails, icon-ruby-on-rails-alt: Ruby on Rails Framework + - added icon-clojure: Clojure Programming Language + - added icon-heroku: Heroku Brand + - added icon-dreamhost: Dream Host Brand + - added icon-centos: CentOS Linux Operating System + - added icon-fedora: Fedora Linux Operating System + - added icon-mariadb: Maria DB + - added icon-redis: Redis DB + +## 1.1 - 2013-07-09 + - Added 20 new icons + +## 1.0 - 2013-06-29 + - Initial release diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/font-mfizz/font-mfizz.css b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/font-mfizz/font-mfizz.css new file mode 100644 index 0000000000000000000000000000000000000000..d7cd917655272cfb407211ed78ce1ffbf01d4af7 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/font-mfizz/font-mfizz.css @@ -0,0 +1,318 @@ +/* + * Font Mfizz v1.2 + * Copyright 2013 Mfizz Inc, Joe Lauer + * MIT License + * + * Project: http://mfizz.com/oss/font-mfizz + * + * The font designed for technology and software geeks representing programming + * languages, operating systems, software engineering, and technology. + * + * Mfizz Inc + * Web: http://mfizz.com/ + * Twitter: http://twitter.com/mfizz_inc + * + * Joe Lauer + * Web: http://lauer.bz/ + * Twitter: http://twitter.com/jjlauer + */ + +@font-face { + font-family: "FontMfizz"; + src: url("font-mfizz.eot"); + src: url("font-mfizz.eot?#iefix") format("embedded-opentype"), + url("font-mfizz.woff") format("woff"), + url("font-mfizz.ttf") format("truetype"), + url("font-mfizz.svg#font-mfizz") format("svg"); + font-weight: normal; + font-style: normal; +} + +.icon-microscope:before, +.icon-cplusplus:before, +.icon-wireless:before, +.icon-fire-alt:before, +.icon-mobile-device:before, +.icon-objc:before, +.icon-redhat:before, +.icon-freebsd:before, +.icon-heroku:before, +.icon-python:before, +.icon-java:before, +.icon-satellite:before, +.icon-debian:before, +.icon-grails:before, +.icon-c:before, +.icon-postgres:before, +.icon-database-alt2:before, +.icon-raspberrypi:before, +.icon-nginx:before, +.icon-ruby-on-rails:before, +.icon-redis:before, +.icon-scala:before, +.icon-gnome:before, +.icon-perl:before, +.icon-mysql:before, +.icon-fedora:before, +.icon-ghost:before, +.icon-google:before, +.icon-netbsd:before, +.icon-aws:before, +.icon-bomb:before, +.icon-looking:before, +.icon-ruby:before, +.icon-mysql-alt:before, +.icon-playframework-alt:before, +.icon-osx:before, +.icon-database:before, +.icon-database-alt:before, +.icon-shell:before, +.icon-script:before, +.icon-antenna:before, +.icon-coffee-bean:before, +.icon-scala-alt:before, +.icon-platter:before, +.icon-java-duke:before, +.icon-iphone:before, +.icon-script-alt:before, +.icon-google-alt:before, +.icon-haskell:before, +.icon-mariadb:before, +.icon-phone-retro:before, +.icon-phone-alt:before, +.icon-csharp:before, +.icon-php:before, +.icon-postgres-alt:before, +.icon-html:before, +.icon-mfizz:before, +.icon-apache:before, +.icon-hadoop:before, +.icon-ruby-on-rails-alt:before, +.icon-mobile-phone-broadcast:before, +.icon-css:before, +.icon-playframework:before, +.icon-clojure:before, +.icon-mobile-phone-alt:before, +.icon-suse:before, +.icon-java-bold:before, +.icon-nginx-alt:before, +.icon-nginx-alt2:before, +.icon-linux-mint:before, +.icon-dreamhost:before, +.icon-blackberry:before, +.icon-javascript:before, +.icon-ubuntu:before, +.icon-php-alt:before, +.icon-centos:before, +.icon-nodejs:before, +.icon-splatter:before, +.icon-3dprint:before, +.icon-line-graph:before, +.icon-cassandra:before, +.icon-solaris:before, +.icon-jetty:before, +.icon-tomcat:before, +.icon-oracle:before, +.icon-oracle-alt:before, +.icon-mssql:before, +.icon-google-developers:before, +.icon-google-code:before, +.icon-kde:before, +.icon-grails-alt:before { + font-family: "FontMfizz"; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + display: inline-block; + text-decoration: inherit; +} + +.icon-microscope:before { content: "\f100"; } +.icon-cplusplus:before { content: "\f101"; } +.icon-wireless:before { content: "\f102"; } +.icon-fire-alt:before { content: "\f103"; } +.icon-mobile-device:before { content: "\f104"; } +.icon-objc:before { content: "\f105"; } +.icon-redhat:before { content: "\f106"; } +.icon-freebsd:before { content: "\f107"; } +.icon-heroku:before { content: "\f108"; } +.icon-python:before { content: "\f109"; } +.icon-java:before { content: "\f10a"; } +.icon-satellite:before { content: "\f10b"; } +.icon-debian:before { content: "\f10c"; } +.icon-grails:before { content: "\f10d"; } +.icon-c:before { content: "\f10e"; } +.icon-postgres:before { content: "\f10f"; } +.icon-database-alt2:before { content: "\f110"; } +.icon-raspberrypi:before { content: "\f111"; } +.icon-nginx:before { content: "\f112"; } +.icon-ruby-on-rails:before { content: "\f113"; } +.icon-redis:before { content: "\f114"; } +.icon-scala:before { content: "\f115"; } +.icon-gnome:before { content: "\f116"; } +.icon-perl:before { content: "\f117"; } +.icon-mysql:before { content: "\f118"; } +.icon-fedora:before { content: "\f119"; } +.icon-ghost:before { content: "\f11a"; } +.icon-google:before { content: "\f11b"; } +.icon-netbsd:before { content: "\f11c"; } +.icon-aws:before { content: "\f11d"; } +.icon-bomb:before { content: "\f11e"; } +.icon-looking:before { content: "\f11f"; } +.icon-ruby:before { content: "\f120"; } +.icon-mysql-alt:before { content: "\f121"; } +.icon-playframework-alt:before { content: "\f122"; } +.icon-osx:before { content: "\f123"; } +.icon-database:before { content: "\f124"; } +.icon-database-alt:before { content: "\f125"; } +.icon-shell:before { content: "\f126"; } +.icon-script:before { content: "\f127"; } +.icon-antenna:before { content: "\f128"; } +.icon-coffee-bean:before { content: "\f129"; } +.icon-scala-alt:before { content: "\f12a"; } +.icon-platter:before { content: "\f12b"; } +.icon-java-duke:before { content: "\f12c"; } +.icon-iphone:before { content: "\f12d"; } +.icon-script-alt:before { content: "\f12e"; } +.icon-google-alt:before { content: "\f12f"; } +.icon-haskell:before { content: "\f130"; } +.icon-mariadb:before { content: "\f131"; } +.icon-phone-retro:before { content: "\f132"; } +.icon-phone-alt:before { content: "\f133"; } +.icon-csharp:before { content: "\f134"; } +.icon-php:before { content: "\f135"; } +.icon-postgres-alt:before { content: "\f136"; } +.icon-html:before { content: "\f137"; } +.icon-mfizz:before { content: "\f138"; } +.icon-apache:before { content: "\f139"; } +.icon-hadoop:before { content: "\f13a"; } +.icon-ruby-on-rails-alt:before { content: "\f13b"; } +.icon-mobile-phone-broadcast:before { content: "\f13c"; } +.icon-css:before { content: "\f13d"; } +.icon-playframework:before { content: "\f13e"; } +.icon-clojure:before { content: "\f13f"; } +.icon-mobile-phone-alt:before { content: "\f140"; } +.icon-suse:before { content: "\f141"; } +.icon-java-bold:before { content: "\f142"; } +.icon-nginx-alt:before { content: "\f143"; } +.icon-nginx-alt2:before { content: "\f144"; } +.icon-linux-mint:before { content: "\f145"; } +.icon-dreamhost:before { content: "\f146"; } +.icon-blackberry:before { content: "\f147"; } +.icon-javascript:before { content: "\f148"; } +.icon-ubuntu:before { content: "\f149"; } +.icon-php-alt:before { content: "\f14a"; } +.icon-centos:before { content: "\f14b"; } +.icon-nodejs:before { content: "\f14c"; } +.icon-splatter:before { content: "\f14d"; } +.icon-3dprint:before { content: "\f14e"; } +.icon-line-graph:before { content: "\f14f"; } +.icon-cassandra:before { content: "\f150"; } +.icon-solaris:before { content: "\f151"; } +.icon-jetty:before { content: "\f152"; } +.icon-tomcat:before { content: "\f153"; } +.icon-oracle:before { content: "\f154"; } +.icon-oracle-alt:before { content: "\f155"; } +.icon-mssql:before { content: "\f156"; } +.icon-google-developers:before { content: "\f157"; } +.icon-google-code:before { content: "\f158"; } +.icon-kde:before { content: "\f159"; } +.icon-grails-alt:before { content: "\f15a"; } + +/* These classes only added to fix FontFamily to display FontMfizz during debug/inspection */ +.icon-osx, +.icon-bomb, +.icon-mobile-phone-broadcast, +.icon-objc, +.icon-nginx-alt2, +.icon-mysql, +.icon-phone-retro, +.icon-netbsd, +.icon-mobile-device, +.icon-ruby-on-rails, +.icon-phone-alt, +.icon-line-graph, +.icon-postgres, +.icon-playframework, +.icon-python, +.icon-ruby-on-rails-alt, +.icon-nginx, +.icon-database-alt2, +.icon-google-alt, +.icon-microscope, +.icon-blackberry, +.icon-dreamhost, +.icon-google, +.icon-centos, +.icon-kde, +.icon-csharp, +.icon-scala, +.icon-redis, +.icon-looking, +.icon-database-alt, +.icon-javascript, +.icon-postgres-alt, +.icon-linux-mint, +.icon-ubuntu, +.icon-apache, +.icon-script-alt, +.icon-mssql, +.icon-c, +.icon-gnome, +.icon-java-duke, +.icon-scala-alt, +.icon-clojure, +.icon-oracle-alt, +.icon-redhat, +.icon-haskell, +.icon-3dprint, +.icon-mariadb, +.icon-java, +.icon-script, +.icon-cplusplus, +.icon-jetty, +.icon-perl, +.icon-heroku, +.icon-nginx-alt, +.icon-iphone, +.icon-splatter, +.icon-shell, +.icon-mysql-alt, +.icon-wireless, +.icon-ruby, +.icon-playframework-alt, +.icon-raspberrypi, +.icon-suse, +.icon-nodejs, +.icon-java-bold, +.icon-google-developers, +.icon-mobile-phone-alt, +.icon-grails-alt, +.icon-coffee-bean, +.icon-cassandra, +.icon-google-code, +.icon-fedora, +.icon-antenna, +.icon-hadoop, +.icon-solaris, +.icon-html, +.icon-css, +.icon-satellite, +.icon-aws, +.icon-mfizz, +.icon-php, +.icon-debian, +.icon-ghost, +.icon-php-alt, +.icon-tomcat, +.icon-database, +.icon-grails, +.icon-freebsd, +.icon-oracle, +.icon-fire-alt, +.icon-platter{ + font-family: "FontMfizz"; +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/font-mfizz/font-mfizz.eot b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/font-mfizz/font-mfizz.eot new file mode 100644 index 0000000000000000000000000000000000000000..b2a7d6b91168e2831275edb6f25052d8dc1594ba Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/font-mfizz/font-mfizz.eot differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/font-mfizz/font-mfizz.svg b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/font-mfizz/font-mfizz.svg new file mode 100644 index 0000000000000000000000000000000000000000..da46bf402d248080b7fb3924ded95f8e7252e365 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/font-mfizz/font-mfizz.svg @@ -0,0 +1,1344 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<!-- +2013-7-23: Created. +--> +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +Created by FontForge 20110222 at Tue Jul 23 15:25:00 2013 + By Joe Lauer,,, +Created by Joe Lauer,,, with FontForge 2.0 (http://fontforge.sf.net) +</metadata> +<defs> +<font id="font-mfizz" horiz-adv-x="1030" > + <font-face + font-family="font-mfizz" + font-weight="500" + font-stretch="normal" + units-per-em="1000" + panose-1="2 0 6 3 0 0 0 0 0 0" + ascent="800" + descent="-200" + bbox="14.9995 -201.823 1053.81 804.278" + underline-thickness="50" + underline-position="-100" + unicode-range="U+F100-F15A" + /> + <missing-glyph /> + <glyph glyph-name="uniF100" unicode="" horiz-adv-x="588" +d="M15 214.316l21.3936 37.0459l215.975 -124.722l-21.3936 -37.0459zM451.373 18.6201l0.00878906 -0.0205078h121.521v-88.6172h-530.99v88.6094h188.63c129.05 0 234.13 105 234.13 234.04c0 81.5801 -42.373 155.317 -108.38 197.39l-107.65 -186.42l-22.3154 12.9023 +l-31.7461 -54.958l-56.2539 32.5029l31.7461 54.9062l-22.3594 12.9111l256 443.479l17.2197 -9.95312l25.75 44.6055l67.3301 -38.8799l-25.6797 -44.666l16.3604 -9.42188l-104.141 -180.25c92.958 -57.6602 152.71 -160.32 152.71 -274.12 +c0 -92.3701 -39.5 -175.13 -101.89 -234.04z" /> + <glyph glyph-name="uniF101" unicode="" +d="M626.343 714.435v-108.155c-34.5283 32.1475 -71.4248 56.1895 -110.688 72.1006c-38.9375 15.9102 -80.4004 23.8604 -124.412 23.8604c-86.6592 -0.000976562 -153.008 -26.5742 -199.05 -79.7207c-46.0381 -52.8076 -69.0576 -129.317 -69.0576 -229.506 +c0 -99.8623 23.0186 -176.361 69.0576 -229.507c46.0381 -52.8086 112.387 -79.2129 199.05 -79.2119c44.0059 0 85.4746 7.95508 124.4 23.8652c39.2676 15.9102 76.1641 39.9443 110.693 72.1035v-107.14c-35.8828 -24.373 -73.9658 -42.6533 -114.248 -54.8389 +c-39.9453 -12.1865 -82.2598 -18.2803 -126.937 -18.2803c-114.757 0 -205.139 35.0361 -271.15 105.108c-65.9961 70.4092 -99.001 166.383 -99.001 287.907c0 121.863 33.0049 217.836 99.0146 287.907c66.0107 70.4102 156.392 105.615 271.15 105.616 +c45.3604 -0.000976562 88.0127 -6.09473 127.964 -18.2803c40.2832 -11.8486 78.0273 -29.79 113.232 -53.8242zM502.184 544.754v-131.431h131.432v-40.1133h-131.432v-131.432h-39.6406v131.432h-131.432v40.1133h131.432v131.431h39.6406zM883.563 544.754v-131.431 +h131.431v-40.1133h-131.431v-131.432h-39.6416v131.432h-131.431v40.1133h131.431v131.431h39.6416z" /> + <glyph glyph-name="uniF102" unicode="" +d="M953.053 430c-15.8594 0 -31.7109 6.0498 -43.8105 18.1396c-217.4 217.4 -571.109 217.38 -788.49 0c-24.1992 -24.1895 -63.4102 -24.1895 -87.6094 0c-24.1895 24.1904 -24.1895 63.4199 0 87.6104c265.689 265.68 698.01 265.69 963.709 0 +c24.1914 -24.1904 24.1914 -63.4199 0 -87.6104c-12.0898 -12.0898 -27.9395 -18.1396 -43.7988 -18.1396zM208.373 298.58c-15.8516 0 -31.7012 6.0498 -43.8008 18.1396c-24.1895 24.1904 -24.1895 63.4199 0 87.6104c93.5996 93.6104 218.061 145.16 350.43 145.16 +c132.381 0 256.84 -51.5605 350.441 -145.16c24.1895 -24.1904 24.1895 -63.4199 0 -87.6104c-24.2012 -24.2002 -63.4102 -24.1797 -87.6113 0c-70.209 70.21 -163.549 108.87 -262.83 108.87c-99.2793 0 -192.619 -38.6602 -262.82 -108.87 +c-12.0996 -12.0898 -27.959 -18.1396 -43.8086 -18.1396zM690.223 167.16c-15.8594 0 -31.7109 6.0498 -43.8105 18.1396c-72.459 72.4697 -190.359 72.4697 -262.82 0c-24.1992 -24.1797 -63.4102 -24.1797 -87.6094 0c-24.1895 24.1904 -24.1895 63.4199 0 87.6104 +c120.779 120.77 317.27 120.77 438.051 0c24.1895 -24.1904 24.1895 -63.4199 0 -87.6104c-12.1113 -12.0898 -27.9609 -18.1396 -43.8105 -18.1396zM515.002 -70c-33.0898 0 -64.1992 12.8896 -87.6094 36.2803c-48.3105 48.3193 -48.3105 126.91 -0.00976562 175.22 +c23.4004 23.4004 54.5195 36.29 87.6191 36.29s64.2109 -12.8896 87.6113 -36.2803c48.2988 -48.3193 48.2988 -126.91 0 -175.22c-23.4102 -23.4004 -54.5215 -36.29 -87.6113 -36.29z" /> + <glyph glyph-name="uniF103" unicode="" horiz-adv-x="781" +d="M580.719 243.015c0 -3.87988 69.4307 84.5508 185.702 30.9404c-3.50977 1.55957 -112.711 -64.4111 -123.752 -185.692c-37.0703 -404.424 -711.797 -392.104 -618.896 92.8408c-0.259766 -0.979492 77.9902 -124.731 123.781 -61.8809 +c60.1699 82.4814 -109.052 193.463 -30.9707 309.443c25.96 38.4502 78.4209 66.6611 123.781 61.8809c-14.4102 -28.5508 -24.8896 -141.712 61.9111 -154.722c51.6602 -7.76953 89.4209 76.6406 0 185.662c-57.6113 70.4307 30.8496 212.982 30.9404 216.632 +c-1.20996 -90.0205 39.2598 -146.201 185.682 -216.632c127.091 -61.1309 61.8203 -263.272 61.8203 -278.473zM364.177 -97.4395c126.861 4.79102 135.211 140.912 61.8301 216.662c-47.8398 49.5713 -123.271 60.9014 -123.73 61.8809 +c35.6904 -64.1201 -34.2803 -73.9707 -61.9111 -123.811c-21.7598 -39.1406 -38.4199 -160.712 123.812 -154.732zM456.968 645.278c-18.9404 20.3203 -30.9707 44.7207 -30.9707 61.9004c0 32.2109 26.3105 63.1709 61.9307 92.8213 +c3.57031 -25.79 -15.4297 -64.4707 0 -92.8213c11.9707 -20.9795 30.9707 -44.7197 30.9707 -61.9004c0 -23.0205 -8.57031 -44 -30.9707 -61.8809c-3.38965 8.61035 -9.32031 36.8408 -30.96 61.8809z" /> + <glyph glyph-name="uniF104" unicode="" horiz-adv-x="993" +d="M965.691 800l-0.00878906 0.00195312c6.73047 0 12.2197 -5.57422 12.21 -12.4736v-843.149c0 -6.89941 -5.4707 -12.4561 -12.1982 -12.4561h-613.75c-6.74414 0 -12.2148 5.6084 -12.2148 12.4561v139.779c-18.1328 -54.792 -32.1367 -97.1133 -35.2334 -106.49 +c-17.9248 -54.1758 -72.7188 -53.5215 -113.75 -39.9473c-41.0498 13.5732 -52.0947 17.2207 -52.0947 17.2207s-11.0615 3.66406 -52.0586 17.2383c-41.0488 13.5742 -85.418 45.7461 -67.5088 99.9043c9.66016 29.1797 124.609 376.609 142.319 430.1 +c19.4707 58.8594 72.2002 47.5195 128.051 29.04c26.8555 -8.87793 35.9736 -11.8711 35.9736 -11.8711s4.04297 -1.35938 14.3145 -4.76562v272.94c0 6.89844 5.46973 12.4727 12.1992 12.4727h613.75zM666.402 766.85c-8.94531 0 -16.2061 -7.41504 -16.2061 -16.585 +c0 -9.15332 7.24316 -16.585 16.2061 -16.585c8.94629 0 16.2588 7.43262 16.2588 16.585s-7.29492 16.585 -16.2588 16.585zM275.203 510.56c-1.97852 0.670898 -4.18066 -0.413086 -4.83496 -2.40918c-0.670898 -2.0127 0.447266 -4.19727 3.0625 -5.05762 +l84.5918 -27.9912c1.3252 -0.447266 3.52734 0.636719 4.19824 2.66699c0.65332 1.99512 -0.464844 4.16309 -2.44336 4.81738zM181.973 -22.4404c1.29102 3.93945 -2.33887 6.1416 -10.459 8.8252c-8.12109 2.70117 -20.2148 6.70996 -20.2148 6.70996 +s-12.0947 4.00879 -20.1982 6.69238c-8.15527 2.70117 -12.4043 3.0791 -13.7119 -0.860352c-0.791016 -2.37402 -3.09668 -12.9199 7.01953 -16.2578c9.37695 -3.09668 21.127 -6.98438 21.127 -6.98438s11.75 -3.90527 21.1436 -7.01953 +c10.0811 -3.30371 14.5195 6.53711 15.2939 8.89453zM286.164 -19.1201l146.869 443.829l-250.439 82.8604l-146.87 -443.85zM658.804 -35.9463c10.3223 0 18.666 8.51562 18.666 19.0273c0 10.4951 -8.32617 19.0283 -18.666 19.0283 +c-10.3389 0 -18.666 -8.53418 -18.666 -19.0283c0 -10.5117 8.36133 -19.0273 18.666 -19.0273zM940.813 47.6826h-0.0195312v654.17c0 6.88184 -5.4541 12.4561 -12.1982 12.4561h-539.57c-6.74414 0 -12.1973 -5.57422 -12.1973 -12.4561v-199.76 +c48.9629 -17.6689 87.6025 -40.998 69.9688 -94.3301c-8.46484 -25.6006 -39.1738 -118.396 -69.9688 -211.471v-148.609c0 -6.91699 5.45312 -12.4561 12.1973 -12.4561h539.59c6.76172 0 12.1982 5.57422 12.1982 12.4561z" /> + <glyph glyph-name="uniF105" unicode="" horiz-adv-x="830" +d="M79.0615 798.125v0.00390625h82.8184h591.24c34 0 61.8799 -28.0625 61.8799 -59.0625v-0.9375c0 -2 -0.94043 -5.1875 -0.94043 -7.1875l-65.9395 -605c1.01953 -23.9893 -12.0703 -46.8193 -34.0605 -57.8193l-268.119 -132.181 +c-9 -3.98926 -17.8809 -5.93945 -26.8809 -5.93945s-18.1797 1.95996 -27.1797 5.93945l-268.76 132.181c-11.9951 6 -22.1201 14.8896 -28.1201 26.8799c-5 7.00977 -8.06152 15.0596 -9.06152 24.0596l-67.8135 610.001c0 2 -3.125 4.875 -3.125 6.875v0.9375 +c0 33 30.0615 61.25 64.0615 61.25zM647.502 600.009c-27.9902 0 -48.4102 -6.16016 -61.25 -18.4395c-12.8398 -12.1309 -19.0596 -31.5205 -19.0596 -58.4404v-43.1201c0 -20.9199 -3.37988 -35.3496 -10.3105 -43.4395 +c-6.93945 -8.09082 -19.5801 -12.1904 -37.8193 -12.1807h-11.8701v-46.5693h11.8701c18.2393 0 30.8799 -3.95996 37.8193 -12.1904c6.93066 -8.08008 10.3105 -22.8203 10.3105 -43.7402v-40c0 -26.9199 6.21973 -46.4795 19.0596 -58.7598 +c12.8398 -12.2695 33.2598 -18.4297 61.25 -18.4297h41.8799v46.8701h-13.1299c-18.1104 0 -30.0996 3.23926 -35.6299 9.37988c-5.38965 5.98926 -8.12012 18.7998 -8.12012 38.75v34.6895c0 21.75 -2.66016 37.5898 -8.44043 47.5 +c-5.64941 9.90039 -15.7393 16.8506 -30 20.6201c14.1309 3.49023 24.2207 10.1006 30 20c5.78027 9.90039 8.44043 25.9199 8.44043 47.8105v34.6895c0 19.7998 2.73047 32.75 8.12012 38.75c5.53027 6.13965 17.5195 9.06055 35.6299 9.06055h13.1299v47.1895h-41.8799z +M289.062 575.629c-23.1104 0 -45.6104 -4.57031 -67.1807 -14.0605c-21.4502 -9.47949 -40.3896 -23.0195 -56.5693 -40.3096c-16.1807 -17.4297 -28.4502 -37.6104 -37.1904 -60.6299c-8.73047 -23.0098 -13.1201 -47.1104 -13.1201 -72.5 +c0 -26.3496 4.20996 -51.0498 12.8105 -74.0605c8.60938 -22.8691 21.0693 -43.1895 37.5 -60.6191c16.4395 -17.4404 35.1895 -30.6201 56.25 -39.6904c21.0596 -9.2002 43.75 -13.75 67.5 -13.75c19.5195 0 38.6299 3.69043 57.5 10.9404 +c19.0098 7.10938 36.4492 17.4092 52.5 30.9395l-20.6201 33.7402c-11.4307 -11.1504 -25.0703 -20 -41.25 -26.5605c-16.1807 -6.5498 -32.5703 -9.67969 -48.75 -9.67969c-18.8799 0 -36.4307 3.67969 -53.1299 10.9297 +c-16.5605 7.12012 -31.5303 17.2705 -44.3701 30.9404c-12.9707 13.9502 -22.7607 29.9902 -29.6904 48.1299c-6.80957 18.2705 -10.3096 37.96 -10.3096 58.7402c0 25.25 5.40918 48.7002 15.9395 70.3203c10.6504 21.75 25.3701 39.4492 44.3701 53.1201 +c11.5605 8.22949 24.2002 14.2598 37.8105 18.4395c13.6094 4.32031 27.9199 6.55957 42.8193 6.55957c21.3105 0 41.1406 -4.53906 59.3701 -13.75c18.3604 -9.19922 33.4297 -22.3594 45.6299 -39.3691c7.57031 -10.1807 13.46 -21.4805 17.1807 -33.75 +c3.72949 -12.1406 5.30957 -25.1201 5.31934 -39.0703c-0.00976562 -21.8896 -4.33008 -39.9697 -13.4395 -54.0596c-9.12012 -13.9404 -21.5801 -22.04 -37.5 -24.6807v145h-40.3203v-27.5c-3.84961 9.90039 -10.1396 17.54 -18.7402 23.1201 +c-8.47949 5.58008 -18.5801 8.44043 -30 8.44043c-21.96 0 -39.8896 -8.82031 -53.7598 -26.25c-13.8604 -17.4404 -20.6201 -39.9199 -20.6201 -67.8105c0 -27.8994 6.87988 -50.7002 20.6201 -68.1299c13.8701 -17.29 31.6699 -25.9395 53.7598 -25.9395 +c11.4199 0 21.5205 2.68945 30 8.12988c8.60059 5.58008 14.8906 13.5293 18.7402 23.4395v-32.1895h7.5c38.1396 0 67.5098 10.3301 88.4404 31.25c20.9297 20.9199 31.5596 50.3301 31.5596 88.1201c0 17.5791 -2.49023 34.0996 -7.5 50 +c-4.87012 16.04 -12.2402 31.0195 -21.8701 44.6895c-15.79 22.4502 -35.5596 39.71 -59.0596 51.5605c-23.5 12 -49.3604 17.8096 -78.1299 17.8096zM286.252 442.199c11.5605 0 20.6904 -5.10059 27.5 -15c6.92969 -9.77051 10.3105 -23.1309 10.3105 -40 +c0 -17.0205 -3.19043 -30.5908 -10 -40.6309c-6.80078 -9.89941 -16.0703 -14.6895 -27.5 -14.6797c-11.5508 -0.00976562 -20.6904 4.78027 -27.5 14.6797c-6.68066 9.90039 -10 23.4707 -10 40.6309c0 16.8691 3.31934 30.2295 10 40 +c6.80957 9.89941 15.8896 15 27.1895 15z" /> + <glyph glyph-name="uniF106" unicode="" horiz-adv-x="1013" +d="M506.99 800l0.0107422 0.00488281c271.58 0 491.479 -219.92 491.47 -491.49c-0.015625 -98.5596 -28.8066 -190.45 -78.7178 -267.439c-18.957 4.37598 -39.1973 7.06445 -59.543 7.06445c-34.7812 0 -66.4697 -5.95508 -89.8193 -15.6436 +c-2.53516 -1.29199 -4.54102 -3.99609 -4.54102 -7.06445c0 -1.09766 0.588867 -2.5957 1.00879 -3.53223c2.76172 -8.00879 -2.13574 -16.7402 -24.7256 -21.6973c-33.4902 -7.34766 -54.5303 -41.5029 -66.6084 -52.9834 +c-14.21 -13.499 -54.4648 -22.1709 -48.4414 -14.1289c4.71484 6.28223 22.8271 26.248 33.8076 47.4326c9.81836 18.957 18.7188 24.2861 30.7812 42.3877c3.51953 5.29688 17.2041 23.6396 21.1924 38.3496c4.50586 14.4199 2.81348 32.4199 4.54199 39.8643 +c2.42188 10.6895 12.8975 34.2891 13.624 47.4326c0.452148 7.37891 -30.999 -10.5967 -45.9189 -10.5967s-29.5693 8.9248 -42.8916 9.58691c-16.4854 0.791016 -26.9297 -12.9541 -41.8818 -10.5967c-8.49414 1.38867 -15.8926 9.02246 -30.7812 9.58691 +c-21.2002 0.824219 -47.1895 -11.6582 -95.874 -10.0918c-47.8926 1.58203 -91.8369 60.2373 -97.8926 69.6348c-7.07227 11.0127 -15.832 11.1455 -25.2305 2.52344c-9.42969 -8.63965 -20.9102 -1.72754 -24.2207 4.03711 +c-6.28125 11.0117 -23.4697 42.7656 -49.4512 49.4502c-35.96 9.33301 -53.7939 -19.6064 -51.4688 -42.8906c2.42285 -23.5908 17.6699 -30.3115 24.7266 -42.8906c7.07129 -12.5459 10.4424 -20.6523 23.7158 -26.2393c9.42969 -3.9082 12.9014 -9.91016 10.0918 -17.6611 +c-2.48633 -6.7168 -12.1953 -8.23926 -18.6699 -8.57812c-13.709 -0.662109 -23.2686 3.04785 -30.2764 7.56934c-8.1377 5.16797 -14.5771 12.5029 -21.6982 24.7256c-8.21875 13.5312 -21.2656 19.6787 -36.3311 19.6787c-7.20117 0 -14.2256 -1.94531 -20.1836 -5.0459 +c-23.6875 -12.2715 -51.4209 -19.6787 -81.7461 -19.6787h-34.3125c-16.6162 49.3604 -25.7354 102.439 -25.7354 157.439c0 271.561 220.39 491.48 491.99 491.48zM580.671 698.575l0.0078125 0.0185547c-11.2529 -0.426758 -22.7227 -2.20801 -33.8076 -5.0459 +c-16.3418 -4.18164 -48.252 -20.4023 -107.48 -7.06348c-102.521 23.0732 -117.736 -28.6172 -123.63 -50.9658c-5.87695 -22.3633 -19.6787 -85.7812 -19.6787 -85.7812c-4.7002 -25.8506 -11.3008 -70.5801 147.85 -100.921 +c74.1504 -14.1191 77.9697 -33.6895 81.2402 -47.4395c5.85938 -24.7197 15.6299 -38.8398 26.2402 -45.9102c10.5928 -7.07227 -0.339844 -12.918 -12.1104 -14.1289c-31.5703 -3.27832 -147.95 30.4131 -216.98 69.6348 +c-56.499 34.5234 -57.3701 65.4707 -44.4043 91.8379c-85.3398 9.2041 -149.36 -8.04199 -160.971 -48.4414c-19.9395 -69.29 151.921 -187.36 348.181 -246.75c205.91 -62.3799 418 -19 441.52 110.49c10.7002 58.7549 -39.1055 102.239 -122.62 121.1 +c-4.86035 -16.373 -11.6592 -37.1748 -42.3867 -52.9834c-4.48926 -2.27637 -6.07129 1.49414 -4.03711 5.0459c11.6582 19.749 13.749 24.4961 17.1562 32.2949c4.71484 11.3838 6.875 27.7168 -2.52246 61.5615c-18.4727 66.54 -56.7412 155.293 -84.7734 184.18 +c-20.3096 20.8789 -53.0332 30.5488 -86.792 29.2676zM615.02 86.0605c2.55176 -2.45508 6.91113 -10.7227 1.58301 -21.2822c-2.97168 -5.55469 -6.20117 -9.49512 -11.9814 -14.0977c-6.89453 -5.55469 -20.4102 -11.917 -38.9795 -0.193359 +c-9.94727 6.3457 -10.5439 8.44531 -24.3018 6.68457c-9.85059 -1.29102 -13.7412 8.60742 -10.2217 16.9062c3.55273 8.20312 18.0537 14.8555 36.1387 4.32812c8.12207 -4.7959 20.7812 -14.8887 31.8584 -5.92676c4.63477 3.69824 7.36328 6.12012 13.7412 13.499 +c0.323242 0.323242 0.710938 0.500977 1.16309 0.500977c0.386719 0 0.758789 -0.162109 1 -0.418945zM468.46 565.86c-56.79 -4.11816 -62.7002 -10.2539 -73.3408 -21.5889c-15.001 -15.9863 -34.749 20.7324 -34.749 20.7324 +c-11.8838 2.50293 -26.2393 21.6211 -18.5049 39.4639c7.65332 17.6494 21.7666 12.3691 26.1904 6.91113c5.37695 -6.70117 16.8428 -17.6484 31.7627 -17.2607c14.8877 0.355469 32.1172 3.50391 56.1113 3.50391c24.2861 0 40.6592 -9.09082 41.5791 -16.8418 +c0.791992 -6.66895 -1.96973 -12.9502 -29.0488 -14.9199zM528.14 659.71h-0.242188c-0.887695 0 -1.59863 0.662109 -1.59863 1.48535c0 0.597656 0.37207 1.09863 0.904297 1.34082c10.9961 5.8125 27.4346 10.4629 46.2148 12.3848 +c5.65137 0.56543 11.1572 0.87207 16.4854 0.936523c0.936523 0 1.85742 0 2.80957 -0.0332031c31.5029 -0.709961 56.7578 -13.2568 56.3867 -27.9824c-0.387695 -14.7266 -26.207 -26.1104 -57.7598 -25.416c-10.1885 0.257812 -19.7793 1.71094 -27.999 4.11719 +c-1.00098 0.242188 -1.71094 1.0498 -1.71094 2.01855c0 1.00098 0.709961 1.84082 1.71094 2.08301c19.6846 4.53711 32.9404 11.9805 31.9883 19.0381c-1.22754 9.31641 -26.9502 14.3545 -57.4355 11.3027c-3.35938 -0.355469 -6.60449 -0.807617 -9.75391 -1.27539z" /> + <glyph glyph-name="uniF107" unicode="" horiz-adv-x="912" +d="M455.73 780.335l-0.00390625 -0.00195312c78.8809 0 152.681 -21.791 215.78 -59.4238c-36 -20.4521 -64.3799 -39.6611 -71.7002 -46.9814c-21.6592 -21.6602 -0.0800781 -78.4395 48.21 -126.729c48.2959 -48.2959 105.082 -69.8574 126.74 -48.2051 +c7.21582 7.21484 25.9629 35.001 46.1016 70.292c35.3486 -61.3906 55.7412 -132.568 55.7412 -208.42c0 -231.601 -188.449 -419.3 -420.869 -419.3c-232.421 0 -420.87 187.71 -420.87 419.3s188.449 419.47 420.87 419.47zM837.51 799.967l-0.00195312 0.000976562 +c17.04 -0.395508 32.8408 -4.44629 43.8203 -15.4248c11.0996 -11.0977 15.1201 -27.2002 15.7705 -44.8809c0.65918 -17.6738 -2.26562 -37.6719 -7.3623 -58.7217c-9.74512 -40.25 -27.7529 -83.6582 -47.5039 -119.2c34.4385 -62.0801 44.5234 -125.637 44.5234 -200.88 +c0 -237.71 -193.14 -430.859 -430.859 -430.859c-237.721 0 -430.86 193.149 -430.86 430.859c0 75.8398 20.0352 146.83 54.5146 208.78c-19.7344 34.8398 -40.6045 76.0898 -53.1123 114.28c-6.55957 20.0303 -10.9033 39.1631 -11.3945 56.2725 +c-0.490234 17.1104 3.00684 33.1562 14.1992 44.3496c10.3223 10.3223 24.9697 14.2852 40.667 14.373c49.8896 0.28125 118.979 -33.2832 173.189 -63.9814c62.8506 35.8701 135.322 56.7939 212.801 56.7939c76.4102 0 147.13 -13.3232 210.17 -48.7305 +c35.1494 19.6309 76.75 38.3604 115.17 48.7305c20.1094 5.42773 39.2197 8.63379 56.2695 8.23828zM836.982 777.53l-0.00195312 0.00683594c-13.75 0.318359 -31.0205 -2.47461 -49.7803 -7.53711c-37.5195 -10.1279 -80.7393 -29.4756 -115.34 -49.2578 +l-5.60938 -3.15527l-5.60938 3.33008c-60.1299 35.374 -128.548 48.3799 -204.739 48.3799c-75.7002 0 -146.391 -20.874 -207.19 -56.7939l-5.60938 -3.15527l-5.60938 3.15527c-53.5996 30.709 -127.335 64.208 -167.4 63.9814 +c-12.084 -0.0683594 -20.1221 -3.11914 -24.8906 -7.88867c-5.08984 -5.08984 -8.10449 -14.1992 -7.71289 -27.8711c0.391602 -13.6709 4.19531 -31.0117 10.3418 -49.7783c12.2949 -37.54 33.917 -80.7598 53.9902 -115.7l3.15527 -5.42969l-3.16895 -5.61035 +c-34.498 -59.9102 -54.3408 -129.256 -54.3408 -203.34c0 -225.58 182.851 -408.43 408.431 -408.43s408.43 182.85 408.43 408.43c0 75.6299 -9.48242 135.688 -44.1729 195.45l-3.33008 5.60938l3.1543 5.60938c19.6875 34.375 38.4854 79.248 48.0303 118.67 +c4.77246 19.71 7.2041 38.2119 6.66113 52.7617s-4.19043 24.5244 -9.29004 29.624c-5.17188 5.17188 -14.6494 8.62109 -28.3975 8.93945z" /> + <glyph glyph-name="uniF108" unicode="" horiz-adv-x="546" +d="M17.2686 0.769531v249.15l124.55 -124.55zM436.77 642.41h-131.359c47.4199 57.7773 90.1396 156.859 90.1396 156.859h135.851s-23.2412 -64.5869 -94.6357 -156.869zM366.27 0v437.56s28.4209 104.65 -350.59 -42.8867 +c-0.679688 -1.83984 -0.679688 404.601 -0.679688 404.601l123.83 0.727539v-260.4s346.82 136.58 346.82 -103.58v-436.02h-119.37z" /> + <glyph glyph-name="uniF109" unicode="" horiz-adv-x="865" +d="M429.434 800.01c221.496 0.00683594 204.385 -116.073 204.385 -116.073v-191.82c0 -116.009 -112.701 -114.1 -112.701 -114.1h-200.6c-120.298 0 -116.49 -124 -116.49 -124v-103.95h-70.6465s-118.381 -7.9502 -118.381 216.07c0 224.012 135.621 207.9 135.621 207.9 +h282.59v29.9473h-202.25l-0.236328 99.7451s-13.2402 96.2803 198.709 96.2803zM317.918 732.942c-20.123 0 -36.3867 -17.0371 -36.3867 -38.1162s16.2637 -38.1162 36.3867 -38.1162s36.3867 17.0371 36.3867 38.1162s-16.2637 38.1162 -36.3867 38.1162z +M435.533 -69.9902c-221.496 -0.0078125 -204.383 116.072 -204.383 116.072v191.82c0 116.009 112.699 114.1 112.699 114.1h200.6c120.299 0 116.49 124 116.49 124v103.95h70.6465s118.381 7.9502 118.381 -216.069c0 -224.013 -135.62 -207.9 -135.62 -207.9h-282.59 +v-29.9482h202.25l0.237305 -99.7451s13.2402 -96.2793 -198.711 -96.2793zM547.05 -2.92383c20.1221 0 36.3867 17.0371 36.3867 38.1162s-16.2646 38.1162 -36.3867 38.1162s-36.3867 -17.0371 -36.3867 -38.1162s16.2637 -38.1162 36.3867 -38.1162z" /> + <glyph glyph-name="uniF10A" unicode="" horiz-adv-x="665" +d="M219.594 127.2c0 0 -32.917 -19.334 23.4268 -25.876c68.2559 -7.86426 103.144 -6.7373 178.363 7.64258c0 0 19.7764 -12.5244 47.3965 -23.3721c-168.624 -72.9961 -381.64 4.24414 -249.188 41.6201zM198.99 222.44c0 0 -36.9199 -27.6025 19.4648 -33.4922 +c72.916 -7.59766 130.496 -8.21875 230.141 11.1592c0 0 13.7812 -14.1113 35.4521 -21.8281c-203.893 -60.2402 -430.96 -4.76074 -285.056 44.1553zM372.687 384c41.5479 -48.3164 -10.917 -91.792 -10.917 -91.792s105.5 55.0078 57.0479 123.888 +c-45.252 64.2363 -79.9561 96.1523 107.912 206.196c0 -0.00292969 -294.88 -74.3877 -154.044 -238.288zM595.714 56.7197c0 0 24.3594 -20.2715 -26.8271 -35.9541c-97.332 -29.7803 -405.12 -38.7734 -490.6 -1.18652c-30.7344 13.5039 26.9014 32.2441 45.0322 36.1768 +c18.9072 4.1416 29.7129 3.37012 29.7129 3.37012c-34.1797 24.3193 -220.924 -47.752 -94.8564 -68.3926c343.82 -56.2998 626.761 25.3486 537.561 65.9844zM235.426 321.12c0 0 -156.556 -37.5557 -55.4395 -51.1924c42.6914 -5.77344 127.804 -4.4668 207.08 2.24219 +c64.7881 5.51953 129.844 17.2559 129.844 17.2559s-22.8457 -9.88086 -39.374 -21.2803c-158.979 -42.2275 -466.119 -22.583 -377.672 20.6123c74.7646 36.4863 135.564 32.3359 135.564 32.3359zM516.274 162.6c161.607 84.8164 86.8877 166.328 34.7324 155.345 +c-12.7832 -2.6875 -18.4834 -5.01562 -18.4834 -5.01562s4.74609 7.50781 13.8096 10.7578c103.18 36.6367 182.528 -108.056 -33.3066 -165.364c0 -0.0351562 2.50684 2.25195 3.25 4.26758zM418.834 800c0 0 89.5 -90.4277 -84.8877 -229.476 +c-139.836 -111.544 -31.8799 -175.124 -0.0517578 -247.805c-81.6279 74.3604 -141.532 139.86 -101.345 200.805c58.9482 89.4561 222.364 132.827 186.284 276.464zM251.306 -67.2803c155.124 -10.0283 393.341 5.56445 398.984 79.7002 +c0 0 -10.8447 -28.1035 -128.2 -50.4238c-132.399 -25.166 -295.691 -22.2275 -392.552 -6.09863c-0.00683594 0 19.8184 -16.5791 121.772 -23.1914z" /> + <glyph glyph-name="uniF10B" unicode="" horiz-adv-x="962" +d="M627.06 -99.7998c-244.38 -7.33984 -507.84 184.81 -588.46 429.2c-80.6445 244.34 52.0576 448.39 296.431 455.729c109.38 3.27246 222.25 -34.0205 321.16 -97.4834l-221.99 -308.329c-15.3057 -21.2422 -10.4668 -50.9482 10.6445 -66.1416 +c8.1377 -5.91895 17.7471 -9.05078 27.8145 -9.05078c15.249 0 29.6406 7.37305 38.5508 19.7422l221.32 307.34c86.834 -74.1846 156.13 -169.68 190.979 -275.3c80.6455 -244.38 -52.0566 -448.39 -296.43 -455.7zM742.479 694.907l-254.899 -354.01 +c-3.58887 -4.9873 -9.19043 -7.625 -14.9131 -7.625c-3.69141 0 -7.42871 1.10059 -10.6719 3.46777c-8.22168 5.91895 -10.0674 17.3555 -4.14844 25.5771l255.301 354.56c6.77637 -10.9238 17.1875 -18.8936 29.333 -21.9873zM753.72 799.989 +c-27.0195 0 -48.8994 -23.8896 -48.8994 -53.334c0 -11.0361 3.06641 -21.2803 8.33301 -29.7803c6.77637 -10.9238 17.1875 -18.8838 29.3232 -21.9883c3.64453 -0.941406 7.37305 -1.53711 11.2412 -1.53711c26.9932 0 48.8701 23.834 48.8701 53.3057 +c0 29.4453 -21.8857 53.334 -48.8701 53.334h0.00195312z" /> + <glyph glyph-name="uniF10C" unicode="" horiz-adv-x="830" +d="M483.59 -200.378l-158.859 34l-159.73 104l-115.042 177l-30.6143 161l-4.34375 133.7s17.2578 89.835 26.1084 107.53c8.84961 17.6982 71.5156 114.319 71.5156 114.319l118.75 102.49l163.72 66.3721l110.62 -4.4248l111.7 -23.5635l91.8408 -47.2334l75.2207 -110.62 +s13.2744 -57.5225 17.6992 -75.2207c4.4248 -17.6992 13.2744 -132.74 13.2744 -132.74l-44.248 -128.32l-92.9199 -92.9199l-123.891 -53.0967l-128.319 39.8223l-79.6465 70.7969l-30.9727 110.62l30.9727 101.77l79.6465 70.7969l93.3604 9.29004l65.9316 -35.3984 +l48.6729 -71.2373l-84.0713 66.3721l-53.0967 13.2744l-61.9473 -17.6992l-35.3975 -35.3984l-35.3984 -57.5215v-88.4951l44.248 -61.9463l84.0713 -53.0986h84.0703l88.4961 44.248l44.248 61.9473s26.5488 66.3721 26.5488 92.9199c0 26.5488 0 84.0713 -8.84863 106.19 +c-8.84961 22.123 -53.0977 110.619 -53.0977 110.619s-39.8232 35.3984 -57.5215 44.248c-17.6992 8.84961 -75.5811 32.0537 -75.5811 32.0537s-66.0127 12.1943 -88.1367 12.1943s-106.189 -26.5488 -106.189 -26.5488l-92.9199 -48.6729l-84.0713 -61.9473 +l-57.5215 -101.77l-17.6992 -101.771l4.4248 -97.3447l8.84961 -75.2207l35.3975 -79.6475l44.248 -88.4951l66.3721 -70.7959l66.3721 -70.7969l100.01 -53.0977l63.71 -22.123z" /> + <glyph glyph-name="uniF10D" unicode="" +d="M507.887 798.149l0.015625 -0.0078125c4.69824 0.0625 9.31738 0.0546875 13.9961 0c22.46 -0.259766 44.6104 -1.74219 65.4307 -4.72168c109.02 -15.6094 202.46 -62.9346 282.449 -143c32.8906 -32.9199 60 -67.4395 81.2705 -103.699 +c16.0498 -27.3604 40.5996 -84.2607 44.3496 -102.511c1.03809 -5.04492 3.15527 -13.334 4.55273 -18.3799c5.18066 -18.6885 12.0361 -64.5947 13.9961 -93.9248c4.15723 -62.2002 -4.1123 -134.053 -21.584 -189.37 +c-9.42871 -29.8555 -31.1309 -77.1357 -44.1797 -96.1172c-4.03418 -5.86719 -13.0449 -19.3311 -20.0674 -30.0146c-15.0752 -22.9395 -35.6064 -47.3535 -59.8613 -71.1602c-82.2002 -80.6904 -176.09 -127.18 -285.66 -141.49 +c-29.9102 -3.90332 -88.125 -4.99707 -117.7 -2.19238c-137.45 13.041 -252.368 76.7803 -343.83 190.551c-15.0439 18.7139 -25.2363 33.0332 -34.0615 47.8896c-3.87891 6.5293 -10.54 17.4561 -14.6699 24.2822s-9.41406 17.126 -11.8047 22.7646 +c-2.38965 5.63965 -6.15332 13.9404 -8.2627 18.5488c-4.8418 10.584 -13.5918 37.0518 -18.3799 55.3096c-11.0039 41.96 -18.9307 97.54 -18.8857 132.71c0.0400391 31.0098 2.88477 66.1299 7.58789 92.4102c4.44336 24.8193 5.6748 29.4199 14.1641 58.3398 +c10.3467 35.2461 14.9824 47.4814 29.0039 75.8818c15.9424 32.2891 35.9932 62.8984 60.874 92.9131c13.9834 16.8682 58.1855 60.958 74.0273 73.8574c65.4902 53.3398 133.09 85.7715 210.95 101.351c30.21 6.04492 63.3994 9.34375 96.2793 9.78027zM288.862 512.992 +l0.00683594 0.000976562c-49.0488 -0.136719 -73.2412 -0.470703 -73.6904 -0.842773c-1.47559 -1.22559 -1.33887 -4.6377 1.18066 -23.1025c3.87793 -28.415 10.3564 -48.6348 24.1143 -76.0498c16.0918 -32.0635 34.626 -56.0166 63.2354 -81.6152 +c15.0635 -13.4785 25.2891 -21.3574 41.4814 -31.5322c16.5215 -10.3818 40.9551 -22.0898 59.6943 -28.666c6.70312 -2.35352 8.54785 -3.33887 17.874 -10.4551c16.5928 -12.6611 33.3018 -39.7568 38.1094 -61.5498c4.79199 -21.7207 3.57617 -56.2256 -2.86621 -80.4346 +c-10.8818 -40.8906 -14.127 -49.5537 -32.8818 -86.6738c-7.67871 -15.1982 -13.9961 -28.8818 -13.9961 -30.3535c0 -3.84473 4.6709 -10.1846 10.4551 -14.165c9.86035 -6.7832 36.4893 -14.5312 58.5127 -17.0303c5.63867 -0.639648 11.71 -1.30957 13.4902 -1.51758 +c8.3418 -0.972656 30.6162 -0.560547 43.8428 0.842773c36.0859 3.83008 64.2852 13.7266 72.0029 25.2939c3.46973 5.2002 3.08105 8.08301 -2.36035 17.3682c-2.63965 4.50391 -5.58789 10.1035 -6.57617 12.4785c-0.989258 2.37305 -4.10352 8.68164 -6.74512 13.9951 +c-15.1094 30.3926 -31.2666 76.8428 -34.2314 98.1406c-0.408203 2.93555 -0.706055 15.5986 -0.674805 28.1611c0.0439453 18.4717 0.494141 24.7842 2.19238 32.5449c2.33887 10.6865 9.55762 28.5049 13.3213 32.7129c1.3457 1.50488 4.23145 5.33496 6.40723 8.59961 +c8.09473 12.1436 26.7793 29.9785 33.3887 31.8701c13.2705 3.79883 37.623 14.9092 55.6465 25.4629c38.3994 22.4854 77.0918 59.7061 98.8154 94.9375c11.5303 18.6982 15.9307 26.9746 18.7178 35.2422c1.45703 4.32227 4.36133 12.124 6.4082 17.2002 +c6.78125 16.8213 13.8662 51.165 13.1523 63.4033l-0.336914 5.56445l-294.93 0.168945c-99.7402 0.0917969 -173.711 0.136719 -222.761 0zM111.81 390.233l0.0117188 -0.0146484l0.674805 -7.75684c1.64844 -20.6006 7.80371 -40.4805 18.5439 -59.1904 +c12.3398 -21.4902 17.7295 -27.6895 41.3203 -47.8896c17.7295 -15.1807 38.0898 -27.0703 54.2998 -31.8701c18.8193 -5.58008 22.1201 -8.25 31.0098 -24.7705c5.89355 -10.9482 7.9043 -20.1299 7.92578 -36.7607 +c0.0302734 -24.7871 -6.16992 -46.4346 -22.2598 -78.5801c-5.7041 -11.3965 -10.2852 -21.8418 -10.2852 -23.2695c0 -3.16016 6.01758 -8.80371 12.3096 -11.4678c7.84277 -3.31934 19.1436 -5.56934 38.9531 -7.9248 +c7.4541 -0.886719 15.8242 -0.671875 27.9922 0.842773c13.7861 1.7168 25.0039 4.52539 32.376 8.09473c5.4873 2.65625 11.2979 8.2832 11.2979 10.791c0 1.00488 -4.42871 10.8086 -9.94922 21.7539c-10.9229 21.6572 -14.5596 31.4141 -18.5488 49.9121 +c-4.06738 18.8604 -4.94141 28.9219 -3.70996 39.7969c1.23242 10.874 6.69336 27.542 11.6348 35.2422c6.12598 9.5459 9.26758 11.7168 22.2598 15.3457c10.6836 2.98242 27.4854 10.9316 27.4854 12.9834c0 0.407227 -5.88184 2.67773 -13.1523 5.22754 +c-20.7334 7.27246 -45.9131 21.4795 -69.8115 39.29c-14.9414 11.1357 -41.3301 37.2363 -50.4189 49.9131c-4.18555 5.83887 -10.8506 15.2197 -14.8389 20.7412c-3.9873 5.52148 -8.14258 12.1982 -9.27441 14.8389l-2.19238 4.72168h-56.8271h-56.8262zM796.951 389.713 +l-3.87988 -7.08105c-11.0117 -20.0928 -23.3877 -35.5312 -46.709 -58.5127c-23.3184 -22.9814 -34.4414 -31.5049 -63.5723 -48.2275c-13.5703 -7.79004 -20.5967 -10.9326 -33.2188 -15.1758c-5.03516 -1.69238 -9.25781 -3.49121 -9.44336 -4.04688 +c-0.469727 -1.40918 13.4033 -9.36035 20.4043 -11.6348c14.4629 -4.69824 23.3213 -8.50391 26.6436 -11.6357c4.95996 -4.67578 13.6064 -22.459 15.8506 -32.5449c1.42188 -6.39355 1.77832 -11.374 1.34863 -21.416 +c-1.05176 -24.5918 -7.53516 -46.3838 -22.5957 -76.0498c-5.82812 -11.4814 -10.623 -21.4697 -10.623 -22.2588c0 -2.74023 5.77637 -8.27539 11.8037 -11.2979c17.334 -8.69238 49.6484 -11.6992 76.2197 -7.08301c12.6064 2.19043 18.7578 4.10742 25.4629 7.75781 +c5.96289 3.24512 9.61133 7.01367 9.61133 10.1172c0 1.09473 -4.11426 9.99805 -9.10547 19.7295c-21.667 42.2412 -29.248 88.8652 -18.3799 112.64c3.77148 8.25098 13.9922 23.6797 16.6934 25.125c1.27148 0.680664 7.28027 2.74609 13.3213 4.55273 +c25.9062 7.74707 50.0791 23.7246 75.5449 49.9131c10.2529 10.5449 14.793 17.0449 25.7998 36.2549c5.94043 10.3682 7.73828 14.4668 10.623 25.8008c5.23242 20.5488 6.42285 27.0117 6.07129 31.1953l-0.337891 3.87891h-58.6816h-58.8516z" /> + <glyph glyph-name="uniF10E" unicode="" horiz-adv-x="761" +d="M533.754 493.45c0 0 -11.792 109.95 -120.88 113c-109.09 3.05273 -165.12 -82.4619 -165.12 -204.62s61.918 -219.9 168.06 -219.9c106.143 0 117.94 122.16 117.94 122.16l203.44 -12.2148s11.9785 -110.33 -73.1543 -194.51 +c-85.1338 -84.1709 -189.63 -97.9229 -262.601 -97.3516c-72.9717 0.583008 -174.149 -1.14258 -271.989 99.0684c-97.8486 100.21 -114.45 197.56 -114.45 293.189c0 95.6309 18.5547 222.32 134.89 318.391c79.0703 65.2812 159.221 89.333 239.38 89.333 +c334.65 0 357.131 -308.65 357.131 -308.65z" /> + <glyph glyph-name="uniF10F" unicode="" horiz-adv-x="969" +d="M696.521 799.974l0.0185547 0.0175781c71.5625 -0.794922 163.888 -22.2676 229.662 -100.419c21.0498 -25.0049 24.0127 -54.0801 23.4502 -86.7676c-0.541016 -32.6738 -6.8623 -69.9814 -18.1221 -110.521c-19.0684 -68.6367 -52.5996 -146.204 -99.2305 -219.25 +c11.8516 0.21582 27.3311 1.54199 48.7236 5.64551c16.2012 3.10938 31.2705 9.52246 55.2607 -7.42773c11.9951 -8.47461 19.0312 -26.623 17.8262 -38.3252c-1.20508 -11.7012 -5.7627 -18.6914 -9.80469 -24.3613c-16.1689 -22.6768 -38.3652 -35.457 -67.7373 -48.1299 +c-33.1553 -14.3223 -72.7471 -19.0762 -109.331 -17.5283h-1.7832l-5.94141 0.59375c-0.78418 -3.78223 -1.4375 -8.02637 -2.08008 -12.7744c-2.54297 -88.1221 -15.6318 -142.428 -44.2666 -180.338c-28.9434 -38.3164 -72.4092 -50.5146 -106.658 -57.3389 +c-48.6143 -9.6875 -91.417 4.83594 -113.193 28.2236s-27.3809 49.8633 -29.4131 54.9629c-12.5449 31.4863 -13.4746 67.5303 -15.1504 106.359c-0.530273 12.293 -1.0293 24.4092 -1.48633 36.8408c-11.9609 -4.95312 -23.9609 -8.58691 -35.3535 -10.3984 +c-33.415 -5.31445 -61.7725 -0.0117188 -78.4326 3.8623c-9.27441 2.15625 -18.4209 5.11719 -27.6299 9.80371c-7.30469 3.71875 -15.0635 7.75098 -22.5781 16.9346c-15.4326 -11.8184 -33.4229 -19.7197 -53.1807 -20.5 +c-28.2031 -1.1123 -52.1572 11.9375 -69.5195 27.6309c-34.7266 31.3818 -56.9404 77.5801 -77.2451 128.938c-20.3066 51.3574 -36.5459 107.902 -48.1299 155.975c-11.585 48.0723 -18.3848 85.0752 -19.6094 107.845c-4.43848 82.5117 16.5693 143.222 56.4482 182.413 +c39.8779 39.1914 93.8994 53.0664 143.199 55.5576c70.9258 3.58203 138.051 -14.4727 170.538 -24.957c32.875 17.9102 73.9746 28.6523 121.5 27.9268c25 -0.375977 47.6377 -2.7666 68.9375 -6.23926c0.899414 0.262695 1.34961 0.608398 2.375 0.891602 +c6.89941 1.91309 16.4375 4.25293 27.9248 6.53613c22.9746 4.56543 54.2373 8.71582 90.0127 8.31836zM687.927 776.224l0.0166016 0.000976562c-33.8438 -0.291992 -63.1387 -5.08496 -83.4834 -9.50684c-10.1729 -2.21094 -18.0781 -4.42285 -23.1738 -5.94141 +c-2.54883 -0.759766 -4.34473 -1.31934 -5.64551 -1.7832c-0.325195 -0.115234 -0.795898 -0.140625 -1.1875 -0.296875c-0.196289 -0.078125 -0.210938 -0.121094 -0.594727 -0.296875c-21.0166 4.87891 -43.5195 7.94434 -68.0352 8.31836 +c-48.2012 0.735352 -86.5225 -11.3438 -116.461 -30.3037c-14.665 5.27051 -72.29 24.9805 -139.638 27.9277c-11.0645 0.484375 -22.3115 0.302734 -33.5713 -0.296875c-45.0371 -2.40137 -91.3613 -14.9229 -125.075 -48.1289 +c-33.7119 -33.2129 -53.2207 -85.9004 -49.0195 -164c0.987305 -18.3506 7.62695 -56.4375 19.0137 -103.688c11.3877 -47.25 27.2451 -102.588 46.9414 -152.413c19.6963 -49.8125 42.6396 -93.7998 70.9902 -119.438c14.1807 -12.8154 30.8467 -21.5244 49.3174 -20.7959 +c18.4697 0.728516 35.8955 10.8604 51.6943 28.5215c37.6934 42.1641 68.7832 72.5176 74.8682 78.4326c16.29 -8.14941 34.3301 -12.9307 53.4775 -13.3691c0.0380859 -0.501953 0.24707 -0.986328 0.296875 -1.48535 +c-11.1611 -12.1738 -16.6338 -19.5059 -21.9854 -23.4697c-6.20605 -4.59863 -16.1914 -8.41797 -45.1582 -13.9639c-15.9648 -3.06055 -26.4658 -6.41504 -34.4629 -12.4785c-3.99805 -3.03125 -7.62598 -7.28613 -8.91309 -12.4775 +c-1.28613 -5.19043 0.177734 -10.4678 2.37695 -14.2598c4.40039 -7.58691 11.0391 -11.4023 17.8262 -14.8555c6.78809 -3.45312 13.8877 -5.82129 20.7969 -7.42773c14.8105 -3.44629 39.6611 -7.9834 67.4395 -3.56445c20.4365 3.25 42.6816 11.7295 62.3906 28.2236 +c-0.287109 -33.7109 0.189453 -66.1064 1.48535 -94.1787c0.950195 -20.5977 2.31445 -38.8525 4.15918 -53.7744c1.84473 -14.9209 3.70703 -26.1074 7.42676 -34.7598c5.38574 -12.5146 14.4902 -33.0146 34.167 -48.4258 +c19.6758 -15.4102 50.248 -24.3789 92.0996 -16.043c33.835 6.74512 58.8525 17.2617 76.6504 34.4629c17.7969 17.2012 27.0273 40.0439 32.3838 68.9258c6.33301 34.1279 16.8828 112.026 21.6875 153.9c0.0908203 -0.0263672 0.205078 0.0263672 0.296875 0 +c11.502 -3.32422 25.1484 -4.60645 39.8115 -4.45703c29.3242 0.300781 62.208 5.49902 85.2656 15.4492c25.9932 11.2236 46.4922 24.8389 56.7451 39.2158c2.56348 3.59473 4.80762 7.5625 5.34766 12.7754c0.540039 5.21191 -2.33594 12.4404 -7.42676 16.043 +c-10.1826 7.2041 -20.1826 5.24414 -33.5723 2.67383c-53.2041 -10.2119 -79.834 -6.27539 -91.5049 -1.7832c-2.91699 1.12305 -4.8584 2.28027 -6.23828 3.26855c55.9814 79.2246 95.7012 167.519 116.759 243.324c10.8535 39.0752 16.7354 74.7402 17.2305 104.578 +c0.495117 29.8369 -3.56738 54.1182 -17.5283 70.709c-62.0752 73.7529 -148.599 91.4951 -216.287 90.9111zM688.24 750.973l-0.00195312 0.00292969c62.5498 0.541016 138.7 -14.7021 194.6 -81.1152c6.87402 -8.16699 12.332 -27.9609 11.8838 -54.9619 +c-0.448242 -27 -5.8916 -61.0244 -16.3398 -98.6357c-19.4033 -69.8496 -56.1289 -151.716 -106.657 -225.787c-1.4707 1.68359 -2.93555 3.30859 -4.45703 5.05078c19.1836 29.5732 22.5479 59.6377 21.0938 87.0488c-1.54492 29.1475 -7.62695 55.9971 -6.83301 78.7295 +c1.07227 31.2539 9.74707 53.4424 8.61621 86.1582c0.0800781 0.274414 0.235352 0.651367 0.296875 0.890625c0.648438 2.50586 0.381836 3.8877 0.296875 5.34766c-0.168945 2.9209 -0.635742 5.66211 -1.48535 8.91309 +c-1.7002 6.50293 -4.76074 14.7168 -9.20996 24.6592c-8.89844 19.8818 -23.4424 46.0254 -45.4551 72.1934c-26.7305 31.7734 -64.6191 63.9736 -114.977 84.6729c18.1699 3.49316 41.9443 6.60254 68.6289 6.83301zM505.525 741.468l-0.015625 0.0078125 +c101.4 -1.54688 166.838 -49.5654 207.388 -97.7471c20.2646 -24.0898 34.1729 -48.0469 42.1875 -65.9551c2.36914 -5.29297 3.07031 -8.5 4.45605 -12.4775c-47.833 4.49512 -79.5576 -3.52832 -97.7432 -22.876c-20.5186 -21.8291 -19.3037 -52.7178 -11.29 -82.5928 +s23.5449 -60.5479 37.7314 -85.8604c7.09277 -12.6562 13.6416 -24.0186 19.0137 -32.9775c5.37207 -8.95801 9.52344 -16.1504 10.3984 -18.1221c8.19531 -18.4727 18.8281 -31.6592 27.0361 -41.2959c4.23535 -4.97363 7.48828 -9.06152 9.80469 -12.1807 +c-2.9707 -0.811523 -6.60547 -1.67969 -10.3984 -3.26855c-7.69141 -3.21973 -16.5371 -9.2207 -22.2832 -19.0137c-5.49414 -9.36523 -8.10547 -21.5967 -7.42676 -37.4336l-0.00390625 -0.296875l0.00390625 -0.297852 +c0.0244141 -0.520508 -0.0332031 -0.956055 0 -1.48535c-2.00195 -23.2119 -16.5361 -134.84 -23.7676 -173.8c-4.87891 -26.3164 -12.4912 -43.5205 -25.2529 -55.8535c-12.7607 -12.334 -31.6973 -20.8584 -62.6875 -27.0361 +c-35.7432 -7.12012 -55.2852 0.0107422 -68.9258 10.6953c-13.6416 10.6836 -21.2822 26.334 -26.4414 38.3252c-1.54785 3.59961 -3.91309 14.2168 -5.64453 28.2236c-1.73242 14.0059 -3.22754 31.7998 -4.16016 51.9912 +c-1.86328 40.3789 -2.0918 90.4209 -0.59375 140.225l0.000976562 0.167969c0 1.04199 -0.266602 2.69727 -0.594727 3.69434c-0.0419922 0.297852 -0.25 0.594727 -0.297852 0.891602l0.00390625 0.296875l-0.00390625 0.296875 +c-0.595703 3.4668 -1.40234 6.91113 -2.67383 10.1016c-5.0918 12.7744 -14.7314 23.7988 -28.5205 29.1152c-4.51074 1.7373 -12.0049 4.94531 -21.6875 4.15918c-1.75098 -0.142578 -3.56836 -0.764648 -5.34863 -1.18848c2.75 10.7139 7.5918 23.5498 13.3691 38.0283 +c0.00878906 0.0214844 -0.00878906 0.276367 0 0.297852c13.7266 34.2998 50.9697 79.6396 22.5791 201.725c-5.91797 25.4414 -22.1025 42.2129 -41.8906 49.3174c-9.89355 3.55273 -20.4424 5.0459 -30.8975 5.05078 +c-10.4551 0.00390625 -20.7705 -1.39355 -30.8975 -3.56543c-20.2539 -4.34375 -39.3623 -11.8496 -53.7734 -19.3105c-0.210938 -0.109375 -0.384766 -0.188477 -0.59375 -0.297852c1.93066 22.7607 7.0293 56.6943 20.7959 90.6143 +c11.8008 29.0781 29.6875 57.4189 56.4473 78.1357c2.07617 1.60742 4.35156 3.23633 6.53613 4.75391c25.9785 18.0527 59.8125 29.5234 106.062 28.8184zM239.01 739.396l-0.000976562 0.00976562c50.1621 -0.999023 98.8369 -13.6523 125.375 -21.6875 +c-25.125 -22.9658 -41.8633 -51.1416 -53.1758 -79.0283c-25.6982 -63.3213 -24.0869 -126.015 -24.0645 -126.863c0 -0.00585938 -0.015625 0.366211 0 -0.296875c0.0146484 -0.663086 0.148438 -1.72754 0.296875 -2.37695 +c0.176758 -8.39453 1.32715 -20.9697 1.78223 -39.8105c0.495117 -20.4941 0.00585938 -46.583 -4.15918 -74.2744c-7.15234 -47.5537 13.1904 -91.25 47.2373 -118.243c-9.2168 -9 -37.2998 -36.6201 -73.085 -76.6504 +c-12.8525 -14.3662 -23.3506 -18.9658 -32.0859 -19.3115c-8.73535 -0.344727 -18.4141 3.42969 -29.4121 13.3691c-21.998 19.8799 -45.0869 61.9473 -64.1729 110.223c-19.0879 48.2734 -34.8613 103.005 -46.0498 149.438 +c-11.1895 46.4326 -17.6709 85.5869 -18.4199 99.5264c-3.96387 73.6855 14.0312 118.123 41.5938 145.274c27.5664 27.1494 66.2031 38.2324 106.953 40.4053c7.17578 0.382812 14.2256 0.44043 21.3877 0.297852zM727.733 541.243 +c3.4375 0.151367 7.13281 0.0712891 10.9932 0c7.23633 -0.132812 15.5107 -0.769531 24.3613 -1.7832c-0.505859 -24.8301 -7.51562 -45.1631 -8.61523 -77.2451c-0.955078 -27.3154 5.43555 -54.4648 6.83301 -80.8096 +c1.13184 -21.3467 -0.609375 -41.8291 -11.29 -62.6875c-2.50195 4.15039 -4.87012 8.57129 -7.12988 13.666c-2.40723 5.42676 -6.49707 11.8125 -11.8838 20.7969c-5.3877 8.98438 -11.8496 20.1289 -18.7178 32.3838c-13.7344 24.5078 -28.2861 53.8711 -35.3535 80.2158 +s-6.08887 47.8467 5.34766 60.0137c7.50488 7.98438 21.3955 14.3848 45.4551 15.4492zM400.935 537.084c7.85156 -0.00585938 15.0518 -1.09961 21.0957 -3.26953c12.0869 -4.33984 20.8145 -12.1162 25.252 -31.1953 +c27.1689 -116.828 -4.99219 -146.733 -21.3906 -187.763c-5.625 -14.0957 -11.1387 -27.5244 -14.5576 -40.7021c-58.8174 0.0878906 -108.874 53.2285 -99.2305 117.353c4.44043 29.5146 4.97363 57.0439 4.45703 78.4326 +c-0.47168 19.5176 -1.87207 32.5176 -2.08008 38.0283c0.37207 0.316406 0.381836 0.506836 0.891602 0.891602c2.93457 2.21973 8.10547 5.42969 14.2598 8.61523c12.3076 6.37305 29.2695 12.9756 46.3467 16.6377c8.53809 1.83105 17.1055 2.97461 24.9561 2.97168z +M722.398 529.357c-2.65723 0.0605469 -5.64941 -0.209961 -8.61621 -0.59375c-5.93262 -0.768555 -11.2793 -2.14844 -15.1514 -4.15918c-1.93555 -1.00586 -3.28418 -2.24316 -4.45605 -3.56543c-1.17285 -1.32227 -2.03906 -3.00098 -1.78223 -4.75391 +c0.253906 -1.67676 1.03711 -3.20703 2.37598 -4.75293c1.33887 -1.54688 3.19824 -3.10254 5.34766 -4.45703c4.2998 -2.70703 10.2607 -4.68848 16.6377 -3.8623c6.38477 0.823242 11.6465 4.30762 15.4492 8.02246c1.90137 1.85645 3.42676 3.7959 4.45605 5.64453 +c0.980469 1.76074 1.66309 3.32031 1.48535 5.05078c-0.00878906 0.0859375 0.0126953 0.210938 0 0.296875c-0.262695 1.75293 -1.45605 3.18555 -2.9707 4.15918c-1.51562 0.973633 -3.4873 1.60449 -5.64453 2.08008 +c-2.15723 0.474609 -4.47363 0.831055 -7.13086 0.890625zM402.723 523.119c-2.78809 -0.0634766 -5.37891 -0.375 -7.72461 -0.891602s-4.38672 -1.18555 -6.23828 -2.37695c-0.776367 -0.499023 -1.7334 -1.33984 -2.37695 -2.0791h-1.18848l-0.59375 -3.56543 +c-0.399414 -2.62793 0.633789 -4.47363 1.78223 -6.53613c1.14844 -2.06348 2.71582 -4.25 4.75391 -6.23926c4.07422 -3.97852 9.87012 -7.70508 16.9346 -8.61523c7.05469 -0.915039 13.4639 1.22363 18.1221 4.15918c2.33008 1.46777 4.14746 3.31934 5.64551 5.05078 +c1.49707 1.73047 2.62109 3.31641 2.9707 5.64453c0.371094 2.47461 -0.648438 4.62109 -2.08008 6.23926c-1.43066 1.61719 -3.24219 3.06543 -5.34766 4.15918c-4.21094 2.1875 -9.57129 3.65723 -15.7461 4.45605c-3.08398 0.400391 -6.12402 0.65625 -8.91309 0.594727z +M770.235 247.419c3.57715 -2.71094 7.75879 -5.26758 13.3701 -7.42676c19.4355 -7.48145 51.3936 -10.1758 107.549 0.59375c-8.30078 -6.96875 -22.0176 -16.2598 -38.0293 -23.1738c-16.8408 -7.26758 -48.5322 -12.8096 -74.2734 -13.0723 +c-12.8711 -0.131836 -24.5645 1.26562 -31.4932 3.26758c-3.31152 0.957031 -5.23535 1.85938 -5.94141 2.37695c-0.633789 13.002 1.625 20.6367 4.15918 24.9561c2.61426 4.45605 5.71289 6.30859 9.80469 8.02148c4.09082 1.71387 8.90723 2.50781 14.8545 4.45703z +M445.499 244.156l0.0117188 -0.000976562c2.1377 0.174805 4.64941 -0.738281 8.89941 -2.375c4.36816 -1.68457 10.5771 -7.55371 13.3691 -14.5576s2.48633 -13.7256 -0.891602 -18.123c-19.665 -25.6045 -42.627 -35.3984 -64.7656 -38.9199 +s-43.4902 -0.0439453 -56.4482 2.9707c-4.54102 1.05566 -10.1914 3.12695 -14.5566 5.34766c-1.80078 0.916016 -1.51562 0.908203 -2.67383 1.7832c3.63281 1.58301 8.90527 3.52441 18.4199 5.34766c30.0566 5.75391 45.1543 10.4258 56.7441 19.0137 +c11.5918 8.58789 16.54 17.7793 30.6016 32.3838c5.97168 6.21387 9.14453 6.95605 11.29 7.12988z" /> + <glyph glyph-name="uniF110" unicode="" horiz-adv-x="791" +d="M395.625 800c183.298 0 380.625 -55.2725 380.625 -176.719v-516.562c0 -121.393 -197.3 -176.719 -380.625 -176.719c-183.353 0 -380.625 55.3262 -380.625 176.719v516.562c0 121.446 197.272 176.719 380.625 176.719zM721.875 106.719v101.572 +c-56.1689 -57.8818 -191.672 -87.9785 -326.25 -87.9785s-270.081 30.0967 -326.25 87.9785v-101.572c0 -67.5342 146.051 -122.344 326.25 -122.344c180.172 0 326.25 54.8096 326.25 122.344zM721.875 269.844v101.572 +c-56.1689 -57.8818 -191.672 -87.9785 -326.25 -87.9785s-270.081 30.0967 -326.25 87.9785v-101.572h0.108398c0 -0.271484 -0.108398 -0.571289 -0.108398 -0.842773c0 -67.126 146.078 -121.501 326.25 -121.501s326.25 54.375 326.25 121.501 +c0 0.271484 -0.108398 0.571289 -0.108398 0.842773h0.108398zM721.875 432.969v93.416c-71.2588 -54.293 -201.867 -79.8223 -326.25 -79.8223s-254.991 25.5293 -326.25 79.8223v-93.416h0.108398c0 -0.271484 -0.108398 -0.571289 -0.108398 -0.842773 +c0 -67.126 146.078 -121.501 326.25 -121.501s326.25 54.375 326.25 121.501c0 0.271484 -0.108398 0.571289 -0.108398 0.842773h0.108398zM395.625 500.938c180.172 0 326.25 54.8096 326.25 122.344c0 67.5879 -146.078 122.344 -326.25 122.344 +c-180.199 0 -326.25 -54.7559 -326.25 -122.344c0 -67.5342 146.051 -122.344 326.25 -122.344zM613.125 93.125c0 18.125 9.0625 27.1875 27.1875 27.1875s27.1875 -9.0625 27.1875 -27.1875s-9.0625 -27.1875 -27.1875 -27.1875s-27.1875 9.0625 -27.1875 27.1875z +M613.125 256.25c0 18.125 9.0625 27.1875 27.1875 27.1875s27.1875 -9.0625 27.1875 -27.1875s-9.0625 -27.1875 -27.1875 -27.1875s-27.1875 9.0625 -27.1875 27.1875zM613.125 419.375c0 18.125 9.0625 27.1875 27.1875 27.1875s27.1875 -9.0625 27.1875 -27.1875 +s-9.0625 -27.1875 -27.1875 -27.1875s-27.1875 9.0625 -27.1875 27.1875z" /> + <glyph glyph-name="uniF111" unicode="" horiz-adv-x="711" +d="M199.361 800l-0.00585938 0.0175781c8.38965 0.260742 15.6797 -4.7334 23.4297 -7.1875c18.9395 6.18457 23.2002 -2.4873 32.5 -5.9375c20.6396 4.36133 26.9697 -4.97754 36.8701 -14.9961l11.25 0.3125c31.126 -18.3438 46.7031 -55.793 52.1875 -75 +c5.4834 19.2031 21.0576 56.6533 52.1885 75l11.25 -0.3125c9.89453 10.0215 16.2344 19.3613 36.875 15c9.29883 3.44922 13.5742 12.1211 32.5 5.9375c11.8145 3.73828 22.1797 13.585 37.8115 1.25c13.1602 5.07617 26.0898 6.89746 37.5 -3.4375 +c17.6299 2.28516 23.1602 -2.61719 27.5 -8.125c3.87988 0.0791016 29.1299 4.0332 40.6299 -13.125c28.9102 3.4209 38.1504 -16.8926 27.8203 -35.9502c5.89551 -9.14062 11.9336 -18.209 -1.875 -35.625c4.88477 -9.70508 1.81738 -20.3857 -9.6875 -33.125 +c3.03613 -13.6416 -3.04492 -23.123 -13.75 -30.625c2.00293 -18.6689 -17.1016 -29.5713 -22.8115 -33.4385c-2.19238 -10.877 -6.59766 -21.1982 -28.4385 -26.875c-3.60156 -16.2109 -16.9766 -19.0977 -29.6885 -22.5 +c42.0107 -24.4297 78.0508 -56.4795 77.8105 -135.31l6.25 -10.9404c48.1699 -29.29 91.5195 -123.46 23.75 -200c-4.42969 -23.96 -11.8301 -41.2695 -18.4404 -60.3096c-9.88672 -76.7441 -74.543 -112.631 -91.5615 -116.88 +c-24.9404 -18.9971 -51.2451 -37.0625 -87.1885 -49.6885c-33.8848 -34.9473 -70.5908 -48.1475 -107.5 -48.125c-0.541016 -0.00585938 -1.33398 0 -1.875 0c-36.9092 -0.0214844 -73.6162 13.1787 -107.5 48.125c-35.9434 12.626 -62.249 30.6914 -87.1875 49.6885 +c-17.0186 4.25 -81.6748 40.1406 -91.5625 116.88c-6.61035 19.0439 -14.0107 36.3555 -18.4375 60.3115c-67.7734 76.5303 -24.4219 170.705 23.75 200l6.25 10.9404c-0.244141 78.8301 35.7998 110.89 77.8193 135.3c-12.7119 3.40234 -26.0859 6.28906 -29.6875 22.5 +c-21.8418 5.6748 -26.2451 15.9971 -28.4385 26.875c-5.70898 3.86816 -24.8135 14.7695 -22.8115 33.4375c-10.7051 7.50195 -16.7861 16.9834 -13.75 30.625c-11.5049 12.7402 -14.5713 23.4209 -9.6875 33.125c-13.8066 17.4248 -7.46582 26.4854 -1.5625 35.625 +c-10.3516 19.0459 -1.40723 39.3584 27.5 35.9375c11.5029 17.1592 36.7549 13.2051 40.625 13.125c4.33984 5.50781 9.87012 10.4111 27.5 8.125c11.4102 10.335 24.3398 8.51367 37.5 3.4375c5.37012 4.24023 9.98047 5.80078 14.3799 5.9375zM200.605 777.83v-0.0078125 +c4.32227 -5.34375 10.1543 -10.4229 3.75 -16.5625c-8.8291 5.59668 -17.4717 11.334 -38.4385 15.3125c4.72461 -5.34863 14.3604 -10.9023 8.4375 -16.25c-11.085 4.29785 -23.3027 7.5625 -36.875 9.375c6.49805 -5.42676 11.8887 -10.7969 6.5625 -15 +c-11.8623 3.7041 -28.0918 8.6748 -44.0615 4.375l10 -10.3125c1.12109 -1.38184 -23.6514 -1.00684 -40 -1.25c5.9668 -8.41406 12.0781 -16.4922 15.625 -30.9248c-1.62012 -1.66699 -9.86133 -0.740234 -17.5 0c7.83301 -16.7412 21.5117 -20.9609 24.6875 -28.125 +c-4.78613 -3.67773 -11.4941 -2.81348 -18.75 -0.3125c5.63867 -11.7939 17.5303 -19.8037 26.875 -29.375c-2.36328 -1.70215 -6.47656 -2.74219 -16.25 -1.5625c8.63379 -9.31543 19.2002 -17.9658 31.5625 -25.625c-2.18945 -2.56836 -9.8916 -2.3291 -16.875 -2.5 +c11.1963 -11.126 25.5547 -17.0957 39.0615 -24.375c-6.73242 -4.66895 -11.4062 -3.50098 -16.5615 -3.4375c9.55371 -7.96777 25.8574 -12.0654 40.9375 -16.875c-2.86816 -4.52441 -5.74316 -5.91699 -11.875 -7.1875c15.9609 -8.9668 38.8643 -4.79297 45.3125 -9.375 +c-1.55664 -4.50684 -5.98926 -7.55078 -11.25 -10c25.7012 -1.51465 95.9082 1.00781 109.38 55c-26.3105 29.335 -74.2861 63.9785 -156.88 106.56c64.25 -21.834 122.079 -50.8945 170.619 -90.9443c57.0459 26.9678 17.8301 94.8799 -10 121.88 +c-1.41113 -7.12988 -3.17383 -11.7959 -5 -13.125c-9.06152 9.86133 -16.46 20.1992 -28.125 29.6875c-0.0400391 -5.57227 2.88086 -11.8271 -4.05957 -16.25c-6.25977 8.54297 -14.7197 16.3428 -25.9404 22.8135c5.41016 -9.46484 1.03027 -12.3281 -1.86914 -16.251 +c-8.57324 7.46191 -16.6914 14.7695 -32.5 20.625zM512.485 777.822l-0.0146484 -0.00488281c-15.8096 -5.85547 -23.9268 -13.1631 -32.5 -20.625c-2.90723 3.92285 -7.28125 6.78418 -1.875 16.25c-11.2256 -6.4707 -19.6846 -14.2705 -25.9385 -22.8125 +c-6.94434 4.42188 -4.02441 10.6768 -4.0625 16.25c-11.665 -9.49023 -19.0625 -19.8271 -28.125 -29.6875c-1.8252 1.3291 -3.58887 5.99512 -5 13.125c-27.8301 -26.9971 -67.0498 -94.9102 -10 -121.87c48.5205 40.0498 106.37 69.0996 170.62 90.9346 +c-82.5801 -42.5898 -130.569 -77.2197 -156.859 -106.56c13.4756 -53.9922 83.6826 -56.5146 109.38 -55c-5.26172 2.44922 -9.69336 5.49219 -11.25 10c6.44629 4.58203 29.3506 0.408203 45.3115 9.375c-6.13086 1.27051 -9.00684 2.66211 -11.875 7.1875 +c15.0811 4.80957 31.3848 8.90723 40.9385 16.875c-5.15527 -0.0644531 -9.83008 -1.23242 -16.5625 3.4375c13.5068 7.27832 27.8643 13.249 39.0625 24.375c-6.98438 0.170898 -14.6865 -0.0683594 -16.875 2.5c12.3613 7.65918 22.9277 16.3086 31.5615 25.625 +c-9.77246 -1.17969 -13.8867 -0.139648 -16.25 1.5625c9.34473 9.57031 21.2363 17.5811 26.875 29.375c-7.25586 -2.50098 -13.9639 -3.36621 -18.75 0.3125c3.17578 7.16406 16.8555 11.3838 24.6885 28.125c-7.63965 -0.741211 -15.8799 -1.66699 -17.5 0 +c3.55176 14.4521 9.6582 22.5234 15.625 30.9375c-16.3496 0.243164 -41.1221 -0.132812 -40 1.25l10 10.3125c-15.9697 4.2998 -32.1992 -0.670898 -44.0625 -4.375c-5.32617 4.20312 0.0634766 9.57324 6.5625 15c-13.5723 -1.8125 -25.79 -5.07715 -36.875 -9.375 +c-5.92188 5.34766 3.71289 10.9023 8.4375 16.25c-20.9678 -3.97852 -29.6094 -9.71582 -38.4375 -15.3125c-6.40527 6.13965 -0.572266 11.2178 3.75 16.5625zM355.271 555.627c-45.5879 1.18652 -89.2705 -34.0625 -89.376 -54.375 +c-0.126953 -24.6797 35.9775 -49.6709 89.6885 -50.3115c54.8486 -0.393555 89.8232 20.1533 90 45.625c0.200195 28.8564 -49.8613 59.5068 -90.3125 59.0615zM217.46 538.447l0.00488281 0.00195312c-63.3066 -1.17969 -111.624 -45.0371 -109.38 -117.5 +c2.50977 -31.75 165.64 110.582 137.5 115.311c-9.54883 1.61133 -19.082 2.35547 -28.125 2.1875zM484.654 535.949c-9.03809 0.166016 -18.5723 -0.578125 -28.1201 -2.18945c-28.1396 -4.7207 134.988 -147.062 137.5 -115.311 +c2.24023 72.4707 -46.082 116.322 -109.38 117.5zM452.159 449.072c-16.9199 -0.439453 -33.2871 -6.04395 -46.5615 -17.1875c-50.8955 -42.8496 -34.1699 -128.276 16.25 -164.38c3.87207 -2.71777 7.77148 -5.44531 11.875 -7.8125 +c28.8857 -17.3604 68.7617 -17.9111 95.3115 4.375c50.8955 42.8506 34.1699 128.277 -16.25 164.38c-3.90332 2.66797 -7.83984 5.3457 -11.875 7.8125c-14.4424 8.67969 -31.8291 13.252 -48.75 12.8125zM257.779 447.198l-0.00195312 0.00878906 +c-54.5918 2.31055 -104.465 -49.6572 -108.75 -103.75c-0.329102 -4.71875 -0.71582 -9.3252 -0.625 -14.0615c0.0410156 -33.7021 20.0205 -68.1377 52.8125 -79.375c62.9697 -21.4795 127.29 36.9297 132.189 98.7402c0.269531 4.71973 0.594727 9.64551 0.625 14.375 +c-0.0410156 33.7021 -20.0195 68.1377 -52.8115 79.375c-7.87109 2.68457 -15.6396 4.35742 -23.4385 4.6875zM603.088 389.082c-38.4883 -0.641602 -9.88574 -182.999 25 -167.502c39.6104 31.8701 52.1885 125.254 -21.25 167.189 +c-1.38379 0.371094 -2.50879 0.333984 -3.75 0.3125zM99.3379 386.58h0.00488281c-1.24121 0.0195312 -2.36719 0.0595703 -3.75 -0.310547c-73.4395 -41.9395 -60.8613 -135.329 -21.2549 -167.189c34.8848 -15.5 63.4834 166.865 25 167.5zM359.662 261.27 +c-0.549805 0.0107422 -1.4502 0.0195312 -2.00488 0.0195312c-54.6113 0 -98.9326 -40.8711 -98.9326 -91.2295l0.00195312 -0.665039c-0.0146484 -0.598633 -0.0273438 -1.57031 -0.0273438 -2.16992c0 -50.3584 44.3223 -91.2285 98.9326 -91.2285 +c54.6113 0 98.9336 40.8701 98.9336 91.2285c0 0.599609 -0.0126953 1.57129 -0.0283203 2.16992l0.00292969 0.672852c0 49.167 -43.2617 90.0254 -96.5654 91.2021l-0.15625 0.000976562zM576.228 226.9c-23.1846 -0.599609 -50.9121 -22.8281 -77.1885 -52.4961h0.3125 +c-30.6162 -35.8633 -47.959 -101.125 -25.625 -122.189c21.3545 -16.3662 78.9043 -14.0693 121.25 44.6875c30.748 39.46 20.376 105.31 2.8125 122.811c-6.52246 5.04492 -13.834 7.38867 -21.5615 7.1875zM125.917 212.843 +c-5.98438 -0.554688 -11.4434 -2.50391 -16.5625 -5.62207c-18.2607 -13.8965 -21.6328 -61.0156 4.375 -107.5c38.5615 -55.3975 92.6582 -60.9785 115 -47.5c23.6133 17.6523 10.7969 77.4688 -17.5 111.56c-24.3555 28.2588 -54.1543 47.9941 -79.0625 49.0625 +c-2.0752 0.0888672 -4.25586 0.185547 -6.25 0zM358.096 49.4053c-39.4971 0.988281 -100.11 -15.6523 -99.375 -37.1875c-0.630859 -14.6875 47.4209 -57.1201 96.5625 -55c47.4512 -0.818359 96.5977 41.2734 95.9375 60 +c-0.104492 19.2842 -53.3799 33.9229 -93.125 32.1875z" /> + <glyph glyph-name="uniF112" unicode="" horiz-adv-x="932" +d="M237.92 800l50.0068 -0.015625h380.28h52.0801l22.9199 -46.875l105.72 -253.36h-167.71l-65.1035 133.59h-279.24l-131.25 -237.5l130.21 -229.17h262.5l50 101.04l-204.17 -1.04199c-44.0264 -0.623047 -84.5205 39.3037 -84.5205 83.333 +c0 44.0303 40.4941 83.9561 84.5205 83.333l338.54 1.04199h134.38l-59.375 -120.83l-132.29 -266.67l-22.917 -46.875h-52.083h-362.5h-48.958l-23.96 42.71l-177.083 311.46l-22.917 40.6201l22.917 40.6299l177.083 321.872z" /> + <glyph glyph-name="uniF113" unicode="" horiz-adv-x="820" +d="M143.215 -9.41602c0 0 -8.75684 54.9961 12.4951 160.006c21.251 105.01 52.5049 175.021 106.261 275.031c53.7598 100.01 140.02 182.518 265.029 193.77c125.01 11.251 223.771 -88.7598 223.771 -88.7598l-15.002 -22.502s-37.5029 42.5059 -106.261 35.0049 +c-68.7598 -7.5 -190.018 -77.5 -208.77 -231.271c-18.752 -153.76 55.0059 -321.279 55.0059 -321.279h-332.529zM76.9141 158.084l65.0068 -5l-11.251 -65.0078l-61.2559 7.50098zM179.414 295.584l-58.7559 18.75l18.752 52.5059l57.5059 -22.501zM260.715 463.184 +l-45.0059 30.0039l35.0039 38.7539l43.7559 -28.7539zM349.414 618.184l41.2539 21.252l30.0029 -33.7539l-41.2539 -23.752zM495.715 659.385l53.7549 -2.50098l5 -32.5029l-51.2549 -1.25zM669.514 620.684l41.2549 -30.002l-7.50098 -11.252l-35.0039 18.752z +M662.014 524.384l33.7549 -7.50098v-15.002l-33.7549 3.75195v18.751zM554.514 508.184l35.0039 8.75098l5.00098 -20.002l-23.752 -18.751zM503.215 469.384l25.002 -37.5049l-15.002 -26.252l-36.2539 40.0039zM453.215 365.584l36.252 -27.5039l-10.001 -41.2539 +l-42.5039 36.2539zM435.715 251.884l47.5049 -25.0029l2.5 -41.2539l-52.5059 22.502zM450.715 96.8838l55.0049 -0.000976562l23.7529 -48.7539l-66.2578 3.75zM200.726 799.82l-0.00390625 -0.00195312h593.09h9.37402v-9.37402v-638.4 +c0 -104.64 9.00195 -178.096 -13.123 -229.05c-11.0635 -25.4766 -30.8477 -44.5508 -61.5596 -56.2471c-30.7139 -11.6963 -72.0928 -16.874 -129.37 -16.874c-226.899 0 -573.09 2.1875 -573.09 2.1875h-9.37402v9.375s1.5625 224.859 1.5625 453.409 +c0 221.101 -10.7129 338.988 6.87402 406.23c8.79395 33.6211 26.7217 55.3291 55.3105 66.2461c28.5928 10.916 66.7979 12.499 120.31 12.499zM200.722 781.383l0.00488281 0.00195312c-53.0322 0 -89.5918 -2.45996 -113.43 -11.5615 +c-23.8369 -9.10352 -36.2227 -23.4668 -44.0605 -53.4355c-15.6758 -59.9395 -6.25 -179.88 -6.25 -401.54c0 -223.909 -1.50195 -435.029 -1.57129 -444.039c10.6592 -0.0634766 340.52 -2.1875 563.72 -2.1875c56.1484 0 95.7246 5.30859 122.81 15.624 +s41.6465 24.8564 50.9355 46.2471c18.5771 42.7803 11.5615 115.961 11.5615 221.551v629.34h-583.72z" /> + <glyph glyph-name="uniF114" unicode="" +d="M1015 259.93v0.0136719v-98.6416c0.00585938 -9.99219 -11.9639 -20.9297 -39.126 -35.084c-53.3604 -27.8193 -329.829 -141.442 -388.68 -172.12c-58.8516 -30.6885 -91.4609 -30.4902 -137.95 -8.26562c-46.4902 22.2197 -340.84 141.092 -393.83 166.42 +c-26.4863 12.6611 -40.4111 23.3379 -40.4111 33.4307v101.03c0.395508 -10.0703 13.916 -20.7695 40.4111 -33.4297c52.9902 -25.3203 347.33 -144.03 393.83 -166.24c46.4902 -22.2305 79.0996 -22.6104 137.95 8.08008c58.8496 30.6797 335.319 144.31 388.68 172.11 +c25.0127 13.0381 37.8896 23.3896 39.126 32.6963zM1015 424.89v-98.8203c0.00585938 -9.98633 -11.9639 -20.9307 -39.126 -35.084c-53.3604 -27.8203 -329.829 -141.432 -388.68 -172.12c-58.8516 -30.6777 -91.4609 -30.4912 -137.95 -8.2666 +c-46.5 22.21 -340.84 141.093 -393.83 166.42c-26.4863 12.6611 -40.4111 23.3389 -40.4111 33.4316v101.21c0.395508 -10.0703 13.916 -20.7705 40.4111 -33.4297c52.9902 -25.3203 347.33 -144.211 393.83 -166.421c46.4902 -22.2295 79.0996 -22.5996 137.95 8.08008 +c58.8496 30.6904 335.319 144.301 388.68 172.12c25.0127 13.0381 37.8896 23.5723 39.126 32.8799zM1015 595.72v0.00390625v-98.6416c0.00585938 -9.97949 -11.9639 -20.9297 -39.126 -35.084c-53.3604 -27.8193 -329.829 -141.61 -388.68 -172.3 +c-58.8516 -30.6768 -91.4609 -30.3076 -137.95 -8.08203c-46.5 22.21 -340.84 141.097 -393.83 166.42c-26.4863 12.6611 -40.4111 23.3438 -40.4111 33.4307v101.03c0.395508 -10.0703 13.916 -20.7705 40.4111 -33.4297c52.9902 -25.3203 347.34 -144.2 393.83 -166.431 +c46.4893 -22.2188 79.0986 -22.4111 137.95 8.2666c58.8496 30.6895 335.318 144.305 388.68 172.12c25.0127 13.0352 37.8896 23.3896 39.126 32.6963zM559.427 651.38l-19.4082 -46.6953l-31.3594 52.085l-100.04 8.98828l74.6572 26.9385l-22.3955 41.3174 +l69.8721 -27.3447l65.9346 21.5654l-17.8467 -42.7217l67.1924 -25.1465zM373.107 500.99l231.71 35.5674l-69.9668 -102.64zM434.507 586.4c0 -26.5137 -55.4473 -48.0068 -123.84 -48.0068c-68.3965 0 -123.84 21.4932 -123.84 48.0068 +c0 26.5127 55.4473 48.0059 123.84 48.0059c68.3975 0 123.84 -21.4932 123.84 -48.0059zM748.467 647.7l137.025 -54.3721l-137.03 -54.0039l-14.6953 -5.87793l-137.029 54.1875z" /> + <glyph glyph-name="uniF115" unicode="" horiz-adv-x="668" +d="M652.72 800l-2.43945 -204.644c-43.7998 -70.3242 -461.013 -100.564 -634.96 -116.036v204.644c180.84 19.6924 590.359 61.5361 637.399 116.036zM652.4 524.152l-2.44043 -204.645c-43.7598 -70.3242 -461.012 -100.564 -634.96 -116.036v204.645 +c180.84 19.6914 590.36 61.5361 637.4 116.036zM653 250.68l-2.40039 -204.644c-43.7998 -70.3203 -461.052 -100.561 -635 -116.04v204.644c180.841 19.6807 590.4 61.5205 637.4 116.04z" /> + <glyph glyph-name="uniF116" unicode="" horiz-adv-x="660" +d="M250.157 380.469c-121.03 12.7393 -100.701 200.474 -3.18457 251.612c64.6064 33.8818 151.829 32.4014 210.213 9.55469c110.732 -43.3418 140.13 -98.7305 156.062 -207.032c15.9258 -108.286 -37.4346 -394.74 -165.632 -426.784 +c-114.661 -28.665 -158.905 26.918 -146.512 79.625c12.7402 54.1465 75.5361 124.285 79.626 171.992c9.55469 111.477 -130.587 121.032 -130.587 121.032h0.0146484zM34.4873 644.785c-32.4199 47.0859 -23.4658 109.519 19.9971 139.445 +c43.4668 29.9268 104.982 16.0176 137.404 -31.0703c32.4209 -47.0879 23.4697 -109.52 -19.9971 -139.446c-43.4648 -29.9268 -104.982 -16.0176 -137.404 31.0713zM284.434 674.437c-27.7432 4.72559 -45.4561 45.123 -40.8789 72.0029 +c4.57715 26.877 30.7812 44.8359 58.5264 40.1084c27.7432 -4.72363 45.4561 -45.123 40.8789 -72.001s-30.7812 -44.834 -58.5264 -40.1104zM374.404 693.845c-15.71 22.2842 -10.2998 68.5322 12.7051 84.749c23.0039 16.2178 46.0234 11.9287 61.7334 -10.3535 +c15.71 -22.2871 10.2998 -68.5352 -12.7051 -84.751c-23.002 -16.2168 -46.0234 -11.9277 -61.7334 10.3555zM470.49 677.104h-0.00292969c-4.8252 23.252 15.4795 58.5127 40.4541 63.6963c24.9736 5.18457 49.1299 -9.46289 53.957 -32.7148 +c4.82422 -23.252 -15.4766 -58.5107 -40.4512 -63.6982c-24.9766 -5.18262 -49.1406 9.46484 -53.957 32.7168zM571.944 643.807c14.2031 21.1855 39.9297 28.8291 57.4619 17.0762c17.5312 -11.7539 20.2324 -38.458 6.03027 -59.6426 +c-14.2041 -21.1865 -39.9316 -28.8301 -57.4639 -17.0771c-17.5312 11.7568 -20.2324 38.4609 -6.02832 59.6436z" /> + <glyph glyph-name="uniF117" unicode="" horiz-adv-x="966" +d="M640.881 799.869l-0.0683594 0.00195312c20.0596 0.591797 36.9502 -0.582031 57.1396 -8.86523c21.2598 -7.23535 34.8604 -22.9385 49.4502 -37.2344c15.4902 -20.0488 24.4199 -47.4072 34.8496 -70.5703c7.24023 -19.4502 15.1406 -32.3604 28.3701 -45.3896 +c8.5 -8.37012 19.7998 -22.0508 27.5605 -33.3301c22.5 -50.3301 45.1201 -87.8105 84.3398 -130.511c20.9365 -19.9629 25.127 -29.8867 25.127 -56.3838c5.96191 -40.7979 5.52246 -71.3613 -5.26855 -112.77c-1.2998 -3.0127 -8.77344 -13.8545 -16.6162 -24.1143 +c-11.5703 -15.1357 -14.9297 -18.7588 -18.2373 -20.2129c-2.66797 -1.17383 -5.01367 -1.83008 -6.88965 -1.41895c-4.31836 0.949219 -9.84961 6.24902 -11.3477 10.9932c-1.87695 5.94824 0.683594 14.1426 8.10547 25.5322 +c12.5059 18.3818 19.1387 39.6963 14.9951 60.9941c-3.19922 15.4258 -1.91504 31.3252 -4.45801 46.8086c-4.15527 16.6982 -10.1943 25.8877 -16.6162 25.8877c-7.00684 0 -12.335 -10.6865 -21.0742 -40.4268l-5.67383 -54.9648 +c-0.461914 -44.9619 0.928711 -80.0459 3.64746 -89.7178c2.73438 -9.72656 2.74316 -40.208 0 -53.1924c-2.5332 -11.9912 -1.82129 -17.126 3.64746 -28.3682c5.52832 -11.3672 7.30371 -19.1006 6.48438 -32.2705c-0.705078 -11.332 -2.2041 -16.2188 -7.29492 -27.3047 +c-5.67773 -12.3633 -6.65723 -17.1504 -7.7002 -36.1709c-0.542969 -9.90332 -1.93848 -20.5557 -2.83691 -23.7598c-5.1709 -18.4424 -4.40039 -22.7871 5.67383 -50.001c6.33496 -17.1123 10.1084 -33.2002 8.51074 -35.4619 +c-0.603516 -9.17871 2.2627 -18.5293 0.810547 -27.6602c-11.6982 2.08691 -32.0742 5.72754 -66.4639 10.6387c0.347656 0.735352 0.410156 1.36914 0.810547 2.12695c6.59863 12.4629 7.85938 15.4932 9.72656 28.0156c1.93848 12.999 4.22168 20.4834 14.1836 46.0996 +c6.79297 17.4648 7.03906 18.8857 7.7002 29.7881c1.13086 18.6426 -0.171875 46.3604 -2.83691 56.0293c-3.50488 12.7217 -4.44824 22.6357 -4.45801 47.5176c-0.00585938 16.8896 -0.352539 25.001 -1.62109 30.8516c-2.39453 11.0527 -10.1953 29.1582 -19.4521 45.3906 +c-9.75684 17.1074 -12.7832 23.2422 -17.0215 36.8799c-6.9502 19.1494 -18.1064 36.3184 -21.4795 56.3838c-2.94824 20.4424 -9.03711 30.1426 -19.0479 30.1426c-7.46387 0 -11.5537 -4.47266 -20.2637 -20.2129c-15.2314 -23.4678 -26.3008 -45.0244 -29.1787 -72.3418 +c-3.47461 -22.7764 -4.99316 -45.083 -4.86328 -68.0859v-32.2695l-3.24219 -5.67383c-1.95605 -3.15332 -7.71484 -9.79492 -12.9688 -14.5391c-6.56055 -5.92383 -10.876 -10.7168 -13.7793 -15.6035c-7.74902 -13.0381 -12.7578 -20.0225 -22.29 -31.2061 +c-10.6416 -12.4834 -19.8936 -27.1738 -21.8848 -35.4609c-1.63477 -6.7998 -0.374023 -13.8369 3.64746 -19.1484c1.5127 -1.99902 6.43164 -6.2832 10.9414 -9.5752c13.3555 -9.74707 17.8252 -16.1514 21.0742 -32.624 +c1.41602 -7.18164 1.45508 -10.0283 0.404297 -16.3125c-1.52637 -9.13574 -4.13574 -15.585 -8.10547 -19.8584c-10.7285 0.794922 -21.4736 1.51074 -32.4219 2.12793c-2.91797 2.5957 -5.8877 5.90625 -8.91602 9.92969 +c-6.24902 8.30273 -10.916 12.8154 -14.9951 13.1211c-4.0791 0.304688 -7.24121 -3.46484 -11.3477 -10.9932c-2.24512 -4.11621 -4.98828 -7.32617 -8.10547 -9.92969c-27.0645 0.800781 -54.0391 0.948242 -80.6484 0.709961 +c-0.317383 1.01367 -0.258789 1.98828 0 3.19141c1.14551 5.34277 6.82715 9.52344 21.8848 15.958c10.9395 4.67383 14.7324 6.91797 20.2637 11.7021c10.7861 9.32715 18.2627 23.5156 18.2373 34.752c-1.83984 15.376 -16.5029 27.123 -26.748 39.0078 +c-9.64941 11.2949 -25.6455 24.8652 -39.7168 33.6875c-14.5283 9.10938 -28.2334 19.3857 -32.8271 24.8232c-2.07129 2.45215 -4.73926 7.34473 -6.0791 10.9932c-2.24316 6.10938 -2.44434 8.21094 -2.43164 28.7236c0.0126953 25.542 0.272461 26.8896 10.1318 42.1992 +c7.73535 12.0107 10.7598 20.6406 12.1582 35.8154c0.637695 6.92578 2.53613 17.3174 4.05273 23.0508c3.38477 12.7959 2.92871 18.6504 -1.21484 23.4043c-4.41992 5.07129 -10.8262 6.77246 -25.127 6.73828c-3.39551 -0.0078125 -6.39941 0.236328 -8.91602 0 +c-7.55273 -0.708984 -11.5684 -2.91113 -16.2119 -7.09277c-8.25195 -7.42969 -12.1465 -18.209 -13.373 -39.0078c-1.05273 -17.8359 -1.98145 -20.8311 -12.9697 -40.4258c-8.08301 -14.415 -10.0098 -20.9541 -14.1836 -42.9082 +c-2.10254 -11.0547 -2.64551 -15.333 -2.43164 -36.1709c0.236328 -22.9141 0.163086 -24.4346 -2.43164 -32.2695c-1.48438 -4.48145 -5.86133 -14.0391 -9.72656 -21.2773c-8.49707 -15.915 -9.89941 -20.4717 -11.3477 -36.1709 +c-0.617188 -6.68066 -2.13281 -17.3662 -3.64746 -23.7588c-1.6748 -7.06641 -3.06934 -17.3145 -3.64746 -26.2422c-0.591797 -9.14062 -2.87109 -22.1045 -5.67383 -34.3984c-22.2363 -1.35059 -37.8018 -2.04785 -47.8223 -2.83691l-1.21484 0.354492 +c6.01855 10.1631 14.2822 22.665 17.0205 28.0146c5.0752 9.91113 12.4609 33.3018 14.5898 46.0996c5.03125 30.2412 5.53809 38.1553 3.24219 47.873c-0.676758 2.86621 -1.53613 16.873 -2.02637 31.2061c-0.724609 21.2295 -1.03613 27.7832 -2.83691 34.043 +c-2.75977 9.59961 -4.86523 21.2119 -4.86328 30.4971c0.00292969 11.3555 -1.90137 31.6748 -4.45801 45.0361c-3.4502 18.0361 -3.48438 50.1309 0 67.0215c2.85645 13.8438 2.16211 19.6182 -2.83691 25.8877c-7.32324 9.18652 -15.1934 10.1709 -34.8525 4.60938 +c-56.6328 -15.1357 -115.539 23.5762 -148.729 60.6396c-22.0479 32.1895 -53.8408 52.6201 -57.1436 91.1357c-2.49902 31.4248 -7.1709 57.9619 -5.67383 90.0723c-1.22461 29.3535 19.8213 49.6738 27.5576 79.0791c-4.91211 27.7607 -43.709 20.7822 -66.4639 30.1416 +c-11.2842 5.35254 -16.9531 15.2188 -14.5898 25.1777c2.83203 11.9404 15.6914 28.584 26.3428 34.0459c22.2695 9.06934 47.5879 5.53418 71.3281 10.6396c19.8799 4.46484 27.9707 7.74316 40.1201 17.376c18.1504 14.3877 22.7402 16.6221 38.9102 16.667 +c72.3301 -4.16016 97.4502 -75.3799 104.17 -128.72c2.71289 -40.5098 -16.7354 -74.9424 -27.5576 -113.12c-4.5 -15.7773 9.46777 -38.3516 27.1523 -21.9863c11.4736 31.2773 13.4785 55.3174 36.4746 82.9795c22.7559 26.625 41.666 42.5488 64.8428 54.6113 +c18.668 10.7393 37.2422 22.998 51.875 37.9443c7.81543 9.67676 22.8994 31.0098 26.3428 37.5889c13.7402 29.6826 45.7402 49.2139 79.0303 60.6387c21.5098 6.63867 42.4102 15.7627 64.8398 19.8584c7.58008 0.349609 14.79 0.866211 21.4805 1.06348zM618.522 308.021 +l0.0107422 -0.0126953c-1.59668 0.0908203 -3.10352 -0.439453 -5.26855 -1.41895c-4.52246 -2.04688 -7.02051 -6.56738 -12.5625 -24.8223c-5.99609 -19.75 -8.37207 -25.541 -13.374 -31.915c-13.9658 -17.7979 -14.04 -18.0908 -17.4268 -35.4609 +c-3.7373 -19.167 -4.13672 -19.8477 -19.0479 -33.334c-7.20312 -6.5166 -16.9678 -14.9834 -21.4795 -18.7959c-10.332 -8.72949 -14.1924 -15.5811 -14.1836 -24.8223c0 -7.07031 1.25 -10.3906 11.3496 -26.2402c8.87012 -13.9502 12.1504 -17.7598 19.8496 -24.8301 +c7.21094 -6.59961 22.1709 -16.75 30.3906 -20.5498c5.97559 -2.77051 12.0068 -3.14941 16.6162 -1.06348c4.69727 2.125 9.39941 7.5459 13.7783 15.6035c2.20117 4.04883 7.68555 12.7559 12.1582 19.5039c14.6553 22.1074 18.46 32.5244 19.8584 56.0283 +c0.496094 8.34277 1.27051 19.9189 2.02637 25.5322c1.4707 10.9033 0.660156 20.9883 -4.45801 53.1924c-1.15918 7.29688 -3.02246 24.3467 -4.45801 37.9434c-2.75195 26.0518 -3.9375 29.9082 -8.91602 33.334c-1.7627 1.21387 -3.26562 2.03711 -4.86328 2.12793z" /> + <glyph glyph-name="uniF118" unicode="" horiz-adv-x="979" +d="M888.99 26.0615l-0.0126953 -0.0146484c-1.60059 14.2842 -33.708 31.6172 -44.1553 39.5195c-20.9004 15.8125 -42.4893 32.998 -64.7734 47.4365c-11.667 7.55078 -31.8457 13.376 -44.1621 18.9678c-17.5693 7.97168 -56.2285 15.6758 -66.2422 30.0371 +c-19.0381 27.3184 -32.167 60.4512 -45.6377 93.2812c-13.4961 32.9033 -30.5869 67.5283 -44.1553 101.177c-6.72168 16.6855 -10.0273 31.7012 -17.6611 47.4316c-47.4531 97.7051 -116.824 179.611 -201.672 237.147c-27.8516 18.8877 -58.5176 36.2617 -92.7373 47.4326 +c-19.3594 6.31348 -42.5742 2.78516 -63.2979 7.90234h-13.2471c-11.6016 3.65918 -21.3076 16.8789 -30.9082 23.7158c-19.9951 14.2246 -39.6953 24.2529 -63.3047 34.7832c-8.89258 3.96875 -32.6719 13.3926 -41.2109 6.32129 +c-5.00977 -1.77441 -7.24609 -4.04199 -8.83301 -9.4873c-4.99121 -8.05664 -0.419922 -20.6152 2.94434 -28.4541c9.45703 -22.0742 23.123 -35.5127 35.3281 -53.748c11.0244 -16.4727 24.4482 -35.2227 32.3838 -53.7529 +c16.6045 -38.7588 23.9688 -81.8047 39.7412 -120.151c6.05957 -14.7256 14.8018 -31.5156 23.5566 -44.2676c7.07617 -10.3174 19.7197 -18.124 23.5498 -31.626c8.02734 -13.5312 -11.8047 -59.6631 -16.1914 -74.3066 +c-16.96 -56.6074 -13.3789 -135.799 5.89551 -184.978c7.61328 -19.4443 14.8213 -42.1123 35.3213 -47.4229c1.51465 1.26758 0.367188 0.584961 2.95117 1.57812c4.36133 37.875 5.88281 74.3984 17.6611 104.346c7.36426 18.7363 21.3916 31.5645 30.9141 47.4316 +c6.98438 -4.32617 6.94531 -16.9473 10.2959 -25.2969c8.69629 -21.6533 17.6611 -45.1289 27.9766 -66.4033c21.5957 -44.5625 45.3027 -87.3711 72.125 -126.482c9.5293 -13.8965 22.3369 -28.9766 33.8594 -41.1045c4.89258 -5.15625 10.8867 -7.81152 14.7168 -14.2275 +h1.47559v-1.58496c-19.7725 7.25488 -31.8135 28.7012 -47.1064 41.1045c-29.4922 23.9189 -64.2949 59.3682 -83.9033 93.2881c-8.83398 18.9668 -17.668 37.9365 -26.501 56.9072v1.58203c-3.68652 -5.28223 -2.53223 -11.0811 -4.41406 -18.9707 +c-8.32227 -34.7939 -1.82324 -74.2295 -30.9141 -86.9561c-33.2559 -14.5586 -57.4424 23.4043 -67.7119 41.1045c-33.4658 57.6631 -42.1416 154.494 -19.1367 232.407c5.10938 17.3057 5.62695 38.5107 14.7168 52.1719 +c-1.46973 12.2705 -10.7617 15.7705 -16.1855 23.7158c-8.84668 12.9512 -16.5586 28.207 -23.5566 42.6855c-13.8438 28.6191 -23.1494 62.3086 -33.8525 93.2744c-4.34766 12.5732 -5.22656 24.4863 -10.3086 36.3652c-7.72559 18.0762 -21.5693 36.0967 -32.3838 52.1709 +c-15.4053 22.9043 -58.4785 67.0303 -41.2109 112.249c27.3467 71.6367 122.052 17.1475 158.974 -7.90332c9.27246 -6.28906 19.5557 -19.2773 29.4385 -23.7139c16.1924 -1.05664 32.3906 -2.11328 48.5752 -3.16309c30.1738 -7.68457 58.7275 -13.5654 82.4414 -28.4551 +c111.453 -70.0234 183.401 -141.26 250.241 -259.284c13.9229 -24.5947 21.2148 -51.6338 32.3838 -79.0537c16.3682 -40.2031 34.5146 -81.9346 53.0078 -120.13c8.82129 -18.2412 15.0508 -38.0918 26.4883 -53.7539c4.83984 -6.61621 17.707 -8.67969 25.0322 -12.6484 +c21.7725 -11.8037 47.165 -20.8545 67.7109 -34.7832c37.0469 -25.1162 73.0244 -55.2334 105.984 -85.3789c12.5986 -11.5225 20.835 -28.3701 32.3906 -41.1045v-6.3252c-10.3096 -3.15527 -20.6123 -6.32422 -30.915 -9.4873 +c-22.8545 -6.33887 -42.6338 -4.69043 -64.7666 -11.0645c-13.1758 -3.79004 -29.8916 -9.33984 -44.1689 -11.0654l1.47559 -1.58496c8.40137 -25.165 53.4678 -46.1328 73.6006 -61.6562c25.249 -19.4609 49.002 -42.8867 67.7119 -69.5596l19.1367 -20.5527 +c4.34766 -6.76172 5.56738 -15.6641 10.3027 -22.1367v-1.57812c-9.01074 3.42383 -13.6738 11.9248 -20.6055 17.3906c-14.0283 11.0576 -28.3115 23.3975 -42.6865 33.1943c-24.3955 16.6221 -52.6807 26.0957 -78.0146 42.6895 +c-14.2432 9.3252 -27.9365 20.8486 -41.2236 31.6172c-12.1582 9.86035 -25.7861 28.6592 -33.8584 42.6895c-4.19727 7.31055 -5.01758 16.1855 -10.2969 22.1299c1.56738 12.9316 16.8877 13.0439 26.4951 17.3975c33.8066 15.3115 73.3516 20.4814 125.12 18.9746z +M207.334 618.777v0c5.24316 -5.45215 13.293 -9.13672 17.4541 -15.6211c3.13086 -4.86816 3.66211 -9.98633 7.27246 -14.0664c0.0458984 -16.6484 -4.08301 -27.5586 -13.0928 -34.377c-0.479492 -0.516602 -0.97168 -1.04004 -1.45117 -1.55664 +c-4.85547 10.9307 -9.70312 21.8691 -14.5518 32.8066c-6.29297 9.67383 -15.2773 16.9004 -20.3652 28.1309h-1.45801v1.56348c7.97852 1.86914 15.5234 3.33105 26.1924 3.12012z" /> + <glyph glyph-name="uniF119" unicode="" +d="M515 800c276.15 0 500 -223.85 500 -500c0 -276.07 -223.63 -499.89 -499.69 -500h-386.56c-62.7031 0 -113.602 50.7695 -113.75 113.44v386.869c0.200195 275.99 223.98 499.69 500 499.69zM661.88 681.56c-129.6 0 -234.689 -105.09 -234.689 -234.68v-124.38 +h-98.4404c-30.6504 0 -55.3301 -24.0996 -55.3096 -54.6904c0 -30.3994 24.3701 -54.6895 54.6797 -54.6895h81.5703c9.65918 0 17.5 -7.85059 17.5 -17.5v-107.5c-0.120117 -68.3203 -55.7402 -123.74 -124.07 -123.74c-23.1396 0 -28.5703 3.12012 -44.3701 3.12012 +c-33.1895 0 -55.6299 -22.2197 -55.6299 -52.8105c0.00976562 -25.3096 21.9004 -47.1191 48.4404 -54.0693c18.1992 -4.75 31.8994 -7.18066 51.5596 -7.18066c129.6 0 234.69 105.091 234.69 234.681v124.38h98.4395c30.6504 0 55.3301 24.0996 55.3105 54.6904 +c0 30.3994 -24.3701 54.6895 -54.6807 54.6895h-81.5703c-9.65918 0 -17.5 7.85059 -17.5 17.5v107.5c0.120117 68.3203 55.7402 123.74 124.07 123.74c23.1406 0 28.8799 -3.12012 44.6807 -3.12012c33.1992 0 55.3193 22.5303 55.3193 53.1201 +c-0.00976562 25.3096 -21.5898 46.8096 -48.1299 53.7598c-18.2002 4.75 -32.21 7.17969 -51.8701 7.17969z" /> + <glyph glyph-name="uniF11A" unicode="" horiz-adv-x="943" +d="M896.72 103.77c16.7402 -38.7295 31.21 -72.1494 31.2402 -111.89c0 -23.0098 -23.7998 -27.3896 -67.7197 -27.3896c-4.02051 0 -8.08008 0.0400391 -12.1699 0.0595703c-4.15039 0.0205078 -8.34082 0.0605469 -12.5303 0.0605469 +c-25.79 0 -54.9004 -0.919922 -74.04 -11.9707c-20.8799 -12.0596 -28.9697 -26.9297 -36.7998 -41.3096c-9.94043 -18.2305 -19.2803 -35.4502 -54.3604 -49.04c-3.99023 -1.5498 -8.13965 -2.29004 -12.6797 -2.29004c-19.6006 0 -42.5898 14.29 -66.9307 29.4697 +c-29.6797 18.5205 -60.3896 37.6406 -92.9795 37.6406c-22.7803 0 -52.3398 -12.3105 -83.6396 -25.3506c-31.3008 -13.0195 -63.6504 -26.5098 -88 -26.5098c-7.56055 0 -13.8203 1.28027 -19.1309 3.90039c-17.3291 8.48926 -27.0195 25.5801 -37.2793 43.6592 +c-14.7305 25.9404 -31.4102 55.3604 -74.6006 59.79c-2 0.180664 -4.14941 0.290039 -6.41016 0.290039c-20.21 0 -49 -8.31934 -76.8398 -16.3799c-27.3096 -7.88965 -55.5498 -16.04 -74.5996 -16.04c-7.58984 0 -13.2598 1.31055 -16.8496 3.89062 +c-3.63086 2.60938 -5.40039 6.79004 -5.40039 12.8291c0 23.791 9.91992 49.3105 22.46 81.6006c23.5801 60.6602 59.21 152.34 59.21 315.68c0 238.61 166.75 432.74 371.7 432.74s371.71 -194.12 371.71 -432.74c0 -129.66 31.4102 -202.319 56.6396 -260.7z +M515.229 380.63c47.7002 0 86.5107 44.9404 86.5107 100.16s-38.8008 100.15 -86.5107 100.15c-35.5596 0 -68.0195 -25.8008 -80.79 -64.2002c-0.669922 -2.00977 -2.5498 -3.36035 -4.65918 -3.36035c-2.11035 0 -3.99023 1.35059 -4.65039 3.36035 +c-12.7803 38.3896 -45.2402 64.2002 -80.7998 64.2002c-47.71 0 -86.5205 -44.9307 -86.5205 -100.15s38.8105 -100.16 86.5205 -100.16c35.5498 0 68.0195 25.8398 80.7998 64.2998c0.660156 2 2.54004 3.36035 4.65039 3.36035c2.10938 0 4 -1.34961 4.65918 -3.36035 +c12.79 -38.46 45.25 -64.2998 80.79 -64.2998zM533.14 462.72c0 -21.96 -17.7197 -39.7598 -39.5898 -39.7598c-21.8799 0 -39.5996 17.7998 -39.5996 39.7598c0 21.9502 17.7197 39.75 39.5996 39.75c21.8701 0 39.5898 -17.7998 39.5898 -39.75zM407.5 462.72 +c0 -21.96 -17.7197 -39.7598 -39.5996 -39.7598c-21.8604 0 -39.5908 17.7998 -39.5908 39.7598c0 21.9502 17.7305 39.75 39.5908 39.75c21.8691 0 39.5996 -17.7998 39.5996 -39.75z" /> + <glyph glyph-name="uniF11B" unicode="" horiz-adv-x="841" +d="M466.381 796.562c112.445 1.57129 225.426 -29.5146 315.926 -96.25c-25.7803 -26.5215 -51.71 -52.8516 -77.5 -79.3721c-3.93066 -6.16992 -9.27051 -9.9502 -15.3105 -12.5c-12.0693 -11.5098 -31.2393 -10.79 -46.8701 -16.25 +c8.94043 15.5098 17.6201 31.04 26.5605 46.5605c-42.8701 42.1719 -89.5303 85.2012 -148.44 103.439c-61.96 14.7256 -128.34 8.80469 -189.37 -7.8125c-16.1699 -4.03711 -31.1797 -10.46 -45 -18.4375c-0.699219 -0.466797 -1.48926 -0.774414 -2.18945 -1.25 +c-35.3301 -24.1182 -63.4502 -58.8379 -88.4404 -93.1279c-57.7998 -80.3896 -67.2393 -184.78 -48.1201 -279.37c6.35059 -107.35 64.1309 -207.16 148.12 -273.75c97.6201 -85.8496 241.771 -97.4502 361.88 -56.5596c-0.549805 61.0195 -1.01953 122.09 -1.55957 183.12 +l-161.26 -6.88086c4.05957 2.29004 8.12988 4.59082 12.1895 6.88086h-1.55957c28.5098 16.0693 57.1104 32.0498 85.6299 48.1191c78.2598 0.560547 156.42 1.32031 234.68 1.88086c-13.9697 -13.8604 -27.8994 -27.71 -41.8701 -41.5605v-204.689 +c-3.53906 -0.930664 -7.08984 -1.87012 -10.6299 -2.81055v-3.75c-55.6299 -14.5996 -110.729 -30.9102 -167.18 -42.1895c-140.09 -31.6309 -294 -20.9404 -419.69 52.1895c-64.2773 31.9199 -101.449 96.9404 -130 159.37 +c-39.2646 96.6699 -54.6963 206.82 -28.126 308.75c25.5703 105.25 94.7607 197.558 186.561 255c31.0801 20.7754 64.8096 37.7031 100.63 49.376c48.6699 13.8887 99.8203 21.1602 150.94 21.874z" /> + <glyph glyph-name="uniF11C" unicode="" horiz-adv-x="912" +d="M26.2246 743.311l-0.000976562 0.0185547c5.12207 0.00878906 7.08203 -4.47754 7.08203 -4.47754l173.485 -327.654h-0.732422l146.053 -275.898h0.732422l116.091 -219.282s12.7129 -19.6807 -12.4961 -32.2393c-25.2178 -12.5566 -36.96 10.1768 -36.96 10.1768 +l-116.618 241.344h0.0810547l-132.617 275.898h-0.773438l-153.462 317.664s-4.2168 8.18457 3.94824 12.6191c2.45508 1.32617 4.48047 1.82812 6.1875 1.83105zM896.854 760.612c-145.5 68.3555 -277.142 35.7109 -424.378 -7.41797 +c-148.22 -43.3994 -280.069 -66.8848 -428.177 -7.73242c16.1348 -28.2217 24.2129 -42.3291 40.3564 -70.5283c14.8213 -25.9414 29.6631 -51.8779 44.4893 -77.8076c16.1416 -28.2158 24.21 -42.3125 40.3545 -70.5234c117.922 -32.625 215.587 9.68555 320.375 60.9658 +c125.84 61.543 239.505 116.911 383.278 84.8311c-121.505 59.5488 -231.647 44.7881 -358.695 11.0518c124.38 61.9795 241.49 110.186 382.397 77.1523z" /> + <glyph glyph-name="uniF11D" unicode="" horiz-adv-x="947" +d="M481.304 385.98l146.431 -62.8945l-157.24 -57.9805l-135.62 57.9805zM261.174 307.362l209.316 -83.5312v-293.83l-214.229 94.3408zM701.431 307.362v-272.216l-193.601 -78.6182v277.13zM240.044 789.544l146.43 -62.8936l-157.239 -57.9805l-135.612 57.9805z +M19.9141 710.926l-0.00390625 -0.00488281l209.32 -83.5361v-293.83l-214.23 94.3418zM460.17 710.921v-0.00585938v-272.21l-193.6 -78.6182v277.13zM711.754 800l146.42 -62.8936l-157.229 -57.9766l-135.62 57.9766zM491.624 721.382l209.31 -83.5312v-293.829 +l-214.229 94.3408zM931.884 721.383v-0.00585938v-272.21l-193.6 -78.6182v277.13z" /> + <glyph glyph-name="uniF11E" unicode="" horiz-adv-x="597" +d="M431.632 748.602c10.4639 4.46973 23.8711 7.33789 38.2822 6.7334c6.29297 -39.8574 -13.291 -70.7764 -38.6289 -83.6533c-14.5264 -7.3877 -32.7178 -11.4668 -51.7471 -7.79395c-17.1885 3.31641 -30.0137 10.6543 -40.7783 21.6162 +c-10.9795 11.21 -16.8604 23.6084 -20.9102 41.4678c-3.63965 16.1123 -14.9697 27.4863 -31.8896 30.4883c-19.7305 3.49902 -34 -7.02344 -40.7705 -20.207c-7.78516 -15.1572 -2.17188 -32.959 1.06152 -51.4072c11.6826 0.961914 25.0732 3.2832 38.2822 3.90527 +c7.59473 -40.4951 14.1777 -82.002 21.6162 -122.64c84.208 -5.12402 142.77 -34.6914 188.58 -78.6865c44.6416 -42.8906 79.2646 -101.149 86.4961 -180.42c8.01758 -87.9395 -24.3604 -155.8 -62.0283 -202.75c-38.7295 -48.2744 -93.2393 -86.6846 -166.6 -100.33 +c-40.7275 -7.56543 -83.3223 -6.18848 -119.82 2.49805c-35.7861 8.51367 -66.9326 23.1982 -92.8652 40.7539c-53.1953 36.04 -92.7129 86.6201 -113.05 153.83c-10.6211 35.1094 -14.9004 78.8301 -9.56836 118.399c5.17383 38.4102 17.3789 72.2402 32.9668 100.311 +c31.8145 57.3301 79.2002 98.8896 141.431 125.479c-6.62012 41.5908 -14.9805 81.4307 -21.2607 123.36c12.3516 3.35449 24.8027 6.6084 37.9199 9.21582c-2.38086 14.9697 -6.32031 28.0996 -6.02051 42.8828c0.282227 14.1523 4.73438 27.5029 10.9863 37.9248 +c12.0303 20.0488 34.4834 35.4531 62.0273 37.2207c22.7197 1.45117 41.5576 -7.4043 54.583 -18.4316c13.7988 -11.6816 21.8896 -27.8516 26.2432 -46.7969c4.39453 -19.1777 20.7295 -31.9707 40.4053 -30.4795c21.7988 1.65039 40.4053 20.2969 35.0898 47.4932z" /> + <glyph glyph-name="uniF11F" unicode="" horiz-adv-x="908" +d="M15 740.216h371.68v-36.0332h-36.0537v-39.6885l-335.626 -29.1836v104.905zM542.673 632.829c47.3311 0 85.583 38.1426 85.583 85.6143c0 47.3115 -38.2617 85.835 -85.583 85.835c-47.4824 0 -85.8555 -38.5234 -85.8555 -85.835 +c0.0107422 -47.4717 38.373 -85.6143 85.8555 -85.6143zM607.508 637.64c24.5146 24.2529 64.0723 24.2529 88.5869 0l185.448 -185.197c7.14062 -7.12012 11.4082 -16.9814 11.4082 -27.6172v-555.682c0 -38.2822 -30.8506 -69.1436 -69.1133 -69.1436 +s-69.666 30.8613 -69.666 69.1436v458.408l-172.855 173.006l-69.1133 -69.124c-7.7832 -9.34961 -19.4531 -15.4561 -32.9502 -15.4561c-12.332 0 -23.46 5.3125 -31.3828 13.8994l-119.057 119.307c-15.1641 18.0166 -13.8789 45.373 4.03711 60.5576 +c18.0068 15.165 44.8506 12.584 60.0352 -5.32227l90.5254 -90.8965zM247.006 611.308l29.1641 -166.005l1.03418 -550.128h150.179v-90.8965h-244.7v641.024l28.9229 165.483c1.54688 8.56641 8.80762 14.9131 17.7559 14.9131c8.58594 0 15.958 -6.08594 17.6445 -14.3916 +z" /> + <glyph glyph-name="uniF120" unicode="" horiz-adv-x="904" +d="M237.707 -44.7852l0.378906 -0.753906l0.115234 0.814453l3.32715 0.418945l-0.0136719 -0.336914l565.485 -22.4258l-769.201 -2.93164zM634.514 264.904l231.593 -313.173l-598.132 23.7256zM889.416 -44.2656l-238.813 322.956l206.19 385.965zM15.6611 30.8281 +l27.3467 262.441l47.5117 -40.707l-75.5195 -235.889zM104.999 219.132l119.293 -237.214l-200.543 -25.3115zM222.811 37.4473l-109.626 218.317l154.181 98.0342zM613.935 284.568l-370.73 -292.795l49.4365 360.104zM468.338 568.045l137.803 -261.052l-311.146 68.9219z +M493.502 568.323l327.051 87.5156l-187.793 -351.045zM482.319 591.795l45.2959 117.295l255.961 -41.5381zM853.56 679.35l-273.431 47.9863l218.44 71.0059zM712.553 800l-206.425 -67.1006l-37.3633 10.0518zM451.948 591.697l-185.659 -207.095l-165.744 -103.521 +l-46.9043 40.1709l66.4531 123.774l157.01 175.258l149.919 104.713l69.334 -18.6475z" /> + <glyph glyph-name="uniF121" unicode="" horiz-adv-x="979" +d="M71.5137 800.312l-0.0107422 0.0166016c37.6768 -0.676758 83.4795 -27.7783 106.56 -43.4385c9.28027 -6.29297 19.4902 -19.3125 29.3799 -23.75c16.2002 -1.05176 32.5605 -2.07227 48.75 -3.125c30.1807 -7.68359 58.4707 -13.543 82.1904 -28.4375 +c111.47 -70.0303 183.46 -141.33 250.32 -259.38c13.9258 -24.6016 21.3291 -51.6406 32.5 -79.0625c16.3721 -40.2109 34.6406 -81.7764 53.125 -120c8.82129 -18.2451 15.1221 -38.085 26.5615 -53.75c4.84082 -6.61719 17.6729 -8.8418 25 -12.8115 +c21.7773 -11.8066 46.9492 -20.7559 67.5 -34.6885c37.0566 -25.1172 72.9717 -55.1592 105.94 -85.3115c12.6006 -11.5254 20.9414 -28.5127 32.5 -41.25v-6.25c-10.3125 -3.15625 -20.6338 -6.21191 -30.9385 -9.375c-22.8604 -6.34082 -42.5498 -4.875 -64.6875 -11.25 +c-13.1787 -3.79102 -30.0957 -9.21191 -44.375 -10.9385c0.498047 -0.52832 1.07031 -1.03418 1.5625 -1.5625c8.40234 -25.1709 53.6123 -46.3477 73.75 -61.875c25.2529 -19.4648 49.0977 -42.6963 67.8115 -69.375l18.75 -20.6299 +c4.35059 -6.75977 5.88965 -15.71 10.6299 -22.1895v-1.5625c-5.25 1.99414 -62.8613 6.59961 -128.75 27.8115c-48.1484 15.499 -138.987 45.5312 -141.88 47.8115c-237.232 85.5977 -218.567 94.4131 -252.19 115.62c-19.0205 12.5518 -31.8906 28.8447 -47.1875 41.25 +c-29.498 23.9248 -64.1367 59.1973 -83.75 93.125c-8.83496 18.9717 -17.7266 38.2139 -26.5625 57.1885v1.5625c-3.68555 -5.2832 -2.49219 -11.1709 -4.375 -19.0625c-8.32324 -34.7998 -1.84082 -74.1445 -30.9375 -86.875 +c-33.2617 -14.5605 -57.54 23.2354 -67.8125 40.9385c-33.4717 57.6699 -42.0713 154.574 -19.0615 232.5c5.11035 17.3096 5.59668 38.5254 14.6885 52.1875c-1.46973 12.2734 -10.8262 15.8037 -16.251 23.75c-8.84863 12.9541 -16.4385 28.0186 -23.4375 42.5 +c-13.8467 28.6279 -23.0449 62.4668 -33.75 93.4385c-4.34863 12.5762 -5.22852 24.3682 -10.3125 36.25c-7.72656 18.0801 -21.6836 36.1104 -32.5 52.1875c-15.4072 22.916 -58.5205 67.2734 -41.25 112.5c10.2588 26.8691 29.8965 35.7178 52.5 35.3125zM235.562 690.949 +l0.0078125 0.00683594c-1.51855 -0.0332031 -3.2998 -0.173828 -5 -0.625c-22.1465 4.08887 -45.5977 -18.9062 -24.375 -32.8115c18.9502 -19.1104 27.5801 -45.3809 38.4307 -70.3203c30.5361 17.3418 44.8262 62.6709 16.875 88.4375 +c-8.66992 6.55078 -15.3086 15.5469 -25.9385 15.3125z" /> + <glyph glyph-name="uniF122" unicode="" horiz-adv-x="790" +d="M314.535 469.99l24.4502 107.302l-61.4385 -0.930664l-24.4502 -107.302c-7.2832 -31.9619 -12.6875 -61.0518 -16.2119 -87.2676c-3.4375 -25.835 -6.26074 -51.6611 -8.4707 -77.4775l35.6348 0.539062c9.58105 25.9268 18.5488 51.8457 26.9023 77.7578 +c8.43945 26.291 16.3008 55.418 23.584 87.3789zM266.327 212.748c2.34082 10.2734 0.692383 19.1582 -4.94629 26.6562s-14.8066 11.1504 -27.5039 10.959c-12.6963 -0.193359 -23.5986 -4.14941 -32.7051 -11.8711c-9.10645 -7.7207 -14.8301 -16.7188 -17.1709 -26.9922 +c-2.3418 -10.2734 -0.693359 -19.1582 4.94629 -26.6572c5.6377 -7.49805 14.8057 -11.1514 27.5029 -10.958c12.6973 0.191406 23.5986 4.14941 32.7061 11.8701c9.10645 7.72168 14.8301 16.7197 17.1709 26.9932zM224.193 800.319 +c0.767578 0.0283203 2.00781 0.0302734 2.77148 0.000976562c-1.51855 0.0507812 8.41309 -1.04297 6.91895 -0.745117c-1.49414 0.299805 8.35254 -2.52441 6.91895 -1.9834c-1.43359 0.539062 7.79883 -3.74609 6.45801 -2.97754 +c-1.12207 0.642578 3.87598 -2.49023 5.07422 -3.22559c0.232422 -0.142578 1.12012 -0.90332 0.921875 -0.743164c167.294 -126.589 334.565 -253.212 501.861 -379.794c0.138672 -0.104492 0.322266 -0.142578 0.460938 -0.248047 +c0.138672 -0.200195 5.02051 -4.55078 4.15234 -3.7207c-0.950195 0.90625 4.98535 -5.49512 4.15137 -4.46484c-0.834961 1.0293 4.16406 -6.09766 3.45898 -4.96191s3.56348 -6.68066 2.99805 -5.45801c-0.564453 1.22461 2.72168 -7.24414 2.30664 -5.95312 +s1.87402 -7.29102 1.61426 -5.95312c-0.258789 1.33789 0.791016 -7.8125 0.692383 -6.44922c-0.0996094 1.36133 0.163086 -7.56641 0.229492 -6.20312c0.0644531 1.36523 -0.915039 -7.5459 -0.691406 -6.20117c0.224609 1.3457 -1.7666 -7.50391 -1.38379 -6.20117 +c0.381836 1.30273 -2.83887 -7.19336 -2.30664 -5.95312c0.533203 1.23828 -3.44336 -6.61426 -2.76758 -5.45898c0.675781 1.15723 -4.2666 -6.2627 -3.45996 -5.20898c0.807617 1.05469 -4.8457 -5.64844 -3.9209 -4.71289 +c0.925781 0.935547 -5.6416 -4.76953 -4.6123 -3.96875s-5.95898 -3.87695 -4.84375 -3.22461c-0.0625 -0.0683594 -0.166016 -0.178711 -0.230469 -0.246094c-222.72 -130.073 -445.434 -260.146 -668.152 -390.213c1.25488 0.729492 -7.33496 -3.25781 -5.99609 -2.72852 +s-7.62207 -2.29883 -6.22754 -1.9834c1.39551 0.31543 -8.11133 -1.09473 -6.68848 -0.993164c1.42969 0.123047 -7.87891 0.12207 -6.45703 0.00390625c1.42188 -0.123047 -8.08008 1.33203 -6.68848 0.990234c1.39062 -0.337891 -7.55859 2.78125 -6.22754 2.23242 +c1.33203 -0.547852 -7.24121 3.72461 -5.99609 2.97754c1.24512 -0.748047 -6.66797 4.65234 -5.53516 3.72168c1.13281 -0.931641 -5.84082 5.80859 -4.84375 4.71289c0.99707 -1.09668 -5.22363 6.69531 -4.38184 5.45703s-4.12793 7.30859 -3.45898 5.9541 +c0.667969 -1.35449 -3.24902 8.1416 -2.76758 6.69824c0.480469 -1.44531 -1.89844 8.20117 -1.61523 6.69727c0.28418 -1.50391 -1.00391 8.72461 -0.922852 7.19336c0.0820312 -1.53125 0.124023 8.47461 0 6.94531c-0.123047 -1.52734 1.47949 8.43945 1.15332 6.94727 +l78.8779 368.381l85.7959 402.115c-0.0244141 -0.117188 0.22168 0.489258 0.230469 0.496094c0.113281 0.113281 2.07129 7.52539 1.61426 6.20117c-0.496094 -1.43555 3.44922 7.7959 2.76758 6.4502c-0.681641 -1.34473 4.3125 7.18066 3.45996 5.95312 +c-0.853516 -1.22559 5.38867 6.54102 4.38184 5.45801c-1.00781 -1.08398 6.21484 5.63086 5.07422 4.71289c-1.1416 -0.916992 6.78613 4.4541 5.53516 3.72168c-1.25098 -0.733398 7.33105 3.50977 5.99609 2.97656c-1.13965 -0.455078 4.26367 1.34082 5.30469 1.7373 +c0.178711 0.0664062 1.12695 0.296875 0.922852 0.24707c0.774414 -0.0361328 9.8623 1.07324 8.07227 0.992188z" /> + <glyph glyph-name="uniF123" unicode="" horiz-adv-x="696" +d="M15.0293 800l0.00195312 0.00488281h196.3l136.75 -230.95l136.75 230.95h196.189c0.160156 -2.00391 -0.15918 -4.0166 -1.20996 -5.8125l-232.479 -392.71l228.84 -386.46c1.79395 -3.07812 1.7627 -6.88281 0 -9.97949s-4.99121 -5.01562 -8.55371 -5.04492h-175.46 +c-3.52148 0.0234375 -6.77148 1.89844 -8.55371 4.93555l-135.54 228.87l-135.54 -228.87c-1.7832 -3.03711 -5.03223 -4.91211 -8.55371 -4.93555h-175.351c-3.5625 0.0302734 -6.79102 1.9502 -8.55371 5.04004c-1.7627 3.09668 -1.79395 6.90137 0 9.97949l228.87 386.46 +l-232.59 392.71c-1.05469 1.78418 -1.46484 3.80664 -1.31641 5.8125z" /> + <glyph glyph-name="uniF124" unicode="" horiz-adv-x="692" +d="M676.36 712.495c0 -48.2979 -147.599 -87.4961 -329.46 -87.4961c-181.862 0 -329.46 39.1982 -329.46 87.4961s147.598 87.4961 329.46 87.4961c181.861 0 329.46 -39.1982 329.46 -87.4961zM17.6924 646.8c0 0 3.1709 -22.0596 71.5371 -45.2334 +c18.6221 -6.3125 54.8105 -14.4434 82.8564 -19.374c44.6699 -7.85449 100.77 -12.8145 170.87 -12.8535c36.8506 -0.0205078 70.6592 0.87207 102.819 3.78223c45.2578 4.0957 52.957 5.63184 88.8818 11.5156c34.3486 5.625 67.335 15.3691 91.5117 24.9688 +c41.749 16.5762 50.7432 37.1953 50.7432 37.1953v-173.931s-30.4639 -39.4414 -113.811 -55.3037c-29.2549 -5.56738 -40.8555 -10.8477 -94.1748 -16.1768c-46.3223 -4.63086 -107.311 -6.8457 -126.43 -6.85352c-19.126 -0.0078125 -67.1426 -0.175781 -145.41 11.7852 +c-47.4307 7.25 -93.2539 17.0107 -116.16 26.1201c-46.0312 18.3203 -63.2285 40.4297 -63.2285 40.4297zM16.7891 417.59c0 0 3.1709 -22.0596 71.5371 -45.2334c18.6221 -6.3125 54.8096 -14.4434 82.8555 -19.374c44.6699 -7.85352 100.771 -12.8145 170.87 -12.8535 +c36.8516 -0.0205078 70.6602 0.87207 102.82 3.78223c45.2578 4.0957 52.957 5.63184 88.8818 11.5156c34.3477 5.625 67.335 15.3691 91.5107 24.9688c41.749 16.5762 50.7432 37.1943 50.7432 37.1943v-173.93s-30.4629 -39.4414 -113.81 -55.3037 +c-29.2549 -5.56738 -40.8564 -10.8486 -94.1758 -16.1768c-46.3213 -4.63086 -107.31 -6.8457 -126.43 -6.85352c-19.126 -0.0078125 -67.1416 -0.175781 -145.41 11.7852c-47.4297 7.24023 -93.2568 17 -116.16 26.1104 +c-46.0293 18.3193 -63.2275 40.4297 -63.2275 40.4297zM15 182.26c0 0 3.1709 -22.0596 71.5371 -45.2334c18.6221 -6.3125 54.8096 -14.4434 82.8555 -19.374c44.6699 -7.85352 100.771 -12.8145 170.87 -12.8535c36.8516 -0.0205078 70.6602 0.87207 102.82 3.78223 +c45.2578 4.0957 52.957 5.63184 88.8818 11.5146c34.3477 5.62598 67.335 15.3701 91.5107 24.9697c41.749 16.5762 50.7432 37.1943 50.7432 37.1943v-173.93s-30.4629 -39.4424 -113.81 -55.3037c-29.2549 -5.56738 -40.8564 -10.8486 -94.1748 -16.1768 +c-46.3223 -4.63086 -107.311 -6.8457 -126.431 -6.85352c-19.126 -0.0078125 -67.1416 -0.176758 -145.41 11.7852c-47.4199 7.25977 -93.2451 17.0098 -116.149 26.1299c-46.0303 18.3203 -63.2285 40.4307 -63.2285 40.4307z" /> + <glyph glyph-name="uniF125" unicode="" horiz-adv-x="676" +d="M337.943 743.904c165.129 0 266.686 -65.2188 266.686 -107.605c0 -180.866 0.175781 -361.731 0.175781 -542.598c0 -42.3672 -101.708 -107.605 -266.854 -107.605s-266.854 65.2383 -266.854 107.605v542.598c0 42.3672 101.699 107.605 266.846 107.605z +M337.959 800.002c-160.346 0 -322.959 -56.3242 -322.959 -163.703v-542.598c0 -107.379 162.608 -163.703 322.951 -163.703s322.951 56.3242 322.951 163.703c0 180.866 -0.175781 361.731 -0.175781 542.598c0 107.359 -162.418 163.703 -322.768 163.703z +M646.687 636.299c0 100.16 -153.612 154.995 -308.657 154.995c-155.024 0 -308.657 -54.835 -308.657 -154.995s153.623 -154.995 308.657 -154.995s308.657 54.8359 308.657 154.995zM598.552 636.299c0 -44.3916 -101.357 -106.86 -260.522 -106.86 +c-159.146 0 -260.522 62.4697 -260.522 106.86s101.367 106.86 260.522 106.86c159.154 0 260.522 -62.4697 260.522 -106.86z" /> + <glyph glyph-name="uniF126" unicode="" +d="M15 776.15h1000v-846.15h-1000v846.15zM938.08 6.91016l-0.00976562 615.39h-846.15v-615.39h846.16zM435.02 249.72h264.881v-77.75h-264.881v77.75zM170.21 249.73l-0.0595703 83.6299l159.72 63.4395l-159.72 63.4297l0.0595703 83.6406l264.67 -105.15v-0.219727 +l0.139648 0.0595703v-83.5195l-0.139648 0.0595703v-0.219727z" /> + <glyph glyph-name="uniF127" unicode="" +d="M15 776.15h1000v-846.15h-1000v846.15zM938.08 6.91016l-0.00976562 615.39h-846.15v-615.39h846.16zM459.5 529.88l-28.2607 -111.26h60.3887l27.9639 111.26h66.6357l-28.8555 -111.26h57.4141v-63.959h-73.1807l-22.0146 -87.1631h60.9844v-63.959h-76.751 +l-27.9639 -110.96h-65.7441l27.9639 110.96h-60.9844l-27.9639 -110.96h-65.7441l27.9639 110.96h-61.5781v63.959h77.3457l22.0137 87.1631h-65.1484v63.959h81.5107l27.9639 111.26h66.041zM475.862 354.66h-60.9844l-22.0137 -87.1631h60.9834l22.0146 87.1631z +M663.48 176.76h79.4277v-84.1875h-79.4277v84.1875zM663.48 536.72h79.4277v-194.85l-9.81738 -106.2h-59.1982l-10.4121 106.2v194.85z" /> + <glyph glyph-name="uniF128" unicode="" horiz-adv-x="501" +d="M250.438 123.183l-141.958 -123.161h-35.4316l167.064 572.979h20.292l167.064 -572.979h-35.1045zM398.954 22.2949l-53.4561 183.345l-78.9375 -68.4795zM331.383 254.065l-24.2119 83.0225l-39.9072 -31.8965zM289.553 397.519l-12.5078 42.9043l-12.7461 -14.416z +M250.264 532.274l-19.8428 -68.0566l19.7471 -22.2842l19.8799 22.4746zM223.425 440.237l-12.4082 -42.5596l25.043 28.3076zM250.189 410.059l-47.3369 -53.5088l47.4639 -37.8467l47.3262 37.8311zM193.352 337.093l-24.3027 -83.3389l64.3369 51.416zM250.332 291.652 +l-84.2266 -67.3223l84.332 -73.1719l84.333 73.167zM155.098 205.898l-53.6514 -184l132.864 115.272zM345.481 564.741c0 -24.0957 -9.09375 -46.0264 -23.8896 -62.8301l-7.45117 25.5762c6.45703 10.9385 10.2041 23.6738 10.2041 37.2539 +c0 40.8486 -33.2334 74.0391 -74.0918 74.0391c-40.8428 0 -74.0332 -33.1855 -74.0332 -74.0391c0 -13.6328 3.69922 -26.2627 10.1455 -37.2539l-7.45117 -25.5762c-14.7959 16.8037 -23.832 38.7344 -23.832 62.8301c0 52.4795 42.6973 95.1768 95.1709 95.1768 +c52.4785 -0.00585938 95.2285 -42.7031 95.2285 -95.1768zM415.499 564.741c0 -56.6953 -28.7412 -106.849 -72.3896 -136.6l-6.24609 21.5068c34.8818 26.3164 57.499 68.1152 57.499 115.093c0 79.4238 -64.6221 144.057 -144.109 144.057 +c-79.4238 0 -144.104 -64.6279 -144.104 -144.057c0 -46.9775 22.6113 -88.7764 57.5459 -115.087l-6.28809 -21.5078c-43.6484 29.751 -72.3896 79.8994 -72.3896 136.601c0 91.1016 74.1338 165.193 165.24 165.193c91.1074 0 165.241 -74.0967 165.241 -165.199z +M345.481 564.741c0 -24.0957 -9.09375 -46.0264 -23.8896 -62.8301l-7.45117 25.5762c6.45703 10.9385 10.2041 23.6738 10.2041 37.2539c0 40.8486 -33.2334 74.0391 -74.0918 74.0391c-40.8428 0 -74.0332 -33.1855 -74.0332 -74.0391 +c0 -13.6328 3.69922 -26.2627 10.1455 -37.2539l-7.45117 -25.5762c-14.7959 16.8037 -23.832 38.7344 -23.832 62.8301c0 52.4795 42.6973 95.1768 95.1709 95.1768c52.4785 -0.00585938 95.2285 -42.7031 95.2285 -95.1768zM485.517 564.741 +c0 -88.7236 -49.4141 -166.134 -122.115 -206.199l-6.07715 20.873c63.9404 37.1016 107.061 106.22 107.061 185.321c-0.00585938 118.058 -96.0801 214.126 -214.127 214.126c-118.046 0 -214.121 -96.0684 -214.121 -214.121 +c0 -79.1064 43.1152 -148.225 107.061 -185.315l-6.07617 -20.873c-72.7129 40.0498 -122.121 117.465 -122.121 206.188c0 129.73 105.528 235.259 235.258 235.259c129.73 0 235.259 -105.528 235.259 -235.259zM345.481 564.741 +c0 -24.0957 -9.09375 -46.0264 -23.8896 -62.8301l-7.45117 25.5762c6.45703 10.9385 10.2041 23.6738 10.2041 37.2539c0 40.8486 -33.2334 74.0391 -74.0918 74.0391c-40.8428 0 -74.0332 -33.1855 -74.0332 -74.0391c0 -13.6328 3.69922 -26.2627 10.1455 -37.2539 +l-7.45117 -25.5762c-14.7959 16.8037 -23.832 38.7344 -23.832 62.8301c0 52.4795 42.6973 95.1768 95.1709 95.1768c52.4785 -0.00585938 95.2285 -42.7031 95.2285 -95.1768zM415.499 564.741c0 -56.6953 -28.7412 -106.849 -72.3896 -136.6l-6.24609 21.5068 +c34.8818 26.3164 57.499 68.1152 57.499 115.093c0 79.4238 -64.6221 144.057 -144.109 144.057c-79.4238 0 -144.104 -64.6279 -144.104 -144.057c0 -46.9775 22.6113 -88.7764 57.5459 -115.087l-6.28809 -21.5078c-43.6484 29.751 -72.3896 79.8994 -72.3896 136.601 +c0 91.1016 74.1338 165.193 165.24 165.193c91.1074 0 165.241 -74.0967 165.241 -165.199z" /> + <glyph glyph-name="uniF129" unicode="" horiz-adv-x="711" +d="M288.553 598.408l-0.000976562 -0.00292969c-19.7295 -138.386 15.4766 -233.061 31.7178 -362.195c9.24609 -73.5449 -9.88477 -158.458 -20.1924 -235.834c-158.411 7.8418 -285.077 183.696 -285.077 399.617c0 220.919 132.564 400.008 296.087 400.008 +c3.40137 0 6.76855 -0.18457 10.1475 -0.344727c-11.5947 -51.8408 -27.5244 -149.617 -32.6816 -201.248zM410.131 799.656l0.00390625 0.00585938c158.669 -7.21777 285.775 -183.329 285.775 -399.656c0 -220.919 -132.564 -400.008 -295.911 -400.008 +c-3.69629 0 -7.36133 0.200195 -11.0186 0.375977c8.83887 76.666 27.3545 161.673 17.9893 235.698c-16.2803 128.831 -49.7988 224.398 -30.1328 362.335c5.14941 51.6309 21.7109 149.407 33.2939 201.249z" /> + <glyph glyph-name="uniF12A" unicode="" horiz-adv-x="668" +d="M652.667 800l-2.39941 -204.644c-43.7207 -70.3242 -460.097 -100.564 -633.681 -116.036v204.644c180.48 19.6924 589.16 61.5361 636.08 116.036zM652.388 524.152l-2.44043 -204.641c-43.6797 -70.3193 -460.052 -100.56 -633.64 -116.04v204.645 +c180.479 19.6914 589.12 61.5361 636.08 116.036zM652.987 250.68l-2.44043 -204.644c-43.6797 -70.3203 -460.056 -100.561 -633.64 -116.04v204.644c180.48 19.6807 589.16 61.5205 636.08 116.04zM557.987 571.36l0.0263672 0.00292969 +c19.0518 0.251953 45.7285 -5.3125 78.2158 -25.9248c5.28516 -3.35254 8.86035 -7.17285 11.0137 -10.1924c2.15332 -3.02051 3.25293 -6.09375 3.25293 -6.09375l0.500977 -1.44043l-0.125 -1.55078l-3.12891 -185.908l-0.25 -13.5166l-14.7676 3.54492 +c-207.52 50 -390.256 135.408 -616.6 146.24l-1.12598 20.832l515.08 68.3564c1.57129 0.766602 2.27441 1.32129 5.50586 2.32617c5.2793 1.6416 12.875 3.19824 22.4014 3.32422zM558.39 550.424c-6.80859 -0.0878906 -11.7871 -1.13574 -14.8984 -2.10254 +c-3.11133 -0.967773 -3.75488 -1.44043 -3.75488 -1.44043l-2.12695 -1.33008l-2.62793 -0.332031l-425.24 -56.5039c185.292 -24.8281 343.84 -91.4678 514.6 -134.268l2.87988 169.72c-0.735352 1.03125 -2.16699 2.56836 -4.75488 4.20996 +c-29.209 18.5312 -50.4727 22.2266 -64.0762 22.0469zM556.747 296.92l-0.0322266 -0.0195312c19.0596 0.255859 45.8096 -5.48242 78.2158 -26.3682c10.5586 -6.80566 14.1416 -16.2861 14.1416 -16.2861l0.500977 -1.55176v-1.55078l-3.25391 -188.232l-0.25 -13.627 +l-14.7676 3.65625c-206.96 50.6797 -389.216 137.16 -614.84 148.12l-1.12695 20.8398l513.881 69.4805c1.59668 0.780273 2.18555 1.24609 5.25586 2.21582c5.2832 1.66797 12.7451 3.19531 22.2754 3.32324zM557.09 275.85l-0.0214844 -0.00292969 +c-6.75 -0.0908203 -11.5596 -1.13184 -14.6416 -2.10449c-3.08301 -0.973633 -3.62988 -1.44043 -3.62988 -1.44043l-2.25195 -1.33008l-2.75391 -0.332031l-424.479 -57.2793c184.943 -25.0801 343.12 -92.8008 513.479 -136.16l3.00391 171.728 +c-0.0458984 0.264648 -0.150391 1.60449 -4.88086 4.65332c-29.1113 18.7627 -50.3252 22.4502 -63.8242 22.2686z" /> + <glyph glyph-name="uniF12B" unicode="" horiz-adv-x="676" +d="M337.84 800v-0.000976562c84.8604 0 161.97 -15.4814 220.23 -42.2988c29.1299 -13.4092 53.6797 -29.6943 72.04 -49.668c15.5098 -16.873 24.7598 -37.6035 27.8398 -59.7637c1.49902 -3.14453 2.72168 -8.52539 2.72949 -12.0098v-542.52 +c0 -26.9697 -12.1865 -51.8018 -30.5645 -71.7725c-18.377 -19.9717 -42.8975 -36.2607 -72.0449 -49.668c-58.3008 -26.8135 -135.367 -42.2988 -220.23 -42.2988c-84.8594 0 -161.93 15.4805 -220.229 42.2998c-29.1484 13.4082 -53.667 29.6973 -72.0449 49.668 +c-18.3789 19.9717 -30.5654 44.8037 -30.5654 71.7725v542.52c0 26.9707 12.1865 51.7998 30.5654 71.7734c18.377 19.9707 42.8955 36.2598 72.0449 49.668c58.2998 26.8135 135.37 42.2988 220.229 42.2988zM70.9404 556.569l-0.00195312 0.00976562v-462.84 +c0 -10.4707 4.3418 -21.3604 15.8271 -33.8408c11.4873 -12.4795 30.0781 -25.4199 54.3086 -36.5693c48.46 -22.292 118.881 -37.1143 196.76 -37.1143c77.8799 0 148.296 14.8223 196.76 37.1143c24.2324 11.1455 42.8203 24.085 54.3076 36.5674 +c11.4863 12.4824 15.8271 23.3721 15.8271 33.8398v462.56c-15.2969 -13.1367 -34.2002 -24.6328 -55.3975 -34.3848c-57.2402 -26.335 -133.956 -40.6621 -211.5 -40.6621c-77.54 0 -153.98 14.3281 -211.22 40.6621c-21.3311 9.81348 -40.2744 21.418 -55.6709 34.6582z +M321.188 441.969l-0.00585938 0.0078125c56.9521 0 100.279 -10.3682 130.45 -31.1094c30.5479 -20.7432 45.8467 -53.0273 45.8477 -97.1523c0 -23.0059 -3.9834 -42.8984 -12.2803 -59.4922c-7.91992 -16.2168 -19.7422 -29.5557 -35.2041 -40.1162 +c-15.4629 -10.1826 -34.2393 -17.748 -56.4902 -22.6504c-22.252 -4.90332 -47.75 -7.36816 -76.4121 -7.36816h-35.4766v-138.09h-71.499v386.42c16.5938 3.77051 34.8652 6.23633 54.8525 7.36816c20.3652 1.50781 39.2461 2.18262 56.2178 2.18262zM326.096 380.302 +c-18.1045 0.00195312 -32.793 -0.503906 -44.4844 -1.63477v-133.45h34.3848c34.3203 0 60.6611 4.7627 79.1416 14.1914c18.4795 9.80566 27.835 28.0762 27.8359 54.8525c0 12.8223 -2.46582 23.5283 -7.36816 32.2021c-4.90332 8.67285 -11.793 15.291 -20.4668 20.1943 +c-8.6748 4.90234 -19.043 8.4834 -31.1104 10.3701c-11.6924 2.26172 -24.3564 3.27441 -37.9326 3.27441z" /> + <glyph glyph-name="uniF12C" unicode="" horiz-adv-x="513" +d="M374.643 799.98l0.000976562 0.00390625c2.9502 0.0898438 6.31055 -0.128906 10.21 -0.666992c31.2207 -4.30469 17.6904 -69.1807 41.9805 -95.626c7.37988 25.0615 11.8594 56.8662 29.6895 69.9355c17.8408 13.0674 58.4707 13.3516 32.6201 -40.3125 +c-25.8291 -53.6611 7.50781 -82.709 -0.333984 -124.99c-7.8418 -42.2803 -32.1191 -34.5781 -42.5742 -61.793c-10.4551 -27.2139 6.13379 -89.1504 -13.5459 -116.979c-18.2061 -25.7432 -22.5596 -64.248 -13.0137 -96.8945 +c0.0283203 -0.0634766 0.0380859 -0.135742 0.0664062 -0.200195c36.749 -83.9092 61.2451 -177.677 60.9258 -277c-0.306641 -112.077 -29.5117 -124.681 -65.7969 -125.449c-36.2803 -0.770508 -60.9102 114.403 -138.4 116.71 +c-77.3291 2.2998 -138.994 -100.101 -187.579 -100.101c-27.5215 0 -33.9844 16.5977 -31.8311 58.7246c0.697266 14.0137 1.76855 28.4053 3.06934 43.042c-3.79883 -8.21484 -7.80859 -13.3467 -11.8115 -13.3467c-13.6836 0 -37.2236 7.22852 -32.7646 29.8291 +c4.45898 22.6016 41.499 39.4795 42.5752 81.1455s-16.248 45.9736 -13.4805 91.0215c2.63867 42.9404 52.6631 56.7803 71.0723 151.95c13.1201 115.78 17.9004 288.096 3.59961 318.04c47.3008 -26.4395 160.71 -127.96 247.98 -273.4 +c19.2295 -18.9707 56.0293 2.12012 57.7227 31.8984c1.8457 32.4414 -2.95898 73.3359 -24.0225 74.873c-21.0645 1.53809 -36.125 22.6191 -57.1895 24.1572c-21.0635 1.53711 -43.6123 -19.5742 -53.4521 8.4082s26.3926 39.8506 53.4521 44.3096 +c-24.1377 24.1387 -38.2383 50.9141 -48.8467 78.7432c-10.6094 27.8281 -18.4629 53.3457 11.2109 64.2617c29.6738 10.917 27.2139 -45.2588 61.1934 -70.9346c-9.99414 37.8223 -13.7148 53.5537 -12.9463 75.54c0.672852 19.2373 -0.405273 34.4766 20.2197 35.1006z +M245.994 482.615c-3.30859 -0.0976562 -6.63281 -0.352539 -9.94434 -0.803711c-29.6592 -4.04199 -69.165 -29.1045 -72.8037 -61.1934c-1.50586 -13.2715 1.37012 -26.1709 7.40723 -37.2363c-0.0253906 -0.0166016 -0.0410156 -0.0498047 -0.0664062 -0.0654297 +c4.20703 -8.04785 9.92871 -14.6719 16.6836 -19.8193c0.0390625 -0.0302734 0.09375 -0.0371094 0.132812 -0.0654297c0.712891 -0.568359 1.46582 -1.06445 2.20215 -1.60156c0.0517578 -0.0361328 0.0830078 -0.0976562 0.133789 -0.133789 +c0.155273 -0.113281 0.310547 -0.22168 0.466797 -0.333984c9.60742 -6.8457 21.1172 -11.1104 33.5664 -11.6104c2.00586 -0.0791016 4.05371 -0.116211 6.07227 -0.0664062h0.333984c6.73828 -0.0351562 13.5352 0.779297 20.2197 2.40234 +c7.95801 1.93262 15.5449 5.05273 22.5547 9.14258c0.211914 0.123047 0.458008 0.208008 0.667969 0.333008c13.2627 7.48242 24.4033 18.4297 31.1641 32.5654c0.799805 1.67188 1.4668 3.38379 2.13477 5.07129c0.213867 0.509766 0.398438 1.02051 0.600586 1.53516 +c0.160156 0.430664 0.382812 0.835938 0.53418 1.26758c0.161133 0.433594 0.314453 0.897461 0.466797 1.33496c0.0214844 0.0664062 0.0449219 0.132812 0.0664062 0.200195c1.82617 5.2627 3.05762 10.7725 3.60352 16.4824 +c0.0595703 1.68164 0.0722656 3.39453 0.0664062 5.07227v0.333008c0.0615234 2.26855 0.0517578 4.55273 -0.0664062 6.87305c-0.279297 2.61133 -0.707031 5.1416 -1.26758 7.54102c-0.00488281 0.0195312 0.00390625 0.0439453 0 0.0664062 +c-0.834961 4.26855 -2.16309 8.43652 -4.07129 12.4111c-0.152344 -0.03125 -0.313477 -0.0302734 -0.466797 -0.0654297c-11.0166 21.3828 -35.2275 31.0811 -60.3916 30.3633zM329.674 455.653l-0.00488281 -0.00683594 +c-1.93945 -0.124023 -3.8584 -0.326172 -5.80566 -0.533203c2.7207 -6.50781 4.52148 -13.6562 5.27148 -21.4219c2.98535 -47.7539 -30.9502 -87.9199 -76.875 -98.6289c-33.5596 -7.82812 -74.5283 2.53418 -93.0234 33.833 +c-0.960938 1.62598 -1.81348 3.28613 -2.66895 4.93848c-5.7998 -3.95312 -11.5488 -7.88574 -17.083 -11.6113c-11.9902 -58.7295 -86.8408 -386.689 -48.71 -390.84c38.1299 -4.14941 92.3799 101.46 181.239 100.69c89.0205 -0.760742 124.13 -118.41 145.811 -117.641 +c21.6797 0.770508 35.9297 -7.67969 38.2402 124.86c2.30957 132.53 -78.5742 301.792 -126.391 376.36zM88.4287 268.396c-7.62305 0.205078 -25.3584 -29.7939 -25.3584 -48.5801c0 -15.0879 7.87402 -28.9551 13.4805 -45.3105 +c4.59961 27.7119 9.68848 55.0791 15.0146 81.3457c0.87207 8.81055 -0.526367 12.4756 -3.13672 12.5449z" /> + <glyph glyph-name="uniF12D" unicode="" horiz-adv-x="464" +d="M381.761 793.792c37.335 0 67.7168 -30.3818 67.7168 -67.7266v-728.338c0 -37.3457 -30.3818 -67.7275 -67.7168 -67.7275h-291.682c-37.3457 0 -67.7275 30.3818 -67.7275 67.7275v524.19h-2.875c-2.4668 0 -4.47656 2.00977 -4.47656 4.47656v22.9805 +c0 2.47754 2.00977 4.48633 4.47656 4.48633h2.875v36.6992h-2.875c-2.4668 0 -4.47656 2.00977 -4.47656 4.48633v22.9805c0 2.46777 2.00977 4.47656 4.47656 4.47656h2.875v36.7588h-2.875c-2.4668 0 -4.47656 2.00977 -4.47656 4.47656v34.4209 +c0 2.47754 2.00977 4.48633 4.47656 4.48633h2.875v23.4189c0 37.3447 30.3818 67.7266 67.7275 67.7266h203.033v1.73145c0 2.4668 2.01953 4.47656 4.48633 4.47656h68.7422c2.4668 0 4.43652 -2.00977 4.43652 -4.47656v-1.73145h10.9834zM201.967 727.08 +c-4.68555 0 -8.49609 -3.31348 -8.49609 -7.3916c0 -4.0791 3.81055 -7.3916 8.49609 -7.3916h62.1562c4.63574 0 8.49512 3.3125 8.49512 7.3916c0 4.07812 -3.81934 7.3916 -8.49512 7.3916h-62.1562zM169.645 726.841c-3.93945 0 -7.15234 -3.20312 -7.15234 -7.15234 +c0 -3.9502 3.20312 -7.15332 7.15234 -7.15332s7.15332 3.20312 7.15332 7.15332c0 3.94922 -3.21387 7.15234 -7.15332 7.15234zM233.064 -30.9033c23.1592 0 41.9512 18.792 41.9512 41.9512c0 23.1699 -18.792 41.9521 -41.9512 41.9521 +c-23.1689 0 -41.9512 -18.7822 -41.9512 -41.9521c0 -23.1592 18.7822 -41.9512 41.9512 -41.9512zM423.741 87.3311v572.031h-381.354v-572.031h381.354zM242.107 27.8008c4.0293 0 7.32227 -3.27246 7.31152 -7.25195v-18.7129 +c0 -4.00879 -3.28223 -7.25195 -7.31152 -7.25195h-18.4443c-4.01855 0 -7.27148 3.24316 -7.27148 7.25195v18.7129c0 3.98926 3.25293 7.25195 7.27148 7.25195h18.4443z" /> + <glyph glyph-name="uniF12E" unicode="" horiz-adv-x="830" +d="M79.0615 798.125v0.00390625h82.8184h591.24c34 0 61.8799 -28.0625 61.8799 -59.0625v-0.9375c0 -2 -0.94043 -5.1875 -0.94043 -7.1875l-65.9395 -605c1.01953 -23.9893 -12.0703 -46.8193 -34.0605 -57.8193l-268.119 -132.181 +c-9 -3.98926 -17.8809 -5.93945 -26.8809 -5.93945s-18.1797 1.95996 -27.1797 5.93945l-268.76 132.181c-11.9951 6 -22.1201 14.8896 -28.1201 26.8799c-5 7.00977 -8.06152 15.0596 -9.06152 24.0596l-67.8135 610.001c0 2 -3.125 4.875 -3.125 6.875v0.9375 +c0 33 30.0615 61.25 64.0615 61.25zM591.252 600.009v-153.439l14.6904 -112.181h74.3691l14.6904 112.181v153.439h-103.75zM273.122 593.759l-27.8105 -103.13h-97.1895v-56.8701h81.5703l-20.3105 -73.4395h-94.3799v-57.8105h80.3096l-27.5 -102.5h64.0703l27.5 102.5 +h76.2402l-27.8105 -102.5h63.75l27.5 102.5h96.8809v57.8105h-81.8809l20 73.4395h95v56.8701h-79.6797l27.8105 103.13h-63.75l-27.8203 -103.13h-75.9297l27.5 103.13h-64.0703zM293.752 433.759h75.9404l-20 -73.4395h-75.9404zM591.252 295.319v-95.3105h103.75v95.3105 +h-103.75z" /> + <glyph glyph-name="uniF12F" unicode="" horiz-adv-x="850" +d="M611.244 125.49c0.0888672 -2.34375 0.146484 -4.69629 0.129883 -7.05664c-0.0214844 -7.07422 -0.751953 -14.2109 -1.95801 -21.1719c-0.339844 -1.73926 -0.644531 -3.46973 -1.06836 -5.18262c-0.392578 -1.70312 -0.852539 -3.3584 -1.43262 -5.36719 +c-0.939453 -2.84473 -2.10742 -5.96777 -3.30371 -8.73047c-9.96777 -22.2197 -24.3096 -40.2959 -41.0527 -55.3379c-3.11914 -2.69531 -6.34961 -5.22363 -9.62793 -7.66992c-9.86719 -7.73633 -21.3418 -15.1758 -34.8076 -22.0107 +c-74.3301 -37.7451 -168.86 -21.3906 -168.86 -21.3906l0.0078125 0.0380859c-7.83789 1.07227 -15.7393 2.63379 -23.6758 4.80273l0.0322266 -0.0537109s-7.2207 1.53906 -18.0518 6.08008c-10.2412 4.19629 -20.5049 9.45117 -29.9199 16.584 +c-25.2773 17.8369 -47.8994 40.7646 -53.0469 73.5176c-2.90527 18.4766 0.641602 37.3691 4.28125 50.332c2.28516 9.25586 5.91992 18.123 10.6377 26.0088c1.85156 3.07617 3.85938 6.00293 5.92871 8.8291c2.16699 2.75488 4.37988 5.42578 6.70117 7.91797 +c4.58496 5.04492 9.55273 9.47168 14.6387 13.4404c5.08887 3.97363 10.3184 7.47363 15.6211 10.5898c5.35059 3.0498 10.4863 6.07812 15.8545 8.58496c10.6387 5.12012 21.1143 9.61426 31.8828 13.2832c10.1934 3.39844 20.666 5.84961 31.7578 7.2002 +c0.241211 0.0390625 0.46875 0.0898438 0.713867 0.124023c29.3457 4.6543 62.7373 5.03711 76.1719 5.03711c1.23535 0 2.3584 -0.0488281 3.49316 -0.0976562c-5.36328 5.85254 -24.9854 28.9551 -24.9854 53.7012c0 14.2295 3.85156 23.9736 7.72461 30.1836 +c-71.5967 -5.03711 -136.729 33.7461 -154.2 96.8027c-20.3799 73.5107 31.7344 152.127 116.39 175.591c15.085 4.18066 30.1846 6.29297 44.9316 6.58105v0.0712891s29.1689 0.638672 40.9365 1.74902c11.7695 1.10938 60.3887 30.874 64.9941 34.457 +c4.60547 3.58105 8.69922 2.30273 8.69922 2.30273s19.1904 -15.6074 20.7246 -18.6787c1.53711 -3.06934 -2.55762 -8.95508 -2.55762 -8.95508s-23.2832 -31.9834 -26.6094 -36.0781c-3.32812 -4.09277 -1.28027 -10.0283 -1.28027 -10.0283l-0.00976562 -0.0234375 +c15.2227 -12.8066 27.3555 -28.748 35.1562 -47.2178l0.0205078 0.0361328s13.9062 -28.666 13.9531 -64.6914c0.0478516 -36.4629 -23.0166 -66.1445 -52.9551 -89.1729c-29.9355 -23.0303 -40.9424 -42.4766 -40.9424 -54.7578 +c0 -30.3779 17.1475 -30.9629 50.6611 -58.3184c0.123047 -0.102539 0.227539 -0.19043 0.349609 -0.291992c7.59277 -5.66406 15.0928 -11.708 22.4512 -18.252c4.19727 -3.73535 8.31738 -7.67285 12.2803 -11.8906c2.79883 -2.83398 5.3916 -5.93164 7.87793 -9.17773 +c0.168945 -0.200195 0.276367 -0.335938 0.276367 -0.335938h-0.00976562c1.03516 -1.36035 2.05469 -2.73535 3.05371 -4.14258c6.82812 -9.88867 12.7305 -21.1357 16.6016 -33.8721c2.92188 -9.65918 4.65527 -20.0947 5.2832 -30.7529l0.00292969 0.00878906 +s0.100586 -1.13965 0.134766 -3.14746zM340.292 420.042c20.1396 -62.0635 73.957 -100.217 120.18 -85.2119c46.2266 15 67.3682 77.4775 47.2188 139.55c-20.1396 62.0654 -73.9541 100.219 -120.18 85.2119c-46.2285 -15 -67.3682 -77.4805 -47.2188 -139.55z +M317.978 45.0039c5.23926 -5.3877 11.3008 -10.5449 18.2471 -14.9814c13.8535 -8.97656 30.7188 -15.54 48.6748 -19.6367c8.99512 -1.97168 18.2754 -3.41406 27.6924 -4.28418c9.42188 -0.780273 18.9766 -1.04492 28.5879 -0.932617 +c2.08008 0.00976562 5.05566 0.116211 7.19531 0.208984c2.26367 0.0771484 4.62207 0.230469 6.9873 0.387695c4.16016 0.297852 8.29492 0.761719 12.4082 1.32812c62.9531 9.4043 96.5 62.6289 86.1699 100.51c-9.08789 33.3232 -66.8398 80.7598 -80.9072 91.9219 +c-0.603516 0.474609 -1.21973 0.928711 -1.82129 1.41406c-0.204102 0.152344 -0.390625 0.325195 -0.587891 0.482422c-0.425781 0.328125 -0.68457 0.526367 -0.68457 0.526367h-17.4697c-8.3623 -0.557617 -16.7939 -1.48926 -25.1582 -2.35547 +c-9.8623 -1.16602 -19.666 -2.71484 -29.4062 -4.31348c-4.86719 -0.830078 -9.72461 -1.65137 -14.5332 -2.63574c-4.7959 -1.04492 -9.56543 -2.15039 -14.2656 -3.34277c-8.35742 -2.20605 -16.7842 -5.78809 -24.751 -10.0605 +c-8.0127 -4.21289 -15.4375 -9.59277 -21.9121 -15.6543c-6.46094 -6.0918 -11.8105 -13.0918 -15.8525 -20.2031c-2.03223 -3.55176 -3.73926 -7.1416 -5.13867 -10.6631c-0.717773 -1.75781 -1.28516 -3.53223 -1.82227 -5.27637 +c-0.575195 -1.71094 -1.08789 -3.40723 -1.50293 -5.09375c-1.51074 -6.8125 -2.38184 -13.0176 -2.45117 -19.4023c-0.130859 -3.17676 0.0429688 -6.41602 0.302734 -9.75195l0.0537109 -0.625977l0.0136719 -0.15918 +c0.0410156 -0.306641 -0.0117188 0.0478516 -0.0322266 0.192383l0.0576172 -0.43457l0.241211 -1.8584l0.371094 -2.52637c0.313477 -1.77734 0.65332 -3.58691 1.08008 -5.3291c1.76953 -6.98145 4.05566 -13.6504 7.4248 -19.8789 +c3.43164 -6.16211 7.55957 -12.1309 12.7891 -17.5713zM710.771 666.869l-0.0136719 0.00585938h-571.515c-24.1992 0 -47.0439 -9.51367 -64.3193 -26.791c-17.2764 -17.2783 -26.792 -40.1211 -26.792 -64.3193v-571.516c0 -24.2021 9.51562 -47.0459 26.792 -64.3242 +c17.2773 -17.2783 40.1201 -26.7871 64.3193 -26.7871h571.515c24.2031 0 47.0469 9.50879 64.3242 26.7871c17.2783 17.2764 26.7939 40.1182 26.7939 64.3174v571.516c0 24.1992 -9.50879 47.041 -26.7871 64.3193c-17.2764 17.2764 -40.1182 26.792 -64.3174 26.792z +M710.758 700.007c68.334 0 124.242 -55.9092 124.242 -124.242v-571.516c0 -68.333 -55.9082 -124.242 -124.242 -124.242h-571.515c-68.334 0 -124.243 55.9092 -124.243 124.242v571.516c0 68.333 55.9092 124.242 124.243 124.242h571.515z" /> + <glyph glyph-name="uniF130" unicode="" +d="M15 0l235.3 352.938l-235.3 352.941h176.475l235.288 -352.938l-235.288 -352.938zM250.3 0l235.288 352.938l-235.288 352.941h176.476l470.587 -705.875h-176.475l-147.05 220.587l-147.062 -220.587zM818.925 205.875l-78.4248 117.65h274.5v-117.651zM701.275 382.35 +l-78.4375 117.638l392.162 0.0126953v-117.651z" /> + <glyph glyph-name="uniF131" unicode="" +d="M993.11 663.942c14.0645 0.449219 21.6582 -7.78223 21.873 -22.5693c0.667969 -45.9121 -19.7686 -65.5254 -42.0127 -85.5898c-22.2432 -20.0645 -47.8184 -32.2979 -71.0059 -67.8809c-15.4111 -23.6436 -20.0771 -82.0381 -32.8115 -128.468 +c-11.8613 -43.2314 -23.4639 -95.5928 -35.2422 -128.298c-12.4346 -34.5469 -2.28809 -113.006 34.5488 -123.432c-41.9785 -30.5801 -109.67 -21.5664 -134.545 16.666c-44.6426 -11.751 -50.0713 -65.9697 -86.4561 -87.1523 +c-29.6182 -17.2383 -57.9775 -25.0176 -97.2217 -34.7207c-21.8145 -4.13672 -40.9043 -3.37305 -34.5479 3.47266c20.5264 30.3076 46.0908 55.5205 58.8535 93.5742c-86.0752 12.4131 -171.653 28.6602 -246.005 18.75 +c-57.457 -7.66211 -86.8916 -39.7041 -123.783 -61.9775c-79.2168 -47.8252 -166.358 -35.6475 -173.783 -17.708c-7.05566 17.0488 28.9551 26.7773 35.0693 38.3672c-29.5342 -3.93164 -36.0537 0.297852 -51.041 15.4512c46.5166 54.6592 149.162 19.4951 183.673 55.207 +c32.2656 33.3877 33.0068 56.8848 63.8877 83.5059c39.7861 34.2832 87.8613 62.4453 131.771 76.2139c66.8164 20.9375 141.093 24.3643 214.753 65.9717c98.5488 55.6553 120.42 210.953 228.818 256.415c36.3145 15.2295 77.3887 12.708 111.11 21.0068 +c33.3945 8.21777 28.6426 12.7012 44.0967 13.1943zM988.769 655.436c-2.83105 -0.144531 -3.36133 -1.18262 -4.68848 -1.73633c-0.961914 -0.693359 -1.7959 -1.125 -2.43066 -1.5625c-0.820312 -0.646484 -1.78418 -1.39258 -2.42969 -1.90918 +c-2.89258 -1.87793 -6.36426 -4.06641 -9.375 -5.90332c-1.11133 -1.64551 0.365234 -3.63574 1.04102 -5.03418c0.55957 -1.14062 1.21191 -2.14941 1.73633 -3.29883c0.791016 -1.36816 1.97754 -2.49121 2.95117 -3.64551 +c1.13086 -0.755859 1.64648 -1.1377 2.25684 -1.5625c2.7002 -1.82324 6.28418 -2.23535 9.20117 -2.77734c0.40918 -0.0400391 2.45801 -0.435547 4.6875 -0.695312c2.40137 -0.234375 5.54785 -0.333008 7.98633 -0.521484 +c1.22461 -0.078125 1.89062 0.605469 2.77734 0.695312c0.774414 0.480469 1.47949 1.45996 2.08398 2.08301c0.505859 0.545898 0.249023 0.87207 0.694336 1.38965c0.283203 1.87207 0.514648 3.81445 0.694336 5.55469v1.91016 +c0.131836 3.73242 -0.606445 6.7959 -1.38867 10.0684c-0.228516 0.719727 -0.768555 1.85547 -1.21484 2.43066c-1.17773 1.8457 -3.26855 2.69531 -4.86133 3.81934c-0.77832 0.291016 -1.59473 0.416016 -2.60449 0.521484 +c-1.17773 0.133789 -2.4668 0.173828 -3.64453 0.173828c-1.18164 0 -2.24805 0.150391 -3.47266 0zM956.649 628.527c-0.749023 0.0253906 -2.00586 -0.575195 -3.81836 -2.25781c-10.9453 -11.2109 -32.5996 -36.4492 -40.4512 -59.8945 +c-2.01855 -6.39551 2.09277 -4.63672 3.47266 -0.521484c7.78418 24.0684 32.3662 50.5156 39.9297 58.5068c1.8457 2.14355 2.11719 4.12598 0.867188 4.16699zM959.949 622.971c-0.746094 -0.0791016 -1.91699 -0.857422 -3.47266 -2.77734 +c-9.25879 -12.6406 -27.1143 -31.7578 -31.5967 -56.0762c-1.09473 -6.6123 2.69434 -4.26562 3.47266 0c4.33203 24.9297 25.0557 45.7109 31.4229 54.6865c1.52539 2.38086 1.41699 4.29883 0.173828 4.16699zM963.942 618.109 +c-0.737305 -0.140625 -1.73633 -1.08301 -3.12598 -3.125c-8.16406 -13.3848 -18.9297 -28.6963 -21.3545 -53.2979c-0.533203 -6.67871 2.8877 -4.14746 3.29883 0.173828c2.22461 25.2021 15.7656 42.6006 21.3545 52.083 +c1.32812 2.49805 1.05371 4.40039 -0.172852 4.16602zM968.455 614.291c-0.72168 -0.208008 -1.73828 -1.14258 -2.9502 -3.30078c-6.95117 -14.0469 -13.6445 -24.7529 -13.8887 -49.4775c0.0556641 -6.69434 3.43164 -3.82129 3.47168 0.521484 +c0 25.2969 8.97656 38.1523 13.7148 48.0898c1.09863 2.60645 0.857422 4.50977 -0.347656 4.16699zM883.388 602.311c-21.6758 -0.545898 -34.5146 -10.0869 -38.7148 -28.125c17.8125 -15.4658 55.1152 -2.99121 48.4365 27.7773 +c-3.45996 0.287109 -6.625 0.427734 -9.72168 0.347656zM809.257 192.773c-14.585 -15.4375 -42.958 -37.9307 -48.4355 -62.5c10.6602 -17.0156 52.0898 -26.6992 76.2139 -20.832c-12.3184 11.5879 -26.2764 59.2969 -27.7783 83.332z" /> + <glyph glyph-name="uniF132" unicode="" horiz-adv-x="992" +d="M496.232 800c-90.2344 0 -317.021 -20.1406 -419.741 -92.7832c-102.709 -72.6523 -69.5498 -241.212 46.125 -217.691c130.261 26.4854 157.258 91.5996 88.0703 154.773c0 0 120.153 53.4395 285.546 53.4395zM496.232 800 +c90.2354 0 317.032 -20.1406 419.741 -92.7832c102.71 -72.6416 69.5498 -241.212 -46.125 -217.691c-130.261 26.4854 -157.257 91.5996 -88.0693 154.773c0 0 -120.164 53.4395 -285.547 53.4395zM896.377 207.999c21.1221 -190.012 -241.916 -207.999 -400.145 -207.999 +c-158.238 0 -421.266 17.9873 -400.165 207.999c9.5752 86.2256 53.2266 103.818 122.798 199.342c62.5762 85.917 78.4521 149.208 84.5723 238.632c0 0 23.6602 11.2383 56.3291 11.2383c0 0 -9.60645 -103.221 136.455 -103.221 +c146.052 0 136.445 103.221 136.445 103.221c32.6689 0 56.3291 -11.2383 56.3291 -11.2383c6.13086 -89.4238 22.0068 -152.715 84.5723 -238.632c69.582 -95.5234 113.233 -113.116 122.809 -199.342zM496.232 168.635c85.9492 0 155.627 69.6992 155.627 155.637 +s-69.6777 155.626 -155.627 155.626c-85.9482 0 -155.626 -69.6777 -155.626 -155.626s69.6777 -155.637 155.626 -155.637z" /> + <glyph glyph-name="uniF133" unicode="" horiz-adv-x="772" +d="M230.86 799.088l8.52539 -289.957c-82.3604 -37.3184 -45.4434 -123.455 -45.4434 -123.455s133.463 -266.996 176.071 -324.4c42.5967 -57.4248 110.751 -14.3555 110.751 -14.3555l230.019 -180.87c-70.9785 -45.9434 -164.699 -66.0498 -164.699 -66.0498 +c-190.287 -25.8271 -357.821 229.678 -423.131 327.296c-65.3184 97.6074 -105.081 272.746 -107.926 470.837c-2.83496 198.08 215.833 200.955 215.833 200.955zM256.427 799.088c0 0 17.041 5.7207 48.2676 -11.4902c31.2373 -17.2217 31.2373 -31.5576 31.2373 -31.5576 +l2.84473 -198.11s-8.52539 -11.4912 -19.876 -22.9521c-11.3613 -11.4805 -48.2783 -28.7217 -53.9688 -17.2314c-5.66016 11.4707 -8.50488 281.342 -8.50488 281.342zM499.89 68.0879l63.2354 33.3809s14.1953 2.85547 36.9072 -11.4814 +c22.7207 -14.3857 141.998 -109.128 141.998 -109.128s19.876 -17.2217 14.1963 -37.3184c-5.6709 -20.0967 -19.877 -63.165 -19.877 -63.165z" /> + <glyph glyph-name="uniF134" unicode="" +d="M910.473 547.467c0 50.7686 -0.0390625 101.498 0.0390625 152.267c10.7148 0.0390625 21.4688 0.0390625 32.2217 0.0390625c0.15625 -47.9238 0 -95.8486 0.078125 -143.772c24.0791 6.38965 48.0801 12.9355 72.1592 19.3252 +c0.0390625 -26.7285 0.0390625 -53.457 0 -80.2246c-24.04 -6.50684 -48.1582 -12.8965 -72.1592 -19.4424c0 -65.3408 -0.0390625 -130.721 0 -196.061c24.0791 6.38965 48.0801 12.9355 72.1592 19.3252c0.0390625 -26.7285 0 -53.457 0 -80.1855 +c-24.04 -6.5459 -48.1191 -12.8965 -72.1592 -19.4424c-0.078125 -47.3008 0 -94.6016 -0.0390625 -141.902c-10.7539 0 -21.5459 0 -32.2998 0.0390625c-0.0390625 44.5732 0.0390625 89.1855 0 133.759c-48.0029 -12.8965 -95.9658 -25.793 -143.929 -38.8066 +c-0.0390625 -50.8076 0.0390625 -101.576 -0.0390625 -152.384h-32.4951c-0.078125 47.9238 0.0390625 95.8877 -0.0390625 143.812c-24.001 -6.38965 -47.9238 -12.9355 -71.9258 -19.2861c-0.0380859 26.8838 -0.0380859 53.7686 0 80.6533 +c23.9629 6.54492 47.9639 12.8574 71.9258 19.4033c0 65.1846 0.078125 130.408 0 195.593c-24.001 -6.35059 -47.9238 -12.8965 -71.9258 -19.2861c-0.0380859 26.7676 -0.0380859 53.4961 0 80.2246c23.9629 6.5459 47.9639 12.8574 71.9258 19.4033 +c0.0390625 47.3398 0 94.7188 0.0390625 142.098c10.832 0 21.6631 0 32.5342 -0.0390625c0.0390625 -44.6123 -0.0390625 -89.2637 0 -133.915c48.002 12.8965 95.9648 25.793 143.929 38.8066zM766.583 428.357 +c-0.078125 -65.2236 -0.0390625 -130.447 -0.0390625 -195.672c48.002 12.9365 95.9648 25.8721 143.929 38.8076c0 65.2236 0.0390625 130.408 -0.0390625 195.632c-47.9639 -12.8574 -95.8877 -25.8711 -143.851 -38.7676zM182.413 661.55 +c57.042 27.8975 122.46 35.4951 185.151 28.5596c59.5742 -6.70117 117.784 -33.04 158.617 -77.5361c29.6514 -31.7158 49.0547 -71.6133 61.3281 -112.953c-28.5215 -6.7793 -57.042 -13.5586 -85.6016 -20.2607c-15.0781 48.4697 -43.833 96.0439 -90.627 119.383 +c-52.0156 25.6367 -114.474 23.416 -168.71 6c-60.002 -19.7148 -101.888 -74.0684 -120.278 -132.746c-21.1172 -67.2891 -20.4551 -139.877 -8.37695 -208.802c9.66309 -55.5615 37.0928 -109.642 83.9268 -142.722c51.2744 -37.5986 120.316 -44.1836 180.748 -28.8711 +c46.2881 11.7666 85.1729 45.2363 106.758 87.4717c12.3125 22.8711 20.2998 47.8076 26.4561 72.9775c28.9883 -7.40332 58.0547 -14.5723 87.0039 -22.209c-16.0918 -61.2109 -45.4697 -121.564 -95.7705 -161.812c-51.8984 -42.6641 -120.317 -60.9385 -186.788 -58.834 +c-74.6914 0.740234 -153.941 21.4688 -206.736 77.3018c-52.9502 57.3535 -82.4844 133.643 -91.3291 210.556c-7.3252 72.1982 -3.15625 147.357 24.5859 215.113c26.1436 64.6787 77.0293 118.759 139.643 149.384z" /> + <glyph glyph-name="uniF135" unicode="" horiz-adv-x="1069" +d="M507.943 634.879c125.22 2.75195 253.026 -15.8105 366.96 -68.9766c100.796 -43.4766 207.355 -145.455 171.978 -266.404c-50.0254 -139.314 -206.898 -195.997 -341.373 -223.494c-205.706 -34.6025 -439.674 -16.9541 -608.354 114.053 +c-80.1582 58.5508 -112.605 181.855 -47.21 263.949c106.073 135.25 293.018 173.449 457.999 180.873zM522.359 564.676v-0.0107422c-84.459 -1.4043 -167.098 -13.083 -247.395 -40.7725c-82.998 -30.5479 -196.606 -86.8838 -189.15 -191.287 +c27.3086 -107.673 150.633 -150.9 246.471 -178.119c192.647 -43.4971 413.021 -34.3545 581.552 79.4004c62.8545 38.9346 96.2842 130.708 39.542 189.767c-109.264 115.812 -279.682 139.463 -431.02 141.022zM270.756 230.462l41.4424 209.801h95.835 +c41.4424 -2.58984 62.1631 -23.3115 62.1631 -59.5732c0 -62.1631 -49.2129 -98.4258 -93.2441 -95.8359h-46.623l-10.3613 -54.3926zM340.689 323.705l31.082 0.000976562c23.3115 2.58887 44.0322 10.3604 46.623 54.3926c0 15.541 -12.9512 23.3115 -31.082 23.3115 +h-33.6719zM454.659 284.859l41.4424 209.801h49.2119l-10.3604 -54.3926h46.623c41.4424 -2.58984 56.9824 -23.3115 51.8027 -49.2129l-18.1309 -106.191h-51.8027l18.1309 95.835c2.58984 12.9502 2.58984 20.7207 -15.541 20.7207h-38.8525l-23.3115 -116.558z +M617.834 230.462l41.4424 209.801h95.8359c41.4424 -2.58984 62.1631 -23.3115 62.1631 -59.5732c0 -62.1631 -49.2129 -98.4258 -93.2451 -95.8359h-46.6221l-10.3613 -54.3926zM687.769 323.705l31.0811 0.000976562c23.3115 2.58887 44.0332 10.3604 46.623 54.3926 +c0 15.541 -12.9502 23.3115 -31.0811 23.3115h-33.6729z" /> + <glyph glyph-name="uniF136" unicode="" horiz-adv-x="964" +d="M697.143 800l0.0234375 -0.000976562c71.3994 0.617188 162.64 -18.1318 228.12 -95.9375c14.7295 -17.5029 18.96 -43.2119 18.4395 -74.6826c-0.519531 -31.4795 -6.66992 -69.0996 -18.1299 -110.32c-22.21 -79.9795 -64.3604 -172.979 -123.43 -256.56 +c1.51953 -1.04004 3.79004 -2.25 6.86914 -3.44043c12.3115 -4.73828 40.4346 -8.89648 96.5625 1.875c14.123 2.71289 24.5703 4.78809 35.3115 -2.8125c5.37109 -3.7998 8.38281 -11.376 7.8125 -16.875c-0.569336 -5.49902 -2.9209 -9.64551 -5.625 -13.4375 +c-10.8164 -15.168 -32.2676 -29.4092 -59.6875 -41.25c-24.3242 -10.4971 -59.0645 -15.9336 -90 -16.25c-15.4697 -0.158203 -30.0537 0.868164 -42.1885 4.375c-0.0957031 0.0283203 -0.21582 -0.0283203 -0.3125 0c-5.06738 -44.1797 -16.1309 -126.195 -22.8115 -162.19 +c-5.64941 -30.4688 -15.2871 -54.666 -34.0625 -72.8115c-18.7754 -18.1465 -45.2422 -29.1348 -80.9375 -36.25c-44.1514 -8.79492 -76.4307 0.618164 -97.1885 16.875c-20.7568 16.2578 -30.2568 37.7354 -35.9375 50.9375 +c-3.9248 9.12793 -5.86621 20.8213 -7.8125 36.5625s-3.37207 35.1455 -4.375 56.875c-1.36719 29.6152 -1.85938 63.8125 -1.5625 99.375c-20.8359 -17.4971 -44.3203 -26.249 -65.9385 -29.6885c-29.3037 -4.66113 -55.625 -0.198242 -71.25 3.4375 +c-7.28809 1.69434 -14.7148 4.48242 -21.875 8.125c-7.15918 3.64355 -14.1084 7.62305 -18.75 15.625c-2.32031 4.00098 -3.85742 9.83594 -2.5 15.3125s5.15723 9.92676 9.375 13.125c8.43652 6.39648 19.4072 9.89648 36.25 13.125 +c30.5586 5.85059 41.2656 9.83691 47.8125 14.6875c5.62207 4.16602 11.1377 11.9395 22.8115 24.6885c-0.0273438 0.416016 0.0322266 0.832031 0 1.25c-20.1982 0.461914 -39.377 5.77832 -56.5615 14.375c-6.38184 -6.24805 -38.9863 -38.3311 -78.75 -82.8125 +c-16.668 -18.6309 -35.2031 -29.2305 -54.6885 -30c-19.4844 -0.768555 -37.2275 8.35547 -52.1875 21.875c-29.9209 27.043 -53.9102 73.3867 -74.6885 125.94c-20.7783 52.5596 -37.6758 111.09 -49.6875 160.94c-12.0127 49.8545 -18.959 90.0166 -20 109.38 +c-4.43164 82.3906 16.3096 138.089 51.875 173.12c35.5645 35.0303 84.3604 48.0918 131.88 50.626c11.8701 0.632812 23.6299 0.822266 35.3096 0.311523c70.8301 -3.09961 131.471 -23.7383 147.19 -29.375c31.5801 20.0039 72.2695 32.6504 123.12 31.875 +c25.75 -0.392578 49.4795 -3.64551 71.5498 -8.75c0.0986328 -0.0224609 0.213867 0.0234375 0.3125 0c0.204102 0.0878906 0.480469 0.254883 0.625 0.3125c0.414062 0.165039 0.594727 0.19043 0.9375 0.3125c1.37207 0.488281 3.24902 1.07422 5.9375 1.875 +c5.37695 1.60254 13.9561 3.91797 24.6875 6.25c21.4639 4.66504 52.4229 9.69141 88.125 10zM697.166 773.438l-0.00488281 0.0078125c-28.1816 -0.243164 -53.0127 -3.81055 -72.1885 -7.5c53.0605 -21.832 93.0703 -55.5615 121.25 -89.0586 +c23.2207 -27.6094 38.7402 -55.2793 48.1309 -76.2598c4.68945 -10.4795 7.88965 -19.0703 9.67969 -25.9395c0.896484 -3.43066 1.38379 -6.29492 1.5625 -9.375c0.0888672 -1.54102 0.371094 -2.98145 -0.3125 -5.625 +c-0.0449219 -0.172852 -0.251953 -0.436523 -0.3125 -0.625c1.3125 -34.8135 -8.23828 -58.1074 -9.375 -91.25c-0.837891 -23.9805 5.86914 -52.0645 7.5 -82.8125c1.53516 -28.9375 -2.22363 -60.6553 -22.5 -91.875c1.70312 -1.95703 3.35742 -3.74609 5 -5.625 +c53.3398 78.1699 91.7129 164.724 112.19 238.44c11.0215 39.6748 17.0264 75.5752 17.5 104.06c0.472656 28.4844 -5.24902 49.1963 -12.5 57.8125c-58.96 70.0518 -139.635 86.1943 -205.62 85.625zM504.661 763.133l-0.00292969 -0.0107422 +c-52.8936 0.806641 -90.5205 -13.457 -118.75 -35.3115c-28.2305 -21.8555 -46.9258 -51.8252 -59.375 -82.5c-14.4629 -35.6348 -19.748 -71.3145 -21.875 -95.3125c0.134766 0.0703125 0.175781 0.241211 0.3125 0.3125c15.2012 7.87012 35.1953 15.7295 56.5615 20.3125 +c10.6826 2.29102 21.7822 3.75391 32.8115 3.75c11.0303 -0.00585938 22.0635 -1.56543 32.5 -5.3125c20.874 -7.49512 38.1328 -25.0361 44.375 -51.875c29.9512 -128.787 -9.26855 -176.937 -23.75 -213.12c-6.1543 -15.4248 -11.415 -28.9336 -14.375 -40.3125 +c1.87793 0.447266 3.7793 1.10059 5.625 1.25c10.2158 0.830078 18.3672 -2.54199 23.125 -4.375c14.5488 -5.60645 24.6289 -17.1465 30 -30.625c1.34082 -3.37012 2.18066 -6.96973 2.81055 -10.6201c0.529297 -1.27539 0.958984 -3.41992 0.958984 -4.78711 +c0 -0.232422 -0.0136719 -0.610352 -0.0292969 -0.842773c-1.58008 -52.54 -1.33984 -105.52 0.629883 -148.13c0.980469 -21.2998 2.24023 -39.9102 4.07031 -54.6699c1.82715 -14.7764 4.61719 -25.8896 6.25 -29.6885c5.44238 -12.6484 13.4209 -29.3535 27.8115 -40.625 +c14.3906 -11.2705 35.1055 -18.7607 72.8125 -11.25c32.6934 6.51758 52.7881 15.4277 66.25 28.4385c13.4619 13.0098 21.4141 31.2998 26.5615 59.0615c7.72266 41.6006 23.1895 162.544 25 185l-0.00390625 0.3125l0.00390625 0.3125 +c-0.669922 16.5605 2.05078 29.5605 7.82031 39.3701c6.0625 10.3311 15.3252 16.6025 23.4385 20c4.00195 1.67578 7.80469 2.89453 10.9375 3.75c-2.44238 3.29102 -5.84375 7.56543 -10.3115 12.8125c-8.65918 10.167 -19.7939 23.9502 -28.4385 43.4375 +c-0.922852 2.08008 -5.27148 9.61133 -10.9375 19.0625s-12.8301 21.3369 -20.3125 34.6875c-14.9658 26.7021 -31.2334 59.1084 -39.6875 90.625c-8.4541 31.5176 -9.45703 64.1602 12.1875 87.1885c19.1797 20.4102 52.6582 28.8037 103.12 24.0615 +c-1.46191 4.19727 -2.50098 7.54102 -5 13.125c-8.45508 18.8916 -22.9961 44.2754 -44.375 69.6885c-42.7598 50.8242 -111.78 101.179 -218.75 102.81zM223.718 760.935l0.0136719 -0.00292969c-7.60059 0.139648 -15.2002 0.09375 -22.8105 -0.3125 +c-42.9951 -2.29199 -83.7451 -13.8604 -112.819 -42.5c-29.0762 -28.6299 -48.2451 -75.3799 -44.0635 -153.12c0.791016 -14.7002 7.88379 -56.0195 19.6885 -105c11.8037 -48.9795 28.3018 -106.57 48.4375 -157.5c20.1318 -50.9297 44.6025 -95.2803 67.8125 -116.25 +c11.5996 -10.4902 21.7197 -14.7402 30.9297 -14.3799c9.21484 0.363281 20.1924 5.15625 33.75 20.3115c37.5654 42.0215 66.9385 71.165 76.875 80.9385c-35.79 28.4912 -56.9053 74.9316 -49.375 125c4.39355 29.2119 4.89746 56.5059 4.375 78.125 +c-0.476562 19.7178 -1.66992 33.0088 -1.875 41.875c-0.15625 0.682617 -0.296875 1.80273 -0.3125 2.5v0.625c-0.0478516 1.76953 -1.61426 67.0977 25.3115 133.44c11.9893 29.542 29.8809 59.4697 56.5625 83.75c-27.8398 8.46191 -79.2969 21.5244 -132.5 22.5z +M750.611 552.182c-32.6807 0.610352 -50.6396 -6.62207 -59.6885 -16.248c-12.0654 -12.8369 -13.0801 -35.6465 -5.625 -63.4385s23.0107 -58.834 37.5 -84.6885c7.24512 -12.9268 14.0049 -24.584 19.6885 -34.0615c5.68262 -9.47754 9.95996 -16.1504 12.5 -21.875 +c2.36328 -5.32715 4.84961 -9.99805 7.5 -14.375c11.209 21.96 13.3799 43.7764 12.1875 66.25c-1.47363 27.793 -8.50684 56.1826 -7.5 85c1.16113 33.8428 8.8418 55.3691 9.375 81.5615c-9.41699 1.08398 -18.2314 1.73242 -25.9375 1.875zM394.361 547.493 +l-0.00195312 0.00488281c-8.28125 0.00390625 -17.2432 -0.880859 -26.25 -2.8125c-18.0146 -3.86328 -36.0781 -11.0898 -49.0625 -17.8115c-6.49219 -3.36133 -11.9033 -6.72168 -15 -9.0625c-0.537109 -0.40625 -0.544922 -0.291992 -0.9375 -0.625 +c0.219727 -5.81348 1.69043 -19.7236 2.1875 -40.3125c0.545898 -22.5635 -0.316406 -51.3633 -5 -82.5c-10.1699 -67.6465 42.6426 -123.657 104.69 -123.75c3.60645 13.9014 9.69141 27.9424 15.625 42.8125c17.2988 43.2793 51.4736 74.8691 22.8115 198.119 +c-4.68164 20.126 -14.123 28.2344 -26.875 32.8125c-6.37598 2.28906 -13.9062 3.12109 -22.1875 3.125zM733.419 539.686c2.80273 -0.0644531 5.22363 -0.435547 7.5 -0.9375c2.27539 -0.500977 4.33887 -1.16016 5.9375 -2.1875s2.84766 -2.52539 3.125 -4.375 +c0.0136719 -0.0908203 -0.00976562 -0.22168 0 -0.3125c0.186523 -1.8252 -0.52832 -3.45508 -1.5625 -5.3125c-1.08594 -1.9502 -2.68164 -3.97852 -4.6875 -5.9375c-4.0127 -3.91797 -9.51562 -7.56934 -16.25 -8.4375c-6.72852 -0.87207 -12.9648 1.20605 -17.5 4.0625 +c-2.26758 1.42871 -4.21289 3.05566 -5.625 4.6875c-1.41309 1.63184 -2.23242 3.23047 -2.5 5c-0.270508 1.84961 0.325195 3.60547 1.5625 5c1.23633 1.39453 2.95703 2.37695 5 3.4375c4.08496 2.12207 9.67871 3.87695 15.9375 4.6875 +c3.12988 0.405273 6.25977 0.689453 9.0625 0.625zM396.229 532.806c2.94141 0.0664062 6.12207 0.109375 9.375 -0.3125c6.5127 -0.842773 12.1201 -2.69141 16.5615 -5c2.2207 -1.1543 4.11523 -2.35645 5.625 -4.0625c1.50977 -1.70703 2.8916 -4.26367 2.5 -6.875 +c-0.368164 -2.45605 -1.85742 -4.11133 -3.4375 -5.9375c-1.5791 -1.82617 -3.48047 -3.45215 -5.9375 -5c-4.91406 -3.09668 -11.6191 -5.65234 -19.0615 -4.6875c-7.45312 0.960938 -13.5137 4.86523 -17.8125 9.0625c-2.14941 2.09863 -4.10059 4.38574 -5.3125 6.5625 +s-1.9834 4.10254 -1.5625 6.875l0.625 4.0625h1.25c0.678711 0.780273 1.36914 1.34863 2.1875 1.875c1.9541 1.25684 4.40039 1.95508 6.875 2.5s5.18359 0.870117 8.125 0.9375zM783.729 242.186c-6.27441 -2.05078 -11.3096 -2.875 -15.626 -4.68262 +c-4.31543 -1.80762 -7.55371 -3.73633 -10.3115 -8.4375c-2.67383 -4.55664 -4.73145 -12.5342 -4.0625 -26.25c0.744141 -0.545898 2.75586 -1.80273 6.25 -2.8125c7.30957 -2.10938 19.5498 -3.25977 33.1191 -3.12988c27.1562 0.277344 60.3584 6.08301 78.125 13.75 +c16.8916 7.29395 31.2451 17.0234 40 24.375c-59.2334 -11.3613 -92.6152 -8.51758 -113.119 -0.625c-5.91992 2.27832 -10.6025 4.95215 -14.375 7.8125zM441.228 238.44c-2.2627 -0.182617 -5.57422 -0.630859 -11.874 -7.18652 +c-14.834 -15.4072 -19.9609 -25.3154 -32.1875 -34.375c-12.2285 -9.05957 -27.9795 -13.6172 -59.6885 -19.6875c-10.0371 -1.92383 -15.8555 -4.26758 -19.6875 -5.9375c1.22168 -0.923828 1.22559 -0.90918 3.125 -1.875 +c4.60449 -2.34375 10.5205 -4.51172 15.3115 -5.625c13.6699 -3.18164 36.0205 -6.84082 59.375 -3.125c23.3564 3.71484 47.6924 14.2393 68.4385 41.25c1.72461 2.24512 2.59375 5.01953 2.8125 8.125v0.3125c0.172852 3.22949 -0.40332 6.61719 -1.875 10.3115 +c-2.94434 7.38965 -9.4541 13.8486 -14.0625 15.625c-4.49707 1.73242 -7.42383 2.37207 -9.6875 2.1875z" /> + <glyph glyph-name="uniF137" unicode="" horiz-adv-x="830" +d="M753 798v0c34 0 62 -28 62 -59v-1c0 -2 -1 -5 -1 -7l-66.0098 -605.01c1.00977 -23.9902 -12 -46.9902 -33.9902 -57.9902l-268 -132c-9 -3.99023 -18 -6 -27 -6s-18 2.01953 -27 6l-269 132.01c-12 5.99023 -22 15 -28 26.9902c-5 7.00977 -8 15 -9 24l-68 610 +c0 2 -3 5 -3 7v1c0 33 30 61 64 61h674zM253 382l-11 11l114 116c20 20 20 53 0 73s-53 20 -73 0l-102 -102l-48 -48l-1 -1c-10 -10 -16 -24 -16 -37c0 -4 -1 -7 -1 -10c0 -10 8 -19 16 -27l2 -1.00977l149 -148.98c20 -20 53 -20 73 0s20 52.9902 0 72.9902zM715 357 +c10 10 15 23 14.0098 37v4c-1.00977 1 -1.00977 3 -1.00977 5c-2 10 -5.99023 19 -13.9902 27l-1.00977 1l-148.99 149c-20 20 -53.0098 20 -73.0098 0s-20 -53 0 -73l102 -102l12 -12l-113 -113c-20 -20 -20 -52.9902 0 -72.9902s53 -20 73 0l102 101.99z" /> + <glyph glyph-name="uniF138" unicode="" horiz-adv-x="951" +d="M15 800h305.31v-2.5c13.6406 1.61523 27.4805 2.5 41.5703 2.5h226.87c192.2 0 346.87 -154.67 346.87 -346.88v-175.93c0 -5.7002 -0.0400391 -11.5605 -0.310547 -17.1904c-0.00976562 -0.30957 0.0205078 -0.629883 0 -0.94043v-329.06h-305.31v2.5 +c-13.5303 -1.58984 -27.2803 -2.19043 -41.25 -2.19043h-226.87c-192.21 0 -346.88 154.681 -346.88 346.881v175.93c0 5.7002 0.0439453 11.2598 0.3125 16.8799h-0.3125v330zM428.12 459.69c-33.9502 0 -66.1504 -2.34082 -96.8701 -7.19043 +c-30.1797 -4.84961 -54.8896 -9.91992 -73.75 -15.3096v-409.07h97.8105v341.26c6.46973 1.07031 16.1299 2.44043 29.0693 4.06055c12.9307 1.60938 24.8398 2.17969 35.6201 2.17969c30.1797 0 50.7803 -9.74023 61.5605 -29.6797 +c11.3193 -19.4102 16.8799 -51.4307 16.8799 -95.6309v-222.189h97.8096v233.76c0 17.2402 -0.879883 33.3398 -2.5 48.4297c-1.62012 15.0908 -4.43945 29.3408 -8.75 42.8105c7.00977 4.86035 17.5498 9.83984 31.5596 14.6895 +c14.0107 5.39062 28.75 7.81055 44.3809 7.81055c30.7197 0 51.4092 -9.74023 62.1797 -29.6797c10.7803 -19.4102 16.25 -51.4307 16.2598 -95.6309v-222.189h97.8105v237.819c0 28.5605 -2.34082 54.7207 -7.19043 78.4404 +c-4.30957 24.25 -12.9199 44.54 -25.3096 61.2402c-11.8604 17.25 -28.4404 30.5303 -50 39.6895c-21.0205 9.7002 -48.0605 14.3809 -80.9404 14.3809c-12.9404 0 -25.8203 -1.06055 -38.75 -3.75c-12.4004 -2.7002 -24.3105 -6.32031 -35.6201 -10.6309 +c-11.3203 -3.76953 -21.4697 -7.95996 -30.6299 -12.8096s-16.5703 -9.44043 -22.5 -13.75c-12.4004 12.4004 -28.0098 22.1396 -46.8701 29.6904c-18.3301 7.54004 -42.1504 11.25 -71.2598 11.25z" /> + <glyph glyph-name="uniF139" unicode="" horiz-adv-x="1028" +d="M975.312 795l-0.0117188 0.00390625c2.47949 0.193359 5.30957 -0.273438 8.12988 -0.938477c0.288086 -0.0166016 0.654297 0.0205078 0.9375 0c0.545898 -0.0410156 1.03613 -0.255859 1.5625 -0.3125c0.771484 -0.0810547 1.4375 -0.253906 2.1875 -0.3125 +c1.15137 -0.161133 2.38672 -0.0869141 3.4375 -0.3125c0.390625 -0.0830078 0.873047 -0.21875 1.25 -0.3125c0.867188 -0.228516 1.70703 -0.666016 2.5 -0.9375c0.80957 -0.00390625 1.7666 -0.146484 2.5 0c0.420898 -0.323242 0.876953 -0.786133 1.25 -1.25 +c0.108398 -0.0566406 0.206055 -0.25293 0.3125 -0.3125c0.713867 -0.396484 1.26367 -1.10254 1.875 -1.5625c0.43457 -0.388672 0.678711 -0.542969 0.625 -0.625c0.669922 -0.569336 1.35156 -0.904297 1.875 -1.5625c1.5498 -5.25098 2.88965 -10.2822 4.05957 -15.3115 +c0.0439453 -0.191406 -0.0439453 -0.43457 0 -0.625c0.660156 -2.8623 1.33984 -5.64453 1.87988 -8.4375c0.370117 -1.92871 0.620117 -4.04102 0.930664 -5.9375c0.0595703 -0.317383 0.269531 -0.625 0.319336 -0.938477 +c1.65039 -5.45312 1.69043 -10.7207 1.87012 -15.9365c0.100586 -2.65527 0.270508 -5.20898 0.600586 -8.12988c0.03125 -0.835938 -0.0205078 -1.6709 0 -2.5c0.0957031 -4.41602 -0.0771484 -8.89551 -0.3125 -13.125v-0.3125 +c-0.0195312 -0.323242 0.0205078 -0.615234 0 -0.9375c-0.277344 -4.33789 -0.635742 -8.34961 -1.25 -12.5v-0.3125c-0.0537109 -1.11816 -0.136719 -2.19531 -0.3125 -3.4375c-0.358398 -1.43262 -0.84375 -2.90625 -1.25 -4.375 +c-0.0273438 -0.0976562 0.0263672 -0.21582 0 -0.3125c-0.0888672 -0.318359 -0.230469 -0.62207 -0.3125 -0.9375c-0.861328 -3.99805 -1.9541 -8.0459 -3.125 -11.875c-0.0585938 -0.191406 0.0585938 -0.43457 0 -0.625 +c-0.830078 -2.72852 -1.86426 -5.42871 -2.8125 -8.125c-0.0810547 -0.213867 -0.231445 -0.412109 -0.3125 -0.625c-0.72168 -1.89453 -1.37793 -3.76172 -2.1875 -5.625c-0.185547 -0.428711 -0.435547 -0.822266 -0.625 -1.25 +c-0.125977 -0.304688 -0.18457 -0.633789 -0.3125 -0.9375c-0.0966797 -0.211914 -0.21582 -0.414062 -0.3125 -0.625c-1.10547 -2.57715 -2.1582 -5.03125 -3.4375 -7.5c-0.131836 -0.248047 -0.462891 -0.385742 -0.625 -0.625 +c-0.0498047 -0.0722656 0.0400391 -0.238281 0 -0.3125c-1.44629 -2.71582 -2.98828 -5.28223 -4.6875 -7.8125c-1.61816 -2.61523 -3.22559 -5.27832 -5 -7.8125c-1.58789 -2.35059 -3.25781 -4.62891 -5 -6.875c-0.178711 -0.230469 -0.445312 -0.395508 -0.625 -0.625 +c-1.37695 2.18066 -2.97266 4.4502 -4.6875 6.875c-1.38379 1.95508 -3.07129 3.92383 -4.6875 5.9375c-0.379883 0.473633 -0.545898 1.08691 -0.9375 1.5625c-0.101562 0.107422 -0.211914 0.205078 -0.3125 0.3125c-0.103516 0.108398 -0.209961 0.204102 -0.3125 0.3125 +c-6.80176 7.16992 -14.0771 13.7275 -21.875 19.6875c-0.188477 0.131836 -0.25 0.22168 -0.3125 0.3125c-0.1875 0.130859 -0.12793 0.183594 -0.3125 0.3125c-0.890625 0.671875 -1.90723 1.22266 -2.8125 1.875c-3.31934 2.3916 -6.76855 4.77246 -10.3125 6.875 +c0.0712891 0.0693359 -0.648438 0.738281 -1.25 1.25c-0.239258 0.167969 -0.391602 0.461914 -0.625 0.625c-1.53613 1.14941 -4.16504 2.82422 -8.125 5.3125c-0.28418 -0.0175781 -0.271484 0.125 -0.3125 0c0.0556641 -0.0410156 -0.0546875 -0.270508 0 -0.3125 +c0.53125 -0.407227 1.02148 -0.517578 1.5625 -0.9375c0.30957 -0.203125 0.624023 -0.422852 0.9375 -0.625c0.869141 -0.55957 1.64746 -1.20215 2.5 -1.875c0.989258 -0.598633 1.92871 -1.4043 2.8125 -1.875v-0.3125c1.43945 -0.759766 2.37207 -1.37305 2.5 -1.25 +c1.15039 -1.39062 2.44824 -2.76074 3.75 -4.0625c0.104492 -0.103516 0.208008 -0.208984 0.3125 -0.3125c0.405273 -0.348633 0.848633 -0.586914 1.25 -0.9375c1.07031 -1.01953 2.00977 -2.12012 3.12012 -3.12012c1.15039 -1.0498 2.34961 -2.0791 3.44043 -3.12988 +c1.89941 -1.69922 3.83008 -3.51953 5.64941 -5.33008c0.145508 -0.158203 0.169922 -0.46582 0.3125 -0.625c0.0478516 -0.0527344 -0.046875 -0.258789 0 -0.3125c1.25391 -1.28516 2.32227 -2.69727 3.4375 -4.0625c0.402344 -0.504883 0.895508 -1.0625 1.25 -1.5625 +c0.0507812 -0.0673828 -0.0498047 -0.244141 0 -0.3125c2.65625 -3.62793 4.9873 -7.53906 5.9375 -12.5c0.12793 -0.667969 0.538086 -1.17676 0.625 -1.875c1.87695 -3.89258 2.62695 -7.53809 2.8125 -10.9375c0.745117 -3.28711 1.65625 -6.73145 2.1875 -9.6875 +c-2.74609 -2.86523 -5.79883 -5.66699 -8.75 -8.4375c-0.181641 -0.226562 -0.4375 -0.400391 -0.625 -0.625c-4.49414 -5.37793 -10.3965 -10.1191 -16.5615 -14.6885c-0.220703 -0.1875 -0.40332 -0.4375 -0.625 -0.625 +c-0.280273 -0.236328 -0.657227 -0.387695 -0.9375 -0.625c-0.316406 -0.200195 -0.632812 -0.401367 -0.9375 -0.625c-5.24707 -4.40527 -10.6807 -8.76074 -16.25 -13.125c-6.38281 -5.01172 -12.9131 -10.0166 -19.6885 -15 +c-4.4043 -3.4375 -9.02734 -6.59961 -13.4375 -10c-11.3906 -8.78027 -22.9414 -17.2734 -35.3125 -24.375c-5.42969 -3.65918 -10.7041 -7.24902 -16.25 -10.9375c-5.8877 -3.92285 -11.9102 -7.66992 -17.8115 -11.5625 +c-9.58789 -6.33496 -18.9639 -12.5684 -28.75 -19.0615c-0.866211 -0.572266 -1.63379 -1.30273 -2.5 -1.875c-1.42383 -0.945312 -2.94824 -1.86328 -4.375 -2.8125c-1.15723 -0.727539 -2.31836 -1.44141 -3.4375 -2.1875 +c-1.06738 -0.700195 -2.07617 -1.48633 -3.125 -2.1875c-11.4463 -7.65234 -22.8613 -15.4668 -34.375 -23.4385c-6.44531 -4.46875 -12.9971 -8.85156 -19.375 -13.4375c-1.57812 -1.125 -3.11133 -2.30566 -4.6875 -3.4375 +c-7.97168 -5.72461 -15.8594 -11.5605 -23.75 -17.5c-0.650391 -0.492188 -1.22461 -1.07031 -1.875 -1.5625c-4.49414 -3.3877 -8.98535 -6.8457 -13.4385 -10.3125c-3.98242 -3.10742 -7.93164 -6.20117 -11.875 -9.375c-0.816406 -0.648438 -1.6875 -1.2168 -2.5 -1.875 +c-2.07031 -1.67578 -4.19141 -3.30176 -6.25 -5c-0.727539 -0.62207 -1.46094 -1.25 -2.1875 -1.875c-0.110352 -0.0947266 -0.201172 -0.21582 -0.3125 -0.3125c-25.0449 -21.5801 -48.8994 -44.6299 -72.8115 -67.5 +c-6.29102 -6.16992 -13.1309 -12.7451 -19.0625 -18.4375c-1.39355 -1.33691 -3 -3.06348 -4.375 -4.375c-0.160156 -0.151367 -0.46582 -0.161133 -0.625 -0.3125c-5.23438 -5.0127 -10.9717 -10.6953 -15.9375 -15.3125 +c-1.96875 -1.8291 -4.01074 -3.53906 -5.9375 -5.3125c-3.31348 -3.06934 -6.38184 -6.34082 -9.6875 -9.375l-0.299805 -0.330078c-1.75391 -1.58398 -3.90723 -3.46289 -5.625 -5c-6.80566 -6.22559 -13.5205 -12.5547 -19.6885 -18.75 +c-18.1104 -14.3193 -39.6855 -31.5508 -59.375 -46.5615c-2.58008 -0.386719 -4.87109 -1.38867 -7.1875 -2.5c-0.307617 -0.195312 -0.631836 -0.431641 -0.9375 -0.625c-2.13672 -1.34961 -4.18164 -2.50684 -6.25 -3.75 +c-0.863281 -0.520508 -1.95996 -1.05957 -2.8125 -1.5625c-0.242188 -0.15625 -0.382812 -0.448242 -0.625 -0.625c-5.68262 -4.16504 -11.6201 -8.60156 -18.75 -10.3115c-1.59863 -0.74707 -3.36426 -1.17188 -5 -1.875c-3.30566 -1.42285 -6.65137 -2.76758 -10 -4.0625 +c-0.34375 -0.133789 -0.591797 -0.499023 -0.9375 -0.625h-0.3125c-0.494141 -0.191406 -1.07129 -0.44043 -1.5625 -0.625c-1.54492 -0.591797 -3.16602 -1.03711 -4.6875 -1.5625c-0.623047 -0.202148 -1.26172 -0.421875 -1.875 -0.625 +c-0.320312 -0.107422 -0.618164 -0.208008 -0.9375 -0.3125c-0.220703 -0.0742188 -0.404297 -0.240234 -0.625 -0.3125c-0.923828 -0.254883 -1.8877 -0.359375 -2.8125 -0.625c-1.15625 -0.366211 -2.30078 -0.923828 -3.4375 -1.25 +c-0.40918 -0.116211 -0.841797 -0.200195 -1.25 -0.3125c-0.306641 -0.0859375 -0.631836 -0.228516 -0.9375 -0.3125c-2.84668 -0.783203 -5.62207 -1.26367 -8.4375 -1.875c-2.81543 -0.612305 -5.66895 -1.35352 -8.4375 -1.875 +c-10.3086 -1.94238 -20.5205 -3.15137 -31.25 -4.375c-1.16113 -0.134766 -2.2627 -0.177734 -3.4375 -0.3125c-4.2998 -0.488281 -8.60156 -1.01074 -13.125 -1.5625c-5.50781 -0.672852 -11.2197 -1.58887 -17.1875 -2.5 +c-0.195312 -0.0302734 -0.429688 0.0292969 -0.625 0c-6.25586 -0.97168 -12.4561 -2.02637 -19.375 -3.4375c-0.507812 -0.15625 -1.04785 -0.206055 -1.5625 -0.3125c-6.61328 -1.37305 -13.5771 -3.05566 -20.9385 -5c-2.17383 -0.818359 -5.65234 -2.12988 -7.5 -2.8125 +c-5.41406 -1.95996 -12.8115 -4.6875 -12.8115 -4.6875l-20.625 -5.9375l1.25 1.25c-0.52832 -0.209961 -1.04492 -0.435547 -1.5625 -0.625c-11.0977 -13.3467 -21.123 -25.8252 -30.625 -37.8125c-0.685547 -0.865234 -1.19824 -1.6416 -1.875 -2.5 +c-0.0849609 -0.107422 -0.227539 -0.205078 -0.3125 -0.3125c-7.17969 -9.10938 -14.0254 -17.9844 -20.3125 -26.25c-2.37207 -3.11914 -5.25098 -6.68848 -7.5 -9.6875c-0.21875 -0.289062 -0.410156 -0.651367 -0.625 -0.9375 +c-0.0957031 -0.126953 -0.217773 -0.185547 -0.3125 -0.3125c-6.16211 -8.23438 -11.9453 -16.1465 -17.1875 -23.4375c-1.02734 -1.42871 -2.13281 -3.29688 -3.125 -4.6875c-4.67871 -6.56641 -8.87988 -12.3945 -12.8125 -18.125 +c-0.078125 -0.115234 -0.234375 -0.199219 -0.3125 -0.3125c-1.04492 -1.52441 -1.50391 -2.58398 -2.5 -4.0625c-6.0127 -8.8584 -11.7314 -17.4658 -15.9375 -24.0625c-0.0673828 -0.0996094 -0.246094 -0.209961 -0.314453 -0.330078 +c-0.0683594 -0.106445 -0.245117 -0.207031 -0.3125 -0.3125c-0.140625 -0.207031 -0.213867 -0.469727 -0.3125 -0.625c-1.57031 -2.47754 -2.64258 -4.26465 -4.0625 -6.5625c-1.61426 -2.59961 -3.74805 -5.73535 -5 -7.8125 +c-0.211914 -0.349609 -0.416992 -0.900391 -0.625 -1.25c-0.99707 -1.67383 -0.839844 -1.56641 -1.5625 -2.8125c-0.290039 -0.467773 -0.763672 -0.952148 -0.9375 -1.25c-1.33691 -2.3418 -3.75 -6.5625 -3.75 -6.5625l-60.3115 -62.5l-2.8125 2.5 +s4.33203 7.23047 6.56152 10.9502c1.44922 2.38867 4.2334 7.01074 6.25 10.3115c0.100586 0.164062 0.209961 0.459961 0.3125 0.625c2.13086 3.44727 5.00098 8.08984 7.8125 12.5c0.811523 1.2959 1.64355 2.39062 2.5 3.75 +c0.504883 0.802734 1.04297 1.69336 1.5625 2.5c0.939453 1.48926 2.03711 3.32812 3.125 5c0.24707 0.389648 0.6875 0.857422 0.9375 1.25c5.73242 8.99902 12.4824 19.627 19.6885 30.625c0.946289 1.44043 2.15332 3.2207 3.125 4.69043 +c1.29688 1.96973 2.09766 3.29004 3.43652 5.30957c1.67188 2.52051 3.55957 5.5 5.28613 8.16016c4.94629 7.40234 9.86133 14.5254 15.3115 22.5c5.80957 8.49316 12.4092 17.8418 18.75 26.875c13.2754 18.9189 27.167 38.5312 42.5 59.0625 +c1.08105 1.44629 2.34863 2.92285 3.4375 4.375c0.44043 0.585938 0.80957 1.28809 1.25 1.875c3.09863 4.12109 6.47754 8.36816 9.6875 12.5c7.3916 9.68848 14.7471 19.252 22.5 29.0615c-0.27832 0.672852 -0.373047 1.49414 -0.625 2.1875 +c-0.173828 0.481445 -0.151367 1.07129 -0.3125 1.5625c-0.298828 0.919922 -0.686523 1.85645 -0.9375 2.8125c-0.0810547 0.307617 -0.232422 0.62207 -0.3125 0.9375c-0.254883 1.04297 -0.740234 2.03809 -0.9375 3.125c-0.276367 1.57031 -0.162109 3.33496 -0.3125 5 +c-0.0175781 0.199219 0.0185547 0.425781 0 0.625c-0.165039 2.0127 -0.34082 4.09277 -0.3125 6.25c0.00292969 0.196289 -0.00390625 0.428711 0 0.625c0.00488281 0.75 -0.0419922 1.41211 0 2.1875c0.12207 2.27734 0.283203 4.43457 0.625 6.875 +c0.424805 3.03418 1.08984 6.38672 1.875 9.6875c0.169922 0.711914 0.438477 1.45703 0.625 2.1875c0.305664 1.18164 0.580078 2.53223 0.9375 3.75c0.614258 2.11914 1.40527 4.33691 2.1875 6.5625c0.206055 0.585938 0.408203 1.28223 0.625 1.875 +c0.999023 2.80469 2.20117 5.77148 3.4375 8.75c0.0849609 0.202148 0.227539 0.420898 0.3125 0.625c1.42188 3.39355 2.9502 7.01855 4.6875 10.625c2.1875 4.54004 5.09668 9.47656 7.8125 14.375c1.95312 3.52148 4.01172 7.20996 6.25 10.9385 +c2.22266 3.80469 4.61523 7.86328 7.1875 11.875c0.188477 0.292969 0.435547 0.642578 0.625 0.9375c0.566406 0.876953 0.981445 1.61035 1.5625 2.5c2.21191 3.38574 4.75781 7.08105 7.1875 10.625c1.9541 2.84766 4.18652 5.83789 6.25 8.75 +c0.69043 0.969727 1.16992 1.83105 1.875 2.8125c0.367188 0.509766 0.875 1.04688 1.25 1.5625c0.987305 1.36719 1.7832 2.65918 2.8125 4.0625c0.306641 0.416992 0.628906 0.830078 0.9375 1.25c2.83398 3.84766 6.28711 8.14844 9.375 12.1875 +c3.97949 5.20215 8.15234 10.7324 12.5 16.25c0.609375 0.761719 1.24805 1.71387 1.875 2.5c1.99219 2.5127 4.16895 5.23926 6.25 7.8125c2.08008 2.58301 4.16113 4.98828 6.25 7.5c0.763672 0.916992 1.64746 1.8584 2.5 2.8125 +c0.443359 0.530273 0.803711 1.03027 1.25 1.5625c0.182617 0.216797 0.442383 0.408203 0.625 0.625c5.10547 6.07324 10.3643 12.3418 15.9385 18.75c2.20996 2.53906 4.87598 5.20605 7.1875 7.8125c0.879883 1.01758 1.61328 2.12402 2.5 3.125 +c0.106445 0.212891 0.199219 0.418945 0.3125 0.625c1.58594 2.88574 3.94824 5.04395 6.5625 7.1875c0.302734 0.338867 0.632812 0.598633 0.9375 0.9375c0.109375 0.0859375 0.202148 0.226562 0.3125 0.3125c0.712891 0.794922 1.46191 1.69629 2.1875 2.5 +c1.16992 1.29492 2.25684 2.44727 3.4375 3.75c1.11914 1.23633 2.61426 2.50293 3.75 3.75c2.25879 2.47266 4.27539 5.01172 6.5625 7.5c0.0634766 0.134766 0.25 0.176758 0.3125 0.3125c0.125 0.0908203 0.188477 0.22168 0.3125 0.3125 +c8.18652 8.90137 16.3057 17.7061 25.3115 27.1885c0.0498047 0.0507812 -0.0488281 0.259766 0 0.3125c1.35059 1.4209 2.87109 2.90332 4.375 4.375c1.22461 1.32422 2.55078 2.4834 3.75 3.75c0.208984 0.31543 0.396484 0.641602 0.625 0.9375 +c0.0976562 0.101562 0.214844 0.210938 0.3125 0.3125c5.18457 7.38477 11.877 13.292 18.75 19.375c0.541992 0.479492 1.02148 1.08105 1.5625 1.5625c0.71875 0.734375 1.45215 1.45898 2.1875 2.1875c0.720703 0.735352 1.47363 1.45508 2.1875 2.1875 +c3.58594 3.65234 6.92773 7.20605 10.625 10.9375c0.320312 0.323242 0.615234 0.612305 0.9375 0.9375c0.974609 1.25293 1.91895 2.40918 2.8125 3.75c10.5264 10.1533 21.0635 20.2148 31.5625 30.3125c0.540039 0.530273 1.02051 1.0293 1.5625 1.5625 +c0.43457 0.426758 0.813477 0.821289 1.25 1.25c0.327148 0.320312 0.609375 0.615234 0.9375 0.9375c1.58984 1.52734 3.0918 3.16504 4.6875 4.6875c4.20117 4.10645 8.72949 8.11426 13.125 12.1875c1.50879 1.40234 2.88477 2.95215 4.375 4.375 +c1.44531 1.31836 2.91113 2.74805 4.375 4.0625c0.595703 0.552734 1.27051 1.01758 1.875 1.5625c1.51758 1.35059 3.15039 2.71582 4.6875 4.0625c0.94043 0.835938 1.86719 1.66797 2.8125 2.5c1.01758 0.939453 2.08887 1.88379 3.125 2.8125 +c0.788086 0.678711 1.70703 1.19824 2.5 1.875c6.19043 5.44141 12.499 10.8047 19.0615 15.9385c3.27441 2.63672 6.66406 5.2002 10 7.8125c0.307617 0.233398 0.629883 0.391602 0.9375 0.625c1.22852 0.958008 2.51953 1.85938 3.75 2.8125 +c1.94043 1.49902 3.66602 3.19727 5.625 4.6875c2.30273 1.75098 4.79199 3.31738 7.1875 5c1.07324 0.803711 2.04297 1.69727 3.125 2.5c0.598633 0.449219 1.27051 0.796875 1.875 1.25c4.13672 3.09277 8.32227 6.34277 12.1885 9.375 +c6.65527 6.77734 15.3428 11.3477 23.75 16.25c0.30957 0.209961 0.604492 0.450195 0.9375 0.625c0.380859 0.259766 0.868164 0.365234 1.25 0.625c2.5332 1.7168 4.95508 3.60254 7.5 5.3125c0.385742 0.256836 0.864258 0.368164 1.25 0.625 +c0.414062 0.314453 0.84375 0.611328 1.25 0.9375c0.114258 0.0908203 0.197266 0.220703 0.3125 0.3125c1.04785 0.825195 2.15527 1.58008 3.125 2.5c2.10547 0.919922 4.00586 2.1543 5.9375 3.4375c0.193359 0.125977 0.430664 0.186523 0.625 0.3125 +c0.116211 0.0761719 0.183594 0.254883 0.3125 0.3125c0.193359 0.125977 0.430664 0.186523 0.625 0.3125c0.186523 0.130859 0.438477 0.179688 0.625 0.3125c6.2666 4.4668 12.1543 10.1113 19.6875 12.8115c0.0761719 0.046875 0.237305 -0.046875 0.3125 0 +c1.42383 0.887695 2.94824 1.61816 4.375 2.5c1.56348 1.0957 2.98438 2.31348 4.6875 3.125c1.16016 0.710938 2.27539 1.48145 3.4375 2.1875c2.15625 1.31152 4.39355 2.45801 6.5625 3.75c9.7627 5.875 19.5479 11.582 29.375 17.1885 +c2.14648 1.2998 4.32422 2.56934 6.5625 3.75c0.860352 0.484375 1.63965 1.08203 2.5 1.5625c1.75879 0.985352 3.5459 1.85742 5.3125 2.8125c5.2041 2.89258 10.4268 5.62793 15.625 8.4375c0.3125 0.208008 0.633789 0.40625 0.9375 0.625 +c0.421875 0.302734 0.823242 0.630859 1.25 0.9375c5.65039 3.76953 11.6406 6.63965 17.8408 9.37988c0.289062 0.150391 0.647461 0.162109 0.9375 0.3125c0.208984 0.108398 0.415039 0.204102 0.625 0.3125c0.0830078 0.0429688 0.228516 -0.0429688 0.3125 0 +c10.3428 5.37305 20.4268 10.626 30.625 15.625c7.42773 3.63867 14.5928 7.19238 21.875 10.625c3.66699 1.71973 7.30566 3.33496 10.9375 5c0.640625 0.296875 1.23633 0.641602 1.875 0.9375c3.91406 1.78711 7.70801 3.57129 11.5625 5.3125 +c0.5 0.222656 1.06152 0.40332 1.5625 0.625c0.12793 0.0566406 0.183594 0.254883 0.3125 0.3125c1.94629 0.874023 3.99609 1.65137 5.9375 2.5c3.82812 1.68652 7.78125 3.38965 11.5615 5c1.8584 0.821289 3.76855 1.69531 5.625 2.5 +c0.782227 0.351562 1.7002 0.597656 2.5 0.9375c0.797852 0.333008 1.69434 0.586914 2.5 0.9375c0.12793 0.0527344 0.18457 0.259766 0.3125 0.3125c9.4082 3.89941 18.3291 7.30078 27.1885 10.625c5.49121 2.09961 10.6377 4.02148 15.9375 5.9375 +c0.203125 0.107422 0.422852 0.204102 0.625 0.3125c1.91016 1.02832 3.85645 2.27148 5.625 3.4375c2.30664 0.166016 4.66406 0.532227 6.875 0.9375c7.25488 2.49023 14.4561 4.7793 21.25 6.875c-0.0292969 -0.280273 0.03125 -0.652344 0 -0.9375 +c0.270508 0.0800781 0.674805 0.237305 0.9375 0.3125c-0.900391 -2.88086 -1.67969 -5.23242 -2.1875 -7.5c-0.0195312 -0.0878906 0.0195312 -0.225586 0 -0.3125c-0.0185547 -0.0878906 0.0195312 -0.225586 0 -0.3125 +c-0.433594 -2.92285 -0.764648 -5.61133 -1.25 -8.75c-0.0166016 -0.107422 0.0166016 -0.205078 0 -0.3125c-0.109375 -0.742188 -0.189453 -1.41113 -0.3125 -2.1875c-0.34375 -3.55176 -0.616211 -6.89844 -1.25 -12.1885 +c-0.518555 -0.976562 -0.868164 -2.10449 -1.25 -3.125c-0.046875 -0.125 -0.270508 -0.188477 -0.3125 -0.3125c-0.0166016 -0.09375 0.0166016 -0.21875 0 -0.3125c-0.482422 -2.66797 -0.515625 -2.38867 -0.9375 -4.6875 +c-0.0292969 -0.233398 0.0224609 -0.398438 0 -0.625c-0.337891 -3.53711 -0.0556641 -6.07422 0.9375 -5.9375c0.15625 0.362305 0.611328 1.16406 0.9375 1.875c0.154297 0.360352 0.447266 1.14746 0.625 1.5625c0.501953 1.1748 1.18262 2.74121 1.875 4.375 +c0.0214844 0.0966797 -0.0185547 0.217773 0 0.3125c0.229492 1.16602 0.37793 2.2041 0.625 3.75c0.912109 1.17285 1.71973 2.41895 2.5 3.75c0.0898438 0.21582 0.22168 0.09375 0.3125 0.3125c0.155273 0.373047 0.152344 0.241211 0.3125 0.625 +c0.999023 2.39844 0.386719 1.2168 1.5625 4.0625c0.808594 1.95703 1.65234 4.18066 2.5 6.25c2.61035 7.40625 4.85352 14.9639 8.125 20.3125c0.665039 1.65039 1.55859 3.43262 2.1875 5c3.02441 0.834961 5.84766 1.44727 8.75 2.1875 +c2.34375 0.689453 4.93848 1.29492 7.5 1.875c1.2041 0.28125 2.25781 0.362305 3.4375 0.625c3.70898 0.779297 7.47949 1.72559 11.25 2.5c0.106445 0.0195312 0.206055 -0.0195312 0.3125 0c0.220703 0.0449219 0.405273 0.266602 0.625 0.3125 +c4.3125 1.28613 11.7393 3.19922 16.5625 2.1875c1.9043 0.18457 3.83887 0.207031 5.625 0.3125c0.125 0.0644531 0.183594 0.253906 0.3125 0.3125c1 0.451172 1.96289 0.84668 3.125 0.9375zM893.74 726.566c-0.000976562 -1.10645 -0.405273 -1.63184 -0.625 -2.1875 +c0.0751953 0.548828 -0.0292969 1.09766 0 1.25c0.257812 0.330078 0.206055 0.569336 0.625 0.9375zM928.74 580.626v-0.3125v0.3125zM920.931 574.696l0.30957 -0.30957zM300.301 362.506l0.30957 -0.619141zM287.176 345.318v-0.3125v0.3125zM564.056 300.318h0.3125 +h-0.3125zM496.556 237.506v-0.625v0.625zM468.117 214.381l-0.3125 -0.3125zM464.367 211.256l0.3125 -0.3125l-0.299805 0.300781zM460.942 210.307v-0.3125v0.3125zM461.567 209.682l-0.3125 -0.3125zM462.192 208.744v-0.3125v0.3125zM444.067 197.494h0.3125h-0.3125z +M442.508 196.233l0.30957 -0.30957zM437.508 194.671v-0.3125v0.3125zM434.383 193.421v-0.3125v0.3125zM427.192 187.481l-0.30957 -0.310547zM425.63 185.919l-0.3125 -0.3125zM426.567 185.294v-0.625v0.625zM408.117 177.474v-0.3125v0.3125zM406.242 177.161v-0.3125 +v0.3125zM406.242 176.224v-0.3125v0.3125zM399.055 174.661h0.3125h-0.3125zM392.505 172.161l-0.30957 -0.30957z" /> + <glyph glyph-name="uniF13A" unicode="" +d="M521.464 751.141h0.0185547c0.263672 0.0400391 0.694336 0.0732422 0.960938 0.0732422c3.50098 0 6.3418 -2.84082 6.3418 -6.3418c0 -2.60742 -2.02734 -5.33008 -4.52539 -6.07617c-40.8672 -19.2725 -53.9727 -31.5 -73.458 -70.6777 +c-0.981445 -1.88086 -3.5 -3.40723 -5.62207 -3.40723c-3.50098 0 -6.3418 2.84082 -6.3418 6.3418c0 0.477539 0.103516 1.2373 0.231445 1.69727c3.40723 11.8711 6.75488 20.9863 10.4883 29.3193c-0.188477 -0.0205078 -0.496094 -0.0371094 -0.685547 -0.0371094 +c-3.50098 0 -6.3418 2.8418 -6.3418 6.3418c0 0.484375 0.106445 1.25391 0.237305 1.71973c3.62891 11.8574 6.875 20.0166 13.2715 25.9248c6.39648 5.90723 14.79 8.5127 26.8506 11.4189c0.392578 0.0908203 1.03711 0.165039 1.44043 0.165039 +c3.01953 0 5.83008 -2.4248 6.27344 -5.41309c8.4375 3.27051 17.877 5.83691 29.3193 8.6416c0.415039 0.138672 1.10547 0.277344 1.54102 0.30957zM655.124 743.116l-0.00976562 0.0117188c35.1191 -2.21094 68.0957 -16.7812 102.771 -45.3682 +c22.7637 -18.7666 41.8242 -38.1133 65.7344 -53.0859c12.4932 -7.82129 22.3398 -13.9346 32.4131 -25.9238c10.6367 -12.6758 19.3574 -26.1064 26.2324 -41.9736c7.12793 2.89648 14.6357 5.54785 20.0605 10.1846c8.7666 7.49023 15.0654 21.707 25.9248 32.7139 +c4.49316 4.55469 10.5312 6.5957 16.3564 6.79004c5.82422 0.194336 11.8203 -1.22656 17.2832 -3.39453c10.9238 -4.33789 20.4629 -11.0723 24.998 -19.7529c23.1094 -44.2246 31.6709 -121.555 26.8506 -169.126c-5.90234 -58.2422 -29.8633 -114.234 -82.4033 -142.274 +c-34.3369 -18.3213 -78.6533 -20.292 -117.584 -13.8877c-2.06934 -6.71094 -4.14844 -13.4004 -6.17285 -20.0596c-8.67383 -28.5049 -40.0859 -49.8594 -69.1318 -51.2324c-13.585 -0.640625 -24.5752 2.85156 -33.9492 8.33301 +c-9.37305 5.48242 -17.1162 12.79 -25.3066 20.6787c-5.62012 5.41309 -11.3057 10.8877 -16.9756 16.3564c-0.124023 -0.805664 -0.174805 -1.67383 -0.308594 -2.46875c6.29688 -12.9922 9.83008 -24.4473 15.123 -37.0352 +c6.45215 -15.3613 10.0361 -26.2676 10.4932 -43.208c0.376953 -14.1582 0.851562 -28.3857 1.23438 -42.5898c5.37012 -10.0332 6.74805 -16.0391 5.86328 -28.3936c-1.06934 -14.8828 -6.2959 -25.2744 -15.4307 -30.5547 +c-9.13574 -5.28027 -20.1523 -5.94531 -33.0234 -5.86426c-8.29492 0.0537109 -39.4648 0.254883 -48.7627 0.925781c-8.09277 0.584961 -15.2441 1.03418 -21.2949 2.46973c-3.83398 0.90918 -7.04492 2.57422 -10.1846 4.62891 +c-6.78027 -5.51855 -14.8262 -11.8945 -22.2207 -17.9004c-4.32129 -3.50977 -8.13086 -6.70605 -11.4189 -9.25879c-2.60547 -2.02148 -4.37695 -3.17285 -6.17188 -4.32031c-3.62402 -5.5791 -6.01074 -10.5928 -9.25879 -15.4316 +c-3.44922 -5.13672 -8.0459 -10.0312 -15.7412 -14.1963c-21.9043 -11.8525 -41.1533 -11.2354 -56.4785 -1.85156c-15.3252 9.38281 -26.8965 26.1045 -39.1963 45.0586c-5.85059 9.01758 -15.5254 23.8271 -20.3691 39.1963 +c-2.42188 7.68457 -3.69727 15.8086 -2.16016 23.4551s6.58887 14.5977 14.8145 18.8262c1.35547 0.697266 2.11035 1.18848 3.39453 1.85156c-16.3975 -0.672852 -32.9326 -0.200195 -49.6885 1.85156c0.0898438 -0.773438 0.222656 -1.74316 0.308594 -2.46875 +c0.938477 -7.8916 1.80566 -13.5029 0.925781 -19.4443s-3.49902 -11.1875 -8.02441 -17.8994c-6.19434 -9.19336 -8.07324 -11.5186 -15.1221 -27.1592c1.0498 -12.5635 0.612305 -21.4561 -3.08594 -35.1836c-2.66113 -9.87695 -9.99414 -16.7773 -18.5176 -20.0605 +c-8.52441 -3.28223 -18.3906 -3.69531 -28.3936 -3.08594c-20.0049 1.21875 -41.0596 7.24121 -53.084 10.4932c-14.3281 3.875 -32.4893 7.53125 -45.9844 16.0488c-6.74609 4.25879 -12.5879 10.0078 -15.1221 17.9004c-2.53418 7.8916 -1.62402 17.4473 3.08594 27.7764 +c2.21582 4.85742 3.61523 9.59082 5.24707 14.5059c-11.7646 -1.21875 -23.7891 2.1543 -34.874 7.40723c-15.0371 7.12402 -28.708 17.5732 -37.6523 26.541c-16.9932 17.0371 -26.0752 37.417 -29.3203 56.7871c-1.3457 8.02637 -1.64355 13.4229 0.925781 18.5176 +c2.57031 5.0957 6.39062 7.98438 11.7275 13.2715c9.7666 9.66699 19.5557 19.3467 29.3203 29.0107c3.7168 10.0684 7.43652 19.9834 11.1104 29.9365c-1.45996 7.75 -2.71582 15.5537 -3.39453 23.4551c-2.5752 29.9561 -1.63477 52.2598 1.85156 72.8359 +c-7.06445 -1.3877 -14.1357 -1.85742 -20.9863 0c-10.0352 2.7207 -19.417 9.71289 -24.6904 20.6787c-3.66406 7.61719 -5.49414 15.3604 -8.02441 25.6162c-0.166016 0.181641 -0.145508 0.43457 -0.308594 0.617188c-8.98438 10.1016 -12.9639 21.5078 -11.1104 32.4053 +c2.0293 11.9316 8.94238 22.9746 17.5918 32.4053s19.207 17.3682 29.0107 23.4551s18.4688 10.1768 25.6162 11.4189c0.305664 0.0546875 0.806641 0.0996094 1.11719 0.0996094c3.50098 0 6.3418 -2.8418 6.3418 -6.34277 +c0 -0.59668 -0.160156 -1.53906 -0.358398 -2.10254c-2.0957 -5.95605 -4.16895 -11.1006 -6.17285 -16.3564c5.97656 -5.36719 9.9375 -12.3438 10.8027 -19.752c1.08594 -9.29297 -0.512695 -18.5547 -2.16016 -25.9248 +c-0.567383 -2.80762 -3.35254 -5.08594 -6.2168 -5.08594c-1.65137 0 -3.84375 1.03418 -4.89355 2.30859c-2.53125 3.19434 -4.29688 5.9502 -5.86426 8.33301c-0.350586 -4.5166 -0.234375 -9.03125 -1.23438 -13.5791 +c-1.46777 -6.6748 -4.86328 -12.8281 -9.87598 -18.21c0.0449219 -0.113281 0.266602 -0.205078 0.308594 -0.308594c1.02148 0.347656 2.15332 0.520508 4.01172 1.23438c12.7725 4.91797 23.4023 16.6748 34.5664 29.0107 +c12.1777 23.3154 27.4854 44.4033 48.7627 63.2676c52.4414 46.4951 103.299 62.3916 181.472 74.9971c10.165 10.5342 20.5205 20.6084 31.7891 30.5547c15.5195 13.6934 28.2334 17.6885 42.5908 18.8252c24.0635 32.0254 44.5859 56.3652 85.1807 73.4531 +c42.7764 18.0049 79.3984 27.8262 114.502 25.6162zM653.258 715.661l-0.0175781 -0.0947266c-30.4678 1.31543 -63.7598 -8.21582 -105.239 -26.2285c-27.3574 -11.8857 -39.7881 -24.8467 -54.9346 -43.5156c16.4346 0.546875 32.8535 0.899414 49.6875 2.46875 +l0.118164 0.000976562c3.50098 0 6.34277 -2.84082 6.34277 -6.3418c0 -2.50684 -1.92676 -5.19629 -4.2998 -6.00391c-22.7148 -5.27734 -44.6123 -9.57422 -66.9717 -12.9619c-12.415 -1.88184 -20.2637 -2.75195 -26.542 -4.93848s-11.7783 -5.84961 -20.6777 -14.5059 +c-33.5859 -32.6592 -61.7764 -70.0645 -93.2051 -104.004c-17.3027 -18.6816 -25.8164 -37.3545 -36.418 -59.5645c-5.08496 -10.6582 -6.76562 -16.8145 -6.17285 -22.2217c0.59375 -5.40625 3.6543 -11.416 10.4932 -20.6777 +c11.3193 -15.3301 18.7998 -25.209 24.999 -37.6523c14.9805 21.3525 31.6504 40.3223 49.3799 61.7246c1.03809 1.11816 3.12012 2.02539 4.64551 2.02539c3.50098 0 6.3418 -2.8418 6.3418 -6.3418c0 -0.911133 -0.359375 -2.29492 -0.803711 -3.08984 +c-16.4727 -26.3828 -31.2344 -51.1348 -44.75 -77.7744c-8.02148 -15.8193 -10.9658 -23.3076 -11.1104 -38.8867c14.4951 -16.5439 23.0361 -24.6641 35.4922 -28.085c14.8438 -4.07422 28.0928 -3.62695 41.0469 3.08594c34.1846 17.7021 67.8184 40.8906 108.023 45.3682 +c17.8545 33.9492 13.0625 77.5703 5.86426 118.206c-6.26855 35.4141 -4.70508 67.0908 3.70312 102.464c0.335938 3.13574 3.16797 5.68066 6.32129 5.68066c3.50879 0 6.35645 -2.84766 6.35645 -6.35742c0 -0.154297 -0.0107422 -0.404297 -0.0244141 -0.557617 +c2.07422 -33.6377 4.52344 -64.5693 11.1104 -97.2197c9.88672 -48.9844 11.9404 -92.7754 -8.94727 -144.13c-0.871094 -2.20215 -3.49902 -3.99805 -5.86621 -4.00977c-41.6553 -1.00879 -76.7725 -25.4424 -116.35 -45.6768 +c-18.8447 -9.63281 -37.417 -10.7617 -58.0215 -5.86426c-22.2949 5.2998 -38.2383 21.8066 -58.9482 44.4424c-0.875977 0.992188 -1.58594 2.87207 -1.58594 4.19629c0 0.205078 0.0195312 0.537109 0.0429688 0.741211c1.90234 15.918 4.21289 27.4258 9.56738 39.5049 +c-6.91211 19.8311 -15.0508 29.4854 -31.4795 51.541c-10.0273 13.46 -15.9121 23.8389 -16.666 35.4922c-0.753906 11.6523 3.5957 23.0352 11.1104 38.2695c10.6729 21.6436 20.5801 42.1895 37.9619 62.6514c12.4033 14.5977 23.9043 28.2441 35.4922 41.665 +c-52.8975 -9.77246 -89.2002 -24.791 -127.776 -58.6387c-31.4648 -27.6035 -51.2168 -61.9727 -65.4385 -102.158c-8.78906 -24.8672 -11.3369 -49.4189 -7.09082 -91.0371c5.35352 -52.54 33.9834 -113.436 64.501 -157.403 +c0.566406 -0.871094 1.02539 -2.41992 1.02539 -3.45898c0 -0.324219 -0.0478516 -0.844727 -0.107422 -1.16309c-3.82617 -28.0967 -8.69434 -49.3125 -16.666 -69.75c-1.64453 -4.21582 -1.08496 -6.30566 0.308594 -8.6416 +c1.39453 -2.33496 4.33984 -5.1709 8.6416 -7.40625c8.60449 -4.47168 21.1484 -7.16211 29.9365 -9.56738c6.89355 -1.8877 23.2969 -6.34766 37.9609 -8.02441c7.33203 -0.838867 14.1641 -0.951172 18.8262 0s5.99219 2.26758 6.48145 4.01172 +c2.88379 10.3027 2.61621 16.8223 1.85156 28.3936c0.03125 0.918945 0.446289 2.30176 0.925781 3.08691c9.44922 18.8135 12.3916 21.791 18.8252 32.4043c6.78516 11.1953 6.74121 13.2432 6.79004 26.8516c0.0595703 17.6377 -0.482422 49.0117 0.308594 61.417 +c-0.0136719 0.15332 -0.0244141 0.40332 -0.0244141 0.557617c0 3.50879 2.84766 6.35742 6.35645 6.35742c3.1543 0 5.98535 -2.54492 6.32129 -5.68066c2.15332 -9.0957 4.60254 -21.7959 6.79492 -33.9541c33.6865 -5.53027 66.8994 -4.91797 100.606 1.55078 +c0.461914 1.4873 0.780273 3.03906 1.23438 4.62988c2.77637 9.69336 7.68457 18.583 9.87598 26.2324c0.794922 2.40137 3.49219 4.34961 6.02148 4.34961c3.50098 0 6.3418 -2.84082 6.3418 -6.3418c0 -0.131836 -0.0078125 -0.345703 -0.0175781 -0.476562 +c-0.664062 -8.45312 -1.17285 -17.0049 -1.85156 -25.6172c-0.681641 -8.58203 -0.72168 -14.8428 0.305664 -23.1494c0.602539 -4.78906 1.25391 -9.62891 1.85645 -14.4775c0.0576172 -0.314453 0.104492 -0.827148 0.104492 -1.14648 +c0 -3.50098 -2.84082 -6.3418 -6.3418 -6.3418c-2.01953 0 -4.47949 1.41895 -5.49023 3.16699c-1.22949 2.00293 -3.65332 5.21973 -5.86426 8.02441c-13.0713 -8.61328 -22.3018 -15.1963 -36.7266 -22.8379c-2.4707 -1.30957 -3.08984 -2.58496 -3.39453 -5.55566 +c-0.305664 -2.9707 0.506836 -7.55176 2.16016 -12.3447c3.30664 -9.58691 9.4668 -20.0615 12.9619 -25.6162c7.76953 -12.3477 16.3125 -25.4814 25.3076 -33.0234c8.99512 -7.54297 16.8682 -10.2881 29.3203 -3.7041c6.79199 3.59082 12.5156 13.9443 19.4434 23.1475 +c0.40332 0.619141 1.2334 1.44824 1.85156 1.85156c1.20508 0.711914 5.62695 4.03516 11.1104 8.33301c5.48438 4.29688 12.2061 9.79199 18.8262 15.1221s13.4023 10.5469 18.8252 14.8145c5.42383 4.26758 9.08496 7.24902 12.0371 8.9502 +c-0.0498047 -0.0292969 1.62793 1.10254 3.39551 3.08594c1.7666 1.9834 3.80371 4.82324 6.17188 8.02441c4.7373 6.40332 10.3564 14.5498 15.7402 23.1475c5.38477 8.59668 10.3838 17.7178 14.5059 25.3076c4.12305 7.58887 7.21777 14.0596 8.02441 16.665 +c9.8877 31.9385 20.626 56.1592 24.3818 87.3418c-20.5381 9.60645 -33.3418 21.0713 -48.7627 39.1963c-0.975586 1.01562 -1.76758 2.9834 -1.76758 4.3916c0 3.50098 2.8418 6.34277 6.34277 6.34277c1.26953 0 3.0918 -0.661133 4.06641 -1.47559 +c22.8027 -16.8809 41.9824 -25.8535 66.6631 -33.6396c0.78418 -0.261719 1.89453 -0.947266 2.47949 -1.53125c9.12305 -8.0625 18.4375 -16.1064 28.085 -24.6904c7.53906 -6.70703 14.3145 -12.585 21.6035 -16.9746c-1.06055 1.08496 -2.57129 1.85352 -3.39453 3.08594 +c-3.68164 5.51758 -4.7959 11.8223 -4.93848 18.21c-0.28418 12.7744 3.57422 26.2871 6.48145 36.1084c3.20215 10.8242 2.32129 23.0352 -0.308594 34.874c-0.0576172 0.313477 -0.104492 0.826172 -0.104492 1.14453c0 0.642578 0.185547 1.65039 0.413086 2.25098 +c-0.540039 -0.350586 -1.84863 -0.953125 -2.16016 -1.23438c-0.956055 -0.864258 -1.7959 -2.05762 -3.39551 -5.55566c-3.15234 -6.90137 -6.76172 -15.6436 -9.56641 -23.1475c-0.958984 -1.96875 -3.51367 -3.56641 -5.70312 -3.56641 +c-3.50098 0 -6.3418 2.84082 -6.3418 6.3418l0.0078125 0.310547c1.08105 6.85254 2.67871 15.1133 3.70312 21.6045c1.13965 7.23145 1.89648 12.877 5.86426 17.5908c3.96582 4.71387 9.94727 6.4248 17.5908 7.71582c4.95215 0.834961 14.5518 3.0293 20.3691 4.01172 +c0.196289 0.0224609 0.514648 0.0400391 0.711914 0.0400391c3.50098 0 6.3418 -2.84082 6.3418 -6.3418c0 -1.96289 -1.35938 -4.38672 -3.03418 -5.41113c-5.23242 -2.84766 -12.6621 -5.90723 -17.5908 -8.33301c0.735352 -0.110352 1.8418 -0.525391 2.46875 -0.925781 +c10.293 -6.4834 17.876 -11.8877 28.3936 -15.4307c53.627 -18.0664 115.269 -35.1631 166.658 -6.48145c39.8955 22.2734 62.8408 72.7588 67.8975 119.44c4.49023 41.4697 -3.70508 108.62 -20.6787 149.681c-0.587891 1.42188 -3.04492 3.30469 -4.62891 5.24707 +c-7.74414 -22.5723 -21.7305 -42.1416 -47.2197 -51.2324c-7.67285 -2.7334 -14.7539 -2.81055 -20.9863 -1.54297c-4.11426 0.836914 -8.08301 2.10742 -12.0371 3.39551c-0.193359 -1.59863 -1.12793 -2.20508 -0.617188 -4.93848 +c3.62891 -19.4287 4.93945 -41.3262 0.617188 -60.1826c-3.78223 -16.5029 -7.0498 -40.3711 -17.9004 -54.3174c-1.05078 -1.33496 -3.2832 -2.41797 -4.98145 -2.41797c-3.50098 0 -6.3418 2.8418 -6.3418 6.3418c0 0.458008 0.0957031 1.18848 0.212891 1.63086 +c2.36328 8.62891 7.17383 33.8711 8.33301 49.9971c0.490234 6.81055 -0.704102 15.8564 -1.85156 24.6904c-0.599609 -0.0136719 -5.00293 -1.72559 -8.6416 -4.62891c-3.63965 -2.9043 -6.95312 -6.77832 -7.71582 -8.33301 +c-8.02344 -16.3574 -8.27637 -32.957 -18.8252 -51.2324c-0.967773 -1.94336 -3.51367 -3.52148 -5.68555 -3.52148c-3.50488 0 -6.34863 2.84473 -6.34863 6.34961c0 0.791016 0.275391 2.0127 0.615234 2.72754c3.48926 8.37695 4.1875 16.5615 4.9375 25.6162 +c0.750977 9.05469 1.66699 18.9561 5.55566 29.9365c0.285156 0.804688 0.885742 1.39062 1.23438 2.16016c-5.05469 -2.79102 -8.99707 -6.32422 -12.0371 -11.4189c-4.51562 -7.56738 -8.27637 -18.0693 -16.9746 -28.7012 +c-1.0498 -1.39941 -3.32227 -2.53516 -5.07227 -2.53516c-3.50098 0 -6.3418 2.84082 -6.3418 6.3418c0 0.979492 0.412109 2.4541 0.920898 3.29102c7.16895 13.1729 8.64062 24.1924 13.2715 34.5664c4.62988 10.374 13.5928 19.0684 31.4795 23.1475 +c4.38086 1 8.54492 1.3457 12.6533 1.54297c-8.3291 0.0292969 -16.5889 -0.166992 -25.6162 -1.54297c-0.201172 -0.0234375 -0.529297 -0.0419922 -0.731445 -0.0419922c-3.50098 0 -6.3418 2.84082 -6.3418 6.3418c0 2.24023 1.65137 4.82031 3.68555 5.75879 +c1.25586 0.545898 2.45215 1.02148 3.70312 1.54297c-1.89062 4.44727 -3.2666 9.11035 -2.77734 14.1973c0.0429688 0.444336 0.246094 0.794922 0.308594 1.23438h-0.308594c-3.43164 0.125 -6.65234 0.536133 -9.56738 1.54297 +c-2.11523 0.911133 -3.83203 3.52051 -3.83203 5.82422c0 2.85547 2.26953 5.63867 5.06641 6.21289c5.63184 0.914062 16.0068 4.42578 22.2207 7.40723c0.115234 0.0703125 0.193359 0.239258 0.30957 0.308594c0.0585938 0.0283203 0.241211 -0.0302734 0.308594 0 +c0.219727 0.0966797 0.628906 0.220703 0.925781 0.308594c0.0898438 0.0263672 0.211914 -0.0253906 0.308594 0c4.95996 2.62891 10.6621 4.28027 16.665 3.70312c1.25977 -0.121094 2.68652 -0.665039 4.0127 -0.925781 +c-4.41113 7.75488 -8.49316 15.6328 -13.8877 23.1475c-7.69141 10.7188 -12.7764 13.4766 -24.998 20.6787c-2.22852 1.31348 -4.57031 2.91211 -6.79004 4.32031c-8.7002 1.56738 -17.7686 2.86133 -24.6895 1.54297 +c-0.30957 -0.0556641 -0.816406 -0.101562 -1.13086 -0.101562c-3.5 0 -6.3418 2.8418 -6.3418 6.3418c0 2.27637 1.68848 4.87305 3.76855 5.79688c2.70898 1.06348 4.94629 1.13965 7.40723 1.85156c-13.3008 10.4248 -25.7754 21.123 -39.1963 32.4053 +c-32.1797 27.0518 -60.5977 39.1152 -91.0449 40.4307zM670.831 613.103c0.266602 0.0419922 0.697266 0.0751953 0.964844 0.0751953c3.50098 0 6.3418 -2.84082 6.3418 -6.3418c0 -2.60742 -2.02734 -5.33008 -4.52539 -6.07617 +c-32.8428 -15.7637 -40.2354 -34.1875 -45.0596 -55.5527c-0.683594 -2.61719 -3.43262 -4.74023 -6.13672 -4.74023c-2.84668 0 -5.62793 2.26172 -6.20801 5.04883c-3.09766 15.5547 -2.61621 29.9658 5.86328 41.665s23.7305 19.7344 47.2197 25.6162 +c0.414062 0.137695 1.10449 0.274414 1.54004 0.305664zM535.346 610.636c0.130859 0.00976562 0.344727 0.0175781 0.476562 0.0175781c3.50098 0 6.3418 -2.84082 6.3418 -6.3418c0 -2.5293 -1.94824 -5.22656 -4.34961 -6.02148 +c-15.835 -6.17871 -30.2998 -10.8633 -45.6768 -14.8135c-13.5664 -17.7275 -21.001 -26.4873 -24.0732 -49.9971c-0.635742 -2.69727 -3.40137 -4.88574 -6.17188 -4.88574c-2.77148 0 -5.53613 2.18848 -6.17285 4.88574 +c-1.81641 11.6318 -2.63574 18.8945 -2.16016 26.2324c-4.91992 -7.50195 -10.1318 -16.8164 -15.1221 -27.4678c-7.94629 -16.9609 -14.9561 -34.501 -19.1348 -44.1338c-0.797852 -2.39453 -3.49414 -4.33789 -6.01855 -4.33789 +c-3.50195 0 -6.34375 2.84277 -6.34375 6.34473c0 0.567383 0.145508 1.4668 0.325195 2.00586c2.65332 11.6016 7.94629 31.2734 14.8145 50.6143c6.86719 19.3408 14.7988 38.0645 24.998 48.1455c5.68457 5.62109 9.64941 8.87891 14.8135 10.8027 +c5.16504 1.92285 10.2285 2.05176 17.9004 2.77734c18.3809 1.74219 36.8193 3.78125 55.2451 5.86426c0.0820312 0.0878906 0.219727 0.225586 0.308594 0.308594zM949.21 598.908c-1.14551 -0.0449219 -2.19141 -0.0644531 -3.39551 -1.23535 +c-9.42188 -9.16309 -17.1289 -23.542 -29.9365 -33.6396c-4.69434 -3.7002 -9.9668 -6.19531 -14.8135 -8.02441c1.89746 0.498047 3.53418 0.0830078 5.86328 1.23535c3.45703 1.70996 5.79199 4.73047 8.9502 6.78906c13.8125 9.00391 25.2061 20.6562 33.332 34.875z +M729.468 557.552l-0.00976562 -0.0185547l0.141602 0.00195312c3.50098 0 6.3418 -2.8418 6.3418 -6.34277c0 -1.58691 -0.96875 -3.72363 -2.16211 -4.76953c-3.18555 -2.89355 -7.12109 -4.79199 -10.8027 -7.09863c4.58301 -3.39746 8.79004 -7.43652 11.4268 -12.957 +c0.857422 -1.79883 1.00586 -3.70508 1.54297 -5.55566c8.22363 2.09961 16.3193 4.11523 23.4561 4.0127c0.225586 0.0292969 0.594727 0.0527344 0.823242 0.0527344c3.5293 0 6.39355 -2.86426 6.39355 -6.39453c0 -2.99805 -2.40137 -5.8252 -5.36035 -6.30957 +c-28.2754 -7.94043 -59.1777 -26.626 -79.9365 -51.2275c-1.04688 -1.20508 -3.19238 -2.18359 -4.78906 -2.18359c-3.50098 0 -6.3418 2.84082 -6.3418 6.3418c0 0.570312 0.146484 1.47363 0.328125 2.01465c1.9502 5.36816 5.0752 9.69238 8.02441 14.1963 +c-4.55957 3.41602 -8.78027 7.43555 -11.4189 12.9629c-0.875977 1.83691 -0.661133 3.94141 -1.23438 5.86328c-5.47461 -3.98047 -10.8662 -8.31348 -17.2832 -10.8018c-0.532227 -0.174805 -1.41992 -0.317383 -1.98047 -0.317383 +c-3.50098 0 -6.3418 2.84082 -6.3418 6.3418c0 1.44336 0.825195 3.44531 1.8418 4.46875c4.91797 4.38477 11.7324 12.9668 18.5176 21.3027c6.78516 8.3291 13.2949 16.5156 20.3691 21.2949c7.61328 5.14453 16.1953 7.07617 24.0723 8.64062 +c7.87891 1.56543 15.1914 2.89844 21.6045 5.86426c0.714844 0.34082 1.9375 0.617188 2.72949 0.617188h0.0478516zM76.1006 530.681c3.40039 -0.0957031 6.15918 -2.93555 6.15918 -6.33691c0 -1.44141 -0.823242 -3.44141 -1.83789 -4.46484 +c-31.002 -32.8379 -38.4307 -49.2812 -42.2832 -92.9033c-0.636719 -2.69727 -3.40137 -4.88574 -6.17285 -4.88574c-2.77051 0 -5.53613 2.18848 -6.17188 4.88574c-1.16504 12.3086 -1.35352 22.0371 -0.925781 31.1699 +c-0.765625 -0.402344 -2.08887 -0.729492 -2.95312 -0.729492c-3.14648 0 -5.97168 2.53906 -6.30566 5.66797c-0.945312 12.3369 -1.23047 21.1318 2.46875 29.0107s10.4883 13.5596 20.6787 20.6787c0.911133 0.648438 2.55859 1.17578 3.67773 1.17578 +c2.08789 0 4.58887 -1.49219 5.58008 -3.3291c6.62891 6.11035 14.4795 12.0654 24.0732 18.8252c0.926758 0.68457 2.61426 1.24023 3.76562 1.24023zM847.358 527.288c2.44824 -0.108398 4.91504 -0.0595703 7.40723 -0.308594 +c0.194336 -0.916016 0.424805 -1.85449 0.617188 -2.77734c-2.64355 1.22559 -5.24609 2.76172 -8.02441 3.08594zM103.26 482.234v-0.00585938c-5.55664 -4.98633 -10.9277 -10.7256 -14.8145 -16.665c-3.88574 -5.93945 -6.25293 -11.9336 -6.48047 -17.2832 +c-0.227539 -5.34277 1.37598 -10.4492 6.48145 -15.7324c0.228516 0.279297 0.643555 0.691406 0.924805 0.917969c8.17676 6.53125 9.93652 12.5518 10.8027 20.9873c0.780273 7.59375 0.714844 17.4111 3.08594 27.7812zM131.036 409.394 +c-2.10547 -1.12012 -3.56348 -2.78223 -5.86426 -3.7041c-5.49902 -2.20312 -10.0059 -3.71582 -14.1973 -4.01172s-8.41797 1.18262 -11.4189 3.70312c-1.0459 0.878906 -1.34961 2.10547 -2.16016 3.08691c0.28125 -0.634766 0.314453 -1.5293 0.617188 -2.16113 +c2.73438 -5.70703 6.1748 -7.29199 12.3457 -7.40625c5.37012 -0.100586 12.2441 2.22949 18.5176 4.62891c0.0693359 0.220703 0.240234 0.40332 0.308594 0.617188c0.576172 1.82031 1.24902 3.46387 1.85156 5.24707zM778.221 253.846 +c-3.05273 -3.31348 -7.05664 -6.00977 -11.415 -8.03125c0.275391 -0.563477 0.549805 -1.52832 0.612305 -2.15234c4.20703 3.0498 7.81152 6.33203 10.8027 10.1836zM137.518 235.628c-0.115234 -0.307617 -0.193359 -0.616211 -0.308594 -0.924805 +c-0.22168 -0.665039 -0.774414 -1.63281 -1.23438 -2.16016c-9.55371 -9.67383 -19.1592 -19.3506 -28.7021 -29.0117c-3.66797 -3.71777 -5.31543 -5.66992 -5.55469 -6.17188c-0.240234 -0.501953 -0.669922 -1.39062 0 -6.17285 +c1.69922 -12.0938 9.46582 -26.1992 20.9863 -37.9609c5.00195 -5.10742 17.3477 -15.1123 29.3193 -20.9873c5.98535 -2.93652 11.8779 -4.85059 16.3574 -4.9375c4.47852 -0.0869141 7.27539 0.841797 9.87598 4.32031c2.09375 2.80469 3.15234 6.95215 4.32031 11.4189 +c-18.0156 27.6768 -33.6807 59.5273 -45.0596 92.5879zM650.765 207.235c-4.00391 -11.874 -7.99512 -23.3838 -12.0361 -36.1084c-3.3623 -10.5898 -12.4316 -28.5879 -23.1475 -46.2939c-8.06055 -13.3213 -16.6367 -25.0176 -24.998 -33.9492 +c3.00684 -0.675781 3.83301 -1.33008 9.87598 -1.85156c3.32227 -0.287109 13.2881 -0.489258 23.1475 -0.617188c9.8584 -0.12793 19.6777 0.0703125 23.7637 0c8.54883 -0.149414 13.3877 0.329102 15.1221 1.54297s3.49609 4.29297 4.32031 13.5791 +c0.833984 9.40039 0.78418 7.95215 -4.01172 16.3574c-0.4375 0.706055 -0.852539 1.9502 -0.925781 2.77734c-0.432617 15.2373 -0.806641 30.4707 -1.23438 45.6768c-0.384766 13.6592 -2.72168 20.6484 -8.33301 33.9482 +c-0.756836 1.79395 -0.929688 3.21387 -1.54297 4.93848z" /> + <glyph glyph-name="uniF13B" unicode="" horiz-adv-x="806" +d="M98.2988 41.29l47.9961 0.00292969c37.9473 0 70.8047 -5.63965 70.8047 -49.1855c-2.48438 -47.4668 -35.3027 -47.9961 -35.3027 -47.9961l45.6162 -45.6162h-57.5166l-34.1123 34.1133v-38.2783h-37.4854v146.96zM137.568 1.42773v-26.1797h32.3281v26.1797h-32.3281z +M299.808 40.6904c2.93164 -0.0195312 5.63184 0.000976562 8.13086 0.000976562c19.9971 0 57.3184 -1.31445 57.3184 -34.9062v-107.1h-38.6748v24.3945h-37.2861v-24.9902h-38.4766v102.141c0 38.6729 28.4658 40.5752 48.9883 40.46zM289.891 3.80078v-40.2617h36.0957 +v40.2617h-36.0957zM403.798 40.5996h39.8125v-140.59h-39.8125v140.59zM485.298 38.7305l39.1924 0.625v-103.891h56.6084v-37.3252h-95.8008v140.591zM707.998 39.9805v-37.9473h-64.0742v-13.6865h27.3721c14.3076 0 44.168 0.62207 44.168 -44.168 +s-20.5293 -47.2773 -62.208 -47.2773h-50.3887v34.2139h57.8535c17.418 0 18.3789 5.66992 18.3789 10.6104c0 4.94141 -8.90527 7.23926 -27.0166 7.23926s-51.7041 8.89941 -51.7041 43.7363s17.418 47.9004 52.2549 47.9004s55.3643 -0.621094 55.3643 -0.621094z +M133.198 82.9004l-0.00585938 -0.00683594s-8.70898 54.7402 12.4424 159.25c21.1475 104.511 52.251 174.188 105.75 273.721c53.5 99.5381 139.34 181.651 263.76 192.85c124.421 11.1973 222.71 -88.3359 222.71 -88.3359l-14.9297 -22.3945 +s-37.3213 42.3018 -105.75 34.8369c-68.4297 -7.4707 -189.11 -77.1406 -207.77 -230.17c-18.6631 -153.03 54.7422 -319.75 54.7422 -319.75h-330.949zM67.2568 249.62l64.6973 -4.97656l-11.1982 -64.6963l-60.9639 7.46484zM169.277 386.48l-58.4756 18.6611 +l18.6621 52.2549l57.2324 -22.3945zM250.147 553.19l-44.79 29.8594l34.8359 38.5693l43.5469 -28.6162zM338.488 707.47l41.0566 21.1504l29.8604 -33.5918l-41.0576 -23.6396zM484.048 748.527l53.499 -2.48926l4.97656 -32.3477l-51.0107 -1.24414zM656.988 709.958 +l41.0576 -29.8594l-7.46484 -11.1973l-34.8379 18.6611zM649.527 614.16l33.5928 -7.46484v-14.9297l-33.5928 3.73242v18.6621zM542.527 597.98l34.8369 8.70898l4.97656 -19.9072l-23.6387 -18.6621zM491.518 559.41l24.8828 -37.3252l-14.9297 -26.1279l-36.0811 39.8125 +zM441.748 456.15l36.0811 -27.3721l-9.95312 -41.0576l-42.3018 36.0811zM424.328 342.93l47.2783 -24.8838l2.48828 -41.0566l-52.2549 22.3945zM439.258 188.65l54.7441 -0.000976562l23.6387 -48.5215l-65.9404 3.73242zM197.758 800l0.00292969 0.00683594h582.5 +h9.37988l-0.00976562 -9.37988v-672.81c0 -110.28 8.79297 -187.57 -12.8125 -240.94c-10.8027 -26.6836 -30.3203 -46.6836 -60.625 -59.0615c-30.3037 -12.3789 -71.1855 -17.8125 -127.5 -17.8125c-222.84 0 -562.5 2.1875 -562.5 2.1875h-9.6875l0.3125 9.6875 +s1.25 236.74 1.25 477.5c0 232.93 -10.3135 357.317 6.875 427.81c8.59473 35.2461 26.1123 57.7988 54.374 69.375c28.2656 11.5762 65.8604 13.4375 118.44 13.4375zM197.761 780.945l-0.00195312 -0.00488281c-52.0498 0 -88.0254 -2.36328 -111.25 -11.876 +c-23.2246 -9.51172 -35.3857 -24.8232 -43.125 -56.5615c-15.4785 -63.4805 -6.25 -189.66 -6.25 -423.12c0 -235.96 -1.50391 -458.811 -1.55469 -468.12c11.0098 -0.0693359 334.109 -2.1875 553.12 -2.1875c55.0742 0 93.8516 5.44141 120.31 16.25 +c26.458 10.8076 41.1279 26.0625 50.3115 48.75c18.3691 45.3701 11.25 122.569 11.25 233.75v663.12h-572.81z" /> + <glyph glyph-name="uniF13C" unicode="" horiz-adv-x="666" +d="M344.96 340.416c12.7607 -3.03027 22.2705 -14.3604 22.2705 -27.9307v-483.704c0 -15.9609 -12.96 -28.7812 -28.8408 -28.7812h-228.657c-15.8203 0 -28.8408 12.8203 -28.8408 28.7812v483.704c0 15.8604 13.0205 28.751 28.8408 28.751h199.547v102.733 +c-7.95117 5.62988 -13.2207 14.9404 -13.2207 25.5205c0 17.1299 13.9404 31.1904 31.1904 31.1904c17.1309 0 31.1914 -14.0703 31.1914 -31.1904c0 -10.6504 -5.35059 -19.9609 -13.4805 -25.5908v-103.483zM323.089 81.8486v170.705 +c0 15.9502 -12.96 28.8408 -28.7803 28.8408h-145.125c-15.9502 0 -28.8408 -12.8906 -28.8408 -28.8408v-170.705c0 -15.8203 12.8906 -28.8408 28.8408 -28.8408h145.125c15.8203 0 28.7803 13.0205 28.7803 28.8408zM616.188 481.73 +c-0.390625 156.354 -126.694 282.688 -283.079 283.019v0c-156.255 -0.330078 -282.688 -126.664 -283.078 -283.019v0c0 -9.7002 -7.75 -17.6807 -17.5811 -17.6807v0c-9.63965 0 -17.4502 7.98047 -17.4502 17.6807v0c0 175.655 142.454 318.27 318.109 318.27v0 +c175.796 0 318.31 -142.614 318.31 -318.27v0c0 -9.7002 -7.94043 -17.6807 -17.6504 -17.6807v0c-9.7002 0 -17.5801 7.98047 -17.5801 17.6807v0zM524.846 481.73c-0.320312 105.993 -85.7432 191.476 -191.736 191.576v0 +c-105.863 -0.100586 -191.605 -85.583 -191.806 -191.576v0c0 -9.7002 -7.75 -17.6807 -17.5107 -17.6807v0c-9.7002 0 -17.5801 7.9707 -17.5801 17.6807v0c0 125.233 101.562 226.697 226.896 227.057v0c125.404 -0.359375 226.896 -101.823 226.896 -227.057v0 +c0 -9.7002 -7.87988 -17.6807 -17.5801 -17.6807v0c-9.7002 0 -17.5801 7.98047 -17.5801 17.6807v0zM445.223 481.73c-0.139648 61.9121 -50.2012 111.953 -112.113 112.113v0c-61.7812 -0.160156 -112.053 -50.2012 -112.173 -112.113v0 +c0 -9.7002 -7.88086 -17.6807 -17.5811 -17.6807v0c-9.7002 0 -17.5801 7.9707 -17.5801 17.6807v0c0 81.4521 66.0215 147.234 147.334 147.364v0c81.3125 -0.129883 147.135 -65.9219 147.335 -147.364v0c0 -9.7002 -7.81055 -17.6807 -17.5811 -17.6807v0 +c-9.75977 0 -17.6406 7.98047 -17.6406 17.6807v0z" /> + <glyph glyph-name="uniF13D" unicode="" horiz-adv-x="830" +d="M79.0615 798.125v0.00390625h82.8184h591.24c34 0 61.8799 -28.0625 61.8799 -59.0625v-0.9375c0 -2 -0.94043 -5.1875 -0.94043 -7.1875l-65.9395 -605c1.01953 -23.9893 -12.0703 -46.8193 -34.0605 -57.8193l-268.119 -132.181 +c-9 -3.98926 -17.8809 -5.93945 -26.8809 -5.93945s-18.1797 1.95996 -27.1797 5.93945l-268.76 132.181c-11.9951 6 -22.1201 14.8896 -28.1201 26.8799c-5 7.00977 -8.06152 15.0596 -9.06152 24.0596l-67.8135 610.001c0 2 -3.125 4.875 -3.125 6.875v0.9375 +c0 33 30.0615 61.25 64.0615 61.25zM296.882 600.009c-36.25 0 -62.7598 -6.33008 -79.3799 -18.75c-16.6299 -12.2803 -25 -31.8301 -25 -59.0596v-43.4404c0 -21.1602 -4.45996 -35.8799 -13.4404 -44.0596c-8.97949 -8.19043 -25.1396 -12.1904 -48.75 -12.1904h-15.3096 +v-47.1895h15.3096c23.6104 0 39.7705 -4.16992 48.75 -12.5c8.98047 -8.18066 13.4404 -22.9004 13.4404 -44.0605v-40.6299c0 -27.2295 8.37012 -46.9502 25 -59.3701c16.6201 -12.4199 43.1299 -18.75 79.3799 -18.75h54.0605v47.5h-17.1904 +c-23.4404 0 -38.79 3.16992 -45.9404 9.37988c-6.97949 6.06055 -10.3096 19.1904 -10.3096 39.3701v35.3105c0 22.0098 -3.76953 37.7998 -11.25 47.8193c-7.32031 10.0107 -20.2998 17.1201 -38.75 20.9307c18.29 3.5293 31.2695 10.2998 38.75 20.3096 +c7.48047 10.0195 11.25 25.9805 11.25 48.1299v35.3105c0 20.04 3.33008 33 10.3096 39.0596c7.15039 6.20996 22.5 9.37988 45.9404 9.37988h17.1904v47.5h-54.0605zM479.062 600.009v-47.5h17.5c23.2803 0 38.3301 -3.16992 45.3203 -9.37988 +c7.13965 -6.05957 10.6201 -19.0195 10.6201 -39.0596v-35.3105c0 -22.1494 3.76953 -38.1104 11.25 -48.1299c7.48047 -10.0098 20.6104 -16.7803 39.0596 -20.3096c-18.4492 -3.81055 -31.5791 -10.9199 -39.0596 -20.9307 +c-7.48047 -10.0195 -11.25 -25.8096 -11.25 -47.8193v-35.3105c0 -20.1797 -3.48047 -33.3096 -10.6201 -39.3701c-6.99023 -6.20996 -22.04 -9.37988 -45.3203 -9.37988h-17.5v-47.5h54.0605c36.25 0 62.75 6.33008 79.3799 18.75c16.6201 12.4199 25 32.1406 25 59.3701 +v40.6299c0 21.1602 4.45996 35.8799 13.4395 44.0605c8.9707 8.33008 25.1406 12.5 48.75 12.5h15.3105v47.1895h-15.3105c-23.6094 0 -39.7793 4 -48.749 12.1904c-8.98047 8.17969 -13.4404 22.8994 -13.4404 44.0596v43.4404c0 27.2295 -8.37988 46.7793 -25 59.0596 +c-16.6299 12.4199 -43.1299 18.75 -79.3799 18.75h-54.0605z" /> + <glyph glyph-name="uniF13E" unicode="" horiz-adv-x="790" +d="M224.192 800.005c0.925781 0.03125 1.84863 0.0322266 2.77148 -0.000976562c-1.51855 0.0507812 8.41309 -1.04199 6.91895 -0.744141c-1.49316 0.298828 8.35352 -2.52344 6.91895 -1.98438c-1.43359 0.541016 7.79883 -3.74414 6.45801 -2.97656 +c-1.12207 0.642578 3.87598 -2.49023 5.07422 -3.22461c0.233398 -0.142578 1.12012 -0.904297 0.921875 -0.744141c167.295 -126.589 334.566 -253.211 501.861 -379.794c0.139648 -0.104492 0.322266 -0.142578 0.461914 -0.24707 +c0.137695 -0.201172 5.01953 -4.55078 4.15137 -3.72168c-0.950195 0.907227 4.98535 -5.49512 4.15137 -4.46484c-0.834961 1.03027 4.16504 -6.09668 3.45898 -4.96191c-0.705078 1.13672 3.56348 -6.67969 2.99902 -5.45703 +c-0.56543 1.22363 2.7207 -7.24414 2.30566 -5.95312s1.87402 -7.29102 1.61426 -5.9541c-0.258789 1.33789 0.791016 -7.81152 0.692383 -6.44922s0.164062 -7.56641 0.229492 -6.20215c0.0644531 1.36523 -0.915039 -7.54688 -0.691406 -6.20117 +c0.224609 1.34473 -1.76562 -7.50488 -1.38379 -6.20117c0.381836 1.30273 -2.83887 -7.19336 -2.30664 -5.95312c0.533203 1.23828 -3.44336 -6.61523 -2.76758 -5.45898s-4.2666 -6.26367 -3.45996 -5.20898c0.807617 1.05371 -4.8457 -5.64844 -3.91992 -4.71387 +c0.924805 0.936523 -5.64258 -4.76953 -4.61328 -3.96973c1.0293 0.801758 -5.95898 -3.875 -4.84277 -3.22461l-0.230469 -0.245117c-222.721 -130.073 -445.435 -260.146 -668.153 -390.212c1.25488 0.728516 -7.33398 -3.25879 -5.99609 -2.72852 +c1.33887 0.527344 -7.62207 -2.2998 -6.22754 -1.98438c1.39551 0.316406 -8.11133 -1.09375 -6.68848 -0.992188c1.42969 0.12207 -7.87891 0.121094 -6.45703 0.00195312c1.42188 -0.121094 -8.0791 1.33203 -6.68848 0.992188 +c1.3916 -0.338867 -7.55859 2.78125 -6.22656 2.23242s-7.24219 3.72266 -5.99707 2.97656c1.24512 -0.748047 -6.66797 4.65234 -5.53516 3.7207s-5.84082 5.81055 -4.84277 4.71387c0.99707 -1.09668 -5.22363 6.69434 -4.38281 5.45801 +c0.841797 -1.23828 -4.12695 7.30762 -3.45898 5.95312s-3.24902 8.1416 -2.76758 6.69824c0.480469 -1.44434 -1.89844 8.2002 -1.61426 6.69727c0.28418 -1.50391 -1.00488 8.72559 -0.922852 7.19434c0.0810547 -1.53223 0.123047 8.47461 0 6.94531 +c-0.123047 -1.52832 1.47852 8.43945 1.15234 6.94531c26.2939 122.797 52.585 245.587 78.8779 368.383l85.7959 402.115c-0.0234375 -0.118164 0.22168 0.488281 0.230469 0.496094c0.113281 0.112305 2.07129 7.52539 1.61426 6.20117 +c-0.495117 -1.43652 3.44922 7.79492 2.76758 6.44922c-0.680664 -1.34375 4.3125 7.18164 3.45996 5.9541s5.38965 6.54004 4.38184 5.45801c-1.00684 -1.08398 6.21484 5.63086 5.07422 4.71289s6.78613 4.45312 5.53516 3.7207s7.33203 3.50977 5.99609 2.97754 +c-1.13965 -0.456055 4.26465 1.34082 5.30469 1.73535c0.178711 0.0683594 1.12695 0.298828 0.922852 0.248047c0.774414 -0.0351562 9.8623 1.07422 8.07227 0.993164z" /> + <glyph glyph-name="uniF13F" unicode="" +d="M394.607 785.066c139.05 34.8477 293.013 6.49902 409.312 -77.7617c143.987 -100.167 227.351 -280.787 208.413 -455.362c-8.625 -70.7002 -56.3633 -136.812 -123.926 -161.8c-46.6123 -19.3877 -97.8242 -17.25 -147.237 -17.4746 +c118.101 113.5 125.275 319 13.6748 439.225c-87.9619 103.987 -243.149 135.362 -367.524 83.3623c-82.6875 48.8623 -188.463 50.2002 -273.175 5.27539c71.4854 88.5156 168.637 158.325 280.462 184.537v-0.000976562zM435.282 552.338 +c62.2988 16.6943 130.2 15.3506 188.913 -12.8867c99.9473 -45.3799 166.062 -156.862 152.612 -266.675c-6.27441 -75.0723 -50.3096 -141.075 -107.567 -187.688c-47.5127 22.2002 -70.375 71.6123 -91.3252 116.425c-54.9004 114.062 -60.8496 249.65 -142.633 350.824z +M92.0742 481.638c53.8945 53.8945 134.8 71.7109 208.524 58.7139c-63.7559 -60.8428 -106.109 -145.325 -105.886 -234.513c-3.92188 -111.825 57.3682 -221.525 152.612 -279.338c91.8799 -57.5938 211.438 -60.0586 309.037 -15.3506 +c86.3906 -25.5479 177.713 -23.1943 265 -3.1377c-70.1494 -94.4629 -172.225 -165.612 -287.074 -193.513c-141.976 -35.75 -299.062 -4.4873 -416.038 83.7002c-127.737 92.7744 -206.625 249.425 -203.037 407.524c-3.25 66.5508 31.1494 129.75 76.8662 175.913 +h-0.00488281zM256.107 249.7c-22.0732 100.171 25.3223 206.287 106.559 266.225c62.0752 -38.8809 87.1738 -110.929 113.17 -175.575c-39.7773 -83.9248 -90.8711 -163.037 -118.884 -252.225c-49.75 41.2334 -89.415 96.9229 -100.845 161.575zM424.521 50.25 +c-5.71484 84.3721 37.4248 160 68.7969 235.3c25.6592 -82.1318 41.7939 -172.438 101.629 -238.212c-56.1357 -14.6787 -114.85 -13.4463 -170.426 2.91211z" /> + <glyph glyph-name="uniF140" unicode="" horiz-adv-x="480" +d="M318.654 92.9746h54.5039c3.3125 0 6.29102 2.99512 6.29102 6.32617v54.0977c0 3.71777 -2.99609 6.36133 -6.29102 6.36133h-54.5029c-3.31348 0 -6.29102 -2.64355 -6.29102 -6.36133v-54.0977c0 -3.33105 2.99512 -6.32617 6.29004 -6.32617zM167.145 92.9746 +c3.7002 0 6.34375 2.99512 6.34375 6.32617v54.0977c0 3.71777 -2.64355 6.36133 -6.34375 6.36133h-54.1162c-3.33008 0 -6.30859 -2.64355 -6.30859 -6.36133v-54.0977c0 -3.33105 2.97852 -6.32617 6.30859 -6.32617h54.1162zM215.991 191.003h54.1514 +c3.33008 0 6.32617 2.67871 6.32617 6.29102v54.1689c0 3.3125 -2.99609 6.29102 -6.32617 6.29102h-54.1514c-3.3125 0 -6.29102 -2.99609 -6.29102 -6.29102v-54.1689c0 -3.6123 2.97852 -6.29102 6.29102 -6.29102zM167.145 -102.344 +c3.7002 0 6.34375 2.64355 6.34375 6.29102v54.1689c0 3.27734 -2.64355 6.29102 -6.34375 6.29102h-54.1162c-3.33008 0 -6.30859 -3.03125 -6.30859 -6.29102v-54.1689c0 -3.64746 2.97852 -6.29102 6.30859 -6.29102h54.1162zM173.488 251.48 +c0 3.3125 -2.64355 6.29102 -6.34375 6.29102h-54.1162c-3.33008 0 -6.30859 -2.99609 -6.30859 -6.29102v-54.1689c0 -3.6123 2.97852 -6.29102 6.30859 -6.29102h54.1162c3.7002 0 6.34375 2.67871 6.34375 6.29102v54.1689zM373.158 -4.70215 +c3.31348 0 6.29102 2.99512 6.29102 6.32617v54.1328c0 3.31348 -2.99512 6.29102 -6.29102 6.29102h-54.5029c-3.31348 0 -6.29102 -2.99512 -6.29102 -6.29102v-54.1328c0 -3.33105 2.99512 -6.32617 6.29102 -6.32617h54.5029zM312.364 251.48v-54.1689 +c0 -3.6123 2.99512 -6.29102 6.29102 -6.29102h54.5029c3.31348 0 6.29102 2.67871 6.29102 6.29102v54.1689c0 3.3125 -2.99512 6.29102 -6.29102 6.29102h-54.5029c-3.2959 0 -6.29102 -2.99609 -6.29102 -6.29102zM396.384 501.301 +c0 31.208 -23.8945 56.1426 -53.1465 56.1426h-220.622c-29.1992 0 -53.165 -24.917 -53.165 -56.1426v-119.263c0 -30.9082 23.9482 -55.8252 53.165 -55.8252h220.622c29.2344 0 53.1465 24.917 53.1465 55.8252v119.263zM113.011 62.0654 +c-3.33008 0 -6.30859 -2.99512 -6.30859 -6.29004v-54.1338c0 -3.33105 2.97852 -6.32617 6.30859 -6.32617h54.1162c3.7002 0 6.34375 2.99512 6.34375 6.32617v54.1338c0 3.3125 -2.64355 6.29004 -6.34375 6.29004h-54.1162zM276.486 153.416 +c0 3.71777 -2.99512 6.36133 -6.32617 6.36133h-54.1689c-3.3125 0 -6.29004 -2.64355 -6.29004 -6.36133v-54.0986c0 -3.33008 2.99512 -6.32617 6.29004 -6.32617h54.1514c3.33105 0 6.32617 2.99609 6.32617 6.32617v54.0986h0.0175781zM209.684 55.7744v-54.1328 +c0 -3.33105 2.99512 -6.32617 6.29004 -6.32617h54.1514c3.33105 0 6.32617 2.99512 6.32617 6.32617v54.1328c0 3.31348 -2.99512 6.29102 -6.32617 6.29102h-54.1514c-3.3125 0 -6.29004 -2.97754 -6.29004 -6.29102zM209.684 -96.0352 +c0 -3.64746 2.99512 -6.29102 6.29004 -6.29102h54.1514c3.33105 0 6.32617 2.64355 6.32617 6.29102v54.1689c0 3.27734 -2.99512 6.29102 -6.32617 6.29102h-54.1514c-3.3125 0 -6.29004 -3.03125 -6.29004 -6.29102v-54.1689zM379.432 -41.8662 +c0 3.27734 -2.99512 6.29102 -6.29102 6.29102h-54.5029c-3.31348 0 -6.29102 -3.03125 -6.29102 -6.29102v-54.1689c0 -3.64746 2.99512 -6.29102 6.29102 -6.29102h54.5029c3.31348 0 6.29102 2.64355 6.29102 6.29102v54.1689zM464.509 558.131v-674.783 +c0 -33.8691 -27.5781 -61.0938 -62.1689 -61.0938h-325.541c-33.9043 0 -61.7988 27.2246 -61.7988 61.0938v674.783c0 33.5518 27.8945 60.7764 61.7988 60.7764h0.652344v146.858c0 8.9873 14.5898 16.582 32.8994 16.582c8.95117 0 17.251 -1.95605 22.8906 -4.95117 +c5.99121 -2.96094 9.65625 -7.01367 9.65625 -11.6309v-146.858h259.46c34.5732 0 62.1514 -27.2246 62.1514 -60.7764z" /> + <glyph glyph-name="uniF141" unicode="" +d="M490.932 555.86l-0.0107422 0.0185547c32.084 0.0195312 67.1719 -0.873047 82.958 -2.50293c61.0898 -6.30957 116.27 -19.2734 179.33 -38.8848l0.666016 33.043c27.0703 -3.37012 53.8701 -8.84961 80.54 -14.5098c55.79 -12.7197 86.1299 -22.1299 113.66 -35.2598 +c24.79 -11.8301 35.0498 -25.1201 50.1006 -65.0098c6.0166 -15.9473 16.8242 -51.082 16.8242 -54.6973c0 -1.91797 -20.2109 -15.79 -30.9844 -21.2783c-30.5693 -15.5713 -60.7803 -17.1367 -98.7422 -5.13184c-24.8486 7.85938 -65.6191 27.9014 -90.8291 44.6426 +l-15.3252 9.55371l16.4082 -39.3008l20.1152 -9.67969c44.1494 -21.2314 81.3545 -33.708 104.069 -34.9209c21.8516 -1.16699 46.4639 4.85254 75.1299 18.3994c7.63965 3.60938 14.4766 6.5498 15.2002 6.5498c2.04785 0 0.142578 -10.3838 -3.87305 -21.2363 +c-4.21094 -11.3809 -8.34961 -15.0547 -27.8184 -24.5732c-37.2578 -18.2119 -70.5322 -26.5723 -121.36 -30.4141c-22.3193 -1.6875 -41.0312 -0.952148 -74.8789 2.87793c-28.2217 3.19434 -49.252 3.36719 -58.8867 0.500977 +c-8.99512 -2.67578 -17.5 -10.4297 -21.4893 -19.6094c-4.26074 -9.80273 -5.14746 -31.3164 -1.91602 -45.8926c4.72266 -21.3066 17.0596 -48.4648 31.6094 -69.5498c3.7168 -5.38672 6.36426 -10.1465 5.91406 -10.5977 +c-0.926758 -0.927734 -75.5889 33.2637 -81.084 37.1328c-1.95898 1.37891 -12.1123 12.2744 -22.5723 24.1973s-24.1299 26.833 -30.4014 33.127c-27.9482 28.0527 -59.2051 41.5459 -96.0352 41.5137c-27.6885 -0.0253906 -45.9355 -6.3252 -60.7188 -20.9443 +c-9.58789 -9.48242 -14.083 -19.375 -17.4082 -38.3838c-2.28613 -13.0713 -1.875 -43.9746 0.75 -55.0723c0.694336 -2.93652 0.84668 -7.24902 0.333008 -7.71875l-64.0508 31.416l-2.24902 10.1807c-7.10059 32.0879 -25.5273 65.1914 -49.9326 89.6162 +c-32.4316 32.4551 -69.4658 48.0479 -114.07 48.0635c-35.8799 0.00976562 -64.0596 -10.5098 -85.8701 -32.04c-23.2061 -22.9102 -33.6543 -46.6699 -33.4834 -76.0996c0.270508 -46.6104 29.5352 -86.96 73.834 -101.841 +c11.8096 -3.96973 13.3594 -4.15918 34.3701 -4.22949c19.5752 -0.0488281 23.0127 0.270508 31.3174 3.0459c24.876 8.31055 39.7158 26.1621 43.2705 52.0254c3.31152 24.0947 -12.0098 54.2305 -32.9834 64.877c-21.1914 10.7588 -44.4004 9.72949 -57.0957 -2.50293 +c-10.4297 -10.0479 -10.5928 -24.125 -0.416992 -33.335c6.06543 -5.49023 11.7998 -6.94531 19.9062 -4.67285c20.5938 5.77441 31.3428 1.99609 35.6904 -14.0176c4.26465 -15.7139 -4.30762 -22.873 -19.0322 -28.7881 +c-36.875 -14.8154 -80.4814 8.57227 -89.4551 45.8926c-10.5762 43.9883 18.1836 79.6279 57.7207 90.4521c14.4199 3.94727 37.0322 3.82617 51.7246 -0.0419922c47.9795 -12.6348 80.4551 -50.8145 85.873 -101.01c2.21484 -20.5273 -0.172852 -36.8164 -8.12109 -55.5732 +c-21.9297 -51.7402 -71.0088 -77.8809 -137.061 -72.9707c-68.2559 5.06934 -127.172 51.5195 -147.84 116.609c-5.7373 18.0703 -7.36816 29.8506 -7.24609 52.0703c0.193359 35.1104 5.90332 58.6006 22.4062 92.1201c36.8594 74.8604 102.12 133.6 206.06 185.49 +c64.4902 32.2002 122.471 49.7695 188.49 57.0801c10.8896 1.20508 34.0156 1.77832 58.9697 1.79395zM908.751 488.207c-9.26074 -0.0244141 -18.7412 -2.23145 -27.6953 -6.80078c-9.49023 -4.84277 -21.1641 -17.4346 -26.0703 -28.0781 +c-8.63184 -18.7324 -6.63965 -41.0684 5.24805 -58.3682c14.4834 -21.0791 42.9883 -30.7334 66.9248 -22.6553c36.2695 12.2412 52.1641 54.2178 32.7744 86.5303c-11.3701 18.9502 -30.8096 29.4238 -51.1816 29.3721zM908.083 470.934 +c18.2256 0.385742 35.8086 -11.4521 41.0635 -32c2.64648 -10.3516 1.70508 -17.8877 -3.58203 -28.8711c-7.72852 -16.0547 -25.3633 -24.7383 -43.9775 -21.6953c-13.127 2.14551 -24.3779 11.0137 -30.3184 23.8643c-7.23535 15.6533 -3.20898 36.1738 9.3291 47.5215 +c8.21191 7.43164 17.9395 10.9785 27.4854 11.1807zM917.828 449.697c-14.5439 0 -23.8232 -10.791 -15.7842 -18.3574c6.52148 -6.1377 17.6572 -7.38965 26.3203 -2.96191c5.61035 2.86719 7.57031 6.86035 6.12207 12.6416 +c-1.06641 4.25391 -9.58105 8.67773 -16.6582 8.67773z" /> + <glyph glyph-name="uniF142" unicode="" horiz-adv-x="656" +d="M216.928 134.2c3.25098 0.240234 6.50195 0.478516 9.75293 0.717773c23.9639 5.2207 -4.74805 -11.9609 -7.95312 -19.4404c62.6406 -16.793 129.812 -11.3936 192.761 1.44043c21.6113 -8.49707 43.5527 -22.4043 66.9756 -29.7666 +c-68.1875 -32.5059 -145.844 -43.7217 -220.607 -33.2471c-29.4844 5.96387 -66.8125 9.98438 -84.2568 37.5674c-9.13184 25.3926 24.5576 37.7969 43.3281 42.7285zM196.76 225.56l-0.00390625 0.000976562c7.38477 -1.64551 37.582 14.7148 15.1943 -4.45117 +c-1.25195 -5.93555 -23.8281 -16.917 -12.6738 -22.7939c79.292 -16.7812 163.036 -8.87793 242.332 6.8418c14.6191 -15.9961 35.7051 -22.9727 55.4512 -30.3672c-89.4756 -27.9023 -185.06 -39.8135 -278.264 -26.2803 +c-24.5283 5.72363 -59.4072 8.12305 -71.0078 34.3223c-3.2041 26.1748 30.207 35.1758 48.9717 42.7275zM512.08 609.64l-0.0205078 -0.046875c6.98047 -1.63672 32.3154 5.88086 14.2832 -6.1582c-46.8799 -36.6006 -109.12 -60.3164 -138.996 -114.229 +c-15.3799 -39.1953 28.1562 -66.9912 39.7559 -100.531c14.7402 -44.416 -23.8145 -83.3516 -58.332 -104.664c-14.1201 -10.2109 -42.2227 -13.9375 -17.8838 7.32129c23.2266 18.2324 32.1738 54.8555 9.48242 77.1758c-32.7383 34.6641 -53.0039 90.5439 -25.085 134.068 +c39.2002 59.8115 110.756 87.1338 176.796 107.063zM130.628 73.8398h-0.015625c21.0537 2.92773 35.6543 -10.1582 51.6113 -21.7246c-34.0596 4.69238 -69.5859 -0.279297 -98.4199 -19.4443c10.5967 -7.44727 27.5176 -9.66211 41.0479 -13.083 +c124.717 -19.459 253.385 -14.3828 378.2 1.80078c25.1201 6.28418 56.9287 5.72949 74.8965 25.5654c0.556641 9.61133 -19.9092 22.6768 -12.5381 24.5195c17.8428 -1.38574 48.2861 -17.457 35.3428 -39.4033c-27.752 -30.9863 -73.6162 -35.3828 -111.984 -45.3672 +c-146.964 -25.7051 -299.432 -21.6631 -445.76 5.88086c-17.1748 1.9834 -37.4736 21.2148 -23.165 38.0479c28.8604 29.0049 71.2295 39.3506 110.784 43.208zM224.008 320.72l0.00390625 0.000976562c11.0527 1.37305 21.3281 -3.11035 31.9268 -5.52148 +c-25.5605 -14.3564 -54.9199 -16.9922 -81.4961 -28.8057c-2.94922 -2.32031 -23.6689 -8.27832 -12.2422 -10.9229c73.8877 -14.1738 150.271 -5.65527 224.824 -1.08203c45.9033 1.625 91.0312 16.8047 137.172 14.0449 +c-11.7793 -11.4824 -26.8271 -17.5166 -41.0479 -25.2051c-35.248 -20.1299 -78.4912 -19.8789 -118.005 -26.0439c-86.3633 -6.34863 -175.724 -11.2217 -260.199 9.84082c-14.6504 1.77441 -32.2715 19.1406 -18.124 32.5264c39.9873 26.7295 89.3037 38.5 137.188 41.168 +zM559.72 328.64c45.4375 4.33398 90.8096 -35.4258 78.4971 -82.0938c-17.084 -56.6973 -79.4961 -81.0811 -131.567 -96.3125c-28.7617 -10.4502 -37.3662 -9.4248 -10.4219 12.6523c32.3955 23.1406 75.541 42.4922 91.46 82.8164 +c15.4121 33.1875 -23.7988 68.4072 -56.1719 54.9717c-10.1455 0.233398 -40.5342 -22.2266 -29.1758 -6.82324c9.84766 23.291 33.1338 34.8906 57.3799 34.7891zM403.084 771.194v0.0136719c-2.08008 9.60156 -4.16016 19.2041 -6.24023 28.8057 +c11.0645 -13.6504 25.0762 -25.2988 32.3965 -41.5273c28.5596 -56.6328 -3.36035 -121.44 -42.9561 -163.356c-37.8525 -45.4277 -103.836 -73.0518 -115.948 -135.988c-6.09961 -65.5273 61.7881 -104.808 73.8164 -165.768 +c-26.3682 18.9922 -49.3096 42.2393 -71.9004 65.1396c-32.834 35.4688 -73.8809 82.8721 -56.168 134.82c27.0918 60.7285 92.3721 91.5361 137.792 136.588c40.4717 33.832 65.3643 88.8164 49.208 141.272zM626.08 20.3203h0.0107422 +c4.79785 3.89844 16.2021 33.6025 13.6895 11.0312c8.4834 -37.7207 -30.208 -61.5557 -60.5 -71.4043c-106.185 -33.2588 -219.624 -32.2568 -330.072 -27.4863c-48.3838 5.73828 -104.493 3.27734 -142.112 39.7285c134.748 -18.2422 273.424 -20.8428 407.44 4.87012 +c38.1084 9.55859 82.3818 14.9756 111.544 43.2607z" /> + <glyph glyph-name="uniF143" unicode="" horiz-adv-x="827" +d="M88.5283 799.473l0.00488281 -0.00292969c2.56543 0.291016 6.74414 0.527344 9.32617 0.527344c45.7275 0 82.8398 -37.1123 82.8398 -82.8408c0 -0.427734 -0.00585938 -1.12109 -0.0146484 -1.54883v-430.73l489.74 489.74 +c13.4326 13.6309 39.8672 24.6943 59.0049 24.6943c45.7275 0 82.8398 -37.1123 82.8398 -82.8398l-0.00488281 -0.867188v-631.591l0.0107422 -1.28711c0 -45.7275 -37.1123 -82.8398 -82.8408 -82.8398c-45.7275 0 -82.8398 37.1123 -82.8398 82.8398 +c0 0.355469 0.00488281 0.932617 0.0107422 1.28711v432.801l-490.78 -490.78c-13.335 -13.0664 -39.3096 -23.6709 -57.9785 -23.6709c-45.0771 0 -82.1855 36.5801 -82.832 81.6523v631.591c-0.0078125 0.427734 -0.0146484 1.12305 -0.0146484 1.55176 +c0 40.8457 32.9404 77.7227 73.5283 82.3145z" /> + <glyph glyph-name="uniF144" unicode="" horiz-adv-x="533" +d="M266.28 800l-0.00292969 0.00585938l15.9297 -44.5342l47.0898 -131.989l141.301 -4.05078l47.5 -1.34961l-37.7803 -28.7402l-111.34 -85.4297l39.8096 -135.22l13.3701 -45.4805l-39.1357 26.8564l-27.9355 19.0273 +c-0.220703 -46.209 0.674805 -135.899 0.674805 -135.899v-233.2h-89.2041h-89.0684v233.2v134.95l-26.9912 -18.3545l-39.1357 -26.7207l13.4951 45.3438l39.6758 134.28l-111.88 86.0996l-37.6523 29.0146l47.5029 1.2207l140.347 3.7793l47.5107 132.656z +M266.277 699.736l-35.4941 -99.0566l-3.91309 -10.9307l-11.4717 -0.270508l-104.59 -2.83398l83.5361 -64.2373l9.04199 -7.01758l-3.23926 -11.0664l-29.5547 -100l87.0449 59.2441l9.44629 6.6123l9.58203 -6.6123l86.3701 -58.9736l-29.6904 100.81l-3.23828 11.2012 +l9.04102 6.88281l83.1318 63.6982l-105.53 2.96875l-11.6064 0.269531l-3.91309 10.9316z" /> + <glyph glyph-name="uniF145" unicode="" horiz-adv-x="1000" +d="M556.632 578.395c33.4541 -0.00976562 62.5342 -12.4932 86.1475 -35.2461c23.6807 22.79 52.9668 35.2363 86.4365 35.2363c34.0986 0 64.3955 -12.6592 88.7383 -37.25c24.3311 -24.5781 37.1055 -55.2617 37.1055 -89.8887l0.287109 -218.47 +c-3.75098 -36.583 -19.1865 -69.0879 -45.5908 -96.2158h-0.144531c-31.0439 -31.6074 -69.5273 -47.8945 -113.33 -47.8945h-285.05c-34.8877 3.73047 -65.9385 20.251 -91.7578 45.7363c-30.207 30.0938 -45.7354 67.3057 -45.7354 109.74v399.949h75.0752v-385.13 +c0 -51.5234 35.1807 -91.6152 76.3701 -91.6152l256 -1.00684c53.375 0 94.9219 36.7695 94.9219 80.3965l-0.430664 204.521c0 13.2715 -4.33105 23.6494 -13.8076 33.2217c-9.50684 9.60254 -19.5752 13.9502 -32.6465 13.9502 +c-13.3477 0 -23.2646 -4.3252 -32.793 -13.9502c-9.47559 -9.57227 -13.8066 -19.9502 -13.8066 -33.2217v-175.03h-79.3896v175.03c0 13.2715 -4.33105 23.6494 -13.8076 33.2217c-9.52734 9.625 -19.4453 13.9502 -32.791 13.9502 +c-13.0723 0 -23.1406 -4.34668 -32.6475 -13.9502c-9.47656 -9.57227 -13.8076 -19.9502 -13.8076 -33.2217v-175.03h-79.3896v175.03c0 34.627 12.7744 65.3096 37.1064 89.8877c24.3428 24.5908 54.6396 37.25 88.7373 37.25zM466.632 -70.0059 +c-180.46 0 -337.06 136.801 -337.06 317.101l-0.162109 218.92v55.8232h-114.41v278.15l482.471 -2.27148l150.92 -0.324219c180.619 0 337.06 -136.641 337.06 -317.1v-550.301zM911.93 77.6123v402.681c0 134.529 -117.979 243.59 -263.55 243.59h-151.09v0.324219 +l-408.63 1.78613v-130.64h45.7734c31.0771 0 68.4727 -29.2041 68.4727 -72.0605l0.324219 -276.041c0 -134.529 117.98 -243.59 263.391 -243.59h359.01c46.0254 0 86.2988 29.1465 86.2988 73.9502z" /> + <glyph glyph-name="uniF146" unicode="" horiz-adv-x="930" +d="M120.88 750h688.24c58.6602 0 105.88 -47.2188 105.88 -105.88v-688.24c0 -58.6602 -47.2197 -105.88 -105.88 -105.88h-688.24c-58.6611 0 -105.88 47.2197 -105.88 105.88v688.24c0 58.6611 47.2188 105.88 105.88 105.88zM628.74 651.556 +c0 0 132.02 -266.04 -82.4707 -462.58c-201.149 -184.31 -432.5 -42.4395 -432.5 -42.4395c9.27051 -80.6699 334.881 -361.94 611.23 -65.0898c118.18 126.939 154.68 401.79 -96.2598 570.109zM275.004 621.476l0.00292969 -0.0117188 +c-83.9678 0 -137.49 -96.1338 -137.49 -162.43v-176.32c0 -12.9463 12.2861 -29.9707 27.2363 -29.9707h62.7861c140.14 0 277.5 147.7 277.5 291.29v49.9883c0 14.5293 -11.9424 27.4541 -27.4551 27.4541h-202.58z" /> + <glyph glyph-name="uniF147" unicode="" horiz-adv-x="1023" +d="M334.97 625.07c0 -46.9111 -30.3701 -97.208 -136.739 -97.208h-136.171l37.0908 171.8h130.64c84.9912 0 105.18 -41.7783 105.18 -74.5918zM686.92 625.07c-0.0195312 -46.9111 -30.1504 -97.208 -136.54 -97.208h-136.16l37.0898 171.8h130.631 +c84.7793 0 104.979 -41.7783 104.979 -74.5918zM287.91 366.44v0.00683594c0 -46.6885 -30.4297 -97.1895 -136.8 -97.1895h-136.11l37.0898 171.94h130.641c84.9941 0 105.18 -41.9443 105.18 -74.7578zM639.86 366.447v0.00683594 +c-0.0107422 -46.6885 -30.3799 -97.1895 -136.75 -97.1895h-136.16l37.0996 171.94h130.83c84.7764 0 104.98 -41.9443 104.98 -74.7578zM1008.08 471.214c-0.00976562 -46.6826 -30.3799 -97.0215 -136.75 -97.0371c-65.627 0 -136.11 0.015625 -136.11 0.015625 +l37.0908 171.779s95.7959 0.015625 130.64 0c84.7666 0 105.13 -41.7764 105.13 -74.7578zM957.371 201.968c-0.00976562 -46.6455 -30.3799 -97.1924 -136.811 -97.1924h-136.1l37.0898 171.8h130.63c84.9902 0 105.19 -41.585 105.19 -74.6074zM589.301 97.0537 +c0 -46.7002 -30.3701 -97.0439 -136.739 -97.0439h-136.171l37.0908 172.01h130.85c84.7812 0 104.97 -41.7764 104.97 -74.9658z" /> + <glyph glyph-name="uniF148" unicode="" horiz-adv-x="867" +d="M616.025 353.343c11.1748 0.859375 12.7373 0.859375 24.6152 -0.078125c24.2246 -1.79785 42.5889 -7.6582 59.7803 -19.0674c9.29883 -6.17383 22.8184 -20.2393 30.3203 -31.4922c3.5166 -5.31348 6.40723 -9.8457 6.40723 -10.1592 +c0 -0.546875 -56.8105 -37.2744 -58.8418 -38.1338c-0.625977 -0.234375 -2.42285 1.875 -4.8457 5.7041c-2.10938 3.36035 -6.6416 8.90918 -10.1582 12.3467c-9.9248 10.0029 -19.6924 13.9102 -34.7744 13.9102c-13.2842 0.078125 -21.8799 -3.28223 -29.3037 -11.3311 +c-5.15723 -5.54785 -7.50195 -11.2529 -8.04883 -19.6924c-0.625 -10.627 2.26562 -19.1455 9.06445 -26.4121c7.11133 -7.58008 17.8955 -13.5195 50.0908 -27.3506c42.5879 -18.2861 63.9219 -30.9453 80.4102 -47.668c8.5957 -8.75195 13.5967 -15.707 18.5977 -26.0225 +c7.26758 -15.0811 10.4717 -30.3193 10.4717 -49.8555c0 -30.5547 -9.61133 -54.9355 -29.1475 -73.7676c-18.3643 -17.8174 -42.042 -28.2881 -73.6123 -32.7422c-12.5811 -1.71973 -37.1963 -1.79785 -50.3242 0c-50.1689 6.71973 -87.2871 30.1631 -111.043 70.1729 +c-3.04785 5.00098 -3.67285 6.64258 -2.8916 7.3457c1.25098 1.17188 60.7178 35.4775 61.4219 35.4775c0.3125 0 2.57812 -2.96973 5.0791 -6.56445c18.2852 -27.0381 41.0254 -39.541 71.502 -39.541c18.0508 0 32.5859 4.92285 41.8066 14.2227 +c2.73535 2.73438 5.7832 6.79785 6.95508 9.2207c6.0166 12.5029 3.36035 28.835 -6.17383 39.0723c-7.73633 8.2832 -19.8486 14.9248 -52.4346 28.9131c-23.9121 10.3154 -37.7432 16.957 -47.9023 23.0527c-39.9316 24.1465 -57.8262 54.6221 -57.8262 98.2266 +c0 29.1475 9.06445 52.1221 28.0537 70.9551c18.4424 18.2852 43.2139 28.9131 72.752 31.2578zM372.764 211.354l0.3125 138.081h38.2119h38.291v-138.55c0 -91.8975 -0.3125 -140.737 -0.782227 -145.113c-5.3916 -43.2139 -25.7871 -72.2832 -60.5615 -86.3486 +c-28.9912 -11.6436 -68.5322 -12.582 -99.3203 -2.34473c-29.1484 9.68945 -53.373 30.7891 -67.3604 58.6865l-2.34473 4.68848l30.8672 18.7539c16.957 10.2373 31.1016 18.7549 31.4141 18.9111c0.234375 0.078125 2.26562 -2.96973 4.53223 -6.7207 +c13.9873 -23.9121 26.0215 -32.4297 46.1045 -32.3516c14.0664 0.078125 22.5059 2.81348 29.0703 9.37793c4.68848 4.68848 7.34473 9.76758 9.61133 18.2852l1.71973 6.48633zM108.945 718.348c-51.9688 0 -93.9453 -41.9766 -93.9453 -93.9453v-648.792 +c0 -51.9688 41.9766 -93.9453 93.9453 -93.9453h648.792c51.9688 0 93.9453 41.9766 93.9453 93.9453v648.792c0 51.9688 -41.9766 93.9453 -93.9453 93.9453h-648.792zM108.945 668.348h648.792c24.4229 0 43.9453 -19.5234 43.9453 -43.9453v-648.792 +c0 -24.4229 -19.5225 -43.9453 -43.9453 -43.9453h-648.792c-24.4219 0 -43.9453 19.5225 -43.9453 43.9453v648.792c0 24.4219 19.5234 43.9453 43.9453 43.9453z" /> + <glyph glyph-name="uniF149" unicode="" horiz-adv-x="994" +d="M789.69 800c54.6094 0 98.75 -44.1768 98.75 -98.75c0 -1.33984 0.0498047 -2.73047 0 -4.05957c0.0498047 -1.33008 0 -2.7207 0 -4.07031c0 -1.27051 0.0498047 -2.48047 0 -3.74023c0.0498047 -1.33008 0 -2.71973 0 -4.07031 +c0 -1.37988 0.0498047 -2.68945 0 -4.05957c0.0498047 -1.26953 0 -2.46973 0 -3.75c0 -54.5596 -44.1406 -98.75 -98.75 -98.75c-54.6104 0 -98.75 44.1904 -98.75 98.75c0 1.28027 -0.0507812 2.48047 0 3.75c-0.0605469 1.37012 0 2.67969 0 4.05957 +c0 1.35059 -0.0605469 2.74023 0 4.07031c-0.0507812 1.25977 0 2.46973 0 3.74023c0 1.34961 -0.0605469 2.74023 0 4.07031c-0.0605469 1.3291 0 2.71973 0 4.05957c0 54.5732 44.1299 98.75 98.75 98.75zM580.94 722.5c22.1895 0 45.5596 -2.74902 69.3691 -6.875 +c3.74023 -0.648438 6.25 -4.04199 6.25 -7.8125c0 -0.126953 0.0107422 -2.77246 0 -2.8125c0.0107422 -75.6797 61.9805 -137.189 138.131 -137.189c26.0996 0 51.9395 7.5 74.6895 22.1895c3.20996 2.08008 7.4502 1.59961 10 -1.25 +c56.4004 -62.7305 91.8701 -143.07 100 -226.56c0.110352 -1.25 -0.189453 -2.62012 -0.629883 -3.75c0.160156 -1.4707 0.480469 -2.91016 0.629883 -4.37988c0.110352 -1.24023 -0.189453 -2.31055 -0.629883 -3.44043 +c0.160156 -1.45996 0.480469 -2.90039 0.629883 -4.37012c0.110352 -1.24023 -0.189453 -2.30957 -0.629883 -3.44043c0.160156 -1.45996 0.480469 -2.90918 0.629883 -4.36914c0.200195 -2.2002 -0.399414 -4.31055 -1.87988 -5.94043s-3.74023 -2.80957 -5.94043 -2.80957 +l-150.619 0.30957c-3.82031 0 -7.20996 2.78027 -7.82031 6.55957c-17.9404 112.53 -117.73 197.5 -232.18 197.5c-31.1201 0 -61.8906 -6.50977 -91.5605 -19.0596c-3.51953 -1.48047 -7.66016 -0.0996094 -9.68945 3.12012l-80 126.88 +c-1.16992 1.87012 -1.54004 4.12988 -0.94043 6.25c0.169922 0.599609 0.639648 1.03027 0.94043 1.55957c-1.16992 1.87012 -1.54004 4.13086 -0.94043 6.25c0.179688 0.640625 0.610352 1.32031 0.94043 1.88086c-1.16992 1.85938 -1.54004 4.12988 -0.94043 6.25 +c0.169922 0.599609 0.639648 1.0293 0.94043 1.55957c-1.16992 1.87012 -1.54004 4.12988 -0.94043 6.25c0.589844 2.12012 2.08984 4.01953 4.05957 5c55.5801 27.4619 117.171 42.4922 178.131 42.5zM342.19 640c2.15918 -0.379883 3.8291 -1.58984 5 -3.44043l80 -127.18 +c1.61914 -2.57031 1.51953 -5.66016 0 -8.12988c1.45996 -2.51953 1.46973 -5.41992 0 -7.80957c1.47949 -2.54004 1.5 -5.7207 0 -8.13086c1.85938 -3.20996 1.55957 -7.22949 -1.25 -9.68945c-48 -41.7998 -76.9004 -100.83 -80.3203 -163.43 +c3.07031 -62.6201 31.5703 -121.681 79.3799 -163.75c2.88965 -2.54004 3.62988 -6.77051 1.55957 -10c1.5 -2.48047 1.62012 -5.57031 0 -8.13086c1.39062 -2.43945 1.58008 -5.31934 0 -7.80957c1.39062 -2.43945 1.58008 -5.32031 0 -7.80957l-80.9395 -126.881 +c-1.16992 -1.83984 -2.83984 -3.05957 -5 -3.42969c-2.16016 -0.379883 -4.50977 0.209961 -6.24023 1.55957c-64.5596 50.2305 -113.2 120.82 -136.88 198.44c-0.599609 1.9502 -0.259766 3.87012 0.620117 5.62012 +c-0.219727 0.729492 -0.400391 1.45996 -0.620117 2.18945c-0.580078 1.91016 -0.209961 3.90039 0.620117 5.62012c-0.219727 0.730469 -0.400391 1.45996 -0.620117 2.19043c-0.580078 1.91992 -0.209961 3.90039 0.620117 5.62012 +c-0.219727 0.729492 -0.400391 1.45996 -0.620117 2.18945c-0.929688 3.07031 0.30957 6.45996 2.80957 8.44043c29.5107 23.3604 48.3506 58.1104 51.8809 94.6904c-3.2207 37.0293 -22.0508 72.3096 -51.8809 95.9395c-2.51953 1.99023 -3.73926 5.37012 -2.80957 8.42969 +c0.219727 0.720703 0.400391 1.4707 0.620117 2.19043c-0.830078 1.73047 -1.2002 3.70996 -0.620117 5.62012c0.219727 0.719727 0.400391 1.47949 0.620117 2.19043c-0.879883 1.75 -1.21973 3.66992 -0.620117 5.62988 +c0.219727 0.709961 0.400391 1.46973 0.620117 2.17969c-0.879883 1.75977 -1.21973 3.99023 -0.620117 5.94043c23.8701 78.2793 73.0801 149.039 138.44 199.38c1.70996 1.3291 4.08984 1.93945 6.25 1.55957zM116.25 422.81c55.9004 0 101.25 -45.3896 101.25 -101.25 +c0 -1.36914 -0.259766 -2.69922 -0.30957 -4.05957c0.0400391 -1.25977 0.30957 -2.48047 0.30957 -3.75s-0.269531 -2.49023 -0.30957 -3.75c0.0498047 -1.36035 0.30957 -2.69043 0.30957 -4.05957c0 -1.34082 -0.259766 -2.74023 -0.30957 -4.06055 +c0.0498047 -1.37012 0.30957 -2.68945 0.30957 -4.07031c0 -55.8496 -45.3496 -100.93 -101.25 -100.93c-55.8975 0 -101.25 45.0801 -101.25 100.93c0 1.38086 0.257812 2.7002 0.3125 4.07031c-0.0517578 1.32031 -0.3125 2.71973 -0.3125 4.06055 +c0 1.36914 0.257812 2.69922 0.3125 4.05957c-0.046875 1.25977 -0.3125 2.48047 -0.3125 3.75s0.265625 2.49023 0.3125 3.75c-0.0546875 1.36035 -0.3125 2.69043 -0.3125 4.05957c0 55.8604 45.3545 101.25 101.25 101.25zM971.56 292.19 +c2.2002 0.00976562 4.14062 -0.870117 5.62988 -2.50098c1.48047 -1.63965 2.41016 -3.75 2.19043 -5.93945c-0.160156 -1.5498 -0.459961 -3.14062 -0.629883 -4.69043c0.339844 -1.01953 0.740234 -2.33984 0.629883 -3.43945 +c-0.160156 -1.57031 -0.450195 -3.11035 -0.629883 -4.68066c0.339844 -1.0293 0.740234 -2.0293 0.629883 -3.12988c-0.160156 -1.58008 -0.450195 -3.10938 -0.629883 -4.68945c0.339844 -1.02051 0.740234 -2.03027 0.629883 -3.12012 +c-8.9502 -89.2207 -48.7598 -173.75 -111.88 -238.12c-2.41016 -2.45996 -6.01953 -3.16016 -9.06055 -1.57031c-20.0195 10.4404 -42.1094 15.9404 -63.75 15.9404c-69.8193 0 -128.529 -52.2002 -136.569 -121.561c-0.400391 -3.40918 -3.16992 -6.2793 -6.56055 -6.87988 +c-24.0996 -4.26953 -47.75 -6.55957 -70.6191 -6.55957c-61.6602 0 -124 15.0898 -180 43.1299c-1.9707 0.979492 -3.48047 2.55957 -4.06055 4.67969c-0.589844 2.12988 -0.25 4.39062 0.929688 6.25c-0.299805 0.540039 -0.769531 0.970703 -0.929688 1.57031 +c-0.589844 2.12012 -0.25 4.38965 0.929688 6.24023c-0.359375 0.609375 -0.739258 1.18945 -0.929688 1.87988c-0.589844 2.12988 -0.25 4.38965 0.929688 6.25c-0.299805 0.530273 -0.769531 0.959961 -0.929688 1.55957c-0.589844 2.12988 -0.25 4.39062 0.929688 6.25 +l80.6309 126.561c2.05957 3.20996 6.17969 4.62012 9.67969 3.12988c30.0098 -12.8496 61.3398 -19.3701 92.8203 -19.3701c114.13 0 213.999 84.2402 232.18 195.93c0.609375 3.75 3.7002 6.56055 7.5 6.57031zM793.439 25c55.8906 0 101.25 -45.0605 101.25 -100.62 +c0 -1.37012 0.0507812 -2.70996 0 -4.07031c0.0507812 -1.29004 0 -2.4502 0 -3.75c0 -1.35938 0.0507812 -2.70996 0 -4.05957c0.0507812 -1.34961 0 -2.7002 0 -4.06055c0 -1.36914 0.0507812 -2.70898 0 -4.05957c0.0400391 -1.25977 0 -2.49023 0 -3.75977 +c0 -55.5703 -45.3594 -100.62 -101.25 -100.62c-55.9092 0 -101.25 45.0596 -101.25 100.62c0 1.26953 0.260742 2.5 0.310547 3.75977c-0.0498047 1.34961 -0.310547 2.69043 -0.310547 4.05957c0 1.37012 0.260742 2.7002 0.310547 4.06055 +c-0.0498047 1.36035 -0.310547 2.68945 -0.310547 4.05957c0 1.31055 0.260742 2.45996 0.310547 3.75c-0.0498047 1.36035 -0.310547 2.7002 -0.310547 4.07031c0 55.5596 45.3506 100.62 101.25 100.62z" /> + <glyph glyph-name="uniF14A" unicode="" horiz-adv-x="830" +d="M753 798v0c34 0 62 -28 62 -59v-1c0 -2 -1 -5 -1 -7l-66.0098 -605.01c1.00977 -23.9902 -12 -46.9902 -33.9902 -57.9902l-268 -132c-9 -3.99023 -18 -6 -27 -6s-18 2.01953 -27 6l-269 132.01c-12 5.99023 -22 15 -28 26.9902c-5 7.00977 -8 15 -9 24l-68 610 +c0 2 -3 5 -3 7v1c0 33 30 61 64 61h83h591zM130.67 290.77l52.6152 -0.00390625l11.0771 58.1533h49.8447c47.0762 -2.76953 99.6904 36 99.6904 102.46c0 38.7686 -22.1533 60.9219 -66.46 63.6914h-102.461zM205.439 390.456l13.8457 83.0752h35.999 +c19.3838 0 33.2295 -8.30762 33.2295 -24.9229c-2.76855 -47.0762 -24.9229 -55.3848 -49.8447 -58.1533zM327.28 348.92l52.6123 -0.00390625l24.9238 124.61h41.5371c19.3848 0 19.3848 -8.30762 16.6152 -22.1533l-19.3838 -102.46h55.3838l19.3838 113.54 +c5.53809 27.6904 -11.0762 49.8447 -55.3838 52.6143h-49.8447l11.0771 58.1523h-52.6143zM503.434 293.908l52.2861 -0.00390625l11.0078 57.7891h49.5342c46.7812 -2.75293 99.0664 35.7754 99.0664 101.819c0 38.5264 -22.0146 60.541 -66.0449 63.293h-101.819z +M577.735 392.971l13.7598 82.5557h35.7744c19.2627 0 33.0215 -8.25488 33.0215 -24.7666c-2.75195 -46.7822 -24.7666 -55.0381 -49.5332 -57.79z" /> + <glyph glyph-name="uniF14B" unicode="" +d="M515 799.648l-0.0146484 0.00585938l115.88 -115.881h-71.2783h-8.77832v-8.77734v-282.65l-35.8145 -35.8145l-34.4004 34.4092v283.011v8.77734h-8.77734h-73.7363zM568.02 666.57l0.00195312 0.00292969h80.4062l88.1318 -88.4834l-168.54 -168.54v257.021z +M672.65 666.57l-0.00195312 0.00390625h208.57v-208.57l-81.4609 81.8115l-6.32031 5.96973l-5.96973 -5.96973l-186.8 -186.8h-32.6543v31.9521l187.15 187.149l5.96875 5.96973l-5.96875 6.32031zM150.53 665.17l0.00292969 -0.00878906h205.41l-80.7578 -80.7578 +l-6.32031 -6.32031l6.32031 -5.96875l188.2 -188.2v-30.8994h-34.7617l-186.1 186.45l-6.32031 5.96973l-5.96875 -5.96973l-79.7051 -79.7051v205.41zM380.52 665.17l82.8613 0.000976562v-256.67l-169.939 169.59zM793.44 521.21l87.7793 -87.7832v-80.4072h-255.62z +M236.21 520.86l-0.00390625 0.00292969l167.84 -167.84h-253.51v82.1621zM132.98 417.63l-0.00976562 -0.00390625v-73.0342v-8.77734h8.77832h279.851l36.166 -36.5176l-33.3574 -33.3564h-282.65h-8.77734v-8.42773v-75.8428l-117.98 117.98zM898.78 415.87 +l-0.00878906 0.015625l116.221 -116.22l-116.21 -116.24v74.0869v8.42676h-8.77832h-284.41l-33.3564 33.708l35.8145 36.166h281.95h8.77832v8.77832v71.2783zM550.81 367.77l0.00683594 -23.1797v-8.77734h8.77734h23.877l-29.8467 -29.8467l-6.32031 -6.32031 +l6.32031 -5.96875l27.3887 -27.7393h-21.4189h-8.77832v-8.42676v-28.0898l-30.1973 30.5479l-6.32031 5.96875l-5.96875 -5.96875l-27.0371 -27.0371v24.5791v8.42676h-8.77832h-23.5254l27.3887 27.3887l5.96875 5.96875l-5.96875 6.32031l-30.1973 30.1973h25.6318 +h8.77832v8.77734v22.1211l28.4414 -28.4404l5.96875 -6.32031l6.32031 6.31934zM150.53 248.74l0.00488281 0.00390625h256.67l-170.65 -170.65l-86.0244 86.376v84.2705zM431.78 248.74l31.9512 -0.00390625v-33.3574l-188.55 -188.55l-6.32031 -6.32031l6.32031 -5.96875 +l79.0029 -79.3545h-203.649v204.711l80.0557 -80.0566l5.96875 -6.32031l6.32031 6.32031zM568.02 248.74l30.5469 -0.00195312l188.9 -188.899l5.96875 -6.32031l6.32031 6.32031l81.4609 81.4609v-206.11h-206.81l79.0029 79.3545l6.32031 5.96875l-6.32031 6.32031 +l-185.391 185.39v36.5176zM623.15 248.74l258.07 -0.00390625v-82.5146l-87.7803 -88.1318zM514.3 241.36l0.0117188 0.00878906l36.5176 -36.166v-278.44v-8.77734h8.77832h73.0332l-118.33 -117.98l-118.34 117.97h76.5449h8.77832v8.77832v281.25zM463.74 190.8 +l0.00488281 -255.612h-84.9717l-85.3232 85.3223zM568.02 187.64l167.136 -167.137l-85.3232 -85.3232h-81.8125v252.46z" /> + <glyph glyph-name="uniF14C" unicode="" horiz-adv-x="802" +d="M400.672 -70c-11.6562 0 -23.2314 3.0498 -33.4238 8.94824l-106.456 62.9834c-15.8857 8.89551 -8.13184 12.04 -2.90039 13.8721c21.2256 7.35938 25.5088 9.05371 48.1455 21.8887c2.35742 1.32324 5.47461 0.825195 7.91504 -0.604492l81.7598 -48.5508 +c2.98145 -1.6416 7.15723 -1.6416 9.89453 0l318.797 184.01c2.98145 1.69434 4.87988 5.11523 4.87988 8.63086v367.917c0 3.60059 -1.89746 6.96777 -4.93359 8.78906l-318.689 183.861c-2.9541 1.71582 -6.85742 1.71582 -9.83984 0l-318.607 -183.916 +c-3.08984 -1.7666 -5.04199 -5.23926 -5.04199 -8.73438v-367.917c0 -3.51562 1.95215 -6.85156 5.01465 -8.52441l87.3438 -50.458c47.3867 -23.6875 76.4199 4.21484 76.4199 32.2432v363.255c0 5.13477 4.12012 9.19043 9.24414 9.19043h40.4453 +c5.04297 0 9.2168 -4.05566 9.2168 -9.19043v-363.255c0 -63.2383 -34.4277 -99.5068 -94.3916 -99.5068c-18.4346 0 -32.9365 0 -73.4365 19.96l-83.6035 48.1289c-20.6562 11.9336 -33.4238 34.2568 -33.4238 58.1562v367.917c0 23.9102 12.7676 46.2207 33.4238 58.1133 +l318.824 184.222c20.168 11.415 46.9785 11.415 66.9854 0l318.797 -184.222c20.6572 -11.9443 33.4795 -34.2031 33.4795 -58.1133v-367.917c0 -23.9004 -12.8223 -46.1387 -33.4795 -58.1562l-318.526 -184.084c-10.1924 -5.89844 -21.7402 -8.94727 -33.5605 -8.94727z +M499.076 183.485c-139.527 0 -168.75 64.0361 -168.75 117.754c0 5.10449 4.12012 9.18164 9.2168 9.18164h41.2314c4.6084 0 8.43066 -3.30469 9.16309 -7.80469c6.20801 -41.9668 24.7773 -63.1436 109.139 -63.1436c67.1484 0 95.748 15.1943 95.748 50.8281 +c0 20.543 -8.10547 35.792 -112.474 46.0088c-87.2354 8.63184 -141.182 27.9033 -141.182 97.6885c0 64.3291 54.2178 102.693 145.112 102.693c102.146 0 152.676 -35.4531 159.073 -111.504c0.244141 -2.62598 -0.677734 -5.13672 -2.41309 -7.09668 +c-1.76172 -1.83008 -4.20117 -2.94434 -6.75 -2.94434h-41.3945c-4.2832 0 -8.07812 3.0498 -8.94531 7.20312c-9.92188 44.1572 -34.0762 58.2725 -99.5703 58.2725c-73.3281 0 -81.8398 -25.5527 -81.8398 -44.6885c0 -23.1885 10.0566 -29.9443 109.057 -43.043 +c97.9707 -12.9521 144.517 -31.291 144.517 -100.155c0 -69.4658 -57.9307 -109.25 -158.938 -109.25z" /> + <glyph glyph-name="uniF14D" unicode="" horiz-adv-x="1007" +d="M285.188 598.97c-5.95312 -2.375 -18.4922 -0.49707 -39.5693 8.56055c-35.9902 14.8994 -58.9502 33.5996 -84.1602 50.3496c-24.8604 16.6797 -53.6504 33.79 -67.2842 51.9307c-11.3916 16.4648 19.8838 24.4121 60.0645 13.8115 +c52.3945 -13.7734 82.7168 -48.1768 105.76 -67.541c8.72754 -7.0459 43.3965 -50.4736 25.1895 -57.1113zM688.069 38.8203c1.44043 0 38.7812 -49.4346 46.6797 -62.8203c10.249 -16.9805 48.501 -58.8086 26.2217 -76.6689 +c-14.7217 -11.6182 -27.1045 5.20605 -37.1641 15.1904c-10.7656 10.7051 -63.0322 122.96 -35.7373 124.299zM302.419 37.4502c1.13965 -0.351562 2.11328 -0.985352 3.00391 -1.56055c25.8428 -13.9902 -29.3271 -106.18 -35.2393 -126.859 +c-7.83105 -26.4141 -45.6758 -53.9072 -63.6689 -16.1104c-15.082 32.1426 80.2734 147.51 95.9043 144.53zM242.829 538.88h-0.0078125c71.1504 -8.63086 88.5371 36.915 105.42 82.0439c10.3984 27.0889 34.8809 89.3242 79.0322 53.5918 +c22.7969 -18.3096 20.6221 -49.873 42.208 -69.6709c25.8418 -23.2236 75.2393 -30.0752 109.55 -17.1387c50.1045 19.0537 57.0859 25.2227 63.8955 66.9043c4.86621 28.7334 -0.353516 64.0137 23.8975 87.3955c14.5312 14.1416 38.0605 20.3955 52.9873 3.26758 +c17.2227 -19.4941 -3.05957 -52.3857 -14.0156 -70.2568c-20.1172 -33.501 -65.7178 -46.5088 -3.20117 -72.1221c38.7812 -15.7744 124.271 7.89941 116.359 -45.0947c-4.11914 -27.2461 -28.1797 -52.1045 -27.2959 -79.959 +c0.719727 -25.6133 26.7646 -47.9238 56.752 -37.208c27.1328 9.82617 40.7812 46.1553 70.958 51.3613c25.8555 4.31543 31.7383 -19.9531 27.9736 -39.9092c-3.23535 -18.75 -10.0293 -33.627 -26.1787 -45.2451c-30.9482 -22.2012 -41.71 -57.2871 -29.2422 -90.9746 +c5.20703 -14.0703 -1.71484 -35.7109 -17.5527 -33.0947c-37.1865 6.14355 -53.2129 -23.6016 -12.4707 -32.8418c61.9619 -14.1416 80.415 19.3955 128.08 -27.002c8.44141 -37.6807 -5.87305 -62.4072 -44.125 -53.4707c-43.8252 10.2646 -31.875 11.2402 -68.333 31.0273 +c-46.3398 25.1729 -110.634 29.7822 -161.99 12.3613c-20.2949 -6.99707 -42.0166 -17.8711 -41.1201 -38.4131c1.26367 -27.1006 14.5312 -60.8828 10.9561 -87.2393c-3.76465 -28.5752 -20.2949 -21.2744 -39.1484 4.33887 +c-21.0156 28.7227 -8.63281 76.6689 -76.3271 45.2529c-95.7383 -44.21 -64.2969 -186.697 -46.707 -259.94c2.35156 -15.1787 -0.175781 -38.2559 -11.3232 -51.0674c-18.6367 -21.7373 -63.0332 -19.0547 -65.7109 9.67871 +c-2.1748 21.2852 10.4395 42.7188 14.1777 63.4062c4.70312 25.4551 4.85352 53.1523 0 78.6074c-1.98438 9.52148 -2.84082 25.7588 -14.708 31.123c-11.6758 5.35156 -24.2363 -5.22852 -36.2939 -1.35254c-10.9697 3.43555 -10.752 11.4707 -10.752 20.3945 +c-0.367188 19.2129 6.79688 37.5234 8.44141 56.5781c1.44141 15.3486 8.23828 54.9443 -15.2646 62.5391c-52.3125 16.6768 -73.5889 -26.623 -127.46 -43.582c-39.4746 -12.5078 -152.63 -7.94043 -97.1416 57.7188c19.9414 23.374 112.85 92.3525 6.93945 111.7 +c-42.7812 7.74219 -102.225 -38.3008 -141.17 -22.3789c-29.8516 12.0684 -17.6309 43.6299 2.12012 58.0654c41.3105 29.9277 110.094 7.11035 157.141 27.0557c16.1758 6.84375 5.31348 47.8574 -29.4912 51.7871c-46.8916 5.29395 -45.7773 30.2715 -45.8291 41.5449 +c-0.0576172 12.6816 37.2881 36.543 55.3223 20.4766c17.5352 -15.6221 43.9766 6.93848 38.7041 16.6426c-11.6914 21.0039 -29.2939 36.7783 -53.3682 48.2383c-49.7246 23.8105 -42.0205 7.84473 -88.9043 36.5898c-26.9287 16.6768 -59.0762 59.6875 -8.60449 71.001 +c52.0625 11.6201 43.6416 -21.6807 80.6523 -44.1699c30.5293 -18.3105 67.3398 -34.3809 102.17 -38.5605zM847.559 598.59c-4.63574 0.939453 -4.99512 8.05273 2.46875 24.4102c11.9775 27.5137 32.1748 51.9219 49.2002 75.9082 +c17.001 23.7676 33.668 49.6426 55.2861 69.3906c19.8477 17.4727 38.0127 9.15625 32.8955 -17.0527c-6.60156 -34.1406 -46.5576 -73.623 -67.6523 -98.5654c-7.5957 -9.23242 -58.873 -57.4268 -72.1982 -54.0908zM887.499 75.2803 +c-3.96777 -1.72363 -12.3252 -0.360352 -26.3721 6.20898c-23.9863 10.8125 -39.291 24.373 -56.0918 36.5283c-16.5684 12.0986 -35.752 24.5078 -44.8408 37.668c-7.59277 11.9434 13.2549 17.708 40.0303 10.0176c34.9189 -9.99023 55.1279 -34.9463 70.4834 -48.9922 +c5.81641 -5.11133 28.9219 -36.6133 16.791 -41.4307zM521.659 726.409c-4.26074 0.545898 -8.91992 3.35352 -13.0703 9.49609c-7.42969 10.3525 -6.41992 19.1709 -7.66992 27.9434c-1.12988 8.68945 -3.83008 18.2197 1.17969 25.1523 +c5.00098 6.10742 24.5439 2.14551 36.6172 -7.95703c15.7783 -13.1611 8.36133 -27.1475 6.96875 -36.1416c-0.34668 -3.33789 -11.3877 -20.3145 -24.0254 -18.4932zM504.829 339.36c-4.25977 0.545898 -8.92383 3.35449 -13.0684 9.49609 +c-7.42871 10.3525 -6.41992 19.1709 -7.66992 27.9443c-1.13477 8.68848 -3.83203 18.2188 1.17383 25.1514c5.00098 6.10742 24.5439 2.14551 36.6172 -7.95605c15.7783 -13.1621 8.36133 -27.1484 6.96875 -36.1426 +c-0.34668 -3.33691 -11.3877 -20.3135 -24.0215 -18.4932z" /> + <glyph glyph-name="uniF14E" unicode="" +d="M220.47 427.11l292.49 169.979l294.5 -170.04l-292.479 -169.979l-216.971 125.27zM527.4 233.66l291.02 169.439l-3.41992 -253.97v0.870117h-286.47zM515 741.14c276.14 0 500 -223.399 500 -499.54c0 -31.4492 -2.94043 -61.5996 -8.49023 -91.5996h-158.56 +l-2.9502 277.05v0.0302734v0.0302734c0 0.30957 1.83008 0.620117 1.7998 0.929688c-0.0195312 0.280273 1.86035 0.580078 1.82031 0.860352c-0.0498047 0.339844 -0.129883 0.649414 -0.200195 0.959961c-0.0498047 0.269531 -0.0898438 0.549805 -0.160156 0.80957 +c-0.0898438 0.320312 -0.209961 0.620117 -0.30957 0.919922c-0.0800781 0.259766 -0.160156 0.530273 -0.270508 0.780273c-0.120117 0.299805 -0.279297 0.589844 -0.419922 0.870117c-0.129883 0.240234 -0.229492 0.5 -0.370117 0.729492 +c-0.169922 0.290039 -0.359375 0.560547 -0.55957 0.839844c-0.150391 0.209961 -0.270508 0.430664 -0.429688 0.640625c-0.220703 0.290039 -0.480469 0.55957 -0.720703 0.830078c-0.160156 0.179688 -0.290039 0.349609 -0.459961 0.509766 +c-0.299805 0.299805 -0.629883 0.55957 -0.959961 0.830078c-0.139648 0.110352 -0.25 0.209961 -0.389648 0.320312c-0.480469 0.369141 -0.990234 0.65918 -1.52051 0.959961l-322.029 185.81c-4.28027 2.46973 -9.55078 2.23047 -13.8203 -0.25l-319.91 -186.39v0v0 +l-0.0400391 0.439453c-0.229492 -0.129883 -0.429688 0.180664 -0.649414 0.0302734c-0.280273 -0.19043 -0.580078 -0.360352 -0.84082 -0.570312c-0.219727 -0.169922 -0.40918 -0.359375 -0.619141 -0.540039c-0.25 -0.209961 -0.510742 -0.419922 -0.740234 -0.649414 +c-0.209961 -0.200195 -0.379883 -0.430664 -0.570312 -0.640625c-0.200195 -0.229492 -0.419922 -0.459961 -0.610352 -0.699219c-0.179688 -0.230469 -0.329102 -0.490234 -0.5 -0.730469c-0.169922 -0.240234 -0.349609 -0.490234 -0.5 -0.740234 +c-0.149414 -0.259766 -0.279297 -0.549805 -0.40918 -0.80957s-0.280273 -0.520508 -0.400391 -0.790039c-0.110352 -0.280273 -0.219727 -0.580078 -0.320312 -0.860352c-0.0898438 -0.279297 -0.25 -0.549805 -0.330078 -0.830078 +c-0.0791016 -0.290039 -0.229492 -0.609375 -0.290039 -0.910156c-0.0595703 -0.279297 -0.339844 -0.569336 -0.379883 -0.859375c-0.0400391 -0.310547 -0.469727 -0.620117 -0.489258 -0.929688c-0.0205078 -0.280273 -0.910156 -0.580078 -0.910156 -0.870117 +l-2.49023 -277.98c0 -0.00976562 0 0.870117 0 0.870117h-151.51c-5.5498 30 -8.49023 60.1504 -8.49023 91.5996c0 276.141 223.86 499.54 500 499.54zM435.9 270.04l62.3096 -36.8398l-3.20996 -84.0703v0.870117h-289.04l-0.0195312 253.69zM834.06 115.56 +c6.77051 -0.0292969 12.25 -6.04004 12.2207 -12.8096c0 -6.75977 -5.48047 -12.7402 -12.2207 -12.7402h-0.0595703c-6.78027 0 -12.2305 6.03027 -12.2305 12.7998c0.0302734 6.77051 5.52051 12.75 12.29 12.75zM833.91 69.2803 +c3.20996 0 6.37012 -1.29004 8.66992 -3.58008c2.25977 -2.25977 3.58008 -5.41992 3.58008 -8.66992c0 -3.20996 -1.31055 -6.36035 -3.58008 -8.62988c-2.29004 -2.29004 -5.45996 -3.61035 -8.66992 -3.61035s-6.39062 1.32031 -8.66016 3.61035 +c-2.26953 2.25977 -3.58008 5.41992 -3.58008 8.62988c0 3.25 1.2998 6.39941 3.58008 8.66992c2.25977 2.29004 5.4502 3.58008 8.66016 3.58008zM787.75 44.3799c5.84961 3.38965 13.3496 1.40039 16.7402 -4.41016c3.39941 -5.84961 1.41992 -13.3496 -4.44043 -16.75 +c-1.91992 -1.12988 -4.04004 -1.68945 -6.12012 -1.68945c-4.21973 0 -8.33008 2.2002 -10.6201 6.08984c-3.39941 5.86035 -1.41992 13.3604 4.44043 16.7598zM747.75 21.1602c5.84961 3.39941 13.3496 1.41016 16.75 -4.44043 +c3.40039 -5.84961 1.41016 -13.3496 -4.44043 -16.7598c-1.91992 -1.12988 -4.04004 -1.65039 -6.12012 -1.65039c-4.22949 0 -8.3291 2.1709 -10.5996 6.09082c-3.43945 5.84961 -1.4502 13.3594 4.41016 16.7598zM547.77 -95.0801 +c5.85059 3.40039 13.3506 1.41992 16.75 -4.42969c3.40039 -5.85059 1.41016 -13.3301 -4.43945 -16.7305c-1.92969 -1.12988 -4.04004 -1.68945 -6.12012 -1.68945c-4.21973 0 -8.33008 2.20996 -10.6299 6.12988c-3.40039 5.84961 -1.41016 13.3193 4.43945 16.7197z +M587.77 -71.8301c5.85059 3.40039 13.3506 1.41016 16.75 -4.43945c3.40039 -5.85059 1.41016 -13.3506 -4.43945 -16.75c-1.91992 -1.10059 -4.04004 -1.66016 -6.12012 -1.66016c-4.21973 0 -8.33008 2.19922 -10.6299 6.08984 +c-3.40039 5.84961 -1.41016 13.3594 4.43945 16.7598zM627.77 -48.5801c5.85059 3.38965 13.3604 1.41016 16.7607 -4.42969c3.39941 -5.86035 1.41016 -13.3604 -4.44043 -16.7598c-1.91992 -1.13086 -4.04004 -1.65039 -6.14941 -1.65039 +c-4.2002 0 -8.33008 2.16016 -10.6006 6.08984c-3.41016 5.84961 -1.41992 13.3496 4.42969 16.75zM707.74 -2.08984c5.84961 3.41016 13.3594 1.41992 16.7598 -4.44043c3.40039 -5.83984 1.43945 -13.3496 -4.41016 -16.75 +c-1.9502 -1.12988 -4.07031 -1.64941 -6.15039 -1.64941c-4.22949 0 -8.3291 2.16016 -10.5996 6.08984c-3.39941 5.84961 -1.41016 13.3496 4.40039 16.75zM667.77 -25.3301c5.85059 3.40039 13.3604 1.41016 16.7607 -4.43945 +c3.39941 -5.85059 1.40918 -13.3506 -4.44043 -16.75c-1.95996 -1.14062 -4.07031 -1.66016 -6.15039 -1.66016c-4.22949 0 -8.3291 2.16992 -10.5996 6.08984c-3.39941 5.84961 -1.41992 13.3604 4.42969 16.7598zM514.38 22.1104 +c6.78027 0 12.2305 -5.52051 12.2002 -12.2803c0.0302734 6.75977 -5.45996 12.2803 -12.2002 12.2803zM514.11 -70.3896c6.76953 -0.0302734 12.2598 -5.51074 12.2295 -12.2803c0 6.76953 -5.45996 12.25 -12.2295 12.2803zM503.05 5.12012 +c1.85059 -4.38965 6.18066 -7.49023 11.25 -7.50977c-5.08008 0.0195312 -9.41016 3.12012 -11.25 7.50977zM501.84 -82.6104c0 3.39062 1.37012 6.4502 3.60059 8.65039c-2.20996 -2.2002 -3.59082 -5.27051 -3.60059 -8.65039zM501.84 -82.6104 +c-0.0400391 -6.76953 5.4502 -12.25 12.2197 -12.29c-6.76953 0 -12.2598 5.52051 -12.2197 12.29zM502.35 102.41c0 -6.77051 5.4502 -12.2402 12.2207 -12.2803c-6.77051 0 -12.25 5.50977 -12.2207 12.2803zM514.51 68.3896 +c5.91992 -0.0292969 10.8398 -5.22949 11.9805 -10.8096c0.160156 -0.799805 0.240234 -2.59961 0.240234 -3.4502c-0.0302734 -6.74023 -5.51074 -14.1299 -12.25 -14.1299h-0.0302734c-6.75977 0 -12.25 7.45996 -12.2197 14.2197 +c0 0.850586 0.0791016 3.62012 0.25 4.41016c1.14941 5.58984 6.09961 9.75977 12.0293 9.75977zM514.24 -24.1396c6.76953 -0.0302734 12.2393 -6.18066 12.2197 -12.96c0 -6.78027 -5.48047 -12.9004 -12.25 -12.9004h-0.0302734 +c-6.76953 0 -12.2295 6.2002 -12.2295 12.96c0.0302734 6.78027 5.51953 12.9297 12.29 12.9004zM514.38 22.1104c6.74023 0 12.2305 -4.9209 12.2002 -11.6807c0 -0.839844 -0.0800781 -1.06934 -0.25 -1.87012c-1.14062 -5.55957 -6.07031 -8.55957 -11.9697 -8.55957 +h-0.0302734h-0.0302734c-5.06934 0 -9.39941 1.91992 -11.25 6.33008c-0.629883 1.47949 -0.969727 1.88965 -0.969727 3.59961c0.0195312 5.89062 4.24023 10.8301 9.83008 11.9404c0.799805 0.160156 1.62988 0.240234 2.46973 0.240234zM514.63 114.64 +c6.78027 -0.0292969 12.25 -5.58008 12.2305 -12.3496c-0.0302734 -6.77051 -5.48047 -12.29 -12.2607 -12.29h-0.0292969c-6.77051 0 -12.2207 5.58008 -12.2207 12.3496c0.0302734 6.77051 5.51074 12.3203 12.2803 12.29zM514.11 -70.3896 +c6.76953 -0.0302734 12.2295 -8.07031 12.2295 -14.8301c-0.0302734 -6.77051 -5.51953 -14.7803 -12.2598 -14.7803h-0.0302734c-6.75977 0 -12.25 8.07031 -12.21 14.8398c0.00976562 3.37988 1.37988 9 3.60059 11.21c2.21973 2.20996 5.2793 3.58008 8.66992 3.56055z +M513.94 -116.67c3.23926 0 6.38965 -1.29004 8.65918 -3.58008c2.29004 -2.25977 3.61035 -5.41992 3.61035 -8.66016c0 -3.21973 -1.32031 -6.37012 -3.61035 -8.63965c-2.25977 -2.29004 -5.41992 -3.58008 -8.65918 -3.58008 +c-3.2207 0 -6.37012 1.29004 -8.64062 3.58008c-2.29004 2.25977 -3.58008 5.41992 -3.58008 8.63965c0 3.24023 1.29004 6.39062 3.58008 8.66016c2.25977 2.29004 5.41992 3.58008 8.64062 3.58008zM479.81 -95.04c5.88086 -3.41016 7.87012 -10.8799 4.5 -16.7598 +c-2.25977 -3.91016 -6.39941 -6.12988 -10.6201 -6.12988c-2.08984 0 -4.19922 0.529297 -6.12988 1.66016c-5.84961 3.36914 -7.83984 10.8691 -4.46973 16.7197c3.37012 5.88965 10.8701 7.87012 16.7197 4.50977zM278.55 21.1602 +c5.87988 -3.40039 7.87012 -10.8799 4.5 -16.7598c-2.2998 -3.91016 -6.39941 -6.12012 -10.6299 -6.12012c-2.08008 0 -4.18945 0.549805 -6.12012 1.64941c-5.84961 3.37012 -7.87012 10.8701 -4.46973 16.7305c3.37012 5.87988 10.8701 7.87012 16.7197 4.5z +M238.3 44.4004c5.85059 -3.39062 7.87012 -10.8604 4.48047 -16.7607c-2.27051 -3.90918 -6.37988 -6.11914 -10.6006 -6.11914c-2.08984 0 -4.19922 0.529297 -6.12988 1.65918c-5.84961 3.37012 -7.87012 10.8701 -4.46973 16.7207 +c3.37012 5.87988 10.8398 7.86914 16.7197 4.5zM399.32 -48.5801c5.84961 -3.37012 7.87012 -10.8701 4.46973 -16.7197c-2.27051 -3.91992 -6.37012 -6.12012 -10.6299 -6.12012c-2.0498 0 -4.16016 0.519531 -6.08984 1.65039 +c-5.85059 3.36914 -7.87012 10.8691 -4.5 16.7295c3.39941 5.84961 10.8701 7.86035 16.75 4.45996zM359.07 -25.3301c5.84961 -3.37012 7.87012 -10.8701 4.46973 -16.7295c-2.27051 -3.94043 -6.37012 -6.12012 -10.6299 -6.12012 +c-2.08008 0 -4.16016 0.519531 -6.08984 1.62012c-5.87988 3.39941 -7.87012 10.8799 -4.5 16.7598c3.39941 5.84961 10.8701 7.87012 16.75 4.46973zM439.57 -71.7998c5.87012 -3.40039 7.87012 -10.8701 4.5 -16.75 +c-2.30078 -3.91992 -6.40039 -6.12988 -10.6299 -6.12988c-2.08008 0 -4.19043 0.529297 -6.12012 1.66016c-5.85059 3.35938 -7.87012 10.8691 -4.4707 16.7197c3.37012 5.87988 10.8701 7.87012 16.7207 4.5zM318.79 -2.08984 +c5.87988 -3.37012 7.87988 -10.8701 4.5 -16.75c-2.25977 -3.91992 -6.40039 -6.12012 -10.6201 -6.12012c-2.08984 0 -4.2002 0.549805 -6.12988 1.65039c-5.84961 3.39941 -7.83984 10.8701 -4.46973 16.75c3.37012 5.85938 10.8701 7.84961 16.7197 4.46973z +M191.93 69.2803c3.2207 0 6.37012 -1.32031 8.66992 -3.58008c2.26074 -2.29004 3.58008 -5.4502 3.58008 -8.66992c0 -3.20996 -1.30957 -6.37012 -3.58008 -8.66016c-2.2998 -2.25977 -5.44922 -3.58008 -8.66992 -3.58008c-3.25 0 -6.39941 1.30957 -8.66992 3.58008 +c-2.29004 2.29004 -3.58008 5.4502 -3.58008 8.66016c0 3.21973 1.29004 6.37988 3.58008 8.66992c2.27051 2.25977 5.41992 3.58008 8.66992 3.58008zM192.08 115.53c6.76953 0 12.2598 -6.03027 12.2197 -12.7998c-0.0302734 -6.73047 -5.50977 -12.7305 -12.25 -12.7305 +h-0.0302734c-6.76953 0 -12.25 6.03027 -12.2295 12.7998c0 6.75977 5.51953 12.7598 12.29 12.7305zM988.18 130c2.54004 0 4.61035 -2.45996 4.61035 -5s-2.05957 -5 -4.59961 -5h-949.49c-2.54004 0 -4.58984 2.45996 -4.58984 5s2.0498 5 4.58984 5h949.479z" /> + <glyph glyph-name="uniF14F" unicode="" +d="M125 800v-890h890v-110h-1000v1000h110zM801.89 505.09l-76.5801 58.8203l219.69 55.4297v-225.649l-76.1602 59.2295l-214.63 -258.01l-180.229 143.07l-203.36 -237.32l-64.2197 55.0596l256.449 299.141l179.271 -142.25z" /> + <glyph glyph-name="uniF150" unicode="" horiz-adv-x="1040" +d="M539.18 486.55c153.404 1.58496 275.764 -53.4502 282.485 -131.866c7.42676 -86.5127 -128.799 -168.862 -304.17 -183.908c-175.37 -15.0449 -323.595 43.0137 -331.012 129.521c-7.42676 86.5273 128.799 168.863 304.17 183.908 +c16.4404 1.41016 32.6572 2.18066 48.5264 2.34473zM495.811 474.008c-66.8965 1.08789 -145.237 -25.5293 -203.483 -50.4014c-6.06152 -17.4697 -9.25977 -35.9482 -9.25977 -55.208c0 -102.623 92.5713 -185.901 206.883 -185.901s206.999 83.2783 206.999 185.901 +c0 32.4775 -9.24121 62.9863 -25.5527 89.5508c-46.5996 7.24414 -110.687 15.0039 -175.586 16.0586zM478.838 474.219c7.65918 0.0185547 12.3076 -0.234375 12.3076 -0.234375s92.2705 4.82422 139.953 -30.4756c-0.555664 -2.58789 -1.17969 -5.1875 -1.875 -7.73633 +c0.113281 -0.0830078 0.238281 -0.150391 0.351562 -0.234375c-2.46191 -11.459 -6.38574 -22.5713 -11.4873 -33.0547c-1.21387 0.28125 -2.45215 0.46875 -3.75098 0.46875c-6.69336 0 -12.3701 -4.02441 -15.0029 -9.72852 +c0.326172 -4.2041 2.63086 -11.1787 4.80566 -13.8311c-0.90625 -1.16016 -1.85742 -2.21777 -2.81348 -3.28223c0.0683594 -0.0859375 0.165039 -0.149414 0.234375 -0.234375c-10.043 -12.8564 -22.1152 -24.0283 -35.75 -32.7021 +c-4.41602 26.0684 -27.0625 45.9473 -54.3867 45.9473c-30.4951 0 -55.208 -24.7188 -55.208 -55.208c0 -0.960938 0.0703125 -1.87012 0.117188 -2.8125c-18.6221 6.95996 -35.4033 18.3086 -49.3467 32.585c-1.29102 1.05957 -2.56055 2.11328 -3.86816 3.28223 +c4.11621 10.9756 12.4756 28.5254 19.3398 37.7432c2.03027 -0.773438 4.2666 -1.17188 6.56445 -1.17188c10.1133 0 16.6445 2.42773 16.6445 12.541c0 0.209961 -0.0849609 0.563477 -0.117188 0.820312c-0.0341797 0.201172 -0.0751953 0.388672 -0.117188 0.585938 +c-0.243164 1.19043 -0.59082 2.30664 -1.05566 3.39941c0.0429688 0.0341797 0.0751953 0.0849609 0.117188 0.117188c-0.807617 2.38965 -1.82812 4.76172 -2.34375 5.97852c18.5244 14.9541 42.3955 26.0732 67.1631 31.1787 +c-27.5869 -1.24316 -53.666 -11.0391 -75.0166 -27.3105c-2.08691 0.830078 -4.41211 1.28906 -6.79883 1.28906c-7.4541 0 -13.9033 -4.39062 -16.7617 -10.7832c0.147461 -2.53418 1.64062 -8.41699 2.34473 -10.3154 +c-0.931641 -1.17871 -1.87988 -2.21582 -2.81348 -3.28223c0.0400391 -0.113281 0.0751953 -0.238281 0.117188 -0.351562c-6.66211 -8.43457 -12.335 -17.7178 -16.8779 -27.7793c-13.7803 18.8281 -23.208 40.9912 -26.7256 64.3506 +c1.23047 -25.9697 10.4004 -51.6729 24.0293 -71.6182c-0.724609 -2.19629 -1.61035 -3.83887 -2.46191 -5.50879c0.0498047 -0.0722656 0.0683594 -0.162109 0.117188 -0.234375c-1.18555 -3.59668 -2.25488 -7.27246 -3.16406 -11.0186 +c-2.18262 -14.583 -1.60059 -32.4102 0 -45.3613c-0.956055 -0.463867 -1.94531 -0.916992 -2.81348 -1.40625c0.0273438 -0.233398 0.0888672 -0.470703 0.117188 -0.703125c-6.83496 -3.5 -10.7871 -9.00098 -12.3076 -15.0039 +c-1.87891 -12.3164 11.4434 -22.7393 24.2637 -22.7393c1.24707 0 2.55957 0.168945 3.75098 0.351562c5.72266 -10.9834 11.7461 -27.8447 20.043 -38.2119c0.923828 -0.974609 1.86035 -1.98242 2.81348 -2.92969c-0.0185547 -0.0703125 0.0136719 -0.157227 0 -0.234375 +c-0.0234375 -0.124023 -0.0888672 -0.240234 -0.117188 -0.351562c-0.0136719 -0.0722656 0.0136719 -0.164062 0 -0.234375c-3.65332 1.63867 -7.16797 3.44434 -10.667 5.3916c-0.046875 0.0263672 -0.0703125 0.0888672 -0.117188 0.117188 +c-1.72363 0.926758 -3.35254 1.94531 -5.04004 2.93066c-0.0283203 0.0185547 -0.0888672 -0.0195312 -0.117188 0c-49.7744 29.0918 -83.2217 83.0576 -83.2217 144.876c0 6.00488 0.674805 11.5732 1.99316 16.7617c3.17285 25.873 20.5303 42.9336 42.8994 54.1523 +c-0.0234375 -1.0127 -0.117188 -2.02539 -0.117188 -3.04785c0 -1.39746 0.0703125 -2.82129 0.117188 -4.21973c0.816406 0.397461 1.63281 0.791016 2.46191 1.17285c-0.419922 2.22656 -0.977539 4.43066 -1.28906 6.68066 +c37.2734 18.166 87.9072 20.5713 110.884 20.6299zM516.229 466.248c-1.87793 -0.00878906 -3.76172 -0.147461 -5.62695 -0.234375c8.33984 -0.216797 18.5254 -0.676758 29.7725 -1.87598c-8.09766 1.44629 -16.1787 2.14746 -24.1455 2.11035zM633.912 441.281 +c15.0264 -12.125 24.9658 -28.6748 24.9658 -51.2227c0 -8.87109 -1.03418 -18.1602 -2.69531 -27.5449c-2.60449 -22.2812 -9.58594 -43.2695 -20.0439 -62.0059c-2.31348 1.9082 -4.60352 3.76465 -7.03223 5.50879c-2.27246 1.63086 -4.66699 3.20508 -7.0332 4.68848 +c-0.165039 0.103516 -0.303711 0.249023 -0.46875 0.351562c-0.433594 0.269531 -0.852539 0.556641 -1.28906 0.820312c-2.11914 1.28613 -4.25 2.46484 -6.44727 3.63379c-13.165 7.01074 -27.4512 11.7422 -42.3145 14.0654 +c0.192383 0.125 0.395508 0.227539 0.586914 0.352539c-1.18066 0.22168 -2.3291 0.508789 -3.5166 0.703125c16.0859 10.4268 34.2031 31.1973 44.541 47.3545c0.895508 -0.150391 1.7627 -0.351562 2.69629 -0.351562c7.45508 0 14.8008 4.90039 14.8857 11.0176 +c0.00390625 0.275391 -0.0888672 0.540039 -0.117188 0.820312c-0.0371094 0.193359 0.046875 0.396484 0 0.585938c-0.233398 0.984375 -0.652344 2.02441 -1.05469 2.93066c-0.0410156 0.0732422 -0.0751953 0.161133 -0.117188 0.234375 +c-0.289062 0.624023 -0.694336 1.17871 -1.05566 1.75781c-0.382812 0.592773 -0.825195 1.14844 -1.28906 1.75879c-0.0546875 0.0664062 -0.0615234 0.168945 -0.117188 0.234375c-0.420898 0.542969 -1.01758 1.07715 -1.52344 1.64062 +c-0.769531 0.857422 -1.56152 1.7793 -2.5791 2.69629c2.71484 7.91504 6.76367 18.9268 9.14258 28.9512c0.0908203 1.02832 0.28418 2.01367 0.351562 3.04785c0.0878906 -0.0703125 0.148438 -0.164062 0.235352 -0.234375 +c0.597656 2.89746 1.12109 5.63965 1.28906 8.20508zM401.477 359.936c16.0068 -17.5781 36.6885 -30.8838 60.0137 -37.9775c1.74902 -4.49219 5.875 -13.9863 8.67383 -17.8164c-2.39062 -1.93457 -4.75098 -3.97168 -7.15039 -5.97852 +c-1.04883 -0.916016 -2.14746 -1.74902 -3.16406 -2.69531c-15.6582 -14.5713 -27.5039 -32.6514 -34.6953 -52.5127c-6.16992 8.09277 -11.3984 16.7715 -15.707 25.9043c0.0820312 0.0761719 0.154297 0.158203 0.234375 0.234375 +c-0.62793 1.27734 -1.20117 2.41406 -1.875 3.86914c3.3125 3.07031 7.27246 8.90625 9.37695 14.5342c-0.451172 11.335 -8.83789 20.5977 -19.6924 22.6221c-1.50488 13.2031 -0.90918 26.8135 2.11035 40.3213c0.0634766 0.27832 0.162109 0.545898 0.234375 0.820312 +c0.0380859 0.236328 0.0800781 0.467773 0.117188 0.704102c0.353516 2.11719 0.699219 4.32812 1.17188 6.44629c0.12207 0.510742 0.234375 1.0127 0.351562 1.52441zM564.99 323.599c23.8643 -2.18457 47.2656 -15.2891 67.1631 -29.0693 +c-0.750977 -1.1543 -1.56445 -2.26953 -2.34375 -3.39844c0.160156 -0.111328 0.308594 -0.241211 0.46875 -0.351562c-29.9268 -45.9717 -81.7217 -76.4238 -140.656 -76.4238c-14.6523 0 -28.8916 1.86621 -42.4316 5.39258 +c-0.96582 0.819336 -1.86816 1.73535 -2.81348 2.57812c-0.0214844 0.0185547 -0.09375 -0.0195312 -0.117188 0c-1.29004 1.09766 -2.32031 2.20508 -3.39941 3.28223c-0.804688 0.764648 -1.55664 1.56152 -2.34375 2.34375 +c-1.3584 1.35059 -2.80078 2.58301 -4.10254 3.98535c0.0439453 0.114258 0.0703125 0.238281 0.117188 0.351562c-0.526367 0.582031 -0.957031 1.14844 -1.52344 1.75879c8.92188 22.9639 26.4805 49.3984 45.8301 64.4678 +c9.38672 -7.38086 21.2344 -11.8398 34.1094 -11.8398c24.0664 0 44.4893 15.4404 52.043 36.9229zM751.806 534.139l0.0234375 -0.000976562s-3.47266 -6.18066 -8.67383 -14.5342c0.376953 0.428711 2.22754 2.57812 2.22754 2.57812s-21.8066 -37.918 -40.2041 -58.3721 +c14.501 1.05664 43.4854 26.8418 43.4854 26.8418s-6.44727 -8.02734 -12.3066 -16.8789c3.3584 2.75391 5.86035 4.80566 5.86035 4.80566s-7.60938 -9.45215 -13.8311 -19.2227c-0.0292969 -0.046875 -0.0888672 -0.0703125 -0.117188 -0.117188 +c-1.88965 -4.76758 -2.04785 -8.30273 1.28906 -8.9082c16.9863 -13.8076 79.5879 71.0312 79.5879 71.0312s-2.4375 -4.67969 -6.44629 -11.9551c0 0 -1.30566 -2.38965 -1.75781 -3.28223c-0.513672 -0.913086 -0.848633 -1.60156 -1.40723 -2.5791 +c-5.97852 -11.4453 -23.0312 -42.5098 -47.9404 -72.4375c31.8262 -8.0459 102.211 82.8691 102.211 82.8691s-0.811523 -10.3906 -11.9561 -28.5996c-5.28418 -11.3477 -15.8203 -28.2158 -36.3359 -49.1123c38.8838 13.0527 84.3936 79.8223 84.3936 79.8223 +s-5.75879 -16.833 -18.168 -38.6807c-0.323242 -0.638672 -0.717773 -1.33691 -1.05566 -1.99219c-0.0917969 -0.158203 -0.141602 -0.310547 -0.234375 -0.46875c-8.26172 -15.9766 -20.7119 -36.2178 -37.9766 -54.8564c39.623 13.752 95.6465 100.218 95.6465 100.218 +s-6.17969 -16.9004 -18.5205 -38.7979c-0.0625 -0.124023 -0.170898 -0.227539 -0.234375 -0.351562c-10.1113 -19.8467 -26.5039 -46.9893 -49.4639 -69.0381c54.7715 -5.30762 128.701 71.0312 128.701 71.0312s-3.10449 -5.63965 -8.20508 -13.7139l1.75781 1.75781 +s-24.3359 -45.1924 -58.0205 -72.3203c44.6816 -7.67578 100.569 56.7314 100.569 56.7314s-10.1992 -15.6436 -28.7178 -33.9922c13.4189 11.7666 22.2705 21.9189 22.2705 21.9189s-62.6621 -96.6123 -162.458 -92.3643 +c-32.7451 1.3916 -131.823 99.3447 -344.022 91.3086c-280.305 -10.6191 -339.69 -129.479 -489.391 -210.164c6.74121 6.74023 13.2988 13.2246 19.9258 19.5742c-4.43848 -2.54688 -8.87891 -5.13867 -13.4795 -7.61816c158.191 158.187 284.45 207.089 399.113 229.387 +c2.8457 0.553711 5.3418 2.19629 7.38379 4.4541c0.0380859 0.0419922 0.0800781 0.0761719 0.117188 0.117188c3.29199 9.50195 4.10254 19.458 4.10254 19.458s0.451172 -4.22168 1.6416 -9.37695c3.86328 10.0137 4.80566 21.4502 4.80566 21.4502 +s2.15137 -24.4844 12.7764 -27.6621c3.28613 -0.986328 6.92188 2.375 10.3145 7.38379c0.0224609 0.0478516 0.09375 0.0693359 0.117188 0.117188c4.39258 9.44922 7.50195 18.7549 7.50195 18.7549s-1.64551 -4.86914 -3.16504 -11.1357 +c5.49414 10.7158 9.61133 23.0908 9.61133 23.0908s-12.7383 -37.1465 0 -39.2666l36.1025 36.1025s-9.52734 -32.9229 -3.16504 -35.0469c6.37207 -2.12402 38.2119 47.8232 38.2119 47.8232s-19.1064 -32.9189 -1.05566 -36.1025 +c18.0469 -3.1875 44.4248 22.3887 44.4248 22.3887s-8.14355 -9.0957 -11.9561 -16.7617c3.29199 2.76758 5.50879 4.80566 5.50879 4.80566s-3.62402 -4.15527 -7.15039 -9.14258c-0.642578 -2.65527 -0.196289 -4.69922 2.11035 -5.50879 +c39.2852 -13.8037 71.0312 37.1562 71.0312 37.1562s-3.70703 -11.1572 -12.542 -26.2559c-0.12793 -0.260742 -0.335938 -0.553711 -0.46875 -0.820312c-2.82031 -5.69336 -6.6377 -12.5586 -11.6035 -20.0439c35.3203 -7.2666 62.5801 37.8721 68.9209 49.4648 +l-29.3027 -59.6621c15.9268 -8.49121 79.5879 64.7021 79.5879 64.7021zM850.5 355.599c23.916 0.612305 56.2617 -25.9014 56.2617 -25.9014s-15.1211 6.19922 -27.7793 9.8457c16.6396 -7.70312 31.0615 -19.458 31.0615 -19.458s-30.6514 12.8682 -41.1416 12.542 +c17.2578 -12.5918 61.7715 -33.2891 61.7715 -33.2891s-16.9492 5.4043 -32.4688 8.32227c17.6133 -9.37305 35.6328 -17.8164 35.6328 -17.8164s-50.0977 15.6953 -56.7314 7.9707c15.4541 -20.1621 72.6729 -65.2871 72.6729 -65.2871s-25.8379 19.5801 -49.8154 35.3984 +c22.5156 -20.8691 52.9805 -45.0107 52.9805 -45.0107s-82.1855 62.6436 -89.083 54.1533c-0.214844 -0.265625 -0.462891 -0.505859 -0.585938 -0.820312c8.94824 -13.2832 32.3516 -32.5859 32.3516 -32.5859s-7.55371 4.56641 -18.168 10.1973 +c9.96582 -10.2373 21.332 -19.8086 21.332 -19.8086s-69.4648 43.041 -93.8877 30.3584c-0.887695 -0.460938 -1.51074 -1.05762 -1.87598 -1.75879c8.61328 -11.5752 30.7969 -28.582 48.1758 -41.0244c-9.44434 6.0459 -20.2041 12.2783 -29.6553 15.9414 +c10.1006 -8.78613 22.2285 -17.8516 32.8193 -25.4355c-18.0049 11.5283 -41.3584 24.0889 -49.4639 17.2305c-1.53027 -1.2959 -1.82031 -3.68652 -1.28906 -6.79883c13.7607 -30.6582 63.8809 -90.958 63.8809 -90.958s-11.0195 12.0703 -25.5527 27.1934 +c15.0469 -20.0693 28.7178 -36.6875 28.7178 -36.6875s-90.1465 97.6104 -99.1631 92.833c-1.30762 -0.692383 -1.66895 -2.27051 -1.40625 -4.4541c0.0136719 -0.0302734 -0.0146484 -0.0898438 0 -0.117188c7.12598 -15.3477 23.0908 -37.2744 23.0908 -37.2744 +s-4.24805 4.50879 -10.1973 10.4326c6.68066 -10.709 13.3623 -20.0439 13.3623 -20.0439s-44.5273 48.8174 -56.7314 40.3213c-1.72852 -1.20312 -1.69043 -4.82715 -0.351562 -10.0801c14.209 -37.7295 60.834 -115.69 60.834 -115.69s-6.16504 9.75977 -15.707 23.3252 +c10.5439 -18.6416 18.8721 -32.9375 18.8721 -32.9375s-81.0078 128.023 -115.456 108.775c9.9541 -22.4863 17.1768 -41.0508 22.1533 -56.2627c0.523438 -1.60059 1.16309 -3.39551 1.6416 -4.92285c21.2148 -62.3398 8.9082 -73.0244 8.9082 -73.0244 +s-0.277344 5.13965 -1.29004 13.0107c-0.944336 -2.57227 -1.875 -3.5166 -1.875 -3.5166s-1.62793 26.3389 -10.0801 53.9189c-0.170898 0.463867 -0.293945 0.942383 -0.469727 1.40625c-10.3799 27.4609 -28.3955 52.9375 -59.5439 51.457 +c-14.1738 -0.675781 -13.3662 -16.8105 -7.85352 -35.1641c0.0566406 -0.152344 0.0605469 -0.317383 0.117188 -0.46875c8.16113 -22.0957 20.3955 -44.0732 20.3955 -44.0732s-3.49316 6.25879 -9.02539 14.8857c6.31738 -13.7041 12.3066 -24.3799 12.3066 -24.3799 +s-43.8467 76.9932 -74.0791 78.2988c11.2246 -22.2949 19.0215 -41.4775 24.2637 -58.0205c0.00976562 -0.0351562 -0.00976562 -0.0849609 0 -0.117188c22.3359 -63.3643 9.96289 -90.2549 9.96289 -90.2549s0.933594 9.24609 -0.234375 23.3252 +c-0.947266 -9.35254 -2.92969 -13.7139 -2.92969 -13.7139s2.69727 26.3301 -6.79883 58.4893c-0.0595703 0.162109 -0.174805 0.306641 -0.234375 0.46875c-8.66016 23.6074 -24.29 49.043 -52.2773 68.9219c0.350586 -1.20898 0.678711 -2.44531 0.9375 -3.75098 +c17.4775 -34.3438 -22.8564 -133.741 -22.8564 -133.741s4.14453 17.0215 7.50195 39.1494c-5.68945 -17.332 -10.667 -29.5381 -10.667 -29.5381s18.5205 76.8828 8.79102 117.097c-5.94531 13.0166 -16.8574 18.917 -35.8672 10.3154 +c-11.2666 -5.08789 -0.820312 -84.5117 -0.820312 -84.5117s-1.8457 11.334 -5.04004 25.5527c0.951172 -9.2832 1.875 -15.9414 1.875 -15.9414s-4.2373 26.9766 -11.6045 50.7539c-0.0712891 0.194336 -0.162109 0.392578 -0.234375 0.585938 +c-5.66699 15.2568 -12.8037 26.877 -20.8633 25.084c-12.5332 -2.78027 -79.5889 -125.771 -79.5889 -125.771s9.61328 23.3887 19.5752 50.0498c-12.8379 -22.4053 -22.7393 -40.5557 -22.7393 -40.5557s36.209 87.6631 40.9072 117.683 +c-12.2871 -5.25098 -34.5781 -58.7246 -34.5781 -58.7246s2.54199 12.3281 3.98535 25.5527c-4.2334 -9.04785 -7.15039 -15.9414 -7.15039 -15.9414s6.21875 30.291 4.68848 46.8857c-0.436523 0.37793 -0.986328 0.666992 -1.52344 0.820312 +c-11.1445 3.18848 -73.2588 -57.3174 -73.2588 -57.3174s17.9482 21.0654 29.5381 39.6191c-17.0176 -14.7988 -32.7021 -30.0078 -32.7021 -30.0078s35.04 41.002 38.7969 58.959c-11.4863 13.6035 -24.8477 13.9277 -40.4385 7.85352 +c-24.4229 -9.51758 -57.3174 -54.1533 -57.3174 -54.1533s15.6504 21.5312 23.4424 40.4395c-14.7031 -14.877 -26.6074 -30.8271 -26.6074 -30.8271s26.626 36.6348 27.6631 56.2617c-17.6758 14.0801 -100.922 -56.2617 -100.922 -56.2617s22.6172 21.1514 35.751 39.5 +c-20.9609 -14.833 -38.915 -30.0059 -38.915 -30.0059s39.1641 36.9375 44.3066 55.4414c-16.3965 9.61035 -80.8857 6.38867 -101.624 6.44727c-63.6992 0.197266 -85.8057 15.1582 -105.142 30.4756c14.4326 -7.23926 28.6387 -11.7041 42.7832 -14.417 +c-21.7695 5.81836 -34.4033 14.8828 -45.9473 24.0283c83.6055 -41.9395 160.001 6.29199 256.347 -20.8643c73.249 -20.6387 162.51 -46.0039 283.54 -28.4824c121.03 17.5156 224.553 70.0273 273.929 163.981c4.32812 11.7939 12.3262 16.1709 21.6846 16.4102z +M851.202 221.626c12.6465 -8.09668 22.7402 -15.7061 22.7402 -15.7061s-10.2051 6.73145 -22.7402 15.7061zM854.367 212.131c12.6543 -8.10156 22.7393 -15.7061 22.7393 -15.7061s-10.1943 6.72363 -22.7393 15.7061z" /> + <glyph glyph-name="uniF151" unicode="" +d="M709.51 382.41c0.951172 5.19531 13.5312 36.4443 13.5312 36.4443c15.5859 35.1064 5.67969 60.2686 5.67969 60.2686c-9.18848 34.0986 -35.5723 60.7539 -35.5723 60.7539c1.28027 -0.950195 9.30566 -22.293 9.30566 -22.293 +c18.4941 -51.0811 -31.0938 -80.3916 -31.0938 -80.3916c-12.7754 -8.43262 -33.6348 -28.5352 -33.6348 -28.5352c-29.2529 -28.5938 -20.4131 -63.6426 -20.4131 -63.6426l1.16309 -0.522461c34.7979 -8.54883 67.4814 -22.4102 97.1797 -40.6123 +c-19.6758 38.2852 -6.14551 78.5303 -6.14551 78.5303zM811.22 216.84c-3.25684 42.1055 23.6895 73.6846 23.6895 73.6846c2.77148 4.49707 26.0537 28.748 26.0537 28.748c27.585 26.79 27.8369 53.834 27.8369 53.834c4.22656 35.0674 -10.332 69.6318 -10.332 69.6318 +c0.795898 -1.33887 0.291992 -24.1553 0.291992 -24.1738c-1.88086 -54.2607 -58.8154 -62.9834 -58.8154 -62.9834c-15.043 -3.08203 -41.9111 -13.958 -41.9111 -13.958c-35.0283 -14.5 -41.7559 -46.3125 -42.5117 -50.8672 +c28.8652 -20.626 54.376 -45.5752 75.7002 -73.917zM1014.99 286.6c0.271484 -1.58887 -8.7627 -22.6025 -8.7627 -22.6025c-21.8857 -49.666 -77.9482 -36.5615 -77.9482 -36.5615c-15.1016 2.67578 -44.082 2.59863 -44.082 2.5791 +c-40.9033 -0.46582 -58.7188 -31.8896 -58.7188 -31.8896l2.15234 -5.21387c17.7959 -28.4775 31.5205 -59.6885 40.3984 -92.9141c12.0977 41.5039 49.9766 61.4521 50.0146 61.4521c4.24512 3.04297 34.8545 17.0391 34.8545 17.0391 +c35.5527 14.5977 45.8086 39.5664 45.8086 39.5664c16.9033 31.0361 16.2832 68.5469 16.2832 68.5469zM591.42 349.93c-31.0166 28.2832 -33.2852 69.4395 -33.2852 69.4395c-1.16309 5.15625 -1.02637 38.7705 -0.989258 38.7705 +c1.45312 38.3838 -17.0791 58.1182 -17.0791 58.1182c-21.0908 28.3223 -55.5391 43.3076 -55.5391 43.3076c1.57031 -0.426758 16.9619 -17.3311 16.9619 -17.3311c36.0381 -40.5166 0.87207 -86.1494 0.87207 -86.1494 +c-8.74316 -12.6006 -20.665 -38.9844 -20.665 -38.9844c-15.6445 -35.3193 2.40332 -63.3701 4.40039 -66.3945c17.5625 2.59766 35.6299 3.83789 53.9111 3.64453c17.5439 -0.174805 34.7002 -1.66699 51.4102 -4.41992zM403.69 398.35 +c-2.85059 4.38184 -15.373 35.5928 -15.373 35.5928c-12.8916 36.1924 -37.3955 47.6104 -37.3955 47.6104c-30.2217 18.377 -67.6934 19.5215 -67.6934 19.5215c1.6084 0.155273 22.1572 -9.79004 22.1572 -9.79004c48.6191 -24.2119 32.9365 -79.6348 32.9365 -79.6348 +c-3.41211 -14.9268 -4.67188 -43.9082 -4.67188 -43.9082c-1.49219 -40.8057 29.1172 -60.1328 29.1172 -60.1328l1.45312 0.503906c29.7178 17.3105 62.3623 30.2803 96.9072 37.957c-39.7979 14.5391 -57.4385 52.2822 -57.4385 52.2822zM342.08 294.11 +c-42.1631 -1.08594 -72.3662 27.2949 -72.3662 27.2949c-4.30371 3.00488 -27.4111 27.4111 -27.4111 27.4111c-25.376 28.8457 -52.457 30.3574 -52.457 30.3574c-34.8154 5.93262 -69.9805 -6.90137 -69.9805 -6.90137 +c1.39551 0.71875 24.1348 -0.873047 24.1738 -0.873047c54.085 -4.53613 59.998 -61.8008 59.998 -61.8008c2.32617 -15.1592 11.9219 -42.5322 11.9219 -42.5322c13.7441 -38.4795 49.2783 -45.0908 49.2783 -45.0908l0.71582 0.600586 +c21.6348 27.5469 47.3203 51.7012 76.127 71.5312zM173.13 199.07c-5.13965 1.17969 -35.6699 15.2695 -35.6699 15.2695c-34.2373 17.5098 -59.9229 8.90039 -59.9229 8.90039c-34.5439 -7.35059 -62.5371 -32.3301 -62.5371 -32.3301 +c1.04688 1.2207 22.8174 8.1416 22.8174 8.1416c51.9521 15.7988 78.6074 -35.2617 78.6074 -35.2617c7.73535 -13.2012 26.791 -35.1074 26.791 -35.0684c26.9648 -30.6865 62.499 -23.7275 62.499 -23.7275l0.891602 1.76367 +c9.67383 33.5566 24.4062 64.9219 43.21 93.4385c-38.5576 -16.2266 -76.6885 -1.125 -76.6885 -1.125z" /> + <glyph glyph-name="uniF152" unicode="" +d="M135.969 532.28l214.122 0.00976562c15.2988 -0.0400391 28.2881 -16.4121 24.8477 -31.3203l-36.5898 -158.68c-2.5791 -11.1641 -13.4697 -19.8213 -24.9277 -19.8154h-214.131c-15.3252 -0.0078125 -28.374 16.3867 -24.9277 31.3203l36.6777 158.67 +c2.5791 11.165 13.4707 19.8213 24.9287 19.8154zM77.1582 277.57l214.13 -0.00585938c15.2998 -0.0390625 28.2891 -16.4111 24.8486 -31.3193l-36.5938 -158.76c-2.57812 -11.165 -13.4697 -19.8223 -24.9277 -19.8154h-214.13 +c-15.3262 -0.0078125 -28.374 16.3867 -24.9277 31.3203l36.6729 158.76c2.5791 11.1699 13.4697 19.8203 24.9277 19.8203zM643.309 683.69l107.779 -0.00683594c17.0947 -0.00976562 30.3799 -20.8535 23.1709 -36.3535l-294.91 -632.55 +c-4.08008 -8.76855 -13.498 -14.7764 -23.1699 -14.7812h-107.86c-17.1299 -0.0205078 -30.4502 20.9199 -23.1699 36.4297l294.99 632.48c4.08008 8.76855 13.498 14.7764 23.1699 14.7812zM882.038 683.69l107.79 -0.00683594 +c17.0938 -0.00976562 30.3789 -20.8535 23.1699 -36.3535l-294.909 -632.55c-4.08008 -8.76855 -13.499 -14.7764 -23.1709 -14.7812h-107.859c-17.1406 -0.0205078 -30.4502 20.9199 -23.1699 36.4297l294.979 632.48c4.08008 8.76855 13.498 14.7764 23.1699 14.7812z" /> + <glyph glyph-name="uniF153" unicode="" +d="M484.292 341.88l-85.7129 57.4912l57.4902 26.1328zM403.802 336.66l-63.7617 32.4023l33.4482 19.8604zM319.132 295.89l-43.9014 30.3154l29.2676 21.9521zM744.562 166.28l27.1768 41.8125l20.9043 -19.8604zM770.702 126.56l43.8994 33.4492l16.7266 -17.7695z +M740.382 542.58l-32.4062 71.0791l53.3105 1.04395zM595.092 483l-45.9941 -3.1377l-5.22461 30.3145zM587.771 442.23l-26.1309 -7.31641l-5.22656 19.8574zM880.452 472.54l41.8125 17.7695l-7.32031 -22.9951zM873.142 429.69l32.4014 9.41016l-6.27246 -18.8174z +M527.042 360.65h100.88v-12.4512h-100.88v12.4512zM527.042 390.54h100.88v-12.4551h-100.88v12.4551zM835.082 360.65h100.88v-12.4512h-100.88v12.4512zM835.082 390.54h100.88v-12.4551h-100.88v12.4551zM799.531 464.37h-164.399v11.208h51.1592 +c6.29883 26.9736 7.54492 52.7539 -0.0527344 65.8242c-3.24414 5.55469 -7.72559 8.15234 -14.1211 8.15234c-29.249 0 -41.332 -30.9297 -41.8359 -32.2441l0.0078125 0.0078125l-10.4941 3.9375c0.600586 1.61426 15.2393 39.5078 52.3213 39.5078 +c10.3496 0 18.5811 -4.75293 23.7979 -13.7236c9.26465 -15.916 8.17578 -43.4531 1.89941 -71.4619h89.7695c11.9248 35.0371 36.8271 51.5576 78.4326 51.5576v-11.2051c-45.0967 0 -57.7275 -19.1172 -66.752 -40.3525h48.9824l-0.113281 -11.1514zM806.892 409.02 +l0.0136719 -0.00195312c0.0185547 -0.0214844 0.0302734 -0.0449219 0.0488281 -0.0703125c-2.99512 -1.91016 -63.2715 -41.0654 -63.2715 -41.0654l40.3135 -24.9385l-5.97168 -9.48633l-43.4795 28.374l-40.2764 -26.5527l-6.1709 9.36133l36.0342 23.7461 +l-64.0078 40.292l2.65039 4.66211c8.19043 14.4248 15.4688 32.6338 20.6484 51.0352h11.6104c-4.7002 -17.3525 -11.1338 -34.3008 -18.0742 -48.2012h114.051c-9.79785 16.4004 -11.3926 35.5137 -7.41406 48.2012l11.4189 0.0556641 +c-5.55859 -19.0566 -1.34766 -35.7949 11.9482 -55.3994zM734.41 375.16l45.1797 29.7852l-92.5244 0.0224609zM940.132 583.47c-0.0361328 0.03125 -0.0888672 0.0537109 -0.137695 0.0839844c3.33984 -169.36 -83.0996 -304.157 -204.109 -373.3 +c-117.618 69.1797 -207.562 183.34 -214.48 366.689c0.0673828 0.0488281 0.140625 0.0947266 0.208008 0.139648c-1.77246 43.6611 5.19727 105.214 20.9297 131.76c37.2969 -17.665 86.7344 -49.0234 96.584 -89.998c58.9502 10.2021 126.258 11.2568 185.96 2.34277 +c12.458 38.084 67.502 75.3281 97.749 86.8223c11.1553 -22.6797 17.2256 -105.051 17.2969 -124.54zM839.451 618.82c0.439453 -0.078125 0.87793 -0.161133 1.32129 -0.243164c-0.439453 0.0830078 -0.878906 0.165039 -1.32129 0.243164zM831.925 620.119 +c1.05859 -0.167969 2.12793 -0.360352 3.19043 -0.540039c-1.0625 0.180664 -2.12402 0.364258 -3.19043 0.540039zM921.318 570.244l0.0136719 0.00683594c-0.0263672 0.00976562 0.942383 77.4014 -7.45117 113.23c-6.71875 -30.7871 -19.0234 -66.0273 -50.7529 -89.0977 +c-76.1396 20.998 -179.501 19.3018 -254.58 -2.18848c-34.4746 14.7295 -50.3945 44.7549 -59.1689 92.6289c-31.54 -125.229 3.2998 -358.67 188.25 -450.83c108.97 62.2705 186.81 183.69 183.689 336.25zM1000.18 42.4297l-0.0136719 0.0126953 +c11.0098 -12.3193 16.4297 -25.5791 14.4297 -35.4795l-1.38867 -6.95215h-106.08c-192.8 100.71 -363.66 172.851 -542.3 188.681c2.12793 -32.4814 11.9834 -58.6338 29.5615 -78.209c18.4385 6.28809 38.5117 5.11719 51.5146 -3.38477 +c8.78711 -5.74707 13.626 -14.291 13.626 -24.0508v-8.64844h-82.3096c-52.6748 37.1436 -99.9971 75.6416 -137.14 111.891c-41.7754 -10.21 -68.375 -32.3379 -84.4395 -51.7266c-25.5869 -30.8809 -38.0791 -72.2012 -31.8232 -105.26l1.94043 -10.2549h-110.76v8.64844 +c0 16.6904 61.3721 117.43 145.35 211.35c5.32227 5.9541 10.8535 12.0156 16.5762 18.1533c-34.4473 45.7871 -55.001 89.9375 -60.8281 131.45c-6.15234 43.832 4.41504 84.1689 30.5586 116.649c26.6455 33.1084 62.2227 49.3691 108.761 49.71 +c13.2402 0.0976562 31.3555 -2.33105 49.5947 -5.59277c3.1748 6.42676 7.80859 11.9375 13.9521 14.9365c18.54 9.05664 85.4619 -13.5469 118.5 -59.8457c-44.7725 -19.9727 -119.774 -12.7314 -133.73 7.87988c-3.33691 4.92871 -4.43262 12.8936 -3.40234 21.2266 +c-52.7686 8.87402 -104.09 5.71289 -140.21 -39.1582c-23.0723 -28.6621 -32.376 -64.416 -26.9033 -103.39c4.33203 -30.8574 18.9189 -71.5762 55.6846 -121.2c79.2197 82.3604 221.39 167.639 351.279 198.96l3.90039 -16.9102 +c-120.63 -29.1797 -259.823 -108.552 -344.141 -196.38c12.7725 -15.9502 27.8027 -32.7549 45.4443 -50.3857c13.5264 2.62695 28.3574 4.13965 44.6416 4.13965c19.2021 0 38.2373 -0.649414 57.1484 -1.90234c0.52832 26.5078 5.20117 56.166 14.0713 88.917 +l16.6934 -4.52344c-8.62793 -31.8613 -13.125 -60.4531 -13.5225 -85.7109c181.5 -15.6299 352.37 -87.2402 546.96 -188.771h84.8496c-1.51953 3.70508 -4.3125 8.42676 -8.94043 13.6035c-6.31055 7.05664 -30.1533 29.8037 -72.0977 26.2119l-6.7002 -0.574219 +l-154.37 166.2l8.8623 11.1602s127.87 -134.66 149.92 -160.91c31.0801 0.739258 68.29 -9.31055 87.2803 -30.5605zM142.328 145.593l-0.00390625 -0.00488281c16.5723 19.999 43.1338 42.6445 83.6465 54.8223c-13.9111 14.3125 -26.5762 28.5088 -37.9463 42.5625 +c-82.5146 -88.5898 -138.359 -176.299 -152.38 -206.64h69.7754c-3.18066 35.8701 10.708 77.6396 36.9082 109.26z" /> + <glyph glyph-name="uniF154" unicode="" +d="M331.25 632.5h367.5c174.62 0 316.25 -141.94 316.25 -316.56c0 -174.631 -141.63 -315.94 -316.25 -315.94h-367.5c-174.58 0 -316.25 141.311 -316.25 315.94c0 174.619 141.67 316.56 316.25 316.56zM339.38 520.94 +c-113.06 -0.000976562 -204.689 -91.9502 -204.689 -205c0 -113.051 91.6299 -204.381 204.689 -204.381h351.24c113.11 0 204.689 91.3301 204.689 204.381c0 113.05 -91.5801 205 -204.689 205h-351.24z" /> + <glyph glyph-name="uniF155" unicode="" +d="M15 719.375h1000v-869.38h-1000v869.38zM349.69 569.375c-157.12 0 -284.69 -127.84 -284.69 -285c0 -157.17 127.57 -284.38 284.69 -284.38h330.619c157.16 0 284.69 127.21 284.69 284.38c0 157.16 -127.53 285 -284.69 285h-330.619zM356.88 468.745h316.24 +c101.8 0 184.069 -82.6299 184.069 -184.37c0 -101.75 -82.2695 -184.07 -184.069 -184.07h-316.24c-101.75 0 -184.07 82.3203 -184.07 184.07c0 101.74 82.3203 184.37 184.07 184.37z" /> + <glyph glyph-name="uniF156" unicode="" horiz-adv-x="852" +d="M348.374 799.995l-0.0214844 0.0205078c1.40234 -0.163086 1.66113 -0.758789 4.1875 -9.87109c4.25293 -15.3438 11.9082 -36.5 19.8916 -54.8906c10.3096 -23.749 28.0508 -58.8379 44.1221 -87.1973l2.91699 -5.23438 +c29.4248 -4.58887 65.4688 -10.7051 81.9609 -13.9844c87.4414 -17.3877 156.647 -40.5811 209.964 -70.4316c38.8379 -21.752 70.5459 -48.1953 96.7256 -80.5732c8.96094 -11.082 16.3857 -21.5557 27.2949 -38.5127l1.94434 -2.99121l-12.4893 -1.87012 +c-80.2158 -12.2881 -201.231 -41.7988 -310.709 -74.332c0.0810547 -1.00195 0.279297 -2.28516 0.523438 -3.66406c3.45703 -19.5654 5.54395 -39.4795 6.80469 -63.9385c0.775391 -15.0303 0.410156 -59.2783 -0.597656 -72.5371 +c-3.59961 -47.3369 -9.10156 -87.2451 -16.2275 -117.184c-11.7715 -49.4453 -33.6338 -107.327 -63.8652 -169.082c-8.88477 -18.1494 -16.5684 -32.7148 -17.6484 -33.4277c-0.610352 -0.40332 -13.8799 -0.381836 -23.8555 0 +c-49.1914 1.88574 -138.498 14.5791 -184.712 26.249c-27.7305 7.00293 -64.7578 19.3809 -86.6729 29.0156c-42.9648 18.8857 -79.8564 46.6514 -98.4131 73.959c-14.5273 21.376 -18.2266 44.5078 -10.6943 67.377c4.18652 12.7119 13.9453 29.2207 26.3975 44.7207 +c8.37109 10.417 24.7344 26.668 35.7471 35.4453c0.538086 0.429688 1.16406 0.974609 1.71973 1.4209l-1.12109 -0.373047c92.2793 75.8467 152.017 144.023 180.374 205.873c15.8213 34.5098 22.3262 64.1885 21.4619 97.9658 +c-1.34668 52.6348 -15.9512 90.7959 -49.5068 129.522c-7.41797 8.56152 -67.9756 67.6025 -67.9756 67.6025c-5.78125 5.55664 -10.9658 10.8135 -12.7129 15.1807c-0.758789 1.89551 -1.10742 3.64551 -1.19629 5.16016l-0.224609 0.223633 +c0.0078125 1.12012 0.136719 2.19824 0.374023 3.21582c0.105469 0.549805 0.239258 1.00098 0.374023 1.4209c0.015625 0.0419922 0.0556641 0.106445 0.0742188 0.149414c0.354492 1.0498 0.748047 1.64551 0.748047 1.64551 +c0.0195312 -0.0771484 0.0527344 -0.147461 0.0742188 -0.224609c2.83496 4.3252 10.8525 12.1387 17.4248 16.752c20.1729 14.1641 52.9092 30.5967 95.0498 47.7119c31.0859 12.6309 79.4727 30.0391 82.4883 29.6875zM346.031 793.061l-0.000976562 0.00195312 +c-3.72559 -0.669922 -54.9287 -21.9873 -73.7334 -30.7363c-14.6621 -6.82227 -47.7598 -24.1807 -47.1885 -24.7529c0.0966797 -0.0966797 6.19922 -1.01367 13.4609 -2.01953c45.0684 -6.24121 107.316 -16.9082 121.221 -20.7891 +c5.98242 -1.66992 5.92383 -2.56836 0.897461 12.4141c-6.66992 19.8809 -10.9082 38.3857 -13.2363 57.4316c-0.552734 4.52246 -1.10059 8.33594 -1.19629 8.4502c-0.0185547 0.0224609 -0.103516 0.0224609 -0.223633 0zM214.714 732.04l-0.0302734 -0.00292969 +l7.0293 -6.65527c7.25098 -6.80078 26.084 -24.7529 50.1338 -48.0059l12.9365 -12.5635c4.43164 -0.762695 8.8877 -1.56641 13.3115 -2.31836c1.40234 0.608398 4.51367 2.37793 8.00195 4.56152c14.7246 9.21582 36 21.0488 55.3389 30.7363 +c4.79883 2.40332 8.63965 4.45605 8.52441 4.56152s-3.85254 0.446289 -8.375 0.822266c-40.0879 3.32812 -112.628 17.2207 -141.562 27.0693zM209.374 727.775l0.00195312 -0.00488281l-1.79492 -1.19629c-19.6592 -13.8672 -31.2393 -27.4521 -31.334 -36.6426v-1.49512 +c1.43555 -0.536133 2.94336 -1.12207 4.25977 -1.6416c1.05762 -0.364258 2.1123 -0.766602 3.21582 -1.12207c0.288086 -0.0917969 0.540039 -0.134766 0.822266 -0.224609c1.80762 -0.574219 3.66504 -1.10059 5.53418 -1.64453 +c0.0507812 -0.015625 0.0986328 -0.0595703 0.149414 -0.0751953c3.25391 -0.946289 6.54297 -1.87012 9.72168 -2.69238c1.94629 -0.492188 4.07129 -1.00879 6.43164 -1.57031c2.09766 -0.506836 3.95996 -0.936523 5.75781 -1.3457 +c0.599609 -0.138672 1.01465 -0.229492 1.64453 -0.374023c0.888672 -0.198242 1.99902 -0.431641 2.76758 -0.598633c11.2158 -2.4248 25.7314 -5.04102 39.3359 -7.40332c-0.130859 0.360352 -1.7002 2.46582 -3.88867 5.08496 +c-2.34668 2.80957 -12.9326 15.8574 -23.4814 29.0156zM372.552 695.165c-0.191406 0.0146484 -0.450195 -0.113281 -0.672852 -0.298828c-0.541016 -0.451172 -3.4375 -2.87207 -6.50586 -5.45898c-12.834 -10.8203 -27.2871 -20.8428 -41.5791 -28.79 +c-1.61621 -0.899414 -2.87012 -1.71387 -2.99121 -1.94434c23.0996 -3.83887 48.2793 -7.91797 77.8477 -12.5635c-0.0332031 0.209961 -0.310547 0.532227 -0.598633 0.97168c-3.49707 5.33691 -18.0107 32.9668 -22.6592 43.1484 +c-1.69824 3.7207 -2.2666 4.8916 -2.84082 4.93555zM188.361 672.056c0 -0.107422 2.94727 -2.60254 6.58105 -5.45801c29.1562 -22.916 54.374 -51.3447 70.2949 -79.3438c1.70996 -3.00586 3.23633 -5.3623 3.36523 -5.23438 +c0.12793 0.128906 -1.2002 5.45898 -2.99121 11.8906c-4.69336 16.8496 -18.4619 60.749 -19.3691 61.7686c-0.0859375 0.0976562 -6.83691 1.94336 -15.0312 4.03809c-6.41895 1.6416 -12.5234 3.24902 -18.0215 4.78613 +c-7.84961 2.19336 -14.5576 4.24805 -19.668 5.98242c-2.77344 0.941406 -5.0752 1.64746 -5.16016 1.57031zM255.44 653.511c-0.101562 -0.00683594 -0.150391 -0.0439453 -0.150391 -0.0751953c0 -0.246094 1.2168 -3.03418 2.69238 -6.20703 +c9.17188 -19.7139 19.4307 -47.7354 24.3799 -66.7051c0.737305 -2.82617 1.46289 -5.16016 1.57031 -5.16016s3.42578 3.22266 7.40332 7.17969c9.90039 9.84668 23.4697 20.6914 38.5879 30.8096c6.05664 4.05273 24.1689 14.875 28.6416 17.125 +c2.01953 1.01562 3.66406 2.07324 3.66406 2.31836s-3.63477 1.04785 -8.07617 1.79492c-26.6602 4.48438 -68.167 12.5137 -91.3848 17.6484c-3.60352 0.796875 -6.62695 1.31934 -7.32812 1.27148zM373.521 631.076l0.0195312 0.00390625 +c-1.31836 0.44043 -38.585 -28.5234 -52.4219 -40.7559c-7.24219 -6.4043 -24.0781 -23.3105 -24.0781 -24.1543c0 -0.28125 9.46484 -3.08594 21.0137 -6.28223c20.3164 -5.62305 44.0312 -12.6348 58.5332 -17.2773l7.0293 -2.24316l0.449219 1.4209 +c0.222656 0.77832 0.607422 6.03809 0.822266 11.7402c0.772461 20.4893 -1.59863 42.6445 -6.58105 62.3672c-2.60156 10.2998 -4.00879 14.9219 -4.78613 15.1807zM382.888 629.734c-0.0986328 -0.09375 0.704102 -2.18652 1.72266 -4.56055 +c9.47363 -22.0664 14.6387 -48.1621 14.6582 -74.0352c0.00292969 -4.76465 0.102539 -8.6748 0.223633 -8.6748s5.87402 3.84863 12.8623 8.52539c26.5312 17.7559 53.2598 32.2109 89.2891 48.458c9.10742 4.10742 11.9404 5.72363 11.1416 6.05762 +c-1.65332 0.69043 -29.124 6.39062 -48.085 10.0205c-25.4404 4.87012 -81.3926 14.5996 -81.8125 14.209zM527.669 601.094c-0.522461 0.521484 -30.4248 -16.1582 -48.9834 -27.2949c-23.2031 -13.9229 -67.0059 -42.9043 -66.1074 -43.7461 +c0.239258 -0.224609 4.97852 -2.22266 10.4697 -4.4873c19.6943 -8.12207 37.6318 -16.9111 53.4697 -26.1748c4.19922 -2.45605 7.85449 -4.35254 8.15039 -4.2627s2.83008 4.20898 5.68359 9.19824c16.1973 28.3115 29.373 58.4502 34.3252 78.7451 +c1.5918 6.52051 3.4248 17.5889 2.99219 18.0225zM537.988 599.448c-0.325195 0.000976562 -0.751953 -2.05664 -0.973633 -4.56055c-2.43555 -27.5029 -11.8691 -59.8418 -26.3975 -90.71c-1.78613 -3.79492 -3.01172 -6.9541 -2.7666 -6.9541 +s3.68652 1.36133 7.70312 2.99121c48.3311 19.6182 98.5684 35.1572 157.116 48.6074l6.9541 1.64453l-9.94629 4.4873c-23.9277 10.8662 -60.8281 24.3125 -92.8037 33.875c-12.8359 3.83984 -37.626 10.6191 -38.8857 10.6191zM291.219 542.764 +c-0.137695 -0.133789 0.200195 -3.38379 0.74707 -7.17676c4.31738 -29.9229 4.9707 -59.2939 1.87012 -82.1865c-0.142578 -1.0498 -0.0322266 -1.94434 0.223633 -1.94434c0.256836 0 5.4873 4.79883 11.5918 10.6943c20.5918 19.8857 37.7422 35.4922 55.5635 50.4014 +c4.43652 3.71191 8.07617 6.86523 8.07617 7.03027c-0.0214844 0.844727 -32.9678 11.8779 -48.458 16.2266c-10.3066 2.89355 -29.2178 7.34668 -29.6143 6.95508zM689.13 542.392c-0.253906 0.25293 -17.8965 -4.8623 -34.4766 -9.94531 +c-31.4395 -9.63965 -73.4316 -24.583 -104.17 -37.0918c-17.6572 -7.18555 -40.7705 -17.126 -40.7559 -17.499c0.00585938 -0.161133 1.24609 -1.1875 2.7666 -2.31836s6.05371 -4.8623 10.0957 -8.22559c21.6592 -18.0264 39.8125 -38.0889 55.1133 -60.9482 +c2.00098 -2.9873 3.75879 -5.45898 3.88867 -5.45898c0.130859 0 4.67871 5.62402 10.0957 12.4893c5.41797 6.86523 21.4893 27.165 35.7471 45.0938c27.1436 34.1318 39.043 49.6211 47.2627 61.3955c5.63281 8.06934 14.7158 22.2256 14.4326 22.5088zM699.522 539.625 +c-0.118164 -0.351562 -2.9668 -6.16211 -6.2832 -12.8623c-22.2617 -44.9844 -41.1543 -70.1299 -82.6328 -110.005c-6.67871 -6.41992 -11.9326 -11.7402 -11.666 -11.7402s4.40137 1.01562 9.19824 2.16895c70.6299 16.9824 144.007 29.1865 201.387 33.502 +c7.42969 0.558594 13.543 1.00781 13.6104 1.04688c0.263672 0.15332 -17.4951 18.5986 -24.7529 25.7246c-25.5146 25.0527 -57.9717 49.458 -91.083 68.4268c-3.95996 2.26758 -7.28125 3.83984 -7.77734 3.73828zM396.278 508.516 +c-0.427734 0.0966797 -1.06543 -1.2627 -1.57031 -3.58887c-5.6582 -26.0547 -15.4756 -52.749 -27.6689 -75.0811c-3.65332 -6.69141 -3.86133 -7.17871 -3.29004 -7.17871c0.173828 0 5.66016 3.26465 12.1895 7.25391c22.8965 13.9873 44.7666 26.0762 70.3691 38.8867 +c8.08691 4.0459 14.624 7.44336 14.5078 7.55273c-0.923828 0.865234 -19.4248 10.7119 -31.6338 16.8252c-13.3496 6.68457 -31.0088 14.9053 -32.9033 15.3301zM378.479 505.376c-0.327148 0.328125 -27.3877 -21.2959 -40.2314 -32.1572 +c-17.9434 -15.1729 -41.2217 -36.3428 -41.2051 -37.4658c0.00488281 -0.253906 2.9502 -1.94629 6.58105 -3.81348c9.23633 -4.75098 16.4717 -10.1611 25.3516 -18.7705l7.70215 -7.32812l3.36523 5.45801c1.85059 3.03516 5.05176 8.65137 7.17871 12.4893 +c9.05957 16.3398 18.502 38.0693 24.0791 55.3389c2.90723 9.00391 7.54785 25.8789 7.17871 26.249zM486.764 460.806l-4.78613 -7.17969c-23.7559 -35.498 -55.5469 -71.9512 -91.5332 -105.068c-14.0371 -12.917 -13.2646 -12.2637 -12.4883 -12.2637 +c0.369141 0 5.7207 1.89355 11.9648 4.1875c56.2617 20.6758 104.498 36.1533 166.913 53.4697l11.0674 3.06641l-1.71973 1.71973c-3.08008 3.25195 -18.0137 16.6816 -25.7246 23.1074c-13.7607 11.4658 -31.7959 24.8027 -47.0381 34.6982zM458.272 453.7 +c-0.328125 0.326172 -26.7061 -13.0693 -43.8984 -22.2861c-25.0283 -13.415 -64.7373 -36.1104 -67.3027 -38.4365c-0.641602 -0.581055 -0.123047 -2.07129 2.99121 -8.375c7.37207 -14.9258 11.5596 -32.5645 11.5908 -49.0576 +c0.00683594 -3.12988 0.250977 -5.12793 0.598633 -5.00977c0.316406 0.107422 6.10449 6.80566 12.9365 14.8818c16.3545 19.3281 40.125 49.0176 53.4697 66.7793c11.1543 14.8457 29.9395 41.1787 29.6143 41.5039zM286.238 411.559 +c-0.341797 0.000976562 -1.6748 -3.08301 -2.91699 -6.87891c-2.99023 -9.13574 -7.16602 -19.6436 -11.3672 -28.4912c-4.72461 -9.9541 -9.24707 -17.7959 -18.2461 -31.5596c-1.35254 -2.06738 -0.949219 -1.78125 11.0674 7.77734 +c11.3906 9.06055 31.0576 23.96 43.9717 33.2773c4.62695 3.33789 8.19238 6.20996 7.92676 6.43164c-6.88672 5.74414 -14.7178 11.04 -23.4062 15.8535c-3.5459 1.96484 -6.68848 3.58984 -7.0293 3.58984zM332.078 375.59 +c-0.0888672 -0.0107422 -0.213867 -0.0214844 -0.299805 -0.0742188c-0.324219 -0.200195 -2.84961 -3.26465 -5.68359 -6.73047c-26.4932 -32.4111 -61.6611 -64.8389 -102.45 -94.4502c-5.14258 -3.7334 -9.34668 -6.88477 -9.34668 -7.0293 +s5.41113 2.47949 12.1143 5.83301s16.9932 8.25586 22.8086 10.918c20.7832 9.5166 51.5283 22.3262 84.9521 35.2969l18.6201 7.25391l-0.298828 2.69238c-1.53711 12.6035 -7.48633 28.1006 -15.2559 39.71c-3.68652 5.50781 -4.53906 6.65723 -5.16016 6.58008z +M310.914 370.355c-0.539062 0.536133 -46.6904 -30.7627 -66.8564 -45.3184c-7.48633 -5.4043 -8.42578 -6.29883 -13.5361 -12.9375c-7.75977 -10.0811 -14.626 -18.1641 -23.5557 -27.8926c-14.1709 -15.4395 -15.3193 -16.7461 -14.4336 -16.2275 +c0.485352 0.283203 4.18848 2.59766 8.22656 5.15918c32.2744 20.4727 58.3008 41.4551 84.5791 68.2754c10.5 10.7168 26.1152 28.4014 25.5762 28.9414zM493.605 354.054c-26.377 -8.04297 -51.8604 -16.2803 -75.6807 -24.3799 +c4.55371 -3.50391 29.8281 -20.3311 43.2998 -28.791c15.6055 -9.79883 37.6621 -22.7334 38.7383 -22.7334c0.333984 0 0.389648 3.63965 0.149414 9.27246c-1.00293 23.4619 -4.57227 58.7959 -6.50684 66.6318zM403.493 324.739 +c-1.23438 -0.432617 -2.51465 -0.842773 -3.73926 -1.27246c-0.166992 -1.77344 -0.188477 -5.15137 -0.223633 -11.8906c-0.145508 -27.5059 -5.32227 -61.8164 -14.5078 -95.7949c-1.11328 -4.11914 -1.87109 -7.47852 -1.64551 -7.47852s5.80566 2.37402 12.4141 5.30957 +c37.917 16.8447 68.8594 33.459 93.7012 50.3281c11.6533 7.91406 11.042 7.06348 5.98242 9.27246c-16.3184 7.12695 -54.4365 28.3008 -82.5596 45.917c-4.72168 2.95801 -7.55273 4.69043 -9.42188 5.60938zM382.404 317.26 +c-4.6875 -1.70703 -9.49609 -3.47363 -13.9854 -5.16113c-21.0391 -7.90625 -41.1279 -15.71 -60.4238 -23.5566c0.890625 -3.0166 4.78906 -12.3486 7.40332 -17.499c6.10254 -12.0176 14.4658 -24.2119 25.0527 -36.4932 +c6.19727 -7.18652 24.8105 -25.3047 25.3516 -24.6768c0.222656 0.257812 1.65137 4.56445 3.1416 9.57227c6.2334 20.9531 10.1025 39.374 12.4883 59.3008c0.899414 7.51172 1.47363 33.0654 0.97168 38.5137zM293.766 282.607 +c-1.87207 -0.77832 -3.75195 -1.54102 -5.6084 -2.31934c-0.155273 -0.34082 -0.308594 -0.728516 -0.448242 -1.19629c-0.402344 -1.34277 -2.65918 -7.31445 -5.01074 -13.3115c-13.5566 -34.5713 -37.7637 -83.4443 -53.7686 -108.432 +c-3.58789 -5.60254 -3.99414 -6.36328 -2.7666 -5.9082c0.40332 0.149414 10.7568 3.50977 23.0322 7.47754c32.2129 10.4131 60.3135 20.2158 86.0742 29.9873c22.2285 8.43164 21.9531 8.28223 21.0889 9.04883c-0.433594 0.383789 -3.48828 2.97754 -6.73047 5.75781 +c-10.0986 8.66016 -22.1523 21.7168 -31.4082 33.9521c-8.47852 11.207 -18.2422 28.6631 -22.584 40.4561c-0.770508 2.09277 -1.48926 3.80762 -1.87012 4.4873zM265.433 270.569c-27.2998 -11.8496 -52.9287 -23.7891 -77.3232 -35.9688 +c-0.808594 -1.24707 -1.28906 -3.26758 -2.24414 -7.85254c-2.38574 -11.46 -2.72949 -29.9355 -0.74707 -40.6074c2.00195 -10.7832 5.84863 -22.3691 10.4688 -31.5586c2.11328 -4.20312 2.38086 -4.50977 3.06641 -3.51465 +c0.416016 0.604492 3.47559 5.43848 6.80469 10.7686c19.2998 30.8916 33.8525 56.2402 47.0381 81.9609c5.6582 11.04 11.3828 22.8906 12.9365 26.7725zM500.92 262.419l-2.01953 -1.71777c-2.77051 -2.43262 -15.2197 -11.4785 -23.5566 -17.0508 +c-22.2188 -14.8506 -47.8008 -29.7842 -74.5566 -43.6729c-6.75586 -3.50586 -12.3428 -6.50879 -12.4893 -6.65527c-0.538086 -0.537109 18.6055 -12.3311 31.8564 -19.5928c20.0098 -10.9658 42.2109 -20.4219 62.668 -26.7725 +c4.62988 -1.4375 8.4707 -2.59668 8.52539 -2.54297s0.744141 4.4668 1.57031 9.79688c4.70996 30.3691 7.97266 72.0459 8.00195 102.449v5.75879zM163.217 221.888c-6.65137 -3.49316 -13.2627 -7.00195 -19.7432 -10.5469 +c-11.1123 -6.07715 -19.1943 -10.5645 -26.0244 -14.5068c-14.4971 -8.8877 -24.4912 -17.0547 -36.4932 -29.4629c-21.3086 -22.0283 -36.5303 -48.2822 -39.6338 -68.2754c-0.357422 -2.30664 -0.30957 -2.54004 0.672852 -2.24414 +c0.599609 0.180664 7.97852 2.2627 16.3779 4.56152c28.333 7.75879 118.435 34.0947 119.426 34.9238c0.114258 0.0957031 -2.03418 4.80176 -4.78613 10.3955c-9.89746 20.1172 -13.1357 34.8115 -12.04 54.7402c0.250977 4.54688 0.890625 11.0928 1.49609 14.582 +c0.65332 3.76367 0.901367 5.3125 0.748047 5.83301zM375.5 184.075c-0.0839844 -0.104492 -0.826172 -2.41602 -1.71777 -5.16211c-8.75195 -26.9307 -25.8428 -65.7217 -42.9258 -97.6641c-3.0791 -5.75684 -5.60938 -10.6348 -5.60938 -10.7686 +s1.44531 0.375977 3.14062 1.04688c1.69629 0.671875 10.3359 3.9209 19.2188 7.25391c60.8545 22.8291 120.405 47.6182 138.496 57.6572l4.33789 2.39355l-3.1416 0.74707c-34.6309 7.92383 -75.2842 23.6982 -104.395 40.5332 +c-3.99023 2.30664 -7.31836 4.06543 -7.4043 3.96289zM353.815 176.969c-0.0927734 0.0947266 -4.48828 -1.67578 -9.7959 -3.96289c-37.4795 -16.1475 -75.1279 -29.1768 -119.576 -41.3535l-12.4893 -3.43945l2.39355 -2.99121 +c16.7891 -21.1807 42.3662 -42.9561 71.2666 -60.6494c4.85645 -2.97266 8.96191 -5.36914 9.12305 -5.38379c0.162109 -0.0146484 4.44824 7.27148 9.49805 16.2275c19.8398 35.1914 35.3857 66.5518 47.2617 95.2705c1.39551 3.37598 2.41113 6.18848 2.31836 6.28223z +M488.498 130.007c-0.445312 0.0917969 -2.44043 -0.87793 -5.08398 -2.46777c-21.9795 -13.2188 -86.249 -44.0488 -148.293 -71.1182c-10.2598 -4.47656 -18.4922 -8.28516 -18.2471 -8.52539c0.724609 -0.709961 14.501 -6.7998 24.0049 -10.6191 +c33.9707 -13.6494 70.1895 -23.8564 110.677 -31.1836c0.807617 -0.145508 1.62598 -0.329102 1.79492 -0.374023c0.168945 -0.0439453 2.98145 8.42773 6.28125 18.8457c7.47168 23.5879 11.498 36.9707 16.3027 53.9912c5.72852 20.29 12.6377 48.2715 12.6377 51.3018 +c0 0.0556641 -0.0107422 0.134766 -0.0742188 0.149414zM177.694 119.388c-0.078125 0.0703125 -6.58203 -1.47559 -14.4336 -3.36719c-7.85156 -1.89258 -29.7988 -7.0459 -48.7578 -11.4414c-34.1318 -7.91504 -70.4795 -16.4531 -72.4639 -17.0508 +c-1.37207 -0.413086 -1.36914 -3.7373 0.0751953 -10.2451c3.12793 -14.0947 11.1094 -29.4619 22.8086 -44.0459c5.68555 -7.08594 18.1914 -19.7871 25.3516 -25.7988l6.13184 -5.16016l5.68359 8.82422c3.14062 4.86523 8.6748 13.1289 12.3389 18.3213 +c3.66406 5.19336 13.5605 19.0195 21.9854 30.8105c24.2393 33.9238 41.6123 58.8379 41.2803 59.1533zM195.117 112.655l0.0263672 -0.000976562l-24.0264 -28.9316c-35.1055 -42.2607 -51.1621 -62.6494 -63.9414 -81.1475l-3.96289 -5.6084l2.54199 -1.79492 +c1.38086 -0.978516 2.59375 -1.78027 2.69238 -1.79492c0.0986328 -0.0136719 17.9268 6.12207 39.6338 13.6855c38.4893 13.4102 121.702 42.9717 122.716 43.5977c0.279297 0.172852 -3.02734 2.37598 -7.32812 4.86133 +c-24.3613 14.0781 -44.3066 30.4023 -63.9395 52.2725zM303.951 34.9551c-0.0947266 -0.119141 -3.85254 -5.78613 -8.2998 -12.5615c-16.2607 -24.7725 -35.7305 -50.9541 -55.3389 -74.4092c-3.9707 -4.75098 -7.25293 -8.90625 -7.25293 -9.19824 +c0 -0.612305 4.60059 -1.7666 5.90723 -1.49512c0.485352 0.100586 9.74414 2.71875 20.5654 5.83301c58.3369 16.7842 129.891 37.8828 153.302 45.2422c14.748 4.63574 34.75 11.3828 35.6699 11.9648c0.488281 0.30957 -1.07129 0.641602 -4.11328 0.897461 +c-19.8115 1.66992 -53.2002 7.44238 -76.3516 13.2363c-18.8496 4.71777 -32.8027 9.06738 -50.5518 15.7041c-7.36328 2.75391 -13.4395 4.90625 -13.5361 4.78613zM279.874 34.2832c-0.0810547 0.0761719 -3.50781 -0.90625 -7.55664 -2.16992 +c-21.666 -6.75977 -54.6904 -16.0996 -114.415 -32.3799c-22.4492 -6.12012 -41.1182 -11.1934 -41.4277 -11.292c-1.07715 -0.341797 12.7227 -9.02734 23.5566 -14.8818c8.66895 -4.68555 20.4248 -10.1045 31.707 -14.583 +c9.10352 -3.6123 43.499 -15.8018 48.3848 -17.124l2.09375 -0.523438l3.96289 6.9541c2.19043 3.82324 6.25879 10.5322 9.04883 14.9561c2.78906 4.4248 10.9189 17.2617 18.0967 28.5684c17.001 26.7773 26.7236 42.3008 26.5488 42.4756zM449.476 -5.50195 +l0.0205078 -0.015625c-0.900391 -0.196289 -4.50977 -1.69336 -8.74902 -3.66406c-26.8184 -12.4688 -53.3525 -22.7529 -80.166 -30.9609c-21.2617 -6.50879 -42.2109 -11.7803 -85.8496 -21.6123l-20.415 -4.56152l3.36426 -0.748047 +c14.3584 -3.27832 71.2402 -13.2334 105.197 -18.3779c19.4053 -2.94531 51.4814 -7.37891 53.7686 -7.47852c0.942383 -0.0410156 1.55566 0.961914 3.36523 5.30957c8.08105 19.4121 30.2529 80.6973 29.6875 82.1094 +c-0.0107422 0.0283203 -0.0957031 0.0283203 -0.223633 0z" /> + <glyph glyph-name="uniF157" unicode="" horiz-adv-x="930" +d="M406.652 693.468l0.00390625 0.0166016c16.1572 0.213867 27.3135 -16.9814 15.7852 -30.9766c-55.7852 -91.0371 -111.576 -182.238 -167.338 -273.324c-7.49902 -14.8105 -13.876 -30.0176 -16.7334 -46.6426 +c-0.102539 -2.09277 -0.323242 -3.59863 -0.711914 -4.51074c-0.163086 -1.37988 -0.324219 -2.79297 -0.474609 -4.15332c2.13672 -3.25 4.2373 -6.52539 6.41211 -9.7373c58.9375 -96.4629 117.862 -193.062 176.825 -289.487 +c17.5791 -24.1943 -5.73047 -34.748 -28.6025 -34.6553c-47.4492 0.231445 -94.8662 -0.250977 -142.3 0.474609c-25.7158 1.41602 -46.8057 19.1113 -57.918 41.4199c-56.25 91.5879 -112.865 182.917 -168.888 274.638c-12.3555 21.4697 -9.43945 48.6436 5.69727 67.7686 +l93.167 150.487l68.7119 115.125c11.7334 23.8486 35.4531 43.3193 63.0205 42.9639c50.0303 0.0673828 100.114 0.546875 150.138 0.356445c1.11719 0.174805 2.12793 0.222656 3.20508 0.237305zM533.652 692.992l-0.0283203 -0.0458984l142.888 -0.356445 +c22.9746 0.0957031 45.125 -12.9844 56.8496 -32.6348l171.525 -279.35c13.3877 -20.1768 13.5771 -47.9951 0 -68.124c-32.8037 -52.3096 -63.709 -105.789 -97.3203 -157.487l-8.54492 -14.124c-19.4609 -32.3652 -39.25 -64.5625 -58.0361 -97.3203 +c-11.1738 -23.7119 -34.5293 -42.001 -61.2393 -42.9619l-153.575 0.831055c-16.6357 -0.521484 -28.0723 14.6074 -18.04 29.79c56.0322 92.2627 112.811 184.192 169.125 276.3c1.44531 1.94629 2.7168 3.99121 3.91602 6.05273 +c0.0625 0.109375 0.177734 0.241211 0.237305 0.354492c0.46875 0.819336 0.875 1.65723 1.30566 2.49219c0.166016 0.280273 0.316406 0.548828 0.474609 0.831055c3.92188 7.84766 6.33301 16.3145 7.47754 25.043v0.124023 +c0.167969 1.29199 0.239258 2.61719 0.354492 3.91699c0.413086 6.29004 0.3125 12.6758 0.118164 18.8711l-180.038 290.65c-4.69922 8.11719 -10.5391 17.4941 -6.88379 27.1787c4.98535 11.3936 19.3701 9.11426 29.4346 9.96875z" /> + <glyph glyph-name="uniF158" unicode="" horiz-adv-x="840" +d="M419.563 799.458l0.00292969 0.00488281c9.62988 0.261719 20.5596 -3.75977 31.4893 -16.5098c11.6699 -13.6201 67.0508 -75.5791 128.67 -144.35c3.18652 21.085 15.8301 36.8496 30.9785 36.8496h63.4873c17.5498 0 31.8291 -21.1504 31.8291 -47.2324v-130.29 +c48.2959 -53.7441 110.46 -122.97 110.46 -122.97s5.2627 -6.10059 6.72266 -14.8076c1.15723 -1.6084 1.78711 -3.64648 1.78711 -5.78711v-52.083c0 -5.41992 -4.35938 -9.78027 -9.78027 -9.79004h-49.2744v-392.5c-528.05 0 -62.1699 0.226562 -693.25 0v392.5h-4.34082 +h-42.2109c-5.42383 0 -9.78613 4.3623 -9.78613 9.78711v46.3809c-2.21387 7.03711 -2.5498 16.666 5.70117 26.2969c15.8906 18.5498 365.431 407.99 365.431 407.99s13.6924 16.0107 32.084 16.5098zM296.846 430.193 +c-38.25 -0.00195312 -63.875 -6.14062 -76.9316 -18.3838c-12.9033 -12.0791 -19.3184 -36.3682 -19.3184 -72.9346v-59.5723c0 -24.6523 -4.21387 -41.8047 -12.5098 -51.4014c-8.1416 -9.43164 -23.1377 -14.127 -45.1045 -14.127h-14.127v-35.4883h14.127 +c21.8135 0 36.8096 -4.78613 45.1045 -14.3818c8.29492 -9.59766 12.5098 -26.9297 12.5098 -51.9131v-59.3174c-0.000976562 -36.5654 6.41406 -60.9443 19.3184 -73.1885c13.0566 -12.2441 38.6816 -18.3818 76.9326 -18.3818h14.2979v35.7422h-15.6592 +c-21.6611 0 -35.7773 3.61328 -42.3818 10.8936c-6.60645 7.28027 -9.95801 22.626 -9.95801 45.9561v61.5293c-0.000976562 25.8115 -3.38477 44.5908 -10.2979 56.3389c-6.91309 11.7471 -18.9463 19.8721 -35.999 24.3398 +c16.8975 4.13574 28.8301 12.0811 35.7432 23.8291c7.06641 11.748 10.5527 30.6162 10.5527 56.5938v61.5303c0 23.3301 3.35156 38.5898 9.95801 45.8711c6.60547 7.2793 20.7217 10.9775 42.3818 10.9775h15.6592v35.4883h-14.2979zM530.537 430.191v-35.4863h16.085 +c21.5068 0 35.5039 -3.69824 41.9561 -10.9775c6.60547 -7.11523 9.95703 -22.377 9.95703 -45.8711v-61.5303c0 -25.9775 3.38477 -44.8467 10.2979 -56.5938c6.91309 -11.748 18.9473 -19.6934 35.999 -23.8291c-17.0518 -4.46777 -29.0859 -12.5928 -35.999 -24.3398 +s-10.2979 -30.5273 -10.2979 -56.3389v-61.5293c0 -23.6602 -3.35156 -39.0967 -9.95703 -46.2109c-6.45215 -7.11523 -20.4492 -10.6387 -41.9561 -10.6387h-16.085v-35.7422h14.4678c38.251 0 63.7578 6.1377 76.5078 18.3818 +c12.9043 12.2441 19.4043 36.623 19.4043 73.1885v59.3174c0 24.9834 4.12988 42.3164 12.4248 51.9131c8.29492 9.5957 23.376 14.3818 45.1904 14.3818h14.2119v35.4883h-14.2119c-21.8145 0 -36.8945 4.69531 -45.1904 14.127 +c-8.29492 9.5957 -12.4248 26.748 -12.4248 51.4014v59.5723c-0.000976562 36.5664 -6.5 60.8555 -19.4043 72.9346c-12.751 12.2432 -38.2568 18.3809 -76.5078 18.3818h-14.4678zM317.357 340.409l-0.00292969 0.00976562v-296.42h70.9756v102.8h46.8066 +c35.0254 -0.000976562 61.9131 8.3418 80.5938 25.0205c18.8018 16.8096 28.168 40.8057 28.1689 71.9121c0 30.9736 -9.36621 54.8086 -28.1689 71.4863c-18.6807 16.8105 -45.5684 25.1914 -80.5938 25.1914h-117.779zM388.33 285.018l39.2334 -0.00195312 +c13.7637 0 24.417 -3.5752 31.9141 -10.7227c7.49609 -7.14746 11.2334 -17.3164 11.2334 -30.5518c-0.000976562 -13.2363 -3.7373 -23.5273 -11.2334 -30.8076c-7.49707 -7.14746 -18.1504 -10.7227 -31.9141 -10.7227h-39.2334v82.8066z" /> + <glyph glyph-name="uniF159" unicode="" horiz-adv-x="870" +d="M504.681 787.927v-0.000976562l-1.56934 -267.07l194.859 260.761l157.03 -35.9463l-202.75 -260.76l201.17 -276.53l-153.87 -48.8799l-196.45 287.57v-259.19l-145.989 -22.0723v607.931zM170.141 639.73l0.00683594 -0.00878906 +c1.66895 0.171875 3.24219 0.0273438 4.73047 -0.946289l110.67 -72.5098c0.0244141 -0.015625 -0.0253906 -0.300781 0 -0.31543c13.6514 7.43555 28.0146 13.7148 42.8828 18.9189v-60.541c-81.6934 -36.7598 -138.74 -118.701 -138.74 -214.1 +c0 -129.69 105.22 -234.91 234.91 -234.91c91.2695 0 170.513 51.9863 209.37 128.02c32.4893 -47.5635 57.3867 -84.1885 57.3867 -84.1885c1.11035 -1.625 3.17871 -2.46777 5.04492 -1.89258l12.9277 4.09961l39.4141 -64.9551 +c1.7959 -2.95117 1.19141 -6.69727 -1.26074 -9.14453l-57.7031 -58.0176c-2.52734 -2.51172 -6.47852 -2.8877 -9.45996 -0.945312l-108.149 70.9453c-22.0771 -12.9951 -45.9453 -23.1289 -71.2617 -29.9541l-30.2695 -123.601 +c-0.817383 -3.36523 -3.81152 -5.67578 -7.25195 -5.67578h-81.9824c-3.5498 0 -6.54004 2.50977 -7.25977 5.98047l-25.541 122.97c-24.5459 6.62891 -47.8467 16.583 -69.3691 29.0088l-109.729 -66.5322c-2.95215 -1.7959 -6.7002 -1.49121 -9.14453 0.945312 +l-58.0186 58.0186c-2.5166 2.5127 -2.89746 6.4834 -0.945312 9.45996l70.0039 106.58c-13.2061 23.2217 -23.1826 48.7168 -29.6396 75.3594l-120.771 29.3301c-3.35449 0.817383 -5.99121 3.78613 -5.99121 7.25195v81.9824c0 3.5498 2.52539 6.84961 5.99121 7.57031 +l124.55 25.8496c6.88184 23.0127 16.6572 44.7188 28.6943 64.9551l-67.793 111.939c-1.78809 2.9502 -1.49023 6.7002 0.946289 9.14062l58.0225 58.0195c1.25586 1.25879 3.06152 1.71973 4.72949 1.89258z" /> + <glyph glyph-name="uniF15A" unicode="" +d="M544.941 -68.2598c-16.4668 -1.74414 -44.1143 -2.30566 -54.502 -1.08984c-2.21777 0.255859 -9.77637 1.11133 -16.7988 1.91699c-27.4229 3.11035 -60.7725 12.8203 -73.0508 21.2695c-7.20215 4.95508 -12.9541 12.7334 -12.9541 17.5215 +c0 1.83105 7.82324 18.8135 17.3857 37.7383c23.3545 46.2285 27.501 57.1416 41.0518 108.06c8.02246 30.1406 9.56836 73.1553 3.60156 100.2c-5.9873 27.1377 -26.8516 60.7275 -47.5127 76.4941c-11.6133 8.86035 -13.8145 10.1611 -22.1611 13.0908 +c-23.333 8.18945 -53.7676 22.8252 -74.3389 35.752c-20.1641 12.6699 -33.0068 22.3896 -51.7646 39.1729c-35.624 31.875 -58.7002 61.6426 -78.7383 101.57c-17.1318 34.1367 -25.0986 59.3574 -29.9277 94.7402c-3.1377 22.9932 -3.36816 27.3438 -1.53027 28.8701 +c1.12012 0.927734 120.67 1.26074 369.051 1.0332l367.399 -0.338867l0.398438 -6.83105c0.888672 -15.2393 -8.05566 -58.0742 -16.5 -79.0205c-2.54785 -6.32031 -6.11719 -15.8955 -7.93164 -21.2773c-3.4707 -10.2949 -9.03223 -20.7686 -23.3887 -44.0527 +c-27.0537 -43.8682 -75.2451 -90.1318 -123.061 -118.13c-22.4443 -13.1416 -52.7412 -27.0381 -69.2656 -31.7666c-8.23047 -2.35547 -31.3916 -24.4619 -41.4707 -39.583c-2.70898 -4.06543 -6.29785 -8.9248 -7.97363 -10.7998 +c-4.68652 -5.23926 -13.7998 -27.4844 -16.7129 -40.791c-2.11523 -9.66406 -2.63086 -17.3877 -2.68457 -40.3906c-0.0380859 -15.6406 0.347656 -31.4287 0.856445 -35.085c3.69238 -26.5195 23.9434 -84.4346 42.7559 -122.279 +c3.28906 -6.61719 6.9873 -14.4502 8.21875 -17.4072c1.23145 -2.95605 4.92773 -9.96387 8.21582 -15.5713c6.77539 -11.5605 7.25 -15.0449 2.92969 -21.5195c-9.61133 -14.4053 -44.6621 -26.7275 -89.5967 -31.4961zM264.711 46.0098 +c-15.1523 -1.89551 -25.6982 -2.22949 -34.9805 -1.12012c-24.666 2.93066 -38.749 5.82227 -48.5156 9.95605c-7.83496 3.31543 -15.3164 10.2402 -15.3164 14.1748c0 1.77734 5.8125 14.8457 12.916 29.0371c20.0342 40.0283 27.6436 67.0029 27.6045 97.8691 +c-0.0263672 20.71 -2.44141 31.9697 -9.78027 45.6045c-11.0869 20.5967 -15.2812 23.9414 -38.7246 30.8857c-20.1758 5.97656 -45.3926 20.8271 -67.4658 39.7305c-29.376 25.1562 -36.1006 32.9609 -51.459 59.7109c-13.3809 23.3066 -21.1562 47.9688 -23.209 73.6191 +l-0.780273 9.74219h70.793h70.793l2.5625 -5.97656c1.41016 -3.28809 6.62598 -11.6035 11.5908 -18.4785c4.9668 -6.87598 13.2949 -18.4482 18.5078 -25.7197c11.3174 -15.7852 44.1924 -48.3604 62.7988 -62.2285c29.7578 -22.1787 61.0547 -39.7686 86.8721 -48.8223 +c9.05371 -3.17773 16.4619 -6.17871 16.4619 -6.69531c0 -2.55566 -20.917 -12.415 -34.2207 -16.1299c-16.1777 -4.51855 -20.1406 -7.25 -27.7686 -19.1357c-6.1543 -9.58984 -13.0547 -30.3525 -14.5889 -43.8916c-1.53418 -13.543 -0.344727 -26.0215 4.7207 -49.5049 +c4.96777 -23.0352 9.47363 -35.1709 23.0752 -62.1396c6.87402 -13.6289 12.498 -25.8076 12.498 -27.0537c0 -3.12305 -7.41211 -10.0996 -14.2461 -13.4072c-9.17871 -4.44434 -22.9727 -7.8877 -40.1387 -10.0264zM821.021 47.3896 +c-33.0859 -5.74512 -73.3125 -2.01074 -94.8965 8.81348c-7.50684 3.76562 -14.626 10.5732 -14.626 13.9854c0 0.980469 5.93848 13.4834 13.1963 27.7812c18.752 36.9395 26.8066 64.0654 28.1152 94.6875c0.535156 12.5049 0.161133 18.6904 -1.61035 26.6514 +c-2.79395 12.5596 -13.6133 34.7324 -19.79 40.5537c-4.13672 3.89941 -15.168 8.75586 -33.1768 14.6074c-8.7168 2.83105 -25.9941 12.5771 -25.4092 14.333c0.231445 0.691406 5.5498 2.98145 11.8203 5.08887c15.7178 5.28516 24.3252 9.23926 41.2246 18.9404 +c36.2734 20.8223 50.2891 31.4316 79.3271 60.0469c29.0391 28.6182 44.4199 47.9141 58.1328 72.9355l4.78809 8.73438h73.209h73.209l0.401367 -4.76855c0.4375 -5.21094 -1.16211 -13.3193 -7.67676 -38.9062c-3.59277 -14.1143 -5.68457 -19.2549 -13.082 -32.165 +c-13.707 -23.9199 -19.5293 -32.0684 -32.2969 -45.2002c-31.7109 -32.6094 -61.8047 -52.4902 -94.0625 -62.1377c-7.52344 -2.24902 -14.9736 -4.7793 -16.5566 -5.62988c-3.36328 -1.80078 -16.126 -20.9199 -20.8223 -31.1943 +c-13.5332 -29.6094 -4.02246 -87.749 22.957 -140.35c6.21582 -12.1182 11.3008 -23.1416 11.3008 -24.5088c0 -3.86426 -4.5 -8.65527 -11.9258 -12.6963c-8.34961 -4.54492 -16.0518 -6.87305 -31.75 -9.60254z" /> + </font> +</defs></svg> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/font-mfizz/font-mfizz.ttf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/font-mfizz/font-mfizz.ttf new file mode 100644 index 0000000000000000000000000000000000000000..cc7ca4bc985fccc26fbbeb55b2230b2d3a0c410e Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/font-mfizz/font-mfizz.ttf differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/font-mfizz/font-mfizz.woff b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/font-mfizz/font-mfizz.woff new file mode 100644 index 0000000000000000000000000000000000000000..ef684169a29575202cc19b5eab89c4ea13a17fd7 Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/font-mfizz/font-mfizz.woff differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/font-mfizz/icons.json b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/font-mfizz/icons.json new file mode 100644 index 0000000000000000000000000000000000000000..9d6d695837dd126b3b10d4061acb1e0e8c830640 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/font-mfizz/icons.json @@ -0,0 +1 @@ +["3dprint","antenna","apache","aws","blackberry","bomb","c","cassandra","centos","clojure","coffee-bean","cplusplus","csharp","css","database","database-alt","database-alt2","debian","dreamhost","fedora","fire-alt","freebsd","ghost","gnome","google","google-alt","google-code","google-developers","grails","grails-alt","hadoop","haskell","heroku","html","iphone","java","java-bold","java-duke","javascript","jetty","kde","line-graph","linux-mint","looking","mariadb","mfizz","microscope","mobile-device","mobile-phone-alt","mobile-phone-broadcast","mssql","mysql","mysql-alt","netbsd","nginx","nginx-alt","nginx-alt2","nodejs","objc","oracle","oracle-alt","osx","perl","phone-alt","phone-retro","php","php-alt","platter","playframework","playframework-alt","postgres","postgres-alt","python","raspberrypi","redhat","redis","ruby","ruby-on-rails","ruby-on-rails-alt","satellite","scala","scala-alt","script","script-alt","shell","solaris","splatter","suse","tomcat","ubuntu","wireless"] diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/font-mfizz/preview.html b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/font-mfizz/preview.html new file mode 100644 index 0000000000000000000000000000000000000000..55c0fb36bc5267ef555d0992a834c2d5f27f4f80 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/font-mfizz/preview.html @@ -0,0 +1,1307 @@ + +<!DOCTYPE html> +<html> + <head> + <title>font-mfizz glyphs preview</title> + <link rel="stylesheet" href="font-mfizz.css" /> + <!--[if lte IE 7]><link rel="stylesheet" href="fontcustom-ie7.css" /><![endif]--> + + <style> + * { + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + } + + body { + background: #fff; + color: #444; + font: 16px/1.5 "Helvetica Neue", Helvetica, Arial, sans-serif; + } + + a, + a:visited { + color: #888; + text-decoration: underline; + } + a:hover, + a:focus { color: #000; } + + h1 { + border-bottom: 2px solid #ddd; + color: #888; + font-size: 36px; + font-weight: 300; + margin-bottom: 20px; + padding: 20px 0; + } + + .container { + margin: 0 auto; + min-width: 880px; + padding: 0 40px; + width: 80%; + } + + .glyph { + border-bottom: 1px dotted #ccc; + padding: 10px 0 20px; + margin-bottom: 20px; + } + + .preview-glyphs { vertical-align: bottom; } + + .preview-scale { + color: #888; + font-size: 12px; + margin-top: 5px; + } + + .step { + display: inline-block; + line-height: 1; + width: 10%; + } + + + .size-12 { font-size: 12px; } + + .size-14 { font-size: 14px; } + + .size-16 { font-size: 16px; } + + .size-18 { font-size: 18px; } + + .size-21 { font-size: 21px; } + + .size-24 { font-size: 24px; } + + .size-36 { font-size: 36px; } + + .size-48 { font-size: 48px; } + + .size-60 { font-size: 60px; } + + .size-72 { font-size: 72px; } + + + .usage { margin-top: 10px; } + + .usage input { + font-family: monospace; + margin-right: 3px; + padding: 2px 5px; + text-align: center; + } + + .usage .point { width: 150px; } + + .usage .class { width: 250px; } + + .footer { + color: #888; + font-size: 12px; + padding: 20px 0; + } + </style> + + <!--[if lte IE 8]><script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script><![endif]--> + </head> + + <body> + <div class="container"> + <h1>font-mfizz contains 91 glyphs:</h1> + + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-microscope size-12"></i><i class="step icon-microscope size-14"></i><i class="step icon-microscope size-16"></i><i class="step icon-microscope size-18"></i><i class="step icon-microscope size-21"></i><i class="step icon-microscope size-24"></i><i class="step icon-microscope size-36"></i><i class="step icon-microscope size-48"></i><i class="step icon-microscope size-60"></i><i class="step icon-microscope size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-microscope" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf100;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-cplusplus size-12"></i><i class="step icon-cplusplus size-14"></i><i class="step icon-cplusplus size-16"></i><i class="step icon-cplusplus size-18"></i><i class="step icon-cplusplus size-21"></i><i class="step icon-cplusplus size-24"></i><i class="step icon-cplusplus size-36"></i><i class="step icon-cplusplus size-48"></i><i class="step icon-cplusplus size-60"></i><i class="step icon-cplusplus size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-cplusplus" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf101;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-wireless size-12"></i><i class="step icon-wireless size-14"></i><i class="step icon-wireless size-16"></i><i class="step icon-wireless size-18"></i><i class="step icon-wireless size-21"></i><i class="step icon-wireless size-24"></i><i class="step icon-wireless size-36"></i><i class="step icon-wireless size-48"></i><i class="step icon-wireless size-60"></i><i class="step icon-wireless size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-wireless" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf102;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-fire-alt size-12"></i><i class="step icon-fire-alt size-14"></i><i class="step icon-fire-alt size-16"></i><i class="step icon-fire-alt size-18"></i><i class="step icon-fire-alt size-21"></i><i class="step icon-fire-alt size-24"></i><i class="step icon-fire-alt size-36"></i><i class="step icon-fire-alt size-48"></i><i class="step icon-fire-alt size-60"></i><i class="step icon-fire-alt size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-fire-alt" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf103;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-mobile-device size-12"></i><i class="step icon-mobile-device size-14"></i><i class="step icon-mobile-device size-16"></i><i class="step icon-mobile-device size-18"></i><i class="step icon-mobile-device size-21"></i><i class="step icon-mobile-device size-24"></i><i class="step icon-mobile-device size-36"></i><i class="step icon-mobile-device size-48"></i><i class="step icon-mobile-device size-60"></i><i class="step icon-mobile-device size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-mobile-device" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf104;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-objc size-12"></i><i class="step icon-objc size-14"></i><i class="step icon-objc size-16"></i><i class="step icon-objc size-18"></i><i class="step icon-objc size-21"></i><i class="step icon-objc size-24"></i><i class="step icon-objc size-36"></i><i class="step icon-objc size-48"></i><i class="step icon-objc size-60"></i><i class="step icon-objc size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-objc" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf105;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-redhat size-12"></i><i class="step icon-redhat size-14"></i><i class="step icon-redhat size-16"></i><i class="step icon-redhat size-18"></i><i class="step icon-redhat size-21"></i><i class="step icon-redhat size-24"></i><i class="step icon-redhat size-36"></i><i class="step icon-redhat size-48"></i><i class="step icon-redhat size-60"></i><i class="step icon-redhat size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-redhat" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf106;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-freebsd size-12"></i><i class="step icon-freebsd size-14"></i><i class="step icon-freebsd size-16"></i><i class="step icon-freebsd size-18"></i><i class="step icon-freebsd size-21"></i><i class="step icon-freebsd size-24"></i><i class="step icon-freebsd size-36"></i><i class="step icon-freebsd size-48"></i><i class="step icon-freebsd size-60"></i><i class="step icon-freebsd size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-freebsd" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf107;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-heroku size-12"></i><i class="step icon-heroku size-14"></i><i class="step icon-heroku size-16"></i><i class="step icon-heroku size-18"></i><i class="step icon-heroku size-21"></i><i class="step icon-heroku size-24"></i><i class="step icon-heroku size-36"></i><i class="step icon-heroku size-48"></i><i class="step icon-heroku size-60"></i><i class="step icon-heroku size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-heroku" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf108;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-python size-12"></i><i class="step icon-python size-14"></i><i class="step icon-python size-16"></i><i class="step icon-python size-18"></i><i class="step icon-python size-21"></i><i class="step icon-python size-24"></i><i class="step icon-python size-36"></i><i class="step icon-python size-48"></i><i class="step icon-python size-60"></i><i class="step icon-python size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-python" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf109;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-java size-12"></i><i class="step icon-java size-14"></i><i class="step icon-java size-16"></i><i class="step icon-java size-18"></i><i class="step icon-java size-21"></i><i class="step icon-java size-24"></i><i class="step icon-java size-36"></i><i class="step icon-java size-48"></i><i class="step icon-java size-60"></i><i class="step icon-java size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-java" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf10a;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-satellite size-12"></i><i class="step icon-satellite size-14"></i><i class="step icon-satellite size-16"></i><i class="step icon-satellite size-18"></i><i class="step icon-satellite size-21"></i><i class="step icon-satellite size-24"></i><i class="step icon-satellite size-36"></i><i class="step icon-satellite size-48"></i><i class="step icon-satellite size-60"></i><i class="step icon-satellite size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-satellite" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf10b;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-debian size-12"></i><i class="step icon-debian size-14"></i><i class="step icon-debian size-16"></i><i class="step icon-debian size-18"></i><i class="step icon-debian size-21"></i><i class="step icon-debian size-24"></i><i class="step icon-debian size-36"></i><i class="step icon-debian size-48"></i><i class="step icon-debian size-60"></i><i class="step icon-debian size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-debian" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf10c;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-grails size-12"></i><i class="step icon-grails size-14"></i><i class="step icon-grails size-16"></i><i class="step icon-grails size-18"></i><i class="step icon-grails size-21"></i><i class="step icon-grails size-24"></i><i class="step icon-grails size-36"></i><i class="step icon-grails size-48"></i><i class="step icon-grails size-60"></i><i class="step icon-grails size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-grails" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf10d;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-c size-12"></i><i class="step icon-c size-14"></i><i class="step icon-c size-16"></i><i class="step icon-c size-18"></i><i class="step icon-c size-21"></i><i class="step icon-c size-24"></i><i class="step icon-c size-36"></i><i class="step icon-c size-48"></i><i class="step icon-c size-60"></i><i class="step icon-c size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-c" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf10e;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-postgres size-12"></i><i class="step icon-postgres size-14"></i><i class="step icon-postgres size-16"></i><i class="step icon-postgres size-18"></i><i class="step icon-postgres size-21"></i><i class="step icon-postgres size-24"></i><i class="step icon-postgres size-36"></i><i class="step icon-postgres size-48"></i><i class="step icon-postgres size-60"></i><i class="step icon-postgres size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-postgres" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf10f;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-database-alt2 size-12"></i><i class="step icon-database-alt2 size-14"></i><i class="step icon-database-alt2 size-16"></i><i class="step icon-database-alt2 size-18"></i><i class="step icon-database-alt2 size-21"></i><i class="step icon-database-alt2 size-24"></i><i class="step icon-database-alt2 size-36"></i><i class="step icon-database-alt2 size-48"></i><i class="step icon-database-alt2 size-60"></i><i class="step icon-database-alt2 size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-database-alt2" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf110;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-raspberrypi size-12"></i><i class="step icon-raspberrypi size-14"></i><i class="step icon-raspberrypi size-16"></i><i class="step icon-raspberrypi size-18"></i><i class="step icon-raspberrypi size-21"></i><i class="step icon-raspberrypi size-24"></i><i class="step icon-raspberrypi size-36"></i><i class="step icon-raspberrypi size-48"></i><i class="step icon-raspberrypi size-60"></i><i class="step icon-raspberrypi size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-raspberrypi" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf111;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-nginx size-12"></i><i class="step icon-nginx size-14"></i><i class="step icon-nginx size-16"></i><i class="step icon-nginx size-18"></i><i class="step icon-nginx size-21"></i><i class="step icon-nginx size-24"></i><i class="step icon-nginx size-36"></i><i class="step icon-nginx size-48"></i><i class="step icon-nginx size-60"></i><i class="step icon-nginx size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-nginx" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf112;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-ruby-on-rails size-12"></i><i class="step icon-ruby-on-rails size-14"></i><i class="step icon-ruby-on-rails size-16"></i><i class="step icon-ruby-on-rails size-18"></i><i class="step icon-ruby-on-rails size-21"></i><i class="step icon-ruby-on-rails size-24"></i><i class="step icon-ruby-on-rails size-36"></i><i class="step icon-ruby-on-rails size-48"></i><i class="step icon-ruby-on-rails size-60"></i><i class="step icon-ruby-on-rails size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-ruby-on-rails" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf113;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-redis size-12"></i><i class="step icon-redis size-14"></i><i class="step icon-redis size-16"></i><i class="step icon-redis size-18"></i><i class="step icon-redis size-21"></i><i class="step icon-redis size-24"></i><i class="step icon-redis size-36"></i><i class="step icon-redis size-48"></i><i class="step icon-redis size-60"></i><i class="step icon-redis size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-redis" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf114;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-scala size-12"></i><i class="step icon-scala size-14"></i><i class="step icon-scala size-16"></i><i class="step icon-scala size-18"></i><i class="step icon-scala size-21"></i><i class="step icon-scala size-24"></i><i class="step icon-scala size-36"></i><i class="step icon-scala size-48"></i><i class="step icon-scala size-60"></i><i class="step icon-scala size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-scala" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf115;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-gnome size-12"></i><i class="step icon-gnome size-14"></i><i class="step icon-gnome size-16"></i><i class="step icon-gnome size-18"></i><i class="step icon-gnome size-21"></i><i class="step icon-gnome size-24"></i><i class="step icon-gnome size-36"></i><i class="step icon-gnome size-48"></i><i class="step icon-gnome size-60"></i><i class="step icon-gnome size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-gnome" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf116;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-perl size-12"></i><i class="step icon-perl size-14"></i><i class="step icon-perl size-16"></i><i class="step icon-perl size-18"></i><i class="step icon-perl size-21"></i><i class="step icon-perl size-24"></i><i class="step icon-perl size-36"></i><i class="step icon-perl size-48"></i><i class="step icon-perl size-60"></i><i class="step icon-perl size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-perl" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf117;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-mysql size-12"></i><i class="step icon-mysql size-14"></i><i class="step icon-mysql size-16"></i><i class="step icon-mysql size-18"></i><i class="step icon-mysql size-21"></i><i class="step icon-mysql size-24"></i><i class="step icon-mysql size-36"></i><i class="step icon-mysql size-48"></i><i class="step icon-mysql size-60"></i><i class="step icon-mysql size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-mysql" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf118;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-fedora size-12"></i><i class="step icon-fedora size-14"></i><i class="step icon-fedora size-16"></i><i class="step icon-fedora size-18"></i><i class="step icon-fedora size-21"></i><i class="step icon-fedora size-24"></i><i class="step icon-fedora size-36"></i><i class="step icon-fedora size-48"></i><i class="step icon-fedora size-60"></i><i class="step icon-fedora size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-fedora" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf119;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-ghost size-12"></i><i class="step icon-ghost size-14"></i><i class="step icon-ghost size-16"></i><i class="step icon-ghost size-18"></i><i class="step icon-ghost size-21"></i><i class="step icon-ghost size-24"></i><i class="step icon-ghost size-36"></i><i class="step icon-ghost size-48"></i><i class="step icon-ghost size-60"></i><i class="step icon-ghost size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-ghost" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf11a;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-google size-12"></i><i class="step icon-google size-14"></i><i class="step icon-google size-16"></i><i class="step icon-google size-18"></i><i class="step icon-google size-21"></i><i class="step icon-google size-24"></i><i class="step icon-google size-36"></i><i class="step icon-google size-48"></i><i class="step icon-google size-60"></i><i class="step icon-google size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-google" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf11b;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-netbsd size-12"></i><i class="step icon-netbsd size-14"></i><i class="step icon-netbsd size-16"></i><i class="step icon-netbsd size-18"></i><i class="step icon-netbsd size-21"></i><i class="step icon-netbsd size-24"></i><i class="step icon-netbsd size-36"></i><i class="step icon-netbsd size-48"></i><i class="step icon-netbsd size-60"></i><i class="step icon-netbsd size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-netbsd" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf11c;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-aws size-12"></i><i class="step icon-aws size-14"></i><i class="step icon-aws size-16"></i><i class="step icon-aws size-18"></i><i class="step icon-aws size-21"></i><i class="step icon-aws size-24"></i><i class="step icon-aws size-36"></i><i class="step icon-aws size-48"></i><i class="step icon-aws size-60"></i><i class="step icon-aws size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-aws" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf11d;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-bomb size-12"></i><i class="step icon-bomb size-14"></i><i class="step icon-bomb size-16"></i><i class="step icon-bomb size-18"></i><i class="step icon-bomb size-21"></i><i class="step icon-bomb size-24"></i><i class="step icon-bomb size-36"></i><i class="step icon-bomb size-48"></i><i class="step icon-bomb size-60"></i><i class="step icon-bomb size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-bomb" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf11e;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-looking size-12"></i><i class="step icon-looking size-14"></i><i class="step icon-looking size-16"></i><i class="step icon-looking size-18"></i><i class="step icon-looking size-21"></i><i class="step icon-looking size-24"></i><i class="step icon-looking size-36"></i><i class="step icon-looking size-48"></i><i class="step icon-looking size-60"></i><i class="step icon-looking size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-looking" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf11f;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-ruby size-12"></i><i class="step icon-ruby size-14"></i><i class="step icon-ruby size-16"></i><i class="step icon-ruby size-18"></i><i class="step icon-ruby size-21"></i><i class="step icon-ruby size-24"></i><i class="step icon-ruby size-36"></i><i class="step icon-ruby size-48"></i><i class="step icon-ruby size-60"></i><i class="step icon-ruby size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-ruby" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf120;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-mysql-alt size-12"></i><i class="step icon-mysql-alt size-14"></i><i class="step icon-mysql-alt size-16"></i><i class="step icon-mysql-alt size-18"></i><i class="step icon-mysql-alt size-21"></i><i class="step icon-mysql-alt size-24"></i><i class="step icon-mysql-alt size-36"></i><i class="step icon-mysql-alt size-48"></i><i class="step icon-mysql-alt size-60"></i><i class="step icon-mysql-alt size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-mysql-alt" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf121;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-playframework-alt size-12"></i><i class="step icon-playframework-alt size-14"></i><i class="step icon-playframework-alt size-16"></i><i class="step icon-playframework-alt size-18"></i><i class="step icon-playframework-alt size-21"></i><i class="step icon-playframework-alt size-24"></i><i class="step icon-playframework-alt size-36"></i><i class="step icon-playframework-alt size-48"></i><i class="step icon-playframework-alt size-60"></i><i class="step icon-playframework-alt size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-playframework-alt" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf122;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-osx size-12"></i><i class="step icon-osx size-14"></i><i class="step icon-osx size-16"></i><i class="step icon-osx size-18"></i><i class="step icon-osx size-21"></i><i class="step icon-osx size-24"></i><i class="step icon-osx size-36"></i><i class="step icon-osx size-48"></i><i class="step icon-osx size-60"></i><i class="step icon-osx size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-osx" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf123;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-database size-12"></i><i class="step icon-database size-14"></i><i class="step icon-database size-16"></i><i class="step icon-database size-18"></i><i class="step icon-database size-21"></i><i class="step icon-database size-24"></i><i class="step icon-database size-36"></i><i class="step icon-database size-48"></i><i class="step icon-database size-60"></i><i class="step icon-database size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-database" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf124;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-database-alt size-12"></i><i class="step icon-database-alt size-14"></i><i class="step icon-database-alt size-16"></i><i class="step icon-database-alt size-18"></i><i class="step icon-database-alt size-21"></i><i class="step icon-database-alt size-24"></i><i class="step icon-database-alt size-36"></i><i class="step icon-database-alt size-48"></i><i class="step icon-database-alt size-60"></i><i class="step icon-database-alt size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-database-alt" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf125;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-shell size-12"></i><i class="step icon-shell size-14"></i><i class="step icon-shell size-16"></i><i class="step icon-shell size-18"></i><i class="step icon-shell size-21"></i><i class="step icon-shell size-24"></i><i class="step icon-shell size-36"></i><i class="step icon-shell size-48"></i><i class="step icon-shell size-60"></i><i class="step icon-shell size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-shell" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf126;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-script size-12"></i><i class="step icon-script size-14"></i><i class="step icon-script size-16"></i><i class="step icon-script size-18"></i><i class="step icon-script size-21"></i><i class="step icon-script size-24"></i><i class="step icon-script size-36"></i><i class="step icon-script size-48"></i><i class="step icon-script size-60"></i><i class="step icon-script size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-script" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf127;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-antenna size-12"></i><i class="step icon-antenna size-14"></i><i class="step icon-antenna size-16"></i><i class="step icon-antenna size-18"></i><i class="step icon-antenna size-21"></i><i class="step icon-antenna size-24"></i><i class="step icon-antenna size-36"></i><i class="step icon-antenna size-48"></i><i class="step icon-antenna size-60"></i><i class="step icon-antenna size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-antenna" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf128;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-coffee-bean size-12"></i><i class="step icon-coffee-bean size-14"></i><i class="step icon-coffee-bean size-16"></i><i class="step icon-coffee-bean size-18"></i><i class="step icon-coffee-bean size-21"></i><i class="step icon-coffee-bean size-24"></i><i class="step icon-coffee-bean size-36"></i><i class="step icon-coffee-bean size-48"></i><i class="step icon-coffee-bean size-60"></i><i class="step icon-coffee-bean size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-coffee-bean" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf129;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-scala-alt size-12"></i><i class="step icon-scala-alt size-14"></i><i class="step icon-scala-alt size-16"></i><i class="step icon-scala-alt size-18"></i><i class="step icon-scala-alt size-21"></i><i class="step icon-scala-alt size-24"></i><i class="step icon-scala-alt size-36"></i><i class="step icon-scala-alt size-48"></i><i class="step icon-scala-alt size-60"></i><i class="step icon-scala-alt size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-scala-alt" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf12a;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-platter size-12"></i><i class="step icon-platter size-14"></i><i class="step icon-platter size-16"></i><i class="step icon-platter size-18"></i><i class="step icon-platter size-21"></i><i class="step icon-platter size-24"></i><i class="step icon-platter size-36"></i><i class="step icon-platter size-48"></i><i class="step icon-platter size-60"></i><i class="step icon-platter size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-platter" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf12b;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-java-duke size-12"></i><i class="step icon-java-duke size-14"></i><i class="step icon-java-duke size-16"></i><i class="step icon-java-duke size-18"></i><i class="step icon-java-duke size-21"></i><i class="step icon-java-duke size-24"></i><i class="step icon-java-duke size-36"></i><i class="step icon-java-duke size-48"></i><i class="step icon-java-duke size-60"></i><i class="step icon-java-duke size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-java-duke" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf12c;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-iphone size-12"></i><i class="step icon-iphone size-14"></i><i class="step icon-iphone size-16"></i><i class="step icon-iphone size-18"></i><i class="step icon-iphone size-21"></i><i class="step icon-iphone size-24"></i><i class="step icon-iphone size-36"></i><i class="step icon-iphone size-48"></i><i class="step icon-iphone size-60"></i><i class="step icon-iphone size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-iphone" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf12d;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-script-alt size-12"></i><i class="step icon-script-alt size-14"></i><i class="step icon-script-alt size-16"></i><i class="step icon-script-alt size-18"></i><i class="step icon-script-alt size-21"></i><i class="step icon-script-alt size-24"></i><i class="step icon-script-alt size-36"></i><i class="step icon-script-alt size-48"></i><i class="step icon-script-alt size-60"></i><i class="step icon-script-alt size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-script-alt" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf12e;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-google-alt size-12"></i><i class="step icon-google-alt size-14"></i><i class="step icon-google-alt size-16"></i><i class="step icon-google-alt size-18"></i><i class="step icon-google-alt size-21"></i><i class="step icon-google-alt size-24"></i><i class="step icon-google-alt size-36"></i><i class="step icon-google-alt size-48"></i><i class="step icon-google-alt size-60"></i><i class="step icon-google-alt size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-google-alt" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf12f;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-haskell size-12"></i><i class="step icon-haskell size-14"></i><i class="step icon-haskell size-16"></i><i class="step icon-haskell size-18"></i><i class="step icon-haskell size-21"></i><i class="step icon-haskell size-24"></i><i class="step icon-haskell size-36"></i><i class="step icon-haskell size-48"></i><i class="step icon-haskell size-60"></i><i class="step icon-haskell size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-haskell" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf130;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-mariadb size-12"></i><i class="step icon-mariadb size-14"></i><i class="step icon-mariadb size-16"></i><i class="step icon-mariadb size-18"></i><i class="step icon-mariadb size-21"></i><i class="step icon-mariadb size-24"></i><i class="step icon-mariadb size-36"></i><i class="step icon-mariadb size-48"></i><i class="step icon-mariadb size-60"></i><i class="step icon-mariadb size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-mariadb" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf131;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-phone-retro size-12"></i><i class="step icon-phone-retro size-14"></i><i class="step icon-phone-retro size-16"></i><i class="step icon-phone-retro size-18"></i><i class="step icon-phone-retro size-21"></i><i class="step icon-phone-retro size-24"></i><i class="step icon-phone-retro size-36"></i><i class="step icon-phone-retro size-48"></i><i class="step icon-phone-retro size-60"></i><i class="step icon-phone-retro size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-phone-retro" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf132;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-phone-alt size-12"></i><i class="step icon-phone-alt size-14"></i><i class="step icon-phone-alt size-16"></i><i class="step icon-phone-alt size-18"></i><i class="step icon-phone-alt size-21"></i><i class="step icon-phone-alt size-24"></i><i class="step icon-phone-alt size-36"></i><i class="step icon-phone-alt size-48"></i><i class="step icon-phone-alt size-60"></i><i class="step icon-phone-alt size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-phone-alt" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf133;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-csharp size-12"></i><i class="step icon-csharp size-14"></i><i class="step icon-csharp size-16"></i><i class="step icon-csharp size-18"></i><i class="step icon-csharp size-21"></i><i class="step icon-csharp size-24"></i><i class="step icon-csharp size-36"></i><i class="step icon-csharp size-48"></i><i class="step icon-csharp size-60"></i><i class="step icon-csharp size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-csharp" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf134;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-php size-12"></i><i class="step icon-php size-14"></i><i class="step icon-php size-16"></i><i class="step icon-php size-18"></i><i class="step icon-php size-21"></i><i class="step icon-php size-24"></i><i class="step icon-php size-36"></i><i class="step icon-php size-48"></i><i class="step icon-php size-60"></i><i class="step icon-php size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-php" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf135;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-postgres-alt size-12"></i><i class="step icon-postgres-alt size-14"></i><i class="step icon-postgres-alt size-16"></i><i class="step icon-postgres-alt size-18"></i><i class="step icon-postgres-alt size-21"></i><i class="step icon-postgres-alt size-24"></i><i class="step icon-postgres-alt size-36"></i><i class="step icon-postgres-alt size-48"></i><i class="step icon-postgres-alt size-60"></i><i class="step icon-postgres-alt size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-postgres-alt" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf136;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-html size-12"></i><i class="step icon-html size-14"></i><i class="step icon-html size-16"></i><i class="step icon-html size-18"></i><i class="step icon-html size-21"></i><i class="step icon-html size-24"></i><i class="step icon-html size-36"></i><i class="step icon-html size-48"></i><i class="step icon-html size-60"></i><i class="step icon-html size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-html" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf137;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-mfizz size-12"></i><i class="step icon-mfizz size-14"></i><i class="step icon-mfizz size-16"></i><i class="step icon-mfizz size-18"></i><i class="step icon-mfizz size-21"></i><i class="step icon-mfizz size-24"></i><i class="step icon-mfizz size-36"></i><i class="step icon-mfizz size-48"></i><i class="step icon-mfizz size-60"></i><i class="step icon-mfizz size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-mfizz" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf138;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-apache size-12"></i><i class="step icon-apache size-14"></i><i class="step icon-apache size-16"></i><i class="step icon-apache size-18"></i><i class="step icon-apache size-21"></i><i class="step icon-apache size-24"></i><i class="step icon-apache size-36"></i><i class="step icon-apache size-48"></i><i class="step icon-apache size-60"></i><i class="step icon-apache size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-apache" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf139;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-hadoop size-12"></i><i class="step icon-hadoop size-14"></i><i class="step icon-hadoop size-16"></i><i class="step icon-hadoop size-18"></i><i class="step icon-hadoop size-21"></i><i class="step icon-hadoop size-24"></i><i class="step icon-hadoop size-36"></i><i class="step icon-hadoop size-48"></i><i class="step icon-hadoop size-60"></i><i class="step icon-hadoop size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-hadoop" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf13a;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-ruby-on-rails-alt size-12"></i><i class="step icon-ruby-on-rails-alt size-14"></i><i class="step icon-ruby-on-rails-alt size-16"></i><i class="step icon-ruby-on-rails-alt size-18"></i><i class="step icon-ruby-on-rails-alt size-21"></i><i class="step icon-ruby-on-rails-alt size-24"></i><i class="step icon-ruby-on-rails-alt size-36"></i><i class="step icon-ruby-on-rails-alt size-48"></i><i class="step icon-ruby-on-rails-alt size-60"></i><i class="step icon-ruby-on-rails-alt size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-ruby-on-rails-alt" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf13b;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-mobile-phone-broadcast size-12"></i><i class="step icon-mobile-phone-broadcast size-14"></i><i class="step icon-mobile-phone-broadcast size-16"></i><i class="step icon-mobile-phone-broadcast size-18"></i><i class="step icon-mobile-phone-broadcast size-21"></i><i class="step icon-mobile-phone-broadcast size-24"></i><i class="step icon-mobile-phone-broadcast size-36"></i><i class="step icon-mobile-phone-broadcast size-48"></i><i class="step icon-mobile-phone-broadcast size-60"></i><i class="step icon-mobile-phone-broadcast size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-mobile-phone-broadcast" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf13c;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-css size-12"></i><i class="step icon-css size-14"></i><i class="step icon-css size-16"></i><i class="step icon-css size-18"></i><i class="step icon-css size-21"></i><i class="step icon-css size-24"></i><i class="step icon-css size-36"></i><i class="step icon-css size-48"></i><i class="step icon-css size-60"></i><i class="step icon-css size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-css" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf13d;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-playframework size-12"></i><i class="step icon-playframework size-14"></i><i class="step icon-playframework size-16"></i><i class="step icon-playframework size-18"></i><i class="step icon-playframework size-21"></i><i class="step icon-playframework size-24"></i><i class="step icon-playframework size-36"></i><i class="step icon-playframework size-48"></i><i class="step icon-playframework size-60"></i><i class="step icon-playframework size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-playframework" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf13e;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-clojure size-12"></i><i class="step icon-clojure size-14"></i><i class="step icon-clojure size-16"></i><i class="step icon-clojure size-18"></i><i class="step icon-clojure size-21"></i><i class="step icon-clojure size-24"></i><i class="step icon-clojure size-36"></i><i class="step icon-clojure size-48"></i><i class="step icon-clojure size-60"></i><i class="step icon-clojure size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-clojure" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf13f;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-mobile-phone-alt size-12"></i><i class="step icon-mobile-phone-alt size-14"></i><i class="step icon-mobile-phone-alt size-16"></i><i class="step icon-mobile-phone-alt size-18"></i><i class="step icon-mobile-phone-alt size-21"></i><i class="step icon-mobile-phone-alt size-24"></i><i class="step icon-mobile-phone-alt size-36"></i><i class="step icon-mobile-phone-alt size-48"></i><i class="step icon-mobile-phone-alt size-60"></i><i class="step icon-mobile-phone-alt size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-mobile-phone-alt" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf140;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-suse size-12"></i><i class="step icon-suse size-14"></i><i class="step icon-suse size-16"></i><i class="step icon-suse size-18"></i><i class="step icon-suse size-21"></i><i class="step icon-suse size-24"></i><i class="step icon-suse size-36"></i><i class="step icon-suse size-48"></i><i class="step icon-suse size-60"></i><i class="step icon-suse size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-suse" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf141;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-java-bold size-12"></i><i class="step icon-java-bold size-14"></i><i class="step icon-java-bold size-16"></i><i class="step icon-java-bold size-18"></i><i class="step icon-java-bold size-21"></i><i class="step icon-java-bold size-24"></i><i class="step icon-java-bold size-36"></i><i class="step icon-java-bold size-48"></i><i class="step icon-java-bold size-60"></i><i class="step icon-java-bold size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-java-bold" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf142;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-nginx-alt size-12"></i><i class="step icon-nginx-alt size-14"></i><i class="step icon-nginx-alt size-16"></i><i class="step icon-nginx-alt size-18"></i><i class="step icon-nginx-alt size-21"></i><i class="step icon-nginx-alt size-24"></i><i class="step icon-nginx-alt size-36"></i><i class="step icon-nginx-alt size-48"></i><i class="step icon-nginx-alt size-60"></i><i class="step icon-nginx-alt size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-nginx-alt" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf143;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-nginx-alt2 size-12"></i><i class="step icon-nginx-alt2 size-14"></i><i class="step icon-nginx-alt2 size-16"></i><i class="step icon-nginx-alt2 size-18"></i><i class="step icon-nginx-alt2 size-21"></i><i class="step icon-nginx-alt2 size-24"></i><i class="step icon-nginx-alt2 size-36"></i><i class="step icon-nginx-alt2 size-48"></i><i class="step icon-nginx-alt2 size-60"></i><i class="step icon-nginx-alt2 size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-nginx-alt2" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf144;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-linux-mint size-12"></i><i class="step icon-linux-mint size-14"></i><i class="step icon-linux-mint size-16"></i><i class="step icon-linux-mint size-18"></i><i class="step icon-linux-mint size-21"></i><i class="step icon-linux-mint size-24"></i><i class="step icon-linux-mint size-36"></i><i class="step icon-linux-mint size-48"></i><i class="step icon-linux-mint size-60"></i><i class="step icon-linux-mint size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-linux-mint" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf145;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-dreamhost size-12"></i><i class="step icon-dreamhost size-14"></i><i class="step icon-dreamhost size-16"></i><i class="step icon-dreamhost size-18"></i><i class="step icon-dreamhost size-21"></i><i class="step icon-dreamhost size-24"></i><i class="step icon-dreamhost size-36"></i><i class="step icon-dreamhost size-48"></i><i class="step icon-dreamhost size-60"></i><i class="step icon-dreamhost size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-dreamhost" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf146;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-blackberry size-12"></i><i class="step icon-blackberry size-14"></i><i class="step icon-blackberry size-16"></i><i class="step icon-blackberry size-18"></i><i class="step icon-blackberry size-21"></i><i class="step icon-blackberry size-24"></i><i class="step icon-blackberry size-36"></i><i class="step icon-blackberry size-48"></i><i class="step icon-blackberry size-60"></i><i class="step icon-blackberry size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-blackberry" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf147;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-javascript size-12"></i><i class="step icon-javascript size-14"></i><i class="step icon-javascript size-16"></i><i class="step icon-javascript size-18"></i><i class="step icon-javascript size-21"></i><i class="step icon-javascript size-24"></i><i class="step icon-javascript size-36"></i><i class="step icon-javascript size-48"></i><i class="step icon-javascript size-60"></i><i class="step icon-javascript size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-javascript" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf148;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-ubuntu size-12"></i><i class="step icon-ubuntu size-14"></i><i class="step icon-ubuntu size-16"></i><i class="step icon-ubuntu size-18"></i><i class="step icon-ubuntu size-21"></i><i class="step icon-ubuntu size-24"></i><i class="step icon-ubuntu size-36"></i><i class="step icon-ubuntu size-48"></i><i class="step icon-ubuntu size-60"></i><i class="step icon-ubuntu size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-ubuntu" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf149;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-php-alt size-12"></i><i class="step icon-php-alt size-14"></i><i class="step icon-php-alt size-16"></i><i class="step icon-php-alt size-18"></i><i class="step icon-php-alt size-21"></i><i class="step icon-php-alt size-24"></i><i class="step icon-php-alt size-36"></i><i class="step icon-php-alt size-48"></i><i class="step icon-php-alt size-60"></i><i class="step icon-php-alt size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-php-alt" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf14a;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-centos size-12"></i><i class="step icon-centos size-14"></i><i class="step icon-centos size-16"></i><i class="step icon-centos size-18"></i><i class="step icon-centos size-21"></i><i class="step icon-centos size-24"></i><i class="step icon-centos size-36"></i><i class="step icon-centos size-48"></i><i class="step icon-centos size-60"></i><i class="step icon-centos size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-centos" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf14b;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-nodejs size-12"></i><i class="step icon-nodejs size-14"></i><i class="step icon-nodejs size-16"></i><i class="step icon-nodejs size-18"></i><i class="step icon-nodejs size-21"></i><i class="step icon-nodejs size-24"></i><i class="step icon-nodejs size-36"></i><i class="step icon-nodejs size-48"></i><i class="step icon-nodejs size-60"></i><i class="step icon-nodejs size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-nodejs" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf14c;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-splatter size-12"></i><i class="step icon-splatter size-14"></i><i class="step icon-splatter size-16"></i><i class="step icon-splatter size-18"></i><i class="step icon-splatter size-21"></i><i class="step icon-splatter size-24"></i><i class="step icon-splatter size-36"></i><i class="step icon-splatter size-48"></i><i class="step icon-splatter size-60"></i><i class="step icon-splatter size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-splatter" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf14d;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-3dprint size-12"></i><i class="step icon-3dprint size-14"></i><i class="step icon-3dprint size-16"></i><i class="step icon-3dprint size-18"></i><i class="step icon-3dprint size-21"></i><i class="step icon-3dprint size-24"></i><i class="step icon-3dprint size-36"></i><i class="step icon-3dprint size-48"></i><i class="step icon-3dprint size-60"></i><i class="step icon-3dprint size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-3dprint" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf14e;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-line-graph size-12"></i><i class="step icon-line-graph size-14"></i><i class="step icon-line-graph size-16"></i><i class="step icon-line-graph size-18"></i><i class="step icon-line-graph size-21"></i><i class="step icon-line-graph size-24"></i><i class="step icon-line-graph size-36"></i><i class="step icon-line-graph size-48"></i><i class="step icon-line-graph size-60"></i><i class="step icon-line-graph size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-line-graph" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf14f;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-cassandra size-12"></i><i class="step icon-cassandra size-14"></i><i class="step icon-cassandra size-16"></i><i class="step icon-cassandra size-18"></i><i class="step icon-cassandra size-21"></i><i class="step icon-cassandra size-24"></i><i class="step icon-cassandra size-36"></i><i class="step icon-cassandra size-48"></i><i class="step icon-cassandra size-60"></i><i class="step icon-cassandra size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-cassandra" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf150;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-solaris size-12"></i><i class="step icon-solaris size-14"></i><i class="step icon-solaris size-16"></i><i class="step icon-solaris size-18"></i><i class="step icon-solaris size-21"></i><i class="step icon-solaris size-24"></i><i class="step icon-solaris size-36"></i><i class="step icon-solaris size-48"></i><i class="step icon-solaris size-60"></i><i class="step icon-solaris size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-solaris" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf151;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-jetty size-12"></i><i class="step icon-jetty size-14"></i><i class="step icon-jetty size-16"></i><i class="step icon-jetty size-18"></i><i class="step icon-jetty size-21"></i><i class="step icon-jetty size-24"></i><i class="step icon-jetty size-36"></i><i class="step icon-jetty size-48"></i><i class="step icon-jetty size-60"></i><i class="step icon-jetty size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-jetty" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf152;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-tomcat size-12"></i><i class="step icon-tomcat size-14"></i><i class="step icon-tomcat size-16"></i><i class="step icon-tomcat size-18"></i><i class="step icon-tomcat size-21"></i><i class="step icon-tomcat size-24"></i><i class="step icon-tomcat size-36"></i><i class="step icon-tomcat size-48"></i><i class="step icon-tomcat size-60"></i><i class="step icon-tomcat size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-tomcat" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf153;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-oracle size-12"></i><i class="step icon-oracle size-14"></i><i class="step icon-oracle size-16"></i><i class="step icon-oracle size-18"></i><i class="step icon-oracle size-21"></i><i class="step icon-oracle size-24"></i><i class="step icon-oracle size-36"></i><i class="step icon-oracle size-48"></i><i class="step icon-oracle size-60"></i><i class="step icon-oracle size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-oracle" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf154;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-oracle-alt size-12"></i><i class="step icon-oracle-alt size-14"></i><i class="step icon-oracle-alt size-16"></i><i class="step icon-oracle-alt size-18"></i><i class="step icon-oracle-alt size-21"></i><i class="step icon-oracle-alt size-24"></i><i class="step icon-oracle-alt size-36"></i><i class="step icon-oracle-alt size-48"></i><i class="step icon-oracle-alt size-60"></i><i class="step icon-oracle-alt size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-oracle-alt" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf155;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-mssql size-12"></i><i class="step icon-mssql size-14"></i><i class="step icon-mssql size-16"></i><i class="step icon-mssql size-18"></i><i class="step icon-mssql size-21"></i><i class="step icon-mssql size-24"></i><i class="step icon-mssql size-36"></i><i class="step icon-mssql size-48"></i><i class="step icon-mssql size-60"></i><i class="step icon-mssql size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-mssql" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf156;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-google-developers size-12"></i><i class="step icon-google-developers size-14"></i><i class="step icon-google-developers size-16"></i><i class="step icon-google-developers size-18"></i><i class="step icon-google-developers size-21"></i><i class="step icon-google-developers size-24"></i><i class="step icon-google-developers size-36"></i><i class="step icon-google-developers size-48"></i><i class="step icon-google-developers size-60"></i><i class="step icon-google-developers size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-google-developers" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf157;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-google-code size-12"></i><i class="step icon-google-code size-14"></i><i class="step icon-google-code size-16"></i><i class="step icon-google-code size-18"></i><i class="step icon-google-code size-21"></i><i class="step icon-google-code size-24"></i><i class="step icon-google-code size-36"></i><i class="step icon-google-code size-48"></i><i class="step icon-google-code size-60"></i><i class="step icon-google-code size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-google-code" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf158;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-kde size-12"></i><i class="step icon-kde size-14"></i><i class="step icon-kde size-16"></i><i class="step icon-kde size-18"></i><i class="step icon-kde size-21"></i><i class="step icon-kde size-24"></i><i class="step icon-kde size-36"></i><i class="step icon-kde size-48"></i><i class="step icon-kde size-60"></i><i class="step icon-kde size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-kde" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf159;" /> + </div> + </div> + + <div class="glyph"> + <div class="preview-glyphs"> + <i class="step icon-grails-alt size-12"></i><i class="step icon-grails-alt size-14"></i><i class="step icon-grails-alt size-16"></i><i class="step icon-grails-alt size-18"></i><i class="step icon-grails-alt size-21"></i><i class="step icon-grails-alt size-24"></i><i class="step icon-grails-alt size-36"></i><i class="step icon-grails-alt size-48"></i><i class="step icon-grails-alt size-60"></i><i class="step icon-grails-alt size-72"></i> + </div> + <div class="preview-scale"> + <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span> + </div> + <div class="usage"> + <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".icon-grails-alt" /> + <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&#xf15a;" /> + </div> + </div> + + + <div class="footer"> + Made with love using <a href="http://fontcustom.com">Font Custom</a>. + </div> + </div> + </body> +</html> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/fontawesome-webfont.eot b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/fontawesome-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..33b2bb80055cc480e797de704925acaba4ba7d7d Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/fontawesome-webfont.eot differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/fontawesome-webfont.svg b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/fontawesome-webfont.svg new file mode 100644 index 0000000000000000000000000000000000000000..1ee89d4368d31a368817a842f14d53f7a64c3038 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/fontawesome-webfont.svg @@ -0,0 +1,565 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"> +<metadata></metadata> +<defs> +<font id="fontawesomeregular" horiz-adv-x="1536" > +<font-face units-per-em="1792" ascent="1536" descent="-256" /> +<missing-glyph horiz-adv-x="448" /> +<glyph unicode=" " horiz-adv-x="448" /> +<glyph unicode="	" horiz-adv-x="448" /> +<glyph unicode=" " horiz-adv-x="448" /> +<glyph unicode="¨" horiz-adv-x="1792" /> +<glyph unicode="©" horiz-adv-x="1792" /> +<glyph unicode="®" horiz-adv-x="1792" /> +<glyph unicode="´" horiz-adv-x="1792" /> +<glyph unicode="Æ" horiz-adv-x="1792" /> +<glyph unicode="Ø" horiz-adv-x="1792" /> +<glyph unicode=" " horiz-adv-x="768" /> +<glyph unicode=" " horiz-adv-x="1537" /> +<glyph unicode=" " horiz-adv-x="768" /> +<glyph unicode=" " horiz-adv-x="1537" /> +<glyph unicode=" " horiz-adv-x="512" /> +<glyph unicode=" " horiz-adv-x="384" /> +<glyph unicode=" " horiz-adv-x="256" /> +<glyph unicode=" " horiz-adv-x="256" /> +<glyph unicode=" " horiz-adv-x="192" /> +<glyph unicode=" " horiz-adv-x="307" /> +<glyph unicode=" " horiz-adv-x="85" /> +<glyph unicode=" " horiz-adv-x="307" /> +<glyph unicode=" " horiz-adv-x="384" /> +<glyph unicode="™" horiz-adv-x="1792" /> +<glyph unicode="∞" horiz-adv-x="1792" /> +<glyph unicode="≠" horiz-adv-x="1792" /> +<glyph unicode="◼" horiz-adv-x="500" d="M0 0z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1699 1350q0 -35 -43 -78l-632 -632v-768h320q26 0 45 -19t19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45t45 19h320v768l-632 632q-43 43 -43 78q0 23 18 36.5t38 17.5t43 4h1408q23 0 43 -4t38 -17.5t18 -36.5z" /> +<glyph unicode="" d="M1536 1312v-1120q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v537l-768 -237v-709q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89 t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v967q0 31 19 56.5t49 35.5l832 256q12 4 28 4q40 0 68 -28t28 -68z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -52 -38 -90t-90 -38q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5 t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1664 32v768q-32 -36 -69 -66q-268 -206 -426 -338q-51 -43 -83 -67t-86.5 -48.5t-102.5 -24.5h-1h-1q-48 0 -102.5 24.5t-86.5 48.5t-83 67q-158 132 -426 338q-37 30 -69 66v-768q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1664 1083v11v13.5t-0.5 13 t-3 12.5t-5.5 9t-9 7.5t-14 2.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5q0 -168 147 -284q193 -152 401 -317q6 -5 35 -29.5t46 -37.5t44.5 -31.5t50.5 -27.5t43 -9h1h1q20 0 43 9t50.5 27.5t44.5 31.5t46 37.5t35 29.5q208 165 401 317q54 43 100.5 115.5t46.5 131.5z M1792 1120v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" /> +<glyph unicode="" horiz-adv-x="1792" d="M896 -128q-26 0 -44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600 q-18 -18 -44 -18z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -21 -10.5 -35.5t-30.5 -14.5q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455 l502 -73q56 -9 56 -46z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1137 532l306 297l-422 62l-189 382l-189 -382l-422 -62l306 -297l-73 -421l378 199l377 -199zM1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -50 -41 -50q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500 l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1408 131q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q9 0 42 -21.5t74.5 -48t108 -48t133.5 -21.5t133.5 21.5t108 48t74.5 48t42 21.5q61 0 111.5 -20t85.5 -53.5t62 -81 t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" /> +<glyph unicode="" horiz-adv-x="1920" d="M384 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 320v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 704v128q0 26 -19 45t-45 19h-128 q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 -64v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM384 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45 t45 -19h128q26 0 45 19t19 45zM1792 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 704v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1792 320v128 q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 704v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19 t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1920 1248v-1344q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1344q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" /> +<glyph unicode="" horiz-adv-x="1664" d="M768 512v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM768 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 512v-384q0 -52 -38 -90t-90 -38 h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" /> +<glyph unicode="" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 288v-192q0 -40 -28 -68t-68 -28h-320 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68z" /> +<glyph unicode="" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-960 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h960q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1671 970q0 -40 -28 -68l-724 -724l-136 -136q-28 -28 -68 -28t-68 28l-136 136l-362 362q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -295l656 657q28 28 68 28t68 -28l136 -136q28 -28 28 -68z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1298 214q0 -40 -28 -68l-136 -136q-28 -28 -68 -28t-68 28l-294 294l-294 -294q-28 -28 -68 -28t-68 28l-136 136q-28 28 -28 68t28 68l294 294l-294 294q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -294l294 294q28 28 68 28t68 -28l136 -136q28 -28 28 -68 t-28 -68l-294 -294l294 -294q28 -28 28 -68z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-224q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v224h-224q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h224v224q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-224h224 q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5 t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-576q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h576q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5z M1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z " /> +<glyph unicode="" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61t-298 61t-245 164t-164 245t-61 298q0 182 80.5 343t226.5 270q43 32 95.5 25t83.5 -50q32 -42 24.5 -94.5t-49.5 -84.5q-98 -74 -151.5 -181t-53.5 -228q0 -104 40.5 -198.5t109.5 -163.5t163.5 -109.5 t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5q0 121 -53.5 228t-151.5 181q-42 32 -49.5 84.5t24.5 94.5q31 43 84 50t95 -25q146 -109 226.5 -270t80.5 -343zM896 1408v-640q0 -52 -38 -90t-90 -38t-90 38t-38 90v640q0 52 38 90t90 38t90 -38t38 -90z" /> +<glyph unicode="" horiz-adv-x="1792" d="M256 96v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 224v-320q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 480v-576q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23 v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1408 864v-960q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1376v-1472q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1472q0 14 9 23t23 9h192q14 0 23 -9t9 -23z" /> +<glyph unicode="" d="M1024 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1536 749v-222q0 -12 -8 -23t-20 -13l-185 -28q-19 -54 -39 -91q35 -50 107 -138q10 -12 10 -25t-9 -23q-27 -37 -99 -108t-94 -71q-12 0 -26 9l-138 108q-44 -23 -91 -38 q-16 -136 -29 -186q-7 -28 -36 -28h-222q-14 0 -24.5 8.5t-11.5 21.5l-28 184q-49 16 -90 37l-141 -107q-10 -9 -25 -9q-14 0 -25 11q-126 114 -165 168q-7 10 -7 23q0 12 8 23q15 21 51 66.5t54 70.5q-27 50 -41 99l-183 27q-13 2 -21 12.5t-8 23.5v222q0 12 8 23t19 13 l186 28q14 46 39 92q-40 57 -107 138q-10 12 -10 24q0 10 9 23q26 36 98.5 107.5t94.5 71.5q13 0 26 -10l138 -107q44 23 91 38q16 136 29 186q7 28 36 28h222q14 0 24.5 -8.5t11.5 -21.5l28 -184q49 -16 90 -37l142 107q9 9 24 9q13 0 25 -10q129 -119 165 -170q7 -8 7 -22 q0 -12 -8 -23q-15 -21 -51 -66.5t-54 -70.5q26 -50 41 -98l183 -28q13 -2 21 -12.5t8 -23.5z" /> +<glyph unicode="" horiz-adv-x="1408" d="M512 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM768 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1024 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1152 76v948h-896v-948q0 -22 7 -40.5t14.5 -27t10.5 -8.5h832q3 0 10.5 8.5t14.5 27t7 40.5zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832 q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1408 544v-480q0 -26 -19 -45t-45 -19h-384v384h-256v-384h-384q-26 0 -45 19t-19 45v480q0 1 0.5 3t0.5 3l575 474l575 -474q1 -2 1 -6zM1631 613l-62 -74q-8 -9 -21 -11h-3q-13 0 -21 7l-692 577l-692 -577q-12 -8 -24 -7q-13 2 -21 11l-62 74q-8 10 -7 23.5t11 21.5 l719 599q32 26 76 26t76 -26l244 -204v195q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-408l219 -182q10 -8 11 -21.5t-7 -23.5z" /> +<glyph unicode="" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z " /> +<glyph unicode="" d="M896 992v-448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" horiz-adv-x="1920" d="M1111 540v4l-24 320q-1 13 -11 22.5t-23 9.5h-186q-13 0 -23 -9.5t-11 -22.5l-24 -320v-4q-1 -12 8 -20t21 -8h244q12 0 21 8t8 20zM1870 73q0 -73 -46 -73h-704q13 0 22 9.5t8 22.5l-20 256q-1 13 -11 22.5t-23 9.5h-272q-13 0 -23 -9.5t-11 -22.5l-20 -256 q-1 -13 8 -22.5t22 -9.5h-704q-46 0 -46 73q0 54 26 116l417 1044q8 19 26 33t38 14h339q-13 0 -23 -9.5t-11 -22.5l-15 -192q-1 -14 8 -23t22 -9h166q13 0 22 9t8 23l-15 192q-1 13 -11 22.5t-23 9.5h339q20 0 38 -14t26 -33l417 -1044q26 -62 26 -116z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1280 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 416v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h465l135 -136 q58 -56 136 -56t136 56l136 136h464q40 0 68 -28t28 -68zM1339 985q17 -41 -14 -70l-448 -448q-18 -19 -45 -19t-45 19l-448 448q-31 29 -14 70q17 39 59 39h256v448q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-448h256q42 0 59 -39z" /> +<glyph unicode="" d="M1120 608q0 -12 -10 -24l-319 -319q-11 -9 -23 -9t-23 9l-320 320q-15 16 -7 35q8 20 30 20h192v352q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-352h192q14 0 23 -9t9 -23zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273 t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1118 660q-8 -20 -30 -20h-192v-352q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v352h-192q-14 0 -23 9t-9 23q0 12 10 24l319 319q11 9 23 9t23 -9l320 -320q15 -16 7 -35zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198 t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1023 576h316q-1 3 -2.5 8t-2.5 8l-212 496h-708l-212 -496q-1 -2 -2.5 -8t-2.5 -8h316l95 -192h320zM1536 546v-482q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v482q0 62 25 123l238 552q10 25 36.5 42t52.5 17h832q26 0 52.5 -17t36.5 -42l238 -552 q25 -61 25 -123z" /> +<glyph unicode="" d="M1184 640q0 -37 -32 -55l-544 -320q-15 -9 -32 -9q-16 0 -32 8q-32 19 -32 56v640q0 37 32 56q33 18 64 -1l544 -320q32 -18 32 -55zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l138 138q-148 137 -349 137q-104 0 -198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5q119 0 225 52t179 147q7 10 23 12q14 0 25 -9 l137 -138q9 -8 9.5 -20.5t-7.5 -22.5q-109 -132 -264 -204.5t-327 -72.5q-156 0 -298 61t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q147 0 284.5 -55.5t244.5 -156.5l130 129q29 31 70 14q39 -17 39 -59z" /> +<glyph unicode="" d="M1511 480q0 -5 -1 -7q-64 -268 -268 -434.5t-478 -166.5q-146 0 -282.5 55t-243.5 157l-129 -129q-19 -19 -45 -19t-45 19t-19 45v448q0 26 19 45t45 19h448q26 0 45 -19t19 -45t-19 -45l-137 -137q71 -66 161 -102t187 -36q134 0 250 65t186 179q11 17 53 117 q8 23 30 23h192q13 0 22.5 -9.5t9.5 -22.5zM1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-26 0 -45 19t-19 45t19 45l138 138q-148 137 -349 137q-134 0 -250 -65t-186 -179q-11 -17 -53 -117q-8 -23 -30 -23h-199q-13 0 -22.5 9.5t-9.5 22.5v7q65 268 270 434.5t480 166.5 q146 0 284 -55.5t245 -156.5l130 129q19 19 45 19t45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1792" d="M384 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M384 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1536 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5z M1536 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5zM1536 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5 t9.5 -22.5zM1664 160v832q0 13 -9.5 22.5t-22.5 9.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1792 1248v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47 t47 -113z" /> +<glyph unicode="" horiz-adv-x="1152" d="M320 768h512v192q0 106 -75 181t-181 75t-181 -75t-75 -181v-192zM1152 672v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v192q0 184 132 316t316 132t316 -132t132 -316v-192h32q40 0 68 -28t28 -68z" /> +<glyph unicode="" horiz-adv-x="1792" d="M320 1280q0 -72 -64 -110v-1266q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v1266q-64 38 -64 110q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -25 -12.5 -38.5t-39.5 -27.5q-215 -116 -369 -116q-61 0 -123.5 22t-108.5 48 t-115.5 48t-142.5 22q-192 0 -464 -146q-17 -9 -33 -9q-26 0 -45 19t-19 45v742q0 32 31 55q21 14 79 43q236 120 421 120q107 0 200 -29t219 -88q38 -19 88 -19q54 0 117.5 21t110 47t88 47t54.5 21q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1664 650q0 -166 -60 -314l-20 -49l-185 -33q-22 -83 -90.5 -136.5t-156.5 -53.5v-32q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-32q71 0 130 -35.5t93 -95.5l68 12q29 95 29 193q0 148 -88 279t-236.5 209t-315.5 78 t-315.5 -78t-236.5 -209t-88 -279q0 -98 29 -193l68 -12q34 60 93 95.5t130 35.5v32q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v32q-88 0 -156.5 53.5t-90.5 136.5l-185 33l-20 49q-60 148 -60 314q0 151 67 291t179 242.5 t266 163.5t320 61t320 -61t266 -163.5t179 -242.5t67 -291z" /> +<glyph unicode="" horiz-adv-x="768" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1152" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142z" /> +<glyph unicode="" horiz-adv-x="1664" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142zM1408 640q0 -153 -85 -282.5t-225 -188.5q-13 -5 -25 -5q-27 0 -46 19t-19 45q0 39 39 59q56 29 76 44q74 54 115.5 135.5t41.5 173.5t-41.5 173.5 t-115.5 135.5q-20 15 -76 44q-39 20 -39 59q0 26 19 45t45 19q13 0 26 -5q140 -59 225 -188.5t85 -282.5zM1664 640q0 -230 -127 -422.5t-338 -283.5q-13 -5 -26 -5q-26 0 -45 19t-19 45q0 36 39 59q7 4 22.5 10.5t22.5 10.5q46 25 82 51q123 91 192 227t69 289t-69 289 t-192 227q-36 26 -82 51q-7 4 -22.5 10.5t-22.5 10.5q-39 23 -39 59q0 26 19 45t45 19q13 0 26 -5q211 -91 338 -283.5t127 -422.5z" /> +<glyph unicode="" horiz-adv-x="1408" d="M384 384v-128h-128v128h128zM384 1152v-128h-128v128h128zM1152 1152v-128h-128v128h128zM128 129h384v383h-384v-383zM128 896h384v384h-384v-384zM896 896h384v384h-384v-384zM640 640v-640h-640v640h640zM1152 128v-128h-128v128h128zM1408 128v-128h-128v128h128z M1408 640v-384h-384v128h-128v-384h-128v640h384v-128h128v128h128zM640 1408v-640h-640v640h640zM1408 1408v-640h-640v640h640z" /> +<glyph unicode="" horiz-adv-x="1792" d="M63 0h-63v1408h63v-1408zM126 1h-32v1407h32v-1407zM220 1h-31v1407h31v-1407zM377 1h-31v1407h31v-1407zM534 1h-62v1407h62v-1407zM660 1h-31v1407h31v-1407zM723 1h-31v1407h31v-1407zM786 1h-31v1407h31v-1407zM943 1h-63v1407h63v-1407zM1100 1h-63v1407h63v-1407z M1226 1h-63v1407h63v-1407zM1352 1h-63v1407h63v-1407zM1446 1h-63v1407h63v-1407zM1635 1h-94v1407h94v-1407zM1698 1h-32v1407h32v-1407zM1792 0h-63v1408h63v-1408z" /> +<glyph unicode="" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91z" /> +<glyph unicode="" horiz-adv-x="1920" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91zM1899 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-36 0 -59 14t-53 45l470 470q37 37 37 90q0 52 -37 91l-715 714q-38 38 -102 64.5t-117 26.5h224q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1639 1058q40 -57 18 -129l-275 -906q-19 -64 -76.5 -107.5t-122.5 -43.5h-923q-77 0 -148.5 53.5t-99.5 131.5q-24 67 -2 127q0 4 3 27t4 37q1 8 -3 21.5t-3 19.5q2 11 8 21t16.5 23.5t16.5 23.5q23 38 45 91.5t30 91.5q3 10 0.5 30t-0.5 28q3 11 17 28t17 23 q21 36 42 92t25 90q1 9 -2.5 32t0.5 28q4 13 22 30.5t22 22.5q19 26 42.5 84.5t27.5 96.5q1 8 -3 25.5t-2 26.5q2 8 9 18t18 23t17 21q8 12 16.5 30.5t15 35t16 36t19.5 32t26.5 23.5t36 11.5t47.5 -5.5l-1 -3q38 9 51 9h761q74 0 114 -56t18 -130l-274 -906 q-36 -119 -71.5 -153.5t-128.5 -34.5h-869q-27 0 -38 -15q-11 -16 -1 -43q24 -70 144 -70h923q29 0 56 15.5t35 41.5l300 987q7 22 5 57q38 -15 59 -43zM575 1056q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5 t-16.5 -22.5zM492 800q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5z" /> +<glyph unicode="" horiz-adv-x="1280" d="M1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048z" /> +<glyph unicode="" horiz-adv-x="1664" d="M384 0h896v256h-896v-256zM384 640h896v384h-160q-40 0 -68 28t-28 68v160h-640v-640zM1536 576q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 576v-416q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-160q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68 v160h-224q-13 0 -22.5 9.5t-9.5 22.5v416q0 79 56.5 135.5t135.5 56.5h64v544q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-256h64q79 0 135.5 -56.5t56.5 -135.5z" /> +<glyph unicode="" horiz-adv-x="1920" d="M960 864q119 0 203.5 -84.5t84.5 -203.5t-84.5 -203.5t-203.5 -84.5t-203.5 84.5t-84.5 203.5t84.5 203.5t203.5 84.5zM1664 1280q106 0 181 -75t75 -181v-896q0 -106 -75 -181t-181 -75h-1408q-106 0 -181 75t-75 181v896q0 106 75 181t181 75h224l51 136 q19 49 69.5 84.5t103.5 35.5h512q53 0 103.5 -35.5t69.5 -84.5l51 -136h224zM960 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" /> +<glyph unicode="" horiz-adv-x="1664" d="M725 977l-170 -450q33 0 136.5 -2t160.5 -2q19 0 57 2q-87 253 -184 452zM0 -128l2 79q23 7 56 12.5t57 10.5t49.5 14.5t44.5 29t31 50.5l237 616l280 724h75h53q8 -14 11 -21l205 -480q33 -78 106 -257.5t114 -274.5q15 -34 58 -144.5t72 -168.5q20 -45 35 -57 q19 -15 88 -29.5t84 -20.5q6 -38 6 -57q0 -4 -0.5 -13t-0.5 -13q-63 0 -190 8t-191 8q-76 0 -215 -7t-178 -8q0 43 4 78l131 28q1 0 12.5 2.5t15.5 3.5t14.5 4.5t15 6.5t11 8t9 11t2.5 14q0 16 -31 96.5t-72 177.5t-42 100l-450 2q-26 -58 -76.5 -195.5t-50.5 -162.5 q0 -22 14 -37.5t43.5 -24.5t48.5 -13.5t57 -8.5t41 -4q1 -19 1 -58q0 -9 -2 -27q-58 0 -174.5 10t-174.5 10q-8 0 -26.5 -4t-21.5 -4q-80 -14 -188 -14z" /> +<glyph unicode="" horiz-adv-x="1408" d="M555 15q74 -32 140 -32q376 0 376 335q0 114 -41 180q-27 44 -61.5 74t-67.5 46.5t-80.5 25t-84 10.5t-94.5 2q-73 0 -101 -10q0 -53 -0.5 -159t-0.5 -158q0 -8 -1 -67.5t-0.5 -96.5t4.5 -83.5t12 -66.5zM541 761q42 -7 109 -7q82 0 143 13t110 44.5t74.5 89.5t25.5 142 q0 70 -29 122.5t-79 82t-108 43.5t-124 14q-50 0 -130 -13q0 -50 4 -151t4 -152q0 -27 -0.5 -80t-0.5 -79q0 -46 1 -69zM0 -128l2 94q15 4 85 16t106 27q7 12 12.5 27t8.5 33.5t5.5 32.5t3 37.5t0.5 34v35.5v30q0 982 -22 1025q-4 8 -22 14.5t-44.5 11t-49.5 7t-48.5 4.5 t-30.5 3l-4 83q98 2 340 11.5t373 9.5q23 0 68.5 -0.5t67.5 -0.5q70 0 136.5 -13t128.5 -42t108 -71t74 -104.5t28 -137.5q0 -52 -16.5 -95.5t-39 -72t-64.5 -57.5t-73 -45t-84 -40q154 -35 256.5 -134t102.5 -248q0 -100 -35 -179.5t-93.5 -130.5t-138 -85.5t-163.5 -48.5 t-176 -14q-44 0 -132 3t-132 3q-106 0 -307 -11t-231 -12z" /> +<glyph unicode="" horiz-adv-x="1024" d="M0 -126l17 85q6 2 81.5 21.5t111.5 37.5q28 35 41 101q1 7 62 289t114 543.5t52 296.5v25q-24 13 -54.5 18.5t-69.5 8t-58 5.5l19 103q33 -2 120 -6.5t149.5 -7t120.5 -2.5q48 0 98.5 2.5t121 7t98.5 6.5q-5 -39 -19 -89q-30 -10 -101.5 -28.5t-108.5 -33.5 q-8 -19 -14 -42.5t-9 -40t-7.5 -45.5t-6.5 -42q-27 -148 -87.5 -419.5t-77.5 -355.5q-2 -9 -13 -58t-20 -90t-16 -83.5t-6 -57.5l1 -18q17 -4 185 -31q-3 -44 -16 -99q-11 0 -32.5 -1.5t-32.5 -1.5q-29 0 -87 10t-86 10q-138 2 -206 2q-51 0 -143 -9t-121 -11z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1744 128q33 0 42 -18.5t-11 -44.5l-126 -162q-20 -26 -49 -26t-49 26l-126 162q-20 26 -11 44.5t42 18.5h80v1024h-80q-33 0 -42 18.5t11 44.5l126 162q20 26 49 26t49 -26l126 -162q20 -26 11 -44.5t-42 -18.5h-80v-1024h80zM81 1407l54 -27q12 -5 211 -5q44 0 132 2 t132 2q36 0 107.5 -0.5t107.5 -0.5h293q6 0 21 -0.5t20.5 0t16 3t17.5 9t15 17.5l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 48t-14.5 73.5t-7.5 35.5q-6 8 -12 12.5t-15.5 6t-13 2.5t-18 0.5t-16.5 -0.5 q-17 0 -66.5 0.5t-74.5 0.5t-64 -2t-71 -6q-9 -81 -8 -136q0 -94 2 -388t2 -455q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27 q19 42 19 383q0 101 -3 303t-3 303v117q0 2 0.5 15.5t0.5 25t-1 25.5t-3 24t-5 14q-11 12 -162 12q-33 0 -93 -12t-80 -26q-19 -13 -34 -72.5t-31.5 -111t-42.5 -53.5q-42 26 -56 44v383z" /> +<glyph unicode="" d="M81 1407l54 -27q12 -5 211 -5q44 0 132 2t132 2q70 0 246.5 1t304.5 0.5t247 -4.5q33 -1 56 31l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 47.5t-15 73.5t-7 36q-10 13 -27 19q-5 2 -66 2q-30 0 -93 1t-103 1 t-94 -2t-96 -7q-9 -81 -8 -136l1 -152v52q0 -55 1 -154t1.5 -180t0.5 -153q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27 q7 16 11.5 74t6 145.5t1.5 155t-0.5 153.5t-0.5 89q0 7 -2.5 21.5t-2.5 22.5q0 7 0.5 44t1 73t0 76.5t-3 67.5t-6.5 32q-11 12 -162 12q-41 0 -163 -13.5t-138 -24.5q-19 -12 -34 -71.5t-31.5 -111.5t-42.5 -54q-42 26 -56 44v383zM1310 125q12 0 42 -19.5t57.5 -41.5 t59.5 -49t36 -30q26 -21 26 -49t-26 -49q-4 -3 -36 -30t-59.5 -49t-57.5 -41.5t-42 -19.5q-13 0 -20.5 10.5t-10 28.5t-2.5 33.5t1.5 33t1.5 19.5h-1024q0 -2 1.5 -19.5t1.5 -33t-2.5 -33.5t-10 -28.5t-20.5 -10.5q-12 0 -42 19.5t-57.5 41.5t-59.5 49t-36 30q-26 21 -26 49 t26 49q4 3 36 30t59.5 49t57.5 41.5t42 19.5q13 0 20.5 -10.5t10 -28.5t2.5 -33.5t-1.5 -33t-1.5 -19.5h1024q0 2 -1.5 19.5t-1.5 33t2.5 33.5t10 28.5t20.5 10.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h896q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45t-45 -19 h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h640q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1792" d="M256 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM256 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5 t9.5 -22.5zM256 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344 q13 0 22.5 -9.5t9.5 -22.5zM256 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192 q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M384 992v-576q0 -13 -9.5 -22.5t-22.5 -9.5q-14 0 -23 9l-288 288q-9 9 -9 23t9 23l288 288q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M352 704q0 -14 -9 -23l-288 -288q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v576q0 13 9.5 22.5t22.5 9.5q14 0 23 -9l288 -288q9 -9 9 -23zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1792 1184v-1088q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-403 403v-166q0 -119 -84.5 -203.5t-203.5 -84.5h-704q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h704q119 0 203.5 -84.5t84.5 -203.5v-165l403 402q18 19 45 19q12 0 25 -5 q39 -17 39 -59z" /> +<glyph unicode="" horiz-adv-x="1920" d="M640 960q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 576v-448h-1408v192l320 320l160 -160l512 512zM1760 1280h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216 q0 13 -9.5 22.5t-22.5 9.5zM1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" /> +<glyph unicode="" d="M363 0l91 91l-235 235l-91 -91v-107h128v-128h107zM886 928q0 22 -22 22q-10 0 -17 -7l-542 -542q-7 -7 -7 -17q0 -22 22 -22q10 0 17 7l542 542q7 7 7 17zM832 1120l416 -416l-832 -832h-416v416zM1515 1024q0 -53 -37 -90l-166 -166l-416 416l166 165q36 38 90 38 q53 0 91 -38l235 -234q37 -39 37 -91z" /> +<glyph unicode="" horiz-adv-x="1024" d="M768 896q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1024 896q0 -109 -33 -179l-364 -774q-16 -33 -47.5 -52t-67.5 -19t-67.5 19t-46.5 52l-365 774q-33 70 -33 179q0 212 150 362t362 150t362 -150t150 -362z" /> +<glyph unicode="" d="M768 96v1088q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" horiz-adv-x="1024" d="M512 384q0 36 -20 69q-1 1 -15.5 22.5t-25.5 38t-25 44t-21 50.5q-4 16 -21 16t-21 -16q-7 -23 -21 -50.5t-25 -44t-25.5 -38t-15.5 -22.5q-20 -33 -20 -69q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 512q0 -212 -150 -362t-362 -150t-362 150t-150 362 q0 145 81 275q6 9 62.5 90.5t101 151t99.5 178t83 201.5q9 30 34 47t51 17t51.5 -17t33.5 -47q28 -93 83 -201.5t99.5 -178t101 -151t62.5 -90.5q81 -127 81 -275z" /> +<glyph unicode="" horiz-adv-x="1792" d="M888 352l116 116l-152 152l-116 -116v-56h96v-96h56zM1328 1072q-16 16 -33 -1l-350 -350q-17 -17 -1 -33t33 1l350 350q17 17 1 33zM1408 478v-190q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-14 -14 -32 -8q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v126q0 13 9 22l64 64q15 15 35 7t20 -29zM1312 1216l288 -288l-672 -672h-288v288zM1756 1084l-92 -92 l-288 288l92 92q28 28 68 28t68 -28l152 -152q28 -28 28 -68t-28 -68z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1408 547v-259q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h255v0q13 0 22.5 -9.5t9.5 -22.5q0 -27 -26 -32q-77 -26 -133 -60q-10 -4 -16 -4h-112q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832 q66 0 113 47t47 113v214q0 19 18 29q28 13 54 37q16 16 35 8q21 -9 21 -29zM1645 1043l-384 -384q-18 -19 -45 -19q-12 0 -25 5q-39 17 -39 59v192h-160q-323 0 -438 -131q-119 -137 -74 -473q3 -23 -20 -34q-8 -2 -12 -2q-16 0 -26 13q-10 14 -21 31t-39.5 68.5t-49.5 99.5 t-38.5 114t-17.5 122q0 49 3.5 91t14 90t28 88t47 81.5t68.5 74t94.5 61.5t124.5 48.5t159.5 30.5t196.5 11h160v192q0 42 39 59q13 5 25 5q26 0 45 -19l384 -384q19 -19 19 -45t-19 -45z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1408 606v-318q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-10 -10 -23 -10q-3 0 -9 2q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832 q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v254q0 13 9 22l64 64q10 10 23 10q6 0 12 -3q20 -8 20 -29zM1639 1095l-814 -814q-24 -24 -57 -24t-57 24l-430 430q-24 24 -24 57t24 57l110 110q24 24 57 24t57 -24l263 -263l647 647q24 24 57 24t57 -24l110 -110 q24 -24 24 -57t-24 -57z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-384v-384h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v384h-384v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45 t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h384v384h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-384h384v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" /> +<glyph unicode="" horiz-adv-x="1024" d="M979 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1747 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19l710 710 q19 19 32 13t13 -32v-710q4 11 13 19z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1619 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-8 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-19 19 -19 45t19 45l710 710q19 19 32 13t13 -32v-710q5 11 13 19z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1384 609l-1328 -738q-23 -13 -39.5 -3t-16.5 36v1472q0 26 16.5 36t39.5 -3l1328 -738q23 -13 23 -31t-23 -31z" /> +<glyph unicode="" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45zM640 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45z" /> +<glyph unicode="" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1664" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q19 -19 19 -45t-19 -45l-710 -710q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" /> +<glyph unicode="" horiz-adv-x="1792" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19l-710 -710 q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" /> +<glyph unicode="" horiz-adv-x="1024" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19z" /> +<glyph unicode="" horiz-adv-x="1538" d="M14 557l710 710q19 19 45 19t45 -19l710 -710q19 -19 13 -32t-32 -13h-1472q-26 0 -32 13t13 32zM1473 0h-1408q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19z" /> +<glyph unicode="" horiz-adv-x="1280" d="M1171 1235l-531 -531l531 -531q19 -19 19 -45t-19 -45l-166 -166q-19 -19 -45 -19t-45 19l-742 742q-19 19 -19 45t19 45l742 742q19 19 45 19t45 -19l166 -166q19 -19 19 -45t-19 -45z" /> +<glyph unicode="" horiz-adv-x="1280" d="M1107 659l-742 -742q-19 -19 -45 -19t-45 19l-166 166q-19 19 -19 45t19 45l531 531l-531 531q-19 19 -19 45t19 45l166 166q19 19 45 19t45 -19l742 -742q19 -19 19 -45t-19 -45z" /> +<glyph unicode="" d="M1216 576v128q0 26 -19 45t-45 19h-256v256q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-256h-256q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h256v-256q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v256h256q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5 t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1216 576v128q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5 t103 -385.5z" /> +<glyph unicode="" d="M1149 414q0 26 -19 45l-181 181l181 181q19 19 19 45q0 27 -19 46l-90 90q-19 19 -46 19q-26 0 -45 -19l-181 -181l-181 181q-19 19 -45 19q-27 0 -46 -19l-90 -90q-19 -19 -19 -46q0 -26 19 -45l181 -181l-181 -181q-19 -19 -19 -45q0 -27 19 -46l90 -90q19 -19 46 -19 q26 0 45 19l181 181l181 -181q19 -19 45 -19q27 0 46 19l90 90q19 19 19 46zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1284 802q0 28 -18 46l-91 90q-19 19 -45 19t-45 -19l-408 -407l-226 226q-19 19 -45 19t-45 -19l-91 -90q-18 -18 -18 -46q0 -27 18 -45l362 -362q19 -19 45 -19q27 0 46 19l543 543q18 18 18 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M896 160v192q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h192q14 0 23 9t9 23zM1152 832q0 88 -55.5 163t-138.5 116t-170 41q-243 0 -371 -213q-15 -24 8 -42l132 -100q7 -6 19 -6q16 0 25 12q53 68 86 92q34 24 86 24q48 0 85.5 -26t37.5 -59 q0 -38 -20 -61t-68 -45q-63 -28 -115.5 -86.5t-52.5 -125.5v-36q0 -14 9 -23t23 -9h192q14 0 23 9t9 23q0 19 21.5 49.5t54.5 49.5q32 18 49 28.5t46 35t44.5 48t28 60.5t12.5 81zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1024 160v160q0 14 -9 23t-23 9h-96v512q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h96v-320h-96q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h448q14 0 23 9t9 23zM896 1056v160q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23 t23 -9h192q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1197 512h-109q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h109q-32 108 -112.5 188.5t-188.5 112.5v-109q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v109q-108 -32 -188.5 -112.5t-112.5 -188.5h109q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-109 q32 -108 112.5 -188.5t188.5 -112.5v109q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-109q108 32 188.5 112.5t112.5 188.5zM1536 704v-128q0 -26 -19 -45t-45 -19h-143q-37 -161 -154.5 -278.5t-278.5 -154.5v-143q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v143 q-161 37 -278.5 154.5t-154.5 278.5h-143q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h143q37 161 154.5 278.5t278.5 154.5v143q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-143q161 -37 278.5 -154.5t154.5 -278.5h143q26 0 45 -19t19 -45z" /> +<glyph unicode="" d="M1097 457l-146 -146q-10 -10 -23 -10t-23 10l-137 137l-137 -137q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23t10 23l137 137l-137 137q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l137 -137l137 137q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23 l-137 -137l137 -137q10 -10 10 -23t-10 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5 t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1171 723l-422 -422q-19 -19 -45 -19t-45 19l-294 294q-19 19 -19 45t19 45l102 102q19 19 45 19t45 -19l147 -147l275 275q19 19 45 19t45 -19l102 -102q19 -19 19 -45t-19 -45zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198 t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1312 643q0 161 -87 295l-754 -753q137 -89 297 -89q111 0 211.5 43.5t173.5 116.5t116 174.5t43 212.5zM313 344l755 754q-135 91 -300 91q-148 0 -273 -73t-198 -199t-73 -274q0 -162 89 -299zM1536 643q0 -157 -61 -300t-163.5 -246t-245 -164t-298.5 -61t-298.5 61 t-245 164t-163.5 246t-61 300t61 299.5t163.5 245.5t245 164t298.5 61t298.5 -61t245 -164t163.5 -245.5t61 -299.5z" /> +<glyph unicode="" d="M1536 640v-128q0 -53 -32.5 -90.5t-84.5 -37.5h-704l293 -294q38 -36 38 -90t-38 -90l-75 -76q-37 -37 -90 -37q-52 0 -91 37l-651 652q-37 37 -37 90q0 52 37 91l651 650q38 38 91 38q52 0 90 -38l75 -74q38 -38 38 -91t-38 -91l-293 -293h704q52 0 84.5 -37.5 t32.5 -90.5z" /> +<glyph unicode="" d="M1472 576q0 -54 -37 -91l-651 -651q-39 -37 -91 -37q-51 0 -90 37l-75 75q-38 38 -38 91t38 91l293 293h-704q-52 0 -84.5 37.5t-32.5 90.5v128q0 53 32.5 90.5t84.5 37.5h704l-293 294q-38 36 -38 90t38 90l75 75q38 38 90 38q53 0 91 -38l651 -651q37 -35 37 -90z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1611 565q0 -51 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-294 293v-704q0 -52 -37.5 -84.5t-90.5 -32.5h-128q-53 0 -90.5 32.5t-37.5 84.5v704l-294 -293q-36 -38 -90 -38t-90 38l-75 75q-38 38 -38 90q0 53 38 91l651 651q35 37 90 37q54 0 91 -37l651 -651 q37 -39 37 -91z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1611 704q0 -53 -37 -90l-651 -652q-39 -37 -91 -37q-53 0 -90 37l-651 652q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l294 -294v704q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-704l294 294q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1792 896q0 -26 -19 -45l-512 -512q-19 -19 -45 -19t-45 19t-19 45v256h-224q-98 0 -175.5 -6t-154 -21.5t-133 -42.5t-105.5 -69.5t-80 -101t-48.5 -138.5t-17.5 -181q0 -55 5 -123q0 -6 2.5 -23.5t2.5 -26.5q0 -15 -8.5 -25t-23.5 -10q-16 0 -28 17q-7 9 -13 22 t-13.5 30t-10.5 24q-127 285 -127 451q0 199 53 333q162 403 875 403h224v256q0 26 19 45t45 19t45 -19l512 -512q19 -19 19 -45z" /> +<glyph unicode="" d="M755 480q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23zM1536 1344v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332 q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45z" /> +<glyph unicode="" d="M768 576v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45zM1523 1248q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45 t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-416v-416q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v416h-416q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h416v416q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-416h416q40 0 68 -28t28 -68z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-1216q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h1216q40 0 68 -28t28 -68z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1482 486q46 -26 59.5 -77.5t-12.5 -97.5l-64 -110q-26 -46 -77.5 -59.5t-97.5 12.5l-266 153v-307q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v307l-266 -153q-46 -26 -97.5 -12.5t-77.5 59.5l-64 110q-26 46 -12.5 97.5t59.5 77.5l266 154l-266 154 q-46 26 -59.5 77.5t12.5 97.5l64 110q26 46 77.5 59.5t97.5 -12.5l266 -153v307q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-307l266 153q46 26 97.5 12.5t77.5 -59.5l64 -110q26 -46 12.5 -97.5t-59.5 -77.5l-266 -154z" /> +<glyph unicode="" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM896 161v190q0 14 -9 23.5t-22 9.5h-192q-13 0 -23 -10t-10 -23v-190q0 -13 10 -23t23 -10h192 q13 0 22 9.5t9 23.5zM894 505l18 621q0 12 -10 18q-10 8 -24 8h-220q-14 0 -24 -8q-10 -6 -10 -18l17 -621q0 -10 10 -17.5t24 -7.5h185q14 0 23.5 7.5t10.5 17.5z" /> +<glyph unicode="" d="M928 180v56v468v192h-320v-192v-468v-56q0 -25 18 -38.5t46 -13.5h192q28 0 46 13.5t18 38.5zM472 1024h195l-126 161q-26 31 -69 31q-40 0 -68 -28t-28 -68t28 -68t68 -28zM1160 1120q0 40 -28 68t-68 28q-43 0 -69 -31l-125 -161h194q40 0 68 28t28 68zM1536 864v-320 q0 -14 -9 -23t-23 -9h-96v-416q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v416h-96q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h440q-93 0 -158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5q107 0 168 -77l128 -165l128 165q61 77 168 77q93 0 158.5 -65.5t65.5 -158.5 t-65.5 -158.5t-158.5 -65.5h440q14 0 23 -9t9 -23z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1280 832q0 26 -19 45t-45 19q-172 0 -318 -49.5t-259.5 -134t-235.5 -219.5q-19 -21 -19 -45q0 -26 19 -45t45 -19q24 0 45 19q27 24 74 71t67 66q137 124 268.5 176t313.5 52q26 0 45 19t19 45zM1792 1030q0 -95 -20 -193q-46 -224 -184.5 -383t-357.5 -268 q-214 -108 -438 -108q-148 0 -286 47q-15 5 -88 42t-96 37q-16 0 -39.5 -32t-45 -70t-52.5 -70t-60 -32q-30 0 -51 11t-31 24t-27 42q-2 4 -6 11t-5.5 10t-3 9.5t-1.5 13.5q0 35 31 73.5t68 65.5t68 56t31 48q0 4 -14 38t-16 44q-9 51 -9 104q0 115 43.5 220t119 184.5 t170.5 139t204 95.5q55 18 145 25.5t179.5 9t178.5 6t163.5 24t113.5 56.5l29.5 29.5t29.5 28t27 20t36.5 16t43.5 4.5q39 0 70.5 -46t47.5 -112t24 -124t8 -96z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1408 -160v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1152 896q0 -78 -24.5 -144t-64 -112.5t-87.5 -88t-96 -77.5t-87.5 -72t-64 -81.5t-24.5 -96.5q0 -96 67 -224l-4 1l1 -1 q-90 41 -160 83t-138.5 100t-113.5 122.5t-72.5 150.5t-27.5 184q0 78 24.5 144t64 112.5t87.5 88t96 77.5t87.5 72t64 81.5t24.5 96.5q0 94 -66 224l3 -1l-1 1q90 -41 160 -83t138.5 -100t113.5 -122.5t72.5 -150.5t27.5 -184z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1664 576q-152 236 -381 353q61 -104 61 -225q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 121 61 225q-229 -117 -381 -353q133 -205 333.5 -326.5t434.5 -121.5t434.5 121.5t333.5 326.5zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5 t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1792 576q0 -34 -20 -69q-140 -230 -376.5 -368.5t-499.5 -138.5t-499.5 139t-376.5 368q-20 35 -20 69t20 69q140 229 376.5 368t499.5 139t499.5 -139t376.5 -368q20 -35 20 -69z" /> +<glyph unicode="" horiz-adv-x="1792" d="M555 201l78 141q-87 63 -136 159t-49 203q0 121 61 225q-229 -117 -381 -353q167 -258 427 -375zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1307 1151q0 -7 -1 -9 q-105 -188 -315 -566t-316 -567l-49 -89q-10 -16 -28 -16q-12 0 -134 70q-16 10 -16 28q0 12 44 87q-143 65 -263.5 173t-208.5 245q-20 31 -20 69t20 69q153 235 380 371t496 136q89 0 180 -17l54 97q10 16 28 16q5 0 18 -6t31 -15.5t33 -18.5t31.5 -18.5t19.5 -11.5 q16 -10 16 -27zM1344 704q0 -139 -79 -253.5t-209 -164.5l280 502q8 -45 8 -84zM1792 576q0 -35 -20 -69q-39 -64 -109 -145q-150 -172 -347.5 -267t-419.5 -95l74 132q212 18 392.5 137t301.5 307q-115 179 -282 294l63 112q95 -64 182.5 -153t144.5 -184q20 -34 20 -69z " /> +<glyph unicode="" horiz-adv-x="1792" d="M1024 161v190q0 14 -9.5 23.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -23.5v-190q0 -14 9.5 -23.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 23.5zM1022 535l18 459q0 12 -10 19q-13 11 -24 11h-220q-11 0 -24 -11q-10 -7 -10 -21l17 -457q0 -10 10 -16.5t24 -6.5h185 q14 0 23.5 6.5t10.5 16.5zM1008 1469l768 -1408q35 -63 -2 -126q-17 -29 -46.5 -46t-63.5 -17h-1536q-34 0 -63.5 17t-46.5 46q-37 63 -2 126l768 1408q17 31 47 49t65 18t65 -18t47 -49z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1376 1376q44 -52 12 -148t-108 -172l-161 -161l160 -696q5 -19 -12 -33l-128 -96q-7 -6 -19 -6q-4 0 -7 1q-15 3 -21 16l-279 508l-259 -259l53 -194q5 -17 -8 -31l-96 -96q-9 -9 -23 -9h-2q-15 2 -24 13l-189 252l-252 189q-11 7 -13 23q-1 13 9 25l96 97q9 9 23 9 q6 0 8 -1l194 -53l259 259l-508 279q-14 8 -17 24q-2 16 9 27l128 128q14 13 30 8l665 -159l160 160q76 76 172 108t148 -12z" /> +<glyph unicode="" horiz-adv-x="1664" d="M128 -128h288v288h-288v-288zM480 -128h320v288h-320v-288zM128 224h288v320h-288v-320zM480 224h320v320h-320v-320zM128 608h288v288h-288v-288zM864 -128h320v288h-320v-288zM480 608h320v288h-320v-288zM1248 -128h288v288h-288v-288zM864 224h320v320h-320v-320z M512 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1248 224h288v320h-288v-320zM864 608h320v288h-320v-288zM1248 608h288v288h-288v-288zM1280 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64 q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47 h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" /> +<glyph unicode="" horiz-adv-x="1792" d="M666 1055q-60 -92 -137 -273q-22 45 -37 72.5t-40.5 63.5t-51 56.5t-63 35t-81.5 14.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q250 0 410 -225zM1792 256q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192q-32 0 -85 -0.5t-81 -1t-73 1 t-71 5t-64 10.5t-63 18.5t-58 28.5t-59 40t-55 53.5t-56 69.5q59 93 136 273q22 -45 37 -72.5t40.5 -63.5t51 -56.5t63 -35t81.5 -14.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1792 1152q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5 v192h-256q-48 0 -87 -15t-69 -45t-51 -61.5t-45 -77.5q-32 -62 -78 -171q-29 -66 -49.5 -111t-54 -105t-64 -100t-74 -83t-90 -68.5t-106.5 -42t-128 -16.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q48 0 87 15t69 45t51 61.5t45 77.5q32 62 78 171q29 66 49.5 111 t54 105t64 100t74 83t90 68.5t106.5 42t128 16.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22q-17 -2 -30.5 9t-17.5 29v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281 q0 130 71 248.5t191 204.5t286 136.5t348 50.5q244 0 450 -85.5t326 -233t120 -321.5z" /> +<glyph unicode="" d="M1536 704v-128q0 -201 -98.5 -362t-274 -251.5t-395.5 -90.5t-395.5 90.5t-274 251.5t-98.5 362v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -52 23.5 -90t53.5 -57t71 -30t64 -13t44 -2t44 2t64 13t71 30t53.5 57t23.5 90v128q0 26 19 45t45 19h384 q26 0 45 -19t19 -45zM512 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45zM1536 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1683 205l-166 -165q-19 -19 -45 -19t-45 19l-531 531l-531 -531q-19 -19 -45 -19t-45 19l-166 165q-19 19 -19 45.5t19 45.5l742 741q19 19 45 19t45 -19l742 -741q19 -19 19 -45.5t-19 -45.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1683 728l-742 -741q-19 -19 -45 -19t-45 19l-742 741q-19 19 -19 45.5t19 45.5l166 165q19 19 45 19t45 -19l531 -531l531 531q19 19 45 19t45 -19l166 -165q19 -19 19 -45.5t-19 -45.5z" /> +<glyph unicode="" horiz-adv-x="1920" d="M1280 32q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-8 0 -13.5 2t-9 7t-5.5 8t-3 11.5t-1 11.5v13v11v160v416h-192q-26 0 -45 19t-19 45q0 24 15 41l320 384q19 22 49 22t49 -22l320 -384q15 -17 15 -41q0 -26 -19 -45t-45 -19h-192v-384h576q16 0 25 -11l160 -192q7 -11 7 -21 zM1920 448q0 -24 -15 -41l-320 -384q-20 -23 -49 -23t-49 23l-320 384q-15 17 -15 41q0 26 19 45t45 19h192v384h-576q-16 0 -25 12l-160 192q-7 9 -7 20q0 13 9.5 22.5t22.5 9.5h960q8 0 13.5 -2t9 -7t5.5 -8t3 -11.5t1 -11.5v-13v-11v-160v-416h192q26 0 45 -19t19 -45z " /> +<glyph unicode="" horiz-adv-x="1664" d="M640 0q0 -52 -38 -90t-90 -38t-90 38t-38 90t38 90t90 38t90 -38t38 -90zM1536 0q0 -52 -38 -90t-90 -38t-90 38t-38 90t38 90t90 38t90 -38t38 -90zM1664 1088v-512q0 -24 -16.5 -42.5t-40.5 -21.5l-1044 -122q13 -60 13 -70q0 -16 -24 -64h920q26 0 45 -19t19 -45 t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 11 8 31.5t16 36t21.5 40t15.5 29.5l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t19.5 -15.5t13 -24.5t8 -26t5.5 -29.5t4.5 -26h1201q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" /> +<glyph unicode="" horiz-adv-x="1920" d="M1879 584q0 -31 -31 -66l-336 -396q-43 -51 -120.5 -86.5t-143.5 -35.5h-1088q-34 0 -60.5 13t-26.5 43q0 31 31 66l336 396q43 51 120.5 86.5t143.5 35.5h1088q34 0 60.5 -13t26.5 -43zM1536 928v-160h-832q-94 0 -197 -47.5t-164 -119.5l-337 -396l-5 -6q0 4 -0.5 12.5 t-0.5 12.5v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158z" /> +<glyph unicode="" horiz-adv-x="768" d="M704 1216q0 -26 -19 -45t-45 -19h-128v-1024h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v1024h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-1024v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h1024v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" /> +<glyph unicode="" horiz-adv-x="2048" d="M640 640v-512h-256v512h256zM1024 1152v-1024h-256v1024h256zM2048 0v-128h-2048v1536h128v-1408h1920zM1408 896v-768h-256v768h256zM1792 1280v-1152h-256v1152h256z" /> +<glyph unicode="" d="M1280 926q-56 -25 -121 -34q68 40 93 117q-65 -38 -134 -51q-61 66 -153 66q-87 0 -148.5 -61.5t-61.5 -148.5q0 -29 5 -48q-129 7 -242 65t-192 155q-29 -50 -29 -106q0 -114 91 -175q-47 1 -100 26v-2q0 -75 50 -133.5t123 -72.5q-29 -8 -51 -8q-13 0 -39 4 q21 -63 74.5 -104t121.5 -42q-116 -90 -261 -90q-26 0 -50 3q148 -94 322 -94q112 0 210 35.5t168 95t120.5 137t75 162t24.5 168.5q0 18 -1 27q63 45 105 109zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5 t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-188v595h199l30 232h-229v148q0 56 23.5 84t91.5 28l122 1v207q-63 9 -178 9q-136 0 -217.5 -80t-81.5 -226v-171h-200v-232h200v-595h-532q-119 0 -203.5 84.5t-84.5 203.5v960 q0 119 84.5 203.5t203.5 84.5h960z" /> +<glyph unicode="" horiz-adv-x="1792" d="M928 704q0 14 -9 23t-23 9q-66 0 -113 -47t-47 -113q0 -14 9 -23t23 -9t23 9t9 23q0 40 28 68t68 28q14 0 23 9t9 23zM1152 574q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM128 0h1536v128h-1536v-128zM1280 574q0 159 -112.5 271.5 t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM256 1216h384v128h-384v-128zM128 1024h1536v118v138h-828l-64 -128h-644v-128zM1792 1280v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1536q-53 0 -90.5 37.5t-37.5 90.5v1280 q0 53 37.5 90.5t90.5 37.5h1536q53 0 90.5 -37.5t37.5 -90.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M832 1024q0 80 -56 136t-136 56t-136 -56t-56 -136q0 -42 19 -83q-41 19 -83 19q-80 0 -136 -56t-56 -136t56 -136t136 -56t136 56t56 136q0 42 -19 83q41 -19 83 -19q80 0 136 56t56 136zM1683 320q0 -17 -49 -66t-66 -49q-9 0 -28.5 16t-36.5 33t-38.5 40t-24.5 26 l-96 -96l220 -220q28 -28 28 -68q0 -42 -39 -81t-81 -39q-40 0 -68 28l-671 671q-176 -131 -365 -131q-163 0 -265.5 102.5t-102.5 265.5q0 160 95 313t248 248t313 95q163 0 265.5 -102.5t102.5 -265.5q0 -189 -131 -365l355 -355l96 96q-3 3 -26 24.5t-40 38.5t-33 36.5 t-16 28.5q0 17 49 66t66 49q13 0 23 -10q6 -6 46 -44.5t82 -79.5t86.5 -86t73 -78t28.5 -41z" /> +<glyph unicode="" horiz-adv-x="1920" d="M896 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1664 128q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1152q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1280 731v-185q0 -10 -7 -19.5t-16 -10.5l-155 -24q-11 -35 -32 -76q34 -48 90 -115q7 -10 7 -20q0 -12 -7 -19q-23 -30 -82.5 -89.5t-78.5 -59.5q-11 0 -21 7l-115 90q-37 -19 -77 -31q-11 -108 -23 -155q-7 -24 -30 -24h-186q-11 0 -20 7.5t-10 17.5 l-23 153q-34 10 -75 31l-118 -89q-7 -7 -20 -7q-11 0 -21 8q-144 133 -144 160q0 9 7 19q10 14 41 53t47 61q-23 44 -35 82l-152 24q-10 1 -17 9.5t-7 19.5v185q0 10 7 19.5t16 10.5l155 24q11 35 32 76q-34 48 -90 115q-7 11 -7 20q0 12 7 20q22 30 82 89t79 59q11 0 21 -7 l115 -90q34 18 77 32q11 108 23 154q7 24 30 24h186q11 0 20 -7.5t10 -17.5l23 -153q34 -10 75 -31l118 89q8 7 20 7q11 0 21 -8q144 -133 144 -160q0 -9 -7 -19q-12 -16 -42 -54t-45 -60q23 -48 34 -82l152 -23q10 -2 17 -10.5t7 -19.5zM1920 198v-140q0 -16 -149 -31 q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20 t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31zM1920 1222v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68 q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70 q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1408 768q0 -139 -94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224 q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257zM1792 512q0 -120 -71 -224.5t-195 -176.5q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7 q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230z" /> +<glyph unicode="" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 768q0 51 -39 89.5t-89 38.5h-352q0 58 48 159.5t48 160.5q0 98 -32 145t-128 47q-26 -26 -38 -85t-30.5 -125.5t-59.5 -109.5q-22 -23 -77 -91q-4 -5 -23 -30t-31.5 -41t-34.5 -42.5 t-40 -44t-38.5 -35.5t-40 -27t-35.5 -9h-32v-640h32q13 0 31.5 -3t33 -6.5t38 -11t35 -11.5t35.5 -12.5t29 -10.5q211 -73 342 -73h121q192 0 192 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5q32 1 53.5 47t21.5 81zM1536 769 q0 -89 -49 -163q9 -33 9 -69q0 -77 -38 -144q3 -21 3 -43q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5h-36h-93q-96 0 -189.5 22.5t-216.5 65.5q-116 40 -138 40h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h274q36 24 137 155q58 75 107 128 q24 25 35.5 85.5t30.5 126.5t62 108q39 37 90 37q84 0 151 -32.5t102 -101.5t35 -186q0 -93 -48 -192h176q104 0 180 -76t76 -179z" /> +<glyph unicode="" d="M256 1088q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 512q0 35 -21.5 81t-53.5 47q15 17 25 47.5t10 55.5q0 69 -53 119q18 32 18 69t-17.5 73.5t-47.5 52.5q5 30 5 56q0 85 -49 126t-136 41h-128q-131 0 -342 -73q-5 -2 -29 -10.5 t-35.5 -12.5t-35 -11.5t-38 -11t-33 -6.5t-31.5 -3h-32v-640h32q16 0 35.5 -9t40 -27t38.5 -35.5t40 -44t34.5 -42.5t31.5 -41t23 -30q55 -68 77 -91q41 -43 59.5 -109.5t30.5 -125.5t38 -85q96 0 128 47t32 145q0 59 -48 160.5t-48 159.5h352q50 0 89 38.5t39 89.5z M1536 511q0 -103 -76 -179t-180 -76h-176q48 -99 48 -192q0 -118 -35 -186q-35 -69 -102 -101.5t-151 -32.5q-51 0 -90 37q-34 33 -54 82t-25.5 90.5t-17.5 84.5t-31 64q-48 50 -107 127q-101 131 -137 155h-274q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5 h288q22 0 138 40q128 44 223 66t200 22h112q140 0 226.5 -79t85.5 -216v-5q60 -77 60 -178q0 -22 -3 -43q38 -67 38 -144q0 -36 -9 -69q49 -74 49 -163z" /> +<glyph unicode="" horiz-adv-x="896" d="M832 1504v-1339l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1664 940q0 81 -21.5 143t-55 98.5t-81.5 59.5t-94 31t-98 8t-112 -25.5t-110.5 -64t-86.5 -72t-60 -61.5q-18 -22 -49 -22t-49 22q-24 28 -60 61.5t-86.5 72t-110.5 64t-112 25.5t-98 -8t-94 -31t-81.5 -59.5t-55 -98.5t-21.5 -143q0 -168 187 -355l581 -560l580 559 q188 188 188 356zM1792 940q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5 q224 0 351 -124t127 -344z" /> +<glyph unicode="" horiz-adv-x="1664" d="M640 96q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h320q13 0 22.5 -9.5t9.5 -22.5q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-66 0 -113 -47t-47 -113v-704 q0 -66 47 -113t113 -47h288h11h13t11.5 -1t11.5 -3t8 -5.5t7 -9t2 -13.5zM1568 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45z" /> +<glyph unicode="" d="M237 122h231v694h-231v-694zM483 1030q-1 52 -36 86t-93 34t-94.5 -34t-36.5 -86q0 -51 35.5 -85.5t92.5 -34.5h1q59 0 95 34.5t36 85.5zM1068 122h231v398q0 154 -73 233t-193 79q-136 0 -209 -117h2v101h-231q3 -66 0 -694h231v388q0 38 7 56q15 35 45 59.5t74 24.5 q116 0 116 -157v-371zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" horiz-adv-x="1152" d="M480 672v448q0 14 -9 23t-23 9t-23 -9t-9 -23v-448q0 -14 9 -23t23 -9t23 9t9 23zM1152 320q0 -26 -19 -45t-45 -19h-429l-51 -483q-2 -12 -10.5 -20.5t-20.5 -8.5h-1q-27 0 -32 27l-76 485h-404q-26 0 -45 19t-19 45q0 123 78.5 221.5t177.5 98.5v512q-52 0 -90 38 t-38 90t38 90t90 38h640q52 0 90 -38t38 -90t-38 -90t-90 -38v-512q99 0 177.5 -98.5t78.5 -221.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1408 608v-320q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v320 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1792 1472v-512q0 -26 -19 -45t-45 -19t-45 19l-176 176l-652 -652q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l652 652l-176 176q-19 19 -19 45t19 45t45 19h512q26 0 45 -19t19 -45z" /> +<glyph unicode="" d="M1184 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45zM1536 992v-704q0 -119 -84.5 -203.5t-203.5 -84.5h-320q-13 0 -22.5 9.5t-9.5 22.5 q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q66 0 113 47t47 113v704q0 66 -47 113t-113 47h-288h-11h-13t-11.5 1t-11.5 3t-8 5.5t-7 9t-2 13.5q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" horiz-adv-x="1664" d="M458 653q-74 162 -74 371h-256v-96q0 -78 94.5 -162t235.5 -113zM1536 928v96h-256q0 -209 -74 -371q141 29 235.5 113t94.5 162zM1664 1056v-128q0 -71 -41.5 -143t-112 -130t-173 -97.5t-215.5 -44.5q-42 -54 -95 -95q-38 -34 -52.5 -72.5t-14.5 -89.5q0 -54 30.5 -91 t97.5 -37q75 0 133.5 -45.5t58.5 -114.5v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 69 58.5 114.5t133.5 45.5q67 0 97.5 37t30.5 91q0 51 -14.5 89.5t-52.5 72.5q-53 41 -95 95q-113 5 -215.5 44.5t-173 97.5t-112 130t-41.5 143v128q0 40 28 68t68 28h288v96 q0 66 47 113t113 47h576q66 0 113 -47t47 -113v-96h288q40 0 68 -28t28 -68z" /> +<glyph unicode="" d="M394 184q-8 -9 -20 3q-13 11 -4 19q8 9 20 -3q12 -11 4 -19zM352 245q9 -12 0 -19q-8 -6 -17 7t0 18q9 7 17 -6zM291 305q-5 -7 -13 -2q-10 5 -7 12q3 5 13 2q10 -5 7 -12zM322 271q-6 -7 -16 3q-9 11 -2 16q6 6 16 -3q9 -11 2 -16zM451 159q-4 -12 -19 -6q-17 4 -13 15 t19 7q16 -5 13 -16zM514 154q0 -11 -16 -11q-17 -2 -17 11q0 11 16 11q17 2 17 -11zM572 164q2 -10 -14 -14t-18 8t14 15q16 2 18 -9zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-224q-16 0 -24.5 1t-19.5 5t-16 14.5t-5 27.5v239q0 97 -52 142q57 6 102.5 18t94 39 t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103 q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -103t0.5 -68q0 -22 -11 -33.5t-22 -13t-33 -1.5 h-224q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1280 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 288v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h427q21 -56 70.5 -92 t110.5 -36h256q61 0 110.5 36t70.5 92h427q40 0 68 -28t28 -68zM1339 936q-17 -40 -59 -40h-256v-448q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v448h-256q-42 0 -59 40q-17 39 14 69l448 448q18 19 45 19t45 -19l448 -448q31 -30 14 -69z" /> +<glyph unicode="" d="M1407 710q0 44 -7 113.5t-18 96.5q-12 30 -17 44t-9 36.5t-4 48.5q0 23 5 68.5t5 67.5q0 37 -10 55q-4 1 -13 1q-19 0 -58 -4.5t-59 -4.5q-60 0 -176 24t-175 24q-43 0 -94.5 -11.5t-85 -23.5t-89.5 -34q-137 -54 -202 -103q-96 -73 -159.5 -189.5t-88 -236t-24.5 -248.5 q0 -40 12.5 -120t12.5 -121q0 -23 -11 -66.5t-11 -65.5t12 -36.5t34 -14.5q24 0 72.5 11t73.5 11q57 0 169.5 -15.5t169.5 -15.5q181 0 284 36q129 45 235.5 152.5t166 245.5t59.5 275zM1535 712q0 -165 -70 -327.5t-196 -288t-281 -180.5q-124 -44 -326 -44 q-57 0 -170 14.5t-169 14.5q-24 0 -72.5 -14.5t-73.5 -14.5q-73 0 -123.5 55.5t-50.5 128.5q0 24 11 68t11 67q0 40 -12.5 120.5t-12.5 121.5q0 111 18 217.5t54.5 209.5t100.5 194t150 156q78 59 232 120q194 78 316 78q60 0 175.5 -24t173.5 -24q19 0 57 5t58 5 q81 0 118 -50.5t37 -134.5q0 -23 -5 -68t-5 -68q0 -10 1 -18.5t3 -17t4 -13.5t6.5 -16t6.5 -17q16 -40 25 -118.5t9 -136.5z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1408 296q0 -27 -10 -70.5t-21 -68.5q-21 -50 -122 -106q-94 -51 -186 -51q-27 0 -52.5 3.5t-57.5 12.5t-47.5 14.5t-55.5 20.5t-49 18q-98 35 -175 83q-128 79 -264.5 215.5t-215.5 264.5q-48 77 -83 175q-3 9 -18 49t-20.5 55.5t-14.5 47.5t-12.5 57.5t-3.5 52.5 q0 92 51 186q56 101 106 122q25 11 68.5 21t70.5 10q14 0 21 -3q18 -6 53 -76q11 -19 30 -54t35 -63.5t31 -53.5q3 -4 17.5 -25t21.5 -35.5t7 -28.5q0 -20 -28.5 -50t-62 -55t-62 -53t-28.5 -46q0 -9 5 -22.5t8.5 -20.5t14 -24t11.5 -19q76 -137 174 -235t235 -174 q2 -1 19 -11.5t24 -14t20.5 -8.5t22.5 -5q18 0 46 28.5t53 62t55 62t50 28.5q14 0 28.5 -7t35.5 -21.5t25 -17.5q25 -15 53.5 -31t63.5 -35t54 -30q70 -35 76 -53q3 -7 3 -21z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1120 1280h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" horiz-adv-x="1280" d="M1152 1280h-1024v-1242l423 406l89 85l89 -85l423 -406v1242zM1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289 q0 34 19.5 62t52.5 41q21 9 44 9h1048z" /> +<glyph unicode="" d="M1280 343q0 11 -2 16q-3 8 -38.5 29.5t-88.5 49.5l-53 29q-5 3 -19 13t-25 15t-21 5q-18 0 -47 -32.5t-57 -65.5t-44 -33q-7 0 -16.5 3.5t-15.5 6.5t-17 9.5t-14 8.5q-99 55 -170.5 126.5t-126.5 170.5q-2 3 -8.5 14t-9.5 17t-6.5 15.5t-3.5 16.5q0 13 20.5 33.5t45 38.5 t45 39.5t20.5 36.5q0 10 -5 21t-15 25t-13 19q-3 6 -15 28.5t-25 45.5t-26.5 47.5t-25 40.5t-16.5 18t-16 2q-48 0 -101 -22q-46 -21 -80 -94.5t-34 -130.5q0 -16 2.5 -34t5 -30.5t9 -33t10 -29.5t12.5 -33t11 -30q60 -164 216.5 -320.5t320.5 -216.5q6 -2 30 -11t33 -12.5 t29.5 -10t33 -9t30.5 -5t34 -2.5q57 0 130.5 34t94.5 80q22 53 22 101zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1620 1128q-67 -98 -162 -167q1 -14 1 -42q0 -130 -38 -259.5t-115.5 -248.5t-184.5 -210.5t-258 -146t-323 -54.5q-271 0 -496 145q35 -4 78 -4q225 0 401 138q-105 2 -188 64.5t-114 159.5q33 -5 61 -5q43 0 85 11q-112 23 -185.5 111.5t-73.5 205.5v4q68 -38 146 -41 q-66 44 -105 115t-39 154q0 88 44 163q121 -149 294.5 -238.5t371.5 -99.5q-8 38 -8 74q0 134 94.5 228.5t228.5 94.5q140 0 236 -102q109 21 205 78q-37 -115 -142 -178q93 10 186 50z" /> +<glyph unicode="" horiz-adv-x="1024" d="M959 1524v-264h-157q-86 0 -116 -36t-30 -108v-189h293l-39 -296h-254v-759h-306v759h-255v296h255v218q0 186 104 288.5t277 102.5q147 0 228 -12z" /> +<glyph unicode="" d="M1536 640q0 -251 -146.5 -451.5t-378.5 -277.5q-27 -5 -39.5 7t-12.5 30v211q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5 q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23 q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -89t0.5 -54q0 -18 -13 -30t-40 -7q-232 77 -378.5 277.5t-146.5 451.5q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1664 960v-256q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-192h96q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h672v192q0 185 131.5 316.5t316.5 131.5 t316.5 -131.5t131.5 -316.5z" /> +<glyph unicode="" horiz-adv-x="1920" d="M1760 1408q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600zM160 1280q-13 0 -22.5 -9.5t-9.5 -22.5v-224h1664v224q0 13 -9.5 22.5t-22.5 9.5h-1600zM1760 0q13 0 22.5 9.5t9.5 22.5v608h-1664v-608 q0 -13 9.5 -22.5t22.5 -9.5h1600zM256 128v128h256v-128h-256zM640 128v128h384v-128h-384z" /> +<glyph unicode="" horiz-adv-x="1408" d="M384 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 69q2 -28 -17 -48q-18 -21 -47 -21h-135q-25 0 -43 16.5t-20 41.5q-22 229 -184.5 391.5t-391.5 184.5q-25 2 -41.5 20t-16.5 43v135q0 29 21 47q17 17 43 17h5q160 -13 306 -80.5 t259 -181.5q114 -113 181.5 -259t80.5 -306zM1408 67q2 -27 -18 -47q-18 -20 -46 -20h-143q-26 0 -44.5 17.5t-19.5 42.5q-12 215 -101 408.5t-231.5 336t-336 231.5t-408.5 102q-25 1 -42.5 19.5t-17.5 43.5v143q0 28 20 46q18 18 44 18h3q262 -13 501.5 -120t425.5 -294 q187 -186 294 -425.5t120 -501.5z" /> +<glyph unicode="" d="M1040 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1296 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1408 160v320q0 13 -9.5 22.5t-22.5 9.5 h-1216q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5zM178 640h1180l-157 482q-4 13 -16 21.5t-26 8.5h-782q-14 0 -26 -8.5t-16 -21.5zM1536 480v-320q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v320q0 25 16 75 l197 606q17 53 63 86t101 33h782q55 0 101 -33t63 -86l197 -606q16 -50 16 -75z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1664 896q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-384q0 -52 -38 -90t-90 -38q-417 347 -812 380q-58 -19 -91 -66t-31 -100.5t40 -92.5q-20 -33 -23 -65.5t6 -58t33.5 -55t48 -50t61.5 -50.5q-29 -58 -111.5 -83t-168.5 -11.5t-132 55.5q-7 23 -29.5 87.5 t-32 94.5t-23 89t-15 101t3.5 98.5t22 110.5h-122q-66 0 -113 47t-47 113v192q0 66 47 113t113 47h480q435 0 896 384q52 0 90 -38t38 -90v-384zM1536 292v954q-394 -302 -768 -343v-270q377 -42 768 -341z" /> +<glyph unicode="" horiz-adv-x="1792" d="M912 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM246 128h1300q-266 300 -266 832q0 51 -24 105t-69 103t-121.5 80.5t-169.5 31.5t-169.5 -31.5t-121.5 -80.5t-69 -103t-24 -105q0 -532 -266 -832z M1728 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q190 -28 307 -158.5 t117 -282.5q0 -139 19.5 -260t50 -206t74.5 -158.5t85 -119.5t91 -88z" /> +<glyph unicode="" d="M1376 640l138 -135q30 -28 20 -70q-12 -41 -52 -51l-188 -48l53 -186q12 -41 -19 -70q-29 -31 -70 -19l-186 53l-48 -188q-10 -40 -51 -52q-12 -2 -19 -2q-31 0 -51 22l-135 138l-135 -138q-28 -30 -70 -20q-41 11 -51 52l-48 188l-186 -53q-41 -12 -70 19q-31 29 -19 70 l53 186l-188 48q-40 10 -52 51q-10 42 20 70l138 135l-138 135q-30 28 -20 70q12 41 52 51l188 48l-53 186q-12 41 19 70q29 31 70 19l186 -53l48 188q10 41 51 51q41 12 70 -19l135 -139l135 139q29 30 70 19q41 -10 51 -51l48 -188l186 53q41 12 70 -19q31 -29 19 -70 l-53 -186l188 -48q40 -10 52 -51q10 -42 -20 -70z" /> +<glyph unicode="" horiz-adv-x="1792" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 768q0 51 -39 89.5t-89 38.5h-576q0 20 15 48.5t33 55t33 68t15 84.5q0 67 -44.5 97.5t-115.5 30.5q-24 0 -90 -139q-24 -44 -37 -65q-40 -64 -112 -145q-71 -81 -101 -106 q-69 -57 -140 -57h-32v-640h32q72 0 167 -32t193.5 -64t179.5 -32q189 0 189 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5h331q52 0 90 38t38 90zM1792 769q0 -105 -75.5 -181t-180.5 -76h-169q-4 -62 -37 -119q3 -21 3 -43 q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5q-133 0 -322 69q-164 59 -223 59h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h288q10 0 21.5 4.5t23.5 14t22.5 18t24 22.5t20.5 21.5t19 21.5t14 17q65 74 100 129q13 21 33 62t37 72t40.5 63t55 49.5 t69.5 17.5q125 0 206.5 -67t81.5 -189q0 -68 -22 -128h374q104 0 180 -76t76 -179z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1376 128h32v640h-32q-35 0 -67.5 12t-62.5 37t-50 46t-49 54q-2 3 -3.5 4.5t-4 4.5t-4.5 5q-72 81 -112 145q-14 22 -38 68q-1 3 -10.5 22.5t-18.5 36t-20 35.5t-21.5 30.5t-18.5 11.5q-71 0 -115.5 -30.5t-44.5 -97.5q0 -43 15 -84.5t33 -68t33 -55t15 -48.5h-576 q-50 0 -89 -38.5t-39 -89.5q0 -52 38 -90t90 -38h331q-15 -17 -25 -47.5t-10 -55.5q0 -69 53 -119q-18 -32 -18 -69t17.5 -73.5t47.5 -52.5q-4 -24 -4 -56q0 -85 48.5 -126t135.5 -41q84 0 183 32t194 64t167 32zM1664 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45 t45 -19t45 19t19 45zM1792 768v-640q0 -53 -37.5 -90.5t-90.5 -37.5h-288q-59 0 -223 -59q-190 -69 -317 -69q-142 0 -230 77.5t-87 217.5l1 5q-61 76 -61 178q0 22 3 43q-33 57 -37 119h-169q-105 0 -180.5 76t-75.5 181q0 103 76 179t180 76h374q-22 60 -22 128 q0 122 81.5 189t206.5 67q38 0 69.5 -17.5t55 -49.5t40.5 -63t37 -72t33 -62q35 -55 100 -129q2 -3 14 -17t19 -21.5t20.5 -21.5t24 -22.5t22.5 -18t23.5 -14t21.5 -4.5h288q53 0 90.5 -37.5t37.5 -90.5z" /> +<glyph unicode="" d="M1280 -64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 700q0 189 -167 189q-26 0 -56 -5q-16 30 -52.5 47.5t-73.5 17.5t-69 -18q-50 53 -119 53q-25 0 -55.5 -10t-47.5 -25v331q0 52 -38 90t-90 38q-51 0 -89.5 -39t-38.5 -89v-576 q-20 0 -48.5 15t-55 33t-68 33t-84.5 15q-67 0 -97.5 -44.5t-30.5 -115.5q0 -24 139 -90q44 -24 65 -37q64 -40 145 -112q81 -71 106 -101q57 -69 57 -140v-32h640v32q0 72 32 167t64 193.5t32 179.5zM1536 705q0 -133 -69 -322q-59 -164 -59 -223v-288q0 -53 -37.5 -90.5 t-90.5 -37.5h-640q-53 0 -90.5 37.5t-37.5 90.5v288q0 10 -4.5 21.5t-14 23.5t-18 22.5t-22.5 24t-21.5 20.5t-21.5 19t-17 14q-74 65 -129 100q-21 13 -62 33t-72 37t-63 40.5t-49.5 55t-17.5 69.5q0 125 67 206.5t189 81.5q68 0 128 -22v374q0 104 76 180t179 76 q105 0 181 -75.5t76 -180.5v-169q62 -4 119 -37q21 3 43 3q101 0 178 -60q139 1 219.5 -85t80.5 -227z" /> +<glyph unicode="" d="M1408 576q0 84 -32 183t-64 194t-32 167v32h-640v-32q0 -35 -12 -67.5t-37 -62.5t-46 -50t-54 -49q-9 -8 -14 -12q-81 -72 -145 -112q-22 -14 -68 -38q-3 -1 -22.5 -10.5t-36 -18.5t-35.5 -20t-30.5 -21.5t-11.5 -18.5q0 -71 30.5 -115.5t97.5 -44.5q43 0 84.5 15t68 33 t55 33t48.5 15v-576q0 -50 38.5 -89t89.5 -39q52 0 90 38t38 90v331q46 -35 103 -35q69 0 119 53q32 -18 69 -18t73.5 17.5t52.5 47.5q24 -4 56 -4q85 0 126 48.5t41 135.5zM1280 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 580 q0 -142 -77.5 -230t-217.5 -87l-5 1q-76 -61 -178 -61q-22 0 -43 3q-54 -30 -119 -37v-169q0 -105 -76 -180.5t-181 -75.5q-103 0 -179 76t-76 180v374q-54 -22 -128 -22q-121 0 -188.5 81.5t-67.5 206.5q0 38 17.5 69.5t49.5 55t63 40.5t72 37t62 33q55 35 129 100 q3 2 17 14t21.5 19t21.5 20.5t22.5 24t18 22.5t14 23.5t4.5 21.5v288q0 53 37.5 90.5t90.5 37.5h640q53 0 90.5 -37.5t37.5 -90.5v-288q0 -59 59 -223q69 -190 69 -317z" /> +<glyph unicode="" d="M1280 576v128q0 26 -19 45t-45 19h-502l189 189q19 19 19 45t-19 45l-91 91q-18 18 -45 18t-45 -18l-362 -362l-91 -91q-18 -18 -18 -45t18 -45l91 -91l362 -362q18 -18 45 -18t45 18l91 91q18 18 18 45t-18 45l-189 189h502q26 0 45 19t19 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1285 640q0 27 -18 45l-91 91l-362 362q-18 18 -45 18t-45 -18l-91 -91q-18 -18 -18 -45t18 -45l189 -189h-502q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h502l-189 -189q-19 -19 -19 -45t19 -45l91 -91q18 -18 45 -18t45 18l362 362l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1284 641q0 27 -18 45l-362 362l-91 91q-18 18 -45 18t-45 -18l-91 -91l-362 -362q-18 -18 -18 -45t18 -45l91 -91q18 -18 45 -18t45 18l189 189v-502q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v502l189 -189q19 -19 45 -19t45 19l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1284 639q0 27 -18 45l-91 91q-18 18 -45 18t-45 -18l-189 -189v502q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-502l-189 189q-19 19 -45 19t-45 -19l-91 -91q-18 -18 -18 -45t18 -45l362 -362l91 -91q18 -18 45 -18t45 18l91 91l362 362q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1042 887q-2 -1 -9.5 -9.5t-13.5 -9.5q2 0 4.5 5t5 11t3.5 7q6 7 22 15q14 6 52 12q34 8 51 -11 q-2 2 9.5 13t14.5 12q3 2 15 4.5t15 7.5l2 22q-12 -1 -17.5 7t-6.5 21q0 -2 -6 -8q0 7 -4.5 8t-11.5 -1t-9 -1q-10 3 -15 7.5t-8 16.5t-4 15q-2 5 -9.5 10.5t-9.5 10.5q-1 2 -2.5 5.5t-3 6.5t-4 5.5t-5.5 2.5t-7 -5t-7.5 -10t-4.5 -5q-3 2 -6 1.5t-4.5 -1t-4.5 -3t-5 -3.5 q-3 -2 -8.5 -3t-8.5 -2q15 5 -1 11q-10 4 -16 3q9 4 7.5 12t-8.5 14h5q-1 4 -8.5 8.5t-17.5 8.5t-13 6q-8 5 -34 9.5t-33 0.5q-5 -6 -4.5 -10.5t4 -14t3.5 -12.5q1 -6 -5.5 -13t-6.5 -12q0 -7 14 -15.5t10 -21.5q-3 -8 -16 -16t-16 -12q-5 -8 -1.5 -18.5t10.5 -16.5 q2 -2 1.5 -4t-3.5 -4.5t-5.5 -4t-6.5 -3.5l-3 -2q-11 -5 -20.5 6t-13.5 26q-7 25 -16 30q-23 8 -29 -1q-5 13 -41 26q-25 9 -58 4q6 1 0 15q-7 15 -19 12q3 6 4 17.5t1 13.5q3 13 12 23q1 1 7 8.5t9.5 13.5t0.5 6q35 -4 50 11q5 5 11.5 17t10.5 17q9 6 14 5.5t14.5 -5.5 t14.5 -5q14 -1 15.5 11t-7.5 20q12 -1 3 17q-5 7 -8 9q-12 4 -27 -5q-8 -4 2 -8q-1 1 -9.5 -10.5t-16.5 -17.5t-16 5q-1 1 -5.5 13.5t-9.5 13.5q-8 0 -16 -15q3 8 -11 15t-24 8q19 12 -8 27q-7 4 -20.5 5t-19.5 -4q-5 -7 -5.5 -11.5t5 -8t10.5 -5.5t11.5 -4t8.5 -3 q14 -10 8 -14q-2 -1 -8.5 -3.5t-11.5 -4.5t-6 -4q-3 -4 0 -14t-2 -14q-5 5 -9 17.5t-7 16.5q7 -9 -25 -6l-10 1q-4 0 -16 -2t-20.5 -1t-13.5 8q-4 8 0 20q1 4 4 2q-4 3 -11 9.5t-10 8.5q-46 -15 -94 -41q6 -1 12 1q5 2 13 6.5t10 5.5q34 14 42 7l5 5q14 -16 20 -25 q-7 4 -30 1q-20 -6 -22 -12q7 -12 5 -18q-4 3 -11.5 10t-14.5 11t-15 5q-16 0 -22 -1q-146 -80 -235 -222q7 -7 12 -8q4 -1 5 -9t2.5 -11t11.5 3q9 -8 3 -19q1 1 44 -27q19 -17 21 -21q3 -11 -10 -18q-1 2 -9 9t-9 4q-3 -5 0.5 -18.5t10.5 -12.5q-7 0 -9.5 -16t-2.5 -35.5 t-1 -23.5l2 -1q-3 -12 5.5 -34.5t21.5 -19.5q-13 -3 20 -43q6 -8 8 -9q3 -2 12 -7.5t15 -10t10 -10.5q4 -5 10 -22.5t14 -23.5q-2 -6 9.5 -20t10.5 -23q-1 0 -2.5 -1t-2.5 -1q3 -7 15.5 -14t15.5 -13q1 -3 2 -10t3 -11t8 -2q2 20 -24 62q-15 25 -17 29q-3 5 -5.5 15.5 t-4.5 14.5q2 0 6 -1.5t8.5 -3.5t7.5 -4t2 -3q-3 -7 2 -17.5t12 -18.5t17 -19t12 -13q6 -6 14 -19.5t0 -13.5q9 0 20 -10t17 -20q5 -8 8 -26t5 -24q2 -7 8.5 -13.5t12.5 -9.5l16 -8t13 -7q5 -2 18.5 -10.5t21.5 -11.5q10 -4 16 -4t14.5 2.5t13.5 3.5q15 2 29 -15t21 -21 q36 -19 55 -11q-2 -1 0.5 -7.5t8 -15.5t9 -14.5t5.5 -8.5q5 -6 18 -15t18 -15q6 4 7 9q-3 -8 7 -20t18 -10q14 3 14 32q-31 -15 -49 18q0 1 -2.5 5.5t-4 8.5t-2.5 8.5t0 7.5t5 3q9 0 10 3.5t-2 12.5t-4 13q-1 8 -11 20t-12 15q-5 -9 -16 -8t-16 9q0 -1 -1.5 -5.5t-1.5 -6.5 q-13 0 -15 1q1 3 2.5 17.5t3.5 22.5q1 4 5.5 12t7.5 14.5t4 12.5t-4.5 9.5t-17.5 2.5q-19 -1 -26 -20q-1 -3 -3 -10.5t-5 -11.5t-9 -7q-7 -3 -24 -2t-24 5q-13 8 -22.5 29t-9.5 37q0 10 2.5 26.5t3 25t-5.5 24.5q3 2 9 9.5t10 10.5q2 1 4.5 1.5t4.5 0t4 1.5t3 6q-1 1 -4 3 q-3 3 -4 3q7 -3 28.5 1.5t27.5 -1.5q15 -11 22 2q0 1 -2.5 9.5t-0.5 13.5q5 -27 29 -9q3 -3 15.5 -5t17.5 -5q3 -2 7 -5.5t5.5 -4.5t5 0.5t8.5 6.5q10 -14 12 -24q11 -40 19 -44q7 -3 11 -2t4.5 9.5t0 14t-1.5 12.5l-1 8v18l-1 8q-15 3 -18.5 12t1.5 18.5t15 18.5q1 1 8 3.5 t15.5 6.5t12.5 8q21 19 15 35q7 0 11 9q-1 0 -5 3t-7.5 5t-4.5 2q9 5 2 16q5 3 7.5 11t7.5 10q9 -12 21 -2q7 8 1 16q5 7 20.5 10.5t18.5 9.5q7 -2 8 2t1 12t3 12q4 5 15 9t13 5l17 11q3 4 0 4q18 -2 31 11q10 11 -6 20q3 6 -3 9.5t-15 5.5q3 1 11.5 0.5t10.5 1.5 q15 10 -7 16q-17 5 -43 -12zM879 10q206 36 351 189q-3 3 -12.5 4.5t-12.5 3.5q-18 7 -24 8q1 7 -2.5 13t-8 9t-12.5 8t-11 7q-2 2 -7 6t-7 5.5t-7.5 4.5t-8.5 2t-10 -1l-3 -1q-3 -1 -5.5 -2.5t-5.5 -3t-4 -3t0 -2.5q-21 17 -36 22q-5 1 -11 5.5t-10.5 7t-10 1.5t-11.5 -7 q-5 -5 -6 -15t-2 -13q-7 5 0 17.5t2 18.5q-3 6 -10.5 4.5t-12 -4.5t-11.5 -8.5t-9 -6.5t-8.5 -5.5t-8.5 -7.5q-3 -4 -6 -12t-5 -11q-2 4 -11.5 6.5t-9.5 5.5q2 -10 4 -35t5 -38q7 -31 -12 -48q-27 -25 -29 -40q-4 -22 12 -26q0 -7 -8 -20.5t-7 -21.5q0 -6 2 -16z" /> +<glyph unicode="" horiz-adv-x="1664" d="M384 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1028 484l-682 -682q-37 -37 -90 -37q-52 0 -91 37l-106 108q-38 36 -38 90q0 53 38 91l681 681q39 -98 114.5 -173.5t173.5 -114.5zM1662 919q0 -39 -23 -106q-47 -134 -164.5 -217.5 t-258.5 -83.5q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q58 0 121.5 -16.5t107.5 -46.5q16 -11 16 -28t-16 -28l-293 -169v-224l193 -107q5 3 79 48.5t135.5 81t70.5 35.5q15 0 23.5 -10t8.5 -25z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1024 128h640v128h-640v-128zM640 640h1024v128h-1024v-128zM1280 1152h384v128h-384v-128zM1792 320v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 832v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19 t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1403 1241q17 -41 -14 -70l-493 -493v-742q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-256 256q-19 19 -19 45v486l-493 493q-31 29 -14 70q17 39 59 39h1280q42 0 59 -39z" /> +<glyph unicode="" horiz-adv-x="1792" d="M640 1280h512v128h-512v-128zM1792 640v-480q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v480h672v-160q0 -26 19 -45t45 -19h320q26 0 45 19t19 45v160h672zM1024 640v-128h-256v128h256zM1792 1120v-384h-1792v384q0 66 47 113t113 47h352v160q0 40 28 68 t68 28h576q40 0 68 -28t28 -68v-160h352q66 0 113 -47t47 -113z" /> +<glyph unicode="" d="M1283 995l-355 -355l355 -355l144 144q29 31 70 14q39 -17 39 -59v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l144 144l-355 355l-355 -355l144 -144q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l144 -144 l355 355l-355 355l-144 -144q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v448q0 26 19 45t45 19h448q42 0 59 -40q17 -39 -14 -69l-144 -144l355 -355l355 355l-144 144q-31 30 -14 69q17 40 59 40h448q26 0 45 -19t19 -45v-448q0 -42 -39 -59q-13 -5 -25 -5q-26 0 -45 19z " /> +<glyph unicode="" horiz-adv-x="1920" d="M593 640q-162 -5 -265 -128h-134q-82 0 -138 40.5t-56 118.5q0 353 124 353q6 0 43.5 -21t97.5 -42.5t119 -21.5q67 0 133 23q-5 -37 -5 -66q0 -139 81 -256zM1664 3q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5 t43 97.5t62 81t85.5 53.5t111.5 20q10 0 43 -21.5t73 -48t107 -48t135 -21.5t135 21.5t107 48t73 48t43 21.5q61 0 111.5 -20t85.5 -53.5t62 -81t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM640 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75 t75 -181zM1344 896q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5zM1920 671q0 -78 -56 -118.5t-138 -40.5h-134q-103 123 -265 128q81 117 81 256q0 29 -5 66q66 -23 133 -23q59 0 119 21.5t97.5 42.5 t43.5 21q124 0 124 -353zM1792 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1456 320q0 40 -28 68l-208 208q-28 28 -68 28q-42 0 -72 -32q3 -3 19 -18.5t21.5 -21.5t15 -19t13 -25.5t3.5 -27.5q0 -40 -28 -68t-68 -28q-15 0 -27.5 3.5t-25.5 13t-19 15t-21.5 21.5t-18.5 19q-33 -31 -33 -73q0 -40 28 -68l206 -207q27 -27 68 -27q40 0 68 26 l147 146q28 28 28 67zM753 1025q0 40 -28 68l-206 207q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l208 -208q27 -27 68 -27q42 0 72 31q-3 3 -19 18.5t-21.5 21.5t-15 19t-13 25.5t-3.5 27.5q0 40 28 68t68 28q15 0 27.5 -3.5t25.5 -13t19 -15 t21.5 -21.5t18.5 -19q33 31 33 73zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-206 207q-83 83 -83 203q0 123 88 209l-88 88q-86 -88 -208 -88q-120 0 -204 84l-208 208q-84 84 -84 204t85 203l147 146q83 83 203 83q121 0 204 -85l206 -207 q83 -83 83 -203q0 -123 -88 -209l88 -88q86 88 208 88q120 0 204 -84l208 -208q84 -84 84 -204z" /> +<glyph unicode="" horiz-adv-x="1920" d="M1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5q0 132 71 241.5t187 163.5q-2 28 -2 43q0 212 150 362t362 150q158 0 286.5 -88t187.5 -230q70 62 166 62q106 0 181 -75t75 -181q0 -75 -41 -138q129 -30 213 -134.5t84 -239.5z " /> +<glyph unicode="" horiz-adv-x="1664" d="M1527 88q56 -89 21.5 -152.5t-140.5 -63.5h-1152q-106 0 -140.5 63.5t21.5 152.5l503 793v399h-64q-26 0 -45 19t-19 45t19 45t45 19h512q26 0 45 -19t19 -45t-19 -45t-45 -19h-64v-399zM748 813l-272 -429h712l-272 429l-20 31v37v399h-128v-399v-37z" /> +<glyph unicode="" horiz-adv-x="1792" d="M960 640q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1260 576l507 -398q28 -20 25 -56q-5 -35 -35 -51l-128 -64q-13 -7 -29 -7q-17 0 -31 8l-690 387l-110 -66q-8 -4 -12 -5q14 -49 10 -97q-7 -77 -56 -147.5t-132 -123.5q-132 -84 -277 -84 q-136 0 -222 78q-90 84 -79 207q7 76 56 147t131 124q132 84 278 84q83 0 151 -31q9 13 22 22l122 73l-122 73q-13 9 -22 22q-68 -31 -151 -31q-146 0 -278 84q-82 53 -131 124t-56 147q-5 59 15.5 113t63.5 93q85 79 222 79q145 0 277 -84q83 -52 132 -123t56 -148 q4 -48 -10 -97q4 -1 12 -5l110 -66l690 387q14 8 31 8q16 0 29 -7l128 -64q30 -16 35 -51q3 -36 -25 -56zM579 836q46 42 21 108t-106 117q-92 59 -192 59q-74 0 -113 -36q-46 -42 -21 -108t106 -117q92 -59 192 -59q74 0 113 36zM494 91q81 51 106 117t-21 108 q-39 36 -113 36q-100 0 -192 -59q-81 -51 -106 -117t21 -108q39 -36 113 -36q100 0 192 59zM672 704l96 -58v11q0 36 33 56l14 8l-79 47l-26 -26q-3 -3 -10 -11t-12 -12q-2 -2 -4 -3.5t-3 -2.5zM896 480l96 -32l736 576l-128 64l-768 -431v-113l-160 -96l9 -8q2 -2 7 -6 q4 -4 11 -12t11 -12l26 -26zM1600 64l128 64l-520 408l-177 -138q-2 -3 -13 -7z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1696 1152q40 0 68 -28t28 -68v-1216q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v288h-544q-40 0 -68 28t-28 68v672q0 40 20 88t48 76l408 408q28 28 76 48t88 20h416q40 0 68 -28t28 -68v-328q68 40 128 40h416zM1152 939l-299 -299h299v299zM512 1323l-299 -299 h299v299zM708 676l316 316v416h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h512v256q0 40 20 88t48 76zM1664 -128v1152h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h896z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1404 151q0 -117 -79 -196t-196 -79q-135 0 -235 100l-777 776q-113 115 -113 271q0 159 110 270t269 111q158 0 273 -113l605 -606q10 -10 10 -22q0 -16 -30.5 -46.5t-46.5 -30.5q-13 0 -23 10l-606 607q-79 77 -181 77q-106 0 -179 -75t-73 -181q0 -105 76 -181 l776 -777q63 -63 145 -63q64 0 106 42t42 106q0 82 -63 145l-581 581q-26 24 -60 24q-29 0 -48 -19t-19 -48q0 -32 25 -59l410 -410q10 -10 10 -22q0 -16 -31 -47t-47 -31q-12 0 -22 10l-410 410q-63 61 -63 149q0 82 57 139t139 57q88 0 149 -63l581 -581q100 -98 100 -235 z" /> +<glyph unicode="" d="M384 0h768v384h-768v-384zM1280 0h128v896q0 14 -10 38.5t-20 34.5l-281 281q-10 10 -34 20t-39 10v-416q0 -40 -28 -68t-68 -28h-576q-40 0 -68 28t-28 68v416h-128v-1280h128v416q0 40 28 68t68 28h832q40 0 68 -28t28 -68v-416zM896 928v320q0 13 -9.5 22.5t-22.5 9.5 h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5zM1536 896v-928q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h928q40 0 88 -20t76 -48l280 -280q28 -28 48 -76t20 -88z" /> +<glyph unicode="" d="M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" d="M1536 192v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 704v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 1216v-128q0 -26 -19 -45 t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1792" d="M384 128q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 640q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1152q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z M1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M381 -84q0 -80 -54.5 -126t-135.5 -46q-106 0 -172 66l57 88q49 -45 106 -45q29 0 50.5 14.5t21.5 42.5q0 64 -105 56l-26 56q8 10 32.5 43.5t42.5 54t37 38.5v1q-16 0 -48.5 -1t-48.5 -1v-53h-106v152h333v-88l-95 -115q51 -12 81 -49t30 -88zM383 543v-159h-362 q-6 36 -6 54q0 51 23.5 93t56.5 68t66 47.5t56.5 43.5t23.5 45q0 25 -14.5 38.5t-39.5 13.5q-46 0 -81 -58l-85 59q24 51 71.5 79.5t105.5 28.5q73 0 123 -41.5t50 -112.5q0 -50 -34 -91.5t-75 -64.5t-75.5 -50.5t-35.5 -52.5h127v60h105zM1792 224v-192q0 -13 -9.5 -22.5 t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1123v-99h-335v99h107q0 41 0.5 122t0.5 121v12h-2q-8 -17 -50 -54l-71 76l136 127h106v-404h108zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5 t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1760 640q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h1728zM483 704q-28 35 -51 80q-48 97 -48 188q0 181 134 309q133 127 393 127q50 0 167 -19q66 -12 177 -48q10 -38 21 -118q14 -123 14 -183q0 -18 -5 -45l-12 -3l-84 6 l-14 2q-50 149 -103 205q-88 91 -210 91q-114 0 -182 -59q-67 -58 -67 -146q0 -73 66 -140t279 -129q69 -20 173 -66q58 -28 95 -52h-743zM990 448h411q7 -39 7 -92q0 -111 -41 -212q-23 -55 -71 -104q-37 -35 -109 -81q-80 -48 -153 -66q-80 -21 -203 -21q-114 0 -195 23 l-140 40q-57 16 -72 28q-8 8 -8 22v13q0 108 -2 156q-1 30 0 68l2 37v44l102 2q15 -34 30 -71t22.5 -56t12.5 -27q35 -57 80 -94q43 -36 105 -57q59 -22 132 -22q64 0 139 27q77 26 122 86q47 61 47 129q0 84 -81 157q-34 29 -137 71z" /> +<glyph unicode="" d="M48 1313q-37 2 -45 4l-3 88q13 1 40 1q60 0 112 -4q132 -7 166 -7q86 0 168 3q116 4 146 5q56 0 86 2l-1 -14l2 -64v-9q-60 -9 -124 -9q-60 0 -79 -25q-13 -14 -13 -132q0 -13 0.5 -32.5t0.5 -25.5l1 -229l14 -280q6 -124 51 -202q35 -59 96 -92q88 -47 177 -47 q104 0 191 28q56 18 99 51q48 36 65 64q36 56 53 114q21 73 21 229q0 79 -3.5 128t-11 122.5t-13.5 159.5l-4 59q-5 67 -24 88q-34 35 -77 34l-100 -2l-14 3l2 86h84l205 -10q76 -3 196 10l18 -2q6 -38 6 -51q0 -7 -4 -31q-45 -12 -84 -13q-73 -11 -79 -17q-15 -15 -15 -41 q0 -7 1.5 -27t1.5 -31q8 -19 22 -396q6 -195 -15 -304q-15 -76 -41 -122q-38 -65 -112 -123q-75 -57 -182 -89q-109 -33 -255 -33q-167 0 -284 46q-119 47 -179 122q-61 76 -83 195q-16 80 -16 237v333q0 188 -17 213q-25 36 -147 39zM1536 -96v64q0 14 -9 23t-23 9h-1472 q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h1472q14 0 23 9t9 23z" /> +<glyph unicode="" horiz-adv-x="1664" d="M512 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23 v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 160v192 q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192 q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1664 1248v-1088q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1344q66 0 113 -47t47 -113 z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1190 955l293 293l-107 107l-293 -293zM1637 1248q0 -27 -18 -45l-1286 -1286q-18 -18 -45 -18t-45 18l-198 198q-18 18 -18 45t18 45l1286 1286q18 18 45 18t45 -18l198 -198q18 -18 18 -45zM286 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM636 1276 l196 -60l-196 -60l-60 -196l-60 196l-196 60l196 60l60 196zM1566 798l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM926 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98z" /> +<glyph unicode="" horiz-adv-x="1792" d="M640 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM256 640h384v256h-158q-13 0 -22 -9l-195 -195q-9 -9 -9 -22v-30zM1536 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM1792 1216v-1024q0 -15 -4 -26.5t-13.5 -18.5 t-16.5 -11.5t-23.5 -6t-22.5 -2t-25.5 0t-22.5 0.5q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-64q-3 0 -22.5 -0.5t-25.5 0t-22.5 2t-23.5 6t-16.5 11.5t-13.5 18.5t-4 26.5q0 26 19 45t45 19v320q0 8 -0.5 35t0 38 t2.5 34.5t6.5 37t14 30.5t22.5 30l198 198q19 19 50.5 32t58.5 13h160v192q0 26 19 45t45 19h1024q26 0 45 -19t19 -45z" /> +<glyph unicode="" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103q-111 0 -218 32q59 93 78 164q9 34 54 211q20 -39 73 -67.5t114 -28.5q121 0 216 68.5t147 188.5t52 270q0 114 -59.5 214t-172.5 163t-255 63q-105 0 -196 -29t-154.5 -77t-109 -110.5t-67 -129.5t-21.5 -134 q0 -104 40 -183t117 -111q30 -12 38 20q2 7 8 31t8 30q6 23 -11 43q-51 61 -51 151q0 151 104.5 259.5t273.5 108.5q151 0 235.5 -82t84.5 -213q0 -170 -68.5 -289t-175.5 -119q-61 0 -98 43.5t-23 104.5q8 35 26.5 93.5t30 103t11.5 75.5q0 50 -27 83t-77 33 q-62 0 -105 -57t-43 -142q0 -73 25 -122l-99 -418q-17 -70 -13 -177q-206 91 -333 281t-127 423q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-725q85 122 108 210q9 34 53 209q21 -39 73.5 -67t112.5 -28q181 0 295.5 147.5t114.5 373.5q0 84 -35 162.5t-96.5 139t-152.5 97t-197 36.5q-104 0 -194.5 -28.5t-153 -76.5 t-107.5 -109.5t-66.5 -128t-21.5 -132.5q0 -102 39.5 -180t116.5 -110q13 -5 23.5 0t14.5 19q10 44 15 61q6 23 -11 42q-50 62 -50 150q0 150 103.5 256.5t270.5 106.5q149 0 232.5 -81t83.5 -210q0 -168 -67.5 -286t-173.5 -118q-60 0 -97 43.5t-23 103.5q8 34 26.5 92.5 t29.5 102t11 74.5q0 49 -26.5 81.5t-75.5 32.5q-61 0 -103.5 -56.5t-42.5 -139.5q0 -72 24 -121l-98 -414q-24 -100 -7 -254h-183q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960z" /> +<glyph unicode="" d="M829 318q0 -76 -58.5 -112.5t-139.5 -36.5q-41 0 -80.5 9.5t-75.5 28.5t-58 53t-22 78q0 46 25 80t65.5 51.5t82 25t84.5 7.5q20 0 31 -2q2 -1 23 -16.5t26 -19t23 -18t24.5 -22t19 -22.5t17 -26t9 -26.5t4.5 -31.5zM755 863q0 -60 -33 -99.5t-92 -39.5q-53 0 -93 42.5 t-57.5 96.5t-17.5 106q0 61 32 104t92 43q53 0 93.5 -45t58 -101t17.5 -107zM861 1120l88 64h-265q-85 0 -161 -32t-127.5 -98t-51.5 -153q0 -93 64.5 -154.5t158.5 -61.5q22 0 43 3q-13 -29 -13 -54q0 -44 40 -94q-175 -12 -257 -63q-47 -29 -75.5 -73t-28.5 -95 q0 -43 18.5 -77.5t48.5 -56.5t69 -37t77.5 -21t76.5 -6q60 0 120.5 15.5t113.5 46t86 82.5t33 117q0 49 -20 89.5t-49 66.5t-58 47.5t-49 44t-20 44.5t15.5 42.5t37.5 39.5t44 42t37.5 59.5t15.5 82.5q0 60 -22.5 99.5t-72.5 90.5h83zM1152 672h128v64h-128v128h-64v-128 h-128v-64h128v-160h64v160zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" horiz-adv-x="1664" d="M735 740q0 -36 32 -70.5t77.5 -68t90.5 -73.5t77 -104t32 -142q0 -90 -48 -173q-72 -122 -211 -179.5t-298 -57.5q-132 0 -246.5 41.5t-171.5 137.5q-37 60 -37 131q0 81 44.5 150t118.5 115q131 82 404 100q-32 42 -47.5 74t-15.5 73q0 36 21 85q-46 -4 -68 -4 q-148 0 -249.5 96.5t-101.5 244.5q0 82 36 159t99 131q77 66 182.5 98t217.5 32h418l-138 -88h-131q74 -63 112 -133t38 -160q0 -72 -24.5 -129.5t-59 -93t-69.5 -65t-59.5 -61.5t-24.5 -66zM589 836q38 0 78 16.5t66 43.5q53 57 53 159q0 58 -17 125t-48.5 129.5 t-84.5 103.5t-117 41q-42 0 -82.5 -19.5t-65.5 -52.5q-47 -59 -47 -160q0 -46 10 -97.5t31.5 -103t52 -92.5t75 -67t96.5 -26zM591 -37q58 0 111.5 13t99 39t73 73t27.5 109q0 25 -7 49t-14.5 42t-27 41.5t-29.5 35t-38.5 34.5t-36.5 29t-41.5 30t-36.5 26q-16 2 -48 2 q-53 0 -105 -7t-107.5 -25t-97 -46t-68.5 -74.5t-27 -105.5q0 -70 35 -123.5t91.5 -83t119 -44t127.5 -14.5zM1401 839h213v-108h-213v-219h-105v219h-212v108h212v217h105v-217z" /> +<glyph unicode="" horiz-adv-x="1920" d="M768 384h384v96h-128v448h-114l-148 -137l77 -80q42 37 55 57h2v-288h-128v-96zM1280 640q0 -70 -21 -142t-59.5 -134t-101.5 -101t-138 -39t-138 39t-101.5 101t-59.5 134t-21 142t21 142t59.5 134t101.5 101t138 39t138 -39t101.5 -101t59.5 -134t21 -142zM1792 384 v512q-106 0 -181 75t-75 181h-1152q0 -106 -75 -181t-181 -75v-512q106 0 181 -75t75 -181h1152q0 106 75 181t181 75zM1920 1216v-1152q0 -26 -19 -45t-45 -19h-1792q-26 0 -45 19t-19 45v1152q0 26 19 45t45 19h1792q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1024" d="M1024 320q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" /> +<glyph unicode="" horiz-adv-x="640" d="M640 1088v-896q0 -26 -19 -45t-45 -19t-45 19l-448 448q-19 19 -19 45t19 45l448 448q19 19 45 19t45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="640" d="M576 640q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19t-19 45v896q0 26 19 45t45 19t45 -19l448 -448q19 -19 19 -45z" /> +<glyph unicode="" horiz-adv-x="1664" d="M160 0h608v1152h-640v-1120q0 -13 9.5 -22.5t22.5 -9.5zM1536 32v1120h-640v-1152h608q13 0 22.5 9.5t9.5 22.5zM1664 1248v-1216q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1344q66 0 113 -47t47 -113z" /> +<glyph unicode="" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45zM1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" /> +<glyph unicode="" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1792 826v-794q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v794q44 -49 101 -87q362 -246 497 -345q57 -42 92.5 -65.5t94.5 -48t110 -24.5h1h1q51 0 110 24.5t94.5 48t92.5 65.5q170 123 498 345q57 39 100 87zM1792 1120q0 -79 -49 -151t-122 -123 q-376 -261 -468 -325q-10 -7 -42.5 -30.5t-54 -38t-52 -32.5t-57.5 -27t-50 -9h-1h-1q-23 0 -50 9t-57.5 27t-52 32.5t-54 38t-42.5 30.5q-91 64 -262 182.5t-205 142.5q-62 42 -117 115.5t-55 136.5q0 78 41.5 130t118.5 52h1472q65 0 112.5 -47t47.5 -113z" /> +<glyph unicode="" d="M349 911v-991h-330v991h330zM370 1217q1 -73 -50.5 -122t-135.5 -49h-2q-82 0 -132 49t-50 122q0 74 51.5 122.5t134.5 48.5t133 -48.5t51 -122.5zM1536 488v-568h-329v530q0 105 -40.5 164.5t-126.5 59.5q-63 0 -105.5 -34.5t-63.5 -85.5q-11 -30 -11 -81v-553h-329 q2 399 2 647t-1 296l-1 48h329v-144h-2q20 32 41 56t56.5 52t87 43.5t114.5 15.5q171 0 275 -113.5t104 -332.5z" /> +<glyph unicode="" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5 t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1771 0q0 -53 -37 -90l-107 -108q-39 -37 -91 -37q-53 0 -90 37l-363 364q-38 36 -38 90q0 53 43 96l-256 256l-126 -126q-14 -14 -34 -14t-34 14q2 -2 12.5 -12t12.5 -13t10 -11.5t10 -13.5t6 -13.5t5.5 -16.5t1.5 -18q0 -38 -28 -68q-3 -3 -16.5 -18t-19 -20.5 t-18.5 -16.5t-22 -15.5t-22 -9t-26 -4.5q-40 0 -68 28l-408 408q-28 28 -28 68q0 13 4.5 26t9 22t15.5 22t16.5 18.5t20.5 19t18 16.5q30 28 68 28q10 0 18 -1.5t16.5 -5.5t13.5 -6t13.5 -10t11.5 -10t13 -12.5t12 -12.5q-14 14 -14 34t14 34l348 348q14 14 34 14t34 -14 q-2 2 -12.5 12t-12.5 13t-10 11.5t-10 13.5t-6 13.5t-5.5 16.5t-1.5 18q0 38 28 68q3 3 16.5 18t19 20.5t18.5 16.5t22 15.5t22 9t26 4.5q40 0 68 -28l408 -408q28 -28 28 -68q0 -13 -4.5 -26t-9 -22t-15.5 -22t-16.5 -18.5t-20.5 -19t-18 -16.5q-30 -28 -68 -28 q-10 0 -18 1.5t-16.5 5.5t-13.5 6t-13.5 10t-11.5 10t-13 12.5t-12 12.5q14 -14 14 -34t-14 -34l-126 -126l256 -256q43 43 96 43q52 0 91 -37l363 -363q37 -39 37 -91z" /> +<glyph unicode="" horiz-adv-x="1792" d="M384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM576 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1004 351l101 382q6 26 -7.5 48.5t-38.5 29.5 t-48 -6.5t-30 -39.5l-101 -382q-60 -5 -107 -43.5t-63 -98.5q-20 -77 20 -146t117 -89t146 20t89 117q16 60 -6 117t-72 91zM1664 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 1024q0 53 -37.5 90.5 t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1472 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 384q0 -261 -141 -483q-19 -29 -54 -29h-1402q-35 0 -54 29 q-141 221 -141 483q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> +<glyph unicode="" horiz-adv-x="1792" d="M896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640 q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281q0 174 120 321.5 t326 233t450 85.5t450 -85.5t326 -233t120 -321.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M704 1152q-153 0 -286 -52t-211.5 -141t-78.5 -191q0 -82 53 -158t149 -132l97 -56l-35 -84q34 20 62 39l44 31l53 -10q78 -14 153 -14q153 0 286 52t211.5 141t78.5 191t-78.5 191t-211.5 141t-286 52zM704 1280q191 0 353.5 -68.5t256.5 -186.5t94 -257t-94 -257 t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224q0 139 94 257t256.5 186.5 t353.5 68.5zM1526 111q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129 q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230q0 -120 -71 -224.5t-195 -176.5z" /> +<glyph unicode="" horiz-adv-x="896" d="M885 970q18 -20 7 -44l-540 -1157q-13 -25 -42 -25q-4 0 -14 2q-17 5 -25.5 19t-4.5 30l197 808l-406 -101q-4 -1 -12 -1q-18 0 -31 11q-18 15 -13 39l201 825q4 14 16 23t28 9h328q19 0 32 -12.5t13 -29.5q0 -8 -5 -18l-171 -463l396 98q8 2 12 2q19 0 34 -15z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1792 288v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192q0 52 38 90t90 38h512v192h-96q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-96v-192h512q52 0 90 -38t38 -90v-192h96q40 0 68 -28t28 -68 z" /> +<glyph unicode="" horiz-adv-x="1664" d="M896 708v-580q0 -104 -76 -180t-180 -76t-180 76t-76 180q0 26 19 45t45 19t45 -19t19 -45q0 -50 39 -89t89 -39t89 39t39 89v580q33 11 64 11t64 -11zM1664 681q0 -13 -9.5 -22.5t-22.5 -9.5q-11 0 -23 10q-49 46 -93 69t-102 23q-68 0 -128 -37t-103 -97 q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -28 -17q-18 0 -29 17q-4 6 -14.5 24t-17.5 28q-43 60 -102.5 97t-127.5 37t-127.5 -37t-102.5 -97q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -29 -17q-17 0 -28 17q-4 6 -14.5 24t-17.5 28q-43 60 -103 97t-128 37q-58 0 -102 -23t-93 -69 q-12 -10 -23 -10q-13 0 -22.5 9.5t-9.5 22.5q0 5 1 7q45 183 172.5 319.5t298 204.5t360.5 68q140 0 274.5 -40t246.5 -113.5t194.5 -187t115.5 -251.5q1 -2 1 -7zM896 1408v-98q-42 2 -64 2t-64 -2v98q0 26 19 45t45 19t45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1792" d="M768 -128h896v640h-416q-40 0 -68 28t-28 68v416h-384v-1152zM1024 1312v64q0 13 -9.5 22.5t-22.5 9.5h-704q-13 0 -22.5 -9.5t-9.5 -22.5v-64q0 -13 9.5 -22.5t22.5 -9.5h704q13 0 22.5 9.5t9.5 22.5zM1280 640h299l-299 299v-299zM1792 512v-672q0 -40 -28 -68t-68 -28 h-960q-40 0 -68 28t-28 68v160h-544q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1088q40 0 68 -28t28 -68v-328q21 -13 36 -28l408 -408q28 -28 48 -76t20 -88z" /> +<glyph unicode="" horiz-adv-x="1024" d="M736 960q0 -13 -9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5q0 46 -54 71t-106 25q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5q50 0 99.5 -16t87 -54t37.5 -90zM896 960q0 72 -34.5 134t-90 101.5t-123 62t-136.5 22.5t-136.5 -22.5t-123 -62t-90 -101.5t-34.5 -134 q0 -101 68 -180q10 -11 30.5 -33t30.5 -33q128 -153 141 -298h228q13 145 141 298q10 11 30.5 33t30.5 33q68 79 68 180zM1024 960q0 -155 -103 -268q-45 -49 -74.5 -87t-59.5 -95.5t-34 -107.5q47 -28 47 -82q0 -37 -25 -64q25 -27 25 -64q0 -52 -45 -81q13 -23 13 -47 q0 -46 -31.5 -71t-77.5 -25q-20 -44 -60 -70t-87 -26t-87 26t-60 70q-46 0 -77.5 25t-31.5 71q0 24 13 47q-45 29 -45 81q0 37 25 64q-25 27 -25 64q0 54 47 82q-4 50 -34 107.5t-59.5 95.5t-74.5 87q-103 113 -103 268q0 99 44.5 184.5t117 142t164 89t186.5 32.5 t186.5 -32.5t164 -89t117 -142t44.5 -184.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1792 352v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5q-12 0 -24 10l-319 320q-9 9 -9 22q0 14 9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h1376q13 0 22.5 -9.5t9.5 -22.5zM1792 896q0 -14 -9 -23l-320 -320q-9 -9 -23 -9 q-13 0 -22.5 9.5t-9.5 22.5v192h-1376q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1376v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" /> +<glyph unicode="" horiz-adv-x="1920" d="M1280 608q0 14 -9 23t-23 9h-224v352q0 13 -9.5 22.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-352h-224q-13 0 -22.5 -9.5t-9.5 -22.5q0 -14 9 -23l352 -352q9 -9 23 -9t23 9l351 351q10 12 10 24zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" /> +<glyph unicode="" horiz-adv-x="1920" d="M1280 672q0 14 -9 23l-352 352q-9 9 -23 9t-23 -9l-351 -351q-10 -12 -10 -24q0 -14 9 -23t23 -9h224v-352q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5v352h224q13 0 22.5 9.5t9.5 22.5zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" /> +<glyph unicode="" horiz-adv-x="1408" d="M384 192q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 68 5.5 131t24 138t47.5 132.5t81 103t120 60.5q-22 -52 -22 -120v-203q-58 -20 -93 -70t-35 -111q0 -80 56 -136t136 -56 t136 56t56 136q0 61 -35.5 111t-92.5 70v203q0 62 25 93q132 -104 295 -104t295 104q25 -31 25 -93v-64q-106 0 -181 -75t-75 -181v-89q-32 -29 -32 -71q0 -40 28 -68t68 -28t68 28t28 68q0 42 -32 71v89q0 52 38 90t90 38t90 -38t38 -90v-89q-32 -29 -32 -71q0 -40 28 -68 t68 -28t68 28t28 68q0 42 -32 71v89q0 68 -34.5 127.5t-93.5 93.5q0 10 0.5 42.5t0 48t-2.5 41.5t-7 47t-13 40q68 -15 120 -60.5t81 -103t47.5 -132.5t24 -138t5.5 -131zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5 t271.5 -112.5t112.5 -271.5z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1280 832q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 832q0 -62 -35.5 -111t-92.5 -70v-395q0 -159 -131.5 -271.5t-316.5 -112.5t-316.5 112.5t-131.5 271.5v132q-164 20 -274 128t-110 252v512q0 26 19 45t45 19q6 0 16 -2q17 30 47 48 t65 18q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5q-33 0 -64 18v-402q0 -106 94 -181t226 -75t226 75t94 181v402q-31 -18 -64 -18q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5q35 0 65 -18t47 -48q10 2 16 2q26 0 45 -19t19 -45v-512q0 -144 -110 -252 t-274 -128v-132q0 -106 94 -181t226 -75t226 75t94 181v395q-57 21 -92.5 70t-35.5 111q0 80 56 136t136 56t136 -56t56 -136z" /> +<glyph unicode="" horiz-adv-x="1792" d="M640 1152h512v128h-512v-128zM288 1152v-1280h-64q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h64zM1408 1152v-1280h-1024v1280h128v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h128zM1792 928v-832q0 -92 -66 -158t-158 -66h-64v1280h64q92 0 158 -66 t66 -158z" /> +<glyph unicode="" horiz-adv-x="1792" d="M912 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM1728 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q50 42 91 88t85 119.5t74.5 158.5 t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q190 -28 307 -158.5t117 -282.5q0 -139 19.5 -260t50 -206t74.5 -158.5t85 -119.5t91 -88z" /> +<glyph unicode="" horiz-adv-x="1920" d="M1664 896q0 80 -56 136t-136 56h-64v-384h64q80 0 136 56t56 136zM0 128h1792q0 -106 -75 -181t-181 -75h-1280q-106 0 -181 75t-75 181zM1856 896q0 -159 -112.5 -271.5t-271.5 -112.5h-64v-32q0 -92 -66 -158t-158 -66h-704q-92 0 -158 66t-66 158v736q0 26 19 45 t45 19h1152q159 0 271.5 -112.5t112.5 -271.5z" /> +<glyph unicode="" horiz-adv-x="1408" d="M640 1472v-640q0 -61 -35.5 -111t-92.5 -70v-779q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v779q-57 20 -92.5 70t-35.5 111v640q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45 t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45zM1408 1472v-1600q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v512h-224q-13 0 -22.5 9.5t-9.5 22.5v800q0 132 94 226t226 94h256q26 0 45 -19t19 -45z" /> +<glyph unicode="" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M384 736q0 14 9 23t23 9h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64zM1120 512q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704zM1120 256q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704 q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704z" /> +<glyph unicode="" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1536h-1152v-1536h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM1408 1472v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1152h-256v-32q0 -40 -28 -68t-68 -28h-448q-40 0 -68 28t-28 68v32h-256v-1152h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM896 1056v320q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-96h-128v96q0 13 -9.5 22.5 t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v96h128v-96q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1408 1088v-1280q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1280q0 26 19 45t45 19h320 v288q0 40 28 68t68 28h448q40 0 68 -28t28 -68v-288h320q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1920" d="M640 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM256 640h384v256h-158q-14 -2 -22 -9l-195 -195q-7 -12 -9 -22v-30zM1536 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1664 800v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM1920 1344v-1152 q0 -26 -19 -45t-45 -19h-192q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-128q-26 0 -45 19t-19 45t19 45t45 19v416q0 26 13 58t32 51l198 198q19 19 51 32t58 13h160v320q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1280 416v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM640 1152h512v128h-512v-128zM256 1152v-1280h-32 q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h32zM1440 1152v-1280h-1088v1280h160v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h160zM1792 928v-832q0 -92 -66 -158t-158 -66h-32v1280h32q92 0 158 -66t66 -158z" /> +<glyph unicode="" horiz-adv-x="1920" d="M1920 576q-1 -32 -288 -96l-352 -32l-224 -64h-64l-293 -352h69q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-96h-160h-64v32h64v416h-160l-192 -224h-96l-32 32v192h32v32h128v8l-192 24v128l192 24v8h-128v32h-32v192l32 32h96l192 -224h160v416h-64v32h64h160h96 q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-69l293 -352h64l224 -64l352 -32q261 -58 287 -93z" /> +<glyph unicode="" horiz-adv-x="1664" d="M640 640v384h-256v-256q0 -53 37.5 -90.5t90.5 -37.5h128zM1664 192v-192h-1152v192l128 192h-128q-159 0 -271.5 112.5t-112.5 271.5v320l-64 64l32 128h480l32 128h960l32 -192l-64 -32v-800z" /> +<glyph unicode="" d="M1280 192v896q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-512v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-896q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h512v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" d="M1280 576v128q0 26 -19 45t-45 19h-320v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-320q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h320v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h320q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" horiz-adv-x="1024" d="M627 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23zM1011 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23z" /> +<glyph unicode="" horiz-adv-x="1024" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM979 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23 l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" /> +<glyph unicode="" horiz-adv-x="1152" d="M1075 224q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM1075 608q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393 q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" /> +<glyph unicode="" horiz-adv-x="1152" d="M1075 672q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23zM1075 1056q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" /> +<glyph unicode="" horiz-adv-x="640" d="M627 992q0 -13 -10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" /> +<glyph unicode="" horiz-adv-x="640" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" /> +<glyph unicode="" horiz-adv-x="1152" d="M1075 352q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" /> +<glyph unicode="" horiz-adv-x="1152" d="M1075 800q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" /> +<glyph unicode="" horiz-adv-x="1920" d="M1792 544v832q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1376v-1088q0 -66 -47 -113t-113 -47h-544q0 -37 16 -77.5t32 -71t16 -43.5q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19 t-19 45q0 14 16 44t32 70t16 78h-544q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" /> +<glyph unicode="" horiz-adv-x="1920" d="M416 256q-66 0 -113 47t-47 113v704q0 66 47 113t113 47h1088q66 0 113 -47t47 -113v-704q0 -66 -47 -113t-113 -47h-1088zM384 1120v-704q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5v704q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5z M1760 192h160v-96q0 -40 -47 -68t-113 -28h-1600q-66 0 -113 28t-47 68v96h160h1600zM1040 96q16 0 16 16t-16 16h-160q-16 0 -16 -16t16 -16h160z" /> +<glyph unicode="" horiz-adv-x="1152" d="M640 128q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1024 288v960q0 13 -9.5 22.5t-22.5 9.5h-832q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h832q13 0 22.5 9.5t9.5 22.5zM1152 1248v-1088q0 -66 -47 -113t-113 -47h-832 q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h832q66 0 113 -47t47 -113z" /> +<glyph unicode="" horiz-adv-x="768" d="M464 128q0 33 -23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5t56.5 23.5t23.5 56.5zM672 288v704q0 13 -9.5 22.5t-22.5 9.5h-512q-13 0 -22.5 -9.5t-9.5 -22.5v-704q0 -13 9.5 -22.5t22.5 -9.5h512q13 0 22.5 9.5t9.5 22.5zM480 1136 q0 16 -16 16h-160q-16 0 -16 -16t16 -16h160q16 0 16 16zM768 1152v-1024q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v1024q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" /> +<glyph unicode="" d="M768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103 t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" horiz-adv-x="1664" d="M768 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z M1664 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z" /> +<glyph unicode="" horiz-adv-x="1664" d="M768 1216v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136zM1664 1216 v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136z" /> +<glyph unicode="" horiz-adv-x="1792" d="M526 142q0 -53 -37.5 -90.5t-90.5 -37.5q-52 0 -90 38t-38 90q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1024 -64q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM320 640q0 -53 -37.5 -90.5t-90.5 -37.5 t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1522 142q0 -52 -38 -90t-90 -38q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM558 1138q0 -66 -47 -113t-113 -47t-113 47t-47 113t47 113t113 47t113 -47t47 -113z M1728 640q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1088 1344q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1618 1138q0 -93 -66 -158.5t-158 -65.5q-93 0 -158.5 65.5t-65.5 158.5 q0 92 65.5 158t158.5 66q92 0 158 -66t66 -158z" /> +<glyph unicode="" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1792 416q0 -166 -127 -451q-3 -7 -10.5 -24t-13.5 -30t-13 -22q-12 -17 -28 -17q-15 0 -23.5 10t-8.5 25q0 9 2.5 26.5t2.5 23.5q5 68 5 123q0 101 -17.5 181t-48.5 138.5t-80 101t-105.5 69.5t-133 42.5t-154 21.5t-175.5 6h-224v-256q0 -26 -19 -45t-45 -19t-45 19 l-512 512q-19 19 -19 45t19 45l512 512q19 19 45 19t45 -19t19 -45v-256h224q713 0 875 -403q53 -134 53 -333z" /> +<glyph unicode="" horiz-adv-x="1664" d="M640 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1280 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1440 320 q0 120 -69 204t-187 84q-41 0 -195 -21q-71 -11 -157 -11t-157 11q-152 21 -195 21q-118 0 -187 -84t-69 -204q0 -88 32 -153.5t81 -103t122 -60t140 -29.5t149 -7h168q82 0 149 7t140 29.5t122 60t81 103t32 153.5zM1664 496q0 -207 -61 -331q-38 -77 -105.5 -133t-141 -86 t-170 -47.5t-171.5 -22t-167 -4.5q-78 0 -142 3t-147.5 12.5t-152.5 30t-137 51.5t-121 81t-86 115q-62 123 -62 331q0 237 136 396q-27 82 -27 170q0 116 51 218q108 0 190 -39.5t189 -123.5q147 35 309 35q148 0 280 -32q105 82 187 121t189 39q51 -102 51 -218 q0 -87 -27 -168q136 -160 136 -398z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1536 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68v-960q0 -40 28 -68t68 -28h1216q40 0 68 28t28 68zM1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320 q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" /> +<glyph unicode="" horiz-adv-x="1920" d="M1781 605q0 35 -53 35h-1088q-40 0 -85.5 -21.5t-71.5 -52.5l-294 -363q-18 -24 -18 -40q0 -35 53 -35h1088q40 0 86 22t71 53l294 363q18 22 18 39zM640 768h768v160q0 40 -28 68t-68 28h-576q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68 v-853l256 315q44 53 116 87.5t140 34.5zM1909 605q0 -62 -46 -120l-295 -363q-43 -53 -116 -87.5t-140 -34.5h-1088q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h192q54 0 99 -24.5t67 -70.5q15 -32 15 -68z " /> +<glyph unicode="" horiz-adv-x="1792" /> +<glyph unicode="" horiz-adv-x="1792" /> +<glyph unicode="" d="M1134 461q-37 -121 -138 -195t-228 -74t-228 74t-138 195q-8 25 4 48.5t38 31.5q25 8 48.5 -4t31.5 -38q25 -80 92.5 -129.5t151.5 -49.5t151.5 49.5t92.5 129.5q8 26 32 38t49 4t37 -31.5t4 -48.5zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5 t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1134 307q8 -25 -4 -48.5t-37 -31.5t-49 4t-32 38q-25 80 -92.5 129.5t-151.5 49.5t-151.5 -49.5t-92.5 -129.5q-8 -26 -31.5 -38t-48.5 -4q-26 8 -38 31.5t-4 48.5q37 121 138 195t228 74t228 -74t138 -195zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204 t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1152 448q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h640q26 0 45 -19t19 -45zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" horiz-adv-x="1920" d="M832 448v128q0 14 -9 23t-23 9h-192v192q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-192h-192q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h192v-192q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v192h192q14 0 23 9t9 23zM1408 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5 t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1920 512q0 -212 -150 -362t-362 -150q-192 0 -338 128h-220q-146 -128 -338 -128q-212 0 -362 150 t-150 362t150 362t362 150h896q212 0 362 -150t150 -362z" /> +<glyph unicode="" horiz-adv-x="1920" d="M384 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM512 624v-96q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h224q16 0 16 -16zM384 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 368v-96q0 -16 -16 -16 h-864q-16 0 -16 16v96q0 16 16 16h864q16 0 16 -16zM768 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM640 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1024 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16 h96q16 0 16 -16zM896 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1280 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1152 880v-96 q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 880v-352q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h112v240q0 16 16 16h96q16 0 16 -16zM1792 128v896h-1664v-896 h1664zM1920 1024v-896q0 -53 -37.5 -90.5t-90.5 -37.5h-1664q-53 0 -90.5 37.5t-37.5 90.5v896q0 53 37.5 90.5t90.5 37.5h1664q53 0 90.5 -37.5t37.5 -90.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1664 491v616q-169 -91 -306 -91q-82 0 -145 32q-100 49 -184 76.5t-178 27.5q-173 0 -403 -127v-599q245 113 433 113q55 0 103.5 -7.5t98 -26t77 -31t82.5 -39.5l28 -14q44 -22 101 -22q120 0 293 92zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9 h-64q-14 0 -23 9t-9 23v1266q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102 q-15 -9 -33 -9q-16 0 -32 8q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" /> +<glyph unicode="" horiz-adv-x="1792" d="M832 536v192q-181 -16 -384 -117v-185q205 96 384 110zM832 954v197q-172 -8 -384 -126v-189q215 111 384 118zM1664 491v184q-235 -116 -384 -71v224q-20 6 -39 15q-5 3 -33 17t-34.5 17t-31.5 15t-34.5 15.5t-32.5 13t-36 12.5t-35 8.5t-39.5 7.5t-39.5 4t-44 2 q-23 0 -49 -3v-222h19q102 0 192.5 -29t197.5 -82q19 -9 39 -15v-188q42 -17 91 -17q120 0 293 92zM1664 918v189q-169 -91 -306 -91q-45 0 -78 8v-196q148 -42 384 90zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v1266 q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102q-15 -9 -33 -9q-16 0 -32 8 q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" /> +<glyph unicode="" horiz-adv-x="1664" d="M585 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23zM1664 96v-64q0 -14 -9 -23t-23 -9h-960q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h960q14 0 23 -9 t9 -23z" /> +<glyph unicode="" horiz-adv-x="1920" d="M617 137l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23zM1208 1204l-373 -1291q-4 -13 -15.5 -19.5t-23.5 -2.5l-62 17q-13 4 -19.5 15.5t-2.5 24.5 l373 1291q4 13 15.5 19.5t23.5 2.5l62 -17q13 -4 19.5 -15.5t2.5 -24.5zM1865 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23z" /> +<glyph unicode="" horiz-adv-x="1792" d="M640 454v-70q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-69l-397 -398q-19 -19 -19 -45t19 -45zM1792 416q0 -58 -17 -133.5t-38.5 -138t-48 -125t-40.5 -90.5l-20 -40q-8 -17 -28 -17q-6 0 -9 1 q-25 8 -23 34q43 400 -106 565q-64 71 -170.5 110.5t-267.5 52.5v-251q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-262q411 -28 599 -221q169 -173 169 -509z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1186 579l257 250l-356 52l-66 10l-30 60l-159 322v-963l59 -31l318 -168l-60 355l-12 66zM1638 841l-363 -354l86 -500q5 -33 -6 -51.5t-34 -18.5q-17 0 -40 12l-449 236l-449 -236q-23 -12 -40 -12q-23 0 -34 18.5t-6 51.5l86 500l-364 354q-32 32 -23 59.5t54 34.5 l502 73l225 455q20 41 49 41q28 0 49 -41l225 -455l502 -73q45 -7 54 -34.5t-24 -59.5z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1401 1187l-640 -1280q-17 -35 -57 -35q-5 0 -15 2q-22 5 -35.5 22.5t-13.5 39.5v576h-576q-22 0 -39.5 13.5t-22.5 35.5t4 42t29 30l1280 640q13 7 29 7q27 0 45 -19q15 -14 18.5 -34.5t-6.5 -39.5z" /> +<glyph unicode="" horiz-adv-x="1664" d="M557 256h595v595zM512 301l595 595h-595v-595zM1664 224v-192q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v224h-864q-14 0 -23 9t-9 23v864h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224v224q0 14 9 23t23 9h192q14 0 23 -9t9 -23 v-224h851l246 247q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-247 -246v-851h224q14 0 23 -9t9 -23z" /> +<glyph unicode="" horiz-adv-x="1024" d="M288 64q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM288 1216q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM928 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1024 1088q0 -52 -26 -96.5t-70 -69.5 q-2 -287 -226 -414q-68 -38 -203 -81q-128 -40 -169.5 -71t-41.5 -100v-26q44 -25 70 -69.5t26 -96.5q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 52 26 96.5t70 69.5v820q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136q0 -52 -26 -96.5t-70 -69.5v-497 q54 26 154 57q55 17 87.5 29.5t70.5 31t59 39.5t40.5 51t28 69.5t8.5 91.5q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136z" /> +<glyph unicode="" horiz-adv-x="1664" d="M439 265l-256 -256q-10 -9 -23 -9q-12 0 -23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23zM608 224v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM384 448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23t9 23t23 9h320 q14 0 23 -9t9 -23zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-334 335q-21 21 -42 56l239 18l273 -274q27 -27 68 -27.5t68 26.5l147 146q28 28 28 67q0 40 -28 68l-274 275l18 239q35 -21 56 -42l336 -336q84 -86 84 -204zM1031 1044l-239 -18 l-273 274q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l274 -274l-18 -240q-35 21 -56 42l-336 336q-84 86 -84 204q0 120 85 203l147 146q83 83 203 83q121 0 204 -85l334 -335q21 -21 42 -56zM1664 960q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9 t-9 23t9 23t23 9h320q14 0 23 -9t9 -23zM1120 1504v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM1527 1353l-256 -256q-11 -9 -23 -9t-23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" /> +<glyph unicode="" horiz-adv-x="1024" d="M704 280v-240q0 -16 -12 -28t-28 -12h-240q-16 0 -28 12t-12 28v240q0 16 12 28t28 12h240q16 0 28 -12t12 -28zM1020 880q0 -54 -15.5 -101t-35 -76.5t-55 -59.5t-57.5 -43.5t-61 -35.5q-41 -23 -68.5 -65t-27.5 -67q0 -17 -12 -32.5t-28 -15.5h-240q-15 0 -25.5 18.5 t-10.5 37.5v45q0 83 65 156.5t143 108.5q59 27 84 56t25 76q0 42 -46.5 74t-107.5 32q-65 0 -108 -29q-35 -25 -107 -115q-13 -16 -31 -16q-12 0 -25 8l-164 125q-13 10 -15.5 25t5.5 28q160 266 464 266q80 0 161 -31t146 -83t106 -127.5t41 -158.5z" /> +<glyph unicode="" horiz-adv-x="640" d="M640 192v-128q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64v384h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-576h64q26 0 45 -19t19 -45zM512 1344v-192q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v192 q0 26 19 45t45 19h256q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="640" d="M512 288v-224q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v224q0 26 19 45t45 19h256q26 0 45 -19t19 -45zM542 1344l-28 -768q-1 -26 -20.5 -45t-45.5 -19h-256q-26 0 -45.5 19t-20.5 45l-28 768q-1 26 17.5 45t44.5 19h320q26 0 44.5 -19t17.5 -45z" /> +<glyph unicode="" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109zM1534 846v-206h-514l-3 27 q-4 28 -4 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q83 65 188 65q110 0 178 -59.5t68 -158.5q0 -56 -24.5 -103t-62 -76.5t-81.5 -58.5t-82 -50.5t-65.5 -51.5t-30.5 -63h232v80 h126z" /> +<glyph unicode="" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109zM1536 -50v-206h-514l-4 27 q-3 45 -3 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q80 65 188 65q110 0 178 -59.5t68 -158.5q0 -66 -34.5 -118.5t-84 -86t-99.5 -62.5t-87 -63t-41 -73h232v80h126z" /> +<glyph unicode="" horiz-adv-x="1920" d="M896 128l336 384h-768l-336 -384h768zM1909 1205q15 -34 9.5 -71.5t-30.5 -65.5l-896 -1024q-38 -44 -96 -44h-768q-38 0 -69.5 20.5t-47.5 54.5q-15 34 -9.5 71.5t30.5 65.5l896 1024q38 44 96 44h768q38 0 69.5 -20.5t47.5 -54.5z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1664 438q0 -81 -44.5 -135t-123.5 -54q-41 0 -77.5 17.5t-59 38t-56.5 38t-71 17.5q-110 0 -110 -124q0 -39 16 -115t15 -115v-5q-22 0 -33 -1q-34 -3 -97.5 -11.5t-115.5 -13.5t-98 -5q-61 0 -103 26.5t-42 83.5q0 37 17.5 71t38 56.5t38 59t17.5 77.5q0 79 -54 123.5 t-135 44.5q-84 0 -143 -45.5t-59 -127.5q0 -43 15 -83t33.5 -64.5t33.5 -53t15 -50.5q0 -45 -46 -89q-37 -35 -117 -35q-95 0 -245 24q-9 2 -27.5 4t-27.5 4l-13 2q-1 0 -3 1q-2 0 -2 1v1024q2 -1 17.5 -3.5t34 -5t21.5 -3.5q150 -24 245 -24q80 0 117 35q46 44 46 89 q0 22 -15 50.5t-33.5 53t-33.5 64.5t-15 83q0 82 59 127.5t144 45.5q80 0 134 -44.5t54 -123.5q0 -41 -17.5 -77.5t-38 -59t-38 -56.5t-17.5 -71q0 -57 42 -83.5t103 -26.5q64 0 180 15t163 17v-2q-1 -2 -3.5 -17.5t-5 -34t-3.5 -21.5q-24 -150 -24 -245q0 -80 35 -117 q44 -46 89 -46q22 0 50.5 15t53 33.5t64.5 33.5t83 15q82 0 127.5 -59t45.5 -143z" /> +<glyph unicode="" horiz-adv-x="1152" d="M1152 832v-128q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-217 24 -364.5 187.5t-147.5 384.5v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -185 131.5 -316.5t316.5 -131.5 t316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45zM896 1216v-512q0 -132 -94 -226t-226 -94t-226 94t-94 226v512q0 132 94 226t226 94t226 -94t94 -226z" /> +<glyph unicode="" horiz-adv-x="1408" d="M271 591l-101 -101q-42 103 -42 214v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -53 15 -113zM1385 1193l-361 -361v-128q0 -132 -94 -226t-226 -94q-55 0 -109 19l-96 -96q97 -51 205 -51q185 0 316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45v-128 q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-125 13 -235 81l-254 -254q-10 -10 -23 -10t-23 10l-82 82q-10 10 -10 23t10 23l1234 1234q10 10 23 10t23 -10l82 -82q10 -10 10 -23 t-10 -23zM1005 1325l-621 -621v512q0 132 94 226t226 94q102 0 184.5 -59t116.5 -152z" /> +<glyph unicode="" horiz-adv-x="1280" d="M1088 576v640h-448v-1137q119 63 213 137q235 184 235 360zM1280 1344v-768q0 -86 -33.5 -170.5t-83 -150t-118 -127.5t-126.5 -103t-121 -77.5t-89.5 -49.5t-42.5 -20q-12 -6 -26 -6t-26 6q-16 7 -42.5 20t-89.5 49.5t-121 77.5t-126.5 103t-118 127.5t-83 150 t-33.5 170.5v768q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1664" d="M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280 q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" /> +<glyph unicode="" horiz-adv-x="1408" d="M512 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 1376v-320q0 -16 -12 -25q-8 -7 -20 -7q-4 0 -7 1l-448 96q-11 2 -18 11t-7 20h-256v-102q111 -23 183.5 -111t72.5 -203v-800q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v800 q0 106 62.5 190.5t161.5 114.5v111h-32q-59 0 -115 -23.5t-91.5 -53t-66 -66.5t-40.5 -53.5t-14 -24.5q-17 -35 -57 -35q-16 0 -29 7q-23 12 -31.5 37t3.5 49q5 10 14.5 26t37.5 53.5t60.5 70t85 67t108.5 52.5q-25 42 -25 86q0 66 47 113t113 47t113 -47t47 -113 q0 -33 -14 -64h302q0 11 7 20t18 11l448 96q3 1 7 1q12 0 20 -7q12 -9 12 -25z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1440 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1664 1376q0 -249 -75.5 -430.5t-253.5 -360.5q-81 -80 -195 -176l-20 -379q-2 -16 -16 -26l-384 -224q-7 -4 -16 -4q-12 0 -23 9l-64 64q-13 14 -8 32l85 276l-281 281l-276 -85q-3 -1 -9 -1 q-14 0 -23 9l-64 64q-17 19 -5 39l224 384q10 14 26 16l379 20q96 114 176 195q188 187 358 258t431 71q14 0 24 -9.5t10 -22.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1745 763l-164 -763h-334l178 832q13 56 -15 88q-27 33 -83 33h-169l-204 -953h-334l204 953h-286l-204 -953h-334l204 953l-153 327h1276q101 0 189.5 -40.5t147.5 -113.5q60 -73 81 -168.5t0 -194.5z" /> +<glyph unicode="" d="M909 141l102 102q19 19 19 45t-19 45l-307 307l307 307q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M717 141l454 454q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l307 -307l-307 -307q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1165 397l102 102q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l307 307l307 -307q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M813 237l454 454q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-307 -307l-307 307q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1130 939l16 175h-884l47 -534h612l-22 -228l-197 -53l-196 53l-13 140h-175l22 -278l362 -100h4v1l359 99l50 544h-644l-15 181h674zM0 1408h1408l-128 -1438l-578 -162l-574 162z" /> +<glyph unicode="" horiz-adv-x="1792" d="M275 1408h1505l-266 -1333l-804 -267l-698 267l71 356h297l-29 -147l422 -161l486 161l68 339h-1208l58 297h1209l38 191h-1208z" /> +<glyph unicode="" horiz-adv-x="1792" d="M960 1280q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1792 352v-352q0 -22 -20 -30q-8 -2 -12 -2q-13 0 -23 9l-93 93q-119 -143 -318.5 -226.5t-429.5 -83.5t-429.5 83.5t-318.5 226.5l-93 -93q-9 -9 -23 -9q-4 0 -12 2q-20 8 -20 30v352 q0 14 9 23t23 9h352q22 0 30 -20q8 -19 -7 -35l-100 -100q67 -91 189.5 -153.5t271.5 -82.5v647h-192q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h192v163q-58 34 -93 92.5t-35 128.5q0 106 75 181t181 75t181 -75t75 -181q0 -70 -35 -128.5t-93 -92.5v-163h192q26 0 45 -19 t19 -45v-128q0 -26 -19 -45t-45 -19h-192v-647q149 20 271.5 82.5t189.5 153.5l-100 100q-15 16 -7 35q8 20 30 20h352q14 0 23 -9t9 -23z" /> +<glyph unicode="" horiz-adv-x="1152" d="M1056 768q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v320q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45q0 106 -75 181t-181 75t-181 -75t-75 -181 v-320h736z" /> +<glyph unicode="" d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM1152 640q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM1280 640q0 -212 -150 -362t-362 -150t-362 150 t-150 362t150 362t362 150t362 -150t150 -362zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" horiz-adv-x="1408" d="M384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM896 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM1408 800v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" /> +<glyph unicode="" horiz-adv-x="384" d="M384 288v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 1312v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" /> +<glyph unicode="" d="M512 256q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM863 162q-13 232 -177 396t-396 177q-14 1 -24 -9t-10 -23v-128q0 -13 8.5 -22t21.5 -10q154 -11 264 -121t121 -264q1 -13 10 -21.5t22 -8.5h128q13 0 23 10 t9 24zM1247 161q-5 154 -56 297.5t-139.5 260t-205 205t-260 139.5t-297.5 56q-14 1 -23 -9q-10 -10 -10 -23v-128q0 -13 9 -22t22 -10q204 -7 378 -111.5t278.5 -278.5t111.5 -378q1 -13 10 -22t22 -9h128q13 0 23 10q11 9 9 23zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1152 585q32 18 32 55t-32 55l-544 320q-31 19 -64 1q-32 -19 -32 -56v-640q0 -37 32 -56 q16 -8 32 -8q17 0 32 9z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1024 1084l316 -316l-572 -572l-316 316zM813 105l618 618q19 19 19 45t-19 45l-362 362q-18 18 -45 18t-45 -18l-618 -618q-19 -19 -19 -45t19 -45l362 -362q18 -18 45 -18t45 18zM1702 742l-907 -908q-37 -37 -90.5 -37t-90.5 37l-126 126q56 56 56 136t-56 136 t-136 56t-136 -56l-125 126q-37 37 -37 90.5t37 90.5l907 906q37 37 90.5 37t90.5 -37l125 -125q-56 -56 -56 -136t56 -136t136 -56t136 56l126 -125q37 -37 37 -90.5t-37 -90.5z" /> +<glyph unicode="" d="M1280 576v128q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h896q26 0 45 19t19 45zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 t84.5 -203.5z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1152 736v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h832q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5 t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" horiz-adv-x="1024" d="M1018 933q-18 -37 -58 -37h-192v-864q0 -14 -9 -23t-23 -9h-704q-21 0 -29 18q-8 20 4 35l160 192q9 11 25 11h320v640h-192q-40 0 -58 37q-17 37 9 68l320 384q18 22 49 22t49 -22l320 -384q27 -32 9 -68z" /> +<glyph unicode="" horiz-adv-x="1024" d="M32 1280h704q13 0 22.5 -9.5t9.5 -23.5v-863h192q40 0 58 -37t-9 -69l-320 -384q-18 -22 -49 -22t-49 22l-320 384q-26 31 -9 69q18 37 58 37h192v640h-320q-14 0 -25 11l-160 192q-13 14 -4 34q9 19 29 19z" /> +<glyph unicode="" d="M685 237l614 614q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-467 -467l-211 211q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l358 -358q19 -19 45 -19t45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5 t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" d="M404 428l152 -152l-52 -52h-56v96h-96v56zM818 818q14 -13 -3 -30l-291 -291q-17 -17 -30 -3q-14 13 3 30l291 291q17 17 30 3zM544 128l544 544l-288 288l-544 -544v-288h288zM1152 736l92 92q28 28 28 68t-28 68l-152 152q-28 28 -68 28t-68 -28l-92 -92zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" d="M1280 608v480q0 26 -19 45t-45 19h-480q-42 0 -59 -39q-17 -41 14 -70l144 -144l-534 -534q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l534 534l144 -144q18 -19 45 -19q12 0 25 5q39 17 39 59zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" d="M1005 435l352 352q19 19 19 45t-19 45l-352 352q-30 31 -69 14q-40 -17 -40 -59v-160q-119 0 -216 -19.5t-162.5 -51t-114 -79t-76.5 -95.5t-44.5 -109t-21.5 -111.5t-5 -110.5q0 -181 167 -404q10 -12 25 -12q7 0 13 3q22 9 19 33q-44 354 62 473q46 52 130 75.5 t224 23.5v-160q0 -42 40 -59q12 -5 24 -5q26 0 45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" d="M640 448l256 128l-256 128v-256zM1024 1039v-542l-512 -256v542zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1145 861q18 -35 -5 -66l-320 -448q-19 -27 -52 -27t-52 27l-320 448q-23 31 -5 66q17 35 57 35h640q40 0 57 -35zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" d="M1145 419q-17 -35 -57 -35h-640q-40 0 -57 35q-18 35 5 66l320 448q19 27 52 27t52 -27l320 -448q23 -31 5 -66zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" d="M1088 640q0 -33 -27 -52l-448 -320q-31 -23 -66 -5q-35 17 -35 57v640q0 40 35 57q35 18 66 -5l448 -320q27 -19 27 -52zM1280 160v960q0 14 -9 23t-23 9h-960q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h960q14 0 23 9t9 23zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" horiz-adv-x="1024" d="M976 229l35 -159q3 -12 -3 -22.5t-17 -14.5l-5 -1q-4 -2 -10.5 -3.5t-16 -4.5t-21.5 -5.5t-25.5 -5t-30 -5t-33.5 -4.5t-36.5 -3t-38.5 -1q-234 0 -409 130.5t-238 351.5h-95q-13 0 -22.5 9.5t-9.5 22.5v113q0 13 9.5 22.5t22.5 9.5h66q-2 57 1 105h-67q-14 0 -23 9 t-9 23v114q0 14 9 23t23 9h98q67 210 243.5 338t400.5 128q102 0 194 -23q11 -3 20 -15q6 -11 3 -24l-43 -159q-3 -13 -14 -19.5t-24 -2.5l-4 1q-4 1 -11.5 2.5l-17.5 3.5t-22.5 3.5t-26 3t-29 2.5t-29.5 1q-126 0 -226 -64t-150 -176h468q16 0 25 -12q10 -12 7 -26 l-24 -114q-5 -26 -32 -26h-488q-3 -37 0 -105h459q15 0 25 -12q9 -12 6 -27l-24 -112q-2 -11 -11 -18.5t-20 -7.5h-387q48 -117 149.5 -185.5t228.5 -68.5q18 0 36 1.5t33.5 3.5t29.5 4.5t24.5 5t18.5 4.5l12 3l5 2q13 5 26 -2q12 -7 15 -21z" /> +<glyph unicode="" horiz-adv-x="1024" d="M1020 399v-367q0 -14 -9 -23t-23 -9h-956q-14 0 -23 9t-9 23v150q0 13 9.5 22.5t22.5 9.5h97v383h-95q-14 0 -23 9.5t-9 22.5v131q0 14 9 23t23 9h95v223q0 171 123.5 282t314.5 111q185 0 335 -125q9 -8 10 -20.5t-7 -22.5l-103 -127q-9 -11 -22 -12q-13 -2 -23 7 q-5 5 -26 19t-69 32t-93 18q-85 0 -137 -47t-52 -123v-215h305q13 0 22.5 -9t9.5 -23v-131q0 -13 -9.5 -22.5t-22.5 -9.5h-305v-379h414v181q0 13 9 22.5t23 9.5h162q14 0 23 -9.5t9 -22.5z" /> +<glyph unicode="" horiz-adv-x="1024" d="M978 351q0 -153 -99.5 -263.5t-258.5 -136.5v-175q0 -14 -9 -23t-23 -9h-135q-13 0 -22.5 9.5t-9.5 22.5v175q-66 9 -127.5 31t-101.5 44.5t-74 48t-46.5 37.5t-17.5 18q-17 21 -2 41l103 135q7 10 23 12q15 2 24 -9l2 -2q113 -99 243 -125q37 -8 74 -8q81 0 142.5 43 t61.5 122q0 28 -15 53t-33.5 42t-58.5 37.5t-66 32t-80 32.5q-39 16 -61.5 25t-61.5 26.5t-62.5 31t-56.5 35.5t-53.5 42.5t-43.5 49t-35.5 58t-21 66.5t-8.5 78q0 138 98 242t255 134v180q0 13 9.5 22.5t22.5 9.5h135q14 0 23 -9t9 -23v-176q57 -6 110.5 -23t87 -33.5 t63.5 -37.5t39 -29t15 -14q17 -18 5 -38l-81 -146q-8 -15 -23 -16q-14 -3 -27 7q-3 3 -14.5 12t-39 26.5t-58.5 32t-74.5 26t-85.5 11.5q-95 0 -155 -43t-60 -111q0 -26 8.5 -48t29.5 -41.5t39.5 -33t56 -31t60.5 -27t70 -27.5q53 -20 81 -31.5t76 -35t75.5 -42.5t62 -50 t53 -63.5t31.5 -76.5t13 -94z" /> +<glyph unicode="" horiz-adv-x="898" d="M898 1066v-102q0 -14 -9 -23t-23 -9h-168q-23 -144 -129 -234t-276 -110q167 -178 459 -536q14 -16 4 -34q-8 -18 -29 -18h-195q-16 0 -25 12q-306 367 -498 571q-9 9 -9 22v127q0 13 9.5 22.5t22.5 9.5h112q132 0 212.5 43t102.5 125h-427q-14 0 -23 9t-9 23v102 q0 14 9 23t23 9h413q-57 113 -268 113h-145q-13 0 -22.5 9.5t-9.5 22.5v133q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-102q0 -14 -9 -23t-23 -9h-233q47 -61 64 -144h171q14 0 23 -9t9 -23z" /> +<glyph unicode="" horiz-adv-x="1027" d="M603 0h-172q-13 0 -22.5 9t-9.5 23v330h-288q-13 0 -22.5 9t-9.5 23v103q0 13 9.5 22.5t22.5 9.5h288v85h-288q-13 0 -22.5 9t-9.5 23v104q0 13 9.5 22.5t22.5 9.5h214l-321 578q-8 16 0 32q10 16 28 16h194q19 0 29 -18l215 -425q19 -38 56 -125q10 24 30.5 68t27.5 61 l191 420q8 19 29 19h191q17 0 27 -16q9 -14 1 -31l-313 -579h215q13 0 22.5 -9.5t9.5 -22.5v-104q0 -14 -9.5 -23t-22.5 -9h-290v-85h290q13 0 22.5 -9.5t9.5 -22.5v-103q0 -14 -9.5 -23t-22.5 -9h-290v-330q0 -13 -9.5 -22.5t-22.5 -9.5z" /> +<glyph unicode="" horiz-adv-x="1280" d="M1043 971q0 100 -65 162t-171 62h-320v-448h320q106 0 171 62t65 162zM1280 971q0 -193 -126.5 -315t-326.5 -122h-340v-118h505q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-505v-192q0 -14 -9.5 -23t-22.5 -9h-167q-14 0 -23 9t-9 23v192h-224q-14 0 -23 9t-9 23v128 q0 14 9 23t23 9h224v118h-224q-14 0 -23 9t-9 23v149q0 13 9 22.5t23 9.5h224v629q0 14 9 23t23 9h539q200 0 326.5 -122t126.5 -315z" /> +<glyph unicode="" horiz-adv-x="1792" d="M514 341l81 299h-159l75 -300q1 -1 1 -3t1 -3q0 1 0.5 3.5t0.5 3.5zM630 768l35 128h-292l32 -128h225zM822 768h139l-35 128h-70zM1271 340l78 300h-162l81 -299q0 -1 0.5 -3.5t1.5 -3.5q0 1 0.5 3t0.5 3zM1382 768l33 128h-297l34 -128h230zM1792 736v-64q0 -14 -9 -23 t-23 -9h-213l-164 -616q-7 -24 -31 -24h-159q-24 0 -31 24l-166 616h-209l-167 -616q-7 -24 -31 -24h-159q-11 0 -19.5 7t-10.5 17l-160 616h-208q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h175l-33 128h-142q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h109l-89 344q-5 15 5 28 q10 12 26 12h137q26 0 31 -24l90 -360h359l97 360q7 24 31 24h126q24 0 31 -24l98 -360h365l93 360q5 24 31 24h137q16 0 26 -12q10 -13 5 -28l-91 -344h111q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-145l-34 -128h179q14 0 23 -9t9 -23z" /> +<glyph unicode="" horiz-adv-x="1280" d="M1167 896q18 -182 -131 -258q117 -28 175 -103t45 -214q-7 -71 -32.5 -125t-64.5 -89t-97 -58.5t-121.5 -34.5t-145.5 -15v-255h-154v251q-80 0 -122 1v-252h-154v255q-18 0 -54 0.5t-55 0.5h-200l31 183h111q50 0 58 51v402h16q-6 1 -16 1v287q-13 68 -89 68h-111v164 l212 -1q64 0 97 1v252h154v-247q82 2 122 2v245h154v-252q79 -7 140 -22.5t113 -45t82.5 -78t36.5 -114.5zM952 351q0 36 -15 64t-37 46t-57.5 30.5t-65.5 18.5t-74 9t-69 3t-64.5 -1t-47.5 -1v-338q8 0 37 -0.5t48 -0.5t53 1.5t58.5 4t57 8.5t55.5 14t47.5 21t39.5 30 t24.5 40t9.5 51zM881 827q0 33 -12.5 58.5t-30.5 42t-48 28t-55 16.5t-61.5 8t-58 2.5t-54 -1t-39.5 -0.5v-307q5 0 34.5 -0.5t46.5 0t50 2t55 5.5t51.5 11t48.5 18.5t37 27t27 38.5t9 51z" /> +<glyph unicode="" d="M1024 1024v472q22 -14 36 -28l408 -408q14 -14 28 -36h-472zM896 992q0 -40 28 -68t68 -28h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h800v-544z" /> +<glyph unicode="" d="M1468 1060q14 -14 28 -36h-472v472q22 -14 36 -28zM992 896h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h800v-544q0 -40 28 -68t68 -28zM1152 160v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704 q14 0 23 9t9 23zM1152 416v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1152 672v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1191 1128h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1572 -23 v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -11v-2l14 2q9 2 30 2h248v119h121zM1661 874v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162 l230 -662h70z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1191 104h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1661 -150 v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162l230 -662h70zM1572 1001v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -10v-3l14 3q9 1 30 1h248 v119h121z" /> +<glyph unicode="" horiz-adv-x="1792" d="M736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1792 -32v-192q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832 q14 0 23 -9t9 -23zM1600 480v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1408 992v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1216 1504v-192q0 -14 -9 -23t-23 -9h-256 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1216 -32v-192q0 -14 -9 -23t-23 -9h-256q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192 q14 0 23 -9t9 -23zM1408 480v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1600 992v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1792 1504v-192q0 -14 -9 -23t-23 -9h-832 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832q14 0 23 -9t9 -23z" /> +<glyph unicode="" d="M1346 223q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23 zM1486 165q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5 t82 -252.5zM1456 882v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165z" /> +<glyph unicode="" d="M1346 1247q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9 t9 -23zM1456 -142v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165zM1486 1189q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13 q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5t82 -252.5z" /> +<glyph unicode="" horiz-adv-x="1664" d="M256 192q0 26 -19 45t-45 19q-27 0 -45.5 -19t-18.5 -45q0 -27 18.5 -45.5t45.5 -18.5q26 0 45 18.5t19 45.5zM416 704v-640q0 -26 -19 -45t-45 -19h-288q-26 0 -45 19t-19 45v640q0 26 19 45t45 19h288q26 0 45 -19t19 -45zM1600 704q0 -86 -55 -149q15 -44 15 -76 q3 -76 -43 -137q17 -56 0 -117q-15 -57 -54 -94q9 -112 -49 -181q-64 -76 -197 -78h-36h-76h-17q-66 0 -144 15.5t-121.5 29t-120.5 39.5q-123 43 -158 44q-26 1 -45 19.5t-19 44.5v641q0 25 18 43.5t43 20.5q24 2 76 59t101 121q68 87 101 120q18 18 31 48t17.5 48.5 t13.5 60.5q7 39 12.5 61t19.5 52t34 50q19 19 45 19q46 0 82.5 -10.5t60 -26t40 -40.5t24 -45t12 -50t5 -45t0.5 -39q0 -38 -9.5 -76t-19 -60t-27.5 -56q-3 -6 -10 -18t-11 -22t-8 -24h277q78 0 135 -57t57 -135z" /> +<glyph unicode="" horiz-adv-x="1664" d="M256 960q0 -26 -19 -45t-45 -19q-27 0 -45.5 19t-18.5 45q0 27 18.5 45.5t45.5 18.5q26 0 45 -18.5t19 -45.5zM416 448v640q0 26 -19 45t-45 19h-288q-26 0 -45 -19t-19 -45v-640q0 -26 19 -45t45 -19h288q26 0 45 19t19 45zM1545 597q55 -61 55 -149q-1 -78 -57.5 -135 t-134.5 -57h-277q4 -14 8 -24t11 -22t10 -18q18 -37 27 -57t19 -58.5t10 -76.5q0 -24 -0.5 -39t-5 -45t-12 -50t-24 -45t-40 -40.5t-60 -26t-82.5 -10.5q-26 0 -45 19q-20 20 -34 50t-19.5 52t-12.5 61q-9 42 -13.5 60.5t-17.5 48.5t-31 48q-33 33 -101 120q-49 64 -101 121 t-76 59q-25 2 -43 20.5t-18 43.5v641q0 26 19 44.5t45 19.5q35 1 158 44q77 26 120.5 39.5t121.5 29t144 15.5h17h76h36q133 -2 197 -78q58 -69 49 -181q39 -37 54 -94q17 -61 0 -117q46 -61 43 -137q0 -32 -15 -76z" /> +<glyph unicode="" d="M919 233v157q0 50 -29 50q-17 0 -33 -16v-224q16 -16 33 -16q29 0 29 49zM1103 355h66v34q0 51 -33 51t-33 -51v-34zM532 621v-70h-80v-423h-74v423h-78v70h232zM733 495v-367h-67v40q-39 -45 -76 -45q-33 0 -42 28q-6 16 -6 54v290h66v-270q0 -24 1 -26q1 -15 15 -15 q20 0 42 31v280h67zM985 384v-146q0 -52 -7 -73q-12 -42 -53 -42q-35 0 -68 41v-36h-67v493h67v-161q32 40 68 40q41 0 53 -42q7 -21 7 -74zM1236 255v-9q0 -29 -2 -43q-3 -22 -15 -40q-27 -40 -80 -40q-52 0 -81 38q-21 27 -21 86v129q0 59 20 86q29 38 80 38t78 -38 q21 -28 21 -86v-76h-133v-65q0 -51 34 -51q24 0 30 26q0 1 0.5 7t0.5 16.5v21.5h68zM785 1079v-156q0 -51 -32 -51t-32 51v156q0 52 32 52t32 -52zM1318 366q0 177 -19 260q-10 44 -43 73.5t-76 34.5q-136 15 -412 15q-275 0 -411 -15q-44 -5 -76.5 -34.5t-42.5 -73.5 q-20 -87 -20 -260q0 -176 20 -260q10 -43 42.5 -73t75.5 -35q137 -15 412 -15t412 15q43 5 75.5 35t42.5 73q20 84 20 260zM563 1017l90 296h-75l-51 -195l-53 195h-78l24 -69t23 -69q35 -103 46 -158v-201h74v201zM852 936v130q0 58 -21 87q-29 38 -78 38q-51 0 -78 -38 q-21 -29 -21 -87v-130q0 -58 21 -87q27 -38 78 -38q49 0 78 38q21 27 21 87zM1033 816h67v370h-67v-283q-22 -31 -42 -31q-15 0 -16 16q-1 2 -1 26v272h-67v-293q0 -37 6 -55q11 -27 43 -27q36 0 77 45v-40zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" d="M971 292v-211q0 -67 -39 -67q-23 0 -45 22v301q22 22 45 22q39 0 39 -67zM1309 291v-46h-90v46q0 68 45 68t45 -68zM343 509h107v94h-312v-94h105v-569h100v569zM631 -60h89v494h-89v-378q-30 -42 -57 -42q-18 0 -21 21q-1 3 -1 35v364h-89v-391q0 -49 8 -73 q12 -37 58 -37q48 0 102 61v-54zM1060 88v197q0 73 -9 99q-17 56 -71 56q-50 0 -93 -54v217h-89v-663h89v48q45 -55 93 -55q54 0 71 55q9 27 9 100zM1398 98v13h-91q0 -51 -2 -61q-7 -36 -40 -36q-46 0 -46 69v87h179v103q0 79 -27 116q-39 51 -106 51q-68 0 -107 -51 q-28 -37 -28 -116v-173q0 -79 29 -116q39 -51 108 -51q72 0 108 53q18 27 21 54q2 9 2 58zM790 1011v210q0 69 -43 69t-43 -69v-210q0 -70 43 -70t43 70zM1509 260q0 -234 -26 -350q-14 -59 -58 -99t-102 -46q-184 -21 -555 -21t-555 21q-58 6 -102.5 46t-57.5 99 q-26 112 -26 350q0 234 26 350q14 59 58 99t103 47q183 20 554 20t555 -20q58 -7 102.5 -47t57.5 -99q26 -112 26 -350zM511 1536h102l-121 -399v-271h-100v271q-14 74 -61 212q-37 103 -65 187h106l71 -263zM881 1203v-175q0 -81 -28 -118q-37 -51 -106 -51q-67 0 -105 51 q-28 38 -28 118v175q0 80 28 117q38 51 105 51q69 0 106 -51q28 -37 28 -117zM1216 1365v-499h-91v55q-53 -62 -103 -62q-46 0 -59 37q-8 24 -8 75v394h91v-367q0 -33 1 -35q3 -22 21 -22q27 0 57 43v381h91z" /> +<glyph unicode="" horiz-adv-x="1408" d="M597 869q-10 -18 -257 -456q-27 -46 -65 -46h-239q-21 0 -31 17t0 36l253 448q1 0 0 1l-161 279q-12 22 -1 37q9 15 32 15h239q40 0 66 -45zM1403 1511q11 -16 0 -37l-528 -934v-1l336 -615q11 -20 1 -37q-10 -15 -32 -15h-239q-42 0 -66 45l-339 622q18 32 531 942 q25 45 64 45h241q22 0 31 -15z" /> +<glyph unicode="" d="M685 771q0 1 -126 222q-21 34 -52 34h-184q-18 0 -26 -11q-7 -12 1 -29l125 -216v-1l-196 -346q-9 -14 0 -28q8 -13 24 -13h185q31 0 50 36zM1309 1268q-7 12 -24 12h-187q-30 0 -49 -35l-411 -729q1 -2 262 -481q20 -35 52 -35h184q18 0 25 12q8 13 -1 28l-260 476v1 l409 723q8 16 0 28zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1280 640q0 37 -30 54l-512 320q-31 20 -65 2q-33 -18 -33 -56v-640q0 -38 33 -56q16 -8 31 -8q20 0 34 10l512 320q30 17 30 54zM1792 640q0 -96 -1 -150t-8.5 -136.5t-22.5 -147.5q-16 -73 -69 -123t-124 -58q-222 -25 -671 -25t-671 25q-71 8 -124.5 58t-69.5 123 q-14 65 -21.5 147.5t-8.5 136.5t-1 150t1 150t8.5 136.5t22.5 147.5q16 73 69 123t124 58q222 25 671 25t671 -25q71 -8 124.5 -58t69.5 -123q14 -65 21.5 -147.5t8.5 -136.5t1 -150z" /> +<glyph unicode="" horiz-adv-x="1792" d="M402 829l494 -305l-342 -285l-490 319zM1388 274v-108l-490 -293v-1l-1 1l-1 -1v1l-489 293v108l147 -96l342 284v2l1 -1l1 1v-2l343 -284zM554 1418l342 -285l-494 -304l-338 270zM1390 829l338 -271l-489 -319l-343 285zM1239 1418l489 -319l-338 -270l-494 304z" /> +<glyph unicode="" horiz-adv-x="1408" d="M928 135v-151l-707 -1v151zM1169 481v-701l-1 -35v-1h-1132l-35 1h-1v736h121v-618h928v618h120zM241 393l704 -65l-13 -150l-705 65zM309 709l683 -183l-39 -146l-683 183zM472 1058l609 -360l-77 -130l-609 360zM832 1389l398 -585l-124 -85l-399 584zM1285 1536 l121 -697l-149 -26l-121 697z" /> +<glyph unicode="" d="M1362 110v648h-135q20 -63 20 -131q0 -126 -64 -232.5t-174 -168.5t-240 -62q-197 0 -337 135.5t-140 327.5q0 68 20 131h-141v-648q0 -26 17.5 -43.5t43.5 -17.5h1069q25 0 43 17.5t18 43.5zM1078 643q0 124 -90.5 211.5t-218.5 87.5q-127 0 -217.5 -87.5t-90.5 -211.5 t90.5 -211.5t217.5 -87.5q128 0 218.5 87.5t90.5 211.5zM1362 1003v165q0 28 -20 48.5t-49 20.5h-174q-29 0 -49 -20.5t-20 -48.5v-165q0 -29 20 -49t49 -20h174q29 0 49 20t20 49zM1536 1211v-1142q0 -81 -58 -139t-139 -58h-1142q-81 0 -139 58t-58 139v1142q0 81 58 139 t139 58h1142q81 0 139 -58t58 -139z" /> +<glyph unicode="" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM698 640q0 88 -62 150t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150zM1262 640q0 88 -62 150 t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150z" /> +<glyph unicode="" d="M768 914l201 -306h-402zM1133 384h94l-459 691l-459 -691h94l104 160h522zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" horiz-adv-x="1408" d="M815 677q8 -63 -50.5 -101t-111.5 -6q-39 17 -53.5 58t-0.5 82t52 58q36 18 72.5 12t64 -35.5t27.5 -67.5zM926 698q-14 107 -113 164t-197 13q-63 -28 -100.5 -88.5t-34.5 -129.5q4 -91 77.5 -155t165.5 -56q91 8 152 84t50 168zM1165 1240q-20 27 -56 44.5t-58 22 t-71 12.5q-291 47 -566 -2q-43 -7 -66 -12t-55 -22t-50 -43q30 -28 76 -45.5t73.5 -22t87.5 -11.5q228 -29 448 -1q63 8 89.5 12t72.5 21.5t75 46.5zM1222 205q-8 -26 -15.5 -76.5t-14 -84t-28.5 -70t-58 -56.5q-86 -48 -189.5 -71.5t-202 -22t-201.5 18.5q-46 8 -81.5 18 t-76.5 27t-73 43.5t-52 61.5q-25 96 -57 292l6 16l18 9q223 -148 506.5 -148t507.5 148q21 -6 24 -23t-5 -45t-8 -37zM1403 1166q-26 -167 -111 -655q-5 -30 -27 -56t-43.5 -40t-54.5 -31q-252 -126 -610 -88q-248 27 -394 139q-15 12 -25.5 26.5t-17 35t-9 34t-6 39.5 t-5.5 35q-9 50 -26.5 150t-28 161.5t-23.5 147.5t-22 158q3 26 17.5 48.5t31.5 37.5t45 30t46 22.5t48 18.5q125 46 313 64q379 37 676 -50q155 -46 215 -122q16 -20 16.5 -51t-5.5 -54z" /> +<glyph unicode="" d="M848 666q0 43 -41 66t-77 1q-43 -20 -42.5 -72.5t43.5 -70.5q39 -23 81 4t36 72zM928 682q8 -66 -36 -121t-110 -61t-119 40t-56 113q-2 49 25.5 93t72.5 64q70 31 141.5 -10t81.5 -118zM1100 1073q-20 -21 -53.5 -34t-53 -16t-63.5 -8q-155 -20 -324 0q-44 6 -63 9.5 t-52.5 16t-54.5 32.5q13 19 36 31t40 15.5t47 8.5q198 35 408 1q33 -5 51 -8.5t43 -16t39 -31.5zM1142 327q0 7 5.5 26.5t3 32t-17.5 16.5q-161 -106 -365 -106t-366 106l-12 -6l-5 -12q26 -154 41 -210q47 -81 204 -108q249 -46 428 53q34 19 49 51.5t22.5 85.5t12.5 71z M1272 1020q9 53 -8 75q-43 55 -155 88q-216 63 -487 36q-132 -12 -226 -46q-38 -15 -59.5 -25t-47 -34t-29.5 -54q8 -68 19 -138t29 -171t24 -137q1 -5 5 -31t7 -36t12 -27t22 -28q105 -80 284 -100q259 -28 440 63q24 13 39.5 23t31 29t19.5 40q48 267 80 473zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" horiz-adv-x="1024" d="M944 207l80 -237q-23 -35 -111 -66t-177 -32q-104 -2 -190.5 26t-142.5 74t-95 106t-55.5 120t-16.5 118v544h-168v215q72 26 129 69.5t91 90t58 102t34 99t15 88.5q1 5 4.5 8.5t7.5 3.5h244v-424h333v-252h-334v-518q0 -30 6.5 -56t22.5 -52.5t49.5 -41.5t81.5 -14 q78 2 134 29z" /> +<glyph unicode="" d="M1136 75l-62 183q-44 -22 -103 -22q-36 -1 -62 10.5t-38.5 31.5t-17.5 40.5t-5 43.5v398h257v194h-256v326h-188q-8 0 -9 -10q-5 -44 -17.5 -87t-39 -95t-77 -95t-118.5 -68v-165h130v-418q0 -57 21.5 -115t65 -111t121 -85.5t176.5 -30.5q69 1 136.5 25t85.5 50z M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" horiz-adv-x="768" d="M765 237q8 -19 -5 -35l-350 -384q-10 -10 -23 -10q-14 0 -24 10l-355 384q-13 16 -5 35q9 19 29 19h224v1248q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1248h224q21 0 29 -19z" /> +<glyph unicode="" horiz-adv-x="768" d="M765 1043q-9 -19 -29 -19h-224v-1248q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1248h-224q-21 0 -29 19t5 35l350 384q10 10 23 10q14 0 24 -10l355 -384q13 -16 5 -35z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1792 736v-192q0 -14 -9 -23t-23 -9h-1248v-224q0 -21 -19 -29t-35 5l-384 350q-10 10 -10 23q0 14 10 24l384 354q16 14 35 6q19 -9 19 -29v-224h1248q14 0 23 -9t9 -23z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1728 643q0 -14 -10 -24l-384 -354q-16 -14 -35 -6q-19 9 -19 29v224h-1248q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h1248v224q0 21 19 29t35 -5l384 -350q10 -10 10 -23z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1393 321q-39 -125 -123 -250q-129 -196 -257 -196q-49 0 -140 32q-86 32 -151 32q-61 0 -142 -33q-81 -34 -132 -34q-152 0 -301 259q-147 261 -147 503q0 228 113 374q112 144 284 144q72 0 177 -30q104 -30 138 -30q45 0 143 34q102 34 173 34q119 0 213 -65 q52 -36 104 -100q-79 -67 -114 -118q-65 -94 -65 -207q0 -124 69 -223t158 -126zM1017 1494q0 -61 -29 -136q-30 -75 -93 -138q-54 -54 -108 -72q-37 -11 -104 -17q3 149 78 257q74 107 250 148q1 -3 2.5 -11t2.5 -11q0 -4 0.5 -10t0.5 -10z" /> +<glyph unicode="" horiz-adv-x="1664" d="M682 530v-651l-682 94v557h682zM682 1273v-659h-682v565zM1664 530v-786l-907 125v661h907zM1664 1408v-794h-907v669z" /> +<glyph unicode="" horiz-adv-x="1408" d="M493 1053q16 0 27.5 11.5t11.5 27.5t-11.5 27.5t-27.5 11.5t-27 -11.5t-11 -27.5t11 -27.5t27 -11.5zM915 1053q16 0 27 11.5t11 27.5t-11 27.5t-27 11.5t-27.5 -11.5t-11.5 -27.5t11.5 -27.5t27.5 -11.5zM103 869q42 0 72 -30t30 -72v-430q0 -43 -29.5 -73t-72.5 -30 t-73 30t-30 73v430q0 42 30 72t73 30zM1163 850v-666q0 -46 -32 -78t-77 -32h-75v-227q0 -43 -30 -73t-73 -30t-73 30t-30 73v227h-138v-227q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73l-1 227h-74q-46 0 -78 32t-32 78v666h918zM931 1255q107 -55 171 -153.5t64 -215.5 h-925q0 117 64 215.5t172 153.5l-71 131q-7 13 5 20q13 6 20 -6l72 -132q95 42 201 42t201 -42l72 132q7 12 20 6q12 -7 5 -20zM1408 767v-430q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73v430q0 43 30 72.5t72 29.5q43 0 73 -29.5t30 -72.5z" /> +<glyph unicode="" d="M663 1125q-11 -1 -15.5 -10.5t-8.5 -9.5q-5 -1 -5 5q0 12 19 15h10zM750 1111q-4 -1 -11.5 6.5t-17.5 4.5q24 11 32 -2q3 -6 -3 -9zM399 684q-4 1 -6 -3t-4.5 -12.5t-5.5 -13.5t-10 -13q-7 -10 -1 -12q4 -1 12.5 7t12.5 18q1 3 2 7t2 6t1.5 4.5t0.5 4v3t-1 2.5t-3 2z M1254 325q0 18 -55 42q4 15 7.5 27.5t5 26t3 21.5t0.5 22.5t-1 19.5t-3.5 22t-4 20.5t-5 25t-5.5 26.5q-10 48 -47 103t-72 75q24 -20 57 -83q87 -162 54 -278q-11 -40 -50 -42q-31 -4 -38.5 18.5t-8 83.5t-11.5 107q-9 39 -19.5 69t-19.5 45.5t-15.5 24.5t-13 15t-7.5 7 q-14 62 -31 103t-29.5 56t-23.5 33t-15 40q-4 21 6 53.5t4.5 49.5t-44.5 25q-15 3 -44.5 18t-35.5 16q-8 1 -11 26t8 51t36 27q37 3 51 -30t4 -58q-11 -19 -2 -26.5t30 -0.5q13 4 13 36v37q-5 30 -13.5 50t-21 30.5t-23.5 15t-27 7.5q-107 -8 -89 -134q0 -15 -1 -15 q-9 9 -29.5 10.5t-33 -0.5t-15.5 5q1 57 -16 90t-45 34q-27 1 -41.5 -27.5t-16.5 -59.5q-1 -15 3.5 -37t13 -37.5t15.5 -13.5q10 3 16 14q4 9 -7 8q-7 0 -15.5 14.5t-9.5 33.5q-1 22 9 37t34 14q17 0 27 -21t9.5 -39t-1.5 -22q-22 -15 -31 -29q-8 -12 -27.5 -23.5 t-20.5 -12.5q-13 -14 -15.5 -27t7.5 -18q14 -8 25 -19.5t16 -19t18.5 -13t35.5 -6.5q47 -2 102 15q2 1 23 7t34.5 10.5t29.5 13t21 17.5q9 14 20 8q5 -3 6.5 -8.5t-3 -12t-16.5 -9.5q-20 -6 -56.5 -21.5t-45.5 -19.5q-44 -19 -70 -23q-25 -5 -79 2q-10 2 -9 -2t17 -19 q25 -23 67 -22q17 1 36 7t36 14t33.5 17.5t30 17t24.5 12t17.5 2.5t8.5 -11q0 -2 -1 -4.5t-4 -5t-6 -4.5t-8.5 -5t-9 -4.5t-10 -5t-9.5 -4.5q-28 -14 -67.5 -44t-66.5 -43t-49 -1q-21 11 -63 73q-22 31 -25 22q-1 -3 -1 -10q0 -25 -15 -56.5t-29.5 -55.5t-21 -58t11.5 -63 q-23 -6 -62.5 -90t-47.5 -141q-2 -18 -1.5 -69t-5.5 -59q-8 -24 -29 -3q-32 31 -36 94q-2 28 4 56q4 19 -1 18l-4 -5q-36 -65 10 -166q5 -12 25 -28t24 -20q20 -23 104 -90.5t93 -76.5q16 -15 17.5 -38t-14 -43t-45.5 -23q8 -15 29 -44.5t28 -54t7 -70.5q46 24 7 92 q-4 8 -10.5 16t-9.5 12t-2 6q3 5 13 9.5t20 -2.5q46 -52 166 -36q133 15 177 87q23 38 34 30q12 -6 10 -52q-1 -25 -23 -92q-9 -23 -6 -37.5t24 -15.5q3 19 14.5 77t13.5 90q2 21 -6.5 73.5t-7.5 97t23 70.5q15 18 51 18q1 37 34.5 53t72.5 10.5t60 -22.5zM626 1152 q3 17 -2.5 30t-11.5 15q-9 2 -9 -7q2 -5 5 -6q10 0 7 -15q-3 -20 8 -20q3 0 3 3zM1045 955q-2 8 -6.5 11.5t-13 5t-14.5 5.5q-5 3 -9.5 8t-7 8t-5.5 6.5t-4 4t-4 -1.5q-14 -16 7 -43.5t39 -31.5q9 -1 14.5 8t3.5 20zM867 1168q0 11 -5 19.5t-11 12.5t-9 3q-14 -1 -7 -7l4 -2 q14 -4 18 -31q0 -3 8 2zM921 1401q0 2 -2.5 5t-9 7t-9.5 6q-15 15 -24 15q-9 -1 -11.5 -7.5t-1 -13t-0.5 -12.5q-1 -4 -6 -10.5t-6 -9t3 -8.5q4 -3 8 0t11 9t15 9q1 1 9 1t15 2t9 7zM1486 60q20 -12 31 -24.5t12 -24t-2.5 -22.5t-15.5 -22t-23.5 -19.5t-30 -18.5 t-31.5 -16.5t-32 -15.5t-27 -13q-38 -19 -85.5 -56t-75.5 -64q-17 -16 -68 -19.5t-89 14.5q-18 9 -29.5 23.5t-16.5 25.5t-22 19.5t-47 9.5q-44 1 -130 1q-19 0 -57 -1.5t-58 -2.5q-44 -1 -79.5 -15t-53.5 -30t-43.5 -28.5t-53.5 -11.5q-29 1 -111 31t-146 43q-19 4 -51 9.5 t-50 9t-39.5 9.5t-33.5 14.5t-17 19.5q-10 23 7 66.5t18 54.5q1 16 -4 40t-10 42.5t-4.5 36.5t10.5 27q14 12 57 14t60 12q30 18 42 35t12 51q21 -73 -32 -106q-32 -20 -83 -15q-34 3 -43 -10q-13 -15 5 -57q2 -6 8 -18t8.5 -18t4.5 -17t1 -22q0 -15 -17 -49t-14 -48 q3 -17 37 -26q20 -6 84.5 -18.5t99.5 -20.5q24 -6 74 -22t82.5 -23t55.5 -4q43 6 64.5 28t23 48t-7.5 58.5t-19 52t-20 36.5q-121 190 -169 242q-68 74 -113 40q-11 -9 -15 15q-3 16 -2 38q1 29 10 52t24 47t22 42q8 21 26.5 72t29.5 78t30 61t39 54q110 143 124 195 q-12 112 -16 310q-2 90 24 151.5t106 104.5q39 21 104 21q53 1 106 -13.5t89 -41.5q57 -42 91.5 -121.5t29.5 -147.5q-5 -95 30 -214q34 -113 133 -218q55 -59 99.5 -163t59.5 -191q8 -49 5 -84.5t-12 -55.5t-20 -22q-10 -2 -23.5 -19t-27 -35.5t-40.5 -33.5t-61 -14 q-18 1 -31.5 5t-22.5 13.5t-13.5 15.5t-11.5 20.5t-9 19.5q-22 37 -41 30t-28 -49t7 -97q20 -70 1 -195q-10 -65 18 -100.5t73 -33t85 35.5q59 49 89.5 66.5t103.5 42.5q53 18 77 36.5t18.5 34.5t-25 28.5t-51.5 23.5q-33 11 -49.5 48t-15 72.5t15.5 47.5q1 -31 8 -56.5 t14.5 -40.5t20.5 -28.5t21 -19t21.5 -13t16.5 -9.5z" /> +<glyph unicode="" d="M1024 36q-42 241 -140 498h-2l-2 -1q-16 -6 -43 -16.5t-101 -49t-137 -82t-131 -114.5t-103 -148l-15 11q184 -150 418 -150q132 0 256 52zM839 643q-21 49 -53 111q-311 -93 -673 -93q-1 -7 -1 -21q0 -124 44 -236.5t124 -201.5q50 89 123.5 166.5t142.5 124.5t130.5 81 t99.5 48l37 13q4 1 13 3.5t13 4.5zM732 855q-120 213 -244 378q-138 -65 -234 -186t-128 -272q302 0 606 80zM1416 536q-210 60 -409 29q87 -239 128 -469q111 75 185 189.5t96 250.5zM611 1277q-1 0 -2 -1q1 1 2 1zM1201 1132q-185 164 -433 164q-76 0 -155 -19 q131 -170 246 -382q69 26 130 60.5t96.5 61.5t65.5 57t37.5 40.5zM1424 647q-3 232 -149 410l-1 -1q-9 -12 -19 -24.5t-43.5 -44.5t-71 -60.5t-100 -65t-131.5 -64.5q25 -53 44 -95q2 -6 6.5 -17.5t7.5 -16.5q36 5 74.5 7t73.5 2t69 -1.5t64 -4t56.5 -5.5t48 -6.5t36.5 -6 t25 -4.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1173 473q0 50 -19.5 91.5t-48.5 68.5t-73 49t-82.5 34t-87.5 23l-104 24q-30 7 -44 10.5t-35 11.5t-30 16t-16.5 21t-7.5 30q0 77 144 77q43 0 77 -12t54 -28.5t38 -33.5t40 -29t48 -12q47 0 75.5 32t28.5 77q0 55 -56 99.5t-142 67.5t-182 23q-68 0 -132 -15.5 t-119.5 -47t-89 -87t-33.5 -128.5q0 -61 19 -106.5t56 -75.5t80 -48.5t103 -32.5l146 -36q90 -22 112 -36q32 -20 32 -60q0 -39 -40 -64.5t-105 -25.5q-51 0 -91.5 16t-65 38.5t-45.5 45t-46 38.5t-54 16q-50 0 -75.5 -30t-25.5 -75q0 -92 122 -157.5t291 -65.5 q73 0 140 18.5t122.5 53.5t88.5 93.5t33 131.5zM1536 256q0 -159 -112.5 -271.5t-271.5 -112.5q-130 0 -234 80q-77 -16 -150 -16q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5q0 73 16 150q-80 104 -80 234q0 159 112.5 271.5t271.5 112.5q130 0 234 -80 q77 16 150 16q143 0 273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -73 -16 -150q80 -104 80 -234z" /> +<glyph unicode="" horiz-adv-x="1280" d="M1000 1102l37 194q5 23 -9 40t-35 17h-712q-23 0 -38.5 -17t-15.5 -37v-1101q0 -7 6 -1l291 352q23 26 38 33.5t48 7.5h239q22 0 37 14.5t18 29.5q24 130 37 191q4 21 -11.5 40t-36.5 19h-294q-29 0 -48 19t-19 48v42q0 29 19 47.5t48 18.5h346q18 0 35 13.5t20 29.5z M1227 1324q-15 -73 -53.5 -266.5t-69.5 -350t-35 -173.5q-6 -22 -9 -32.5t-14 -32.5t-24.5 -33t-38.5 -21t-58 -10h-271q-13 0 -22 -10q-8 -9 -426 -494q-22 -25 -58.5 -28.5t-48.5 5.5q-55 22 -55 98v1410q0 55 38 102.5t120 47.5h888q95 0 127 -53t10 -159zM1227 1324 l-158 -790q4 17 35 173.5t69.5 350t53.5 266.5z" /> +<glyph unicode="" d="M704 192v1024q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-1024q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1376 576v640q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-640q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408 q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1280" d="M1280 480q0 -40 -28 -68t-68 -28q-51 0 -80 43l-227 341h-45v-132l247 -411q9 -15 9 -33q0 -26 -19 -45t-45 -19h-192v-272q0 -46 -33 -79t-79 -33h-160q-46 0 -79 33t-33 79v272h-192q-26 0 -45 19t-19 45q0 18 9 33l247 411v132h-45l-227 -341q-29 -43 -80 -43 q-40 0 -68 28t-28 68q0 29 16 53l256 384q73 107 176 107h384q103 0 176 -107l256 -384q16 -24 16 -53zM864 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" /> +<glyph unicode="" horiz-adv-x="1024" d="M1024 832v-416q0 -40 -28 -68t-68 -28t-68 28t-28 68v352h-64v-912q0 -46 -33 -79t-79 -33t-79 33t-33 79v464h-64v-464q0 -46 -33 -79t-79 -33t-79 33t-33 79v912h-64v-352q0 -40 -28 -68t-68 -28t-68 28t-28 68v416q0 80 56 136t136 56h640q80 0 136 -56t56 -136z M736 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" /> +<glyph unicode="" d="M773 234l350 473q16 22 24.5 59t-6 85t-61.5 79q-40 26 -83 25.5t-73.5 -17.5t-54.5 -45q-36 -40 -96 -40q-59 0 -95 40q-24 28 -54.5 45t-73.5 17.5t-84 -25.5q-46 -31 -60.5 -79t-6 -85t24.5 -59zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1472 640q0 117 -45.5 223.5t-123 184t-184 123t-223.5 45.5t-223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5t45.5 -223.5t123 -184t184 -123t223.5 -45.5t223.5 45.5t184 123t123 184t45.5 223.5zM1748 363q-4 -15 -20 -20l-292 -96v-306q0 -16 -13 -26q-15 -10 -29 -4 l-292 94l-180 -248q-10 -13 -26 -13t-26 13l-180 248l-292 -94q-14 -6 -29 4q-13 10 -13 26v306l-292 96q-16 5 -20 20q-5 17 4 29l180 248l-180 248q-9 13 -4 29q4 15 20 20l292 96v306q0 16 13 26q15 10 29 4l292 -94l180 248q9 12 26 12t26 -12l180 -248l292 94 q14 6 29 -4q13 -10 13 -26v-306l292 -96q16 -5 20 -20q5 -16 -4 -29l-180 -248l180 -248q9 -12 4 -29z" /> +<glyph unicode="" d="M1262 233q-54 -9 -110 -9q-182 0 -337 90t-245 245t-90 337q0 192 104 357q-201 -60 -328.5 -229t-127.5 -384q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51q144 0 273.5 61.5t220.5 171.5zM1465 318q-94 -203 -283.5 -324.5t-413.5 -121.5q-156 0 -298 61 t-245 164t-164 245t-61 298q0 153 57.5 292.5t156 241.5t235.5 164.5t290 68.5q44 2 61 -39q18 -41 -15 -72q-86 -78 -131.5 -181.5t-45.5 -218.5q0 -148 73 -273t198 -198t273 -73q118 0 228 51q41 18 72 -13q14 -14 17.5 -34t-4.5 -38z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1088 704q0 26 -19 45t-45 19h-256q-26 0 -45 -19t-19 -45t19 -45t45 -19h256q26 0 45 19t19 45zM1664 896v-960q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v960q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1728 1344v-256q0 -26 -19 -45t-45 -19h-1536 q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1536q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1632 576q0 -26 -19 -45t-45 -19h-224q0 -171 -67 -290l208 -209q19 -19 19 -45t-19 -45q-18 -19 -45 -19t-45 19l-198 197q-5 -5 -15 -13t-42 -28.5t-65 -36.5t-82 -29t-97 -13v896h-128v-896q-51 0 -101.5 13.5t-87 33t-66 39t-43.5 32.5l-15 14l-183 -207 q-20 -21 -48 -21q-24 0 -43 16q-19 18 -20.5 44.5t15.5 46.5l202 227q-58 114 -58 274h-224q-26 0 -45 19t-19 45t19 45t45 19h224v294l-173 173q-19 19 -19 45t19 45t45 19t45 -19l173 -173h844l173 173q19 19 45 19t45 -19t19 -45t-19 -45l-173 -173v-294h224q26 0 45 -19 t19 -45zM1152 1152h-640q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5z" /> +<glyph unicode="" horiz-adv-x="1920" d="M1917 1016q23 -64 -150 -294q-24 -32 -65 -85q-78 -100 -90 -131q-17 -41 14 -81q17 -21 81 -82h1l1 -1l1 -1l2 -2q141 -131 191 -221q3 -5 6.5 -12.5t7 -26.5t-0.5 -34t-25 -27.5t-59 -12.5l-256 -4q-24 -5 -56 5t-52 22l-20 12q-30 21 -70 64t-68.5 77.5t-61 58 t-56.5 15.5q-3 -1 -8 -3.5t-17 -14.5t-21.5 -29.5t-17 -52t-6.5 -77.5q0 -15 -3.5 -27.5t-7.5 -18.5l-4 -5q-18 -19 -53 -22h-115q-71 -4 -146 16.5t-131.5 53t-103 66t-70.5 57.5l-25 24q-10 10 -27.5 30t-71.5 91t-106 151t-122.5 211t-130.5 272q-6 16 -6 27t3 16l4 6 q15 19 57 19l274 2q12 -2 23 -6.5t16 -8.5l5 -3q16 -11 24 -32q20 -50 46 -103.5t41 -81.5l16 -29q29 -60 56 -104t48.5 -68.5t41.5 -38.5t34 -14t27 5q2 1 5 5t12 22t13.5 47t9.5 81t0 125q-2 40 -9 73t-14 46l-6 12q-25 34 -85 43q-13 2 5 24q17 19 38 30q53 26 239 24 q82 -1 135 -13q20 -5 33.5 -13.5t20.5 -24t10.5 -32t3.5 -45.5t-1 -55t-2.5 -70.5t-1.5 -82.5q0 -11 -1 -42t-0.5 -48t3.5 -40.5t11.5 -39t22.5 -24.5q8 -2 17 -4t26 11t38 34.5t52 67t68 107.5q60 104 107 225q4 10 10 17.5t11 10.5l4 3l5 2.5t13 3t20 0.5l288 2 q39 5 64 -2.5t31 -16.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M675 252q21 34 11 69t-45 50q-34 14 -73 1t-60 -46q-22 -34 -13 -68.5t43 -50.5t74.5 -2.5t62.5 47.5zM769 373q8 13 3.5 26.5t-17.5 18.5q-14 5 -28.5 -0.5t-21.5 -18.5q-17 -31 13 -45q14 -5 29 0.5t22 18.5zM943 266q-45 -102 -158 -150t-224 -12 q-107 34 -147.5 126.5t6.5 187.5q47 93 151.5 139t210.5 19q111 -29 158.5 -119.5t2.5 -190.5zM1255 426q-9 96 -89 170t-208.5 109t-274.5 21q-223 -23 -369.5 -141.5t-132.5 -264.5q9 -96 89 -170t208.5 -109t274.5 -21q223 23 369.5 141.5t132.5 264.5zM1563 422 q0 -68 -37 -139.5t-109 -137t-168.5 -117.5t-226 -83t-270.5 -31t-275 33.5t-240.5 93t-171.5 151t-65 199.5q0 115 69.5 245t197.5 258q169 169 341.5 236t246.5 -7q65 -64 20 -209q-4 -14 -1 -20t10 -7t14.5 0.5t13.5 3.5l6 2q139 59 246 59t153 -61q45 -63 0 -178 q-2 -13 -4.5 -20t4.5 -12.5t12 -7.5t17 -6q57 -18 103 -47t80 -81.5t34 -116.5zM1489 1046q42 -47 54.5 -108.5t-6.5 -117.5q-8 -23 -29.5 -34t-44.5 -4q-23 8 -34 29.5t-4 44.5q20 63 -24 111t-107 35q-24 -5 -45 8t-25 37q-5 24 8 44.5t37 25.5q60 13 119 -5.5t101 -65.5z M1670 1209q87 -96 112.5 -222.5t-13.5 -241.5q-9 -27 -34 -40t-52 -4t-40 34t-5 52q28 82 10 172t-80 158q-62 69 -148 95.5t-173 8.5q-28 -6 -52 9.5t-30 43.5t9.5 51.5t43.5 29.5q123 26 244 -11.5t208 -134.5z" /> +<glyph unicode="" d="M1133 -34q-171 -94 -368 -94q-196 0 -367 94q138 87 235.5 211t131.5 268q35 -144 132.5 -268t235.5 -211zM638 1394v-485q0 -252 -126.5 -459.5t-330.5 -306.5q-181 215 -181 495q0 187 83.5 349.5t229.5 269.5t325 137zM1536 638q0 -280 -181 -495 q-204 99 -330.5 306.5t-126.5 459.5v485q179 -30 325 -137t229.5 -269.5t83.5 -349.5z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1402 433q-32 -80 -76 -138t-91 -88.5t-99 -46.5t-101.5 -14.5t-96.5 8.5t-86.5 22t-69.5 27.5t-46 22.5l-17 10q-113 -228 -289.5 -359.5t-384.5 -132.5q-19 0 -32 13t-13 32t13 31.5t32 12.5q173 1 322.5 107.5t251.5 294.5q-36 -14 -72 -23t-83 -13t-91 2.5t-93 28.5 t-92 59t-84.5 100t-74.5 146q114 47 214 57t167.5 -7.5t124.5 -56.5t88.5 -77t56.5 -82q53 131 79 291q-7 -1 -18 -2.5t-46.5 -2.5t-69.5 0.5t-81.5 10t-88.5 23t-84 42.5t-75 65t-54.5 94.5t-28.5 127.5q70 28 133.5 36.5t112.5 -1t92 -30t73.5 -50t56 -61t42 -63t27.5 -56 t16 -39.5l4 -16q12 122 12 195q-8 6 -21.5 16t-49 44.5t-63.5 71.5t-54 93t-33 112.5t12 127t70 138.5q73 -25 127.5 -61.5t84.5 -76.5t48 -85t20.5 -89t-0.5 -85.5t-13 -76.5t-19 -62t-17 -42l-7 -15q1 -5 1 -50.5t-1 -71.5q3 7 10 18.5t30.5 43t50.5 58t71 55.5t91.5 44.5 t112 14.5t132.5 -24q-2 -78 -21.5 -141.5t-50 -104.5t-69.5 -71.5t-81.5 -45.5t-84.5 -24t-80 -9.5t-67.5 1t-46.5 4.5l-17 3q-23 -147 -73 -283q6 7 18 18.5t49.5 41t77.5 52.5t99.5 42t117.5 20t129 -23.5t137 -77.5z" /> +<glyph unicode="" horiz-adv-x="1280" d="M1259 283v-66q0 -85 -57.5 -144.5t-138.5 -59.5h-57l-260 -269v269h-529q-81 0 -138.5 59.5t-57.5 144.5v66h1238zM1259 609v-255h-1238v255h1238zM1259 937v-255h-1238v255h1238zM1259 1077v-67h-1238v67q0 84 57.5 143.5t138.5 59.5h846q81 0 138.5 -59.5t57.5 -143.5z " /> +<glyph unicode="" d="M1152 640q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192h-352q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h352v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1152 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-192q0 -14 -9 -23t-23 -9q-12 0 -24 10l-319 319q-9 9 -9 23t9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h352q13 0 22.5 -9.5t9.5 -22.5zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1024 960v-640q0 -26 -19 -45t-45 -19q-20 0 -37 12l-448 320q-27 19 -27 52t27 52l448 320q17 12 37 12q26 0 45 -19t19 -45zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5z M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5 t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1023 349l102 -204q-58 -179 -210 -290t-339 -111q-156 0 -288.5 77.5t-210 210t-77.5 288.5q0 181 104.5 330t274.5 211l17 -131q-122 -54 -195 -165.5t-73 -244.5q0 -185 131.5 -316.5t316.5 -131.5q126 0 232.5 65t165 175.5t49.5 236.5zM1571 249l58 -114l-256 -128 q-13 -7 -29 -7q-40 0 -57 35l-239 477h-472q-24 0 -42.5 16.5t-21.5 40.5l-96 779q-2 16 6 42q14 51 57 82.5t97 31.5q66 0 113 -47t47 -113q0 -69 -52 -117.5t-120 -41.5l37 -289h423v-128h-407l16 -128h455q40 0 57 -35l228 -455z" /> +<glyph unicode="" d="M1254 899q16 85 -21 132q-52 65 -187 45q-17 -3 -41 -12.5t-57.5 -30.5t-64.5 -48.5t-59.5 -70t-44.5 -91.5q80 7 113.5 -16t26.5 -99q-5 -52 -52 -143q-43 -78 -71 -99q-44 -32 -87 14q-23 24 -37.5 64.5t-19 73t-10 84t-8.5 71.5q-23 129 -34 164q-12 37 -35.5 69 t-50.5 40q-57 16 -127 -25q-54 -32 -136.5 -106t-122.5 -102v-7q16 -8 25.5 -26t21.5 -20q21 -3 54.5 8.5t58 10.5t41.5 -30q11 -18 18.5 -38.5t15 -48t12.5 -40.5q17 -46 53 -187q36 -146 57 -197q42 -99 103 -125q43 -12 85 -1.5t76 31.5q131 77 250 237 q104 139 172.5 292.5t82.5 226.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" horiz-adv-x="1152" d="M1152 704q0 -191 -94.5 -353t-256.5 -256.5t-353 -94.5h-160q-14 0 -23 9t-9 23v611l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v93l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v250q0 14 9 23t23 9h160 q14 0 23 -9t9 -23v-181l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-93l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-487q188 13 318 151t130 328q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1152 736v-64q0 -14 -9 -23t-23 -9h-352v-352q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v352h-352q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h352v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-352h352q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832 q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" horiz-adv-x="2176" d="M620 416q-110 -64 -268 -64h-128v64h-64q-13 0 -22.5 23.5t-9.5 56.5q0 24 7 49q-58 2 -96.5 10.5t-38.5 20.5t38.5 20.5t96.5 10.5q-7 25 -7 49q0 33 9.5 56.5t22.5 23.5h64v64h128q158 0 268 -64h1113q42 -7 106.5 -18t80.5 -14q89 -15 150 -40.5t83.5 -47.5t22.5 -40 t-22.5 -40t-83.5 -47.5t-150 -40.5q-16 -3 -80.5 -14t-106.5 -18h-1113zM1739 668q53 -36 53 -92t-53 -92l81 -30q68 48 68 122t-68 122zM625 400h1015q-217 -38 -456 -80q-57 0 -113 -24t-83 -48l-28 -24l-288 -288q-26 -26 -70.5 -45t-89.5 -19h-96l-93 464h29 q157 0 273 64zM352 816h-29l93 464h96q46 0 90 -19t70 -45l288 -288q4 -4 11 -10.5t30.5 -23t48.5 -29t61.5 -23t72.5 -10.5l456 -80h-1015q-116 64 -273 64z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1519 760q62 0 103.5 -40.5t41.5 -101.5q0 -97 -93 -130l-172 -59l56 -167q7 -21 7 -47q0 -59 -42 -102t-101 -43q-47 0 -85.5 27t-53.5 72l-55 165l-310 -106l55 -164q8 -24 8 -47q0 -59 -42 -102t-102 -43q-47 0 -85 27t-53 72l-55 163l-153 -53q-29 -9 -50 -9 q-61 0 -101.5 40t-40.5 101q0 47 27.5 85t71.5 53l156 53l-105 313l-156 -54q-26 -8 -48 -8q-60 0 -101 40.5t-41 100.5q0 47 27.5 85t71.5 53l157 53l-53 159q-8 24 -8 47q0 60 42 102.5t102 42.5q47 0 85 -27t53 -72l54 -160l310 105l-54 160q-8 24 -8 47q0 59 42.5 102 t101.5 43q47 0 85.5 -27.5t53.5 -71.5l53 -161l162 55q21 6 43 6q60 0 102.5 -39.5t42.5 -98.5q0 -45 -30 -81.5t-74 -51.5l-157 -54l105 -316l164 56q24 8 46 8zM725 498l310 105l-105 315l-310 -107z" /> +<glyph unicode="" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM1280 352v436q-31 -35 -64 -55q-34 -22 -132.5 -85t-151.5 -99q-98 -69 -164 -69v0v0q-66 0 -164 69 q-46 32 -141.5 92.5t-142.5 92.5q-12 8 -33 27t-31 27v-436q0 -40 28 -68t68 -28h832q40 0 68 28t28 68zM1280 925q0 41 -27.5 70t-68.5 29h-832q-40 0 -68 -28t-28 -68q0 -37 30.5 -76.5t67.5 -64.5q47 -32 137.5 -89t129.5 -83q3 -2 17 -11.5t21 -14t21 -13t23.5 -13 t21.5 -9.5t22.5 -7.5t20.5 -2.5t20.5 2.5t22.5 7.5t21.5 9.5t23.5 13t21 13t21 14t17 11.5l267 174q35 23 66.5 62.5t31.5 73.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M127 640q0 163 67 313l367 -1005q-196 95 -315 281t-119 411zM1415 679q0 -19 -2.5 -38.5t-10 -49.5t-11.5 -44t-17.5 -59t-17.5 -58l-76 -256l-278 826q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-75 1 -202 10q-12 1 -20.5 -5t-11.5 -15t-1.5 -18.5t9 -16.5 t19.5 -8l80 -8l120 -328l-168 -504l-280 832q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-7 0 -23 0.5t-26 0.5q105 160 274.5 253.5t367.5 93.5q147 0 280.5 -53t238.5 -149h-10q-55 0 -92 -40.5t-37 -95.5q0 -12 2 -24t4 -21.5t8 -23t9 -21t12 -22.5t12.5 -21 t14.5 -24t14 -23q63 -107 63 -212zM909 573l237 -647q1 -6 5 -11q-126 -44 -255 -44q-112 0 -217 32zM1570 1009q95 -174 95 -369q0 -209 -104 -385.5t-279 -278.5l235 678q59 169 59 276q0 42 -6 79zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286 t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM896 -215q173 0 331.5 68t273 182.5t182.5 273t68 331.5t-68 331.5t-182.5 273t-273 182.5t-331.5 68t-331.5 -68t-273 -182.5t-182.5 -273t-68 -331.5t68 -331.5t182.5 -273 t273 -182.5t331.5 -68z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1086 1536v-1536l-272 -128q-228 20 -414 102t-293 208.5t-107 272.5q0 140 100.5 263.5t275 205.5t391.5 108v-172q-217 -38 -356.5 -150t-139.5 -255q0 -152 154.5 -267t388.5 -145v1360zM1755 954l37 -390l-525 114l147 83q-119 70 -280 99v172q277 -33 481 -157z" /> +<glyph unicode="" horiz-adv-x="2048" d="M960 1536l960 -384v-128h-128q0 -26 -20.5 -45t-48.5 -19h-1526q-28 0 -48.5 19t-20.5 45h-128v128zM256 896h256v-768h128v768h256v-768h128v768h256v-768h128v768h256v-768h59q28 0 48.5 -19t20.5 -45v-64h-1664v64q0 26 20.5 45t48.5 19h59v768zM1851 -64 q28 0 48.5 -19t20.5 -45v-128h-1920v128q0 26 20.5 45t48.5 19h1782z" /> +<glyph unicode="" horiz-adv-x="2304" d="M1774 700l18 -316q4 -69 -82 -128t-235 -93.5t-323 -34.5t-323 34.5t-235 93.5t-82 128l18 316l574 -181q22 -7 48 -7t48 7zM2304 1024q0 -23 -22 -31l-1120 -352q-4 -1 -10 -1t-10 1l-652 206q-43 -34 -71 -111.5t-34 -178.5q63 -36 63 -109q0 -69 -58 -107l58 -433 q2 -14 -8 -25q-9 -11 -24 -11h-192q-15 0 -24 11q-10 11 -8 25l58 433q-58 38 -58 107q0 73 65 111q11 207 98 330l-333 104q-22 8 -22 31t22 31l1120 352q4 1 10 1t10 -1l1120 -352q22 -8 22 -31z" /> +<glyph unicode="" d="M859 579l13 -707q-62 11 -105 11q-41 0 -105 -11l13 707q-40 69 -168.5 295.5t-216.5 374.5t-181 287q58 -15 108 -15q43 0 111 15q63 -111 133.5 -229.5t167 -276.5t138.5 -227q37 61 109.5 177.5t117.5 190t105 176t107 189.5q54 -14 107 -14q56 0 114 14v0 q-28 -39 -60 -88.5t-49.5 -78.5t-56.5 -96t-49 -84q-146 -248 -353 -610z" /> +<glyph unicode="" horiz-adv-x="1280" d="M981 197q0 25 -7 49t-14.5 42t-27 41.5t-29.5 35t-38.5 34.5t-36.5 29t-41.5 30t-36.5 26q-16 2 -49 2q-53 0 -104.5 -7t-107 -25t-97 -46t-68.5 -74.5t-27 -105.5q0 -56 23.5 -102t61 -75.5t87 -50t100 -29t101.5 -8.5q58 0 111.5 13t99 39t73 73t27.5 109zM864 1055 q0 59 -17 125.5t-48 129t-84 103.5t-117 41q-42 0 -82.5 -19.5t-66.5 -52.5q-46 -59 -46 -160q0 -46 10 -97.5t31.5 -103t52 -92.5t75 -67t96.5 -26q37 0 77.5 16.5t65.5 43.5q53 56 53 159zM752 1536h417l-137 -88h-132q75 -63 113 -133t38 -160q0 -72 -24.5 -129.5 t-59.5 -93t-69.5 -65t-59 -61.5t-24.5 -66q0 -36 32 -70.5t77 -68t90.5 -73.5t77.5 -104t32 -142q0 -91 -49 -173q-71 -122 -209.5 -179.5t-298.5 -57.5q-132 0 -246.5 41.5t-172.5 137.5q-36 59 -36 131q0 81 44.5 150t118.5 115q131 82 404 100q-32 41 -47.5 73.5 t-15.5 73.5q0 40 21 85q-46 -4 -68 -4q-148 0 -249.5 96.5t-101.5 244.5q0 82 36 159t99 131q76 66 182 98t218 32z" /> +<glyph unicode="" horiz-adv-x="2304" d="M1509 107q0 -14 -12 -29q-52 -59 -147.5 -83t-196.5 -24q-252 0 -346 107q-12 15 -12 29q0 17 12 29.5t29 12.5q15 0 30 -12q58 -49 125.5 -66t159.5 -17t160 17t127 66q15 12 30 12q17 0 29 -12.5t12 -29.5zM978 498q0 -61 -43 -104t-104 -43q-60 0 -104.5 43.5 t-44.5 103.5q0 61 44 105t105 44t104 -44t43 -105zM1622 498q0 -61 -43 -104t-104 -43q-60 0 -104.5 43.5t-44.5 103.5q0 61 44 105t105 44t104 -44t43 -105zM415 793q-39 27 -88 27q-66 0 -113 -47t-47 -113q0 -72 54 -121q53 141 194 254zM2020 382q0 222 -249 387 q-128 85 -291.5 126.5t-331.5 41.5t-331.5 -41.5t-292.5 -126.5q-249 -165 -249 -387t249 -387q129 -85 292.5 -126.5t331.5 -41.5t331.5 41.5t291.5 126.5q249 165 249 387zM2137 660q0 66 -47 113t-113 47q-50 0 -93 -30q140 -114 192 -256q61 48 61 126zM1993 1335 q0 49 -34.5 83.5t-82.5 34.5q-49 0 -83.5 -34.5t-34.5 -83.5q0 -48 34.5 -82.5t83.5 -34.5q48 0 82.5 34.5t34.5 82.5zM2220 660q0 -65 -33 -122t-89 -90q5 -35 5 -66q0 -139 -79 -255.5t-208 -201.5q-140 -92 -313.5 -136.5t-354.5 -44.5t-355 44.5t-314 136.5 q-129 85 -208 201.5t-79 255.5q0 36 6 71q-53 33 -83.5 88.5t-30.5 118.5q0 100 71 171.5t172 71.5q91 0 159 -60q265 170 638 177l144 456q10 29 40 29q24 0 384 -90q24 55 74 88t110 33q82 0 141 -59t59 -142t-59 -141.5t-141 -58.5q-83 0 -141.5 58.5t-59.5 140.5 l-339 80l-125 -395q349 -15 603 -179q71 63 163 63q101 0 172 -71.5t71 -171.5z" /> +<glyph unicode="" d="M950 393q7 7 17.5 7t17.5 -7t7 -18t-7 -18q-65 -64 -208 -64h-1h-1q-143 0 -207 64q-8 7 -8 18t8 18q7 7 17.5 7t17.5 -7q49 -51 172 -51h1h1q122 0 173 51zM671 613q0 -37 -26 -64t-63 -27t-63 27t-26 64t26 63t63 26t63 -26t26 -63zM1214 1049q-29 0 -50 21t-21 50 q0 30 21 51t50 21q30 0 51 -21t21 -51q0 -29 -21 -50t-51 -21zM1216 1408q132 0 226 -94t94 -227v-894q0 -133 -94 -227t-226 -94h-896q-132 0 -226 94t-94 227v894q0 133 94 227t226 94h896zM1321 596q35 14 57 45.5t22 70.5q0 51 -36 87.5t-87 36.5q-60 0 -98 -48 q-151 107 -375 115l83 265l206 -49q1 -50 36.5 -85t84.5 -35q50 0 86 35.5t36 85.5t-36 86t-86 36q-36 0 -66 -20.5t-45 -53.5l-227 54q-9 2 -17.5 -2.5t-11.5 -14.5l-95 -302q-224 -4 -381 -113q-36 43 -93 43q-51 0 -87 -36.5t-36 -87.5q0 -37 19.5 -67.5t52.5 -45.5 q-7 -25 -7 -54q0 -98 74 -181.5t201.5 -132t278.5 -48.5q150 0 277.5 48.5t201.5 132t74 181.5q0 27 -6 54zM971 702q37 0 63 -26t26 -63t-26 -64t-63 -27t-63 27t-26 64t26 63t63 26z" /> +<glyph unicode="" d="M866 697l90 27v62q0 79 -58 135t-138 56t-138 -55.5t-58 -134.5v-283q0 -20 -14 -33.5t-33 -13.5t-32.5 13.5t-13.5 33.5v120h-151v-122q0 -82 57.5 -139t139.5 -57q81 0 138.5 56.5t57.5 136.5v280q0 19 13.5 33t33.5 14q19 0 32.5 -14t13.5 -33v-54zM1199 502v122h-150 v-126q0 -20 -13.5 -33.5t-33.5 -13.5q-19 0 -32.5 14t-13.5 33v123l-90 -26l-60 28v-123q0 -80 58 -137t139 -57t138.5 57t57.5 139zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103 t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" horiz-adv-x="1920" d="M1062 824v118q0 42 -30 72t-72 30t-72 -30t-30 -72v-612q0 -175 -126 -299t-303 -124q-178 0 -303.5 125.5t-125.5 303.5v266h328v-262q0 -43 30 -72.5t72 -29.5t72 29.5t30 72.5v620q0 171 126.5 292t301.5 121q176 0 302 -122t126 -294v-136l-195 -58zM1592 602h328 v-266q0 -178 -125.5 -303.5t-303.5 -125.5q-177 0 -303 124.5t-126 300.5v268l131 -61l195 58v-270q0 -42 30 -71.5t72 -29.5t72 29.5t30 71.5v275z" /> +<glyph unicode="" d="M1472 160v480h-704v704h-480q-93 0 -158.5 -65.5t-65.5 -158.5v-480h704v-704h480q93 0 158.5 65.5t65.5 158.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 t84.5 -203.5z" /> +<glyph unicode="" horiz-adv-x="2048" d="M328 1254h204v-983h-532v697h328v286zM328 435v369h-123v-369h123zM614 968v-697h205v697h-205zM614 1254v-204h205v204h-205zM901 968h533v-942h-533v163h328v82h-328v697zM1229 435v369h-123v-369h123zM1516 968h532v-942h-532v163h327v82h-327v697zM1843 435v369h-123 v-369h123z" /> +<glyph unicode="" d="M1046 516q0 -64 -38 -109t-91 -45q-43 0 -70 15v277q28 17 70 17q53 0 91 -45.5t38 -109.5zM703 944q0 -64 -38 -109.5t-91 -45.5q-43 0 -70 15v277q28 17 70 17q53 0 91 -45t38 -109zM1265 513q0 134 -88 229t-213 95q-20 0 -39 -3q-23 -78 -78 -136q-87 -95 -211 -101 v-636l211 41v206q51 -19 117 -19q125 0 213 95t88 229zM922 940q0 134 -88.5 229t-213.5 95q-74 0 -141 -36h-186v-840l211 41v206q55 -19 116 -19q125 0 213.5 95t88.5 229zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960 q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" horiz-adv-x="2038" d="M1222 607q75 3 143.5 -20.5t118 -58.5t101 -94.5t84 -108t75.5 -120.5q33 -56 78.5 -109t75.5 -80.5t99 -88.5q-48 -30 -108.5 -57.5t-138.5 -59t-114 -47.5q-44 37 -74 115t-43.5 164.5t-33 180.5t-42.5 168.5t-72.5 123t-122.5 48.5l-10 -2l-6 -4q4 -5 13 -14 q6 -5 28 -23.5t25.5 -22t19 -18t18 -20.5t11.5 -21t10.5 -27.5t4.5 -31t4 -40.5l1 -33q1 -26 -2.5 -57.5t-7.5 -52t-12.5 -58.5t-11.5 -53q-35 1 -101 -9.5t-98 -10.5q-39 0 -72 10q-2 16 -2 47q0 74 3 96q2 13 31.5 41.5t57 59t26.5 51.5q-24 2 -43 -24 q-36 -53 -111.5 -99.5t-136.5 -46.5q-25 0 -75.5 63t-106.5 139.5t-84 96.5q-6 4 -27 30q-482 -112 -513 -112q-16 0 -28 11t-12 27q0 15 8.5 26.5t22.5 14.5l486 106q-8 14 -8 25t5.5 17.5t16 11.5t20 7t23 4.5t18.5 4.5q4 1 15.5 7.5t17.5 6.5q15 0 28 -16t20 -33 q163 37 172 37q17 0 29.5 -11t12.5 -28q0 -15 -8.5 -26t-23.5 -14l-182 -40l-1 -16q-1 -26 81.5 -117.5t104.5 -91.5q47 0 119 80t72 129q0 36 -23.5 53t-51 18.5t-51 11.5t-23.5 34q0 16 10 34l-68 19q43 44 43 117q0 26 -5 58q82 16 144 16q44 0 71.5 -1.5t48.5 -8.5 t31 -13.5t20.5 -24.5t15.5 -33.5t17 -47.5t24 -60l50 25q-3 -40 -23 -60t-42.5 -21t-40 -6.5t-16.5 -20.5zM1282 842q-5 5 -13.5 15.5t-12 14.5t-10.5 11.5t-10 10.5l-8 8t-8.5 7.5t-8 5t-8.5 4.5q-7 3 -14.5 5t-20.5 2.5t-22 0.5h-32.5h-37.5q-126 0 -217 -43 q16 30 36 46.5t54 29.5t65.5 36t46 36.5t50 55t43.5 50.5q12 -9 28 -31.5t32 -36.5t38 -13l12 1v-76l22 -1q247 95 371 190q28 21 50 39t42.5 37.5t33 31t29.5 34t24 31t24.5 37t23 38t27 47.5t29.5 53l7 9q-2 -53 -43 -139q-79 -165 -205 -264t-306 -142q-14 -3 -42 -7.5 t-50 -9.5t-39 -14q3 -19 24.5 -46t21.5 -34q0 -11 -26 -30zM1061 -79q39 26 131.5 47.5t146.5 21.5q9 0 22.5 -15.5t28 -42.5t26 -50t24 -51t14.5 -33q-121 -45 -244 -45q-61 0 -125 11zM822 568l48 12l109 -177l-73 -48zM1323 51q3 -15 3 -16q0 -7 -17.5 -14.5t-46 -13 t-54 -9.5t-53.5 -7.5t-32 -4.5l-7 43q21 2 60.5 8.5t72 10t60.5 3.5h14zM866 679l-96 -20l-6 17q10 1 32.5 7t34.5 6q19 0 35 -10zM1061 45h31l10 -83l-41 -12v95zM1950 1535v1v-1zM1950 1535l-1 -5l-2 -2l1 3zM1950 1535l1 1z" /> +<glyph unicode="" d="M1167 -50q-5 19 -24 5q-30 -22 -87 -39t-131 -17q-129 0 -193 49q-5 4 -13 4q-11 0 -26 -12q-7 -6 -7.5 -16t7.5 -20q34 -32 87.5 -46t102.5 -12.5t99 4.5q41 4 84.5 20.5t65 30t28.5 20.5q12 12 7 29zM1128 65q-19 47 -39 61q-23 15 -76 15q-47 0 -71 -10 q-29 -12 -78 -56q-26 -24 -12 -44q9 -8 17.5 -4.5t31.5 23.5q3 2 10.5 8.5t10.5 8.5t10 7t11.5 7t12.5 5t15 4.5t16.5 2.5t20.5 1q27 0 44.5 -7.5t23 -14.5t13.5 -22q10 -17 12.5 -20t12.5 1q23 12 14 34zM1483 346q0 22 -5 44.5t-16.5 45t-34 36.5t-52.5 14 q-33 0 -97 -41.5t-129 -83.5t-101 -42q-27 -1 -63.5 19t-76 49t-83.5 58t-100 49t-111 19q-115 -1 -197 -78.5t-84 -178.5q-2 -112 74 -164q29 -20 62.5 -28.5t103.5 -8.5q57 0 132 32.5t134 71t120 70.5t93 31q26 -1 65 -31.5t71.5 -67t68 -67.5t55.5 -32q35 -3 58.5 14 t55.5 63q28 41 42.5 101t14.5 106zM1536 506q0 -164 -62 -304.5t-166 -236t-242.5 -149.5t-290.5 -54t-293 57.5t-247.5 157t-170.5 241.5t-64 302q0 89 19.5 172.5t49 145.5t70.5 118.5t78.5 94t78.5 69.5t64.5 46.5t42.5 24.5q14 8 51 26.5t54.5 28.5t48 30t60.5 44 q36 28 58 72.5t30 125.5q129 -155 186 -193q44 -29 130 -68t129 -66q21 -13 39 -25t60.5 -46.5t76 -70.5t75 -95t69 -122t47 -148.5t19.5 -177.5z" /> +<glyph unicode="" d="M1070 463l-160 -160l-151 -152l-30 -30q-65 -64 -151.5 -87t-171.5 -2q-16 -70 -72 -115t-129 -45q-85 0 -145 60.5t-60 145.5q0 72 44.5 128t113.5 72q-22 86 1 173t88 152l12 12l151 -152l-11 -11q-37 -37 -37 -89t37 -90q37 -37 89 -37t89 37l30 30l151 152l161 160z M729 1145l12 -12l-152 -152l-12 12q-37 37 -89 37t-89 -37t-37 -89.5t37 -89.5l29 -29l152 -152l160 -160l-151 -152l-161 160l-151 152l-30 30q-68 67 -90 159.5t5 179.5q-70 15 -115 71t-45 129q0 85 60 145.5t145 60.5q76 0 133.5 -49t69.5 -123q84 20 169.5 -3.5 t149.5 -87.5zM1536 78q0 -85 -60 -145.5t-145 -60.5q-74 0 -131 47t-71 118q-86 -28 -179.5 -6t-161.5 90l-11 12l151 152l12 -12q37 -37 89 -37t89 37t37 89t-37 89l-30 30l-152 152l-160 160l152 152l160 -160l152 -152l29 -30q64 -64 87.5 -150.5t2.5 -171.5 q76 -11 126.5 -68.5t50.5 -134.5zM1534 1202q0 -77 -51 -135t-127 -69q26 -85 3 -176.5t-90 -158.5l-12 -12l-151 152l12 12q37 37 37 89t-37 89t-89 37t-89 -37l-30 -30l-152 -152l-160 -160l-152 152l161 160l152 152l29 30q67 67 159 89.5t178 -3.5q11 75 68.5 126 t135.5 51q85 0 145 -60.5t60 -145.5z" /> +<glyph unicode="" d="M654 458q-1 -3 -12.5 0.5t-31.5 11.5l-20 9q-44 20 -87 49q-7 5 -41 31.5t-38 28.5q-67 -103 -134 -181q-81 -95 -105 -110q-4 -2 -19.5 -4t-18.5 0q6 4 82 92q21 24 85.5 115t78.5 118q17 30 51 98.5t36 77.5q-8 1 -110 -33q-8 -2 -27.5 -7.5t-34.5 -9.5t-17 -5 q-2 -2 -2 -10.5t-1 -9.5q-5 -10 -31 -15q-23 -7 -47 0q-18 4 -28 21q-4 6 -5 23q6 2 24.5 5t29.5 6q58 16 105 32q100 35 102 35q10 2 43 19.5t44 21.5q9 3 21.5 8t14.5 5.5t6 -0.5q2 -12 -1 -33q0 -2 -12.5 -27t-26.5 -53.5t-17 -33.5q-25 -50 -77 -131l64 -28 q12 -6 74.5 -32t67.5 -28q4 -1 10.5 -25.5t4.5 -30.5zM449 944q3 -15 -4 -28q-12 -23 -50 -38q-30 -12 -60 -12q-26 3 -49 26q-14 15 -18 41l1 3q3 -3 19.5 -5t26.5 0t58 16q36 12 55 14q17 0 21 -17zM1147 815l63 -227l-139 42zM39 15l694 232v1032l-694 -233v-1031z M1280 332l102 -31l-181 657l-100 31l-216 -536l102 -31l45 110l211 -65zM777 1294l573 -184v380zM1088 -29l158 -13l-54 -160l-40 66q-130 -83 -276 -108q-58 -12 -91 -12h-84q-79 0 -199.5 39t-183.5 85q-8 7 -8 16q0 8 5 13.5t13 5.5q4 0 18 -7.5t30.5 -16.5t20.5 -11 q73 -37 159.5 -61.5t157.5 -24.5q95 0 167 14.5t157 50.5q15 7 30.5 15.5t34 19t28.5 16.5zM1536 1050v-1079l-774 246q-14 -6 -375 -127.5t-368 -121.5q-13 0 -18 13q0 1 -1 3v1078q3 9 4 10q5 6 20 11q106 35 149 50v384l558 -198q2 0 160.5 55t316 108.5t161.5 53.5 q20 0 20 -21v-418z" /> +<glyph unicode="" horiz-adv-x="1792" d="M288 1152q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-128q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h128zM1664 989q58 -34 93 -93t35 -128v-768q0 -106 -75 -181t-181 -75h-864q-66 0 -113 47t-47 113v1536q0 40 28 68t68 28h672q40 0 88 -20t76 -48 l152 -152q28 -28 48 -76t20 -88v-163zM928 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM928 256v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM928 512v128q0 14 -9 23 t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1184 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1184 256v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128 q14 0 23 9t9 23zM1184 512v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 256v128q0 14 -9 23t-23 9h-128 q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 512v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1536 896v256h-160q-40 0 -68 28t-28 68v160h-640v-512h896z" /> +<glyph unicode="" d="M1344 1536q26 0 45 -19t19 -45v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280zM512 1248v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 992v-64q0 -14 9 -23t23 -9h64q14 0 23 9 t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 736v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 480v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM384 160v64 q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64 q14 0 23 9t9 23zM384 928v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 -96v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9 t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM896 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 928v64 q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 160v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64 q14 0 23 9t9 23zM1152 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 928v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9 t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23z" /> +<glyph unicode="" horiz-adv-x="1280" d="M1188 988l-292 -292v-824q0 -46 -33 -79t-79 -33t-79 33t-33 79v384h-64v-384q0 -46 -33 -79t-79 -33t-79 33t-33 79v824l-292 292q-28 28 -28 68t28 68t68 28t68 -28l228 -228h368l228 228q28 28 68 28t68 -28t28 -68t-28 -68zM864 1152q0 -93 -65.5 -158.5 t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" /> +<glyph unicode="" horiz-adv-x="1664" d="M780 1064q0 -60 -19 -113.5t-63 -92.5t-105 -39q-76 0 -138 57.5t-92 135.5t-30 151q0 60 19 113.5t63 92.5t105 39q77 0 138.5 -57.5t91.5 -135t30 -151.5zM438 581q0 -80 -42 -139t-119 -59q-76 0 -141.5 55.5t-100.5 133.5t-35 152q0 80 42 139.5t119 59.5 q76 0 141.5 -55.5t100.5 -134t35 -152.5zM832 608q118 0 255 -97.5t229 -237t92 -254.5q0 -46 -17 -76.5t-48.5 -45t-64.5 -20t-76 -5.5q-68 0 -187.5 45t-182.5 45q-66 0 -192.5 -44.5t-200.5 -44.5q-183 0 -183 146q0 86 56 191.5t139.5 192.5t187.5 146t193 59zM1071 819 q-61 0 -105 39t-63 92.5t-19 113.5q0 74 30 151.5t91.5 135t138.5 57.5q61 0 105 -39t63 -92.5t19 -113.5q0 -73 -30 -151t-92 -135.5t-138 -57.5zM1503 923q77 0 119 -59.5t42 -139.5q0 -74 -35 -152t-100.5 -133.5t-141.5 -55.5q-77 0 -119 59t-42 139q0 74 35 152.5 t100.5 134t141.5 55.5z" /> +<glyph unicode="" horiz-adv-x="768" d="M704 1008q0 -145 -57 -243.5t-152 -135.5l45 -821q2 -26 -16 -45t-44 -19h-192q-26 0 -44 19t-16 45l45 821q-95 37 -152 135.5t-57 243.5q0 128 42.5 249.5t117.5 200t160 78.5t160 -78.5t117.5 -200t42.5 -249.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M896 -93l640 349v636l-640 -233v-752zM832 772l698 254l-698 254l-698 -254zM1664 1024v-768q0 -35 -18 -65t-49 -47l-704 -384q-28 -16 -61 -16t-61 16l-704 384q-31 17 -49 47t-18 65v768q0 40 23 73t61 47l704 256q22 8 44 8t44 -8l704 -256q38 -14 61 -47t23 -73z " /> +<glyph unicode="" horiz-adv-x="2304" d="M640 -96l384 192v314l-384 -164v-342zM576 358l404 173l-404 173l-404 -173zM1664 -96l384 192v314l-384 -164v-342zM1600 358l404 173l-404 173l-404 -173zM1152 651l384 165v266l-384 -164v-267zM1088 1030l441 189l-441 189l-441 -189zM2176 512v-416q0 -36 -19 -67 t-52 -47l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-5 2 -7 4q-2 -2 -7 -4l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-33 16 -52 47t-19 67v416q0 38 21.5 70t56.5 48l434 186v400q0 38 21.5 70t56.5 48l448 192q23 10 50 10t50 -10l448 -192q35 -16 56.5 -48t21.5 -70 v-400l434 -186q36 -16 57 -48t21 -70z" /> +<glyph unicode="" horiz-adv-x="2048" d="M1848 1197h-511v-124h511v124zM1596 771q-90 0 -146 -52.5t-62 -142.5h408q-18 195 -200 195zM1612 186q63 0 122 32t76 87h221q-100 -307 -427 -307q-214 0 -340.5 132t-126.5 347q0 208 130.5 345.5t336.5 137.5q138 0 240.5 -68t153 -179t50.5 -248q0 -17 -2 -47h-658 q0 -111 57.5 -171.5t166.5 -60.5zM277 236h296q205 0 205 167q0 180 -199 180h-302v-347zM277 773h281q78 0 123.5 36.5t45.5 113.5q0 144 -190 144h-260v-294zM0 1282h594q87 0 155 -14t126.5 -47.5t90 -96.5t31.5 -154q0 -181 -172 -263q114 -32 172 -115t58 -204 q0 -75 -24.5 -136.5t-66 -103.5t-98.5 -71t-121 -42t-134 -13h-611v1260z" /> +<glyph unicode="" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM499 1041h-371v-787h382q117 0 197 57.5t80 170.5q0 158 -143 200q107 52 107 164q0 57 -19.5 96.5 t-56.5 60.5t-79 29.5t-97 8.5zM477 723h-176v184h163q119 0 119 -90q0 -94 -106 -94zM486 388h-185v217h189q124 0 124 -113q0 -104 -128 -104zM1136 356q-68 0 -104 38t-36 107h411q1 10 1 30q0 132 -74.5 220.5t-203.5 88.5q-128 0 -210 -86t-82 -216q0 -135 79 -217 t213 -82q205 0 267 191h-138q-11 -34 -47.5 -54t-75.5 -20zM1126 722q113 0 124 -122h-254q4 56 39 89t91 33zM964 988h319v-77h-319v77z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1582 954q0 -101 -71.5 -172.5t-172.5 -71.5t-172.5 71.5t-71.5 172.5t71.5 172.5t172.5 71.5t172.5 -71.5t71.5 -172.5zM812 212q0 104 -73 177t-177 73q-27 0 -54 -6l104 -42q77 -31 109.5 -106.5t1.5 -151.5q-31 -77 -107 -109t-152 -1q-21 8 -62 24.5t-61 24.5 q32 -60 91 -96.5t130 -36.5q104 0 177 73t73 177zM1642 953q0 126 -89.5 215.5t-215.5 89.5q-127 0 -216.5 -89.5t-89.5 -215.5q0 -127 89.5 -216t216.5 -89q126 0 215.5 89t89.5 216zM1792 953q0 -189 -133.5 -322t-321.5 -133l-437 -319q-12 -129 -109 -218t-229 -89 q-121 0 -214 76t-118 192l-230 92v429l389 -157q79 48 173 48q13 0 35 -2l284 407q2 187 135.5 319t320.5 132q188 0 321.5 -133.5t133.5 -321.5z" /> +<glyph unicode="" d="M1242 889q0 80 -57 136.5t-137 56.5t-136.5 -57t-56.5 -136q0 -80 56.5 -136.5t136.5 -56.5t137 56.5t57 136.5zM632 301q0 -83 -58 -140.5t-140 -57.5q-56 0 -103 29t-72 77q52 -20 98 -40q60 -24 120 1.5t85 86.5q24 60 -1.5 120t-86.5 84l-82 33q22 5 42 5 q82 0 140 -57.5t58 -140.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v153l172 -69q20 -92 93.5 -152t168.5 -60q104 0 181 70t87 173l345 252q150 0 255.5 105.5t105.5 254.5q0 150 -105.5 255.5t-255.5 105.5 q-148 0 -253 -104.5t-107 -252.5l-225 -322q-9 1 -28 1q-75 0 -137 -37l-297 119v468q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5zM1289 887q0 -100 -71 -170.5t-171 -70.5t-170.5 70.5t-70.5 170.5t70.5 171t170.5 71q101 0 171.5 -70.5t70.5 -171.5z " /> +<glyph unicode="" horiz-adv-x="1792" d="M836 367l-15 -368l-2 -22l-420 29q-36 3 -67 31.5t-47 65.5q-11 27 -14.5 55t4 65t12 55t21.5 64t19 53q78 -12 509 -28zM449 953l180 -379l-147 92q-63 -72 -111.5 -144.5t-72.5 -125t-39.5 -94.5t-18.5 -63l-4 -21l-190 357q-17 26 -18 56t6 47l8 18q35 63 114 188 l-140 86zM1680 436l-188 -359q-12 -29 -36.5 -46.5t-43.5 -20.5l-18 -4q-71 -7 -219 -12l8 -164l-230 367l211 362l7 -173q170 -16 283 -5t170 33zM895 1360q-47 -63 -265 -435l-317 187l-19 12l225 356q20 31 60 45t80 10q24 -2 48.5 -12t42 -21t41.5 -33t36 -34.5 t36 -39.5t32 -35zM1550 1053l212 -363q18 -37 12.5 -76t-27.5 -74q-13 -20 -33 -37t-38 -28t-48.5 -22t-47 -16t-51.5 -14t-46 -12q-34 72 -265 436l313 195zM1407 1279l142 83l-220 -373l-419 20l151 86q-34 89 -75 166t-75.5 123.5t-64.5 80t-47 46.5l-17 13l405 -1 q31 3 58 -10.5t39 -28.5l11 -15q39 -61 112 -190z" /> +<glyph unicode="" horiz-adv-x="2048" d="M480 448q0 66 -47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47t113 47t47 113zM516 768h1016l-89 357q-2 8 -14 17.5t-21 9.5h-768q-9 0 -21 -9.5t-14 -17.5zM1888 448q0 66 -47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47t113 47t47 113zM2048 544v-384 q0 -14 -9 -23t-23 -9h-96v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-1024v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-96q-14 0 -23 9t-9 23v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5t179 63.5h768q98 0 179 -63.5t104 -157.5 l105 -419h28q93 0 158.5 -65.5t65.5 -158.5z" /> +<glyph unicode="" horiz-adv-x="2048" d="M1824 640q93 0 158.5 -65.5t65.5 -158.5v-384q0 -14 -9 -23t-23 -9h-96v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-1024v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-96q-14 0 -23 9t-9 23v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5 t179 63.5h128v224q0 14 9 23t23 9h448q14 0 23 -9t9 -23v-224h128q98 0 179 -63.5t104 -157.5l105 -419h28zM320 160q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47zM516 640h1016l-89 357q-2 8 -14 17.5t-21 9.5h-768q-9 0 -21 -9.5t-14 -17.5z M1728 160q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47z" /> +<glyph unicode="" d="M1504 64q0 -26 -19 -45t-45 -19h-462q1 -17 6 -87.5t5 -108.5q0 -25 -18 -42.5t-43 -17.5h-320q-25 0 -43 17.5t-18 42.5q0 38 5 108.5t6 87.5h-462q-26 0 -45 19t-19 45t19 45l402 403h-229q-26 0 -45 19t-19 45t19 45l402 403h-197q-26 0 -45 19t-19 45t19 45l384 384 q19 19 45 19t45 -19l384 -384q19 -19 19 -45t-19 -45t-45 -19h-197l402 -403q19 -19 19 -45t-19 -45t-45 -19h-229l402 -403q19 -19 19 -45z" /> +<glyph unicode="" d="M1127 326q0 32 -30 51q-193 115 -447 115q-133 0 -287 -34q-42 -9 -42 -52q0 -20 13.5 -34.5t35.5 -14.5q5 0 37 8q132 27 243 27q226 0 397 -103q19 -11 33 -11q19 0 33 13.5t14 34.5zM1223 541q0 40 -35 61q-237 141 -548 141q-153 0 -303 -42q-48 -13 -48 -64 q0 -25 17.5 -42.5t42.5 -17.5q7 0 37 8q122 33 251 33q279 0 488 -124q24 -13 38 -13q25 0 42.5 17.5t17.5 42.5zM1331 789q0 47 -40 70q-126 73 -293 110.5t-343 37.5q-204 0 -364 -47q-23 -7 -38.5 -25.5t-15.5 -48.5q0 -31 20.5 -52t51.5 -21q11 0 40 8q133 37 307 37 q159 0 309.5 -34t253.5 -95q21 -12 40 -12q29 0 50.5 20.5t21.5 51.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" horiz-adv-x="1024" d="M1024 1233l-303 -582l24 -31h279v-415h-507l-44 -30l-142 -273l-30 -30h-301v303l303 583l-24 30h-279v415h507l44 30l142 273l30 30h301v-303z" /> +<glyph unicode="" horiz-adv-x="2304" d="M784 164l16 241l-16 523q-1 10 -7.5 17t-16.5 7q-9 0 -16 -7t-7 -17l-14 -523l14 -241q1 -10 7.5 -16.5t15.5 -6.5q22 0 24 23zM1080 193l11 211l-12 586q0 16 -13 24q-8 5 -16 5t-16 -5q-13 -8 -13 -24l-1 -6l-10 -579q0 -1 11 -236v-1q0 -10 6 -17q9 -11 23 -11 q11 0 20 9q9 7 9 20zM35 533l20 -128l-20 -126q-2 -9 -9 -9t-9 9l-17 126l17 128q2 9 9 9t9 -9zM121 612l26 -207l-26 -203q-2 -9 -10 -9q-9 0 -9 10l-23 202l23 207q0 9 9 9q8 0 10 -9zM401 159zM213 650l25 -245l-25 -237q0 -11 -11 -11q-10 0 -12 11l-21 237l21 245 q2 12 12 12q11 0 11 -12zM307 657l23 -252l-23 -244q-2 -13 -14 -13q-13 0 -13 13l-21 244l21 252q0 13 13 13q12 0 14 -13zM401 639l21 -234l-21 -246q-2 -16 -16 -16q-6 0 -10.5 4.5t-4.5 11.5l-20 246l20 234q0 6 4.5 10.5t10.5 4.5q14 0 16 -15zM784 164zM495 785 l21 -380l-21 -246q0 -7 -5 -12.5t-12 -5.5q-16 0 -18 18l-18 246l18 380q2 18 18 18q7 0 12 -5.5t5 -12.5zM589 871l19 -468l-19 -244q0 -8 -5.5 -13.5t-13.5 -5.5q-18 0 -20 19l-16 244l16 468q2 19 20 19q8 0 13.5 -5.5t5.5 -13.5zM687 911l18 -506l-18 -242 q-2 -21 -22 -21q-19 0 -21 21l-16 242l16 506q0 9 6.5 15.5t14.5 6.5q9 0 15 -6.5t7 -15.5zM1079 169v0v0zM881 915l15 -510l-15 -239q0 -10 -7.5 -17.5t-17.5 -7.5t-17 7t-8 18l-14 239l14 510q0 11 7.5 18t17.5 7t17.5 -7t7.5 -18zM980 896l14 -492l-14 -236q0 -11 -8 -19 t-19 -8t-19 8t-9 19l-12 236l12 492q1 12 9 20t19 8t18.5 -8t8.5 -20zM1192 404l-14 -231v0q0 -13 -9 -22t-22 -9t-22 9t-10 22l-6 114l-6 117l12 636v3q2 15 12 24q9 7 20 7q8 0 15 -5q14 -8 16 -26zM2304 423q0 -117 -83 -199.5t-200 -82.5h-786q-13 2 -22 11t-9 22v899 q0 23 28 33q85 34 181 34q195 0 338 -131.5t160 -323.5q53 22 110 22q117 0 200 -83t83 -201z" /> +<glyph unicode="" d="M768 768q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127t443 -43zM768 0q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127 t443 -43zM768 384q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127t443 -43zM768 1536q208 0 385 -34.5t280 -93.5t103 -128v-128q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5 t-103 128v128q0 69 103 128t280 93.5t385 34.5z" /> +<glyph unicode="" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M894 465q33 -26 84 -56q59 7 117 7q147 0 177 -49q16 -22 2 -52q0 -1 -1 -2l-2 -2v-1q-6 -38 -71 -38q-48 0 -115 20t-130 53q-221 -24 -392 -83q-153 -262 -242 -262q-15 0 -28 7l-24 12q-1 1 -6 5q-10 10 -6 36q9 40 56 91.5t132 96.5q14 9 23 -6q2 -2 2 -4q52 85 107 197 q68 136 104 262q-24 82 -30.5 159.5t6.5 127.5q11 40 42 40h21h1q23 0 35 -15q18 -21 9 -68q-2 -6 -4 -8q1 -3 1 -8v-30q-2 -123 -14 -192q55 -164 146 -238zM318 54q52 24 137 158q-51 -40 -87.5 -84t-49.5 -74zM716 974q-15 -42 -2 -132q1 7 7 44q0 3 7 43q1 4 4 8 q-1 1 -1 2t-0.5 1.5t-0.5 1.5q-1 22 -13 36q0 -1 -1 -2v-2zM592 313q135 54 284 81q-2 1 -13 9.5t-16 13.5q-76 67 -127 176q-27 -86 -83 -197q-30 -56 -45 -83zM1238 329q-24 24 -140 24q76 -28 124 -28q14 0 18 1q0 1 -2 3z" /> +<glyph unicode="" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M233 768v-107h70l164 -661h159l128 485q7 20 10 46q2 16 2 24h4l3 -24q1 -3 3.5 -20t5.5 -26l128 -485h159l164 661h70v107h-300v-107h90l-99 -438q-5 -20 -7 -46l-2 -21h-4l-3 21q-1 5 -4 21t-5 25l-144 545h-114l-144 -545q-2 -9 -4.5 -24.5t-3.5 -21.5l-4 -21h-4l-2 21 q-2 26 -7 46l-99 438h90v107h-300z" /> +<glyph unicode="" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M429 106v-106h281v106h-75l103 161q5 7 10 16.5t7.5 13.5t3.5 4h2q1 -4 5 -10q2 -4 4.5 -7.5t6 -8t6.5 -8.5l107 -161h-76v-106h291v106h-68l-192 273l195 282h67v107h-279v-107h74l-103 -159q-4 -7 -10 -16.5t-9 -13.5l-2 -3h-2q-1 4 -5 10q-6 11 -17 23l-106 159h76v107 h-290v-107h68l189 -272l-194 -283h-68z" /> +<glyph unicode="" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M416 106v-106h327v106h-93v167h137q76 0 118 15q67 23 106.5 87t39.5 146q0 81 -37 141t-100 87q-48 19 -130 19h-368v-107h92v-555h-92zM769 386h-119v268h120q52 0 83 -18q56 -33 56 -115q0 -89 -62 -120q-31 -15 -78 -15z" /> +<glyph unicode="" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M1280 320v-320h-1024v192l192 192l128 -128l384 384zM448 512q-80 0 -136 56t-56 136t56 136t136 56t136 -56t56 -136t-56 -136t-136 -56z" /> +<glyph unicode="" d="M640 1152v128h-128v-128h128zM768 1024v128h-128v-128h128zM640 896v128h-128v-128h128zM768 768v128h-128v-128h128zM1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400 v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-128v-128h-128v128h-512v-1536h1280zM781 593l107 -349q8 -27 8 -52q0 -83 -72.5 -137.5t-183.5 -54.5t-183.5 54.5t-72.5 137.5q0 25 8 52q21 63 120 396v128h128v-128h79 q22 0 39 -13t23 -34zM640 128q53 0 90.5 19t37.5 45t-37.5 45t-90.5 19t-90.5 -19t-37.5 -45t37.5 -45t90.5 -19z" /> +<glyph unicode="" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M620 686q20 -8 20 -30v-544q0 -22 -20 -30q-8 -2 -12 -2q-12 0 -23 9l-166 167h-131q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h131l166 167q16 15 35 7zM1037 -3q31 0 50 24q129 159 129 363t-129 363q-16 21 -43 24t-47 -14q-21 -17 -23.5 -43.5t14.5 -47.5 q100 -123 100 -282t-100 -282q-17 -21 -14.5 -47.5t23.5 -42.5q18 -15 40 -15zM826 145q27 0 47 20q87 93 87 219t-87 219q-18 19 -45 20t-46 -17t-20 -44.5t18 -46.5q52 -57 52 -131t-52 -131q-19 -20 -18 -46.5t20 -44.5q20 -17 44 -17z" /> +<glyph unicode="" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M768 768q52 0 90 -38t38 -90v-384q0 -52 -38 -90t-90 -38h-384q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h384zM1260 766q20 -8 20 -30v-576q0 -22 -20 -30q-8 -2 -12 -2q-14 0 -23 9l-265 266v90l265 266q9 9 23 9q4 0 12 -2z" /> +<glyph unicode="" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M480 768q8 11 21 12.5t24 -6.5l51 -38q11 -8 12.5 -21t-6.5 -24l-182 -243l182 -243q8 -11 6.5 -24t-12.5 -21l-51 -38q-11 -8 -24 -6.5t-21 12.5l-226 301q-14 19 0 38zM1282 467q14 -19 0 -38l-226 -301q-8 -11 -21 -12.5t-24 6.5l-51 38q-11 8 -12.5 21t6.5 24l182 243 l-182 243q-8 11 -6.5 24t12.5 21l51 38q11 8 24 6.5t21 -12.5zM662 6q-13 2 -20.5 13t-5.5 24l138 831q2 13 13 20.5t24 5.5l63 -10q13 -2 20.5 -13t5.5 -24l-138 -831q-2 -13 -13 -20.5t-24 -5.5z" /> +<glyph unicode="" d="M1497 709v-198q-101 -23 -198 -23q-65 -136 -165.5 -271t-181.5 -215.5t-128 -106.5q-80 -45 -162 3q-28 17 -60.5 43.5t-85 83.5t-102.5 128.5t-107.5 184t-105.5 244t-91.5 314.5t-70.5 390h283q26 -218 70 -398.5t104.5 -317t121.5 -235.5t140 -195q169 169 287 406 q-142 72 -223 220t-81 333q0 192 104 314.5t284 122.5q178 0 273 -105.5t95 -297.5q0 -159 -58 -286q-7 -1 -19.5 -3t-46 -2t-63 6t-62 25.5t-50.5 51.5q31 103 31 184q0 87 -29 132t-79 45q-53 0 -85 -49.5t-32 -140.5q0 -186 105 -293.5t267 -107.5q62 0 121 14z" /> +<glyph unicode="" horiz-adv-x="1792" d="M216 367l603 -402v359l-334 223zM154 511l193 129l-193 129v-258zM973 -35l603 402l-269 180l-334 -223v-359zM896 458l272 182l-272 182l-272 -182zM485 733l334 223v359l-603 -402zM1445 640l193 -129v258zM1307 733l269 180l-603 402v-359zM1792 913v-546 q0 -41 -34 -64l-819 -546q-21 -13 -43 -13t-43 13l-819 546q-34 23 -34 64v546q0 41 34 64l819 546q21 13 43 13t43 -13l819 -546q34 -23 34 -64z" /> +<glyph unicode="" horiz-adv-x="2048" d="M1800 764q111 -46 179.5 -145.5t68.5 -221.5q0 -164 -118 -280.5t-285 -116.5q-4 0 -11.5 0.5t-10.5 0.5h-1209h-1h-2h-5q-170 10 -288 125.5t-118 280.5q0 110 55 203t147 147q-12 39 -12 82q0 115 82 196t199 81q95 0 172 -58q75 154 222.5 248t326.5 94 q166 0 306 -80.5t221.5 -218.5t81.5 -301q0 -6 -0.5 -18t-0.5 -18zM468 498q0 -122 84 -193t208 -71q137 0 240 99q-16 20 -47.5 56.5t-43.5 50.5q-67 -65 -144 -65q-55 0 -93.5 33.5t-38.5 87.5q0 53 38.5 87t91.5 34q44 0 84.5 -21t73 -55t65 -75t69 -82t77 -75t97 -55 t121.5 -21q121 0 204.5 71.5t83.5 190.5q0 121 -84 192t-207 71q-143 0 -241 -97q14 -16 29.5 -34t34.5 -40t29 -34q66 64 142 64q52 0 92 -33t40 -84q0 -57 -37 -91.5t-94 -34.5q-43 0 -82.5 21t-72 55t-65.5 75t-69.5 82t-77.5 75t-96.5 55t-118.5 21q-122 0 -207 -70.5 t-85 -189.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM896 1408q-190 0 -361 -90l194 -194q82 28 167 28t167 -28l194 194q-171 90 -361 90zM218 279l194 194 q-28 82 -28 167t28 167l-194 194q-90 -171 -90 -361t90 -361zM896 -128q190 0 361 90l-194 194q-82 -28 -167 -28t-167 28l-194 -194q171 -90 361 -90zM896 256q159 0 271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5 t271.5 -112.5zM1380 473l194 -194q90 171 90 361t-90 361l-194 -194q28 -82 28 -167t-28 -167z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348q0 222 101 414.5t276.5 317t390.5 155.5v-260q-221 -45 -366.5 -221t-145.5 -406q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 q0 230 -145.5 406t-366.5 221v260q215 -31 390.5 -155.5t276.5 -317t101 -414.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M19 662q8 217 116 406t305 318h5q0 -1 -1 -3q-8 -8 -28 -33.5t-52 -76.5t-60 -110.5t-44.5 -135.5t-14 -150.5t39 -157.5t108.5 -154q50 -50 102 -69.5t90.5 -11.5t69.5 23.5t47 32.5l16 16q39 51 53 116.5t6.5 122.5t-21 107t-26.5 80l-14 29q-10 25 -30.5 49.5t-43 41 t-43.5 29.5t-35 19l-13 6l104 115q39 -17 78 -52t59 -61l19 -27q1 48 -18.5 103.5t-40.5 87.5l-20 31l161 183l160 -181q-33 -46 -52.5 -102.5t-22.5 -90.5l-4 -33q22 37 61.5 72.5t67.5 52.5l28 17l103 -115q-44 -14 -85 -50t-60 -65l-19 -29q-31 -56 -48 -133.5t-7 -170 t57 -156.5q33 -45 77.5 -60.5t85 -5.5t76 26.5t57.5 33.5l21 16q60 53 96.5 115t48.5 121.5t10 121.5t-18 118t-37 107.5t-45.5 93t-45 72t-34.5 47.5l-13 17q-14 13 -7 13l10 -3q40 -29 62.5 -46t62 -50t64 -58t58.5 -65t55.5 -77t45.5 -88t38 -103t23.5 -117t10.5 -136 q3 -259 -108 -465t-312 -321t-456 -115q-185 0 -351 74t-283.5 198t-184 293t-60.5 353z" /> +<glyph unicode="" horiz-adv-x="1792" d="M874 -102v-66q-208 6 -385 109.5t-283 275.5l58 34q29 -49 73 -99l65 57q148 -168 368 -212l-17 -86q65 -12 121 -13zM276 428l-83 -28q22 -60 49 -112l-57 -33q-98 180 -98 385t98 385l57 -33q-30 -56 -49 -112l82 -28q-35 -100 -35 -212q0 -109 36 -212zM1528 251 l58 -34q-106 -172 -283 -275.5t-385 -109.5v66q56 1 121 13l-17 86q220 44 368 212l65 -57q44 50 73 99zM1377 805l-233 -80q14 -42 14 -85t-14 -85l232 -80q-31 -92 -98 -169l-185 162q-57 -67 -147 -85l48 -241q-52 -10 -98 -10t-98 10l48 241q-90 18 -147 85l-185 -162 q-67 77 -98 169l232 80q-14 42 -14 85t14 85l-233 80q33 93 99 169l185 -162q59 68 147 86l-48 240q44 10 98 10t98 -10l-48 -240q88 -18 147 -86l185 162q66 -76 99 -169zM874 1448v-66q-65 -2 -121 -13l17 -86q-220 -42 -368 -211l-65 56q-38 -42 -73 -98l-57 33 q106 172 282 275.5t385 109.5zM1705 640q0 -205 -98 -385l-57 33q27 52 49 112l-83 28q36 103 36 212q0 112 -35 212l82 28q-19 56 -49 112l57 33q98 -180 98 -385zM1585 1063l-57 -33q-35 56 -73 98l-65 -56q-148 169 -368 211l17 86q-56 11 -121 13v66q209 -6 385 -109.5 t282 -275.5zM1748 640q0 173 -67.5 331t-181.5 272t-272 181.5t-331 67.5t-331 -67.5t-272 -181.5t-181.5 -272t-67.5 -331t67.5 -331t181.5 -272t272 -181.5t331 -67.5t331 67.5t272 181.5t181.5 272t67.5 331zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71 t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> +<glyph unicode="" d="M582 228q0 -66 -93 -66q-107 0 -107 63q0 64 98 64q102 0 102 -61zM546 694q0 -85 -74 -85q-77 0 -77 84q0 90 77 90q36 0 55 -25.5t19 -63.5zM712 769v125q-78 -29 -135 -29q-50 29 -110 29q-86 0 -145 -57t-59 -143q0 -50 29.5 -102t73.5 -67v-3q-38 -17 -38 -85 q0 -53 41 -77v-3q-113 -37 -113 -139q0 -45 20 -78.5t54 -51t72 -25.5t81 -8q224 0 224 188q0 67 -48 99t-126 46q-27 5 -51.5 20.5t-24.5 39.5q0 44 49 52q77 15 122 70t45 134q0 24 -10 52q37 9 49 13zM771 350h137q-2 27 -2 82v387q0 46 2 69h-137q3 -23 3 -71v-392 q0 -50 -3 -75zM1280 366v121q-30 -21 -68 -21q-53 0 -53 82v225h52q9 0 26.5 -1t26.5 -1v117h-105q0 82 3 102h-140q4 -24 4 -55v-47h-60v-117q36 3 37 3q3 0 11 -0.5t12 -0.5v-2h-2v-217q0 -37 2.5 -64t11.5 -56.5t24.5 -48.5t43.5 -31t66 -12q64 0 108 24zM924 1072 q0 36 -24 63.5t-60 27.5t-60.5 -27t-24.5 -64q0 -36 25 -62.5t60 -26.5t59.5 27t24.5 62zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M595 22q0 100 -165 100q-158 0 -158 -104q0 -101 172 -101q151 0 151 105zM536 777q0 61 -30 102t-89 41q-124 0 -124 -145q0 -135 124 -135q119 0 119 137zM805 1101v-202q-36 -12 -79 -22q16 -43 16 -84q0 -127 -73 -216.5t-197 -112.5q-40 -8 -59.5 -27t-19.5 -58 q0 -31 22.5 -51.5t58 -32t78.5 -22t86 -25.5t78.5 -37.5t58 -64t22.5 -98.5q0 -304 -363 -304q-69 0 -130 12.5t-116 41t-87.5 82t-32.5 127.5q0 165 182 225v4q-67 41 -67 126q0 109 63 137v4q-72 24 -119.5 108.5t-47.5 165.5q0 139 95 231.5t235 92.5q96 0 178 -47 q98 0 218 47zM1123 220h-222q4 45 4 134v609q0 94 -4 128h222q-4 -33 -4 -124v-613q0 -89 4 -134zM1724 442v-196q-71 -39 -174 -39q-62 0 -107 20t-70 50t-39.5 78t-18.5 92t-4 103v351h2v4q-7 0 -19 1t-18 1q-21 0 -59 -6v190h96v76q0 54 -6 89h227q-6 -41 -6 -165h171 v-190q-15 0 -43.5 2t-42.5 2h-85v-365q0 -131 87 -131q61 0 109 33zM1148 1389q0 -58 -39 -101.5t-96 -43.5q-58 0 -98 43.5t-40 101.5q0 59 39.5 103t98.5 44q58 0 96.5 -44.5t38.5 -102.5z" /> +<glyph unicode="" d="M825 547l343 588h-150q-21 -39 -63.5 -118.5t-68 -128.5t-59.5 -118.5t-60 -128.5h-3q-21 48 -44.5 97t-52 105.5t-46.5 92t-54 104.5t-49 95h-150l323 -589v-435h134v436zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960 q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" horiz-adv-x="1280" d="M842 964q0 -80 -57 -136.5t-136 -56.5q-60 0 -111 35q-62 -67 -115 -146q-247 -371 -202 -859q1 -22 -12.5 -38.5t-34.5 -18.5h-5q-20 0 -35 13.5t-17 33.5q-14 126 -3.5 247.5t29.5 217t54 186t69 155.5t74 125q61 90 132 165q-16 35 -16 77q0 80 56.5 136.5t136.5 56.5 t136.5 -56.5t56.5 -136.5zM1223 953q0 -158 -78 -292t-212.5 -212t-292.5 -78q-64 0 -131 14q-21 5 -32.5 23.5t-6.5 39.5q5 20 23 31.5t39 7.5q51 -13 108 -13q97 0 186 38t153 102t102 153t38 186t-38 186t-102 153t-153 102t-186 38t-186 -38t-153 -102t-102 -153 t-38 -186q0 -114 52 -218q10 -20 3.5 -40t-25.5 -30t-39.5 -3t-30.5 26q-64 123 -64 265q0 119 46.5 227t124.5 186t186 124t226 46q158 0 292.5 -78t212.5 -212.5t78 -292.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M270 730q-8 19 -8 52q0 20 11 49t24 45q-1 22 7.5 53t22.5 43q0 139 92.5 288.5t217.5 209.5q139 66 324 66q133 0 266 -55q49 -21 90 -48t71 -56t55 -68t42 -74t32.5 -84.5t25.5 -89.5t22 -98l1 -5q55 -83 55 -150q0 -14 -9 -40t-9 -38q0 -1 1.5 -3.5t3.5 -5t2 -3.5 q77 -114 120.5 -214.5t43.5 -208.5q0 -43 -19.5 -100t-55.5 -57q-9 0 -19.5 7.5t-19 17.5t-19 26t-16 26.5t-13.5 26t-9 17.5q-1 1 -3 1l-5 -4q-59 -154 -132 -223q20 -20 61.5 -38.5t69 -41.5t35.5 -65q-2 -4 -4 -16t-7 -18q-64 -97 -302 -97q-53 0 -110.5 9t-98 20 t-104.5 30q-15 5 -23 7q-14 4 -46 4.5t-40 1.5q-41 -45 -127.5 -65t-168.5 -20q-35 0 -69 1.5t-93 9t-101 20.5t-74.5 40t-32.5 64q0 40 10 59.5t41 48.5q11 2 40.5 13t49.5 12q4 0 14 2q2 2 2 4l-2 3q-48 11 -108 105.5t-73 156.5l-5 3q-4 0 -12 -20q-18 -41 -54.5 -74.5 t-77.5 -37.5h-1q-4 0 -6 4.5t-5 5.5q-23 54 -23 100q0 275 252 466z" /> +<glyph unicode="" horiz-adv-x="2048" d="M580 1075q0 41 -25 66t-66 25q-43 0 -76 -25.5t-33 -65.5q0 -39 33 -64.5t76 -25.5q41 0 66 24.5t25 65.5zM1323 568q0 28 -25.5 50t-65.5 22q-27 0 -49.5 -22.5t-22.5 -49.5q0 -28 22.5 -50.5t49.5 -22.5q40 0 65.5 22t25.5 51zM1087 1075q0 41 -24.5 66t-65.5 25 q-43 0 -76 -25.5t-33 -65.5q0 -39 33 -64.5t76 -25.5q41 0 65.5 24.5t24.5 65.5zM1722 568q0 28 -26 50t-65 22q-27 0 -49.5 -22.5t-22.5 -49.5q0 -28 22.5 -50.5t49.5 -22.5q39 0 65 22t26 51zM1456 965q-31 4 -70 4q-169 0 -311 -77t-223.5 -208.5t-81.5 -287.5 q0 -78 23 -152q-35 -3 -68 -3q-26 0 -50 1.5t-55 6.5t-44.5 7t-54.5 10.5t-50 10.5l-253 -127l72 218q-290 203 -290 490q0 169 97.5 311t264 223.5t363.5 81.5q176 0 332.5 -66t262 -182.5t136.5 -260.5zM2048 404q0 -117 -68.5 -223.5t-185.5 -193.5l55 -181l-199 109 q-150 -37 -218 -37q-169 0 -311 70.5t-223.5 191.5t-81.5 264t81.5 264t223.5 191.5t311 70.5q161 0 303 -70.5t227.5 -192t85.5 -263.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1764 1525q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-453 185l-242 -295q-18 -23 -49 -23q-13 0 -22 4q-19 7 -30.5 23.5t-11.5 36.5v349l864 1059l-1069 -925l-395 162q-37 14 -40 55q-2 40 32 59l1664 960q15 9 32 9q20 0 36 -11z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1764 1525q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-527 215l-298 -327q-18 -21 -47 -21q-14 0 -23 4q-19 7 -30 23.5t-11 36.5v452l-472 193q-37 14 -40 55q-3 39 32 59l1664 960q35 21 68 -2zM1422 26l221 1323l-1434 -827l336 -137 l863 639l-478 -797z" /> +<glyph unicode="" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5 t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298zM896 928v-448q0 -14 -9 -23 t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23z" /> +<glyph unicode="" d="M768 1280q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1682 -128q-44 0 -132.5 3.5t-133.5 3.5q-44 0 -132 -3.5t-132 -3.5q-24 0 -37 20.5t-13 45.5q0 31 17 46t39 17t51 7t45 15q33 21 33 140l-1 391q0 21 -1 31q-13 4 -50 4h-675q-38 0 -51 -4q-1 -10 -1 -31l-1 -371q0 -142 37 -164q16 -10 48 -13t57 -3.5t45 -15 t20 -45.5q0 -26 -12.5 -48t-36.5 -22q-47 0 -139.5 3.5t-138.5 3.5q-43 0 -128 -3.5t-127 -3.5q-23 0 -35.5 21t-12.5 45q0 30 15.5 45t36 17.5t47.5 7.5t42 15q33 23 33 143l-1 57v813q0 3 0.5 26t0 36.5t-1.5 38.5t-3.5 42t-6.5 36.5t-11 31.5t-16 18q-15 10 -45 12t-53 2 t-41 14t-18 45q0 26 12 48t36 22q46 0 138.5 -3.5t138.5 -3.5q42 0 126.5 3.5t126.5 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17 -43.5t-38.5 -14.5t-49.5 -4t-43 -13q-35 -21 -35 -160l1 -320q0 -21 1 -32q13 -3 39 -3h699q25 0 38 3q1 11 1 32l1 320q0 139 -35 160 q-18 11 -58.5 12.5t-66 13t-25.5 49.5q0 26 12.5 48t37.5 22q44 0 132 -3.5t132 -3.5q43 0 129 3.5t129 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17.5 -44t-40 -14.5t-51.5 -3t-44 -12.5q-35 -23 -35 -161l1 -943q0 -119 34 -140q16 -10 46 -13.5t53.5 -4.5t41.5 -15.5t18 -44.5 q0 -26 -12 -48t-36 -22z" /> +<glyph unicode="" horiz-adv-x="1280" d="M1278 1347v-73q0 -29 -18.5 -61t-42.5 -32q-50 0 -54 -1q-26 -6 -32 -31q-3 -11 -3 -64v-1152q0 -25 -18 -43t-43 -18h-108q-25 0 -43 18t-18 43v1218h-143v-1218q0 -25 -17.5 -43t-43.5 -18h-108q-26 0 -43.5 18t-17.5 43v496q-147 12 -245 59q-126 58 -192 179 q-64 117 -64 259q0 166 88 286q88 118 209 159q111 37 417 37h479q25 0 43 -18t18 -43z" /> +<glyph unicode="" d="M352 128v-128h-352v128h352zM704 256q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM864 640v-128h-864v128h864zM224 1152v-128h-224v128h224zM1536 128v-128h-736v128h736zM576 1280q26 0 45 -19t19 -45v-256 q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM1216 768q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM1536 640v-128h-224v128h224zM1536 1152v-128h-864v128h864z" /> +<glyph unicode="" d="M1216 512q133 0 226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5t-226.5 93.5t-93.5 226.5q0 12 2 34l-360 180q-92 -86 -218 -86q-133 0 -226.5 93.5t-93.5 226.5t93.5 226.5t226.5 93.5q126 0 218 -86l360 180q-2 22 -2 34q0 133 93.5 226.5t226.5 93.5 t226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5q-126 0 -218 86l-360 -180q2 -22 2 -34t-2 -34l360 -180q92 86 218 86z" /> +<glyph unicode="" d="M1280 341q0 88 -62.5 151t-150.5 63q-84 0 -145 -58l-241 120q2 16 2 23t-2 23l241 120q61 -58 145 -58q88 0 150.5 63t62.5 151t-62.5 150.5t-150.5 62.5t-151 -62.5t-63 -150.5q0 -7 2 -23l-241 -120q-62 57 -145 57q-88 0 -150.5 -62.5t-62.5 -150.5t62.5 -150.5 t150.5 -62.5q83 0 145 57l241 -120q-2 -16 -2 -23q0 -88 63 -150.5t151 -62.5t150.5 62.5t62.5 150.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M571 947q-10 25 -34 35t-49 0q-108 -44 -191 -127t-127 -191q-10 -25 0 -49t35 -34q13 -5 24 -5q42 0 60 40q34 84 98.5 148.5t148.5 98.5q25 11 35 35t0 49zM1513 1303l46 -46l-244 -243l68 -68q19 -19 19 -45.5t-19 -45.5l-64 -64q89 -161 89 -343q0 -143 -55.5 -273.5 t-150 -225t-225 -150t-273.5 -55.5t-273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5q182 0 343 -89l64 64q19 19 45.5 19t45.5 -19l68 -68zM1521 1359q-10 -10 -22 -10q-13 0 -23 10l-91 90q-9 10 -9 23t9 23q10 9 23 9t23 -9l90 -91 q10 -9 10 -22.5t-10 -22.5zM1751 1129q-11 -9 -23 -9t-23 9l-90 91q-10 9 -10 22.5t10 22.5q9 10 22.5 10t22.5 -10l91 -90q9 -10 9 -23t-9 -23zM1792 1312q0 -14 -9 -23t-23 -9h-96q-14 0 -23 9t-9 23t9 23t23 9h96q14 0 23 -9t9 -23zM1600 1504v-96q0 -14 -9 -23t-23 -9 t-23 9t-9 23v96q0 14 9 23t23 9t23 -9t9 -23zM1751 1449l-91 -90q-10 -10 -22 -10q-13 0 -23 10q-10 9 -10 22.5t10 22.5l90 91q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" /> +<glyph unicode="" horiz-adv-x="1792" d="M609 720l287 208l287 -208l-109 -336h-355zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM1515 186q149 203 149 454v3l-102 -89l-240 224l63 323 l134 -12q-150 206 -389 282l53 -124l-287 -159l-287 159l53 124q-239 -76 -389 -282l135 12l62 -323l-240 -224l-102 89v-3q0 -251 149 -454l30 132l326 -40l139 -298l-116 -69q117 -39 240 -39t240 39l-116 69l139 298l326 40z" /> +<glyph unicode="" horiz-adv-x="1792" d="M448 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM256 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM832 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23 v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM66 768q-28 0 -47 19t-19 46v129h514v-129q0 -27 -19 -46t-46 -19h-383zM1216 224v-192q0 -14 -9 -23t-23 -9h-192 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1600 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23 zM1408 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1016v-13h-514v10q0 104 -382 102q-382 -1 -382 -102v-10h-514v13q0 17 8.5 43t34 64t65.5 75.5t110.5 76t160 67.5t224 47.5t293.5 18.5t293 -18.5t224 -47.5 t160.5 -67.5t110.5 -76t65.5 -75.5t34 -64t8.5 -43zM1792 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 962v-129q0 -27 -19 -46t-46 -19h-384q-27 0 -46 19t-19 46v129h514z" /> +<glyph unicode="" horiz-adv-x="1792" d="M704 1216v-768q0 -26 -19 -45t-45 -19v-576q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v512l249 873q7 23 31 23h424zM1024 1216v-704h-256v704h256zM1792 320v-512q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v576q-26 0 -45 19t-19 45v768h424q24 0 31 -23z M736 1504v-224h-352v224q0 14 9 23t23 9h288q14 0 23 -9t9 -23zM1408 1504v-224h-352v224q0 14 9 23t23 9h288q14 0 23 -9t9 -23z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1755 1083q37 -37 37 -90t-37 -91l-401 -400l150 -150l-160 -160q-163 -163 -389.5 -186.5t-411.5 100.5l-362 -362h-181v181l362 362q-124 185 -100.5 411.5t186.5 389.5l160 160l150 -150l400 401q38 37 91 37t90 -37t37 -90.5t-37 -90.5l-400 -401l234 -234l401 400 q38 37 91 37t90 -37z" /> +<glyph unicode="" horiz-adv-x="1792" d="M873 796q0 -83 -63.5 -142.5t-152.5 -59.5t-152.5 59.5t-63.5 142.5q0 84 63.5 143t152.5 59t152.5 -59t63.5 -143zM1375 796q0 -83 -63 -142.5t-153 -59.5q-89 0 -152.5 59.5t-63.5 142.5q0 84 63.5 143t152.5 59q90 0 153 -59t63 -143zM1600 616v667q0 87 -32 123.5 t-111 36.5h-1112q-83 0 -112.5 -34t-29.5 -126v-673q43 -23 88.5 -40t81 -28t81 -18.5t71 -11t70 -4t58.5 -0.5t56.5 2t44.5 2q68 1 95 -27q6 -6 10 -9q26 -25 61 -51q7 91 118 87q5 0 36.5 -1.5t43 -2t45.5 -1t53 1t54.5 4.5t61 8.5t62 13.5t67 19.5t67.5 27t72 34.5z M1763 621q-121 -149 -372 -252q84 -285 -23 -465q-66 -113 -183 -148q-104 -32 -182 15q-86 51 -82 164l-1 326v1q-8 2 -24.5 6t-23.5 5l-1 -338q4 -114 -83 -164q-79 -47 -183 -15q-117 36 -182 150q-105 180 -22 463q-251 103 -372 252q-25 37 -4 63t60 -1q3 -2 11 -7 t11 -8v694q0 72 47 123t114 51h1257q67 0 114 -51t47 -123v-694l21 15q39 27 60 1t-4 -63z" /> +<glyph unicode="" horiz-adv-x="1792" d="M896 1102v-434h-145v434h145zM1294 1102v-434h-145v434h145zM1294 342l253 254v795h-1194v-1049h326v-217l217 217h398zM1692 1536v-1013l-434 -434h-326l-217 -217h-217v217h-398v1158l109 289h1483z" /> +<glyph unicode="" d="M773 217v-127q-1 -292 -6 -305q-12 -32 -51 -40q-54 -9 -181.5 38t-162.5 89q-13 15 -17 36q-1 12 4 26q4 10 34 47t181 216q1 0 60 70q15 19 39.5 24.5t49.5 -3.5q24 -10 37.5 -29t12.5 -42zM624 468q-3 -55 -52 -70l-120 -39q-275 -88 -292 -88q-35 2 -54 36 q-12 25 -17 75q-8 76 1 166.5t30 124.5t56 32q13 0 202 -77q70 -29 115 -47l84 -34q23 -9 35.5 -30.5t11.5 -48.5zM1450 171q-7 -54 -91.5 -161t-135.5 -127q-37 -14 -63 7q-14 10 -184 287l-47 77q-14 21 -11.5 46t19.5 46q35 43 83 26q1 -1 119 -40q203 -66 242 -79.5 t47 -20.5q28 -22 22 -61zM778 803q5 -102 -54 -122q-58 -17 -114 71l-378 598q-8 35 19 62q41 43 207.5 89.5t224.5 31.5q40 -10 49 -45q3 -18 22 -305.5t24 -379.5zM1440 695q3 -39 -26 -59q-15 -10 -329 -86q-67 -15 -91 -23l1 2q-23 -6 -46 4t-37 32q-30 47 0 87 q1 1 75 102q125 171 150 204t34 39q28 19 65 2q48 -23 123 -133.5t81 -167.5v-3z" /> +<glyph unicode="" horiz-adv-x="2048" d="M1024 1024h-384v-384h384v384zM1152 384v-128h-640v128h640zM1152 1152v-640h-640v640h640zM1792 384v-128h-512v128h512zM1792 640v-128h-512v128h512zM1792 896v-128h-512v128h512zM1792 1152v-128h-512v128h512zM256 192v960h-128v-960q0 -26 19 -45t45 -19t45 19 t19 45zM1920 192v1088h-1536v-1088q0 -33 -11 -64h1483q26 0 45 19t19 45zM2048 1408v-1216q0 -80 -56 -136t-136 -56h-1664q-80 0 -136 56t-56 136v1088h256v128h1792z" /> +<glyph unicode="" horiz-adv-x="2048" d="M1024 13q-20 0 -93 73.5t-73 93.5q0 32 62.5 54t103.5 22t103.5 -22t62.5 -54q0 -20 -73 -93.5t-93 -73.5zM1294 284q-2 0 -40 25t-101.5 50t-128.5 25t-128.5 -25t-101 -50t-40.5 -25q-18 0 -93.5 75t-75.5 93q0 13 10 23q78 77 196 121t233 44t233 -44t196 -121 q10 -10 10 -23q0 -18 -75.5 -93t-93.5 -75zM1567 556q-11 0 -23 8q-136 105 -252 154.5t-268 49.5q-85 0 -170.5 -22t-149 -53t-113.5 -62t-79 -53t-31 -22q-17 0 -92 75t-75 93q0 12 10 22q132 132 320 205t380 73t380 -73t320 -205q10 -10 10 -22q0 -18 -75 -93t-92 -75z M1838 827q-11 0 -22 9q-179 157 -371.5 236.5t-420.5 79.5t-420.5 -79.5t-371.5 -236.5q-11 -9 -22 -9q-17 0 -92.5 75t-75.5 93q0 13 10 23q187 186 445 288t527 102t527 -102t445 -288q10 -10 10 -23q0 -18 -75.5 -93t-92.5 -75z" /> +<glyph unicode="" horiz-adv-x="1792" d="M384 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5 t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1152 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5 t37.5 90.5zM384 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1152 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 768q0 53 -37.5 90.5t-90.5 37.5 t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1536 0v384q0 52 -38 90t-90 38t-90 -38t-38 -90v-384q0 -52 38 -90t90 -38t90 38t38 90zM1152 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5z M1536 1088v256q0 26 -19 45t-45 19h-1280q-26 0 -45 -19t-19 -45v-256q0 -26 19 -45t45 -19h1280q26 0 45 19t19 45zM1536 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1408v-1536q0 -52 -38 -90t-90 -38 h-1408q-52 0 -90 38t-38 90v1536q0 52 38 90t90 38h1408q52 0 90 -38t38 -90z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1112 1090q0 159 -237 159h-70q-32 0 -59.5 -21.5t-34.5 -52.5l-63 -276q-2 -5 -2 -16q0 -24 17 -39.5t41 -15.5h53q69 0 128.5 13t112.5 41t83.5 81.5t30.5 126.5zM1716 938q0 -265 -220 -428q-219 -161 -612 -161h-61q-32 0 -59 -21.5t-34 -52.5l-73 -316 q-8 -36 -40.5 -61.5t-69.5 -25.5h-213q-31 0 -53 20t-22 51q0 10 13 65h151q34 0 64 23.5t38 56.5l73 316q8 33 37.5 57t63.5 24h61q390 0 607 160t217 421q0 129 -51 207q183 -92 183 -335zM1533 1123q0 -264 -221 -428q-218 -161 -612 -161h-60q-32 0 -59.5 -22t-34.5 -53 l-73 -315q-8 -36 -40 -61.5t-69 -25.5h-214q-31 0 -52.5 19.5t-21.5 51.5q0 8 2 20l300 1301q8 36 40.5 61.5t69.5 25.5h444q68 0 125 -4t120.5 -15t113.5 -30t96.5 -50.5t77.5 -74t49.5 -103.5t18.5 -136z" /> +<glyph unicode="" horiz-adv-x="1792" d="M602 949q19 -61 31 -123.5t17 -141.5t-14 -159t-62 -145q-21 81 -67 157t-95.5 127t-99 90.5t-78.5 57.5t-33 19q-62 34 -81.5 100t14.5 128t101 81.5t129 -14.5q138 -83 238 -177zM927 1236q11 -25 20.5 -46t36.5 -100.5t42.5 -150.5t25.5 -179.5t0 -205.5t-47.5 -209.5 t-105.5 -208.5q-51 -72 -138 -72q-54 0 -98 31q-57 40 -69 109t28 127q60 85 81 195t13 199.5t-32 180.5t-39 128t-22 52q-31 63 -8.5 129.5t85.5 97.5q34 17 75 17q47 0 88.5 -25t63.5 -69zM1248 567q-17 -160 -72 -311q-17 131 -63 246q25 174 -5 361q-27 178 -94 342 q114 -90 212 -211q9 -37 15 -80q26 -179 7 -347zM1520 1440q9 -17 23.5 -49.5t43.5 -117.5t50.5 -178t34 -227.5t5 -269t-47 -300t-112.5 -323.5q-22 -48 -66 -75.5t-95 -27.5q-39 0 -74 16q-67 31 -92.5 100t4.5 136q58 126 90 257.5t37.5 239.5t-3.5 213.5t-26.5 180.5 t-38.5 138.5t-32.5 90t-15.5 32.5q-34 65 -11.5 135.5t87.5 104.5q37 20 81 20q49 0 91.5 -25.5t66.5 -70.5z" /> +<glyph unicode="" horiz-adv-x="2304" d="M1975 546h-138q14 37 66 179l3 9q4 10 10 26t9 26l12 -55zM531 611l-58 295q-11 54 -75 54h-268l-2 -13q311 -79 403 -336zM710 960l-162 -438l-17 89q-26 70 -85 129.5t-131 88.5l135 -510h175l261 641h-176zM849 318h166l104 642h-166zM1617 944q-69 27 -149 27 q-123 0 -201 -59t-79 -153q-1 -102 145 -174q48 -23 67 -41t19 -39q0 -30 -30 -46t-69 -16q-86 0 -156 33l-22 11l-23 -144q74 -34 185 -34q130 -1 208.5 59t80.5 160q0 106 -140 174q-49 25 -71 42t-22 38q0 22 24.5 38.5t70.5 16.5q70 1 124 -24l15 -8zM2042 960h-128 q-65 0 -87 -54l-246 -588h174l35 96h212q5 -22 20 -96h154zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" /> +<glyph unicode="" horiz-adv-x="2304" d="M671 603h-13q-47 0 -47 -32q0 -22 20 -22q17 0 28 15t12 39zM1066 639h62v3q1 4 0.5 6.5t-1 7t-2 8t-4.5 6.5t-7.5 5t-11.5 2q-28 0 -36 -38zM1606 603h-12q-48 0 -48 -32q0 -22 20 -22q17 0 28 15t12 39zM1925 629q0 41 -30 41q-19 0 -31 -20t-12 -51q0 -42 28 -42 q20 0 32.5 20t12.5 52zM480 770h87l-44 -262h-56l32 201l-71 -201h-39l-4 200l-34 -200h-53l44 262h81l2 -163zM733 663q0 -6 -4 -42q-16 -101 -17 -113h-47l1 22q-20 -26 -58 -26q-23 0 -37.5 16t-14.5 42q0 39 26 60.5t73 21.5q14 0 23 -1q0 3 0.5 5.5t1 4.5t0.5 3 q0 20 -36 20q-29 0 -59 -10q0 4 7 48q38 11 67 11q74 0 74 -62zM889 721l-8 -49q-22 3 -41 3q-27 0 -27 -17q0 -8 4.5 -12t21.5 -11q40 -19 40 -60q0 -72 -87 -71q-34 0 -58 6q0 2 7 49q29 -8 51 -8q32 0 32 19q0 7 -4.5 11.5t-21.5 12.5q-43 20 -43 59q0 72 84 72 q30 0 50 -4zM977 721h28l-7 -52h-29q-2 -17 -6.5 -40.5t-7 -38.5t-2.5 -18q0 -16 19 -16q8 0 16 2l-8 -47q-21 -7 -40 -7q-43 0 -45 47q0 12 8 56q3 20 25 146h55zM1180 648q0 -23 -7 -52h-111q-3 -22 10 -33t38 -11q30 0 58 14l-9 -54q-30 -8 -57 -8q-95 0 -95 95 q0 55 27.5 90.5t69.5 35.5q35 0 55.5 -21t20.5 -56zM1319 722q-13 -23 -22 -62q-22 2 -31 -24t-25 -128h-56l3 14q22 130 29 199h51l-3 -33q14 21 25.5 29.5t28.5 4.5zM1506 763l-9 -57q-28 14 -50 14q-31 0 -51 -27.5t-20 -70.5q0 -30 13.5 -47t38.5 -17q21 0 48 13 l-10 -59q-28 -8 -50 -8q-45 0 -71.5 30.5t-26.5 82.5q0 70 35.5 114.5t91.5 44.5q26 0 61 -13zM1668 663q0 -18 -4 -42q-13 -79 -17 -113h-46l1 22q-20 -26 -59 -26q-23 0 -37 16t-14 42q0 39 25.5 60.5t72.5 21.5q15 0 23 -1q2 7 2 13q0 20 -36 20q-29 0 -59 -10q0 4 8 48 q38 11 67 11q73 0 73 -62zM1809 722q-14 -24 -21 -62q-23 2 -31.5 -23t-25.5 -129h-56l3 14q19 104 29 199h52q0 -11 -4 -33q15 21 26.5 29.5t27.5 4.5zM1950 770h56l-43 -262h-53l3 19q-23 -23 -52 -23q-31 0 -49.5 24t-18.5 64q0 53 27.5 92t64.5 39q31 0 53 -29z M2061 640q0 148 -72.5 273t-198 198t-273.5 73q-181 0 -328 -110q127 -116 171 -284h-50q-44 150 -158 253q-114 -103 -158 -253h-50q44 168 171 284q-147 110 -328 110q-148 0 -273.5 -73t-198 -198t-72.5 -273t72.5 -273t198 -198t273.5 -73q181 0 328 110 q-120 111 -165 264h50q46 -138 152 -233q106 95 152 233h50q-45 -153 -165 -264q147 -110 328 -110q148 0 273.5 73t198 198t72.5 273zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" /> +<glyph unicode="" horiz-adv-x="2304" d="M313 759q0 -51 -36 -84q-29 -26 -89 -26h-17v220h17q61 0 89 -27q36 -31 36 -83zM2089 824q0 -52 -64 -52h-19v101h20q63 0 63 -49zM380 759q0 74 -50 120.5t-129 46.5h-95v-333h95q74 0 119 38q60 51 60 128zM410 593h65v333h-65v-333zM730 694q0 40 -20.5 62t-75.5 42 q-29 10 -39.5 19t-10.5 23q0 16 13.5 26.5t34.5 10.5q29 0 53 -27l34 44q-41 37 -98 37q-44 0 -74 -27.5t-30 -67.5q0 -35 18 -55.5t64 -36.5q37 -13 45 -19q19 -12 19 -34q0 -20 -14 -33.5t-36 -13.5q-48 0 -71 44l-42 -40q44 -64 115 -64q51 0 83 30.5t32 79.5zM1008 604 v77q-37 -37 -78 -37q-49 0 -80.5 32.5t-31.5 82.5q0 48 31.5 81.5t77.5 33.5q43 0 81 -38v77q-40 20 -80 20q-74 0 -125.5 -50.5t-51.5 -123.5t51 -123.5t125 -50.5q42 0 81 19zM2240 0v527q-65 -40 -144.5 -84t-237.5 -117t-329.5 -137.5t-417.5 -134.5t-504 -118h1569 q26 0 45 19t19 45zM1389 757q0 75 -53 128t-128 53t-128 -53t-53 -128t53 -128t128 -53t128 53t53 128zM1541 584l144 342h-71l-90 -224l-89 224h-71l142 -342h35zM1714 593h184v56h-119v90h115v56h-115v74h119v57h-184v-333zM2105 593h80l-105 140q76 16 76 94q0 47 -31 73 t-87 26h-97v-333h65v133h9zM2304 1274v-1268q0 -56 -38.5 -95t-93.5 -39h-2040q-55 0 -93.5 39t-38.5 95v1268q0 56 38.5 95t93.5 39h2040q55 0 93.5 -39t38.5 -95z" /> +<glyph unicode="" horiz-adv-x="2304" d="M119 854h89l-45 108zM740 328l74 79l-70 79h-163v-49h142v-55h-142v-54h159zM898 406l99 -110v217zM1186 453q0 33 -40 33h-84v-69h83q41 0 41 36zM1475 457q0 29 -42 29h-82v-61h81q43 0 43 32zM1197 923q0 29 -42 29h-82v-60h81q43 0 43 31zM1656 854h89l-44 108z M699 1009v-271h-66v212l-94 -212h-57l-94 212v-212h-132l-25 60h-135l-25 -60h-70l116 271h96l110 -257v257h106l85 -184l77 184h108zM1255 453q0 -20 -5.5 -35t-14 -25t-22.5 -16.5t-26 -10t-31.5 -4.5t-31.5 -1t-32.5 0.5t-29.5 0.5v-91h-126l-80 90l-83 -90h-256v271h260 l80 -89l82 89h207q109 0 109 -89zM964 794v-56h-217v271h217v-57h-152v-49h148v-55h-148v-54h152zM2304 235v-229q0 -55 -38.5 -94.5t-93.5 -39.5h-2040q-55 0 -93.5 39.5t-38.5 94.5v678h111l25 61h55l25 -61h218v46l19 -46h113l20 47v-47h541v99l10 1q10 0 10 -14v-86h279 v23q23 -12 55 -18t52.5 -6.5t63 0.5t51.5 1l25 61h56l25 -61h227v58l34 -58h182v378h-180v-44l-25 44h-185v-44l-23 44h-249q-69 0 -109 -22v22h-172v-22q-24 22 -73 22h-628l-43 -97l-43 97h-198v-44l-22 44h-169l-78 -179v391q0 55 38.5 94.5t93.5 39.5h2040 q55 0 93.5 -39.5t38.5 -94.5v-678h-120q-51 0 -81 -22v22h-177q-55 0 -78 -22v22h-316v-22q-31 22 -87 22h-209v-22q-23 22 -91 22h-234l-54 -58l-50 58h-349v-378h343l55 59l52 -59h211v89h21q59 0 90 13v-102h174v99h8q8 0 10 -2t2 -10v-87h529q57 0 88 24v-24h168 q60 0 95 17zM1546 469q0 -23 -12 -43t-34 -29q25 -9 34 -26t9 -46v-54h-65v45q0 33 -12 43.5t-46 10.5h-69v-99h-65v271h154q48 0 77 -15t29 -58zM1269 936q0 -24 -12.5 -44t-33.5 -29q26 -9 34.5 -25.5t8.5 -46.5v-53h-65q0 9 0.5 26.5t0 25t-3 18.5t-8.5 16t-17.5 8.5 t-29.5 3.5h-70v-98h-64v271l153 -1q49 0 78 -14.5t29 -57.5zM1798 327v-56h-216v271h216v-56h-151v-49h148v-55h-148v-54zM1372 1009v-271h-66v271h66zM2065 357q0 -86 -102 -86h-126v58h126q34 0 34 25q0 16 -17 21t-41.5 5t-49.5 3.5t-42 22.5t-17 55q0 39 26 60t66 21 h130v-57h-119q-36 0 -36 -25q0 -16 17.5 -20.5t42 -4t49 -2.5t42 -21.5t17.5 -54.5zM2304 407v-101q-24 -35 -88 -35h-125v58h125q33 0 33 25q0 13 -12.5 19t-31 5.5t-40 2t-40 8t-31 24t-12.5 48.5q0 39 26.5 60t66.5 21h129v-57h-118q-36 0 -36 -25q0 -20 29 -22t68.5 -5 t56.5 -26zM2139 1008v-270h-92l-122 203v-203h-132l-26 60h-134l-25 -60h-75q-129 0 -129 133q0 138 133 138h63v-59q-7 0 -28 1t-28.5 0.5t-23 -2t-21.5 -6.5t-14.5 -13.5t-11.5 -23t-3 -33.5q0 -38 13.5 -58t49.5 -20h29l92 213h97l109 -256v256h99l114 -188v188h66z" /> +<glyph unicode="" horiz-adv-x="2304" d="M322 689h-15q-19 0 -19 18q0 28 19 85q5 15 15 19.5t28 4.5q77 0 77 -49q0 -41 -30.5 -59.5t-74.5 -18.5zM664 528q-47 0 -47 29q0 62 123 62l3 -3q-5 -88 -79 -88zM1438 687h-15q-19 0 -19 19q0 28 19 85q5 15 14.5 19t28.5 4q77 0 77 -49q0 -41 -30.5 -59.5 t-74.5 -18.5zM1780 527q-47 0 -47 30q0 62 123 62l3 -3q-5 -89 -79 -89zM373 894h-128q-8 0 -14.5 -4t-8.5 -7.5t-7 -12.5q-3 -7 -45 -190t-42 -192q0 -7 5.5 -12.5t13.5 -5.5h62q25 0 32.5 34.5l15 69t32.5 34.5q47 0 87.5 7.5t80.5 24.5t63.5 52.5t23.5 84.5 q0 36 -14.5 61t-41 36.5t-53.5 15.5t-62 4zM719 798q-38 0 -74 -6q-2 0 -8.5 -1t-9 -1.5l-7.5 -1.5t-7.5 -2t-6.5 -3t-6.5 -4t-5 -5t-4.5 -7t-4 -9q-9 -29 -9 -39t9 -10q5 0 21.5 5t19.5 6q30 8 58 8q74 0 74 -36q0 -11 -10 -14q-8 -2 -18 -3t-21.5 -1.5t-17.5 -1.5 q-38 -4 -64.5 -10t-56.5 -19.5t-45.5 -39t-15.5 -62.5q0 -38 26 -59.5t64 -21.5q24 0 45.5 6.5t33 13t38.5 23.5q-3 -7 -3 -15t5.5 -13.5t12.5 -5.5h56q1 1 7 3.5t7.5 3.5t5 3.5t5 5.5t2.5 8l45 194q4 13 4 30q0 81 -145 81zM1247 793h-74q-22 0 -39 -23q-5 -7 -29.5 -51 t-46.5 -81.5t-26 -38.5l-5 4q0 77 -27 166q-1 5 -3.5 8.5t-6 6.5t-6.5 5t-8.5 3t-8.5 1.5t-9.5 1t-9 0.5h-10h-8.5q-38 0 -38 -21l1 -5q5 -53 25 -151t25 -143q2 -16 2 -24q0 -19 -30.5 -61.5t-30.5 -58.5q0 -13 40 -13q61 0 76 25l245 415q10 20 10 26q0 9 -8 9zM1489 892 h-129q-18 0 -29 -23q-6 -13 -46.5 -191.5t-40.5 -190.5q0 -20 43 -20h7.5h9h9t9.5 1t8.5 2t8.5 3t6.5 4.5t5.5 6t3 8.5l21 91q2 10 10.5 17t19.5 7q47 0 87.5 7t80.5 24.5t63.5 52.5t23.5 84q0 36 -14.5 61t-41 36.5t-53.5 15.5t-62 4zM1835 798q-26 0 -74 -6 q-38 -6 -48 -16q-7 -8 -11 -19q-8 -24 -8 -39q0 -10 8 -10q1 0 41 12q30 8 58 8q74 0 74 -36q0 -12 -10 -14q-4 -1 -57 -7q-38 -4 -64.5 -10t-56.5 -19.5t-45.5 -39t-15.5 -62.5t26 -58.5t64 -21.5q24 0 45 6t34 13t38 24q-3 -15 -3 -16q0 -5 2 -8.5t6.5 -5.5t8 -3.5 t10.5 -2t9.5 -0.5h9.5h8q42 0 48 25l45 194q3 15 3 31q0 81 -145 81zM2157 889h-55q-25 0 -33 -40q-10 -44 -36.5 -167t-42.5 -190v-5q0 -16 16 -18h1h57q10 0 18.5 6.5t10.5 16.5l83 374h-1l1 5q0 7 -5.5 12.5t-13.5 5.5zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048 q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" /> +<glyph unicode="" horiz-adv-x="2304" d="M1597 633q0 -69 -21 -106q-19 -35 -52 -35q-23 0 -41 9v224q29 30 57 30q57 0 57 -122zM2035 669h-110q6 98 56 98q51 0 54 -98zM476 534q0 59 -33 91.5t-101 57.5q-36 13 -52 24t-16 25q0 26 38 26q58 0 124 -33l18 112q-67 32 -149 32q-77 0 -123 -38q-48 -39 -48 -109 q0 -58 32.5 -90.5t99.5 -56.5q39 -14 54.5 -25.5t15.5 -27.5q0 -31 -48 -31q-29 0 -70 12.5t-72 30.5l-18 -113q72 -41 168 -41q81 0 129 37q51 41 51 117zM771 749l19 111h-96v135l-129 -21l-18 -114l-46 -8l-17 -103h62v-219q0 -84 44 -120q38 -30 111 -30q32 0 79 11v118 q-32 -7 -44 -7q-42 0 -42 50v197h77zM1087 724v139q-15 3 -28 3q-32 0 -55.5 -16t-33.5 -46l-10 56h-131v-471h150v306q26 31 82 31q16 0 26 -2zM1124 389h150v471h-150v-471zM1746 638q0 122 -45 179q-40 52 -111 52q-64 0 -117 -56l-8 47h-132v-645l150 25v151 q36 -11 68 -11q83 0 134 56q61 65 61 202zM1278 986q0 33 -23 56t-56 23t-56 -23t-23 -56t23 -56.5t56 -23.5t56 23.5t23 56.5zM2176 629q0 113 -48 176q-50 64 -144 64q-96 0 -151.5 -66t-55.5 -180q0 -128 63 -188q55 -55 161 -55q101 0 160 40l-16 103q-57 -31 -128 -31 q-43 0 -63 19q-23 19 -28 66h248q2 14 2 52zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" /> +<glyph unicode="" horiz-adv-x="2048" d="M1558 684q61 -356 298 -556q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-180.5 74.5t-75.5 180.5zM1024 -176q16 0 16 16t-16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5zM2026 1424q8 -10 7.5 -23.5t-10.5 -22.5 l-1872 -1622q-10 -8 -23.5 -7t-21.5 11l-84 96q-8 10 -7.5 23.5t10.5 21.5l186 161q-19 32 -19 66q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q124 -18 219 -82.5t148 -157.5 l418 363q10 8 23.5 7t21.5 -11z" /> +<glyph unicode="" horiz-adv-x="2048" d="M1040 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM503 315l877 760q-42 88 -132.5 146.5t-223.5 58.5q-93 0 -169.5 -31.5t-121.5 -80.5t-69 -103t-24 -105q0 -384 -137 -645zM1856 128 q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-180.5 74.5t-75.5 180.5l149 129h757q-166 187 -227 459l111 97q61 -356 298 -556zM1942 1520l84 -96q8 -10 7.5 -23.5t-10.5 -22.5l-1872 -1622q-10 -8 -23.5 -7t-21.5 11l-84 96q-8 10 -7.5 23.5t10.5 21.5l186 161 q-19 32 -19 66q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q124 -18 219 -82.5t148 -157.5l418 363q10 8 23.5 7t21.5 -11z" /> +<glyph unicode="" horiz-adv-x="1408" d="M512 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM768 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1024 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704 q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167 q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" /> +<glyph unicode="" d="M1150 462v-109q0 -50 -36.5 -89t-94 -60.5t-118 -32.5t-117.5 -11q-205 0 -342.5 139t-137.5 346q0 203 136 339t339 136q34 0 75.5 -4.5t93 -18t92.5 -34t69 -56.5t28 -81v-109q0 -16 -16 -16h-118q-16 0 -16 16v70q0 43 -65.5 67.5t-137.5 24.5q-140 0 -228.5 -91.5 t-88.5 -237.5q0 -151 91.5 -249.5t233.5 -98.5q68 0 138 24t70 66v70q0 7 4.5 11.5t10.5 4.5h119q6 0 11 -4.5t5 -11.5zM768 1280q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M972 761q0 108 -53.5 169t-147.5 61q-63 0 -124 -30.5t-110 -84.5t-79.5 -137t-30.5 -180q0 -112 53.5 -173t150.5 -61q96 0 176 66.5t122.5 166t42.5 203.5zM1536 640q0 -111 -37 -197t-98.5 -135t-131.5 -74.5t-145 -27.5q-6 0 -15.5 -0.5t-16.5 -0.5q-95 0 -142 53 q-28 33 -33 83q-52 -66 -131.5 -110t-173.5 -44q-161 0 -249.5 95.5t-88.5 269.5q0 157 66 290t179 210.5t246 77.5q87 0 155 -35.5t106 -99.5l2 19l11 56q1 6 5.5 12t9.5 6h118q5 0 13 -11q5 -5 3 -16l-120 -614q-5 -24 -5 -48q0 -39 12.5 -52t44.5 -13q28 1 57 5.5t73 24 t77 50t57 89.5t24 137q0 292 -174 466t-466 174q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51q228 0 405 144q11 9 24 8t21 -12l41 -49q8 -12 7 -24q-2 -13 -12 -22q-102 -83 -227.5 -128t-258.5 -45q-156 0 -298 61 t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q344 0 556 -212t212 -556z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1698 1442q94 -94 94 -226.5t-94 -225.5l-225 -223l104 -104q10 -10 10 -23t-10 -23l-210 -210q-10 -10 -23 -10t-23 10l-105 105l-603 -603q-37 -37 -90 -37h-203l-256 -128l-64 64l128 256v203q0 53 37 90l603 603l-105 105q-10 10 -10 23t10 23l210 210q10 10 23 10 t23 -10l104 -104l223 225q93 94 225.5 94t226.5 -94zM512 64l576 576l-192 192l-576 -576v-192h192z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1615 1536q70 0 122.5 -46.5t52.5 -116.5q0 -63 -45 -151q-332 -629 -465 -752q-97 -91 -218 -91q-126 0 -216.5 92.5t-90.5 219.5q0 128 92 212l638 579q59 54 130 54zM706 502q39 -76 106.5 -130t150.5 -76l1 -71q4 -213 -129.5 -347t-348.5 -134q-123 0 -218 46.5 t-152.5 127.5t-86.5 183t-29 220q7 -5 41 -30t62 -44.5t59 -36.5t46 -17q41 0 55 37q25 66 57.5 112.5t69.5 76t88 47.5t103 25.5t125 10.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1792 128v-384h-1792v384q45 0 85 14t59 27.5t47 37.5q30 27 51.5 38t56.5 11t55.5 -11t52.5 -38q29 -25 47 -38t58 -27t86 -14q45 0 85 14.5t58 27t48 37.5q21 19 32.5 27t31 15t43.5 7q35 0 56.5 -11t51.5 -38q28 -24 47 -37.5t59 -27.5t85 -14t85 14t59 27.5t47 37.5 q30 27 51.5 38t56.5 11q34 0 55.5 -11t51.5 -38q28 -24 47 -37.5t59 -27.5t85 -14zM1792 448v-192q-35 0 -55.5 11t-52.5 38q-29 25 -47 38t-58 27t-85 14q-46 0 -86 -14t-58 -27t-47 -38q-22 -19 -33 -27t-31 -15t-44 -7q-35 0 -56.5 11t-51.5 38q-29 25 -47 38t-58 27 t-86 14q-45 0 -85 -14.5t-58 -27t-48 -37.5q-21 -19 -32.5 -27t-31 -15t-43.5 -7q-35 0 -56.5 11t-51.5 38q-28 24 -47 37.5t-59 27.5t-85 14q-46 0 -86 -14t-58 -27t-47 -38q-30 -27 -51.5 -38t-56.5 -11v192q0 80 56 136t136 56h64v448h256v-448h256v448h256v-448h256v448 h256v-448h64q80 0 136 -56t56 -136zM512 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150zM1024 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51 t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150zM1536 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150z" /> +<glyph unicode="" horiz-adv-x="2048" d="M2048 0v-128h-2048v1536h128v-1408h1920zM1664 1024l256 -896h-1664v576l448 576l576 -576z" /> +<glyph unicode="" horiz-adv-x="1792" d="M768 646l546 -546q-106 -108 -247.5 -168t-298.5 -60q-209 0 -385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103v-762zM955 640h773q0 -157 -60 -298.5t-168 -247.5zM1664 768h-768v768q209 0 385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" horiz-adv-x="2048" d="M2048 0v-128h-2048v1536h128v-1408h1920zM1920 1248v-435q0 -21 -19.5 -29.5t-35.5 7.5l-121 121l-633 -633q-10 -10 -23 -10t-23 10l-233 233l-416 -416l-192 192l585 585q10 10 23 10t23 -10l233 -233l464 464l-121 121q-16 16 -7.5 35.5t29.5 19.5h435q14 0 23 -9 t9 -23z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1292 832q0 -6 10 -41q10 -29 25 -49.5t41 -34t44 -20t55 -16.5q325 -91 325 -332q0 -146 -105.5 -242.5t-254.5 -96.5q-59 0 -111.5 18.5t-91.5 45.5t-77 74.5t-63 87.5t-53.5 103.5t-43.5 103t-39.5 106.5t-35.5 95q-32 81 -61.5 133.5t-73.5 96.5t-104 64t-142 20 q-96 0 -183 -55.5t-138 -144.5t-51 -185q0 -160 106.5 -279.5t263.5 -119.5q177 0 258 95q56 63 83 116l84 -152q-15 -34 -44 -70l1 -1q-131 -152 -388 -152q-147 0 -269.5 79t-190.5 207.5t-68 274.5q0 105 43.5 206t116 176.5t172 121.5t204.5 46q87 0 159 -19t123.5 -50 t95 -80t72.5 -99t58.5 -117t50.5 -124.5t50 -130.5t55 -127q96 -200 233 -200q81 0 138.5 48.5t57.5 128.5q0 42 -19 72t-50.5 46t-72.5 31.5t-84.5 27t-87.5 34t-81 52t-65 82t-39 122.5q-3 16 -3 33q0 110 87.5 192t198.5 78q78 -3 120.5 -14.5t90.5 -53.5h-1 q12 -11 23 -24.5t26 -36t19 -27.5l-129 -99q-26 49 -54 70v1q-23 21 -97 21q-49 0 -84 -33t-35 -83z" /> +<glyph unicode="" d="M1432 484q0 173 -234 239q-35 10 -53 16.5t-38 25t-29 46.5q0 2 -2 8.5t-3 12t-1 7.5q0 36 24.5 59.5t60.5 23.5q54 0 71 -15h-1q20 -15 39 -51l93 71q-39 54 -49 64q-33 29 -67.5 39t-85.5 10q-80 0 -142 -57.5t-62 -137.5q0 -7 2 -23q16 -96 64.5 -140t148.5 -73 q29 -8 49 -15.5t45 -21.5t38.5 -34.5t13.5 -46.5v-5q1 -58 -40.5 -93t-100.5 -35q-97 0 -167 144q-23 47 -51.5 121.5t-48 125.5t-54 110.5t-74 95.5t-103.5 60.5t-147 24.5q-101 0 -192 -56t-144 -148t-50 -192v-1q4 -108 50.5 -199t133.5 -147.5t196 -56.5q186 0 279 110 q20 27 31 51l-60 109q-42 -80 -99 -116t-146 -36q-115 0 -191 87t-76 204q0 105 82 189t186 84q112 0 170 -53.5t104 -172.5q8 -21 25.5 -68.5t28.5 -76.5t31.5 -74.5t38.5 -74t45.5 -62.5t55.5 -53.5t66 -33t80 -13.5q107 0 183 69.5t76 174.5zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" horiz-adv-x="2048" d="M1152 640q0 104 -40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM1920 640q0 104 -40.5 198.5 t-109.5 163.5t-163.5 109.5t-198.5 40.5h-386q119 -90 188.5 -224t69.5 -288t-69.5 -288t-188.5 -224h386q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM2048 640q0 -130 -51 -248.5t-136.5 -204t-204 -136.5t-248.5 -51h-768q-130 0 -248.5 51t-204 136.5 t-136.5 204t-51 248.5t51 248.5t136.5 204t204 136.5t248.5 51h768q130 0 248.5 -51t204 -136.5t136.5 -204t51 -248.5z" /> +<glyph unicode="" horiz-adv-x="2048" d="M0 640q0 130 51 248.5t136.5 204t204 136.5t248.5 51h768q130 0 248.5 -51t204 -136.5t136.5 -204t51 -248.5t-51 -248.5t-136.5 -204t-204 -136.5t-248.5 -51h-768q-130 0 -248.5 51t-204 136.5t-136.5 204t-51 248.5zM1408 128q104 0 198.5 40.5t163.5 109.5 t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5z" /> +<glyph unicode="" horiz-adv-x="2304" d="M762 384h-314q-40 0 -57.5 35t6.5 67l188 251q-65 31 -137 31q-132 0 -226 -94t-94 -226t94 -226t226 -94q115 0 203 72.5t111 183.5zM576 512h186q-18 85 -75 148zM1056 512l288 384h-480l-99 -132q105 -103 126 -252h165zM2176 448q0 132 -94 226t-226 94 q-60 0 -121 -24l174 -260q15 -23 10 -49t-27 -40q-15 -11 -36 -11q-35 0 -53 29l-174 260q-93 -95 -93 -225q0 -132 94 -226t226 -94t226 94t94 226zM2304 448q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 97 39.5 183.5t109.5 149.5l-65 98l-353 -469 q-18 -26 -51 -26h-197q-23 -164 -149 -274t-294 -110q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q114 0 215 -55l137 183h-224q-26 0 -45 19t-19 45t19 45t45 19h384v-128h435l-85 128h-222q-26 0 -45 19t-19 45t19 45t45 19h256q33 0 53 -28l267 -400 q91 44 192 44q185 0 316.5 -131.5t131.5 -316.5z" /> +<glyph unicode="" d="M384 320q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1408 320q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1362 716l-72 384q-5 23 -22.5 37.5t-40.5 14.5 h-918q-23 0 -40.5 -14.5t-22.5 -37.5l-72 -384q-5 -30 14 -53t49 -23h1062q30 0 49 23t14 53zM1136 1328q0 20 -14 34t-34 14h-640q-20 0 -34 -14t-14 -34t14 -34t34 -14h640q20 0 34 14t14 34zM1536 603v-603h-128v-128q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5v128h-768v-128q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5v128h-128v603q0 112 25 223l103 454q9 78 97.5 137t230 89t312.5 30t312.5 -30t230 -89t97.5 -137l105 -454q23 -102 23 -223z" /> +<glyph unicode="" horiz-adv-x="2048" d="M1463 704q0 -35 -25 -60.5t-61 -25.5h-702q-36 0 -61 25.5t-25 60.5t25 60.5t61 25.5h702q36 0 61 -25.5t25 -60.5zM1677 704q0 86 -23 170h-982q-36 0 -61 25t-25 60q0 36 25 61t61 25h908q-88 143 -235 227t-320 84q-177 0 -327.5 -87.5t-238 -237.5t-87.5 -327 q0 -86 23 -170h982q36 0 61 -25t25 -60q0 -36 -25 -61t-61 -25h-908q88 -143 235.5 -227t320.5 -84q132 0 253 51.5t208 139t139 208t52 253.5zM2048 959q0 -35 -25 -60t-61 -25h-131q17 -85 17 -170q0 -167 -65.5 -319.5t-175.5 -263t-262.5 -176t-319.5 -65.5 q-246 0 -448.5 133t-301.5 350h-189q-36 0 -61 25t-25 61q0 35 25 60t61 25h132q-17 85 -17 170q0 167 65.5 319.5t175.5 263t262.5 176t320.5 65.5q245 0 447.5 -133t301.5 -350h188q36 0 61 -25t25 -61z" /> +<glyph unicode="" horiz-adv-x="1280" d="M953 1158l-114 -328l117 -21q165 451 165 518q0 56 -38 56q-57 0 -130 -225zM654 471l33 -88q37 42 71 67l-33 5.5t-38.5 7t-32.5 8.5zM362 1367q0 -98 159 -521q18 10 49 10q15 0 75 -5l-121 351q-75 220 -123 220q-19 0 -29 -17.5t-10 -37.5zM283 608q0 -36 51.5 -119 t117.5 -153t100 -70q14 0 25.5 13t11.5 27q0 24 -32 102q-13 32 -32 72t-47.5 89t-61.5 81t-62 32q-20 0 -45.5 -27t-25.5 -47zM125 273q0 -41 25 -104q59 -145 183.5 -227t281.5 -82q227 0 382 170q152 169 152 427q0 43 -1 67t-11.5 62t-30.5 56q-56 49 -211.5 75.5 t-270.5 26.5q-37 0 -49 -11q-12 -5 -12 -35q0 -34 21.5 -60t55.5 -40t77.5 -23.5t87.5 -11.5t85 -4t70 0h23q24 0 40 -19q15 -19 19 -55q-28 -28 -96 -54q-61 -22 -93 -46q-64 -46 -108.5 -114t-44.5 -137q0 -31 18.5 -88.5t18.5 -87.5l-3 -12q-4 -12 -4 -14 q-137 10 -146 216q-8 -2 -41 -2q2 -7 2 -21q0 -53 -40.5 -89.5t-94.5 -36.5q-82 0 -166.5 78t-84.5 159q0 34 33 67q52 -64 60 -76q77 -104 133 -104q12 0 26.5 8.5t14.5 20.5q0 34 -87.5 145t-116.5 111q-43 0 -70 -44.5t-27 -90.5zM11 264q0 101 42.5 163t136.5 88 q-28 74 -28 104q0 62 61 123t122 61q29 0 70 -15q-163 462 -163 567q0 80 41 130.5t119 50.5q131 0 325 -581q6 -17 8 -23q6 16 29 79.5t43.5 118.5t54 127.5t64.5 123t70.5 86.5t76.5 36q71 0 112 -49t41 -122q0 -108 -159 -550q61 -15 100.5 -46t58.5 -78t26 -93.5 t7 -110.5q0 -150 -47 -280t-132 -225t-211 -150t-278 -55q-111 0 -223 42q-149 57 -258 191.5t-109 286.5z" /> +<glyph unicode="" horiz-adv-x="2048" d="M785 528h207q-14 -158 -98.5 -248.5t-214.5 -90.5q-162 0 -254.5 116t-92.5 316q0 194 93 311.5t233 117.5q148 0 232 -87t97 -247h-203q-5 64 -35.5 99t-81.5 35q-57 0 -88.5 -60.5t-31.5 -177.5q0 -48 5 -84t18 -69.5t40 -51.5t66 -18q95 0 109 139zM1497 528h206 q-14 -158 -98 -248.5t-214 -90.5q-162 0 -254.5 116t-92.5 316q0 194 93 311.5t233 117.5q148 0 232 -87t97 -247h-204q-4 64 -35 99t-81 35q-57 0 -88.5 -60.5t-31.5 -177.5q0 -48 5 -84t18 -69.5t39.5 -51.5t65.5 -18q49 0 76.5 38t33.5 101zM1856 647q0 207 -15.5 307 t-60.5 161q-6 8 -13.5 14t-21.5 15t-16 11q-86 63 -697 63q-625 0 -710 -63q-5 -4 -17.5 -11.5t-21 -14t-14.5 -14.5q-45 -60 -60 -159.5t-15 -308.5q0 -208 15 -307.5t60 -160.5q6 -8 15 -15t20.5 -14t17.5 -12q44 -33 239.5 -49t470.5 -16q610 0 697 65q5 4 17 11t20.5 14 t13.5 16q46 60 61 159t15 309zM2048 1408v-1536h-2048v1536h2048z" /> +<glyph unicode="" d="M992 912v-496q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v496q0 112 -80 192t-192 80h-272v-1152q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v1344q0 14 9 23t23 9h464q135 0 249 -66.5t180.5 -180.5t66.5 -249zM1376 1376v-880q0 -135 -66.5 -249t-180.5 -180.5 t-249 -66.5h-464q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h160q14 0 23 -9t9 -23v-768h272q112 0 192 80t80 192v880q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" /> +<glyph unicode="" d="M1311 694v-114q0 -24 -13.5 -38t-37.5 -14h-202q-24 0 -38 14t-14 38v114q0 24 14 38t38 14h202q24 0 37.5 -14t13.5 -38zM821 464v250q0 53 -32.5 85.5t-85.5 32.5h-133q-68 0 -96 -52q-28 52 -96 52h-130q-53 0 -85.5 -32.5t-32.5 -85.5v-250q0 -22 21 -22h55 q22 0 22 22v230q0 24 13.5 38t38.5 14h94q24 0 38 -14t14 -38v-230q0 -22 21 -22h54q22 0 22 22v230q0 24 14 38t38 14h97q24 0 37.5 -14t13.5 -38v-230q0 -22 22 -22h55q21 0 21 22zM1410 560v154q0 53 -33 85.5t-86 32.5h-264q-53 0 -86 -32.5t-33 -85.5v-410 q0 -21 22 -21h55q21 0 21 21v180q31 -42 94 -42h191q53 0 86 32.5t33 85.5zM1536 1176v-1072q0 -96 -68 -164t-164 -68h-1072q-96 0 -164 68t-68 164v1072q0 96 68 164t164 68h1072q96 0 164 -68t68 -164z" /> +<glyph unicode="" d="M915 450h-294l147 551zM1001 128h311l-324 1024h-440l-324 -1024h311l383 314zM1536 1120v-960q0 -118 -85 -203t-203 -85h-960q-118 0 -203 85t-85 203v960q0 118 85 203t203 85h960q118 0 203 -85t85 -203z" /> +<glyph unicode="" horiz-adv-x="2048" d="M2048 641q0 -21 -13 -36.5t-33 -19.5l-205 -356q3 -9 3 -18q0 -20 -12.5 -35.5t-32.5 -19.5l-193 -337q3 -8 3 -16q0 -23 -16.5 -40t-40.5 -17q-25 0 -41 18h-400q-17 -20 -43 -20t-43 20h-399q-17 -20 -43 -20q-23 0 -40 16.5t-17 40.5q0 8 4 20l-193 335 q-20 4 -32.5 19.5t-12.5 35.5q0 9 3 18l-206 356q-20 5 -32.5 20.5t-12.5 35.5q0 21 13.5 36.5t33.5 19.5l199 344q0 1 -0.5 3t-0.5 3q0 36 34 51l209 363q-4 10 -4 18q0 24 17 40.5t40 16.5q26 0 44 -21h396q16 21 43 21t43 -21h398q18 21 44 21q23 0 40 -16.5t17 -40.5 q0 -6 -4 -18l207 -358q23 -1 39 -17.5t16 -38.5q0 -13 -7 -27l187 -324q19 -4 31.5 -19.5t12.5 -35.5zM1063 -158h389l-342 354h-143l-342 -354h360q18 16 39 16t39 -16zM112 654q1 -4 1 -13q0 -10 -2 -15l208 -360q2 0 4.5 -1t5.5 -2.5l5 -2.5l188 199v347l-187 194 q-13 -8 -29 -10zM986 1438h-388l190 -200l554 200h-280q-16 -16 -38 -16t-38 16zM1689 226q1 6 5 11l-64 68l-17 -79h76zM1583 226l22 105l-252 266l-296 -307l63 -64h463zM1495 -142l16 28l65 310h-427l333 -343q8 4 13 5zM578 -158h5l342 354h-373v-335l4 -6q14 -5 22 -13 zM552 226h402l64 66l-309 321l-157 -166v-221zM359 226h163v189l-168 -177q4 -8 5 -12zM358 1051q0 -1 0.5 -2t0.5 -2q0 -16 -8 -29l171 -177v269zM552 1121v-311l153 -157l297 314l-223 236zM556 1425l-4 -8v-264l205 74l-191 201q-6 -2 -10 -3zM1447 1438h-16l-621 -224 l213 -225zM1023 946l-297 -315l311 -319l296 307zM688 634l-136 141v-284zM1038 270l-42 -44h85zM1374 618l238 -251l132 624l-3 5l-1 1zM1718 1018q-8 13 -8 29v2l-216 376q-5 1 -13 5l-437 -463l310 -327zM522 1142v223l-163 -282zM522 196h-163l163 -283v283zM1607 196 l-48 -227l130 227h-82zM1729 266l207 361q-2 10 -2 14q0 1 3 16l-171 296l-129 -612l77 -82q5 3 15 7z" /> +<glyph unicode="" d="M0 856q0 131 91.5 226.5t222.5 95.5h742l352 358v-1470q0 -132 -91.5 -227t-222.5 -95h-780q-131 0 -222.5 95t-91.5 227v790zM1232 102l-176 180v425q0 46 -32 79t-78 33h-484q-46 0 -78 -33t-32 -79v-492q0 -46 32.5 -79.5t77.5 -33.5h770z" /> +<glyph unicode="" d="M934 1386q-317 -121 -556 -362.5t-358 -560.5q-20 89 -20 176q0 208 102.5 384.5t278.5 279t384 102.5q82 0 169 -19zM1203 1267q93 -65 164 -155q-389 -113 -674.5 -400.5t-396.5 -676.5q-93 72 -155 162q112 386 395 671t667 399zM470 -67q115 356 379.5 622t619.5 384 q40 -92 54 -195q-292 -120 -516 -345t-343 -518q-103 14 -194 52zM1536 -125q-193 50 -367 115q-135 -84 -290 -107q109 205 274 370.5t369 275.5q-21 -152 -101 -284q65 -175 115 -370z" /> +<glyph unicode="" horiz-adv-x="2048" d="M1893 1144l155 -1272q-131 0 -257 57q-200 91 -393 91q-226 0 -374 -148q-148 148 -374 148q-193 0 -393 -91q-128 -57 -252 -57h-5l155 1272q224 127 482 127q233 0 387 -106q154 106 387 106q258 0 482 -127zM1398 157q129 0 232 -28.5t260 -93.5l-124 1021 q-171 78 -368 78q-224 0 -374 -141q-150 141 -374 141q-197 0 -368 -78l-124 -1021q105 43 165.5 65t148.5 39.5t178 17.5q202 0 374 -108q172 108 374 108zM1438 191l-55 907q-211 -4 -359 -155q-152 155 -374 155q-176 0 -336 -66l-114 -941q124 51 228.5 76t221.5 25 q209 0 374 -102q172 107 374 102z" /> +<glyph unicode="" horiz-adv-x="2048" d="M1500 165v733q0 21 -15 36t-35 15h-93q-20 0 -35 -15t-15 -36v-733q0 -20 15 -35t35 -15h93q20 0 35 15t15 35zM1216 165v531q0 20 -15 35t-35 15h-101q-20 0 -35 -15t-15 -35v-531q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM924 165v429q0 20 -15 35t-35 15h-101 q-20 0 -35 -15t-15 -35v-429q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM632 165v362q0 20 -15 35t-35 15h-101q-20 0 -35 -15t-15 -35v-362q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM2048 311q0 -166 -118 -284t-284 -118h-1244q-166 0 -284 118t-118 284 q0 116 63 214.5t168 148.5q-10 34 -10 73q0 113 80.5 193.5t193.5 80.5q102 0 180 -67q45 183 194 300t338 117q149 0 275 -73.5t199.5 -199.5t73.5 -275q0 -66 -14 -122q135 -33 221 -142.5t86 -247.5z" /> +<glyph unicode="" d="M0 1536h1536v-1392l-776 -338l-760 338v1392zM1436 209v926h-1336v-926l661 -294zM1436 1235v201h-1336v-201h1336zM181 937v-115h-37v115h37zM181 789v-115h-37v115h37zM181 641v-115h-37v115h37zM181 493v-115h-37v115h37zM181 345v-115h-37v115h37zM207 202l15 34 l105 -47l-15 -33zM343 142l15 34l105 -46l-15 -34zM478 82l15 34l105 -46l-15 -34zM614 23l15 33l104 -46l-15 -34zM797 10l105 46l15 -33l-105 -47zM932 70l105 46l15 -34l-105 -46zM1068 130l105 46l15 -34l-105 -46zM1203 189l105 47l15 -34l-105 -46zM259 1389v-36h-114 v36h114zM421 1389v-36h-115v36h115zM583 1389v-36h-115v36h115zM744 1389v-36h-114v36h114zM906 1389v-36h-114v36h114zM1068 1389v-36h-115v36h115zM1230 1389v-36h-115v36h115zM1391 1389v-36h-114v36h114zM181 1049v-79h-37v115h115v-36h-78zM421 1085v-36h-115v36h115z M583 1085v-36h-115v36h115zM744 1085v-36h-114v36h114zM906 1085v-36h-114v36h114zM1068 1085v-36h-115v36h115zM1230 1085v-36h-115v36h115zM1355 970v79h-78v36h115v-115h-37zM1355 822v115h37v-115h-37zM1355 674v115h37v-115h-37zM1355 526v115h37v-115h-37zM1355 378 v115h37v-115h-37zM1355 230v115h37v-115h-37zM760 265q-129 0 -221 91.5t-92 221.5q0 129 92 221t221 92q130 0 221.5 -92t91.5 -221q0 -130 -91.5 -221.5t-221.5 -91.5zM595 646q0 -36 19.5 -56.5t49.5 -25t64 -7t64 -2t49.5 -9t19.5 -30.5q0 -49 -112 -49q-97 0 -123 51 h-3l-31 -63q67 -42 162 -42q29 0 56.5 5t55.5 16t45.5 33t17.5 53q0 46 -27.5 69.5t-67.5 27t-79.5 3t-67 5t-27.5 25.5q0 21 20.5 33t40.5 15t41 3q34 0 70.5 -11t51.5 -34h3l30 58q-3 1 -21 8.5t-22.5 9t-19.5 7t-22 7t-20 4.5t-24 4t-23 1q-29 0 -56.5 -5t-54 -16.5 t-43 -34t-16.5 -53.5z" /> +<glyph unicode="" horiz-adv-x="2048" d="M863 504q0 112 -79.5 191.5t-191.5 79.5t-191 -79.5t-79 -191.5t79 -191t191 -79t191.5 79t79.5 191zM1726 505q0 112 -79 191t-191 79t-191.5 -79t-79.5 -191q0 -113 79.5 -192t191.5 -79t191 79.5t79 191.5zM2048 1314v-1348q0 -44 -31.5 -75.5t-76.5 -31.5h-1832 q-45 0 -76.5 31.5t-31.5 75.5v1348q0 44 31.5 75.5t76.5 31.5h431q44 0 76 -31.5t32 -75.5v-161h754v161q0 44 32 75.5t76 31.5h431q45 0 76.5 -31.5t31.5 -75.5z" /> +<glyph unicode="" horiz-adv-x="2048" d="M1430 953zM1690 749q148 0 253 -98.5t105 -244.5q0 -157 -109 -261.5t-267 -104.5q-85 0 -162 27.5t-138 73.5t-118 106t-109 126.5t-103.5 132.5t-108.5 126t-117 106t-136 73.5t-159 27.5q-154 0 -251.5 -91.5t-97.5 -244.5q0 -157 104 -250t263 -93q100 0 208 37.5 t193 98.5q5 4 21 18.5t30 24t22 9.5q14 0 24.5 -10.5t10.5 -24.5q0 -24 -60 -77q-101 -88 -234.5 -142t-260.5 -54q-133 0 -245.5 58t-180 165t-67.5 241q0 205 141.5 341t347.5 136q120 0 226.5 -43.5t185.5 -113t151.5 -153t139 -167.5t133.5 -153.5t149.5 -113 t172.5 -43.5q102 0 168.5 61.5t66.5 162.5q0 95 -64.5 159t-159.5 64q-30 0 -81.5 -18.5t-68.5 -18.5q-20 0 -35.5 15t-15.5 35q0 18 8.5 57t8.5 59q0 159 -107.5 263t-266.5 104q-58 0 -111.5 -18.5t-84 -40.5t-55.5 -40.5t-33 -18.5q-15 0 -25.5 10.5t-10.5 25.5 q0 19 25 46q59 67 147 103.5t182 36.5q191 0 318 -125.5t127 -315.5q0 -37 -4 -66q57 15 115 15z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1216 832q0 26 -19 45t-45 19h-128v128q0 26 -19 45t-45 19t-45 -19t-19 -45v-128h-128q-26 0 -45 -19t-19 -45t19 -45t45 -19h128v-128q0 -26 19 -45t45 -19t45 19t19 45v128h128q26 0 45 19t19 45zM640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920 q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1280 832q0 26 -19 45t-45 19t-45 -19l-147 -146v293q0 26 -19 45t-45 19t-45 -19t-19 -45v-293l-147 146q-19 19 -45 19t-45 -19t-19 -45t19 -45l256 -256q19 -19 45 -19t45 19l256 256q19 19 19 45zM640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920 q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="2048" d="M212 768l623 -665l-300 665h-323zM1024 -4l349 772h-698zM538 896l204 384h-262l-288 -384h346zM1213 103l623 665h-323zM683 896h682l-204 384h-274zM1510 896h346l-288 384h-262zM1651 1382l384 -512q14 -18 13 -41.5t-17 -40.5l-960 -1024q-18 -20 -47 -20t-47 20 l-960 1024q-16 17 -17 40.5t13 41.5l384 512q18 26 51 26h1152q33 0 51 -26z" /> +<glyph unicode="" horiz-adv-x="2048" d="M1811 -19q19 19 45 19t45 -19l128 -128l-90 -90l-83 83l-83 -83q-18 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83 q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-128 128l90 90l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83 q19 19 45 19t45 -19l83 -83zM237 19q-19 -19 -45 -19t-45 19l-128 128l90 90l83 -82l83 82q19 19 45 19t45 -19l83 -82l64 64v293l-210 314q-17 26 -7 56.5t40 40.5l177 58v299h128v128h256v128h256v-128h256v-128h128v-299l177 -58q30 -10 40 -40.5t-7 -56.5l-210 -314 v-293l19 18q19 19 45 19t45 -19l83 -82l83 82q19 19 45 19t45 -19l128 -128l-90 -90l-83 83l-83 -83q-18 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83 q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83zM640 1152v-128l384 128l384 -128v128h-128v128h-512v-128h-128z" /> +<glyph unicode="" d="M576 0l96 448l-96 128l-128 64zM832 0l128 640l-128 -64l-96 -128zM992 1010q-2 4 -4 6q-10 8 -96 8q-70 0 -167 -19q-7 -2 -21 -2t-21 2q-97 19 -167 19q-86 0 -96 -8q-2 -2 -4 -6q2 -18 4 -27q2 -3 7.5 -6.5t7.5 -10.5q2 -4 7.5 -20.5t7 -20.5t7.5 -17t8.5 -17t9 -14 t12 -13.5t14 -9.5t17.5 -8t20.5 -4t24.5 -2q36 0 59 12.5t32.5 30t14.5 34.5t11.5 29.5t17.5 12.5h12q11 0 17.5 -12.5t11.5 -29.5t14.5 -34.5t32.5 -30t59 -12.5q13 0 24.5 2t20.5 4t17.5 8t14 9.5t12 13.5t9 14t8.5 17t7.5 17t7 20.5t7.5 20.5q2 7 7.5 10.5t7.5 6.5 q2 9 4 27zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 61 4.5 118t19 125.5t37.5 123.5t63.5 103.5t93.5 74.5l-90 220h214q-22 64 -22 128q0 12 2 32q-194 40 -194 96q0 57 210 99q17 62 51.5 134t70.5 114q32 37 76 37q30 0 84 -31t84 -31t84 31 t84 31q44 0 76 -37q36 -42 70.5 -114t51.5 -134q210 -42 210 -99q0 -56 -194 -96q7 -81 -20 -160h214l-82 -225q63 -33 107.5 -96.5t65.5 -143.5t29 -151.5t8 -148.5z" /> +<glyph unicode="" horiz-adv-x="2304" d="M2301 500q12 -103 -22 -198.5t-99 -163.5t-158.5 -106t-196.5 -31q-161 11 -279.5 125t-134.5 274q-12 111 27.5 210.5t118.5 170.5l-71 107q-96 -80 -151 -194t-55 -244q0 -27 -18.5 -46.5t-45.5 -19.5h-256h-69q-23 -164 -149 -274t-294 -110q-185 0 -316.5 131.5 t-131.5 316.5t131.5 316.5t316.5 131.5q76 0 152 -27l24 45q-123 110 -304 110h-64q-26 0 -45 19t-19 45t19 45t45 19h128q78 0 145 -13.5t116.5 -38.5t71.5 -39.5t51 -36.5h512h115l-85 128h-222q-30 0 -49 22.5t-14 52.5q4 23 23 38t43 15h253q33 0 53 -28l70 -105 l114 114q19 19 46 19h101q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-179l115 -172q131 63 275 36q143 -26 244 -134.5t118 -253.5zM448 128q115 0 203 72.5t111 183.5h-314q-35 0 -55 31q-18 32 -1 63l147 277q-47 13 -91 13q-132 0 -226 -94t-94 -226t94 -226 t226 -94zM1856 128q132 0 226 94t94 226t-94 226t-226 94q-60 0 -121 -24l174 -260q15 -23 10 -49t-27 -40q-15 -11 -36 -11q-35 0 -53 29l-174 260q-93 -95 -93 -225q0 -132 94 -226t226 -94z" /> +<glyph unicode="" d="M1408 0q0 -63 -61.5 -113.5t-164 -81t-225 -46t-253.5 -15.5t-253.5 15.5t-225 46t-164 81t-61.5 113.5q0 49 33 88.5t91 66.5t118 44.5t131 29.5q26 5 48 -10.5t26 -41.5q5 -26 -10.5 -48t-41.5 -26q-58 -10 -106 -23.5t-76.5 -25.5t-48.5 -23.5t-27.5 -19.5t-8.5 -12 q3 -11 27 -26.5t73 -33t114 -32.5t160.5 -25t201.5 -10t201.5 10t160.5 25t114 33t73 33.5t27 27.5q-1 4 -8.5 11t-27.5 19t-48.5 23.5t-76.5 25t-106 23.5q-26 4 -41.5 26t-10.5 48q4 26 26 41.5t48 10.5q71 -12 131 -29.5t118 -44.5t91 -66.5t33 -88.5zM1024 896v-384 q0 -26 -19 -45t-45 -19h-64v-384q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v384h-64q-26 0 -45 19t-19 45v384q0 53 37.5 90.5t90.5 37.5h384q53 0 90.5 -37.5t37.5 -90.5zM928 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5 t158.5 -65.5t65.5 -158.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1280 512h305q-5 -6 -10 -10.5t-9 -7.5l-3 -4l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-5 2 -21 20h369q22 0 39.5 13.5t22.5 34.5l70 281l190 -667q6 -20 23 -33t39 -13q21 0 38 13t23 33l146 485l56 -112q18 -35 57 -35zM1792 940q0 -145 -103 -300h-369l-111 221 q-8 17 -25.5 27t-36.5 8q-45 -5 -56 -46l-129 -430l-196 686q-6 20 -23.5 33t-39.5 13t-39 -13.5t-22 -34.5l-116 -464h-423q-103 155 -103 300q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124 t127 -344z" /> +<glyph unicode="" horiz-adv-x="1280" d="M1152 960q0 -221 -147.5 -384.5t-364.5 -187.5v-260h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v260q-150 16 -271.5 103t-186 224t-52.5 292 q11 134 80.5 249t182 188t245.5 88q170 19 319 -54t236 -212t87 -306zM128 960q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1280 1504q0 14 9 23t23 9h416q26 0 45 -19t19 -45v-416q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v262l-419 -420q87 -104 129.5 -236.5t30.5 -276.5q-22 -250 -200.5 -431t-428.5 -206q-163 -17 -314 39.5t-256.5 162t-162 256.5t-39.5 314q25 250 206 428.5 t431 200.5q144 12 276.5 -30.5t236.5 -129.5l419 419h-261q-14 0 -23 9t-9 23v64zM704 -128q117 0 223.5 45.5t184 123t123 184t45.5 223.5t-45.5 223.5t-123 184t-184 123t-223.5 45.5t-223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5t45.5 -223.5t123 -184t184 -123 t223.5 -45.5z" /> +<glyph unicode="" horiz-adv-x="1280" d="M830 1220q145 -72 233.5 -210.5t88.5 -305.5q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-217 24 -364.5 187.5 t-147.5 384.5q0 167 88.5 305.5t233.5 210.5q-165 96 -228 273q-6 16 3.5 29.5t26.5 13.5h69q21 0 29 -20q44 -106 140 -171t214 -65t214 65t140 171q8 20 37 20h61q17 0 26.5 -13.5t3.5 -29.5q-63 -177 -228 -273zM576 256q185 0 316.5 131.5t131.5 316.5t-131.5 316.5 t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" /> +<glyph unicode="" d="M1024 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q126 -158 126 -359q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64 q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-149 16 -270.5 103t-186.5 223.5t-53 291.5q16 204 160 353.5t347 172.5q118 14 228 -19t198 -103l255 254h-134q-14 0 -23 9t-9 23v64zM576 256q185 0 316.5 131.5t131.5 316.5t-131.5 316.5 t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1280 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q126 -158 126 -359q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64 q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-217 24 -364.5 187.5t-147.5 384.5q0 201 126 359l-52 53l-101 -111q-9 -10 -22 -10.5t-23 7.5l-48 44q-10 8 -10.5 21.5t8.5 23.5l105 115l-111 112v-134q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9 t-9 23v288q0 26 19 45t45 19h288q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-133l106 -107l86 94q9 10 22 10.5t23 -7.5l48 -44q10 -8 10.5 -21.5t-8.5 -23.5l-90 -99l57 -56q158 126 359 126t359 -126l255 254h-134q-14 0 -23 9t-9 23v64zM832 256q185 0 316.5 131.5 t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1790 1007q12 -155 -52.5 -292t-186 -224t-271.5 -103v-260h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-512v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23 t23 9h224v260q-150 16 -271.5 103t-186 224t-52.5 292q17 206 164.5 356.5t352.5 169.5q206 21 377 -94q171 115 377 94q205 -19 352.5 -169.5t164.5 -356.5zM896 647q128 131 128 313t-128 313q-128 -131 -128 -313t128 -313zM576 512q115 0 218 57q-154 165 -154 391 q0 224 154 391q-103 57 -218 57q-185 0 -316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5zM1152 128v260q-137 15 -256 94q-119 -79 -256 -94v-260h512zM1216 512q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5q-115 0 -218 -57q154 -167 154 -391 q0 -226 -154 -391q103 -57 218 -57z" /> +<glyph unicode="" horiz-adv-x="1920" d="M1536 1120q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q76 -95 107.5 -214t9.5 -247q-31 -182 -166 -312t-318 -156q-210 -29 -384.5 80t-241.5 300q-117 6 -221 57.5t-177.5 133t-113.5 192.5t-32 230 q9 135 78 252t182 191.5t248 89.5q118 14 227.5 -19t198.5 -103l255 254h-134q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q59 -74 93 -169q182 -9 328 -124l255 254h-134q-14 0 -23 9 t-9 23v64zM1024 704q0 20 -4 58q-162 -25 -271 -150t-109 -292q0 -20 4 -58q162 25 271 150t109 292zM128 704q0 -168 111 -294t276 -149q-3 29 -3 59q0 210 135 369.5t338 196.5q-53 120 -163.5 193t-245.5 73q-185 0 -316.5 -131.5t-131.5 -316.5zM1088 -128 q185 0 316.5 131.5t131.5 316.5q0 168 -111 294t-276 149q3 -29 3 -59q0 -210 -135 -369.5t-338 -196.5q53 -120 163.5 -193t245.5 -73z" /> +<glyph unicode="" horiz-adv-x="2048" d="M1664 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q76 -95 107.5 -214t9.5 -247q-32 -180 -164.5 -310t-313.5 -157q-223 -34 -409 90q-117 -78 -256 -93v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23 t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-155 17 -279.5 109.5t-187 237.5t-39.5 307q25 187 159.5 322.5t320.5 164.5q224 34 410 -90q146 97 320 97q201 0 359 -126l255 254h-134q-14 0 -23 9 t-9 23v64zM896 391q128 131 128 313t-128 313q-128 -131 -128 -313t128 -313zM128 704q0 -185 131.5 -316.5t316.5 -131.5q117 0 218 57q-154 167 -154 391t154 391q-101 57 -218 57q-185 0 -316.5 -131.5t-131.5 -316.5zM1216 256q185 0 316.5 131.5t131.5 316.5 t-131.5 316.5t-316.5 131.5q-117 0 -218 -57q154 -167 154 -391t-154 -391q101 -57 218 -57z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1728 1536q26 0 45 -19t19 -45v-416q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v262l-229 -230l156 -156q9 -10 9 -23t-9 -22l-46 -46q-9 -9 -22 -9t-23 9l-156 157l-99 -100q87 -104 129.5 -236.5t30.5 -276.5q-22 -250 -200.5 -431t-428.5 -206q-163 -17 -314 39.5 t-256.5 162t-162 256.5t-39.5 314q25 250 206 428.5t431 200.5q144 12 276.5 -30.5t236.5 -129.5l99 99l-156 156q-9 10 -9 23t9 22l46 46q9 9 22 9t23 -9l156 -156l229 229h-261q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h416zM1280 448q0 117 -45.5 223.5t-123 184t-184 123 t-223.5 45.5t-223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5t45.5 -223.5t123 -184t184 -123t223.5 -45.5t223.5 45.5t184 123t123 184t45.5 223.5z" /> +<glyph unicode="" horiz-adv-x="1280" d="M640 892q217 -24 364.5 -187.5t147.5 -384.5q0 -167 -87 -306t-236 -212t-319 -54q-133 15 -245.5 88t-182 188t-80.5 249q-12 155 52.5 292t186 224t271.5 103v132h-160q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h160v165l-92 -92q-10 -9 -23 -9t-22 9l-46 46q-9 9 -9 22 t9 23l202 201q19 19 45 19t45 -19l202 -201q9 -10 9 -23t-9 -22l-46 -46q-9 -9 -22 -9t-23 9l-92 92v-165h160q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-160v-132zM576 -128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5 t131.5 -316.5t316.5 -131.5z" /> +<glyph unicode="" horiz-adv-x="2048" d="M2029 685q19 -19 19 -45t-19 -45l-294 -294q-9 -10 -22.5 -10t-22.5 10l-45 45q-10 9 -10 22.5t10 22.5l185 185h-294v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-131q-12 -119 -67 -226t-139 -183.5t-196.5 -121.5t-234.5 -45q-180 0 -330.5 91t-234.5 247 t-74 337q8 162 94 300t226.5 219.5t302.5 85.5q166 4 310.5 -71.5t235.5 -208.5t107 -296h131v224q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-224h294l-185 185q-10 9 -10 22.5t10 22.5l45 45q9 10 22.5 10t22.5 -10zM640 128q104 0 198.5 40.5t163.5 109.5t109.5 163.5 t40.5 198.5t-40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5z" /> +<glyph unicode="" horiz-adv-x="1280" d="M1152 960q0 -221 -147.5 -384.5t-364.5 -187.5v-612q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v612q-217 24 -364.5 187.5t-147.5 384.5q0 117 45.5 223.5t123 184t184 123t223.5 45.5t223.5 -45.5t184 -123t123 -184t45.5 -223.5zM576 512q185 0 316.5 131.5 t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" /> +<glyph unicode="" horiz-adv-x="1792" /> +<glyph unicode="" horiz-adv-x="1792" /> +<glyph unicode="" horiz-adv-x="1792" /> +<glyph unicode="" d="M1451 1408q35 0 60 -25t25 -60v-1366q0 -35 -25 -60t-60 -25h-391v595h199l30 232h-229v148q0 56 23.5 84t91.5 28l122 1v207q-63 9 -178 9q-136 0 -217.5 -80t-81.5 -226v-171h-200v-232h200v-595h-735q-35 0 -60 25t-25 60v1366q0 35 25 60t60 25h1366z" /> +<glyph unicode="" horiz-adv-x="1280" d="M0 939q0 108 37.5 203.5t103.5 166.5t152 123t185 78t202 26q158 0 294 -66.5t221 -193.5t85 -287q0 -96 -19 -188t-60 -177t-100 -149.5t-145 -103t-189 -38.5q-68 0 -135 32t-96 88q-10 -39 -28 -112.5t-23.5 -95t-20.5 -71t-26 -71t-32 -62.5t-46 -77.5t-62 -86.5 l-14 -5l-9 10q-15 157 -15 188q0 92 21.5 206.5t66.5 287.5t52 203q-32 65 -32 169q0 83 52 156t132 73q61 0 95 -40.5t34 -102.5q0 -66 -44 -191t-44 -187q0 -63 45 -104.5t109 -41.5q55 0 102 25t78.5 68t56 95t38 110.5t20 111t6.5 99.5q0 173 -109.5 269.5t-285.5 96.5 q-200 0 -334 -129.5t-134 -328.5q0 -44 12.5 -85t27 -65t27 -45.5t12.5 -30.5q0 -28 -15 -73t-37 -45q-2 0 -17 3q-51 15 -90.5 56t-61 94.5t-32.5 108t-11 106.5z" /> +<glyph unicode="" d="M985 562q13 0 97.5 -44t89.5 -53q2 -5 2 -15q0 -33 -17 -76q-16 -39 -71 -65.5t-102 -26.5q-57 0 -190 62q-98 45 -170 118t-148 185q-72 107 -71 194v8q3 91 74 158q24 22 52 22q6 0 18 -1.5t19 -1.5q19 0 26.5 -6.5t15.5 -27.5q8 -20 33 -88t25 -75q0 -21 -34.5 -57.5 t-34.5 -46.5q0 -7 5 -15q34 -73 102 -137q56 -53 151 -101q12 -7 22 -7q15 0 54 48.5t52 48.5zM782 32q127 0 243.5 50t200.5 134t134 200.5t50 243.5t-50 243.5t-134 200.5t-200.5 134t-243.5 50t-243.5 -50t-200.5 -134t-134 -200.5t-50 -243.5q0 -203 120 -368l-79 -233 l242 77q158 -104 345 -104zM782 1414q153 0 292.5 -60t240.5 -161t161 -240.5t60 -292.5t-60 -292.5t-161 -240.5t-240.5 -161t-292.5 -60q-195 0 -365 94l-417 -134l136 405q-108 178 -108 389q0 153 60 292.5t161 240.5t240.5 161t292.5 60z" /> +<glyph unicode="" horiz-adv-x="1792" d="M128 128h1024v128h-1024v-128zM128 640h1024v128h-1024v-128zM1696 192q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM128 1152h1024v128h-1024v-128zM1696 704q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1696 1216 q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1792 384v-384h-1792v384h1792zM1792 896v-384h-1792v384h1792zM1792 1408v-384h-1792v384h1792z" /> +<glyph unicode="" horiz-adv-x="2048" d="M704 640q-159 0 -271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5zM1664 512h352q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-352q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5 t-9.5 22.5v352h-352q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h352v352q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-352zM928 288q0 -52 38 -90t90 -38h256v-238q-68 -50 -171 -50h-874q-121 0 -194 69t-73 190q0 53 3.5 103.5t14 109t26.5 108.5 t43 97.5t62 81t85.5 53.5t111.5 20q19 0 39 -17q79 -61 154.5 -91.5t164.5 -30.5t164.5 30.5t154.5 91.5q20 17 39 17q132 0 217 -96h-223q-52 0 -90 -38t-38 -90v-192z" /> +<glyph unicode="" horiz-adv-x="2048" d="M704 640q-159 0 -271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5zM1781 320l249 -249q9 -9 9 -23q0 -13 -9 -22l-136 -136q-9 -9 -22 -9q-14 0 -23 9l-249 249l-249 -249q-9 -9 -23 -9q-13 0 -22 9l-136 136 q-9 9 -9 22q0 14 9 23l249 249l-249 249q-9 9 -9 23q0 13 9 22l136 136q9 9 22 9q14 0 23 -9l249 -249l249 249q9 9 23 9q13 0 22 -9l136 -136q9 -9 9 -22q0 -14 -9 -23zM1283 320l-181 -181q-37 -37 -37 -91q0 -53 37 -90l83 -83q-21 -3 -44 -3h-874q-121 0 -194 69 t-73 190q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q19 0 39 -17q154 -122 319 -122t319 122q20 17 39 17q28 0 57 -6q-28 -27 -41 -50t-13 -56q0 -54 37 -91z" /> +<glyph unicode="" horiz-adv-x="2048" d="M256 512h1728q26 0 45 -19t19 -45v-448h-256v256h-1536v-256h-256v1216q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-704zM832 832q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM2048 576v64q0 159 -112.5 271.5t-271.5 112.5h-704 q-26 0 -45 -19t-19 -45v-384h1152z" /> +<glyph unicode="" d="M1536 1536l-192 -448h192v-192h-274l-55 -128h329v-192h-411l-357 -832l-357 832h-411v192h329l-55 128h-274v192h192l-192 448h256l323 -768h378l323 768h256zM768 320l108 256h-216z" /> +<glyph unicode="" d="M1088 1536q185 0 316.5 -93.5t131.5 -226.5v-896q0 -130 -125.5 -222t-305.5 -97l213 -202q16 -15 8 -35t-30 -20h-1056q-22 0 -30 20t8 35l213 202q-180 5 -305.5 97t-125.5 222v896q0 133 131.5 226.5t316.5 93.5h640zM768 192q80 0 136 56t56 136t-56 136t-136 56 t-136 -56t-56 -136t56 -136t136 -56zM1344 768v512h-1152v-512h1152z" /> +<glyph unicode="" d="M1088 1536q185 0 316.5 -93.5t131.5 -226.5v-896q0 -130 -125.5 -222t-305.5 -97l213 -202q16 -15 8 -35t-30 -20h-1056q-22 0 -30 20t8 35l213 202q-180 5 -305.5 97t-125.5 222v896q0 133 131.5 226.5t316.5 93.5h640zM288 224q66 0 113 47t47 113t-47 113t-113 47 t-113 -47t-47 -113t47 -113t113 -47zM704 768v512h-544v-512h544zM1248 224q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47zM1408 768v512h-576v-512h576z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1792 204v-209h-642v209h134v926h-6l-314 -1135h-243l-310 1135h-8v-926h135v-209h-538v209h69q21 0 43 19.5t22 37.5v881q0 18 -22 40t-43 22h-69v209h672l221 -821h6l223 821h670v-209h-71q-19 0 -41 -22t-22 -40v-881q0 -18 21.5 -37.5t41.5 -19.5h71z" /> +<glyph unicode="" horiz-adv-x="1792" /> +<glyph unicode="" horiz-adv-x="1792" /> +<glyph unicode="" horiz-adv-x="1792" /> +<glyph unicode="" horiz-adv-x="1792" /> +<glyph unicode="" horiz-adv-x="1792" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/fontawesome-webfont.ttf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/fontawesome-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ed9372f8ea0fbaa04f42630a48887e4b38945345 Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/fontawesome-webfont.ttf differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/fontawesome-webfont.woff b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/fontawesome-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..8b280b98fa2fa261aa4b0f8fd061f772073ef83e Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/fontawesome-webfont.woff differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/fontawesome-webfont.woff2 b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/fontawesome-webfont.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..3311d585145b1cc1b9581e914acbb32d8542b4f5 Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/font/fontawesome-webfont.woff2 differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/bg-default.jpg b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/bg-default.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9b45b8e3b5dad18d2488d33bac3e3b0f808b8e27 Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/bg-default.jpg differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/bg.png b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..fc037113f048082cfcaf2730c8c2933876c879fd Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/bg.png differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/body-bg.jpg b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/body-bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..12d0b343661ae60296f57562fc8f2caa59043063 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/body-bg.jpg @@ -0,0 +1,8 @@ +<html> +<head><title> 404 Not Found +</title></head> +<body><h1> 404 Not Found +</h1> +The resource requested could not be found on this server!<hr /> +Powered By <a href='http://www.litespeedtech.com'>LiteSpeed Web Server</a><br /> +<font face="Verdana, Arial, Helvetica" size=-1>LiteSpeed Technologies is not responsible for administration and contents of this web site!</font></body></html> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/body-bg.png b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/body-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..0299d756d605481ebe4012a54f9622c7f3fe28b4 Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/body-bg.png differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/bread-crumb-bg.jpg b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/bread-crumb-bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8189af542c87bdbf719f6bb67f4870101f6d9f74 Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/bread-crumb-bg.jpg differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/bread-crumb-divider.jpg b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/bread-crumb-divider.jpg new file mode 100644 index 0000000000000000000000000000000000000000..92b88f13f71031e1e9b6f333166971faaa2e495f Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/bread-crumb-divider.jpg differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/bread-crumb-divider.png b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/bread-crumb-divider.png new file mode 100644 index 0000000000000000000000000000000000000000..c04ac25c56455c1835bc96b9e0e6414fd38e9efc Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/bread-crumb-divider.png differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/bread-crumb-last.jpg b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/bread-crumb-last.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b2c77672a5a3abdd80b52ba03507d5184c7118fd Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/bread-crumb-last.jpg differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/bread-crumb-last.png b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/bread-crumb-last.png new file mode 100644 index 0000000000000000000000000000000000000000..6d606a22938f94d31ff4aed4c2f5353c2e6c58ef Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/bread-crumb-last.png differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/glyphicons-halflings-white.png b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/glyphicons-halflings-white.png new file mode 100644 index 0000000000000000000000000000000000000000..3bf6484a29d8da269f9bc874b25493a45fae3bae Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/glyphicons-halflings-white.png differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/glyphicons-halflings.png b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/glyphicons-halflings.png new file mode 100644 index 0000000000000000000000000000000000000000..a9969993201f9cee63cf9f49217646347297b643 Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/glyphicons-halflings.png differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/icons/en.png b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/icons/en.png new file mode 100644 index 0000000000000000000000000000000000000000..9f0b4401730393a849fd440a47be06f6fa8ab00d Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/icons/en.png differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/icons/fr.png b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/icons/fr.png new file mode 100644 index 0000000000000000000000000000000000000000..e4bac8e4bff493bae5495306e1fecced52b340d6 Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/icons/fr.png differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/icons/th.png b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/icons/th.png new file mode 100644 index 0000000000000000000000000000000000000000..5d4beef0244726cc999df65cd6ad195a0d4d6ec4 Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/icons/th.png differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/select2.png b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/select2.png new file mode 100644 index 0000000000000000000000000000000000000000..1d804ffb99699b9e030f1010314de0970b5a000d Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/select2.png differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/select2x2.png b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/select2x2.png new file mode 100644 index 0000000000000000000000000000000000000000..4bdd5c961d452c49dfa0789c2c7ffb82c238fc24 Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/select2x2.png differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/side-bar-list-bg.png b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/side-bar-list-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..fda314950fb4e71366c57ff8486fad68577e51ae Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/side-bar-list-bg.png differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/top-bg.jpg b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/top-bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e953dd97205a85dc6392aa141543951ae82ab8d8 Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/img/top-bg.jpg differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/app.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/app.js new file mode 100644 index 0000000000000000000000000000000000000000..eda2e7aaf511e7957ed3cfdb07b87e11948488ac --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/app.js @@ -0,0 +1,282 @@ +define(['marionette','templates','vent', +'views/Header','views/Body','views/Footer','views/FillMandatoriesView','views/DiffVariablesView', +'views/DiscardConfigView','views/LegendView', +'collections/Categories','collections/Modes','collections/Variables','models/User'], +function (Marionette,templates,vent,Header,Body,Footer, +FillMandatoriesView,DiffVariablesView,DiscardConfigView,LegendView, +Categories,Modes,Variables,User){ + "use strict"; + + window.app = new Marionette.Application(); + + var prmstr = window.location.search.substr(1); + var prmarr = prmstr.split ("&"); + var params = {}; + for(var i = 0; i < prmarr.length; i++){ + var tmparr = prmarr[i].split("="); + params[tmparr[0]] = decodeURIComponent((''+tmparr[1]).replace(/\+/g, '%20')); + } + + app.config = { + application_mode : /application/.test(window.location.search), + zephir_mode : /zephir/.test(window.location.search), + eole: { + module : 'Eole', + version: '2.4' + }, + zephir: { + sync: false, + available: false, + server_id: null, + server_ip: null + }, + location : window.location.hash, + prevent_quit: false, + debug : false, + title : params['title'] ? params['title'] : 'GenConfig', + path_prefix : location.pathname.replace(/\/+$/, ''), // Prefix des urls de sync, ex: "/genconfig" + app_location : location.origin, // adresse externe du serveur (utile en cas de reverse_proxy) + }; + + window.location = '#'; + + app.addRegions({ + header : '#header', + body : '#container', + footer : '#footer', + modal : '#modal' + }); + + app.addInitializer(function(){ + _.extend(app.config, { + categories : new Categories(), + modes : new Modes(), + mandatories: new Variables(), + differences: new Variables(), + user : new User() + }); + if(!app.config.application_mode){ + document.title = app.config.title; + } + app.body.show(new Body(app.config)); + app.body.currentView.setElement($("#container")); + app.footer.show(new Footer(app.config)); + + app.config.user.fetch({ + success:_.bind(function(model, options){ + app.config.prevent_quit = true; + app.config.zephir = app.config.user.get('zephir'); + app.header.show(new Header(app.config)); + app.config.modes.fetch({ + success: function(){ vent.trigger('route:getDebug'); }, + error: _.bind(function(collection, response){ + new ErrorView({ model: new Backbone.Model(response) }).render().$el.modal('show'); + }, this) + }); + }, this), + error: function(model, response) { + if (!app.config.application_mode || response.statusText != 'INTERNAL SERVER ERROR') { + new ErrorView({ model: new Backbone.Model(response)}).render().$el.modal('show'); + } else { + new ErrorView({ model: new Backbone.Model(response), option: app.config}).render().$el.modal('show'); + } + } +// error: function(){ window.location.reload(); } + }); + + app.bindTo(vent, 'route:reloadConfig', function(callback){ + app.config.categories.fetch({ + success: _.bind(function(collection){ + if(!app.config.current_category){ + if(/#categories\//.test(app.config.location)){ + Backbone.View.goTo(app.config.location, callback); + return; + } else + app.config.current_category = collection.first().id; + if (app.config.current_category == 'containers') + app.config.current_category = 'general'; + } + Backbone.View.goTo('categories/'+app.config.current_category, callback); + //vent.trigger('route:showCategory', app.config.current_category, callback); + }, this), + error: _.bind(function(collection, response){ + new ErrorView({ model: new Backbone.Model(response) }).render().$el.modal('show'); + }, this) + }); + }, app); + + app.bindTo(vent, 'route:validateConfig', function(callback){ + $.post(app.config.path_prefix+'/validate', {}, _.bind(function(response){ + if(response.status == 'validate'){ + app.config.mandatories.reset(response.variables); + var test = new FillMandatoriesView(app.config);//.render().$el.modal('show'); + app.body.currentView.main.show(test); + } else + if(response.status == 'diff') { + app.config.differences.reset(response.variables); + var test = new DiffVariablesView(app.config);//.render().$el.modal('show'); + app.body.currentView.main.show(test); + } + if(_.isFunction(callback)) callback(); + }, this)) + .fail(_.bind(function(response){ + new ErrorView({ model: new Backbone.Model(response) }).render().$el.modal('show'); + }, this)); + }, app); + + app.bindTo(vent, 'route:zephirConfig', function(callback){ + $.post(app.config.path_prefix+'/validate', { zephir_sync: true }, _.bind(function(response){ + app.config.categories.fetch({ data: { zephir_sync: false } }); + var msg, msg2; + if(response.status == 'init'){ + vent.trigger('change:debug'); + vent.trigger('route:reloadConfig'); + } else if (response.status == 'zephir_empty') { + msg = "La configuration n'existe pas sur le serveur Zéphir (ID: "; + msg += app.config.zephir.server_id; + msg += "/ Adresse : " + app.config.zephir.server_ip+")"; + msg2 = "Les modifications apportées à la configuration à partir de ce point seront sauvegardées localement "; + msg2 += "et simultanément sur le serveur distant."; + vent.trigger('route:reloadConfig', function(){ + vent.trigger('flash', msg2, 'warning'); + vent.trigger('flash', msg, 'error'); + }); + } else { + if(response.status == 'validate'){ + app.config.mandatories.reset(response.variables); + var test = new FillMandatoriesView(_.extend({}, app.config, { zephir: { sync: true }}));//.render().$el.modal('show'); + app.body.currentView.main.show(test); + } else if(response.status == 'diff') { + app.config.differences.reset(response.variables); + var test = new DiffVariablesView(_.extend({}, app.config, { zephir: { sync: true }}));//.render().$el.modal('show'); + app.body.currentView.main.show(test); + } + msg = "La configuration actuelle a correctement été importée depuis le serveur Zéphir (ID: "; + msg += app.config.zephir.server_id; + msg += "/ Adresse : " + app.config.zephir.server_ip+")"; + msg2 = "Les modifications apportées à la configuration à partir de ce point seront sauvegardées localement "; + msg2 += "et simultanément sur le serveur distant."; + vent.trigger('flash', msg2, 'warning'); + vent.trigger('flash', msg, 'info'); + if(_.isFunction(callback)) callback(); + } + }, this)) + .fail(_.bind(function(response){ + new ErrorView({ model: new Backbone.Model(response) }).render().$el.modal('show'); + }, this)); + }, app); + app.bindTo(vent, 'route:showLegend', function(){ + new LegendView().render().$el.modal('show'); + }); + + app.bindTo(vent, 'route:downloadConfig', function(){ + $.get(app.config.path_prefix+'/download', {}, _.bind(function(response){ + app.config.prevent_quit = false; + //window.location = app.config.path_prefix+'/download'; + var iframe = document.createElement('iframe'); + iframe.style.display = 'none'; + document.body.appendChild(iframe); + iframe.src = app.config.path_prefix+'/download'; + if(app.config.application_mode) vent.trigger('flash', 'Le fichier a correctement été exporté dans /var/lib/genconfig/Downloads', 'success'); + }, this)) + .fail(_.bind(function(response){ + new ErrorView({ model: new Backbone.Model(response) }).render().$el.modal('show'); + }, this)); + }, app); + + app.bindTo(vent, 'route:discardConfig', function(){ + new DiscardConfigView(app.config).render().$el.modal('show'); + }, app); + + app.bindTo(vent, 'route:getDebug', function(){ + $.get(app.config.path_prefix+'/getDebug', {}, _.bind(function(response){ + app.config.debug = response.debug; + app.config.eole = response.eole; + app.config.version = response.version; + console.log("response", response); + var cb = function() { + if(response.errors){ + _.each(response.errors, function(error){ + vent.trigger('flash', error, 'warning'); + }); + } + } + if(app.config.zephir.available){ + vent.trigger('route:zephirConfig', cb); + } else if(response.init){ + vent.trigger('route:init', cb); + } else { + vent.trigger('change:debug'); + vent.trigger('route:reloadConfig', cb); + } + if(app.config.version != ''){ + var msg = "La configuration a été correctement chargée depuis un fichier issu d'une version "+app.config.version+". "; + msg+= "<a href=\"#save\" class=\"btn btn-success\" onclick=\"vent.trigger('route:validateConfig'); return false;\">Enregistrer cette configuration</a>"; + vent.trigger('flash', msg, 'success'); + //app.config.version = '' + } + },this)) + .fail(_.bind(function(response){ + new ErrorView({ model: new Backbone.Model(response) }).render().$el.modal('show'); + }, this)); + }, app); + + app.bindTo(vent, 'route:toggleDebug', function(){ + $.post(app.config.path_prefix+'/setDebug', { debug: !app.config.debug }, _.bind(function(response){ + app.config.debug = response.debug; + vent.trigger('change:debug'); + vent.trigger('route:reloadConfig'); + }, this)) + .fail(_.bind(function(response){ + new ErrorView({ model: new Backbone.Model(response) }).render().$el.modal('show'); + }, this)); + }, app); + + }); + + $(window).scroll(function() { + vent.trigger('saveScrollPos', window.pageYOffset); + }); + + $(window).on('unload', function(e){ + if($.browser.webkit){ + $.ajax({ + type: 'POST', + url: app.config.path_prefix+"/quit", + async: false + }) + } + }); + + $(window).on("pagehide", function(){ + }); + + $(window).on('beforeunload', function(e){ + if(app.config.prevent_quit){ + var e = e || window.event || {}; + if($.browser.mozilla){ + var test = confirm(t('exit_confirm')); + if(test) { + $.ajax({ + type: 'POST', + url: app.config.path_prefix+"/quit", + async: false + }); + history.go(); + } + else window.setTimeout(function() { + window.stop(); + return null; + }, 1); + } else { + return t('exit_confirm'); + } + } else { + app.config.prevent_quit = true; + } + }); + + return app; +}); + + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/collections/Categories.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/collections/Categories.js new file mode 100644 index 0000000000000000000000000000000000000000..c96f3933bedeb0cb52b343f7e194a3e368b6f633 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/collections/Categories.js @@ -0,0 +1,23 @@ +define(['vent','marionette','models/Category'], +function(vent,marionette,Category){ + 'use strict'; + + var Categories = Backbone.Collection.extend({ + + model: Category, + + initialize: function(models, options){ + this.options = options || {}; + this.options.mode = 'basic'; + }, + + url: function(models){ + return this.options.url ? this.options.url : "/categories"; + }, + + setMode: function(mode){ + this.options.mode = mode; + } + }); + return Categories; +}); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/collections/Modes.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/collections/Modes.js new file mode 100644 index 0000000000000000000000000000000000000000..91583d8b270eaaff379d559bfec8f6c625f0fa65 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/collections/Modes.js @@ -0,0 +1,27 @@ +define(['vent','marionette','models/Mode'], +function(vent,marionette,Mode){ + 'use strict'; + + return Backbone.Collection.extend({ + + model: Mode, + + initialize: function(models, options){ + this.options = options || {}; + }, + + url: function(models){ + return "/modes"; + }, + + comparator: function (mode) { + return mode.get('level'); + }, + + current: function(){ + return this.find(function(mode){ + return mode.get('current'); + }); + } + }); +}); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/collections/Tags.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/collections/Tags.js new file mode 100644 index 0000000000000000000000000000000000000000..8baa440d282487a475ed5e2d0e4df39fd8c34edf --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/collections/Tags.js @@ -0,0 +1,17 @@ +define(['vent','marionette','models/Tag'], +function(vent,marionette,Tag){ + 'use strict'; + + return Backbone.Collection.extend({ + + model: Tag, + + initialize: function(models, options){ + this.options = options || {}; + }, + + url: function() { + return '/categories/'+this.options.categoryid+'/tags'; + }, + }); +}); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/collections/Variables.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/collections/Variables.js new file mode 100644 index 0000000000000000000000000000000000000000..ea9e11961b04482349ecb5d2997791e204158c4a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/collections/Variables.js @@ -0,0 +1,89 @@ +define(['vent','models/Variable'], +function(vent,Variable){ + 'use strict'; + + return Backbone.Collection.extend({ + + model: Variable, + + initialize: function(models, options){ + this.options = options || {}; + this.bind('add', this.adoptOne, this); + this.bind('reset', this.adoptAll, this); + }, + + adoptAll: function(){ + this.each(this.adoptOne, this); + }, + + adoptOne: function(model){ + model.set('category', app.config.categories.get(model.get('categoryid'))); + //model.set('tag', model.get('category').tags.get(model.get('tagid'))); + }, + + get: function(id){ + var model = Backbone.Collection.prototype.get.call(this, id); + if(model) return model; + else { + model = _.find(this.models, function(variable){ + return variable.slaves.get(id); + }); + return model ? model.slaves.get(id) : false; + } + }, + + url: function() { + return '/categories/'+this.options.categoryid+'/variables'; + }, + + resetAll: function(callback){ + this.fetch({ url: '/variables/set/' + _.pluck(this.models,'id').join(';'), success: _.isFunction(callback) ? callback : null }); + }, + + next: function(model){ + return this.at(this.indexOf(this.get(model.id)) + 1); + }, + + prev: function(model) { + return this.at(this.indexOf(this.get(model.id)) - 1); + } + }); +}); + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/controllers/index.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/controllers/index.js new file mode 100644 index 0000000000000000000000000000000000000000..6a1a3a5aedb5858f27f54867afbab09f3e28cdb6 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/controllers/index.js @@ -0,0 +1,47 @@ +define(['vent','collections/Variables'], function (vent,Variables) { + "use strict"; + + return { + index: function(){ + vent.trigger('route:index'); + }, + splash: function(){ + + }, + showCategory: function(id){ + vent.trigger('route:editVariableCancel'); + vent.trigger('route:showCategory', id); + }, + editVariable: function(id){ + vent.trigger('route:editVariable', id); + }, + setMode: function(id){ + vent.trigger('route:setMode', id); + }, + addValue: function(id){ + vent.trigger('route:addValue', id); + }, + validateConfig: function(){ + + }, + saveConfig: function(){ + + }, + discardConfig: function(){ + + }, + downloadConfig: function(){ + + }, + uploadConfig: function(){ + + }, + setLocale: function(language){ + var locale = localStorage.getItem('locale'); + if(locale != language) { + localStorage.setItem('locale', language); + location.reload(); + } + } + }; +}); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/helpers/util.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/helpers/util.js new file mode 100644 index 0000000000000000000000000000000000000000..5d458a72defe350d4e7e9c4dff4f579269fd5f96 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/helpers/util.js @@ -0,0 +1,41 @@ +define(function(){ + "use strict"; + + String.prototype.capitalize = function() { + return (this.charAt(0).toUpperCase() + this.slice(1)).replace(/_/g," "); + }; + + return { + categoryIcon: function(){ + //var categoryName = this.categoryid || this.name; + var category = this.category || this; + return 'icon-' + (category.icon || 'tags'); + /*switch(true){ + case /messagerie/i.test(categoryName): return 'icon-envelope'; + case /reseau/i.test(categoryName): return 'icon-sitemap'; + case /interface/i.test(categoryName): return 'icon-qrcode'; + case /cups/i.test(categoryName): return 'icon-print'; + case /web/i.test(categoryName): return 'icon-globe'; + case /apache/i.test(categoryName): return 'icon-leaf'; + case /sso/i.test(categoryName): return 'icon-group'; + case /ldap/i.test(categoryName): return 'icon-book'; + case /proftpd/i.test(categoryName): return 'icon-briefcase'; + case /ssl/i.test(categoryName): return 'icon-certificate'; + case /^ent/i.test(categoryName): return 'icon-edit-sign'; + case /ssh/i.test(categoryName): return 'icon-terminal'; + case /container/i.test(categoryName): return 'icon-th'; + case /clamav/i.test(categoryName): return 'icon-shield'; + case /firewall/i.test(categoryName): return 'icon-fire'; + case /services/i.test(categoryName): return 'icon-cogs'; + case /systeme/i.test(categoryName): return 'icon-desktop'; + case /samba/i.test(categoryName): return 'icon-windows'; + case /esu/i.test(categoryName): return 'icon-filter'; + case /mysql/i.test(categoryName): return 'icon-hdd'; + case /logs/i.test(categoryName): return 'icon-edit'; + case /ftp/i.test(categoryName): return 'icon-cloud'; + case /dhcp/i.test(categoryName): return 'icon-bolt'; + default: return 'icon-tags'; + }*/ + } + }; +}); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/kb.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/kb.js new file mode 100644 index 0000000000000000000000000000000000000000..5b76e5661bf0bb4c8374d3b5d43d9e6403cc8093 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/kb.js @@ -0,0 +1,6 @@ +define(function(){ + return { + TAB: 9, + ENTER: 13 + } +}); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/backbone-localStorage.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/backbone-localStorage.js new file mode 100644 index 0000000000000000000000000000000000000000..56021e5e727ae75038ede395f2487c1e32cf1d02 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/backbone-localStorage.js @@ -0,0 +1,136 @@ +/** + * Backbone localStorage Adapter + * https://github.com/jeromegn/Backbone.localStorage + */ + +(function() { + // A simple module to replace `Backbone.sync` with *localStorage*-based + // persistence. Models are given GUIDS, and saved into a JSON object. Simple + // as that. + + // Hold reference to Underscore.js and Backbone.js in the closure in order + // to make things work even if they are removed from the global namespace + var _ = this._; + var Backbone = this.Backbone; + + // Generate four random hex digits. + function S4() { + return (((1+Math.random())*0x10000)|0).toString(16).substring(1); + }; + + // Generate a pseudo-GUID by concatenating random hexadecimal. + function guid() { + return (S4()+S4()+"-"+S4()+"-"+S4()+"-"+S4()+"-"+S4()+S4()+S4()); + }; + + // Our Store is represented by a single JS object in *localStorage*. Create it + // with a meaningful name, like the name you'd give a table. + // window.Store is deprectated, use Backbone.LocalStorage instead + Backbone.LocalStorage = window.Store = function(name) { + this.name = name; + var store = this.localStorage().getItem(this.name); + this.records = (store && store.split(",")) || []; + }; + + _.extend(Backbone.LocalStorage.prototype, { + + // Save the current state of the **Store** to *localStorage*. + save: function() { + this.localStorage().setItem(this.name, this.records.join(",")); + }, + + // Add a model, giving it a (hopefully)-unique GUID, if it doesn't already + // have an id of it's own. + create: function(model) { + if (!model.id) { + model.id = guid(); + model.set(model.idAttribute, model.id); + } + this.localStorage().setItem(this.name+"-"+model.id, JSON.stringify(model)); + this.records.push(model.id.toString()); + this.save(); + return model.toJSON(); + }, + + // Update a model by replacing its copy in `this.data`. + update: function(model) { + this.localStorage().setItem(this.name+"-"+model.id, JSON.stringify(model)); + if (!_.include(this.records, model.id.toString())) this.records.push(model.id.toString()); this.save(); + return model.toJSON(); + }, + + // Retrieve a model from `this.data` by id. + find: function(model) { + return JSON.parse(this.localStorage().getItem(this.name+"-"+model.id)); + }, + + // Return the array of all models currently in storage. + findAll: function() { + return _(this.records).chain() + .map(function(id){return JSON.parse(this.localStorage().getItem(this.name+"-"+id));}, this) + .compact() + .value(); + }, + + // Delete a model from `this.data`, returning it. + destroy: function(model) { + this.localStorage().removeItem(this.name+"-"+model.id); + this.records = _.reject(this.records, function(record_id){return record_id == model.id.toString();}); + this.save(); + return model; + }, + + localStorage: function() { + return localStorage; + } + + }); + + // localSync delegate to the model or collection's + // *localStorage* property, which should be an instance of `Store`. + // window.Store.sync and Backbone.localSync is deprectated, use Backbone.LocalStorage.sync instead + Backbone.LocalStorage.sync = window.Store.sync = Backbone.localSync = function(method, model, options, error) { + var store = model.localStorage || model.collection.localStorage; + + // Backwards compatibility with Backbone <= 0.3.3 + if (typeof options == 'function') { + options = { + success: options, + error: error + }; + } + + var resp; + + switch (method) { + case "read": resp = model.id != undefined ? store.find(model) : store.findAll(); break; + case "create": resp = store.create(model); break; + case "update": resp = store.update(model); break; + case "delete": resp = store.destroy(model); break; + } + + if (resp) { + options.success(resp); + } else { + options.error("Record not found"); + } + }; + + Backbone.ajaxSync = Backbone.sync; + + Backbone.getSyncMethod = function(model) { + if(model.localStorage || (model.collection && model.collection.localStorage)) + { + return Backbone.localSync; + } + + return Backbone.ajaxSync; + }; + + // Override 'Backbone.sync' to default to localSync, + // the original 'Backbone.sync' is still available in 'Backbone.ajaxSync' + Backbone.sync = function(method, model, options, error) { + return Backbone.getSyncMethod(model).apply(this, [method, model, options, error]); + }; + +})(); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/backbone.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/backbone.js new file mode 100644 index 0000000000000000000000000000000000000000..f5b3daa1e9461e0a507e27393ed925b4729ca8ea --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/backbone.js @@ -0,0 +1,1431 @@ +// Backbone.js 0.9.2 + +// (c) 2010-2012 Jeremy Ashkenas, DocumentCloud Inc. +// Backbone may be freely distributed under the MIT license. +// For all details and documentation: +// http://backbonejs.org + +(function(){ + + // Initial Setup + // ------------- + + // Save a reference to the global object (`window` in the browser, `global` + // on the server). + var root = this; + + // Save the previous value of the `Backbone` variable, so that it can be + // restored later on, if `noConflict` is used. + var previousBackbone = root.Backbone; + + // Create a local reference to slice/splice. + var slice = Array.prototype.slice; + var splice = Array.prototype.splice; + + // The top-level namespace. All public Backbone classes and modules will + // be attached to this. Exported for both CommonJS and the browser. + var Backbone; + if (typeof exports !== 'undefined') { + Backbone = exports; + } else { + Backbone = root.Backbone = {}; + } + + // Current version of the library. Keep in sync with `package.json`. + Backbone.VERSION = '0.9.2'; + + // Require Underscore, if we're on the server, and it's not already present. + var _ = root._; + if (!_ && (typeof require !== 'undefined')) _ = require('underscore'); + + // For Backbone's purposes, jQuery, Zepto, or Ender owns the `$` variable. + var $ = root.jQuery || root.Zepto || root.ender; + + // Set the JavaScript library that will be used for DOM manipulation and + // Ajax calls (a.k.a. the `$` variable). By default Backbone will use: jQuery, + // Zepto, or Ender; but the `setDomLibrary()` method lets you inject an + // alternate JavaScript library (or a mock library for testing your views + // outside of a browser). + Backbone.setDomLibrary = function(lib) { + $ = lib; + }; + + // Runs Backbone.js in *noConflict* mode, returning the `Backbone` variable + // to its previous owner. Returns a reference to this Backbone object. + Backbone.noConflict = function() { + root.Backbone = previousBackbone; + return this; + }; + + // Turn on `emulateHTTP` to support legacy HTTP servers. Setting this option + // will fake `"PUT"` and `"DELETE"` requests via the `_method` parameter and + // set a `X-Http-Method-Override` header. + Backbone.emulateHTTP = false; + + // Turn on `emulateJSON` to support legacy servers that can't deal with direct + // `application/json` requests ... will encode the body as + // `application/x-www-form-urlencoded` instead and will send the model in a + // form param named `model`. + Backbone.emulateJSON = false; + + // Backbone.Events + // ----------------- + + // Regular expression used to split event strings + var eventSplitter = /\s+/; + + // A module that can be mixed in to *any object* in order to provide it with + // custom events. You may bind with `on` or remove with `off` callback functions + // to an event; trigger`-ing an event fires all callbacks in succession. + // + // var object = {}; + // _.extend(object, Backbone.Events); + // object.on('expand', function(){ alert('expanded'); }); + // object.trigger('expand'); + // + var Events = Backbone.Events = { + + // Bind one or more space separated events, `events`, to a `callback` + // function. Passing `"all"` will bind the callback to all events fired. + on: function(events, callback, context) { + + var calls, event, node, tail, list; + if (!callback) return this; + events = events.split(eventSplitter); + calls = this._callbacks || (this._callbacks = {}); + + // Create an immutable callback list, allowing traversal during + // modification. The tail is an empty object that will always be used + // as the next node. + while (event = events.shift()) { + list = calls[event]; + node = list ? list.tail : {}; + node.next = tail = {}; + node.context = context; + node.callback = callback; + calls[event] = {tail: tail, next: list ? list.next : node}; + } + + return this; + }, + + // Remove one or many callbacks. If `context` is null, removes all callbacks + // with that function. If `callback` is null, removes all callbacks for the + // event. If `events` is null, removes all bound callbacks for all events. + off: function(events, callback, context) { + var event, calls, node, tail, cb, ctx; + + // No events, or removing *all* events. + if (!(calls = this._callbacks)) return; + if (!(events || callback || context)) { + delete this._callbacks; + return this; + } + + // Loop through the listed events and contexts, splicing them out of the + // linked list of callbacks if appropriate. + events = events ? events.split(eventSplitter) : _.keys(calls); + while (event = events.shift()) { + node = calls[event]; + delete calls[event]; + if (!node || !(callback || context)) continue; + // Create a new list, omitting the indicated callbacks. + tail = node.tail; + while ((node = node.next) !== tail) { + cb = node.callback; + ctx = node.context; + if ((callback && cb !== callback) || (context && ctx !== context)) { + this.on(event, cb, ctx); + } + } + } + + return this; + }, + + // Trigger one or many events, firing all bound callbacks. Callbacks are + // passed the same arguments as `trigger` is, apart from the event name + // (unless you're listening on `"all"`, which will cause your callback to + // receive the true name of the event as the first argument). + trigger: function(events) { + var event, node, calls, tail, args, all, rest; + if (!(calls = this._callbacks)) return this; + all = calls.all; + events = events.split(eventSplitter); + rest = slice.call(arguments, 1); + + // For each event, walk through the linked list of callbacks twice, + // first to trigger the event, then to trigger any `"all"` callbacks. + while (event = events.shift()) { + if (node = calls[event]) { + tail = node.tail; + while ((node = node.next) !== tail) { + node.callback.apply(node.context || this, rest); + } + } + if (node = all) { + tail = node.tail; + args = [event].concat(rest); + while ((node = node.next) !== tail) { + node.callback.apply(node.context || this, args); + } + } + } + + return this; + } + + }; + + // Aliases for backwards compatibility. + Events.bind = Events.on; + Events.unbind = Events.off; + + // Backbone.Model + // -------------- + + // Create a new model, with defined attributes. A client id (`cid`) + // is automatically generated and assigned for you. + var Model = Backbone.Model = function(attributes, options) { + var defaults; + attributes || (attributes = {}); + if (options && options.parse) attributes = this.parse(attributes); + if (defaults = getValue(this, 'defaults')) { + attributes = _.extend({}, defaults, attributes); + } + if (options && options.collection) this.collection = options.collection; + this.attributes = {}; + this._escapedAttributes = {}; + this.cid = _.uniqueId('c'); + this.changed = {}; + this._silent = {}; + this._pending = {}; + this.set(attributes, {silent: true}); + // Reset change tracking. + this.changed = {}; + this._silent = {}; + this._pending = {}; + this._previousAttributes = _.clone(this.attributes); + this.initialize.apply(this, arguments); + }; + + // Attach all inheritable methods to the Model prototype. + _.extend(Model.prototype, Events, { + + // A hash of attributes whose current and previous value differ. + changed: null, + + // A hash of attributes that have silently changed since the last time + // `change` was called. Will become pending attributes on the next call. + _silent: null, + + // A hash of attributes that have changed since the last `'change'` event + // began. + _pending: null, + + // The default name for the JSON `id` attribute is `"id"`. MongoDB and + // CouchDB users may want to set this to `"_id"`. + idAttribute: 'id', + + // Initialize is an empty function by default. Override it with your own + // initialization logic. + initialize: function(){}, + + // Return a copy of the model's `attributes` object. + toJSON: function(options) { + return _.clone(this.attributes); + }, + + // Get the value of an attribute. + get: function(attr) { + return this.attributes[attr]; + }, + + // Get the HTML-escaped value of an attribute. + escape: function(attr) { + var html; + if (html = this._escapedAttributes[attr]) return html; + var val = this.get(attr); + return this._escapedAttributes[attr] = _.escape(val == null ? '' : '' + val); + }, + + // Returns `true` if the attribute contains a value that is not null + // or undefined. + has: function(attr) { + return this.get(attr) != null; + }, + + // Set a hash of model attributes on the object, firing `"change"` unless + // you choose to silence it. + set: function(key, value, options) { + var attrs, attr, val; + + // Handle both `"key", value` and `{key: value}` -style arguments. + if (_.isObject(key) || key == null) { + attrs = key; + options = value; + } else { + attrs = {}; + attrs[key] = value; + } + + // Extract attributes and options. + options || (options = {}); + if (!attrs) return this; + if (attrs instanceof Model) attrs = attrs.attributes; + if (options.unset) for (attr in attrs) attrs[attr] = void 0; + + // Run validation. + if (!this._validate(attrs, options)) return false; + + // Check for changes of `id`. + if (this.idAttribute in attrs) this.id = attrs[this.idAttribute]; + + var changes = options.changes = {}; + var now = this.attributes; + var escaped = this._escapedAttributes; + var prev = this._previousAttributes || {}; + + // For each `set` attribute... + for (attr in attrs) { + val = attrs[attr]; + + // If the new and current value differ, record the change. + if (!_.isEqual(now[attr], val) || (options.unset && _.has(now, attr))) { + delete escaped[attr]; + (options.silent ? this._silent : changes)[attr] = true; + } + + // Update or delete the current value. + options.unset ? delete now[attr] : now[attr] = val; + + // If the new and previous value differ, record the change. If not, + // then remove changes for this attribute. + if (!_.isEqual(prev[attr], val) || (_.has(now, attr) != _.has(prev, attr))) { + this.changed[attr] = val; + if (!options.silent) this._pending[attr] = true; + } else { + delete this.changed[attr]; + delete this._pending[attr]; + } + } + + // Fire the `"change"` events. + if (!options.silent) this.change(options); + return this; + }, + + // Remove an attribute from the model, firing `"change"` unless you choose + // to silence it. `unset` is a noop if the attribute doesn't exist. + unset: function(attr, options) { + (options || (options = {})).unset = true; + return this.set(attr, null, options); + }, + + // Clear all attributes on the model, firing `"change"` unless you choose + // to silence it. + clear: function(options) { + (options || (options = {})).unset = true; + return this.set(_.clone(this.attributes), options); + }, + + // Fetch the model from the server. If the server's representation of the + // model differs from its current attributes, they will be overriden, + // triggering a `"change"` event. + fetch: function(options) { + options = options ? _.clone(options) : {}; + var model = this; + var success = options.success; + options.success = function(resp, status, xhr) { + if (!model.set(model.parse(resp, xhr), options)) return false; + if (success) success(model, resp); + }; + options.error = Backbone.wrapError(options.error, model, options); + return (this.sync || Backbone.sync).call(this, 'read', this, options); + }, + + // Set a hash of model attributes, and sync the model to the server. + // If the server returns an attributes hash that differs, the model's + // state will be `set` again. + save: function(key, value, options) { + var attrs, current; + + // Handle both `("key", value)` and `({key: value})` -style calls. + if (_.isObject(key) || key == null) { + attrs = key; + options = value; + } else { + attrs = {}; + attrs[key] = value; + } + options = options ? _.clone(options) : {}; + + // If we're "wait"-ing to set changed attributes, validate early. + if (options.wait) { + if (!this._validate(attrs, options)) return false; + current = _.clone(this.attributes); + } + + // Regular saves `set` attributes before persisting to the server. + var silentOptions = _.extend({}, options, {silent: true}); + if (attrs && !this.set(attrs, options.wait ? silentOptions : options)) { + return false; + } + + // After a successful server-side save, the client is (optionally) + // updated with the server-side state. + var model = this; + var success = options.success; + options.success = function(resp, status, xhr) { + var serverAttrs = model.parse(resp, xhr); + if (options.wait) { + delete options.wait; + serverAttrs = _.extend(attrs || {}, serverAttrs); + } + if (!model.set(serverAttrs, options)) return false; + if (success) { + success(model, resp); + } else { + model.trigger('sync', model, resp, options); + } + }; + + // Finish configuring and sending the Ajax request. + options.error = Backbone.wrapError(options.error, model, options); + var method = this.isNew() ? 'create' : 'update'; + var xhr = (this.sync || Backbone.sync).call(this, method, this, options); + if (options.wait) this.set(current, silentOptions); + return xhr; + }, + + // Destroy this model on the server if it was already persisted. + // Optimistically removes the model from its collection, if it has one. + // If `wait: true` is passed, waits for the server to respond before removal. + destroy: function(options) { + options = options ? _.clone(options) : {}; + var model = this; + var success = options.success; + + var triggerDestroy = function() { + model.trigger('destroy', model, model.collection, options); + }; + + if (this.isNew()) { + triggerDestroy(); + return false; + } + + options.success = function(resp) { + if (options.wait) triggerDestroy(); + if (success) { + success(model, resp); + } else { + model.trigger('sync', model, resp, options); + } + }; + + options.error = Backbone.wrapError(options.error, model, options); + var xhr = (this.sync || Backbone.sync).call(this, 'delete', this, options); + if (!options.wait) triggerDestroy(); + return xhr; + }, + + // Default URL for the model's representation on the server -- if you're + // using Backbone's restful methods, override this to change the endpoint + // that will be called. + url: function() { + var base = getValue(this, 'urlRoot') || getValue(this.collection, 'url') || urlError(); + if (this.isNew()) return base; + return base + (base.charAt(base.length - 1) == '/' ? '' : '/') + encodeURIComponent(this.id); + }, + + // **parse** converts a response into the hash of attributes to be `set` on + // the model. The default implementation is just to pass the response along. + parse: function(resp, xhr) { + return resp; + }, + + // Create a new model with identical attributes to this one. + clone: function() { + return new this.constructor(this.attributes); + }, + + // A model is new if it has never been saved to the server, and lacks an id. + isNew: function() { + return this.id == null; + }, + + // Call this method to manually fire a `"change"` event for this model and + // a `"change:attribute"` event for each changed attribute. + // Calling this will cause all objects observing the model to update. + change: function(options) { + options || (options = {}); + var changing = this._changing; + this._changing = true; + + // Silent changes become pending changes. + for (var attr in this._silent) this._pending[attr] = true; + + // Silent changes are triggered. + var changes = _.extend({}, options.changes, this._silent); + this._silent = {}; + for (var attr in changes) { + this.trigger('change:' + attr, this, this.get(attr), options); + } + if (changing) return this; + + // Continue firing `"change"` events while there are pending changes. + while (!_.isEmpty(this._pending)) { + this._pending = {}; + this.trigger('change', this, options); + // Pending and silent changes still remain. + for (var attr in this.changed) { + if (this._pending[attr] || this._silent[attr]) continue; + delete this.changed[attr]; + } + this._previousAttributes = _.clone(this.attributes); + } + + this._changing = false; + return this; + }, + + // Determine if the model has changed since the last `"change"` event. + // If you specify an attribute name, determine if that attribute has changed. + hasChanged: function(attr) { + if (!arguments.length) return !_.isEmpty(this.changed); + return _.has(this.changed, attr); + }, + + // Return an object containing all the attributes that have changed, or + // false if there are no changed attributes. Useful for determining what + // parts of a view need to be updated and/or what attributes need to be + // persisted to the server. Unset attributes will be set to undefined. + // You can also pass an attributes object to diff against the model, + // determining if there *would be* a change. + changedAttributes: function(diff) { + if (!diff) return this.hasChanged() ? _.clone(this.changed) : false; + var val, changed = false, old = this._previousAttributes; + for (var attr in diff) { + if (_.isEqual(old[attr], (val = diff[attr]))) continue; + (changed || (changed = {}))[attr] = val; + } + return changed; + }, + + // Get the previous value of an attribute, recorded at the time the last + // `"change"` event was fired. + previous: function(attr) { + if (!arguments.length || !this._previousAttributes) return null; + return this._previousAttributes[attr]; + }, + + // Get all of the attributes of the model at the time of the previous + // `"change"` event. + previousAttributes: function() { + return _.clone(this._previousAttributes); + }, + + // Check if the model is currently in a valid state. It's only possible to + // get into an *invalid* state if you're using silent changes. + isValid: function() { + return !this.validate(this.attributes); + }, + + // Run validation against the next complete set of model attributes, + // returning `true` if all is well. If a specific `error` callback has + // been passed, call that instead of firing the general `"error"` event. + _validate: function(attrs, options) { + if (options.silent || !this.validate) return true; + attrs = _.extend({}, this.attributes, attrs); + var error = this.validate(attrs, options); + if (!error) return true; + if (options && options.error) { + options.error(this, error, options); + } else { + this.trigger('error', this, error, options); + } + return false; + } + + }); + + // Backbone.Collection + // ------------------- + + // Provides a standard collection class for our sets of models, ordered + // or unordered. If a `comparator` is specified, the Collection will maintain + // its models in sort order, as they're added and removed. + var Collection = Backbone.Collection = function(models, options) { + options || (options = {}); + if (options.model) this.model = options.model; + if (options.comparator) this.comparator = options.comparator; + this._reset(); + this.initialize.apply(this, arguments); + if (models) this.reset(models, {silent: true, parse: options.parse}); + }; + + // Define the Collection's inheritable methods. + _.extend(Collection.prototype, Events, { + + // The default model for a collection is just a **Backbone.Model**. + // This should be overridden in most cases. + model: Model, + + // Initialize is an empty function by default. Override it with your own + // initialization logic. + initialize: function(){}, + + // The JSON representation of a Collection is an array of the + // models' attributes. + toJSON: function(options) { + return this.map(function(model){ return model.toJSON(options); }); + }, + + // Add a model, or list of models to the set. Pass **silent** to avoid + // firing the `add` event for every new model. + add: function(models, options) { + var i, index, length, model, cid, id, cids = {}, ids = {}, dups = []; + options || (options = {}); + models = _.isArray(models) ? models.slice() : [models]; + + // Begin by turning bare objects into model references, and preventing + // invalid models or duplicate models from being added. + for (i = 0, length = models.length; i < length; i++) { + if (!(model = models[i] = this._prepareModel(models[i], options))) { + throw new Error("Can't add an invalid model to a collection"); + } + cid = model.cid; + id = model.id; + if (cids[cid] || this._byCid[cid] || ((id != null) && (ids[id] || this._byId[id]))) { + dups.push(i); + continue; + } + cids[cid] = ids[id] = model; + } + + // Remove duplicates. + i = dups.length; + while (i--) { + models.splice(dups[i], 1); + } + + // Listen to added models' events, and index models for lookup by + // `id` and by `cid`. + for (i = 0, length = models.length; i < length; i++) { + (model = models[i]).on('all', this._onModelEvent, this); + this._byCid[model.cid] = model; + if (model.id != null) this._byId[model.id] = model; + } + + // Insert models into the collection, re-sorting if needed, and triggering + // `add` events unless silenced. + this.length += length; + index = options.at != null ? options.at : this.models.length; + splice.apply(this.models, [index, 0].concat(models)); + if (this.comparator) this.sort({silent: true}); + if (options.silent) return this; + for (i = 0, length = this.models.length; i < length; i++) { + if (!cids[(model = this.models[i]).cid]) continue; + options.index = i; + model.trigger('add', model, this, options); + } + return this; + }, + + // Remove a model, or a list of models from the set. Pass silent to avoid + // firing the `remove` event for every model removed. + remove: function(models, options) { + var i, l, index, model; + options || (options = {}); + models = _.isArray(models) ? models.slice() : [models]; + for (i = 0, l = models.length; i < l; i++) { + model = this.getByCid(models[i]) || this.get(models[i]); + if (!model) continue; + delete this._byId[model.id]; + delete this._byCid[model.cid]; + index = this.indexOf(model); + this.models.splice(index, 1); + this.length--; + if (!options.silent) { + options.index = index; + model.trigger('remove', model, this, options); + } + this._removeReference(model); + } + return this; + }, + + // Add a model to the end of the collection. + push: function(model, options) { + model = this._prepareModel(model, options); + this.add(model, options); + return model; + }, + + // Remove a model from the end of the collection. + pop: function(options) { + var model = this.at(this.length - 1); + this.remove(model, options); + return model; + }, + + // Add a model to the beginning of the collection. + unshift: function(model, options) { + model = this._prepareModel(model, options); + this.add(model, _.extend({at: 0}, options)); + return model; + }, + + // Remove a model from the beginning of the collection. + shift: function(options) { + var model = this.at(0); + this.remove(model, options); + return model; + }, + + // Get a model from the set by id. + get: function(id) { + if (id == null) return void 0; + return this._byId[id.id != null ? id.id : id]; + }, + + // Get a model from the set by client id. + getByCid: function(cid) { + return cid && this._byCid[cid.cid || cid]; + }, + + // Get the model at the given index. + at: function(index) { + return this.models[index]; + }, + + // Return models with matching attributes. Useful for simple cases of `filter`. + where: function(attrs) { + if (_.isEmpty(attrs)) return []; + return this.filter(function(model) { + for (var key in attrs) { + if (attrs[key] !== model.get(key)) return false; + } + return true; + }); + }, + + // Force the collection to re-sort itself. You don't need to call this under + // normal circumstances, as the set will maintain sort order as each item + // is added. + sort: function(options) { + options || (options = {}); + if (!this.comparator) throw new Error('Cannot sort a set without a comparator'); + var boundComparator = _.bind(this.comparator, this); + if (this.comparator.length == 1) { + this.models = this.sortBy(boundComparator); + } else { + this.models.sort(boundComparator); + } + if (!options.silent) this.trigger('reset', this, options); + return this; + }, + + // Pluck an attribute from each model in the collection. + pluck: function(attr) { + return _.map(this.models, function(model){ return model.get(attr); }); + }, + + // When you have more items than you want to add or remove individually, + // you can reset the entire set with a new list of models, without firing + // any `add` or `remove` events. Fires `reset` when finished. + reset: function(models, options) { + models || (models = []); + options || (options = {}); + for (var i = 0, l = this.models.length; i < l; i++) { + this._removeReference(this.models[i]); + } + this._reset(); + this.add(models, _.extend({silent: true}, options)); + if (!options.silent) this.trigger('reset', this, options); + return this; + }, + + // Fetch the default set of models for this collection, resetting the + // collection when they arrive. If `add: true` is passed, appends the + // models to the collection instead of resetting. + fetch: function(options) { + options = options ? _.clone(options) : {}; + if (options.parse === undefined) options.parse = true; + var collection = this; + var success = options.success; + options.success = function(resp, status, xhr) { + collection[options.add ? 'add' : 'reset'](collection.parse(resp, xhr), options); + if (success) success(collection, resp); + }; + options.error = Backbone.wrapError(options.error, collection, options); + return (this.sync || Backbone.sync).call(this, 'read', this, options); + }, + + // Create a new instance of a model in this collection. Add the model to the + // collection immediately, unless `wait: true` is passed, in which case we + // wait for the server to agree. + create: function(model, options) { + var coll = this; + options = options ? _.clone(options) : {}; + model = this._prepareModel(model, options); + if (!model) return false; + if (!options.wait) coll.add(model, options); + var success = options.success; + options.success = function(nextModel, resp, xhr) { + if (options.wait) coll.add(nextModel, options); + if (success) { + success(nextModel, resp); + } else { + nextModel.trigger('sync', model, resp, options); + } + }; + model.save(null, options); + return model; + }, + + // **parse** converts a response into a list of models to be added to the + // collection. The default implementation is just to pass it through. + parse: function(resp, xhr) { + return resp; + }, + + // Proxy to _'s chain. Can't be proxied the same way the rest of the + // underscore methods are proxied because it relies on the underscore + // constructor. + chain: function () { + return _(this.models).chain(); + }, + + // Reset all internal state. Called when the collection is reset. + _reset: function(options) { + this.length = 0; + this.models = []; + this._byId = {}; + this._byCid = {}; + }, + + // Prepare a model or hash of attributes to be added to this collection. + _prepareModel: function(model, options) { + options || (options = {}); + if (!(model instanceof Model)) { + var attrs = model; + options.collection = this; + model = new this.model(attrs, options); + if (!model._validate(model.attributes, options)) model = false; + } else if (!model.collection) { + model.collection = this; + } + return model; + }, + + // Internal method to remove a model's ties to a collection. + _removeReference: function(model) { + if (this == model.collection) { + delete model.collection; + } + model.off('all', this._onModelEvent, this); + }, + + // Internal method called every time a model in the set fires an event. + // Sets need to update their indexes when models change ids. All other + // events simply proxy through. "add" and "remove" events that originate + // in other collections are ignored. + _onModelEvent: function(event, model, collection, options) { + if ((event == 'add' || event == 'remove') && collection != this) return; + if (event == 'destroy') { + this.remove(model, options); + } + if (model && event === 'change:' + model.idAttribute) { + delete this._byId[model.previous(model.idAttribute)]; + this._byId[model.id] = model; + } + this.trigger.apply(this, arguments); + } + + }); + + // Underscore methods that we want to implement on the Collection. + var methods = ['forEach', 'each', 'map', 'reduce', 'reduceRight', 'find', + 'detect', 'filter', 'select', 'reject', 'every', 'all', 'some', 'any', + 'include', 'contains', 'invoke', 'max', 'min', 'sortBy', 'sortedIndex', + 'toArray', 'size', 'first', 'initial', 'rest', 'last', 'without', 'indexOf', + 'shuffle', 'lastIndexOf', 'isEmpty', 'groupBy']; + + // Mix in each Underscore method as a proxy to `Collection#models`. + _.each(methods, function(method) { + Collection.prototype[method] = function() { + return _[method].apply(_, [this.models].concat(_.toArray(arguments))); + }; + }); + + // Backbone.Router + // ------------------- + + // Routers map faux-URLs to actions, and fire events when routes are + // matched. Creating a new one sets its `routes` hash, if not set statically. + var Router = Backbone.Router = function(options) { + options || (options = {}); + if (options.routes) this.routes = options.routes; + this._bindRoutes(); + this.initialize.apply(this, arguments); + }; + + // Cached regular expressions for matching named param parts and splatted + // parts of route strings. + var namedParam = /:\w+/g; + var splatParam = /\*\w+/g; + var escapeRegExp = /[-[\]{}()+?.,\\^$|#\s]/g; + + // Set up all inheritable **Backbone.Router** properties and methods. + _.extend(Router.prototype, Events, { + + // Initialize is an empty function by default. Override it with your own + // initialization logic. + initialize: function(){}, + + // Manually bind a single named route to a callback. For example: + // + // this.route('search/:query/p:num', 'search', function(query, num) { + // ... + // }); + // + route: function(route, name, callback) { + Backbone.history || (Backbone.history = new History); + if (!_.isRegExp(route)) route = this._routeToRegExp(route); + if (!callback) callback = this[name]; + Backbone.history.route(route, _.bind(function(fragment) { + var args = this._extractParameters(route, fragment); + callback && callback.apply(this, args); + this.trigger.apply(this, ['route:' + name].concat(args)); + Backbone.history.trigger('route', this, name, args); + }, this)); + return this; + }, + + // Simple proxy to `Backbone.history` to save a fragment into the history. + navigate: function(fragment, options) { + Backbone.history.navigate(fragment, options); + }, + + // Bind all defined routes to `Backbone.history`. We have to reverse the + // order of the routes here to support behavior where the most general + // routes can be defined at the bottom of the route map. + _bindRoutes: function() { + if (!this.routes) return; + var routes = []; + for (var route in this.routes) { + routes.unshift([route, this.routes[route]]); + } + for (var i = 0, l = routes.length; i < l; i++) { + this.route(routes[i][0], routes[i][1], this[routes[i][1]]); + } + }, + + // Convert a route string into a regular expression, suitable for matching + // against the current location hash. + _routeToRegExp: function(route) { + route = route.replace(escapeRegExp, '\\$&') + .replace(namedParam, '([^\/]+)') + .replace(splatParam, '(.*?)'); + return new RegExp('^' + route + '$'); + }, + + // Given a route, and a URL fragment that it matches, return the array of + // extracted parameters. + _extractParameters: function(route, fragment) { + return route.exec(fragment).slice(1); + } + + }); + + // Backbone.History + // ---------------- + + // Handles cross-browser history management, based on URL fragments. If the + // browser does not support `onhashchange`, falls back to polling. + var History = Backbone.History = function() { + this.handlers = []; + _.bindAll(this, 'checkUrl'); + }; + + // Cached regex for cleaning leading hashes and slashes . + var routeStripper = /^[#\/]/; + + // Cached regex for detecting MSIE. + var isExplorer = /msie [\w.]+/; + + // Has the history handling already been started? + History.started = false; + + // Set up all inheritable **Backbone.History** properties and methods. + _.extend(History.prototype, Events, { + + // The default interval to poll for hash changes, if necessary, is + // twenty times a second. + interval: 50, + + // Gets the true hash value. Cannot use location.hash directly due to bug + // in Firefox where location.hash will always be decoded. + getHash: function(windowOverride) { + var loc = windowOverride ? windowOverride.location : window.location; + var match = loc.href.match(/#(.*)$/); + return match ? match[1] : ''; + }, + + // Get the cross-browser normalized URL fragment, either from the URL, + // the hash, or the override. + getFragment: function(fragment, forcePushState) { + if (fragment == null) { + if (this._hasPushState || forcePushState) { + fragment = window.location.pathname; + var search = window.location.search; + if (search) fragment += search; + } else { + fragment = this.getHash(); + } + } + if (!fragment.indexOf(this.options.root)) fragment = fragment.substr(this.options.root.length); + return fragment.replace(routeStripper, ''); + }, + + // Start the hash change handling, returning `true` if the current URL matches + // an existing route, and `false` otherwise. + start: function(options) { + if (History.started) throw new Error("Backbone.history has already been started"); + History.started = true; + + // Figure out the initial configuration. Do we need an iframe? + // Is pushState desired ... is it available? + this.options = _.extend({}, {root: '/'}, this.options, options); + this._wantsHashChange = this.options.hashChange !== false; + this._wantsPushState = !!this.options.pushState; + this._hasPushState = !!(this.options.pushState && window.history && window.history.pushState); + var fragment = this.getFragment(); + var docMode = document.documentMode; + var oldIE = (isExplorer.exec(navigator.userAgent.toLowerCase()) && (!docMode || docMode <= 7)); + + if (oldIE) { + this.iframe = $('<iframe src="javascript:0" tabindex="-1" />').hide().appendTo('body')[0].contentWindow; + this.navigate(fragment); + } + + // Depending on whether we're using pushState or hashes, and whether + // 'onhashchange' is supported, determine how we check the URL state. + if (this._hasPushState) { + $(window).bind('popstate', this.checkUrl); + } else if (this._wantsHashChange && ('onhashchange' in window) && !oldIE) { + $(window).bind('hashchange', this.checkUrl); + } else if (this._wantsHashChange) { + this._checkUrlInterval = setInterval(this.checkUrl, this.interval); + } + + // Determine if we need to change the base url, for a pushState link + // opened by a non-pushState browser. + this.fragment = fragment; + var loc = window.location; + var atRoot = loc.pathname == this.options.root; + + // If we've started off with a route from a `pushState`-enabled browser, + // but we're currently in a browser that doesn't support it... + if (this._wantsHashChange && this._wantsPushState && !this._hasPushState && !atRoot) { + this.fragment = this.getFragment(null, true); + window.location.replace(this.options.root + '#' + this.fragment); + // Return immediately as browser will do redirect to new url + return true; + + // Or if we've started out with a hash-based route, but we're currently + // in a browser where it could be `pushState`-based instead... + } else if (this._wantsPushState && this._hasPushState && atRoot && loc.hash) { + this.fragment = this.getHash().replace(routeStripper, ''); + window.history.replaceState({}, document.title, loc.protocol + '//' + loc.host + this.options.root + this.fragment); + } + + if (!this.options.silent) { + return this.loadUrl(); + } + }, + + // Disable Backbone.history, perhaps temporarily. Not useful in a real app, + // but possibly useful for unit testing Routers. + stop: function() { + $(window).unbind('popstate', this.checkUrl).unbind('hashchange', this.checkUrl); + clearInterval(this._checkUrlInterval); + History.started = false; + }, + + // Add a route to be tested when the fragment changes. Routes added later + // may override previous routes. + route: function(route, callback) { + this.handlers.unshift({route: route, callback: callback}); + }, + + // Checks the current URL to see if it has changed, and if it has, + // calls `loadUrl`, normalizing across the hidden iframe. + checkUrl: function(e) { + var current = this.getFragment(); + if (current == this.fragment && this.iframe) current = this.getFragment(this.getHash(this.iframe)); + if (current == this.fragment) return false; + if (this.iframe) this.navigate(current); + this.loadUrl() || this.loadUrl(this.getHash()); + }, + + // Attempt to load the current URL fragment. If a route succeeds with a + // match, returns `true`. If no defined routes matches the fragment, + // returns `false`. + loadUrl: function(fragmentOverride) { + var fragment = this.fragment = this.getFragment(fragmentOverride); + var matched = _.any(this.handlers, function(handler) { + if (handler.route.test(fragment)) { + handler.callback(fragment); + return true; + } + }); + return matched; + }, + + // Save a fragment into the hash history, or replace the URL state if the + // 'replace' option is passed. You are responsible for properly URL-encoding + // the fragment in advance. + // + // The options object can contain `trigger: true` if you wish to have the + // route callback be fired (not usually desirable), or `replace: true`, if + // you wish to modify the current URL without adding an entry to the history. + navigate: function(fragment, options) { + if (!History.started) return false; + if (!options || options === true) options = {trigger: options}; + var frag = (fragment || '').replace(routeStripper, ''); + if (this.fragment == frag) return; + + // If pushState is available, we use it to set the fragment as a real URL. + if (this._hasPushState) { + if (frag.indexOf(this.options.root) != 0) frag = this.options.root + frag; + this.fragment = frag; + window.history[options.replace ? 'replaceState' : 'pushState']({}, document.title, frag); + + // If hash changes haven't been explicitly disabled, update the hash + // fragment to store history. + } else if (this._wantsHashChange) { + this.fragment = frag; + this._updateHash(window.location, frag, options.replace); + if (this.iframe && (frag != this.getFragment(this.getHash(this.iframe)))) { + // Opening and closing the iframe tricks IE7 and earlier to push a history entry on hash-tag change. + // When replace is true, we don't want this. + if(!options.replace) this.iframe.document.open().close(); + this._updateHash(this.iframe.location, frag, options.replace); + } + + // If you've told us that you explicitly don't want fallback hashchange- + // based history, then `navigate` becomes a page refresh. + } else { + window.location.assign(this.options.root + fragment); + } + if (options.trigger) this.loadUrl(fragment); + }, + + // Update the hash location, either replacing the current entry, or adding + // a new one to the browser history. + _updateHash: function(location, fragment, replace) { + if (replace) { + location.replace(location.toString().replace(/(javascript:|#).*$/, '') + '#' + fragment); + } else { + location.hash = fragment; + } + } + }); + + // Backbone.View + // ------------- + + // Creating a Backbone.View creates its initial element outside of the DOM, + // if an existing element is not provided... + var View = Backbone.View = function(options) { + this.cid = _.uniqueId('view'); + this._configure(options || {}); + this._ensureElement(); + this.initialize.apply(this, arguments); + this.delegateEvents(); + }; + + // Cached regex to split keys for `delegate`. + var delegateEventSplitter = /^(\S+)\s*(.*)$/; + + // List of view options to be merged as properties. + var viewOptions = ['model', 'collection', 'el', 'id', 'attributes', 'className', 'tagName']; + + // Set up all inheritable **Backbone.View** properties and methods. + _.extend(View.prototype, Events, { + + // The default `tagName` of a View's element is `"div"`. + tagName: 'div', + + // jQuery delegate for element lookup, scoped to DOM elements within the + // current view. This should be prefered to global lookups where possible. + $: function(selector) { + return this.$el.find(selector); + }, + + // Initialize is an empty function by default. Override it with your own + // initialization logic. + initialize: function(){}, + + // **render** is the core function that your view should override, in order + // to populate its element (`this.el`), with the appropriate HTML. The + // convention is for **render** to always return `this`. + render: function() { + return this; + }, + + // Remove this view from the DOM. Note that the view isn't present in the + // DOM by default, so calling this method may be a no-op. + remove: function() { + this.$el.remove(); + return this; + }, + + // For small amounts of DOM Elements, where a full-blown template isn't + // needed, use **make** to manufacture elements, one at a time. + // + // var el = this.make('li', {'class': 'row'}, this.model.escape('title')); + // + make: function(tagName, attributes, content) { + var el = document.createElement(tagName); + if (attributes) $(el).attr(attributes); + if (content) $(el).html(content); + return el; + }, + + // Change the view's element (`this.el` property), including event + // re-delegation. + setElement: function(element, delegate) { + if (this.$el) this.undelegateEvents(); + this.$el = (element instanceof $) ? element : $(element); + this.el = this.$el[0]; + if (delegate !== false) this.delegateEvents(); + return this; + }, + + // Set callbacks, where `this.events` is a hash of + // + // *{"event selector": "callback"}* + // + // { + // 'mousedown .title': 'edit', + // 'click .button': 'save' + // 'click .open': function(e) { ... } + // } + // + // pairs. Callbacks will be bound to the view, with `this` set properly. + // Uses event delegation for efficiency. + // Omitting the selector binds the event to `this.el`. + // This only works for delegate-able events: not `focus`, `blur`, and + // not `change`, `submit`, and `reset` in Internet Explorer. + delegateEvents: function(events) { + if (!(events || (events = getValue(this, 'events')))) return; + this.undelegateEvents(); + for (var key in events) { + var method = events[key]; + if (!_.isFunction(method)) method = this[events[key]]; + if (!method) throw new Error('Method "' + events[key] + '" does not exist'); + var match = key.match(delegateEventSplitter); + var eventName = match[1], selector = match[2]; + method = _.bind(method, this); + eventName += '.delegateEvents' + this.cid; + if (selector === '') { + this.$el.bind(eventName, method); + } else { + this.$el.delegate(selector, eventName, method); + } + } + }, + + // Clears all callbacks previously bound to the view with `delegateEvents`. + // You usually don't need to use this, but may wish to if you have multiple + // Backbone views attached to the same DOM element. + undelegateEvents: function() { + this.$el.unbind('.delegateEvents' + this.cid); + }, + + // Performs the initial configuration of a View with a set of options. + // Keys with special meaning *(model, collection, id, className)*, are + // attached directly to the view. + _configure: function(options) { + if (this.options) options = _.extend({}, this.options, options); + for (var i = 0, l = viewOptions.length; i < l; i++) { + var attr = viewOptions[i]; + if (options[attr]) this[attr] = options[attr]; + } + this.options = options; + }, + + // Ensure that the View has a DOM element to render into. + // If `this.el` is a string, pass it through `$()`, take the first + // matching element, and re-assign it to `el`. Otherwise, create + // an element from the `id`, `className` and `tagName` properties. + _ensureElement: function() { + if (!this.el) { + var attrs = getValue(this, 'attributes') || {}; + if (this.id) attrs.id = this.id; + if (this.className) attrs['class'] = this.className; + this.setElement(this.make(this.tagName, attrs), false); + } else { + this.setElement(this.el, false); + } + } + + }); + + // The self-propagating extend function that Backbone classes use. + var extend = function (protoProps, classProps) { + var child = inherits(this, protoProps, classProps); + child.extend = this.extend; + return child; + }; + + // Set up inheritance for the model, collection, and view. + Model.extend = Collection.extend = Router.extend = View.extend = extend; + + // Backbone.sync + // ------------- + + // Map from CRUD to HTTP for our default `Backbone.sync` implementation. + var methodMap = { + 'create': 'POST', + 'update': 'PUT', + 'delete': 'DELETE', + 'read': 'GET' + }; + + // Override this function to change the manner in which Backbone persists + // models to the server. You will be passed the type of request, and the + // model in question. By default, makes a RESTful Ajax request + // to the model's `url()`. Some possible customizations could be: + // + // * Use `setTimeout` to batch rapid-fire updates into a single request. + // * Send up the models as XML instead of JSON. + // * Persist models via WebSockets instead of Ajax. + // + // Turn on `Backbone.emulateHTTP` in order to send `PUT` and `DELETE` requests + // as `POST`, with a `_method` parameter containing the true HTTP method, + // as well as all requests with the body as `application/x-www-form-urlencoded` + // instead of `application/json` with the model in a param named `model`. + // Useful when interfacing with server-side languages like **PHP** that make + // it difficult to read the body of `PUT` requests. + Backbone.sync = function(method, model, options) { + var type = methodMap[method]; + + // Default options, unless specified. + options || (options = {}); + + // Default JSON-request options. + var params = {type: type, dataType: 'json'}; + + // Ensure that we have a URL. + if (!options.url) { + params.url = getValue(model, 'url') || urlError(); + } + + // Ensure that we have the appropriate request data. + if (!options.data && model && (method == 'create' || method == 'update')) { + params.contentType = 'application/json'; + params.data = JSON.stringify(model.toJSON()); + } + + // For older servers, emulate JSON by encoding the request into an HTML-form. + if (Backbone.emulateJSON) { + params.contentType = 'application/x-www-form-urlencoded'; + params.data = params.data ? {model: params.data} : {}; + } + + // For older servers, emulate HTTP by mimicking the HTTP method with `_method` + // And an `X-HTTP-Method-Override` header. + if (Backbone.emulateHTTP) { + if (type === 'PUT' || type === 'DELETE') { + if (Backbone.emulateJSON) params.data._method = type; + params.type = 'POST'; + params.beforeSend = function(xhr) { + xhr.setRequestHeader('X-HTTP-Method-Override', type); + }; + } + } + + // Don't process data on a non-GET request. + if (params.type !== 'GET' && !Backbone.emulateJSON) { + params.processData = false; + } + + // Make the request, allowing the user to override any Ajax options. + return $.ajax(_.extend(params, options)); + }; + + // Wrap an optional error callback with a fallback error event. + Backbone.wrapError = function(onError, originalModel, options) { + return function(model, resp) { + resp = model === originalModel ? resp : model; + if (onError) { + onError(originalModel, resp, options); + } else { + originalModel.trigger('error', originalModel, resp, options); + } + }; + }; + + // Helpers + // ------- + + // Shared empty constructor function to aid in prototype-chain creation. + var ctor = function(){}; + + // Helper function to correctly set up the prototype chain, for subclasses. + // Similar to `goog.inherits`, but uses a hash of prototype properties and + // class properties to be extended. + var inherits = function(parent, protoProps, staticProps) { + var child; + + // The constructor function for the new subclass is either defined by you + // (the "constructor" property in your `extend` definition), or defaulted + // by us to simply call the parent's constructor. + if (protoProps && protoProps.hasOwnProperty('constructor')) { + child = protoProps.constructor; + } else { + child = function(){ parent.apply(this, arguments); }; + } + + // Inherit class (static) properties from parent. + _.extend(child, parent); + + // Set the prototype chain to inherit from `parent`, without calling + // `parent`'s constructor function. + ctor.prototype = parent.prototype; + child.prototype = new ctor(); + + // Add prototype properties (instance properties) to the subclass, + // if supplied. + if (protoProps) _.extend(child.prototype, protoProps); + + // Add static properties to the constructor function, if supplied. + if (staticProps) _.extend(child, staticProps); + + // Correctly set child's `prototype.constructor`. + child.prototype.constructor = child; + + // Set a convenience property in case the parent's prototype is needed later. + child.__super__ = parent.prototype; + + return child; + }; + + // Helper function to get a value from a Backbone object as a property + // or as a function. + var getValue = function(object, prop) { + if (!(object && object[prop])) return null; + return _.isFunction(object[prop]) ? object[prop]() : object[prop]; + }; + + // Throw an error when a URL is needed, and none is supplied. + var urlError = function() { + throw new Error('A "url" property or function must be specified'); + }; + +}).call(this); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/backbone.marionette.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/backbone.marionette.js new file mode 100644 index 0000000000000000000000000000000000000000..4115cdc0eecf5fe6358986a3959d4ab232c4cf89 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/backbone.marionette.js @@ -0,0 +1,1346 @@ +// Backbone.Marionette, v0.9.11 +// Copyright (c)2012 Derick Bailey, Muted Solutions, LLC. +// Distributed under MIT license +// http://github.com/derickbailey/backbone.marionette +Backbone.Marionette = (function(Backbone, _, $){ + var Marionette = {}; + + // EventBinder + // ----------- + + // The event binder facilitates the binding and unbinding of events + // from objects that extend `Backbone.Events`. It makes + // unbinding events, even with anonymous callback functions, + // easy. + // + // Inspired by [Johnny Oshika](http://stackoverflow.com/questions/7567404/backbone-js-repopulate-or-recreate-the-view/7607853#7607853) + + Marionette.EventBinder = function(){ + this._eventBindings = []; + }; + + _.extend(Marionette.EventBinder.prototype, { + // Store the event binding in array so it can be unbound + // easily, at a later point in time. + bindTo: function (obj, eventName, callback, context) { + context = context || this; + obj.on(eventName, callback, context); + + var binding = { + obj: obj, + eventName: eventName, + callback: callback, + context: context + }; + + this._eventBindings.push(binding); + + return binding; + }, + + // Unbind from a single binding object. Binding objects are + // returned from the `bindTo` method call. + unbindFrom: function(binding){ + binding.obj.off(binding.eventName, binding.callback, binding.context); + this._eventBindings = _.reject(this._eventBindings, function(bind){return bind === binding;}); + }, + + // Unbind all of the events that we have stored. + unbindAll: function () { + var that = this; + + // The `unbindFrom` call removes elements from the array + // while it is being iterated, so clone it first. + var bindings = _.map(this._eventBindings, _.identity); + _.each(bindings, function (binding, index) { + that.unbindFrom(binding); + }); + } + }); + + // Copy the `extend` function used by Backbone's classes + Marionette.EventBinder.extend = Backbone.View.extend; + + // Marionette.View + // --------------- + + // The core view type that other Marionette views extend from. + Marionette.View = Backbone.View.extend({ + constructor: function(){ + var eventBinder = new Marionette.EventBinder(); + _.extend(this, eventBinder); + + Backbone.View.prototype.constructor.apply(this, arguments); + + this.bindTo(this, "show", this.onShowCalled, this); + }, + + // Get the template for this view + // instance. You can set a `template` attribute in the view + // definition or pass a `template: "whatever"` parameter in + // to the constructor options. + getTemplate: function(){ + var template; + + // Get the template from `this.options.template` or + // `this.template`. The `options` takes precedence. + if (this.options && this.options.template){ + template = this.options.template; + } else { + template = this.template; + } + + return template; + }, + + // Serialize the model or collection for the view. If a model is + // found, `.toJSON()` is called. If a collection is found, `.toJSON()` + // is also called, but is used to populate an `items` array in the + // resulting data. If both are found, defaults to the model. + // You can override the `serializeData` method in your own view + // definition, to provide custom serialization for your view's data. + serializeData: function(){ + var data; + + if (this.model) { + data = this.model.toJSON(); + } + else if (this.collection) { + data = { items: this.collection.toJSON() }; + } + + data = this.mixinTemplateHelpers(data); + + return data; + }, + + // Mix in template helper methods. Looks for a + // `templateHelpers` attribute, which can either be an + // object literal, or a function that returns an object + // literal. All methods and attributes from this object + // are copies to the object passed in. + mixinTemplateHelpers: function(target){ + target = target || {}; + var templateHelpers = this.templateHelpers; + if (_.isFunction(templateHelpers)){ + templateHelpers = templateHelpers.call(this); + } + return _.extend(target, templateHelpers); + }, + + // Configure `triggers` to forward DOM events to view + // events. `triggers: {"click .foo": "do:foo"}` + configureTriggers: function(){ + if (!this.triggers) { return; } + + var triggers = this.triggers; + var that = this; + var triggerEvents = {}; + + // Allow `triggers` to be configured as a function + if (_.isFunction(triggers)){ triggers = triggers.call(this); } + + // Configure the triggers, prevent default + // action and stop propagation of DOM events + _.each(triggers, function(value, key){ + + triggerEvents[key] = function(e){ + if (e && e.preventDefault){ e.preventDefault(); } + if (e && e.stopPropagation){ e.stopPropagation(); } + that.trigger(value); + }; + + }); + + return triggerEvents; + }, + + // Overriding Backbone.View's delegateEvents specifically + // to handle the `triggers` configuration + delegateEvents: function(events){ + events = events || this.events; + if (_.isFunction(events)){ events = events.call(this); } + + var combinedEvents = {}; + var triggers = this.configureTriggers(); + _.extend(combinedEvents, events, triggers); + + Backbone.View.prototype.delegateEvents.call(this, combinedEvents); + }, + + // Internal method, handles the `show` event. + onShowCalled: function(){}, + + // Default `close` implementation, for removing a view from the + // DOM and unbinding it. Regions will call this method + // for you. You can specify an `onClose` method in your view to + // add custom code that is called after the view is closed. + close: function(){ + if (this.beforeClose) { this.beforeClose(); } + + this.remove(); + + if (this.onClose) { this.onClose(); } + this.trigger('close'); + this.unbindAll(); + this.unbind(); + }, + + // This method binds the elements specified in the "ui" hash inside the view's code with + // the associated jQuery selectors. + bindUIElements: function(){ + if (!this.ui) { return; } + + var that = this; + + if (!this.uiBindings) { + // We want to store the ui hash in uiBindings, since afterwards the values in the ui hash + // will be overridden with jQuery selectors. + this.uiBindings = this.ui; + } + + // refreshing the associated selectors since they should point to the newly rendered elements. + this.ui = {}; + _.each(_.keys(this.uiBindings), function(key) { + var selector = that.uiBindings[key]; + that.ui[key] = that.$(selector); + }); + } + + }); + + + // Item View + // --------- + + // A single item view implementation that contains code for rendering + // with underscore.js templates, serializing the view's model or collection, + // and calling several methods on extended views, such as `onRender`. + Marionette.ItemView = Marionette.View.extend({ + constructor: function(){ + Marionette.View.prototype.constructor.apply(this, arguments); + + if (this.initialEvents){ + this.initialEvents(); + } + }, + + // Render the view, defaulting to underscore.js templates. + // You can override this in your view definition to provide + // a very specific rendering for your view. In general, though, + // you should override the `Marionette.Renderer` object to + // change how Marionette renders views. + render: function(){ + if (this.beforeRender){ this.beforeRender(); } + this.trigger("before:render", this); + this.trigger("item:before:render", this); + + var data = this.serializeData(); + var template = this.getTemplate(); + var html = Marionette.Renderer.render(template, data); + this.$el.html(html); + this.bindUIElements(); + + if (this.onRender){ this.onRender(); } + this.trigger("render", this); + this.trigger("item:rendered", this); + return this; + }, + + // Override the default close event to add a few + // more events that are triggered. + close: function(){ + this.trigger('item:before:close'); + Marionette.View.prototype.close.apply(this, arguments); + this.trigger('item:closed'); + } + }); + + // Collection View + // --------------- + + // A view that iterates over a Backbone.Collection + // and renders an individual ItemView for each model. + Marionette.CollectionView = Marionette.View.extend({ + constructor: function(){ + Marionette.View.prototype.constructor.apply(this, arguments); + this.initChildViewStorage(); + this.initialEvents(); + this.onShowCallbacks = new Marionette.Callbacks(); + }, + + // Configured the initial events that the collection view + // binds to. Override this method to prevent the initial + // events, or to add your own initial events. + initialEvents: function(){ + if (this.collection){ + this.bindTo(this.collection, "add", this.addChildView, this); + this.bindTo(this.collection, "remove", this.removeItemView, this); + this.bindTo(this.collection, "reset", this.render, this); + } + }, + + // Handle a child item added to the collection + addChildView: function(item, collection, options){ + this.closeEmptyView(); + var ItemView = this.getItemView(); + return this.addItemView(item, ItemView, options.index); + }, + + // Override from `Marionette.View` to guarantee the `onShow` method + // of child views is called. + onShowCalled: function(){ + this.onShowCallbacks.run(); + }, + + // Internal method to trigger the before render callbacks + // and events + triggerBeforeRender: function(){ + if (this.beforeRender) { this.beforeRender(); } + this.trigger("before:render", this); + this.trigger("collection:before:render", this); + }, + + // Internal method to trigger the rendered callbacks and + // events + triggerRendered: function(){ + if (this.onRender) { this.onRender(); } + this.trigger("render", this); + this.trigger("collection:rendered", this); + }, + + // Render the collection of items. Override this method to + // provide your own implementation of a render function for + // the collection view. + render: function(){ + this.triggerBeforeRender(); + this.closeEmptyView(); + this.closeChildren(); + + if (this.collection && this.collection.length > 0) { + this.showCollection(); + } else { + this.showEmptyView(); + } + + this.triggerRendered(); + return this; + }, + + // Internal method to loop through each item in the + // collection view and show it + showCollection: function(){ + var that = this; + var ItemView = this.getItemView(); + this.collection.each(function(item, index){ + that.addItemView(item, ItemView, index); + }); + }, + + // Internal method to show an empty view in place of + // a collection of item views, when the collection is + // empty + showEmptyView: function(){ + var EmptyView = this.options.emptyView || this.emptyView; + if (EmptyView && !this._showingEmptyView){ + this._showingEmptyView = true; + var model = new Backbone.Model(); + this.addItemView(model, EmptyView, 0); + } + }, + + // Internal method to close an existing emptyView instance + // if one exists. Called when a collection view has been + // rendered empty, and then an item is added to the collection. + closeEmptyView: function(){ + if (this._showingEmptyView){ + this.closeChildren(); + delete this._showingEmptyView; + } + }, + + // Retrieve the itemView type, either from `this.options.itemView` + // or from the `itemView` in the object definition. The "options" + // takes precedence. + getItemView: function(){ + var itemView = this.options.itemView || this.itemView; + + if (!itemView){ + var err = new Error("An `itemView` must be specified"); + err.name = "NoItemViewError"; + throw err; + } + + return itemView; + }, + + // Render the child item's view and add it to the + // HTML for the collection view. + addItemView: function(item, ItemView, index){ + var that = this; + + var view = this.buildItemView(item, ItemView); + + // Store the child view itself so we can properly + // remove and/or close it later + this.storeChild(view); + if (this.onItemAdded){ this.onItemAdded(view); } + this.trigger("item:added", view); + + // Render it and show it + var renderResult = this.renderItemView(view, index); + + // call onShow for child item views + if (view.onShow){ + this.onShowCallbacks.add(view.onShow, view); + } + + // Forward all child item view events through the parent, + // prepending "itemview:" to the event name + var childBinding = this.bindTo(view, "all", function(){ + var args = slice.call(arguments); + args[0] = "itemview:" + args[0]; + args.splice(1, 0, view); + + that.trigger.apply(that, args); + }); + + // Store all child event bindings so we can unbind + // them when removing / closing the child view + this.childBindings = this.childBindings || {}; + this.childBindings[view.cid] = childBinding; + + return renderResult; + }, + + // render the item view + renderItemView: function(view, index) { + view.render(); + this.appendHtml(this, view, index); + }, + + // Build an `itemView` for every model in the collection. + buildItemView: function(item, ItemView){ + var itemViewOptions = _.result(this, "itemViewOptions"); + var options = _.extend({model: item}, itemViewOptions); + var view = new ItemView(options); + return view; + }, + + // Remove the child view and close it + removeItemView: function(item){ + var view = this.children[item.cid]; + if (view){ + var childBinding = this.childBindings[view.cid]; + if (childBinding) { + this.unbindFrom(childBinding); + delete this.childBindings[view.cid]; + } + view.close(); + delete this.children[item.cid]; + } + + if (!this.collection || this.collection.length === 0){ + this.showEmptyView(); + } + + this.trigger("item:removed", view); + }, + + // Append the HTML to the collection's `el`. + // Override this method to do something other + // then `.append`. + appendHtml: function(collectionView, itemView, index){ + collectionView.$el.append(itemView.el); + }, + + // Store references to all of the child `itemView` + // instances so they can be managed and cleaned up, later. + storeChild: function(view){ + this.children[view.model.cid] = view; + }, + + // Internal method to set up the `children` object for + // storing all of the child views + initChildViewStorage: function(){ + this.children = {}; + }, + + // Handle cleanup and other closing needs for + // the collection of views. + close: function(){ + this.trigger("collection:before:close"); + this.closeChildren(); + Marionette.View.prototype.close.apply(this, arguments); + this.trigger("collection:closed"); + }, + + // Close the child views that this collection view + // is holding on to, if any + closeChildren: function(){ + var that = this; + if (this.children){ + _.each(_.clone(this.children), function(childView){ + that.removeItemView(childView.model); + }); + } + } + }); + + + // Composite View + // -------------- + + // Used for rendering a branch-leaf, hierarchical structure. + // Extends directly from CollectionView and also renders an + // an item view as `modelView`, for the top leaf + Marionette.CompositeView = Marionette.CollectionView.extend({ + constructor: function(options){ + Marionette.CollectionView.apply(this, arguments); + this.itemView = this.getItemView(); + }, + + // Configured the initial events that the composite view + // binds to. Override this method to prevent the initial + // events, or to add your own initial events. + initialEvents: function(){ + if (this.collection){ + this.bindTo(this.collection, "add", this.addChildView, this); + this.bindTo(this.collection, "remove", this.removeItemView, this); + this.bindTo(this.collection, "reset", this.renderCollection, this); + } + }, + + // Retrieve the `itemView` to be used when rendering each of + // the items in the collection. The default is to return + // `this.itemView` or Marionette.CompositeView if no `itemView` + // has been defined + getItemView: function(){ + return this.itemView || this.constructor; + }, + + // Renders the model once, and the collection once. Calling + // this again will tell the model's view to re-render itself + // but the collection will not re-render. + render: function(){ + var that = this; + + this.resetItemViewContainer(); + + var html = this.renderModel(); + this.$el.html(html); + // the ui bindings is done here and not at the end of render since they should be + // available before the collection is rendered. + this.bindUIElements(); + this.trigger("composite:model:rendered"); + this.trigger("render"); + + this.renderCollection(); + this.trigger("composite:rendered"); + return this; + }, + + // Render the collection for the composite view + renderCollection: function(){ + Marionette.CollectionView.prototype.render.apply(this, arguments); + this.trigger("composite:collection:rendered"); + }, + + // Render an individual model, if we have one, as + // part of a composite view (branch / leaf). For example: + // a treeview. + renderModel: function(){ + var data = {}; + data = this.serializeData(); + + var template = this.getTemplate(); + return Marionette.Renderer.render(template, data); + }, + + // Appends the `el` of itemView instances to the specified + // `itemViewContainer` (a jQuery selector). Override this method to + // provide custom logic of how the child item view instances have their + // HTML appended to the composite view instance. + appendHtml: function(cv, iv){ + var $container = this.getItemViewContainer(cv); + $container.append(iv.el); + }, + + // Internal method to ensure an `$itemViewContainer` exists, for the + // `appendHtml` method to use. + getItemViewContainer: function(containerView){ + var container; + if ("$itemViewContainer" in containerView){ + container = containerView.$itemViewContainer; + } else { + if (containerView.itemViewContainer){ + container = containerView.$(_.result(containerView, "itemViewContainer")); + + if (container.length <= 0) { + var err = new Error("Missing `itemViewContainer`"); + err.name = "ItemViewContainerMissingError"; + throw err; + } + } else { + container = containerView.$el; + } + containerView.$itemViewContainer = container; + } + return container; + }, + + // Internal method to reset the `$itemViewContainer` on render + resetItemViewContainer: function(){ + if (this.$itemViewContainer){ + delete this.$itemViewContainer; + } + } + }); + + + // Region + // ------ + + // Manage the visual regions of your composite application. See + // http://lostechies.com/derickbailey/2011/12/12/composite-js-apps-regions-and-region-managers/ + Marionette.Region = function(options){ + this.options = options || {}; + + var eventBinder = new Marionette.EventBinder(); + _.extend(this, eventBinder, options); + + if (!this.el){ + var err = new Error("An 'el' must be specified"); + err.name = "NoElError"; + throw err; + } + + if (this.initialize){ + this.initialize.apply(this, arguments); + } + }; + + _.extend(Marionette.Region.prototype, Backbone.Events, { + + // Displays a backbone view instance inside of the region. + // Handles calling the `render` method for you. Reads content + // directly from the `el` attribute. Also calls an optional + // `onShow` and `close` method on your view, just after showing + // or just before closing the view, respectively. + show: function(view){ + + this.ensureEl(); + this.close(); + + view.render(); + this.open(view); + + if (view.onShow) { view.onShow(); } + view.trigger("show"); + + if (this.onShow) { this.onShow(view); } + this.trigger("view:show", view); + + this.currentView = view; + }, + + ensureEl: function(){ + if (!this.$el || this.$el.length === 0){ + this.$el = this.getEl(this.el); + } + }, + + // Override this method to change how the region finds the + // DOM element that it manages. Return a jQuery selector object. + getEl: function(selector){ + return $(selector); + }, + + // Override this method to change how the new view is + // appended to the `$el` that the region is managing + open: function(view){ + this.$el.html(view.el); + }, + + // Close the current view, if there is one. If there is no + // current view, it does nothing and returns immediately. + close: function(){ + var view = this.currentView; + if (!view){ return; } + + if (view.close) { view.close(); } + this.trigger("view:closed", view); + + delete this.currentView; + }, + + // Attach an existing view to the region. This + // will not call `render` or `onShow` for the new view, + // and will not replace the current HTML for the `el` + // of the region. + attachView: function(view){ + this.currentView = view; + }, + + // Reset the region by closing any existing view and + // clearing out the cached `$el`. The next time a view + // is shown via this region, the region will re-query the + // DOM for the region's `el`. + reset: function(){ + this.close(); + delete this.$el; + } + }); + + // Copy the `extend` function used by Backbone's classes + Marionette.Region.extend = Backbone.View.extend; + + // Layout + // ------ + + // Used for managing application layouts, nested layouts and + // multiple regions within an application or sub-application. + // + // A specialized view type that renders an area of HTML and then + // attaches `Region` instances to the specified `regions`. + // Used for composite view management and sub-application areas. + Marionette.Layout = Marionette.ItemView.extend({ + regionType: Marionette.Region, + + constructor: function () { + Backbone.Marionette.ItemView.apply(this, arguments); + this.initializeRegions(); + }, + + // Layout's render will use the existing region objects the + // first time it is called. Subsequent calls will close the + // views that the regions are showing and then reset the `el` + // for the regions to the newly rendered DOM elements. + render: function(){ + var result = Marionette.ItemView.prototype.render.apply(this, arguments); + + // Rewrite this function to handle re-rendering and + // re-initializing the `el` for each region + this.render = function(){ + this.closeRegions(); + this.reInitializeRegions(); + + var result = Marionette.ItemView.prototype.render.apply(this, arguments); + return result; + }; + + return result; + }, + + // Handle closing regions, and then close the view itself. + close: function () { + this.closeRegions(); + this.destroyRegions(); + Backbone.Marionette.ItemView.prototype.close.call(this, arguments); + }, + + // Initialize the regions that have been defined in a + // `regions` attribute on this layout. The key of the + // hash becomes an attribute on the layout object directly. + // For example: `regions: { menu: ".menu-container" }` + // will product a `layout.menu` object which is a region + // that controls the `.menu-container` DOM element. + initializeRegions: function () { + if (!this.regionManagers){ + this.regionManagers = {}; + } + + var that = this; + _.each(this.regions, function (region, name) { + if ( typeof region != 'string' + && typeof region.selector != 'string' ) { + throw new Exception('Region must be specified as a selector ' + + 'string or an object with selector property'); + } + + var selector = typeof region === 'string' ? region : region.selector; + var regionType = typeof region.regionType === 'undefined' + ? that.regionType : region.regionType; + + var regionManager = new regionType({ + el: selector, + getEl: function(selector){ + return that.$(selector); + } + }); + + that.regionManagers[name] = regionManager; + that[name] = regionManager; + }); + + }, + + // Re-initialize all of the regions by updating the `el` that + // they point to + reInitializeRegions: function(){ + if (this.regionManagers && _.size(this.regionManagers)===0){ + this.initializeRegions(); + } else { + _.each(this.regionManagers, function(region){ + region.reset(); + }); + } + }, + + // Close all of the regions that have been opened by + // this layout. This method is called when the layout + // itself is closed. + closeRegions: function () { + var that = this; + _.each(this.regionManagers, function (manager, name) { + manager.close(); + }); + }, + + // Destroys all of the regions by removing references + // from the Layout + destroyRegions: function(){ + var that = this; + _.each(this.regionManagers, function (manager, name) { + delete that[name]; + }); + this.regionManagers = {}; + } + }); + + + // Application + // ----------- + + // Contain and manage the composite application as a whole. + // Stores and starts up `Region` objects, includes an + // event aggregator as `app.vent` + Marionette.Application = function(options){ + this.initCallbacks = new Marionette.Callbacks(); + this.vent = new Marionette.EventAggregator(); + this.submodules = {}; + + var eventBinder = new Marionette.EventBinder(); + _.extend(this, eventBinder, options); + }; + + _.extend(Marionette.Application.prototype, Backbone.Events, { + // Add an initializer that is either run at when the `start` + // method is called, or run immediately if added after `start` + // has already been called. + addInitializer: function(initializer){ + this.initCallbacks.add(initializer); + }, + + // kick off all of the application's processes. + // initializes all of the regions that have been added + // to the app, and runs all of the initializer functions + start: function(options){ + this.trigger("initialize:before", options); + this.initCallbacks.run(options, this); + this.trigger("initialize:after", options); + + this.trigger("start", options); + }, + + // Add regions to your app. + // Accepts a hash of named strings or Region objects + // addRegions({something: "#someRegion"}) + // addRegions{{something: Region.extend({el: "#someRegion"}) }); + addRegions: function(regions){ + var regionValue, regionObj, region; + + for(region in regions){ + if (regions.hasOwnProperty(region)){ + regionValue = regions[region]; + + if (typeof regionValue === "string"){ + regionObj = new Marionette.Region({ + el: regionValue + }); + } else { + regionObj = new regionValue(); + } + + this[region] = regionObj; + } + } + }, + + // Removes a region from your app. + // Accepts the regions name + // removeRegion('myRegion') + removeRegion: function(region) { + this[region].close(); + delete this[region]; + }, + + // Create a module, attached to the application + module: function(moduleNames, moduleDefinition){ + // slice the args, and add this application object as the + // first argument of the array + var args = slice.call(arguments); + args.unshift(this); + + // see the Marionette.Module object for more information + return Marionette.Module.create.apply(Marionette.Module, args); + } + }); + + // Copy the `extend` function used by Backbone's classes + Marionette.Application.extend = Backbone.View.extend; + + // AppRouter + // --------- + + // Reduce the boilerplate code of handling route events + // and then calling a single method on another object. + // Have your routers configured to call the method on + // your object, directly. + // + // Configure an AppRouter with `appRoutes`. + // + // App routers can only take one `controller` object. + // It is recommended that you divide your controller + // objects in to smaller peices of related functionality + // and have multiple routers / controllers, instead of + // just one giant router and controller. + // + // You can also add standard routes to an AppRouter. + + Marionette.AppRouter = Backbone.Router.extend({ + + constructor: function(options){ + Backbone.Router.prototype.constructor.call(this, options); + + if (this.appRoutes){ + var controller = this.controller; + if (options && options.controller) { + controller = options.controller; + } + this.processAppRoutes(controller, this.appRoutes); + } + }, + + // Internal method to process the `appRoutes` for the + // router, and turn them in to routes that trigger the + // specified method on the specified `controller`. + processAppRoutes: function(controller, appRoutes){ + var method, methodName; + var route, routesLength, i; + var routes = []; + var router = this; + + for(route in appRoutes){ + if (appRoutes.hasOwnProperty(route)){ + routes.unshift([route, appRoutes[route]]); + } + } + + routesLength = routes.length; + for (i = 0; i < routesLength; i++){ + route = routes[i][0]; + methodName = routes[i][1]; + method = controller[methodName]; + + if (!method){ + var msg = "Method '" + methodName + "' was not found on the controller"; + var err = new Error(msg); + err.name = "NoMethodError"; + throw err; + } + + method = _.bind(method, controller); + router.route(route, methodName, method); + } + } + }); + + + // Module + // ------ + + // A simple module system, used to create privacy and encapsulation in + // Marionette applications + Marionette.Module = function(moduleName, app, customArgs){ + this.moduleName = moduleName; + + // store sub-modules + this.submodules = {}; + + this._setupInitializersAndFinalizers(); + + // store the configuration for this module + this._config = {}; + this._config.app = app; + this._config.customArgs = customArgs; + this._config.definitions = []; + + // extend this module with an event binder + var eventBinder = new Marionette.EventBinder(); + _.extend(this, eventBinder); + }; + + // Extend the Module prototype with events / bindTo, so that the module + // can be used as an event aggregator or pub/sub. + _.extend(Marionette.Module.prototype, Backbone.Events, { + + // Initializer for a specific module. Initializers are run when the + // module's `start` method is called. + addInitializer: function(callback){ + this._initializerCallbacks.add(callback); + }, + + // Finalizers are run when a module is stopped. They are used to teardown + // and finalize any variables, references, events and other code that the + // module had set up. + addFinalizer: function(callback){ + this._finalizerCallbacks.add(callback); + }, + + // Start the module, and run all of it's initializers + start: function(options){ + // Prevent re-start the module + if (this._isInitialized){ return; } + + this._runModuleDefinition(); + this._initializerCallbacks.run(options, this); + this._isInitialized = true; + + // start the sub-modules + if (this.submodules){ + _.each(this.submodules, function(mod){ + mod.start(options); + }); + } + }, + + // Stop this module by running its finalizers and then stop all of + // the sub-modules for this module + stop: function(){ + // if we are not initialized, don't bother finalizing + if (!this._isInitialized){ return; } + this._isInitialized = false; + + // run the finalizers + this._finalizerCallbacks.run(); + // then reset the initializers and finalizers + this._setupInitializersAndFinalizers(); + + // stop the sub-modules + _.each(this.submodules, function(mod){ mod.stop(); }); + }, + + // Configure the module with a definition function and any custom args + // that are to be passed in to the definition function + addDefinition: function(moduleDefinition){ + this._config.definitions.push(moduleDefinition); + }, + + // Internal method: run the module definition function with the correct + // arguments + _runModuleDefinition: function(){ + if (this._config.definitions.length === 0) { return; } + + // build the correct list of arguments for the module definition + var args = _.flatten([ + this, + this._config.app, + Backbone, + Marionette, + $, _, + this._config.customArgs + ]); + + // run the module definition function with the correct args + var definitionCount = this._config.definitions.length-1; + for(var i=0; i <= definitionCount; i++){ + + var definition = this._config.definitions[i]; + definition.apply(this, args); + + } + }, + + // Internal method: set up new copies of initializers and finalizers. + // Calling this method will wipe out all existing initializers and + // finalizers. + _setupInitializersAndFinalizers: function(){ + this._initializerCallbacks = new Marionette.Callbacks(); + this._finalizerCallbacks = new Marionette.Callbacks(); + } + }); + + // Function level methods to create modules + _.extend(Marionette.Module, { + + // Create a module, hanging off the app parameter as the parent object. + create: function(app, moduleNames, moduleDefinition){ + var that = this; + var parentModule = app; + moduleNames = moduleNames.split("."); + + // get the custom args passed in after the module definition and + // get rid of the module name and definition function + var customArgs = slice.apply(arguments); + customArgs.splice(0, 3); + + // Loop through all the parts of the module definition + var length = moduleNames.length; + _.each(moduleNames, function(moduleName, i){ + var isLastModuleInChain = (i === length-1); + + // Get an existing module of this name if we have one + var module = parentModule[moduleName]; + if (!module){ + // Create a new module if we don't have one + module = new Marionette.Module(moduleName, app, customArgs); + parentModule[moduleName] = module; + // store the module on the parent + parentModule.submodules[moduleName] = module; + } + + // Only add a module definition and initializer when this is + // the last module in a "parent.child.grandchild" hierarchy of + // module names + if (isLastModuleInChain ){ + that._createModuleDefinition(module, moduleDefinition, app); + } + + // Reset the parent module so that the next child + // in the list will be added to the correct parent + parentModule = module; + }); + + // Return the last module in the definition chain + return parentModule; + }, + + _createModuleDefinition: function(module, moduleDefinition, app){ + var moduleOptions = this._getModuleDefinitionOptions(moduleDefinition); + + // add the module definition + if (moduleOptions.definition){ + module.addDefinition(moduleOptions.definition); + } + + if (moduleOptions.startWithApp){ + // start the module when the app starts + app.addInitializer(function(options){ + module.start(options); + }); + } + }, + + _getModuleDefinitionOptions: function(moduleDefinition){ + // default to starting the module with the app + var options = { startWithApp: true }; + + // short circuit if we don't have a module definition + if (!moduleDefinition){ return options; } + + if (_.isFunction(moduleDefinition)){ + // if the definition is a function, assign it directly + // and use the defaults + options.definition = moduleDefinition; + + } else { + + // the definition is an object. grab the "define" attribute + // and the "startWithApp" attribute, as set the options + // appropriately + options.definition = moduleDefinition.define; + if (moduleDefinition.hasOwnProperty("startWithApp")){ + options.startWithApp = moduleDefinition.startWithApp; + } + } + + return options; + } + }); + + // Template Cache + // -------------- + + // Manage templates stored in `<script>` blocks, + // caching them for faster access. + Marionette.TemplateCache = function(templateId){ + this.templateId = templateId; + }; + + // TemplateCache object-level methods. Manage the template + // caches from these method calls instead of creating + // your own TemplateCache instances + _.extend(Marionette.TemplateCache, { + templateCaches: {}, + + // Get the specified template by id. Either + // retrieves the cached version, or loads it + // from the DOM. + get: function(templateId){ + var that = this; + var cachedTemplate = this.templateCaches[templateId]; + + if (!cachedTemplate){ + cachedTemplate = new Marionette.TemplateCache(templateId); + this.templateCaches[templateId] = cachedTemplate; + } + + return cachedTemplate.load(); + }, + + // Clear templates from the cache. If no arguments + // are specified, clears all templates: + // `clear()` + // + // If arguments are specified, clears each of the + // specified templates from the cache: + // `clear("#t1", "#t2", "...")` + clear: function(){ + var i; + var length = arguments.length; + + if (length > 0){ + for(i=0; i<length; i++){ + delete this.templateCaches[arguments[i]]; + } + } else { + this.templateCaches = {}; + } + } + }); + + // TemplateCache instance methods, allowing each + // template cache object to manage it's own state + // and know whether or not it has been loaded + _.extend(Marionette.TemplateCache.prototype, { + + // Internal method to load the template asynchronously. + load: function(){ + var that = this; + + // Guard clause to prevent loading this template more than once + if (this.compiledTemplate){ + return this.compiledTemplate; + } + + // Load the template and compile it + var template = this.loadTemplate(this.templateId); + this.compiledTemplate = this.compileTemplate(template); + + return this.compiledTemplate; + }, + + // Load a template from the DOM, by default. Override + // this method to provide your own template retrieval, + // such as asynchronous loading from a server. + loadTemplate: function(templateId){ + var template = $(templateId).html(); + + if (!template || template.length === 0){ + var msg = "Could not find template: '" + templateId + "'"; + var err = new Error(msg); + err.name = "NoTemplateError"; + throw err; + } + + return template; + }, + + // Pre-compile the template before caching it. Override + // this method if you do not need to pre-compile a template + // (JST / RequireJS for example) or if you want to change + // the template engine used (Handebars, etc). + compileTemplate: function(rawTemplate){ + return _.template(rawTemplate); + } + }); + + + // Renderer + // -------- + + // Render a template with data by passing in the template + // selector and the data to render. + Marionette.Renderer = { + + // Render a template with data. The `template` parameter is + // passed to the `TemplateCache` object to retrieve the + // template function. Override this method to provide your own + // custom rendering and template handling for all of Marionette. + render: function(template, data){ + var templateFunc = typeof template === 'function' ? template : Marionette.TemplateCache.get(template); + var html = templateFunc(data); + return html; + } + }; + + + // Callbacks + // --------- + + // A simple way of managing a collection of callbacks + // and executing them at a later point in time, using jQuery's + // `Deferred` object. + Marionette.Callbacks = function(){ + this.deferred = $.Deferred(); + this.promise = this.deferred.promise(); + }; + + _.extend(Marionette.Callbacks.prototype, { + + // Add a callback to be executed. Callbacks added here are + // guaranteed to execute, even if they are added after the + // `run` method is called. + add: function(callback, contextOverride){ + this.promise.done(function(context, options){ + if (contextOverride){ context = contextOverride; } + callback.call(context, options); + }); + }, + + // Run all registered callbacks with the context specified. + // Additional callbacks can be added after this has been run + // and they will still be executed. + run: function(options, context){ + this.deferred.resolve(context, options); + } + }); + + + // Event Aggregator + // ---------------- + + // A pub-sub object that can be used to decouple various parts + // of an application through event-driven architecture. + Marionette.EventAggregator = Marionette.EventBinder.extend({ + + // Extend any provided options directly on to the event binder + constructor: function(options){ + Marionette.EventBinder.apply(this, arguments); + _.extend(this, options); + }, + + // Override the `bindTo` method to ensure that the event aggregator + // is used as the event binding storage + bindTo: function(eventName, callback, context){ + return Marionette.EventBinder.prototype.bindTo.call(this, this, eventName, callback, context); + } + }); + + // Copy the basic Backbone.Events on to the event aggregator + _.extend(Marionette.EventAggregator.prototype, Backbone.Events); + + // Copy the `extend` function used by Backbone's classes + Marionette.EventAggregator.extend = Backbone.View.extend; + + + // Helpers + // ------- + + // For slicing `arguments` in functions + var slice = Array.prototype.slice; + + + return Marionette; +})(Backbone, _, window.jQuery || window.Zepto || window.ender); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/bootstrap-contextmenu.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/bootstrap-contextmenu.js new file mode 100644 index 0000000000000000000000000000000000000000..48fb8666842f5ee4149d6dd45ded8dd1f026371e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/bootstrap-contextmenu.js @@ -0,0 +1,148 @@ +/*! + * Bootstrap Context Menu + * Version: 2.0 + * A small variation of the dropdown plugin by @sydcanem + * https://github.com/sydcanem/bootstrap-contextmenu + * + * Twitter Bootstrap (http://twitter.github.com/bootstrap). + */ + +/* ========================================================= + * bootstrap-dropdown.js + * http://twitter.github.com/bootstrap/ + * ========================================================= + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================= */ + +!(function($) { + + "use strict"; // jshint ;_; + + /* CONTEXTMENU CLASS DEFINITION + * ============================ */ + + var toggle = '[data-toggle=context]' + , ContextMenu = function (element) { + var $el = $(element).on('contextmenu.context.data-api', this.toggle); + var $target = $($el.attr('data-target')); + $('html').on('click.context.data-api', function (e) { + if (!e.ctrlKey) { + $target.removeClass('open'); + } + }); + } + + ContextMenu.prototype = { + + constructor: ContextMenu + ,toggle: function(e) { + clearMenus(e); // Added to close other context-menus + + var $this = $(this) + , $menu + , $contextmenu + , evt; + + if ($this.is('.disabled, :disabled')) return; + + evt = $.Event('context'); + $this.trigger(evt); + + $menu = getMenu($this); + $menu.removeClass('open'); + + var tp = getPosition(e, $menu); + $menu.attr('style', '') + .css(tp) + .toggleClass('open'); + + return false; + } + + } + + function getMenu($this) { + var selector = $this.attr('data-target') + , $menu; + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 + } + + $menu = $(selector); + + return $menu; + } + + function getPosition(e, $menu) { + var mouseX = e.pageX + , mouseY = e.pageY + , boundsX = $(window).width() + , boundsY = $(window).height() + , menuWidth = $menu.find('.dropdown-menu').outerWidth() + , menuHeight = $menu.find('.dropdown-menu').outerHeight() + , tp = {"position":"absolute"} + , Y, X; + + if (mouseY + menuHeight > boundsY) { + Y = {"top": mouseY - menuHeight}; + } else { + Y = {"top": mouseY}; + } + + if (mouseX + menuWidth > boundsX) { + X = {"left": mouseX - menuWidth}; + } else { + X = {"left": mouseX}; + } + + return $.extend(tp, Y, X); + } + + function clearMenus(e) { + if (!e.ctrlKey) { + $(toggle).each(function() { + getMenu($(this)) + .removeClass('open'); + }); + } + } + + /* CONTEXT MENU PLUGIN DEFINITION + * ========================== */ + + $.fn.contextmenu = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('context'); + if (!data) $this.data('context', (data = new ContextMenu(this))); + if (typeof option == 'string') data[option].call($this); + }); + } + + $.fn.contextmenu.Constructor = ContextMenu; + + /* APPLY TO STANDARD CONTEXT MENU ELEMENTS + * =================================== */ + + $(function () { + $('html') + .on('click.context.data-api', clearMenus) + $('body') + .on('contextmenu.context.data-api', toggle, ContextMenu.prototype.toggle); + }); + +}(window.jQuery)); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/bootstrap-select.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/bootstrap-select.js new file mode 100644 index 0000000000000000000000000000000000000000..93c434d814cf913e68d7917b2e9997fa606f4015 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/bootstrap-select.js @@ -0,0 +1,287 @@ +!function($) { + var Selectpicker = function(element, options, e) { + if (e ) { + e.stopPropagation(); + e.preventDefault(); + } + this.$element = $(element); + this.$newElement = null; + this.button = null; + this.options = $.extend({}, $.fn.selectpicker.defaults, this.$element.data(), typeof options == 'object' && options); + this.style = this.options.style; + this.size = this.options.size; + this.init(); + }; + + Selectpicker.prototype = { + + constructor: Selectpicker, + + init: function (e) { + this.$element.hide(); + var classList = this.$element.attr('class') !== undefined ? this.$element.attr('class').split(/\s+/) : ''; + var template = this.getTemplate(); + var id = this.$element.attr('id'); + template = this.createLi(template); + this.$element.after(template); + this.$newElement = this.$element.next('.bootstrap-select'); + var select = this.$newElement; + var menu = this.$newElement.find('.dropdown-menu'); + var menuA = menu.find('li > a'); + var liHeight = parseInt(menuA.css('line-height')) + menuA.outerHeight(); + var divHeight = menu.find('li .divider').outerHeight(true); + var selectOffset_top = this.$newElement.offset().top; + var size = 0; + var menuHeight = 0; + var selectHeight = this.$newElement.outerHeight(); + this.button = this.$newElement.find('> button'); + if (id !== undefined) { + this.button.attr('id', id); + $('label[for="' + id + '"]').click(function(){ select.find('button#'+id).focus(); }) + } + for (var i = 0; i < classList.length; i++) { + if(classList[i] != 'selectpicker') { + this.$newElement.addClass(classList[i]); + } + } + this.button.addClass(this.style); + this.checkDisabled(); + this.checkTabIndex(); + this.clickListener(); + var menuPadding = parseInt(menu.css('padding-top')) + parseInt(menu.css('padding-bottom')) + parseInt(menu.css('border-top-width')) + parseInt(menu.css('border-bottom-width')); + if (this.size == 'auto') { + function getSize() { + var selectOffset_top_scroll = selectOffset_top - $(window).scrollTop(); + var windowHeight = window.innerHeight; + var menuExtras = menuPadding + parseInt(menu.css('margin-top')) + parseInt(menu.css('margin-bottom')) + 2; + var selectOffset_bot = windowHeight - selectOffset_top_scroll - selectHeight - menuExtras; + menuHeight = selectOffset_bot; + if (select.hasClass('dropup')) { + menuHeight = selectOffset_top_scroll - menuExtras; + } + menu.css({'max-height' : menuHeight + 'px', 'overflow-y' : 'auto', 'min-height' : liHeight*3 + 'px'}); + } + getSize(); + $(window).resize(getSize); + $(window).scroll(getSize); + this.$element.bind('DOMNodeInserted', getSize); + } else if (this.size && this.size != 'auto' && menu.find('li').length > this.size) { + var optIndex = menu.find("li > *").filter(':not(.div-contain)').slice(0,this.size).last().parent().index(); + var divLength = menu.find("li").slice(0,optIndex + 1).find('.div-contain').length; + menuHeight = liHeight*this.size + divLength*divHeight + menuPadding; + menu.css({'max-height' : menuHeight + 'px', 'overflow-y' : 'scroll'}); + } + + this.$element.bind('DOMNodeInserted', $.proxy(this.reloadLi, this)); + }, + + getTemplate: function() { + var template = + "<div class='btn-group bootstrap-select'>" + + "<button class='btn dropdown-toggle clearfix' data-toggle='dropdown'>" + + "<span class='filter-option pull-left'>__SELECTED_OPTION</span> " + + "<span class='caret'></span>" + + "</button>" + + "<ul class='dropdown-menu' role='menu'>" + + "__ADD_LI" + + "</ul>" + + "</div>"; + + return template; + }, + + reloadLi: function() { + var _li = []; + var _liA = []; + var _liHtml = ''; + + this.$newElement.find('li').remove(); + + this.$element.find('option').each(function(){ + _li.push($(this).text()); + }); + + this.$element.find('option').each(function() { + var optionClass = $(this).attr("class") !== undefined ? $(this).attr("class") : ''; + var optionID = $(this).attr("id") !== undefined ? '_'+$(this).attr("id") : ''; + var subtext = $(this).data('subtext') !== undefined ? '<small class="muted">'+$(this).data('subtext')+'</small>' : ''; + var labelSubtext = $(this).parent().data('subtext') !== undefined ? '<small class="muted">'+$(this).parent().data('subtext')+'</small>' : ''; + if ($(this).parent().is('optgroup') && $(this).data('divider') != true) { + if ($(this).index() == 0) { + if ($(this)[0].index != 0) { + _liA.push( + '<div class="div-contain"><div class="divider"></div></div>'+ + '<dt>'+$(this).parent().attr('label')+labelSubtext+'</dt>'+ + '<a tabindex="-1" href="#" class="opt '+optionClass+'" id="'+optionID+'">'+$(this).text()+subtext+'</a>' + ); + } else { + _liA.push( + '<dt>'+$(this).parent().attr('label')+labelSubtext+'</dt>'+ + '<a tabindex="-1" href="#" class="opt '+optionClass+'" id="'+optionID+'">'+$(this).text()+subtext+'</a>' + ); + } + } else { + _liA.push('<a tabindex="-1" href="#" class="opt '+optionClass+'" id="'+optionID+'">'+$(this).text()+subtext+'</a>'); + } + } else if ($(this).data('divider') == true) { + _liA.push('<div class="div-contain"><div class="divider"></div></div>'); + } else { + _liA.push('<a tabindex="-1" href="#" class="'+optionClass+'" id="'+optionID+'">'+$(this).text()+subtext+'</a>'); + } + }); + + if(_li.length > 0) { + for (var i = 0; i < _li.length; i++) { + var disabled = this.$element.find('option').eq(i).is(':disabled') || this.$element.find('option').eq(i).parent().is(':disabled') ? 'class="disabled"' : ''; + this.$newElement.find('ul').append( + '<li rel=' + i + ' '+ disabled +'>' + _liA[i] + '</li>' + ); + } + } + + this.$newElement.find('li.disabled a, li dt, li .div-contain').on('click', function(e) { + e.preventDefault(); + e.stopPropagation(); + $select = $(this).parent().parents('.bootstrap-select'); + $select.find('button').focus(); + }); + + if(this.$element.find('option:selected').attr('title')!=undefined){ + this.$newElement.find('.filter-option').html(this.$element.find('option:selected').attr('title')); + }else{ + this.$newElement.find('.filter-option').html(this.$element.find('option:selected').text()); + } + }, + + createLi: function(template) { + + var _li = []; + var _liA = []; + var _liHtml = ''; + var _this = this; + var _selected_index = this.$element[0].selectedIndex ? this.$element[0].selectedIndex : 0; + + this.$element.find('option').each(function(){ + _li.push($(this).text()); + }); + + this.$element.find('option').each(function() { + var optionClass = $(this).attr("class") !== undefined ? $(this).attr("class") : ''; + var optionID = $(this).attr("id") !== undefined ? '_'+$(this).attr("id") : ''; + var subtext = $(this).data('subtext') !== undefined ? '<small class="muted">'+$(this).data('subtext')+'</small>' : ''; + var labelSubtext = $(this).parent().data('subtext') !== undefined ? '<small class="muted">'+$(this).parent().data('subtext')+'</small>' : ''; + if ($(this).parent().is('optgroup') && $(this).data('divider') != true) { + if ($(this).index() == 0) { + if ($(this)[0].index != 0) { + _liA.push( + '<div class="div-contain"><div class="divider"></div></div>'+ + '<dt>'+$(this).parent().attr('label')+labelSubtext+'</dt>'+ + '<a tabindex="-1" href="#" class="opt '+optionClass+'" id="'+optionID+'">'+$(this).text()+subtext+'</a>' + ); + } else { + _liA.push( + '<dt>'+$(this).parent().attr('label')+labelSubtext+'</dt>'+ + '<a tabindex="-1" href="#" class="opt '+optionClass+'" id="'+optionID+'">'+$(this).text()+subtext+'</a>' + ); + } + } else { + _liA.push('<a tabindex="-1" href="#" class="opt '+optionClass+'" id="'+optionID+'">'+$(this).text()+subtext+'</a>'); + } + } else if ($(this).data('divider') == true) { + _liA.push('<div class="div-contain"><div class="divider"></div></div>'); + } else { + _liA.push('<a tabindex="-1" href="#" class="'+optionClass+'" id="'+optionID+'">'+$(this).text()+subtext+'</a>'); + } + }); + + if (_li.length > 0) { + template = template.replace('__SELECTED_OPTION', _li[_selected_index]); + for (var i = 0; i < _li.length; i++) { + var disabled = this.$element.find('option').eq(i).is(':disabled') || this.$element.find('option').eq(i).parent().is(':disabled') ? 'class="disabled"' : ''; + _liHtml += "<li rel=" + i + " "+ disabled +">" + _liA[i] + "</li>"; + } + } else { + template = template.replace('__SELECTED_OPTION', ''); + } + + this.$element.find('option').eq(_selected_index).prop('selected',true); + + template = template.replace('__ADD_LI', _liHtml); + + return template; + }, + + checkDisabled: function() { + if (this.$element.is(':disabled')) { + this.button.addClass('disabled'); + this.button.click(function(e) { + e.preventDefault(); + }); + } + }, + + checkTabIndex: function() { + if (this.$element.is('[tabindex]')) { + var tabindex = this.$element.attr("tabindex"); + this.button.attr('tabindex', tabindex); + } + }, + + clickListener: function() { + $('body').on('touchstart.dropdown', '.dropdown-menu', function (e) { e.stopPropagation(); }); + this.$newElement.find('li.disabled a, li dt, li .div-contain').on('click', function(e) { + e.preventDefault(); + e.stopPropagation(); + $select = $(this).parent().parents('.bootstrap-select'); + $select.find('button').focus(); + }); + this.$newElement.on('click', 'li a', function(e){ + e.preventDefault(); + var selected = $(this).parent().index(), + $this = $(this).parent(), + $select = $this.parents('.bootstrap-select'); + + if ($select.prev('select').not(':disabled')){ + + $select.prev('select').find('option').removeAttr('selected'); + + $select.prev('select').find('option').eq(selected).prop('selected', true).attr('selected', 'selected'); + $select.find('.filter-option').html($this.text()); + $select.find('button').focus(); + + // Trigger select 'change' + $select.prev('select').trigger('change'); + } + + }); + this.$element.on('change', function(e) { + if($(this).find('option:selected').attr('title')!=undefined){ + $(this).next('.bootstrap-select').find('.filter-option').html($(this).find('option:selected').attr('title')); + }else{ + $(this).next('.bootstrap-select').find('.filter-option').html($(this).find('option:selected').text()); + } + }); + } + + }; + + $.fn.selectpicker = function(option, event) { + return this.each(function () { + var $this = $(this), + data = $this.data('selectpicker'), + options = typeof option == 'object' && option; + if (!data) { + $this.data('selectpicker', (data = new Selectpicker(this, options, event))); + } + if (typeof option == 'string') { + data[option](); + } + }); + }; + + $.fn.selectpicker.defaults = { + style: null, + size: 'auto' + } + +}(window.jQuery); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/bootstrap-select2.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/bootstrap-select2.js new file mode 100644 index 0000000000000000000000000000000000000000..117ea78ad6f4919874f9b0daf7fda02f73b36d54 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/bootstrap-select2.js @@ -0,0 +1,3079 @@ +/* +Copyright 2012 Igor Vaynberg + +Version: 3.4.0 Timestamp: Tue May 14 08:27:33 PDT 2013 + +This software is licensed under the Apache License, Version 2.0 (the "Apache License") or the GNU +General Public License version 2 (the "GPL License"). You may choose either license to govern your +use of this software only upon the condition that you accept all of the terms of either the Apache +License or the GPL License. + +You may obtain a copy of the Apache License and the GPL License at: + + http://www.apache.org/licenses/LICENSE-2.0 + http://www.gnu.org/licenses/gpl-2.0.html + +Unless required by applicable law or agreed to in writing, software distributed under the +Apache License or the GPL Licesnse is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +CONDITIONS OF ANY KIND, either express or implied. See the Apache License and the GPL License for +the specific language governing permissions and limitations under the Apache License and the GPL License. +*/ + (function ($) { + if(typeof $.fn.each2 == "undefined"){ + $.fn.extend({ + /* + * 4-10 times faster .each replacement + * use it carefully, as it overrides jQuery context of element on each iteration + */ + each2 : function (c) { + var j = $([0]), i = -1, l = this.length; + while ( + ++i < l + && (j.context = j[0] = this[i]) + && c.call(j[0], i, j) !== false //"this"=DOM, i=index, j=jQuery object + ); + return this; + } + }); + } +})(jQuery); + +(function ($, undefined) { + "use strict"; + /*global document, window, jQuery, console */ + + if (window.Select2 !== undefined) { + return; + } + + var KEY, AbstractSelect2, SingleSelect2, MultiSelect2, nextUid, sizer, + lastMousePosition, $document, scrollBarDimensions, + + KEY = { + TAB: 9, + ENTER: 13, + ESC: 27, + SPACE: 32, + LEFT: 37, + UP: 38, + RIGHT: 39, + DOWN: 40, + SHIFT: 16, + CTRL: 17, + ALT: 18, + PAGE_UP: 33, + PAGE_DOWN: 34, + HOME: 36, + END: 35, + BACKSPACE: 8, + DELETE: 46, + isArrow: function (k) { + k = k.which ? k.which : k; + switch (k) { + case KEY.LEFT: + case KEY.RIGHT: + case KEY.UP: + case KEY.DOWN: + return true; + } + return false; + }, + isControl: function (e) { + var k = e.which; + switch (k) { + case KEY.SHIFT: + case KEY.CTRL: + case KEY.ALT: + return true; + } + + if (e.metaKey) return true; + + return false; + }, + isFunctionKey: function (k) { + k = k.which ? k.which : k; + return k >= 112 && k <= 123; + } + }, + MEASURE_SCROLLBAR_TEMPLATE = "<div class='select2-measure-scrollbar'></div>"; + + $document = $(document); + + nextUid=(function() { var counter=1; return function() { return counter++; }; }()); + + function indexOf(value, array) { + var i = 0, l = array.length; + for (; i < l; i = i + 1) { + if (equal(value, array[i])) return i; + } + return -1; + } + + function measureScrollbar () { + var $template = $( MEASURE_SCROLLBAR_TEMPLATE ); + $template.appendTo('body'); + + var dim = { + width: $template.width() - $template[0].clientWidth, + height: $template.height() - $template[0].clientHeight + }; + $template.remove(); + + return dim; + } + + /** + * Compares equality of a and b + * @param a + * @param b + */ + function equal(a, b) { + if (a === b) return true; + if (a === undefined || b === undefined) return false; + if (a === null || b === null) return false; + if (a.constructor === String) return a+'' === b+''; // IE requires a+'' instead of just a + if (b.constructor === String) return b+'' === a+''; // IE requires b+'' instead of just b + return false; + } + + /** + * Splits the string into an array of values, trimming each value. An empty array is returned for nulls or empty + * strings + * @param string + * @param separator + */ + function splitVal(string, separator) { + var val, i, l; + if (string === null || string.length < 1) return []; + val = string.split(separator); + for (i = 0, l = val.length; i < l; i = i + 1) val[i] = $.trim(val[i]); + return val; + } + + function getSideBorderPadding(element) { + return element.outerWidth(false) - element.width(); + } + + function installKeyUpChangeEvent(element) { + var key="keyup-change-value"; + element.on("keydown", function () { + if ($.data(element, key) === undefined) { + $.data(element, key, element.val()); + } + }); + element.on("keyup", function () { + var val= $.data(element, key); + if (val !== undefined && element.val() !== val) { + $.removeData(element, key); + element.trigger("keyup-change"); + } + }); + } + + $document.on("mousemove", function (e) { + lastMousePosition = {x: e.pageX, y: e.pageY}; + }); + + /** + * filters mouse events so an event is fired only if the mouse moved. + * + * filters out mouse events that occur when mouse is stationary but + * the elements under the pointer are scrolled. + */ + function installFilteredMouseMove(element) { + element.on("mousemove", function (e) { + var lastpos = lastMousePosition; + if (lastpos === undefined || lastpos.x !== e.pageX || lastpos.y !== e.pageY) { + $(e.target).trigger("mousemove-filtered", e); + } + }); + } + + /** + * Debounces a function. Returns a function that calls the original fn function only if no invocations have been made + * within the last quietMillis milliseconds. + * + * @param quietMillis number of milliseconds to wait before invoking fn + * @param fn function to be debounced + * @param ctx object to be used as this reference within fn + * @return debounced version of fn + */ + function debounce(quietMillis, fn, ctx) { + ctx = ctx || undefined; + var timeout; + return function () { + var args = arguments; + window.clearTimeout(timeout); + timeout = window.setTimeout(function() { + fn.apply(ctx, args); + }, quietMillis); + }; + } + + /** + * A simple implementation of a thunk + * @param formula function used to lazily initialize the thunk + * @return {Function} + */ + function thunk(formula) { + var evaluated = false, + value; + return function() { + if (evaluated === false) { value = formula(); evaluated = true; } + return value; + }; + }; + + function installDebouncedScroll(threshold, element) { + var notify = debounce(threshold, function (e) { element.trigger("scroll-debounced", e);}); + element.on("scroll", function (e) { + if (indexOf(e.target, element.get()) >= 0) notify(e); + }); + } + + function focus($el) { + if ($el[0] === document.activeElement) return; + + /* set the focus in a 0 timeout - that way the focus is set after the processing + of the current event has finished - which seems like the only reliable way + to set focus */ + window.setTimeout(function() { + var el=$el[0], pos=$el.val().length, range; + + $el.focus(); + + /* make sure el received focus so we do not error out when trying to manipulate the caret. + sometimes modals or others listeners may steal it after its set */ + if ($el.is(":visible") && el === document.activeElement) { + + /* after the focus is set move the caret to the end, necessary when we val() + just before setting focus */ + if(el.setSelectionRange) + { + el.setSelectionRange(pos, pos); + } + else if (el.createTextRange) { + range = el.createTextRange(); + range.collapse(false); + range.select(); + } + } + }, 0); + } + + function getCursorInfo(el) { + el = $(el)[0]; + var offset = 0; + var length = 0; + if ('selectionStart' in el) { + offset = el.selectionStart; + length = el.selectionEnd - offset; + } else if ('selection' in document) { + el.focus(); + var sel = document.selection.createRange(); + length = document.selection.createRange().text.length; + sel.moveStart('character', -el.value.length); + offset = sel.text.length - length; + } + return { offset: offset, length: length }; + } + + function killEvent(event) { + event.preventDefault(); + event.stopPropagation(); + } + function killEventImmediately(event) { + event.preventDefault(); + event.stopImmediatePropagation(); + } + + function measureTextWidth(e) { + if (!sizer){ + var style = e[0].currentStyle || window.getComputedStyle(e[0], null); + sizer = $(document.createElement("div")).css({ + position: "absolute", + left: "-10000px", + top: "-10000px", + display: "none", + fontSize: style.fontSize, + fontFamily: style.fontFamily, + fontStyle: style.fontStyle, + fontWeight: style.fontWeight, + letterSpacing: style.letterSpacing, + textTransform: style.textTransform, + whiteSpace: "nowrap" + }); + sizer.attr("class","select2-sizer"); + $("body").append(sizer); + } + sizer.text(e.val()); + return sizer.width(); + } + + function syncCssClasses(dest, src, adapter) { + var classes, replacements = [], adapted; + + classes = dest.attr("class"); + if (classes) { + classes = '' + classes; // for IE which returns object + $(classes.split(" ")).each2(function() { + if (this.indexOf("select2-") === 0) { + replacements.push(this); + } + }); + } + classes = src.attr("class"); + if (classes) { + classes = '' + classes; // for IE which returns object + $(classes.split(" ")).each2(function() { + if (this.indexOf("select2-") !== 0) { + adapted = adapter(this); + if (adapted) { + replacements.push(this); + } + } + }); + } + dest.attr("class", replacements.join(" ")); + } + + + function markMatch(text, term, markup, escapeMarkup) { + var match=text.toUpperCase().indexOf(term.toUpperCase()), + tl=term.length; + + if (match<0) { + markup.push(escapeMarkup(text)); + return; + } + + markup.push(escapeMarkup(text.substring(0, match))); + markup.push("<span class='select2-match'>"); + markup.push(escapeMarkup(text.substring(match, match + tl))); + markup.push("</span>"); + markup.push(escapeMarkup(text.substring(match + tl, text.length))); + } + + /** + * Produces an ajax-based query function + * + * @param options object containing configuration paramters + * @param options.params parameter map for the transport ajax call, can contain such options as cache, jsonpCallback, etc. see $.ajax + * @param options.transport function that will be used to execute the ajax request. must be compatible with parameters supported by $.ajax + * @param options.url url for the data + * @param options.data a function(searchTerm, pageNumber, context) that should return an object containing query string parameters for the above url. + * @param options.dataType request data type: ajax, jsonp, other datatatypes supported by jQuery's $.ajax function or the transport function if specified + * @param options.quietMillis (optional) milliseconds to wait before making the ajaxRequest, helps debounce the ajax function if invoked too often + * @param options.results a function(remoteData, pageNumber) that converts data returned form the remote request to the format expected by Select2. + * The expected format is an object containing the following keys: + * results array of objects that will be used as choices + * more (optional) boolean indicating whether there are more results available + * Example: {results:[{id:1, text:'Red'},{id:2, text:'Blue'}], more:true} + */ + function ajax(options) { + var timeout, // current scheduled but not yet executed request + requestSequence = 0, // sequence used to drop out-of-order responses + handler = null, + quietMillis = options.quietMillis || 100, + ajaxUrl = options.url, + self = this; + + return function (query) { + window.clearTimeout(timeout); + timeout = window.setTimeout(function () { + requestSequence += 1; // increment the sequence + var requestNumber = requestSequence, // this request's sequence number + data = options.data, // ajax data function + url = ajaxUrl, // ajax url string or function + transport = options.transport || $.fn.select2.ajaxDefaults.transport, + // deprecated - to be removed in 4.0 - use params instead + deprecated = { + type: options.type || 'GET', // set type of request (GET or POST) + cache: options.cache || false, + jsonpCallback: options.jsonpCallback||undefined, + dataType: options.dataType||"json" + }, + params = $.extend({}, $.fn.select2.ajaxDefaults.params, deprecated); + + data = data ? data.call(self, query.term, query.page, query.context) : null; + url = (typeof url === 'function') ? url.call(self, query.term, query.page, query.context) : url; + + if( null !== handler) { handler.abort(); } + + if (options.params) { + if ($.isFunction(options.params)) { + $.extend(params, options.params.call(self)); + } else { + $.extend(params, options.params); + } + } + + $.extend(params, { + url: url, + dataType: options.dataType, + data: data, + success: function (data) { + if (requestNumber < requestSequence) { + return; + } + // TODO - replace query.page with query so users have access to term, page, etc. + var results = options.results(data, query.page); + query.callback(results); + } + }); + handler = transport.call(self, params); + }, quietMillis); + }; + } + + /** + * Produces a query function that works with a local array + * + * @param options object containing configuration parameters. The options parameter can either be an array or an + * object. + * + * If the array form is used it is assumed that it contains objects with 'id' and 'text' keys. + * + * If the object form is used ti is assumed that it contains 'data' and 'text' keys. The 'data' key should contain + * an array of objects that will be used as choices. These objects must contain at least an 'id' key. The 'text' + * key can either be a String in which case it is expected that each element in the 'data' array has a key with the + * value of 'text' which will be used to match choices. Alternatively, text can be a function(item) that can extract + * the text. + */ + function local(options) { + var data = options, // data elements + dataText, + tmp, + text = function (item) { return ""+item.text; }; // function used to retrieve the text portion of a data item that is matched against the search + + if ($.isArray(data)) { + tmp = data; + data = { results: tmp }; + } + + if ($.isFunction(data) === false) { + tmp = data; + data = function() { return tmp; }; + } + + var dataItem = data(); + if (dataItem.text) { + text = dataItem.text; + // if text is not a function we assume it to be a key name + if (!$.isFunction(text)) { + dataText = dataItem.text; // we need to store this in a separate variable because in the next step data gets reset and data.text is no longer available + text = function (item) { return item[dataText]; }; + } + } + + return function (query) { + var t = query.term, filtered = { results: [] }, process; + if (t === "") { + query.callback(data()); + return; + } + + process = function(datum, collection) { + var group, attr; + datum = datum[0]; + if (datum.children) { + group = {}; + for (attr in datum) { + if (datum.hasOwnProperty(attr)) group[attr]=datum[attr]; + } + group.children=[]; + $(datum.children).each2(function(i, childDatum) { process(childDatum, group.children); }); + if (group.children.length || query.matcher(t, text(group), datum)) { + collection.push(group); + } + } else { + if (query.matcher(t, text(datum), datum)) { + collection.push(datum); + } + } + }; + + $(data().results).each2(function(i, datum) { process(datum, filtered.results); }); + query.callback(filtered); + }; + } + + // TODO javadoc + function tags(data) { + var isFunc = $.isFunction(data); + return function (query) { + var t = query.term, filtered = {results: []}; + $(isFunc ? data() : data).each(function () { + var isObject = this.text !== undefined, + text = isObject ? this.text : this; + if (t === "" || query.matcher(t, text)) { + filtered.results.push(isObject ? this : {id: this, text: this}); + } + }); + query.callback(filtered); + }; + } + + /** + * Checks if the formatter function should be used. + * + * Throws an error if it is not a function. Returns true if it should be used, + * false if no formatting should be performed. + * + * @param formatter + */ + function checkFormatter(formatter, formatterName) { + if ($.isFunction(formatter)) return true; + if (!formatter) return false; + throw new Error("formatterName must be a function or a falsy value"); + } + + function evaluate(val) { + return $.isFunction(val) ? val() : val; + } + + function countResults(results) { + var count = 0; + $.each(results, function(i, item) { + if (item.children) { + count += countResults(item.children); + } else { + count++; + } + }); + return count; + } + + /** + * Default tokenizer. This function uses breaks the input on substring match of any string from the + * opts.tokenSeparators array and uses opts.createSearchChoice to create the choice object. Both of those + * two options have to be defined in order for the tokenizer to work. + * + * @param input text user has typed so far or pasted into the search field + * @param selection currently selected choices + * @param selectCallback function(choice) callback tho add the choice to selection + * @param opts select2's opts + * @return undefined/null to leave the current input unchanged, or a string to change the input to the returned value + */ + function defaultTokenizer(input, selection, selectCallback, opts) { + var original = input, // store the original so we can compare and know if we need to tell the search to update its text + dupe = false, // check for whether a token we extracted represents a duplicate selected choice + token, // token + index, // position at which the separator was found + i, l, // looping variables + separator; // the matched separator + + if (!opts.createSearchChoice || !opts.tokenSeparators || opts.tokenSeparators.length < 1) return undefined; + + while (true) { + index = -1; + + for (i = 0, l = opts.tokenSeparators.length; i < l; i++) { + separator = opts.tokenSeparators[i]; + index = input.indexOf(separator); + if (index >= 0) break; + } + + if (index < 0) break; // did not find any token separator in the input string, bail + + token = input.substring(0, index); + input = input.substring(index + separator.length); + + if (token.length > 0) { + token = opts.createSearchChoice(token, selection); + if (token !== undefined && token !== null && opts.id(token) !== undefined && opts.id(token) !== null) { + dupe = false; + for (i = 0, l = selection.length; i < l; i++) { + if (equal(opts.id(token), opts.id(selection[i]))) { + dupe = true; break; + } + } + + if (!dupe) selectCallback(token); + } + } + } + + if (original!==input) return input; + } + + /** + * Creates a new class + * + * @param superClass + * @param methods + */ + function clazz(SuperClass, methods) { + var constructor = function () {}; + constructor.prototype = new SuperClass; + constructor.prototype.constructor = constructor; + constructor.prototype.parent = SuperClass.prototype; + constructor.prototype = $.extend(constructor.prototype, methods); + return constructor; + } + + AbstractSelect2 = clazz(Object, { + + // abstract + bind: function (func) { + var self = this; + return function () { + func.apply(self, arguments); + }; + }, + + // abstract + init: function (opts) { + var results, search, resultsSelector = ".select2-results", disabled, readonly; + + // prepare options + this.opts = opts = this.prepareOpts(opts); + + this.id=opts.id; + + // destroy if called on an existing component + if (opts.element.data("select2") !== undefined && + opts.element.data("select2") !== null) { + this.destroy(); + } + + this.container = this.createContainer(); + + this.containerId="s2id_"+(opts.element.attr("id") || "autogen"+nextUid()); + this.containerSelector="#"+this.containerId.replace(/([;&,\.\+\*\~':"\!\^#$%@\[\]\(\)=>\|])/g, '\\$1'); + this.container.attr("id", this.containerId); + + // cache the body so future lookups are cheap + this.body = thunk(function() { return opts.element.closest("body"); }); + + syncCssClasses(this.container, this.opts.element, this.opts.adaptContainerCssClass); + + this.container.css(evaluate(opts.containerCss)); + this.container.addClass(evaluate(opts.containerCssClass)); + + this.elementTabIndex = this.opts.element.attr("tabindex"); + + // swap container for the element + this.opts.element + .data("select2", this) + .attr("tabindex", "-1") + .before(this.container); + this.container.data("select2", this); + + this.dropdown = this.container.find(".select2-drop"); + this.dropdown.addClass(evaluate(opts.dropdownCssClass)); + this.dropdown.data("select2", this); + + this.results = results = this.container.find(resultsSelector); + this.search = search = this.container.find("input.select2-input"); + + this.resultsPage = 0; + this.context = null; + + // initialize the container + this.initContainer(); + + installFilteredMouseMove(this.results); + this.dropdown.on("mousemove-filtered touchstart touchmove touchend", resultsSelector, this.bind(this.highlightUnderEvent)); + + installDebouncedScroll(80, this.results); + this.dropdown.on("scroll-debounced", resultsSelector, this.bind(this.loadMoreIfNeeded)); + + // do not propagate change event from the search field out of the component + $(this.container).on("change", ".select2-input", function(e) {e.stopPropagation();}); + $(this.dropdown).on("change", ".select2-input", function(e) {e.stopPropagation();}); + + // if jquery.mousewheel plugin is installed we can prevent out-of-bounds scrolling of results via mousewheel + if ($.fn.mousewheel) { + results.mousewheel(function (e, delta, deltaX, deltaY) { + var top = results.scrollTop(), height; + if (deltaY > 0 && top - deltaY <= 0) { + results.scrollTop(0); + killEvent(e); + } else if (deltaY < 0 && results.get(0).scrollHeight - results.scrollTop() + deltaY <= results.height()) { + results.scrollTop(results.get(0).scrollHeight - results.height()); + killEvent(e); + } + }); + } + + installKeyUpChangeEvent(search); + search.on("keyup-change input paste", this.bind(this.updateResults)); + search.on("focus", function () { search.addClass("select2-focused"); }); + search.on("blur", function () { search.removeClass("select2-focused");}); + + this.dropdown.on("mouseup", resultsSelector, this.bind(function (e) { + if ($(e.target).closest(".select2-result-selectable").length > 0) { + this.highlightUnderEvent(e); + this.selectHighlighted(e); + } + })); + + // trap all mouse events from leaving the dropdown. sometimes there may be a modal that is listening + // for mouse events outside of itself so it can close itself. since the dropdown is now outside the select2's + // dom it will trigger the popup close, which is not what we want + this.dropdown.on("click mouseup mousedown", function (e) { e.stopPropagation(); }); + + if ($.isFunction(this.opts.initSelection)) { + // initialize selection based on the current value of the source element + this.initSelection(); + + // if the user has provided a function that can set selection based on the value of the source element + // we monitor the change event on the element and trigger it, allowing for two way synchronization + this.monitorSource(); + } + + if (opts.maximumInputLength !== null) { + this.search.attr("maxlength", opts.maximumInputLength); + } + + var disabled = opts.element.prop("disabled"); + if (disabled === undefined) disabled = false; + this.enable(!disabled); + + var readonly = opts.element.prop("readonly"); + if (readonly === undefined) readonly = false; + this.readonly(readonly); + + // Calculate size of scrollbar + scrollBarDimensions = scrollBarDimensions || measureScrollbar(); + + this.autofocus = opts.element.prop("autofocus") + opts.element.prop("autofocus", false); + if (this.autofocus) this.focus(); + }, + + // abstract + destroy: function () { + var select2 = this.opts.element.data("select2"); + + if (this.propertyObserver) { delete this.propertyObserver; this.propertyObserver = null; } + + if (select2 !== undefined) { + + select2.container.remove(); + select2.dropdown.remove(); + select2.opts.element + .removeClass("select2-offscreen") + .removeData("select2") + .off(".select2") + .attr({"tabindex": this.elementTabIndex}) + .prop("autofocus", this.autofocus||false) + .show(); + } + }, + + // abstract + optionToData: function(element) { + if (element.is("option")) { + return { + id:element.prop("value"), + text:element.text(), + element: element.get(), + css: element.attr("class"), + disabled: element.prop("disabled"), + locked: equal(element.attr("locked"), "locked") + }; + } else if (element.is("optgroup")) { + return { + text:element.attr("label"), + children:[], + element: element.get(), + css: element.attr("class") + }; + } + }, + + // abstract + prepareOpts: function (opts) { + var element, select, idKey, ajaxUrl, self = this; + + element = opts.element; + + if (element.get(0).tagName.toLowerCase() === "select") { + this.select = select = opts.element; + } + + if (select) { + // these options are not allowed when attached to a select because they are picked up off the element itself + $.each(["id", "multiple", "ajax", "query", "createSearchChoice", "initSelection", "data", "tags"], function () { + if (this in opts) { + throw new Error("Option '" + this + "' is not allowed for Select2 when attached to a <select> element."); + } + }); + } + + opts = $.extend({}, { + populateResults: function(container, results, query) { + var populate, data, result, children, id=this.opts.id; + + populate=function(results, container, depth) { + + var i, l, result, selectable, disabled, compound, node, label, innerContainer, formatted; + + results = opts.sortResults(results, container, query); + + for (i = 0, l = results.length; i < l; i = i + 1) { + + result=results[i]; + + disabled = (result.disabled === true); + selectable = (!disabled) && (id(result) !== undefined); + + compound=result.children && result.children.length > 0; + + node=$("<li></li>"); + node.addClass("select2-results-dept-"+depth); + node.addClass("select2-result"); + node.addClass(selectable ? "select2-result-selectable" : "select2-result-unselectable"); + if (disabled) { node.addClass("select2-disabled"); } + if (compound) { node.addClass("select2-result-with-children"); } + node.addClass(self.opts.formatResultCssClass(result)); + + label=$(document.createElement("div")); + label.addClass("select2-result-label"); + + formatted=opts.formatResult(result, label, query, self.opts.escapeMarkup); + if (formatted!==undefined) { + label.html(formatted); + } + + node.append(label); + + if (compound) { + + innerContainer=$("<ul></ul>"); + innerContainer.addClass("select2-result-sub"); + populate(result.children, innerContainer, depth+1); + node.append(innerContainer); + } + + node.data("select2-data", result); + container.append(node); + } + }; + + populate(results, container, 0); + } + }, $.fn.select2.defaults, opts); + + if (typeof(opts.id) !== "function") { + idKey = opts.id; + opts.id = function (e) { return e[idKey]; }; + } + + if ($.isArray(opts.element.data("select2Tags"))) { + if ("tags" in opts) { + throw "tags specified as both an attribute 'data-select2-tags' and in options of Select2 " + opts.element.attr("id"); + } + opts.tags=opts.element.data("select2Tags"); + } + + if (select) { + opts.query = this.bind(function (query) { + var data = { results: [], more: false }, + term = query.term, + children, firstChild, process; + + process=function(element, collection) { + var group; + if (element.is("option")) { + if (query.matcher(term, element.text(), element)) { + collection.push(self.optionToData(element)); + } + } else if (element.is("optgroup")) { + group=self.optionToData(element); + element.children().each2(function(i, elm) { process(elm, group.children); }); + if (group.children.length>0) { + collection.push(group); + } + } + }; + + children=element.children(); + + // ignore the placeholder option if there is one + if (this.getPlaceholder() !== undefined && children.length > 0) { + firstChild = children[0]; + if ($(firstChild).text() === "") { + children=children.not(firstChild); + } + } + + children.each2(function(i, elm) { process(elm, data.results); }); + + query.callback(data); + }); + // this is needed because inside val() we construct choices from options and there id is hardcoded + opts.id=function(e) { return e.id; }; + opts.formatResultCssClass = function(data) { return data.css; }; + } else { + if (!("query" in opts)) { + + if ("ajax" in opts) { + ajaxUrl = opts.element.data("ajax-url"); + if (ajaxUrl && ajaxUrl.length > 0) { + opts.ajax.url = ajaxUrl; + } + opts.query = ajax.call(opts.element, opts.ajax); + } else if ("data" in opts) { + opts.query = local(opts.data); + } else if ("tags" in opts) { + opts.query = tags(opts.tags); + if (opts.createSearchChoice === undefined) { + opts.createSearchChoice = function (term) { return {id: term, text: term}; }; + } + if (opts.initSelection === undefined) { + opts.initSelection = function (element, callback) { + var data = []; + $(splitVal(element.val(), opts.separator)).each(function () { + var id = this, text = this, tags=opts.tags; + if ($.isFunction(tags)) tags=tags(); + $(tags).each(function() { if (equal(this.id, id)) { text = this.text; return false; } }); + data.push({id: id, text: text}); + }); + + callback(data); + }; + } + } + } + } + if (typeof(opts.query) !== "function") { + throw "query function not defined for Select2 " + opts.element.attr("id"); + } + + return opts; + }, + + /** + * Monitor the original element for changes and update select2 accordingly + */ + // abstract + monitorSource: function () { + var el = this.opts.element, sync; + + el.on("change.select2", this.bind(function (e) { + if (this.opts.element.data("select2-change-triggered") !== true) { + this.initSelection(); + } + })); + + sync = this.bind(function () { + + var enabled, readonly, self = this; + + // sync enabled state + + var disabled = el.prop("disabled"); + if (disabled === undefined) disabled = false; + this.enable(!disabled); + + var readonly = el.prop("readonly"); + if (readonly === undefined) readonly = false; + this.readonly(readonly); + + syncCssClasses(this.container, this.opts.element, this.opts.adaptContainerCssClass); + this.container.addClass(evaluate(this.opts.containerCssClass)); + + syncCssClasses(this.dropdown, this.opts.element, this.opts.adaptDropdownCssClass); + this.dropdown.addClass(evaluate(this.opts.dropdownCssClass)); + + }); + + // mozilla and IE + el.on("propertychange.select2 DOMAttrModified.select2", sync); + + + // hold onto a reference of the callback to work around a chromium bug + if (this.mutationCallback === undefined) { + this.mutationCallback = function (mutations) { + mutations.forEach(sync); + } + } + + // safari and chrome + if (typeof WebKitMutationObserver !== "undefined") { + if (this.propertyObserver) { delete this.propertyObserver; this.propertyObserver = null; } + this.propertyObserver = new WebKitMutationObserver(this.mutationCallback); + this.propertyObserver.observe(el.get(0), { attributes:true, subtree:false }); + } + }, + + // abstract + triggerSelect: function(data) { + var evt = $.Event("select2-selecting", { val: this.id(data), object: data }); + this.opts.element.trigger(evt); + return !evt.isDefaultPrevented(); + }, + + /** + * Triggers the change event on the source element + */ + // abstract + triggerChange: function (details) { + + details = details || {}; + details= $.extend({}, details, { type: "change", val: this.val() }); + // prevents recursive triggering + this.opts.element.data("select2-change-triggered", true); + this.opts.element.trigger(details); + this.opts.element.data("select2-change-triggered", false); + + // some validation frameworks ignore the change event and listen instead to keyup, click for selects + // so here we trigger the click event manually + this.opts.element.click(); + + // ValidationEngine ignorea the change event and listens instead to blur + // so here we trigger the blur event manually if so desired + if (this.opts.blurOnChange) + this.opts.element.blur(); + }, + + //abstract + isInterfaceEnabled: function() + { + return this.enabledInterface === true; + }, + + // abstract + enableInterface: function() { + var enabled = this._enabled && !this._readonly, + disabled = !enabled; + + if (enabled === this.enabledInterface) return false; + + this.container.toggleClass("select2-container-disabled", disabled); + this.close(); + this.enabledInterface = enabled; + + return true; + }, + + // abstract + enable: function(enabled) { + if (enabled === undefined) enabled = true; + if (this._enabled === enabled) return false; + this._enabled = enabled; + + this.opts.element.prop("disabled", !enabled); + this.enableInterface(); + return true; + }, + + // abstract + readonly: function(enabled) { + if (enabled === undefined) enabled = false; + if (this._readonly === enabled) return false; + this._readonly = enabled; + + this.opts.element.prop("readonly", enabled); + this.enableInterface(); + return true; + }, + + // abstract + opened: function () { + return this.container.hasClass("select2-dropdown-open"); + }, + + // abstract + positionDropdown: function() { + var $dropdown = this.dropdown, + offset = this.container.offset(), + height = this.container.outerHeight(false), + width = this.container.outerWidth(false), + dropHeight = $dropdown.outerHeight(false), + viewPortRight = $(window).scrollLeft() + $(window).width(), + viewportBottom = $(window).scrollTop() + $(window).height(), + dropTop = offset.top + height, + dropLeft = offset.left, + enoughRoomBelow = dropTop + dropHeight <= viewportBottom, + enoughRoomAbove = (offset.top - dropHeight) >= this.body().scrollTop(), + dropWidth = $dropdown.outerWidth(false), + enoughRoomOnRight = dropLeft + dropWidth <= viewPortRight, + aboveNow = $dropdown.hasClass("select2-drop-above"), + bodyOffset, + above, + css, + resultsListNode; + + if (this.opts.dropdownAutoWidth) { + resultsListNode = $('.select2-results', $dropdown)[0]; + $dropdown.addClass('select2-drop-auto-width'); + $dropdown.css('width', ''); + // Add scrollbar width to dropdown if vertical scrollbar is present + dropWidth = $dropdown.outerWidth(false) + (resultsListNode.scrollHeight === resultsListNode.clientHeight ? 0 : scrollBarDimensions.width); + dropWidth > width ? width = dropWidth : dropWidth = width; + enoughRoomOnRight = dropLeft + dropWidth <= viewPortRight; + } + else { + this.container.removeClass('select2-drop-auto-width'); + } + + //console.log("below/ droptop:", dropTop, "dropHeight", dropHeight, "sum", (dropTop+dropHeight)+" viewport bottom", viewportBottom, "enough?", enoughRoomBelow); + //console.log("above/ offset.top", offset.top, "dropHeight", dropHeight, "top", (offset.top-dropHeight), "scrollTop", this.body().scrollTop(), "enough?", enoughRoomAbove); + + // fix positioning when body has an offset and is not position: static + + if (this.body().css('position') !== 'static') { + bodyOffset = this.body().offset(); + dropTop -= bodyOffset.top; + dropLeft -= bodyOffset.left; + } + + // always prefer the current above/below alignment, unless there is not enough room + + if (aboveNow) { + above = true; + if (!enoughRoomAbove && enoughRoomBelow) above = false; + } else { + above = false; + if (!enoughRoomBelow && enoughRoomAbove) above = true; + } + + if (!enoughRoomOnRight) { + dropLeft = offset.left + width - dropWidth; + } + + if (above) { + dropTop = offset.top - dropHeight; + this.container.addClass("select2-drop-above"); + $dropdown.addClass("select2-drop-above"); + } + else { + this.container.removeClass("select2-drop-above"); + $dropdown.removeClass("select2-drop-above"); + } + + css = $.extend({ + top: dropTop, + left: dropLeft, + width: width + }, evaluate(this.opts.dropdownCss)); + + $dropdown.css(css); + }, + + // abstract + shouldOpen: function() { + var event; + + if (this.opened()) return false; + + if (this._enabled === false || this._readonly === true) return false; + + event = $.Event("select2-opening"); + this.opts.element.trigger(event); + return !event.isDefaultPrevented(); + }, + + // abstract + clearDropdownAlignmentPreference: function() { + // clear the classes used to figure out the preference of where the dropdown should be opened + this.container.removeClass("select2-drop-above"); + this.dropdown.removeClass("select2-drop-above"); + }, + + /** + * Opens the dropdown + * + * @return {Boolean} whether or not dropdown was opened. This method will return false if, for example, + * the dropdown is already open, or if the 'open' event listener on the element called preventDefault(). + */ + // abstract + open: function () { + + if (!this.shouldOpen()) return false; + + this.opening(); + + return true; + }, + + /** + * Performs the opening of the dropdown + */ + // abstract + opening: function() { + var cid = this.containerId, + scroll = "scroll." + cid, + resize = "resize."+cid, + orient = "orientationchange."+cid, + mask; + + this.container.addClass("select2-dropdown-open").addClass("select2-container-active"); + + this.clearDropdownAlignmentPreference(); + + if(this.dropdown[0] !== this.body().children().last()[0]) { + this.dropdown.detach().appendTo(this.body()); + } + + // create the dropdown mask if doesnt already exist + mask = $("#select2-drop-mask"); + if (mask.length == 0) { + mask = $(document.createElement("div")); + mask.attr("id","select2-drop-mask").attr("class","select2-drop-mask"); + mask.hide(); + mask.appendTo(this.body()); + mask.on("mousedown touchstart", function (e) { + var dropdown = $("#select2-drop"), self; + if (dropdown.length > 0) { + self=dropdown.data("select2"); + if (self.opts.selectOnBlur) { + self.selectHighlighted({noFocus: true}); + } + self.close(); + e.preventDefault(); + e.stopPropagation(); + } + }); + } + + // ensure the mask is always right before the dropdown + if (this.dropdown.prev()[0] !== mask[0]) { + this.dropdown.before(mask); + } + + // move the global id to the correct dropdown + $("#select2-drop").removeAttr("id"); + this.dropdown.attr("id", "select2-drop"); + + // show the elements + mask.css(_makeMaskCss()); + mask.show(); + this.dropdown.show(); + this.positionDropdown(); + + this.dropdown.addClass("select2-drop-active"); + this.ensureHighlightVisible(); + + // attach listeners to events that can change the position of the container and thus require + // the position of the dropdown to be updated as well so it does not come unglued from the container + var that = this; + this.container.parents().add(window).each(function () { + $(this).on(resize+" "+scroll+" "+orient, function (e) { + $("#select2-drop-mask").css(_makeMaskCss()); + that.positionDropdown(); + }); + }); + + function _makeMaskCss() { + return { + width : Math.max(document.documentElement.scrollWidth, $(window).width()), + height : Math.max(document.documentElement.scrollHeight, $(window).height()) + } + } + }, + + // abstract + close: function () { + if (!this.opened()) return; + + var cid = this.containerId, + scroll = "scroll." + cid, + resize = "resize."+cid, + orient = "orientationchange."+cid; + + // unbind event listeners + this.container.parents().add(window).each(function () { $(this).off(scroll).off(resize).off(orient); }); + + this.clearDropdownAlignmentPreference(); + + $("#select2-drop-mask").hide(); + this.dropdown.removeAttr("id"); // only the active dropdown has the select2-drop id + this.dropdown.hide(); + this.container.removeClass("select2-dropdown-open"); + this.results.empty(); + + + this.clearSearch(); + this.search.removeClass("select2-active"); + this.opts.element.trigger($.Event("select2-close")); + }, + + // abstract + clearSearch: function () { + + }, + + //abstract + getMaximumSelectionSize: function() { + return evaluate(this.opts.maximumSelectionSize); + }, + + // abstract + ensureHighlightVisible: function () { + var results = this.results, children, index, child, hb, rb, y, more; + + index = this.highlight(); + + if (index < 0) return; + + if (index == 0) { + + // if the first element is highlighted scroll all the way to the top, + // that way any unselectable headers above it will also be scrolled + // into view + + results.scrollTop(0); + return; + } + + children = this.findHighlightableChoices().find('.select2-result-label'); + + child = $(children[index]); + + hb = child.offset().top + child.outerHeight(true); + + // if this is the last child lets also make sure select2-more-results is visible + if (index === children.length - 1) { + more = results.find("li.select2-more-results"); + if (more.length > 0) { + hb = more.offset().top + more.outerHeight(true); + } + } + + rb = results.offset().top + results.outerHeight(true); + if (hb > rb) { + results.scrollTop(results.scrollTop() + (hb - rb)); + } + y = child.offset().top - results.offset().top; + + // make sure the top of the element is visible + if (y < 0 && child.css('display') != 'none' ) { + results.scrollTop(results.scrollTop() + y); // y is negative + } + }, + + // abstract + findHighlightableChoices: function() { + return this.results.find(".select2-result-selectable:not(.select2-selected):not(.select2-disabled)"); + }, + + // abstract + moveHighlight: function (delta) { + var choices = this.findHighlightableChoices(), + index = this.highlight(); + + while (index > -1 && index < choices.length) { + index += delta; + var choice = $(choices[index]); + if (choice.hasClass("select2-result-selectable") && !choice.hasClass("select2-disabled") && !choice.hasClass("select2-selected")) { + this.highlight(index); + break; + } + } + }, + + // abstract + highlight: function (index) { + var choices = this.findHighlightableChoices(), + choice, + data; + + if (arguments.length === 0) { + return indexOf(choices.filter(".select2-highlighted")[0], choices.get()); + } + + if (index >= choices.length) index = choices.length - 1; + if (index < 0) index = 0; + + this.results.find(".select2-highlighted").removeClass("select2-highlighted"); + + choice = $(choices[index]); + choice.addClass("select2-highlighted"); + + this.ensureHighlightVisible(); + + data = choice.data("select2-data"); + if (data) { + this.opts.element.trigger({ type: "select2-highlight", val: this.id(data), choice: data }); + } + }, + + // abstract + countSelectableResults: function() { + return this.findHighlightableChoices().length; + }, + + // abstract + highlightUnderEvent: function (event) { + var el = $(event.target).closest(".select2-result-selectable"); + if (el.length > 0 && !el.is(".select2-highlighted")) { + var choices = this.findHighlightableChoices(); + this.highlight(choices.index(el)); + } else if (el.length == 0) { + // if we are over an unselectable item remove al highlights + this.results.find(".select2-highlighted").removeClass("select2-highlighted"); + } + }, + + // abstract + loadMoreIfNeeded: function () { + var results = this.results, + more = results.find("li.select2-more-results"), + below, // pixels the element is below the scroll fold, below==0 is when the element is starting to be visible + offset = -1, // index of first element without data + page = this.resultsPage + 1, + self=this, + term=this.search.val(), + context=this.context; + + if (more.length === 0) return; + below = more.offset().top - results.offset().top - results.height(); + + if (below <= this.opts.loadMorePadding) { + more.addClass("select2-active"); + this.opts.query({ + element: this.opts.element, + term: term, + page: page, + context: context, + matcher: this.opts.matcher, + callback: this.bind(function (data) { + + // ignore a response if the select2 has been closed before it was received + if (!self.opened()) return; + + + self.opts.populateResults.call(this, results, data.results, {term: term, page: page, context:context}); + self.postprocessResults(data, false, false); + + if (data.more===true) { + more.detach().appendTo(results).text(self.opts.formatLoadMore(page+1)); + window.setTimeout(function() { self.loadMoreIfNeeded(); }, 10); + } else { + more.remove(); + } + self.positionDropdown(); + self.resultsPage = page; + self.context = data.context; + })}); + } + }, + + /** + * Default tokenizer function which does nothing + */ + tokenize: function() { + + }, + + /** + * @param initial whether or not this is the call to this method right after the dropdown has been opened + */ + // abstract + updateResults: function (initial) { + var search = this.search, + results = this.results, + opts = this.opts, + data, + self = this, + input, + term = search.val(), + lastTerm=$.data(this.container, "select2-last-term"); + + // prevent duplicate queries against the same term + if (initial !== true && lastTerm && equal(term, lastTerm)) return; + + $.data(this.container, "select2-last-term", term); + + // if the search is currently hidden we do not alter the results + if (initial !== true && (this.showSearchInput === false || !this.opened())) { + return; + } + + function postRender() { + results.scrollTop(0); + search.removeClass("select2-active"); + self.positionDropdown(); + } + + function render(html) { + results.html(html); + postRender(); + } + + var maxSelSize = this.getMaximumSelectionSize(); + if (maxSelSize >=1) { + data = this.data(); + if ($.isArray(data) && data.length >= maxSelSize && checkFormatter(opts.formatSelectionTooBig, "formatSelectionTooBig")) { + render("<li class='select2-selection-limit'>" + opts.formatSelectionTooBig(maxSelSize) + "</li>"); + return; + } + } + + if (search.val().length < opts.minimumInputLength) { + if (checkFormatter(opts.formatInputTooShort, "formatInputTooShort")) { + render("<li class='select2-no-results'>" + opts.formatInputTooShort(search.val(), opts.minimumInputLength) + "</li>"); + } else { + render(""); + } + if (initial) this.showSearch(true); + return; + } + + if (opts.maximumInputLength && search.val().length > opts.maximumInputLength) { + if (checkFormatter(opts.formatInputTooLong, "formatInputTooLong")) { + render("<li class='select2-no-results'>" + opts.formatInputTooLong(search.val(), opts.maximumInputLength) + "</li>"); + } else { + render(""); + } + return; + } + + if (opts.formatSearching && this.findHighlightableChoices().length === 0) { + render("<li class='select2-searching'>" + opts.formatSearching() + "</li>"); + } + + search.addClass("select2-active"); + + // give the tokenizer a chance to pre-process the input + input = this.tokenize(); + if (input != undefined && input != null) { + search.val(input); + } + + this.resultsPage = 1; + this.opts.element.find('#open_value').remove(); + + opts.query({ + element: opts.element, + term: search.val(), + page: this.resultsPage, + context: null, + matcher: opts.matcher, + callback: this.bind(function (data) { + var def; // default choice + + // ignore a response if the select2 has been closed before it was received + if (!this.opened()) { + this.search.removeClass("select2-active"); + return; + } + + // save context, if any + this.context = (data.context===undefined) ? null : data.context; + // create a default choice and prepend it to the list + if (this.opts.createSearchChoice && search.val() !== "") { + def = this.opts.createSearchChoice.call(null, search.val(), data.results); + if (def !== undefined && def !== null && self.id(def) !== undefined && self.id(def) !== null) { + if ($(data.results).filter( + function () { + return equal(self.id(this), self.id(def)); + }).length === 0) { + data.results.unshift(def); + } + } + } + + if(search.val() && this.opts.open_value){ + var $elt = $('<option>').attr({ + value: search.val(), + id: 'open_value' + }).text(search.val()); + + this.opts.element.append($elt); + + var open_value = { + css: null, + disabled: false, + id: search.val(), + text: search.val(), + locked: false, + element: $elt.get() + }; + + data.results.push(open_value); + } + + if (data.results.length === 0 && checkFormatter(opts.formatNoMatches, "formatNoMatches")) { + render("<li class='select2-no-results'>" + opts.formatNoMatches(search.val()) + "</li>"); + return; + } + + results.empty(); + self.opts.populateResults.call(this, results, data.results, {term: search.val(), page: this.resultsPage, context:null}); + + if (data.more === true && checkFormatter(opts.formatLoadMore, "formatLoadMore")) { + results.append("<li class='select2-more-results'>" + self.opts.escapeMarkup(opts.formatLoadMore(this.resultsPage)) + "</li>"); + window.setTimeout(function() { self.loadMoreIfNeeded(); }, 10); + } + + this.postprocessResults(data, initial); + + postRender(); + + this.opts.element.trigger({ type: "select2-loaded", data:data }); + })}); + }, + + // abstract + cancel: function () { + this.close(); + }, + + // abstract + blur: function () { + // if selectOnBlur == true, select the currently highlighted option + if (this.opts.selectOnBlur) + this.selectHighlighted({noFocus: true}); + + this.close(); + this.container.removeClass("select2-container-active"); + // synonymous to .is(':focus'), which is available in jquery >= 1.6 + if (this.search[0] === document.activeElement) { this.search.blur(); } + this.clearSearch(); + this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus"); + }, + + // abstract + focusSearch: function () { + focus(this.search); + }, + + // abstract + selectHighlighted: function (options) { + var index=this.highlight(), + highlighted=this.results.find(".select2-highlighted"), + data = highlighted.closest('.select2-result').data("select2-data"); + + if (data) { + this.highlight(index); + this.onSelect(data, options); + } else + this.opts.element.trigger(options.e); + }, + + // abstract + getPlaceholder: function () { + return this.opts.element.attr("placeholder") || + this.opts.element.attr("data-placeholder") || // jquery 1.4 compat + this.opts.element.data("placeholder") || + this.opts.placeholder; + }, + + /** + * Get the desired width for the container element. This is + * derived first from option `width` passed to select2, then + * the inline 'style' on the original element, and finally + * falls back to the jQuery calculated element width. + */ + // abstract + initContainerWidth: function () { + function resolveContainerWidth() { + var style, attrs, matches, i, l; + + if (this.opts.width === "off") { + return null; + } else if (this.opts.width === "element"){ + return this.opts.element.outerWidth(false) === 0 ? 'auto' : this.opts.element.outerWidth(false) + 'px'; + } else if (this.opts.width === "copy" || this.opts.width === "resolve") { + // check if there is inline style on the element that contains width + style = this.opts.element.attr('style'); + if (style !== undefined) { + attrs = style.split(';'); + for (i = 0, l = attrs.length; i < l; i = i + 1) { + matches = attrs[i].replace(/\s/g, '') + .match(/width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i); + if (matches !== null && matches.length >= 1) + return matches[1]; + } + } + + // next check if css('width') can resolve a width that is percent based, this is sometimes possible + // when attached to input type=hidden or elements hidden via css + style = this.opts.element.css('width'); + if (style && style.length > 0) return style; + + if (this.opts.width === "resolve") { + // finally, fallback on the calculated width of the element + return (this.opts.element.outerWidth(false) === 0 ? 'auto' : this.opts.element.outerWidth(false) + 'px'); + } + + return null; + } else if ($.isFunction(this.opts.width)) { + return this.opts.width(); + } else { + return this.opts.width; + } + }; + + var width = resolveContainerWidth.call(this); + if (width !== null) { + this.container.css("width", width); + } + } + }); + + SingleSelect2 = clazz(AbstractSelect2, { + + // single + + createContainer: function () { + var container = $(document.createElement("div")).attr({ + "class": "select2-container" + }).html([ + "<a href='javascript:void(0)' onclick='return false;' class='select2-choice' tabindex='-1'>", + " <span> </span><abbr class='select2-search-choice-close'></abbr>", + " <div><b></b></div>" , + "</a>", + "<input class='select2-focusser select2-offscreen' type='text'/>", + "<div class='select2-drop select2-display-none'>" , + " <div class='select2-search'>" , + " <input type='text' autocomplete='off' autocorrect='off' autocapitilize='off' spellcheck='false' class='select2-input'/>" , + " </div>" , + " <ul class='select2-results'>" , + " </ul>" , + "</div>"].join("")); + return container; + }, + + // single + enableInterface: function() { + if (this.parent.enableInterface.apply(this, arguments)) { + this.focusser.prop("disabled", !this.isInterfaceEnabled()); + } + }, + + // single + opening: function () { + var el, range; + this.parent.opening.apply(this, arguments); + if (this.showSearchInput !== false) { + // IE appends focusser.val() at the end of field :/ so we manually insert it at the beginning using a range + // all other browsers handle this just fine + + this.search.val(this.focusser.val()); + } + this.search.focus(); + // in IE we have to move the cursor to the end after focussing, otherwise it will be at the beginning and + // new text will appear *before* focusser.val() + el = this.search.get(0); + if (el.createTextRange) { + range = el.createTextRange(); + range.collapse(false); + range.select(); + } + + this.focusser.prop("disabled", true).val(""); + this.updateResults(true); + this.opts.element.trigger($.Event("select2-open")); + }, + + // single + close: function () { + if (!this.opened()) return; + this.parent.close.apply(this, arguments); + this.focusser.removeAttr("disabled"); + this.focusser.focus(); + }, + + // single + focus: function () { + if (this.opened()) { + this.close(); + } else { + this.focusser.removeAttr("disabled"); + this.focusser.focus(); + } + }, + + // single + isFocused: function () { + return this.container.hasClass("select2-container-active"); + }, + + // single + cancel: function () { + this.parent.cancel.apply(this, arguments); + this.focusser.removeAttr("disabled"); + this.focusser.focus(); + }, + + // single + initContainer: function () { + + var selection, + container = this.container, + dropdown = this.dropdown; + + this.showSearch(false); + + this.selection = selection = container.find(".select2-choice"); + + this.focusser = container.find(".select2-focusser"); + + // rewrite labels from original element to focusser + this.focusser.attr("id", "s2id_autogen"+nextUid()); + + $("label[for='" + this.opts.element.attr("id") + "']") + .attr('for', this.focusser.attr('id')); + + this.focusser.attr("tabindex", this.elementTabIndex); + + this.search.on("keydown", this.bind(function (e) { + if (!this.isInterfaceEnabled()) return; + + if (e.which === KEY.PAGE_UP || e.which === KEY.PAGE_DOWN) { + // prevent the page from scrolling + killEvent(e); + return; + } + + switch (e.which) { + case KEY.UP: + case KEY.DOWN: + this.moveHighlight((e.which === KEY.UP) ? -1 : 1); + killEvent(e); + return; + case KEY.ENTER: + this.selectHighlighted(); + killEvent(e); + return; + case KEY.TAB: + this.selectHighlighted({noFocus: true, e: e}); + return; + case KEY.ESC: + this.cancel(e); + killEvent(e); + return; + } + })); + + this.search.on("blur", this.bind(function(e) { + // a workaround for chrome to keep the search field focussed when the scroll bar is used to scroll the dropdown. + // without this the search field loses focus which is annoying + if (document.activeElement === this.body().get(0)) { + window.setTimeout(this.bind(function() { + this.search.focus(); + }), 0); + } + })); + + this.focusser.on("keydown", this.bind(function (e) { + if (!this.isInterfaceEnabled()) return; + + if (e.which === KEY.TAB || KEY.isControl(e) || KEY.isFunctionKey(e) || e.which === KEY.ESC) { + return; + } + + if (this.opts.openOnEnter === false && e.which === KEY.ENTER) { + killEvent(e); + return; + } + + if (e.which == KEY.DOWN || e.which == KEY.UP + || (e.which == KEY.ENTER && this.opts.openOnEnter)) { + this.open(); + killEvent(e); + return; + } + + if (e.which == KEY.DELETE || e.which == KEY.BACKSPACE) { + if (this.opts.allowClear) { + this.clear(); + } + killEvent(e); + return; + } + })); + + + installKeyUpChangeEvent(this.focusser); + this.focusser.on("keyup-change input", this.bind(function(e) { + e.stopPropagation(); + if (this.opened()) return; + this.open(); + })); + + selection.on("mousedown", "abbr", this.bind(function (e) { + if (!this.isInterfaceEnabled()) return; + this.clear(); + killEventImmediately(e); + this.close(); + this.selection.focus(); + })); + + selection.on("mousedown", this.bind(function (e) { + + if (!this.container.hasClass("select2-container-active")) { + this.opts.element.trigger($.Event("select2-focus")); + } + + if (this.opened()) { + this.close(); + } else if (this.isInterfaceEnabled()) { + this.open(); + } + + killEvent(e); + })); + + dropdown.on("mousedown", this.bind(function() { this.search.focus(); })); + + selection.on("focus", this.bind(function(e) { + killEvent(e); + })); + + this.focusser.on("focus", this.bind(function(){ + if (!this.container.hasClass("select2-container-active")) { + this.opts.element.trigger($.Event("select2-focus")); + } + this.container.addClass("select2-container-active"); + })).on("blur", this.bind(function() { + if (!this.opened()) { + this.container.removeClass("select2-container-active"); + this.opts.element.trigger($.Event("select2-blur")); + } + })); + this.search.on("focus", this.bind(function(){ + if (!this.container.hasClass("select2-container-active")) { + this.opts.element.trigger($.Event("select2-focus")); + } + this.container.addClass("select2-container-active"); + })); + + this.initContainerWidth(); + this.opts.element.addClass("select2-offscreen"); + this.setPlaceholder(); + + }, + + // single + clear: function(triggerChange) { + var data=this.selection.data("select2-data"); + if (data) { // guard against queued quick consecutive clicks + this.opts.element.val(""); + this.selection.find("span").empty(); + this.selection.removeData("select2-data"); + this.setPlaceholder(); + + if (triggerChange !== false){ + this.opts.element.trigger({ type: "select2-removed", val: this.id(data), choice: data }); + this.triggerChange({removed:data}); + } + } + }, + + /** + * Sets selection based on source element's value + */ + // single + initSelection: function () { + var selected; + if (this.opts.element.val() === "" && this.opts.element.text() === "") { + this.updateSelection([]); + this.close(); + this.setPlaceholder(); + } else { + var self = this; + this.opts.initSelection.call(null, this.opts.element, function(selected){ + if (selected !== undefined && selected !== null) { + self.updateSelection(selected); + self.close(); + self.setPlaceholder(); + } + }); + } + }, + + // single + prepareOpts: function () { + var opts = this.parent.prepareOpts.apply(this, arguments), + self=this; + + if (opts.element.get(0).tagName.toLowerCase() === "select") { + // install the selection initializer + opts.initSelection = function (element, callback) { + var selected = element.find(":selected"); + // a single select box always has a value, no need to null check 'selected' + callback(self.optionToData(selected)); + }; + } else if ("data" in opts) { + // install default initSelection when applied to hidden input and data is local + opts.initSelection = opts.initSelection || function (element, callback) { + var id = element.val(); + //search in data by id, storing the actual matching item + var match = null; + opts.query({ + matcher: function(term, text, el){ + var is_match = equal(id, opts.id(el)); + if (is_match) { + match = el; + } + return is_match; + }, + callback: !$.isFunction(callback) ? $.noop : function() { + callback(match); + } + }); + }; + } + + return opts; + }, + + // single + getPlaceholder: function() { + // if a placeholder is specified on a single select without the first empty option ignore it + if (this.select) { + if (this.select.find("option").first().text() !== "") { + return undefined; + } + } + + return this.parent.getPlaceholder.apply(this, arguments); + }, + + // single + setPlaceholder: function () { + var placeholder = this.getPlaceholder(); + + if (this.opts.element.val() === "" && placeholder !== undefined) { + + // check for a first blank option if attached to a select + if (this.select && this.select.find("option:first").text() !== "") return; + + this.selection.find("span").html(this.opts.escapeMarkup(placeholder)); + + this.selection.addClass("select2-default"); + + this.container.removeClass("select2-allowclear"); + } + }, + + // single + postprocessResults: function (data, initial, noHighlightUpdate) { + var selected = 0, self = this, showSearchInput = true; + + // find the selected element in the result list + + this.findHighlightableChoices().each2(function (i, elm) { + if (equal(self.id(elm.data("select2-data")), self.opts.element.val())) { + selected = i; + return false; + } + }); + + // and highlight it + if (noHighlightUpdate !== false) { + this.highlight(selected); + } + + // show the search box if this is the first we got the results and there are enough of them for search + + if (initial === true && this.showSearchInput === false) { + var min=this.opts.minimumResultsForSearch; + if (min>=0) { + this.showSearch(countResults(data.results)>=min); + } + } + + }, + + // single + showSearch: function(showSearchInput) { + this.showSearchInput = showSearchInput; + + this.dropdown.find(".select2-search").toggleClass("select2-search-hidden", !showSearchInput); + this.dropdown.find(".select2-search").toggleClass("select2-offscreen", !showSearchInput); + //add "select2-with-searchbox" to the container if search box is shown + $(this.dropdown, this.container).toggleClass("select2-with-searchbox", showSearchInput); + }, + + // single + onSelect: function (data, options) { + + if (!this.triggerSelect(data)) { return; } + + var old = this.opts.element.val(), + oldData = this.data(); + + this.opts.element.val(this.id(data)); + this.updateSelection(data); + + this.opts.element.trigger({ type: "select2-selected", val: this.id(data), choice: data }); + + this.close(); + + if (!options || !options.noFocus){ + this.selection.focus(); + } else + this.opts.element.trigger(options.e); + + if (!equal(old, this.id(data))) { this.triggerChange({added:data,removed:oldData}); } + }, + + // single + updateSelection: function (data) { + + var container=this.selection.find("span"), formatted; + + this.selection.data("select2-data", data); + + container.empty(); + formatted=this.opts.formatSelection(data, container); + if (formatted !== undefined) { + container.append(this.opts.escapeMarkup(formatted)); + } + + this.selection.removeClass("select2-default"); + + if (this.opts.allowClear && this.getPlaceholder() !== undefined) { + this.container.addClass("select2-allowclear"); + } + }, + + // single + val: function () { + var val, + triggerChange = false, + data = null, + self = this, + oldData = this.data(); + + if (arguments.length === 0) { + return this.opts.element.val(); + } + + val = arguments[0]; + + if (arguments.length > 1) { + triggerChange = arguments[1]; + } + + if (this.select) { + this.select + .val(val) + .find(":selected").each2(function (i, elm) { + data = self.optionToData(elm); + return false; + }); + this.updateSelection(data); + this.setPlaceholder(); + if (triggerChange) { + this.triggerChange({added: data, removed:oldData}); + } + } else { + if (this.opts.initSelection === undefined) { + throw new Error("cannot call val() if initSelection() is not defined"); + } + // val is an id. !val is true for [undefined,null,'',0] - 0 is legal + if (!val && val !== 0) { + this.clear(triggerChange); + return; + } + this.opts.element.val(val); + this.opts.initSelection(this.opts.element, function(data){ + self.opts.element.val(!data ? "" : self.id(data)); + self.updateSelection(data); + self.setPlaceholder(); + if (triggerChange) { + self.triggerChange({added: data, removed:oldData}); + } + }); + } + }, + + // single + clearSearch: function () { + this.search.val(""); + this.focusser.val(""); + }, + + // single + data: function(value, triggerChange) { + var data; + + if (arguments.length === 0) { + data = this.selection.data("select2-data"); + if (data == undefined) data = null; + return data; + } else { + if (!value || value === "") { + this.clear(triggerChange); + } else { + data = this.data(); + this.opts.element.val(!value ? "" : this.id(value)); + this.updateSelection(value); + if (triggerChange) { + this.triggerChange({added: value, removed:data}); + } + } + } + } + }); + + MultiSelect2 = clazz(AbstractSelect2, { + + // multi + createContainer: function () { + var container = $(document.createElement("div")).attr({ + "class": "select2-container select2-container-multi" + }).html([ + " <ul class='select2-choices'>", + //"<li class='select2-search-choice'><span>California</span><a href="javascript:void(0)" class="select2-search-choice-close"></a></li>" , + " <li class='select2-search-field'>" , + " <input type='text' autocomplete='off' autocorrect='off' autocapitilize='off' spellcheck='false' class='select2-input'>" , + " </li>" , + "</ul>" , + "<div class='select2-drop select2-drop-multi select2-display-none'>" , + " <ul class='select2-results'>" , + " </ul>" , + "</div>"].join("")); + return container; + }, + + // multi + prepareOpts: function () { + var opts = this.parent.prepareOpts.apply(this, arguments), + self=this; + + // TODO validate placeholder is a string if specified + + if (opts.element.get(0).tagName.toLowerCase() === "select") { + // install sthe selection initializer + opts.initSelection = function (element, callback) { + + var data = []; + + element.find(":selected").each2(function (i, elm) { + data.push(self.optionToData(elm)); + }); + callback(data); + }; + } else if ("data" in opts) { + // install default initSelection when applied to hidden input and data is local + opts.initSelection = opts.initSelection || function (element, callback) { + var ids = splitVal(element.val(), opts.separator); + //search in data by array of ids, storing matching items in a list + var matches = []; + opts.query({ + matcher: function(term, text, el){ + var is_match = $.grep(ids, function(id) { + return equal(id, opts.id(el)); + }).length; + if (is_match) { + matches.push(el); + } + return is_match; + }, + callback: !$.isFunction(callback) ? $.noop : function() { + // reorder matches based on the order they appear in the ids array because right now + // they are in the order in which they appear in data array + var ordered = []; + for (var i = 0; i < ids.length; i++) { + var id = ids[i]; + for (var j = 0; j < matches.length; j++) { + var match = matches[j]; + if (equal(id, opts.id(match))) { + ordered.push(match); + matches.splice(j, 1); + break; + } + } + } + callback(ordered); + } + }); + }; + } + + return opts; + }, + + selectChoice: function (choice) { + + var selected = this.container.find(".select2-search-choice-focus"); + if (selected.length && choice && choice[0] == selected[0]) { + + } else { + if (selected.length) { + this.opts.element.trigger("choice-deselected", selected); + } + selected.removeClass("select2-search-choice-focus"); + if (choice && choice.length) { + this.close(); + choice.addClass("select2-search-choice-focus"); + this.opts.element.trigger("choice-selected", choice); + } + } + }, + + // multi + initContainer: function () { + + var selector = ".select2-choices", selection; + + this.searchContainer = this.container.find(".select2-search-field"); + this.selection = selection = this.container.find(selector); + + var _this = this; + this.selection.on("mousedown", ".select2-search-choice", function (e) { + //killEvent(e); + _this.search[0].focus(); + _this.selectChoice($(this)); + }) + //.sortable({ + // items: " > li", + // tolerance: "pointer", + // revert: 100 + //}); + + // rewrite labels from original element to focusser + this.search.attr("id", "s2id_autogen"+nextUid()); + $("label[for='" + this.opts.element.attr("id") + "']") + .attr('for', this.search.attr('id')); + + this.search.on("input paste", this.bind(function() { + if (!this.isInterfaceEnabled()) return; + if (!this.opened()) { + this.open(); + } + })); + + this.search.attr("tabindex", this.elementTabIndex); + + this.keydowns = 0; + this.search.on("keydown", this.bind(function (e) { + if (!this.isInterfaceEnabled()) return; + + ++this.keydowns; + var selected = selection.find(".select2-search-choice-focus"); + var prev = selected.prev(".select2-search-choice:not(.select2-locked)"); + var next = selected.next(".select2-search-choice:not(.select2-locked)"); + var pos = getCursorInfo(this.search); + + if (selected.length && + (e.which == KEY.LEFT || e.which == KEY.RIGHT || e.which == KEY.BACKSPACE || e.which == KEY.DELETE || e.which == KEY.ENTER)) { + var selectedChoice = selected; + if (e.which == KEY.LEFT && prev.length) { + selectedChoice = prev; + } + else if (e.which == KEY.RIGHT) { + selectedChoice = next.length ? next : null; + } + else if (e.which === KEY.BACKSPACE) { + this.unselect(selected.first()); + this.search.width(10); + selectedChoice = prev.length ? prev : next; + } else if (e.which == KEY.DELETE) { + this.unselect(selected.first()); + this.search.width(10); + selectedChoice = next.length ? next : null; + } else if (e.which == KEY.ENTER) { + selectedChoice = null; + } + + this.selectChoice(selectedChoice); + killEvent(e); + if (!selectedChoice || !selectedChoice.length) { + this.open(); + } + return; + } else if (((e.which === KEY.BACKSPACE && this.keydowns == 1) + || e.which == KEY.LEFT) && (pos.offset == 0 && !pos.length)) { + + this.selectChoice(selection.find(".select2-search-choice:not(.select2-locked)").last()); + killEvent(e); + return; + } else { + this.selectChoice(null); + } + + if (this.opened()) { + switch (e.which) { + case KEY.UP: + case KEY.DOWN: + this.moveHighlight((e.which === KEY.UP) ? -1 : 1); + killEvent(e); + return; + case KEY.ENTER: + this.selectHighlighted(); + killEvent(e); + return; + case KEY.TAB: + this.selectHighlighted({noFocus:true}); + return; + case KEY.ESC: + this.cancel(e); + killEvent(e); + return; + } + } + + if (e.which === KEY.TAB || KEY.isControl(e) || KEY.isFunctionKey(e) + || e.which === KEY.BACKSPACE || e.which === KEY.ESC) { + return; + } + + if (e.which === KEY.ENTER) { + if (this.opts.openOnEnter === false) { + return; + } else if (e.altKey || e.ctrlKey || e.shiftKey || e.metaKey) { + return; + } + } + + this.open(); + + if (e.which === KEY.PAGE_UP || e.which === KEY.PAGE_DOWN) { + // prevent the page from scrolling + killEvent(e); + } + + if (e.which === KEY.ENTER) { + // prevent form from being submitted + killEvent(e); + } + + })); + + this.search.on("keyup", this.bind(function (e) { + this.keydowns = 0; + this.resizeSearch(); + }) + ); + + this.search.on("blur", this.bind(function(e) { + this.container.removeClass("select2-container-active"); + this.search.removeClass("select2-focused"); + this.selectChoice(null); + if (!this.opened()) this.clearSearch(); + e.stopImmediatePropagation(); + this.opts.element.trigger($.Event("select2-blur")); + })); + + this.container.on("mousedown", selector, this.bind(function (e) { + if (!this.isInterfaceEnabled()) return; + if ($(e.target).closest(".select2-search-choice").length > 0) { + // clicked inside a select2 search choice, do not open + return; + } + this.selectChoice(null); + this.clearPlaceholder(); + if (!this.container.hasClass("select2-container-active")) { + this.opts.element.trigger($.Event("select2-focus")); + } + this.open(); + this.focusSearch(); + e.preventDefault(); + })); + + this.container.on("focus", selector, this.bind(function () { + if (!this.isInterfaceEnabled()) return; + if (!this.container.hasClass("select2-container-active")) { + this.opts.element.trigger($.Event("select2-focus")); + } + this.container.addClass("select2-container-active"); + this.dropdown.addClass("select2-drop-active"); + this.clearPlaceholder(); + })); + + this.initContainerWidth(); + this.opts.element.addClass("select2-offscreen"); + + // set the placeholder if necessary + this.clearSearch(); + }, + + // multi + enableInterface: function() { + if (this.parent.enableInterface.apply(this, arguments)) { + this.search.prop("disabled", !this.isInterfaceEnabled()); + } + }, + + // multi + initSelection: function () { + var data; + if (this.opts.element.val() === "" && this.opts.element.text() === "") { + this.updateSelection([]); + this.close(); + // set the placeholder if necessary + this.clearSearch(); + } + if (this.select || this.opts.element.val() !== "") { + var self = this; + this.opts.initSelection.call(null, this.opts.element, function(data){ + if (data !== undefined && data !== null) { + self.updateSelection(data); + self.close(); + // set the placeholder if necessary + self.clearSearch(); + } + }); + } + }, + + // multi + clearSearch: function () { + var placeholder = this.getPlaceholder(), + maxWidth = this.getMaxSearchWidth(); + + if (placeholder !== undefined && this.getVal().length === 0 && this.search.hasClass("select2-focused") === false) { + this.search.val(placeholder).addClass("select2-default"); + // stretch the search box to full width of the container so as much of the placeholder is visible as possible + // we could call this.resizeSearch(), but we do not because that requires a sizer and we do not want to create one so early because of a firefox bug, see #944 + this.search.width(maxWidth > 0 ? maxWidth : this.container.css("width")); + } else { + this.search.val("").width(10); + } + }, + + // multi + clearPlaceholder: function () { + if (this.search.hasClass("select2-default")) { + this.search.val("").removeClass("select2-default"); + } + }, + + // multi + opening: function () { + this.clearPlaceholder(); // should be done before super so placeholder is not used to search + this.resizeSearch(); + + this.parent.opening.apply(this, arguments); + + this.focusSearch(); + + this.updateResults(true); + this.search.focus(); + this.opts.element.trigger($.Event("select2-open")); + }, + + // multi + close: function () { + if (!this.opened()) return; + this.parent.close.apply(this, arguments); + }, + + // multi + focus: function () { + this.close(); + this.search.focus(); + //this.opts.element.triggerHandler("focus"); + }, + + // multi + isFocused: function () { + return this.search.hasClass("select2-focused"); + }, + + // multi + updateSelection: function (data) { + var ids = [], filtered = [], self = this; + + // filter out duplicates + $(data).each(function () { + if (indexOf(self.id(this), ids) < 0) { + ids.push(self.id(this)); + filtered.push(this); + } + }); + data = filtered; + + this.selection.find(".select2-search-choice").remove(); + $(data).each(function () { + self.addSelectedChoice(this); + }); + self.postprocessResults(); + }, + + // multi + tokenize: function() { + var input = this.search.val(); + input = this.opts.tokenizer(input, this.data(), this.bind(this.onSelect), this.opts); + if (input != null && input != undefined) { + this.search.val(input); + if (input.length > 0) { + this.open(); + } + } + + }, + + // multi + onSelect: function (data, options) { + + if (!this.triggerSelect(data)) { return; } + + this.addSelectedChoice(data); + + this.opts.element.trigger({ type: "selected", val: this.id(data), choice: data }); + + if (this.select || !this.opts.closeOnSelect) this.postprocessResults(); + + if (this.opts.closeOnSelect) { + this.close(); + this.search.width(10); + } else { + if (this.countSelectableResults()>0) { + this.search.width(10); + this.resizeSearch(); + if (this.getMaximumSelectionSize() > 0 && this.val().length >= this.getMaximumSelectionSize()) { + // if we reached max selection size repaint the results so choices + // are replaced with the max selection reached message + this.updateResults(true); + } + this.positionDropdown(); + } else { + // if nothing left to select close + this.close(); + this.search.width(10); + } + } + + // since its not possible to select an element that has already been + // added we do not need to check if this is a new element before firing change + this.triggerChange({ added: data }); + + if (!options || !options.noFocus) + this.focusSearch(); + }, + + // multi + cancel: function () { + this.close(); + this.focusSearch(); + }, + + addSelectedChoice: function (data) { + var enableChoice = !data.locked, + enabledItem = $( + "<li class='select2-search-choice'>" + + " <div></div>" + + " <a href='#' onclick='return false;' class='select2-search-choice-close' tabindex='-1'></a>" + + "</li>"), + disabledItem = $( + "<li class='select2-search-choice select2-locked'>" + + "<div></div>" + + "</li>"); + var choice = enableChoice ? enabledItem : disabledItem, + id = this.id(data), + val = this.getVal(), + formatted; + + formatted=this.opts.formatSelection(data, choice.find("div")); + if (formatted != undefined) { + choice.find("div").replaceWith("<div title='"+this.opts.escapeMarkup(formatted)+"'>"+this.opts.escapeMarkup(formatted)+"</div>"); + } + + if(enableChoice){ + choice.find(".select2-search-choice-close") + .on("mousedown", killEvent) + .on("click dblclick", this.bind(function (e) { + if (!this.isInterfaceEnabled()) return; + + $(e.target).closest(".select2-search-choice").fadeOut('fast', this.bind(function(){ + this.unselect($(e.target)); + this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus"); + this.close(); + this.focusSearch(); + })).dequeue(); + killEvent(e); + })).on("focus", this.bind(function () { + if (!this.isInterfaceEnabled()) return; + this.container.addClass("select2-container-active"); + this.dropdown.addClass("select2-drop-active"); + })); + } + + choice.data("select2-data", data); + choice.insertBefore(this.searchContainer); + + val.push(id); + this.setVal(val); + }, + + // multi + unselect: function (selected) { + var val = this.getVal(), + data, + index; + + selected = selected.closest(".select2-search-choice"); + + if (selected.length === 0) { + throw "Invalid argument: " + selected + ". Must be .select2-search-choice"; + } + + data = selected.data("select2-data"); + + if (!data) { + // prevent a race condition when the 'x' is clicked really fast repeatedly the event can be queued + // and invoked on an element already removed + return; + } + + index = indexOf(this.id(data), val); + + if (index >= 0) { + val.splice(index, 1); + this.setVal(val); + if (this.select) this.postprocessResults(); + } + selected.remove(); + + this.opts.element.trigger({ type: "removed", val: this.id(data), choice: data }); + this.triggerChange({ removed: data }); + }, + + // multi + postprocessResults: function (data, initial, noHighlightUpdate) { + var val = this.getVal(), + choices = this.results.find(".select2-result"), + compound = this.results.find(".select2-result-with-children"), + self = this; + + choices.each2(function (i, choice) { + var id = self.id(choice.data("select2-data")); + if (indexOf(id, val) >= 0) { + choice.addClass("select2-selected"); + // mark all children of the selected parent as selected + choice.find(".select2-result-selectable").addClass("select2-selected"); + } + }); + + compound.each2(function(i, choice) { + // hide an optgroup if it doesnt have any selectable children + if (!choice.is('.select2-result-selectable') + && choice.find(".select2-result-selectable:not(.select2-selected)").length === 0) { + choice.addClass("select2-selected"); + } + }); + + if (this.highlight() == -1 && noHighlightUpdate !== false){ + self.highlight(0); + } + + //If all results are chosen render formatNoMAtches + if(!this.opts.createSearchChoice && !choices.filter('.select2-result:not(.select2-selected)').length > 0){ + this.results.append("<li class='select2-no-results'>" + self.opts.formatNoMatches(self.search.val()) + "</li>"); + } + + }, + + // multi + getMaxSearchWidth: function() { + return this.selection.width() - getSideBorderPadding(this.search); + }, + + // multi + resizeSearch: function () { + var minimumWidth, left, maxWidth, containerLeft, searchWidth, + sideBorderPadding = getSideBorderPadding(this.search); + + minimumWidth = measureTextWidth(this.search) + 10; + + left = this.search.offset().left; + + maxWidth = this.selection.width(); + containerLeft = this.selection.offset().left; + + searchWidth = maxWidth - (left - containerLeft) - sideBorderPadding; + + if (searchWidth < minimumWidth) { + searchWidth = maxWidth - sideBorderPadding; + } + + if (searchWidth < 40) { + searchWidth = maxWidth - sideBorderPadding; + } + + if (searchWidth <= 0) { + searchWidth = minimumWidth; + } + + this.search.width(searchWidth); + }, + + // multi + getVal: function () { + var val; + if (this.select) { + val = this.select.val(); + return val === null ? [] : val; + } else { + val = this.opts.element.val(); + return splitVal(val, this.opts.separator); + } + }, + + // multi + setVal: function (val) { + var unique; + if (this.select) { + this.select.val(val); + } else { + unique = []; + // filter out duplicates + $(val).each(function () { + if (indexOf(this, unique) < 0) unique.push(this); + }); + this.opts.element.val(unique.length === 0 ? "" : unique.join(this.opts.separator)); + } + }, + + // multi + buildChangeDetails: function (old, current) { + var current = current.slice(0), + old = old.slice(0); + + // remove intersection from each array + for (var i = 0; i < current.length; i++) { + for (var j = 0; j < old.length; j++) { + if (equal(this.opts.id(current[i]), this.opts.id(old[j]))) { + current.splice(i, 1); + i--; + old.splice(j, 1); + j--; + } + } + } + + return {added: current, removed: old}; + }, + + + // multi + val: function (val, triggerChange) { + var oldData, self=this, changeDetails; + + if (arguments.length === 0) { + return this.getVal(); + } + + oldData=this.data(); + if (!oldData.length) oldData=[]; + + // val is an id. !val is true for [undefined,null,'',0] - 0 is legal + if (!val && val !== 0) { + this.opts.element.val(""); + this.updateSelection([]); + this.clearSearch(); + if (triggerChange) { + this.triggerChange({added: this.data(), removed: oldData}); + } + return; + } + + // val is a list of ids + this.setVal(val); + + if (this.select) { + this.opts.initSelection(this.select, this.bind(this.updateSelection)); + if (triggerChange) { + this.triggerChange(this.buildChangeDetails(oldData, this.data())); + } + } else { + if (this.opts.initSelection === undefined) { + throw new Error("val() cannot be called if initSelection() is not defined"); + } + + this.opts.initSelection(this.opts.element, function(data){ + var ids=$(data).map(self.id); + self.setVal(ids); + self.updateSelection(data); + self.clearSearch(); + if (triggerChange) { + self.triggerChange(this.buildChangeDetails(oldData, this.data())); + } + }); + } + this.clearSearch(); + }, + + // multi + onSortStart: function() { + if (this.select) { + throw new Error("Sorting of elements is not supported when attached to <select>. Attach to <input type='hidden'/> instead."); + } + + // collapse search field into 0 width so its container can be collapsed as well + this.search.width(0); + // hide the container + this.searchContainer.hide(); + }, + + // multi + onSortEnd:function() { + + var val=[], self=this; + + // show search and move it to the end of the list + this.searchContainer.show(); + // make sure the search container is the last item in the list + this.searchContainer.appendTo(this.searchContainer.parent()); + // since we collapsed the width in dragStarted, we resize it here + this.resizeSearch(); + + // update selection + + this.selection.find(".select2-search-choice").each(function() { + val.push(self.opts.id($(this).data("select2-data"))); + }); + this.setVal(val); + this.triggerChange(); + }, + + // multi + data: function(values, triggerChange) { + var self=this, ids, old; + if (arguments.length === 0) { + return this.selection + .find(".select2-search-choice") + .map(function() { return $(this).data("select2-data"); }) + .get(); + } else { + old = this.data(); + if (!values) { values = []; } + ids = $.map(values, function(e) { return self.opts.id(e); }); + this.setVal(ids); + this.updateSelection(values); + this.clearSearch(); + if (triggerChange) { + this.triggerChange(this.buildChangeDetails(old, this.data())); + } + } + } + }); + + $.fn.select2 = function () { + + var args = Array.prototype.slice.call(arguments, 0), + opts, + select2, + value, multiple, + allowedMethods = ["val", "destroy", "opened", "open", "close", "focus", "isFocused", "container", "onSortStart", "onSortEnd", "enable", "readonly", "positionDropdown", "data"], + valueMethods = ["val", "opened", "isFocused", "container", "data"]; + + this.each(function () { + if (args.length === 0 || typeof(args[0]) === "object") { + opts = args.length === 0 ? {} : $.extend({}, args[0]); + opts.element = $(this); + + if (opts.element.get(0).tagName.toLowerCase() === "select") { + multiple = opts.element.prop("multiple"); + } else { + multiple = opts.multiple || false; + if ("tags" in opts) {opts.multiple = multiple = true;} + } + + select2 = multiple ? new MultiSelect2() : new SingleSelect2(); + select2.init(opts); + } else if (typeof(args[0]) === "string") { + + if (indexOf(args[0], allowedMethods) < 0) { + throw "Unknown method: " + args[0]; + } + + value = undefined; + select2 = $(this).data("select2"); + if (select2 === undefined) return; + if (args[0] === "container") { + value=select2.container; + } else { + value = select2[args[0]].apply(select2, args.slice(1)); + } + if (indexOf(args[0], valueMethods) >= 0) { + return false; + } + } else { + throw "Invalid arguments to select2 plugin: " + args; + } + }); + return (value === undefined) ? this : value; + }; + + // plugin defaults, accessible to users + $.fn.select2.defaults = { + open_value: false, + width: "copy", + loadMorePadding: 0, + closeOnSelect: true, + openOnEnter: true, + containerCss: {}, + dropdownCss: {}, + containerCssClass: "", + dropdownCssClass: "", + formatResult: function(result, container, query, escapeMarkup) { + var markup=[]; + markMatch(result.text, query.term, markup, escapeMarkup); + return markup.join(""); + }, + formatSelection: function (data, container) { + return data ? data.text : undefined; + }, + sortResults: function (results, container, query) { + return results; + }, + formatResultCssClass: function(data) {return undefined;}, + formatNoMatches: function () { return "No matches found"; }, + formatInputTooShort: function (input, min) { var n = min - input.length; return "Please enter " + n + " more character" + (n == 1? "" : "s"); }, + formatInputTooLong: function (input, max) { var n = input.length - max; return "Please delete " + n + " character" + (n == 1? "" : "s"); }, + formatSelectionTooBig: function (limit) { return "You can only select " + limit + " item" + (limit == 1 ? "" : "s"); }, + formatLoadMore: function (pageNumber) { return "Loading more results..."; }, + formatSearching: function () { return "Searching..."; }, + minimumResultsForSearch: 0, + minimumInputLength: 0, + maximumInputLength: null, + maximumSelectionSize: 0, + id: function (e) { return e.id; }, + matcher: function(term, text) { + return (''+text).toUpperCase().indexOf((''+term).toUpperCase()) >= 0; + }, + separator: ",", + tokenSeparators: [], + tokenizer: defaultTokenizer, + escapeMarkup: function (markup) { + var replace_map = { + '\\': '\', + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + "/": '/' + }; + + return String(markup).replace(/[&<>"'\/\\]/g, function (match) { + return replace_map[match]; + }); + }, + blurOnChange: false, + selectOnBlur: false, + adaptContainerCssClass: function(c) { return c; }, + adaptDropdownCssClass: function(c) { return null; } + }; + + $.fn.select2.ajaxDefaults = { + transport: $.ajax, + params: { + type: "GET", + cache: false, + dataType: "json" + } + }; + + // exports + window.Select2 = { + query: { + ajax: ajax, + local: local, + tags: tags + }, util: { + debounce: debounce, + markMatch: markMatch + }, "class": { + "abstract": AbstractSelect2, + "single": SingleSelect2, + "multi": MultiSelect2 + } + }; + +}(jQuery)); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/bootstrap-typeahead.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/bootstrap-typeahead.js new file mode 100644 index 0000000000000000000000000000000000000000..01c2936ae4f0e15fd10faf53d00f1a621d5dc82a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/bootstrap-typeahead.js @@ -0,0 +1,587 @@ +// ---------------------------------------------------------------------------- +// +// bootstrap-typeahead.js +// +// Twitter Bootstrap Typeahead Plugin +// v1.2.2 +// https://github.com/tcrosen/twitter-bootstrap-typeahead +// +// +// Author +// ---------- +// Terry Rosen +// tcrosen@gmail.com | @rerrify | github.com/tcrosen/ +// +// +// Description +// ---------- +// Custom implementation of Twitter's Bootstrap Typeahead Plugin +// http://twitter.github.com/bootstrap/javascript.html#typeahead +// +// +// Requirements +// ---------- +// jQuery 1.7+ +// Twitter Bootstrap 2.0+ +// +// ---------------------------------------------------------------------------- + +! +function ($) { + + "use strict"; + + //------------------------------------------------------------------ + // + // Constructor + // + var Typeahead = function (element, options) { + this.$element = $(element); + this.options = $.extend(true, {}, $.fn.typeahead.defaults, options); + this.$menu = $(this.options.menu).appendTo('body'); + this.shown = false; + + // Method overrides + this.eventSupported = this.options.eventSupported || this.eventSupported; + this.grepper = this.options.grepper || this.grepper; + this.highlighter = this.options.highlighter || this.highlighter; + this.lookup = this.options.lookup || this.lookup; + this.matcher = this.options.matcher || this.matcher; + this.render = this.options.render || this.render; + this.select = this.options.select || this.select; + this.sorter = this.options.sorter || this.sorter; + this.source = this.options.source || this.source; + + if (!this.source.length) { + var ajax = this.options.ajax; + + if (typeof ajax === 'string') { + this.ajax = $.extend({}, $.fn.typeahead.defaults.ajax, { url: ajax }); + } else { + this.ajax = $.extend({}, $.fn.typeahead.defaults.ajax, ajax); + } + + if (!this.ajax.url) { + this.ajax = null; + } + } + + this.listen(); + } + + Typeahead.prototype = { + + constructor: Typeahead, + + //============================================================================================================= + // + // Utils + // + //============================================================================================================= + + //------------------------------------------------------------------ + // + // Check if an event is supported by the browser eg. 'keypress' + // * This was included to handle the "exhaustive deprecation" of jQuery.browser in jQuery 1.8 + // + eventSupported: function(eventName) { + var isSupported = (eventName in this.$element); + + if (!isSupported) { + this.$element.setAttribute(eventName, 'return;'); + isSupported = typeof this.$element[eventName] === 'function'; + } + + return isSupported; + }, + + //============================================================================================================= + // + // AJAX + // + //============================================================================================================= + + //------------------------------------------------------------------ + // + // Handle AJAX source + // + ajaxer: function () { + var that = this, + query = that.$element.val(); + + if (query === that.query) { + return that; + } + + // Query changed + that.query = query; + + // Cancel last timer if set + if (that.ajax.timerId) { + clearTimeout(that.ajax.timerId); + that.ajax.timerId = null; + } + + if (!query || query.length < that.ajax.triggerLength) { + // Cancel the ajax callback if in progress + if (that.ajax.xhr) { + that.ajax.xhr.abort(); + that.ajax.xhr = null; + that.ajaxToggleLoadClass(false); + } + + return that.shown ? that.hide() : that; + } + + // Query is good to send, set a timer + that.ajax.timerId = setTimeout(function() { + $.proxy(that.ajaxExecute(query), that) + }, that.ajax.timeout); + + return that; + }, + + //------------------------------------------------------------------ + // + // Execute an AJAX request + // + ajaxExecute: function(query) { + this.ajaxToggleLoadClass(true); + + // Cancel last call if already in progress + if (this.ajax.xhr) this.ajax.xhr.abort(); + + var params = this.ajax.preDispatch ? this.ajax.preDispatch(query) : { query : query }; + var jAjax = (this.ajax.method === "post") ? $.post : $.get; + this.ajax.xhr = jAjax(this.ajax.url, params, $.proxy(this.ajaxLookup, this)); + this.ajax.timerId = null; + }, + + //------------------------------------------------------------------ + // + // Perform a lookup in the AJAX results + // + ajaxLookup: function (data) { + var items; + + this.ajaxToggleLoadClass(false); + + if (!this.ajax.xhr) return; + + if (this.ajax.preProcess) { + data = this.ajax.preProcess(data); + } + + // Save for selection retreival + this.ajax.data = data; + + items = this.grepper(this.ajax.data); + + if (!items || !items.length) { + return this.shown ? this.hide() : this; + } + + this.ajax.xhr = null; + + return this.render(items.slice(0, this.options.items)).show(); + }, + + //------------------------------------------------------------------ + // + // Toggle the loading class + // + ajaxToggleLoadClass: function (enable) { + if (!this.ajax.loadingClass) return; + this.$element.toggleClass(this.ajax.loadingClass, enable); + }, + + //============================================================================================================= + // + // Data manipulation + // + //============================================================================================================= + + //------------------------------------------------------------------ + // + // Search source + // + lookup: function (event) { + var that = this, + items; + + if (that.ajax) { + that.ajaxer(); + } + else { + that.query = that.$element.val(); + + if (!that.query) { + return that.shown ? that.hide() : that; + } + if(typeof that.source == 'function') + items = that.grepper(that.source()); + else items = that.grepper(that.source); + + if (!items || !items.length) { + return that.shown ? that.hide() : that; + } + + return that.render(items.slice(0, that.options.items)).show(); + } + }, + + //------------------------------------------------------------------ + // + // Filters relevent results + // + grepper: function(data) { + var that = this, + items; + + if (data && data.length && !data[0].hasOwnProperty(that.options.display)) { + return null; + } + + items = $.grep(data, function (item) { + return that.matcher(item[that.options.display], item); + }); + + return this.sorter(items); + }, + + //------------------------------------------------------------------ + // + // Looks for a match in the source + // + matcher: function (item) { + return ~item.toLowerCase().indexOf(this.query.toLowerCase()); + }, + + //------------------------------------------------------------------ + // + // Sorts the results + // + sorter: function (items) { + var that = this, + beginswith = [], + caseSensitive = [], + caseInsensitive = [], + item; + + while (item = items.shift()) { + if (!item[that.options.display].toLowerCase().indexOf(this.query.toLowerCase())) { + beginswith.push(item); + } + else if (~item[that.options.display].indexOf(this.query)) { + caseSensitive.push(item); + } + else { + caseInsensitive.push(item); + } + } + + return beginswith.concat(caseSensitive, caseInsensitive); + }, + + //============================================================================================================= + // + // DOM manipulation + // + //============================================================================================================= + + //------------------------------------------------------------------ + // + // Shows the results list + // + show: function () { + var pos = $.extend({}, this.$element.offset(), { + height: this.$element[0].offsetHeight + }); + + this.$menu.css({ + top: pos.top + pos.height, + left: pos.left + }); + + this.$menu.show(); + this.shown = true; + + return this; + }, + + //------------------------------------------------------------------ + // + // Hides the results list + // + hide: function () { + this.$menu.hide(); + this.shown = false; + return this; + }, + + //------------------------------------------------------------------ + // + // Highlights the match(es) within the results + // + highlighter: function (item) { + var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&'); + return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) { + return '<strong>' + match + '</strong>'; + }); + }, + + //------------------------------------------------------------------ + // + // Renders the results list + // + render: function (items) { + var that = this; + + items = $(items).map(function (i, item) { + i = $(that.options.item).attr('data-value', item[that.options.val]); + i.find('a').html(that.highlighter(item[that.options.display], item)); + return i[0]; + }); + + items.first().addClass('active'); + this.$menu.html(items); + return this; + }, + + //------------------------------------------------------------------ + // + // Item is selected + // + select: function () { + var $selectedItem = this.$menu.find('.active'); + this.$element.val($selectedItem.text()).change(); + this.options.itemSelected($selectedItem, $selectedItem.attr('data-value'), $selectedItem.text()); + return this.hide(); + }, + + //------------------------------------------------------------------ + // + // Selects the next result + // + next: function (event) { + var active = this.$menu.find('.active').removeClass('active'); + var next; + + if(!active.length) + next = $(this.$menu.find('li')[0]); + else + next = active.next(); + if (!next.length) + next = null; + else + next.addClass('active'); + }, + + //------------------------------------------------------------------ + // + // Selects the previous result + // + prev: function (event) { + var active = this.$menu.find('.active').removeClass('active'); + var prev; + + if(!active.length) + prev = this.$menu.find('li').last(); + else + prev = active.prev(); + if (!prev.length) + prev = null; + else + prev.addClass('active'); + }, + + //============================================================================================================= + // + // Events + // + //============================================================================================================= + + //------------------------------------------------------------------ + // + // Listens for user events + // + listen: function () { + this.$element.on('blur', $.proxy(this.blur, this)) + .on('keyup', $.proxy(this.keyup, this)); + + if (this.eventSupported('keydown')) { + this.$element.on('keydown', $.proxy(this.keypress, this)); + } else { + this.$element.on('keypress', $.proxy(this.keypress, this)); + } + + this.$menu.on('click', $.proxy(this.click, this)) + .on('mouseenter', 'li', $.proxy(this.mouseenter, this)); + }, + + //------------------------------------------------------------------ + // + // Handles a key being raised up + // + keyup: function (e) { + e.stopPropagation(); + e.preventDefault(); + + switch (e.keyCode) { + case 40: + // down arrow + case 38: + // up arrow + break; + case 9: + // tab + case 13: + // enter + if (!this.shown) { + return; + } + this.select(); + break; + case 27: + // escape + this.hide(); + break; + default: + this.lookup(); + } + }, + + //------------------------------------------------------------------ + // + // Handles a key being pressed + // + keypress: function (e) { + e.stopPropagation(); + if (!this.shown) { + return; + } + + switch (e.keyCode) { + case 9: + // tab + case 13: + // enter + case 27: + // escape + e.preventDefault(); + break; + case 38: + // up arrow + e.preventDefault(); + this.prev(); + break; + case 40: + // down arrow + e.preventDefault(); + this.next(); + break; + } + }, + + //------------------------------------------------------------------ + // + // Handles cursor exiting the textbox + // + blur: function (e) { + var that = this; + e.stopPropagation(); + e.preventDefault(); + setTimeout(function () { + if (!that.$menu.is(':focus')) { + that.hide(); + } + }, 150) + }, + + //------------------------------------------------------------------ + // + // Handles clicking on the results list + // + click: function (e) { + e.stopPropagation(); + e.preventDefault(); + this.select(); + }, + + //------------------------------------------------------------------ + // + // Handles the mouse entering the results list + // + mouseenter: function (e) { + this.$menu.find('.active').removeClass('active'); + $(e.currentTarget).addClass('active'); + } + } + + //------------------------------------------------------------------ + // + // Plugin definition + // + $.fn.typeahead = function (option) { + return this.each(function () { + var $this = $(this), + data = $this.data('typeahead'), + options = typeof option === 'object' && option; + + if (!data) { + $this.data('typeahead', (data = new Typeahead(this, options))); + } + + if (typeof option === 'string') { + data[option](); + } + }); + } + + //------------------------------------------------------------------ + // + // Defaults + // + $.fn.typeahead.defaults = { + source: [], + items: 8, + menu: '<ul class="typeahead dropdown-menu"></ul>', + item: '<li><a href="#"></a></li>', + display: 'name', + val: 'id', + itemSelected: function () { }, + ajax: { + url: null, + timeout: 300, + method: 'post', + triggerLength: 3, + loadingClass: null, + displayField: null, + preDispatch: null, + preProcess: null + } + } + + $.fn.typeahead.Constructor = Typeahead; + + //------------------------------------------------------------------ + // + // DOM-ready call for the Data API (no-JS implementation) + // + // Note: As of Bootstrap v2.0 this feature may be disabled using $('body').off('.data-api') + // More info here: https://github.com/twitter/bootstrap/tree/master/js + // + $(function () { + $('body').on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) { + var $this = $(this); + + if ($this.data('typeahead')) { + return; + } + + e.preventDefault(); + $this.typeahead($this.data()); + }) + }); + +} (window.jQuery); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/bootstrap.min.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/bootstrap.min.js new file mode 100644 index 0000000000000000000000000000000000000000..e46796045fde1ce5ad3dd89b7cb01a2810280e99 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/bootstrap.min.js @@ -0,0 +1,7 @@ +/** +* Bootstrap.js by @fat & @mdo +* plugins: bootstrap-transition.js, bootstrap-modal.js, bootstrap-dropdown.js, bootstrap-scrollspy.js, bootstrap-tab.js, bootstrap-tooltip.js, bootstrap-popover.js, bootstrap-affix.js, bootstrap-alert.js, bootstrap-button.js, bootstrap-collapse.js, bootstrap-carousel.js, bootstrap-typeahead.js +* Copyright 2012 Twitter, Inc. +* http://www.apache.org/licenses/LICENSE-2.0.txt +*/ +!function(a){a(function(){a.support.transition=function(){var a=function(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},c;for(c in b)if(a.style[c]!==undefined)return b[c]}();return a&&{end:a}}()})}(window.jQuery),!function(a){var b=function(b,c){this.options=c,this.$element=a(b).delegate('[data-dismiss="modal"]',"click.dismiss.modal",a.proxy(this.hide,this)),this.options.remote&&this.$element.find(".modal-body").load(this.options.remote)};b.prototype={constructor:b,toggle:function(){return this[this.isShown?"hide":"show"]()},show:function(){var b=this,c=a.Event("show");this.$element.trigger(c);if(this.isShown||c.isDefaultPrevented())return;this.isShown=!0,this.escape(),this.backdrop(function(){var c=a.support.transition&&b.$element.hasClass("fade");b.$element.parent().length||b.$element.appendTo(document.body),b.$element.show(),c&&b.$element[0].offsetWidth,b.$element.addClass("in").attr("aria-hidden",!1),b.enforceFocus(),c?b.$element.one(a.support.transition.end,function(){b.$element.focus().trigger("shown")}):b.$element.focus().trigger("shown")})},hide:function(b){b&&b.preventDefault();var c=this;b=a.Event("hide"),this.$element.trigger(b);if(!this.isShown||b.isDefaultPrevented())return;this.isShown=!1,this.escape(),a(document).off("focusin.modal"),this.$element.removeClass("in").attr("aria-hidden",!0),a.support.transition&&this.$element.hasClass("fade")?this.hideWithTransition():this.hideModal()},enforceFocus:function(){var b=this;a(document).on("focusin.modal",function(a){b.$element[0]!==a.target&&!b.$element.has(a.target).length&&b.$element.focus()})},escape:function(){var a=this;this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.modal",function(b){b.which==27&&a.hide()}):this.isShown||this.$element.off("keyup.dismiss.modal")},hideWithTransition:function(){var b=this,c=setTimeout(function(){b.$element.off(a.support.transition.end),b.hideModal()},500);this.$element.one(a.support.transition.end,function(){clearTimeout(c),b.hideModal()})},hideModal:function(a){this.$element.hide().trigger("hidden"),this.backdrop()},removeBackdrop:function(){this.$backdrop.remove(),this.$backdrop=null},backdrop:function(b){var c=this,d=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var e=a.support.transition&&d;this.$backdrop=a('<div class="modal-backdrop '+d+'" />').appendTo(document.body),this.$backdrop.click(this.options.backdrop=="static"?a.proxy(this.$element[0].focus,this.$element[0]):a.proxy(this.hide,this)),e&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),e?this.$backdrop.one(a.support.transition.end,b):b()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(a.support.transition.end,a.proxy(this.removeBackdrop,this)):this.removeBackdrop()):b&&b()}};var c=a.fn.modal;a.fn.modal=function(c){return this.each(function(){var d=a(this),e=d.data("modal"),f=a.extend({},a.fn.modal.defaults,d.data(),typeof c=="object"&&c);e||d.data("modal",e=new b(this,f)),typeof c=="string"?e[c]():f.show&&e.show()})},a.fn.modal.defaults={backdrop:!0,keyboard:!0,show:!0},a.fn.modal.Constructor=b,a.fn.modal.noConflict=function(){return a.fn.modal=c,this},a(document).on("click.modal.data-api",'[data-toggle="modal"]',function(b){var c=a(this),d=c.attr("href"),e=a(c.attr("data-target")||d&&d.replace(/.*(?=#[^\s]+$)/,"")),f=e.data("modal")?"toggle":a.extend({remote:!/#/.test(d)&&d},e.data(),c.data());b.preventDefault(),e.modal(f).one("hide",function(){c.focus()})})}(window.jQuery),!function(a){function d(){a(b).each(function(){e(a(this)).removeClass("open")})}function e(b){var c=b.attr("data-target"),d;return c||(c=b.attr("href"),c=c&&/#/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,"")),d=a(c),d.length||(d=b.parent()),d}var b="[data-toggle=dropdown]",c=function(b){var c=a(b).on("click.dropdown.data-api",this.toggle);a("html").on("click.dropdown.data-api",function(){c.parent().removeClass("open")})};c.prototype={constructor:c,toggle:function(b){var c=a(this),f,g;if(c.is(".disabled, :disabled"))return;return f=e(c),g=f.hasClass("open"),d(),g||f.toggleClass("open"),c.focus(),!1},keydown:function(b){var c,d,f,g,h,i;if(!/(38|40|27)/.test(b.keyCode))return;c=a(this),b.preventDefault(),b.stopPropagation();if(c.is(".disabled, :disabled"))return;g=e(c),h=g.hasClass("open");if(!h||h&&b.keyCode==27)return c.click();d=a("[role=menu] li:not(.divider):visible a",g);if(!d.length)return;i=d.index(d.filter(":focus")),b.keyCode==38&&i>0&&i--,b.keyCode==40&&i<d.length-1&&i++,~i||(i=0),d.eq(i).focus()}};var f=a.fn.dropdown;a.fn.dropdown=function(b){return this.each(function(){var d=a(this),e=d.data("dropdown");e||d.data("dropdown",e=new c(this)),typeof b=="string"&&e[b].call(d)})},a.fn.dropdown.Constructor=c,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=f,this},a(document).on("click.dropdown.data-api touchstart.dropdown.data-api",d).on("click.dropdown touchstart.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("touchstart.dropdown.data-api",".dropdown-menu",function(a){a.stopPropagation()}).on("click.dropdown.data-api touchstart.dropdown.data-api",b,c.prototype.toggle).on("keydown.dropdown.data-api touchstart.dropdown.data-api",b+", [role=menu]",c.prototype.keydown)}(window.jQuery),!function(a){function b(b,c){var d=a.proxy(this.process,this),e=a(b).is("body")?a(window):a(b),f;this.options=a.extend({},a.fn.scrollspy.defaults,c),this.$scrollElement=e.on("scroll.scroll-spy.data-api",d),this.selector=(this.options.target||(f=a(b).attr("href"))&&f.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.$body=a("body"),this.refresh(),this.process()}b.prototype={constructor:b,refresh:function(){var b=this,c;this.offsets=a([]),this.targets=a([]),c=this.$body.find(this.selector).map(function(){var c=a(this),d=c.data("target")||c.attr("href"),e=/^#\w/.test(d)&&a(d);return e&&e.length&&[[e.position().top+b.$scrollElement.scrollTop(),d]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},process:function(){var a=this.$scrollElement.scrollTop()+this.options.offset,b=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,c=b-this.$scrollElement.height(),d=this.offsets,e=this.targets,f=this.activeTarget,g;if(a>=c)return f!=(g=e.last()[0])&&this.activate(g);for(g=d.length;g--;)f!=e[g]&&a>=d[g]&&(!d[g+1]||a<=d[g+1])&&this.activate(e[g])},activate:function(b){var c,d;this.activeTarget=b,a(this.selector).parent(".active").removeClass("active"),d=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',c=a(d).parent("li").addClass("active"),c.parent(".dropdown-menu").length&&(c=c.closest("li.dropdown").addClass("active")),c.trigger("activate")}};var c=a.fn.scrollspy;a.fn.scrollspy=function(c){return this.each(function(){var d=a(this),e=d.data("scrollspy"),f=typeof c=="object"&&c;e||d.data("scrollspy",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.scrollspy.Constructor=b,a.fn.scrollspy.defaults={offset:10},a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=c,this},a(window).on("load",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);b.scrollspy(b.data())})})}(window.jQuery),!function(a){var b=function(b){this.element=a(b)};b.prototype={constructor:b,show:function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.attr("data-target"),e,f,g;d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,""));if(b.parent("li").hasClass("active"))return;e=c.find(".active:last a")[0],g=a.Event("show",{relatedTarget:e}),b.trigger(g);if(g.isDefaultPrevented())return;f=a(d),this.activate(b.parent("li"),c),this.activate(f,f.parent(),function(){b.trigger({type:"shown",relatedTarget:e})})},activate:function(b,c,d){function g(){e.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),f?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var e=c.find("> .active"),f=d&&a.support.transition&&e.hasClass("fade");f?e.one(a.support.transition.end,g):g(),e.removeClass("in")}};var c=a.fn.tab;a.fn.tab=function(c){return this.each(function(){var d=a(this),e=d.data("tab");e||d.data("tab",e=new b(this)),typeof c=="string"&&e[c]()})},a.fn.tab.Constructor=b,a.fn.tab.noConflict=function(){return a.fn.tab=c,this},a(document).on("click.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(b){b.preventDefault(),a(this).tab("show")})}(window.jQuery),!function(a){var b=function(a,b){this.init("tooltip",a,b)};b.prototype={constructor:b,init:function(b,c,d){var e,f;this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.enabled=!0,this.options.trigger=="click"?this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this)):this.options.trigger!="manual"&&(e=this.options.trigger=="hover"?"mouseenter":"focus",f=this.options.trigger=="hover"?"mouseleave":"blur",this.$element.on(e+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(f+"."+this.type,this.options.selector,a.proxy(this.leave,this))),this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},getOptions:function(b){return b=a.extend({},a.fn[this.type].defaults,b,this.$element.data()),b.delay&&typeof b.delay=="number"&&(b.delay={show:b.delay,hide:b.delay}),b},enter:function(b){var c=a(b.currentTarget)[this.type](this._options).data(this.type);if(!c.options.delay||!c.options.delay.show)return c.show();clearTimeout(this.timeout),c.hoverState="in",this.timeout=setTimeout(function(){c.hoverState=="in"&&c.show()},c.options.delay.show)},leave:function(b){var c=a(b.currentTarget)[this.type](this._options).data(this.type);this.timeout&&clearTimeout(this.timeout);if(!c.options.delay||!c.options.delay.hide)return c.hide();c.hoverState="out",this.timeout=setTimeout(function(){c.hoverState=="out"&&c.hide()},c.options.delay.hide)},show:function(){var a,b,c,d,e,f,g;if(this.hasContent()&&this.enabled){a=this.tip(),this.setContent(),this.options.animation&&a.addClass("fade"),f=typeof this.options.placement=="function"?this.options.placement.call(this,a[0],this.$element[0]):this.options.placement,b=/in/.test(f),a.detach().css({top:0,left:0,display:"block"}).insertAfter(this.$element),c=this.getPosition(b),d=a[0].offsetWidth,e=a[0].offsetHeight;switch(b?f.split(" ")[1]:f){case"bottom":g={top:c.top+c.height,left:c.left+c.width/2-d/2};break;case"top":g={top:c.top-e,left:c.left+c.width/2-d/2};break;case"left":g={top:c.top+c.height/2-e/2,left:c.left-d};break;case"right":g={top:c.top+c.height/2-e/2,left:c.left+c.width}}a.offset(g).addClass(f).addClass("in")}},setContent:function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},hide:function(){function d(){var b=setTimeout(function(){c.off(a.support.transition.end).detach()},500);c.one(a.support.transition.end,function(){clearTimeout(b),c.detach()})}var b=this,c=this.tip();return c.removeClass("in"),a.support.transition&&this.$tip.hasClass("fade")?d():c.detach(),this},fixTitle:function(){var a=this.$element;(a.attr("title")||typeof a.attr("data-original-title")!="string")&&a.attr("data-original-title",a.attr("title")||"").removeAttr("title")},hasContent:function(){return this.getTitle()},getPosition:function(b){return a.extend({},b?{top:0,left:0}:this.$element.offset(),{width:this.$element[0].offsetWidth,height:this.$element[0].offsetHeight})},getTitle:function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||(typeof c.title=="function"?c.title.call(b[0]):c.title),a},tip:function(){return this.$tip=this.$tip||a(this.options.template)},validate:function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled},toggle:function(b){var c=a(b.currentTarget)[this.type](this._options).data(this.type);c[c.tip().hasClass("in")?"hide":"show"]()},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}};var c=a.fn.tooltip;a.fn.tooltip=function(c){return this.each(function(){var d=a(this),e=d.data("tooltip"),f=typeof c=="object"&&c;e||d.data("tooltip",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.tooltip.Constructor=b,a.fn.tooltip.defaults={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover",title:"",delay:0,html:!1},a.fn.tooltip.noConflict=function(){return a.fn.tooltip=c,this}}(window.jQuery),!function(a){var b=function(a,b){this.init("popover",a,b)};b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype,{constructor:b,setContent:function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content")[this.options.html?"html":"text"](c),a.removeClass("fade top bottom left right in")},hasContent:function(){return this.getTitle()||this.getContent()},getContent:function(){var a,b=this.$element,c=this.options;return a=b.attr("data-content")||(typeof c.content=="function"?c.content.call(b[0]):c.content),a},tip:function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}});var c=a.fn.popover;a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("popover"),f=typeof c=="object"&&c;e||d.data("popover",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.popover.Constructor=b,a.fn.popover.defaults=a.extend({},a.fn.tooltip.defaults,{placement:"right",trigger:"click",content:"",template:'<div class="popover"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"></div></div></div>'}),a.fn.popover.noConflict=function(){return a.fn.popover=c,this}}(window.jQuery),!function(a){var b=function(b,c){this.options=a.extend({},a.fn.affix.defaults,c),this.$window=a(window).on("scroll.affix.data-api",a.proxy(this.checkPosition,this)).on("click.affix.data-api",a.proxy(function(){setTimeout(a.proxy(this.checkPosition,this),1)},this)),this.$element=a(b),this.checkPosition()};b.prototype.checkPosition=function(){if(!this.$element.is(":visible"))return;var b=a(document).height(),c=this.$window.scrollTop(),d=this.$element.offset(),e=this.options.offset,f=e.bottom,g=e.top,h="affix affix-top affix-bottom",i;typeof e!="object"&&(f=g=e),typeof g=="function"&&(g=e.top()),typeof f=="function"&&(f=e.bottom()),i=this.unpin!=null&&c+this.unpin<=d.top?!1:f!=null&&d.top+this.$element.height()>=b-f?"bottom":g!=null&&c<=g?"top":!1;if(this.affixed===i)return;this.affixed=i,this.unpin=i=="bottom"?d.top-c:null,this.$element.removeClass(h).addClass("affix"+(i?"-"+i:""))};var c=a.fn.affix;a.fn.affix=function(c){return this.each(function(){var d=a(this),e=d.data("affix"),f=typeof c=="object"&&c;e||d.data("affix",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.affix.Constructor=b,a.fn.affix.defaults={offset:0},a.fn.affix.noConflict=function(){return a.fn.affix=c,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var b=a(this),c=b.data();c.offset=c.offset||{},c.offsetBottom&&(c.offset.bottom=c.offsetBottom),c.offsetTop&&(c.offset.top=c.offsetTop),b.affix(c)})})}(window.jQuery),!function(a){var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype.close=function(b){function f(){e.trigger("closed").remove()}var c=a(this),d=c.attr("data-target"),e;d||(d=c.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),e=a(d),b&&b.preventDefault(),e.length||(e=c.hasClass("alert")?c:c.parent()),e.trigger(b=a.Event("close"));if(b.isDefaultPrevented())return;e.removeClass("in"),a.support.transition&&e.hasClass("fade")?e.on(a.support.transition.end,f):f()};var d=a.fn.alert;a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("alert");e||d.data("alert",e=new c(this)),typeof b=="string"&&e[b].call(d)})},a.fn.alert.Constructor=c,a.fn.alert.noConflict=function(){return a.fn.alert=d,this},a(document).on("click.alert.data-api",b,c.prototype.close)}(window.jQuery),!function(a){var b=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.button.defaults,c)};b.prototype.setState=function(a){var b="disabled",c=this.$element,d=c.data(),e=c.is("input")?"val":"html";a+="Text",d.resetText||c.data("resetText",c[e]()),c[e](d[a]||this.options[a]),setTimeout(function(){a=="loadingText"?c.addClass(b).attr(b,b):c.removeClass(b).removeAttr(b)},0)},b.prototype.toggle=function(){var a=this.$element.closest('[data-toggle="buttons-radio"]');a&&a.find(".active").removeClass("active"),this.$element.toggleClass("active")};var c=a.fn.button;a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("button"),f=typeof c=="object"&&c;e||d.data("button",e=new b(this,f)),c=="toggle"?e.toggle():c&&e.setState(c)})},a.fn.button.defaults={loadingText:"loading..."},a.fn.button.Constructor=b,a.fn.button.noConflict=function(){return a.fn.button=c,this},a(document).on("click.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle")})}(window.jQuery),!function(a){var b=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.collapse.defaults,c),this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.prototype={constructor:b,dimension:function(){var a=this.$element.hasClass("width");return a?"width":"height"},show:function(){var b,c,d,e;if(this.transitioning)return;b=this.dimension(),c=a.camelCase(["scroll",b].join("-")),d=this.$parent&&this.$parent.find("> .accordion-group > .in");if(d&&d.length){e=d.data("collapse");if(e&&e.transitioning)return;d.collapse("hide"),e||d.data("collapse",null)}this.$element[b](0),this.transition("addClass",a.Event("show"),"shown"),a.support.transition&&this.$element[b](this.$element[0][c])},hide:function(){var b;if(this.transitioning)return;b=this.dimension(),this.reset(this.$element[b]()),this.transition("removeClass",a.Event("hide"),"hidden"),this.$element[b](0)},reset:function(a){var b=this.dimension();return this.$element.removeClass("collapse")[b](a||"auto")[0].offsetWidth,this.$element[a!==null?"addClass":"removeClass"]("collapse"),this},transition:function(b,c,d){var e=this,f=function(){c.type=="show"&&e.reset(),e.transitioning=0,e.$element.trigger(d)};this.$element.trigger(c);if(c.isDefaultPrevented())return;this.transitioning=1,this.$element[b]("in"),a.support.transition&&this.$element.hasClass("collapse")?this.$element.one(a.support.transition.end,f):f()},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}};var c=a.fn.collapse;a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("collapse"),f=typeof c=="object"&&c;e||d.data("collapse",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.collapse.defaults={toggle:!0},a.fn.collapse.Constructor=b,a.fn.collapse.noConflict=function(){return a.fn.collapse=c,this},a(document).on("click.collapse.data-api","[data-toggle=collapse]",function(b){var c=a(this),d,e=c.attr("data-target")||b.preventDefault()||(d=c.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""),f=a(e).data("collapse")?"toggle":c.data();c[a(e).hasClass("in")?"addClass":"removeClass"]("collapsed"),a(e).collapse(f)})}(window.jQuery),!function(a){var b=function(b,c){this.$element=a(b),this.options=c,this.options.pause=="hover"&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.prototype={cycle:function(b){return b||(this.paused=!1),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},to:function(b){var c=this.$element.find(".item.active"),d=c.parent().children(),e=d.index(c),f=this;if(b>d.length-1||b<0)return;return this.sliding?this.$element.one("slid",function(){f.to(b)}):e==b?this.pause().cycle():this.slide(b>e?"next":"prev",a(d[b]))},pause:function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition.end&&(this.$element.trigger(a.support.transition.end),this.cycle()),clearInterval(this.interval),this.interval=null,this},next:function(){if(this.sliding)return;return this.slide("next")},prev:function(){if(this.sliding)return;return this.slide("prev")},slide:function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g=b=="next"?"left":"right",h=b=="next"?"first":"last",i=this,j;this.sliding=!0,f&&this.pause(),e=e.length?e:this.$element.find(".item")[h](),j=a.Event("slide",{relatedTarget:e[0]});if(e.hasClass("active"))return;if(a.support.transition&&this.$element.hasClass("slide")){this.$element.trigger(j);if(j.isDefaultPrevented())return;e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),this.$element.one(a.support.transition.end,function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid")},0)})}else{this.$element.trigger(j);if(j.isDefaultPrevented())return;d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return f&&this.cycle(),this}};var c=a.fn.carousel;a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("carousel"),f=a.extend({},a.fn.carousel.defaults,typeof c=="object"&&c),g=typeof c=="string"?c:f.slide;e||d.data("carousel",e=new b(this,f)),typeof c=="number"?e.to(c):g?e[g]():f.interval&&e.cycle()})},a.fn.carousel.defaults={interval:5e3,pause:"hover"},a.fn.carousel.Constructor=b,a.fn.carousel.noConflict=function(){return a.fn.carousel=c,this},a(document).on("click.carousel.data-api","[data-slide]",function(b){var c=a(this),d,e=a(c.attr("data-target")||(d=c.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,"")),f=a.extend({},e.data(),c.data());e.carousel(f),b.preventDefault()})}(window.jQuery),!function(a){var b=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.typeahead.defaults,c),this.matcher=this.options.matcher||this.matcher,this.sorter=this.options.sorter||this.sorter,this.highlighter=this.options.highlighter||this.highlighter,this.updater=this.options.updater||this.updater,this.source=this.options.source,this.$menu=a(this.options.menu),this.shown=!1,this.listen()};b.prototype={constructor:b,select:function(){var a=this.$menu.find(".active").attr("data-value");return this.$element.val(this.updater(a)).change(),this.hide()},updater:function(a){return a},show:function(){var b=a.extend({},this.$element.position(),{height:this.$element[0].offsetHeight});return this.$menu.insertAfter(this.$element).css({top:b.top+b.height,left:b.left}).show(),this.shown=!0,this},hide:function(){return this.$menu.hide(),this.shown=!1,this},lookup:function(b){var c;return this.query=this.$element.val(),!this.query||this.query.length<this.options.minLength?this.shown?this.hide():this:(c=a.isFunction(this.source)?this.source(this.query,a.proxy(this.process,this)):this.source,c?this.process(c):this)},process:function(b){var c=this;return b=a.grep(b,function(a){return c.matcher(a)}),b=this.sorter(b),b.length?this.render(b.slice(0,this.options.items)).show():this.shown?this.hide():this},matcher:function(a){return~a.toLowerCase().indexOf(this.query.toLowerCase())},sorter:function(a){var b=[],c=[],d=[],e;while(e=a.shift())e.toLowerCase().indexOf(this.query.toLowerCase())?~e.indexOf(this.query)?c.push(e):d.push(e):b.push(e);return b.concat(c,d)},highlighter:function(a){var b=this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&");return a.replace(new RegExp("("+b+")","ig"),function(a,b){return"<strong>"+b+"</strong>"})},render:function(b){var c=this;return b=a(b).map(function(b,d){return b=a(c.options.item).attr("data-value",d),b.find("a").html(c.highlighter(d)),b[0]}),b.first().addClass("active"),this.$menu.html(b),this},next:function(b){var c=this.$menu.find(".active").removeClass("active"),d=c.next();d.length||(d=a(this.$menu.find("li")[0])),d.addClass("active")},prev:function(a){var b=this.$menu.find(".active").removeClass("active"),c=b.prev();c.length||(c=this.$menu.find("li").last()),c.addClass("active")},listen:function(){this.$element.on("blur",a.proxy(this.blur,this)).on("keypress",a.proxy(this.keypress,this)).on("keyup",a.proxy(this.keyup,this)),this.eventSupported("keydown")&&this.$element.on("keydown",a.proxy(this.keydown,this)),this.$menu.on("click",a.proxy(this.click,this)).on("mouseenter","li",a.proxy(this.mouseenter,this))},eventSupported:function(a){var b=a in this.$element;return b||(this.$element.setAttribute(a,"return;"),b=typeof this.$element[a]=="function"),b},move:function(a){if(!this.shown)return;switch(a.keyCode){case 9:case 13:case 27:a.preventDefault();break;case 38:a.preventDefault(),this.prev();break;case 40:a.preventDefault(),this.next()}a.stopPropagation()},keydown:function(b){this.suppressKeyPressRepeat=~a.inArray(b.keyCode,[40,38,9,13,27]),this.move(b)},keypress:function(a){if(this.suppressKeyPressRepeat)return;this.move(a)},keyup:function(a){switch(a.keyCode){case 40:case 38:case 16:case 17:case 18:break;case 9:case 13:if(!this.shown)return;this.select();break;case 27:if(!this.shown)return;this.hide();break;default:this.lookup()}a.stopPropagation(),a.preventDefault()},blur:function(a){var b=this;setTimeout(function(){b.hide()},150)},click:function(a){a.stopPropagation(),a.preventDefault(),this.select()},mouseenter:function(b){this.$menu.find(".active").removeClass("active"),a(b.currentTarget).addClass("active")}};var c=a.fn.typeahead;a.fn.typeahead=function(c){return this.each(function(){var d=a(this),e=d.data("typeahead"),f=typeof c=="object"&&c;e||d.data("typeahead",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.typeahead.defaults={source:[],items:8,menu:'<ul class="typeahead dropdown-menu"></ul>',item:'<li><a href="#"></a></li>',minLength:1},a.fn.typeahead.Constructor=b,a.fn.typeahead.noConflict=function(){return a.fn.typeahead=c,this},a(document).on("focus.typeahead.data-api",'[data-provide="typeahead"]',function(b){var c=a(this);if(c.data("typeahead"))return;b.preventDefault(),c.typeahead(c.data())})}(window.jQuery) \ No newline at end of file diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/i18n.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/i18n.js new file mode 100644 index 0000000000000000000000000000000000000000..7283fd8fec540c34b1f41b6ef50e5b979a294fd4 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/i18n.js @@ -0,0 +1,180 @@ +/** + * @license RequireJS i18n 2.0.2 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved. + * Available via the MIT or new BSD license. + * see: http://github.com/requirejs/i18n for details + */ +/*jslint regexp: true */ +/*global require: false, navigator: false, define: false */ + +/** + * This plugin handles i18n! prefixed modules. It does the following: + * + * 1) A regular module can have a dependency on an i18n bundle, but the regular + * module does not want to specify what locale to load. So it just specifies + * the top-level bundle, like "i18n!nls/colors". + * + * This plugin will load the i18n bundle at nls/colors, see that it is a root/master + * bundle since it does not have a locale in its name. It will then try to find + * the best match locale available in that master bundle, then request all the + * locale pieces for that best match locale. For instance, if the locale is "en-us", + * then the plugin will ask for the "en-us", "en" and "root" bundles to be loaded + * (but only if they are specified on the master bundle). + * + * Once all the bundles for the locale pieces load, then it mixes in all those + * locale pieces into each other, then finally sets the context.defined value + * for the nls/colors bundle to be that mixed in locale. + * + * 2) A regular module specifies a specific locale to load. For instance, + * i18n!nls/fr-fr/colors. In this case, the plugin needs to load the master bundle + * first, at nls/colors, then figure out what the best match locale is for fr-fr, + * since maybe only fr or just root is defined for that locale. Once that best + * fit is found, all of its locale pieces need to have their bundles loaded. + * + * Once all the bundles for the locale pieces load, then it mixes in all those + * locale pieces into each other, then finally sets the context.defined value + * for the nls/fr-fr/colors bundle to be that mixed in locale. + */ +(function () { + 'use strict'; + + //regexp for reconstructing the master bundle name from parts of the regexp match + //nlsRegExp.exec("foo/bar/baz/nls/en-ca/foo") gives: + //["foo/bar/baz/nls/en-ca/foo", "foo/bar/baz/nls/", "/", "/", "en-ca", "foo"] + //nlsRegExp.exec("foo/bar/baz/nls/foo") gives: + //["foo/bar/baz/nls/foo", "foo/bar/baz/nls/", "/", "/", "foo", ""] + //so, if match[5] is blank, it means this is the top bundle definition. + var nlsRegExp = /(^.*(^|\/)nls(\/|$))([^\/]*)\/?([^\/]*)/; + + //Helper function to avoid repeating code. Lots of arguments in the + //desire to stay functional and support RequireJS contexts without having + //to know about the RequireJS contexts. + function addPart(locale, master, needed, toLoad, prefix, suffix) { + if (master[locale]) { + needed.push(locale); + if (master[locale] === true || master[locale] === 1) { + toLoad.push(prefix + locale + '/' + suffix); + } + } + } + + function addIfExists(req, locale, toLoad, prefix, suffix) { + var fullName = prefix + locale + '/' + suffix; + if (require._fileExists(req.toUrl(fullName + '.js'))) { + toLoad.push(fullName); + } + } + + /** + * Simple function to mix in properties from source into target, + * but only if target does not already have a property of the same name. + * This is not robust in IE for transferring methods that match + * Object.prototype names, but the uses of mixin here seem unlikely to + * trigger a problem related to that. + */ + function mixin(target, source, force) { + var prop; + for (prop in source) { + if (source.hasOwnProperty(prop) && (!target.hasOwnProperty(prop) || force)) { + target[prop] = source[prop]; + } else if (typeof source[prop] === 'object') { + mixin(target[prop], source[prop], force); + } + } + } + + define(['module'], function (module) { + var masterConfig = module.config ? module.config() : {}; + + return { + version: '2.0.1+', + /** + * Called when a dependency needs to be loaded. + */ + load: function (name, req, onLoad, config) { + config = config || {}; + + if (config.locale) { + masterConfig.locale = config.locale; + } + + var masterName, + match = nlsRegExp.exec(name), + prefix = match[1], + locale = match[4], + suffix = match[5], + parts = locale.split("-"), + toLoad = [], + value = {}, + i, part, current = ""; + + //If match[5] is blank, it means this is the top bundle definition, + //so it does not have to be handled. Locale-specific requests + //will have a match[4] value but no match[5] + if (match[5]) { + //locale-specific bundle + prefix = match[1]; + masterName = prefix + suffix; + } else { + //Top-level bundle. + masterName = name; + suffix = match[4]; + locale = masterConfig.locale; + if (!locale) { + locale = masterConfig.locale = + typeof navigator === "undefined" ? "root" : + (navigator.language || + navigator.userLanguage || "root").toLowerCase(); + } + parts = locale.split("-"); + } + + if (config.isBuild) { + //Check for existence of all locale possible files and + //require them if exist. + toLoad.push(masterName); + addIfExists(req, "root", toLoad, prefix, suffix); + for (i = 0; i < parts.length; i++) { + part = parts[i]; + current += (current ? "-" : "") + part; + addIfExists(req, current, toLoad, prefix, suffix); + } + + req(toLoad, function () { + onLoad(); + }); + } else { + //First, fetch the master bundle, it knows what locales are available. + req([masterName], function (master) { + //Figure out the best fit + var needed = [], + part; + + //Always allow for root, then do the rest of the locale parts. + addPart("root", master, needed, toLoad, prefix, suffix); + for (i = 0; i < parts.length; i++) { + part = parts[i]; + current += (current ? "-" : "") + part; + addPart(current, master, needed, toLoad, prefix, suffix); + } + + //Load all the parts missing. + req(toLoad, function () { + var i, partBundle, part; + for (i = needed.length - 1; i > -1 && needed[i]; i--) { + part = needed[i]; + partBundle = master[part]; + if (partBundle === true || partBundle === 1) { + partBundle = req(prefix + part + '/' + suffix); + } + mixin(value, partBundle); + } + + //All done, notify the loader. + onLoad(value); + }); + }); + } + } + }; + }); +}()); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/jasmine-html.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/jasmine-html.js new file mode 100644 index 0000000000000000000000000000000000000000..543d56963eb4a36750fef86842213505a7da0657 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/jasmine-html.js @@ -0,0 +1,681 @@ +jasmine.HtmlReporterHelpers = {}; + +jasmine.HtmlReporterHelpers.createDom = function(type, attrs, childrenVarArgs) { + var el = document.createElement(type); + + for (var i = 2; i < arguments.length; i++) { + var child = arguments[i]; + + if (typeof child === 'string') { + el.appendChild(document.createTextNode(child)); + } else { + if (child) { + el.appendChild(child); + } + } + } + + for (var attr in attrs) { + if (attr == "className") { + el[attr] = attrs[attr]; + } else { + el.setAttribute(attr, attrs[attr]); + } + } + + return el; +}; + +jasmine.HtmlReporterHelpers.getSpecStatus = function(child) { + var results = child.results(); + var status = results.passed() ? 'passed' : 'failed'; + if (results.skipped) { + status = 'skipped'; + } + + return status; +}; + +jasmine.HtmlReporterHelpers.appendToSummary = function(child, childElement) { + var parentDiv = this.dom.summary; + var parentSuite = (typeof child.parentSuite == 'undefined') ? 'suite' : 'parentSuite'; + var parent = child[parentSuite]; + + if (parent) { + if (typeof this.views.suites[parent.id] == 'undefined') { + this.views.suites[parent.id] = new jasmine.HtmlReporter.SuiteView(parent, this.dom, this.views); + } + parentDiv = this.views.suites[parent.id].element; + } + + parentDiv.appendChild(childElement); +}; + + +jasmine.HtmlReporterHelpers.addHelpers = function(ctor) { + for(var fn in jasmine.HtmlReporterHelpers) { + ctor.prototype[fn] = jasmine.HtmlReporterHelpers[fn]; + } +}; + +jasmine.HtmlReporter = function(_doc) { + var self = this; + var doc = _doc || window.document; + + var reporterView; + + var dom = {}; + + // Jasmine Reporter Public Interface + self.logRunningSpecs = false; + + self.reportRunnerStarting = function(runner) { + var specs = runner.specs() || []; + + if (specs.length == 0) { + return; + } + + createReporterDom(runner.env.versionString()); + doc.body.appendChild(dom.reporter); + setExceptionHandling(); + + reporterView = new jasmine.HtmlReporter.ReporterView(dom); + reporterView.addSpecs(specs, self.specFilter); + }; + + self.reportRunnerResults = function(runner) { + reporterView && reporterView.complete(); + }; + + self.reportSuiteResults = function(suite) { + reporterView.suiteComplete(suite); + }; + + self.reportSpecStarting = function(spec) { + if (self.logRunningSpecs) { + self.log('>> Jasmine Running ' + spec.suite.description + ' ' + spec.description + '...'); + } + }; + + self.reportSpecResults = function(spec) { + reporterView.specComplete(spec); + }; + + self.log = function() { + var console = jasmine.getGlobal().console; + if (console && console.log) { + if (console.log.apply) { + console.log.apply(console, arguments); + } else { + console.log(arguments); // ie fix: console.log.apply doesn't exist on ie + } + } + }; + + self.specFilter = function(spec) { + if (!focusedSpecName()) { + return true; + } + + return spec.getFullName().indexOf(focusedSpecName()) === 0; + }; + + return self; + + function focusedSpecName() { + var specName; + + (function memoizeFocusedSpec() { + if (specName) { + return; + } + + var paramMap = []; + var params = jasmine.HtmlReporter.parameters(doc); + + for (var i = 0; i < params.length; i++) { + var p = params[i].split('='); + paramMap[decodeURIComponent(p[0])] = decodeURIComponent(p[1]); + } + + specName = paramMap.spec; + })(); + + return specName; + } + + function createReporterDom(version) { + dom.reporter = self.createDom('div', { id: 'HTMLReporter', className: 'jasmine_reporter' }, + dom.banner = self.createDom('div', { className: 'banner' }, + self.createDom('span', { className: 'title' }, "Jasmine "), + self.createDom('span', { className: 'version' }, version)), + + dom.symbolSummary = self.createDom('ul', {className: 'symbolSummary'}), + dom.alert = self.createDom('div', {className: 'alert'}, + self.createDom('span', { className: 'exceptions' }, + self.createDom('label', { className: 'label', 'for': 'no_try_catch' }, 'No try/catch'), + self.createDom('input', { id: 'no_try_catch', type: 'checkbox' }))), + dom.results = self.createDom('div', {className: 'results'}, + dom.summary = self.createDom('div', { className: 'summary' }), + dom.details = self.createDom('div', { id: 'details' })) + ); + } + + function noTryCatch() { + return window.location.search.match(/catch=false/); + } + + function searchWithCatch() { + var params = jasmine.HtmlReporter.parameters(window.document); + var removed = false; + var i = 0; + + while (!removed && i < params.length) { + if (params[i].match(/catch=/)) { + params.splice(i, 1); + removed = true; + } + i++; + } + if (jasmine.CATCH_EXCEPTIONS) { + params.push("catch=false"); + } + + return params.join("&"); + } + + function setExceptionHandling() { + var chxCatch = document.getElementById('no_try_catch'); + + if (noTryCatch()) { + chxCatch.setAttribute('checked', true); + jasmine.CATCH_EXCEPTIONS = false; + } + chxCatch.onclick = function() { + window.location.search = searchWithCatch(); + }; + } +}; +jasmine.HtmlReporter.parameters = function(doc) { + var paramStr = doc.location.search.substring(1); + var params = []; + + if (paramStr.length > 0) { + params = paramStr.split('&'); + } + return params; +} +jasmine.HtmlReporter.sectionLink = function(sectionName) { + var link = '?'; + var params = []; + + if (sectionName) { + params.push('spec=' + encodeURIComponent(sectionName)); + } + if (!jasmine.CATCH_EXCEPTIONS) { + params.push("catch=false"); + } + if (params.length > 0) { + link += params.join("&"); + } + + return link; +}; +jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter); +jasmine.HtmlReporter.ReporterView = function(dom) { + this.startedAt = new Date(); + this.runningSpecCount = 0; + this.completeSpecCount = 0; + this.passedCount = 0; + this.failedCount = 0; + this.skippedCount = 0; + + this.createResultsMenu = function() { + this.resultsMenu = this.createDom('span', {className: 'resultsMenu bar'}, + this.summaryMenuItem = this.createDom('a', {className: 'summaryMenuItem', href: "#"}, '0 specs'), + ' | ', + this.detailsMenuItem = this.createDom('a', {className: 'detailsMenuItem', href: "#"}, '0 failing')); + + this.summaryMenuItem.onclick = function() { + dom.reporter.className = dom.reporter.className.replace(/ showDetails/g, ''); + }; + + this.detailsMenuItem.onclick = function() { + showDetails(); + }; + }; + + this.addSpecs = function(specs, specFilter) { + this.totalSpecCount = specs.length; + + this.views = { + specs: {}, + suites: {} + }; + + for (var i = 0; i < specs.length; i++) { + var spec = specs[i]; + this.views.specs[spec.id] = new jasmine.HtmlReporter.SpecView(spec, dom, this.views); + if (specFilter(spec)) { + this.runningSpecCount++; + } + } + }; + + this.specComplete = function(spec) { + this.completeSpecCount++; + + if (isUndefined(this.views.specs[spec.id])) { + this.views.specs[spec.id] = new jasmine.HtmlReporter.SpecView(spec, dom); + } + + var specView = this.views.specs[spec.id]; + + switch (specView.status()) { + case 'passed': + this.passedCount++; + break; + + case 'failed': + this.failedCount++; + break; + + case 'skipped': + this.skippedCount++; + break; + } + + specView.refresh(); + this.refresh(); + }; + + this.suiteComplete = function(suite) { + var suiteView = this.views.suites[suite.id]; + if (isUndefined(suiteView)) { + return; + } + suiteView.refresh(); + }; + + this.refresh = function() { + + if (isUndefined(this.resultsMenu)) { + this.createResultsMenu(); + } + + // currently running UI + if (isUndefined(this.runningAlert)) { + this.runningAlert = this.createDom('a', { href: jasmine.HtmlReporter.sectionLink(), className: "runningAlert bar" }); + dom.alert.appendChild(this.runningAlert); + } + this.runningAlert.innerHTML = "Running " + this.completeSpecCount + " of " + specPluralizedFor(this.totalSpecCount); + + // skipped specs UI + if (isUndefined(this.skippedAlert)) { + this.skippedAlert = this.createDom('a', { href: jasmine.HtmlReporter.sectionLink(), className: "skippedAlert bar" }); + } + + this.skippedAlert.innerHTML = "Skipping " + this.skippedCount + " of " + specPluralizedFor(this.totalSpecCount) + " - run all"; + + if (this.skippedCount === 1 && isDefined(dom.alert)) { + dom.alert.appendChild(this.skippedAlert); + } + + // passing specs UI + if (isUndefined(this.passedAlert)) { + this.passedAlert = this.createDom('span', { href: jasmine.HtmlReporter.sectionLink(), className: "passingAlert bar" }); + } + this.passedAlert.innerHTML = "Passing " + specPluralizedFor(this.passedCount); + + // failing specs UI + if (isUndefined(this.failedAlert)) { + this.failedAlert = this.createDom('span', {href: "?", className: "failingAlert bar"}); + } + this.failedAlert.innerHTML = "Failing " + specPluralizedFor(this.failedCount); + + if (this.failedCount === 1 && isDefined(dom.alert)) { + dom.alert.appendChild(this.failedAlert); + dom.alert.appendChild(this.resultsMenu); + } + + // summary info + this.summaryMenuItem.innerHTML = "" + specPluralizedFor(this.runningSpecCount); + this.detailsMenuItem.innerHTML = "" + this.failedCount + " failing"; + }; + + this.complete = function() { + dom.alert.removeChild(this.runningAlert); + + this.skippedAlert.innerHTML = "Ran " + this.runningSpecCount + " of " + specPluralizedFor(this.totalSpecCount) + " - run all"; + + if (this.failedCount === 0) { + dom.alert.appendChild(this.createDom('span', {className: 'passingAlert bar'}, "Passing " + specPluralizedFor(this.passedCount))); + } else { + showDetails(); + } + + dom.banner.appendChild(this.createDom('span', {className: 'duration'}, "finished in " + ((new Date().getTime() - this.startedAt.getTime()) / 1000) + "s")); + }; + + return this; + + function showDetails() { + if (dom.reporter.className.search(/showDetails/) === -1) { + dom.reporter.className += " showDetails"; + } + } + + function isUndefined(obj) { + return typeof obj === 'undefined'; + } + + function isDefined(obj) { + return !isUndefined(obj); + } + + function specPluralizedFor(count) { + var str = count + " spec"; + if (count > 1) { + str += "s" + } + return str; + } + +}; + +jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.ReporterView); + + +jasmine.HtmlReporter.SpecView = function(spec, dom, views) { + this.spec = spec; + this.dom = dom; + this.views = views; + + this.symbol = this.createDom('li', { className: 'pending' }); + this.dom.symbolSummary.appendChild(this.symbol); + + this.summary = this.createDom('div', { className: 'specSummary' }, + this.createDom('a', { + className: 'description', + href: jasmine.HtmlReporter.sectionLink(this.spec.getFullName()), + title: this.spec.getFullName() + }, this.spec.description) + ); + + this.detail = this.createDom('div', { className: 'specDetail' }, + this.createDom('a', { + className: 'description', + href: '?spec=' + encodeURIComponent(this.spec.getFullName()), + title: this.spec.getFullName() + }, this.spec.getFullName()) + ); +}; + +jasmine.HtmlReporter.SpecView.prototype.status = function() { + return this.getSpecStatus(this.spec); +}; + +jasmine.HtmlReporter.SpecView.prototype.refresh = function() { + this.symbol.className = this.status(); + + switch (this.status()) { + case 'skipped': + break; + + case 'passed': + this.appendSummaryToSuiteDiv(); + break; + + case 'failed': + this.appendSummaryToSuiteDiv(); + this.appendFailureDetail(); + break; + } +}; + +jasmine.HtmlReporter.SpecView.prototype.appendSummaryToSuiteDiv = function() { + this.summary.className += ' ' + this.status(); + this.appendToSummary(this.spec, this.summary); +}; + +jasmine.HtmlReporter.SpecView.prototype.appendFailureDetail = function() { + this.detail.className += ' ' + this.status(); + + var resultItems = this.spec.results().getItems(); + var messagesDiv = this.createDom('div', { className: 'messages' }); + + for (var i = 0; i < resultItems.length; i++) { + var result = resultItems[i]; + + if (result.type == 'log') { + messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage log'}, result.toString())); + } else if (result.type == 'expect' && result.passed && !result.passed()) { + messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage fail'}, result.message)); + + if (result.trace.stack) { + messagesDiv.appendChild(this.createDom('div', {className: 'stackTrace'}, result.trace.stack)); + } + } + } + + if (messagesDiv.childNodes.length > 0) { + this.detail.appendChild(messagesDiv); + this.dom.details.appendChild(this.detail); + } +}; + +jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.SpecView);jasmine.HtmlReporter.SuiteView = function(suite, dom, views) { + this.suite = suite; + this.dom = dom; + this.views = views; + + this.element = this.createDom('div', { className: 'suite' }, + this.createDom('a', { className: 'description', href: jasmine.HtmlReporter.sectionLink(this.suite.getFullName()) }, this.suite.description) + ); + + this.appendToSummary(this.suite, this.element); +}; + +jasmine.HtmlReporter.SuiteView.prototype.status = function() { + return this.getSpecStatus(this.suite); +}; + +jasmine.HtmlReporter.SuiteView.prototype.refresh = function() { + this.element.className += " " + this.status(); +}; + +jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.SuiteView); + +/* @deprecated Use jasmine.HtmlReporter instead + */ +jasmine.TrivialReporter = function(doc) { + this.document = doc || document; + this.suiteDivs = {}; + this.logRunningSpecs = false; +}; + +jasmine.TrivialReporter.prototype.createDom = function(type, attrs, childrenVarArgs) { + var el = document.createElement(type); + + for (var i = 2; i < arguments.length; i++) { + var child = arguments[i]; + + if (typeof child === 'string') { + el.appendChild(document.createTextNode(child)); + } else { + if (child) { el.appendChild(child); } + } + } + + for (var attr in attrs) { + if (attr == "className") { + el[attr] = attrs[attr]; + } else { + el.setAttribute(attr, attrs[attr]); + } + } + + return el; +}; + +jasmine.TrivialReporter.prototype.reportRunnerStarting = function(runner) { + var showPassed, showSkipped; + + this.outerDiv = this.createDom('div', { id: 'TrivialReporter', className: 'jasmine_reporter' }, + this.createDom('div', { className: 'banner' }, + this.createDom('div', { className: 'logo' }, + this.createDom('span', { className: 'title' }, "Jasmine"), + this.createDom('span', { className: 'version' }, runner.env.versionString())), + this.createDom('div', { className: 'options' }, + "Show ", + showPassed = this.createDom('input', { id: "__jasmine_TrivialReporter_showPassed__", type: 'checkbox' }), + this.createDom('label', { "for": "__jasmine_TrivialReporter_showPassed__" }, " passed "), + showSkipped = this.createDom('input', { id: "__jasmine_TrivialReporter_showSkipped__", type: 'checkbox' }), + this.createDom('label', { "for": "__jasmine_TrivialReporter_showSkipped__" }, " skipped") + ) + ), + + this.runnerDiv = this.createDom('div', { className: 'runner running' }, + this.createDom('a', { className: 'run_spec', href: '?' }, "run all"), + this.runnerMessageSpan = this.createDom('span', {}, "Running..."), + this.finishedAtSpan = this.createDom('span', { className: 'finished-at' }, "")) + ); + + this.document.body.appendChild(this.outerDiv); + + var suites = runner.suites(); + for (var i = 0; i < suites.length; i++) { + var suite = suites[i]; + var suiteDiv = this.createDom('div', { className: 'suite' }, + this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, "run"), + this.createDom('a', { className: 'description', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, suite.description)); + this.suiteDivs[suite.id] = suiteDiv; + var parentDiv = this.outerDiv; + if (suite.parentSuite) { + parentDiv = this.suiteDivs[suite.parentSuite.id]; + } + parentDiv.appendChild(suiteDiv); + } + + this.startedAt = new Date(); + + var self = this; + showPassed.onclick = function(evt) { + if (showPassed.checked) { + self.outerDiv.className += ' show-passed'; + } else { + self.outerDiv.className = self.outerDiv.className.replace(/ show-passed/, ''); + } + }; + + showSkipped.onclick = function(evt) { + if (showSkipped.checked) { + self.outerDiv.className += ' show-skipped'; + } else { + self.outerDiv.className = self.outerDiv.className.replace(/ show-skipped/, ''); + } + }; +}; + +jasmine.TrivialReporter.prototype.reportRunnerResults = function(runner) { + var results = runner.results(); + var className = (results.failedCount > 0) ? "runner failed" : "runner passed"; + this.runnerDiv.setAttribute("class", className); + //do it twice for IE + this.runnerDiv.setAttribute("className", className); + var specs = runner.specs(); + var specCount = 0; + for (var i = 0; i < specs.length; i++) { + if (this.specFilter(specs[i])) { + specCount++; + } + } + var message = "" + specCount + " spec" + (specCount == 1 ? "" : "s" ) + ", " + results.failedCount + " failure" + ((results.failedCount == 1) ? "" : "s"); + message += " in " + ((new Date().getTime() - this.startedAt.getTime()) / 1000) + "s"; + this.runnerMessageSpan.replaceChild(this.createDom('a', { className: 'description', href: '?'}, message), this.runnerMessageSpan.firstChild); + + this.finishedAtSpan.appendChild(document.createTextNode("Finished at " + new Date().toString())); +}; + +jasmine.TrivialReporter.prototype.reportSuiteResults = function(suite) { + var results = suite.results(); + var status = results.passed() ? 'passed' : 'failed'; + if (results.totalCount === 0) { // todo: change this to check results.skipped + status = 'skipped'; + } + this.suiteDivs[suite.id].className += " " + status; +}; + +jasmine.TrivialReporter.prototype.reportSpecStarting = function(spec) { + if (this.logRunningSpecs) { + this.log('>> Jasmine Running ' + spec.suite.description + ' ' + spec.description + '...'); + } +}; + +jasmine.TrivialReporter.prototype.reportSpecResults = function(spec) { + var results = spec.results(); + var status = results.passed() ? 'passed' : 'failed'; + if (results.skipped) { + status = 'skipped'; + } + var specDiv = this.createDom('div', { className: 'spec ' + status }, + this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(spec.getFullName()) }, "run"), + this.createDom('a', { + className: 'description', + href: '?spec=' + encodeURIComponent(spec.getFullName()), + title: spec.getFullName() + }, spec.description)); + + + var resultItems = results.getItems(); + var messagesDiv = this.createDom('div', { className: 'messages' }); + for (var i = 0; i < resultItems.length; i++) { + var result = resultItems[i]; + + if (result.type == 'log') { + messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage log'}, result.toString())); + } else if (result.type == 'expect' && result.passed && !result.passed()) { + messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage fail'}, result.message)); + + if (result.trace.stack) { + messagesDiv.appendChild(this.createDom('div', {className: 'stackTrace'}, result.trace.stack)); + } + } + } + + if (messagesDiv.childNodes.length > 0) { + specDiv.appendChild(messagesDiv); + } + + this.suiteDivs[spec.suite.id].appendChild(specDiv); +}; + +jasmine.TrivialReporter.prototype.log = function() { + var console = jasmine.getGlobal().console; + if (console && console.log) { + if (console.log.apply) { + console.log.apply(console, arguments); + } else { + console.log(arguments); // ie fix: console.log.apply doesn't exist on ie + } + } +}; + +jasmine.TrivialReporter.prototype.getLocation = function() { + return this.document.location; +}; + +jasmine.TrivialReporter.prototype.specFilter = function(spec) { + var paramMap = {}; + var params = this.getLocation().search.substring(1).split('&'); + for (var i = 0; i < params.length; i++) { + var p = params[i].split('='); + paramMap[decodeURIComponent(p[0])] = decodeURIComponent(p[1]); + } + + if (!paramMap.spec) { + return true; + } + return spec.getFullName().indexOf(paramMap.spec) === 0; +}; diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/jasmine.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/jasmine.js new file mode 100644 index 0000000000000000000000000000000000000000..6b3459b913ffe7d15f30f8a93d5f7b6d5939ab7e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/jasmine.js @@ -0,0 +1,2600 @@ +var isCommonJS = typeof window == "undefined" && typeof exports == "object"; + +/** + * Top level namespace for Jasmine, a lightweight JavaScript BDD/spec/testing framework. + * + * @namespace + */ +var jasmine = {}; +if (isCommonJS) exports.jasmine = jasmine; +/** + * @private + */ +jasmine.unimplementedMethod_ = function() { + throw new Error("unimplemented method"); +}; + +/** + * Use <code>jasmine.undefined</code> instead of <code>undefined</code>, since <code>undefined</code> is just + * a plain old variable and may be redefined by somebody else. + * + * @private + */ +jasmine.undefined = jasmine.___undefined___; + +/** + * Show diagnostic messages in the console if set to true + * + */ +jasmine.VERBOSE = false; + +/** + * Default interval in milliseconds for event loop yields (e.g. to allow network activity or to refresh the screen with the HTML-based runner). Small values here may result in slow test running. Zero means no updates until all tests have completed. + * + */ +jasmine.DEFAULT_UPDATE_INTERVAL = 250; + +/** + * Maximum levels of nesting that will be included when an object is pretty-printed + */ +jasmine.MAX_PRETTY_PRINT_DEPTH = 40; + +/** + * Default timeout interval in milliseconds for waitsFor() blocks. + */ +jasmine.DEFAULT_TIMEOUT_INTERVAL = 5000; + +/** + * By default exceptions thrown in the context of a test are caught by jasmine so that it can run the remaining tests in the suite. + * Set to false to let the exception bubble up in the browser. + * + */ +jasmine.CATCH_EXCEPTIONS = true; + +jasmine.getGlobal = function() { + function getGlobal() { + return this; + } + + return getGlobal(); +}; + +/** + * Allows for bound functions to be compared. Internal use only. + * + * @ignore + * @private + * @param base {Object} bound 'this' for the function + * @param name {Function} function to find + */ +jasmine.bindOriginal_ = function(base, name) { + var original = base[name]; + if (original.apply) { + return function() { + return original.apply(base, arguments); + }; + } else { + // IE support + return jasmine.getGlobal()[name]; + } +}; + +jasmine.setTimeout = jasmine.bindOriginal_(jasmine.getGlobal(), 'setTimeout'); +jasmine.clearTimeout = jasmine.bindOriginal_(jasmine.getGlobal(), 'clearTimeout'); +jasmine.setInterval = jasmine.bindOriginal_(jasmine.getGlobal(), 'setInterval'); +jasmine.clearInterval = jasmine.bindOriginal_(jasmine.getGlobal(), 'clearInterval'); + +jasmine.MessageResult = function(values) { + this.type = 'log'; + this.values = values; + this.trace = new Error(); // todo: test better +}; + +jasmine.MessageResult.prototype.toString = function() { + var text = ""; + for (var i = 0; i < this.values.length; i++) { + if (i > 0) text += " "; + if (jasmine.isString_(this.values[i])) { + text += this.values[i]; + } else { + text += jasmine.pp(this.values[i]); + } + } + return text; +}; + +jasmine.ExpectationResult = function(params) { + this.type = 'expect'; + this.matcherName = params.matcherName; + this.passed_ = params.passed; + this.expected = params.expected; + this.actual = params.actual; + this.message = this.passed_ ? 'Passed.' : params.message; + + var trace = (params.trace || new Error(this.message)); + this.trace = this.passed_ ? '' : trace; +}; + +jasmine.ExpectationResult.prototype.toString = function () { + return this.message; +}; + +jasmine.ExpectationResult.prototype.passed = function () { + return this.passed_; +}; + +/** + * Getter for the Jasmine environment. Ensures one gets created + */ +jasmine.getEnv = function() { + var env = jasmine.currentEnv_ = jasmine.currentEnv_ || new jasmine.Env(); + return env; +}; + +/** + * @ignore + * @private + * @param value + * @returns {Boolean} + */ +jasmine.isArray_ = function(value) { + return jasmine.isA_("Array", value); +}; + +/** + * @ignore + * @private + * @param value + * @returns {Boolean} + */ +jasmine.isString_ = function(value) { + return jasmine.isA_("String", value); +}; + +/** + * @ignore + * @private + * @param value + * @returns {Boolean} + */ +jasmine.isNumber_ = function(value) { + return jasmine.isA_("Number", value); +}; + +/** + * @ignore + * @private + * @param {String} typeName + * @param value + * @returns {Boolean} + */ +jasmine.isA_ = function(typeName, value) { + return Object.prototype.toString.apply(value) === '[object ' + typeName + ']'; +}; + +/** + * Pretty printer for expecations. Takes any object and turns it into a human-readable string. + * + * @param value {Object} an object to be outputted + * @returns {String} + */ +jasmine.pp = function(value) { + var stringPrettyPrinter = new jasmine.StringPrettyPrinter(); + stringPrettyPrinter.format(value); + return stringPrettyPrinter.string; +}; + +/** + * Returns true if the object is a DOM Node. + * + * @param {Object} obj object to check + * @returns {Boolean} + */ +jasmine.isDomNode = function(obj) { + return obj.nodeType > 0; +}; + +/** + * Returns a matchable 'generic' object of the class type. For use in expecations of type when values don't matter. + * + * @example + * // don't care about which function is passed in, as long as it's a function + * expect(mySpy).toHaveBeenCalledWith(jasmine.any(Function)); + * + * @param {Class} clazz + * @returns matchable object of the type clazz + */ +jasmine.any = function(clazz) { + return new jasmine.Matchers.Any(clazz); +}; + +/** + * Returns a matchable subset of a JSON object. For use in expectations when you don't care about all of the + * attributes on the object. + * + * @example + * // don't care about any other attributes than foo. + * expect(mySpy).toHaveBeenCalledWith(jasmine.objectContaining({foo: "bar"}); + * + * @param sample {Object} sample + * @returns matchable object for the sample + */ +jasmine.objectContaining = function (sample) { + return new jasmine.Matchers.ObjectContaining(sample); +}; + +/** + * Jasmine Spies are test doubles that can act as stubs, spies, fakes or when used in an expecation, mocks. + * + * Spies should be created in test setup, before expectations. They can then be checked, using the standard Jasmine + * expectation syntax. Spies can be checked if they were called or not and what the calling params were. + * + * A Spy has the following fields: wasCalled, callCount, mostRecentCall, and argsForCall (see docs). + * + * Spies are torn down at the end of every spec. + * + * Note: Do <b>not</b> call new jasmine.Spy() directly - a spy must be created using spyOn, jasmine.createSpy or jasmine.createSpyObj. + * + * @example + * // a stub + * var myStub = jasmine.createSpy('myStub'); // can be used anywhere + * + * // spy example + * var foo = { + * not: function(bool) { return !bool; } + * } + * + * // actual foo.not will not be called, execution stops + * spyOn(foo, 'not'); + + // foo.not spied upon, execution will continue to implementation + * spyOn(foo, 'not').andCallThrough(); + * + * // fake example + * var foo = { + * not: function(bool) { return !bool; } + * } + * + * // foo.not(val) will return val + * spyOn(foo, 'not').andCallFake(function(value) {return value;}); + * + * // mock example + * foo.not(7 == 7); + * expect(foo.not).toHaveBeenCalled(); + * expect(foo.not).toHaveBeenCalledWith(true); + * + * @constructor + * @see spyOn, jasmine.createSpy, jasmine.createSpyObj + * @param {String} name + */ +jasmine.Spy = function(name) { + /** + * The name of the spy, if provided. + */ + this.identity = name || 'unknown'; + /** + * Is this Object a spy? + */ + this.isSpy = true; + /** + * The actual function this spy stubs. + */ + this.plan = function() { + }; + /** + * Tracking of the most recent call to the spy. + * @example + * var mySpy = jasmine.createSpy('foo'); + * mySpy(1, 2); + * mySpy.mostRecentCall.args = [1, 2]; + */ + this.mostRecentCall = {}; + + /** + * Holds arguments for each call to the spy, indexed by call count + * @example + * var mySpy = jasmine.createSpy('foo'); + * mySpy(1, 2); + * mySpy(7, 8); + * mySpy.mostRecentCall.args = [7, 8]; + * mySpy.argsForCall[0] = [1, 2]; + * mySpy.argsForCall[1] = [7, 8]; + */ + this.argsForCall = []; + this.calls = []; +}; + +/** + * Tells a spy to call through to the actual implemenatation. + * + * @example + * var foo = { + * bar: function() { // do some stuff } + * } + * + * // defining a spy on an existing property: foo.bar + * spyOn(foo, 'bar').andCallThrough(); + */ +jasmine.Spy.prototype.andCallThrough = function() { + this.plan = this.originalValue; + return this; +}; + +/** + * For setting the return value of a spy. + * + * @example + * // defining a spy from scratch: foo() returns 'baz' + * var foo = jasmine.createSpy('spy on foo').andReturn('baz'); + * + * // defining a spy on an existing property: foo.bar() returns 'baz' + * spyOn(foo, 'bar').andReturn('baz'); + * + * @param {Object} value + */ +jasmine.Spy.prototype.andReturn = function(value) { + this.plan = function() { + return value; + }; + return this; +}; + +/** + * For throwing an exception when a spy is called. + * + * @example + * // defining a spy from scratch: foo() throws an exception w/ message 'ouch' + * var foo = jasmine.createSpy('spy on foo').andThrow('baz'); + * + * // defining a spy on an existing property: foo.bar() throws an exception w/ message 'ouch' + * spyOn(foo, 'bar').andThrow('baz'); + * + * @param {String} exceptionMsg + */ +jasmine.Spy.prototype.andThrow = function(exceptionMsg) { + this.plan = function() { + throw exceptionMsg; + }; + return this; +}; + +/** + * Calls an alternate implementation when a spy is called. + * + * @example + * var baz = function() { + * // do some stuff, return something + * } + * // defining a spy from scratch: foo() calls the function baz + * var foo = jasmine.createSpy('spy on foo').andCall(baz); + * + * // defining a spy on an existing property: foo.bar() calls an anonymnous function + * spyOn(foo, 'bar').andCall(function() { return 'baz';} ); + * + * @param {Function} fakeFunc + */ +jasmine.Spy.prototype.andCallFake = function(fakeFunc) { + this.plan = fakeFunc; + return this; +}; + +/** + * Resets all of a spy's the tracking variables so that it can be used again. + * + * @example + * spyOn(foo, 'bar'); + * + * foo.bar(); + * + * expect(foo.bar.callCount).toEqual(1); + * + * foo.bar.reset(); + * + * expect(foo.bar.callCount).toEqual(0); + */ +jasmine.Spy.prototype.reset = function() { + this.wasCalled = false; + this.callCount = 0; + this.argsForCall = []; + this.calls = []; + this.mostRecentCall = {}; +}; + +jasmine.createSpy = function(name) { + + var spyObj = function() { + spyObj.wasCalled = true; + spyObj.callCount++; + var args = jasmine.util.argsToArray(arguments); + spyObj.mostRecentCall.object = this; + spyObj.mostRecentCall.args = args; + spyObj.argsForCall.push(args); + spyObj.calls.push({object: this, args: args}); + return spyObj.plan.apply(this, arguments); + }; + + var spy = new jasmine.Spy(name); + + for (var prop in spy) { + spyObj[prop] = spy[prop]; + } + + spyObj.reset(); + + return spyObj; +}; + +/** + * Determines whether an object is a spy. + * + * @param {jasmine.Spy|Object} putativeSpy + * @returns {Boolean} + */ +jasmine.isSpy = function(putativeSpy) { + return putativeSpy && putativeSpy.isSpy; +}; + +/** + * Creates a more complicated spy: an Object that has every property a function that is a spy. Used for stubbing something + * large in one call. + * + * @param {String} baseName name of spy class + * @param {Array} methodNames array of names of methods to make spies + */ +jasmine.createSpyObj = function(baseName, methodNames) { + if (!jasmine.isArray_(methodNames) || methodNames.length === 0) { + throw new Error('createSpyObj requires a non-empty array of method names to create spies for'); + } + var obj = {}; + for (var i = 0; i < methodNames.length; i++) { + obj[methodNames[i]] = jasmine.createSpy(baseName + '.' + methodNames[i]); + } + return obj; +}; + +/** + * All parameters are pretty-printed and concatenated together, then written to the current spec's output. + * + * Be careful not to leave calls to <code>jasmine.log</code> in production code. + */ +jasmine.log = function() { + var spec = jasmine.getEnv().currentSpec; + spec.log.apply(spec, arguments); +}; + +/** + * Function that installs a spy on an existing object's method name. Used within a Spec to create a spy. + * + * @example + * // spy example + * var foo = { + * not: function(bool) { return !bool; } + * } + * spyOn(foo, 'not'); // actual foo.not will not be called, execution stops + * + * @see jasmine.createSpy + * @param obj + * @param methodName + * @return {jasmine.Spy} a Jasmine spy that can be chained with all spy methods + */ +var spyOn = function(obj, methodName) { + return jasmine.getEnv().currentSpec.spyOn(obj, methodName); +}; +if (isCommonJS) exports.spyOn = spyOn; + +/** + * Creates a Jasmine spec that will be added to the current suite. + * + * // TODO: pending tests + * + * @example + * it('should be true', function() { + * expect(true).toEqual(true); + * }); + * + * @param {String} desc description of this specification + * @param {Function} func defines the preconditions and expectations of the spec + */ +var it = function(desc, func) { + return jasmine.getEnv().it(desc, func); +}; +if (isCommonJS) exports.it = it; + +/** + * Creates a <em>disabled</em> Jasmine spec. + * + * A convenience method that allows existing specs to be disabled temporarily during development. + * + * @param {String} desc description of this specification + * @param {Function} func defines the preconditions and expectations of the spec + */ +var xit = function(desc, func) { + return jasmine.getEnv().xit(desc, func); +}; +if (isCommonJS) exports.xit = xit; + +/** + * Starts a chain for a Jasmine expectation. + * + * It is passed an Object that is the actual value and should chain to one of the many + * jasmine.Matchers functions. + * + * @param {Object} actual Actual value to test against and expected value + * @return {jasmine.Matchers} + */ +var expect = function(actual) { + return jasmine.getEnv().currentSpec.expect(actual); +}; +if (isCommonJS) exports.expect = expect; + +/** + * Defines part of a jasmine spec. Used in cominbination with waits or waitsFor in asynchrnous specs. + * + * @param {Function} func Function that defines part of a jasmine spec. + */ +var runs = function(func) { + jasmine.getEnv().currentSpec.runs(func); +}; +if (isCommonJS) exports.runs = runs; + +/** + * Waits a fixed time period before moving to the next block. + * + * @deprecated Use waitsFor() instead + * @param {Number} timeout milliseconds to wait + */ +var waits = function(timeout) { + jasmine.getEnv().currentSpec.waits(timeout); +}; +if (isCommonJS) exports.waits = waits; + +/** + * Waits for the latchFunction to return true before proceeding to the next block. + * + * @param {Function} latchFunction + * @param {String} optional_timeoutMessage + * @param {Number} optional_timeout + */ +var waitsFor = function(latchFunction, optional_timeoutMessage, optional_timeout) { + jasmine.getEnv().currentSpec.waitsFor.apply(jasmine.getEnv().currentSpec, arguments); +}; +if (isCommonJS) exports.waitsFor = waitsFor; + +/** + * A function that is called before each spec in a suite. + * + * Used for spec setup, including validating assumptions. + * + * @param {Function} beforeEachFunction + */ +var beforeEach = function(beforeEachFunction) { + jasmine.getEnv().beforeEach(beforeEachFunction); +}; +if (isCommonJS) exports.beforeEach = beforeEach; + +/** + * A function that is called after each spec in a suite. + * + * Used for restoring any state that is hijacked during spec execution. + * + * @param {Function} afterEachFunction + */ +var afterEach = function(afterEachFunction) { + jasmine.getEnv().afterEach(afterEachFunction); +}; +if (isCommonJS) exports.afterEach = afterEach; + +/** + * Defines a suite of specifications. + * + * Stores the description and all defined specs in the Jasmine environment as one suite of specs. Variables declared + * are accessible by calls to beforeEach, it, and afterEach. Describe blocks can be nested, allowing for specialization + * of setup in some tests. + * + * @example + * // TODO: a simple suite + * + * // TODO: a simple suite with a nested describe block + * + * @param {String} description A string, usually the class under test. + * @param {Function} specDefinitions function that defines several specs. + */ +var describe = function(description, specDefinitions) { + return jasmine.getEnv().describe(description, specDefinitions); +}; +if (isCommonJS) exports.describe = describe; + +/** + * Disables a suite of specifications. Used to disable some suites in a file, or files, temporarily during development. + * + * @param {String} description A string, usually the class under test. + * @param {Function} specDefinitions function that defines several specs. + */ +var xdescribe = function(description, specDefinitions) { + return jasmine.getEnv().xdescribe(description, specDefinitions); +}; +if (isCommonJS) exports.xdescribe = xdescribe; + + +// Provide the XMLHttpRequest class for IE 5.x-6.x: +jasmine.XmlHttpRequest = (typeof XMLHttpRequest == "undefined") ? function() { + function tryIt(f) { + try { + return f(); + } catch(e) { + } + return null; + } + + var xhr = tryIt(function() { + return new ActiveXObject("Msxml2.XMLHTTP.6.0"); + }) || + tryIt(function() { + return new ActiveXObject("Msxml2.XMLHTTP.3.0"); + }) || + tryIt(function() { + return new ActiveXObject("Msxml2.XMLHTTP"); + }) || + tryIt(function() { + return new ActiveXObject("Microsoft.XMLHTTP"); + }); + + if (!xhr) throw new Error("This browser does not support XMLHttpRequest."); + + return xhr; +} : XMLHttpRequest; +/** + * @namespace + */ +jasmine.util = {}; + +/** + * Declare that a child class inherit it's prototype from the parent class. + * + * @private + * @param {Function} childClass + * @param {Function} parentClass + */ +jasmine.util.inherit = function(childClass, parentClass) { + /** + * @private + */ + var subclass = function() { + }; + subclass.prototype = parentClass.prototype; + childClass.prototype = new subclass(); +}; + +jasmine.util.formatException = function(e) { + var lineNumber; + if (e.line) { + lineNumber = e.line; + } + else if (e.lineNumber) { + lineNumber = e.lineNumber; + } + + var file; + + if (e.sourceURL) { + file = e.sourceURL; + } + else if (e.fileName) { + file = e.fileName; + } + + var message = (e.name && e.message) ? (e.name + ': ' + e.message) : e.toString(); + + if (file && lineNumber) { + message += ' in ' + file + ' (line ' + lineNumber + ')'; + } + + return message; +}; + +jasmine.util.htmlEscape = function(str) { + if (!str) return str; + return str.replace(/&/g, '&') + .replace(/</g, '<') + .replace(/>/g, '>'); +}; + +jasmine.util.argsToArray = function(args) { + var arrayOfArgs = []; + for (var i = 0; i < args.length; i++) arrayOfArgs.push(args[i]); + return arrayOfArgs; +}; + +jasmine.util.extend = function(destination, source) { + for (var property in source) destination[property] = source[property]; + return destination; +}; + +/** + * Environment for Jasmine + * + * @constructor + */ +jasmine.Env = function() { + this.currentSpec = null; + this.currentSuite = null; + this.currentRunner_ = new jasmine.Runner(this); + + this.reporter = new jasmine.MultiReporter(); + + this.updateInterval = jasmine.DEFAULT_UPDATE_INTERVAL; + this.defaultTimeoutInterval = jasmine.DEFAULT_TIMEOUT_INTERVAL; + this.lastUpdate = 0; + this.specFilter = function() { + return true; + }; + + this.nextSpecId_ = 0; + this.nextSuiteId_ = 0; + this.equalityTesters_ = []; + + // wrap matchers + this.matchersClass = function() { + jasmine.Matchers.apply(this, arguments); + }; + jasmine.util.inherit(this.matchersClass, jasmine.Matchers); + + jasmine.Matchers.wrapInto_(jasmine.Matchers.prototype, this.matchersClass); +}; + + +jasmine.Env.prototype.setTimeout = jasmine.setTimeout; +jasmine.Env.prototype.clearTimeout = jasmine.clearTimeout; +jasmine.Env.prototype.setInterval = jasmine.setInterval; +jasmine.Env.prototype.clearInterval = jasmine.clearInterval; + +/** + * @returns an object containing jasmine version build info, if set. + */ +jasmine.Env.prototype.version = function () { + if (jasmine.version_) { + return jasmine.version_; + } else { + throw new Error('Version not set'); + } +}; + +/** + * @returns string containing jasmine version build info, if set. + */ +jasmine.Env.prototype.versionString = function() { + if (!jasmine.version_) { + return "version unknown"; + } + + var version = this.version(); + var versionString = version.major + "." + version.minor + "." + version.build; + if (version.release_candidate) { + versionString += ".rc" + version.release_candidate; + } + versionString += " revision " + version.revision; + return versionString; +}; + +/** + * @returns a sequential integer starting at 0 + */ +jasmine.Env.prototype.nextSpecId = function () { + return this.nextSpecId_++; +}; + +/** + * @returns a sequential integer starting at 0 + */ +jasmine.Env.prototype.nextSuiteId = function () { + return this.nextSuiteId_++; +}; + +/** + * Register a reporter to receive status updates from Jasmine. + * @param {jasmine.Reporter} reporter An object which will receive status updates. + */ +jasmine.Env.prototype.addReporter = function(reporter) { + this.reporter.addReporter(reporter); +}; + +jasmine.Env.prototype.execute = function() { + this.currentRunner_.execute(); +}; + +jasmine.Env.prototype.describe = function(description, specDefinitions) { + var suite = new jasmine.Suite(this, description, specDefinitions, this.currentSuite); + + var parentSuite = this.currentSuite; + if (parentSuite) { + parentSuite.add(suite); + } else { + this.currentRunner_.add(suite); + } + + this.currentSuite = suite; + + var declarationError = null; + try { + specDefinitions.call(suite); + } catch(e) { + declarationError = e; + } + + if (declarationError) { + this.it("encountered a declaration exception", function() { + throw declarationError; + }); + } + + this.currentSuite = parentSuite; + + return suite; +}; + +jasmine.Env.prototype.beforeEach = function(beforeEachFunction) { + if (this.currentSuite) { + this.currentSuite.beforeEach(beforeEachFunction); + } else { + this.currentRunner_.beforeEach(beforeEachFunction); + } +}; + +jasmine.Env.prototype.currentRunner = function () { + return this.currentRunner_; +}; + +jasmine.Env.prototype.afterEach = function(afterEachFunction) { + if (this.currentSuite) { + this.currentSuite.afterEach(afterEachFunction); + } else { + this.currentRunner_.afterEach(afterEachFunction); + } + +}; + +jasmine.Env.prototype.xdescribe = function(desc, specDefinitions) { + return { + execute: function() { + } + }; +}; + +jasmine.Env.prototype.it = function(description, func) { + var spec = new jasmine.Spec(this, this.currentSuite, description); + this.currentSuite.add(spec); + this.currentSpec = spec; + + if (func) { + spec.runs(func); + } + + return spec; +}; + +jasmine.Env.prototype.xit = function(desc, func) { + return { + id: this.nextSpecId(), + runs: function() { + } + }; +}; + +jasmine.Env.prototype.compareRegExps_ = function(a, b, mismatchKeys, mismatchValues) { + if (a.source != b.source) + mismatchValues.push("expected pattern /" + b.source + "/ is not equal to the pattern /" + a.source + "/"); + + if (a.ignoreCase != b.ignoreCase) + mismatchValues.push("expected modifier i was" + (b.ignoreCase ? " " : " not ") + "set and does not equal the origin modifier"); + + if (a.global != b.global) + mismatchValues.push("expected modifier g was" + (b.global ? " " : " not ") + "set and does not equal the origin modifier"); + + if (a.multiline != b.multiline) + mismatchValues.push("expected modifier m was" + (b.multiline ? " " : " not ") + "set and does not equal the origin modifier"); + + if (a.sticky != b.sticky) + mismatchValues.push("expected modifier y was" + (b.sticky ? " " : " not ") + "set and does not equal the origin modifier"); + + return (mismatchValues.length === 0); +}; + +jasmine.Env.prototype.compareObjects_ = function(a, b, mismatchKeys, mismatchValues) { + if (a.__Jasmine_been_here_before__ === b && b.__Jasmine_been_here_before__ === a) { + return true; + } + + a.__Jasmine_been_here_before__ = b; + b.__Jasmine_been_here_before__ = a; + + var hasKey = function(obj, keyName) { + return obj !== null && obj[keyName] !== jasmine.undefined; + }; + + for (var property in b) { + if (!hasKey(a, property) && hasKey(b, property)) { + mismatchKeys.push("expected has key '" + property + "', but missing from actual."); + } + } + for (property in a) { + if (!hasKey(b, property) && hasKey(a, property)) { + mismatchKeys.push("expected missing key '" + property + "', but present in actual."); + } + } + for (property in b) { + if (property == '__Jasmine_been_here_before__') continue; + if (!this.equals_(a[property], b[property], mismatchKeys, mismatchValues)) { + mismatchValues.push("'" + property + "' was '" + (b[property] ? jasmine.util.htmlEscape(b[property].toString()) : b[property]) + "' in expected, but was '" + (a[property] ? jasmine.util.htmlEscape(a[property].toString()) : a[property]) + "' in actual."); + } + } + + if (jasmine.isArray_(a) && jasmine.isArray_(b) && a.length != b.length) { + mismatchValues.push("arrays were not the same length"); + } + + delete a.__Jasmine_been_here_before__; + delete b.__Jasmine_been_here_before__; + return (mismatchKeys.length === 0 && mismatchValues.length === 0); +}; + +jasmine.Env.prototype.equals_ = function(a, b, mismatchKeys, mismatchValues) { + mismatchKeys = mismatchKeys || []; + mismatchValues = mismatchValues || []; + + for (var i = 0; i < this.equalityTesters_.length; i++) { + var equalityTester = this.equalityTesters_[i]; + var result = equalityTester(a, b, this, mismatchKeys, mismatchValues); + if (result !== jasmine.undefined) return result; + } + + if (a === b) return true; + + if (a === jasmine.undefined || a === null || b === jasmine.undefined || b === null) { + return (a == jasmine.undefined && b == jasmine.undefined); + } + + if (jasmine.isDomNode(a) && jasmine.isDomNode(b)) { + return a === b; + } + + if (a instanceof Date && b instanceof Date) { + return a.getTime() == b.getTime(); + } + + if (a.jasmineMatches) { + return a.jasmineMatches(b); + } + + if (b.jasmineMatches) { + return b.jasmineMatches(a); + } + + if (a instanceof jasmine.Matchers.ObjectContaining) { + return a.matches(b); + } + + if (b instanceof jasmine.Matchers.ObjectContaining) { + return b.matches(a); + } + + if (jasmine.isString_(a) && jasmine.isString_(b)) { + return (a == b); + } + + if (jasmine.isNumber_(a) && jasmine.isNumber_(b)) { + return (a == b); + } + + if (a instanceof RegExp && b instanceof RegExp) { + return this.compareRegExps_(a, b, mismatchKeys, mismatchValues); + } + + if (typeof a === "object" && typeof b === "object") { + return this.compareObjects_(a, b, mismatchKeys, mismatchValues); + } + + //Straight check + return (a === b); +}; + +jasmine.Env.prototype.contains_ = function(haystack, needle) { + if (jasmine.isArray_(haystack)) { + for (var i = 0; i < haystack.length; i++) { + if (this.equals_(haystack[i], needle)) return true; + } + return false; + } + return haystack.indexOf(needle) >= 0; +}; + +jasmine.Env.prototype.addEqualityTester = function(equalityTester) { + this.equalityTesters_.push(equalityTester); +}; +/** No-op base class for Jasmine reporters. + * + * @constructor + */ +jasmine.Reporter = function() { +}; + +//noinspection JSUnusedLocalSymbols +jasmine.Reporter.prototype.reportRunnerStarting = function(runner) { +}; + +//noinspection JSUnusedLocalSymbols +jasmine.Reporter.prototype.reportRunnerResults = function(runner) { +}; + +//noinspection JSUnusedLocalSymbols +jasmine.Reporter.prototype.reportSuiteResults = function(suite) { +}; + +//noinspection JSUnusedLocalSymbols +jasmine.Reporter.prototype.reportSpecStarting = function(spec) { +}; + +//noinspection JSUnusedLocalSymbols +jasmine.Reporter.prototype.reportSpecResults = function(spec) { +}; + +//noinspection JSUnusedLocalSymbols +jasmine.Reporter.prototype.log = function(str) { +}; + +/** + * Blocks are functions with executable code that make up a spec. + * + * @constructor + * @param {jasmine.Env} env + * @param {Function} func + * @param {jasmine.Spec} spec + */ +jasmine.Block = function(env, func, spec) { + this.env = env; + this.func = func; + this.spec = spec; +}; + +jasmine.Block.prototype.execute = function(onComplete) { + if (!jasmine.CATCH_EXCEPTIONS) { + this.func.apply(this.spec); + } + else { + try { + this.func.apply(this.spec); + } catch (e) { + this.spec.fail(e); + } + } + onComplete(); +}; +/** JavaScript API reporter. + * + * @constructor + */ +jasmine.JsApiReporter = function() { + this.started = false; + this.finished = false; + this.suites_ = []; + this.results_ = {}; +}; + +jasmine.JsApiReporter.prototype.reportRunnerStarting = function(runner) { + this.started = true; + var suites = runner.topLevelSuites(); + for (var i = 0; i < suites.length; i++) { + var suite = suites[i]; + this.suites_.push(this.summarize_(suite)); + } +}; + +jasmine.JsApiReporter.prototype.suites = function() { + return this.suites_; +}; + +jasmine.JsApiReporter.prototype.summarize_ = function(suiteOrSpec) { + var isSuite = suiteOrSpec instanceof jasmine.Suite; + var summary = { + id: suiteOrSpec.id, + name: suiteOrSpec.description, + type: isSuite ? 'suite' : 'spec', + children: [] + }; + + if (isSuite) { + var children = suiteOrSpec.children(); + for (var i = 0; i < children.length; i++) { + summary.children.push(this.summarize_(children[i])); + } + } + return summary; +}; + +jasmine.JsApiReporter.prototype.results = function() { + return this.results_; +}; + +jasmine.JsApiReporter.prototype.resultsForSpec = function(specId) { + return this.results_[specId]; +}; + +//noinspection JSUnusedLocalSymbols +jasmine.JsApiReporter.prototype.reportRunnerResults = function(runner) { + this.finished = true; +}; + +//noinspection JSUnusedLocalSymbols +jasmine.JsApiReporter.prototype.reportSuiteResults = function(suite) { +}; + +//noinspection JSUnusedLocalSymbols +jasmine.JsApiReporter.prototype.reportSpecResults = function(spec) { + this.results_[spec.id] = { + messages: spec.results().getItems(), + result: spec.results().failedCount > 0 ? "failed" : "passed" + }; +}; + +//noinspection JSUnusedLocalSymbols +jasmine.JsApiReporter.prototype.log = function(str) { +}; + +jasmine.JsApiReporter.prototype.resultsForSpecs = function(specIds){ + var results = {}; + for (var i = 0; i < specIds.length; i++) { + var specId = specIds[i]; + results[specId] = this.summarizeResult_(this.results_[specId]); + } + return results; +}; + +jasmine.JsApiReporter.prototype.summarizeResult_ = function(result){ + var summaryMessages = []; + var messagesLength = result.messages.length; + for (var messageIndex = 0; messageIndex < messagesLength; messageIndex++) { + var resultMessage = result.messages[messageIndex]; + summaryMessages.push({ + text: resultMessage.type == 'log' ? resultMessage.toString() : jasmine.undefined, + passed: resultMessage.passed ? resultMessage.passed() : true, + type: resultMessage.type, + message: resultMessage.message, + trace: { + stack: resultMessage.passed && !resultMessage.passed() ? resultMessage.trace.stack : jasmine.undefined + } + }); + } + + return { + result : result.result, + messages : summaryMessages + }; +}; + +/** + * @constructor + * @param {jasmine.Env} env + * @param actual + * @param {jasmine.Spec} spec + */ +jasmine.Matchers = function(env, actual, spec, opt_isNot) { + this.env = env; + this.actual = actual; + this.spec = spec; + this.isNot = opt_isNot || false; + this.reportWasCalled_ = false; +}; + +// todo: @deprecated as of Jasmine 0.11, remove soon [xw] +jasmine.Matchers.pp = function(str) { + throw new Error("jasmine.Matchers.pp() is no longer supported, please use jasmine.pp() instead!"); +}; + +// todo: @deprecated Deprecated as of Jasmine 0.10. Rewrite your custom matchers to return true or false. [xw] +jasmine.Matchers.prototype.report = function(result, failing_message, details) { + throw new Error("As of jasmine 0.11, custom matchers must be implemented differently -- please see jasmine docs"); +}; + +jasmine.Matchers.wrapInto_ = function(prototype, matchersClass) { + for (var methodName in prototype) { + if (methodName == 'report') continue; + var orig = prototype[methodName]; + matchersClass.prototype[methodName] = jasmine.Matchers.matcherFn_(methodName, orig); + } +}; + +jasmine.Matchers.matcherFn_ = function(matcherName, matcherFunction) { + return function() { + var matcherArgs = jasmine.util.argsToArray(arguments); + var result = matcherFunction.apply(this, arguments); + + if (this.isNot) { + result = !result; + } + + if (this.reportWasCalled_) return result; + + var message; + if (!result) { + if (this.message) { + message = this.message.apply(this, arguments); + if (jasmine.isArray_(message)) { + message = message[this.isNot ? 1 : 0]; + } + } else { + var englishyPredicate = matcherName.replace(/[A-Z]/g, function(s) { return ' ' + s.toLowerCase(); }); + message = "Expected " + jasmine.pp(this.actual) + (this.isNot ? " not " : " ") + englishyPredicate; + if (matcherArgs.length > 0) { + for (var i = 0; i < matcherArgs.length; i++) { + if (i > 0) message += ","; + message += " " + jasmine.pp(matcherArgs[i]); + } + } + message += "."; + } + } + var expectationResult = new jasmine.ExpectationResult({ + matcherName: matcherName, + passed: result, + expected: matcherArgs.length > 1 ? matcherArgs : matcherArgs[0], + actual: this.actual, + message: message + }); + this.spec.addMatcherResult(expectationResult); + return jasmine.undefined; + }; +}; + + + + +/** + * toBe: compares the actual to the expected using === + * @param expected + */ +jasmine.Matchers.prototype.toBe = function(expected) { + return this.actual === expected; +}; + +/** + * toNotBe: compares the actual to the expected using !== + * @param expected + * @deprecated as of 1.0. Use not.toBe() instead. + */ +jasmine.Matchers.prototype.toNotBe = function(expected) { + return this.actual !== expected; +}; + +/** + * toEqual: compares the actual to the expected using common sense equality. Handles Objects, Arrays, etc. + * + * @param expected + */ +jasmine.Matchers.prototype.toEqual = function(expected) { + return this.env.equals_(this.actual, expected); +}; + +/** + * toNotEqual: compares the actual to the expected using the ! of jasmine.Matchers.toEqual + * @param expected + * @deprecated as of 1.0. Use not.toEqual() instead. + */ +jasmine.Matchers.prototype.toNotEqual = function(expected) { + return !this.env.equals_(this.actual, expected); +}; + +/** + * Matcher that compares the actual to the expected using a regular expression. Constructs a RegExp, so takes + * a pattern or a String. + * + * @param expected + */ +jasmine.Matchers.prototype.toMatch = function(expected) { + return new RegExp(expected).test(this.actual); +}; + +/** + * Matcher that compares the actual to the expected using the boolean inverse of jasmine.Matchers.toMatch + * @param expected + * @deprecated as of 1.0. Use not.toMatch() instead. + */ +jasmine.Matchers.prototype.toNotMatch = function(expected) { + return !(new RegExp(expected).test(this.actual)); +}; + +/** + * Matcher that compares the actual to jasmine.undefined. + */ +jasmine.Matchers.prototype.toBeDefined = function() { + return (this.actual !== jasmine.undefined); +}; + +/** + * Matcher that compares the actual to jasmine.undefined. + */ +jasmine.Matchers.prototype.toBeUndefined = function() { + return (this.actual === jasmine.undefined); +}; + +/** + * Matcher that compares the actual to null. + */ +jasmine.Matchers.prototype.toBeNull = function() { + return (this.actual === null); +}; + +/** + * Matcher that compares the actual to NaN. + */ +jasmine.Matchers.prototype.toBeNaN = function() { + this.message = function() { + return [ "Expected " + jasmine.pp(this.actual) + " to be NaN." ]; + }; + + return (this.actual !== this.actual); +}; + +/** + * Matcher that boolean not-nots the actual. + */ +jasmine.Matchers.prototype.toBeTruthy = function() { + return !!this.actual; +}; + + +/** + * Matcher that boolean nots the actual. + */ +jasmine.Matchers.prototype.toBeFalsy = function() { + return !this.actual; +}; + + +/** + * Matcher that checks to see if the actual, a Jasmine spy, was called. + */ +jasmine.Matchers.prototype.toHaveBeenCalled = function() { + if (arguments.length > 0) { + throw new Error('toHaveBeenCalled does not take arguments, use toHaveBeenCalledWith'); + } + + if (!jasmine.isSpy(this.actual)) { + throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.'); + } + + this.message = function() { + return [ + "Expected spy " + this.actual.identity + " to have been called.", + "Expected spy " + this.actual.identity + " not to have been called." + ]; + }; + + return this.actual.wasCalled; +}; + +/** @deprecated Use expect(xxx).toHaveBeenCalled() instead */ +jasmine.Matchers.prototype.wasCalled = jasmine.Matchers.prototype.toHaveBeenCalled; + +/** + * Matcher that checks to see if the actual, a Jasmine spy, was not called. + * + * @deprecated Use expect(xxx).not.toHaveBeenCalled() instead + */ +jasmine.Matchers.prototype.wasNotCalled = function() { + if (arguments.length > 0) { + throw new Error('wasNotCalled does not take arguments'); + } + + if (!jasmine.isSpy(this.actual)) { + throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.'); + } + + this.message = function() { + return [ + "Expected spy " + this.actual.identity + " to not have been called.", + "Expected spy " + this.actual.identity + " to have been called." + ]; + }; + + return !this.actual.wasCalled; +}; + +/** + * Matcher that checks to see if the actual, a Jasmine spy, was called with a set of parameters. + * + * @example + * + */ +jasmine.Matchers.prototype.toHaveBeenCalledWith = function() { + var expectedArgs = jasmine.util.argsToArray(arguments); + if (!jasmine.isSpy(this.actual)) { + throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.'); + } + this.message = function() { + var invertedMessage = "Expected spy " + this.actual.identity + " not to have been called with " + jasmine.pp(expectedArgs) + " but it was."; + var positiveMessage = ""; + if (this.actual.callCount === 0) { + positiveMessage = "Expected spy " + this.actual.identity + " to have been called with " + jasmine.pp(expectedArgs) + " but it was never called."; + } else { + positiveMessage = "Expected spy " + this.actual.identity + " to have been called with " + jasmine.pp(expectedArgs) + " but actual calls were " + jasmine.pp(this.actual.argsForCall).replace(/^\[ | \]$/g, '') + } + return [positiveMessage, invertedMessage]; + }; + + return this.env.contains_(this.actual.argsForCall, expectedArgs); +}; + +/** @deprecated Use expect(xxx).toHaveBeenCalledWith() instead */ +jasmine.Matchers.prototype.wasCalledWith = jasmine.Matchers.prototype.toHaveBeenCalledWith; + +/** @deprecated Use expect(xxx).not.toHaveBeenCalledWith() instead */ +jasmine.Matchers.prototype.wasNotCalledWith = function() { + var expectedArgs = jasmine.util.argsToArray(arguments); + if (!jasmine.isSpy(this.actual)) { + throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.'); + } + + this.message = function() { + return [ + "Expected spy not to have been called with " + jasmine.pp(expectedArgs) + " but it was", + "Expected spy to have been called with " + jasmine.pp(expectedArgs) + " but it was" + ]; + }; + + return !this.env.contains_(this.actual.argsForCall, expectedArgs); +}; + +/** + * Matcher that checks that the expected item is an element in the actual Array. + * + * @param {Object} expected + */ +jasmine.Matchers.prototype.toContain = function(expected) { + return this.env.contains_(this.actual, expected); +}; + +/** + * Matcher that checks that the expected item is NOT an element in the actual Array. + * + * @param {Object} expected + * @deprecated as of 1.0. Use not.toContain() instead. + */ +jasmine.Matchers.prototype.toNotContain = function(expected) { + return !this.env.contains_(this.actual, expected); +}; + +jasmine.Matchers.prototype.toBeLessThan = function(expected) { + return this.actual < expected; +}; + +jasmine.Matchers.prototype.toBeGreaterThan = function(expected) { + return this.actual > expected; +}; + +/** + * Matcher that checks that the expected item is equal to the actual item + * up to a given level of decimal precision (default 2). + * + * @param {Number} expected + * @param {Number} precision, as number of decimal places + */ +jasmine.Matchers.prototype.toBeCloseTo = function(expected, precision) { + if (!(precision === 0)) { + precision = precision || 2; + } + return Math.abs(expected - this.actual) < (Math.pow(10, -precision) / 2); +}; + +/** + * Matcher that checks that the expected exception was thrown by the actual. + * + * @param {String} [expected] + */ +jasmine.Matchers.prototype.toThrow = function(expected) { + var result = false; + var exception; + if (typeof this.actual != 'function') { + throw new Error('Actual is not a function'); + } + try { + this.actual(); + } catch (e) { + exception = e; + } + if (exception) { + result = (expected === jasmine.undefined || this.env.equals_(exception.message || exception, expected.message || expected)); + } + + var not = this.isNot ? "not " : ""; + + this.message = function() { + if (exception && (expected === jasmine.undefined || !this.env.equals_(exception.message || exception, expected.message || expected))) { + return ["Expected function " + not + "to throw", expected ? expected.message || expected : "an exception", ", but it threw", exception.message || exception].join(' '); + } else { + return "Expected function to throw an exception."; + } + }; + + return result; +}; + +jasmine.Matchers.Any = function(expectedClass) { + this.expectedClass = expectedClass; +}; + +jasmine.Matchers.Any.prototype.jasmineMatches = function(other) { + if (this.expectedClass == String) { + return typeof other == 'string' || other instanceof String; + } + + if (this.expectedClass == Number) { + return typeof other == 'number' || other instanceof Number; + } + + if (this.expectedClass == Function) { + return typeof other == 'function' || other instanceof Function; + } + + if (this.expectedClass == Object) { + return typeof other == 'object'; + } + + return other instanceof this.expectedClass; +}; + +jasmine.Matchers.Any.prototype.jasmineToString = function() { + return '<jasmine.any(' + this.expectedClass + ')>'; +}; + +jasmine.Matchers.ObjectContaining = function (sample) { + this.sample = sample; +}; + +jasmine.Matchers.ObjectContaining.prototype.jasmineMatches = function(other, mismatchKeys, mismatchValues) { + mismatchKeys = mismatchKeys || []; + mismatchValues = mismatchValues || []; + + var env = jasmine.getEnv(); + + var hasKey = function(obj, keyName) { + return obj != null && obj[keyName] !== jasmine.undefined; + }; + + for (var property in this.sample) { + if (!hasKey(other, property) && hasKey(this.sample, property)) { + mismatchKeys.push("expected has key '" + property + "', but missing from actual."); + } + else if (!env.equals_(this.sample[property], other[property], mismatchKeys, mismatchValues)) { + mismatchValues.push("'" + property + "' was '" + (other[property] ? jasmine.util.htmlEscape(other[property].toString()) : other[property]) + "' in expected, but was '" + (this.sample[property] ? jasmine.util.htmlEscape(this.sample[property].toString()) : this.sample[property]) + "' in actual."); + } + } + + return (mismatchKeys.length === 0 && mismatchValues.length === 0); +}; + +jasmine.Matchers.ObjectContaining.prototype.jasmineToString = function () { + return "<jasmine.objectContaining(" + jasmine.pp(this.sample) + ")>"; +}; +// Mock setTimeout, clearTimeout +// Contributed by Pivotal Computer Systems, www.pivotalsf.com + +jasmine.FakeTimer = function() { + this.reset(); + + var self = this; + self.setTimeout = function(funcToCall, millis) { + self.timeoutsMade++; + self.scheduleFunction(self.timeoutsMade, funcToCall, millis, false); + return self.timeoutsMade; + }; + + self.setInterval = function(funcToCall, millis) { + self.timeoutsMade++; + self.scheduleFunction(self.timeoutsMade, funcToCall, millis, true); + return self.timeoutsMade; + }; + + self.clearTimeout = function(timeoutKey) { + self.scheduledFunctions[timeoutKey] = jasmine.undefined; + }; + + self.clearInterval = function(timeoutKey) { + self.scheduledFunctions[timeoutKey] = jasmine.undefined; + }; + +}; + +jasmine.FakeTimer.prototype.reset = function() { + this.timeoutsMade = 0; + this.scheduledFunctions = {}; + this.nowMillis = 0; +}; + +jasmine.FakeTimer.prototype.tick = function(millis) { + var oldMillis = this.nowMillis; + var newMillis = oldMillis + millis; + this.runFunctionsWithinRange(oldMillis, newMillis); + this.nowMillis = newMillis; +}; + +jasmine.FakeTimer.prototype.runFunctionsWithinRange = function(oldMillis, nowMillis) { + var scheduledFunc; + var funcsToRun = []; + for (var timeoutKey in this.scheduledFunctions) { + scheduledFunc = this.scheduledFunctions[timeoutKey]; + if (scheduledFunc != jasmine.undefined && + scheduledFunc.runAtMillis >= oldMillis && + scheduledFunc.runAtMillis <= nowMillis) { + funcsToRun.push(scheduledFunc); + this.scheduledFunctions[timeoutKey] = jasmine.undefined; + } + } + + if (funcsToRun.length > 0) { + funcsToRun.sort(function(a, b) { + return a.runAtMillis - b.runAtMillis; + }); + for (var i = 0; i < funcsToRun.length; ++i) { + try { + var funcToRun = funcsToRun[i]; + this.nowMillis = funcToRun.runAtMillis; + funcToRun.funcToCall(); + if (funcToRun.recurring) { + this.scheduleFunction(funcToRun.timeoutKey, + funcToRun.funcToCall, + funcToRun.millis, + true); + } + } catch(e) { + } + } + this.runFunctionsWithinRange(oldMillis, nowMillis); + } +}; + +jasmine.FakeTimer.prototype.scheduleFunction = function(timeoutKey, funcToCall, millis, recurring) { + this.scheduledFunctions[timeoutKey] = { + runAtMillis: this.nowMillis + millis, + funcToCall: funcToCall, + recurring: recurring, + timeoutKey: timeoutKey, + millis: millis + }; +}; + +/** + * @namespace + */ +jasmine.Clock = { + defaultFakeTimer: new jasmine.FakeTimer(), + + reset: function() { + jasmine.Clock.assertInstalled(); + jasmine.Clock.defaultFakeTimer.reset(); + }, + + tick: function(millis) { + jasmine.Clock.assertInstalled(); + jasmine.Clock.defaultFakeTimer.tick(millis); + }, + + runFunctionsWithinRange: function(oldMillis, nowMillis) { + jasmine.Clock.defaultFakeTimer.runFunctionsWithinRange(oldMillis, nowMillis); + }, + + scheduleFunction: function(timeoutKey, funcToCall, millis, recurring) { + jasmine.Clock.defaultFakeTimer.scheduleFunction(timeoutKey, funcToCall, millis, recurring); + }, + + useMock: function() { + if (!jasmine.Clock.isInstalled()) { + var spec = jasmine.getEnv().currentSpec; + spec.after(jasmine.Clock.uninstallMock); + + jasmine.Clock.installMock(); + } + }, + + installMock: function() { + jasmine.Clock.installed = jasmine.Clock.defaultFakeTimer; + }, + + uninstallMock: function() { + jasmine.Clock.assertInstalled(); + jasmine.Clock.installed = jasmine.Clock.real; + }, + + real: { + setTimeout: jasmine.getGlobal().setTimeout, + clearTimeout: jasmine.getGlobal().clearTimeout, + setInterval: jasmine.getGlobal().setInterval, + clearInterval: jasmine.getGlobal().clearInterval + }, + + assertInstalled: function() { + if (!jasmine.Clock.isInstalled()) { + throw new Error("Mock clock is not installed, use jasmine.Clock.useMock()"); + } + }, + + isInstalled: function() { + return jasmine.Clock.installed == jasmine.Clock.defaultFakeTimer; + }, + + installed: null +}; +jasmine.Clock.installed = jasmine.Clock.real; + +//else for IE support +jasmine.getGlobal().setTimeout = function(funcToCall, millis) { + if (jasmine.Clock.installed.setTimeout.apply) { + return jasmine.Clock.installed.setTimeout.apply(this, arguments); + } else { + return jasmine.Clock.installed.setTimeout(funcToCall, millis); + } +}; + +jasmine.getGlobal().setInterval = function(funcToCall, millis) { + if (jasmine.Clock.installed.setInterval.apply) { + return jasmine.Clock.installed.setInterval.apply(this, arguments); + } else { + return jasmine.Clock.installed.setInterval(funcToCall, millis); + } +}; + +jasmine.getGlobal().clearTimeout = function(timeoutKey) { + if (jasmine.Clock.installed.clearTimeout.apply) { + return jasmine.Clock.installed.clearTimeout.apply(this, arguments); + } else { + return jasmine.Clock.installed.clearTimeout(timeoutKey); + } +}; + +jasmine.getGlobal().clearInterval = function(timeoutKey) { + if (jasmine.Clock.installed.clearTimeout.apply) { + return jasmine.Clock.installed.clearInterval.apply(this, arguments); + } else { + return jasmine.Clock.installed.clearInterval(timeoutKey); + } +}; + +/** + * @constructor + */ +jasmine.MultiReporter = function() { + this.subReporters_ = []; +}; +jasmine.util.inherit(jasmine.MultiReporter, jasmine.Reporter); + +jasmine.MultiReporter.prototype.addReporter = function(reporter) { + this.subReporters_.push(reporter); +}; + +(function() { + var functionNames = [ + "reportRunnerStarting", + "reportRunnerResults", + "reportSuiteResults", + "reportSpecStarting", + "reportSpecResults", + "log" + ]; + for (var i = 0; i < functionNames.length; i++) { + var functionName = functionNames[i]; + jasmine.MultiReporter.prototype[functionName] = (function(functionName) { + return function() { + for (var j = 0; j < this.subReporters_.length; j++) { + var subReporter = this.subReporters_[j]; + if (subReporter[functionName]) { + subReporter[functionName].apply(subReporter, arguments); + } + } + }; + })(functionName); + } +})(); +/** + * Holds results for a set of Jasmine spec. Allows for the results array to hold another jasmine.NestedResults + * + * @constructor + */ +jasmine.NestedResults = function() { + /** + * The total count of results + */ + this.totalCount = 0; + /** + * Number of passed results + */ + this.passedCount = 0; + /** + * Number of failed results + */ + this.failedCount = 0; + /** + * Was this suite/spec skipped? + */ + this.skipped = false; + /** + * @ignore + */ + this.items_ = []; +}; + +/** + * Roll up the result counts. + * + * @param result + */ +jasmine.NestedResults.prototype.rollupCounts = function(result) { + this.totalCount += result.totalCount; + this.passedCount += result.passedCount; + this.failedCount += result.failedCount; +}; + +/** + * Adds a log message. + * @param values Array of message parts which will be concatenated later. + */ +jasmine.NestedResults.prototype.log = function(values) { + this.items_.push(new jasmine.MessageResult(values)); +}; + +/** + * Getter for the results: message & results. + */ +jasmine.NestedResults.prototype.getItems = function() { + return this.items_; +}; + +/** + * Adds a result, tracking counts (total, passed, & failed) + * @param {jasmine.ExpectationResult|jasmine.NestedResults} result + */ +jasmine.NestedResults.prototype.addResult = function(result) { + if (result.type != 'log') { + if (result.items_) { + this.rollupCounts(result); + } else { + this.totalCount++; + if (result.passed()) { + this.passedCount++; + } else { + this.failedCount++; + } + } + } + this.items_.push(result); +}; + +/** + * @returns {Boolean} True if <b>everything</b> below passed + */ +jasmine.NestedResults.prototype.passed = function() { + return this.passedCount === this.totalCount; +}; +/** + * Base class for pretty printing for expectation results. + */ +jasmine.PrettyPrinter = function() { + this.ppNestLevel_ = 0; +}; + +/** + * Formats a value in a nice, human-readable string. + * + * @param value + */ +jasmine.PrettyPrinter.prototype.format = function(value) { + this.ppNestLevel_++; + try { + if (value === jasmine.undefined) { + this.emitScalar('undefined'); + } else if (value === null) { + this.emitScalar('null'); + } else if (value === jasmine.getGlobal()) { + this.emitScalar('<global>'); + } else if (value.jasmineToString) { + this.emitScalar(value.jasmineToString()); + } else if (typeof value === 'string') { + this.emitString(value); + } else if (jasmine.isSpy(value)) { + this.emitScalar("spy on " + value.identity); + } else if (value instanceof RegExp) { + this.emitScalar(value.toString()); + } else if (typeof value === 'function') { + this.emitScalar('Function'); + } else if (typeof value.nodeType === 'number') { + this.emitScalar('HTMLNode'); + } else if (value instanceof Date) { + this.emitScalar('Date(' + value + ')'); + } else if (value.__Jasmine_been_here_before__) { + this.emitScalar('<circular reference: ' + (jasmine.isArray_(value) ? 'Array' : 'Object') + '>'); + } else if (jasmine.isArray_(value) || typeof value == 'object') { + value.__Jasmine_been_here_before__ = true; + if (jasmine.isArray_(value)) { + this.emitArray(value); + } else { + this.emitObject(value); + } + delete value.__Jasmine_been_here_before__; + } else { + this.emitScalar(value.toString()); + } + } finally { + this.ppNestLevel_--; + } +}; + +jasmine.PrettyPrinter.prototype.iterateObject = function(obj, fn) { + for (var property in obj) { + if (!obj.hasOwnProperty(property)) continue; + if (property == '__Jasmine_been_here_before__') continue; + fn(property, obj.__lookupGetter__ ? (obj.__lookupGetter__(property) !== jasmine.undefined && + obj.__lookupGetter__(property) !== null) : false); + } +}; + +jasmine.PrettyPrinter.prototype.emitArray = jasmine.unimplementedMethod_; +jasmine.PrettyPrinter.prototype.emitObject = jasmine.unimplementedMethod_; +jasmine.PrettyPrinter.prototype.emitScalar = jasmine.unimplementedMethod_; +jasmine.PrettyPrinter.prototype.emitString = jasmine.unimplementedMethod_; + +jasmine.StringPrettyPrinter = function() { + jasmine.PrettyPrinter.call(this); + + this.string = ''; +}; +jasmine.util.inherit(jasmine.StringPrettyPrinter, jasmine.PrettyPrinter); + +jasmine.StringPrettyPrinter.prototype.emitScalar = function(value) { + this.append(value); +}; + +jasmine.StringPrettyPrinter.prototype.emitString = function(value) { + this.append("'" + value + "'"); +}; + +jasmine.StringPrettyPrinter.prototype.emitArray = function(array) { + if (this.ppNestLevel_ > jasmine.MAX_PRETTY_PRINT_DEPTH) { + this.append("Array"); + return; + } + + this.append('[ '); + for (var i = 0; i < array.length; i++) { + if (i > 0) { + this.append(', '); + } + this.format(array[i]); + } + this.append(' ]'); +}; + +jasmine.StringPrettyPrinter.prototype.emitObject = function(obj) { + if (this.ppNestLevel_ > jasmine.MAX_PRETTY_PRINT_DEPTH) { + this.append("Object"); + return; + } + + var self = this; + this.append('{ '); + var first = true; + + this.iterateObject(obj, function(property, isGetter) { + if (first) { + first = false; + } else { + self.append(', '); + } + + self.append(property); + self.append(' : '); + if (isGetter) { + self.append('<getter>'); + } else { + self.format(obj[property]); + } + }); + + this.append(' }'); +}; + +jasmine.StringPrettyPrinter.prototype.append = function(value) { + this.string += value; +}; +jasmine.Queue = function(env) { + this.env = env; + + // parallel to blocks. each true value in this array means the block will + // get executed even if we abort + this.ensured = []; + this.blocks = []; + this.running = false; + this.index = 0; + this.offset = 0; + this.abort = false; +}; + +jasmine.Queue.prototype.addBefore = function(block, ensure) { + if (ensure === jasmine.undefined) { + ensure = false; + } + + this.blocks.unshift(block); + this.ensured.unshift(ensure); +}; + +jasmine.Queue.prototype.add = function(block, ensure) { + if (ensure === jasmine.undefined) { + ensure = false; + } + + this.blocks.push(block); + this.ensured.push(ensure); +}; + +jasmine.Queue.prototype.insertNext = function(block, ensure) { + if (ensure === jasmine.undefined) { + ensure = false; + } + + this.ensured.splice((this.index + this.offset + 1), 0, ensure); + this.blocks.splice((this.index + this.offset + 1), 0, block); + this.offset++; +}; + +jasmine.Queue.prototype.start = function(onComplete) { + this.running = true; + this.onComplete = onComplete; + this.next_(); +}; + +jasmine.Queue.prototype.isRunning = function() { + return this.running; +}; + +jasmine.Queue.LOOP_DONT_RECURSE = true; + +jasmine.Queue.prototype.next_ = function() { + var self = this; + var goAgain = true; + + while (goAgain) { + goAgain = false; + + if (self.index < self.blocks.length && !(this.abort && !this.ensured[self.index])) { + var calledSynchronously = true; + var completedSynchronously = false; + + var onComplete = function () { + if (jasmine.Queue.LOOP_DONT_RECURSE && calledSynchronously) { + completedSynchronously = true; + return; + } + + if (self.blocks[self.index].abort) { + self.abort = true; + } + + self.offset = 0; + self.index++; + + var now = new Date().getTime(); + if (self.env.updateInterval && now - self.env.lastUpdate > self.env.updateInterval) { + self.env.lastUpdate = now; + self.env.setTimeout(function() { + self.next_(); + }, 0); + } else { + if (jasmine.Queue.LOOP_DONT_RECURSE && completedSynchronously) { + goAgain = true; + } else { + self.next_(); + } + } + }; + self.blocks[self.index].execute(onComplete); + + calledSynchronously = false; + if (completedSynchronously) { + onComplete(); + } + + } else { + self.running = false; + if (self.onComplete) { + self.onComplete(); + } + } + } +}; + +jasmine.Queue.prototype.results = function() { + var results = new jasmine.NestedResults(); + for (var i = 0; i < this.blocks.length; i++) { + if (this.blocks[i].results) { + results.addResult(this.blocks[i].results()); + } + } + return results; +}; + + +/** + * Runner + * + * @constructor + * @param {jasmine.Env} env + */ +jasmine.Runner = function(env) { + var self = this; + self.env = env; + self.queue = new jasmine.Queue(env); + self.before_ = []; + self.after_ = []; + self.suites_ = []; +}; + +jasmine.Runner.prototype.execute = function() { + var self = this; + if (self.env.reporter.reportRunnerStarting) { + self.env.reporter.reportRunnerStarting(this); + } + self.queue.start(function () { + self.finishCallback(); + }); +}; + +jasmine.Runner.prototype.beforeEach = function(beforeEachFunction) { + beforeEachFunction.typeName = 'beforeEach'; + this.before_.splice(0,0,beforeEachFunction); +}; + +jasmine.Runner.prototype.afterEach = function(afterEachFunction) { + afterEachFunction.typeName = 'afterEach'; + this.after_.splice(0,0,afterEachFunction); +}; + + +jasmine.Runner.prototype.finishCallback = function() { + this.env.reporter.reportRunnerResults(this); +}; + +jasmine.Runner.prototype.addSuite = function(suite) { + this.suites_.push(suite); +}; + +jasmine.Runner.prototype.add = function(block) { + if (block instanceof jasmine.Suite) { + this.addSuite(block); + } + this.queue.add(block); +}; + +jasmine.Runner.prototype.specs = function () { + var suites = this.suites(); + var specs = []; + for (var i = 0; i < suites.length; i++) { + specs = specs.concat(suites[i].specs()); + } + return specs; +}; + +jasmine.Runner.prototype.suites = function() { + return this.suites_; +}; + +jasmine.Runner.prototype.topLevelSuites = function() { + var topLevelSuites = []; + for (var i = 0; i < this.suites_.length; i++) { + if (!this.suites_[i].parentSuite) { + topLevelSuites.push(this.suites_[i]); + } + } + return topLevelSuites; +}; + +jasmine.Runner.prototype.results = function() { + return this.queue.results(); +}; +/** + * Internal representation of a Jasmine specification, or test. + * + * @constructor + * @param {jasmine.Env} env + * @param {jasmine.Suite} suite + * @param {String} description + */ +jasmine.Spec = function(env, suite, description) { + if (!env) { + throw new Error('jasmine.Env() required'); + } + if (!suite) { + throw new Error('jasmine.Suite() required'); + } + var spec = this; + spec.id = env.nextSpecId ? env.nextSpecId() : null; + spec.env = env; + spec.suite = suite; + spec.description = description; + spec.queue = new jasmine.Queue(env); + + spec.afterCallbacks = []; + spec.spies_ = []; + + spec.results_ = new jasmine.NestedResults(); + spec.results_.description = description; + spec.matchersClass = null; +}; + +jasmine.Spec.prototype.getFullName = function() { + return this.suite.getFullName() + ' ' + this.description + '.'; +}; + + +jasmine.Spec.prototype.results = function() { + return this.results_; +}; + +/** + * All parameters are pretty-printed and concatenated together, then written to the spec's output. + * + * Be careful not to leave calls to <code>jasmine.log</code> in production code. + */ +jasmine.Spec.prototype.log = function() { + return this.results_.log(arguments); +}; + +jasmine.Spec.prototype.runs = function (func) { + var block = new jasmine.Block(this.env, func, this); + this.addToQueue(block); + return this; +}; + +jasmine.Spec.prototype.addToQueue = function (block) { + if (this.queue.isRunning()) { + this.queue.insertNext(block); + } else { + this.queue.add(block); + } +}; + +/** + * @param {jasmine.ExpectationResult} result + */ +jasmine.Spec.prototype.addMatcherResult = function(result) { + this.results_.addResult(result); +}; + +jasmine.Spec.prototype.expect = function(actual) { + var positive = new (this.getMatchersClass_())(this.env, actual, this); + positive.not = new (this.getMatchersClass_())(this.env, actual, this, true); + return positive; +}; + +/** + * Waits a fixed time period before moving to the next block. + * + * @deprecated Use waitsFor() instead + * @param {Number} timeout milliseconds to wait + */ +jasmine.Spec.prototype.waits = function(timeout) { + var waitsFunc = new jasmine.WaitsBlock(this.env, timeout, this); + this.addToQueue(waitsFunc); + return this; +}; + +/** + * Waits for the latchFunction to return true before proceeding to the next block. + * + * @param {Function} latchFunction + * @param {String} optional_timeoutMessage + * @param {Number} optional_timeout + */ +jasmine.Spec.prototype.waitsFor = function(latchFunction, optional_timeoutMessage, optional_timeout) { + var latchFunction_ = null; + var optional_timeoutMessage_ = null; + var optional_timeout_ = null; + + for (var i = 0; i < arguments.length; i++) { + var arg = arguments[i]; + switch (typeof arg) { + case 'function': + latchFunction_ = arg; + break; + case 'string': + optional_timeoutMessage_ = arg; + break; + case 'number': + optional_timeout_ = arg; + break; + } + } + + var waitsForFunc = new jasmine.WaitsForBlock(this.env, optional_timeout_, latchFunction_, optional_timeoutMessage_, this); + this.addToQueue(waitsForFunc); + return this; +}; + +jasmine.Spec.prototype.fail = function (e) { + var expectationResult = new jasmine.ExpectationResult({ + passed: false, + message: e ? jasmine.util.formatException(e) : 'Exception', + trace: { stack: e.stack } + }); + this.results_.addResult(expectationResult); +}; + +jasmine.Spec.prototype.getMatchersClass_ = function() { + return this.matchersClass || this.env.matchersClass; +}; + +jasmine.Spec.prototype.addMatchers = function(matchersPrototype) { + var parent = this.getMatchersClass_(); + var newMatchersClass = function() { + parent.apply(this, arguments); + }; + jasmine.util.inherit(newMatchersClass, parent); + jasmine.Matchers.wrapInto_(matchersPrototype, newMatchersClass); + this.matchersClass = newMatchersClass; +}; + +jasmine.Spec.prototype.finishCallback = function() { + this.env.reporter.reportSpecResults(this); +}; + +jasmine.Spec.prototype.finish = function(onComplete) { + this.removeAllSpies(); + this.finishCallback(); + if (onComplete) { + onComplete(); + } +}; + +jasmine.Spec.prototype.after = function(doAfter) { + if (this.queue.isRunning()) { + this.queue.add(new jasmine.Block(this.env, doAfter, this), true); + } else { + this.afterCallbacks.unshift(doAfter); + } +}; + +jasmine.Spec.prototype.execute = function(onComplete) { + var spec = this; + if (!spec.env.specFilter(spec)) { + spec.results_.skipped = true; + spec.finish(onComplete); + return; + } + + this.env.reporter.reportSpecStarting(this); + + spec.env.currentSpec = spec; + + spec.addBeforesAndAftersToQueue(); + + spec.queue.start(function () { + spec.finish(onComplete); + }); +}; + +jasmine.Spec.prototype.addBeforesAndAftersToQueue = function() { + var runner = this.env.currentRunner(); + var i; + + for (var suite = this.suite; suite; suite = suite.parentSuite) { + for (i = 0; i < suite.before_.length; i++) { + this.queue.addBefore(new jasmine.Block(this.env, suite.before_[i], this)); + } + } + for (i = 0; i < runner.before_.length; i++) { + this.queue.addBefore(new jasmine.Block(this.env, runner.before_[i], this)); + } + for (i = 0; i < this.afterCallbacks.length; i++) { + this.queue.add(new jasmine.Block(this.env, this.afterCallbacks[i], this), true); + } + for (suite = this.suite; suite; suite = suite.parentSuite) { + for (i = 0; i < suite.after_.length; i++) { + this.queue.add(new jasmine.Block(this.env, suite.after_[i], this), true); + } + } + for (i = 0; i < runner.after_.length; i++) { + this.queue.add(new jasmine.Block(this.env, runner.after_[i], this), true); + } +}; + +jasmine.Spec.prototype.explodes = function() { + throw 'explodes function should not have been called'; +}; + +jasmine.Spec.prototype.spyOn = function(obj, methodName, ignoreMethodDoesntExist) { + if (obj == jasmine.undefined) { + throw "spyOn could not find an object to spy upon for " + methodName + "()"; + } + + if (!ignoreMethodDoesntExist && obj[methodName] === jasmine.undefined) { + throw methodName + '() method does not exist'; + } + + if (!ignoreMethodDoesntExist && obj[methodName] && obj[methodName].isSpy) { + throw new Error(methodName + ' has already been spied upon'); + } + + var spyObj = jasmine.createSpy(methodName); + + this.spies_.push(spyObj); + spyObj.baseObj = obj; + spyObj.methodName = methodName; + spyObj.originalValue = obj[methodName]; + + obj[methodName] = spyObj; + + return spyObj; +}; + +jasmine.Spec.prototype.removeAllSpies = function() { + for (var i = 0; i < this.spies_.length; i++) { + var spy = this.spies_[i]; + spy.baseObj[spy.methodName] = spy.originalValue; + } + this.spies_ = []; +}; + +/** + * Internal representation of a Jasmine suite. + * + * @constructor + * @param {jasmine.Env} env + * @param {String} description + * @param {Function} specDefinitions + * @param {jasmine.Suite} parentSuite + */ +jasmine.Suite = function(env, description, specDefinitions, parentSuite) { + var self = this; + self.id = env.nextSuiteId ? env.nextSuiteId() : null; + self.description = description; + self.queue = new jasmine.Queue(env); + self.parentSuite = parentSuite; + self.env = env; + self.before_ = []; + self.after_ = []; + self.children_ = []; + self.suites_ = []; + self.specs_ = []; +}; + +jasmine.Suite.prototype.getFullName = function() { + var fullName = this.description; + for (var parentSuite = this.parentSuite; parentSuite; parentSuite = parentSuite.parentSuite) { + fullName = parentSuite.description + ' ' + fullName; + } + return fullName; +}; + +jasmine.Suite.prototype.finish = function(onComplete) { + this.env.reporter.reportSuiteResults(this); + this.finished = true; + if (typeof(onComplete) == 'function') { + onComplete(); + } +}; + +jasmine.Suite.prototype.beforeEach = function(beforeEachFunction) { + beforeEachFunction.typeName = 'beforeEach'; + this.before_.unshift(beforeEachFunction); +}; + +jasmine.Suite.prototype.afterEach = function(afterEachFunction) { + afterEachFunction.typeName = 'afterEach'; + this.after_.unshift(afterEachFunction); +}; + +jasmine.Suite.prototype.results = function() { + return this.queue.results(); +}; + +jasmine.Suite.prototype.add = function(suiteOrSpec) { + this.children_.push(suiteOrSpec); + if (suiteOrSpec instanceof jasmine.Suite) { + this.suites_.push(suiteOrSpec); + this.env.currentRunner().addSuite(suiteOrSpec); + } else { + this.specs_.push(suiteOrSpec); + } + this.queue.add(suiteOrSpec); +}; + +jasmine.Suite.prototype.specs = function() { + return this.specs_; +}; + +jasmine.Suite.prototype.suites = function() { + return this.suites_; +}; + +jasmine.Suite.prototype.children = function() { + return this.children_; +}; + +jasmine.Suite.prototype.execute = function(onComplete) { + var self = this; + this.queue.start(function () { + self.finish(onComplete); + }); +}; +jasmine.WaitsBlock = function(env, timeout, spec) { + this.timeout = timeout; + jasmine.Block.call(this, env, null, spec); +}; + +jasmine.util.inherit(jasmine.WaitsBlock, jasmine.Block); + +jasmine.WaitsBlock.prototype.execute = function (onComplete) { + if (jasmine.VERBOSE) { + this.env.reporter.log('>> Jasmine waiting for ' + this.timeout + ' ms...'); + } + this.env.setTimeout(function () { + onComplete(); + }, this.timeout); +}; +/** + * A block which waits for some condition to become true, with timeout. + * + * @constructor + * @extends jasmine.Block + * @param {jasmine.Env} env The Jasmine environment. + * @param {Number} timeout The maximum time in milliseconds to wait for the condition to become true. + * @param {Function} latchFunction A function which returns true when the desired condition has been met. + * @param {String} message The message to display if the desired condition hasn't been met within the given time period. + * @param {jasmine.Spec} spec The Jasmine spec. + */ +jasmine.WaitsForBlock = function(env, timeout, latchFunction, message, spec) { + this.timeout = timeout || env.defaultTimeoutInterval; + this.latchFunction = latchFunction; + this.message = message; + this.totalTimeSpentWaitingForLatch = 0; + jasmine.Block.call(this, env, null, spec); +}; +jasmine.util.inherit(jasmine.WaitsForBlock, jasmine.Block); + +jasmine.WaitsForBlock.TIMEOUT_INCREMENT = 10; + +jasmine.WaitsForBlock.prototype.execute = function(onComplete) { + if (jasmine.VERBOSE) { + this.env.reporter.log('>> Jasmine waiting for ' + (this.message || 'something to happen')); + } + var latchFunctionResult; + try { + latchFunctionResult = this.latchFunction.apply(this.spec); + } catch (e) { + this.spec.fail(e); + onComplete(); + return; + } + + if (latchFunctionResult) { + onComplete(); + } else if (this.totalTimeSpentWaitingForLatch >= this.timeout) { + var message = 'timed out after ' + this.timeout + ' msec waiting for ' + (this.message || 'something to happen'); + this.spec.fail({ + name: 'timeout', + message: message + }); + + this.abort = true; + onComplete(); + } else { + this.totalTimeSpentWaitingForLatch += jasmine.WaitsForBlock.TIMEOUT_INCREMENT; + var self = this; + this.env.setTimeout(function() { + self.execute(onComplete); + }, jasmine.WaitsForBlock.TIMEOUT_INCREMENT); + } +}; + +jasmine.version_= { + "major": 1, + "minor": 3, + "build": 1, + "revision": 1354556913 +}; diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/jquery-input-ip-address-control.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/jquery-input-ip-address-control.js new file mode 100644 index 0000000000000000000000000000000000000000..008f139c63b943a56b859059fea66cee646b19cb --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/jquery-input-ip-address-control.js @@ -0,0 +1,203 @@ +/*! + * jQuery Input Ip Address Control : v0.1beta (2010/11/09 16:15:43) + * Copyright (c) 2010 jquery-input-ip-address-control@googlecode.com + * Licensed under the MIT license and GPL licenses. + * + */ +(function($){ + String.prototype.isIpv4 = function() { + rgx = /\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b/ ; + return rgx.test(this.toString()); + }; + String.prototype.isIpv6 = function() { + rgx = /\b([A-F0-9]{1,4}:){7}([A-F0-9]{1,4})\b/i ; + return rgx.test(this.toString()); + }; + $.fn.extend({ + //Helper Function for Caret positioning + caret: function(begin, end) { + if (this.length == 0) return; + if (typeof begin == 'number') { + end = (typeof end == 'number') ? end : begin; + return this.each(function() { + if (this.setSelectionRange) { + this.focus(); + try { + this.setSelectionRange(begin, end); + } catch(err) { + console.log('Error', err); + } + } else if (this.createTextRange) { + var range = this.createTextRange(); + range.collapse(true); + range.moveEnd('character', end); + range.moveStart('character', begin); + range.select(); + } + }); + } else { + if (this[0].setSelectionRange) { + begin = this[0].selectionStart; + end = this[0].selectionEnd; + } else if (document.selection && document.selection.createRange) { + var range = document.selection.createRange(); + begin = 0 - range.duplicate().moveStart('character', -100000); + end = begin + range.text.length; + } + return { + begin: begin, + end: end + }; + } + }, + ipAddress: function(s) { + //return $(this); + s = $.extend({ + v:4 + }, s); + if(s.v == 4) { + s.rgxcase = new RegExp('[0-9]','g'); + s.label = '___.___.___.___'; + } + if(s.v == 6) { + s.rgxcase = new RegExp('[A-F0-9]','gi'); + s.label = '____:____:____:____:____:____:____:____'; + } + s.place = s.label.split('').pop(); + s.separator = s.label.replace(new RegExp(s.place,'g'),'').split('').pop(); + s.partplace = s.label.split(s.separator).pop(); + //end settings and init + return $(this).each(function(){ + var ctx = { + cursor:null, + buffer:null, + ip:null, + input:null + }; + ctx.input = $(this); + if( ctx.input.val() =='' || !isIp(ctx.input.val())) + ctx.input.val( s.label ); + ctx.input.attr('maxlength',(s.v==4? 15 : 39)).attr('size',(s.v==4? 15 : 39)); + + function isIp(ip) { + return eval("ip.isIpv"+s.v+"()"); + }; + function loadCtx() { + ctx.cursor = ctx.input.caret(); + ctx.ip = isIp(unmask(ctx.input.val())) ? unmask(ctx.input.val()) : ctx.ip ; + ctx.buffer = ctx.input.val().split(''); + }; + function mask(ip) { + var part = ip.split(s.separator); + for(var j=0; j<part.length;j++) { + while( (s.partplace.length - part[j].length) > 0) + part[j] += s.place; + } + return part.join(s.separator); + }; + function unmask(ip) { + var rgx = new RegExp(s.partplace,'g'); + var rgx2 = new RegExp(s.place,'g'); + return ip.replace(rgx,'0').replace(rgx2,''); + }; + function entryNoCharacter(e) { + switch(e.keyCode) { + case 8: //backspace + if(ctx.buffer[ctx.cursor.end-1] != s.separator) { + ctx.buffer[ctx.cursor.end-1] = s.place; + ctx.input.val(ctx.buffer.join("")).val(); + } + ctx.input.caret(ctx.cursor.end-1); + return false; + break; + case 27: //esc + ctx.input.blur(); + break; + case 46: //suppr. + if(ctx.buffer[ctx.cursor.end] != s.separator && ctx.cursor.end < s.label.length) { + ctx.buffer[ctx.cursor.end] = s.place; + ctx.input.val(ctx.buffer.join("")); + } + if(ctx.cursor.end < s.label.length) ctx.input.caret(ctx.cursor.end+1); + return false; + break; + } + return true; + }; + + ctx.input.bind('keydown',function(e){ + loadCtx(); + //fix for webkit & IE + if($.browser.webkit || $.browser.msie) { + return entryNoCharacter(e); + } + }).bind('keypress',function(e) { + loadCtx(); + //alternative keys + if (e.ctrlKey || e.altKey || e.metaKey) return true; + //typeable characters + else if ((e.which >= 32 && e.which <= 125) || e.which > 186) { + e.preventDefault(); + //valid character + if(String.fromCharCode(e.which).match(s.rgxcase)) { + ctx.buffer[ctx.cursor.end] = String.fromCharCode(e.which); + if(!isIp(unmask(ctx.buffer.join('')))) { + //delete part if ip is invalid + if((ctx.cursor.end == 0 || ctx.buffer[ctx.cursor.end-1]==s.separator)) { + for(var i=ctx.cursor.end+1 ; i<ctx.cursor.end+s.partplace.length ; i++) { + ctx.buffer[i] = s.place; + } + } + else return false; + } + ctx.input.val(ctx.buffer.join('')); //ok write + if(ctx.buffer[ctx.cursor.end+1] == s.separator) { + //part completed ... next part + ctx.input.caret(ctx.cursor.end+2); + } else { + ctx.input.caret(ctx.cursor.end+1); + } + return false; + } //or separator + else if(s.separator.charCodeAt(0) == e.which) { + var pos = ctx.input.val().indexOf(s.separator, ctx.cursor.end); + if(pos == -1) return false; + if(ctx.buffer[ctx.cursor.end-1]==s.separator) return false; + ctx.cursor.end = pos; + ctx.input.caret(ctx.cursor.end+1); + return false; + } + else return false; // or invalid + } + //no character + return entryNoCharacter(e); + + }).bind('blur makeip', function(){ + if(ctx.input.val() == s.label){ + ctx.input.val(''); + return true; + } + var ip = unmask($.trim(ctx.input.val())); + if( isIp(ip) ) ctx.input.val(ip); + //else ctx.input.val( ctx.ip ); + else ctx.input.val( s.label ); + + }).bind('focus', function(){ + setTimeout(function() { + loadCtx(); + if(ctx.input.val() != s.label && ctx.input.val() != '') + ctx.input.val( mask(ctx.ip) ); + else ctx.input.val( s.label ); + ctx.input.caret(0); + }, 0); + + }).bind('paste', function (e){ + ctx.input.val(''); + setTimeout(function() { + ctx.input.blur(); + },0); + }); + });//return each + }//ipAddress() + });//$.fn.extends +})(jQuery); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/jquery.fileupload.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/jquery.fileupload.js new file mode 100644 index 0000000000000000000000000000000000000000..28940fb4572cf4b3b4fb8109307b7e910fb52f08 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/jquery.fileupload.js @@ -0,0 +1,1329 @@ +/* + * jQuery File Upload Plugin 5.32.0 + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2010, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ + +/*jslint nomen: true, unparam: true, regexp: true */ +/*global define, window, document, location, File, Blob, FormData */ + +(function (factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define([ + 'jquery', + 'lib/jquery.ui.widget' + ], factory); + } else { + // Browser globals: + factory(window.jQuery); + } +}(function ($) { + 'use strict'; + + // Detect file input support, based on + // http://viljamis.com/blog/2012/file-upload-support-on-mobile/ + $.support.fileInput = !(new RegExp( + // Handle devices which give false positives for the feature detection: + '(Android (1\\.[0156]|2\\.[01]))' + + '|(Windows Phone (OS 7|8\\.0))|(XBLWP)|(ZuneWP)' + + '|(w(eb)?OSBrowser)|(webOS)' + + '|(Kindle/(1\\.0|2\\.[05]|3\\.0))' + ).test(window.navigator.userAgent) || + // Feature detection for all other devices: + $('<input type="file">').prop('disabled')); + + // The FileReader API is not actually used, but works as feature detection, + // as e.g. Safari supports XHR file uploads via the FormData API, + // but not non-multipart XHR file uploads: + $.support.xhrFileUpload = !!(window.XMLHttpRequestUpload && window.FileReader); + $.support.xhrFormDataFileUpload = !!window.FormData; + + // Detect support for Blob slicing (required for chunked uploads): + $.support.blobSlice = window.Blob && (Blob.prototype.slice || + Blob.prototype.webkitSlice || Blob.prototype.mozSlice); + + // The fileupload widget listens for change events on file input fields defined + // via fileInput setting and paste or drop events of the given dropZone. + // In addition to the default jQuery Widget methods, the fileupload widget + // exposes the "add" and "send" methods, to add or directly send files using + // the fileupload API. + // By default, files added via file input selection, paste, drag & drop or + // "add" method are uploaded immediately, but it is possible to override + // the "add" callback option to queue file uploads. + $.widget('blueimp.fileupload', { + + options: { + // The drop target element(s), by the default the complete document. + // Set to null to disable drag & drop support: + dropZone: $(document), + // The paste target element(s), by the default the complete document. + // Set to null to disable paste support: + pasteZone: $(document), + // The file input field(s), that are listened to for change events. + // If undefined, it is set to the file input fields inside + // of the widget element on plugin initialization. + // Set to null to disable the change listener. + fileInput: undefined, + // By default, the file input field is replaced with a clone after + // each input field change event. This is required for iframe transport + // queues and allows change events to be fired for the same file + // selection, but can be disabled by setting the following option to false: + replaceFileInput: true, + // The parameter name for the file form data (the request argument name). + // If undefined or empty, the name property of the file input field is + // used, or "files[]" if the file input name property is also empty, + // can be a string or an array of strings: + paramName: undefined, + // By default, each file of a selection is uploaded using an individual + // request for XHR type uploads. Set to false to upload file + // selections in one request each: + singleFileUploads: true, + // To limit the number of files uploaded with one XHR request, + // set the following option to an integer greater than 0: + limitMultiFileUploads: undefined, + // Set the following option to true to issue all file upload requests + // in a sequential order: + sequentialUploads: false, + // To limit the number of concurrent uploads, + // set the following option to an integer greater than 0: + limitConcurrentUploads: undefined, + // Set the following option to true to force iframe transport uploads: + forceIframeTransport: false, + // Set the following option to the location of a redirect url on the + // origin server, for cross-domain iframe transport uploads: + redirect: undefined, + // The parameter name for the redirect url, sent as part of the form + // data and set to 'redirect' if this option is empty: + redirectParamName: undefined, + // Set the following option to the location of a postMessage window, + // to enable postMessage transport uploads: + postMessage: undefined, + // By default, XHR file uploads are sent as multipart/form-data. + // The iframe transport is always using multipart/form-data. + // Set to false to enable non-multipart XHR uploads: + multipart: true, + // To upload large files in smaller chunks, set the following option + // to a preferred maximum chunk size. If set to 0, null or undefined, + // or the browser does not support the required Blob API, files will + // be uploaded as a whole. + maxChunkSize: undefined, + // When a non-multipart upload or a chunked multipart upload has been + // aborted, this option can be used to resume the upload by setting + // it to the size of the already uploaded bytes. This option is most + // useful when modifying the options object inside of the "add" or + // "send" callbacks, as the options are cloned for each file upload. + uploadedBytes: undefined, + // By default, failed (abort or error) file uploads are removed from the + // global progress calculation. Set the following option to false to + // prevent recalculating the global progress data: + recalculateProgress: true, + // Interval in milliseconds to calculate and trigger progress events: + progressInterval: 100, + // Interval in milliseconds to calculate progress bitrate: + bitrateInterval: 500, + // By default, uploads are started automatically when adding files: + autoUpload: true, + + // Error and info messages: + messages: { + uploadedBytes: 'Uploaded bytes exceed file size' + }, + + // Translation function, gets the message key to be translated + // and an object with context specific data as arguments: + i18n: function (message, context) { + message = this.messages[message] || message.toString(); + if (context) { + $.each(context, function (key, value) { + message = message.replace('{' + key + '}', value); + }); + } + return message; + }, + + // Additional form data to be sent along with the file uploads can be set + // using this option, which accepts an array of objects with name and + // value properties, a function returning such an array, a FormData + // object (for XHR file uploads), or a simple object. + // The form of the first fileInput is given as parameter to the function: + formData: function (form) { + return form.serializeArray(); + }, + + // The add callback is invoked as soon as files are added to the fileupload + // widget (via file input selection, drag & drop, paste or add API call). + // If the singleFileUploads option is enabled, this callback will be + // called once for each file in the selection for XHR file uploads, else + // once for each file selection. + // + // The upload starts when the submit method is invoked on the data parameter. + // The data object contains a files property holding the added files + // and allows you to override plugin options as well as define ajax settings. + // + // Listeners for this callback can also be bound the following way: + // .bind('fileuploadadd', func); + // + // data.submit() returns a Promise object and allows to attach additional + // handlers using jQuery's Deferred callbacks: + // data.submit().done(func).fail(func).always(func); + add: function (e, data) { + if (data.autoUpload || (data.autoUpload !== false && + $(this).fileupload('option', 'autoUpload'))) { + data.process().done(function () { + data.submit(); + }); + } + }, + + // Other callbacks: + + // Callback for the submit event of each file upload: + // submit: function (e, data) {}, // .bind('fileuploadsubmit', func); + + // Callback for the start of each file upload request: + // send: function (e, data) {}, // .bind('fileuploadsend', func); + + // Callback for successful uploads: + // done: function (e, data) {}, // .bind('fileuploaddone', func); + + // Callback for failed (abort or error) uploads: + // fail: function (e, data) {}, // .bind('fileuploadfail', func); + + // Callback for completed (success, abort or error) requests: + // always: function (e, data) {}, // .bind('fileuploadalways', func); + + // Callback for upload progress events: + // progress: function (e, data) {}, // .bind('fileuploadprogress', func); + + // Callback for global upload progress events: + // progressall: function (e, data) {}, // .bind('fileuploadprogressall', func); + + // Callback for uploads start, equivalent to the global ajaxStart event: + // start: function (e) {}, // .bind('fileuploadstart', func); + + // Callback for uploads stop, equivalent to the global ajaxStop event: + // stop: function (e) {}, // .bind('fileuploadstop', func); + + // Callback for change events of the fileInput(s): + // change: function (e, data) {}, // .bind('fileuploadchange', func); + + // Callback for paste events to the pasteZone(s): + // paste: function (e, data) {}, // .bind('fileuploadpaste', func); + + // Callback for drop events of the dropZone(s): + // drop: function (e, data) {}, // .bind('fileuploaddrop', func); + + // Callback for dragover events of the dropZone(s): + // dragover: function (e) {}, // .bind('fileuploaddragover', func); + + // Callback for the start of each chunk upload request: + // chunksend: function (e, data) {}, // .bind('fileuploadchunksend', func); + + // Callback for successful chunk uploads: + // chunkdone: function (e, data) {}, // .bind('fileuploadchunkdone', func); + + // Callback for failed (abort or error) chunk uploads: + // chunkfail: function (e, data) {}, // .bind('fileuploadchunkfail', func); + + // Callback for completed (success, abort or error) chunk upload requests: + // chunkalways: function (e, data) {}, // .bind('fileuploadchunkalways', func); + + // The plugin options are used as settings object for the ajax calls. + // The following are jQuery ajax settings required for the file uploads: + processData: false, + contentType: false, + cache: false + }, + + // A list of options that require reinitializing event listeners and/or + // special initialization code: + _specialOptions: [ + 'fileInput', + 'dropZone', + 'pasteZone', + 'multipart', + 'forceIframeTransport' + ], + + _blobSlice: $.support.blobSlice && function () { + var slice = this.slice || this.webkitSlice || this.mozSlice; + return slice.apply(this, arguments); + }, + + _BitrateTimer: function () { + this.timestamp = ((Date.now) ? Date.now() : (new Date()).getTime()); + this.loaded = 0; + this.bitrate = 0; + this.getBitrate = function (now, loaded, interval) { + var timeDiff = now - this.timestamp; + if (!this.bitrate || !interval || timeDiff > interval) { + this.bitrate = (loaded - this.loaded) * (1000 / timeDiff) * 8; + this.loaded = loaded; + this.timestamp = now; + } + return this.bitrate; + }; + }, + + _isXHRUpload: function (options) { + return !options.forceIframeTransport && + ((!options.multipart && $.support.xhrFileUpload) || + $.support.xhrFormDataFileUpload); + }, + + _getFormData: function (options) { + var formData; + if (typeof options.formData === 'function') { + return options.formData(options.form); + } + if ($.isArray(options.formData)) { + return options.formData; + } + if ($.type(options.formData) === 'object') { + formData = []; + $.each(options.formData, function (name, value) { + formData.push({name: name, value: value}); + }); + return formData; + } + return []; + }, + + _getTotal: function (files) { + var total = 0; + $.each(files, function (index, file) { + total += file.size || 1; + }); + return total; + }, + + _initProgressObject: function (obj) { + var progress = { + loaded: 0, + total: 0, + bitrate: 0 + }; + if (obj._progress) { + $.extend(obj._progress, progress); + } else { + obj._progress = progress; + } + }, + + _initResponseObject: function (obj) { + var prop; + if (obj._response) { + for (prop in obj._response) { + if (obj._response.hasOwnProperty(prop)) { + delete obj._response[prop]; + } + } + } else { + obj._response = {}; + } + }, + + _onProgress: function (e, data) { + if (e.lengthComputable) { + var now = ((Date.now) ? Date.now() : (new Date()).getTime()), + loaded; + if (data._time && data.progressInterval && + (now - data._time < data.progressInterval) && + e.loaded !== e.total) { + return; + } + data._time = now; + loaded = Math.floor( + e.loaded / e.total * (data.chunkSize || data._progress.total) + ) + (data.uploadedBytes || 0); + // Add the difference from the previously loaded state + // to the global loaded counter: + this._progress.loaded += (loaded - data._progress.loaded); + this._progress.bitrate = this._bitrateTimer.getBitrate( + now, + this._progress.loaded, + data.bitrateInterval + ); + data._progress.loaded = data.loaded = loaded; + data._progress.bitrate = data.bitrate = data._bitrateTimer.getBitrate( + now, + loaded, + data.bitrateInterval + ); + // Trigger a custom progress event with a total data property set + // to the file size(s) of the current upload and a loaded data + // property calculated accordingly: + this._trigger('progress', e, data); + // Trigger a global progress event for all current file uploads, + // including ajax calls queued for sequential file uploads: + this._trigger('progressall', e, this._progress); + } + }, + + _initProgressListener: function (options) { + var that = this, + xhr = options.xhr ? options.xhr() : $.ajaxSettings.xhr(); + // Accesss to the native XHR object is required to add event listeners + // for the upload progress event: + if (xhr.upload) { + $(xhr.upload).bind('progress', function (e) { + var oe = e.originalEvent; + // Make sure the progress event properties get copied over: + e.lengthComputable = oe.lengthComputable; + e.loaded = oe.loaded; + e.total = oe.total; + that._onProgress(e, options); + }); + options.xhr = function () { + return xhr; + }; + } + }, + + _isInstanceOf: function (type, obj) { + // Cross-frame instanceof check + return Object.prototype.toString.call(obj) === '[object ' + type + ']'; + }, + + _initXHRData: function (options) { + var that = this, + formData, + file = options.files[0], + // Ignore non-multipart setting if not supported: + multipart = options.multipart || !$.support.xhrFileUpload, + paramName = options.paramName[0]; + options.headers = options.headers || {}; + if (options.contentRange) { + options.headers['Content-Range'] = options.contentRange; + } + if (!multipart || options.blob || !this._isInstanceOf('File', file)) { + options.headers['Content-Disposition'] = 'attachment; filename="' + + encodeURI(file.name) + '"'; + } + if (!multipart) { + options.contentType = file.type; + options.data = options.blob || file; + } else if ($.support.xhrFormDataFileUpload) { + if (options.postMessage) { + // window.postMessage does not allow sending FormData + // objects, so we just add the File/Blob objects to + // the formData array and let the postMessage window + // create the FormData object out of this array: + formData = this._getFormData(options); + if (options.blob) { + formData.push({ + name: paramName, + value: options.blob + }); + } else { + $.each(options.files, function (index, file) { + formData.push({ + name: options.paramName[index] || paramName, + value: file + }); + }); + } + } else { + if (that._isInstanceOf('FormData', options.formData)) { + formData = options.formData; + } else { + formData = new FormData(); + $.each(this._getFormData(options), function (index, field) { + formData.append(field.name, field.value); + }); + } + if (options.blob) { + formData.append(paramName, options.blob, file.name); + } else { + $.each(options.files, function (index, file) { + // This check allows the tests to run with + // dummy objects: + if (that._isInstanceOf('File', file) || + that._isInstanceOf('Blob', file)) { + formData.append( + options.paramName[index] || paramName, + file, + file.name + ); + } + }); + } + } + options.data = formData; + } + // Blob reference is not needed anymore, free memory: + options.blob = null; + }, + + _initIframeSettings: function (options) { + var targetHost = $('<a></a>').prop('href', options.url).prop('host'); + // Setting the dataType to iframe enables the iframe transport: + options.dataType = 'iframe ' + (options.dataType || ''); + // The iframe transport accepts a serialized array as form data: + options.formData = this._getFormData(options); + // Add redirect url to form data on cross-domain uploads: + if (options.redirect && targetHost && targetHost !== location.host) { + options.formData.push({ + name: options.redirectParamName || 'redirect', + value: options.redirect + }); + } + }, + + _initDataSettings: function (options) { + if (this._isXHRUpload(options)) { + if (!this._chunkedUpload(options, true)) { + if (!options.data) { + this._initXHRData(options); + } + this._initProgressListener(options); + } + if (options.postMessage) { + // Setting the dataType to postmessage enables the + // postMessage transport: + options.dataType = 'postmessage ' + (options.dataType || ''); + } + } else { + this._initIframeSettings(options); + } + }, + + _getParamName: function (options) { + var fileInput = $(options.fileInput), + paramName = options.paramName; + if (!paramName) { + paramName = []; + fileInput.each(function () { + var input = $(this), + name = input.prop('name') || 'files[]', + i = (input.prop('files') || [1]).length; + while (i) { + paramName.push(name); + i -= 1; + } + }); + if (!paramName.length) { + paramName = [fileInput.prop('name') || 'files[]']; + } + } else if (!$.isArray(paramName)) { + paramName = [paramName]; + } + return paramName; + }, + + _initFormSettings: function (options) { + // Retrieve missing options from the input field and the + // associated form, if available: + if (!options.form || !options.form.length) { + options.form = $(options.fileInput.prop('form')); + // If the given file input doesn't have an associated form, + // use the default widget file input's form: + if (!options.form.length) { + options.form = $(this.options.fileInput.prop('form')); + } + } + options.paramName = this._getParamName(options); + if (!options.url) { + options.url = options.form.prop('action') || location.href; + } + // The HTTP request method must be "POST" or "PUT": + options.type = (options.type || options.form.prop('method') || '') + .toUpperCase(); + if (options.type !== 'POST' && options.type !== 'PUT' && + options.type !== 'PATCH') { + options.type = 'POST'; + } + if (!options.formAcceptCharset) { + options.formAcceptCharset = options.form.attr('accept-charset'); + } + }, + + _getAJAXSettings: function (data) { + var options = $.extend({}, this.options, data); + this._initFormSettings(options); + this._initDataSettings(options); + return options; + }, + + // jQuery 1.6 doesn't provide .state(), + // while jQuery 1.8+ removed .isRejected() and .isResolved(): + _getDeferredState: function (deferred) { + if (deferred.state) { + return deferred.state(); + } + if (deferred.isResolved()) { + return 'resolved'; + } + if (deferred.isRejected()) { + return 'rejected'; + } + return 'pending'; + }, + + // Maps jqXHR callbacks to the equivalent + // methods of the given Promise object: + _enhancePromise: function (promise) { + promise.success = promise.done; + promise.error = promise.fail; + promise.complete = promise.always; + return promise; + }, + + // Creates and returns a Promise object enhanced with + // the jqXHR methods abort, success, error and complete: + _getXHRPromise: function (resolveOrReject, context, args) { + var dfd = $.Deferred(), + promise = dfd.promise(); + context = context || this.options.context || promise; + if (resolveOrReject === true) { + dfd.resolveWith(context, args); + } else if (resolveOrReject === false) { + dfd.rejectWith(context, args); + } + promise.abort = dfd.promise; + return this._enhancePromise(promise); + }, + + // Adds convenience methods to the data callback argument: + _addConvenienceMethods: function (e, data) { + var that = this, + getPromise = function (data) { + return $.Deferred().resolveWith(that, [data]).promise(); + }; + data.process = function (resolveFunc, rejectFunc) { + if (resolveFunc || rejectFunc) { + data._processQueue = this._processQueue = + (this._processQueue || getPromise(this)) + .pipe(resolveFunc, rejectFunc); + } + return this._processQueue || getPromise(this); + }; + data.submit = function () { + if (this.state() !== 'pending') { + data.jqXHR = this.jqXHR = + (that._trigger('submit', e, this) !== false) && + that._onSend(e, this); + } + return this.jqXHR || that._getXHRPromise(); + }; + data.abort = function () { + if (this.jqXHR) { + return this.jqXHR.abort(); + } + return that._getXHRPromise(); + }; + data.state = function () { + if (this.jqXHR) { + return that._getDeferredState(this.jqXHR); + } + if (this._processQueue) { + return that._getDeferredState(this._processQueue); + } + }; + data.progress = function () { + return this._progress; + }; + data.response = function () { + return this._response; + }; + }, + + // Parses the Range header from the server response + // and returns the uploaded bytes: + _getUploadedBytes: function (jqXHR) { + var range = jqXHR.getResponseHeader('Range'), + parts = range && range.split('-'), + upperBytesPos = parts && parts.length > 1 && + parseInt(parts[1], 10); + return upperBytesPos && upperBytesPos + 1; + }, + + // Uploads a file in multiple, sequential requests + // by splitting the file up in multiple blob chunks. + // If the second parameter is true, only tests if the file + // should be uploaded in chunks, but does not invoke any + // upload requests: + _chunkedUpload: function (options, testOnly) { + options.uploadedBytes = options.uploadedBytes || 0; + var that = this, + file = options.files[0], + fs = file.size, + ub = options.uploadedBytes, + mcs = options.maxChunkSize || fs, + slice = this._blobSlice, + dfd = $.Deferred(), + promise = dfd.promise(), + jqXHR, + upload; + if (!(this._isXHRUpload(options) && slice && (ub || mcs < fs)) || + options.data) { + return false; + } + if (testOnly) { + return true; + } + if (ub >= fs) { + file.error = options.i18n('uploadedBytes'); + return this._getXHRPromise( + false, + options.context, + [null, 'error', file.error] + ); + } + // The chunk upload method: + upload = function () { + // Clone the options object for each chunk upload: + var o = $.extend({}, options), + currentLoaded = o._progress.loaded; + o.blob = slice.call( + file, + ub, + ub + mcs, + file.type + ); + // Store the current chunk size, as the blob itself + // will be dereferenced after data processing: + o.chunkSize = o.blob.size; + // Expose the chunk bytes position range: + o.contentRange = 'bytes ' + ub + '-' + + (ub + o.chunkSize - 1) + '/' + fs; + // Process the upload data (the blob and potential form data): + that._initXHRData(o); + // Add progress listeners for this chunk upload: + that._initProgressListener(o); + jqXHR = ((that._trigger('chunksend', null, o) !== false && $.ajax(o)) || + that._getXHRPromise(false, o.context)) + .done(function (result, textStatus, jqXHR) { + ub = that._getUploadedBytes(jqXHR) || + (ub + o.chunkSize); + // Create a progress event if no final progress event + // with loaded equaling total has been triggered + // for this chunk: + if (currentLoaded + o.chunkSize - o._progress.loaded) { + that._onProgress($.Event('progress', { + lengthComputable: true, + loaded: ub - o.uploadedBytes, + total: ub - o.uploadedBytes + }), o); + } + options.uploadedBytes = o.uploadedBytes = ub; + o.result = result; + o.textStatus = textStatus; + o.jqXHR = jqXHR; + that._trigger('chunkdone', null, o); + that._trigger('chunkalways', null, o); + if (ub < fs) { + // File upload not yet complete, + // continue with the next chunk: + upload(); + } else { + dfd.resolveWith( + o.context, + [result, textStatus, jqXHR] + ); + } + }) + .fail(function (jqXHR, textStatus, errorThrown) { + o.jqXHR = jqXHR; + o.textStatus = textStatus; + o.errorThrown = errorThrown; + that._trigger('chunkfail', null, o); + that._trigger('chunkalways', null, o); + dfd.rejectWith( + o.context, + [jqXHR, textStatus, errorThrown] + ); + }); + }; + this._enhancePromise(promise); + promise.abort = function () { + return jqXHR.abort(); + }; + upload(); + return promise; + }, + + _beforeSend: function (e, data) { + if (this._active === 0) { + // the start callback is triggered when an upload starts + // and no other uploads are currently running, + // equivalent to the global ajaxStart event: + this._trigger('start'); + // Set timer for global bitrate progress calculation: + this._bitrateTimer = new this._BitrateTimer(); + // Reset the global progress values: + this._progress.loaded = this._progress.total = 0; + this._progress.bitrate = 0; + } + // Make sure the container objects for the .response() and + // .progress() methods on the data object are available + // and reset to their initial state: + this._initResponseObject(data); + this._initProgressObject(data); + data._progress.loaded = data.loaded = data.uploadedBytes || 0; + data._progress.total = data.total = this._getTotal(data.files) || 1; + data._progress.bitrate = data.bitrate = 0; + this._active += 1; + // Initialize the global progress values: + this._progress.loaded += data.loaded; + this._progress.total += data.total; + }, + + _onDone: function (result, textStatus, jqXHR, options) { + var total = options._progress.total, + response = options._response; + if (options._progress.loaded < total) { + // Create a progress event if no final progress event + // with loaded equaling total has been triggered: + this._onProgress($.Event('progress', { + lengthComputable: true, + loaded: total, + total: total + }), options); + } + response.result = options.result = result; + response.textStatus = options.textStatus = textStatus; + response.jqXHR = options.jqXHR = jqXHR; + this._trigger('done', null, options); + }, + + _onFail: function (jqXHR, textStatus, errorThrown, options) { + var response = options._response; + if (options.recalculateProgress) { + // Remove the failed (error or abort) file upload from + // the global progress calculation: + this._progress.loaded -= options._progress.loaded; + this._progress.total -= options._progress.total; + } + response.jqXHR = options.jqXHR = jqXHR; + response.textStatus = options.textStatus = textStatus; + response.errorThrown = options.errorThrown = errorThrown; + this._trigger('fail', null, options); + }, + + _onAlways: function (jqXHRorResult, textStatus, jqXHRorError, options) { + // jqXHRorResult, textStatus and jqXHRorError are added to the + // options object via done and fail callbacks + this._trigger('always', null, options); + }, + + _onSend: function (e, data) { + if (!data.submit) { + this._addConvenienceMethods(e, data); + } + var that = this, + jqXHR, + aborted, + slot, + pipe, + options = that._getAJAXSettings(data), + send = function () { + that._sending += 1; + // Set timer for bitrate progress calculation: + options._bitrateTimer = new that._BitrateTimer(); + jqXHR = jqXHR || ( + ((aborted || that._trigger('send', e, options) === false) && + that._getXHRPromise(false, options.context, aborted)) || + that._chunkedUpload(options) || $.ajax(options) + ).done(function (result, textStatus, jqXHR) { + that._onDone(result, textStatus, jqXHR, options); + }).fail(function (jqXHR, textStatus, errorThrown) { + that._onFail(jqXHR, textStatus, errorThrown, options); + }).always(function (jqXHRorResult, textStatus, jqXHRorError) { + that._onAlways( + jqXHRorResult, + textStatus, + jqXHRorError, + options + ); + that._sending -= 1; + that._active -= 1; + if (options.limitConcurrentUploads && + options.limitConcurrentUploads > that._sending) { + // Start the next queued upload, + // that has not been aborted: + var nextSlot = that._slots.shift(); + while (nextSlot) { + if (that._getDeferredState(nextSlot) === 'pending') { + nextSlot.resolve(); + break; + } + nextSlot = that._slots.shift(); + } + } + if (that._active === 0) { + // The stop callback is triggered when all uploads have + // been completed, equivalent to the global ajaxStop event: + that._trigger('stop'); + } + }); + return jqXHR; + }; + this._beforeSend(e, options); + if (this.options.sequentialUploads || + (this.options.limitConcurrentUploads && + this.options.limitConcurrentUploads <= this._sending)) { + if (this.options.limitConcurrentUploads > 1) { + slot = $.Deferred(); + this._slots.push(slot); + pipe = slot.pipe(send); + } else { + this._sequence = this._sequence.pipe(send, send); + pipe = this._sequence; + } + // Return the piped Promise object, enhanced with an abort method, + // which is delegated to the jqXHR object of the current upload, + // and jqXHR callbacks mapped to the equivalent Promise methods: + pipe.abort = function () { + aborted = [undefined, 'abort', 'abort']; + if (!jqXHR) { + if (slot) { + slot.rejectWith(options.context, aborted); + } + return send(); + } + return jqXHR.abort(); + }; + return this._enhancePromise(pipe); + } + return send(); + }, + + _onAdd: function (e, data) { + var that = this, + result = true, + options = $.extend({}, this.options, data), + limit = options.limitMultiFileUploads, + paramName = this._getParamName(options), + paramNameSet, + paramNameSlice, + fileSet, + i; + if (!(options.singleFileUploads || limit) || + !this._isXHRUpload(options)) { + fileSet = [data.files]; + paramNameSet = [paramName]; + } else if (!options.singleFileUploads && limit) { + fileSet = []; + paramNameSet = []; + for (i = 0; i < data.files.length; i += limit) { + fileSet.push(data.files.slice(i, i + limit)); + paramNameSlice = paramName.slice(i, i + limit); + if (!paramNameSlice.length) { + paramNameSlice = paramName; + } + paramNameSet.push(paramNameSlice); + } + } else { + paramNameSet = paramName; + } + data.originalFiles = data.files; + $.each(fileSet || data.files, function (index, element) { + var newData = $.extend({}, data); + newData.files = fileSet ? element : [element]; + newData.paramName = paramNameSet[index]; + that._initResponseObject(newData); + that._initProgressObject(newData); + that._addConvenienceMethods(e, newData); + result = that._trigger('add', e, newData); + return result; + }); + return result; + }, + + _replaceFileInput: function (input) { + var inputClone = input.clone(true); + $('<form></form>').append(inputClone)[0].reset(); + // Detaching allows to insert the fileInput on another form + // without loosing the file input value: + input.after(inputClone).detach(); + // Avoid memory leaks with the detached file input: + $.cleanData(input.unbind('remove')); + // Replace the original file input element in the fileInput + // elements set with the clone, which has been copied including + // event handlers: + this.options.fileInput = this.options.fileInput.map(function (i, el) { + if (el === input[0]) { + return inputClone[0]; + } + return el; + }); + // If the widget has been initialized on the file input itself, + // override this.element with the file input clone: + if (input[0] === this.element[0]) { + this.element = inputClone; + } + }, + + _handleFileTreeEntry: function (entry, path) { + var that = this, + dfd = $.Deferred(), + errorHandler = function (e) { + if (e && !e.entry) { + e.entry = entry; + } + // Since $.when returns immediately if one + // Deferred is rejected, we use resolve instead. + // This allows valid files and invalid items + // to be returned together in one set: + dfd.resolve([e]); + }, + dirReader; + path = path || ''; + if (entry.isFile) { + if (entry._file) { + // Workaround for Chrome bug #149735 + entry._file.relativePath = path; + dfd.resolve(entry._file); + } else { + entry.file(function (file) { + file.relativePath = path; + dfd.resolve(file); + }, errorHandler); + } + } else if (entry.isDirectory) { + dirReader = entry.createReader(); + dirReader.readEntries(function (entries) { + that._handleFileTreeEntries( + entries, + path + entry.name + '/' + ).done(function (files) { + dfd.resolve(files); + }).fail(errorHandler); + }, errorHandler); + } else { + // Return an empy list for file system items + // other than files or directories: + dfd.resolve([]); + } + return dfd.promise(); + }, + + _handleFileTreeEntries: function (entries, path) { + var that = this; + return $.when.apply( + $, + $.map(entries, function (entry) { + return that._handleFileTreeEntry(entry, path); + }) + ).pipe(function () { + return Array.prototype.concat.apply( + [], + arguments + ); + }); + }, + + _getDroppedFiles: function (dataTransfer) { + dataTransfer = dataTransfer || {}; + var items = dataTransfer.items; + if (items && items.length && (items[0].webkitGetAsEntry || + items[0].getAsEntry)) { + return this._handleFileTreeEntries( + $.map(items, function (item) { + var entry; + if (item.webkitGetAsEntry) { + entry = item.webkitGetAsEntry(); + if (entry) { + // Workaround for Chrome bug #149735: + entry._file = item.getAsFile(); + } + return entry; + } + return item.getAsEntry(); + }) + ); + } + return $.Deferred().resolve( + $.makeArray(dataTransfer.files) + ).promise(); + }, + + _getSingleFileInputFiles: function (fileInput) { + fileInput = $(fileInput); + var entries = fileInput.prop('webkitEntries') || + fileInput.prop('entries'), + files, + value; + if (entries && entries.length) { + return this._handleFileTreeEntries(entries); + } + files = $.makeArray(fileInput.prop('files')); + if (!files.length) { + value = fileInput.prop('value'); + if (!value) { + return $.Deferred().resolve([]).promise(); + } + // If the files property is not available, the browser does not + // support the File API and we add a pseudo File object with + // the input value as name with path information removed: + files = [{name: value.replace(/^.*\\/, '')}]; + } else if (files[0].name === undefined && files[0].fileName) { + // File normalization for Safari 4 and Firefox 3: + $.each(files, function (index, file) { + file.name = file.fileName; + file.size = file.fileSize; + }); + } + return $.Deferred().resolve(files).promise(); + }, + + _getFileInputFiles: function (fileInput) { + if (!(fileInput instanceof $) || fileInput.length === 1) { + return this._getSingleFileInputFiles(fileInput); + } + return $.when.apply( + $, + $.map(fileInput, this._getSingleFileInputFiles) + ).pipe(function () { + return Array.prototype.concat.apply( + [], + arguments + ); + }); + }, + + _onChange: function (e) { + var that = this, + data = { + fileInput: $(e.target), + form: $(e.target.form) + }; + this._getFileInputFiles(data.fileInput).always(function (files) { + data.files = files; + if (that.options.replaceFileInput) { + that._replaceFileInput(data.fileInput); + } + if (that._trigger('change', e, data) !== false) { + that._onAdd(e, data); + } + }); + }, + + _onPaste: function (e) { + var items = e.originalEvent && e.originalEvent.clipboardData && + e.originalEvent.clipboardData.items, + data = {files: []}; + if (items && items.length) { + $.each(items, function (index, item) { + var file = item.getAsFile && item.getAsFile(); + if (file) { + data.files.push(file); + } + }); + if (this._trigger('paste', e, data) === false || + this._onAdd(e, data) === false) { + return false; + } + } + }, + + _onDrop: function (e) { + e.dataTransfer = e.originalEvent && e.originalEvent.dataTransfer; + var that = this, + dataTransfer = e.dataTransfer, + data = {}; + if (dataTransfer && dataTransfer.files && dataTransfer.files.length) { + e.preventDefault(); + this._getDroppedFiles(dataTransfer).always(function (files) { + data.files = files; + if (that._trigger('drop', e, data) !== false) { + that._onAdd(e, data); + } + }); + } + }, + + _onDragOver: function (e) { + e.dataTransfer = e.originalEvent && e.originalEvent.dataTransfer; + var dataTransfer = e.dataTransfer; + if (dataTransfer) { + if (this._trigger('dragover', e) === false) { + return false; + } + if ($.inArray('Files', dataTransfer.types) !== -1) { + dataTransfer.dropEffect = 'copy'; + e.preventDefault(); + } + } + }, + + _initEventHandlers: function () { + if (this._isXHRUpload(this.options)) { + this._on(this.options.dropZone, { + dragover: this._onDragOver, + drop: this._onDrop + }); + this._on(this.options.pasteZone, { + paste: this._onPaste + }); + } + if ($.support.fileInput) { + this._on(this.options.fileInput, { + change: this._onChange + }); + } + }, + + _destroyEventHandlers: function () { + this._off(this.options.dropZone, 'dragover drop'); + this._off(this.options.pasteZone, 'paste'); + this._off(this.options.fileInput, 'change'); + }, + + _setOption: function (key, value) { + var reinit = $.inArray(key, this._specialOptions) !== -1; + if (reinit) { + this._destroyEventHandlers(); + } + this._super(key, value); + if (reinit) { + this._initSpecialOptions(); + this._initEventHandlers(); + } + }, + + _initSpecialOptions: function () { + var options = this.options; + if (options.fileInput === undefined) { + options.fileInput = this.element.is('input[type="file"]') ? + this.element : this.element.find('input[type="file"]'); + } else if (!(options.fileInput instanceof $)) { + options.fileInput = $(options.fileInput); + } + if (!(options.dropZone instanceof $)) { + options.dropZone = $(options.dropZone); + } + if (!(options.pasteZone instanceof $)) { + options.pasteZone = $(options.pasteZone); + } + }, + + _getRegExp: function (str) { + var parts = str.split('/'), + modifiers = parts.pop(); + parts.shift(); + return new RegExp(parts.join('/'), modifiers); + }, + + _isRegExpOption: function (key, value) { + return key !== 'url' && $.type(value) === 'string' && + /^\/.*\/[igm]{0,3}$/.test(value); + }, + + _initDataAttributes: function () { + var that = this, + options = this.options; + // Initialize options set via HTML5 data-attributes: + $.each( + $(this.element[0].cloneNode(false)).data(), + function (key, value) { + if (that._isRegExpOption(key, value)) { + value = that._getRegExp(value); + } + options[key] = value; + } + ); + }, + + _create: function () { + this._initDataAttributes(); + this._initSpecialOptions(); + this._slots = []; + this._sequence = this._getXHRPromise(true); + this._sending = this._active = 0; + this._initProgressObject(this); + this._initEventHandlers(); + }, + + // This method is exposed to the widget API and allows to query + // the number of active uploads: + active: function () { + return this._active; + }, + + // This method is exposed to the widget API and allows to query + // the widget upload progress. + // It returns an object with loaded, total and bitrate properties + // for the running uploads: + progress: function () { + return this._progress; + }, + + // This method is exposed to the widget API and allows adding files + // using the fileupload API. The data parameter accepts an object which + // must have a files property and can contain additional options: + // .fileupload('add', {files: filesList}); + add: function (data) { + var that = this; + if (!data || this.options.disabled) { + return; + } + if (data.fileInput && !data.files) { + this._getFileInputFiles(data.fileInput).always(function (files) { + data.files = files; + that._onAdd(null, data); + }); + } else { + data.files = $.makeArray(data.files); + this._onAdd(null, data); + } + }, + + // This method is exposed to the widget API and allows sending files + // using the fileupload API. The data parameter accepts an object which + // must have a files or fileInput property and can contain additional options: + // .fileupload('send', {files: filesList}); + // The method returns a Promise object for the file upload call. + send: function (data) { + if (data && !this.options.disabled) { + if (data.fileInput && !data.files) { + var that = this, + dfd = $.Deferred(), + promise = dfd.promise(), + jqXHR, + aborted; + promise.abort = function () { + aborted = true; + if (jqXHR) { + return jqXHR.abort(); + } + dfd.reject(null, 'abort', 'abort'); + return promise; + }; + this._getFileInputFiles(data.fileInput).always( + function (files) { + if (aborted) { + return; + } + data.files = files; + jqXHR = that._onSend(null, data).then( + function (result, textStatus, jqXHR) { + dfd.resolve(result, textStatus, jqXHR); + }, + function (jqXHR, textStatus, errorThrown) { + dfd.reject(jqXHR, textStatus, errorThrown); + } + ); + } + ); + return this._enhancePromise(promise); + } + data.files = $.makeArray(data.files); + if (data.files.length) { + return this._onSend(null, data); + } + } + return this._getXHRPromise(false, data && data.context); + } + + }); + +})); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/jquery.iframe-transport.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/jquery.iframe-transport.js new file mode 100644 index 0000000000000000000000000000000000000000..073c5fbe704493e0cd46535e187ec421aa9b917b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/jquery.iframe-transport.js @@ -0,0 +1,205 @@ +/* + * jQuery Iframe Transport Plugin 1.7 + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2011, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ + +/*jslint unparam: true, nomen: true */ +/*global define, window, document */ + +(function (factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define(['jquery'], factory); + } else { + // Browser globals: + factory(window.jQuery); + } +}(function ($) { + 'use strict'; + + // Helper variable to create unique names for the transport iframes: + var counter = 0; + + // The iframe transport accepts three additional options: + // options.fileInput: a jQuery collection of file input fields + // options.paramName: the parameter name for the file form data, + // overrides the name property of the file input field(s), + // can be a string or an array of strings. + // options.formData: an array of objects with name and value properties, + // equivalent to the return data of .serializeArray(), e.g.: + // [{name: 'a', value: 1}, {name: 'b', value: 2}] + $.ajaxTransport('iframe', function (options) { + if (options.async) { + var form, + iframe, + addParamChar; + return { + send: function (_, completeCallback) { + form = $('<form style="display:none;"></form>'); + form.attr('accept-charset', options.formAcceptCharset); + addParamChar = /\?/.test(options.url) ? '&' : '?'; + // XDomainRequest only supports GET and POST: + if (options.type === 'DELETE') { + options.url = options.url + addParamChar + '_method=DELETE'; + options.type = 'POST'; + } else if (options.type === 'PUT') { + options.url = options.url + addParamChar + '_method=PUT'; + options.type = 'POST'; + } else if (options.type === 'PATCH') { + options.url = options.url + addParamChar + '_method=PATCH'; + options.type = 'POST'; + } + // javascript:false as initial iframe src + // prevents warning popups on HTTPS in IE6. + // IE versions below IE8 cannot set the name property of + // elements that have already been added to the DOM, + // so we set the name along with the iframe HTML markup: + counter += 1; + iframe = $( + '<iframe src="javascript:false;" name="iframe-transport-' + + counter + '"></iframe>' + ).bind('load', function () { + var fileInputClones, + paramNames = $.isArray(options.paramName) ? + options.paramName : [options.paramName]; + iframe + .unbind('load') + .bind('load', function () { + var response; + // Wrap in a try/catch block to catch exceptions thrown + // when trying to access cross-domain iframe contents: + try { + response = iframe.contents(); + // Google Chrome and Firefox do not throw an + // exception when calling iframe.contents() on + // cross-domain requests, so we unify the response: + if (!response.length || !response[0].firstChild) { + throw new Error(); + } + } catch (e) { + response = undefined; + } + // The complete callback returns the + // iframe content document as response object: + completeCallback( + 200, + 'success', + {'iframe': response} + ); + // Fix for IE endless progress bar activity bug + // (happens on form submits to iframe targets): + $('<iframe src="javascript:false;"></iframe>') + .appendTo(form); + window.setTimeout(function () { + // Removing the form in a setTimeout call + // allows Chrome's developer tools to display + // the response result + form.remove(); + }, 0); + }); + form + .prop('target', iframe.prop('name')) + .prop('action', options.url) + .prop('method', options.type); + if (options.formData) { + $.each(options.formData, function (index, field) { + $('<input type="hidden"/>') + .prop('name', field.name) + .val(field.value) + .appendTo(form); + }); + } + if (options.fileInput && options.fileInput.length && + options.type === 'POST') { + fileInputClones = options.fileInput.clone(); + // Insert a clone for each file input field: + options.fileInput.after(function (index) { + return fileInputClones[index]; + }); + if (options.paramName) { + options.fileInput.each(function (index) { + $(this).prop( + 'name', + paramNames[index] || options.paramName + ); + }); + } + // Appending the file input fields to the hidden form + // removes them from their original location: + form + .append(options.fileInput) + .prop('enctype', 'multipart/form-data') + // enctype must be set as encoding for IE: + .prop('encoding', 'multipart/form-data'); + } + form.submit(); + // Insert the file input fields at their original location + // by replacing the clones with the originals: + if (fileInputClones && fileInputClones.length) { + options.fileInput.each(function (index, input) { + var clone = $(fileInputClones[index]); + $(input).prop('name', clone.prop('name')); + clone.replaceWith(input); + }); + } + }); + form.append(iframe).appendTo(document.body); + }, + abort: function () { + if (iframe) { + // javascript:false as iframe src aborts the request + // and prevents warning popups on HTTPS in IE6. + // concat is used to avoid the "Script URL" JSLint error: + iframe + .unbind('load') + .prop('src', 'javascript'.concat(':false;')); + } + if (form) { + form.remove(); + } + } + }; + } + }); + + // The iframe transport returns the iframe content document as response. + // The following adds converters from iframe to text, json, html, xml + // and script. + // Please note that the Content-Type for JSON responses has to be text/plain + // or text/html, if the browser doesn't include application/json in the + // Accept header, else IE will show a download dialog. + // The Content-Type for XML responses on the other hand has to be always + // application/xml or text/xml, so IE properly parses the XML response. + // See also + // https://github.com/blueimp/jQuery-File-Upload/wiki/Setup#content-type-negotiation + $.ajaxSetup({ + converters: { + 'iframe text': function (iframe) { + return iframe && $(iframe[0].body).text(); + }, + 'iframe json': function (iframe) { + return iframe && $.parseJSON($(iframe[0].body).text()); + }, + 'iframe html': function (iframe) { + return iframe && $(iframe[0].body).html(); + }, + 'iframe xml': function (iframe) { + var xmlDoc = iframe && iframe[0]; + return xmlDoc && $.isXMLDoc(xmlDoc) ? xmlDoc : + $.parseXML((xmlDoc.XMLDocument && xmlDoc.XMLDocument.xml) || + $(xmlDoc.body).html()); + }, + 'iframe script': function (iframe) { + return iframe && $.globalEval($(iframe[0].body).text()); + } + } + }); + +})); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/jquery.min.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/jquery.min.js new file mode 100644 index 0000000000000000000000000000000000000000..006e953102ded2db8e217e4507de3baa8bcc976d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/jquery.min.js @@ -0,0 +1,5 @@ +/*! jQuery v1.9.1 | (c) 2005, 2012 jQuery Foundation, Inc. | jquery.org/license +//@ sourceMappingURL=jquery.min.map +*/(function(e,t){var n,r,i=typeof t,o=e.document,a=e.location,s=e.jQuery,u=e.$,l={},c=[],p="1.9.1",f=c.concat,d=c.push,h=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=p.trim,b=function(e,t){return new b.fn.init(e,t,r)},x=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,w=/\S+/g,T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,k=/^[\],:{}\s]*$/,E=/(?:^|:|,)(?:\s*\[)+/g,S=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,A=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,j=/^-ms-/,D=/-([\da-z])/gi,L=function(e,t){return t.toUpperCase()},H=function(e){(o.addEventListener||"load"===e.type||"complete"===o.readyState)&&(q(),b.ready())},q=function(){o.addEventListener?(o.removeEventListener("DOMContentLoaded",H,!1),e.removeEventListener("load",H,!1)):(o.detachEvent("onreadystatechange",H),e.detachEvent("onload",H))};b.fn=b.prototype={jquery:p,constructor:b,init:function(e,n,r){var i,a;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof b?n[0]:n,b.merge(this,b.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:o,!0)),C.test(i[1])&&b.isPlainObject(n))for(i in n)b.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(a=o.getElementById(i[2]),a&&a.parentNode){if(a.id!==i[2])return r.find(e);this.length=1,this[0]=a}return this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):b.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),b.makeArray(e,this))},selector:"",length:0,size:function(){return this.length},toArray:function(){return h.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=b.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return b.each(this,e,t)},ready:function(e){return b.ready.promise().done(e),this},slice:function(){return this.pushStack(h.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(b.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:d,sort:[].sort,splice:[].splice},b.fn.init.prototype=b.fn,b.extend=b.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},u=1,l=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},u=2),"object"==typeof s||b.isFunction(s)||(s={}),l===u&&(s=this,--u);l>u;u++)if(null!=(o=arguments[u]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(b.isPlainObject(r)||(n=b.isArray(r)))?(n?(n=!1,a=e&&b.isArray(e)?e:[]):a=e&&b.isPlainObject(e)?e:{},s[i]=b.extend(c,a,r)):r!==t&&(s[i]=r));return s},b.extend({noConflict:function(t){return e.$===b&&(e.$=u),t&&e.jQuery===b&&(e.jQuery=s),b},isReady:!1,readyWait:1,holdReady:function(e){e?b.readyWait++:b.ready(!0)},ready:function(e){if(e===!0?!--b.readyWait:!b.isReady){if(!o.body)return setTimeout(b.ready);b.isReady=!0,e!==!0&&--b.readyWait>0||(n.resolveWith(o,[b]),b.fn.trigger&&b(o).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===b.type(e)},isArray:Array.isArray||function(e){return"array"===b.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[m.call(e)]||"object":typeof e},isPlainObject:function(e){if(!e||"object"!==b.type(e)||e.nodeType||b.isWindow(e))return!1;try{if(e.constructor&&!y.call(e,"constructor")&&!y.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||y.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||o;var r=C.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=b.buildFragment([e],t,i),i&&b(i).remove(),b.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=b.trim(n),n&&k.test(n.replace(S,"@").replace(A,"]").replace(E,"")))?Function("return "+n)():(b.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||b.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&b.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(j,"ms-").replace(D,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:v&&!v.call("\ufeff\u00a0")?function(e){return null==e?"":v.call(e)}:function(e){return null==e?"":(e+"").replace(T,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?b.merge(n,"string"==typeof e?[e]:e):d.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(g)return g.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return f.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),b.isFunction(e)?(r=h.call(arguments,2),i=function(){return e.apply(n||this,r.concat(h.call(arguments)))},i.guid=e.guid=e.guid||b.guid++,i):t},access:function(e,n,r,i,o,a,s){var u=0,l=e.length,c=null==r;if("object"===b.type(r)){o=!0;for(u in r)b.access(e,n,u,r[u],!0,a,s)}else if(i!==t&&(o=!0,b.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(b(e),n)})),n))for(;l>u;u++)n(e[u],r,s?i:i.call(e[u],u,n(e[u],r)));return o?e:c?n.call(e):l?n(e[0],r):a},now:function(){return(new Date).getTime()}}),b.ready.promise=function(t){if(!n)if(n=b.Deferred(),"complete"===o.readyState)setTimeout(b.ready);else if(o.addEventListener)o.addEventListener("DOMContentLoaded",H,!1),e.addEventListener("load",H,!1);else{o.attachEvent("onreadystatechange",H),e.attachEvent("onload",H);var r=!1;try{r=null==e.frameElement&&o.documentElement}catch(i){}r&&r.doScroll&&function a(){if(!b.isReady){try{r.doScroll("left")}catch(e){return setTimeout(a,50)}q(),b.ready()}}()}return n.promise(t)},b.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=b.type(e);return b.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=b(o);var _={};function F(e){var t=_[e]={};return b.each(e.match(w)||[],function(e,n){t[n]=!0}),t}b.Callbacks=function(e){e="string"==typeof e?_[e]||F(e):b.extend({},e);var n,r,i,o,a,s,u=[],l=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=u.length,n=!0;u&&o>a;a++)if(u[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,u&&(l?l.length&&c(l.shift()):r?u=[]:p.disable())},p={add:function(){if(u){var t=u.length;(function i(t){b.each(t,function(t,n){var r=b.type(n);"function"===r?e.unique&&p.has(n)||u.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=u.length:r&&(s=t,c(r))}return this},remove:function(){return u&&b.each(arguments,function(e,t){var r;while((r=b.inArray(t,u,r))>-1)u.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?b.inArray(e,u)>-1:!(!u||!u.length)},empty:function(){return u=[],this},disable:function(){return u=l=r=t,this},disabled:function(){return!u},lock:function(){return l=t,r||p.disable(),this},locked:function(){return!l},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],!u||i&&!l||(n?l.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},b.extend({Deferred:function(e){var t=[["resolve","done",b.Callbacks("once memory"),"resolved"],["reject","fail",b.Callbacks("once memory"),"rejected"],["notify","progress",b.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return b.Deferred(function(n){b.each(t,function(t,o){var a=o[0],s=b.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&b.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?b.extend(e,r):r}},i={};return r.pipe=r.then,b.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=h.call(arguments),r=n.length,i=1!==r||e&&b.isFunction(e.promise)?r:0,o=1===i?e:b.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?h.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,u,l;if(r>1)for(s=Array(r),u=Array(r),l=Array(r);r>t;t++)n[t]&&b.isFunction(n[t].promise)?n[t].promise().done(a(t,l,n)).fail(o.reject).progress(a(t,u,s)):--i;return i||o.resolveWith(l,n),o.promise()}}),b.support=function(){var t,n,r,a,s,u,l,c,p,f,d=o.createElement("div");if(d.setAttribute("className","t"),d.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=d.getElementsByTagName("*"),r=d.getElementsByTagName("a")[0],!n||!r||!n.length)return{};s=o.createElement("select"),l=s.appendChild(o.createElement("option")),a=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={getSetAttribute:"t"!==d.className,leadingWhitespace:3===d.firstChild.nodeType,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:"/a"===r.getAttribute("href"),opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:!!a.value,optSelected:l.selected,enctype:!!o.createElement("form").enctype,html5Clone:"<:nav></:nav>"!==o.createElement("nav").cloneNode(!0).outerHTML,boxModel:"CSS1Compat"===o.compatMode,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},a.checked=!0,t.noCloneChecked=a.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!l.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}a=o.createElement("input"),a.setAttribute("value",""),t.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),t.radioValue="t"===a.value,a.setAttribute("checked","t"),a.setAttribute("name","t"),u=o.createDocumentFragment(),u.appendChild(a),t.appendChecked=a.checked,t.checkClone=u.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;return d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip,b(function(){var n,r,a,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",u=o.getElementsByTagName("body")[0];u&&(n=o.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",u.appendChild(n).appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",a=d.getElementsByTagName("td"),a[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===a[0].offsetHeight,a[0].style.display="",a[1].style.display="none",t.reliableHiddenOffsets=p&&0===a[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=4===d.offsetWidth,t.doesNotIncludeMarginInBodyOffset=1!==u.offsetTop,e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(o.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="<div></div>",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(u.style.zoom=1)),u.removeChild(n),n=d=a=r=null)}),n=s=u=l=r=a=null,t}();var O=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,B=/([A-Z])/g;function P(e,n,r,i){if(b.acceptData(e)){var o,a,s=b.expando,u="string"==typeof n,l=e.nodeType,p=l?b.cache:e,f=l?e[s]:e[s]&&s;if(f&&p[f]&&(i||p[f].data)||!u||r!==t)return f||(l?e[s]=f=c.pop()||b.guid++:f=s),p[f]||(p[f]={},l||(p[f].toJSON=b.noop)),("object"==typeof n||"function"==typeof n)&&(i?p[f]=b.extend(p[f],n):p[f].data=b.extend(p[f].data,n)),o=p[f],i||(o.data||(o.data={}),o=o.data),r!==t&&(o[b.camelCase(n)]=r),u?(a=o[n],null==a&&(a=o[b.camelCase(n)])):a=o,a}}function R(e,t,n){if(b.acceptData(e)){var r,i,o,a=e.nodeType,s=a?b.cache:e,u=a?e[b.expando]:b.expando;if(s[u]){if(t&&(o=n?s[u]:s[u].data)){b.isArray(t)?t=t.concat(b.map(t,b.camelCase)):t in o?t=[t]:(t=b.camelCase(t),t=t in o?[t]:t.split(" "));for(r=0,i=t.length;i>r;r++)delete o[t[r]];if(!(n?$:b.isEmptyObject)(o))return}(n||(delete s[u].data,$(s[u])))&&(a?b.cleanData([e],!0):b.support.deleteExpando||s!=s.window?delete s[u]:s[u]=null)}}}b.extend({cache:{},expando:"jQuery"+(p+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?b.cache[e[b.expando]]:e[b.expando],!!e&&!$(e)},data:function(e,t,n){return P(e,t,n)},removeData:function(e,t){return R(e,t)},_data:function(e,t,n){return P(e,t,n,!0)},_removeData:function(e,t){return R(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&b.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),b.fn.extend({data:function(e,n){var r,i,o=this[0],a=0,s=null;if(e===t){if(this.length&&(s=b.data(o),1===o.nodeType&&!b._data(o,"parsedAttrs"))){for(r=o.attributes;r.length>a;a++)i=r[a].name,i.indexOf("data-")||(i=b.camelCase(i.slice(5)),W(o,i,s[i]));b._data(o,"parsedAttrs",!0)}return s}return"object"==typeof e?this.each(function(){b.data(this,e)}):b.access(this,function(n){return n===t?o?W(o,e,b.data(o,e)):null:(this.each(function(){b.data(this,e,n)}),t)},null,n,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){b.removeData(this,e)})}});function W(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(B,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:O.test(r)?b.parseJSON(r):r}catch(o){}b.data(e,n,r)}else r=t}return r}function $(e){var t;for(t in e)if(("data"!==t||!b.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}b.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=b._data(e,n),r&&(!i||b.isArray(r)?i=b._data(e,n,b.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=b.queue(e,t),r=n.length,i=n.shift(),o=b._queueHooks(e,t),a=function(){b.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),o.cur=i,i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return b._data(e,n)||b._data(e,n,{empty:b.Callbacks("once memory").add(function(){b._removeData(e,t+"queue"),b._removeData(e,n)})})}}),b.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?b.queue(this[0],e):n===t?this:this.each(function(){var t=b.queue(this,e,n);b._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&b.dequeue(this,e)})},dequeue:function(e){return this.each(function(){b.dequeue(this,e)})},delay:function(e,t){return e=b.fx?b.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=b.Deferred(),a=this,s=this.length,u=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=b._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(u));return u(),o.promise(n)}});var I,z,X=/[\t\r\n]/g,U=/\r/g,V=/^(?:input|select|textarea|button|object)$/i,Y=/^(?:a|area)$/i,J=/^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,G=/^(?:checked|selected)$/i,Q=b.support.getSetAttribute,K=b.support.input;b.fn.extend({attr:function(e,t){return b.access(this,b.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})},prop:function(e,t){return b.access(this,b.prop,e,t,arguments.length>1)},removeProp:function(e){return e=b.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,u="string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=b.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,u=0===arguments.length||"string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?b.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e,r="boolean"==typeof t;return b.isFunction(e)?this.each(function(n){b(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var o,a=0,s=b(this),u=t,l=e.match(w)||[];while(o=l[a++])u=r?u:!s.hasClass(o),s[u?"addClass":"removeClass"](o)}else(n===i||"boolean"===n)&&(this.className&&b._data(this,"__className__",this.className),this.className=this.className||e===!1?"":b._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(X," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=b.isFunction(e),this.each(function(n){var o,a=b(this);1===this.nodeType&&(o=i?e.call(this,n,a.val()):e,null==o?o="":"number"==typeof o?o+="":b.isArray(o)&&(o=b.map(o,function(e){return null==e?"":e+""})),r=b.valHooks[this.type]||b.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=b.valHooks[o.type]||b.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(U,""):null==n?"":n)}}}),b.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,u=0>i?s:o?i:0;for(;s>u;u++)if(n=r[u],!(!n.selected&&u!==i||(b.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&b.nodeName(n.parentNode,"optgroup"))){if(t=b(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n=b.makeArray(t);return b(e).find("option").each(function(){this.selected=b.inArray(b(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attr:function(e,n,r){var o,a,s,u=e.nodeType;if(e&&3!==u&&8!==u&&2!==u)return typeof e.getAttribute===i?b.prop(e,n,r):(a=1!==u||!b.isXMLDoc(e),a&&(n=n.toLowerCase(),o=b.attrHooks[n]||(J.test(n)?z:I)),r===t?o&&a&&"get"in o&&null!==(s=o.get(e,n))?s:(typeof e.getAttribute!==i&&(s=e.getAttribute(n)),null==s?t:s):null!==r?o&&a&&"set"in o&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r):(b.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(w);if(o&&1===e.nodeType)while(n=o[i++])r=b.propFix[n]||n,J.test(n)?!Q&&G.test(n)?e[b.camelCase("default-"+n)]=e[r]=!1:e[r]=!1:b.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!b.support.radioValue&&"radio"===t&&b.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!b.isXMLDoc(e),a&&(n=b.propFix[n]||n,o=b.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):V.test(e.nodeName)||Y.test(e.nodeName)&&e.href?0:t}}}}),z={get:function(e,n){var r=b.prop(e,n),i="boolean"==typeof r&&e.getAttribute(n),o="boolean"==typeof r?K&&Q?null!=i:G.test(n)?e[b.camelCase("default-"+n)]:!!i:e.getAttributeNode(n);return o&&o.value!==!1?n.toLowerCase():t},set:function(e,t,n){return t===!1?b.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&b.propFix[n]||n,n):e[b.camelCase("default-"+n)]=e[n]=!0,n}},K&&Q||(b.attrHooks.value={get:function(e,n){var r=e.getAttributeNode(n);return b.nodeName(e,"input")?e.defaultValue:r&&r.specified?r.value:t},set:function(e,n,r){return b.nodeName(e,"input")?(e.defaultValue=n,t):I&&I.set(e,n,r)}}),Q||(I=b.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&("id"===n||"name"===n||"coords"===n?""!==r.value:r.specified)?r.value:t},set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},b.attrHooks.contenteditable={get:I.get,set:function(e,t,n){I.set(e,""===t?!1:t,n)}},b.each(["width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}})})),b.support.hrefNormalized||(b.each(["href","src","width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return null==r?t:r}})}),b.each(["href","src"],function(e,t){b.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}})),b.support.style||(b.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),b.support.optSelected||(b.propHooks.selected=b.extend(b.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),b.support.enctype||(b.propFix.enctype="encoding"),b.support.checkOn||b.each(["radio","checkbox"],function(){b.valHooks[this]={get:function(e){return null===e.getAttribute("value")?"on":e.value}}}),b.each(["radio","checkbox"],function(){b.valHooks[this]=b.extend(b.valHooks[this],{set:function(e,n){return b.isArray(n)?e.checked=b.inArray(b(e).val(),n)>=0:t}})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}b.event={global:{},add:function(e,n,r,o,a){var s,u,l,c,p,f,d,h,g,m,y,v=b._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=b.guid++),(u=v.events)||(u=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof b===i||e&&b.event.triggered===e.type?t:b.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(w)||[""],l=n.length;while(l--)s=rt.exec(n[l])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),p=b.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=b.event.special[g]||{},d=b.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&b.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=u[g])||(h=u[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),b.event.global[g]=!0;e=null}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,p,f,d,h,g,m=b.hasData(e)&&b._data(e);if(m&&(c=m.events)){t=(t||"").match(w)||[""],l=t.length;while(l--)if(s=rt.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=b.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),u=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));u&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||b.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)b.event.remove(e,d+t[l],n,r,!0);b.isEmptyObject(c)&&(delete m.handle,b._removeData(e,"events"))}},trigger:function(n,r,i,a){var s,u,l,c,p,f,d,h=[i||o],g=y.call(n,"type")?n.type:n,m=y.call(n,"namespace")?n.namespace.split("."):[];if(l=f=i=i||o,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+b.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),u=0>g.indexOf(":")&&"on"+g,n=n[b.expando]?n:new b.Event(g,"object"==typeof n&&n),n.isTrigger=!0,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:b.makeArray(r,[n]),p=b.event.special[g]||{},a||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!a&&!p.noBubble&&!b.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(l=l.parentNode);l;l=l.parentNode)h.push(l),f=l;f===(i.ownerDocument||o)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((l=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(b._data(l,"events")||{})[n.type]&&b._data(l,"handle"),s&&s.apply(l,r),s=u&&l[u],s&&b.acceptData(l)&&s.apply&&s.apply(l,r)===!1&&n.preventDefault();if(n.type=g,!(a||n.isDefaultPrevented()||p._default&&p._default.apply(i.ownerDocument,r)!==!1||"click"===g&&b.nodeName(i,"a")||!b.acceptData(i)||!u||!i[g]||b.isWindow(i))){f=i[u],f&&(i[u]=null),b.event.triggered=g;try{i[g]()}catch(v){}b.event.triggered=t,f&&(i[u]=f)}return n.result}},dispatch:function(e){e=b.event.fix(e);var n,r,i,o,a,s=[],u=h.call(arguments),l=(b._data(this,"events")||{})[e.type]||[],c=b.event.special[e.type]||{};if(u[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=b.event.handlers.call(this,e,l),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((b.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,u),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],u=n.delegateCount,l=e.target;if(u&&l.nodeType&&(!e.button||"click"!==e.type))for(;l!=this;l=l.parentNode||this)if(1===l.nodeType&&(l.disabled!==!0||"click"!==e.type)){for(o=[],a=0;u>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?b(r,this).index(l)>=0:b.find(r,this,null,[l]).length),o[r]&&o.push(i);o.length&&s.push({elem:l,handlers:o})}return n.length>u&&s.push({elem:this,handlers:n.slice(u)}),s},fix:function(e){if(e[b.expando])return e;var t,n,r,i=e.type,a=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new b.Event(a),t=r.length;while(t--)n=r[t],e[n]=a[n];return e.target||(e.target=a.srcElement||o),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,a):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,a,s=n.button,u=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||o,a=i.documentElement,r=i.body,e.pageX=n.clientX+(a&&a.scrollLeft||r&&r.scrollLeft||0)-(a&&a.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(a&&a.scrollTop||r&&r.scrollTop||0)-(a&&a.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&u&&(e.relatedTarget=u===e.target?n.toElement:u),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},click:{trigger:function(){return b.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t}},focus:{trigger:function(){if(this!==o.activeElement&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===o.activeElement&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=b.extend(new b.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?b.event.trigger(i,null,t):b.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},b.removeEvent=o.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},b.Event=function(e,n){return this instanceof b.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&b.extend(this,n),this.timeStamp=e&&e.timeStamp||b.now(),this[b.expando]=!0,t):new b.Event(e,n)},b.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},b.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){b.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj; +return(!i||i!==r&&!b.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),b.support.submitBubbles||(b.event.special.submit={setup:function(){return b.nodeName(this,"form")?!1:(b.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=b.nodeName(n,"input")||b.nodeName(n,"button")?n.form:t;r&&!b._data(r,"submitBubbles")&&(b.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),b._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&b.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return b.nodeName(this,"form")?!1:(b.event.remove(this,"._submit"),t)}}),b.support.changeBubbles||(b.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(b.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),b.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),b.event.simulate("change",this,e,!0)})),!1):(b.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!b._data(t,"changeBubbles")&&(b.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||b.event.simulate("change",this.parentNode,e,!0)}),b._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return b.event.remove(this,"._change"),!Z.test(this.nodeName)}}),b.support.focusinBubbles||b.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){b.event.simulate(t,e.target,b.event.fix(e),!0)};b.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}}),b.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return b().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=b.guid++)),this.each(function(){b.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,b(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){b.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){b.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?b.event.trigger(e,n,r,!0):t}}),function(e,t){var n,r,i,o,a,s,u,l,c,p,f,d,h,g,m,y,v,x="sizzle"+-new Date,w=e.document,T={},N=0,C=0,k=it(),E=it(),S=it(),A=typeof t,j=1<<31,D=[],L=D.pop,H=D.push,q=D.slice,M=D.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},_="[\\x20\\t\\r\\n\\f]",F="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=F.replace("w","w#"),B="([*^$|!~]?=)",P="\\["+_+"*("+F+")"+_+"*(?:"+B+_+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+O+")|)|)"+_+"*\\]",R=":("+F+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+P.replace(3,8)+")*)|.*)\\)|)",W=RegExp("^"+_+"+|((?:^|[^\\\\])(?:\\\\.)*)"+_+"+$","g"),$=RegExp("^"+_+"*,"+_+"*"),I=RegExp("^"+_+"*([\\x20\\t\\r\\n\\f>+~])"+_+"*"),z=RegExp(R),X=RegExp("^"+O+"$"),U={ID:RegExp("^#("+F+")"),CLASS:RegExp("^\\.("+F+")"),NAME:RegExp("^\\[name=['\"]?("+F+")['\"]?\\]"),TAG:RegExp("^("+F.replace("w","w*")+")"),ATTR:RegExp("^"+P),PSEUDO:RegExp("^"+R),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+_+"*(even|odd|(([+-]|)(\\d*)n|)"+_+"*(?:([+-]|)"+_+"*(\\d+)|))"+_+"*\\)|)","i"),needsContext:RegExp("^"+_+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+_+"*((?:-\\d)?\\d*)"+_+"*\\)|)(?=[^-]|$)","i")},V=/[\x20\t\r\n\f]*[+~]/,Y=/^[^{]+\{\s*\[native code/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,G=/^(?:input|select|textarea|button)$/i,Q=/^h\d$/i,K=/'|\\/g,Z=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,et=/\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,tt=function(e,t){var n="0x"+t-65536;return n!==n?t:0>n?String.fromCharCode(n+65536):String.fromCharCode(55296|n>>10,56320|1023&n)};try{q.call(w.documentElement.childNodes,0)[0].nodeType}catch(nt){q=function(e){var t,n=[];while(t=this[e++])n.push(t);return n}}function rt(e){return Y.test(e+"")}function it(){var e,t=[];return e=function(n,r){return t.push(n+=" ")>i.cacheLength&&delete e[t.shift()],e[n]=r}}function ot(e){return e[x]=!0,e}function at(e){var t=p.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}}function st(e,t,n,r){var i,o,a,s,u,l,f,g,m,v;if((t?t.ownerDocument||t:w)!==p&&c(t),t=t||p,n=n||[],!e||"string"!=typeof e)return n;if(1!==(s=t.nodeType)&&9!==s)return[];if(!d&&!r){if(i=J.exec(e))if(a=i[1]){if(9===s){if(o=t.getElementById(a),!o||!o.parentNode)return n;if(o.id===a)return n.push(o),n}else if(t.ownerDocument&&(o=t.ownerDocument.getElementById(a))&&y(t,o)&&o.id===a)return n.push(o),n}else{if(i[2])return H.apply(n,q.call(t.getElementsByTagName(e),0)),n;if((a=i[3])&&T.getByClassName&&t.getElementsByClassName)return H.apply(n,q.call(t.getElementsByClassName(a),0)),n}if(T.qsa&&!h.test(e)){if(f=!0,g=x,m=t,v=9===s&&e,1===s&&"object"!==t.nodeName.toLowerCase()){l=ft(e),(f=t.getAttribute("id"))?g=f.replace(K,"\\$&"):t.setAttribute("id",g),g="[id='"+g+"'] ",u=l.length;while(u--)l[u]=g+dt(l[u]);m=V.test(e)&&t.parentNode||t,v=l.join(",")}if(v)try{return H.apply(n,q.call(m.querySelectorAll(v),0)),n}catch(b){}finally{f||t.removeAttribute("id")}}}return wt(e.replace(W,"$1"),t,n,r)}a=st.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},c=st.setDocument=function(e){var n=e?e.ownerDocument||e:w;return n!==p&&9===n.nodeType&&n.documentElement?(p=n,f=n.documentElement,d=a(n),T.tagNameNoComments=at(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),T.attributes=at(function(e){e.innerHTML="<select></select>";var t=typeof e.lastChild.getAttribute("multiple");return"boolean"!==t&&"string"!==t}),T.getByClassName=at(function(e){return e.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",e.getElementsByClassName&&e.getElementsByClassName("e").length?(e.lastChild.className="e",2===e.getElementsByClassName("e").length):!1}),T.getByName=at(function(e){e.id=x+0,e.innerHTML="<a name='"+x+"'></a><div name='"+x+"'></div>",f.insertBefore(e,f.firstChild);var t=n.getElementsByName&&n.getElementsByName(x).length===2+n.getElementsByName(x+0).length;return T.getIdNotName=!n.getElementById(x),f.removeChild(e),t}),i.attrHandle=at(function(e){return e.innerHTML="<a href='#'></a>",e.firstChild&&typeof e.firstChild.getAttribute!==A&&"#"===e.firstChild.getAttribute("href")})?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},T.getIdNotName?(i.find.ID=function(e,t){if(typeof t.getElementById!==A&&!d){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){return e.getAttribute("id")===t}}):(i.find.ID=function(e,n){if(typeof n.getElementById!==A&&!d){var r=n.getElementById(e);return r?r.id===e||typeof r.getAttributeNode!==A&&r.getAttributeNode("id").value===e?[r]:t:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){var n=typeof e.getAttributeNode!==A&&e.getAttributeNode("id");return n&&n.value===t}}),i.find.TAG=T.tagNameNoComments?function(e,n){return typeof n.getElementsByTagName!==A?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},i.find.NAME=T.getByName&&function(e,n){return typeof n.getElementsByName!==A?n.getElementsByName(name):t},i.find.CLASS=T.getByClassName&&function(e,n){return typeof n.getElementsByClassName===A||d?t:n.getElementsByClassName(e)},g=[],h=[":focus"],(T.qsa=rt(n.querySelectorAll))&&(at(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||h.push("\\["+_+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||h.push(":checked")}),at(function(e){e.innerHTML="<input type='hidden' i=''/>",e.querySelectorAll("[i^='']").length&&h.push("[*^$]="+_+"*(?:\"\"|'')"),e.querySelectorAll(":enabled").length||h.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),h.push(",.*:")})),(T.matchesSelector=rt(m=f.matchesSelector||f.mozMatchesSelector||f.webkitMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&at(function(e){T.disconnectedMatch=m.call(e,"div"),m.call(e,"[s!='']:x"),g.push("!=",R)}),h=RegExp(h.join("|")),g=RegExp(g.join("|")),y=rt(f.contains)||f.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},v=f.compareDocumentPosition?function(e,t){var r;return e===t?(u=!0,0):(r=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t))?1&r||e.parentNode&&11===e.parentNode.nodeType?e===n||y(w,e)?-1:t===n||y(w,t)?1:0:4&r?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return u=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:0;if(o===a)return ut(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?ut(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},u=!1,[0,0].sort(v),T.detectDuplicates=u,p):p},st.matches=function(e,t){return st(e,null,null,t)},st.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&c(e),t=t.replace(Z,"='$1']"),!(!T.matchesSelector||d||g&&g.test(t)||h.test(t)))try{var n=m.call(e,t);if(n||T.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(r){}return st(t,p,null,[e]).length>0},st.contains=function(e,t){return(e.ownerDocument||e)!==p&&c(e),y(e,t)},st.attr=function(e,t){var n;return(e.ownerDocument||e)!==p&&c(e),d||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):d||T.attributes?e.getAttribute(t):((n=e.getAttributeNode(t))||e.getAttribute(t))&&e[t]===!0?t:n&&n.specified?n.value:null},st.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},st.uniqueSort=function(e){var t,n=[],r=1,i=0;if(u=!T.detectDuplicates,e.sort(v),u){for(;t=e[r];r++)t===e[r-1]&&(i=n.push(r));while(i--)e.splice(n[i],1)}return e};function ut(e,t){var n=t&&e,r=n&&(~t.sourceIndex||j)-(~e.sourceIndex||j);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function lt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function ct(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function pt(e){return ot(function(t){return t=+t,ot(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}o=st.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=o(t);return n},i=st.selectors={cacheLength:50,createPseudo:ot,match:U,find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(et,tt),e[3]=(e[4]||e[5]||"").replace(et,tt),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||st.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&st.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return U.CHILD.test(e[0])?null:(e[4]?e[2]=e[4]:n&&z.test(n)&&(t=ft(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){return"*"===e?function(){return!0}:(e=e.replace(et,tt).toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[e+" "];return t||(t=RegExp("(^|"+_+")"+e+"("+_+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==A&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=st.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[x]||(m[x]={}),l=c[e]||[],d=l[0]===N&&l[1],f=l[0]===N&&l[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[N,d,f];break}}else if(v&&(l=(t[x]||(t[x]={}))[e])&&l[0]===N)f=l[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[x]||(p[x]={}))[e]=[N,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||st.error("unsupported pseudo: "+e);return r[x]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?ot(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=M.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:ot(function(e){var t=[],n=[],r=s(e.replace(W,"$1"));return r[x]?ot(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:ot(function(e){return function(t){return st(e,t).length>0}}),contains:ot(function(e){return function(t){return(t.textContent||t.innerText||o(t)).indexOf(e)>-1}}),lang:ot(function(e){return X.test(e||"")||st.error("unsupported lang: "+e),e=e.replace(et,tt).toLowerCase(),function(t){var n;do if(n=d?t.getAttribute("xml:lang")||t.getAttribute("lang"):t.lang)return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===f},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!i.pseudos.empty(e)},header:function(e){return Q.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:pt(function(){return[0]}),last:pt(function(e,t){return[t-1]}),eq:pt(function(e,t,n){return[0>n?n+t:n]}),even:pt(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:pt(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:pt(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:pt(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}};for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})i.pseudos[n]=lt(n);for(n in{submit:!0,reset:!0})i.pseudos[n]=ct(n);function ft(e,t){var n,r,o,a,s,u,l,c=E[e+" "];if(c)return t?0:c.slice(0);s=e,u=[],l=i.preFilter;while(s){(!n||(r=$.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),u.push(o=[])),n=!1,(r=I.exec(s))&&(n=r.shift(),o.push({value:n,type:r[0].replace(W," ")}),s=s.slice(n.length));for(a in i.filter)!(r=U[a].exec(s))||l[a]&&!(r=l[a](r))||(n=r.shift(),o.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?st.error(e):E(e,u).slice(0)}function dt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function ht(e,t,n){var i=t.dir,o=n&&"parentNode"===i,a=C++;return t.first?function(t,n,r){while(t=t[i])if(1===t.nodeType||o)return e(t,n,r)}:function(t,n,s){var u,l,c,p=N+" "+a;if(s){while(t=t[i])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[i])if(1===t.nodeType||o)if(c=t[x]||(t[x]={}),(l=c[i])&&l[0]===p){if((u=l[1])===!0||u===r)return u===!0}else if(l=c[i]=[p],l[1]=e(t,n,s)||r,l[1]===!0)return!0}}function gt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function mt(e,t,n,r,i){var o,a=[],s=0,u=e.length,l=null!=t;for(;u>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),l&&t.push(s));return a}function yt(e,t,n,r,i,o){return r&&!r[x]&&(r=yt(r)),i&&!i[x]&&(i=yt(i,o)),ot(function(o,a,s,u){var l,c,p,f=[],d=[],h=a.length,g=o||xt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:mt(g,f,e,s,u),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,u),r){l=mt(y,d),r(l,[],s,u),c=l.length;while(c--)(p=l[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){l=[],c=y.length;while(c--)(p=y[c])&&l.push(m[c]=p);i(null,y=[],l,u)}c=y.length;while(c--)(p=y[c])&&(l=i?M.call(o,p):f[c])>-1&&(o[l]=!(a[l]=p))}}else y=mt(y===a?y.splice(h,y.length):y),i?i(null,a,y,u):H.apply(a,y)})}function vt(e){var t,n,r,o=e.length,a=i.relative[e[0].type],s=a||i.relative[" "],u=a?1:0,c=ht(function(e){return e===t},s,!0),p=ht(function(e){return M.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;o>u;u++)if(n=i.relative[e[u].type])f=[ht(gt(f),n)];else{if(n=i.filter[e[u].type].apply(null,e[u].matches),n[x]){for(r=++u;o>r;r++)if(i.relative[e[r].type])break;return yt(u>1&>(f),u>1&&dt(e.slice(0,u-1)).replace(W,"$1"),n,r>u&&vt(e.slice(u,r)),o>r&&vt(e=e.slice(r)),o>r&&dt(e))}f.push(n)}return gt(f)}function bt(e,t){var n=0,o=t.length>0,a=e.length>0,s=function(s,u,c,f,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,T=l,C=s||a&&i.find.TAG("*",d&&u.parentNode||u),k=N+=null==T?1:Math.random()||.1;for(w&&(l=u!==p&&u,r=n);null!=(h=C[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,u,c)){f.push(h);break}w&&(N=k,r=++n)}o&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,o&&b!==v){g=0;while(m=t[g++])m(x,y,u,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=L.call(f));y=mt(y)}H.apply(f,y),w&&!s&&y.length>0&&v+t.length>1&&st.uniqueSort(f)}return w&&(N=k,l=T),x};return o?ot(s):s}s=st.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=ft(e)),n=t.length;while(n--)o=vt(t[n]),o[x]?r.push(o):i.push(o);o=S(e,bt(i,r))}return o};function xt(e,t,n){var r=0,i=t.length;for(;i>r;r++)st(e,t[r],n);return n}function wt(e,t,n,r){var o,a,u,l,c,p=ft(e);if(!r&&1===p.length){if(a=p[0]=p[0].slice(0),a.length>2&&"ID"===(u=a[0]).type&&9===t.nodeType&&!d&&i.relative[a[1].type]){if(t=i.find.ID(u.matches[0].replace(et,tt),t)[0],!t)return n;e=e.slice(a.shift().value.length)}o=U.needsContext.test(e)?0:a.length;while(o--){if(u=a[o],i.relative[l=u.type])break;if((c=i.find[l])&&(r=c(u.matches[0].replace(et,tt),V.test(a[0].type)&&t.parentNode||t))){if(a.splice(o,1),e=r.length&&dt(a),!e)return H.apply(n,q.call(r,0)),n;break}}}return s(e,p)(r,t,d,n,V.test(e)),n}i.pseudos.nth=i.pseudos.eq;function Tt(){}i.filters=Tt.prototype=i.pseudos,i.setFilters=new Tt,c(),st.attr=b.attr,b.find=st,b.expr=st.selectors,b.expr[":"]=b.expr.pseudos,b.unique=st.uniqueSort,b.text=st.getText,b.isXMLDoc=st.isXML,b.contains=st.contains}(e);var at=/Until$/,st=/^(?:parents|prev(?:Until|All))/,ut=/^.[^:#\[\.,]*$/,lt=b.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};b.fn.extend({find:function(e){var t,n,r,i=this.length;if("string"!=typeof e)return r=this,this.pushStack(b(e).filter(function(){for(t=0;i>t;t++)if(b.contains(r[t],this))return!0}));for(n=[],t=0;i>t;t++)b.find(e,this[t],n);return n=this.pushStack(i>1?b.unique(n):n),n.selector=(this.selector?this.selector+" ":"")+e,n},has:function(e){var t,n=b(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(b.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e,!1))},filter:function(e){return this.pushStack(ft(this,e,!0))},is:function(e){return!!e&&("string"==typeof e?lt.test(e)?b(e,this.context).index(this[0])>=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,o=[],a=lt.test(e)||"string"!=typeof e?b(e,t||this.context):0;for(;i>r;r++){n=this[r];while(n&&n.ownerDocument&&n!==t&&11!==n.nodeType){if(a?a.index(n)>-1:b.find.matchesSelector(n,e)){o.push(n);break}n=n.parentNode}}return this.pushStack(o.length>1?b.unique(o):o)},index:function(e){return e?"string"==typeof e?b.inArray(this[0],b(e)):b.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?b(e,t):b.makeArray(e&&e.nodeType?[e]:e),r=b.merge(this.get(),n);return this.pushStack(b.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),b.fn.andSelf=b.fn.addBack;function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}b.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(e,t,n){return b.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(e,t,n){return b.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return b.dir(e,"previousSibling",n)},siblings:function(e){return b.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.merge([],e.childNodes)}},function(e,t){b.fn[e]=function(n,r){var i=b.map(this,t,n);return at.test(e)||(r=n),r&&"string"==typeof r&&(i=b.filter(r,i)),i=this.length>1&&!ct[e]?b.unique(i):i,this.length>1&&st.test(e)&&(i=i.reverse()),this.pushStack(i)}}),b.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),1===t.length?b.find.matchesSelector(t[0],e)?[t[0]]:[]:b.find.matches(e,t)},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!b(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(t=t||0,b.isFunction(t))return b.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return b.grep(e,function(e){return e===t===n});if("string"==typeof t){var r=b.grep(e,function(e){return 1===e.nodeType});if(ut.test(t))return b.filter(t,r,!n);t=b.filter(t,r)}return b.grep(e,function(e){return b.inArray(e,t)>=0===n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/<tbody/i,wt=/<|&#?\w+;/,Tt=/<(?:script|style|link)/i,Nt=/^(?:checkbox|radio)$/i,Ct=/checked\s*(?:[^=]|=\s*.checked.)/i,kt=/^$|\/(?:java|ecma)script/i,Et=/^true\/(.*)/,St=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,At={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:b.support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},jt=dt(o),Dt=jt.appendChild(o.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,b.fn.extend({text:function(e){return b.access(this,function(e){return e===t?b.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(b.isFunction(e))return this.each(function(t){b(this).wrapAll(e.call(this,t))});if(this[0]){var t=b(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return b.isFunction(e)?this.each(function(t){b(this).wrapInner(e.call(this,t))}):this.each(function(){var t=b(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=b.isFunction(e);return this.each(function(n){b(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){b.nodeName(this,"body")||b(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.insertBefore(e,this.firstChild)})},before:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=0;for(;null!=(n=this[r]);r++)(!e||b.filter(e,[n]).length>0)&&(t||1!==n.nodeType||b.cleanData(Ot(n)),n.parentNode&&(t&&b.contains(n.ownerDocument,n)&&Mt(Ot(n,"script")),n.parentNode.removeChild(n)));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&b.cleanData(Ot(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&b.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return b.clone(this,e,t)})},html:function(e){return b.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!b.support.htmlSerialize&&mt.test(e)||!b.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1></$2>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(b.cleanData(Ot(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(e){var t=b.isFunction(e);return t||"string"==typeof e||(e=b(e).not(this).detach()),this.domManip([e],!0,function(e){var t=this.nextSibling,n=this.parentNode;n&&(b(this).remove(),n.insertBefore(e,t))})},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){e=f.apply([],e);var i,o,a,s,u,l,c=0,p=this.length,d=this,h=p-1,g=e[0],m=b.isFunction(g);if(m||!(1>=p||"string"!=typeof g||b.support.checkClone)&&Ct.test(g))return this.each(function(i){var o=d.eq(i);m&&(e[0]=g.call(this,i,n?o.html():t)),o.domManip(e,n,r)});if(p&&(l=b.buildFragment(e,this[0].ownerDocument,!1,this),i=l.firstChild,1===l.childNodes.length&&(l=i),i)){for(n=n&&b.nodeName(i,"tr"),s=b.map(Ot(l,"script"),Ht),a=s.length;p>c;c++)o=l,c!==h&&(o=b.clone(o,!0,!0),a&&b.merge(s,Ot(o,"script"))),r.call(n&&b.nodeName(this[c],"table")?Lt(this[c],"tbody"):this[c],o,c);if(a)for(u=s[s.length-1].ownerDocument,b.map(s,qt),c=0;a>c;c++)o=s[c],kt.test(o.type||"")&&!b._data(o,"globalEval")&&b.contains(u,o)&&(o.src?b.ajax({url:o.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):b.globalEval((o.text||o.textContent||o.innerHTML||"").replace(St,"")));l=i=null}return this}});function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function Ht(e){var t=e.getAttributeNode("type");return e.type=(t&&t.specified)+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function Mt(e,t){var n,r=0;for(;null!=(n=e[r]);r++)b._data(n,"globalEval",!t||b._data(t[r],"globalEval"))}function _t(e,t){if(1===t.nodeType&&b.hasData(e)){var n,r,i,o=b._data(e),a=b._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)b.event.add(t,n,s[n][r])}a.data&&(a.data=b.extend({},a.data))}}function Ft(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!b.support.noCloneEvent&&t[b.expando]){i=b._data(t);for(r in i.events)b.removeEvent(t,r,i.handle);t.removeAttribute(b.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),b.support.html5Clone&&e.innerHTML&&!b.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Nt.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}b.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){b.fn[e]=function(e){var n,r=0,i=[],o=b(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),b(o[r])[t](n),d.apply(i,n.get());return this.pushStack(i)}});function Ot(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||b.nodeName(o,n)?s.push(o):b.merge(s,Ot(o,n));return n===t||n&&b.nodeName(e,n)?b.merge([e],s):s}function Bt(e){Nt.test(e.type)&&(e.defaultChecked=e.checked)}b.extend({clone:function(e,t,n){var r,i,o,a,s,u=b.contains(e.ownerDocument,e);if(b.support.html5Clone||b.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(b.support.noCloneEvent&&b.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||b.isXMLDoc(e)))for(r=Ot(o),s=Ot(e),a=0;null!=(i=s[a]);++a)r[a]&&Ft(i,r[a]);if(t)if(n)for(s=s||Ot(e),r=r||Ot(o),a=0;null!=(i=s[a]);a++)_t(i,r[a]);else _t(e,o);return r=Ot(o,"script"),r.length>0&&Mt(r,!u&&Ot(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,u,l,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===b.type(o))b.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),u=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[u]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1></$2>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!b.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!b.support.tbody){o="table"!==u||xt.test(o)?"<table>"!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)b.nodeName(l=o.childNodes[i],"tbody")&&!l.childNodes.length&&o.removeChild(l) +}b.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),b.support.appendChecked||b.grep(Ot(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===b.inArray(o,r))&&(a=b.contains(o.ownerDocument,o),s=Ot(f.appendChild(o),"script"),a&&Mt(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,u=b.expando,l=b.cache,p=b.support.deleteExpando,f=b.event.special;for(;null!=(n=e[s]);s++)if((t||b.acceptData(n))&&(o=n[u],a=o&&l[o])){if(a.events)for(r in a.events)f[r]?b.event.remove(n,r):b.removeEvent(n,r,a.handle);l[o]&&(delete l[o],p?delete n[u]:typeof n.removeAttribute!==i?n.removeAttribute(u):n[u]=null,c.push(o))}}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+x+")(.*)$","i"),Yt=RegExp("^("+x+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+x+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===b.css(e,"display")||!b.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=b._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=b._data(r,"olddisplay",un(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&b._data(r,"olddisplay",i?n:b.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}b.fn.extend({css:function(e,n){return b.access(this,function(e,n,r){var i,o,a={},s=0;if(b.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=b.css(e,n[s],!1,o);return a}return r!==t?b.style(e,n,r):b.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){var t="boolean"==typeof e;return this.each(function(){(t?e:nn(this))?b(this).show():b(this).hide()})}}),b.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":b.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,u=b.camelCase(n),l=e.style;if(n=b.cssProps[u]||(b.cssProps[u]=tn(l,u)),s=b.cssHooks[n]||b.cssHooks[u],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:l[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(b.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||b.cssNumber[u]||(r+="px"),b.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(l[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{l[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,u=b.camelCase(n);return n=b.cssProps[u]||(b.cssProps[u]=tn(e.style,u)),s=b.cssHooks[n]||b.cssHooks[u],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||b.isNumeric(o)?o||0:a):a},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s.getPropertyValue(n)||s[n]:t,l=e.style;return s&&(""!==u||b.contains(e.ownerDocument,e)||(u=b.style(e,n)),Yt.test(u)&&Ut.test(n)&&(i=l.width,o=l.minWidth,a=l.maxWidth,l.minWidth=l.maxWidth=l.width=u,u=s.width,l.width=i,l.minWidth=o,l.maxWidth=a)),u}):o.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s[n]:t,l=e.style;return null==u&&l&&l[n]&&(u=l[n]),Yt.test(u)&&!zt.test(n)&&(i=l.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),l.left="fontSize"===n?"1em":u,u=l.pixelLeft+"px",l.left=i,a&&(o.left=a)),""===u?"auto":u});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=b.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=b.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=b.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=b.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=b.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(b.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function un(e){var t=o,n=Gt[e];return n||(n=ln(e,t),"none"!==n&&n||(Pt=(Pt||b("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(Pt[0].contentWindow||Pt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=ln(e,t),Pt.detach()),Gt[e]=n),n}function ln(e,t){var n=b(t.createElement(e)).appendTo(t.body),r=b.css(n[0],"display");return n.remove(),r}b.each(["height","width"],function(e,n){b.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&Xt.test(b.css(e,"display"))?b.swap(e,Qt,function(){return sn(e,n,i)}):sn(e,n,i):t},set:function(e,t,r){var i=r&&Rt(e);return on(e,t,r?an(e,n,r,b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,i),i):0)}}}),b.support.opacity||(b.cssHooks.opacity={get:function(e,t){return It.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=b.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===b.trim(o.replace($t,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=$t.test(o)?o.replace($t,i):o+" "+i)}}),b(function(){b.support.reliableMarginRight||(b.cssHooks.marginRight={get:function(e,n){return n?b.swap(e,{display:"inline-block"},Wt,[e,"marginRight"]):t}}),!b.support.pixelPosition&&b.fn.position&&b.each(["top","left"],function(e,n){b.cssHooks[n]={get:function(e,r){return r?(r=Wt(e,n),Yt.test(r)?b(e).position()[n]+"px":r):t}}})}),b.expr&&b.expr.filters&&(b.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight||!b.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||b.css(e,"display"))},b.expr.filters.visible=function(e){return!b.expr.filters.hidden(e)}),b.each({margin:"",padding:"",border:"Width"},function(e,t){b.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+Zt[r]+t]=o[r]||o[r-2]||o[0];return i}},Ut.test(e)||(b.cssHooks[e+t].set=on)});var cn=/%20/g,pn=/\[\]$/,fn=/\r?\n/g,dn=/^(?:submit|button|image|reset|file)$/i,hn=/^(?:input|select|textarea|keygen)/i;b.fn.extend({serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=b.prop(this,"elements");return e?b.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!b(this).is(":disabled")&&hn.test(this.nodeName)&&!dn.test(e)&&(this.checked||!Nt.test(e))}).map(function(e,t){var n=b(this).val();return null==n?null:b.isArray(n)?b.map(n,function(e){return{name:t.name,value:e.replace(fn,"\r\n")}}):{name:t.name,value:n.replace(fn,"\r\n")}}).get()}}),b.param=function(e,n){var r,i=[],o=function(e,t){t=b.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=b.ajaxSettings&&b.ajaxSettings.traditional),b.isArray(e)||e.jquery&&!b.isPlainObject(e))b.each(e,function(){o(this.name,this.value)});else for(r in e)gn(r,e[r],n,o);return i.join("&").replace(cn,"+")};function gn(e,t,n,r){var i;if(b.isArray(t))b.each(t,function(t,i){n||pn.test(e)?r(e,i):gn(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==b.type(t))r(e,t);else for(i in t)gn(e+"["+i+"]",t[i],n,r)}b.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){b.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),b.fn.hover=function(e,t){return this.mouseenter(e).mouseleave(t||e)};var mn,yn,vn=b.now(),bn=/\?/,xn=/#.*$/,wn=/([?&])_=[^&]*/,Tn=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Nn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Cn=/^(?:GET|HEAD)$/,kn=/^\/\//,En=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Sn=b.fn.load,An={},jn={},Dn="*/".concat("*");try{yn=a.href}catch(Ln){yn=o.createElement("a"),yn.href="",yn=yn.href}mn=En.exec(yn.toLowerCase())||[];function Hn(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(w)||[];if(b.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qn(e,n,r,i){var o={},a=e===jn;function s(u){var l;return o[u]=!0,b.each(e[u]||[],function(e,u){var c=u(n,r,i);return"string"!=typeof c||a||o[c]?a?!(l=c):t:(n.dataTypes.unshift(c),s(c),!1)}),l}return s(n.dataTypes[0])||!o["*"]&&s("*")}function Mn(e,n){var r,i,o=b.ajaxSettings.flatOptions||{};for(i in n)n[i]!==t&&((o[i]?e:r||(r={}))[i]=n[i]);return r&&b.extend(!0,e,r),e}b.fn.load=function(e,n,r){if("string"!=typeof e&&Sn)return Sn.apply(this,arguments);var i,o,a,s=this,u=e.indexOf(" ");return u>=0&&(i=e.slice(u,e.length),e=e.slice(0,u)),b.isFunction(n)?(r=n,n=t):n&&"object"==typeof n&&(a="POST"),s.length>0&&b.ajax({url:e,type:a,dataType:"html",data:n}).done(function(e){o=arguments,s.html(i?b("<div>").append(b.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},b.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){b.fn[t]=function(e){return this.on(t,e)}}),b.each(["get","post"],function(e,n){b[n]=function(e,r,i,o){return b.isFunction(r)&&(o=o||i,i=r,r=t),b.ajax({url:e,type:n,dataType:o,data:r,success:i})}}),b.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:"GET",isLocal:Nn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":e.String,"text html":!0,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Mn(Mn(e,b.ajaxSettings),t):Mn(b.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){"object"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,u,l,c,p=b.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?b(f):b.event,h=b.Deferred(),g=b.Callbacks("once memory"),m=p.statusCode||{},y={},v={},x=0,T="canceled",N={readyState:0,getResponseHeader:function(e){var t;if(2===x){if(!c){c={};while(t=Tn.exec(a))c[t[1].toLowerCase()]=t[2]}t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===x?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return x||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return x||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>x)for(t in e)m[t]=[m[t],e[t]];else N.always(e[N.status]);return this},abort:function(e){var t=e||T;return l&&l.abort(t),k(0,t),this}};if(h.promise(N).complete=g.add,N.success=N.done,N.error=N.fail,p.url=((e||p.url||yn)+"").replace(xn,"").replace(kn,mn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=b.trim(p.dataType||"*").toLowerCase().match(w)||[""],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||("http:"===r[1]?80:443))==(mn[3]||("http:"===mn[1]?80:443)))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=b.param(p.data,p.traditional)),qn(An,p,n,N),2===x)return N;u=p.global,u&&0===b.active++&&b.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Cn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,"$1_="+vn++):o+(bn.test(o)?"&":"?")+"_="+vn++)),p.ifModified&&(b.lastModified[o]&&N.setRequestHeader("If-Modified-Since",b.lastModified[o]),b.etag[o]&&N.setRequestHeader("If-None-Match",b.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&N.setRequestHeader("Content-Type",p.contentType),N.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dn+"; q=0.01":""):p.accepts["*"]);for(i in p.headers)N.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,N,p)===!1||2===x))return N.abort();T="abort";for(i in{success:1,error:1,complete:1})N[i](p[i]);if(l=qn(jn,p,n,N)){N.readyState=1,u&&d.trigger("ajaxSend",[N,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){N.abort("timeout")},p.timeout));try{x=1,l.send(y,k)}catch(C){if(!(2>x))throw C;k(-1,C)}}else k(-1,"No Transport");function k(e,n,r,i){var c,y,v,w,T,C=n;2!==x&&(x=2,s&&clearTimeout(s),l=t,a=i||"",N.readyState=e>0?4:0,r&&(w=_n(p,N,r)),e>=200&&300>e||304===e?(p.ifModified&&(T=N.getResponseHeader("Last-Modified"),T&&(b.lastModified[o]=T),T=N.getResponseHeader("etag"),T&&(b.etag[o]=T)),204===e?(c=!0,C="nocontent"):304===e?(c=!0,C="notmodified"):(c=Fn(p,w),C=c.state,y=c.data,v=c.error,c=!v)):(v=C,(e||!C)&&(C="error",0>e&&(e=0))),N.status=e,N.statusText=(n||C)+"",c?h.resolveWith(f,[y,C,N]):h.rejectWith(f,[N,C,v]),N.statusCode(m),m=t,u&&d.trigger(c?"ajaxSuccess":"ajaxError",[N,p,c?y:v]),g.fireWith(f,[N,C]),u&&(d.trigger("ajaxComplete",[N,p]),--b.active||b.event.trigger("ajaxStop")))}return N},getScript:function(e,n){return b.get(e,t,n,"script")},getJSON:function(e,t,n){return b.get(e,t,n,"json")}});function _n(e,n,r){var i,o,a,s,u=e.contents,l=e.dataTypes,c=e.responseFields;for(s in c)s in r&&(n[c[s]]=r[s]);while("*"===l[0])l.shift(),o===t&&(o=e.mimeType||n.getResponseHeader("Content-Type"));if(o)for(s in u)if(u[s]&&u[s].test(o)){l.unshift(s);break}if(l[0]in r)a=l[0];else{for(s in r){if(!l[0]||e.converters[s+" "+l[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==l[0]&&l.unshift(a),r[a]):t}function Fn(e,t){var n,r,i,o,a={},s=0,u=e.dataTypes.slice(),l=u[0];if(e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u[1])for(i in e.converters)a[i.toLowerCase()]=e.converters[i];for(;r=u[++s];)if("*"!==r){if("*"!==l&&l!==r){if(i=a[l+" "+r]||a["* "+r],!i)for(n in a)if(o=n.split(" "),o[1]===r&&(i=a[l+" "+o[0]]||a["* "+o[0]])){i===!0?i=a[n]:a[n]!==!0&&(r=o[0],u.splice(s--,0,r));break}if(i!==!0)if(i&&e["throws"])t=i(t);else try{t=i(t)}catch(c){return{state:"parsererror",error:i?c:"No conversion from "+l+" to "+r}}}l=r}return{state:"success",data:t}}b.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return b.globalEval(e),e}}}),b.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),b.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=o.head||b("head")[0]||o.documentElement;return{send:function(t,i){n=o.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var On=[],Bn=/(=)\?(?=&|$)|\?\?/;b.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=On.pop()||b.expando+"_"+vn++;return this[e]=!0,e}}),b.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,u=n.jsonp!==!1&&(Bn.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Bn.test(n.data)&&"data");return u||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=b.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,u?n[u]=n[u].replace(Bn,"$1"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||b.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,On.push(o)),s&&b.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}b.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=b.ajaxSettings.xhr(),b.support.cors=!!Rn&&"withCredentials"in Rn,Rn=b.support.ajax=!!Rn,Rn&&b.ajaxTransport(function(n){if(!n.crossDomain||b.support.cors){var r;return{send:function(i,o){var a,s,u=n.xhr();if(n.username?u.open(n.type,n.url,n.async,n.username,n.password):u.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)u[s]=n.xhrFields[s];n.mimeType&&u.overrideMimeType&&u.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)u.setRequestHeader(s,i[s])}catch(l){}u.send(n.hasContent&&n.data||null),r=function(e,i){var s,l,c,p;try{if(r&&(i||4===u.readyState))if(r=t,a&&(u.onreadystatechange=b.noop,$n&&delete Pn[a]),i)4!==u.readyState&&u.abort();else{p={},s=u.status,l=u.getAllResponseHeaders(),"string"==typeof u.responseText&&(p.text=u.responseText);try{c=u.statusText}catch(f){c=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,l)},n.async?4===u.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},b(e).unload($n)),Pn[a]=r),u.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp("^(?:([+-])=|)("+x+")([a-z%]*)$","i"),Jn=/queueHooks$/,Gn=[nr],Qn={"*":[function(e,t){var n,r,i=this.createTween(e,t),o=Yn.exec(t),a=i.cur(),s=+a||0,u=1,l=20;if(o){if(n=+o[2],r=o[3]||(b.cssNumber[e]?"":"px"),"px"!==r&&s){s=b.css(i.elem,e,!0)||n||1;do u=u||".5",s/=u,b.style(i.elem,e,s+r);while(u!==(u=i.cur()/a)&&1!==u&&--l)}i.unit=r,i.start=s,i.end=o[1]?s+(o[1]+1)*n:n}return i}]};function Kn(){return setTimeout(function(){Xn=t}),Xn=b.now()}function Zn(e,t){b.each(t,function(t,n){var r=(Qn[t]||[]).concat(Qn["*"]),i=0,o=r.length;for(;o>i;i++)if(r[i].call(e,t,n))return})}function er(e,t,n){var r,i,o=0,a=Gn.length,s=b.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;var t=Xn||Kn(),n=Math.max(0,l.startTime+l.duration-t),r=n/l.duration||0,o=1-r,a=0,u=l.tweens.length;for(;u>a;a++)l.tweens[a].run(o);return s.notifyWith(e,[l,o,n]),1>o&&u?n:(s.resolveWith(e,[l]),!1)},l=s.promise({elem:e,props:b.extend({},t),opts:b.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=b.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)l.tweens[n].run(1);return t?s.resolveWith(e,[l,t]):s.rejectWith(e,[l,t]),this}}),c=l.props;for(tr(c,l.opts.specialEasing);a>o;o++)if(r=Gn[o].call(l,e,c,l.opts))return r;return Zn(l,c),b.isFunction(l.opts.start)&&l.opts.start.call(e,l),b.fx.timer(b.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always)}function tr(e,t){var n,r,i,o,a;for(i in e)if(r=b.camelCase(i),o=t[r],n=e[i],b.isArray(n)&&(o=n[1],n=e[i]=n[0]),i!==r&&(e[r]=n,delete e[i]),a=b.cssHooks[r],a&&"expand"in a){n=a.expand(n),delete e[r];for(i in n)i in e||(e[i]=n[i],t[i]=o)}else t[r]=o}b.Animation=b.extend(er,{tweener:function(e,t){b.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}});function nr(e,t,n){var r,i,o,a,s,u,l,c,p,f=this,d=e.style,h={},g=[],m=e.nodeType&&nn(e);n.queue||(c=b._queueHooks(e,"fx"),null==c.unqueued&&(c.unqueued=0,p=c.empty.fire,c.empty.fire=function(){c.unqueued||p()}),c.unqueued++,f.always(function(){f.always(function(){c.unqueued--,b.queue(e,"fx").length||c.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[d.overflow,d.overflowX,d.overflowY],"inline"===b.css(e,"display")&&"none"===b.css(e,"float")&&(b.support.inlineBlockNeedsLayout&&"inline"!==un(e.nodeName)?d.zoom=1:d.display="inline-block")),n.overflow&&(d.overflow="hidden",b.support.shrinkWrapBlocks||f.always(function(){d.overflow=n.overflow[0],d.overflowX=n.overflow[1],d.overflowY=n.overflow[2]}));for(i in t)if(a=t[i],Vn.exec(a)){if(delete t[i],u=u||"toggle"===a,a===(m?"hide":"show"))continue;g.push(i)}if(o=g.length){s=b._data(e,"fxshow")||b._data(e,"fxshow",{}),"hidden"in s&&(m=s.hidden),u&&(s.hidden=!m),m?b(e).show():f.done(function(){b(e).hide()}),f.done(function(){var t;b._removeData(e,"fxshow");for(t in h)b.style(e,t,h[t])});for(i=0;o>i;i++)r=g[i],l=f.createTween(r,m?s[r]:0),h[r]=s[r]||b.style(e,r),r in s||(s[r]=l.start,m&&(l.end=l.start,l.start="width"===r||"height"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}b.Tween=rr,rr.prototype={constructor:rr,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(b.cssNumber[n]?"":"px")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?b.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=b.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){b.fx.step[e.prop]?b.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[b.cssProps[e.prop]]||b.cssHooks[e.prop])?b.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},b.each(["toggle","show","hide"],function(e,t){var n=b.fn[t];b.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),b.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=b.isEmptyObject(e),o=b.speed(t,n,r),a=function(){var t=er(this,b.extend({},e),o);a.finish=function(){t.stop(!0)},(i||b._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=b.timers,a=b._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&b.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=b._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=b.timers,a=r?r.length:0;for(n.finish=!0,b.queue(this,e,[]),i&&i.cur&&i.cur.finish&&i.cur.finish.call(this),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}b.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){b.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),b.speed=function(e,t,n){var r=e&&"object"==typeof e?b.extend({},e):{complete:n||!n&&t||b.isFunction(e)&&e,duration:e,easing:n&&t||t&&!b.isFunction(t)&&t};return r.duration=b.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in b.fx.speeds?b.fx.speeds[r.duration]:b.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){b.isFunction(r.old)&&r.old.call(this),r.queue&&b.dequeue(this,r.queue)},r},b.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},b.timers=[],b.fx=rr.prototype.init,b.fx.tick=function(){var e,n=b.timers,r=0;for(Xn=b.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||b.fx.stop(),Xn=t},b.fx.timer=function(e){e()&&b.timers.push(e)&&b.fx.start()},b.fx.interval=13,b.fx.start=function(){Un||(Un=setInterval(b.fx.tick,b.fx.interval))},b.fx.stop=function(){clearInterval(Un),Un=null},b.fx.speeds={slow:600,fast:200,_default:400},b.fx.step={},b.expr&&b.expr.filters&&(b.expr.filters.animated=function(e){return b.grep(b.timers,function(t){return e===t.elem}).length}),b.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){b.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,b.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},b.offset={setOffset:function(e,t,n){var r=b.css(e,"position");"static"===r&&(e.style.position="relative");var i=b(e),o=i.offset(),a=b.css(e,"top"),s=b.css(e,"left"),u=("absolute"===r||"fixed"===r)&&b.inArray("auto",[a,s])>-1,l={},c={},p,f;u?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),b.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(l.top=t.top-o.top+p),null!=t.left&&(l.left=t.left-o.left+f),"using"in t?t.using.call(e,l):i.css(l)}},b.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===b.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),b.nodeName(e[0],"html")||(n=e.offset()),n.top+=b.css(e[0],"borderTopWidth",!0),n.left+=b.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-b.css(r,"marginTop",!0),left:t.left-n.left-b.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||o.documentElement;while(e&&!b.nodeName(e,"html")&&"static"===b.css(e,"position"))e=e.offsetParent;return e||o.documentElement})}}),b.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);b.fn[e]=function(i){return b.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?b(a).scrollLeft():o,r?o:b(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return b.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}b.each({Height:"height",Width:"width"},function(e,n){b.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){b.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return b.access(this,function(n,r,i){var o;return b.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?b.css(n,r,s):b.style(n,r,i,s)},n,a?i:t,a,null)}})}),e.jQuery=e.$=b,"function"==typeof define&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return b})})(window); \ No newline at end of file diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/jquery.ui.widget.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/jquery.ui.widget.js new file mode 100644 index 0000000000000000000000000000000000000000..2d370893ad3a92725bb564652f5d5f4730e4c254 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/jquery.ui.widget.js @@ -0,0 +1,530 @@ +/* + * jQuery UI Widget 1.10.3+amd + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2013 jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/jQuery.widget/ + */ + +(function (factory) { + if (typeof define === "function" && define.amd) { + // Register as an anonymous AMD module: + define(["jquery"], factory); + } else { + // Browser globals: + factory(jQuery); + } +}(function( $, undefined ) { + +var uuid = 0, + slice = Array.prototype.slice, + _cleanData = $.cleanData; +$.cleanData = function( elems ) { + for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) { + try { + $( elem ).triggerHandler( "remove" ); + // http://bugs.jquery.com/ticket/8235 + } catch( e ) {} + } + _cleanData( elems ); +}; + +$.widget = function( name, base, prototype ) { + var fullName, existingConstructor, constructor, basePrototype, + // proxiedPrototype allows the provided prototype to remain unmodified + // so that it can be used as a mixin for multiple widgets (#8876) + proxiedPrototype = {}, + namespace = name.split( "." )[ 0 ]; + + name = name.split( "." )[ 1 ]; + fullName = namespace + "-" + name; + + if ( !prototype ) { + prototype = base; + base = $.Widget; + } + + // create selector for plugin + $.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) { + return !!$.data( elem, fullName ); + }; + + $[ namespace ] = $[ namespace ] || {}; + existingConstructor = $[ namespace ][ name ]; + constructor = $[ namespace ][ name ] = function( options, element ) { + // allow instantiation without "new" keyword + if ( !this._createWidget ) { + return new constructor( options, element ); + } + + // allow instantiation without initializing for simple inheritance + // must use "new" keyword (the code above always passes args) + if ( arguments.length ) { + this._createWidget( options, element ); + } + }; + // extend with the existing constructor to carry over any static properties + $.extend( constructor, existingConstructor, { + version: prototype.version, + // copy the object used to create the prototype in case we need to + // redefine the widget later + _proto: $.extend( {}, prototype ), + // track widgets that inherit from this widget in case this widget is + // redefined after a widget inherits from it + _childConstructors: [] + }); + + basePrototype = new base(); + // we need to make the options hash a property directly on the new instance + // otherwise we'll modify the options hash on the prototype that we're + // inheriting from + basePrototype.options = $.widget.extend( {}, basePrototype.options ); + $.each( prototype, function( prop, value ) { + if ( !$.isFunction( value ) ) { + proxiedPrototype[ prop ] = value; + return; + } + proxiedPrototype[ prop ] = (function() { + var _super = function() { + return base.prototype[ prop ].apply( this, arguments ); + }, + _superApply = function( args ) { + return base.prototype[ prop ].apply( this, args ); + }; + return function() { + var __super = this._super, + __superApply = this._superApply, + returnValue; + + this._super = _super; + this._superApply = _superApply; + + returnValue = value.apply( this, arguments ); + + this._super = __super; + this._superApply = __superApply; + + return returnValue; + }; + })(); + }); + constructor.prototype = $.widget.extend( basePrototype, { + // TODO: remove support for widgetEventPrefix + // always use the name + a colon as the prefix, e.g., draggable:start + // don't prefix for widgets that aren't DOM-based + widgetEventPrefix: existingConstructor ? basePrototype.widgetEventPrefix : name + }, proxiedPrototype, { + constructor: constructor, + namespace: namespace, + widgetName: name, + widgetFullName: fullName + }); + + // If this widget is being redefined then we need to find all widgets that + // are inheriting from it and redefine all of them so that they inherit from + // the new version of this widget. We're essentially trying to replace one + // level in the prototype chain. + if ( existingConstructor ) { + $.each( existingConstructor._childConstructors, function( i, child ) { + var childPrototype = child.prototype; + + // redefine the child widget using the same prototype that was + // originally used, but inherit from the new version of the base + $.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto ); + }); + // remove the list of existing child constructors from the old constructor + // so the old child constructors can be garbage collected + delete existingConstructor._childConstructors; + } else { + base._childConstructors.push( constructor ); + } + + $.widget.bridge( name, constructor ); +}; + +$.widget.extend = function( target ) { + var input = slice.call( arguments, 1 ), + inputIndex = 0, + inputLength = input.length, + key, + value; + for ( ; inputIndex < inputLength; inputIndex++ ) { + for ( key in input[ inputIndex ] ) { + value = input[ inputIndex ][ key ]; + if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) { + // Clone objects + if ( $.isPlainObject( value ) ) { + target[ key ] = $.isPlainObject( target[ key ] ) ? + $.widget.extend( {}, target[ key ], value ) : + // Don't extend strings, arrays, etc. with objects + $.widget.extend( {}, value ); + // Copy everything else by reference + } else { + target[ key ] = value; + } + } + } + } + return target; +}; + +$.widget.bridge = function( name, object ) { + var fullName = object.prototype.widgetFullName || name; + $.fn[ name ] = function( options ) { + var isMethodCall = typeof options === "string", + args = slice.call( arguments, 1 ), + returnValue = this; + + // allow multiple hashes to be passed on init + options = !isMethodCall && args.length ? + $.widget.extend.apply( null, [ options ].concat(args) ) : + options; + + if ( isMethodCall ) { + this.each(function() { + var methodValue, + instance = $.data( this, fullName ); + if ( !instance ) { + return $.error( "cannot call methods on " + name + " prior to initialization; " + + "attempted to call method '" + options + "'" ); + } + if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) { + return $.error( "no such method '" + options + "' for " + name + " widget instance" ); + } + methodValue = instance[ options ].apply( instance, args ); + if ( methodValue !== instance && methodValue !== undefined ) { + returnValue = methodValue && methodValue.jquery ? + returnValue.pushStack( methodValue.get() ) : + methodValue; + return false; + } + }); + } else { + this.each(function() { + var instance = $.data( this, fullName ); + if ( instance ) { + instance.option( options || {} )._init(); + } else { + $.data( this, fullName, new object( options, this ) ); + } + }); + } + + return returnValue; + }; +}; + +$.Widget = function( /* options, element */ ) {}; +$.Widget._childConstructors = []; + +$.Widget.prototype = { + widgetName: "widget", + widgetEventPrefix: "", + defaultElement: "<div>", + options: { + disabled: false, + + // callbacks + create: null + }, + _createWidget: function( options, element ) { + element = $( element || this.defaultElement || this )[ 0 ]; + this.element = $( element ); + this.uuid = uuid++; + this.eventNamespace = "." + this.widgetName + this.uuid; + this.options = $.widget.extend( {}, + this.options, + this._getCreateOptions(), + options ); + + this.bindings = $(); + this.hoverable = $(); + this.focusable = $(); + + if ( element !== this ) { + $.data( element, this.widgetFullName, this ); + this._on( true, this.element, { + remove: function( event ) { + if ( event.target === element ) { + this.destroy(); + } + } + }); + this.document = $( element.style ? + // element within the document + element.ownerDocument : + // element is window or document + element.document || element ); + this.window = $( this.document[0].defaultView || this.document[0].parentWindow ); + } + + this._create(); + this._trigger( "create", null, this._getCreateEventData() ); + this._init(); + }, + _getCreateOptions: $.noop, + _getCreateEventData: $.noop, + _create: $.noop, + _init: $.noop, + + destroy: function() { + this._destroy(); + // we can probably remove the unbind calls in 2.0 + // all event bindings should go through this._on() + this.element + .unbind( this.eventNamespace ) + // 1.9 BC for #7810 + // TODO remove dual storage + .removeData( this.widgetName ) + .removeData( this.widgetFullName ) + // support: jquery <1.6.3 + // http://bugs.jquery.com/ticket/9413 + .removeData( $.camelCase( this.widgetFullName ) ); + this.widget() + .unbind( this.eventNamespace ) + .removeAttr( "aria-disabled" ) + .removeClass( + this.widgetFullName + "-disabled " + + "ui-state-disabled" ); + + // clean up events and states + this.bindings.unbind( this.eventNamespace ); + this.hoverable.removeClass( "ui-state-hover" ); + this.focusable.removeClass( "ui-state-focus" ); + }, + _destroy: $.noop, + + widget: function() { + return this.element; + }, + + option: function( key, value ) { + var options = key, + parts, + curOption, + i; + + if ( arguments.length === 0 ) { + // don't return a reference to the internal hash + return $.widget.extend( {}, this.options ); + } + + if ( typeof key === "string" ) { + // handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } } + options = {}; + parts = key.split( "." ); + key = parts.shift(); + if ( parts.length ) { + curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] ); + for ( i = 0; i < parts.length - 1; i++ ) { + curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {}; + curOption = curOption[ parts[ i ] ]; + } + key = parts.pop(); + if ( value === undefined ) { + return curOption[ key ] === undefined ? null : curOption[ key ]; + } + curOption[ key ] = value; + } else { + if ( value === undefined ) { + return this.options[ key ] === undefined ? null : this.options[ key ]; + } + options[ key ] = value; + } + } + + this._setOptions( options ); + + return this; + }, + _setOptions: function( options ) { + var key; + + for ( key in options ) { + this._setOption( key, options[ key ] ); + } + + return this; + }, + _setOption: function( key, value ) { + this.options[ key ] = value; + + if ( key === "disabled" ) { + this.widget() + .toggleClass( this.widgetFullName + "-disabled ui-state-disabled", !!value ) + .attr( "aria-disabled", value ); + this.hoverable.removeClass( "ui-state-hover" ); + this.focusable.removeClass( "ui-state-focus" ); + } + + return this; + }, + + enable: function() { + return this._setOption( "disabled", false ); + }, + disable: function() { + return this._setOption( "disabled", true ); + }, + + _on: function( suppressDisabledCheck, element, handlers ) { + var delegateElement, + instance = this; + + // no suppressDisabledCheck flag, shuffle arguments + if ( typeof suppressDisabledCheck !== "boolean" ) { + handlers = element; + element = suppressDisabledCheck; + suppressDisabledCheck = false; + } + + // no element argument, shuffle and use this.element + if ( !handlers ) { + handlers = element; + element = this.element; + delegateElement = this.widget(); + } else { + // accept selectors, DOM elements + element = delegateElement = $( element ); + this.bindings = this.bindings.add( element ); + } + + $.each( handlers, function( event, handler ) { + function handlerProxy() { + // allow widgets to customize the disabled handling + // - disabled as an array instead of boolean + // - disabled class as method for disabling individual parts + if ( !suppressDisabledCheck && + ( instance.options.disabled === true || + $( this ).hasClass( "ui-state-disabled" ) ) ) { + return; + } + return ( typeof handler === "string" ? instance[ handler ] : handler ) + .apply( instance, arguments ); + } + + // copy the guid so direct unbinding works + if ( typeof handler !== "string" ) { + handlerProxy.guid = handler.guid = + handler.guid || handlerProxy.guid || $.guid++; + } + + var match = event.match( /^(\w+)\s*(.*)$/ ), + eventName = match[1] + instance.eventNamespace, + selector = match[2]; + if ( selector ) { + delegateElement.delegate( selector, eventName, handlerProxy ); + } else { + element.bind( eventName, handlerProxy ); + } + }); + }, + + _off: function( element, eventName ) { + eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) + this.eventNamespace; + element.unbind( eventName ).undelegate( eventName ); + }, + + _delay: function( handler, delay ) { + function handlerProxy() { + return ( typeof handler === "string" ? instance[ handler ] : handler ) + .apply( instance, arguments ); + } + var instance = this; + return setTimeout( handlerProxy, delay || 0 ); + }, + + _hoverable: function( element ) { + this.hoverable = this.hoverable.add( element ); + this._on( element, { + mouseenter: function( event ) { + $( event.currentTarget ).addClass( "ui-state-hover" ); + }, + mouseleave: function( event ) { + $( event.currentTarget ).removeClass( "ui-state-hover" ); + } + }); + }, + + _focusable: function( element ) { + this.focusable = this.focusable.add( element ); + this._on( element, { + focusin: function( event ) { + $( event.currentTarget ).addClass( "ui-state-focus" ); + }, + focusout: function( event ) { + $( event.currentTarget ).removeClass( "ui-state-focus" ); + } + }); + }, + + _trigger: function( type, event, data ) { + var prop, orig, + callback = this.options[ type ]; + + data = data || {}; + event = $.Event( event ); + event.type = ( type === this.widgetEventPrefix ? + type : + this.widgetEventPrefix + type ).toLowerCase(); + // the original event may come from any element + // so we need to reset the target on the new event + event.target = this.element[ 0 ]; + + // copy original event properties over to the new event + orig = event.originalEvent; + if ( orig ) { + for ( prop in orig ) { + if ( !( prop in event ) ) { + event[ prop ] = orig[ prop ]; + } + } + } + + this.element.trigger( event, data ); + return !( $.isFunction( callback ) && + callback.apply( this.element[0], [ event ].concat( data ) ) === false || + event.isDefaultPrevented() ); + } +}; + +$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) { + $.Widget.prototype[ "_" + method ] = function( element, options, callback ) { + if ( typeof options === "string" ) { + options = { effect: options }; + } + var hasOptions, + effectName = !options ? + method : + options === true || typeof options === "number" ? + defaultEffect : + options.effect || defaultEffect; + options = options || {}; + if ( typeof options === "number" ) { + options = { duration: options }; + } + hasOptions = !$.isEmptyObject( options ); + options.complete = callback; + if ( options.delay ) { + element.delay( options.delay ); + } + if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) { + element[ method ]( options ); + } else if ( effectName !== method && element[ effectName ] ) { + element[ effectName ]( options.duration, options.easing, callback ); + } else { + element.queue(function( next ) { + $( this )[ method ](); + if ( callback ) { + callback.call( element[ 0 ] ); + } + next(); + }); + } + }; +}); + +})); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/modernizr.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/modernizr.js new file mode 100644 index 0000000000000000000000000000000000000000..33a5ba0aa325c99fb936c6979ea51a3be78ff8b0 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/modernizr.js @@ -0,0 +1,4 @@ +/* Modernizr 2.6.2 (Custom Build) | MIT & BSD + * Build: http://modernizr.com/download/#-fontface-backgroundsize-borderimage-borderradius-boxshadow-flexbox-flexboxlegacy-hsla-multiplebgs-opacity-rgba-textshadow-cssanimations-csscolumns-generatedcontent-cssgradients-cssreflections-csstransforms-csstransforms3d-csstransitions-applicationcache-canvas-canvastext-draganddrop-localstorage-shiv-cssclasses-teststyles-testprop-testallprops-hasevent-prefixes-domprefixes-load + */ +;window.Modernizr=function(a,b,c){function B(a){j.cssText=a}function C(a,b){return B(n.join(a+";")+(b||""))}function D(a,b){return typeof a===b}function E(a,b){return!!~(""+a).indexOf(b)}function F(a,b){for(var d in a){var e=a[d];if(!E(e,"-")&&j[e]!==c)return b=="pfx"?e:!0}return!1}function G(a,b,d){for(var e in a){var f=b[a[e]];if(f!==c)return d===!1?a[e]:D(f,"function")?f.bind(d||b):f}return!1}function H(a,b,c){var d=a.charAt(0).toUpperCase()+a.slice(1),e=(a+" "+p.join(d+" ")+d).split(" ");return D(b,"string")||D(b,"undefined")?F(e,b):(e=(a+" "+q.join(d+" ")+d).split(" "),G(e,b,c))}var d="2.6.2",e={},f=!0,g=b.documentElement,h="modernizr",i=b.createElement(h),j=i.style,k,l=":)",m={}.toString,n=" -webkit- -moz- -o- -ms- ".split(" "),o="Webkit Moz O ms",p=o.split(" "),q=o.toLowerCase().split(" "),r={},s={},t={},u=[],v=u.slice,w,x=function(a,c,d,e){var f,i,j,k,l=b.createElement("div"),m=b.body,n=m||b.createElement("body");if(parseInt(d,10))while(d--)j=b.createElement("div"),j.id=e?e[d]:h+(d+1),l.appendChild(j);return f=["­",'<style id="s',h,'">',a,"</style>"].join(""),l.id=h,(m?l:n).innerHTML+=f,n.appendChild(l),m||(n.style.background="",n.style.overflow="hidden",k=g.style.overflow,g.style.overflow="hidden",g.appendChild(n)),i=c(l,a),m?l.parentNode.removeChild(l):(n.parentNode.removeChild(n),g.style.overflow=k),!!i},y=function(){function d(d,e){e=e||b.createElement(a[d]||"div"),d="on"+d;var f=d in e;return f||(e.setAttribute||(e=b.createElement("div")),e.setAttribute&&e.removeAttribute&&(e.setAttribute(d,""),f=D(e[d],"function"),D(e[d],"undefined")||(e[d]=c),e.removeAttribute(d))),e=null,f}var a={select:"input",change:"input",submit:"form",reset:"form",error:"img",load:"img",abort:"img"};return d}(),z={}.hasOwnProperty,A;!D(z,"undefined")&&!D(z.call,"undefined")?A=function(a,b){return z.call(a,b)}:A=function(a,b){return b in a&&D(a.constructor.prototype[b],"undefined")},Function.prototype.bind||(Function.prototype.bind=function(b){var c=this;if(typeof c!="function")throw new TypeError;var d=v.call(arguments,1),e=function(){if(this instanceof e){var a=function(){};a.prototype=c.prototype;var f=new a,g=c.apply(f,d.concat(v.call(arguments)));return Object(g)===g?g:f}return c.apply(b,d.concat(v.call(arguments)))};return e}),r.flexbox=function(){return H("flexWrap")},r.flexboxlegacy=function(){return H("boxDirection")},r.canvas=function(){var a=b.createElement("canvas");return!!a.getContext&&!!a.getContext("2d")},r.canvastext=function(){return!!e.canvas&&!!D(b.createElement("canvas").getContext("2d").fillText,"function")},r.draganddrop=function(){var a=b.createElement("div");return"draggable"in a||"ondragstart"in a&&"ondrop"in a},r.rgba=function(){return B("background-color:rgba(150,255,150,.5)"),E(j.backgroundColor,"rgba")},r.hsla=function(){return B("background-color:hsla(120,40%,100%,.5)"),E(j.backgroundColor,"rgba")||E(j.backgroundColor,"hsla")},r.multiplebgs=function(){return B("background:url(https://),url(https://),red url(https://)"),/(url\s*\(.*?){3}/.test(j.background)},r.backgroundsize=function(){return H("backgroundSize")},r.borderimage=function(){return H("borderImage")},r.borderradius=function(){return H("borderRadius")},r.boxshadow=function(){return H("boxShadow")},r.textshadow=function(){return b.createElement("div").style.textShadow===""},r.opacity=function(){return C("opacity:.55"),/^0.55$/.test(j.opacity)},r.cssanimations=function(){return H("animationName")},r.csscolumns=function(){return H("columnCount")},r.cssgradients=function(){var a="background-image:",b="gradient(linear,left top,right bottom,from(#9f9),to(white));",c="linear-gradient(left top,#9f9, white);";return B((a+"-webkit- ".split(" ").join(b+a)+n.join(c+a)).slice(0,-a.length)),E(j.backgroundImage,"gradient")},r.cssreflections=function(){return H("boxReflect")},r.csstransforms=function(){return!!H("transform")},r.csstransforms3d=function(){var a=!!H("perspective");return a&&"webkitPerspective"in g.style&&x("@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}",function(b,c){a=b.offsetLeft===9&&b.offsetHeight===3}),a},r.csstransitions=function(){return H("transition")},r.fontface=function(){var a;return x('@font-face {font-family:"font";src:url("https://")}',function(c,d){var e=b.getElementById("smodernizr"),f=e.sheet||e.styleSheet,g=f?f.cssRules&&f.cssRules[0]?f.cssRules[0].cssText:f.cssText||"":"";a=/src/i.test(g)&&g.indexOf(d.split(" ")[0])===0}),a},r.generatedcontent=function(){var a;return x(["#",h,"{font:0/0 a}#",h,':after{content:"',l,'";visibility:hidden;font:3px/1 a}'].join(""),function(b){a=b.offsetHeight>=3}),a},r.localstorage=function(){try{return localStorage.setItem(h,h),localStorage.removeItem(h),!0}catch(a){return!1}},r.applicationcache=function(){return!!a.applicationCache};for(var I in r)A(r,I)&&(w=I.toLowerCase(),e[w]=r[I](),u.push((e[w]?"":"no-")+w));return e.addTest=function(a,b){if(typeof a=="object")for(var d in a)A(a,d)&&e.addTest(d,a[d]);else{a=a.toLowerCase();if(e[a]!==c)return e;b=typeof b=="function"?b():b,typeof f!="undefined"&&f&&(g.className+=" "+(b?"":"no-")+a),e[a]=b}return e},B(""),i=k=null,function(a,b){function k(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x<style>"+b+"</style>",d.insertBefore(c.lastChild,d.firstChild)}function l(){var a=r.elements;return typeof a=="string"?a.split(" "):a}function m(a){var b=i[a[g]];return b||(b={},h++,a[g]=h,i[h]=b),b}function n(a,c,f){c||(c=b);if(j)return c.createElement(a);f||(f=m(c));var g;return f.cache[a]?g=f.cache[a].cloneNode():e.test(a)?g=(f.cache[a]=f.createElem(a)).cloneNode():g=f.createElem(a),g.canHaveChildren&&!d.test(a)?f.frag.appendChild(g):g}function o(a,c){a||(a=b);if(j)return a.createDocumentFragment();c=c||m(a);var d=c.frag.cloneNode(),e=0,f=l(),g=f.length;for(;e<g;e++)d.createElement(f[e]);return d}function p(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return r.shivMethods?n(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+l().join().replace(/\w+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(r,b.frag)}function q(a){a||(a=b);var c=m(a);return r.shivCSS&&!f&&!c.hasCSS&&(c.hasCSS=!!k(a,"article,aside,figcaption,figure,footer,header,hgroup,nav,section{display:block}mark{background:#FF0;color:#000}")),j||p(a,c),a}var c=a.html5||{},d=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,e=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,f,g="_html5shiv",h=0,i={},j;(function(){try{var a=b.createElement("a");a.innerHTML="<xyz></xyz>",f="hidden"in a,j=a.childNodes.length==1||function(){b.createElement("a");var a=b.createDocumentFragment();return typeof a.cloneNode=="undefined"||typeof a.createDocumentFragment=="undefined"||typeof a.createElement=="undefined"}()}catch(c){f=!0,j=!0}})();var r={elements:c.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video",shivCSS:c.shivCSS!==!1,supportsUnknownElements:j,shivMethods:c.shivMethods!==!1,type:"default",shivDocument:q,createElement:n,createDocumentFragment:o};a.html5=r,q(b)}(this,b),e._version=d,e._prefixes=n,e._domPrefixes=q,e._cssomPrefixes=p,e.hasEvent=y,e.testProp=function(a){return F([a])},e.testAllProps=H,e.testStyles=x,g.className=g.className.replace(/(^|\s)no-js(\s|$)/,"$1$2")+(f?" js "+u.join(" "):""),e}(this,this.document),function(a,b,c){function d(a){return"[object Function]"==o.call(a)}function e(a){return"string"==typeof a}function f(){}function g(a){return!a||"loaded"==a||"complete"==a||"uninitialized"==a}function h(){var a=p.shift();q=1,a?a.t?m(function(){("c"==a.t?B.injectCss:B.injectJs)(a.s,0,a.a,a.x,a.e,1)},0):(a(),h()):q=0}function i(a,c,d,e,f,i,j){function k(b){if(!o&&g(l.readyState)&&(u.r=o=1,!q&&h(),l.onload=l.onreadystatechange=null,b)){"img"!=a&&m(function(){t.removeChild(l)},50);for(var d in y[c])y[c].hasOwnProperty(d)&&y[c][d].onload()}}var j=j||B.errorTimeout,l=b.createElement(a),o=0,r=0,u={t:d,s:c,e:f,a:i,x:j};1===y[c]&&(r=1,y[c]=[]),"object"==a?l.data=c:(l.src=c,l.type=a),l.width=l.height="0",l.onerror=l.onload=l.onreadystatechange=function(){k.call(this,r)},p.splice(e,0,u),"img"!=a&&(r||2===y[c]?(t.insertBefore(l,s?null:n),m(k,j)):y[c].push(l))}function j(a,b,c,d,f){return q=0,b=b||"j",e(a)?i("c"==b?v:u,a,b,this.i++,c,d,f):(p.splice(this.i++,0,a),1==p.length&&h()),this}function k(){var a=B;return a.loader={load:j,i:0},a}var l=b.documentElement,m=a.setTimeout,n=b.getElementsByTagName("script")[0],o={}.toString,p=[],q=0,r="MozAppearance"in l.style,s=r&&!!b.createRange().compareNode,t=s?l:n.parentNode,l=a.opera&&"[object Opera]"==o.call(a.opera),l=!!b.attachEvent&&!l,u=r?"object":l?"script":"img",v=l?"script":u,w=Array.isArray||function(a){return"[object Array]"==o.call(a)},x=[],y={},z={timeout:function(a,b){return b.length&&(a.timeout=b[0]),a}},A,B;B=function(a){function b(a){var a=a.split("!"),b=x.length,c=a.pop(),d=a.length,c={url:c,origUrl:c,prefixes:a},e,f,g;for(f=0;f<d;f++)g=a[f].split("="),(e=z[g.shift()])&&(c=e(c,g));for(f=0;f<b;f++)c=x[f](c);return c}function g(a,e,f,g,h){var i=b(a),j=i.autoCallback;i.url.split(".").pop().split("?").shift(),i.bypass||(e&&(e=d(e)?e:e[a]||e[g]||e[a.split("/").pop().split("?")[0]]),i.instead?i.instead(a,e,f,g,h):(y[i.url]?i.noexec=!0:y[i.url]=1,f.load(i.url,i.forceCSS||!i.forceJS&&"css"==i.url.split(".").pop().split("?").shift()?"c":c,i.noexec,i.attrs,i.timeout),(d(e)||d(j))&&f.load(function(){k(),e&&e(i.origUrl,h,g),j&&j(i.origUrl,h,g),y[i.url]=2})))}function h(a,b){function c(a,c){if(a){if(e(a))c||(j=function(){var a=[].slice.call(arguments);k.apply(this,a),l()}),g(a,j,b,0,h);else if(Object(a)===a)for(n in m=function(){var b=0,c;for(c in a)a.hasOwnProperty(c)&&b++;return b}(),a)a.hasOwnProperty(n)&&(!c&&!--m&&(d(j)?j=function(){var a=[].slice.call(arguments);k.apply(this,a),l()}:j[n]=function(a){return function(){var b=[].slice.call(arguments);a&&a.apply(this,b),l()}}(k[n])),g(a[n],j,b,n,h))}else!c&&l()}var h=!!a.test,i=a.load||a.both,j=a.callback||f,k=j,l=a.complete||f,m,n;c(h?a.yep:a.nope,!!i),i&&c(i)}var i,j,l=this.yepnope.loader;if(e(a))g(a,0,l,0);else if(w(a))for(i=0;i<a.length;i++)j=a[i],e(j)?g(j,0,l,0):w(j)?B(j):Object(j)===j&&h(j,l);else Object(a)===a&&h(a,l)},B.addPrefix=function(a,b){z[a]=b},B.addFilter=function(a){x.push(a)},B.errorTimeout=1e4,null==b.readyState&&b.addEventListener&&(b.readyState="loading",b.addEventListener("DOMContentLoaded",A=function(){b.removeEventListener("DOMContentLoaded",A,0),b.readyState="complete"},0)),a.yepnope=k(),a.yepnope.executeStack=h,a.yepnope.injectJs=function(a,c,d,e,i,j){var k=b.createElement("script"),l,o,e=e||B.errorTimeout;k.src=a;for(o in d)k.setAttribute(o,d[o]);c=j?h:c||f,k.onreadystatechange=k.onload=function(){!l&&g(k.readyState)&&(l=1,c(),k.onload=k.onreadystatechange=null)},m(function(){l||(l=1,c(1))},e),i?k.onload():n.parentNode.insertBefore(k,n)},a.yepnope.injectCss=function(a,c,d,e,g,i){var e=b.createElement("link"),j,c=i?h:c||f;e.href=a,e.rel="stylesheet",e.type="text/css";for(j in d)e.setAttribute(j,d[j]);g||(n.parentNode.insertBefore(e,n),m(c,0))}}(this,document),Modernizr.load=function(){yepnope.apply(window,[].slice.call(arguments,0))}; diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/prettify.min.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/prettify.min.js new file mode 100644 index 0000000000000000000000000000000000000000..eef5ad7e6a07676b3919146d583d1c190bf1e163 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/prettify.min.js @@ -0,0 +1,28 @@ +var q=null;window.PR_SHOULD_USE_CONTINUATION=!0; +(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:"0"<=b&&b<="7"?parseInt(a.substring(1),8):b==="u"||b==="x"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?"\\x0":"\\x")+a.toString(16);a=String.fromCharCode(a);if(a==="\\"||a==="-"||a==="["||a==="]")a="\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),a= +[],b=[],o=f[0]==="^",c=o?1:0,i=f.length;c<i;++c){var j=f[c];if(/\\[bdsw]/i.test(j))a.push(j);else{var j=m(j),d;c+2<i&&"-"===f[c+1]?(d=m(f[c+2]),c+=2):d=j;b.push([j,d]);d<65||j>122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;c<b.length;++c)i=b[c],i[0]<=j[1]+1?j[1]=Math.max(j[1],i[1]):f.push(j=i);b=["["];o&&b.push("^");b.push.apply(b,a);for(c=0;c< +f.length;++c)i=f[c],b.push(e(i[0])),i[1]>i[0]&&(i[1]+1>i[0]&&b.push("-"),b.push(e(i[1])));b.push("]");return b.join("")}function y(a){for(var f=a.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),b=f.length,d=[],c=0,i=0;c<b;++c){var j=f[c];j==="("?++i:"\\"===j.charAt(0)&&(j=+j.substring(1))&&j<=i&&(d[j]=-1)}for(c=1;c<d.length;++c)-1===d[c]&&(d[c]=++t);for(i=c=0;c<b;++c)j=f[c],j==="("?(++i,d[i]===void 0&&(f[c]="(?:")):"\\"===j.charAt(0)&& +(j=+j.substring(1))&&j<=i&&(f[c]="\\"+d[i]);for(i=c=0;c<b;++c)"^"===f[c]&&"^"!==f[c+1]&&(f[c]="");if(a.ignoreCase&&s)for(c=0;c<b;++c)j=f[c],a=j.charAt(0),j.length>=2&&a==="["?f[c]=h(j):a!=="\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return f.join("")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p<d;++p){var g=a[p];if(g.ignoreCase)l=!0;else if(/[a-z]/i.test(g.source.replace(/\\u[\da-f]{4}|\\x[\da-f]{2}|\\[^UXux]/gi,""))){s=!0;l=!1;break}}for(var r= +{b:8,t:9,n:10,v:11,f:12,r:13},n=[],p=0,d=a.length;p<d;++p){g=a[p];if(g.global||g.multiline)throw Error(""+g);n.push("(?:"+y(g)+")")}return RegExp(n.join("|"),l?"gi":"g")}function M(a){function m(a){switch(a.nodeType){case 1:if(e.test(a.className))break;for(var g=a.firstChild;g;g=g.nextSibling)m(g);g=a.nodeName;if("BR"===g||"LI"===g)h[s]="\n",t[s<<1]=y++,t[s++<<1|1]=a;break;case 3:case 4:g=a.nodeValue,g.length&&(g=p?g.replace(/\r\n?/g,"\n"):g.replace(/[\t\n\r ]+/g," "),h[s]=g,t[s<<1]=y,y+=g.length, +t[s++<<1|1]=a)}}var e=/(?:^|\s)nocode(?:\s|$)/,h=[],y=0,t=[],s=0,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=document.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);m(a);return{a:h.join("").replace(/\n$/,""),c:t}}function B(a,m,e,h){m&&(a={a:m,d:a},e(a),h.push.apply(h,a.e))}function x(a,m){function e(a){for(var l=a.d,p=[l,"pln"],d=0,g=a.a.match(y)||[],r={},n=0,z=g.length;n<z;++n){var f=g[n],b=r[f],o=void 0,c;if(typeof b=== +"string")c=!1;else{var i=h[f.charAt(0)];if(i)o=f.match(i[1]),b=i[0];else{for(c=0;c<t;++c)if(i=m[c],o=f.match(i[1])){b=i[0];break}o||(b="pln")}if((c=b.length>=5&&"lang-"===b.substring(0,5))&&!(o&&typeof o[1]==="string"))c=!1,b="src";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m), +l=[],p={},d=0,g=e.length;d<g;++d){var r=e[d],n=r[3];if(n)for(var k=n.length;--k>=0;)h[n.charAt(k)]=r;r=r[1];n=""+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\S\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?m.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/, +q,"'\"`"]):m.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&e.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):m.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),e.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):m.push(["com",/^#[^\n\r]*/, +q,"#"]));a.cStyleComments&&(e.push(["com",/^\/\/[^\n\r]*/,q]),e.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));a.regexLiterals&&e.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(h=a.types)&&e.push(["typ",h]);a=(""+a.keywords).replace(/^ | $/g, +"");a.length&&e.push(["kwd",RegExp("^(?:"+a.replace(/[\s,]+/g,"|")+")\\b"),q]);m.push(["pln",/^\s+/,q," \r\n\t\xa0"]);e.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if("BR"===a.nodeName)h(a), +a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e} +for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\s)nocode(?:\s|$)/,t=/\r\n?|\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);for(l=s.createElement("LI");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g<d.length;++g)e(d[g]);m===(m|0)&&d[0].setAttribute("value", +m);var r=s.createElement("OL");r.className="linenums";for(var n=Math.max(0,m-1|0)||0,g=0,z=d.length;g<z;++g)l=d[g],l.className="L"+(g+n)%10,l.firstChild||l.appendChild(s.createTextNode("\xa0")),r.appendChild(l);a.appendChild(r)}function k(a,m){for(var e=m.length;--e>=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn("cannot override language handler %s",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*</.test(m)?"default-markup":"default-code";return A[a]}function E(a){var m= +a.g;try{var e=M(a.h),h=e.a;a.a=h;a.c=e.c;a.d=0;C(m,h)(a);var k=/\bMSIE\b/.test(navigator.userAgent),m=/\n/g,t=a.a,s=t.length,e=0,l=a.c,p=l.length,h=0,d=a.e,g=d.length,a=0;d[g]=s;var r,n;for(n=r=0;n<g;)d[n]!==d[n+2]?(d[r++]=d[n++],d[r++]=d[n++]):n+=2;g=r;for(n=r=0;n<g;){for(var z=d[n],f=d[n+1],b=n+2;b+2<=g&&d[b+1]===f;)b+=2;d[r++]=z;d[r++]=f;n=b}for(d.length=r;h<p;){var o=l[h+2]||s,c=d[a+2]||s,b=Math.min(o,c),i=l[h+1],j;if(i.nodeType!==1&&(j=t.substring(e,b))){k&&(j=j.replace(m,"\r"));i.nodeValue= +j;var u=i.ownerDocument,v=u.createElement("SPAN");v.className=d[a+1];var x=i.parentNode;x.replaceChild(v,i);v.appendChild(i);e<o&&(l[h+1]=i=u.createTextNode(t.substring(b,o)),x.insertBefore(i,v.nextSibling))}e=b;e>=o&&(h+=2);e>=c&&(a+=2)}}catch(w){"console"in window&&console.log(w&&w.stack?w.stack:w)}}var v=["break,continue,do,else,for,if,return,while"],w=[[v,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"], +"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],F=[w,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],G=[w,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"], +H=[G,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],w=[w,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],I=[v,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"], +J=[v,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],v=[v,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,N=/\S/,O=u({keywords:[F,H,w,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+ +I,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,["default-code"]);k(x([],[["pln",/^[^<?]+/],["dec",/^<!\w[^>]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]), +["default-markup","htm","html","mxml","xhtml","xml","xsl"]);k(x([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css", +/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);k(x([],[["atv",/^[\S\s]+/]]),["uq.val"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),["c","cc","cpp","cxx","cyc","m"]);k(u({keywords:"null,true,false"}),["json"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),["cs"]);k(u({keywords:G,cStyleComments:!0}),["java"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}), +["cv","py"]);k(u({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),["js"]);k(u({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes", +hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);k(x([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement("PRE");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p<h.length&&l.now()<e;p++){var n=h[p],k=n.className;if(k.indexOf("prettyprint")>=0){var k=k.match(g),f,b;if(b= +!k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&"CODE"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName==="pre"||o.tagName==="code"||o.tagName==="xmp")&&o.className&&o.className.indexOf("prettyprint")>=0){b=!0;break}b||((b=(b=n.className.match(/\blinenums\b(?::(\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p<h.length?setTimeout(m, +250):a&&a()}for(var e=[document.getElementsByTagName("pre"),document.getElementsByTagName("code"),document.getElementsByTagName("xmp")],h=[],k=0;k<e.length;++k)for(var t=0,s=e[k].length;t<s;++t)h.push(e[k][t]);var e=q,l=Date;l.now||(l={now:function(){return+new Date}});var p=0,d,g=/\blang(?:uage)?-([\w.]+)(?!\S)/;m()};window.PR={createSimpleLexer:x,registerLangHandler:k,sourceDecorator:u,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit", +PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ"}})(); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/require.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/require.js new file mode 100644 index 0000000000000000000000000000000000000000..a1a1e4d5d3acce2b49c1a4ae7624b037a6202dd4 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/require.js @@ -0,0 +1,35 @@ +/* + RequireJS 2.0.6 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved. + Available via the MIT or new BSD license. + see: http://github.com/jrburke/requirejs for details + */ +var requirejs,require,define; +(function(Z){function x(b){return J.call(b)==="[object Function]"}function E(b){return J.call(b)==="[object Array]"}function o(b,e){if(b){var f;for(f=0;f<b.length;f+=1)if(b[f]&&e(b[f],f,b))break}}function M(b,e){if(b){var f;for(f=b.length-1;f>-1;f-=1)if(b[f]&&e(b[f],f,b))break}}function y(b,e){for(var f in b)if(b.hasOwnProperty(f)&&e(b[f],f))break}function N(b,e,f,h){e&&y(e,function(e,j){if(f||!F.call(b,j))h&&typeof e!=="string"?(b[j]||(b[j]={}),N(b[j],e,f,h)):b[j]=e});return b}function t(b,e){return function(){return e.apply(b, + arguments)}}function $(b){if(!b)return b;var e=Z;o(b.split("."),function(b){e=e[b]});return e}function aa(b,e,f){return function(){var h=ga.call(arguments,0),c;if(f&&x(c=h[h.length-1]))c.__requireJsBuild=!0;h.push(e);return b.apply(null,h)}}function ba(b,e,f){o([["toUrl"],["undef"],["defined","requireDefined"],["specified","requireSpecified"]],function(h){var c=h[1]||h[0];b[h[0]]=e?aa(e[c],f):function(){var b=z[O];return b[c].apply(b,arguments)}})}function G(b,e,f,h){e=Error(e+"\nhttp://requirejs.org/docs/errors.html#"+ + b);e.requireType=b;e.requireModules=h;if(f)e.originalError=f;return e}function ha(){if(H&&H.readyState==="interactive")return H;M(document.getElementsByTagName("script"),function(b){if(b.readyState==="interactive")return H=b});return H}var j,p,u,B,s,C,H,I,ca,da,ia=/(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg,ja=/[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g,ea=/\.js$/,ka=/^\.\//;p=Object.prototype;var J=p.toString,F=p.hasOwnProperty;p=Array.prototype;var ga=p.slice,la=p.splice,w=!!(typeof window!== + "undefined"&&navigator&&document),fa=!w&&typeof importScripts!=="undefined",ma=w&&navigator.platform==="PLAYSTATION 3"?/^complete$/:/^(complete|loaded)$/,O="_",S=typeof opera!=="undefined"&&opera.toString()==="[object Opera]",z={},r={},P=[],K=!1;if(typeof define==="undefined"){if(typeof requirejs!=="undefined"){if(x(requirejs))return;r=requirejs;requirejs=void 0}typeof require!=="undefined"&&!x(require)&&(r=require,require=void 0);j=requirejs=function(b,e,f,h){var c,o=O;!E(b)&&typeof b!=="string"&& +(c=b,E(e)?(b=e,e=f,f=h):b=[]);if(c&&c.context)o=c.context;(h=z[o])||(h=z[o]=j.s.newContext(o));c&&h.configure(c);return h.require(b,e,f)};j.config=function(b){return j(b)};require||(require=j);j.version="2.0.6";j.jsExtRegExp=/^\/|:|\?|\.js$/;j.isBrowser=w;p=j.s={contexts:z,newContext:function(b){function e(a,d,k){var l,b,i,v,e,c,f,g=d&&d.split("/");l=g;var h=m.map,j=h&&h["*"];if(a&&a.charAt(0)===".")if(d){l=m.pkgs[d]?g=[d]:g.slice(0,g.length-1);d=a=l.concat(a.split("/"));for(l=0;d[l];l+=1)if(b=d[l], + b===".")d.splice(l,1),l-=1;else if(b==="..")if(l===1&&(d[2]===".."||d[0]===".."))break;else l>0&&(d.splice(l-1,2),l-=2);l=m.pkgs[d=a[0]];a=a.join("/");l&&a===d+"/"+l.main&&(a=d)}else a.indexOf("./")===0&&(a=a.substring(2));if(k&&(g||j)&&h){d=a.split("/");for(l=d.length;l>0;l-=1){i=d.slice(0,l).join("/");if(g)for(b=g.length;b>0;b-=1)if(k=h[g.slice(0,b).join("/")])if(k=k[i]){v=k;e=l;break}if(v)break;!c&&j&&j[i]&&(c=j[i],f=l)}!v&&c&&(v=c,e=f);v&&(d.splice(0,e,v),a=d.join("/"))}return a}function f(a){w&& +o(document.getElementsByTagName("script"),function(d){if(d.getAttribute("data-requiremodule")===a&&d.getAttribute("data-requirecontext")===g.contextName)return d.parentNode.removeChild(d),!0})}function h(a){var d=m.paths[a];if(d&&E(d)&&d.length>1)return f(a),d.shift(),g.undef(a),g.require([a]),!0}function c(a,d,k,l){var b,i,v=a?a.indexOf("!"):-1,c=null,f=d?d.name:null,h=a,j=!0,m="";a||(j=!1,a="_@r"+(M+=1));v!==-1&&(c=a.substring(0,v),a=a.substring(v+1,a.length));c&&(c=e(c,f,l),i=q[c]);a&&(c?m=i&& + i.normalize?i.normalize(a,function(a){return e(a,f,l)}):e(a,f,l):(m=e(a,f,l),b=g.nameToUrl(m)));a=c&&!i&&!k?"_unnormalized"+(O+=1):"";return{prefix:c,name:m,parentMap:d,unnormalized:!!a,url:b,originalName:h,isDefine:j,id:(c?c+"!"+m:m)+a}}function p(a){var d=a.id,k=n[d];k||(k=n[d]=new g.Module(a));return k}function r(a,d,k){var b=a.id,c=n[b];if(F.call(q,b)&&(!c||c.defineEmitComplete))d==="defined"&&k(q[b]);else p(a).on(d,k)}function A(a,d){var k=a.requireModules,b=!1;if(d)d(a);else if(o(k,function(d){if(d= + n[d])d.error=a,d.events.error&&(b=!0,d.emit("error",a))}),!b)j.onError(a)}function s(){P.length&&(la.apply(D,[D.length-1,0].concat(P)),P=[])}function u(a,d,k){a=a&&a.map;d=aa(k||g.require,a,d);ba(d,g,a);d.isBrowser=w;return d}function z(a){delete n[a];o(L,function(d,k){if(d.map.id===a)return L.splice(k,1),d.defined||(g.waitCount-=1),!0})}function B(a,d,k){var b=a.map.id,c=a.depMaps,i;if(a.inited){if(d[b])return a;d[b]=!0;o(c,function(a){var a=a.id,b=n[a];return!b||k[a]||!b.inited||!b.enabled?void 0: + i=B(b,d,k)});k[b]=!0;return i}}function C(a,d,b){var l=a.map.id,c=a.depMaps;if(a.inited&&a.map.isDefine){if(d[l])return q[l];d[l]=a;o(c,function(i){var i=i.id,c=n[i];!Q[i]&&c&&(!c.inited||!c.enabled?b[l]=!0:(c=C(c,d,b),b[i]||a.defineDepById(i,c)))});a.check(!0);return q[l]}}function I(a){a.check()}function T(){var a,d,b,l,c=(b=m.waitSeconds*1E3)&&g.startTime+b<(new Date).getTime(),i=[],e=!1,j=!0;if(!U){U=!0;y(n,function(b){a=b.map;d=a.id;if(b.enabled&&!b.error)if(!b.inited&&c)h(d)?e=l=!0:(i.push(d), + f(d));else if(!b.inited&&b.fetched&&a.isDefine&&(e=!0,!a.prefix))return j=!1});if(c&&i.length)return b=G("timeout","Load timeout for modules: "+i,null,i),b.contextName=g.contextName,A(b);j&&(o(L,function(a){if(!a.defined){var a=B(a,{},{}),d={};a&&(C(a,d,{}),y(d,I))}}),y(n,I));if((!c||l)&&e)if((w||fa)&&!V)V=setTimeout(function(){V=0;T()},50);U=!1}}function W(a){p(c(a[0],null,!0)).init(a[1],a[2])}function J(a){var a=a.currentTarget||a.srcElement,d=g.onScriptLoad;a.detachEvent&&!S?a.detachEvent("onreadystatechange", + d):a.removeEventListener("load",d,!1);d=g.onScriptError;a.detachEvent&&!S||a.removeEventListener("error",d,!1);return{node:a,id:a&&a.getAttribute("data-requiremodule")}}var U,X,g,Q,V,m={waitSeconds:7,baseUrl:"./",paths:{},pkgs:{},shim:{}},n={},Y={},D=[],q={},R={},M=1,O=1,L=[];Q={require:function(a){return u(a)},exports:function(a){a.usingExports=!0;if(a.map.isDefine)return a.exports=q[a.map.id]={}},module:function(a){return a.module={id:a.map.id,uri:a.map.url,config:function(){return m.config&&m.config[a.map.id]|| +{}},exports:q[a.map.id]}}};X=function(a){this.events=Y[a.id]||{};this.map=a;this.shim=m.shim[a.id];this.depExports=[];this.depMaps=[];this.depMatched=[];this.pluginMaps={};this.depCount=0};X.prototype={init:function(a,d,b,c){c=c||{};if(!this.inited){this.factory=d;if(b)this.on("error",b);else this.events.error&&(b=t(this,function(a){this.emit("error",a)}));this.depMaps=a&&a.slice(0);this.depMaps.rjsSkipMap=a.rjsSkipMap;this.errback=b;this.inited=!0;this.ignore=c.ignore;c.enabled||this.enabled?this.enable(): + this.check()}},defineDepById:function(a,d){var b;o(this.depMaps,function(d,c){if(d.id===a)return b=c,!0});return this.defineDep(b,d)},defineDep:function(a,d){this.depMatched[a]||(this.depMatched[a]=!0,this.depCount-=1,this.depExports[a]=d)},fetch:function(){if(!this.fetched){this.fetched=!0;g.startTime=(new Date).getTime();var a=this.map;if(this.shim)u(this,!0)(this.shim.deps||[],t(this,function(){return a.prefix?this.callPlugin():this.load()}));else return a.prefix?this.callPlugin():this.load()}}, + load:function(){var a=this.map.url;R[a]||(R[a]=!0,g.load(this.map.id,a))},check:function(a){if(this.enabled&&!this.enabling){var d,b,c=this.map.id;b=this.depExports;var e=this.exports,i=this.factory;if(this.inited)if(this.error)this.emit("error",this.error);else{if(!this.defining){this.defining=!0;if(this.depCount<1&&!this.defined){if(x(i)){if(this.events.error)try{e=g.execCb(c,i,b,e)}catch(f){d=f}else e=g.execCb(c,i,b,e);if(this.map.isDefine)if((b=this.module)&&b.exports!==void 0&&b.exports!==this.exports)e= + b.exports;else if(e===void 0&&this.usingExports)e=this.exports;if(d)return d.requireMap=this.map,d.requireModules=[this.map.id],d.requireType="define",A(this.error=d)}else e=i;this.exports=e;if(this.map.isDefine&&!this.ignore&&(q[c]=e,j.onResourceLoad))j.onResourceLoad(g,this.map,this.depMaps);delete n[c];this.defined=!0;g.waitCount-=1;g.waitCount===0&&(L=[])}this.defining=!1;if(!a&&this.defined&&!this.defineEmitted)this.defineEmitted=!0,this.emit("defined",this.exports),this.defineEmitComplete=!0}}else this.fetch()}}, + callPlugin:function(){var a=this.map,d=a.id,b=c(a.prefix,null,!1,!0);r(b,"defined",t(this,function(b){var k;k=this.map.name;var i=this.map.parentMap?this.map.parentMap.name:null;if(this.map.unnormalized){if(b.normalize&&(k=b.normalize(k,function(a){return e(a,i,!0)})||""),b=c(a.prefix+"!"+k,this.map.parentMap,!1,!0),r(b,"defined",t(this,function(a){this.init([],function(){return a},null,{enabled:!0,ignore:!0})})),b=n[b.id]){if(this.events.error)b.on("error",t(this,function(a){this.emit("error",a)})); + b.enable()}}else k=t(this,function(a){this.init([],function(){return a},null,{enabled:!0})}),k.error=t(this,function(a){this.inited=!0;this.error=a;a.requireModules=[d];y(n,function(a){a.map.id.indexOf(d+"_unnormalized")===0&&z(a.map.id)});A(a)}),k.fromText=function(a,b){var d=K;d&&(K=!1);p(c(a));j.exec(b);d&&(K=!0);g.completeLoad(a)},b.load(a.name,u(a.parentMap,!0,function(a,b,d){a.rjsSkipMap=!0;return g.require(a,b,d)}),k,m)}));g.enable(b,this);this.pluginMaps[b.id]=b},enable:function(){this.enabled= + !0;if(!this.waitPushed)L.push(this),g.waitCount+=1,this.waitPushed=!0;this.enabling=!0;o(this.depMaps,t(this,function(a,b){var k,e;if(typeof a==="string"){a=c(a,this.map.isDefine?this.map:this.map.parentMap,!1,!this.depMaps.rjsSkipMap);this.depMaps[b]=a;if(k=Q[a.id]){this.depExports[b]=k(this);return}this.depCount+=1;r(a,"defined",t(this,function(a){this.defineDep(b,a);this.check()}));this.errback&&r(a,"error",this.errback)}k=a.id;e=n[k];!Q[k]&&e&&!e.enabled&&g.enable(a,this)}));y(this.pluginMaps, + t(this,function(a){var b=n[a.id];b&&!b.enabled&&g.enable(a,this)}));this.enabling=!1;this.check()},on:function(a,b){var c=this.events[a];c||(c=this.events[a]=[]);c.push(b)},emit:function(a,b){o(this.events[a],function(a){a(b)});a==="error"&&delete this.events[a]}};return g={config:m,contextName:b,registry:n,defined:q,urlFetched:R,waitCount:0,defQueue:D,Module:X,makeModuleMap:c,configure:function(a){a.baseUrl&&a.baseUrl.charAt(a.baseUrl.length-1)!=="/"&&(a.baseUrl+="/");var b=m.pkgs,e=m.shim,f=m.paths, + j=m.map;N(m,a,!0);m.paths=N(f,a.paths,!0);if(a.map)m.map=N(j||{},a.map,!0,!0);if(a.shim)y(a.shim,function(a,b){E(a)&&(a={deps:a});if(a.exports&&!a.exports.__buildReady)a.exports=g.makeShimExports(a.exports);e[b]=a}),m.shim=e;if(a.packages)o(a.packages,function(a){a=typeof a==="string"?{name:a}:a;b[a.name]={name:a.name,location:a.location||a.name,main:(a.main||"main").replace(ka,"").replace(ea,"")}}),m.pkgs=b;y(n,function(a,b){if(!a.inited&&!a.map.unnormalized)a.map=c(b)});if(a.deps||a.callback)g.require(a.deps|| + [],a.callback)},makeShimExports:function(a){var b;return typeof a==="string"?(b=function(){return $(a)},b.exports=a,b):function(){return a.apply(Z,arguments)}},requireDefined:function(a,b){var e=c(a,b,!1,!0).id;return F.call(q,e)},requireSpecified:function(a,b){a=c(a,b,!1,!0).id;return F.call(q,a)||F.call(n,a)},require:function(a,d,e,f){var h;if(typeof a==="string"){if(x(d))return A(G("requireargs","Invalid require call"),e);if(j.get)return j.get(g,a,d);a=c(a,d,!1,!0);a=a.id;return!F.call(q,a)?A(G("notloaded", + 'Module name "'+a+'" has not been loaded yet for context: '+b)):q[a]}e&&!x(e)&&(f=e,e=void 0);d&&!x(d)&&(f=d,d=void 0);for(s();D.length;)if(h=D.shift(),h[0]===null)return A(G("mismatch","Mismatched anonymous define() module: "+h[h.length-1]));else W(h);p(c(null,f)).init(a,d,e,{enabled:!0});T();return g.require},undef:function(a){s();var b=c(a,null,!0),e=n[a];delete q[a];delete R[b.url];delete Y[a];if(e){if(e.events.defined)Y[a]=e.events;z(a)}},enable:function(a){n[a.id]&&p(a).enable()},completeLoad:function(a){var b, + c,e=m.shim[a]||{},f=e.exports&&e.exports.exports;for(s();D.length;){c=D.shift();if(c[0]===null){c[0]=a;if(b)break;b=!0}else c[0]===a&&(b=!0);W(c)}c=n[a];if(!b&&!q[a]&&c&&!c.inited)if(m.enforceDefine&&(!f||!$(f)))if(h(a))return;else return A(G("nodefine","No define call for "+a,null,[a]));else W([a,e.deps||[],e.exports]);T()},toUrl:function(a,b){var c=a.lastIndexOf("."),f=null;c!==-1&&(f=a.substring(c,a.length),a=a.substring(0,c));return g.nameToUrl(e(a,b&&b.id,!0),f)},nameToUrl:function(a,b){var c, + e,f,i,h,g;if(j.jsExtRegExp.test(a))i=a+(b||"");else{c=m.paths;e=m.pkgs;i=a.split("/");for(h=i.length;h>0;h-=1)if(g=i.slice(0,h).join("/"),f=e[g],g=c[g]){E(g)&&(g=g[0]);i.splice(0,h,g);break}else if(f){c=a===f.name?f.location+"/"+f.main:f.location;i.splice(0,h,c);break}i=i.join("/");i+=b||(/\?/.test(i)?"":".js");i=(i.charAt(0)==="/"||i.match(/^[\w\+\.\-]+:/)?"":m.baseUrl)+i}return m.urlArgs?i+((i.indexOf("?")===-1?"?":"&")+m.urlArgs):i},load:function(a,b){j.load(g,a,b)},execCb:function(a,b,c,e){return b.apply(e, + c)},onScriptLoad:function(a){if(a.type==="load"||ma.test((a.currentTarget||a.srcElement).readyState))H=null,a=J(a),g.completeLoad(a.id)},onScriptError:function(a){var b=J(a);if(!h(b.id))return A(G("scripterror","Script error",a,[b.id]))}}}};j({});ba(j);if(w&&(u=p.head=document.getElementsByTagName("head")[0],B=document.getElementsByTagName("base")[0]))u=p.head=B.parentNode;j.onError=function(b){throw b;};j.load=function(b,e,f){var h=b&&b.config||{},c;if(w)return c=h.xhtml?document.createElementNS("http://www.w3.org/1999/xhtml", + "html:script"):document.createElement("script"),c.type=h.scriptType||"text/javascript",c.charset="utf-8",c.async=!0,c.setAttribute("data-requirecontext",b.contextName),c.setAttribute("data-requiremodule",e),c.attachEvent&&!(c.attachEvent.toString&&c.attachEvent.toString().indexOf("[native code")<0)&&!S?(K=!0,c.attachEvent("onreadystatechange",b.onScriptLoad)):(c.addEventListener("load",b.onScriptLoad,!1),c.addEventListener("error",b.onScriptError,!1)),c.src=f,I=c,B?u.insertBefore(c,B):u.appendChild(c), + I=null,c;else fa&&(importScripts(f),b.completeLoad(e))};w&&M(document.getElementsByTagName("script"),function(b){if(!u)u=b.parentNode;if(s=b.getAttribute("data-main")){if(!r.baseUrl)C=s.split("/"),ca=C.pop(),da=C.length?C.join("/")+"/":"./",r.baseUrl=da,s=ca;s=s.replace(ea,"");r.deps=r.deps?r.deps.concat(s):[s];return!0}});define=function(b,e,f){var h,c;typeof b!=="string"&&(f=e,e=b,b=null);E(e)||(f=e,e=[]);!e.length&&x(f)&&f.length&&(f.toString().replace(ia,"").replace(ja,function(b,c){e.push(c)}), + e=(f.length===1?["require"]:["require","exports","module"]).concat(e));if(K&&(h=I||ha()))b||(b=h.getAttribute("data-requiremodule")),c=z[h.getAttribute("data-requirecontext")];(c?c.defQueue:P).push([b,e,f])};define.amd={jQuery:!0};j.exec=function(b){return eval(b)};j(r)}})(this); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/tpl.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/tpl.js new file mode 100644 index 0000000000000000000000000000000000000000..751c8b3e423a7737f7b7b57cdc3db03356a254ec --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/tpl.js @@ -0,0 +1,205 @@ +/** + * Adapted from the official plugin text.js + * + * Uses UnderscoreJS micro-templates : http://documentcloud.github.com/underscore/#template + * @author Julien Cabanès <julien@zeeagency.com> + * @version 0.2 + * + * @license RequireJS text 0.24.0 Copyright (c) 2010-2011, The Dojo Foundation All Rights Reserved. + * Available via the MIT or new BSD license. + * see: http://github.com/jrburke/requirejs for details + */ +/*jslint regexp: false, nomen: false, plusplus: false, strict: false */ +/*global require: false, XMLHttpRequest: false, ActiveXObject: false, + define: false, window: false, process: false, Packages: false, + java: false */ + +(function () { +//>>excludeStart('excludeTpl', pragmas.excludeTpl) + var progIds = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0'], + + xmlRegExp = /^\s*<\?xml(\s)+version=[\'\"](\d)*.(\d)*[\'\"](\s)*\?>/im, + + bodyRegExp = /<body[^>]*>\s*([\s\S]+)\s*<\/body>/im, + + buildMap = [], + + templateSettings = { + evaluate : /<%([\s\S]+?)%>/g, + interpolate : /<%=([\s\S]+?)%>/g + }, + + /** + * JavaScript micro-templating, similar to John Resig's implementation. + * Underscore templating handles arbitrary delimiters, preserves whitespace, + * and correctly escapes quotes within interpolated code. + */ + template = function(str, data) { + var c = templateSettings; + var tmpl = 'var __p=[],print=function(){__p.push.apply(__p,arguments);};' + + 'with(obj||{}){__p.push(\'' + + str.replace(/\\/g, '\\\\') + .replace(/'/g, "\\'") + .replace(c.interpolate, function(match, code) { + return "'," + code.replace(/\\'/g, "'") + ",'"; + }) + .replace(c.evaluate || null, function(match, code) { + return "');" + code.replace(/\\'/g, "'") + .replace(/[\r\n\t]/g, ' ') + "; __p.push('"; + }) + .replace(/\r/g, '') + .replace(/\n/g, '') + .replace(/\t/g, '') + + "');}return __p.join('');"; + return tmpl; + + /** / + var func = new Function('obj', tmpl); + return data ? func(data) : func; + /**/ + }; +//>>excludeEnd('excludeTpl') + + define(function () { +//>>excludeStart('excludeTpl', pragmas.excludeTpl) + var tpl; + + var get, fs; + if (typeof window !== "undefined" && window.navigator && window.document) { + get = function (url, callback) { + + var xhr = tpl.createXhr(); + xhr.open('GET', url, true); + xhr.onreadystatechange = function (evt) { + //Do not explicitly handle errors, those should be + //visible via console output in the browser. + if (xhr.readyState === 4) { + callback(xhr.responseText); + } + }; + xhr.send(null); + }; + } else if (typeof process !== "undefined" && + process.versions && + !!process.versions.node) { + //Using special require.nodeRequire, something added by r.js. + fs = require.nodeRequire('fs'); + + get = function (url, callback) { + + callback(fs.readFileSync(url, 'utf8')); + }; + } + return tpl = { + version: '0.24.0', + strip: function (content) { + //Strips <?xml ...?> declarations so that external SVG and XML + //documents can be added to a document without worry. Also, if the string + //is an HTML document, only the part inside the body tag is returned. + if (content) { + content = content.replace(xmlRegExp, ""); + var matches = content.match(bodyRegExp); + if (matches) { + content = matches[1]; + } + } else { + content = ""; + } + + return content; + }, + + jsEscape: function (content) { + return content.replace(/(['\\])/g, '\\$1') + .replace(/[\f]/g, "\\f") + .replace(/[\b]/g, "\\b") + .replace(/[\n]/g, "") + .replace(/[\t]/g, "") + .replace(/[\r]/g, ""); + }, + + createXhr: function () { + //Would love to dump the ActiveX crap in here. Need IE 6 to die first. + var xhr, i, progId; + if (typeof XMLHttpRequest !== "undefined") { + return new XMLHttpRequest(); + } else { + for (i = 0; i < 3; i++) { + progId = progIds[i]; + try { + xhr = new ActiveXObject(progId); + } catch (e) {} + + if (xhr) { + progIds = [progId]; // so faster next time + break; + } + } + } + + if (!xhr) { + throw new Error("require.getXhr(): XMLHttpRequest not available"); + } + + return xhr; + }, + + get: get, + + load: function (name, req, onLoad, config) { + + //Name has format: some.module.filext!strip + //The strip part is optional. + //if strip is present, then that means only get the string contents + //inside a body tag in an HTML string. For XML/SVG content it means + //removing the <?xml ...?> declarations so the content can be inserted + //into the current doc without problems. + + var strip = false, url, index = name.indexOf("."), + modName = name.substring(0, index), + ext = name.substring(index + 1, name.length); + + index = ext.indexOf("!"); + + if (index !== -1) { + //Pull off the strip arg. + strip = ext.substring(index + 1, ext.length); + strip = strip === "strip"; + ext = ext.substring(0, index); + } + + //Load the tpl. + url = 'nameToUrl' in req ? req.nameToUrl(modName, "." + ext) : req.toUrl(modName + "." + ext); + + tpl.get(url, function (content) { + content = template(content); + + if(!config.isBuild) { + //if(typeof window !== "undefined" && window.navigator && window.document) { + content = new Function('obj', content); + } + content = strip ? tpl.strip(content) : content; + + if (config.isBuild && config.inlineText) { + buildMap[name] = content; + } + onLoad(content); + }); + + }, + + write: function (pluginName, moduleName, write) { + if (moduleName in buildMap) { + var content = tpl.jsEscape(buildMap[moduleName]); + write("define('" + pluginName + "!" + moduleName + + "', function() {return function(obj) { " + + content.replace(/(\\')/g, "'").replace(/(\\\\)/g, "\\")+ + "}});\n"); + } + } + }; +//>>excludeEnd('excludeTpl') + return function() {}; + }); +//>>excludeEnd('excludeTpl') +}()); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/underscore-string.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/underscore-string.js new file mode 100644 index 0000000000000000000000000000000000000000..d8a8c546d0a3bdfd02d67674d5301d46b4ca262d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/underscore-string.js @@ -0,0 +1,646 @@ +// Underscore.string +// (c) 2010 Esa-Matti Suuronen <esa-matti aet suuronen dot org> +// Underscore.string is freely distributable under the terms of the MIT license. +// Documentation: https://github.com/epeli/underscore.string +// Some code is borrowed from MooTools and Alexandru Marasteanu. +// Version '2.3.0' + +!function(root, String){ + 'use strict'; + + // Defining helper functions. + + var nativeTrim = String.prototype.trim; + var nativeTrimRight = String.prototype.trimRight; + var nativeTrimLeft = String.prototype.trimLeft; + + var parseNumber = function(source) { return source * 1 || 0; }; + + var strRepeat = function(str, qty){ + if (qty < 1) return ''; + var result = ''; + while (qty > 0) { + if (qty & 1) result += str; + qty >>= 1, str += str; + } + return result; + }; + + var slice = [].slice; + + var defaultToWhiteSpace = function(characters) { + if (characters == null) + return '\\s'; + else if (characters.source) + return characters.source; + else + return '[' + _s.escapeRegExp(characters) + ']'; + }; + + var escapeChars = { + lt: '<', + gt: '>', + quot: '"', + amp: '&', + apos: "'" + }; + + var reversedEscapeChars = {}; + for(var key in escapeChars) reversedEscapeChars[escapeChars[key]] = key; + reversedEscapeChars["'"] = '#39'; + + // sprintf() for JavaScript 0.7-beta1 + // http://www.diveintojavascript.com/projects/javascript-sprintf + // + // Copyright (c) Alexandru Marasteanu <alexaholic [at) gmail (dot] com> + // All rights reserved. + + var sprintf = (function() { + function get_type(variable) { + return Object.prototype.toString.call(variable).slice(8, -1).toLowerCase(); + } + + var str_repeat = strRepeat; + + var str_format = function() { + if (!str_format.cache.hasOwnProperty(arguments[0])) { + str_format.cache[arguments[0]] = str_format.parse(arguments[0]); + } + return str_format.format.call(null, str_format.cache[arguments[0]], arguments); + }; + + str_format.format = function(parse_tree, argv) { + var cursor = 1, tree_length = parse_tree.length, node_type = '', arg, output = [], i, k, match, pad, pad_character, pad_length; + for (i = 0; i < tree_length; i++) { + node_type = get_type(parse_tree[i]); + if (node_type === 'string') { + output.push(parse_tree[i]); + } + else if (node_type === 'array') { + match = parse_tree[i]; // convenience purposes only + if (match[2]) { // keyword argument + arg = argv[cursor]; + for (k = 0; k < match[2].length; k++) { + if (!arg.hasOwnProperty(match[2][k])) { + throw new Error(sprintf('[_.sprintf] property "%s" does not exist', match[2][k])); + } + arg = arg[match[2][k]]; + } + } else if (match[1]) { // positional argument (explicit) + arg = argv[match[1]]; + } + else { // positional argument (implicit) + arg = argv[cursor++]; + } + + if (/[^s]/.test(match[8]) && (get_type(arg) != 'number')) { + throw new Error(sprintf('[_.sprintf] expecting number but found %s', get_type(arg))); + } + switch (match[8]) { + case 'b': arg = arg.toString(2); break; + case 'c': arg = String.fromCharCode(arg); break; + case 'd': arg = parseInt(arg, 10); break; + case 'e': arg = match[7] ? arg.toExponential(match[7]) : arg.toExponential(); break; + case 'f': arg = match[7] ? parseFloat(arg).toFixed(match[7]) : parseFloat(arg); break; + case 'o': arg = arg.toString(8); break; + case 's': arg = ((arg = String(arg)) && match[7] ? arg.substring(0, match[7]) : arg); break; + case 'u': arg = Math.abs(arg); break; + case 'x': arg = arg.toString(16); break; + case 'X': arg = arg.toString(16).toUpperCase(); break; + } + arg = (/[def]/.test(match[8]) && match[3] && arg >= 0 ? '+'+ arg : arg); + pad_character = match[4] ? match[4] == '0' ? '0' : match[4].charAt(1) : ' '; + pad_length = match[6] - String(arg).length; + pad = match[6] ? str_repeat(pad_character, pad_length) : ''; + output.push(match[5] ? arg + pad : pad + arg); + } + } + return output.join(''); + }; + + str_format.cache = {}; + + str_format.parse = function(fmt) { + var _fmt = fmt, match = [], parse_tree = [], arg_names = 0; + while (_fmt) { + if ((match = /^[^\x25]+/.exec(_fmt)) !== null) { + parse_tree.push(match[0]); + } + else if ((match = /^\x25{2}/.exec(_fmt)) !== null) { + parse_tree.push('%'); + } + else if ((match = /^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosuxX])/.exec(_fmt)) !== null) { + if (match[2]) { + arg_names |= 1; + var field_list = [], replacement_field = match[2], field_match = []; + if ((field_match = /^([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) { + field_list.push(field_match[1]); + while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') { + if ((field_match = /^\.([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) { + field_list.push(field_match[1]); + } + else if ((field_match = /^\[(\d+)\]/.exec(replacement_field)) !== null) { + field_list.push(field_match[1]); + } + else { + throw new Error('[_.sprintf] huh?'); + } + } + } + else { + throw new Error('[_.sprintf] huh?'); + } + match[2] = field_list; + } + else { + arg_names |= 2; + } + if (arg_names === 3) { + throw new Error('[_.sprintf] mixing positional and named placeholders is not (yet) supported'); + } + parse_tree.push(match); + } + else { + throw new Error('[_.sprintf] huh?'); + } + _fmt = _fmt.substring(match[0].length); + } + return parse_tree; + }; + + return str_format; + })(); + + + + // Defining underscore.string + + var _s = { + + VERSION: '2.3.0', + + isBlank: function(str){ + if (str == null) str = ''; + return (/^\s*$/).test(str); + }, + + stripTags: function(str){ + if (str == null) return ''; + return String(str).replace(/<\/?[^>]+>/g, ''); + }, + + capitalize : function(str){ + str = str == null ? '' : String(str); + return str.charAt(0).toUpperCase() + str.slice(1); + }, + + chop: function(str, step){ + if (str == null) return []; + str = String(str); + step = ~~step; + return step > 0 ? str.match(new RegExp('.{1,' + step + '}', 'g')) : [str]; + }, + + clean: function(str){ + return _s.strip(str).replace(/\s+/g, ' '); + }, + + count: function(str, substr){ + if (str == null || substr == null) return 0; + + str = String(str); + substr = String(substr); + + var count = 0, + pos = 0, + length = substr.length; + + while (true) { + pos = str.indexOf(substr, pos); + if (pos === -1) break; + count++; + pos += length; + } + + return count; + }, + + chars: function(str) { + if (str == null) return []; + return String(str).split(''); + }, + + swapCase: function(str) { + if (str == null) return ''; + return String(str).replace(/\S/g, function(c){ + return c === c.toUpperCase() ? c.toLowerCase() : c.toUpperCase(); + }); + }, + + escapeHTML: function(str) { + if (str == null) return ''; + return String(str).replace(/[&<>"']/g, function(m){ return '&' + reversedEscapeChars[m] + ';'; }); + }, + + unescapeHTML: function(str) { + if (str == null) return ''; + return String(str).replace(/\&([^;]+);/g, function(entity, entityCode){ + var match; + + if (entityCode in escapeChars) { + return escapeChars[entityCode]; + } else if (match = entityCode.match(/^#x([\da-fA-F]+)$/)) { + return String.fromCharCode(parseInt(match[1], 16)); + } else if (match = entityCode.match(/^#(\d+)$/)) { + return String.fromCharCode(~~match[1]); + } else { + return entity; + } + }); + }, + + escapeRegExp: function(str){ + if (str == null) return ''; + return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1'); + }, + + splice: function(str, i, howmany, substr){ + var arr = _s.chars(str); + arr.splice(~~i, ~~howmany, substr); + return arr.join(''); + }, + + insert: function(str, i, substr){ + return _s.splice(str, i, 0, substr); + }, + + include: function(str, needle){ + if (needle === '') return true; + if (str == null) return false; + return String(str).indexOf(needle) !== -1; + }, + + join: function() { + var args = slice.call(arguments), + separator = args.shift(); + + if (separator == null) separator = ''; + + return args.join(separator); + }, + + lines: function(str) { + if (str == null) return []; + return String(str).split("\n"); + }, + + reverse: function(str){ + return _s.chars(str).reverse().join(''); + }, + + startsWith: function(str, starts){ + if (starts === '') return true; + if (str == null || starts == null) return false; + str = String(str); starts = String(starts); + return str.length >= starts.length && str.slice(0, starts.length) === starts; + }, + + endsWith: function(str, ends){ + if (ends === '') return true; + if (str == null || ends == null) return false; + str = String(str); ends = String(ends); + return str.length >= ends.length && str.slice(str.length - ends.length) === ends; + }, + + succ: function(str){ + if (str == null) return ''; + str = String(str); + return str.slice(0, -1) + String.fromCharCode(str.charCodeAt(str.length-1) + 1); + }, + + titleize: function(str){ + if (str == null) return ''; + return String(str).replace(/(?:^|\s)\S/g, function(c){ return c.toUpperCase(); }); + }, + + camelize: function(str){ + return _s.trim(str).replace(/[-_\s]+(.)?/g, function(match, c){ return c.toUpperCase(); }); + }, + + underscored: function(str){ + return _s.trim(str).replace(/([a-z\d])([A-Z]+)/g, '$1_$2').replace(/[-\s]+/g, '_').toLowerCase(); + }, + + dasherize: function(str){ + return _s.trim(str).replace(/([A-Z])/g, '-$1').replace(/[-_\s]+/g, '-').toLowerCase(); + }, + + classify: function(str){ + return _s.titleize(String(str).replace(/[\W_]/g, ' ')).replace(/\s/g, ''); + }, + + humanize: function(str){ + return _s.capitalize(_s.underscored(str).replace(/_id$/,'').replace(/_/g, ' ')); + }, + + trim: function(str, characters){ + if (str == null) return ''; + if (!characters && nativeTrim) return nativeTrim.call(str); + characters = defaultToWhiteSpace(characters); + return String(str).replace(new RegExp('\^' + characters + '+|' + characters + '+$', 'g'), ''); + }, + + ltrim: function(str, characters){ + if (str == null) return ''; + if (!characters && nativeTrimLeft) return nativeTrimLeft.call(str); + characters = defaultToWhiteSpace(characters); + return String(str).replace(new RegExp('^' + characters + '+'), ''); + }, + + rtrim: function(str, characters){ + if (str == null) return ''; + if (!characters && nativeTrimRight) return nativeTrimRight.call(str); + characters = defaultToWhiteSpace(characters); + return String(str).replace(new RegExp(characters + '+$'), ''); + }, + + truncate: function(str, length, truncateStr){ + if (str == null) return ''; + str = String(str); truncateStr = truncateStr || '...'; + length = ~~length; + return str.length > length ? str.slice(0, length) + truncateStr : str; + }, + + /** + * _s.prune: a more elegant version of truncate + * prune extra chars, never leaving a half-chopped word. + * @author github.com/rwz + */ + prune: function(str, length, pruneStr){ + if (str == null) return ''; + + str = String(str); length = ~~length; + pruneStr = pruneStr != null ? String(pruneStr) : '...'; + + if (str.length <= length) return str; + + var tmpl = function(c){ return c.toUpperCase() !== c.toLowerCase() ? 'A' : ' '; }, + template = str.slice(0, length+1).replace(/.(?=\W*\w*$)/g, tmpl); // 'Hello, world' -> 'HellAA AAAAA' + + if (template.slice(template.length-2).match(/\w\w/)) + template = template.replace(/\s*\S+$/, ''); + else + template = _s.rtrim(template.slice(0, template.length-1)); + + return (template+pruneStr).length > str.length ? str : str.slice(0, template.length)+pruneStr; + }, + + words: function(str, delimiter) { + if (_s.isBlank(str)) return []; + return _s.trim(str, delimiter).split(delimiter || /\s+/); + }, + + pad: function(str, length, padStr, type) { + str = str == null ? '' : String(str); + length = ~~length; + + var padlen = 0; + + if (!padStr) + padStr = ' '; + else if (padStr.length > 1) + padStr = padStr.charAt(0); + + switch(type) { + case 'right': + padlen = length - str.length; + return str + strRepeat(padStr, padlen); + case 'both': + padlen = length - str.length; + return strRepeat(padStr, Math.ceil(padlen/2)) + str + + strRepeat(padStr, Math.floor(padlen/2)); + default: // 'left' + padlen = length - str.length; + return strRepeat(padStr, padlen) + str; + } + }, + + lpad: function(str, length, padStr) { + return _s.pad(str, length, padStr); + }, + + rpad: function(str, length, padStr) { + return _s.pad(str, length, padStr, 'right'); + }, + + lrpad: function(str, length, padStr) { + return _s.pad(str, length, padStr, 'both'); + }, + + sprintf: sprintf, + + vsprintf: function(fmt, argv){ + argv.unshift(fmt); + return sprintf.apply(null, argv); + }, + + toNumber: function(str, decimals) { + if (!str) return 0; + str = _s.trim(str); + if (!str.match(/^-?\d+(?:\.\d+)?$/)) return NaN; + return parseNumber(parseNumber(str).toFixed(~~decimals)); + }, + + numberFormat : function(number, dec, dsep, tsep) { + if (isNaN(number) || number == null) return ''; + + number = number.toFixed(~~dec); + tsep = typeof tsep == 'string' ? tsep : ','; + + var parts = number.split('.'), fnums = parts[0], + decimals = parts[1] ? (dsep || '.') + parts[1] : ''; + + return fnums.replace(/(\d)(?=(?:\d{3})+$)/g, '$1' + tsep) + decimals; + }, + + strRight: function(str, sep){ + if (str == null) return ''; + str = String(str); sep = sep != null ? String(sep) : sep; + var pos = !sep ? -1 : str.indexOf(sep); + return ~pos ? str.slice(pos+sep.length, str.length) : str; + }, + + strRightBack: function(str, sep){ + if (str == null) return ''; + str = String(str); sep = sep != null ? String(sep) : sep; + var pos = !sep ? -1 : str.lastIndexOf(sep); + return ~pos ? str.slice(pos+sep.length, str.length) : str; + }, + + strLeft: function(str, sep){ + if (str == null) return ''; + str = String(str); sep = sep != null ? String(sep) : sep; + var pos = !sep ? -1 : str.indexOf(sep); + return ~pos ? str.slice(0, pos) : str; + }, + + strLeftBack: function(str, sep){ + if (str == null) return ''; + str += ''; sep = sep != null ? ''+sep : sep; + var pos = str.lastIndexOf(sep); + return ~pos ? str.slice(0, pos) : str; + }, + + toSentence: function(array, separator, lastSeparator, serial) { + separator = separator || ', ' + lastSeparator = lastSeparator || ' and ' + var a = array.slice(), lastMember = a.pop(); + + if (array.length > 2 && serial) lastSeparator = _s.rtrim(separator) + lastSeparator; + + return a.length ? a.join(separator) + lastSeparator + lastMember : lastMember; + }, + + toSentenceSerial: function() { + var args = slice.call(arguments); + args[3] = true; + return _s.toSentence.apply(_s, args); + }, + + slugify: function(str) { + if (str == null) return ''; + + var from = "ąà áäâãåæćęèéëêìÃïîłńòóöôõøśùúüûñçżź", + to = "aaaaaaaaceeeeeiiiilnoooooosuuuunczz", + regex = new RegExp(defaultToWhiteSpace(from), 'g'); + + str = String(str).toLowerCase().replace(regex, function(c){ + var index = from.indexOf(c); + return to.charAt(index) || '-'; + }); + + return _s.dasherize(str.replace(/[^\w\s-]/g, '')); + }, + + surround: function(str, wrapper) { + return [wrapper, str, wrapper].join(''); + }, + + quote: function(str) { + return _s.surround(str, '"'); + }, + + exports: function() { + var result = {}; + + for (var prop in this) { + if (!this.hasOwnProperty(prop) || prop.match(/^(?:include|contains|reverse)$/)) continue; + result[prop] = this[prop]; + } + + return result; + }, + + repeat: function(str, qty, separator){ + if (str == null) return ''; + + qty = ~~qty; + + // using faster implementation if separator is not needed; + if (separator == null) return strRepeat(String(str), qty); + + // this one is about 300x slower in Google Chrome + for (var repeat = []; qty > 0; repeat[--qty] = str) {} + return repeat.join(separator); + }, + + naturalCmp: function(str1, str2){ + if (str1 == str2) return 0; + if (!str1) return -1; + if (!str2) return 1; + + var cmpRegex = /(\.\d+)|(\d+)|(\D+)/g, + tokens1 = String(str1).toLowerCase().match(cmpRegex), + tokens2 = String(str2).toLowerCase().match(cmpRegex), + count = Math.min(tokens1.length, tokens2.length); + + for(var i = 0; i < count; i++) { + var a = tokens1[i], b = tokens2[i]; + + if (a !== b){ + var num1 = parseInt(a, 10); + if (!isNaN(num1)){ + var num2 = parseInt(b, 10); + if (!isNaN(num2) && num1 - num2) + return num1 - num2; + } + return a < b ? -1 : 1; + } + } + + if (tokens1.length === tokens2.length) + return tokens1.length - tokens2.length; + + return str1 < str2 ? -1 : 1; + }, + + levenshtein: function(str1, str2) { + if (str1 == null && str2 == null) return 0; + if (str1 == null) return String(str2).length; + if (str2 == null) return String(str1).length; + + str1 = String(str1); str2 = String(str2); + + var current = [], prev, value; + + for (var i = 0; i <= str2.length; i++) + for (var j = 0; j <= str1.length; j++) { + if (i && j) + if (str1.charAt(j - 1) === str2.charAt(i - 1)) + value = prev; + else + value = Math.min(current[j], current[j - 1], prev) + 1; + else + value = i + j; + + prev = current[j]; + current[j] = value; + } + + return current.pop(); + } + }; + + // Aliases + + _s.strip = _s.trim; + _s.lstrip = _s.ltrim; + _s.rstrip = _s.rtrim; + _s.center = _s.lrpad; + _s.rjust = _s.lpad; + _s.ljust = _s.rpad; + _s.contains = _s.include; + _s.q = _s.quote; + + // Exporting + + // CommonJS module is defined + if (typeof exports !== 'undefined') { + if (typeof module !== 'undefined' && module.exports) + module.exports = _s; + + exports._s = _s; + } + + // Register as a named module with AMD. + if (typeof define === 'function' && define.amd) + define('underscore.string', [], function(){ return _s; }); + + + // Integrate with Underscore.js if defined + // or create our own underscore object. + root._ = root._ || {}; + root._.string = root._.str = _s; +}(this, String); + + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/underscore.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/underscore.js new file mode 100644 index 0000000000000000000000000000000000000000..f6f7e2f23d11dfe9035c042c6af60deb23788ea1 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/lib/underscore.js @@ -0,0 +1,1059 @@ +// Underscore.js 1.3.3 +// (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc. +// Underscore is freely distributable under the MIT license. +// Portions of Underscore are inspired or borrowed from Prototype, +// Oliver Steele's Functional, and John Resig's Micro-Templating. +// For all details and documentation: +// http://documentcloud.github.com/underscore + +(function() { + + // Baseline setup + // -------------- + + // Establish the root object, `window` in the browser, or `global` on the server. + var root = this; + + // Save the previous value of the `_` variable. + var previousUnderscore = root._; + + // Establish the object that gets returned to break out of a loop iteration. + var breaker = {}; + + // Save bytes in the minified (but not gzipped) version: + var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype; + + // Create quick reference variables for speed access to core prototypes. + var slice = ArrayProto.slice, + unshift = ArrayProto.unshift, + toString = ObjProto.toString, + hasOwnProperty = ObjProto.hasOwnProperty; + + // All **ECMAScript 5** native function implementations that we hope to use + // are declared here. + var + nativeForEach = ArrayProto.forEach, + nativeMap = ArrayProto.map, + nativeReduce = ArrayProto.reduce, + nativeReduceRight = ArrayProto.reduceRight, + nativeFilter = ArrayProto.filter, + nativeEvery = ArrayProto.every, + nativeSome = ArrayProto.some, + nativeIndexOf = ArrayProto.indexOf, + nativeLastIndexOf = ArrayProto.lastIndexOf, + nativeIsArray = Array.isArray, + nativeKeys = Object.keys, + nativeBind = FuncProto.bind; + + // Create a safe reference to the Underscore object for use below. + var _ = function(obj) { return new wrapper(obj); }; + + // Export the Underscore object for **Node.js**, with + // backwards-compatibility for the old `require()` API. If we're in + // the browser, add `_` as a global object via a string identifier, + // for Closure Compiler "advanced" mode. + if (typeof exports !== 'undefined') { + if (typeof module !== 'undefined' && module.exports) { + exports = module.exports = _; + } + exports._ = _; + } else { + root['_'] = _; + } + + // Current version. + _.VERSION = '1.3.3'; + + // Collection Functions + // -------------------- + + // The cornerstone, an `each` implementation, aka `forEach`. + // Handles objects with the built-in `forEach`, arrays, and raw objects. + // Delegates to **ECMAScript 5**'s native `forEach` if available. + var each = _.each = _.forEach = function(obj, iterator, context) { + if (obj == null) return; + if (nativeForEach && obj.forEach === nativeForEach) { + obj.forEach(iterator, context); + } else if (obj.length === +obj.length) { + for (var i = 0, l = obj.length; i < l; i++) { + if (i in obj && iterator.call(context, obj[i], i, obj) === breaker) return; + } + } else { + for (var key in obj) { + if (_.has(obj, key)) { + if (iterator.call(context, obj[key], key, obj) === breaker) return; + } + } + } + }; + + // Return the results of applying the iterator to each element. + // Delegates to **ECMAScript 5**'s native `map` if available. + _.map = _.collect = function(obj, iterator, context) { + var results = []; + if (obj == null) return results; + if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context); + each(obj, function(value, index, list) { + results[results.length] = iterator.call(context, value, index, list); + }); + if (obj.length === +obj.length) results.length = obj.length; + return results; + }; + + // **Reduce** builds up a single result from a list of values, aka `inject`, + // or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available. + _.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) { + var initial = arguments.length > 2; + if (obj == null) obj = []; + if (nativeReduce && obj.reduce === nativeReduce) { + if (context) iterator = _.bind(iterator, context); + return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator); + } + each(obj, function(value, index, list) { + if (!initial) { + memo = value; + initial = true; + } else { + memo = iterator.call(context, memo, value, index, list); + } + }); + if (!initial) throw new TypeError('Reduce of empty array with no initial value'); + return memo; + }; + + // The right-associative version of reduce, also known as `foldr`. + // Delegates to **ECMAScript 5**'s native `reduceRight` if available. + _.reduceRight = _.foldr = function(obj, iterator, memo, context) { + var initial = arguments.length > 2; + if (obj == null) obj = []; + if (nativeReduceRight && obj.reduceRight === nativeReduceRight) { + if (context) iterator = _.bind(iterator, context); + return initial ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator); + } + var reversed = _.toArray(obj).reverse(); + if (context && !initial) iterator = _.bind(iterator, context); + return initial ? _.reduce(reversed, iterator, memo, context) : _.reduce(reversed, iterator); + }; + + // Return the first value which passes a truth test. Aliased as `detect`. + _.find = _.detect = function(obj, iterator, context) { + var result; + any(obj, function(value, index, list) { + if (iterator.call(context, value, index, list)) { + result = value; + return true; + } + }); + return result; + }; + + // Return all the elements that pass a truth test. + // Delegates to **ECMAScript 5**'s native `filter` if available. + // Aliased as `select`. + _.filter = _.select = function(obj, iterator, context) { + var results = []; + if (obj == null) return results; + if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context); + each(obj, function(value, index, list) { + if (iterator.call(context, value, index, list)) results[results.length] = value; + }); + return results; + }; + + // Return all the elements for which a truth test fails. + _.reject = function(obj, iterator, context) { + var results = []; + if (obj == null) return results; + each(obj, function(value, index, list) { + if (!iterator.call(context, value, index, list)) results[results.length] = value; + }); + return results; + }; + + // Determine whether all of the elements match a truth test. + // Delegates to **ECMAScript 5**'s native `every` if available. + // Aliased as `all`. + _.every = _.all = function(obj, iterator, context) { + var result = true; + if (obj == null) return result; + if (nativeEvery && obj.every === nativeEvery) return obj.every(iterator, context); + each(obj, function(value, index, list) { + if (!(result = result && iterator.call(context, value, index, list))) return breaker; + }); + return !!result; + }; + + // Determine if at least one element in the object matches a truth test. + // Delegates to **ECMAScript 5**'s native `some` if available. + // Aliased as `any`. + var any = _.some = _.any = function(obj, iterator, context) { + iterator || (iterator = _.identity); + var result = false; + if (obj == null) return result; + if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context); + each(obj, function(value, index, list) { + if (result || (result = iterator.call(context, value, index, list))) return breaker; + }); + return !!result; + }; + + // Determine if a given value is included in the array or object using `===`. + // Aliased as `contains`. + _.include = _.contains = function(obj, target) { + var found = false; + if (obj == null) return found; + if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1; + found = any(obj, function(value) { + return value === target; + }); + return found; + }; + + // Invoke a method (with arguments) on every item in a collection. + _.invoke = function(obj, method) { + var args = slice.call(arguments, 2); + return _.map(obj, function(value) { + return (_.isFunction(method) ? method || value : value[method]).apply(value, args); + }); + }; + + // Convenience version of a common use case of `map`: fetching a property. + _.pluck = function(obj, key) { + return _.map(obj, function(value){ return value[key]; }); + }; + + // Return the maximum element or (element-based computation). + _.max = function(obj, iterator, context) { + if (!iterator && _.isArray(obj) && obj[0] === +obj[0]) return Math.max.apply(Math, obj); + if (!iterator && _.isEmpty(obj)) return -Infinity; + var result = {computed : -Infinity}; + each(obj, function(value, index, list) { + var computed = iterator ? iterator.call(context, value, index, list) : value; + computed >= result.computed && (result = {value : value, computed : computed}); + }); + return result.value; + }; + + // Return the minimum element (or element-based computation). + _.min = function(obj, iterator, context) { + if (!iterator && _.isArray(obj) && obj[0] === +obj[0]) return Math.min.apply(Math, obj); + if (!iterator && _.isEmpty(obj)) return Infinity; + var result = {computed : Infinity}; + each(obj, function(value, index, list) { + var computed = iterator ? iterator.call(context, value, index, list) : value; + computed < result.computed && (result = {value : value, computed : computed}); + }); + return result.value; + }; + + // Shuffle an array. + _.shuffle = function(obj) { + var shuffled = [], rand; + each(obj, function(value, index, list) { + rand = Math.floor(Math.random() * (index + 1)); + shuffled[index] = shuffled[rand]; + shuffled[rand] = value; + }); + return shuffled; + }; + + // Sort the object's values by a criterion produced by an iterator. + _.sortBy = function(obj, val, context) { + var iterator = _.isFunction(val) ? val : function(obj) { return obj[val]; }; + return _.pluck(_.map(obj, function(value, index, list) { + return { + value : value, + criteria : iterator.call(context, value, index, list) + }; + }).sort(function(left, right) { + var a = left.criteria, b = right.criteria; + if (a === void 0) return 1; + if (b === void 0) return -1; + return a < b ? -1 : a > b ? 1 : 0; + }), 'value'); + }; + + // Groups the object's values by a criterion. Pass either a string attribute + // to group by, or a function that returns the criterion. + _.groupBy = function(obj, val) { + var result = {}; + var iterator = _.isFunction(val) ? val : function(obj) { return obj[val]; }; + each(obj, function(value, index) { + var key = iterator(value, index); + (result[key] || (result[key] = [])).push(value); + }); + return result; + }; + + // Use a comparator function to figure out at what index an object should + // be inserted so as to maintain order. Uses binary search. + _.sortedIndex = function(array, obj, iterator) { + iterator || (iterator = _.identity); + var low = 0, high = array.length; + while (low < high) { + var mid = (low + high) >> 1; + iterator(array[mid]) < iterator(obj) ? low = mid + 1 : high = mid; + } + return low; + }; + + // Safely convert anything iterable into a real, live array. + _.toArray = function(obj) { + if (!obj) return []; + if (_.isArray(obj)) return slice.call(obj); + if (_.isArguments(obj)) return slice.call(obj); + if (obj.toArray && _.isFunction(obj.toArray)) return obj.toArray(); + return _.values(obj); + }; + + // Return the number of elements in an object. + _.size = function(obj) { + return _.isArray(obj) ? obj.length : _.keys(obj).length; + }; + + // Array Functions + // --------------- + + // Get the first element of an array. Passing **n** will return the first N + // values in the array. Aliased as `head` and `take`. The **guard** check + // allows it to work with `_.map`. + _.first = _.head = _.take = function(array, n, guard) { + return (n != null) && !guard ? slice.call(array, 0, n) : array[0]; + }; + + // Returns everything but the last entry of the array. Especcialy useful on + // the arguments object. Passing **n** will return all the values in + // the array, excluding the last N. The **guard** check allows it to work with + // `_.map`. + _.initial = function(array, n, guard) { + return slice.call(array, 0, array.length - ((n == null) || guard ? 1 : n)); + }; + + // Get the last element of an array. Passing **n** will return the last N + // values in the array. The **guard** check allows it to work with `_.map`. + _.last = function(array, n, guard) { + if ((n != null) && !guard) { + return slice.call(array, Math.max(array.length - n, 0)); + } else { + return array[array.length - 1]; + } + }; + + // Returns everything but the first entry of the array. Aliased as `tail`. + // Especially useful on the arguments object. Passing an **index** will return + // the rest of the values in the array from that index onward. The **guard** + // check allows it to work with `_.map`. + _.rest = _.tail = function(array, index, guard) { + return slice.call(array, (index == null) || guard ? 1 : index); + }; + + // Trim out all falsy values from an array. + _.compact = function(array) { + return _.filter(array, function(value){ return !!value; }); + }; + + // Return a completely flattened version of an array. + _.flatten = function(array, shallow) { + return _.reduce(array, function(memo, value) { + if (_.isArray(value)) return memo.concat(shallow ? value : _.flatten(value)); + memo[memo.length] = value; + return memo; + }, []); + }; + + // Return a version of the array that does not contain the specified value(s). + _.without = function(array) { + return _.difference(array, slice.call(arguments, 1)); + }; + + // Produce a duplicate-free version of the array. If the array has already + // been sorted, you have the option of using a faster algorithm. + // Aliased as `unique`. + _.uniq = _.unique = function(array, isSorted, iterator) { + var initial = iterator ? _.map(array, iterator) : array; + var results = []; + // The `isSorted` flag is irrelevant if the array only contains two elements. + if (array.length < 3) isSorted = true; + _.reduce(initial, function (memo, value, index) { + if (isSorted ? _.last(memo) !== value || !memo.length : !_.include(memo, value)) { + memo.push(value); + results.push(array[index]); + } + return memo; + }, []); + return results; + }; + + // Produce an array that contains the union: each distinct element from all of + // the passed-in arrays. + _.union = function() { + return _.uniq(_.flatten(arguments, true)); + }; + + // Produce an array that contains every item shared between all the + // passed-in arrays. (Aliased as "intersect" for back-compat.) + _.intersection = _.intersect = function(array) { + var rest = slice.call(arguments, 1); + return _.filter(_.uniq(array), function(item) { + return _.every(rest, function(other) { + return _.indexOf(other, item) >= 0; + }); + }); + }; + + // Take the difference between one array and a number of other arrays. + // Only the elements present in just the first array will remain. + _.difference = function(array) { + var rest = _.flatten(slice.call(arguments, 1), true); + return _.filter(array, function(value){ return !_.include(rest, value); }); + }; + + // Zip together multiple lists into a single array -- elements that share + // an index go together. + _.zip = function() { + var args = slice.call(arguments); + var length = _.max(_.pluck(args, 'length')); + var results = new Array(length); + for (var i = 0; i < length; i++) results[i] = _.pluck(args, "" + i); + return results; + }; + + // If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE**), + // we need this function. Return the position of the first occurrence of an + // item in an array, or -1 if the item is not included in the array. + // Delegates to **ECMAScript 5**'s native `indexOf` if available. + // If the array is large and already in sort order, pass `true` + // for **isSorted** to use binary search. + _.indexOf = function(array, item, isSorted) { + if (array == null) return -1; + var i, l; + if (isSorted) { + i = _.sortedIndex(array, item); + return array[i] === item ? i : -1; + } + if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item); + for (i = 0, l = array.length; i < l; i++) if (i in array && array[i] === item) return i; + return -1; + }; + + // Delegates to **ECMAScript 5**'s native `lastIndexOf` if available. + _.lastIndexOf = function(array, item) { + if (array == null) return -1; + if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) return array.lastIndexOf(item); + var i = array.length; + while (i--) if (i in array && array[i] === item) return i; + return -1; + }; + + // Generate an integer Array containing an arithmetic progression. A port of + // the native Python `range()` function. See + // [the Python documentation](http://docs.python.org/library/functions.html#range). + _.range = function(start, stop, step) { + if (arguments.length <= 1) { + stop = start || 0; + start = 0; + } + step = arguments[2] || 1; + + var len = Math.max(Math.ceil((stop - start) / step), 0); + var idx = 0; + var range = new Array(len); + + while(idx < len) { + range[idx++] = start; + start += step; + } + + return range; + }; + + // Function (ahem) Functions + // ------------------ + + // Reusable constructor function for prototype setting. + var ctor = function(){}; + + // Create a function bound to a given object (assigning `this`, and arguments, + // optionally). Binding with arguments is also known as `curry`. + // Delegates to **ECMAScript 5**'s native `Function.bind` if available. + // We check for `func.bind` first, to fail fast when `func` is undefined. + _.bind = function bind(func, context) { + var bound, args; + if (func.bind === nativeBind && nativeBind) return nativeBind.apply(func, slice.call(arguments, 1)); + if (!_.isFunction(func)) throw new TypeError; + args = slice.call(arguments, 2); + return bound = function() { + if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments))); + ctor.prototype = func.prototype; + var self = new ctor; + var result = func.apply(self, args.concat(slice.call(arguments))); + if (Object(result) === result) return result; + return self; + }; + }; + + // Bind all of an object's methods to that object. Useful for ensuring that + // all callbacks defined on an object belong to it. + _.bindAll = function(obj) { + var funcs = slice.call(arguments, 1); + if (funcs.length == 0) funcs = _.functions(obj); + each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); }); + return obj; + }; + + // Memoize an expensive function by storing its results. + _.memoize = function(func, hasher) { + var memo = {}; + hasher || (hasher = _.identity); + return function() { + var key = hasher.apply(this, arguments); + return _.has(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments)); + }; + }; + + // Delays a function for the given number of milliseconds, and then calls + // it with the arguments supplied. + _.delay = function(func, wait) { + var args = slice.call(arguments, 2); + return setTimeout(function(){ return func.apply(null, args); }, wait); + }; + + // Defers a function, scheduling it to run after the current call stack has + // cleared. + _.defer = function(func) { + return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1))); + }; + + // Returns a function, that, when invoked, will only be triggered at most once + // during a given window of time. + _.throttle = function(func, wait) { + var context, args, timeout, throttling, more, result; + var whenDone = _.debounce(function(){ more = throttling = false; }, wait); + return function() { + context = this; args = arguments; + var later = function() { + timeout = null; + if (more) func.apply(context, args); + whenDone(); + }; + if (!timeout) timeout = setTimeout(later, wait); + if (throttling) { + more = true; + } else { + result = func.apply(context, args); + } + whenDone(); + throttling = true; + return result; + }; + }; + + // Returns a function, that, as long as it continues to be invoked, will not + // be triggered. The function will be called after it stops being called for + // N milliseconds. If `immediate` is passed, trigger the function on the + // leading edge, instead of the trailing. + _.debounce = function(func, wait, immediate) { + var timeout; + return function() { + var context = this, args = arguments; + var later = function() { + timeout = null; + if (!immediate) func.apply(context, args); + }; + if (immediate && !timeout) func.apply(context, args); + clearTimeout(timeout); + timeout = setTimeout(later, wait); + }; + }; + + // Returns a function that will be executed at most one time, no matter how + // often you call it. Useful for lazy initialization. + _.once = function(func) { + var ran = false, memo; + return function() { + if (ran) return memo; + ran = true; + return memo = func.apply(this, arguments); + }; + }; + + // Returns the first function passed as an argument to the second, + // allowing you to adjust arguments, run code before and after, and + // conditionally execute the original function. + _.wrap = function(func, wrapper) { + return function() { + var args = [func].concat(slice.call(arguments, 0)); + return wrapper.apply(this, args); + }; + }; + + // Returns a function that is the composition of a list of functions, each + // consuming the return value of the function that follows. + _.compose = function() { + var funcs = arguments; + return function() { + var args = arguments; + for (var i = funcs.length - 1; i >= 0; i--) { + args = [funcs[i].apply(this, args)]; + } + return args[0]; + }; + }; + + // Returns a function that will only be executed after being called N times. + _.after = function(times, func) { + if (times <= 0) return func(); + return function() { + if (--times < 1) { return func.apply(this, arguments); } + }; + }; + + // Object Functions + // ---------------- + + // Retrieve the names of an object's properties. + // Delegates to **ECMAScript 5**'s native `Object.keys` + _.keys = nativeKeys || function(obj) { + if (obj !== Object(obj)) throw new TypeError('Invalid object'); + var keys = []; + for (var key in obj) if (_.has(obj, key)) keys[keys.length] = key; + return keys; + }; + + // Retrieve the values of an object's properties. + _.values = function(obj) { + return _.map(obj, _.identity); + }; + + // Return a sorted list of the function names available on the object. + // Aliased as `methods` + _.functions = _.methods = function(obj) { + var names = []; + for (var key in obj) { + if (_.isFunction(obj[key])) names.push(key); + } + return names.sort(); + }; + + // Extend a given object with all the properties in passed-in object(s). + _.extend = function(obj) { + each(slice.call(arguments, 1), function(source) { + for (var prop in source) { + obj[prop] = source[prop]; + } + }); + return obj; + }; + + // Return a copy of the object only containing the whitelisted properties. + _.pick = function(obj) { + var result = {}; + each(_.flatten(slice.call(arguments, 1)), function(key) { + if (key in obj) result[key] = obj[key]; + }); + return result; + }; + + // Fill in a given object with default properties. + _.defaults = function(obj) { + each(slice.call(arguments, 1), function(source) { + for (var prop in source) { + if (obj[prop] == null) obj[prop] = source[prop]; + } + }); + return obj; + }; + + // Create a (shallow-cloned) duplicate of an object. + _.clone = function(obj) { + if (!_.isObject(obj)) return obj; + return _.isArray(obj) ? obj.slice() : _.extend({}, obj); + }; + + // Invokes interceptor with the obj, and then returns obj. + // The primary purpose of this method is to "tap into" a method chain, in + // order to perform operations on intermediate results within the chain. + _.tap = function(obj, interceptor) { + interceptor(obj); + return obj; + }; + + // Internal recursive comparison function. + function eq(a, b, stack) { + // Identical objects are equal. `0 === -0`, but they aren't identical. + // See the Harmony `egal` proposal: http://wiki.ecmascript.org/doku.php?id=harmony:egal. + if (a === b) return a !== 0 || 1 / a == 1 / b; + // A strict comparison is necessary because `null == undefined`. + if (a == null || b == null) return a === b; + // Unwrap any wrapped objects. + if (a._chain) a = a._wrapped; + if (b._chain) b = b._wrapped; + // Invoke a custom `isEqual` method if one is provided. + if (a.isEqual && _.isFunction(a.isEqual)) return a.isEqual(b); + if (b.isEqual && _.isFunction(b.isEqual)) return b.isEqual(a); + // Compare `[[Class]]` names. + var className = toString.call(a); + if (className != toString.call(b)) return false; + switch (className) { + // Strings, numbers, dates, and booleans are compared by value. + case '[object String]': + // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is + // equivalent to `new String("5")`. + return a == String(b); + case '[object Number]': + // `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for + // other numeric values. + return a != +a ? b != +b : (a == 0 ? 1 / a == 1 / b : a == +b); + case '[object Date]': + case '[object Boolean]': + // Coerce dates and booleans to numeric primitive values. Dates are compared by their + // millisecond representations. Note that invalid dates with millisecond representations + // of `NaN` are not equivalent. + return +a == +b; + // RegExps are compared by their source patterns and flags. + case '[object RegExp]': + return a.source == b.source && + a.global == b.global && + a.multiline == b.multiline && + a.ignoreCase == b.ignoreCase; + } + if (typeof a != 'object' || typeof b != 'object') return false; + // Assume equality for cyclic structures. The algorithm for detecting cyclic + // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`. + var length = stack.length; + while (length--) { + // Linear search. Performance is inversely proportional to the number of + // unique nested structures. + if (stack[length] == a) return true; + } + // Add the first object to the stack of traversed objects. + stack.push(a); + var size = 0, result = true; + // Recursively compare objects and arrays. + if (className == '[object Array]') { + // Compare array lengths to determine if a deep comparison is necessary. + size = a.length; + result = size == b.length; + if (result) { + // Deep compare the contents, ignoring non-numeric properties. + while (size--) { + // Ensure commutative equality for sparse arrays. + if (!(result = size in a == size in b && eq(a[size], b[size], stack))) break; + } + } + } else { + // Objects with different constructors are not equivalent. + if ('constructor' in a != 'constructor' in b || a.constructor != b.constructor) return false; + // Deep compare objects. + for (var key in a) { + if (_.has(a, key)) { + // Count the expected number of properties. + size++; + // Deep compare each member. + if (!(result = _.has(b, key) && eq(a[key], b[key], stack))) break; + } + } + // Ensure that both objects contain the same number of properties. + if (result) { + for (key in b) { + if (_.has(b, key) && !(size--)) break; + } + result = !size; + } + } + // Remove the first object from the stack of traversed objects. + stack.pop(); + return result; + } + + // Perform a deep comparison to check if two objects are equal. + _.isEqual = function(a, b) { + return eq(a, b, []); + }; + + // Is a given array, string, or object empty? + // An "empty" object has no enumerable own-properties. + _.isEmpty = function(obj) { + if (obj == null) return true; + if (_.isArray(obj) || _.isString(obj)) return obj.length === 0; + for (var key in obj) if (_.has(obj, key)) return false; + return true; + }; + + // Is a given value a DOM element? + _.isElement = function(obj) { + return !!(obj && obj.nodeType == 1); + }; + + // Is a given value an array? + // Delegates to ECMA5's native Array.isArray + _.isArray = nativeIsArray || function(obj) { + return toString.call(obj) == '[object Array]'; + }; + + // Is a given variable an object? + _.isObject = function(obj) { + return obj === Object(obj); + }; + + // Is a given variable an arguments object? + _.isArguments = function(obj) { + return toString.call(obj) == '[object Arguments]'; + }; + if (!_.isArguments(arguments)) { + _.isArguments = function(obj) { + return !!(obj && _.has(obj, 'callee')); + }; + } + + // Is a given value a function? + _.isFunction = function(obj) { + return toString.call(obj) == '[object Function]'; + }; + + // Is a given value a string? + _.isString = function(obj) { + return toString.call(obj) == '[object String]'; + }; + + // Is a given value a number? + _.isNumber = function(obj) { + return toString.call(obj) == '[object Number]'; + }; + + // Is a given object a finite number? + _.isFinite = function(obj) { + return _.isNumber(obj) && isFinite(obj); + }; + + // Is the given value `NaN`? + _.isNaN = function(obj) { + // `NaN` is the only value for which `===` is not reflexive. + return obj !== obj; + }; + + // Is a given value a boolean? + _.isBoolean = function(obj) { + return obj === true || obj === false || toString.call(obj) == '[object Boolean]'; + }; + + // Is a given value a date? + _.isDate = function(obj) { + return toString.call(obj) == '[object Date]'; + }; + + // Is the given value a regular expression? + _.isRegExp = function(obj) { + return toString.call(obj) == '[object RegExp]'; + }; + + // Is a given value equal to null? + _.isNull = function(obj) { + return obj === null; + }; + + // Is a given variable undefined? + _.isUndefined = function(obj) { + return obj === void 0; + }; + + // Has own property? + _.has = function(obj, key) { + return hasOwnProperty.call(obj, key); + }; + + // Utility Functions + // ----------------- + + // Run Underscore.js in *noConflict* mode, returning the `_` variable to its + // previous owner. Returns a reference to the Underscore object. + _.noConflict = function() { + root._ = previousUnderscore; + return this; + }; + + // Keep the identity function around for default iterators. + _.identity = function(value) { + return value; + }; + + // Run a function **n** times. + _.times = function (n, iterator, context) { + for (var i = 0; i < n; i++) iterator.call(context, i); + }; + + // Escape a string for HTML interpolation. + _.escape = function(string) { + return (''+string).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"').replace(/'/g, ''').replace(/\//g,'/'); + }; + + // If the value of the named property is a function then invoke it; + // otherwise, return it. + _.result = function(object, property) { + if (object == null) return null; + var value = object[property]; + return _.isFunction(value) ? value.call(object) : value; + }; + + // Add your own custom functions to the Underscore object, ensuring that + // they're correctly added to the OOP wrapper as well. + _.mixin = function(obj) { + each(_.functions(obj), function(name){ + addToWrapper(name, _[name] = obj[name]); + }); + }; + + // Generate a unique integer id (unique within the entire client session). + // Useful for temporary DOM ids. + var idCounter = 0; + _.uniqueId = function(prefix) { + var id = idCounter++; + return prefix ? prefix + id : id; + }; + + // By default, Underscore uses ERB-style template delimiters, change the + // following template settings to use alternative delimiters. + _.templateSettings = { + evaluate : /<%([\s\S]+?)%>/g, + interpolate : /<%=([\s\S]+?)%>/g, + escape : /<%-([\s\S]+?)%>/g + }; + + // When customizing `templateSettings`, if you don't want to define an + // interpolation, evaluation or escaping regex, we need one that is + // guaranteed not to match. + var noMatch = /.^/; + + // Certain characters need to be escaped so that they can be put into a + // string literal. + var escapes = { + '\\': '\\', + "'": "'", + 'r': '\r', + 'n': '\n', + 't': '\t', + 'u2028': '\u2028', + 'u2029': '\u2029' + }; + + for (var p in escapes) escapes[escapes[p]] = p; + var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g; + var unescaper = /\\(\\|'|r|n|t|u2028|u2029)/g; + + // Within an interpolation, evaluation, or escaping, remove HTML escaping + // that had been previously added. + var unescape = function(code) { + return code.replace(unescaper, function(match, escape) { + return escapes[escape]; + }); + }; + + // JavaScript micro-templating, similar to John Resig's implementation. + // Underscore templating handles arbitrary delimiters, preserves whitespace, + // and correctly escapes quotes within interpolated code. + _.template = function(text, data, settings) { + settings = _.defaults(settings || {}, _.templateSettings); + + // Compile the template source, taking care to escape characters that + // cannot be included in a string literal and then unescape them in code + // blocks. + var source = "__p+='" + text + .replace(escaper, function(match) { + return '\\' + escapes[match]; + }) + .replace(settings.escape || noMatch, function(match, code) { + return "'+\n_.escape(" + unescape(code) + ")+\n'"; + }) + .replace(settings.interpolate || noMatch, function(match, code) { + return "'+\n(" + unescape(code) + ")+\n'"; + }) + .replace(settings.evaluate || noMatch, function(match, code) { + return "';\n" + unescape(code) + "\n;__p+='"; + }) + "';\n"; + + // If a variable is not specified, place data values in local scope. + if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n'; + + source = "var __p='';" + + "var print=function(){__p+=Array.prototype.join.call(arguments, '')};\n" + + source + "return __p;\n"; + + var render = new Function(settings.variable || 'obj', '_', source); + if (data) return render(data, _); + var template = function(data) { + return render.call(this, data, _); + }; + + // Provide the compiled function source as a convenience for build time + // precompilation. + template.source = 'function(' + (settings.variable || 'obj') + '){\n' + + source + '}'; + + return template; + }; + + // Add a "chain" function, which will delegate to the wrapper. + _.chain = function(obj) { + return _(obj).chain(); + }; + + // The OOP Wrapper + // --------------- + + // If Underscore is called as a function, it returns a wrapped object that + // can be used OO-style. This wrapper holds altered versions of all the + // underscore functions. Wrapped objects may be chained. + var wrapper = function(obj) { this._wrapped = obj; }; + + // Expose `wrapper.prototype` as `_.prototype` + _.prototype = wrapper.prototype; + + // Helper function to continue chaining intermediate results. + var result = function(obj, chain) { + return chain ? _(obj).chain() : obj; + }; + + // A method to easily add functions to the OOP wrapper. + var addToWrapper = function(name, func) { + wrapper.prototype[name] = function() { + var args = slice.call(arguments); + unshift.call(args, this._wrapped); + return result(func.apply(_, args), this._chain); + }; + }; + + // Add all of the Underscore functions to the wrapper object. + _.mixin(_); + + // Add all mutator Array functions to the wrapper. + each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) { + var method = ArrayProto[name]; + wrapper.prototype[name] = function() { + var wrapped = this._wrapped; + method.apply(wrapped, arguments); + var length = wrapped.length; + if ((name == 'shift' || name == 'splice') && length === 0) delete wrapped[0]; + return result(wrapped, this._chain); + }; + }); + + // Add all accessor Array functions to the wrapper. + each(['concat', 'join', 'slice'], function(name) { + var method = ArrayProto[name]; + wrapper.prototype[name] = function() { + return result(method.apply(this._wrapped, arguments), this._chain); + }; + }); + + // Start chaining a wrapped Underscore object. + wrapper.prototype.chain = function() { + this._chain = true; + return this; + }; + + // Extracts the result from a wrapped and chained object. + wrapper.prototype.value = function() { + return this._wrapped; + }; + +}).call(this); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/main.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/main.js new file mode 100644 index 0000000000000000000000000000000000000000..038340e9dacd5b9f815cced6742bb51ae2f5accb --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/main.js @@ -0,0 +1,168 @@ + +require.config({ + + paths : { + underscore : 'lib/underscore', + backbone : 'lib/backbone', + marionette : 'lib/backbone.marionette', + jquery : 'lib/jquery.min', + bootstrap : 'lib/bootstrap.min', + modernizr : 'lib/modernizr', + tpl : 'lib/tpl', + i18n : 'lib/i18n' + }, + + locale: localStorage.locale || 'fr-fr', + + shim : { + 'lib/underscore-string' : ['underscore'], + 'lib/backbone-localStorage' : ['backbone'], + 'lib/bootstrap-contextmenu' : ['bootstrap'], + 'lib/bootstrap-typeahead' : ['bootstrap'], + 'lib/bootstrap-select' : ['bootstrap'], + 'lib/bootstrap-select2' : ['bootstrap'], + 'lib/jquery-input-ip-address-control' : ['jquery'], + 'lib/jquery.iframe-transport' : ['jquery'], + 'lib/jquery.fileupload' : ['jquery'], + underscore : { + exports : '_' + }, + 'lib/underscore-string': { + deps: ['underscore'], + init: function(_) { + _.mixin(_.str.exports()); + return _; + } + }, + backbone : { + exports : 'Backbone', + deps : ['jquery','underscore'] + }, + marionette : { + exports : 'Backbone.Marionette', + deps : ['backbone'] + }, + bootstrap: { + exports : 'jquery', + deps : ['jquery'] + }, + }, + + deps : ['jquery','underscore'] +}); + +require(['app','backbone','marionette','routers/index','controllers/index','views/ErrorView','templates','strings','helpers/util','lib/underscore-string','bootstrap','modernizr'], +function (app,Backbone,Marionette,Router,Controller,ErrorView,templates,strings,util){ + "use strict"; + + + /* Scroll to focused element if outside layout */ + $.fn.scrollToThis = function(){ + var x = window.scrollX, y = window.scrollY, offset; + if(this.css('display') == "none"){ + offset = this.parents('.view').offset().top; + } else { + try { + offset = this.offset().top; + } catch (e) { + console.log('error', e); + return; + } + } + if(offset != 0) + if(offset < y+80) { window.scrollTo(x, offset-80); } + else if(offset > $(window).height()+y-60) { window.scrollTo(x, offset-$(window).height()+60); } + }; + + $.fn.focusNscroll = function(){ + $(this).focus(); + $(this).scrollToThis(); + }; + + window.ErrorView = ErrorView; + + /* Browser detection patch */ + jQuery.browser = {}; + jQuery.browser.mozilla = /mozilla/.test(navigator.userAgent.toLowerCase()) && !/webkit/.test(navigator.userAgent.toLowerCase()); + jQuery.browser.webkit = /webkit/.test(navigator.userAgent.toLowerCase()); + jQuery.browser.opera = /opera/.test(navigator.userAgent.toLowerCase()); + jQuery.browser.msie = /msie/.test(navigator.userAgent.toLowerCase()); + + /* Persist Locale in localstorage */ + var locale = localStorage.getItem('locale'); + if(!locale || typeof locale === 'undefined') + localStorage.setItem('locale', 'fr-fr'); + + /* Load translated string */ + _.mixin(_.str.exports()); + + /* Translate Method */ + window.t = function(label){ + if(arguments.length > 1) { + arguments[0] = strings.genconfig[label]; + return _.sprintf.apply(_, arguments); + } + return strings.genconfig[label]; + }; + + /* Extend the data given to the templates */ + _.extend(Marionette.View.prototype, { + serializeData: function(){ + var data; + if (this.model) { + data = this.model.toJSON(); + data.id = this.model.id; + } else if (this.collection) + data = { items: this.collection.toJSON() }; + data = this.mixinTemplateHelpers(data); + data.t = t; + data.templates = templates; + return data; + }, + mixinTemplateHelpers: function(target){ + target = target || {}; + var templateHelpers = this.templateHelpers; + if (_.isFunction(templateHelpers)){ + templateHelpers = templateHelpers.call(this); + } + return _.extend(target, templateHelpers, util); + } + }); + + /* Override sync method for url_prefix */ + var sync = function(method, model, options){ + if (!options.url) { + options.url = app.config.path_prefix + _.result(model, 'url') || urlError(); + } else { + options.url = app.config.path_prefix + options.url; + } + if(!options.error){ + options.complete = function(){ alert('test'); }; + options.error = function(response){ + new ErrorView({ + model: new Backbone.Model(response) + }).render().$el.modal('show'); + }; + } + return Backbone.sync.call(this, method, model, options); + }; + _.extend(Backbone.Model.prototype, { sync: sync }); + _.extend(Backbone.Collection.prototype, { sync: sync }); + + /* Start Application */ + app.start(); + + /* Init router */ + app.router = new Router({ + controller : Controller + }); + + /* Global route helper method */ + Backbone.View.goTo = function(loc, callback) { + app.router.navigate(loc, true); + if(_.isFunction(callback)) callback(); + }; + + /* Remember navigation history */ + Backbone.history.start(); +}); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/models/Category.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/models/Category.js new file mode 100644 index 0000000000000000000000000000000000000000..f69c82aee30e9d422eb7d5102a9e338d7500a750 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/models/Category.js @@ -0,0 +1,39 @@ +define(['vent','marionette','templates','collections/Variables','models/Tag','collections/Tags','helpers/util'], +function(vent,Marionette,templates,Variables,Tag,Tags){ + 'use strict'; + + return Backbone.Model.extend({ + + defaults : { + name : 'Category Name', + help : "Click to configure variables in this category" // InfoBulle + }, + + initialize: function(){ + this.tags = new Tags([], { categoryid: this.id }); + this.on('change:tags',function() { this.tags.reset(this.get('tags')); }, this); + this.tags.on('reset',this.adoptAll, this); + this.tags.on('add',this.adoptOne, this); + this.tags.reset(this.get('tags')); + }, + + adoptAll:function() { + this.tags.each(this.adoptOne, this); + }, + + adoptOne:function(tag) { + tag.set('category', this, { silent: true }); + tag.set('categoryid', this.id, { silent: true}); + }, + + toJSON: function(){ + if(this._isSerializing) return this.id || this.cid; + this._isSerializing = true; + var json = _.extend(_.clone(this.attributes), { + //tags: this.tags.toJSON() + }); + this._isSerializing = false; + return json; + } + }); +}); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/models/Mode.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/models/Mode.js new file mode 100644 index 0000000000000000000000000000000000000000..3baa637a28955b55bbe892050364e1d4584b133d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/models/Mode.js @@ -0,0 +1,17 @@ +define(['vent','marionette','templates','helpers/util'], +function(vent,Marionette,templates,Modes){ + 'use strict'; + + return Backbone.Model.extend({ + + defaults : { + name : 'basic', + level : 0, + current : false + }, + + initialize: function() { + this.set('name', this.id); + } + }); +}); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/models/Tag.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/models/Tag.js new file mode 100644 index 0000000000000000000000000000000000000000..97347abe89061a8d519b9563accb0f5837f1e225 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/models/Tag.js @@ -0,0 +1,40 @@ +define(['vent','marionette','templates','collections/Variables','helpers/util'], +function(vent,Marionette,templates,Variables){ + 'use strict'; + + return Backbone.Model.extend({ + + defaults : { + id: 'Configuration', + help : "Click to configure variables in this category" // InfoBulle + }, + + initialize: function(){ + this.variables = new Variables([], { categoryid: this.id }); + this.on('change:variables', function(){ this.variables.reset(this.get('variables')); }, this); + this.variables.on('reset',this.adoptAll, this); + this.variables.on('add',this.adoptOne, this); + this.variables.reset(this.get('variables')); + }, + + adoptAll: function() { + this.variables.each(this.adoptOne, this); + }, + + adoptOne: function(variable) { + variable.set('tag', this); + variable.set('tagid', this.id); + }, + + toJSON: function(){ + if(this._isSerializing) return this.id || this.cid; + this._isSerializing = true; + var json = _.extend(_.clone(this.attributes), { + // variables: this.variables.toJSON(), + category: this.get('category').toJSON() + }); + this._isSerializing = false; + return json; + } + }); +}); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/models/User.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/models/User.js new file mode 100644 index 0000000000000000000000000000000000000000..c7b92e33d4948fc80c10944a1ceab8b2caf7dc82 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/models/User.js @@ -0,0 +1,23 @@ +define(['vent','marionette','templates','helpers/util'], +function(vent,Marionette,templates,Modes){ + 'use strict'; + + return Backbone.Model.extend({ + + urlRoot: '/user', + + defaults : { + name : 'dev user', + zephir : { + registered: false, + available : false, + server_id : null, + server_ip : null + } + }, + + initialize: function() { + this.set('name', this.id); + } + }); +}); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/models/Variable.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/models/Variable.js new file mode 100644 index 0000000000000000000000000000000000000000..b057ae1ff1a3751c961adff095ff37a19ecc44cf --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/models/Variable.js @@ -0,0 +1,110 @@ +define(['vent','collections/Variables'], +function(vent,Variables){ + 'use strict'; + + return Backbone.Model.extend({ + + urlRoot: '/variables', + + defaults: { + name: null, //'new_variable', + description: null, //'New Variable', + mandatory: false, + multi: false, + masters: [], + slaves: [], + editable: true, + value: null, + old_value: null, + new_value: null, + type: 'unicode', + open: false, + categoryid: null, + category: null, + tagid: null, + tag: null, + default_owner: true, // Valeur calculée, couleur différente + owner: null, //'anonymous', + help: '', // Infobulle + auto_freeze: false, // Valeur à définir une seule fois, + isSlave: false, + isMaster: false, + old_user: null, + new_user: null, + warning: null, + error: null, + mode: 'normal', + hidden: false, + groupid: null, + group: null, + index: null + }, + + initialize: function(options){ + this.options = options || {}; + if(typeof Variables === 'undefined') Variables = require('collections/Variables'); + this.slaves = new Variables([], { categoryid: this.get('categoryid') }); + this.masters = new Variables([], { categoryid: this.get('categoryid') }); + this.on('change:slaves',function() { this.slaves.reset(this.get('slaves')); }, this); + this.on('change:masters',function() { this.masters.reset(this.get('masters')); }, this); + this.slaves.on('reset',this.adoptAll, this); + this.masters.on('reset',this.adoptAll, this); + this.slaves.on('add',this.adoptOne, this); + this.masters.on('add',this.adoptOne, this); + this.slaves.reset(this.get('slaves')); + this.masters.reset(this.get('masters')); + if(this.get('open')){ + if(!_.contains(this.get('choices'),this.get('value')) && !(this.get('value') instanceof Array) && this.get('value') != null){ + var choices = _.clone(this.get('choices')); + choices.push(this.get('value')); + this.set('choices', choices); + } + } + this.on('change:tag', function() { + this.slaves.each(function(slave){ + slave.set('tag', this.get('tag')); + }, this); + this.masters.each(function(master){ + master.set('tag', this.get('tag')); + }, this); + }); + }, + + adoptAll:function() { + if(this.slaves.length) { + this.set('masterid', this.id); + this.slaves.each(this.adoptOne, this); + } + if(this.masters.length) { + this.masters.each(this.adoptOne, this); + } + }, + + adoptOne:function(model) { + model.set('categoryid', this.get('categoryid')); + model.set('category', this.get('category')); + model.set('tagid', this.get('tagid')); + model.set('tag', this.get('tag')); + model.set('group', this); + }, + + toJSON: function(){ + if(this._isSerializing) return this.id || this.cid; + this._isSerializing = true; + var json = _.extend(_.clone(this.attributes), { + //tag: this.get('tag').toJSON(), + //category: this.get('category').toJSON() + }); + this._isSerializing = false; + return json; + }, + + getType: function(){ + if(this.get('isSlave') || this.get('isMaster')) return this.get('type'); + //else if(this.slaves.length > 0) return 'group'; + else if(this.get('type') == 'group') return 'group'; + else if(this.get('multi')) return 'multi'; + else return this.get('type') + } + }); +}); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/nls/en-us/genconfig.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/nls/en-us/genconfig.js new file mode 100644 index 0000000000000000000000000000000000000000..0c0a07820f063dd4f0d1770185bc3333cfb4b039 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/nls/en-us/genconfig.js @@ -0,0 +1,93 @@ +define({ + welcome_to_genconfig: 'Welcome to <b><i class="icon-cogs"></i>GenConfig</b>', + init_text: "\ + You are in the setup wizard. You can enter and/or edit the main variables. \ + You can also import an existing configuration or change the mode to edit \ + some more advanced settings. \ + ", + home: "Home", + mode: "<b>%s</b> Mode", + basic : "Basic", + normal: "Normal", + expert: "Expert", + logged_as: 'Logged as <b>%s</b>', + english: 'English', + french: 'French', + + categories: 'Categories', + legend: 'Legend', + help: 'Help', + mandatory: 'Mandatory value', + mandatory_help: 'This value is required', + calculated: 'Calculated value', + calculated_help: 'This value is calculated', + auto_freeze: 'Auto-freeze value', + auto_freeze_help: "This value will freeze once the server is instanciated. You won't be able to edit it anymore", + frozen: 'Frozen value', + frozen_help: "This value is frozen, It can't be edited", + reset_to_default: "Reset to default value", + reset_to_previous: "Reset to previous value", + cancel_modifications: "Cancel modifications", + editable: 'Editable value', + uneditable: 'Uneditable value', + variable: '%s Variable', + no_value: 'No value', + hidden: 'Hidden', + debug: 'Debug', + on: 'On', + off: 'Off', + variable_value: 'Variable value', + default_value: 'Default value', + + configuration: 'Configuration', + file: 'File', + save: 'Save', + edit: 'Edit', + remove: 'Remove', + discard: 'Discard', + close: 'Close', + move_item: 'Move Item', + add_value: 'Add Value', + save_configuration: 'Save Configuration', + discard_changes: 'Reload/Discard Changes', + reload_configuration: 'Re-Synchronize GenConfig', + synchro_zephir: 'Sync with Zéphir', + default: 'Default', + loading: 'Loading', + error: 'Error', + reload: 'Reload', + download_config: 'Export Configuration', + upload_config: 'Import Configuration', + import_export: 'Import / Export', + config_wizard: 'Config Wizard', + changes: 'Changes', + back_to_edition: "Back to edition", + exit_confirm: "You are about to leave genconfig. All unsaved modifications will be lost. Are you sure you want to quit ?", + server_disconnected: "Server Disconnected", + quit_genconfig: "Quit GenConfig", + logout: "Logout", + + properties: "Properties", + actions: "Actions", + value_type: "Value type", + + fill_mandatories_header: 'Please fill the mandatory values', + save_modifications_header: 'Save your modifications ?', + diff_zephir_header: 'Which configuration shall be saved ?', + mandatory_make_sure: "Make sure you filled this variable correctly, the value(s) will be frozen after server instance. You wont be able to edit this variable anymore", + toggle_all: 'Toggle All', + save_config_success: 'Your changes has been successfully saved', + import_config_success: 'Your configuration "%s" has been imported', + discard_config_success: 'Your changes were successfully canceled', + discard_config_confirmation: 'Are you sure you want to discard all your modifications ?', + no_modifications: 'There is no changes to be saved', + old_user_value: 'Previous User/Value', + new_user_value: 'New User/Value', + local_value: 'Local configuration values (/etc/eole/config.eol)', + distant_value: 'Distant configuration values (Zéphir)', + already_exists: 'Value already exists', + override_distant_config_with_local: 'Override Zéphir configuration with local version', + override_local_config_with_distant: 'Override local configuration with Zéphir version', + disconnect_and_go_back_to_local_mode: 'Disconnect and go back to local mode', + no_differences_between_local_and_distant_config: 'No Difference between local and distant config' +}); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/nls/fr-fr/genconfig.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/nls/fr-fr/genconfig.js new file mode 100644 index 0000000000000000000000000000000000000000..0639371f923c3783fc456a20128e40e890facbee --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/nls/fr-fr/genconfig.js @@ -0,0 +1,95 @@ +define({ + welcome_to_genconfig: 'Bienvenue dans <b><i class="icon-cogs"></i>GenConfig</b>', + init_text: "Vous êtes dans l'assistant de configuration. \ + Vous pouvez saisir et/ou éditer les principales variables. \ + Vous avez également la possibilité d'importer un fichier de configuration \ + existant ou d'éditer la configuration de manière plus avancée en changeant le mode. \ + ", + home: "Accueil", + mode: "Mode <b>%s</b>", + basic : "Basique", + normal: "Normal", + expert: "Expert", + logged_as: 'Connecté comme <b>%s</b>', + english: 'Anglais', + french: 'Français', + + categories: 'Onglets', + legend: 'Légende', + help: 'Aide', + + mandatory: 'Valeur obligatoire', + mandatory_help: 'Cette valeur est obligatoire', + calculated: 'Valeur calculée', + calculated_help: 'Cette valeur est calculée', + auto_freeze: 'Valeur à verrouillage automatique', + auto_freeze_help: "Cette valeur sera verouillée une fois le serveur instancié, vous ne serez plus en mesure de la modifier", + frozen: 'Valeur verrouillée', + frozen_help: "Cette valeur est verrouillée, elle ne peut pas être modifiée", + reset_to_default: "Réinitialiser à la valeur par défaut", + reset_to_previous: "Réinitialiser à la valeur précédente", + cancel_modifications: "Annuler les modifications", + editable: 'Valeur modifiable', + uneditable: 'Valeur non-modifiable', + variable: 'Variable mode %s', + no_value: 'Pas de valeur', + hidden: 'Cachée', + debug: 'Debug', + on: 'Activé', + off: 'Désactivé', + variable_value: 'Valeur de la variable', + default_value: 'Valeur par défaut', + + configuration: 'Configuration', + file: 'Fichier', + save: 'Enregistrer', + edit: 'Modifier', + remove: 'Supprimer', + discard: 'Annuler', + close: 'Fermer', + move_item: 'Déplacer', + add_value: 'Ajouter', + save_configuration: 'Enregistrer la configuration', + discard_changes: 'Recharger/Annuler les modifications', + reload_configuration: 'Re-synchroniser la configuration', + synchro_zephir: 'Synchroniser avec Zéphir', + default: 'Defaut', + loading: 'Chargement', + error: 'Erreur', + reload: 'Recharger', + download_config: 'Exporter la Configuration', + upload_config: 'Importer une Configuration', + import_export: 'Importer / Exporter', + config_wizard: 'Assistant', + changes: 'Changements', + back_to_edition: "Rééditer", + exit_confirm: "Vous êtes sur le point de quitter genconfig. Toute modification non enregistrée sera perdue. Êtes vous sûr de vouloir quitter ?", + server_disconnected: "Serveur Déconnecté", + quit_genconfig: "Quitter GenConfig", + logout: "Déconnexion", + + properties: "Propriétés", + actions: "Actions", + value_type: "Type de valeur", + + fill_mandatories_header: 'Veuillez renseigner les valeurs obligatoires', + save_modifications_header: 'Enregistrer les modifications ?', + diff_zephir_header: 'Quelle configuration choisir ?', + discard_config_header: 'Annuler les modifications', + mandatory_make_sure: "Assurez-vous que cette variable soit correctement renseignée, vous ne serez plus en mesure de la modifier après instanciation du serveur", + toggle_all: 'Montrer/Cacher', + save_config_success: 'La configuration a bien été enregistrée', + import_config_success: 'La configuration "%s" a été importée', + discard_config_success: 'Les modifications ont étés annulées', + discard_config_confirmation: 'Êtes-vous sûr de vouloir supprimer toutes vos modifications ?', + no_modifications: 'Aucun changement à enregistrer', + old_user_value: 'Valeur précédente', + new_user_value: 'Nouvelle valeur', + local_value: 'Configuration locale (/etc/eole/config.eol)', + distant_value: 'Configuration distante (Zéphir)', + already_exists: 'La valeur existe déjà ', + override_distant_config_with_local: 'Écraser la configuration distante (Zéphir) maintenant avec la configuration locale', + override_local_config_with_distant: 'Écraser la configuration locale maintenant avec la configuration distante (Zéphir)', + disconnect_and_go_back_to_local_mode: 'Quitter la synchronisation Zéphir et se réauthentifier pour une édition locale', + no_differences_between_local_and_distant_config: 'Aucune différence entre la configuration locale et la configuration distante (Zéphir)' +}); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/nls/genconfig.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/nls/genconfig.js new file mode 100644 index 0000000000000000000000000000000000000000..962bc7d3aa4251198297961f60c0b8fd986524c6 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/nls/genconfig.js @@ -0,0 +1,101 @@ +define({ + "root": { + + welcome_to_genconfig: 'Welcome to <b><i class="icon-cogs"></i>GenConfig</b>', + init_text: "\ + The application was unable to find any configuration file on this machine \ + You can generate a basic configuration file filling the form below. You can \ + also import an existing configuration or change the mode to edit some more \ + advanced settings. \ + ", + home: "Home", + mode: "<b>%s</b> Mode", + basic : "Basic", + normal: "Normal", + expert: "Expert", + logged_as: 'Logged as <b>%s</b>', + english: 'English', + french: 'French', + + categories: 'Categories', + legend: 'Legend', + help: 'Help', + + mandatory: 'Mandatory', + mandatory_help: 'This value is required', + calculated: 'Calculated', + calculated_help: 'This value is calculated', + auto_freeze: 'Auto-freeze', + auto_freeze_help: "This value will freeze once the server is instanciated. You won't be able to edit it anymore", + frozen: 'Frozen', + frozen_help: "This value is frozen, It can't be edited", + reset_to_default: "Reset to default value", + reset_to_previous: "Reset to previous value", + cancel_modifications: "Cancel modifications", + editable: 'Editable', + uneditable: 'Uneditable', + variable: '%s Variable', + no_value: 'No value', + hidden: 'Hidden', + debug: 'Debug', + on: 'On', + off: 'Off', + variable_value: 'Variable value', + default_value: 'Default value', + + configuration: 'Configuration', + file: 'File', + save: 'Save', + edit: 'Edit', + remove: 'Remove', + discard: 'Discard', + close: 'Close', + move_item: 'Move Item', + add_value: 'Add Value', + save_configuration: 'Save Configuration', + discard_changes: 'Reload/Discard Changes', + reload_configuration: 'Re-Synchronize GenConfig', + synchro_zephir: 'Sync with Zéphir', + default: 'Default', + loading: 'Loading', + error: 'Error', + reload: 'Reload', + download_config: 'Export Configuration', + upload_config: 'Import Configuration', + import_export: 'Import / Export', + config_wizard: 'Config Wizard', + changes: "Changes", + back_to_edition: "Back to edition", + exit_confirm: "You are about to leave genconfig. All unsaved modifications will be lost. Are you sure you want to quit ?", + server_disconnected: "Server Disconnected", + quit_genconfig: "Quit GenConfig", + logout: "Logout", + + properties: "Properties", + actions: "Actions", + value_type: "Value type", + + fill_mandatories_header: 'Some values are required', + save_modifications_header: 'Save your modifications ?', + diff_zephir_header: 'Which configuration shall be saved ?', + discard_config_header: 'Discard Changes', + mandatory_make_sure: "Make sure you filled this variable correctly, the value(s) will be frozen after server instance. You wont be able to edit this variable anymore", + toggle_all: 'Toggle All', + save_config_success: 'Your changes has been successfully saved', + import_config_success: 'Your configuration "%s" has been imported', + discard_config_success: 'Your changes were successfully canceled', + discard_config_confirmation: 'Are you sure you want to discard all your modifications ?', + no_modifications: 'There is no changes to be saved', + old_user_value: 'Previous User/Value', + new_user_value: 'New User/Value', + local_value: 'Local configuration values (/etc/eole/config.eol)', + distant_value: 'Distant configuration values (Zéphir)', + already_exists: 'Value already exists', + override_distant_config_with_local: 'Override Zéphir configuration with local version', + override_local_config_with_distant: 'Override local configuration with Zéphir version', + disconnect_and_go_back_to_local_mode: 'Disconnect and go back to local mode', + no_differences_between_local_and_distant_config: 'No Differences between local and distant config' + }, + "en-us": true, + "fr-fr": true +}); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/routers/index.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/routers/index.js new file mode 100644 index 0000000000000000000000000000000000000000..2f5a6f1c3dbf8bbc24e66469695a5e07a03d49cd --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/routers/index.js @@ -0,0 +1,18 @@ +define(['marionette'],function(Marionette) { + 'use strict'; + + return Marionette.AppRouter.extend({ + appRoutes: { + 'categories/:id' : 'showCategory', + 'variables/:id/edit' : 'editVariable', + 'modes/:id' : 'setMode', + 'variables/:id/addValue' : 'addValue', + 'validateConfig' : 'validateConfig', + 'saveConfig' : 'saveConfig', + 'discardConfig' : 'discardConfig', + 'downloadConfig' : 'downloadConfig', + 'uploadConfig' : 'uploadConfig', + 'set/locale/:locale' : 'setLocale' + } + }); +}); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/spec/SpecHelper.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/spec/SpecHelper.js new file mode 100644 index 0000000000000000000000000000000000000000..e9b8284d654d6076aea5ab0e783d6c045fad75a0 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/spec/SpecHelper.js @@ -0,0 +1,9 @@ +beforeEach(function() { + this.addMatchers({ + toBePlaying: function(expectedSong) { + var player = this.actual; + return player.currentlyPlayingSong === expectedSong && + player.isPlaying; + } + }); +}); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/spec/models/CategorySpec.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/spec/models/CategorySpec.js new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/spec/views/SidebarSpec.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/spec/views/SidebarSpec.js new file mode 100644 index 0000000000000000000000000000000000000000..5b3d1c9e5250104d57e7252afb422710b4c8784a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/spec/views/SidebarSpec.js @@ -0,0 +1,42 @@ +describe('View :: Sidebar', function() { + + beforeEach(function() { + var flag = false, + that = this; + + require(['models/Category', 'collections/Categories', 'views/Sidebar'], function(Category, Categories, Sidebar) { + that.categories = new Categories([]); + that.view = new Sidebar({categories: that.categories}); + that.mockData = { name: 'category1', help: 'Foo help', timestamp: new Date().getTime() }; + that.mockData2 = { name: 'category2', help: 'Bar help', timestamp: new Date().getTime() }; + $('#sandbox').html(that.view.render().el); + flag = true; + }); + + waitsFor(function() { + return flag; + }); + + }); + + afterEach(function() { + this.view.remove(); + }); + + describe('Renders Category', function() { + + it('should be empty', function() { + expect(this.view.ui.nav.children(':not(.nav-header)').length).toEqual(0); + }); + + it('should re-render on reset', function() { + this.categories.reset([this.mockData]); + expect(this.view.ui.nav.children(':not(.nav-header)').length).toEqual(1); +console.log(this.view.ui.nav); + + this.categories.reset([this.mockData,this.mockData2]); + expect(this.view.ui.nav.children(':not(.nav-header)').length).toEqual(2); +console.log(this.view.ui.nav); + }); + }); +}); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/strings.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/strings.js new file mode 100644 index 0000000000000000000000000000000000000000..8d509b9ff44e452384a804daccd7feadd615c9c3 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/strings.js @@ -0,0 +1,8 @@ +define(['i18n!nls/genconfig'],function(genconfig){ + "use strict"; + + return { + genconfig: genconfig + }; +}); + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates.js new file mode 100644 index 0000000000000000000000000000000000000000..aeeadfe715fbeb21fc51d612621b662095052e7a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates.js @@ -0,0 +1,34 @@ +define(function(require){ + "use strict"; + + return { + header : require('tpl!templates/header.tmpl'), + body : require('tpl!templates/body.tmpl'), + footer : require('tpl!templates/footer.tmpl'), + sidebar : require('tpl!templates/sidebar.tmpl'), + main : require('tpl!templates/main.tmpl'), + initView : require('tpl!templates/initView.tmpl'), + modesView : require('tpl!templates/modesView.tmpl'), + modeItemView : require('tpl!templates/modeItemView.tmpl'), + categoryItemView : require('tpl!templates/categoryItemView.tmpl'), + tagView : require('tpl!templates/tagView.tmpl'), + variableView : require('tpl!templates/variableView.tmpl'), + variableRowView : require('tpl!templates/variableRowView.tmpl'), + variableItemView : require('tpl!templates/variableItemView.tmpl'), + variableItemEditView : require('tpl!templates/variableItemEditView.tmpl'), + variableMultiView : require('tpl!templates/variableMultiView.tmpl'), + variableMultiEditView : require('tpl!templates/variableMultiEditView.tmpl'), + variableGroupView : require('tpl!templates/variableGroupView.tmpl'), + variableMasterView : require('tpl!templates/variableMasterView.tmpl'), + separatorView : require('tpl!templates/separatorView.tmpl'), + loadingMessageView : require('tpl!templates/loadingMessageView.tmpl'), + fillMandatoriesView : require('tpl!templates/fillMandatoriesView.tmpl'), + diffVariablesView : require('tpl!templates/diffVariablesView.tmpl'), + diffVariableView : require('tpl!templates/diffVariableView.tmpl'), + emptyDiffView : require('tpl!templates/emptyDiffView.tmpl'), + discardConfigView : require('tpl!templates/discardConfigView.tmpl'), + errorView : require('tpl!templates/errorView.tmpl'), + legend : require('tpl!templates/legend.tmpl') + }; +}); + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/body.tmpl b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/body.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..77c018ae610441476191723b0a7c2a215b243a5a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/body.tmpl @@ -0,0 +1,2 @@ +<div id="sidebar" class="nav-collapse collapse"></div> +<div id="main-content"></div> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/categoryItemView.tmpl b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/categoryItemView.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..e63bc8b0274fe5788af3b99584ff7215192cb854 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/categoryItemView.tmpl @@ -0,0 +1,5 @@ +<a id="categorie-<%= id %>" href="<%= url() %>" rel="tooltip" data-placement="right" data-toggle="tooltip" title="<%= help ? _.escape(help) : '' %>"> + <span class="icon-box"><i class="<%= categoryIcon() %>"></i></span> + <span class="hidden-toggle"><%= description %></span> + <!--<span class="badge badge-<%= getMode() == 'E' ? 'important' : getMode() == 'B' ? 'success' : 'normal' %>"><%= getMode() %></span>--> +</a> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/diffVariableView.tmpl b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/diffVariableView.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..0cfbb77c50250e975887643c874b20606b3d799f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/diffVariableView.tmpl @@ -0,0 +1,74 @@ +<tr> + <% if((editable && auto_freeze) || warning){ %> + <td class="diff alert alert-warning" colspan="5"> + <% } else { %> + <td class="diff" colspan="5"> + <% } %> + + <ul class="breadcrumb tag <%= mode %> <%= hidden ? 'is_hidden' : '' %> clearfix"> + <li> + <a href="#"><i class="<%= categoryIcon() %>"></i> <%= categoryid.capitalize() %></a> + </li> + <li class="divider"><span class="divider"> </span> + </li> + <li class="tag <%= mode %> <%= hidden ? 'is_hidden' : '' %> text-<%= getMode() == 'E' ? 'error' : getMode() == 'B' ? 'success' : 'normal' %>"> + <span class="badge badge-<%= getMode() == 'E' ? 'important' : getMode() == 'B' ? 'success' : 'normal' %>"> + <%= getMode() %> + </span> + <%= description %> + <% if(debug){ %> + <code><%= id %></code> + <% } %> + </li><li class="divider"> + <span class="divider-last"> </span> + </li> + </ul> + <% if(editable && auto_freeze){ %> + <div class="well well-tiny"><i class="icon-warning-sign"></i> <%= t('mandatory_make_sure') %></div> + <% } %> + <% if(warning){ %> + <div class="well well-tiny"><i class="icon-warning-sign"></i> <%= warning %></div> + <% } %> + </td> +</tr> +<tr> + <td class="<% if((editable && auto_freeze) || warning){ %>alert alert-warning<% } %>"> + <% if(_.isArray(old_user)){ %> + <% _.each(old_user, function(v){ %> + <span class="badge"><i class="icon-user"></i> <%= v ? v : t('default') %></span> + <% }) %> + <% } else { %> + <span class="badge"><i class="icon-user"></i> <%= old_user ? old_user : t('default') %></span> + <% } %> + </td> + <td class="<% if((editable && auto_freeze) || warning){ %>alert alert-warning<% } %>"> + <% if(_.isArray(old_value)){ %> + <% _.each(old_value, function(v){ %> + <span class="label label-<%= v ? 'inverse' : 'default' %>"><%= v ? v : t('no_value') %></span> + <% }) %> + <% } else { %> + <span class="label label-<%= old_value ? 'inverse' : 'default' %>"><%= old_value ? old_value : t('no_value') %></span> + <% } %> + </td> + <td class="arrow-td"> + <i class="icon-arrow-right"></i> + </td> + <td class="<% if((editable && auto_freeze) || warning){ %>alert alert-warning<% } %>"> + <% if(_.isArray(new_user)){ %> + <% _.each(new_user, function(v){ %> + <span class="badge badge-info"><i class="icon-user"></i> <%= v ? v : t('default') %></span> + <% }) %> + <% } else { %> + <span class="badge badge-info"><i class="icon-user"></i> <%= new_user ? new_user : t('default') %></span> + <% } %> + </td> + <td class="<% if((editable && auto_freeze) || warning){ %>alert alert-warning<% } %>"> + <% if(_.isArray(new_value)){ %> + <% _.each(new_value, function(v){ %> + <span class="label label-<%= v ? 'success' : 'default' %>"><%= v !== null && v !== "undefined" ? v : t('no_value') %></span> + <% }) %> + <% } else { %> + <span class="label label-<%= new_value ? 'success' : 'default' %>"><%= new_value !== null && new_value !== "undefined" ? new_value : t('no_value') %></span> + <% } %> + </td> +</tr> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/diffVariablesView.tmpl b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/diffVariablesView.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..587a3b1ea54ae36124efa3416033ce4c2796216d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/diffVariablesView.tmpl @@ -0,0 +1,82 @@ +<div class="row-fluid"> + <div class="span12"> + <h3 class="page-title"> + <% if(zephir.sync){ %> + <i class="icon-random"></i> <%= t('diff_zephir_header') %> + <% } else { %> + <i class="icon-hdd"></i> <%= t('save_modifications_header') %> + <% } %> + </h3> + </div> +</div> + +<% if(config.version != '' && config.version != config.eole.release){ %> + <div class="alert alert-info"> + La configuration actuelle a été importée depuis un fichier en version <%= config.version %>. + Afin de mettre à jour le fichier <code>config.eol</code>, vous devez enregistrer la configuration actuelle. + </div> +<% } %> + +<div id="page"> + <div class="span12"> + <div class="widget"> + <div class="widget-title"> + <h4><%= t("changes") %></h4> + </div> + <div class="widget-body"> + <table class="table table-diff"> + <thead> + <tr> + <th colspan="3"> + <% if(zephir.sync){ %> + <%= t('local_value') %> + <% } else { %> + <%= t('old_user_value') %> + <% } %> + </th> + <th colspan="2"> + <% if(zephir.sync){ %> + <%= t('distant_value') %> + <% } else { %> + <%= t('new_user_value') %> + <% } %> + </th> + </tr> + </thead> + <tbody> + + </tbody> + <% if(zephir.sync){ %> + <tfoot class="form-actions"> + <tr> + <td colspan="2"> + <a id="local-config" href="#localConfig" class="input-block-level btn btn-danger localConfig"><i class="icon-upload"></i> <%= t('override_distant_config_with_local') %></a> + </td> + <td colspan="1"> + <i class="icon-resize-horizontal"></i> + </td> + <td colspan="2"> + <a id="distant-config" href="#distantConfig" class="input-block-level btn btn-info distantConfig"><i class="icon-download"></i> <%= t('override_local_config_with_distant') %></a> + </td> + </tr> + <tr> + <td colspan="5"> + <a id="diff-logout" href="<%= path_prefix %>/logout?return_url=<%= app_location %><%= path_prefix %>/<%= application_mode ? "%3Fapplication" : "" %>" class="input-block-level btn btn-default logout"><i class="icon-signout"></i> <%= t('disconnect_and_go_back_to_local_mode') %></a> + </td> + </tr> + </tfoot> + <% } %> + </table> + </div> + </div> + </div> + <% if(!zephir.sync){ %> + <div class="form-actions"> + <div class="pull-right"> + <a id="back-to-config" href="#backConfig" class="btn backConfig"><i class="icon-arrow-left"></i> <%= t('back_to_edition') %></a> + <a id="discard-config-changes" href="#discardConfig" class="btn discard discardConfig"><i class="icon-remove"></i> <%= t('discard_changes') %></a> + <a id="confirm-save-config" href="#saveConfig" class="btn btn-primary saveConfig" data-loading-text="<i class='icon-spinner icon-spin'></i> <%= t('save_configuration') %>"><i class="icon-ok"></i> <%= t('save_configuration') %></a> + </div> + </div> + <% } %> +</div> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/discardConfigView.tmpl b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/discardConfigView.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..dbfea6bb41385624bc0f235fa4c4051f8330ff4e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/discardConfigView.tmpl @@ -0,0 +1,13 @@ +<div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h3><%= t('discard_config_header') %></h3> +</div> +<div class="modal-body"> + <p> + <%= t('discard_config_confirmation') %> + </p> +</div> +<div class="modal-footer"> + <a href="#close" class="btn closeModal"><i class="icon-remove"></i> <%= t('close') %></a> + <a href="#discardConfig" class="btn btn-primary discardConfig"><i class="icon-undo"></i> <%= t('discard_changes') %></a> +</div> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/emptyDiffView.tmpl b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/emptyDiffView.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..59903ffe79b79bbc8b766d4c2799112181e88692 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/emptyDiffView.tmpl @@ -0,0 +1,11 @@ +<td colspan="4"> + <div class="hero-unit"> + <% if(zephir.sync){ %> + <p><%= t('no_differences_between_local_and_distant_config') %></p> + <% } else if(config.version != '' && config.eole.release != config.version) { %> + <p>Fichier importé sans modification apparente dans la configuration. Cliquez sur enregistrer pour mettre à jour le fichier de configuration. + <% } else { %> + <p><%= t('no_modifications') %></p> + <% } %> + </div> +</td> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/errorView.tmpl b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/errorView.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..3306158665af8a051ea72e5dade02df962721f26 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/errorView.tmpl @@ -0,0 +1,14 @@ +<div class="modal-header"> + <button id="error-close-btn" type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h3 class="text-error"><%= t('error') %> - <%= status %> - <%= statusText %></h3> +</div> +<div class="modal-body"> + <%= responseText %> + <% if (status == 0){ %> + <%= t('server_disconnected') %> + <% } %> +</div> +<div class="modal-footer"> + <a id="error-close" href="#closeDialog" class="btn discard closeDialog"><i class="icon-remove"></i> <%= t('close') %></a> + <a id="error-reload" href="#reload" class="btn btn-primary reload"><i class="icon-refresh"></i> <%= t('reload') %></a> +</div> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/fillMandatoriesView.tmpl b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/fillMandatoriesView.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..2943492a7cd5cdb6fd24e3c9714feaf221a97b93 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/fillMandatoriesView.tmpl @@ -0,0 +1,28 @@ +<div class="row-fluid"> + <div class="span12"> + <h3 class="page-title"><i class="icon-magic"></i> <%= t('fill_mandatories_header') %> </h3> + </div> +</div> + +<div id="page"> + <div class="span12"> + <div class="widget"> + <div class="widget-title"> + <h4><%= t("mandatory") %></h4> + </div> + <div class="widget-body"> + <table class="table table-bordered table-striped"> + <tbody> + + </tbody> + </table> + </div> + </div> + </div> + <div class="form-actions"> + <div class="pull-right"> + <a id="fill-mantatories-back" href="#back" class="btn backToCategory"><i class="icon-remove"></i> <%= t('close') %></a> + <a id="fill-mandatories-validate" href="#validate" class="btn btn-primary validate"><i class="icon-ok"></i> <%= t('save_configuration') %></a> + </div> + </div> +</div> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/footer.tmpl b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/footer.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..5f12232cf11bae4fb116704782c9c815b1256ef4 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/footer.tmpl @@ -0,0 +1 @@ +Powered By EOLE diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/header.tmpl b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/header.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..128556e18cfbd565db5450620b57a5dfc20abd3e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/header.tmpl @@ -0,0 +1,106 @@ + <div class="container-fluid"> + <button id="collapse-button" type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"> + <i class="icon-th-list"></i> + <span class="hidden-phone"><%= t('categories') %></span> + </button> + <a id="home" class="brand" href="#"> + <i class="icon-cogs"></i> + <span class="hidden-phone-portrait"><%= title %></span> + </a> + <div class="nav notify-row" id="top_menu"> + <ul class="nav top-menu"> + <li class="dropdown"> + <a id="file-dropdown" data-toggle="dropdown" class="dropdown-toggle navbar-link" href="#"><i class="icon-file-text"></i> + <span class="hidden-phone"><%= t('file') %></span></a> + <ul class="dropdown-menu extended"> + <li><a id="validate-config" href="#validateConfig" class="validateConfig"><i class="icon-hdd"></i> <%= t('save_configuration') %></a></li> + <li><a id="discard-config" href="#discardConfig" class="discardConfig"><i class="icon-undo"></i> <%= t('discard_changes') %></a></li> + <li><a id="reload-config" href="#reloadConfig" class="reloadConfig"><i class="icon-refresh"></i> <%= t('reload_configuration') %></a></li> + <% if(zephir.available){ %> + <li class="divider"></li> + <li><a id="zephir-config" href="#zephirConfig" class="zephirConfig"><i class="icon-random"></i> <%= t('synchro_zephir') %></a></li> + <% } %> + <li class="divider"></li> + <li><a id="download-config" href="#downloadConfig" class="downloadConfig"><i class="icon-download-alt"></i> <%= t('download_config') %></a></li> + <li><a id="upload-config" href="#uploadConfig" class="uploadConfig"> + <i class="icon-upload-alt"></i> <%= t('upload_config') %> + <input type="file" name="file" id="fileUpload"> + </a></li> + <% if(application_mode){ %> + <li class="divider"></li> + <li><a id="quit-genconfig" href="#quitGenConfig" class="quitGenConfig"><i class="icon-signout"></i> <%= t('quit_genconfig') %></a></li> + <% } %> + </ul> + </li> + <li class="dropdown"> + <a id="help-dropdown" data-toggle="dropdown" class="dropdown-toggle navbar-link" href="#"><i class="icon-question"></i> + <span class="hidden-phone"><%= t('help') %></span></a> + <ul class="dropdown-menu extended"> + <li><a id="wizard-mode" href="#wizard" class="wizard"><i class="icon-magic"></i> <%= t('config_wizard') %></a></li> + <li><a id="legend" href="#legend" class="legend"><i class="icon-th-list"></i> <%= t('legend') %></a></li> + </ul> + </li> + </ul> + </div><!--/.nav-collapse --> + <div class="top-nav "> + <ul class="nav pull-right top-menu"> + <% if(!zephir_mode){ %> + <% if(zephir.registered) { %> + <li class="dropdown mtop5"> + <% if(zephir.available){ %> + <a id="sync-mode-dropdown" data-toggle="dropdown" class="dropdown-toggle navbar-link" href="#"><i class="icon-retweet"></i> + <span class="hidden-phone">Mode Synchronisé</span> + </a> + <ul class="dropdown-menu extended"> + <li class="nav-header">Synchronisation Zéphir</li> + <li> + <div class="alert alert-info"> + <strong>ID:</strong> <%= zephir.server_id %><br/> + <strong>Adresse :</strong> <%= zephir.server_ip %> + </div> + </li> + </ul> + <% } else { %> + <a id="sync-mode-dropdown" data-toggle="dropdown" class="dropdown-toggle navbar-link" href="#"><i class="icon-home"></i> + <span class="hidden-phone">Mode Local</span> + </a> + <ul class="dropdown-menu extended"> + <li class="nav-header">Configuration locale</li> + <li> + <p> + <a id="reconnect" href="<%= path_prefix %>/logout?return_url=<%= app_location %><%= path_prefix %>/<%= application_mode ? "%3Fapplication" : "" %>"> + Reconnectez-vous avec vos identifiants Zéphir pour synchroniser la configuration avec le serveur distant + </a> + </p> + </li> + </ul> + <% } %> + </li> + <% } %> + <li class="dropdown mtop5"> + <a id="language-dropdown" data-toggle="dropdown" class="dropdown-toggle navbar-link" href="#"><%= current_locale() %></a> + <ul class="dropdown-menu extended"> + <li><a id="language-french" href="#set/locale/fr-fr"><i class="icon-locale-fr"></i> <%= t('french') %></a></li> + <li><a id="language-english" href="#set/locale/en-us"><i class="icon-locale-en"></i> <%= t('english') %></a></li> + </ul> + </li> + <% } %> + <li class="dropdown mtop5"> + <a id="profile-dropdown" data-toggle="dropdown" class="dropdown-toggle navbar-link" href="#"><i class="icon-user"></i> <span class="visible-desktop"><%= username %><b class="caret"></b></span></a> + <ul class="dropdown-menu extended"> + <li> + <p><%= t('logged_as', username) %></p> + </li> + <% if(!zephir_mode){ %> + <li><a id="logout" href="<%= path_prefix %>/logout?return_url=<%= app_location %><%= path_prefix %>/<%= application_mode ? "%3Fapplication" : "" %>"><i class="icon-signout"></i> <%= t('logout') %></a></li> + <% } %> + </ul> + </li> + <li class="mtop5"> + <span class="navbar-link loading"> + <i class="icon-refresh icon-spin"></i> + </span> + </li> + </ul> + </div> + </div> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/initView.tmpl b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/initView.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..811bf0b550aefe54847a3fabd9e6b21d133f10fc --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/initView.tmpl @@ -0,0 +1,15 @@ +<div class="hero-unit init"> + <h3><%= t('welcome_to_genconfig') %></h3> + <p> + <%= t('init_text') %> + </p> +</div> + +<div class="categories"> +</div> + + <div class="form-actions"> + <div class="pull-right"> + <a id="init-validate" href="#validate" class="btn btn-primary validate"><i class="icon-ok"></i> <%= t('save_configuration') %></a> + </div> + </div> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/legend.tmpl b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/legend.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..2161da086ea736219c72539e0832bd50da26f246 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/legend.tmpl @@ -0,0 +1,93 @@ + +<div class="modal-header"> + <button id="legend-close-btn" type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h3><%= t('legend') %><h3> +</div> +<div class="modal-body"> + <blockquote> + <ul class="nav muted legendlist"> + <li class="nav-header"><%= t('properties') %></li> + <li><div class="input-prepend input-append"> + <span class="add-on"><i class="icon-asterisk"></i></span> + <span class="add-on"> <%= t('mandatory') %></span> + </div></li> + <li><div class="input-prepend input-append"> + <span class="add-on"><i class="icon-cogs"></i></span> + <span class="add-on"><%= t('calculated') %></span> + </div></li> + <li><div class="input-prepend input-append"> + <span class="add-on"><i class="icon-unlock"></i></span> + <span class="add-on"><%= t('auto_freeze') %></span> + </div></li> + <li><div class="input-prepend input-append"> + <span class="add-on"><i class="icon-lock"></i></span> + <span class="add-on"><%= t('frozen') %></span> + </div></li> + <li><div class="input-prepend input-append"> + <span class="add-on"><%= t('uneditable') %></span> + <span class="add-on"><i class="icon-ban-circle"></i></span> + </div></li> + <li class="tag basic"> + <span class="tag basic text-success"> + <span class="badge badge-success">B</span> + <%= t('variable', t('basic')) %> + </span> + </li> + <li class="tag normal"> + <span class="tag normal text-normal"> + <span class="badge badge-normal">N</span> + <%= t('variable', t('normal')) %> + </span> + </li> + <li class="tag expert"> + <span class="tag basic text-error"> + <span class="badge badge-important">E</span> + <%= t('variable', t('expert')) %> + </span> + </li> + <li class="tag is_hidden"> + <span class="tag is_hidden text-normal"> + <span class="badge badge-normal"> </span> + <%= t('variable', t('hidden')) %> + </span> + </li> + <li class="nav-header"><%= t('actions') %></li> + <li><div class="input-prepend input-append"> + <span class="add-on"><%= t('edit') %></span> + <span class="add-on"><i class="icon-edit"></i></span> + </div></li> + <li><div class="input-prepend input-append"> + <span class="add-on"><%= t('save') %></span> + <span class="add-on"><i class="icon-ok"></i></span> + </div></li> + <li><div class="input-prepend input-append"> + <span class="add-on"><i class="icon-undo"></i></span> + <span class="add-on"><%= t('reset_to_default') %></span> + </div></li> + <li><div class="input-prepend input-append"> + <span class="add-on"><i class="icon-remove"></i></span> + <span class="add-on"><%= t('cancel_modifications') %></span> + </div></li> + <li class="nav-header"><%= t('value_type') %></li> + <li> + <div class="input-append"> + <input type="text" value="<%= t('variable_value') %>" /> + <button class="btn btn-default"> + <i class="icon-edit"></i> + </button> + </div> + </li> + <li> + <div class="input-append"> + <input type="text" value="<%= t('default_value') %>" class="default value" name="value" /> + <button class="btn btn-default"> + <i class="icon-edit"></i> + </button> + </div> + </li> + </ul> + </blockquote> +</div> +<div class="modal-footer"> + <a id="legend-close" href="#closeDialog" class="btn discard closeDialog"><i class="icon-remove"></i> <%= t('close') %></a> +</div> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/loadingMessageView.tmpl b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/loadingMessageView.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..744a656ba6d31b24655a15cd728b3da603bea6b4 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/loadingMessageView.tmpl @@ -0,0 +1,5 @@ +<div class="hero-unit"> +<div class="offset5 span3"> + <i class="icon-spinner icon-spin icon-2x pull-left"></i> <%= t('loading') %>... +</div> +</div> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/main.tmpl b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/main.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..a060bcc8ef7377716d6866cf3ab396943a1edb3c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/main.tmpl @@ -0,0 +1,15 @@ + +<div class="row-fluid"> + <div class="span12"> + <!--<div id="theme-change" class="hidden-phone"></div>--> + <h3 class="page-title"><i class="<%= categoryIcon() %>"></i> <%= description %></h3> + <!--<ul class="breadcrumb"> + <li><a href="#"><i class="icon-home"></i></a><span class="divider"> </span></li> + <li><a href="#"><%= name.capitalize() %></a><span class="divider-last"> </span></li> + </ul>--> + </div> +</div> + +<div class="page"> +</div> + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/modeItemView.tmpl b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/modeItemView.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..01b56298c5a2d605adcddfa09a04dd6201dd556d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/modeItemView.tmpl @@ -0,0 +1,7 @@ +<a id="mode-<%= getMode() %>" href="<%= url() %>" class="modeItem label label-<%= getMode() == 'E' ? 'important' : getMode() == 'B' ? 'success' : 'normal' %>"> + + <i class="icon-check<%= current ? '' : '-empty' %>"></i> + <i class="icon-tag"></i> + <%= t(name) %> + +</a> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/modesView.tmpl b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/modesView.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..2f0a06a519d662eac7bc1278a6b6b0e805f843ed --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/modesView.tmpl @@ -0,0 +1,9 @@ +<a id="modes-dropdown" data-toggle="dropdown" class="dropdown-toggle" href="#"> + <i class="icon-tag"></i> + <div style="position: absolute; top: 0; left: 32px;"><span class="badge badge-<%= getMode() == 'E' ? 'important' : getMode() == 'B' ? 'success' : 'normal' %>"><%= getMode() %></span> + </div><span class="hidden-phone"><%= t('mode', t(current)) %></b><b class="caret"></b></span> +</a> +<ul class="dropdown-menu extended"> + <li><a id="mode-debug" href="#toggleDebug" class="toggleDebug"><i class="icon-check<%= debug ? '' : '-empty' %>"></i> <i class="icon-dashboard"></i> <b><%= t('debug') %></b></a></li> + <li class="divider"></li> +</ul> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/separatorView.tmpl b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/separatorView.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..9abf7c5379b78dbc1cdeddf855c5f63de17e6cd4 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/separatorView.tmpl @@ -0,0 +1,5 @@ +<tr class="separator"> + <th> + <%= separator %> + </th> +</tr> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/sidebar.tmpl b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/sidebar.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..f616e15d068632772d48b32a39ef2d85d47019d9 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/sidebar.tmpl @@ -0,0 +1,15 @@ +<div class="sidebar-toggler hidden-phone"></div> +<div class="navbar-inverse"> + <!--form class="navbar-search visible-phone"> + <input type="text" placeholder="Search" class="search-query"> + </form--> +</div> +<p class="lead text-center"> + <i class="icon icon-dashboard"></i> + <span id="eole_module"><%= config.eole.module.capitalize() %></span> + <span id="eole_release"><%= config.eole.release %></span> +</p> +<ul class="sidebar-menu"> + +</ul> + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/tagView.tmpl b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/tagView.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..21e1a97a00843911e6548a8abf052efa9847de37 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/tagView.tmpl @@ -0,0 +1,12 @@ +<div class="span12"> + <div class="widget"> + <div class="widget-title"> + <h4><%= id %></h4> + </div> + <div class="widget-body"> + <table class="table table-bordered table-striped"> + <tbody class="variables"></tbody> + </table> + </div> + </div> +</div> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/variableGroupView.tmpl b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/variableGroupView.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..e574f3de8fe14c3a918c4793bb16c71cde65e50f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/variableGroupView.tmpl @@ -0,0 +1,14 @@ +<div class="accordion" id="accordion"></div> + +<div class="pull-right"> + <a id="add-<%= id %>" href="#variables/<%= id %>/addValue" class="btn addValue" rel="tooltip" data-placement="top" data-toggle="tooltip" title="<%= help ? _.escape(help) : '' %>" > + <i class="icon-plus"></i> + <b><i class="icon-tag"></i> <%= description %></b> + </a> +</div> + +<div class="pull-left"> + <a id="toggle-<%= id %>" href="#variables/<%= id %>/toggle" class="btn toggle"> + <i class="icon-reorder"></i> <%= t('toggle_all') %> + </a> +</div> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/variableItemEditView.tmpl b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/variableItemEditView.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..da007cbb357201e9ac1203d642c401cde3cbef4c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/variableItemEditView.tmpl @@ -0,0 +1,26 @@ +<div class="pull-right"> + <div class="input-append input-prepend"> + <% if(!groupid){ %> + <a id="reset-<%= id %>" href="#variables/<%= id %>/resetValue" class="btn reset" rel="tooltip" data-placement="top" data-toggle="tooltip" title="<%= t('reset_to_default') %>" data-loading-text="<i class='icon-spinner icon-spin'></i>"> + <i class="icon-undo"></i> + </a> + <% } %> + <a id="cancel-<%= id %>" href="#variables/<%= id %>/editCancel" class="btn cancel" rel="tooltip" data-placement="top" data-toggle="tooltip" title="<%= t('cancel_modifications') %>"> + <i class="icon-remove"></i> + </a> + <% if(mandatory) { %> + <span class="add-on" rel="tooltip" data-placement="top" data-toggle="tooltip" title="<%= t('mandatory_help') %>"> + <i class="icon-asterisk"></i> + </span> + <% } %> + <span class="msg help-inline add-on"></span> + <% if(_.contains(["unicode","int","ip","password"], type)){ %> + <input id="value-<%= id %>" name="value" type="<%= type == "int" ? 'number' : 'text' %>" value="<%= value %>" <%= mandatory ? 'required' : '' %> rel="tooltip" data-placement="top" data-toggle="tooltip" title="<%= help ? _.escape(help) : '' %>" /> + <% } else if(type == "choice") { %> + <%= selectTag() %> + <% } %> + <a id="save-<%= id %>" href="#variable/<%= id %>/save" class="btn btn-primary save" rel="tooltip" data-placement="top" data-toggle="tooltip" title="<%= t('save') %>" data-loading-text="<i class='icon-spinner icon-spin'></i>"> + <i class="icon-ok"></i> + </a> + </div> +</div> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/variableItemView.tmpl b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/variableItemView.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..81e4829ff358075d84437a682c8c7629af60cbf5 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/variableItemView.tmpl @@ -0,0 +1,48 @@ +<div class="pull-right"> + <div class="<% if(mandatory || auto_freeze || is_calculated){ %>input-prepend <% } %>input-append"> + + <% if(auto_freeze) { %> + <span class="add-on" rel="tooltip" data-placement="top" data-toggle="tooltip" title="<%= editable ? t('auto_freeze_help') : t('frozen_help') %>"> + <i class="icon-<%= editable ? 'un' : '' %>lock"></i> + </span> + <% } %> + + <% if(is_calculated) { %> + <span class="add-on" rel="tooltip" data-placement="top" data-toggle="tooltip" title="<%= t('calculated_help') %>"> + <i class="icon-cogs"></i> + </span> + <% } %> + + <% if(mandatory) { %> + <span class="add-on" rel="tooltip" data-placement="top" data-toggle="tooltip" title="<%= t('mandatory_help') %>"> + <i class="icon-asterisk"></i> + </span> + <% } %> + + <span class="msg help-inline add-on"></span> + <% if(editable){ %> + <% if(_.contains(["unicode","int","ip"], type)){ %> + <input id="show-<%= id %>" class="value <%= default_owner ? 'default' : '' %>" type="<%= type == "int" ? 'number' : 'text' %>" value="<%= value %>" <%= mandatory ? 'required' : '' %> rel="tooltip" data-placement="top" data-toggle="tooltip" title="<%= help ? _.escape(help) : '' %>" /> + <% } %> + <% if(type == "password"){ %> + <input id="show-<%= id %>" class="value <%= default_owner ? 'default' : '' %>" type="<%= debug ? 'text' : 'password' %>" value="<%= value %>" <%= mandatory ? 'required' : '' %> rel="tooltip" data-placement="top" data-toggle="tooltip" title="<%= help ? _.escape(help) : '' %>" /> + <% } %> + <% if(type == "choice"){ %> + <select id="show-<%= id %>" class="value selectpicker <%= default_owner ? 'default' : '' %>" rel="tooltip" data-placement="top" data-toggle="tooltip" title="<%= help ? _.escape(help) : '' %>" ><option value="test"><%= value %></option></select> + <% } %> + <a id="edit-<%= id %>" href="#variables/<%= id %>/edit" class="btn editBtn" rel="tooltip" title="<%= t('edit') %>"> + <i class="icon-edit"></i> + </a> + <% } else { %> + <% if(type == "password"){ %> + <input id="show-<%= id %>" class="uneditable-input" value="<%= getValue() %>" disabled="disabled" rel="tooltip" data-placement="top" data-toggle="tooltip" title="<%= debug ? getValue() : help ? _.escape(help) : '' %>" type="<%= debug ? 'text' : 'password' %>" /> + <% } else { %> + <input id="show-<%= id %>" class="uneditable-input" value="<%= getValue() %>" disabled="disabled" rel="tooltip" data-placement="top" data-toggle="tooltip" title="<%= help ? _.escape(help) : '' %>" /> + <% } %> + <button id="edit-<%= id %>" class="btn disabled"> + <i class="icon-ban-circle"></i> + </button> + <% } %> + + </div> +</div> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/variableMasterView.tmpl b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/variableMasterView.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..3432fcd7341de9320ae523d240dcdaac2963c41f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/variableMasterView.tmpl @@ -0,0 +1,34 @@ +<div class="accordion-heading clearfix"> + <a class="accordion-toggle" data-toggle="collapse" href="#slaves-<%= id %>" rel="tooltip" data-placement="right" data-toggle="tooltip" title="<%= help ? _.escape(help) : '' %>"> + <span class="tag <%= mode %> <%= hidden ? 'is_hidden' : '' %> text-<%= getMode() == 'E' ? 'error' : getMode() == 'B' ? 'success' : 'normal' %>"> +<span class="badge badge-<%= getMode() == 'E' ? 'important' : getMode() == 'B' ? 'success' : 'normal' %>"> +<%= getMode() %> +</span> + <%= description %> + <i class="icon-carret"></i> + </a> + <% if(debug){ %> + <code><%= id %></code> + <span><i class="icon-user"></i> <%= owner %></span> + <% } %> + <div class="pull-right"> + <a id="remove-<%= id %>" href="#variables/<%= id %>/removeValue" class="btn btn-danger removeValue" rel="tooltip" title="<%= t('remove') %>"> + <i class="icon-remove"></i> + </a> + </div> + <div class="pull-right sub"> + </div> + <% if(warning){ %> + <div class="alert alert-warning"><i class="icon-warning-sign"></i> <%= warning %></div> + <% } %> + <div class="alert alert-error"><i class="icon-warning-sign"></i> <span class="msg"><%= error %></span></div> +</div> + +<div id="slaves-<%= id %>" class="accordion-body collapse in"> + <div class="accordion-inner"> + <table class="table"> + <tbody class="slaves"> + </tbody> + </table> + </div> +</div> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/variableMultiEditView.tmpl b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/variableMultiEditView.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..ff670b4fed48b6f69696e16bae743d72ea0cac03 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/variableMultiEditView.tmpl @@ -0,0 +1,39 @@ +<div class="pull-right control-group multi-control-group"> + <div class="input-prepend input-append"> + <a id="reset-<%= id %>" href="#variables/<%= id %>/resetValue" class="btn reset" rel="tooltip" data-placement="top" data-toggle="tooltip" title="<%= t('reset_to_default') %>" data-loading-text="<i class='icon-spinner icon-spin'></i>"> + <i class="icon-undo"></i> + </a> + <a id="cancel-<%= id %>" href="#variables/<%= id %>/editCancel" class="btn cancel" rel="tooltip" data-placement="top" data-toggle="tooltip" title="<%= t('cancel_modifications') %>"> + <i class="icon-remove"></i> + </a> + <% if(_.contains(["unicode","int","ip","password"], type)){ %> + <input id="input-<%= id %>" name="value" type="<%= type == 'int' ? 'number' : 'text' %>" placeholder="<%= t('add_value') %>" <%= mandatory ? 'required' : '' %> rel="tooltip" data-placement="top" data-toggle="tooltip" title="<%= help ? _.escape(help) : '' %>" /> + <% } else if(type == "choice") { %> + <%= selectTag() %> + <% } %> + <span class="msg help-inline add-on"></span> + <a id="save-<%= id %>" data-loading-text="<i class='icon-spinner icon-spin'></i>" href="#" class="btn btn-success btn-control" rel="tooltip" data-placement="top"></a> + </div> +</div> + +<div id="value-<%= id %>" class="pull-right multi-items"> + <% if(!value.length){ %> + <span class="label label-default"> + <%= t('no_value') %> + </span> + <% } else { %> + <% _.each(value, function(v, i){ %> + <span id="value-<%= id %>_<%= i %>" class="label label-<%= default_owner ? 'info' : 'inverse' %>"> + <%= v %> + <a id="remove-<%= id %>_<%= i %>" href="#variable/<%= id %>/removeItem" class="removeItem" data-id="<%= i %>"> + <i class="icon-remove"></i> + </a> + </span> + <% if(i < value.length-1){ %> + <a id="swap-<%= id %>_<%= i %>" href="#variable/<%= id %>/moveItem" class="moveItem" data-id="<%= i %>"> + <i class="icon-exchange"></i> + </a> + <% } %> + <% }) %> + <% } %> +</div> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/variableMultiView.tmpl b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/variableMultiView.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..e1db25bfec20ff36ceb6278ef002acb3b8d8d606 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/variableMultiView.tmpl @@ -0,0 +1,43 @@ +<div class="pull-right"> + <div class="input-prepend input-append"> + + <% if(auto_freeze) { %> + <span class="add-on" rel="tooltip" data-placement="top" data-toggle="tooltip" title="<%= editable ? t('auto_freeze_help') : t('frozen_help') %>"> + <i class="icon-<%= editable ? 'un' : '' %>lock"></i> + </span> + <% } %> + + <% if(is_calculated) { %> + <span class="add-on" rel="tooltip" data-placement="top" data-toggle="tooltip" title="<%= t('calculated_help') %>"> + <i class="icon-cogs"></i> + </span> + <% } %> + + <% if(mandatory) { %> + <span class="multi add-on" rel="tooltip" data-placement="top" data-toggle="tooltip" title="<%= t('mandatory_help') %>"> + <i class="icon-asterisk"></i> + </span> + <% } %> + + <div id="show-<%= id %>" class="add-on multi" rel="tooltip" data-placement="top" data-toggle="tooltip" title="<%= help ? _.escape(help) : '' %>"> + <% if(!value.length){ %> + <span class="label label-default"><%= t('no_value') %></span> + <% } else { %> + <% _.each(value, function(v, i){ %> + <span id="show-<%= id %>_<%= i %>" class="label label-<%= default_owner ? 'info' : 'inverse' %>"><%= v %></span> + <% }) %> + <% } %> + </div> + + <% if(editable){ %> + <a id="edit-<%= id %>" href="#variables/<%= id %>/edit" class="btn editBtn" rel="tooltip" title="<%= t('edit') %>"> + <i class="icon-edit"></i> + </a> + <% } else { %> + <button id="edit-<%= id %>" class="btn disabled"> + <i class="icon-ban-circle"></i> + </button> + <% } %> + + </div> +</div> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/variableRowView.tmpl b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/variableRowView.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..5e748e64a885f1a811134585009607ce222993be --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/variableRowView.tmpl @@ -0,0 +1,54 @@ +<td class="variable <%= type %> clearfix"> + <% if(breadcrumbs){ %> + <ul class="breadcrumb tag <%= mode %> <%= hidden ? 'is_hidden' : '' %>"> + <li> + <a href="#"><i class="<%= categoryIcon() %>"></i> <%= categoryid.capitalize() %></a> + </li> + <li class="divider"> <span class="divider"> </span> + </li> + <li class="tooltip_trigger tag <%= mode %> <%= hidden ? 'is_hidden' : '' %> text-<%= getMode() == 'E' ? 'error' : getMode() == 'B' ? 'success' : 'normal' %>" + rel="tooltip" data-placement="right" data-toggle="tooltip" title="<%= help ? _.escape(help) : '' %>"> + <span class="badge badge-<%= getMode() == 'E' ? 'important' : getMode() == 'B' ? 'success' : 'normal' %>"> + <%= getMode() %> + </span> + <%= description %> + <% if(debug){ %> + <code><%= id %></code> + <% } %> + </li> + <li class="divider"> + <span class="divider-last"> </span> + </li> + </ul> + <% } else { %> + <span class="tooltip_trigger tag <%= mode %> <%= hidden ? 'is_hidden' : '' %> text-<%= getMode() == 'E' ? 'error' : getMode() == 'B' ? 'success' : 'normal' %>" rel="tooltip" data-placement="right" data-toggle="tooltip" title="<%= help ? _.escape(help) : '' %>"> + <span class="badge badge-<%= getMode() == 'E' ? 'important' : getMode() == 'B' ? 'success' : 'normal' %>"> + <%= getMode() %> + </span> + <%= description %> + </span> + <% if(debug){ %> + <code><%= id %></code> + <% if(owner){ %> + <span><i class="icon-user"></i> <%= owner %></span> + <% } %> + <% } %> + <% } %> + + <% if(type == 'group'){ %> + <div style="position: relative;" class="pull-right"> + <a id="reset-<%= id %>" href="#variables/<%= id %>/resetValue" class="btn resetgroup" rel="tooltip" data-placement="top" data-toggle="tooltip" title="<%= t('reset_to_default') %>" data-loading-text="<i class='icon-spinner icon-spin'></i>"> + <i class="icon-undo"></i> + </a> + </div> + <div class="clearfix"></div> + <% } %> + + <div class="view <%= type == 'group' ? 'clearfix' : 'pull-right' %>"></div> + + <% if(warning){ %> + <div class="alert alert-warning"><i class="icon-warning-sign"></i> <%= warning %></div> + <% } %> + + <div class="alert alert-error"><i class="icon-warning-sign"></i> <span class="msg"><%= error %></span></div> +</td> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/variableView.tmpl b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/variableView.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..f8e6eb84cb8c452aee1fb734a852dd572029ae48 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/templates/variableView.tmpl @@ -0,0 +1,2 @@ +<div class="show"></div> +<div class="edit"></div> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/test.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/test.js new file mode 100644 index 0000000000000000000000000000000000000000..2a5762a84e184f0668278a3ac24d18cd3f3097e2 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/test.js @@ -0,0 +1,180 @@ +require.config({ + + paths : { + underscore : 'lib/underscore', + backbone : 'lib/backbone', + marionette : 'lib/backbone.marionette', + jquery : 'lib/jquery.min', + bootstrap : 'lib/bootstrap.min', + modernizr : 'lib/modernizr', + tpl : 'lib/tpl', + i18n : 'lib/i18n', + jasmine : 'lib/jasmine', + jasmine_html : 'lib/jasmine-html', + spec : 'spec' + }, + + locale: localStorage.locale || 'fr-fr', + + shim : { + 'lib/underscore-string' : ['underscore'], + 'lib/backbone-localStorage' : ['backbone'], + 'lib/bootstrap-contextmenu' : ['bootstrap'], + 'lib/bootstrap-typeahead' : ['bootstrap'], + 'lib/bootstrap-select' : ['bootstrap'], + 'lib/bootstrap-select2' : ['bootstrap'], + 'lib/jquery-input-ip-address-control' : ['jquery'], + underscore : { + exports : '_' + }, + 'lib/underscore-string': { + deps: ['underscore'], + init: function(_) { + _.mixin(_.str.exports()); + return _; + } + }, + backbone : { + exports : 'Backbone', + deps : ['jquery','underscore'] + }, + marionette : { + exports : 'Backbone.Marionette', + deps : ['backbone'] + }, + bootstrap: { + exports : 'jquery', + deps : ['jquery'] + }, + jasmine: { + exports: 'jasmine' + }, + jasmine_html: { + deps: ['jasmine'], + exports: 'jasmine' + } + }, + + deps : ['jquery','underscore'] +}); + +require(['app','backbone','marionette','jasmine_html','routers/index','controllers/index','views/ErrorView','templates','strings','lib/underscore-string','bootstrap','modernizr'], +function (app,Backbone,Marionette,jasmine,Router,Controller,ErrorView,templates,strings){ + "use strict"; + + + app.config.path_prefix = ""; + + /* Scroll to focused element if outside layout */ + $.fn.focusNscroll = function(){ + $(this).focus(); + var x = window.scrollX, y = window.scrollY, top; + if(this.css('display') == "none"){ + top = this.parents('tr').offset().top; + } else { + this.focus(); + top = this.offset().top; + } + if(top < y+80) { window.scrollTo(x, top-80); } + else if(top > $(window).height()+y-110) { window.scrollTo(x, top-$(window).height()+110); } + }; + + window.ErrorView = ErrorView; + + /* Browser detection patch */ + jQuery.browser = {}; + jQuery.browser.mozilla = /mozilla/.test(navigator.userAgent.toLowerCase()) && !/webkit/.test(navigator.userAgent.toLowerCase()); + jQuery.browser.webkit = /webkit/.test(navigator.userAgent.toLowerCase()); + jQuery.browser.opera = /opera/.test(navigator.userAgent.toLowerCase()); + jQuery.browser.msie = /msie/.test(navigator.userAgent.toLowerCase()); + + /* Persist Locale in localstorage */ + var locale = localStorage.getItem('locale'); + if(!locale || typeof locale === 'undefined') + localStorage.setItem('locale', 'fr-fr'); + + /* Load translated string - TODO fix rdm "undefined" */ + _.mixin(_.str.exports()); + + /* Translate Method */ + window.t = function(label){ + if(arguments.length > 1) { + arguments[0] = strings.genconfig[label]; + return _.sprintf.apply(_, arguments); + } + return strings.genconfig[label]; + }; + + /* Extend the data given to the templates */ + _.extend(Marionette.View.prototype, { + serializeData: function(){ + var data; + if (this.model) + data = this.model.toJSON(); + else if (this.collection) + data = { items: this.collection.toJSON() }; + data = this.mixinTemplateHelpers(data); + data.t = t; + data.templates = templates; + return data; + } + }); + + /* Override sync method for url_prefix */ + var sync = function(method, model, options){ + if (!options.url) { + options.url = app.config.path_prefix + _.result(model, 'url') || urlError(); + } else { + options.url = app.config.path_prefix + options.url; + } + if(!options.error){ + options.error = function(response){ + new ErrorView({ + model: new Backbone.Model(response) + }).render().$el.modal('show'); + }; + } + return Backbone.sync.call(this, method, model, options); + }; + _.extend(Backbone.Model.prototype, { sync: sync }); + _.extend(Backbone.Collection.prototype, { sync: sync }); + + /* Start Application */ + app.start(); + + /* Init router */ + app.router = new Router({ + controller : Controller + }); + + /* Global route helper method */ + Backbone.View.goTo = function(loc) { + app.router.navigate(loc, true); + }; + + /* Remember navigation history */ + Backbone.history.start(); + + var jasmineEnv = jasmine.getEnv(); + jasmineEnv.updateInterval = 1000; + + var htmlReporter = new jasmine.HtmlReporter(); + + jasmineEnv.addReporter(htmlReporter); + + jasmineEnv.specFilter = function(spec) { + return htmlReporter.specFilter(spec); + }; + + var specs = []; + + specs.push('spec/models/CategorySpec'); + specs.push('spec/views/SidebarSpec'); + + $(function(){ + require(specs, function(){ + jasmineEnv.execute(); + }); + }); + +}); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/vent.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/vent.js new file mode 100644 index 0000000000000000000000000000000000000000..cb52f0ab74f0bc226733c1e123e50a8b52e75c3e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/vent.js @@ -0,0 +1,53 @@ +define(['marionette'],function(Marionette){ + "use strict"; + + window.vent = new Marionette.EventAggregator(); + + var pending = 0; + var timer; + + $(window).load(function () { + }).ajaxComplete(function(){ + pending--; + clearTimeout(timer); + if(pending == 0) vent.trigger('loading:stop'); + }); + + var s_ajaxListener = new Object(); + s_ajaxListener.tempOpen = XMLHttpRequest.prototype.open; + s_ajaxListener.tempSend = XMLHttpRequest.prototype.send; + s_ajaxListener.callback = function () { + // this.method :the ajax method used + // this.url :the url of the requested script (including query string, if any) (urlencoded) + // this.data :the data sent, if any ex: foo=bar&a=b (urlencoded) + } + + XMLHttpRequest.prototype.open = function(a,b) { + if (!a) var a=''; + if (!b) var b=''; + s_ajaxListener.tempOpen.apply(this, arguments); + s_ajaxListener.method = a; + s_ajaxListener.url = b; + if (a.toLowerCase() == 'get') { + s_ajaxListener.data = b.split('?'); + s_ajaxListener.data = s_ajaxListener.data[1]; + } + pending++; + timer = setTimeout(function(){ + vent.trigger('loading:stop'); + }, 30000); + if(pending == 1) + vent.trigger('loading:start'); + } + + XMLHttpRequest.prototype.send = function(a,b) { + if (!a) var a=''; + if (!b) var b=''; + s_ajaxListener.tempSend.apply(this, arguments); + if(s_ajaxListener.method.toLowerCase() == 'post')s_ajaxListener.data = a; + s_ajaxListener.callback(); + } + + + return vent; +}); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/Body.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/Body.js new file mode 100644 index 0000000000000000000000000000000000000000..2f1509e173b4d7264922e95820f9ad320604412f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/Body.js @@ -0,0 +1,98 @@ +define(['marionette','vent','templates','views/Sidebar','views/Main','views/InitView'], +function (Marionette,vent,templates,Sidebar,Main,InitView){ + "use strict"; + + return Marionette.Layout.extend({ + + template : templates.body, + tagName: 'div', + className: 'row-fluid', + + regions : { + sidebar : '#sidebar', + main : '#main-content' + }, + + ui : { + sidebar : '#sidebar', + main : '#main-content' + }, + + initialize : function() { + this.bindTo(vent, 'route:showCategory', this.showCategory, this); + this.bindTo(vent, 'route:init', this.init, this); + this.bindTo(vent, 'flash', this.flash, this); + this.bindTo(vent, 'toggleSidebar', this.toggleSidebar, this); + this.sidebarOpened = true; + }, + + onRender : function() { + this.sidebar.show(new Sidebar(this.options)); + this.sidebar.currentView.setElement(this.ui.sidebar); + }, + + init: function(callback){ + this.options.callback = callback; + this.main.show(new InitView(this.options)); + }, + + toggleSidebar: function(open){ + open = typeof open === 'undefined' ? this.sidebarOpened : open; + if(open){ + this.ui.main.addClass('closed'); + this.ui.sidebar.addClass('closed'); + this.ui.sidebar.find('.sidebar-toggler').addClass('closed'); + this.ui.sidebar.find('.lead').hide(); + } else { + this.ui.main.removeClass('closed'); + this.ui.sidebar.removeClass('closed'); + this.ui.sidebar.find('.sidebar-toggler').removeClass('closed'); + this.ui.sidebar.find('.lead').show(); + } + this.sidebarOpened = !this.sidebarOpened; + }, + + showCategory: function(id, callback){ + this.options.categories.url = "/categories" + if(!this.options.categories.length) return; + var category = this.options.categories.get(id); + if(typeof category === 'undefined'){ + category = this.options.categories.first(); + id = category.id; + Backbone.View.goTo('/categories/'+id, callback); + return; + } + category.tags.fetch({ + success: _.bind(function(collection, response){ + if(collection.length == 0) + Backbone.View.goTo('categories/general'); + }, this), + error: _.bind(function(collection, response){ + new ErrorView({ model: new Backbone.Model(response) }).render().$el.modal('show'); + }, this) + }); + this.options.current_category = id; + var options = _.extend({}, this.options, { + model: category + }); + this.main.show(new Main(options)); + if(_.isFunction(callback)) callback(); + }, + + flash: function(msg, type, remove){ + var icon; + switch(type){ + case 'success': icon = 'ok'; break; + case 'info': icon = 'info-sign'; break; + case 'warning': + case 'error' : icon = 'warning-sign'; break; + default: icon = 'info'; break; + } + var flash = $('<div>').addClass('alert alert-'+type).html("<i class='icon-"+icon+"'></i> "+msg); + if (remove === true) + $('.alert').remove(); + flash.append('<a class="close" data-dismiss="alert" href="#">×</a>'); + this.ui.main.prepend(flash); flash.alert(); + } + }); +}); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/CategoryItemView.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/CategoryItemView.js new file mode 100644 index 0000000000000000000000000000000000000000..172e742bb8703507d49a670e382458eb8de45425 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/CategoryItemView.js @@ -0,0 +1,36 @@ +define(['vent','marionette','templates'], +function(vent,Marionette,templates){ + 'use strict'; + + return Marionette.ItemView.extend({ + + tagName: 'li', + template: templates.categoryItemView, + + ui: { + link: 'a' + }, + + onRender: function(){ + this.ui.link.tooltip(); + this.ui.link.hover(function(){ + var $tooltip = $(this).parent().find('.tooltip'); + $tooltip.css('top',parseInt($tooltip.css('top')) - 22 + 'px') + }); + }, + + templateHelpers: { + url: function(){ + return '#categories/'+ this.id; + }, + getMode: function(){ + switch(this.mode){ + case 'basic': return 'B'; break; + case 'normal': return 'N'; break; + case 'expert': return 'E'; break; + default: return 'N'; + } + } + } + }); +}); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/DiffVariableView.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/DiffVariableView.js new file mode 100644 index 0000000000000000000000000000000000000000..a1b671626198a87e7f3353e530395e64faa70a9d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/DiffVariableView.js @@ -0,0 +1,35 @@ +define(['vent','marionette','templates'], +function(vent,Marionette,templates){ + 'use strict'; + + return Marionette.ItemView.extend({ + + tagName: 'tr', + className: '', + template: templates.diffVariableView, + + beforeRender: function(){ + }, + + onRender: function(){ + this.el = $(this.$el.html()); + }, + + serializeData: function(){ + return _.extend(Marionette.View.prototype.serializeData.call(this), { + debug: this.options.debug + }); + }, + + templateHelpers: { + getMode: function(){ + switch(this.mode){ + case 'basic': return 'B'; break; + case 'normal': return 'N'; break; + case 'expert': return 'E'; break; + default: return 'N'; + } + } + } + }); +}); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/DiffVariablesView.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/DiffVariablesView.js new file mode 100644 index 0000000000000000000000000000000000000000..cecd4cbc805433881bdfea256e5856702d2e3799 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/DiffVariablesView.js @@ -0,0 +1,118 @@ +define(['vent','marionette','templates','views/DiffVariableView'], +function(vent,Marionette,templates,DiffVariableView){ + 'use strict'; + + return Marionette.CompositeView.extend({ + + tagName: 'div', + className: 'container-fluid', + template: templates.diffVariablesView, + itemView: DiffVariableView, + itemViewContainer: 'tbody', + itemViewOptions: {}, + emptyView: Marionette.ItemView.extend({ + tagName: 'tr', + template: templates.emptyDiffView, + serializeData: function(){ + return _.extend(Marionette.ItemView.prototype.serializeData.call(this),{ + zephir: this.options.zephir, + config: app.config + }); + } + }), + + ui: { + saveBtn: '.saveConfig' + }, + + events: { + 'click .saveConfig' : 'saveConfig', + 'click .discardConfig' : 'discardConfig', + 'click .localConfig' : 'localConfig', + 'click .distantConfig' : 'distantConfig', + 'click .backConfig' : 'backConfig' + }, + + initialize: function(){ + this.itemViewOptions = _.extend({}, this.itemViewOptions, this.options); + this.collection = this.options.differences; + this.scrollPos = 0; + this.bindTo(vent, 'saveScrollPos', this.saveScrollPos, this); + }, + + saveConfig: function(){ + //this.$el.modal('hide'); + if(this.ui.saveBtn.hasClass('disabled')) return; + this.ui.saveBtn.button('loading'); + $.post(this.options.path_prefix+'/save', _.bind(function(){ + app.config.version = ""; + vent.trigger('route:reloadConfig', function(){ + vent.trigger('flash', t('save_config_success'), 'success'); + }); + }, this)) + .fail(_.bind(function(response){ + this.ui.saveBtn.button('reset'); + new ErrorView({ model: new Backbone.Model(response) }).render().$el.modal('show'); + }, this)); + vent.trigger('route:saveConfig'); + }, + + backConfig: function(){ + //this.$el.modal('hide'); + vent.trigger('route:reloadConfig'); + }, + + discardConfig: function(){ + //this.$el.modal('hide'); + vent.trigger('route:discardConfig'); + }, + + localConfig: function(){ + //this.$el.modal('hide'); + $.post(this.options.path_prefix+'/save', { source: 'local' }) + .done(_.bind(function(){ + app.config.version = ""; + vent.trigger('route:reloadConfig', function(){ + vent.trigger('flash', t('save_config_success'), 'success'); + }); + }, this)) + .fail(_.bind(function(response){ + new ErrorView({ model: new Backbone.Model(response) }).render().$el.modal('show'); + }, this)); + vent.trigger('route:localConfig'); + }, + + distantConfig: function(){ + //this.$el.modal('hide'); + $.post(this.options.path_prefix+'/save', { source: 'distant' }) + .done(_.bind(function(){ + app.config.version = ""; + vent.trigger('route:reloadConfig', function(){ + vent.trigger('flash', t('save_config_success'), 'success'); + }); + }, this)) + .fail(_.bind(function(response){ + new ErrorView({ model: new Backbone.Model(response) }).render().$el.modal('show'); + }, this)); + vent.trigger('route:distantConfig'); + }, + + saveScrollPos: function(pos){ + this.scrollPos = pos; + }, + + onRender: function(){ + window.scrollTo(0, this.scrollPos); + }, + + serializeData: function(){ + return _.extend(Backbone.Marionette.CompositeView.prototype.serializeData.call(this),{ + zephir: this.options.zephir, + path_prefix: this.options.path_prefix, + app_location: this.options.app_location, + application_mode: this.options.application_mode, + config: app.config + }); + } + }); +}); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/DiscardConfigView.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/DiscardConfigView.js new file mode 100644 index 0000000000000000000000000000000000000000..cdc569361c87d39fb033ddd61edb090eff1fb759 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/DiscardConfigView.js @@ -0,0 +1,33 @@ +define(['vent','marionette','templates'], +function(vent,Marionette,templates){ + 'use strict'; + + return Marionette.ItemView.extend({ + + tagName: 'div', + className: 'modal hide fade small', + template: templates.discardConfigView, + + events: { + 'click .discardConfig': 'discardConfig', + 'click .closeModal': 'close' + }, + + discardConfig: function(){ + this.$el.modal('hide'); + $.post(app.config.path_prefix+'/discard', {}, _.bind(function(){ + app.config.version = ""; + vent.trigger('route:reloadConfig', function(){ + vent.trigger('flash', t('discard_config_success'), 'success'); + }); + }, this)); + //vent.trigger('route:saveConfig'); + }, + + close: function(){ + this.$el.modal('hide'); + } + }); +}); + + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/ErrorView.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/ErrorView.js new file mode 100644 index 0000000000000000000000000000000000000000..cffcac64421249219b1ab1331c842b762bffabd6 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/ErrorView.js @@ -0,0 +1,40 @@ +define(['vent','marionette','templates'], +function(vent,Marionette,templates){ + 'use strict'; + + return Marionette.ItemView.extend({ + + tagName: 'div', + className: 'modal hide fade small', + template: templates.errorView, + + events: { + 'click .reload' : 'reload', + 'click .closeDialog' : 'closeDialog' + }, + + initialize: function(){ + var html = this.model.get('responseText').replace(/\n/g, "<br />"); + this.model.set('responseText', html); + }, + + reload: function(){ + this.$el.modal('hide'); + if (this.options == null) { + window.location.reload(); + } else { + var url = "/logout?return_url=" + this.options.option.app_location + this.options.option.path_prefix + '/'; + if (this.options.option.application_mode) { + window.location = url + '%3Fapplication'; + } else { + window.location = url; + } + } + }, + + closeDialog: function(){ + this.$el.modal('hide'); + this.remove(); + } + }); +}); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/FillMandatoriesView.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/FillMandatoriesView.js new file mode 100644 index 0000000000000000000000000000000000000000..0592cc86c9e9b348e1a8e0f5fb429fe70ece4bc2 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/FillMandatoriesView.js @@ -0,0 +1,44 @@ +define(['vent','marionette','templates','views/VariableRowView'], +function(vent,Marionette,templates,VariableRowView){ + 'use strict'; + + return Marionette.CompositeView.extend({ + + tagName: 'div', + className: 'container-fluid', + template: templates.fillMandatoriesView, + itemViewContainer: 'tbody', + itemViewOptions: {}, + + events: { + 'click .validate' : 'validate', + 'click .backToCategory': 'backToCategory' + }, + + initialize: function(){ + this.el.id = "fillmandatoriesmodal"; + this.collection = this.options.mandatories; + this.itemViewOptions = _.extend({ breadcrumbs: true, isMandatoryCollection: true }, this.itemViewOptions, this.options); + if(!VariableRowView) VariableRowView = require('views/VariableRowView'); + this.itemView = VariableRowView; + this.scrollPos = 0; + this.bindTo(vent, 'saveScrollPos', this.saveScrollPos, this); + }, + + validate: function(){ + vent.trigger('route:validateConfig'); + }, + + backToCategory: function(){ + Backbone.View.goTo("categories/"+this.options.current_category); + }, + + saveScrollPos: function(pos){ + this.scrollPos = pos; + }, + + onRender: function(){ + window.scrollTo(0, this.scrollPos); + } + }); +}); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/Footer.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/Footer.js new file mode 100644 index 0000000000000000000000000000000000000000..2fa072372a3e5f9832a680ecdacee63535222a68 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/Footer.js @@ -0,0 +1,8 @@ +define(['marionette','vent','templates'], +function (Marionette,vent,templates) { + "use strict"; + + return Marionette.Layout.extend({ + template : templates.footer + }); +}); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/Header.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/Header.js new file mode 100644 index 0000000000000000000000000000000000000000..8f261b56a78a12b72ce76b4acdf4ddfd2d102d36 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/Header.js @@ -0,0 +1,138 @@ +define(['marionette','vent','templates','strings','views/ModesView','lib/jquery.fileupload'], +function (Marionette,vent,templates,strings,ModesView) { + "use strict"; + + return Marionette.ItemView.extend({ + + tagName: 'div', + className: 'navbar-inner', + template : templates.header, + + ui: { + nav: 'ul', + menu: '#top_menu .top-menu', + fileinput: 'input[type=file]', + loading: 'span.loading i.icon-spin' + }, + + events: { + 'click .validateConfig': 'validateConfig', + 'click .discardConfig': 'discardConfig', + 'click .downloadConfig': 'downloadConfig', + 'click .reloadConfig' : 'reloadConfig', + 'click .zephirConfig' : 'zephirConfig', + 'click .quitGenConfig' : 'quitGenConfig', + 'click .wizard': 'wizard', + 'click .legend': 'legend' + }, + + initialize: function(){ + this.bindTo(vent, 'loading:start', this.loadingStart, this); + this.bindTo(vent, 'loading:stop', this.loadingStop, this); + }, + + onRender: function(){ + this.ui.menu.append(new ModesView(this.options).render().el); + this.ui.fileinput.fileupload({ + url: app.config.path_prefix+'/upload', + add: _.bind(function(e, data) { + Backbone.View.goTo('uploadConfig'); + data.submit(); + }, this), + done: _.bind(function(fi, response){ + vent.trigger('route:reloadConfig', function(){ + _.each(response.result.errors, function(error){ + vent.trigger('flash', error, 'warning'); + }); + var msg; + app.config.version = response.result.version; + if(app.config.version != ''){ + msg = 'La configuration "'+response.result.filename+'" a été correctement importée depuis un fichier en version '+app.config.version+'. '; + msg+= "<a href=\"#save\" class=\"btn btn-success\" onclick=\"vent.trigger('route:validateConfig'); return false;\">Enregistrer cette configuration</a>"; + //app.config.version = '' + } else { + msg = t('import_config_success', response.result.filename) + } + vent.trigger('flash', msg, 'success'); + }); + }, this), + fail: _.bind(function(fi, response){ + if (response.jqXHR.responseText === "") + if (response.errorThrown !== "") + response.jqXHR.responseText = response.errorThrown; + else + response.jqXHR.responseText = "l'utilisateur n'a pas les permissions suffisantes pour lire le fichier !"; + vent.trigger('flash', "Impossible d'importer le fichier : " + response.jqXHR.responseText, 'error', true); + }, this) + }); + }, + + serializeData: function(){ + return $.extend(Marionette.View.prototype.serializeData.call(this), { + title: 'GenConfig', //this.options.title, + username: this.options.user.get('name'), + application_mode: this.options.application_mode, + zephir_mode: this.options.zephir_mode, + zephir: this.options.user.get('zephir'), + path_prefix: this.options.path_prefix, + app_location : this.options.app_location + }); + }, + + validateConfig: function(){ + vent.trigger('route:validateConfig'); + }, + + discardConfig: function(){ + vent.trigger('route:discardConfig'); + }, + + downloadConfig: function(){ + vent.trigger('route:downloadConfig'); + }, + + reloadConfig: function(){ + vent.trigger('route:reloadConfig'); + }, + + zephirConfig: function(){ + vent.trigger('route:zephirConfig'); + }, + + wizard: function(){ + vent.trigger('route:init'); + }, + + legend: function(){ + vent.trigger('route:showLegend'); + }, + + loadingStart: function(){ + this.ui.loading.show(); + }, + + loadingStop: function(){ + this.ui.loading.hide(); + }, + + quitGenConfig: function(){ + if(confirm(t('exit_confirm'))) + $.ajax({ + type: 'POST', + async: false, + data: { kill: true }, + url: app.config.path_prefix+"/quit" + }); + }, + + templateHelpers: { + current_locale: function(){ + var locale = localStorage.getItem('locale'); + switch(locale){ + case 'en-us': return '<i class="icon-locale-en"></i> ' + '<span class="visible-desktop">' + t('english') + '<b class="caret"></b></span>'; + case 'fr-fr': return '<i class="icon-locale-fr"></i> ' + '<span class="visible-desktop">' + t('french') + '<b class="caret"></b></span>'; + } + } + } + }); +}); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/InitView.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/InitView.js new file mode 100644 index 0000000000000000000000000000000000000000..d0b8a7d6397591988272da161779fca63d5c621b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/InitView.js @@ -0,0 +1,60 @@ +define(['vent','marionette','templates','views/Main','views/LoadingMessageView','collections/Categories'], +function(vent,Marionette,templates,Main,LoadingMessageView,Categories){ + 'use strict'; + + return Marionette.CompositeView.extend({ + + tagName: 'div', + // className: 'container-fluid', + template: templates.initView, + itemView: Main, + emptyView: LoadingMessageView, + itemViewContainer: '.categories', + + events: { + 'click .validate' : 'validate', + }, + + initialize: function(){ + this.options.categories.url = "/init_categories?init=true" + this.collection = this.options.categories; + //this.collection = new Categories([],{ + // url: "/init_categories?init=true" + //}); + this.itemViewOptions = { + categories: this.collection, + debug: this.options.debug + }; + this.scrollPos = 0; + this.bindTo(vent, 'saveScrollPos', this.saveScrollPos, this); + this.options.modes.each(function(mode){ mode.set('current', false); }); + this.options.modes.get('basic').save({ current: true },{ + success: _.bind(function(){ + this.options.categories.fetch({ + success: _.bind(function(model, response){ + //this.collection.fetch({ + // success: _.bind(function(){ + // //this.collection.options.url = app.config.path_prefix+"/init_catagories"; + // }, this) + //}); + if(_.isFunction(this.options.callback)) this.options.callback(); + }, this) + }); + }, this) + }); + }, + + validate: function(){ + vent.trigger('route:validateConfig'); + }, + + saveScrollPos: function(pos){ + this.scrollPos = pos; + }, + + onRender: function(){ + window.scrollTo(0, this.scrollPos); + } + + }); +}); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/LegendView.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/LegendView.js new file mode 100644 index 0000000000000000000000000000000000000000..74c17761f3808aad422f8b8c2153f4a34c72e960 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/LegendView.js @@ -0,0 +1,23 @@ +define(['vent','marionette','templates'], +function(vent,Marionette,templates){ + 'use strict'; + + return Marionette.ItemView.extend({ + + tagName: 'div', + className: 'modal hide fade small', + template: templates.legend, + + events: { + 'click .closeDialog' : 'closeDialog' + }, + + initialize: function(){ + }, + + closeDialog: function(){ + this.$el.modal('hide'); + this.remove(); + } + }); +}); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/LoadingMessageView.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/LoadingMessageView.js new file mode 100644 index 0000000000000000000000000000000000000000..5e4450266aaae70d9611336e925e389301b7246f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/LoadingMessageView.js @@ -0,0 +1,9 @@ +define(['vent','marionette','templates'], +function(vent,Marionette,templates){ + 'use strict'; + + return Marionette.ItemView.extend({ + + template: templates.loadingMessageView + }); +}); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/Main.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/Main.js new file mode 100644 index 0000000000000000000000000000000000000000..09f7596a13f034c3bc16a42844478e48a015df11 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/Main.js @@ -0,0 +1,42 @@ +define(['vent','marionette','templates','views/TagView','views/LoadingMessageView'], +function(vent,Marionette,templates,TagView,LoadingMessageView){ + 'use strict'; + + return Marionette.CompositeView.extend({ + + tagName: 'div', + className: 'container-fluid', + template: templates.main, + itemView: TagView, + emptyView: LoadingMessageView, + itemViewContainer: '.page', + + initialize: function(){ + //this.options.categories.url = "/categories" + this.itemViewOptions = { + categories: this.options.categories, + debug: this.options.debug + }; + this.scrollPos = 0; + //this.loaded = false; + this.bindTo(vent, 'saveScrollPos', this.saveScrollPos, this); + //this.bindTo(this.model.tags, 'reset', function(){ this.loaded = true }, this); + this.bindTo(this.model.tags, 'reset', this.render, this); + this.collection = this.model.tags; + }, + + saveScrollPos: function(pos){ + this.scrollPos = pos; + }, + + render: function(){ + var r = Marionette.CompositeView.prototype.render.call(this); + //if(this.loaded) alert('loaded'); + return r; + }, + + onRender: function(){ + window.scrollTo(0, this.scrollPos); + } + }); +}); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/ModeItemView.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/ModeItemView.js new file mode 100644 index 0000000000000000000000000000000000000000..d107477d475c84411eda9c4b52c761b7665838ac --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/ModeItemView.js @@ -0,0 +1,40 @@ +define(['vent','marionette','templates'], +function(vent,Marionette,templates){ + 'use strict'; + + return Marionette.ItemView.extend({ + + tagName: 'li', + className: 'tag', + template: templates.modeItemView, + + ui: { + link: 'a' + }, + + initialize: function(){ + this.bindTo(this.model, 'change:current', this.render, this); + }, + + serializeData: function(){ + return _.extend(Marionette.View.prototype.serializeData.call(this), { + id: this.model.id + }); + }, + + templateHelpers: { + url: function(){ + return '#modes/'+ this.id; + }, + + getMode: function(){ + switch(this.name){ + case 'basic': return 'B'; break; + case 'normal': return 'N'; break; + case 'expert': return 'E'; break; + default: return 'N'; + } + } + } + }); +}); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/ModesView.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/ModesView.js new file mode 100644 index 0000000000000000000000000000000000000000..809bc774f14a6ff5c3ba77210631f66542bb8316 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/ModesView.js @@ -0,0 +1,70 @@ +define(['vent','marionette','templates','views/ModeItemView'], +function(vent,Marionette,templates,ModeItemView){ + 'use strict'; + + return Marionette.CompositeView.extend({ + + tagName: 'li', + className: 'dropdown', + template: templates.modesView, + itemView: ModeItemView, + itemViewContainer: '.dropdown-menu', + + events: { + 'click .toggleDebug': 'toggleDebug' + }, + + initialize: function(){ + this.collection = this.options.modes; + this.bindTo(this.collection, 'reset change', this.render, this); + this.bindTo(vent, 'route:setMode', this.setMode, this); + this.bindTo(vent, 'change:debug', this.render, this); + }, + + setMode: function(id){ + if(!this.collection.length) return; + var current = this.collection.get(id); + this.collection.each(function(model){ + if(model.id != id) model.set('current', false); + }); + current.save({ 'current': true },{ + success: _.bind(function(){ + this.options.categories.fetch({ + success: _.bind(function(collection){ + this.render(); + var loc = collection.get(this.options.current_category) ? this.options.current_category : collection.first().id; + Backbone.View.goTo('categories/'+loc); + }, this) + }); + }, this), + error: _.bind(function(collection, response){ + new ErrorView({ model: new Backbone.Model(response) }).render().$el.modal('show'); + }, this) + + }); + }, + + toggleDebug: function(){ + vent.trigger('route:toggleDebug'); + }, + + serializeData: function(){ + var current = this.collection.current(); + return _.extend(Marionette.View.prototype.serializeData.call(this), { + current: current ? current.get('name') : 'None', + debug: this.options.debug + }); + }, + + templateHelpers: { + getMode: function(){ + switch(this.current){ + case 'basic': return 'B'; break; + case 'normal': return 'N'; break; + case 'expert': return 'E'; break; + default: return 'N'; + } + } + } + }); +}); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/Sidebar.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/Sidebar.js new file mode 100644 index 0000000000000000000000000000000000000000..e9ee535dec1f0840fa6019b569c69a64206124a4 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/Sidebar.js @@ -0,0 +1,51 @@ +define(['marionette','vent','templates','collections/Categories','views/CategoryItemView'], +function(Marionette,vent,templates,Configs,CategoryItemView){ + 'use strict'; + + return Marionette.CompositeView.extend({ + + tagName: 'div', + className: '', + template: templates.sidebar, + itemView: CategoryItemView, + itemViewContainer: 'ul', + + ui: { + nav: 'ul' + }, + + events: { + 'click .sidebar-toggler': 'toggleSidebar', + 'click .sidebar-menu a': 'closeDropdown' + }, + + initialize: function(){ + this.collection = this.options.categories; + this.bindTo(this.collection, 'reset add', this.render, this); + this.bindTo(vent, 'route:showCategory', this.showCategory, this); + }, + + onRender: function () { + + }, + + toggleSidebar: function(){ + vent.trigger('toggleSidebar'); + }, + + closeDropdown: function(){ + if(this.$el.hasClass('in')){ console.log(this.$el); this.$el.collapse('hide'); } + }, + + showCategory: function(id){ + this.ui.nav.children(':not(.nav-header)').removeClass('active'); + this.$('a[href$="'+window.location.hash+'"]').parent().addClass('active'); + }, + + serializeData: function(){ + return _.extend(Marionette.CompositeView.prototype.serializeData.call(this), { + config: app.config + }); + } + }); +}); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/TagView.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/TagView.js new file mode 100644 index 0000000000000000000000000000000000000000..7e5c8c4c591372e8a78243a6eca180d5af8d3359 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/TagView.js @@ -0,0 +1,31 @@ +define(['vent','marionette','templates','views/VariableRowView','views/LoadingMessageView'], +function(vent,Marionette,templates,VariableRowView,LoadingMessageView){ + 'use strict'; + + return Marionette.CompositeView.extend({ + + tagName: 'div',// 'table', + className: 'row-fluid', //'table table-striped', + template: templates.tagView, + itemView: VariableRowView, + emptyView: LoadingMessageView, + itemViewContainer: 'tbody', + + initialize: function(){ + this.itemViewOptions = { + categories: this.options.categories, + debug: this.options.debug + }; + this.collection = this.model.variables; + //this.bindTo(this.collection, 'reset', this.render, this); + //this.bindTo(this, 'before:render', function(){ this.$('tbody').empty(); }, this); + } + + + /*appendHtml: function(collectionView, itemView){ + var separator = itemView.model.get('separator'); + if(separator) collectionView.$('tbody.variables').append(templates.separatorView({ separator: separator })); + collectionView.$('tbody.variables').append(itemView.el); + }*/ + }); +}); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/VariableGroupView.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/VariableGroupView.js new file mode 100644 index 0000000000000000000000000000000000000000..f0a3ce81f968e79124485ef34f93c6a2752d2b4e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/VariableGroupView.js @@ -0,0 +1,103 @@ +define(['vent','marionette','templates','collections/Variables','views/VariableMasterView'], +function(vent,Marionette,templates,Variables,VariableMasterView){ + 'use strict'; + + return Marionette.CompositeView.extend({ + + tagName : 'div', + className : 'row-fluid', + template: templates.variableGroupView, + itemView: VariableMasterView, + itemViewContainer: '.accordion', + itemViewOptions: {}, + + ui: { + accordion: '.accordion', + input: '.btn.addValue' + }, + + events: { + 'click .addValue' : 'addValue', + 'keyup .addValue' : 'onKeyup', + 'keydown .addValue': 'onKeydown', + 'click .toggle' : 'toggle' + }, + + initialize: function(){ + VariableMasterView = require('views/VariableMasterView'); + this.itemView = VariableMasterView; + this.collection = this.model.masters; + //this.bindTo(this.model, 'change:value', this.render, this); + delete this.options['model']; + this.itemViewOptions = _.extend({}, this.itemViewOptions, this.options); + }, + + onRender: function(){ + this.ui.input.tooltip(); + }, + + onKeyup: function(e){ + if(e.keyCode == 9) e.preventDefault(); + }, + + onKeydown: function(e){ + switch(e.keyCode){ + case 38: // Up + case 40: // Down + break; + case 13: // Enter + break; + case 9: // Tab + e.stopPropagation(); + e.preventDefault(); + var links = $('.btn.editBtn, .btn.addValue'); + var link; + _.each(links, function(a, i){ + if($(a).attr('href') == '#variables/'+this.model.id+'/addValue'){ + var key = i+(e.shiftKey ? -1 : +1); + if(key >= 0 && key < links.length) + link = links[key]; + } + }, this); + link = $(link ? link : (e.shiftKey ? links.last() : links.first())); + if(link.hasClass('addValue')) + link.focus(); + Backbone.View.goTo(link.attr('href').substring(1)); + } + }, + + addValue: function(){ + this.model.save({},{ + url: this.model.url()+'/addValue', + success: _.bind(function(model, response){ + var next = model.masters.length - 1; + Backbone.View.goTo('/variables/'+this.model.id+'_'+next+'/edit'); + }, this), + error: _.bind(function(model, response){ + new ErrorView({ model: new Backbone.Model(response) }).render().$el.modal('show'); + }, this) + }); + }, + + toggle: function(){ + this.ui.accordion.find('.collapse').collapse('toggle'); + }, + + serializeData: function(){ + return _.extend(Marionette.View.prototype.serializeData.call(this), { + id: this.model.id + }); + }, + + templateHelpers: { + getMode: function(){ + switch(this.mode){ + case 'basic': return 'B'; break; + case 'normal': return 'N'; break; + case 'expert': return 'E'; break; + default: return 'N'; + } + } + } + }); +}); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/VariableItemEditView.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/VariableItemEditView.js new file mode 100644 index 0000000000000000000000000000000000000000..6e883d3d48410cab1970389dce5c258dd4fd36dd --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/VariableItemEditView.js @@ -0,0 +1,312 @@ +define(['vent','marionette','templates','lib/bootstrap-select','lib/bootstrap-select2','lib/jquery-input-ip-address-control'], +function(vent,Marionette,templates){ + 'use strict'; + + return Marionette.ItemView.extend({ + + tagName : 'div', + className : 'control-group', + template: templates.variableItemEditView, + + ui: { + input : 'input[name=value], select[name=value]', + saveBtn : '.btn.save', + resetBtn : '.btn.reset', + msg : '.msg', + link : 'a' + }, + + events: { + 'keyup' : 'onKeyup', + 'keydown' : 'onKeydown', + 'blur input[name=value]' : 'onBlur', + 'blur select[name=value]' : 'onBlur', + 'click .save' : 'save', + 'click .cancel' : 'onCancelClick', + 'click .reset' : 'resetValue', + 'mousedown' : 'onMouseDown' + }, + + initialize: function(){ + this.bindTo(this.model, 'error', this.error, this); + this.bindTo(vent, 'route:editVariable', this.editVariable, this); + this.bindTo(vent, 'route:editVariableCancel', this.cancel, this); + this.model.set('_value', this.model.get('value')); + }, + + onRender: function(){ + this.ui.link.tooltip(); + this.ui.input.tooltip(); + this.ui.msg.hide(); + if(this.model.get('open')){ + this.$('.selectpicker').attr({ placeholder: this.model.get('value') }); + this.$('.selectpicker').select2({ open_value: true, width: "220px"}); + } else + this.$('.selectpicker').selectpicker({ size: 6 }); + if(this.model.get('type') == 'ip'){ + $(this.ui.input).ipAddress(); + } + if(this.model.get('type') == 'choice'){ + var selectTag = this.$('.bootstrap-select').find('button'); + selectTag.attr({ rel:"tooltip", 'data-placement': "top", 'data-toggle': "tooltip", title: this.model.get('help') }); + selectTag.tooltip(); + selectTag.on('click', _.bind(function(){ + setTimeout(function(){ + this.$('ul.dropdown-menu > li[rel=0] > a').focus(); + }, 1); + }, this)); + } + }, + + editVariable: function(id){ + if(id == this.model.id) this.focus(); + else this.cancel(); + }, + + focus: function(e){ + _.defer(_.bind(function(){ + vent.trigger('saveScrollPos', window.pageYOffset); + //this.ui.input.focusNscroll(); + this.ui.input.select(); + if(this.model.get('type') == 'choice'){ + if(this.model.get('open')) + this.ui.input.select2('open'); + else { + this.$('.bootstrap-select').find('button').focus(); + if(this.$('.dropdown-menu').css('display') == 'none') + this.$('.bootstrap-select .btn').dropdown('toggle'); + this.ui.input.trigger('change'); + this.$('ul.dropdown-menu > li[rel=0] > a').focus(); + } + } + }, this)); + return false; + }, + + sync: false, + + onBlur: function(e){ + this.ui.input.trigger('makeip'); + if(this.model.get('type') == 'ip' && this.ui.input.val() == "___.___.___.___") + this.ui.input.val(''); + if(!this.sync && this.model.get('value') != this.ui.input.val() && + (this.ui.input.val() || this.model.get('value'))) + this.save() + //else if(!this.sync && !this.model.get('open')) + // this.onCancelClick(); + }, + + onMouseDown: function(e){ + this.sync = true; setTimeout(_.bind(function(){this.sync=false;},this), 200); + }, + + onKeyup: function(e){ + // e.stopPropagation(); + if(e.keyCode == 9) e.preventDefault(); + }, + + onKeydown: function(e){ + switch(e.keyCode){ + case 38: // Up + case 40: // Down + break; + case 13: // Enter + this.sync = true; setTimeout(_.bind(function(){this.sync=false;},this), 1000); + e.stopPropagation(); + e.preventDefault(); + this.ui.input.blur(); + if(this.model.get('type') == 'choice'){ + var focused = _.find(this.$('.bootstrap-select li > a'), function(elt){ return $(elt).is(':focus'); }); + if(focused){ + $(focused).trigger('click'); + } + this.save(_.bind(this.focus, this)); + } else this.save(_.bind(function(){ },this)); + return false; + break; + case 9: // Tab + this.sync = true; setTimeout(_.bind(function(){this.sync=false;},this), 1000); + e.stopPropagation(); + e.preventDefault(); + this.ui.input.blur(); + var callback = _.bind(function(){ + var links = $('.btn.editBtn, .btn.addValue'); + var link; + _.each(links, function(a, i){ + if($(a).attr('href') == '#variables/'+this.model.id+'/edit'){ + var key = i+(e.shiftKey ? -1 : +1); + if(key >= 0 && key < links.length) + link = links[key]; + } + }, this); + link = $(link ? link : (e.shiftKey ? links.last() : links.first())); + if(link.hasClass('addValue')){ + link.focus(); + this.onCancelClick(); + } + if(link.attr('href')) + Backbone.View.goTo(link.attr('href').substring(1)); + } , this); + if((this.model.get('type') != 'ip' || this.ui.input.val() != '___.___.___.___') && + this.model.get('value') != this.ui.input.val() && + (this.ui.input.val() || this.model.get('value'))) + this.save(callback); + else callback(); + return false; + break; + } + }, + + save: function(callback){ + Backbone.View.goTo('variables/'+this.model.id+'/save'); + var value = this.ui.input.val(); + if(value == "") value = null; + this.ui.saveBtn.button('loading'); + this.ui.msg.hide(); + + if(value != this.model.get('value') || this.model.get('default_owner')){ + this.model.save({ + value: value + },{ + callback: _.isFunction(callback) ? callback : null, + success: _.bind(function(model, response){ + if(this.options.isMandatoryCollection) + //this.options.mandatories.resetAll(callback); + vent.trigger('route:validateConfig', callback); + else + this.options.categories.fetch({ + success: _.bind(function(collection){ + this.sync = false; + try { + this.model.get('tag').get('category').tags.fetch({ + success: _.bind(function(tags){ + var bkp_location = window.location.hash; + this.onCancelClick(); + this.ui.saveBtn.button('reset'); + if(tags.length == 0) + Backbone.View.goTo('categories/general'); + else { + Backbone.View.goTo('/variables/'+this.model.id+'/editCancel'); + if(_.isFunction(callback)) callback(); + else Backbone.View.goTo(bkp_location); + } + }, this), + error: _.bind(function(collection, response){ + this.model.trigger('error', response.responseText); + //new ErrorView({ model: new Backbone.Model(response) }).render().$el.modal('show'); + }, this) + }); + } catch(e) { + vent.trigger('route:reloadConfig', callback); + } + }, this), + error: _.bind(function(model, response){ + new ErrorView({ model: new Backbone.Model(response) }).render().$el.modal('show'); + }, this) + }); + }, this), + error: _.bind(function(model, response){ + this.model.trigger('error', response.responseText); + //this.error(response.responseText); + }, this) + }); + } else { + this.onCancelClick(); + this.ui.saveBtn.button('reset'); + this.model.set('value', this.model.get('_value')); + if(_.isFunction(callback)) callback(); + } + }, + + resetValue: function(callback){ + this.ui.resetBtn.button('loading'); + this.model.save({},{ + url: this.model.url()+'/reset', + callback: _.isFunction(callback) ? _.bind(callback, this) : null, + success: _.bind(function(model, response){ + this.ui.saveBtn.button('reset'); + if(this.options.isMandatoryCollection) + //this.options.mandatories.resetAll(callback); + vent.trigger('route:validateConfig', callback); + else + this.options.categories.fetch({ + success: _.bind(function(collection){ + this.sync = false; + try { + this.model.get('tag').get('category').tags.fetch({ + success: _.bind(function(tags){ + var bkp_location = window.location.hash; + this.ui.resetBtn.button('reset'); + this.onCancelClick(); + if(tags.length == 0) + Backbone.View.goTo('categories/general'); + else { + Backbone.View.goTo('/variables/'+this.model.id+'/editCancel'); + if(_.isFunction(callback)) callback(); + else Backbone.View.goTo(bkp_location); + } + }, this), + error: _.bind(function(collection, response){ + this.model.trigger('error', response.responseText); + }, this) + }); + } catch(e) { + vent.trigger('route:reloadConfig', callback); + } + }, this) + }); + }, this), + error: _.bind(function(model, response){ + this.model.trigger('error', response.responseText); + //this.error(response.responseText); + }, this) + }); + }, + + error: function(msg){ + this.ui.saveBtn.button('reset'); + this.ui.resetBtn.button('reset'); + this.$el.addClass('error'); + this.ui.msg.show().empty() + .append($('<i>').addClass('icon-warning-sign')) + this.focus(); + }, + + onCancelClick: function(){ + this.model.set('value', this.model.get('_value')); + this.ui.input.val(this.model.get('value')); + vent.trigger('route:editVariableCancel'); + Backbone.View.goTo("#variables/"+this.model.id+"/editCancel"); + this.ui.saveBtn.button('reset'); + this.$el.removeClass('error'); + this.ui.msg.empty().hide(); + this.model.trigger('error:cancel'); + //if(this.model.get('type') == 'unicode') this.ui.input.val(this.model.get('value')); + //if(this.model.get('type') == 'ip') this.ui.input.val(this.model.get('value')); + //if(this.model.get('type') == 'choice') this.ui.input.val(this.model.get('value')); + this.cancel(); + }, + + cancel: function(id){ + }, + + serializeData: function(){ + return _.extend(Marionette.View.prototype.serializeData.call(this), { + id: this.model.id + }); + }, + + templateHelpers: { + selectTag: function(){ + var $select = $('<select>').attr({ name: 'value', id: 'value-'+this.id }).addClass('selectpicker save').html(_.map(this.choices, function(choice){ + var $option = $('<option>').attr({ value: choice, id: 'value-'+this.id+'-'+choice.toLowerCase().replace(/[^a-zA-Z0-9]+/g, "-") }).text(choice); + if(this.value == choice) $option.attr({ selected: 'selected' }); + return $option; + }, this)); + //$select.append($('<option>').attr({ value: '', class: 'null_value' }).text('null')); + if(this.mandatory) $select.attr({ required: 'required' }); + return $select.wrap('<div></div>').parent().html(); + } + } + }); +}); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/VariableItemView.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/VariableItemView.js new file mode 100644 index 0000000000000000000000000000000000000000..890b56d9e4938c37388dd46c3a6a1af08bec7493 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/VariableItemView.js @@ -0,0 +1,76 @@ +define(['vent','marionette','templates','lib/bootstrap-select'], +function(vent,Marionette,templates){ + 'use strict'; + + return Marionette.Layout.extend({ + + tagName: 'div', + className: 'control-group', + template: templates.variableItemView, + + ui: { + input: '.value', + link: 'a, span', + msg: '.msg' + }, + + events: { + 'focus .value' : 'onEditClick', + 'click .calculated' : 'onEditClick' + }, + + initialize: function(){ + this.bindTo(this.model, 'change', this.render, this); + }, + + onRender: function(){ + this.ui.link.tooltip(); + this.ui.input.tooltip(); + this.ui.msg.hide(); + this.$('.selectpicker').selectpicker(); + if(this.model.get('type') == 'choice'){ + var selectTag = this.$('.bootstrap-select').find('button'); + selectTag.attr({ rel:"tooltip", 'data-placement': "top", 'data-toggle': "tooltip", title: this.model.get('help') }); + selectTag.tooltip(); + } + this.bindTo(this.model, 'error', this.error, this); + this.bindTo(this.model, 'error:cancel', this.errorCancel, this); + }, + + onEditClick: function(){ + Backbone.View.goTo('variables/'+this.model.id+'/edit'); + }, + + error: function(msg){ + this.$el.addClass('error'); + this.ui.msg.show().empty() + .append($('<i>').addClass('icon-warning-sign')) + this.ui.input.val(this.model.get('value')); + }, + + errorCancel: function(){ + this.$el.removeClass('error'); + this.ui.msg.empty().hide(); + this.ui.input.val(this.model.get('value')); + }, + + + serializeData: function(){ + return _.extend(Marionette.View.prototype.serializeData.call(this), { + id: this.model.id, + debug: this.options.debug, + model: this.model.toJSON() + }); + }, + + templateHelpers: { + getValue: function(){ + if(this.value) + if(this.value != "") return this.value; + else return "Empty String"; + else if (this.value == 0) return 0 + else return ""; + } + } + }); +}); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/VariableMasterView.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/VariableMasterView.js new file mode 100644 index 0000000000000000000000000000000000000000..2bde9cd0fc18c3cc0c0a76385ae749929fcdd6dc --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/VariableMasterView.js @@ -0,0 +1,100 @@ +define(['vent','marionette','templates','views/VariableRowView','views/VariableView'], +function(vent,Marionette,templates,VariableRowView,VariableView){ + 'use strict'; + + return Marionette.CompositeView.extend({ + + tagName: 'div', + className: 'accordion-group', + template: templates.variableMasterView, + itemViewContainer: 'tbody.slaves', + itemViewOptions: {}, + + ui: { + sub: '.sub', + link: 'a', + tooltip: '.tooltip_trigger', + error: '.alert-error', + warning: '.alert-warning' + }, + + events: { + 'click .removeValue': 'removeValue' + }, + + initialize: function(){ + this.collection = this.model.slaves; + delete this.options['model']; + this.itemViewOptions = _.extend({}, this.itemViewOptions, this.options); + if(typeof VariableRowView === 'undefined') VariableRowView = require('views/VariableRowView'); + if(typeof VariableView === 'undefined') VariableView = require('views/VariableView'); + this.itemView = VariableRowView; + this.masterView = VariableView; + this.bindTo(this.model, 'error', this.error, this); + this.bindTo(this.model, 'error:cancel', this.errorCancel, this); + }, + + onRender: function(){ + this.ui.link.tooltip(); + this.ui.tooltip.tooltip(); + this.ui.error.hide(); + this.ui.sub.html(new this.masterView(_.extend({}, this.options, { model: this.model })).render().el); + }, + + removeValue: function(){ + var callback = null; + this.model.save({},{ + url: this.model.get('group').url()+'/removeValue/'+this.model.get('index'), + success: _.bind(function(model, response){ + this.close(); + if(this.options.isMandatoryCollection) + this.options.mandatories.resetAll(callback); + else + this.options.categories.fetch({ + success: _.bind(function(collection){ + if(!this.model.get('tag')) + vent.trigger('route:reloadConfig', callback); + else + this.model.get('tag').get('category').tags.fetch({ success: _.bind(function(){ + var bkp_location = window.location.hash; + Backbone.View.goTo('/variables/'+this.model.id+'/editCancel'); + if(_.isFunction(callback)) callback(); + else Backbone.View.goTo(bkp_location); + }, this) }); + }, this) + }); + }, this), + error: _.bind(function(model, response){ + new ErrorView({ model: new Backbone.Model(response) }).render().$el.modal('show'); + }, this) + }); + }, + + error: function(msg){ + this.ui.error.show(); + this.ui.error.find('.msg').text(msg); + }, + + errorCancel: function(msg){ + this.ui.error.find('.msg').empty(); + this.ui.error.hide(); + }, + + serializeData: function(){ + return _.extend(Marionette.View.prototype.serializeData.call(this), { + debug: this.options.debug + }); + }, + + templateHelpers: { + getMode: function(){ + switch(this.mode){ + case 'basic': return 'B'; break; + case 'normal': return 'N'; break; + case 'expert': return 'E'; break; + default: return 'N'; + } + } + } + }); +}); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/VariableMultiEditView.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/VariableMultiEditView.js new file mode 100644 index 0000000000000000000000000000000000000000..426737a2c9e46969c8fea767cb158692e0c0bb65 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/VariableMultiEditView.js @@ -0,0 +1,437 @@ +define(['vent','marionette','templates','lib/bootstrap-select','lib/jquery-input-ip-address-control'], +function(vent,Marionette,templates){ + 'use strict'; + + return Marionette.CompositeView.extend({ + + tagName : 'div', + className : 'row-fluid', + template: templates.variableMultiEditView, + + ui: { + input : 'input[name=value], select[name=value]', + saveBtn : '.btn.save', + resetBtn : '.btn.reset', + msg : '.msg', + control : '.control-group', + link : 'a', + controlBtn : '.btn.btn-control' + }, + + events: { + 'keyup' : 'onKeyup', + 'keydown' : 'onKeydown', + 'blur input[name=value]' : 'onBlur', + 'blur select[name=value]' : 'onBlur', + 'mousedown .save' : 'onMouseDown', + 'mousedown .cancel' : 'onMouseDown', + 'mousedown .addItem' : 'onMouseDown', + 'mousedown .removeItem' : 'onMouseDown', + 'mousedown .reset' : 'onMouseDown', + 'mousedown .moveItem' : 'onMouseDown', + 'mouseup' : 'onMouseUp', + 'click .save' : 'onSave', + 'click .cancel' : 'onCancelClick', + 'click .addItem' : 'addItem', + 'click .removeItem' : 'removeItem', + 'click .reset' : 'resetValue', + 'click .moveItem' : 'moveItem' + }, + + onSave: function(e){ + e.preventDefault(); + Backbone.View.goTo('/variables/'+this.model.id+'/save'); + this.save(); + }, + + onMouseDown: function(e){ + this.freezeBlur = true; + }, + + onMouseUp: function(e){ + this.freezeBlur = false; + }, + + initialize: function(){ + this.freezeBlur = false; + this.model.set('_value', this.model.get('value')); + this.bindTo(this.model, 'error', this.error, this); + this.bindTo(this.model, 'change', this.render, this); + this.bindTo(this.model, 'edit', this.focus, this); + this.bindTo(vent, 'route:editVariable', this.editVariable , this); + }, + + onRender: function(){ + this.focus(); + this.ui.msg.hide(); + this.ui.link.tooltip(); + this.ui.input.tooltip(); + if(this.model.get('open')){ + this.$('.selectpicker').attr({ placeholder: this.model.get('value') }); + this.$('.selectpicker').select2({ open_value: true, width: "220px"}); + } else + this.$('.selectpicker').selectpicker({ size: 6 }); + var empty = (this.ui.input.val() == '' + ||(this.ui.input.val() == '___.___.___.___' + && this.model.get('type') == 'ip')); + this.renderControlBtn(empty); + if(this.model.get('type') == 'ip') + this.ui.input.ipAddress(); + if(this.model.get('type') == 'choice'){ + var selectTag = this.$('.bootstrap-select'); + selectTag.attr({ rel:"tooltip", 'data-placement': "top", 'data-toggle': "tooltip", title: this.model.get('help') }); + selectTag.tooltip(); + } + }, + + renderControlBtn: function(save){ + if(save){ + this.ui.controlBtn.removeClass('btn-success addItem').addClass('btn-primary save').attr({ + title: t('save'), + href: '#/variables/'+this.model.id+'/save' + }).html($('<i>').addClass('icon-ok')); + } else { + this.ui.controlBtn.removeClass('btn-primary save').addClass('btn-success addItem').attr({ + title: t('add_value'), + href: '#/variables/'+this.model.id+'/addItem' + }).data({'original-title' : t('add_value') }).html($('<i>').addClass('icon-plus')); + } + this.ui.link.tooltip(); + }, + + editVariable: function(id){ + if(id == this.model.id) this.focus(); + else this.cancel(); + }, + + addItem: function(callback){ + this.ui.input.trigger('makeip'); + var value = this.ui.input.val(); + if(value == "") value = null; + this.ui.msg.hide(); + if(value){ + //if(!_.contains(this.model.get('value'), value)){ + var values = _.clone(this.model.get('value')); + values.push(value); + this.model.save({ 'value': values },{ + success: _.bind(function(){ + this.focus(); + this.model.trigger('error:cancel'); + //this.model.set('_value', this.model.get('value')); + if(_.isFunction(callback)) callback(); + }, this), + error: _.bind(function(model, response){ + //this.model.set('value', this.model.get('_value')); + this.ui.input.val(value); + this.ui.input.trigger('makeip'); + //this.error(response.responseText); + this.model.trigger('error', response.responseText); + }, this) + }); + //} else { + //this.model.trigger('error', t('already_exists')); + //this.error('Already exists'); + //} + } + }, + + removeItem: function(e){ + var id = $(e.currentTarget).data('id'); + var values = _.clone(this.model.get('value')); + values.splice(id, 1); + this.model.save({ 'value': values },{ + success: _.bind(function(model, response){ + //this.model.set('_value', this.model.get('value')); + }, this), + error: _.bind(function(model, response){ + this.model.trigger('error', response.responseText); + //this.model.set('value', this.model.get('_value')); + }, this) + }); + }, + + editItem: function(e){ + var $target = $(e.currentTarget) + var id = $target.data('id'); + var values = _.clone(this.model.get('values')); + $target.html($('<input>').attr({type: 'text'})); + }, + + moveItem: function(e){ + var id = $(e.currentTarget).data('id'); + var values = _.clone(this.model.get('value')); + var tmp = values[id]; + values[id] = values[id+1]; + values[id+1] = tmp; + this.model.save({ 'value': values },{ + success: _.bind(function(model, response){ + //this.model.set('_value', this.model.get('value')); + }, this), + error: _.bind(function(model, response){ + this.model.trigger('error', response.responseText); + //this.model.set('value', this.model.get('_value')); + }, this) + }); + }, + + resetValue: function(callback){ + this.ui.resetBtn.button('loading'); + this.model.save({ default_owner: true },{ + url: this.model.url()+'/reset', + success: _.bind(function(model){ + if(this.options.isMandatoryCollection) + //this.options.mandatories.resetAll(callback); + vent.trigger('route:validateConfig', callback); + else + this.options.categories.fetch({ + success: _.bind(function(collection){ + this.sync = false; + try { + this.model.get('tag').get('category').tags.fetch({ + success: _.bind(function(tags){ + var bkp_location = window.location.hash; + this.onCancelClick(); + this.ui.saveBtn.button('reset'); + if(tags.length == 0) + Backbone.View.goTo('categories/general'); + else { + Backbone.View.goTo('/variables/'+this.model.id+'/editCancel'); + if(_.isFunction(callback)) callback(); + //else Backbone.View.goTo(bkp_location); + } + }, this), + error: _.bind(function(collection, response){ + this.model.trigger('error', response.responseText); + //new ErrorView({ model: new Backbone.Model(response) }).render().$el.modal('show'); + }, this) + }); + } catch(e) { + vent.trigger('route:reloadConfig', callback); + } + }, this) + }); + }, this), + error: _.bind(function(model, response){ + this.model.trigger('error', response.responseText); + //this.error(response.responseText); + }, this) + }); + }, + + focus: function(e){ + // _.defer(_.bind(function(){ + this.ui.input.trigger('click'); + this.ui.input.focusNscroll(); + this.ui.input.select(); + if(this.model.get('type') == 'choice'){ + this.$('.bootstrap-select').find('button').focus(); + if(this.$('.dropdown-menu').css('display') == 'none') + this.$('.bootstrap-select .btn').dropdown('toggle'); + this.ui.input.trigger('change'); + } + else if(this.model.get('type') == 'ip'){ + this.ui.input.val('___.___.___.___'); + } + // }, this)); + }, + + //onClick: function(e){ + // e.preventDefault(); + // return false; + //}, + + //onFocus: function(e){ + // e.preventDefault(); + // return false; + //}, + + onBlur: function(e){ + e.preventDefault() + if(this.ui.input.val() != "" || this.freezeBlur) return; + this.ui.input.trigger('makeip'); + if(this.model.get('type') == 'ip' && this.ui.input.val() == "___.___.___.___" || this.ui.input.val() == "") + this.ui.input.val(''); + // Commenté suite à #21029 + //if(!this.sync && this.model.get('value') != this.model.get('_value')) + // this.save(); + //else { + // this.onCancelClick(); + // Backbone.View.goTo('/variables/'+this.model.id+'/editCancel'); + //} + }, + + onKeyup: function(e){ + var empty = (this.ui.input.val() == '' + ||(this.ui.input.val() == '___.___.___.___' + && this.model.get('type') == 'ip')); + this.renderControlBtn(empty); + //e.stopPropagation(); + if(e.keyCode == 9) + e.preventDefault(); + //return false; + }, + + onKeydown: function(e){ + var empty = (this.ui.input.val() == '' + ||(this.ui.input.val() == '___.___.___.___' + && this.model.get('type') == 'ip')); + this.renderControlBtn(empty); + switch(e.keyCode){ + case 13: // Enter + e.stopPropagation(); + e.preventDefault(); + //this.ui.input.blur(); + if(this.model.get('type') == 'choice'){ + var focused = _.find(this.$('.bootstrap-select li > a'), function(elt){ return $(elt).is(':focus'); }); + if(focused){ + $(focused).trigger('click'); + this.addItem(_.bind(this.focus, this)); + } else this.save(); + } else + if(empty) this.save(); + else this.addItem(); + return false; + break; + case 9: // Tab + e.stopPropagation(); + e.preventDefault(); + this.ui.input.blur(); + var callback = _.bind(function(){ + var links = $('.btn.editBtn'); + var link; + _.each(links, function(a, i){ + if($(a).attr('href') == '#variables/'+this.model.id+'/edit'){ + var key = i+(e.shiftKey ? -1 : +1); + if(key >= 0 && key < links.length) + link = links[key]; + } + }, this); + link = $(link ? link : (e.shiftKey ? links.last() : links.first())); + Backbone.View.goTo(link.attr('href').substring(1)); + } , this); + if(empty) + this.save(callback); + else { + if(this.model.get('type') == 'choice') + callback(); + else + this.addItem(_.bind(function(){ + this.save(callback); + }, this)); + } + return false; + break; + } + //return false; + }, + + save: function(callback){ + Backbone.View.goTo('variables/'+this.model.id+'/save'); + this.ui.saveBtn.button('loading'); + this.ui.msg.hide(); + + if(this.model.get('_value') != this.model.get('value')){ + this.model.save({},{ + success: _.bind(function(){ + this.model.trigger('error:cancel'); + if(this.options.isMandatoryCollection) + //this.options.mandatories.resetAll(callback); + vent.trigger('route:validateConfig', callback); + else + this.options.categories.fetch({ + success: _.bind(function(collection){ + this.sync = false; + try { + this.model.get('tag').get('category').tags.fetch({ + success: _.bind(function(tags){ + var bkp_location = window.location.hash; + this.onCancelClick(); + this.ui.saveBtn.button('reset'); + if(tags.length == 0) + Backbone.View.goTo('categories/general'); + else { + Backbone.View.goTo('/variables/'+this.model.id+'/editCancel'); + if(_.isFunction(callback)) callback(); + else Backbone.View.goTo(bkp_location); + } + }, this), + error: _.bind(function(collection, response){ + this.model.trigger('error', response.responseText); + //new ErrorView({ model: new Backbone.Model(response) }).render().$el.modal('show'); + }, this) + }); + } catch(e) { + vent.trigger('route:reloadConfig', callback); + } + }, this) + }); + }, this), + error: _.bind(function(model, response){ + //this.error(response.responseText); + this.model.trigger('error', response.responseText); + }, this) + }); + } else { + this.onCancelClick(); + this.ui.saveBtn.button('reset'); + this.model.set('value', this.model.get('_value')); + if(_.isFunction(callback)) callback(); + } + }, + + onCancelClick: function(){ + Backbone.View.goTo('/variables/'+this.model.id+'/editCancel'); + vent.trigger('route:editVariableCancel'); + this.model.trigger('error:cancel'); + this.ui.control.removeClass('error'); + this.quit(); + }, + + cancel: function(){ + //this.model.set('value', this.model.get('_value')); + this.ui.control.removeClass('error'); + this.model.trigger('error:cancel'); + this.ui.input.val(''); + this.quit(); + }, + + quit: function(){ + this.ui.msg.hide(); + this.ui.saveBtn.button('reset'); + this.ui.resetBtn.button('reset'); + if(this.model.get('type') == 'str') this.ui.input.val(''); + if(this.model.get('type') == 'choice') this.ui.input.val(this.model.get('value')); + }, + + error: function(msg){ + this.focus(); + this.ui.saveBtn.button('reset'); + this.ui.resetBtn.button('reset'); + this.ui.control.addClass('error'); + this.ui.msg.show().empty() + .append($('<i>').addClass('icon-warning-sign')) + //.append(' '+msg) + ; + }, + + serializeData: function(){ + //if(this.model.get('_value') != this.model.get('value') && this.model.get('default_owner')) + // this.model.set('default_owner', false); + return _.extend(Marionette.View.prototype.serializeData.call(this), { + id: this.model.id + }); + }, + + templateHelpers: { + selectTag: function(){ + var $select = $('<select>').attr({ name: 'value', id: 'input-'+this.id }).addClass('selectpicker').html(_.map(this.choices, function(choice){ + var $option = $('<option>').attr({ value: choice, id: 'value-'+this.id+'-'+choice.toLowerCase().replace(/[^a-zA-Z0-9]+/g, "-") }).text(choice); + if(this.value == choice) $option.attr({ selected: 'selected' }); + return $option; + }, this)); + if(this.mandatory) $select.attr({ required: 'required' }); + return $select.wrap('<div></div>').parent().html(); + } + } + }); +}); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/VariableMultiView.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/VariableMultiView.js new file mode 100644 index 0000000000000000000000000000000000000000..eb631ae4689b6ba3e05b299d81531f2d8c90b359 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/VariableMultiView.js @@ -0,0 +1,31 @@ +define(['vent','marionette','templates'], +function(vent,Marionette,templates){ + 'use strict'; + + return Marionette.CompositeView.extend({ + + tagName : 'div', + className : 'row-fluid', + template: templates.variableMultiView, + + ui: { + input: '.multi', + link: 'a' + }, + + initialize: function(){ + this.bindTo(this.model, 'change', this.render, this); + }, + + onRender: function(){ + this.ui.link.tooltip(); + this.ui.input.tooltip(); + }, + + serializeData: function(){ + return _.extend(Marionette.View.prototype.serializeData.call(this), { + id: this.model.id + }); + } + }); +}); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/VariableRowView.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/VariableRowView.js new file mode 100644 index 0000000000000000000000000000000000000000..68d98dbeed69f5f57d27c7316ab573d60d05acbc --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/VariableRowView.js @@ -0,0 +1,112 @@ +define(['vent','marionette','templates','views/VariableView'], +function(vent,Marionette,templates,VariableView){ + 'use strict'; + + return Marionette.Layout.extend({ + + tagName: 'tr', + className: '', + template: templates.variableRowView, + + ui: { + tooltip: '.tooltip_trigger', + error: '.alert-error', + warning: '.alert-warning', + resetBtn : '.btn.resetgroup', + link: 'a' + }, + + events: { + 'click .resetgroup' : 'resetValueGroup' + }, + + regions: { + view: '.view', + }, + + initialize: function(){ + this.bindTo(this.model, 'error', this.error, this); + this.bindTo(this.model, 'error:cancel', this.errorCancel, this); + }, + + onRender: function(){ + this.ui.tooltip.tooltip(); + this.ui.link.tooltip(); + this.ui.error.hide(); + if(typeof VariableView === 'undefined') VariableView = require('views/VariableView'); + this.view.show(new VariableView(_.extend(this.options, { model: this.model }))); + }, + + error: function(msg){ + this.ui.error.show(); + this.ui.error.find('.msg').text(msg); + }, + + errorCancel: function(msg){ + this.ui.error.find('.msg').empty(); + this.ui.error.hide(); + }, + + resetValueGroup: function(callback){ + this.ui.resetBtn.button('loading'); + this.model.save({groupid: this.model.id},{ + url: this.model.url()+'_0/reset', + callback: _.isFunction(callback) ? _.bind(callback, this) : null, + success: _.bind(function(model, response){ + if(this.options.isMandatoryCollection) + //this.options.mandatories.resetAll(callback); + vent.trigger('route:validateConfig', callback); + else + this.options.categories.fetch({ + success: _.bind(function(collection){ + this.sync = false; + try { + this.model.get('tag').get('category').tags.fetch({ + success: _.bind(function(tags){ + var bkp_location = window.location.hash; + this.ui.resetBtn.button('reset'); + if(tags.length == 0) + Backbone.View.goTo('categories/general'); + else { + Backbone.View.goTo('/variables/'+this.model.id+'/editCancel'); + if(_.isFunction(callback)) callback(); + else Backbone.View.goTo(bkp_location); + } + }, this), + error: _.bind(function(collection, response){ + this.model.trigger('error', response.responseText); + }, this) + }); + } catch(e) { + vent.trigger('route:reloadConfig', callback); + } + }, this) + }); + }, this), + error: _.bind(function(model, response){ + this.model.trigger('error', response.responseText); + //this.error(response.responseText); + }, this) + }); + }, + + + serializeData: function(){ + return _.extend(Marionette.View.prototype.serializeData.call(this), { + breadcrumbs: this.options.breadcrumbs || false, + debug: this.options.debug + }); + }, + + templateHelpers: { + getMode: function(){ + switch(this.mode){ + case 'basic': return 'B'; break; + case 'normal': return 'N'; break; + case 'expert': return 'E'; break; + default: return 'N'; + } + } + } + }); +}); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/VariableView.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/VariableView.js new file mode 100644 index 0000000000000000000000000000000000000000..3c3bcfd63ebfff537e471b32b2a51cde46d432c7 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/static/js/views/VariableView.js @@ -0,0 +1,69 @@ +define(['vent','marionette','templates', + 'views/VariableItemView' , 'views/VariableItemEditView', + 'views/VariableMultiView', 'views/VariableMultiEditView', + 'views/VariableGroupView'], +function(vent,Marionette,templates, + VariableItemView, VariableItemEditView, + VariableMultiView, VariableMultiEditView, + VariableGroupView){ + 'use strict'; + + return Marionette.Layout.extend({ + + tagName: 'div', + className: '', + template: templates.variableView, + + regions: { + show: '.show', + edit: '.edit' + }, + + initialize: function(){ + this.bindTo(vent, 'route:editVariable', this.editVariable, this); + this.bindTo(vent, 'route:editVariableCancel', this.editVariableCancel, this); + this.options = _.extend({}, this.options, { model: this.model }); + + switch(this.model.getType()){ + case 'multi' : + if(typeof VariableMultiView === 'undefined') VariableMultiView = require('views/VariableMultiView'); + if(typeof VariableMultiEditView === 'undefined') VariableMultiEditView = require('views/VariableMultiEditView'); + this.showView = new VariableMultiView(this.options); + this.editView = new VariableMultiEditView(this.options); + break; + case 'group' : + if(typeof VariableGroupView === 'undefined') VariableGroupView = require('views/VariableGroupView'); + this.showView = new VariableGroupView(this.options); + this.editView = null;//new VariableGroupEditView(this.options); + break; + default: + if(typeof VariableItemView === 'undefined') VariableItemView = require('views/VariableItemView'); + if(typeof VariableItemEditView === 'undefined') VariableItemEditView = require('views/VariableItemEditView'); + this.showView = new VariableItemView(this.options); + this.editView = new VariableItemEditView(this.options); + } + }, + + onRender: function(){ + this.$el.removeClass('editing'); + if(this.editView) this.edit.show(this.editView); + this.show.show(this.showView); + }, + + focus: function(){ + // $('body').scrollTo(this.$el.parent().parent().parent(), 0, { axis: 'y', offset: -80 }); + }, + + editVariable: function(id){ + if(this.model.id == id){ + if(this.model.getType() != 'group' && this.model.get('editable')) + this.$el.addClass('editing'); + this.focus(); + } else this.$el.removeClass('editing'); + }, + + editVariableCancel: function(){ + this.$el.removeClass('editing'); + } + }); +}); diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/templates/form_pam.html b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/templates/form_pam.html new file mode 100644 index 0000000000000000000000000000000000000000..52884b0108651ae29e110c932e2343644391eba7 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/templates/form_pam.html @@ -0,0 +1,112 @@ +<!DOCTYPE html> +<html> +<head> + <link rel="stylesheet" href="static/css/bootstrap.css"> + <link rel="stylesheet" href="static/css/bootstrap-responsive.css"> + <link rel="stylesheet" href="static/css/font-awesome.css"> + <link rel="stylesheet" href="static/css/font-mfizz.css"> + <title>Genconfig - Sign in</title> + <style> + body { + background: url(static/img/bg.png) top left repeat; + } + .login { + padding-top: 20px; + } + @media (min-width: 767px){ + .login { + padding-top: 60px; + } + } + </style> + <script type="text/javascript" src="static/js/lib/jquery.min.js"></script> + <script type="text/javascript" src="static/js/lib/bootstrap.min.js"></script> +</head> +<body> + +<div class="container"> + <div class="row"> + <div class="span4 offset4 login"> + <div class="well"> + <legend> + <span class="pull-left"> + GenConfig + </span> + <span class="pull-right"> + <a href="#quitGenConfig" id="quitGenConfig" class="btn btn-small btn-danger"> + <i class="icon-off"></i> + </a> + </span> + <div class="clearfix"></div> + </legend> + <form method="POST" action="" accept-charset="UTF-8"> + <input type="hidden" id="app_url" name="app_url" value="{{ request.args.get('app_url', '') }}" /> + {% if request.form.get('credentials', '') or request.form.get('login','') %} + <div class="alert alert-error"> + <a class="close" data-dismiss="alert" href="#">×</a> + Échec de l'authentification + </div> + {% endif %} + {% if errors %} + {% for error in errors %} + <div class="alert alert-error"> + <a class="close" data-dismiss="alert" href="#">×</a> + {{ error }} + </div> + {% endfor %} + {% endif %} + <div class="row-fluid"> + <input class="span12" placeholder="Utilisateur" type="text" name="login" id="login" id="login" autocomplete="off" + {% if user %} + disabled="disabled" value="{{ user }}" + {% endif %} + /> + </div> + <div class="row-fluid"> + <input class="span12" placeholder="Mot de passe" type="password" name="credentials" id="credentials" autocomplete="off"> + </div> + <div class="row-fluid"> + <button class="btn btn-primary span12" type="submit"><i class="icon-signin"></i> Connexion</button> + </div> + </form> + </div> + </div> + </div> + <div class="row"> + <div class="span4 offset4 login"> + </div> + </div> + +</div> + +<script type="text/javascript"> + +(function($){ + + var path_prefix = location.pathname.split('/').slice(0, -1).join('/'); + var application = /application/.test(window.location.search); + + {% if user %} + $('#credentials').focus(); + {% else %} + $('#login').focus(); + {% endif %} + + if(!application){ + $('#quitGenConfig').remove() + } else { + $('#quitGenConfig').click(function(){ + $.ajax({ + type: 'POST', + async: false, + data: { kill: true }, + url: path_prefix+"/quit" + }); + }); + } + +}(jQuery)); + +</script> +</body> +</html> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/templates/index.html b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/templates/index.html new file mode 100644 index 0000000000000000000000000000000000000000..95e416b1cbeac3dfe4e4ac744454ef770bfa3189 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/templates/index.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<!--[if lt IE 7]> <html class="no-js ie6 oldie" lang="en"> <![endif]--> +<!--[if IE 7]> <html class="no-js ie7 oldie" lang="en"> <![endif]--> +<!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]--> +<!--[if gt IE 8]><!--> +<html class="no-js" lang="en"> +<!--<![endif]--> +<head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> + <!-- Developpment only --> + <META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE,NO-STORE"> + + <title>GenConfig</title> + + <meta name="description" content=""> + <meta name="author" content=""> + <meta name="viewport" content="width=device-width,initial-scale=1"> + <link rel="stylesheet" href="static/css/bootstrap.css"> + <link rel="stylesheet" href="static/css/bootstrap-responsive.css"> + <link rel="stylesheet" href="static/css/font-awesome.css"> + <link rel="stylesheet" href="static/css/font-mfizz.css"> + <link rel="stylesheet" href="static/css/bootstrap-select.css"> + <link rel="stylesheet" href="static/css/select2.css"> + <link rel="stylesheet" href="static/css/bootstrap-select2.css"> + <link rel="stylesheet" href="static/css/app.css"> + <link rel="stylesheet" href="static/css/responsive.css"> + <link rel="stylesheet" href="static/css/default.css"> + <link rel="stylesheet" href="static/css/uniform.css"> +</head> +<body class="fixed-top"> + <header id="header" class="navbar navbar-inverse navbar-fixed-top"></header> + <section id="container" class="row-fluid"></section> + <footer id="footer"></footer> + <script data-main="static/js/main" src="static/js/lib/require.js"></script> +</body> +</html> + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/templates/login.html b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/templates/login.html new file mode 100644 index 0000000000000000000000000000000000000000..e40bcea5d898d5a8d9752c2bb9198acd0384256a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/templates/login.html @@ -0,0 +1,115 @@ +<!DOCTYPE html> +<html> +<head> + <link rel="stylesheet" href="static/css/bootstrap.css"> + <link rel="stylesheet" href="static/css/bootstrap-responsive.css"> + <link rel="stylesheet" href="static/css/font-awesome.css"> + <link rel="stylesheet" href="static/css/font-mfizz.css"> + <title>Genconfig - Sign in</title> + <style> + body { background: url(static/img/bg.png) top left repeat; } + .no-margin { margin: 0 !important; } + .alert { margin-bottom: 10px; } + .login { padding-top: 20px; } + @media (min-width: 767px){ + .login { padding-top: 60px; } + } + </style> + <script type="text/javascript" src="static/js/lib/jquery.min.js"></script> + <script type="text/javascript" src="static/js/lib/bootstrap.min.js"></script> +</head> +<body> + +<div class="container"> + <div class="row"> + <div class="span4 offset4 login"> + <div class="well"> + <legend> + <span class="pull-left"> + <i class="icon-cogs"></i> + GenConfig + </span> + <span class="pull-right"> + <a href="#quitGenConfig" id="quitGenConfig" class="btn btn-small btn-danger"> + <i class="icon-off"></i> + </a> + </span> + <div class="clearfix"></div> + </legend> + <form method="POST" action="" accept-charset="UTF-8"> + <input type="hidden" id="app_url" name="app_url" value="{{ request.args.get('app_url', '') }}" /> + {% with messages = get_flashed_messages(with_categories=true) %} + {% if messages %} + {% for category, message in messages %} + <div class="alert alert-{{ category }}"> + <a class="close" data-dismiss="alert" href="#">×</a> + {{ message }} + </div> + {% endfor %} + {% endif %} + {% endwith %} + {% if zephir_available %} + <div class="alert alert-info"> + <!--a class="close" data-dismiss="alert" href="#">×</a--> + <i class="icon-info-sign"></i> + <strong>Serveur Zéphir détecté</strong> sur {{ zephir_server_ip }} (ID: {{ zephir_server_id }}) + <br /> + <input type="checkbox" name="sync" id="sync" checked="checked" class="no-margin" /> Synchroniser la configuration distante <br />(si disponible) + </div> + {% endif %} + <div class="row-fluid"> + <input class="span12" placeholder="Utilisateur" type="text" name="username" id="username" autocomplete="off" + {% if user %} + disabled="disabled" value="{{ user }}" + {% endif %} + /> + </div> + <div class="row-fluid"> + <input class="span12" placeholder="Mot de passe" type="password" name="password" id="password" autocomplete="off"> + </div> + <div class="row-fluid"> + <button class="btn btn-primary span12" type="submit"><i class="icon-signin"></i> Connexion</button> + </div> + </form> + </div> + </div> + </div> + <div class="row"> + <div class="span4 offset4 login"> + </div> + </div> + +</div> + +<script type="text/javascript"> + +(function($){ + + var path_prefix = location.pathname.split('/').slice(0, -1).join('/'); + var application = /application/.test(window.location.search); + + {% if user %} + $('#password').focus(); + {% else %} + $('#username').focus(); + {% endif %} + + if(!application){ + $('#quitGenConfig').remove() + } else { + $('#quitGenConfig').click(function(){ + $.ajax({ + type: 'POST', + async: false, + data: { kill: true }, + url: path_prefix+"/quit" + }); + }); + } + +}(jQuery)); + +</script> +</body> +</html> + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/templates/test.html b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/templates/test.html new file mode 100644 index 0000000000000000000000000000000000000000..4949ccf9a06b4f30346a70d98a2eaddbf74bf5d2 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/files/usr/share/eole/flask/genconfig/templates/test.html @@ -0,0 +1,12 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/html4/loose.dtd"> +<html> +<head> + <title>GenConfig Spec Runner</title> + <link rel="stylesheet" type="text/css" href="css/jasmine.css"> + <script data-main="js/test.js" src="js/lib/require.js"></script> +</head> +<body> + <div id="sandbox" style="overflow: hidden; height: 1px;"></div> +</body> +</html> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..f80c944f1ff8edb7851b29fca6f4d54723c0cd60 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/service.yml @@ -0,0 +1,945 @@ +format: '0.1' +name: eole-genconfig +version: |- + 2.6.2-11 +description: |- + manage EOLE configuration + eole-genconfig permit to manage configuration of EOLE servers through + a web application. + . + This package provides the configuration for eole-flask-server and the + web application files. + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: + - eole-flask +packages: + - python-eolegenconfig + - eoleflask-aaa +dictionaries: + - 29_genconfig.xml +extra_dictionaries: {} +templates: + - genconfig.nginx.conf + - genconfig.apache.conf +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: [] +files: + /etc/eole/flask/available/eolegenconfig.conf: + owner: root + group: root + mode: '0644' + /etc/chromium-browser/policies/managed/genconfig.json: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/templates/index.html: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/templates/login.html: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/templates/test.html: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/templates/form_pam.html: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/collections/Variables.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/collections/Categories.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/collections/Modes.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/collections/Tags.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/templates.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/app.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/lib/jasmine-html.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/lib/bootstrap-typeahead.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/lib/bootstrap-contextmenu.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/lib/bootstrap.min.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/lib/jquery.min.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/lib/tpl.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/lib/jquery-input-ip-address-control.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/lib/underscore.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/lib/jquery.ui.widget.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/lib/i18n.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/lib/jasmine.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/lib/jquery.iframe-transport.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/lib/backbone.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/lib/bootstrap-select.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/lib/modernizr.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/lib/underscore-string.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/lib/prettify.min.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/lib/jquery.fileupload.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/lib/backbone.marionette.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/lib/bootstrap-select2.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/lib/backbone-localStorage.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/lib/require.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/helpers/util.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/strings.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/test.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/spec/views/SidebarSpec.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/spec/models/CategorySpec.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/spec/SpecHelper.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/main.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/templates/diffVariableView.tmpl: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/templates/modeItemView.tmpl: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/templates/body.tmpl: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/templates/variableMasterView.tmpl: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/templates/tagView.tmpl: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/templates/initView.tmpl: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/templates/modesView.tmpl: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/templates/separatorView.tmpl: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/templates/footer.tmpl: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/templates/legend.tmpl: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/templates/variableMultiEditView.tmpl: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/templates/header.tmpl: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/templates/variableItemView.tmpl: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/templates/loadingMessageView.tmpl: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/templates/fillMandatoriesView.tmpl: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/templates/discardConfigView.tmpl: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/templates/variableItemEditView.tmpl: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/templates/sidebar.tmpl: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/templates/diffVariablesView.tmpl: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/templates/categoryItemView.tmpl: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/templates/errorView.tmpl: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/templates/variableRowView.tmpl: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/templates/variableGroupView.tmpl: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/templates/variableView.tmpl: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/templates/main.tmpl: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/templates/emptyDiffView.tmpl: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/templates/variableMultiView.tmpl: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/vent.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/kb.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/views/TagView.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/views/LegendView.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/views/VariableRowView.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/views/ErrorView.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/views/LoadingMessageView.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/views/FillMandatoriesView.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/views/VariableMultiView.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/views/Sidebar.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/views/VariableMultiEditView.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/views/CategoryItemView.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/views/ModeItemView.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/views/ModesView.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/views/Body.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/views/DiffVariablesView.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/views/VariableItemView.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/views/Main.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/views/VariableMasterView.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/views/DiffVariableView.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/views/VariableView.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/views/VariableItemEditView.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/views/VariableGroupView.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/views/InitView.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/views/Header.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/views/DiscardConfigView.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/views/Footer.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/models/Category.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/models/Mode.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/models/Tag.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/models/Variable.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/models/User.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/nls/fr-fr/genconfig.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/nls/en-us/genconfig.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/nls/genconfig.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/controllers/index.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/js/routers/index.js: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/css/default.css: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/css/app.css: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/css/bootstrap.min.css: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/css/bootstrap-select.css: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/css/select2.css: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/css/uniform.css: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/css/bootstrap.css: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/css/bootstrap-select2.css: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/css/bootstrap-responsive.min.css: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/css/responsive.css: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/css/font-awesome.css: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/css/font-awesome.min.css: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/css/bootstrap-responsive.css: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/css/font-mfizz.css: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/css/jasmine.css: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-Black-webfont.eot: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-Medium-Italic-webfont.eot: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-Bold-Italic-webfont.eot: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/font-mfizz/RELEASE-NOTES.md: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/font-mfizz/LICENSE.txt: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/font-mfizz/font-mfizz.eot: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/font-mfizz/font-mfizz.svg: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/font-mfizz/font-mfizz.ttf: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/font-mfizz/README.md: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/font-mfizz/icons.json: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/font-mfizz/preview.html: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/font-mfizz/font-mfizz.woff: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/font-mfizz/font-mfizz.css: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-Light-webfont.woff: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-DemiBold-Italic-webfont.eot: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-ExtraLight-webfont.ttf: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-Light-Italic-webfont.svg: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-Light-webfont.svg: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-Regular-Italic-webfont.woff: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-Thin-webfont.woff: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-Thin-webfont.ttf: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-Black-webfont.svg: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/fontawesome-webfont.woff: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/fontawesome-webfont.woff2: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-ExtraBold-Italic-webfont.ttf: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/FontAwesome.otf: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-Bold-webfont.svg: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-ExtraLight-webfont.woff: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo SIL OFL Font License 1.1.txt: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-DemiBold-webfont.woff: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-DemiBold-Italic-webfont.ttf: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-Thin-webfont.eot: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-Medium-webfont.woff: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-Regular-Italic-webfont.eot: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-DemiBold-webfont.svg: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-ExtraLight-webfont.eot: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-ExtraLight-Italic-webfont.eot: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-Thin-Italic-webfont.eot: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-Bold-Italic-webfont.svg: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-Light-Italic-webfont.eot: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-Black-Italic-webfont.svg: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-Bold-webfont.woff: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-DemiBold-webfont.ttf: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-Bold-Italic-webfont.ttf: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-Thin-Italic-webfont.woff: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-Regular-webfont.ttf: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-ExtraLight-Italic-webfont.svg: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-DemiBold-Italic-webfont.svg: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-ExtraBold-Italic-webfont.eot: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-Black-Italic-webfont.ttf: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-Black-Italic-webfont.eot: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-Light-webfont.eot: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-Black-webfont.ttf: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-Thin-Italic-webfont.svg: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-Medium-Italic-webfont.woff: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-Regular-Italic-webfont.ttf: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/fontawesome-webfont.ttf: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-ExtraBold-Italic-webfont.svg: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-Regular-webfont.eot: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-Light-webfont.ttf: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-ExtraBold-Italic-webfont.woff: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-ExtraLight-webfont.svg: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-Black-Italic-webfont.woff: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-Thin-webfont.svg: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-Light-Italic-webfont.ttf: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-Regular-Italic-webfont.svg: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-DemiBold-Italic-webfont.woff: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-ExtraBold-webfont.ttf: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-Bold-webfont.eot: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-Medium-webfont.eot: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-ExtraBold-webfont.woff: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-ExtraLight-Italic-webfont.woff: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-Thin-Italic-webfont.ttf: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-Bold-webfont.ttf: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-Regular-webfont.woff: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/fontawesome-webfont.svg: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-Medium-webfont.svg: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-DemiBold-webfont.eot: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/fontawesome-webfont.eot: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-Medium-Italic-webfont.svg: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-Black-webfont.woff: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-Medium-Italic-webfont.ttf: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-ExtraBold-webfont.svg: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-ExtraBold-webfont.eot: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-Bold-Italic-webfont.woff: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-ExtraLight-Italic-webfont.ttf: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-Regular-webfont.svg: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-Light-Italic-webfont.woff: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/font/Exo-Medium-webfont.ttf: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/README.txt: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/img/bread-crumb-bg.jpg: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/img/bread-crumb-divider.jpg: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/img/body-bg.jpg: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/img/glyphicons-halflings.png: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/img/bread-crumb-last.png: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/img/top-bg.jpg: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/img/bg-default.jpg: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/img/body-bg.png: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/img/icons/th.png: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/img/icons/fr.png: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/img/icons/en.png: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/img/bread-crumb-last.jpg: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/img/side-bar-list-bg.png: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/img/select2x2.png: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/img/bread-crumb-divider.png: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/img/select2.png: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/img/bg.png: + owner: root + group: root + mode: '0644' + /usr/share/eole/flask/genconfig/static/img/glyphicons-halflings-white.png: + owner: root + group: root + mode: '0644' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/templates/genconfig.apache.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/templates/genconfig.apache.conf new file mode 100644 index 0000000000000000000000000000000000000000..5e3af1db3d2c92df0b9d40265c94d9ce4f42f9d9 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/templates/genconfig.apache.conf @@ -0,0 +1,36 @@ +# Tells apache where static/... should go +AliasMatch %%genconfig_http_path/(static/.*) /usr/share/eole/flask/genconfig/$1 + +# Proxy everything to gunicorn EXCEPT .../static +ProxyPassMatch %%genconfig_http_path/static ! +ProxyPreserveHost On + +<Location %%genconfig_http_path> + RewriteEngine On + RewriteCond %{HTTPS} off + RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] + + ProxyPass http://127.0.0.1:5000/genconfig + ProxyPassReverse http://127.0.0.1:5000/genconfig + RequestHeader set X-Forwarded-Proto "https" + + # Default to Deny + Order Allow,Deny + %for %%interface in %%range(%%int(%%nombre_interfaces)) + %if %%getVar('ssh_eth{0}'.format(%%interface), 'non') == 'oui' + + # ssh_eth%%interface + %for %%admin_net in %%getVar('ip_ssh_eth{0}'.format(%%interface)) + %set %%mask = %%getattr(%%admin_net, 'netmask_ssh_eth{0}'.format(%%interface)) + %set %%net = %%admin_net + '/' + %%mask + %if %%net == '0.0.0.0/0.0.0.0' + Allow from all + %elif %%mask == '255.255.255.255' + Allow from %%admin_net; + %else + Allow from %%net + %end if + %end for + %end if + %end for +</Location> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/templates/genconfig.nginx.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/templates/genconfig.nginx.conf new file mode 100644 index 0000000000000000000000000000000000000000..63d4b234248408d35b46018b95bf05d646c764c4 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-genconfig/templates/genconfig.nginx.conf @@ -0,0 +1,46 @@ +location %%genconfig_http_path { + access_log /var/log/nginx/genconfig-access.log; + error_log /var/log/nginx/genconfig-error.log; + proxy_pass https://127.0.0.1:7000/genconfig; + proxy_set_header X-Forwarded-Proto $scheme; + %for %%interface in %%range(%%int(%%nombre_interfaces)) + %if %%getVar('ssh_eth{0}'.format(%%interface), 'non') == 'oui' + + # ssh_eth%%interface + %for %%admin_net in %%getVar('ip_ssh_eth{0}'.format(%%interface)) + %set %%net = %%admin_net + '/' + %%calc_classe(%%getattr(%%admin_net, 'netmask_ssh_eth{0}'.format(%%interface))) + %if %%net == '0.0.0.0/0.0.0.0' + allow all; + %else + allow %%net; + %end if + %end for + %end if + %end for + + # Deny by default + deny all; +} + +location %%genconfig_http_path/static { + access_log /var/log/nginx/genconfig-access.log; + error_log /var/log/nginx/genconfig-error.log; + alias /usr/share/eole/flask/genconfig/static; + %for %%interface in %%range(%%int(%%nombre_interfaces)) + %if %%getVar('ssh_eth{0}'.format(%%interface), 'non') == 'oui' + + # ssh_eth%%interface + %for %%admin_net in %%getVar('ip_ssh_eth{0}'.format(%%interface)) + %set %%net = %%admin_net + '/' + %%calc_classe(%%getattr(%%admin_net, 'netmask_ssh_eth{0}'.format(%%interface))) + %if %%net == '0.0.0.0/0.0.0.0' + allow all; + %else + allow %%net; + %end if + %end for + %end if + %end for + + # Deny by default + deny all; +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-glpi/dictionaries/52_esbl_glpi.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-glpi/dictionaries/52_esbl_glpi.xml new file mode 100644 index 0000000000000000000000000000000000000000..dbd0ca4dab64bbebc1d70e547d38f91415a6d8a0 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-glpi/dictionaries/52_esbl_glpi.xml @@ -0,0 +1,164 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + <files> + <file name="/usr/share/eole/db/glpi/updates/glpi-update.sql" filelist="glpi_files" mkdir="True"/> + <file name="/etc/eole/eole-db.d/glpi.yml" filelist="glpi_files" rm="True"/> + </files> + + <containers> + <container name='web' id='15'> + <package>glpi</package> + <package>glpi-plugin-ocsinventoryng</package> + <service method="apache" servicelist='glpi'>glpi</service> + <file name='/etc/apache2/sites-available/glpi' source="apache-glpi.conf"/> + <file name="/var/www/html/glpi/config/config_db.php" rm="True" filelist="glpi_files" mode="0540" owner="www-data" group="www-data" source='glpi_config_db.php'/> + </container> + </containers> + + <variables> + <family name="applications web"> + <variable name="activer_glpi" type="oui/non" description="Activer GLPI"> + <value>non</value> + </variable> + </family> + <family name="glpi" icon='laptop'> + <variable name="glpi_config_email" type="string" + description="Configurer les envois d'emails"> + <value>ne rien faire</value> + </variable> + <variable name="glpi_admin_email" type="string" + description="Adresse email de l'admin"> + </variable> + <variable name="glpi_ldap_auth" type="string" + description="Activer l'authentification LDAP non chiffrée"> + <value>ne rien faire</value> + </variable> + <variable name="glpi_domainadmins_dn" type="string" mandatory="True" + description='DN du groupe DomainAdmins pour ajout "super-admin" GLPI'> + </variable> + <variable name="glpi_cas_auth" type="string" + description="Activer l'authentification CAS"> + <value>ne rien faire</value> + </variable> + <variable name='glpi_db_mode' type='string' description="Mode de fonctionnement de la base de données" mode='expert' mandatory='True'> + <value>default</value> + </variable> + <variable name='glpi_db_host' type='string' description="Adresse de la base de données" mode='expert' mandatory='True'/> + <variable name='glpi_db_port' type='number' description="Port de la base de données" mode='expert' mandatory='True'/> + <variable name='glpi_db_root' type='string' description="Compte d'adminstration de la base de données" mode='expert' mandatory='True'/> + <variable name='glpi_db_root_passwd_path' type='filename' description="Chemin du fichier de mot de passe pour l'administration de la base de données" mode='expert' mandatory='True'/> + <variable name='glpi_db_extra_allowed_hosts' type='string' description="Hôtes supplémentaires autorisés à se connecter à la base de données" mode='expert' multi='True' mandatory='True'/> + <variable name='glpi_helpdesk_doc_source' type='string' description="Type d'URL de l'aide helpdesk" mode='expert'> + <value>personnalisée</value> + </variable> + <variable name='glpi_helpdesk_doc_url' type='string' description="URL de l'aide helpdesk" mode='expert'/> + <variable name='glpi_central_doc_source' type='string' description="Type d'URL de l'aide centrale" mode='expert'> + <value>personnalisée</value> + </variable> + <variable name='glpi_central_doc_url' type='string' description="URL de l'aide centrale" mode='expert'/> + + </family> + </variables> + + <constraints> + <check name="valid_enum" target="glpi_config_email"> + <param>['ne rien faire','oui','non']</param> + </check> + <check name="valid_enum" target="glpi_ldap_auth"> + <param>['ne rien faire','oui','non']</param> + </check> + <check name="valid_enum" target="glpi_cas_auth"> + <param>['ne rien faire','oui','non']</param> + </check> + <check name='valid_enum' target='glpi_db_mode'> + <param>['default', 'local', 'externe']</param> + </check> + <check name='valid_enum' target='glpi_helpdesk_doc_source'> + <param>['personnalisée', 'officielle']</param> + </check> + <check name='valid_enum' target='glpi_central_doc_source'> + <param>['personnalisée', 'officielle']</param> + </check> + <fill name='calc_multi_condition' target='glpi_helpdesk_doc_url'> + <param>personnalisée</param> + <param type='eole' name='condition_1'>glpi_helpdesk_doc_source</param> + <param name='match'>http://pne.metier.e2.rie.gouv.fr/glpi-r677.html</param> + <param name='default_mismatch'>http://www.glpi-project.org/spip.php?rubrique3</param> + </fill> + <fill name='calc_multi_condition' target='glpi_central_doc_url'> + <param>personnalisée</param> + <param type='eole' name='condition_1'>glpi_central_doc_source</param> + <param name='match'>http://pne.metier.e2.rie.gouv.fr/glpi-r677.html</param> + <param name='default_mismatch'>http://www.glpi-project.org/spip.php?rubrique3</param> + </fill> + <condition name='disabled_if_in' source='glpi_helpdesk_doc_source'> + <param>officielle</param> + <target type='variable'>glpi_helpdesk_doc_url</target> + </condition> + <condition name='disabled_if_in' source='glpi_central_doc_source'> + <param>officielle</param> + <target type='variable'>glpi_central_doc_url</target> + </condition> + + + <condition name="disabled_if_in" source='activer_glpi'> + <param>non</param> + <target type='filelist'>glpi_files</target> + <target type='family'>glpi</target> + <target type='servicelist'>glpi</target> + </condition> + <condition name='disabled_if_in' source='activer_client_ldap' fallback='True'> + <param>non</param> + <target type='variable'>glpi_ldap_auth</target> + </condition> + <condition name='disabled_if_in' source='glpi_db_mode'> + <param>default</param> + <target type='variable'>glpi_db_host</target> + <target type='variable'>glpi_db_port</target> + <target type='variable'>glpi_db_root</target> + <target type='variable'>glpi_db_root_passwd_path</target> + <target type='variable'>glpi_db_extra_allowed_hosts</target> + </condition> + <condition name='disabled_if_in' source='glpi_db_mode'> + <param>local</param> + <target type='variable'>glpi_db_port</target> + <target type='variable'>glpi_db_root</target> + <target type='variable'>glpi_db_root_passwd_path</target> + <target type='variable'>glpi_db_extra_allowed_hosts</target> + </condition> + + <condition name="disabled_if_not_in" source='glpi_config_email'> + <param>oui</param> + <target>glpi_admin_email</target> + </condition> + <condition name="disabled_if_not_in" source='glpi_ldap_auth'> + <param>oui</param> + <target>glpi_domainadmins_dn</target> + </condition> + <fill name='concat' target='glpi_admin_email'> + <param type='eole'>system_mail_to</param> + </fill> + <fill name='concat' target='glpi_domainadmins_dn'> + <param>cn=DomainAdmins,ou=local,ou=groupes,ou=</param> + <param type='eole'>numero_etab</param> + <param>,ou=</param> + <param type='eole'>nom_academie</param> + <param>,ou=education,</param> + <param type='eole'>ldap_base_dn</param> + </fill> + + </constraints> + + <help> + <family name='glpi'>Paramétrage avancé de l'application GLPI</family> + <variable name='activer_glpi'>GLPI est une application web permettant la gestion de parc informatique et de gestion des services d'assistance</variable> + <variable name='glpi_helpdesk_doc_source'>Source de la documentation helpdesk accessible depuis le site de l'application glpi (documentation officielle ou personnalisée).</variable> + <variable name='glpi_central_doc_source'>Source de la documentation centrale accessible depuis le site de l'application glpi (documentation officielle ou personnalisée).</variable> + <variable name='glpi_helpdesk_doc_url'>URL personnalisée de la documentation helpdesk accessible depuis l'application glpi.</variable> + <variable name='glpi_central_doc_url'>URL personnalisée de la documentation centrale accessible depuis l'application glpi.</variable> + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-glpi/files/usr/share/eole/db/glpi/gen/0_eole-glpi.sql b/seed/release/eole-2.7/2.7.1/applicationservice/eole-glpi/files/usr/share/eole/db/glpi/gen/0_eole-glpi.sql new file mode 100644 index 0000000000000000000000000000000000000000..ba7aa06c34ffa847a84a69b2fbb206a19ce77287 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-glpi/files/usr/share/eole/db/glpi/gen/0_eole-glpi.sql @@ -0,0 +1 @@ +CREATE DATABASE `glpi`; diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-glpi/files/usr/share/eole/db/glpi/gen/1_eole-glpi.sql b/seed/release/eole-2.7/2.7.1/applicationservice/eole-glpi/files/usr/share/eole/db/glpi/gen/1_eole-glpi.sql new file mode 100644 index 0000000000000000000000000000000000000000..cd9c20f81959a22b5fb4c6d03a4ce3e78f5f6f68 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-glpi/files/usr/share/eole/db/glpi/gen/1_eole-glpi.sql @@ -0,0 +1,7439 @@ +-- phpMyAdmin SQL Dump +-- version 4.0.10deb1 +-- http://www.phpmyadmin.net +-- +-- Client: localhost +-- Généré le: Mer 20 Janvier 2016 à 15:36 +-- Version du serveur: 5.5.46-0ubuntu0.14.04.2 +-- Version de PHP: 5.5.9-1ubuntu4.14 + +USE `glpi`; + +SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; +SET time_zone = "+00:00"; + + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8 */; + +-- +-- Base de données: `glpi` +-- + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_alerts` +-- + +CREATE TABLE IF NOT EXISTS `glpi_alerts` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `itemtype` varchar(100) COLLATE utf8_unicode_ci NOT NULL, + `items_id` int(11) NOT NULL DEFAULT '0', + `type` int(11) NOT NULL DEFAULT '0' COMMENT 'see define.php ALERT_* constant', + `date` datetime NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `unicity` (`itemtype`,`items_id`,`type`), + KEY `type` (`type`), + KEY `date` (`date`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_authldapreplicates` +-- + +CREATE TABLE IF NOT EXISTS `glpi_authldapreplicates` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `authldaps_id` int(11) NOT NULL DEFAULT '0', + `host` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `port` int(11) NOT NULL DEFAULT '389', + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `authldaps_id` (`authldaps_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_authldaps` +-- + +CREATE TABLE IF NOT EXISTS `glpi_authldaps` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `host` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `basedn` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `rootdn` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `port` int(11) NOT NULL DEFAULT '389', + `condition` text COLLATE utf8_unicode_ci, + `login_field` varchar(255) COLLATE utf8_unicode_ci DEFAULT 'uid', + `use_tls` tinyint(1) NOT NULL DEFAULT '0', + `group_field` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `group_condition` text COLLATE utf8_unicode_ci, + `group_search_type` int(11) NOT NULL DEFAULT '0', + `group_member_field` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `email1_field` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `realname_field` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `firstname_field` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `phone_field` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `phone2_field` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `mobile_field` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment_field` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `use_dn` tinyint(1) NOT NULL DEFAULT '1', + `time_offset` int(11) NOT NULL DEFAULT '0' COMMENT 'in seconds', + `deref_option` int(11) NOT NULL DEFAULT '0', + `title_field` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `category_field` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `language_field` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `entity_field` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `entity_condition` text COLLATE utf8_unicode_ci, + `date_mod` datetime DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + `is_default` tinyint(1) NOT NULL DEFAULT '0', + `is_active` tinyint(1) NOT NULL DEFAULT '0', + `rootdn_passwd` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `registration_number_field` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `email2_field` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `email3_field` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `email4_field` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `pagesize` int(11) NOT NULL DEFAULT '0', + `ldap_maxlimit` int(11) NOT NULL DEFAULT '0', + `can_support_pagesize` tinyint(1) NOT NULL DEFAULT '0', + `picture_field` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `date_mod` (`date_mod`), + KEY `is_default` (`is_default`), + KEY `is_active` (`is_active`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_authmails` +-- + +CREATE TABLE IF NOT EXISTS `glpi_authmails` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `connect_string` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `host` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `date_mod` datetime DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + `is_active` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `date_mod` (`date_mod`), + KEY `is_active` (`is_active`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_autoupdatesystems` +-- + +CREATE TABLE IF NOT EXISTS `glpi_autoupdatesystems` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `name` (`name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_blacklistedmailcontents` +-- + +CREATE TABLE IF NOT EXISTS `glpi_blacklistedmailcontents` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `content` text COLLATE utf8_unicode_ci, + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_blacklists` +-- + +CREATE TABLE IF NOT EXISTS `glpi_blacklists` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `type` int(11) NOT NULL DEFAULT '0', + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `value` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `type` (`type`), + KEY `name` (`name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=5 ; + +-- +-- Contenu de la table `glpi_blacklists` +-- + +INSERT INTO `glpi_blacklists` (`id`, `type`, `name`, `value`, `comment`) VALUES +(1, 1, 'empty IP', '', NULL), +(2, 1, 'localhost', '127.0.0.1', NULL), +(3, 1, 'zero IP', '0.0.0.0', NULL), +(4, 2, 'empty MAC', '', NULL); + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_bookmarks` +-- + +CREATE TABLE IF NOT EXISTS `glpi_bookmarks` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `type` int(11) NOT NULL DEFAULT '0' COMMENT 'see define.php BOOKMARK_* constant', + `itemtype` varchar(100) COLLATE utf8_unicode_ci NOT NULL, + `users_id` int(11) NOT NULL DEFAULT '0', + `is_private` tinyint(1) NOT NULL DEFAULT '1', + `entities_id` int(11) NOT NULL DEFAULT '-1', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `path` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `query` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `type` (`type`), + KEY `itemtype` (`itemtype`), + KEY `entities_id` (`entities_id`), + KEY `users_id` (`users_id`), + KEY `is_private` (`is_private`), + KEY `is_recursive` (`is_recursive`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_bookmarks_users` +-- + +CREATE TABLE IF NOT EXISTS `glpi_bookmarks_users` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `users_id` int(11) NOT NULL DEFAULT '0', + `itemtype` varchar(100) COLLATE utf8_unicode_ci NOT NULL, + `bookmarks_id` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `unicity` (`users_id`,`itemtype`), + KEY `bookmarks_id` (`bookmarks_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_budgets` +-- + +CREATE TABLE IF NOT EXISTS `glpi_budgets` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `comment` text COLLATE utf8_unicode_ci, + `is_deleted` tinyint(1) NOT NULL DEFAULT '0', + `begin_date` date DEFAULT NULL, + `end_date` date DEFAULT NULL, + `value` decimal(20,4) NOT NULL DEFAULT '0.0000', + `is_template` tinyint(1) NOT NULL DEFAULT '0', + `template_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `date_mod` datetime DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `name` (`name`), + KEY `is_recursive` (`is_recursive`), + KEY `entities_id` (`entities_id`), + KEY `is_deleted` (`is_deleted`), + KEY `begin_date` (`begin_date`), + KEY `is_template` (`is_template`), + KEY `date_mod` (`date_mod`), + KEY `end_date` (`end_date`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_calendars` +-- + +CREATE TABLE IF NOT EXISTS `glpi_calendars` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `comment` text COLLATE utf8_unicode_ci, + `date_mod` datetime DEFAULT NULL, + `cache_duration` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `name` (`name`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`), + KEY `date_mod` (`date_mod`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=2 ; + +-- +-- Contenu de la table `glpi_calendars` +-- + +INSERT INTO `glpi_calendars` (`id`, `name`, `entities_id`, `is_recursive`, `comment`, `date_mod`, `cache_duration`) VALUES +(1, 'Default', 0, 1, 'Default calendar', NULL, '[0,43200,43200,43200,43200,43200,0]'); + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_calendarsegments` +-- + +CREATE TABLE IF NOT EXISTS `glpi_calendarsegments` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `calendars_id` int(11) NOT NULL DEFAULT '0', + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `day` tinyint(1) NOT NULL DEFAULT '1' COMMENT 'numer of the day based on date(w)', + `begin` time DEFAULT NULL, + `end` time DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `calendars_id` (`calendars_id`), + KEY `day` (`day`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=6 ; + +-- +-- Contenu de la table `glpi_calendarsegments` +-- + +INSERT INTO `glpi_calendarsegments` (`id`, `calendars_id`, `entities_id`, `is_recursive`, `day`, `begin`, `end`) VALUES +(1, 1, 0, 0, 1, '08:00:00', '20:00:00'), +(2, 1, 0, 0, 2, '08:00:00', '20:00:00'), +(3, 1, 0, 0, 3, '08:00:00', '20:00:00'), +(4, 1, 0, 0, 4, '08:00:00', '20:00:00'), +(5, 1, 0, 0, 5, '08:00:00', '20:00:00'); + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_calendars_holidays` +-- + +CREATE TABLE IF NOT EXISTS `glpi_calendars_holidays` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `calendars_id` int(11) NOT NULL DEFAULT '0', + `holidays_id` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `unicity` (`calendars_id`,`holidays_id`), + KEY `holidays_id` (`holidays_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_cartridgeitems` +-- + +CREATE TABLE IF NOT EXISTS `glpi_cartridgeitems` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `ref` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `locations_id` int(11) NOT NULL DEFAULT '0', + `cartridgeitemtypes_id` int(11) NOT NULL DEFAULT '0', + `manufacturers_id` int(11) NOT NULL DEFAULT '0', + `users_id_tech` int(11) NOT NULL DEFAULT '0', + `groups_id_tech` int(11) NOT NULL DEFAULT '0', + `is_deleted` tinyint(1) NOT NULL DEFAULT '0', + `comment` text COLLATE utf8_unicode_ci, + `alarm_threshold` int(11) NOT NULL DEFAULT '10', + PRIMARY KEY (`id`), + KEY `name` (`name`), + KEY `entities_id` (`entities_id`), + KEY `manufacturers_id` (`manufacturers_id`), + KEY `locations_id` (`locations_id`), + KEY `users_id_tech` (`users_id_tech`), + KEY `cartridgeitemtypes_id` (`cartridgeitemtypes_id`), + KEY `is_deleted` (`is_deleted`), + KEY `alarm_threshold` (`alarm_threshold`), + KEY `groups_id_tech` (`groups_id_tech`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_cartridgeitems_printermodels` +-- + +CREATE TABLE IF NOT EXISTS `glpi_cartridgeitems_printermodels` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `cartridgeitems_id` int(11) NOT NULL DEFAULT '0', + `printermodels_id` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `unicity` (`printermodels_id`,`cartridgeitems_id`), + KEY `cartridgeitems_id` (`cartridgeitems_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_cartridgeitemtypes` +-- + +CREATE TABLE IF NOT EXISTS `glpi_cartridgeitemtypes` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `name` (`name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_cartridges` +-- + +CREATE TABLE IF NOT EXISTS `glpi_cartridges` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `entities_id` int(11) NOT NULL DEFAULT '0', + `cartridgeitems_id` int(11) NOT NULL DEFAULT '0', + `printers_id` int(11) NOT NULL DEFAULT '0', + `date_in` date DEFAULT NULL, + `date_use` date DEFAULT NULL, + `date_out` date DEFAULT NULL, + `pages` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `cartridgeitems_id` (`cartridgeitems_id`), + KEY `printers_id` (`printers_id`), + KEY `entities_id` (`entities_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_changecosts` +-- + +CREATE TABLE IF NOT EXISTS `glpi_changecosts` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `changes_id` int(11) NOT NULL DEFAULT '0', + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + `begin_date` date DEFAULT NULL, + `end_date` date DEFAULT NULL, + `actiontime` int(11) NOT NULL DEFAULT '0', + `cost_time` decimal(20,4) NOT NULL DEFAULT '0.0000', + `cost_fixed` decimal(20,4) NOT NULL DEFAULT '0.0000', + `cost_material` decimal(20,4) NOT NULL DEFAULT '0.0000', + `budgets_id` int(11) NOT NULL DEFAULT '0', + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `name` (`name`), + KEY `changes_id` (`changes_id`), + KEY `begin_date` (`begin_date`), + KEY `end_date` (`end_date`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`), + KEY `budgets_id` (`budgets_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_changes` +-- + +CREATE TABLE IF NOT EXISTS `glpi_changes` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `is_deleted` tinyint(1) NOT NULL DEFAULT '0', + `status` int(11) NOT NULL DEFAULT '1', + `content` longtext COLLATE utf8_unicode_ci, + `date_mod` datetime DEFAULT NULL, + `date` datetime DEFAULT NULL, + `solvedate` datetime DEFAULT NULL, + `closedate` datetime DEFAULT NULL, + `due_date` datetime DEFAULT NULL, + `users_id_recipient` int(11) NOT NULL DEFAULT '0', + `users_id_lastupdater` int(11) NOT NULL DEFAULT '0', + `urgency` int(11) NOT NULL DEFAULT '1', + `impact` int(11) NOT NULL DEFAULT '1', + `priority` int(11) NOT NULL DEFAULT '1', + `itilcategories_id` int(11) NOT NULL DEFAULT '0', + `impactcontent` longtext COLLATE utf8_unicode_ci, + `controlistcontent` longtext COLLATE utf8_unicode_ci, + `rolloutplancontent` longtext COLLATE utf8_unicode_ci, + `backoutplancontent` longtext COLLATE utf8_unicode_ci, + `checklistcontent` longtext COLLATE utf8_unicode_ci, + `global_validation` int(11) NOT NULL DEFAULT '1', + `validation_percent` int(11) NOT NULL DEFAULT '0', + `solutiontypes_id` int(11) NOT NULL DEFAULT '0', + `solution` longtext COLLATE utf8_unicode_ci, + `actiontime` int(11) NOT NULL DEFAULT '0', + `begin_waiting_date` datetime DEFAULT NULL, + `waiting_duration` int(11) NOT NULL DEFAULT '0', + `close_delay_stat` int(11) NOT NULL DEFAULT '0', + `solve_delay_stat` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `name` (`name`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`), + KEY `is_deleted` (`is_deleted`), + KEY `date` (`date`), + KEY `closedate` (`closedate`), + KEY `status` (`status`), + KEY `priority` (`priority`), + KEY `date_mod` (`date_mod`), + KEY `itilcategories_id` (`itilcategories_id`), + KEY `users_id_recipient` (`users_id_recipient`), + KEY `solvedate` (`solvedate`), + KEY `solutiontypes_id` (`solutiontypes_id`), + KEY `urgency` (`urgency`), + KEY `impact` (`impact`), + KEY `due_date` (`due_date`), + KEY `global_validation` (`global_validation`), + KEY `users_id_lastupdater` (`users_id_lastupdater`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_changes_groups` +-- + +CREATE TABLE IF NOT EXISTS `glpi_changes_groups` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `changes_id` int(11) NOT NULL DEFAULT '0', + `groups_id` int(11) NOT NULL DEFAULT '0', + `type` int(11) NOT NULL DEFAULT '1', + PRIMARY KEY (`id`), + UNIQUE KEY `unicity` (`changes_id`,`type`,`groups_id`), + KEY `group` (`groups_id`,`type`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_changes_items` +-- + +CREATE TABLE IF NOT EXISTS `glpi_changes_items` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `changes_id` int(11) NOT NULL DEFAULT '0', + `itemtype` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL, + `items_id` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `unicity` (`changes_id`,`itemtype`,`items_id`), + KEY `item` (`itemtype`,`items_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_changes_problems` +-- + +CREATE TABLE IF NOT EXISTS `glpi_changes_problems` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `changes_id` int(11) NOT NULL DEFAULT '0', + `problems_id` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `unicity` (`changes_id`,`problems_id`), + KEY `problems_id` (`problems_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_changes_projects` +-- + +CREATE TABLE IF NOT EXISTS `glpi_changes_projects` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `changes_id` int(11) NOT NULL DEFAULT '0', + `projects_id` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `unicity` (`changes_id`,`projects_id`), + KEY `projects_id` (`projects_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_changes_suppliers` +-- + +CREATE TABLE IF NOT EXISTS `glpi_changes_suppliers` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `changes_id` int(11) NOT NULL DEFAULT '0', + `suppliers_id` int(11) NOT NULL DEFAULT '0', + `type` int(11) NOT NULL DEFAULT '1', + `use_notification` tinyint(1) NOT NULL DEFAULT '0', + `alternative_email` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `unicity` (`changes_id`,`type`,`suppliers_id`), + KEY `group` (`suppliers_id`,`type`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_changes_tickets` +-- + +CREATE TABLE IF NOT EXISTS `glpi_changes_tickets` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `changes_id` int(11) NOT NULL DEFAULT '0', + `tickets_id` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `unicity` (`changes_id`,`tickets_id`), + KEY `tickets_id` (`tickets_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_changes_users` +-- + +CREATE TABLE IF NOT EXISTS `glpi_changes_users` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `changes_id` int(11) NOT NULL DEFAULT '0', + `users_id` int(11) NOT NULL DEFAULT '0', + `type` int(11) NOT NULL DEFAULT '1', + `use_notification` tinyint(1) NOT NULL DEFAULT '0', + `alternative_email` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `unicity` (`changes_id`,`type`,`users_id`,`alternative_email`), + KEY `user` (`users_id`,`type`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_changetasks` +-- + +CREATE TABLE IF NOT EXISTS `glpi_changetasks` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `changes_id` int(11) NOT NULL DEFAULT '0', + `taskcategories_id` int(11) NOT NULL DEFAULT '0', + `state` int(11) NOT NULL DEFAULT '0', + `date` datetime DEFAULT NULL, + `begin` datetime DEFAULT NULL, + `end` datetime DEFAULT NULL, + `users_id` int(11) NOT NULL DEFAULT '0', + `users_id_tech` int(11) NOT NULL DEFAULT '0', + `content` longtext COLLATE utf8_unicode_ci, + `actiontime` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `changes_id` (`changes_id`), + KEY `state` (`state`), + KEY `users_id` (`users_id`), + KEY `users_id_tech` (`users_id_tech`), + KEY `date` (`date`), + KEY `begin` (`begin`), + KEY `end` (`end`), + KEY `taskcategories_id` (`taskcategories_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_changevalidations` +-- + +CREATE TABLE IF NOT EXISTS `glpi_changevalidations` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `users_id` int(11) NOT NULL DEFAULT '0', + `changes_id` int(11) NOT NULL DEFAULT '0', + `users_id_validate` int(11) NOT NULL DEFAULT '0', + `comment_submission` text COLLATE utf8_unicode_ci, + `comment_validation` text COLLATE utf8_unicode_ci, + `status` int(11) NOT NULL DEFAULT '2', + `submission_date` datetime DEFAULT NULL, + `validation_date` datetime DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`), + KEY `users_id` (`users_id`), + KEY `users_id_validate` (`users_id_validate`), + KEY `changes_id` (`changes_id`), + KEY `submission_date` (`submission_date`), + KEY `validation_date` (`validation_date`), + KEY `status` (`status`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_computerdisks` +-- + +CREATE TABLE IF NOT EXISTS `glpi_computerdisks` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `entities_id` int(11) NOT NULL DEFAULT '0', + `computers_id` int(11) NOT NULL DEFAULT '0', + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `device` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `mountpoint` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `filesystems_id` int(11) NOT NULL DEFAULT '0', + `totalsize` int(11) NOT NULL DEFAULT '0', + `freesize` int(11) NOT NULL DEFAULT '0', + `is_deleted` tinyint(1) NOT NULL DEFAULT '0', + `is_dynamic` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `name` (`name`), + KEY `device` (`device`), + KEY `mountpoint` (`mountpoint`), + KEY `totalsize` (`totalsize`), + KEY `freesize` (`freesize`), + KEY `computers_id` (`computers_id`), + KEY `filesystems_id` (`filesystems_id`), + KEY `entities_id` (`entities_id`), + KEY `is_deleted` (`is_deleted`), + KEY `is_dynamic` (`is_dynamic`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_computermodels` +-- + +CREATE TABLE IF NOT EXISTS `glpi_computermodels` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `name` (`name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_computers` +-- + +CREATE TABLE IF NOT EXISTS `glpi_computers` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `entities_id` int(11) NOT NULL DEFAULT '0', + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `serial` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `otherserial` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `contact` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `contact_num` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `users_id_tech` int(11) NOT NULL DEFAULT '0', + `groups_id_tech` int(11) NOT NULL DEFAULT '0', + `comment` text COLLATE utf8_unicode_ci, + `date_mod` datetime DEFAULT NULL, + `operatingsystems_id` int(11) NOT NULL DEFAULT '0', + `operatingsystemversions_id` int(11) NOT NULL DEFAULT '0', + `operatingsystemservicepacks_id` int(11) NOT NULL DEFAULT '0', + `os_license_number` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `os_licenseid` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `autoupdatesystems_id` int(11) NOT NULL DEFAULT '0', + `locations_id` int(11) NOT NULL DEFAULT '0', + `domains_id` int(11) NOT NULL DEFAULT '0', + `networks_id` int(11) NOT NULL DEFAULT '0', + `computermodels_id` int(11) NOT NULL DEFAULT '0', + `computertypes_id` int(11) NOT NULL DEFAULT '0', + `is_template` tinyint(1) NOT NULL DEFAULT '0', + `template_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `manufacturers_id` int(11) NOT NULL DEFAULT '0', + `is_deleted` tinyint(1) NOT NULL DEFAULT '0', + `is_dynamic` tinyint(1) NOT NULL DEFAULT '0', + `users_id` int(11) NOT NULL DEFAULT '0', + `groups_id` int(11) NOT NULL DEFAULT '0', + `states_id` int(11) NOT NULL DEFAULT '0', + `ticket_tco` decimal(20,4) DEFAULT '0.0000', + `uuid` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `date_mod` (`date_mod`), + KEY `name` (`name`), + KEY `is_template` (`is_template`), + KEY `autoupdatesystems_id` (`autoupdatesystems_id`), + KEY `domains_id` (`domains_id`), + KEY `entities_id` (`entities_id`), + KEY `manufacturers_id` (`manufacturers_id`), + KEY `groups_id` (`groups_id`), + KEY `users_id` (`users_id`), + KEY `locations_id` (`locations_id`), + KEY `computermodels_id` (`computermodels_id`), + KEY `networks_id` (`networks_id`), + KEY `operatingsystems_id` (`operatingsystems_id`), + KEY `operatingsystemservicepacks_id` (`operatingsystemservicepacks_id`), + KEY `operatingsystemversions_id` (`operatingsystemversions_id`), + KEY `states_id` (`states_id`), + KEY `users_id_tech` (`users_id_tech`), + KEY `computertypes_id` (`computertypes_id`), + KEY `is_deleted` (`is_deleted`), + KEY `groups_id_tech` (`groups_id_tech`), + KEY `is_dynamic` (`is_dynamic`), + KEY `serial` (`serial`), + KEY `otherserial` (`otherserial`), + KEY `uuid` (`uuid`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_computers_items` +-- + +CREATE TABLE IF NOT EXISTS `glpi_computers_items` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `items_id` int(11) NOT NULL DEFAULT '0' COMMENT 'RELATION to various table, according to itemtype (ID)', + `computers_id` int(11) NOT NULL DEFAULT '0', + `itemtype` varchar(100) COLLATE utf8_unicode_ci NOT NULL, + `is_deleted` tinyint(1) NOT NULL DEFAULT '0', + `is_dynamic` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `computers_id` (`computers_id`), + KEY `item` (`itemtype`,`items_id`), + KEY `is_deleted` (`is_deleted`), + KEY `is_dynamic` (`is_dynamic`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_computers_softwarelicenses` +-- + +CREATE TABLE IF NOT EXISTS `glpi_computers_softwarelicenses` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `computers_id` int(11) NOT NULL DEFAULT '0', + `softwarelicenses_id` int(11) NOT NULL DEFAULT '0', + `is_deleted` tinyint(1) NOT NULL DEFAULT '0', + `is_dynamic` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `unicity` (`computers_id`,`softwarelicenses_id`), + KEY `computers_id` (`computers_id`), + KEY `softwarelicenses_id` (`softwarelicenses_id`), + KEY `is_deleted` (`is_deleted`), + KEY `is_dynamic` (`is_dynamic`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_computers_softwareversions` +-- + +CREATE TABLE IF NOT EXISTS `glpi_computers_softwareversions` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `computers_id` int(11) NOT NULL DEFAULT '0', + `softwareversions_id` int(11) NOT NULL DEFAULT '0', + `is_deleted_computer` tinyint(1) NOT NULL DEFAULT '0', + `is_template_computer` tinyint(1) NOT NULL DEFAULT '0', + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_deleted` tinyint(1) NOT NULL DEFAULT '0', + `is_dynamic` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `unicity` (`computers_id`,`softwareversions_id`), + KEY `softwareversions_id` (`softwareversions_id`), + KEY `computers_info` (`entities_id`,`is_template_computer`,`is_deleted_computer`), + KEY `is_template` (`is_template_computer`), + KEY `is_deleted` (`is_deleted_computer`), + KEY `is_dynamic` (`is_dynamic`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_computertypes` +-- + +CREATE TABLE IF NOT EXISTS `glpi_computertypes` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `name` (`name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_computervirtualmachines` +-- + +CREATE TABLE IF NOT EXISTS `glpi_computervirtualmachines` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `entities_id` int(11) NOT NULL DEFAULT '0', + `computers_id` int(11) NOT NULL DEFAULT '0', + `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '', + `virtualmachinestates_id` int(11) NOT NULL DEFAULT '0', + `virtualmachinesystems_id` int(11) NOT NULL DEFAULT '0', + `virtualmachinetypes_id` int(11) NOT NULL DEFAULT '0', + `uuid` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '', + `vcpu` int(11) NOT NULL DEFAULT '0', + `ram` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '', + `is_deleted` tinyint(1) NOT NULL DEFAULT '0', + `is_dynamic` tinyint(1) NOT NULL DEFAULT '0', + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `computers_id` (`computers_id`), + KEY `entities_id` (`entities_id`), + KEY `name` (`name`), + KEY `virtualmachinestates_id` (`virtualmachinestates_id`), + KEY `virtualmachinesystems_id` (`virtualmachinesystems_id`), + KEY `vcpu` (`vcpu`), + KEY `ram` (`ram`), + KEY `is_deleted` (`is_deleted`), + KEY `is_dynamic` (`is_dynamic`), + KEY `uuid` (`uuid`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_configs` +-- + +CREATE TABLE IF NOT EXISTS `glpi_configs` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `context` varchar(150) COLLATE utf8_unicode_ci DEFAULT NULL, + `name` varchar(150) COLLATE utf8_unicode_ci DEFAULT NULL, + `value` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + UNIQUE KEY `unicity` (`context`,`name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=156 ; + +-- +-- Contenu de la table `glpi_configs` +-- +INSERT INTO `glpi_configs` (`id`, `context`, `name`, `value`) VALUES +(1, 'core', 'version', '0.85.3'), +(2, 'core', 'show_jobs_at_login', '0'), +(3, 'core', 'cut', '250'), +(4, 'core', 'list_limit', '15'), +(5, 'core', 'list_limit_max', '50'), +(6, 'core', 'url_maxlength', '30'), +(7, 'core', 'event_loglevel', '5'), +(8, 'core', 'use_mailing', '0'), +(9, 'core', 'admin_email', 'admsys@localhost'), +(10, 'core', 'admin_email_name', ''), +(11, 'core', 'admin_reply', ''), +(12, 'core', 'admin_reply_name', ''), +(13, 'core', 'mailing_signature', 'SIGNATURE'), +(14, 'core', 'use_anonymous_helpdesk', '0'), +(15, 'core', 'use_anonymous_followups', '0'), +(16, 'core', 'language', 'fr_FR'), +(17, 'core', 'priority_1', '#fff2f2'), +(18, 'core', 'priority_2', '#ffe0e0'), +(19, 'core', 'priority_3', '#ffcece'), +(20, 'core', 'priority_4', '#ffbfbf'), +(21, 'core', 'priority_5', '#ffadad'), +(22, 'core', 'priority_6', '#ff5555'), +(23, 'core', 'date_tax', '2005-12-31'), +(24, 'core', 'cas_host', ''), +(25, 'core', 'cas_port', '443'), +(26, 'core', 'cas_uri', ''), +(27, 'core', 'cas_logout', ''), +(28, 'core', 'existing_auth_server_field_clean_domain', '0'), +(29, 'core', 'planning_begin', '08:00:00'), +(30, 'core', 'planning_end', '20:00:00'), +(31, 'core', 'utf8_conv', '1'), +(32, 'core', 'use_public_faq', '0'), +(33, 'core', 'url_base', 'http://localhost/glpi/'), +(34, 'core', 'show_link_in_mail', '0'), +(35, 'core', 'text_login', ''), +(36, 'core', 'founded_new_version', ''), +(37, 'core', 'dropdown_max', '100'), +(38, 'core', 'ajax_wildcard', '*'), +(151, 'core', 'use_rich_text', '0'), +(150, 'core', 'maintenance_text', ''), +(149, 'core', 'maintenance_mode', '0'), +(42, 'core', 'ajax_limit_count', '50'), +(43, 'core', 'use_ajax_autocompletion', '1'), +(44, 'core', 'is_users_auto_add', '1'), +(45, 'core', 'date_format', '1'), +(46, 'core', 'number_format', '0'), +(47, 'core', 'csv_delimiter', ';'), +(48, 'core', 'is_ids_visible', '0'), +(49, 'core', 'dropdown_chars_limit', '50'), +(50, 'core', 'smtp_mode', '0'), +(51, 'core', 'smtp_host', ''), +(52, 'core', 'smtp_port', '25'), +(53, 'core', 'smtp_username', ''), +(54, 'core', 'proxy_name', ''), +(55, 'core', 'proxy_port', '8080'), +(56, 'core', 'proxy_user', ''), +(57, 'core', 'add_followup_on_update_ticket', '1'), +(58, 'core', 'keep_tickets_on_delete', '0'), +(59, 'core', 'time_step', '5'), +(60, 'core', 'decimal_number', '2'), +(61,'core','helpdesk_doc_url','http://www.glpi-project.org/spip.php?rubrique3'), +(62,'core','central_doc_url','http://www.glpi-project.org/spip.php?rubrique3'), +(63, 'core', 'documentcategories_id_forticket', '0'), +(64, 'core', 'monitors_management_restrict', '2'), +(65, 'core', 'phones_management_restrict', '2'), +(66, 'core', 'peripherals_management_restrict', '2'), +(67, 'core', 'printers_management_restrict', '2'), +(68, 'core', 'use_log_in_files', '1'), +(69, 'core', 'time_offset', '0'), +(70, 'core', 'is_contact_autoupdate', '1'), +(71, 'core', 'is_user_autoupdate', '1'), +(72, 'core', 'is_group_autoupdate', '1'), +(73, 'core', 'is_location_autoupdate', '1'), +(74, 'core', 'state_autoupdate_mode', '0'), +(75, 'core', 'is_contact_autoclean', '0'), +(76, 'core', 'is_user_autoclean', '0'), +(77, 'core', 'is_group_autoclean', '0'), +(78, 'core', 'is_location_autoclean', '0'), +(79, 'core', 'state_autoclean_mode', '0'), +(80, 'core', 'use_flat_dropdowntree', '0'), +(81, 'core', 'use_autoname_by_entity', '1'), +(148, 'core', 'keep_devices_when_purging_item', '0'), +(147, 'core', 'pdffont', 'helvetica'), +(84, 'core', 'softwarecategories_id_ondelete', '1'), +(85, 'core', 'x509_email_field', ''), +(86, 'core', 'x509_cn_restrict', ''), +(87, 'core', 'x509_o_restrict', ''), +(88, 'core', 'x509_ou_restrict', ''), +(89, 'core', 'default_mailcollector_filesize_max', '2097152'), +(90, 'core', 'followup_private', '0'), +(91, 'core', 'task_private', '0'), +(92, 'core', 'default_software_helpdesk_visible', '1'), +(93, 'core', 'names_format', '0'), +(94, 'core', 'default_graphtype', 'svg'), +(95, 'core', 'default_requesttypes_id', '1'), +(96, 'core', 'use_noright_users_add', '1'), +(97, 'core', 'cron_limit', '5'), +(98, 'core', 'priority_matrix', '{"1":{"1":1,"2":1,"3":2,"4":2,"5":2},"2":{"1":1,"2":2,"3":2,"4":3,"5":3},"3":{"1":2,"2":2,"3":3,"4":4,"5":4},"4":{"1":2,"2":3,"3":4,"4":4,"5":5},"5":{"1":2,"2":3,"3":4,"4":5,"5":5}}'), +(99, 'core', 'urgency_mask', '62'), +(100, 'core', 'impact_mask', '62'), +(101, 'core', 'user_deleted_ldap', '0'), +(102, 'core', 'auto_create_infocoms', '0'), +(103, 'core', 'use_slave_for_search', '0'), +(104, 'core', 'proxy_passwd', ''), +(105, 'core', 'smtp_passwd', ''), +(106, 'core', 'transfers_id_auto', '0'), +(107, 'core', 'show_count_on_tabs', '1'), +(108, 'core', 'refresh_ticket_list', '0'), +(109, 'core', 'set_default_tech', '1'), +(110, 'core', 'allow_search_view', '2'), +(111, 'core', 'allow_search_all', '1'), +(112, 'core', 'allow_search_global', '1'), +(113, 'core', 'display_count_on_home', '5'), +(114, 'core', 'use_password_security', '0'), +(115, 'core', 'password_min_length', '8'), +(116, 'core', 'password_need_number', '1'), +(117, 'core', 'password_need_letter', '1'), +(118, 'core', 'password_need_caps', '1'), +(119, 'core', 'password_need_symbol', '1'), +(120, 'core', 'use_check_pref', '0'), +(121, 'core', 'notification_to_myself', '1'), +(122, 'core', 'duedateok_color', '#06ff00'), +(123, 'core', 'duedatewarning_color', '#ffb800'), +(124, 'core', 'duedatecritical_color', '#ff0000'), +(125, 'core', 'duedatewarning_less', '20'), +(126, 'core', 'duedatecritical_less', '5'), +(127, 'core', 'duedatewarning_unit', '%'), +(128, 'core', 'duedatecritical_unit', '%'), +(129, 'core', 'realname_ssofield', ''), +(130, 'core', 'firstname_ssofield', ''), +(131, 'core', 'email1_ssofield', ''), +(132, 'core', 'email2_ssofield', ''), +(133, 'core', 'email3_ssofield', ''), +(134, 'core', 'email4_ssofield', ''), +(135, 'core', 'phone_ssofield', ''), +(136, 'core', 'phone2_ssofield', ''), +(137, 'core', 'mobile_ssofield', ''), +(138, 'core', 'comment_ssofield', ''), +(139, 'core', 'title_ssofield', ''), +(140, 'core', 'category_ssofield', ''), +(141, 'core', 'language_ssofield', ''), +(142, 'core', 'entity_ssofield', ''), +(143, 'core', 'registration_number_ssofield', ''), +(144, 'core', 'ssovariables_id', '0'), +(145, 'core', 'translate_kb', '0'), +(146, 'core', 'translate_dropdowns', '0'), +(152, 'core', 'attach_ticket_documents_to_mail', '0'), +(153, 'core', 'backcreated', '0'), +(154, 'core', 'task_state', '1'), +(155,'core','_dbslave_status','0'); + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_consumableitems` +-- + +CREATE TABLE IF NOT EXISTS `glpi_consumableitems` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `ref` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `locations_id` int(11) NOT NULL DEFAULT '0', + `consumableitemtypes_id` int(11) NOT NULL DEFAULT '0', + `manufacturers_id` int(11) NOT NULL DEFAULT '0', + `users_id_tech` int(11) NOT NULL DEFAULT '0', + `groups_id_tech` int(11) NOT NULL DEFAULT '0', + `is_deleted` tinyint(1) NOT NULL DEFAULT '0', + `comment` text COLLATE utf8_unicode_ci, + `alarm_threshold` int(11) NOT NULL DEFAULT '10', + PRIMARY KEY (`id`), + KEY `name` (`name`), + KEY `entities_id` (`entities_id`), + KEY `manufacturers_id` (`manufacturers_id`), + KEY `locations_id` (`locations_id`), + KEY `users_id_tech` (`users_id_tech`), + KEY `consumableitemtypes_id` (`consumableitemtypes_id`), + KEY `is_deleted` (`is_deleted`), + KEY `alarm_threshold` (`alarm_threshold`), + KEY `groups_id_tech` (`groups_id_tech`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_consumableitemtypes` +-- + +CREATE TABLE IF NOT EXISTS `glpi_consumableitemtypes` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `name` (`name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_consumables` +-- + +CREATE TABLE IF NOT EXISTS `glpi_consumables` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `entities_id` int(11) NOT NULL DEFAULT '0', + `consumableitems_id` int(11) NOT NULL DEFAULT '0', + `date_in` date DEFAULT NULL, + `date_out` date DEFAULT NULL, + `itemtype` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL, + `items_id` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `date_in` (`date_in`), + KEY `date_out` (`date_out`), + KEY `consumableitems_id` (`consumableitems_id`), + KEY `entities_id` (`entities_id`), + KEY `item` (`itemtype`,`items_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_contacts` +-- + +CREATE TABLE IF NOT EXISTS `glpi_contacts` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `firstname` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `phone` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `phone2` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `mobile` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `fax` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `email` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `contacttypes_id` int(11) NOT NULL DEFAULT '0', + `comment` text COLLATE utf8_unicode_ci, + `is_deleted` tinyint(1) NOT NULL DEFAULT '0', + `usertitles_id` int(11) NOT NULL DEFAULT '0', + `address` text COLLATE utf8_unicode_ci, + `postcode` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `town` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `state` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `country` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `name` (`name`), + KEY `entities_id` (`entities_id`), + KEY `contacttypes_id` (`contacttypes_id`), + KEY `is_deleted` (`is_deleted`), + KEY `usertitles_id` (`usertitles_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_contacts_suppliers` +-- + +CREATE TABLE IF NOT EXISTS `glpi_contacts_suppliers` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `suppliers_id` int(11) NOT NULL DEFAULT '0', + `contacts_id` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `unicity` (`suppliers_id`,`contacts_id`), + KEY `contacts_id` (`contacts_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_contacttypes` +-- + +CREATE TABLE IF NOT EXISTS `glpi_contacttypes` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `name` (`name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_contractcosts` +-- + +CREATE TABLE IF NOT EXISTS `glpi_contractcosts` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `contracts_id` int(11) NOT NULL DEFAULT '0', + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + `begin_date` date DEFAULT NULL, + `end_date` date DEFAULT NULL, + `cost` decimal(20,4) NOT NULL DEFAULT '0.0000', + `budgets_id` int(11) NOT NULL DEFAULT '0', + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `name` (`name`), + KEY `contracts_id` (`contracts_id`), + KEY `begin_date` (`begin_date`), + KEY `end_date` (`end_date`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`), + KEY `budgets_id` (`budgets_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_contracts` +-- + +CREATE TABLE IF NOT EXISTS `glpi_contracts` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `num` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `contracttypes_id` int(11) NOT NULL DEFAULT '0', + `begin_date` date DEFAULT NULL, + `duration` int(11) NOT NULL DEFAULT '0', + `notice` int(11) NOT NULL DEFAULT '0', + `periodicity` int(11) NOT NULL DEFAULT '0', + `billing` int(11) NOT NULL DEFAULT '0', + `comment` text COLLATE utf8_unicode_ci, + `accounting_number` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `is_deleted` tinyint(1) NOT NULL DEFAULT '0', + `week_begin_hour` time NOT NULL DEFAULT '00:00:00', + `week_end_hour` time NOT NULL DEFAULT '00:00:00', + `saturday_begin_hour` time NOT NULL DEFAULT '00:00:00', + `saturday_end_hour` time NOT NULL DEFAULT '00:00:00', + `use_saturday` tinyint(1) NOT NULL DEFAULT '0', + `monday_begin_hour` time NOT NULL DEFAULT '00:00:00', + `monday_end_hour` time NOT NULL DEFAULT '00:00:00', + `use_monday` tinyint(1) NOT NULL DEFAULT '0', + `max_links_allowed` int(11) NOT NULL DEFAULT '0', + `alert` int(11) NOT NULL DEFAULT '0', + `renewal` int(11) NOT NULL DEFAULT '0', + `template_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `is_template` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `begin_date` (`begin_date`), + KEY `name` (`name`), + KEY `contracttypes_id` (`contracttypes_id`), + KEY `entities_id` (`entities_id`), + KEY `is_deleted` (`is_deleted`), + KEY `use_monday` (`use_monday`), + KEY `use_saturday` (`use_saturday`), + KEY `alert` (`alert`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_contracts_items` +-- + +CREATE TABLE IF NOT EXISTS `glpi_contracts_items` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `contracts_id` int(11) NOT NULL DEFAULT '0', + `items_id` int(11) NOT NULL DEFAULT '0', + `itemtype` varchar(100) COLLATE utf8_unicode_ci NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `unicity` (`contracts_id`,`itemtype`,`items_id`), + KEY `FK_device` (`items_id`,`itemtype`), + KEY `item` (`itemtype`,`items_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_contracts_suppliers` +-- + +CREATE TABLE IF NOT EXISTS `glpi_contracts_suppliers` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `suppliers_id` int(11) NOT NULL DEFAULT '0', + `contracts_id` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `unicity` (`suppliers_id`,`contracts_id`), + KEY `contracts_id` (`contracts_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_contracttypes` +-- + +CREATE TABLE IF NOT EXISTS `glpi_contracttypes` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `name` (`name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_crontasklogs` +-- + +CREATE TABLE IF NOT EXISTS `glpi_crontasklogs` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `crontasks_id` int(11) NOT NULL, + `crontasklogs_id` int(11) NOT NULL COMMENT 'id of ''start'' event', + `date` datetime NOT NULL, + `state` int(11) NOT NULL COMMENT '0:start, 1:run, 2:stop', + `elapsed` float NOT NULL COMMENT 'time elapsed since start', + `volume` int(11) NOT NULL COMMENT 'for statistics', + `content` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT 'message', + PRIMARY KEY (`id`), + KEY `date` (`date`), + KEY `crontasks_id` (`crontasks_id`), + KEY `crontasklogs_id_state` (`crontasklogs_id`,`state`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=11 ; + +-- +-- Structure de la table `glpi_crontasks` +-- + +CREATE TABLE IF NOT EXISTS `glpi_crontasks` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `itemtype` varchar(100) COLLATE utf8_unicode_ci NOT NULL, + `name` varchar(150) COLLATE utf8_unicode_ci NOT NULL COMMENT 'task name', + `frequency` int(11) NOT NULL COMMENT 'second between launch', + `param` int(11) DEFAULT NULL COMMENT 'task specify parameter', + `state` int(11) NOT NULL DEFAULT '1' COMMENT '0:disabled, 1:waiting, 2:running', + `mode` int(11) NOT NULL DEFAULT '1' COMMENT '1:internal, 2:external', + `allowmode` int(11) NOT NULL DEFAULT '3' COMMENT '1:internal, 2:external, 3:both', + `hourmin` int(11) NOT NULL DEFAULT '0', + `hourmax` int(11) NOT NULL DEFAULT '24', + `logs_lifetime` int(11) NOT NULL DEFAULT '30' COMMENT 'number of days', + `lastrun` datetime DEFAULT NULL COMMENT 'last run date', + `lastcode` int(11) DEFAULT NULL COMMENT 'last run return code', + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + UNIQUE KEY `unicity` (`itemtype`,`name`), + KEY `mode` (`mode`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Task run by internal / external cron.' AUTO_INCREMENT=30 ; + +-- +-- Contenu de la table `glpi_crontasks` +-- + +INSERT INTO `glpi_crontasks` (`id`, `itemtype`, `name`, `frequency`, `param`, `state`, `mode`, `allowmode`, `hourmin`, `hourmax`, `logs_lifetime`, `lastrun`, `lastcode`, `comment`) VALUES +(2, 'CartridgeItem', 'cartridge', 86400, 10, 0, 1, 3, 0, 24, 30, NULL, NULL, NULL), +(3, 'ConsumableItem', 'consumable', 86400, 10, 0, 1, 3, 0, 24, 30, NULL, NULL, NULL), +(4, 'SoftwareLicense', 'software', 86400, NULL, 0, 1, 3, 0, 24, 30, NULL, NULL, NULL), +(5, 'Contract', 'contract', 86400, NULL, 1, 1, 3, 0, 24, 30, '2010-05-06 09:31:02', NULL, NULL), +(6, 'InfoCom', 'infocom', 86400, NULL, 1, 1, 3, 0, 24, 30, '2011-01-18 11:40:43', NULL, NULL), +(7, 'CronTask', 'logs', 86400, 30, 0, 1, 3, 0, 24, 30, NULL, NULL, NULL), +(8, 'CronTask', 'optimize', 604800, NULL, 1, 1, 3, 0, 24, 30, '2011-03-04 11:35:21', NULL, NULL), +(9, 'MailCollector', 'mailgate', 600, 10, 1, 1, 3, 0, 24, 30, '2011-06-28 11:34:37', NULL, NULL), +(10, 'DBconnection', 'checkdbreplicate', 300, NULL, 0, 1, 3, 0, 24, 30, NULL, NULL, NULL), +(11, 'CronTask', 'checkupdate', 604800, NULL, 0, 1, 3, 0, 24, 30, NULL, NULL, NULL), +(12, 'CronTask', 'session', 86400, NULL, 1, 1, 3, 0, 24, 30, '2011-08-30 08:22:27', NULL, NULL), +(13, 'CronTask', 'graph', 3600, NULL, 1, 1, 3, 0, 24, 30, '2011-12-06 09:48:42', NULL, NULL), +(14, 'ReservationItem', 'reservation', 3600, NULL, 1, 1, 3, 0, 24, 30, '2012-04-05 20:31:57', NULL, NULL), +(15, 'Ticket', 'closeticket', 43200, NULL, 1, 1, 3, 0, 24, 30, '2014-01-15 14:35:00', NULL, NULL), +(16, 'Ticket', 'alertnotclosed', 43200, NULL, 1, 1, 3, 0, 24, 30, '2014-04-16 15:32:00', NULL, NULL), +(17, 'SlaLevel_Ticket', 'slaticket', 300, NULL, 1, 1, 3, 0, 24, 30, '2014-06-18 08:02:00', NULL, NULL), +(18, 'Ticket', 'createinquest', 86400, NULL, 1, 1, 3, 0, 24, 30, '2016-01-20 14:35:00', NULL, NULL), +(19, 'Crontask', 'watcher', 86400, NULL, 1, 1, 3, 0, 24, 30, '2016-01-20 14:38:00', NULL, NULL), +(20, 'TicketRecurrent', 'ticketrecurrent', 3600, NULL, 1, 1, 3, 0, 24, 30, '2016-01-20 14:38:00', NULL, NULL), +(21, 'PlanningRecall', 'planningrecall', 300, NULL, 1, 1, 3, 0, 24, 30, '2016-01-20 14:38:00', NULL, NULL), +(22, 'QueuedMail', 'queuedmail', 60, 50, 1, 1, 3, 0, 24, 30, '2016-01-20 15:32:00', NULL, NULL), +(23, 'QueuedMail', 'queuedmailclean', 86400, 30, 1, 1, 3, 0, 24, 30, NULL, NULL, NULL), +(24, 'Crontask', 'temp', 3600, NULL, 1, 1, 3, 0, 24, 30, NULL, NULL, NULL), +(25, 'MailCollector', 'mailgateerror', 86400, NULL, 1, 1, 3, 0, 24, 30, NULL, NULL, NULL), +(26, 'Crontask', 'circularlogs', 86400, 4, 0, 1, 3, 0, 24, 30, NULL, NULL, NULL), +(27, 'PluginOcsinventoryngOcsServer', 'ocsng', 300, NULL, 0, 1, 3, 0, 24, 30, NULL, NULL, NULL), +(28, 'PluginOcsinventoryngThread', 'CleanOldThreads', 3600, 24, 1, 1, 3, 0, 24, 30, NULL, NULL, NULL), +(29, 'PluginOcsinventoryngNotimportedcomputer', 'SendAlerts', 600, 24, 1, 1, 3, 0, 24, 30, NULL, NULL, NULL); + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_devicecases` +-- + +CREATE TABLE IF NOT EXISTS `glpi_devicecases` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `designation` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `devicecasetypes_id` int(11) NOT NULL DEFAULT '0', + `comment` text COLLATE utf8_unicode_ci, + `manufacturers_id` int(11) NOT NULL DEFAULT '0', + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `designation` (`designation`), + KEY `manufacturers_id` (`manufacturers_id`), + KEY `devicecasetypes_id` (`devicecasetypes_id`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_devicecasetypes` +-- + +CREATE TABLE IF NOT EXISTS `glpi_devicecasetypes` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `name` (`name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_devicecontrols` +-- + +CREATE TABLE IF NOT EXISTS `glpi_devicecontrols` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `designation` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `is_raid` tinyint(1) NOT NULL DEFAULT '0', + `comment` text COLLATE utf8_unicode_ci, + `manufacturers_id` int(11) NOT NULL DEFAULT '0', + `interfacetypes_id` int(11) NOT NULL DEFAULT '0', + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `designation` (`designation`), + KEY `manufacturers_id` (`manufacturers_id`), + KEY `interfacetypes_id` (`interfacetypes_id`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_devicedrives` +-- + +CREATE TABLE IF NOT EXISTS `glpi_devicedrives` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `designation` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `is_writer` tinyint(1) NOT NULL DEFAULT '1', + `speed` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + `manufacturers_id` int(11) NOT NULL DEFAULT '0', + `interfacetypes_id` int(11) NOT NULL DEFAULT '0', + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `designation` (`designation`), + KEY `manufacturers_id` (`manufacturers_id`), + KEY `interfacetypes_id` (`interfacetypes_id`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_devicegraphiccards` +-- + +CREATE TABLE IF NOT EXISTS `glpi_devicegraphiccards` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `designation` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `interfacetypes_id` int(11) NOT NULL DEFAULT '0', + `comment` text COLLATE utf8_unicode_ci, + `manufacturers_id` int(11) NOT NULL DEFAULT '0', + `memory_default` int(11) NOT NULL DEFAULT '0', + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `chipset` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `designation` (`designation`), + KEY `manufacturers_id` (`manufacturers_id`), + KEY `interfacetypes_id` (`interfacetypes_id`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`), + KEY `chipset` (`chipset`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_deviceharddrives` +-- + +CREATE TABLE IF NOT EXISTS `glpi_deviceharddrives` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `designation` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `rpm` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `interfacetypes_id` int(11) NOT NULL DEFAULT '0', + `cache` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + `manufacturers_id` int(11) NOT NULL DEFAULT '0', + `capacity_default` int(11) NOT NULL DEFAULT '0', + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `designation` (`designation`), + KEY `manufacturers_id` (`manufacturers_id`), + KEY `interfacetypes_id` (`interfacetypes_id`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_devicememories` +-- + +CREATE TABLE IF NOT EXISTS `glpi_devicememories` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `designation` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `frequence` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + `manufacturers_id` int(11) NOT NULL DEFAULT '0', + `size_default` int(11) NOT NULL DEFAULT '0', + `devicememorytypes_id` int(11) NOT NULL DEFAULT '0', + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `designation` (`designation`), + KEY `manufacturers_id` (`manufacturers_id`), + KEY `devicememorytypes_id` (`devicememorytypes_id`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_devicememorytypes` +-- + +CREATE TABLE IF NOT EXISTS `glpi_devicememorytypes` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `name` (`name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=5 ; + +-- +-- Contenu de la table `glpi_devicememorytypes` +-- + +INSERT INTO `glpi_devicememorytypes` (`id`, `name`, `comment`) VALUES +(1, 'EDO', NULL), +(2, 'DDR', NULL), +(3, 'SDRAM', NULL), +(4, 'SDRAM-2', NULL); + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_devicemotherboards` +-- + +CREATE TABLE IF NOT EXISTS `glpi_devicemotherboards` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `designation` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `chipset` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + `manufacturers_id` int(11) NOT NULL DEFAULT '0', + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `designation` (`designation`), + KEY `manufacturers_id` (`manufacturers_id`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_devicenetworkcards` +-- + +CREATE TABLE IF NOT EXISTS `glpi_devicenetworkcards` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `designation` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `bandwidth` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + `manufacturers_id` int(11) NOT NULL DEFAULT '0', + `mac_default` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `designation` (`designation`), + KEY `manufacturers_id` (`manufacturers_id`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_devicepcis` +-- + +CREATE TABLE IF NOT EXISTS `glpi_devicepcis` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `designation` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + `manufacturers_id` int(11) NOT NULL DEFAULT '0', + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `designation` (`designation`), + KEY `manufacturers_id` (`manufacturers_id`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_devicepowersupplies` +-- + +CREATE TABLE IF NOT EXISTS `glpi_devicepowersupplies` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `designation` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `power` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `is_atx` tinyint(1) NOT NULL DEFAULT '1', + `comment` text COLLATE utf8_unicode_ci, + `manufacturers_id` int(11) NOT NULL DEFAULT '0', + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `designation` (`designation`), + KEY `manufacturers_id` (`manufacturers_id`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_deviceprocessors` +-- + +CREATE TABLE IF NOT EXISTS `glpi_deviceprocessors` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `designation` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `frequence` int(11) NOT NULL DEFAULT '0', + `comment` text COLLATE utf8_unicode_ci, + `manufacturers_id` int(11) NOT NULL DEFAULT '0', + `frequency_default` int(11) NOT NULL DEFAULT '0', + `nbcores_default` int(11) DEFAULT NULL, + `nbthreads_default` int(11) DEFAULT NULL, + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `designation` (`designation`), + KEY `manufacturers_id` (`manufacturers_id`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_devicesoundcards` +-- + +CREATE TABLE IF NOT EXISTS `glpi_devicesoundcards` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `designation` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `type` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + `manufacturers_id` int(11) NOT NULL DEFAULT '0', + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `designation` (`designation`), + KEY `manufacturers_id` (`manufacturers_id`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_displaypreferences` +-- + +CREATE TABLE IF NOT EXISTS `glpi_displaypreferences` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `itemtype` varchar(100) COLLATE utf8_unicode_ci NOT NULL, + `num` int(11) NOT NULL DEFAULT '0', + `rank` int(11) NOT NULL DEFAULT '0', + `users_id` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `unicity` (`users_id`,`itemtype`,`num`), + KEY `rank` (`rank`), + KEY `num` (`num`), + KEY `itemtype` (`itemtype`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=273 ; + +-- +-- Contenu de la table `glpi_displaypreferences` +-- + +INSERT INTO `glpi_displaypreferences` (`id`, `itemtype`, `num`, `rank`, `users_id`) VALUES +(32, 'Computer', 4, 4, 0), +(34, 'Computer', 45, 6, 0), +(33, 'Computer', 40, 5, 0), +(31, 'Computer', 5, 3, 0), +(30, 'Computer', 23, 2, 0), +(86, 'DocumentType', 3, 1, 0), +(49, 'Monitor', 31, 1, 0), +(50, 'Monitor', 23, 2, 0), +(51, 'Monitor', 3, 3, 0), +(52, 'Monitor', 4, 4, 0), +(44, 'Printer', 31, 1, 0), +(38, 'NetworkEquipment', 31, 1, 0), +(39, 'NetworkEquipment', 23, 2, 0), +(45, 'Printer', 23, 2, 0), +(46, 'Printer', 3, 3, 0), +(63, 'Software', 4, 3, 0), +(62, 'Software', 5, 2, 0), +(61, 'Software', 23, 1, 0), +(83, 'CartridgeItem', 4, 2, 0), +(82, 'CartridgeItem', 34, 1, 0), +(57, 'Peripheral', 3, 3, 0), +(56, 'Peripheral', 23, 2, 0), +(55, 'Peripheral', 31, 1, 0), +(29, 'Computer', 31, 1, 0), +(35, 'Computer', 3, 7, 0), +(36, 'Computer', 19, 8, 0), +(37, 'Computer', 17, 9, 0), +(40, 'NetworkEquipment', 3, 3, 0), +(41, 'NetworkEquipment', 4, 4, 0), +(42, 'NetworkEquipment', 11, 6, 0), +(43, 'NetworkEquipment', 19, 7, 0), +(47, 'Printer', 4, 4, 0), +(48, 'Printer', 19, 6, 0), +(53, 'Monitor', 19, 6, 0), +(54, 'Monitor', 7, 7, 0), +(58, 'Peripheral', 4, 4, 0), +(59, 'Peripheral', 19, 6, 0), +(60, 'Peripheral', 7, 7, 0), +(64, 'Contact', 3, 1, 0), +(65, 'Contact', 4, 2, 0), +(66, 'Contact', 5, 3, 0), +(67, 'Contact', 6, 4, 0), +(68, 'Contact', 9, 5, 0), +(69, 'Supplier', 9, 1, 0), +(70, 'Supplier', 3, 2, 0), +(71, 'Supplier', 4, 3, 0), +(72, 'Supplier', 5, 4, 0), +(73, 'Supplier', 10, 5, 0), +(74, 'Supplier', 6, 6, 0), +(75, 'Contract', 4, 1, 0), +(76, 'Contract', 3, 2, 0), +(77, 'Contract', 5, 3, 0), +(78, 'Contract', 6, 4, 0), +(79, 'Contract', 7, 5, 0), +(80, 'Contract', 11, 6, 0), +(84, 'CartridgeItem', 23, 3, 0), +(85, 'CartridgeItem', 3, 4, 0), +(88, 'DocumentType', 6, 2, 0), +(89, 'DocumentType', 4, 3, 0), +(90, 'DocumentType', 5, 4, 0), +(91, 'Document', 3, 1, 0), +(92, 'Document', 4, 2, 0), +(93, 'Document', 7, 3, 0), +(94, 'Document', 5, 4, 0), +(95, 'Document', 16, 5, 0), +(96, 'User', 34, 1, 0), +(98, 'User', 5, 3, 0), +(99, 'User', 6, 4, 0), +(100, 'User', 3, 5, 0), +(101, 'ConsumableItem', 34, 1, 0), +(102, 'ConsumableItem', 4, 2, 0), +(103, 'ConsumableItem', 23, 3, 0), +(104, 'ConsumableItem', 3, 4, 0), +(105, 'NetworkEquipment', 40, 5, 0), +(106, 'Printer', 40, 5, 0), +(107, 'Monitor', 40, 5, 0), +(108, 'Peripheral', 40, 5, 0), +(109, 'User', 8, 6, 0), +(110, 'Phone', 31, 1, 0), +(111, 'Phone', 23, 2, 0), +(112, 'Phone', 3, 3, 0), +(113, 'Phone', 4, 4, 0), +(114, 'Phone', 40, 5, 0), +(115, 'Phone', 19, 6, 0), +(116, 'Phone', 7, 7, 0), +(117, 'Group', 16, 1, 0), +(118, 'AllAssets', 31, 1, 0), +(119, 'ReservationItem', 4, 1, 0), +(120, 'ReservationItem', 3, 2, 0), +(125, 'Budget', 3, 2, 0), +(122, 'Software', 72, 4, 0), +(123, 'Software', 163, 5, 0), +(124, 'Budget', 5, 1, 0), +(126, 'Budget', 4, 3, 0), +(127, 'Budget', 19, 4, 0), +(128, 'Crontask', 8, 1, 0), +(129, 'Crontask', 3, 2, 0), +(130, 'Crontask', 4, 3, 0), +(131, 'Crontask', 7, 4, 0), +(132, 'RequestType', 14, 1, 0), +(133, 'RequestType', 15, 2, 0), +(134, 'NotificationTemplate', 4, 1, 0), +(135, 'NotificationTemplate', 16, 2, 0), +(136, 'Notification', 5, 1, 0), +(137, 'Notification', 6, 2, 0), +(138, 'Notification', 2, 3, 0), +(139, 'Notification', 4, 4, 0), +(140, 'Notification', 80, 5, 0), +(141, 'Notification', 86, 6, 0), +(142, 'MailCollector', 2, 1, 0), +(143, 'MailCollector', 19, 2, 0), +(144, 'AuthLDAP', 3, 1, 0), +(145, 'AuthLDAP', 19, 2, 0), +(146, 'AuthMail', 3, 1, 0), +(147, 'AuthMail', 19, 2, 0), +(210, 'IPNetwork', 14, 1, 0), +(209, 'WifiNetwork', 10, 1, 0), +(150, 'Profile', 2, 1, 0), +(151, 'Profile', 3, 2, 0), +(152, 'Profile', 19, 3, 0), +(153, 'Transfer', 19, 1, 0), +(154, 'TicketValidation', 3, 1, 0), +(155, 'TicketValidation', 2, 2, 0), +(156, 'TicketValidation', 8, 3, 0), +(157, 'TicketValidation', 4, 4, 0), +(158, 'TicketValidation', 9, 5, 0), +(159, 'TicketValidation', 7, 6, 0), +(160, 'NotImportedEmail', 2, 1, 0), +(161, 'NotImportedEmail', 5, 2, 0), +(162, 'NotImportedEmail', 4, 3, 0), +(163, 'NotImportedEmail', 6, 4, 0), +(164, 'NotImportedEmail', 16, 5, 0), +(165, 'NotImportedEmail', 19, 6, 0), +(166, 'RuleRightParameter', 11, 1, 0), +(167, 'Ticket', 12, 1, 0), +(168, 'Ticket', 19, 2, 0), +(169, 'Ticket', 15, 3, 0), +(170, 'Ticket', 3, 4, 0), +(171, 'Ticket', 4, 5, 0), +(172, 'Ticket', 5, 6, 0), +(173, 'Ticket', 7, 7, 0), +(174, 'Calendar', 19, 1, 0), +(175, 'Holiday', 11, 1, 0), +(176, 'Holiday', 12, 2, 0), +(177, 'Holiday', 13, 3, 0), +(178, 'SLA', 4, 1, 0), +(179, 'Ticket', 18, 8, 0), +(180, 'AuthLdap', 30, 3, 0), +(181, 'AuthMail', 6, 3, 0), +(208, 'FQDN', 11, 1, 0), +(183, 'FieldUnicity', 1, 1, 0), +(184, 'FieldUnicity', 80, 2, 0), +(185, 'FieldUnicity', 4, 3, 0), +(186, 'FieldUnicity', 3, 4, 0), +(187, 'FieldUnicity', 86, 5, 0), +(188, 'FieldUnicity', 30, 6, 0), +(189, 'Problem', 21, 1, 0), +(190, 'Problem', 12, 2, 0), +(191, 'Problem', 19, 3, 0), +(192, 'Problem', 15, 4, 0), +(193, 'Problem', 3, 5, 0), +(194, 'Problem', 7, 6, 0), +(195, 'Problem', 18, 7, 0), +(196, 'Vlan', 11, 1, 0), +(197, 'TicketRecurrent', 11, 1, 0), +(198, 'TicketRecurrent', 12, 2, 0), +(199, 'TicketRecurrent', 13, 3, 0), +(200, 'TicketRecurrent', 15, 4, 0), +(201, 'TicketRecurrent', 14, 5, 0), +(202, 'Reminder', 2, 1, 0), +(203, 'Reminder', 3, 2, 0), +(204, 'Reminder', 4, 3, 0), +(205, 'Reminder', 5, 4, 0), +(206, 'Reminder', 6, 5, 0), +(207, 'Reminder', 7, 6, 0), +(211, 'IPNetwork', 10, 2, 0), +(212, 'IPNetwork', 11, 3, 0), +(213, 'IPNetwork', 12, 4, 0), +(214, 'IPNetwork', 13, 5, 0), +(215, 'NetworkName', 12, 1, 0), +(216, 'NetworkName', 13, 2, 0), +(217, 'RSSFeed', 2, 1, 0), +(218, 'RSSFeed', 4, 2, 0), +(219, 'RSSFeed', 5, 3, 0), +(220, 'RSSFeed', 19, 4, 0), +(221, 'RSSFeed', 6, 5, 0), +(222, 'RSSFeed', 7, 6, 0), +(223, 'Blacklist', 12, 1, 0), +(224, 'Blacklist', 11, 2, 0), +(225, 'ReservationItem', 5, 3, 0), +(226, 'QueueMail', 16, 1, 0), +(227, 'QueueMail', 7, 2, 0), +(228, 'QueueMail', 20, 3, 0), +(229, 'QueueMail', 21, 4, 0), +(230, 'QueueMail', 22, 5, 0), +(231, 'QueueMail', 15, 6, 0), +(232, 'Change', 12, 1, 0), +(233, 'Change', 19, 2, 0), +(234, 'Change', 15, 3, 0), +(235, 'Change', 7, 4, 0), +(236, 'Change', 18, 5, 0), +(237, 'Project', 3, 1, 0), +(238, 'Project', 4, 2, 0), +(239, 'Project', 12, 3, 0), +(240, 'Project', 5, 4, 0), +(241, 'Project', 15, 5, 0), +(242, 'Project', 21, 6, 0), +(243, 'ProjectState', 12, 1, 0), +(244, 'ProjectState', 11, 2, 0), +(245, 'ProjectTask', 2, 1, 0), +(246, 'ProjectTask', 12, 2, 0), +(247, 'ProjectTask', 14, 3, 0), +(248, 'ProjectTask', 5, 4, 0), +(249, 'ProjectTask', 7, 5, 0), +(250, 'ProjectTask', 8, 6, 0), +(251, 'ProjectTask', 13, 7, 0), +(252, 'CartridgeItem', 9, 5, 0), +(253, 'ConsumableItem', 9, 5, 0), +(254, 'ReservationItem', 9, 4, 0), +(255, 'PluginOcsinventoryngOcsServer', 3, 1, 0), +(256, 'PluginOcsinventoryngOcsServer', 19, 2, 0), +(257, 'PluginOcsinventoryngOcsServer', 6, 3, 0), +(258, 'PluginOcsinventoryngNotimportedcomputer', 2, 1, 0), +(259, 'PluginOcsinventoryngNotimportedcomputer', 3, 2, 0), +(260, 'PluginOcsinventoryngNotimportedcomputer', 4, 3, 0), +(261, 'PluginOcsinventoryngNotimportedcomputer', 5, 4, 0), +(262, 'PluginOcsinventoryngNotimportedcomputer', 6, 5, 0), +(263, 'PluginOcsinventoryngNotimportedcomputer', 7, 6, 0), +(264, 'PluginOcsinventoryngNotimportedcomputer', 8, 7, 0), +(265, 'PluginOcsinventoryngNotimportedcomputer', 9, 8, 0), +(266, 'PluginOcsinventoryngNotimportedcomputer', 10, 9, 0), +(267, 'PluginOcsinventoryngDetail', 5, 1, 0), +(268, 'PluginOcsinventoryngDetail', 2, 2, 0), +(269, 'PluginOcsinventoryngDetail', 3, 3, 0), +(270, 'PluginOcsinventoryngDetail', 4, 4, 0), +(271, 'PluginOcsinventoryngDetail', 6, 5, 0), +(272, 'PluginOcsinventoryngDetail', 80, 6, 0); + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_documentcategories` +-- + +CREATE TABLE IF NOT EXISTS `glpi_documentcategories` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + `documentcategories_id` int(11) NOT NULL DEFAULT '0', + `completename` text COLLATE utf8_unicode_ci, + `level` int(11) NOT NULL DEFAULT '0', + `ancestors_cache` longtext COLLATE utf8_unicode_ci, + `sons_cache` longtext COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `name` (`name`), + KEY `unicity` (`documentcategories_id`,`name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_documents` +-- + +CREATE TABLE IF NOT EXISTS `glpi_documents` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `filename` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT 'for display and transfert', + `filepath` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT 'file storage path', + `documentcategories_id` int(11) NOT NULL DEFAULT '0', + `mime` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `date_mod` datetime DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + `is_deleted` tinyint(1) NOT NULL DEFAULT '0', + `link` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `users_id` int(11) NOT NULL DEFAULT '0', + `tickets_id` int(11) NOT NULL DEFAULT '0', + `sha1sum` char(40) COLLATE utf8_unicode_ci DEFAULT NULL, + `is_blacklisted` tinyint(1) NOT NULL DEFAULT '0', + `tag` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `date_mod` (`date_mod`), + KEY `name` (`name`), + KEY `entities_id` (`entities_id`), + KEY `tickets_id` (`tickets_id`), + KEY `users_id` (`users_id`), + KEY `documentcategories_id` (`documentcategories_id`), + KEY `is_deleted` (`is_deleted`), + KEY `sha1sum` (`sha1sum`), + KEY `tag` (`tag`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_documents_items` +-- + +CREATE TABLE IF NOT EXISTS `glpi_documents_items` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `documents_id` int(11) NOT NULL DEFAULT '0', + `items_id` int(11) NOT NULL DEFAULT '0', + `itemtype` varchar(100) COLLATE utf8_unicode_ci NOT NULL, + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `date_mod` datetime DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `unicity` (`documents_id`,`itemtype`,`items_id`), + KEY `item` (`itemtype`,`items_id`,`entities_id`,`is_recursive`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_documenttypes` +-- + +CREATE TABLE IF NOT EXISTS `glpi_documenttypes` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `ext` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `icon` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `mime` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `is_uploadable` tinyint(1) NOT NULL DEFAULT '1', + `date_mod` datetime DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + UNIQUE KEY `unicity` (`ext`), + KEY `name` (`name`), + KEY `is_uploadable` (`is_uploadable`), + KEY `date_mod` (`date_mod`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=73 ; + +-- +-- Contenu de la table `glpi_documenttypes` +-- + +INSERT INTO `glpi_documenttypes` (`id`, `name`, `ext`, `icon`, `mime`, `is_uploadable`, `date_mod`, `comment`) VALUES +(1, 'JPEG', 'jpg', 'jpg-dist.png', '', 1, '2004-12-13 19:47:21', NULL), +(2, 'PNG', 'png', 'png-dist.png', '', 1, '2004-12-13 19:47:21', NULL), +(3, 'GIF', 'gif', 'gif-dist.png', '', 1, '2004-12-13 19:47:21', NULL), +(4, 'BMP', 'bmp', 'bmp-dist.png', '', 1, '2004-12-13 19:47:21', NULL), +(5, 'Photoshop', 'psd', 'psd-dist.png', '', 1, '2004-12-13 19:47:21', NULL), +(6, 'TIFF', 'tif', 'tif-dist.png', '', 1, '2004-12-13 19:47:21', NULL), +(7, 'AIFF', 'aiff', 'aiff-dist.png', '', 1, '2004-12-13 19:47:21', NULL), +(8, 'Windows Media', 'asf', 'asf-dist.png', '', 1, '2004-12-13 19:47:21', NULL), +(9, 'Windows Media', 'avi', 'avi-dist.png', '', 1, '2004-12-13 19:47:21', NULL), +(44, 'C source', 'c', 'c-dist.png', '', 1, '2011-12-06 09:48:34', NULL), +(27, 'RealAudio', 'rm', 'rm-dist.png', '', 1, '2004-12-13 19:47:21', NULL), +(16, 'Midi', 'mid', 'mid-dist.png', '', 1, '2004-12-13 19:47:21', NULL), +(17, 'QuickTime', 'mov', 'mov-dist.png', '', 1, '2004-12-13 19:47:21', NULL), +(18, 'MP3', 'mp3', 'mp3-dist.png', '', 1, '2004-12-13 19:47:21', NULL), +(19, 'MPEG', 'mpg', 'mpg-dist.png', '', 1, '2004-12-13 19:47:21', NULL), +(20, 'Ogg Vorbis', 'ogg', 'ogg-dist.png', '', 1, '2004-12-13 19:47:21', NULL), +(24, 'QuickTime', 'qt', 'qt-dist.png', '', 1, '2004-12-13 19:47:21', NULL), +(10, 'BZip', 'bz2', 'bz2-dist.png', '', 1, '2004-12-13 19:47:21', NULL), +(25, 'RealAudio', 'ra', 'ra-dist.png', '', 1, '2004-12-13 19:47:21', NULL), +(26, 'RealAudio', 'ram', 'ram-dist.png', '', 1, '2004-12-13 19:47:21', NULL), +(11, 'Word', 'doc', 'doc-dist.png', '', 1, '2004-12-13 19:47:21', NULL), +(12, 'DjVu', 'djvu', '', '', 1, '2004-12-13 19:47:21', NULL), +(42, 'MNG', 'mng', '', '', 1, '2004-12-13 19:47:22', NULL), +(13, 'PostScript', 'eps', 'ps-dist.png', '', 1, '2004-12-13 19:47:21', NULL), +(14, 'GZ', 'gz', 'gz-dist.png', '', 1, '2004-12-13 19:47:21', NULL), +(37, 'WAV', 'wav', 'wav-dist.png', '', 1, '2004-12-13 19:47:22', NULL), +(15, 'HTML', 'html', 'html-dist.png', '', 1, '2004-12-13 19:47:21', NULL), +(34, 'Flash', 'swf', 'swf-dist.png', '', 1, '2011-12-06 09:48:34', NULL), +(21, 'PDF', 'pdf', 'pdf-dist.png', '', 1, '2004-12-13 19:47:21', NULL), +(22, 'PowerPoint', 'ppt', 'ppt-dist.png', '', 1, '2004-12-13 19:47:21', NULL), +(23, 'PostScript', 'ps', 'ps-dist.png', '', 1, '2004-12-13 19:47:21', NULL), +(40, 'Windows Media', 'wmv', 'wmv-dist.png', '', 1, '2011-12-06 09:48:34', NULL), +(28, 'RTF', 'rtf', 'rtf-dist.png', '', 1, '2004-12-13 19:47:21', NULL), +(29, 'StarOffice', 'sdd', 'sdd-dist.png', '', 1, '2004-12-13 19:47:22', NULL), +(30, 'StarOffice', 'sdw', 'sdw-dist.png', '', 1, '2004-12-13 19:47:22', NULL), +(31, 'Stuffit', 'sit', 'sit-dist.png', '', 1, '2004-12-13 19:47:22', NULL), +(43, 'Adobe Illustrator', 'ai', 'ai-dist.png', '', 1, '2004-12-13 19:47:22', NULL), +(32, 'OpenOffice Impress', 'sxi', 'sxi-dist.png', '', 1, '2004-12-13 19:47:22', NULL), +(33, 'OpenOffice', 'sxw', 'sxw-dist.png', '', 1, '2004-12-13 19:47:22', NULL), +(46, 'DVI', 'dvi', 'dvi-dist.png', '', 1, '2004-12-13 19:47:22', NULL), +(35, 'TGZ', 'tgz', 'tgz-dist.png', '', 1, '2004-12-13 19:47:22', NULL), +(36, 'texte', 'txt', 'txt-dist.png', '', 1, '2004-12-13 19:47:22', NULL), +(49, 'RedHat/Mandrake/SuSE', 'rpm', 'rpm-dist.png', '', 1, '2004-12-13 19:47:22', NULL), +(38, 'Excel', 'xls', 'xls-dist.png', '', 1, '2004-12-13 19:47:22', NULL), +(39, 'XML', 'xml', 'xml-dist.png', '', 1, '2004-12-13 19:47:22', NULL), +(41, 'Zip', 'zip', 'zip-dist.png', '', 1, '2011-12-06 09:48:34', NULL), +(45, 'Debian', 'deb', 'deb-dist.png', '', 1, '2004-12-13 19:47:22', NULL), +(47, 'C header', 'h', 'h-dist.png', '', 1, '2011-12-06 09:48:34', NULL), +(48, 'Pascal', 'pas', 'pas-dist.png', '', 1, '2011-12-06 09:48:34', NULL), +(50, 'OpenOffice Calc', 'sxc', 'sxc-dist.png', '', 1, '2004-12-13 19:47:22', NULL), +(51, 'LaTeX', 'tex', 'tex-dist.png', '', 1, '2004-12-13 19:47:22', NULL), +(52, 'GIMP multi-layer', 'xcf', 'xcf-dist.png', '', 1, '2004-12-13 19:47:22', NULL), +(53, 'JPEG', 'jpeg', 'jpg-dist.png', '', 1, '2005-03-07 22:23:17', NULL), +(54, 'Oasis Open Office Writer', 'odt', 'odt-dist.png', '', 1, '2006-01-21 17:41:13', NULL), +(55, 'Oasis Open Office Calc', 'ods', 'ods-dist.png', '', 1, '2006-01-21 17:41:31', NULL), +(56, 'Oasis Open Office Impress', 'odp', 'odp-dist.png', '', 1, '2006-01-21 17:42:54', NULL), +(57, 'Oasis Open Office Impress Template', 'otp', 'odp-dist.png', '', 1, '2006-01-21 17:43:58', NULL), +(58, 'Oasis Open Office Writer Template', 'ott', 'odt-dist.png', '', 1, '2006-01-21 17:44:41', NULL), +(59, 'Oasis Open Office Calc Template', 'ots', 'ods-dist.png', '', 1, '2006-01-21 17:45:30', NULL), +(60, 'Oasis Open Office Math', 'odf', 'odf-dist.png', '', 1, '2006-01-21 17:48:05', NULL), +(61, 'Oasis Open Office Draw', 'odg', 'odg-dist.png', '', 1, '2006-01-21 17:48:31', NULL), +(62, 'Oasis Open Office Draw Template', 'otg', 'odg-dist.png', '', 1, '2006-01-21 17:49:46', NULL), +(63, 'Oasis Open Office Base', 'odb', 'odb-dist.png', '', 1, '2006-01-21 18:03:34', NULL), +(64, 'Oasis Open Office HTML', 'oth', 'oth-dist.png', '', 1, '2006-01-21 18:05:27', NULL), +(65, 'Oasis Open Office Writer Master', 'odm', 'odm-dist.png', '', 1, '2006-01-21 18:06:34', NULL), +(66, 'Oasis Open Office Chart', 'odc', '', '', 1, '2006-01-21 18:07:48', NULL), +(67, 'Oasis Open Office Image', 'odi', '', '', 1, '2006-01-21 18:08:18', NULL), +(68, 'Word XML', 'docx', 'doc-dist.png', NULL, 1, '2011-01-18 11:40:42', NULL), +(69, 'Excel XML', 'xlsx', 'xls-dist.png', NULL, 1, '2011-01-18 11:40:42', NULL), +(70, 'PowerPoint XML', 'pptx', 'ppt-dist.png', NULL, 1, '2011-01-18 11:40:42', NULL), +(71, 'Comma-Separated Values', 'csv', 'csv-dist.png', NULL, 1, '2011-12-06 09:48:34', NULL), +(72, 'Scalable Vector Graphics', 'svg', 'svg-dist.png', NULL, 1, '2011-12-06 09:48:34', NULL); + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_domains` +-- + +CREATE TABLE IF NOT EXISTS `glpi_domains` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `name` (`name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_dropdowntranslations` +-- + +CREATE TABLE IF NOT EXISTS `glpi_dropdowntranslations` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `items_id` int(11) NOT NULL DEFAULT '0', + `itemtype` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL, + `language` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, + `field` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL, + `value` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + UNIQUE KEY `unicity` (`itemtype`,`items_id`,`language`,`field`), + KEY `typeid` (`itemtype`,`items_id`), + KEY `language` (`language`), + KEY `field` (`field`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_entities` +-- + +CREATE TABLE IF NOT EXISTS `glpi_entities` ( + `id` int(11) NOT NULL DEFAULT '0', + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `entities_id` int(11) NOT NULL DEFAULT '0', + `completename` text COLLATE utf8_unicode_ci, + `comment` text COLLATE utf8_unicode_ci, + `level` int(11) NOT NULL DEFAULT '0', + `sons_cache` longtext COLLATE utf8_unicode_ci, + `ancestors_cache` longtext COLLATE utf8_unicode_ci, + `address` text COLLATE utf8_unicode_ci, + `postcode` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `town` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `state` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `country` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `website` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `phonenumber` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `fax` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `email` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `admin_email` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `admin_email_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `admin_reply` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `admin_reply_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `notification_subject_tag` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `ldap_dn` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `tag` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `authldaps_id` int(11) NOT NULL DEFAULT '0', + `mail_domain` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `entity_ldapfilter` text COLLATE utf8_unicode_ci, + `mailing_signature` text COLLATE utf8_unicode_ci, + `cartridges_alert_repeat` int(11) NOT NULL DEFAULT '-2', + `consumables_alert_repeat` int(11) NOT NULL DEFAULT '-2', + `use_licenses_alert` int(11) NOT NULL DEFAULT '-2', + `send_licenses_alert_before_delay` int(11) NOT NULL DEFAULT '-2', + `use_contracts_alert` int(11) NOT NULL DEFAULT '-2', + `send_contracts_alert_before_delay` int(11) NOT NULL DEFAULT '-2', + `use_infocoms_alert` int(11) NOT NULL DEFAULT '-2', + `send_infocoms_alert_before_delay` int(11) NOT NULL DEFAULT '-2', + `use_reservations_alert` int(11) NOT NULL DEFAULT '-2', + `autoclose_delay` int(11) NOT NULL DEFAULT '-2', + `notclosed_delay` int(11) NOT NULL DEFAULT '-2', + `calendars_id` int(11) NOT NULL DEFAULT '-2', + `auto_assign_mode` int(11) NOT NULL DEFAULT '-2', + `tickettype` int(11) NOT NULL DEFAULT '-2', + `max_closedate` datetime DEFAULT NULL, + `inquest_config` int(11) NOT NULL DEFAULT '-2', + `inquest_rate` int(11) NOT NULL DEFAULT '0', + `inquest_delay` int(11) NOT NULL DEFAULT '-10', + `inquest_URL` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `autofill_warranty_date` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '-2', + `autofill_use_date` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '-2', + `autofill_buy_date` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '-2', + `autofill_delivery_date` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '-2', + `autofill_order_date` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '-2', + `tickettemplates_id` int(11) NOT NULL DEFAULT '-2', + `entities_id_software` int(11) NOT NULL DEFAULT '-2', + `default_contract_alert` int(11) NOT NULL DEFAULT '-2', + `default_infocom_alert` int(11) NOT NULL DEFAULT '-2', + `default_cartridges_alarm_threshold` int(11) NOT NULL DEFAULT '-2', + `default_consumables_alarm_threshold` int(11) NOT NULL DEFAULT '-2', + `delay_send_emails` int(11) NOT NULL DEFAULT '-2', + `is_notif_enable_default` int(11) NOT NULL DEFAULT '-2', + PRIMARY KEY (`id`), + UNIQUE KEY `unicity` (`entities_id`,`name`), + KEY `entities_id` (`entities_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; + +-- +-- Contenu de la table `glpi_entities` +-- + +INSERT INTO `glpi_entities` (`id`, `name`, `entities_id`, `completename`, `comment`, `level`, `sons_cache`, `ancestors_cache`, `address`, `postcode`, `town`, `state`, `country`, `website`, `phonenumber`, `fax`, `email`, `admin_email`, `admin_email_name`, `admin_reply`, `admin_reply_name`, `notification_subject_tag`, `ldap_dn`, `tag`, `authldaps_id`, `mail_domain`, `entity_ldapfilter`, `mailing_signature`, `cartridges_alert_repeat`, `consumables_alert_repeat`, `use_licenses_alert`, `send_licenses_alert_before_delay`, `use_contracts_alert`, `send_contracts_alert_before_delay`, `use_infocoms_alert`, `send_infocoms_alert_before_delay`, `use_reservations_alert`, `autoclose_delay`, `notclosed_delay`, `calendars_id`, `auto_assign_mode`, `tickettype`, `max_closedate`, `inquest_config`, `inquest_rate`, `inquest_delay`, `inquest_URL`, `autofill_warranty_date`, `autofill_use_date`, `autofill_buy_date`, `autofill_delivery_date`, `autofill_order_date`, `tickettemplates_id`, `entities_id_software`, `default_contract_alert`, `default_infocom_alert`, `default_cartridges_alarm_threshold`, `default_consumables_alarm_threshold`, `delay_send_emails`, `is_notif_enable_default`) VALUES +(0, 'Root entity', -1, 'Root entity', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, -10, 1, NULL, 1, 0, 0, NULL, '0', '0', '0', '0', '0', 1, -10, 0, 0, 10, 10, 0, 1); + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_entities_knowbaseitems` +-- + +CREATE TABLE IF NOT EXISTS `glpi_entities_knowbaseitems` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `knowbaseitems_id` int(11) NOT NULL DEFAULT '0', + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `knowbaseitems_id` (`knowbaseitems_id`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_entities_reminders` +-- + +CREATE TABLE IF NOT EXISTS `glpi_entities_reminders` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `reminders_id` int(11) NOT NULL DEFAULT '0', + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `reminders_id` (`reminders_id`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_entities_rssfeeds` +-- + +CREATE TABLE IF NOT EXISTS `glpi_entities_rssfeeds` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `rssfeeds_id` int(11) NOT NULL DEFAULT '0', + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `rssfeeds_id` (`rssfeeds_id`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_events` +-- + +CREATE TABLE IF NOT EXISTS `glpi_events` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `items_id` int(11) NOT NULL DEFAULT '0', + `type` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `date` datetime DEFAULT NULL, + `service` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `level` int(11) NOT NULL DEFAULT '0', + `message` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `date` (`date`), + KEY `level` (`level`), + KEY `item` (`type`,`items_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=5 ; + +-- +-- Structure de la table `glpi_fieldblacklists` +-- + +CREATE TABLE IF NOT EXISTS `glpi_fieldblacklists` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '', + `field` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '', + `value` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '', + `itemtype` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '', + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `name` (`name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_fieldunicities` +-- + +CREATE TABLE IF NOT EXISTS `glpi_fieldunicities` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `itemtype` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '', + `entities_id` int(11) NOT NULL DEFAULT '-1', + `fields` text COLLATE utf8_unicode_ci, + `is_active` tinyint(1) NOT NULL DEFAULT '0', + `action_refuse` tinyint(1) NOT NULL DEFAULT '0', + `action_notify` tinyint(1) NOT NULL DEFAULT '0', + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Stores field unicity criterias' AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- +LOCK TABLES `glpi_fieldunicities` WRITE; +/*!40000 ALTER TABLE `glpi_fieldunicities` DISABLE KEYS */; +INSERT INTO `glpi_fieldunicities` VALUES (1,'ordinateur',0,'Computer',0,'name,serial',0,0,0,''); +/*!40000 ALTER TABLE `glpi_fieldunicities` ENABLE KEYS */; +UNLOCK TABLES; +-- +-- Structure de la table `glpi_filesystems` +-- + +CREATE TABLE IF NOT EXISTS `glpi_filesystems` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `name` (`name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=21 ; + +-- +-- Contenu de la table `glpi_filesystems` +-- + +INSERT INTO `glpi_filesystems` (`id`, `name`, `comment`) VALUES +(1, 'ext', NULL), +(2, 'ext2', NULL), +(3, 'ext3', NULL), +(4, 'ext4', NULL), +(5, 'FAT', NULL), +(6, 'FAT32', NULL), +(7, 'VFAT', NULL), +(8, 'HFS', NULL), +(9, 'HPFS', NULL), +(10, 'HTFS', NULL), +(11, 'JFS', NULL), +(12, 'JFS2', NULL), +(13, 'NFS', NULL), +(14, 'NTFS', NULL), +(15, 'ReiserFS', NULL), +(16, 'SMBFS', NULL), +(17, 'UDF', NULL), +(18, 'UFS', NULL), +(19, 'XFS', NULL), +(20, 'ZFS', NULL); + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_fqdns` +-- + +CREATE TABLE IF NOT EXISTS `glpi_fqdns` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `fqdn` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `entities_id` (`entities_id`), + KEY `name` (`name`), + KEY `fqdn` (`fqdn`), + KEY `is_recursive` (`is_recursive`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_groups` +-- + +CREATE TABLE IF NOT EXISTS `glpi_groups` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + `ldap_field` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `ldap_value` text COLLATE utf8_unicode_ci, + `ldap_group_dn` text COLLATE utf8_unicode_ci, + `date_mod` datetime DEFAULT NULL, + `groups_id` int(11) NOT NULL DEFAULT '0', + `completename` text COLLATE utf8_unicode_ci, + `level` int(11) NOT NULL DEFAULT '0', + `ancestors_cache` longtext COLLATE utf8_unicode_ci, + `sons_cache` longtext COLLATE utf8_unicode_ci, + `is_requester` tinyint(1) NOT NULL DEFAULT '1', + `is_assign` tinyint(1) NOT NULL DEFAULT '1', + `is_notify` tinyint(1) NOT NULL DEFAULT '1', + `is_itemgroup` tinyint(1) NOT NULL DEFAULT '1', + `is_usergroup` tinyint(1) NOT NULL DEFAULT '1', + `is_manager` tinyint(1) NOT NULL DEFAULT '1', + PRIMARY KEY (`id`), + KEY `name` (`name`), + KEY `ldap_field` (`ldap_field`), + KEY `entities_id` (`entities_id`), + KEY `date_mod` (`date_mod`), + KEY `ldap_value` (`ldap_value`(200)), + KEY `ldap_group_dn` (`ldap_group_dn`(200)), + KEY `groups_id` (`groups_id`), + KEY `is_requester` (`is_requester`), + KEY `is_assign` (`is_assign`), + KEY `is_notify` (`is_notify`), + KEY `is_itemgroup` (`is_itemgroup`), + KEY `is_usergroup` (`is_usergroup`), + KEY `is_manager` (`is_manager`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_groups_knowbaseitems` +-- + +CREATE TABLE IF NOT EXISTS `glpi_groups_knowbaseitems` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `knowbaseitems_id` int(11) NOT NULL DEFAULT '0', + `groups_id` int(11) NOT NULL DEFAULT '0', + `entities_id` int(11) NOT NULL DEFAULT '-1', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `knowbaseitems_id` (`knowbaseitems_id`), + KEY `groups_id` (`groups_id`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_groups_problems` +-- + +CREATE TABLE IF NOT EXISTS `glpi_groups_problems` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `problems_id` int(11) NOT NULL DEFAULT '0', + `groups_id` int(11) NOT NULL DEFAULT '0', + `type` int(11) NOT NULL DEFAULT '1', + PRIMARY KEY (`id`), + UNIQUE KEY `unicity` (`problems_id`,`type`,`groups_id`), + KEY `group` (`groups_id`,`type`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_groups_reminders` +-- + +CREATE TABLE IF NOT EXISTS `glpi_groups_reminders` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `reminders_id` int(11) NOT NULL DEFAULT '0', + `groups_id` int(11) NOT NULL DEFAULT '0', + `entities_id` int(11) NOT NULL DEFAULT '-1', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `reminders_id` (`reminders_id`), + KEY `groups_id` (`groups_id`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_groups_rssfeeds` +-- + +CREATE TABLE IF NOT EXISTS `glpi_groups_rssfeeds` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `rssfeeds_id` int(11) NOT NULL DEFAULT '0', + `groups_id` int(11) NOT NULL DEFAULT '0', + `entities_id` int(11) NOT NULL DEFAULT '-1', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `rssfeeds_id` (`rssfeeds_id`), + KEY `groups_id` (`groups_id`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_groups_tickets` +-- + +CREATE TABLE IF NOT EXISTS `glpi_groups_tickets` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `tickets_id` int(11) NOT NULL DEFAULT '0', + `groups_id` int(11) NOT NULL DEFAULT '0', + `type` int(11) NOT NULL DEFAULT '1', + PRIMARY KEY (`id`), + UNIQUE KEY `unicity` (`tickets_id`,`type`,`groups_id`), + KEY `group` (`groups_id`,`type`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_groups_users` +-- + +CREATE TABLE IF NOT EXISTS `glpi_groups_users` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `users_id` int(11) NOT NULL DEFAULT '0', + `groups_id` int(11) NOT NULL DEFAULT '0', + `is_dynamic` tinyint(1) NOT NULL DEFAULT '0', + `is_manager` tinyint(1) NOT NULL DEFAULT '0', + `is_userdelegate` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `unicity` (`users_id`,`groups_id`), + KEY `groups_id` (`groups_id`), + KEY `is_manager` (`is_manager`), + KEY `is_userdelegate` (`is_userdelegate`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_holidays` +-- + +CREATE TABLE IF NOT EXISTS `glpi_holidays` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `comment` text COLLATE utf8_unicode_ci, + `begin_date` date DEFAULT NULL, + `end_date` date DEFAULT NULL, + `is_perpetual` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `name` (`name`), + KEY `begin_date` (`begin_date`), + KEY `end_date` (`end_date`), + KEY `is_perpetual` (`is_perpetual`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_infocoms` +-- + +CREATE TABLE IF NOT EXISTS `glpi_infocoms` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `items_id` int(11) NOT NULL DEFAULT '0', + `itemtype` varchar(100) COLLATE utf8_unicode_ci NOT NULL, + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `buy_date` date DEFAULT NULL, + `use_date` date DEFAULT NULL, + `warranty_duration` int(11) NOT NULL DEFAULT '0', + `warranty_info` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `suppliers_id` int(11) NOT NULL DEFAULT '0', + `order_number` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `delivery_number` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `immo_number` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `value` decimal(20,4) NOT NULL DEFAULT '0.0000', + `warranty_value` decimal(20,4) NOT NULL DEFAULT '0.0000', + `sink_time` int(11) NOT NULL DEFAULT '0', + `sink_type` int(11) NOT NULL DEFAULT '0', + `sink_coeff` float NOT NULL DEFAULT '0', + `comment` text COLLATE utf8_unicode_ci, + `bill` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `budgets_id` int(11) NOT NULL DEFAULT '0', + `alert` int(11) NOT NULL DEFAULT '0', + `order_date` date DEFAULT NULL, + `delivery_date` date DEFAULT NULL, + `inventory_date` date DEFAULT NULL, + `warranty_date` date DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `unicity` (`itemtype`,`items_id`), + KEY `buy_date` (`buy_date`), + KEY `alert` (`alert`), + KEY `budgets_id` (`budgets_id`), + KEY `suppliers_id` (`suppliers_id`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_interfacetypes` +-- + +CREATE TABLE IF NOT EXISTS `glpi_interfacetypes` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `name` (`name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=9 ; + +-- +-- Contenu de la table `glpi_interfacetypes` +-- + +INSERT INTO `glpi_interfacetypes` (`id`, `name`, `comment`) VALUES +(1, 'IDE', NULL), +(2, 'SATA', NULL), +(3, 'SCSI', NULL), +(4, 'USB', NULL), +(5, 'AGP', ''), +(6, 'PCI', ''), +(7, 'PCIe', ''), +(8, 'PCI-X', ''); + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_ipaddresses` +-- + +CREATE TABLE IF NOT EXISTS `glpi_ipaddresses` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `entities_id` int(11) NOT NULL DEFAULT '0', + `items_id` int(11) NOT NULL DEFAULT '0', + `itemtype` varchar(100) COLLATE utf8_unicode_ci NOT NULL, + `version` tinyint(3) unsigned DEFAULT '0', + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `binary_0` int(10) unsigned NOT NULL DEFAULT '0', + `binary_1` int(10) unsigned NOT NULL DEFAULT '0', + `binary_2` int(10) unsigned NOT NULL DEFAULT '0', + `binary_3` int(10) unsigned NOT NULL DEFAULT '0', + `is_deleted` tinyint(1) NOT NULL DEFAULT '0', + `is_dynamic` tinyint(1) NOT NULL DEFAULT '0', + `mainitems_id` int(11) NOT NULL DEFAULT '0', + `mainitemtype` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `entities_id` (`entities_id`), + KEY `textual` (`name`), + KEY `binary` (`binary_0`,`binary_1`,`binary_2`,`binary_3`), + KEY `is_deleted` (`is_deleted`), + KEY `is_dynamic` (`is_dynamic`), + KEY `item` (`itemtype`,`items_id`,`is_deleted`), + KEY `mainitem` (`mainitemtype`,`mainitems_id`,`is_deleted`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_ipaddresses_ipnetworks` +-- + +CREATE TABLE IF NOT EXISTS `glpi_ipaddresses_ipnetworks` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `ipaddresses_id` int(11) NOT NULL DEFAULT '0', + `ipnetworks_id` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `unicity` (`ipaddresses_id`,`ipnetworks_id`), + KEY `ipnetworks_id` (`ipnetworks_id`), + KEY `ipaddresses_id` (`ipaddresses_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_ipnetworks` +-- + +CREATE TABLE IF NOT EXISTS `glpi_ipnetworks` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `ipnetworks_id` int(11) NOT NULL DEFAULT '0', + `completename` text COLLATE utf8_unicode_ci, + `level` int(11) NOT NULL DEFAULT '0', + `ancestors_cache` longtext COLLATE utf8_unicode_ci, + `sons_cache` longtext COLLATE utf8_unicode_ci, + `addressable` tinyint(1) NOT NULL DEFAULT '0', + `version` tinyint(3) unsigned DEFAULT '0', + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `address` varchar(40) COLLATE utf8_unicode_ci DEFAULT NULL, + `address_0` int(10) unsigned NOT NULL DEFAULT '0', + `address_1` int(10) unsigned NOT NULL DEFAULT '0', + `address_2` int(10) unsigned NOT NULL DEFAULT '0', + `address_3` int(10) unsigned NOT NULL DEFAULT '0', + `netmask` varchar(40) COLLATE utf8_unicode_ci DEFAULT NULL, + `netmask_0` int(10) unsigned NOT NULL DEFAULT '0', + `netmask_1` int(10) unsigned NOT NULL DEFAULT '0', + `netmask_2` int(10) unsigned NOT NULL DEFAULT '0', + `netmask_3` int(10) unsigned NOT NULL DEFAULT '0', + `gateway` varchar(40) COLLATE utf8_unicode_ci DEFAULT NULL, + `gateway_0` int(10) unsigned NOT NULL DEFAULT '0', + `gateway_1` int(10) unsigned NOT NULL DEFAULT '0', + `gateway_2` int(10) unsigned NOT NULL DEFAULT '0', + `gateway_3` int(10) unsigned NOT NULL DEFAULT '0', + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `network_definition` (`entities_id`,`address`,`netmask`), + KEY `address` (`address_0`,`address_1`,`address_2`,`address_3`), + KEY `netmask` (`netmask_0`,`netmask_1`,`netmask_2`,`netmask_3`), + KEY `gateway` (`gateway_0`,`gateway_1`,`gateway_2`,`gateway_3`), + KEY `name` (`name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_ipnetworks_vlans` +-- + +CREATE TABLE IF NOT EXISTS `glpi_ipnetworks_vlans` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `ipnetworks_id` int(11) NOT NULL DEFAULT '0', + `vlans_id` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `link` (`ipnetworks_id`,`vlans_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_items_devicecases` +-- + +CREATE TABLE IF NOT EXISTS `glpi_items_devicecases` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `items_id` int(11) NOT NULL DEFAULT '0', + `itemtype` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `devicecases_id` int(11) NOT NULL DEFAULT '0', + `is_deleted` tinyint(1) NOT NULL DEFAULT '0', + `is_dynamic` tinyint(1) NOT NULL DEFAULT '0', + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `serial` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `computers_id` (`items_id`), + KEY `devicecases_id` (`devicecases_id`), + KEY `is_deleted` (`is_deleted`), + KEY `is_dynamic` (`is_dynamic`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`), + KEY `serial` (`serial`), + KEY `item` (`itemtype`,`items_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_items_devicecontrols` +-- + +CREATE TABLE IF NOT EXISTS `glpi_items_devicecontrols` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `items_id` int(11) NOT NULL DEFAULT '0', + `itemtype` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `devicecontrols_id` int(11) NOT NULL DEFAULT '0', + `is_deleted` tinyint(1) NOT NULL DEFAULT '0', + `is_dynamic` tinyint(1) NOT NULL DEFAULT '0', + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `serial` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `busID` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `computers_id` (`items_id`), + KEY `devicecontrols_id` (`devicecontrols_id`), + KEY `is_deleted` (`is_deleted`), + KEY `is_dynamic` (`is_dynamic`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`), + KEY `serial` (`serial`), + KEY `busID` (`busID`), + KEY `item` (`itemtype`,`items_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_items_devicedrives` +-- + +CREATE TABLE IF NOT EXISTS `glpi_items_devicedrives` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `items_id` int(11) NOT NULL DEFAULT '0', + `itemtype` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `devicedrives_id` int(11) NOT NULL DEFAULT '0', + `is_deleted` tinyint(1) NOT NULL DEFAULT '0', + `is_dynamic` tinyint(1) NOT NULL DEFAULT '0', + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `serial` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `busID` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `computers_id` (`items_id`), + KEY `devicedrives_id` (`devicedrives_id`), + KEY `is_deleted` (`is_deleted`), + KEY `is_dynamic` (`is_dynamic`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`), + KEY `serial` (`serial`), + KEY `busID` (`busID`), + KEY `item` (`itemtype`,`items_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_items_devicegraphiccards` +-- + +CREATE TABLE IF NOT EXISTS `glpi_items_devicegraphiccards` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `items_id` int(11) NOT NULL DEFAULT '0', + `itemtype` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `devicegraphiccards_id` int(11) NOT NULL DEFAULT '0', + `memory` int(11) NOT NULL DEFAULT '0', + `is_deleted` tinyint(1) NOT NULL DEFAULT '0', + `is_dynamic` tinyint(1) NOT NULL DEFAULT '0', + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `serial` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `busID` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `computers_id` (`items_id`), + KEY `devicegraphiccards_id` (`devicegraphiccards_id`), + KEY `specificity` (`memory`), + KEY `is_deleted` (`is_deleted`), + KEY `is_dynamic` (`is_dynamic`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`), + KEY `serial` (`serial`), + KEY `busID` (`busID`), + KEY `item` (`itemtype`,`items_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_items_deviceharddrives` +-- + +CREATE TABLE IF NOT EXISTS `glpi_items_deviceharddrives` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `items_id` int(11) NOT NULL DEFAULT '0', + `itemtype` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `deviceharddrives_id` int(11) NOT NULL DEFAULT '0', + `capacity` int(11) NOT NULL DEFAULT '0', + `serial` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `is_deleted` tinyint(1) NOT NULL DEFAULT '0', + `is_dynamic` tinyint(1) NOT NULL DEFAULT '0', + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `busID` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `computers_id` (`items_id`), + KEY `deviceharddrives_id` (`deviceharddrives_id`), + KEY `specificity` (`capacity`), + KEY `is_deleted` (`is_deleted`), + KEY `is_dynamic` (`is_dynamic`), + KEY `serial` (`serial`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`), + KEY `busID` (`busID`), + KEY `item` (`itemtype`,`items_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_items_devicememories` +-- + +CREATE TABLE IF NOT EXISTS `glpi_items_devicememories` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `items_id` int(11) NOT NULL DEFAULT '0', + `itemtype` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `devicememories_id` int(11) NOT NULL DEFAULT '0', + `size` int(11) NOT NULL DEFAULT '0', + `serial` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `is_deleted` tinyint(1) NOT NULL DEFAULT '0', + `is_dynamic` tinyint(1) NOT NULL DEFAULT '0', + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `busID` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `computers_id` (`items_id`), + KEY `devicememories_id` (`devicememories_id`), + KEY `specificity` (`size`), + KEY `is_deleted` (`is_deleted`), + KEY `is_dynamic` (`is_dynamic`), + KEY `serial` (`serial`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`), + KEY `busID` (`busID`), + KEY `item` (`itemtype`,`items_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_items_devicemotherboards` +-- + +CREATE TABLE IF NOT EXISTS `glpi_items_devicemotherboards` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `items_id` int(11) NOT NULL DEFAULT '0', + `itemtype` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `devicemotherboards_id` int(11) NOT NULL DEFAULT '0', + `is_deleted` tinyint(1) NOT NULL DEFAULT '0', + `is_dynamic` tinyint(1) NOT NULL DEFAULT '0', + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `serial` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `computers_id` (`items_id`), + KEY `devicemotherboards_id` (`devicemotherboards_id`), + KEY `is_deleted` (`is_deleted`), + KEY `is_dynamic` (`is_dynamic`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`), + KEY `serial` (`serial`), + KEY `item` (`itemtype`,`items_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_items_devicenetworkcards` +-- + +CREATE TABLE IF NOT EXISTS `glpi_items_devicenetworkcards` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `items_id` int(11) NOT NULL DEFAULT '0', + `itemtype` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `devicenetworkcards_id` int(11) NOT NULL DEFAULT '0', + `mac` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `is_deleted` tinyint(1) NOT NULL DEFAULT '0', + `is_dynamic` tinyint(1) NOT NULL DEFAULT '0', + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `serial` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `busID` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `computers_id` (`items_id`), + KEY `devicenetworkcards_id` (`devicenetworkcards_id`), + KEY `specificity` (`mac`), + KEY `is_deleted` (`is_deleted`), + KEY `is_dynamic` (`is_dynamic`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`), + KEY `serial` (`serial`), + KEY `busID` (`busID`), + KEY `item` (`itemtype`,`items_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_items_devicepcis` +-- + +CREATE TABLE IF NOT EXISTS `glpi_items_devicepcis` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `items_id` int(11) NOT NULL DEFAULT '0', + `itemtype` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `devicepcis_id` int(11) NOT NULL DEFAULT '0', + `is_deleted` tinyint(1) NOT NULL DEFAULT '0', + `is_dynamic` tinyint(1) NOT NULL DEFAULT '0', + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `serial` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `busID` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `computers_id` (`items_id`), + KEY `devicepcis_id` (`devicepcis_id`), + KEY `is_deleted` (`is_deleted`), + KEY `is_dynamic` (`is_dynamic`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`), + KEY `serial` (`serial`), + KEY `busID` (`busID`), + KEY `item` (`itemtype`,`items_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_items_devicepowersupplies` +-- + +CREATE TABLE IF NOT EXISTS `glpi_items_devicepowersupplies` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `items_id` int(11) NOT NULL DEFAULT '0', + `itemtype` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `devicepowersupplies_id` int(11) NOT NULL DEFAULT '0', + `is_deleted` tinyint(1) NOT NULL DEFAULT '0', + `is_dynamic` tinyint(1) NOT NULL DEFAULT '0', + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `serial` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `computers_id` (`items_id`), + KEY `devicepowersupplies_id` (`devicepowersupplies_id`), + KEY `is_deleted` (`is_deleted`), + KEY `is_dynamic` (`is_dynamic`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`), + KEY `serial` (`serial`), + KEY `item` (`itemtype`,`items_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_items_deviceprocessors` +-- + +CREATE TABLE IF NOT EXISTS `glpi_items_deviceprocessors` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `items_id` int(11) NOT NULL DEFAULT '0', + `itemtype` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `deviceprocessors_id` int(11) NOT NULL DEFAULT '0', + `frequency` int(11) NOT NULL DEFAULT '0', + `serial` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `is_deleted` tinyint(1) NOT NULL DEFAULT '0', + `is_dynamic` tinyint(1) NOT NULL DEFAULT '0', + `nbcores` int(11) DEFAULT NULL, + `nbthreads` int(11) DEFAULT NULL, + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `busID` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `computers_id` (`items_id`), + KEY `deviceprocessors_id` (`deviceprocessors_id`), + KEY `specificity` (`frequency`), + KEY `is_deleted` (`is_deleted`), + KEY `is_dynamic` (`is_dynamic`), + KEY `serial` (`serial`), + KEY `nbcores` (`nbcores`), + KEY `nbthreads` (`nbthreads`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`), + KEY `busID` (`busID`), + KEY `item` (`itemtype`,`items_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_items_devicesoundcards` +-- + +CREATE TABLE IF NOT EXISTS `glpi_items_devicesoundcards` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `items_id` int(11) NOT NULL DEFAULT '0', + `itemtype` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `devicesoundcards_id` int(11) NOT NULL DEFAULT '0', + `is_deleted` tinyint(1) NOT NULL DEFAULT '0', + `is_dynamic` tinyint(1) NOT NULL DEFAULT '0', + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `serial` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `busID` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `computers_id` (`items_id`), + KEY `devicesoundcards_id` (`devicesoundcards_id`), + KEY `is_deleted` (`is_deleted`), + KEY `is_dynamic` (`is_dynamic`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`), + KEY `serial` (`serial`), + KEY `busID` (`busID`), + KEY `item` (`itemtype`,`items_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_items_problems` +-- + +CREATE TABLE IF NOT EXISTS `glpi_items_problems` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `problems_id` int(11) NOT NULL DEFAULT '0', + `itemtype` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL, + `items_id` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `unicity` (`problems_id`,`itemtype`,`items_id`), + KEY `item` (`itemtype`,`items_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_items_projects` +-- + +CREATE TABLE IF NOT EXISTS `glpi_items_projects` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `projects_id` int(11) NOT NULL DEFAULT '0', + `itemtype` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL, + `items_id` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `unicity` (`projects_id`,`itemtype`,`items_id`), + KEY `item` (`itemtype`,`items_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_items_tickets` +-- + +CREATE TABLE IF NOT EXISTS `glpi_items_tickets` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `itemtype` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `items_id` int(11) NOT NULL DEFAULT '0', + `tickets_id` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `unicity` (`itemtype`,`items_id`,`tickets_id`), + KEY `tickets_id` (`tickets_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_itilcategories` +-- + +CREATE TABLE IF NOT EXISTS `glpi_itilcategories` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `itilcategories_id` int(11) NOT NULL DEFAULT '0', + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `completename` text COLLATE utf8_unicode_ci, + `comment` text COLLATE utf8_unicode_ci, + `level` int(11) NOT NULL DEFAULT '0', + `knowbaseitemcategories_id` int(11) NOT NULL DEFAULT '0', + `users_id` int(11) NOT NULL DEFAULT '0', + `groups_id` int(11) NOT NULL DEFAULT '0', + `ancestors_cache` longtext COLLATE utf8_unicode_ci, + `sons_cache` longtext COLLATE utf8_unicode_ci, + `is_helpdeskvisible` tinyint(1) NOT NULL DEFAULT '1', + `tickettemplates_id_incident` int(11) NOT NULL DEFAULT '0', + `tickettemplates_id_demand` int(11) NOT NULL DEFAULT '0', + `is_incident` int(11) NOT NULL DEFAULT '1', + `is_request` int(11) NOT NULL DEFAULT '1', + `is_problem` int(11) NOT NULL DEFAULT '1', + `is_change` tinyint(1) NOT NULL DEFAULT '1', + PRIMARY KEY (`id`), + KEY `name` (`name`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`), + KEY `knowbaseitemcategories_id` (`knowbaseitemcategories_id`), + KEY `users_id` (`users_id`), + KEY `groups_id` (`groups_id`), + KEY `is_helpdeskvisible` (`is_helpdeskvisible`), + KEY `itilcategories_id` (`itilcategories_id`), + KEY `tickettemplates_id_incident` (`tickettemplates_id_incident`), + KEY `tickettemplates_id_demand` (`tickettemplates_id_demand`), + KEY `is_incident` (`is_incident`), + KEY `is_request` (`is_request`), + KEY `is_problem` (`is_problem`), + KEY `is_change` (`is_change`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_knowbaseitemcategories` +-- + +CREATE TABLE IF NOT EXISTS `glpi_knowbaseitemcategories` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `knowbaseitemcategories_id` int(11) NOT NULL DEFAULT '0', + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `completename` text COLLATE utf8_unicode_ci, + `comment` text COLLATE utf8_unicode_ci, + `level` int(11) NOT NULL DEFAULT '0', + `sons_cache` longtext COLLATE utf8_unicode_ci, + `ancestors_cache` longtext COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + UNIQUE KEY `unicity` (`entities_id`,`knowbaseitemcategories_id`,`name`), + KEY `name` (`name`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_knowbaseitems` +-- + +CREATE TABLE IF NOT EXISTS `glpi_knowbaseitems` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `knowbaseitemcategories_id` int(11) NOT NULL DEFAULT '0', + `name` text COLLATE utf8_unicode_ci, + `answer` longtext COLLATE utf8_unicode_ci, + `is_faq` tinyint(1) NOT NULL DEFAULT '0', + `users_id` int(11) NOT NULL DEFAULT '0', + `view` int(11) NOT NULL DEFAULT '0', + `date` datetime DEFAULT NULL, + `date_mod` datetime DEFAULT NULL, + `begin_date` datetime DEFAULT NULL, + `end_date` datetime DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `users_id` (`users_id`), + KEY `knowbaseitemcategories_id` (`knowbaseitemcategories_id`), + KEY `is_faq` (`is_faq`), + KEY `date_mod` (`date_mod`), + FULLTEXT KEY `fulltext` (`name`,`answer`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_knowbaseitems_profiles` +-- + +CREATE TABLE IF NOT EXISTS `glpi_knowbaseitems_profiles` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `knowbaseitems_id` int(11) NOT NULL DEFAULT '0', + `profiles_id` int(11) NOT NULL DEFAULT '0', + `entities_id` int(11) NOT NULL DEFAULT '-1', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `knowbaseitems_id` (`knowbaseitems_id`), + KEY `profiles_id` (`profiles_id`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_knowbaseitems_users` +-- + +CREATE TABLE IF NOT EXISTS `glpi_knowbaseitems_users` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `knowbaseitems_id` int(11) NOT NULL DEFAULT '0', + `users_id` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `knowbaseitems_id` (`knowbaseitems_id`), + KEY `users_id` (`users_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_knowbaseitemtranslations` +-- + +CREATE TABLE IF NOT EXISTS `glpi_knowbaseitemtranslations` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `knowbaseitems_id` int(11) NOT NULL DEFAULT '0', + `language` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, + `name` text COLLATE utf8_unicode_ci, + `answer` longtext COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `item` (`knowbaseitems_id`,`language`), + FULLTEXT KEY `fulltext` (`name`,`answer`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_links` +-- + +CREATE TABLE IF NOT EXISTS `glpi_links` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '1', + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `link` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `data` text COLLATE utf8_unicode_ci, + `open_window` tinyint(1) NOT NULL DEFAULT '1', + PRIMARY KEY (`id`), + KEY `entities_id` (`entities_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_links_itemtypes` +-- + +CREATE TABLE IF NOT EXISTS `glpi_links_itemtypes` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `links_id` int(11) NOT NULL DEFAULT '0', + `itemtype` varchar(100) COLLATE utf8_unicode_ci NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `unicity` (`itemtype`,`links_id`), + KEY `links_id` (`links_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_locations` +-- + +CREATE TABLE IF NOT EXISTS `glpi_locations` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `locations_id` int(11) NOT NULL DEFAULT '0', + `completename` text COLLATE utf8_unicode_ci, + `comment` text COLLATE utf8_unicode_ci, + `level` int(11) NOT NULL DEFAULT '0', + `ancestors_cache` longtext COLLATE utf8_unicode_ci, + `sons_cache` longtext COLLATE utf8_unicode_ci, + `building` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `room` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `latitude` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `longitude` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `altitude` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `unicity` (`entities_id`,`locations_id`,`name`), + KEY `locations_id` (`locations_id`), + KEY `name` (`name`), + KEY `is_recursive` (`is_recursive`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_logs` +-- + +CREATE TABLE IF NOT EXISTS `glpi_logs` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `itemtype` varchar(100) COLLATE utf8_unicode_ci NOT NULL DEFAULT '', + `items_id` int(11) NOT NULL DEFAULT '0', + `itemtype_link` varchar(100) COLLATE utf8_unicode_ci NOT NULL DEFAULT '', + `linked_action` int(11) NOT NULL DEFAULT '0' COMMENT 'see define.php HISTORY_* constant', + `user_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `date_mod` datetime DEFAULT NULL, + `id_search_option` int(11) NOT NULL DEFAULT '0' COMMENT 'see search.constant.php for value', + `old_value` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `new_value` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `date_mod` (`date_mod`), + KEY `itemtype_link` (`itemtype_link`), + KEY `item` (`itemtype`,`items_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=18 ; + +-- +-- Structure de la table `glpi_mailcollectors` +-- + +CREATE TABLE IF NOT EXISTS `glpi_mailcollectors` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `host` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `login` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `filesize_max` int(11) NOT NULL DEFAULT '2097152', + `is_active` tinyint(1) NOT NULL DEFAULT '1', + `date_mod` datetime DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + `passwd` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `accepted` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `refused` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `use_kerberos` tinyint(1) NOT NULL DEFAULT '0', + `errors` int(11) NOT NULL DEFAULT '0', + `use_mail_date` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `is_active` (`is_active`), + KEY `date_mod` (`date_mod`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_manufacturers` +-- + +CREATE TABLE IF NOT EXISTS `glpi_manufacturers` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `name` (`name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_monitormodels` +-- + +CREATE TABLE IF NOT EXISTS `glpi_monitormodels` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `name` (`name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_monitors` +-- + +CREATE TABLE IF NOT EXISTS `glpi_monitors` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `entities_id` int(11) NOT NULL DEFAULT '0', + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `date_mod` datetime DEFAULT NULL, + `contact` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `contact_num` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `users_id_tech` int(11) NOT NULL DEFAULT '0', + `groups_id_tech` int(11) NOT NULL DEFAULT '0', + `comment` text COLLATE utf8_unicode_ci, + `serial` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `otherserial` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `size` int(11) NOT NULL DEFAULT '0', + `have_micro` tinyint(1) NOT NULL DEFAULT '0', + `have_speaker` tinyint(1) NOT NULL DEFAULT '0', + `have_subd` tinyint(1) NOT NULL DEFAULT '0', + `have_bnc` tinyint(1) NOT NULL DEFAULT '0', + `have_dvi` tinyint(1) NOT NULL DEFAULT '0', + `have_pivot` tinyint(1) NOT NULL DEFAULT '0', + `have_hdmi` tinyint(1) NOT NULL DEFAULT '0', + `have_displayport` tinyint(1) NOT NULL DEFAULT '0', + `locations_id` int(11) NOT NULL DEFAULT '0', + `monitortypes_id` int(11) NOT NULL DEFAULT '0', + `monitormodels_id` int(11) NOT NULL DEFAULT '0', + `manufacturers_id` int(11) NOT NULL DEFAULT '0', + `is_global` tinyint(1) NOT NULL DEFAULT '0', + `is_deleted` tinyint(1) NOT NULL DEFAULT '0', + `is_template` tinyint(1) NOT NULL DEFAULT '0', + `template_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `users_id` int(11) NOT NULL DEFAULT '0', + `groups_id` int(11) NOT NULL DEFAULT '0', + `states_id` int(11) NOT NULL DEFAULT '0', + `ticket_tco` decimal(20,4) DEFAULT '0.0000', + `is_dynamic` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `name` (`name`), + KEY `is_template` (`is_template`), + KEY `is_global` (`is_global`), + KEY `entities_id` (`entities_id`), + KEY `manufacturers_id` (`manufacturers_id`), + KEY `groups_id` (`groups_id`), + KEY `users_id` (`users_id`), + KEY `locations_id` (`locations_id`), + KEY `monitormodels_id` (`monitormodels_id`), + KEY `states_id` (`states_id`), + KEY `users_id_tech` (`users_id_tech`), + KEY `monitortypes_id` (`monitortypes_id`), + KEY `is_deleted` (`is_deleted`), + KEY `groups_id_tech` (`groups_id_tech`), + KEY `is_dynamic` (`is_dynamic`), + KEY `serial` (`serial`), + KEY `otherserial` (`otherserial`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_monitortypes` +-- + +CREATE TABLE IF NOT EXISTS `glpi_monitortypes` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `name` (`name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_netpoints` +-- + +CREATE TABLE IF NOT EXISTS `glpi_netpoints` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `entities_id` int(11) NOT NULL DEFAULT '0', + `locations_id` int(11) NOT NULL DEFAULT '0', + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `name` (`name`), + KEY `complete` (`entities_id`,`locations_id`,`name`), + KEY `location_name` (`locations_id`,`name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_networkaliases` +-- + +CREATE TABLE IF NOT EXISTS `glpi_networkaliases` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `entities_id` int(11) NOT NULL DEFAULT '0', + `networknames_id` int(11) NOT NULL DEFAULT '0', + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `fqdns_id` int(11) NOT NULL DEFAULT '0', + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `entities_id` (`entities_id`), + KEY `name` (`name`), + KEY `networknames_id` (`networknames_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_networkequipmentfirmwares` +-- + +CREATE TABLE IF NOT EXISTS `glpi_networkequipmentfirmwares` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `name` (`name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_networkequipmentmodels` +-- + +CREATE TABLE IF NOT EXISTS `glpi_networkequipmentmodels` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `name` (`name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_networkequipments` +-- + +CREATE TABLE IF NOT EXISTS `glpi_networkequipments` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `ram` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `serial` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `otherserial` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `contact` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `contact_num` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `users_id_tech` int(11) NOT NULL DEFAULT '0', + `groups_id_tech` int(11) NOT NULL DEFAULT '0', + `date_mod` datetime DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + `locations_id` int(11) NOT NULL DEFAULT '0', + `domains_id` int(11) NOT NULL DEFAULT '0', + `networks_id` int(11) NOT NULL DEFAULT '0', + `networkequipmenttypes_id` int(11) NOT NULL DEFAULT '0', + `networkequipmentmodels_id` int(11) NOT NULL DEFAULT '0', + `networkequipmentfirmwares_id` int(11) NOT NULL DEFAULT '0', + `manufacturers_id` int(11) NOT NULL DEFAULT '0', + `is_deleted` tinyint(1) NOT NULL DEFAULT '0', + `is_template` tinyint(1) NOT NULL DEFAULT '0', + `template_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `users_id` int(11) NOT NULL DEFAULT '0', + `groups_id` int(11) NOT NULL DEFAULT '0', + `states_id` int(11) NOT NULL DEFAULT '0', + `ticket_tco` decimal(20,4) DEFAULT '0.0000', + `is_dynamic` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `name` (`name`), + KEY `is_template` (`is_template`), + KEY `domains_id` (`domains_id`), + KEY `networkequipmentfirmwares_id` (`networkequipmentfirmwares_id`), + KEY `entities_id` (`entities_id`), + KEY `manufacturers_id` (`manufacturers_id`), + KEY `groups_id` (`groups_id`), + KEY `users_id` (`users_id`), + KEY `locations_id` (`locations_id`), + KEY `networkequipmentmodels_id` (`networkequipmentmodels_id`), + KEY `networks_id` (`networks_id`), + KEY `states_id` (`states_id`), + KEY `users_id_tech` (`users_id_tech`), + KEY `networkequipmenttypes_id` (`networkequipmenttypes_id`), + KEY `is_deleted` (`is_deleted`), + KEY `date_mod` (`date_mod`), + KEY `groups_id_tech` (`groups_id_tech`), + KEY `is_dynamic` (`is_dynamic`), + KEY `serial` (`serial`), + KEY `otherserial` (`otherserial`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_networkequipmenttypes` +-- + +CREATE TABLE IF NOT EXISTS `glpi_networkequipmenttypes` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `name` (`name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_networkinterfaces` +-- + +CREATE TABLE IF NOT EXISTS `glpi_networkinterfaces` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `name` (`name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_networknames` +-- + +CREATE TABLE IF NOT EXISTS `glpi_networknames` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `entities_id` int(11) NOT NULL DEFAULT '0', + `items_id` int(11) NOT NULL DEFAULT '0', + `itemtype` varchar(100) COLLATE utf8_unicode_ci NOT NULL, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + `fqdns_id` int(11) NOT NULL DEFAULT '0', + `is_deleted` tinyint(1) NOT NULL DEFAULT '0', + `is_dynamic` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `entities_id` (`entities_id`), + KEY `FQDN` (`name`,`fqdns_id`), + KEY `name` (`name`), + KEY `fqdns_id` (`fqdns_id`), + KEY `is_deleted` (`is_deleted`), + KEY `is_dynamic` (`is_dynamic`), + KEY `item` (`itemtype`,`items_id`,`is_deleted`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_networkportaggregates` +-- + +CREATE TABLE IF NOT EXISTS `glpi_networkportaggregates` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `networkports_id` int(11) NOT NULL DEFAULT '0', + `networkports_id_list` text COLLATE utf8_unicode_ci COMMENT 'array of associated networkports_id', + PRIMARY KEY (`id`), + UNIQUE KEY `networkports_id` (`networkports_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_networkportaliases` +-- + +CREATE TABLE IF NOT EXISTS `glpi_networkportaliases` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `networkports_id` int(11) NOT NULL DEFAULT '0', + `networkports_id_alias` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `networkports_id` (`networkports_id`), + KEY `networkports_id_alias` (`networkports_id_alias`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_networkportdialups` +-- + +CREATE TABLE IF NOT EXISTS `glpi_networkportdialups` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `networkports_id` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `networkports_id` (`networkports_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_networkportethernets` +-- + +CREATE TABLE IF NOT EXISTS `glpi_networkportethernets` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `networkports_id` int(11) NOT NULL DEFAULT '0', + `items_devicenetworkcards_id` int(11) NOT NULL DEFAULT '0', + `netpoints_id` int(11) NOT NULL DEFAULT '0', + `type` varchar(10) COLLATE utf8_unicode_ci DEFAULT '' COMMENT 'T, LX, SX', + `speed` int(11) NOT NULL DEFAULT '10' COMMENT 'Mbit/s: 10, 100, 1000, 10000', + PRIMARY KEY (`id`), + UNIQUE KEY `networkports_id` (`networkports_id`), + KEY `card` (`items_devicenetworkcards_id`), + KEY `netpoint` (`netpoints_id`), + KEY `type` (`type`), + KEY `speed` (`speed`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_networkportlocals` +-- + +CREATE TABLE IF NOT EXISTS `glpi_networkportlocals` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `networkports_id` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `networkports_id` (`networkports_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_networkports` +-- + +CREATE TABLE IF NOT EXISTS `glpi_networkports` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `items_id` int(11) NOT NULL DEFAULT '0', + `itemtype` varchar(100) COLLATE utf8_unicode_ci NOT NULL, + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `logical_number` int(11) NOT NULL DEFAULT '0', + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `instantiation_type` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `mac` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + `is_deleted` tinyint(1) NOT NULL DEFAULT '0', + `is_dynamic` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `on_device` (`items_id`,`itemtype`), + KEY `item` (`itemtype`,`items_id`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`), + KEY `mac` (`mac`), + KEY `is_deleted` (`is_deleted`), + KEY `is_dynamic` (`is_dynamic`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_networkports_networkports` +-- + +CREATE TABLE IF NOT EXISTS `glpi_networkports_networkports` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `networkports_id_1` int(11) NOT NULL DEFAULT '0', + `networkports_id_2` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `unicity` (`networkports_id_1`,`networkports_id_2`), + KEY `networkports_id_2` (`networkports_id_2`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_networkports_vlans` +-- + +CREATE TABLE IF NOT EXISTS `glpi_networkports_vlans` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `networkports_id` int(11) NOT NULL DEFAULT '0', + `vlans_id` int(11) NOT NULL DEFAULT '0', + `tagged` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `unicity` (`networkports_id`,`vlans_id`), + KEY `vlans_id` (`vlans_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_networkportwifis` +-- + +CREATE TABLE IF NOT EXISTS `glpi_networkportwifis` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `networkports_id` int(11) NOT NULL DEFAULT '0', + `items_devicenetworkcards_id` int(11) NOT NULL DEFAULT '0', + `wifinetworks_id` int(11) NOT NULL DEFAULT '0', + `networkportwifis_id` int(11) NOT NULL DEFAULT '0' COMMENT 'only usefull in case of Managed node', + `version` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT 'a, a/b, a/b/g, a/b/g/n, a/b/g/n/y', + `mode` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT 'ad-hoc, managed, master, repeater, secondary, monitor, auto', + PRIMARY KEY (`id`), + UNIQUE KEY `networkports_id` (`networkports_id`), + KEY `card` (`items_devicenetworkcards_id`), + KEY `essid` (`wifinetworks_id`), + KEY `version` (`version`), + KEY `mode` (`mode`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_networks` +-- + +CREATE TABLE IF NOT EXISTS `glpi_networks` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `name` (`name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_notepads` +-- + +CREATE TABLE IF NOT EXISTS `glpi_notepads` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `itemtype` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL, + `items_id` int(11) NOT NULL DEFAULT '0', + `date` datetime DEFAULT NULL, + `date_mod` datetime DEFAULT NULL, + `users_id` int(11) NOT NULL DEFAULT '0', + `users_id_lastupdater` int(11) NOT NULL DEFAULT '0', + `content` longtext COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `item` (`itemtype`,`items_id`), + KEY `date_mod` (`date_mod`), + KEY `date` (`date`), + KEY `users_id_lastupdater` (`users_id_lastupdater`), + KEY `users_id` (`users_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_notifications` +-- + +CREATE TABLE IF NOT EXISTS `glpi_notifications` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `entities_id` int(11) NOT NULL DEFAULT '0', + `itemtype` varchar(100) COLLATE utf8_unicode_ci NOT NULL, + `event` varchar(255) COLLATE utf8_unicode_ci NOT NULL, + `mode` varchar(255) COLLATE utf8_unicode_ci NOT NULL, + `notificationtemplates_id` int(11) NOT NULL DEFAULT '0', + `comment` text COLLATE utf8_unicode_ci, + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `is_active` tinyint(1) NOT NULL DEFAULT '0', + `date_mod` datetime DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `name` (`name`), + KEY `itemtype` (`itemtype`), + KEY `entities_id` (`entities_id`), + KEY `is_active` (`is_active`), + KEY `date_mod` (`date_mod`), + KEY `is_recursive` (`is_recursive`), + KEY `notificationtemplates_id` (`notificationtemplates_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=59 ; + +-- +-- Contenu de la table `glpi_notifications` +-- + +INSERT INTO `glpi_notifications` (`id`, `name`, `entities_id`, `itemtype`, `event`, `mode`, `notificationtemplates_id`, `comment`, `is_recursive`, `is_active`, `date_mod`) VALUES +(1, 'Alert Tickets not closed', 0, 'Ticket', 'alertnotclosed', 'mail', 6, '', 1, 1, '2010-02-16 16:41:39'), +(2, 'New Ticket', 0, 'Ticket', 'new', 'mail', 4, '', 1, 1, '2010-02-16 16:41:39'), +(3, 'Update Ticket', 0, 'Ticket', 'update', 'mail', 4, '', 1, 1, '2010-02-16 16:41:39'), +(4, 'Close Ticket', 0, 'Ticket', 'closed', 'mail', 4, '', 1, 1, '2010-02-16 16:41:39'), +(5, 'Add Followup', 0, 'Ticket', 'add_followup', 'mail', 4, '', 1, 1, '2010-02-16 16:41:39'), +(6, 'Add Task', 0, 'Ticket', 'add_task', 'mail', 4, '', 1, 1, '2010-02-16 16:41:39'), +(7, 'Update Followup', 0, 'Ticket', 'update_followup', 'mail', 4, '', 1, 1, '2010-02-16 16:41:39'), +(8, 'Update Task', 0, 'Ticket', 'update_task', 'mail', 4, '', 1, 1, '2010-02-16 16:41:39'), +(9, 'Delete Followup', 0, 'Ticket', 'delete_followup', 'mail', 4, '', 1, 1, '2010-02-16 16:41:39'), +(10, 'Delete Task', 0, 'Ticket', 'delete_task', 'mail', 4, '', 1, 1, '2010-02-16 16:41:39'), +(11, 'Resolve ticket', 0, 'Ticket', 'solved', 'mail', 4, '', 1, 1, '2010-02-16 16:41:39'), +(12, 'Ticket Validation', 0, 'Ticket', 'validation', 'mail', 7, '', 1, 1, '2010-02-16 16:41:39'), +(13, 'New Reservation', 0, 'Reservation', 'new', 'mail', 2, '', 1, 1, '2010-02-16 16:41:39'), +(14, 'Update Reservation', 0, 'Reservation', 'update', 'mail', 2, '', 1, 1, '2010-02-16 16:41:39'), +(15, 'Delete Reservation', 0, 'Reservation', 'delete', 'mail', 2, '', 1, 1, '2010-02-16 16:41:39'), +(16, 'Alert Reservation', 0, 'Reservation', 'alert', 'mail', 3, '', 1, 1, '2010-02-16 16:41:39'), +(17, 'Contract Notice', 0, 'Contract', 'notice', 'mail', 12, '', 1, 1, '2010-02-16 16:41:39'), +(18, 'Contract End', 0, 'Contract', 'end', 'mail', 12, '', 1, 1, '2010-02-16 16:41:39'), +(19, 'MySQL Synchronization', 0, 'DBConnection', 'desynchronization', 'mail', 1, '', 1, 1, '2010-02-16 16:41:39'), +(20, 'Cartridges', 0, 'CartridgeItem', 'alert', 'mail', 8, '', 1, 1, '2010-02-16 16:41:39'), +(21, 'Consumables', 0, 'ConsumableItem', 'alert', 'mail', 9, '', 1, 1, '2010-02-16 16:41:39'), +(22, 'Infocoms', 0, 'Infocom', 'alert', 'mail', 10, '', 1, 1, '2010-02-16 16:41:39'), +(23, 'Software Licenses', 0, 'SoftwareLicense', 'alert', 'mail', 11, '', 1, 1, '2010-02-16 16:41:39'), +(24, 'Ticket Recall', 0, 'Ticket', 'recall', 'mail', 4, '', 1, 1, '2011-03-04 11:35:13'), +(25, 'Password Forget', 0, 'User', 'passwordforget', 'mail', 13, '', 1, 1, '2011-03-04 11:35:13'), +(26, 'Ticket Satisfaction', 0, 'Ticket', 'satisfaction', 'mail', 14, '', 1, 1, '2011-03-04 11:35:15'), +(27, 'Item not unique', 0, 'FieldUnicity', 'refuse', 'mail', 15, '', 1, 1, '2011-03-04 11:35:16'), +(28, 'Crontask Watcher', 0, 'Crontask', 'alert', 'mail', 16, '', 1, 1, '2011-03-04 11:35:16'), +(29, 'New Problem', 0, 'Problem', 'new', 'mail', 17, '', 1, 1, '2011-12-06 09:48:33'), +(30, 'Update Problem', 0, 'Problem', 'update', 'mail', 17, '', 1, 1, '2011-12-06 09:48:33'), +(31, 'Resolve Problem', 0, 'Problem', 'solved', 'mail', 17, '', 1, 1, '2011-12-06 09:48:33'), +(32, 'Add Task', 0, 'Problem', 'add_task', 'mail', 17, '', 1, 1, '2011-12-06 09:48:33'), +(33, 'Update Task', 0, 'Problem', 'update_task', 'mail', 17, '', 1, 1, '2011-12-06 09:48:33'), +(34, 'Delete Task', 0, 'Problem', 'delete_task', 'mail', 17, '', 1, 1, '2011-12-06 09:48:33'), +(35, 'Close Problem', 0, 'Problem', 'closed', 'mail', 17, '', 1, 1, '2011-12-06 09:48:33'), +(36, 'Delete Problem', 0, 'Problem', 'delete', 'mail', 17, '', 1, 1, '2011-12-06 09:48:33'), +(37, 'Ticket Validation Answer', 0, 'Ticket', 'validation_answer', 'mail', 7, '', 1, 1, '2014-01-15 14:35:24'), +(38, 'Contract End Periodicity', 0, 'Contract', 'periodicity', 'mail', 12, '', 1, 1, '2014-01-15 14:35:24'), +(39, 'Contract Notice Periodicity', 0, 'Contract', 'periodicitynotice', 'mail', 12, '', 1, 1, '2014-01-15 14:35:24'), +(40, 'Planning recall', 0, 'PlanningRecall', 'planningrecall', 'mail', 18, '', 1, 1, '2014-01-15 14:35:24'), +(41, 'Delete Ticket', 0, 'Ticket', 'delete', 'mail', 4, '', 1, 1, '2014-01-15 14:35:26'), +(42, 'New Change', 0, 'Change', 'new', 'mail', 19, '', 1, 1, '2014-06-18 08:02:07'), +(43, 'Update Change', 0, 'Change', 'update', 'mail', 19, '', 1, 1, '2014-06-18 08:02:07'), +(44, 'Resolve Change', 0, 'Change', 'solved', 'mail', 19, '', 1, 1, '2014-06-18 08:02:07'), +(45, 'Add Task', 0, 'Change', 'add_task', 'mail', 19, '', 1, 1, '2014-06-18 08:02:07'), +(46, 'Update Task', 0, 'Change', 'update_task', 'mail', 19, '', 1, 1, '2014-06-18 08:02:07'), +(47, 'Delete Task', 0, 'Change', 'delete_task', 'mail', 19, '', 1, 1, '2014-06-18 08:02:07'), +(48, 'Close Change', 0, 'Change', 'closed', 'mail', 19, '', 1, 1, '2014-06-18 08:02:07'), +(49, 'Delete Change', 0, 'Change', 'delete', 'mail', 19, '', 1, 1, '2014-06-18 08:02:07'), +(50, 'Ticket Satisfaction Answer', 0, 'Ticket', 'replysatisfaction', 'mail', 14, '', 1, 1, '2014-06-18 08:02:08'), +(51, 'Receiver errors', 0, 'MailCollector', 'error', 'mail', 20, '', 1, 1, '2014-06-18 08:02:08'), +(52, 'New Project', 0, 'Project', 'new', 'mail', 21, '', 1, 1, '2014-06-18 08:02:09'), +(53, 'Update Project', 0, 'Project', 'update', 'mail', 21, '', 1, 1, '2014-06-18 08:02:09'), +(54, 'Delete Project', 0, 'Project', 'delete', 'mail', 21, '', 1, 1, '2014-06-18 08:02:09'), +(55, 'New Project Task', 0, 'ProjectTask', 'new', 'mail', 22, '', 1, 1, '2014-06-18 08:02:09'), +(56, 'Update Project Task', 0, 'ProjectTask', 'update', 'mail', 22, '', 1, 1, '2014-06-18 08:02:09'), +(57, 'Delete Project Task', 0, 'ProjectTask', 'delete', 'mail', 22, '', 1, 1, '2014-06-18 08:02:09'), +(58, 'Computers not imported', 0, 'PluginOcsinventoryngNotimportedcomputer', 'not_imported', 'mail', 23, '', 1, 1, '2016-01-20 14:41:28'); + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_notificationtargets` +-- + +CREATE TABLE IF NOT EXISTS `glpi_notificationtargets` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `items_id` int(11) NOT NULL DEFAULT '0', + `type` int(11) NOT NULL DEFAULT '0', + `notifications_id` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `items` (`type`,`items_id`), + KEY `notifications_id` (`notifications_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=123 ; + +-- +-- Contenu de la table `glpi_notificationtargets` +-- + +INSERT INTO `glpi_notificationtargets` (`id`, `items_id`, `type`, `notifications_id`) VALUES +(1, 3, 1, 13), +(2, 1, 1, 13), +(3, 3, 2, 2), +(4, 1, 1, 2), +(5, 1, 1, 3), +(6, 1, 1, 5), +(7, 1, 1, 4), +(8, 2, 1, 3), +(9, 4, 1, 3), +(10, 3, 1, 2), +(11, 3, 1, 3), +(12, 3, 1, 5), +(13, 3, 1, 4), +(14, 1, 1, 19), +(15, 14, 1, 12), +(16, 3, 1, 14), +(17, 1, 1, 14), +(18, 3, 1, 15), +(19, 1, 1, 15), +(20, 1, 1, 6), +(21, 3, 1, 6), +(22, 1, 1, 7), +(23, 3, 1, 7), +(24, 1, 1, 8), +(25, 3, 1, 8), +(26, 1, 1, 9), +(27, 3, 1, 9), +(28, 1, 1, 10), +(29, 3, 1, 10), +(30, 1, 1, 11), +(31, 3, 1, 11), +(32, 19, 1, 25), +(33, 3, 1, 26), +(34, 21, 1, 2), +(35, 21, 1, 3), +(36, 21, 1, 5), +(37, 21, 1, 4), +(38, 21, 1, 6), +(39, 21, 1, 7), +(40, 21, 1, 8), +(41, 21, 1, 9), +(42, 21, 1, 10), +(43, 21, 1, 11), +(75, 1, 1, 41), +(46, 1, 1, 28), +(47, 3, 1, 29), +(48, 1, 1, 29), +(49, 21, 1, 29), +(50, 2, 1, 30), +(51, 4, 1, 30), +(52, 3, 1, 30), +(53, 1, 1, 30), +(54, 21, 1, 30), +(55, 3, 1, 31), +(56, 1, 1, 31), +(57, 21, 1, 31), +(58, 3, 1, 32), +(59, 1, 1, 32), +(60, 21, 1, 32), +(61, 3, 1, 33), +(62, 1, 1, 33), +(63, 21, 1, 33), +(64, 3, 1, 34), +(65, 1, 1, 34), +(66, 21, 1, 34), +(67, 3, 1, 35), +(68, 1, 1, 35), +(69, 21, 1, 35), +(70, 3, 1, 36), +(71, 1, 1, 36), +(72, 21, 1, 36), +(73, 14, 1, 37), +(74, 3, 1, 40), +(76, 3, 1, 42), +(77, 1, 1, 42), +(78, 21, 1, 42), +(79, 2, 1, 43), +(80, 4, 1, 43), +(81, 3, 1, 43), +(82, 1, 1, 43), +(83, 21, 1, 43), +(84, 3, 1, 44), +(85, 1, 1, 44), +(86, 21, 1, 44), +(87, 3, 1, 45), +(88, 1, 1, 45), +(89, 21, 1, 45), +(90, 3, 1, 46), +(91, 1, 1, 46), +(92, 21, 1, 46), +(93, 3, 1, 47), +(94, 1, 1, 47), +(95, 21, 1, 47), +(96, 3, 1, 48), +(97, 1, 1, 48), +(98, 21, 1, 48), +(99, 3, 1, 49), +(100, 1, 1, 49), +(101, 21, 1, 49), +(102, 3, 1, 50), +(103, 2, 1, 50), +(104, 1, 1, 51), +(105, 27, 1, 52), +(106, 1, 1, 52), +(107, 28, 1, 52), +(108, 27, 1, 53), +(109, 1, 1, 53), +(110, 28, 1, 53), +(111, 27, 1, 54), +(112, 1, 1, 54), +(113, 28, 1, 54), +(114, 31, 1, 55), +(115, 1, 1, 55), +(116, 32, 1, 55), +(117, 31, 1, 56), +(118, 1, 1, 56), +(119, 32, 1, 56), +(120, 31, 1, 57), +(121, 1, 1, 57), +(122, 32, 1, 57); + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_notificationtemplates` +-- + +CREATE TABLE IF NOT EXISTS `glpi_notificationtemplates` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `itemtype` varchar(100) COLLATE utf8_unicode_ci NOT NULL, + `date_mod` datetime DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + `css` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `itemtype` (`itemtype`), + KEY `date_mod` (`date_mod`), + KEY `name` (`name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=24 ; + +-- +-- Contenu de la table `glpi_notificationtemplates` +-- + +INSERT INTO `glpi_notificationtemplates` (`id`, `name`, `itemtype`, `date_mod`, `comment`, `css`) VALUES +(1, 'MySQL Synchronization', 'DBConnection', '2010-02-01 15:51:46', '', NULL), +(2, 'Reservations', 'Reservation', '2010-02-03 14:03:45', '', NULL), +(3, 'Alert Reservation', 'Reservation', '2010-02-03 14:03:45', '', NULL), +(4, 'Tickets', 'Ticket', '2010-02-07 21:39:15', '', NULL), +(5, 'Tickets (Simple)', 'Ticket', '2010-02-07 21:39:15', '', NULL), +(6, 'Alert Tickets not closed', 'Ticket', '2010-02-07 21:39:15', '', NULL), +(7, 'Tickets Validation', 'Ticket', '2010-02-26 21:39:15', '', NULL), +(8, 'Cartridges', 'CartridgeItem', '2010-02-16 13:17:24', '', NULL), +(9, 'Consumables', 'ConsumableItem', '2010-02-16 13:17:38', '', NULL), +(10, 'Infocoms', 'Infocom', '2010-02-16 13:17:55', '', NULL), +(11, 'Licenses', 'SoftwareLicense', '2010-02-16 13:18:12', '', NULL), +(12, 'Contracts', 'Contract', '2010-02-16 13:18:12', '', NULL), +(13, 'Password Forget', 'User', '2011-03-04 11:35:13', NULL, NULL), +(14, 'Ticket Satisfaction', 'Ticket', '2011-03-04 11:35:15', NULL, NULL), +(15, 'Item not unique', 'FieldUnicity', '2011-03-04 11:35:16', NULL, NULL), +(16, 'Crontask', 'Crontask', '2011-03-04 11:35:16', NULL, NULL), +(17, 'Problems', 'Problem', '2011-12-06 09:48:33', NULL, NULL), +(18, 'Planning recall', 'PlanningRecall', '2014-01-15 14:35:24', NULL, NULL), +(19, 'Changes', 'Change', '2014-06-18 08:02:07', NULL, NULL), +(20, 'Receiver errors', 'MailCollector', '2014-06-18 08:02:08', NULL, NULL), +(21, 'Projects', 'Project', '2014-06-18 08:02:09', NULL, NULL), +(22, 'Project Tasks', 'ProjectTask', '2014-06-18 08:02:09', NULL, NULL), +(23, 'Computers not imported', 'PluginOcsinventoryngNotimportedcomputer', '2016-01-20 14:41:28', '', NULL); + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_notificationtemplatetranslations` +-- + +CREATE TABLE IF NOT EXISTS `glpi_notificationtemplatetranslations` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `notificationtemplates_id` int(11) NOT NULL DEFAULT '0', + `language` char(5) COLLATE utf8_unicode_ci NOT NULL DEFAULT '', + `subject` varchar(255) COLLATE utf8_unicode_ci NOT NULL, + `content_text` text COLLATE utf8_unicode_ci, + `content_html` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `notificationtemplates_id` (`notificationtemplates_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=24 ; + +-- +-- Contenu de la table `glpi_notificationtemplatetranslations` +-- + +INSERT INTO `glpi_notificationtemplatetranslations` (`id`, `notificationtemplates_id`, `language`, `subject`, `content_text`, `content_html`) VALUES +(1, 1, '', '##lang.dbconnection.title##', '##lang.dbconnection.delay## : ##dbconnection.delay##\n', '<p>##lang.dbconnection.delay## : ##dbconnection.delay##</p>'), +(2, 2, '', '##reservation.action##', '======================================================================\n##lang.reservation.user##: ##reservation.user##\n##lang.reservation.item.name##: ##reservation.itemtype## - ##reservation.item.name##\n##IFreservation.tech## ##lang.reservation.tech## ##reservation.tech## ##ENDIFreservation.tech##\n##lang.reservation.begin##: ##reservation.begin##\n##lang.reservation.end##: ##reservation.end##\n##lang.reservation.comment##: ##reservation.comment##\n======================================================================\n', '<!-- description{ color: inherit; background: #ebebeb;border-style: solid;border-color: #8d8d8d; border-width: 0px 1px 1px 0px; } -->\n<p><span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;">##lang.reservation.user##:</span>##reservation.user##<br /> <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;">##lang.reservation.item.name##:</span>##reservation.itemtype## - ##reservation.item.name##<br />##IFreservation.tech## ##lang.reservation.tech## ##reservation.tech####ENDIFreservation.tech##<br /> <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;">##lang.reservation.begin##:</span> ##reservation.begin##<br /> <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;">##lang.reservation.end##:</span>##reservation.end##<br /> <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;">##lang.reservation.comment##:</span> ##reservation.comment##</p>'), +(3, 3, '', '##reservation.action## ##reservation.entity##', '##lang.reservation.entity## : ##reservation.entity## \n\n \n##FOREACHreservations## \n##lang.reservation.itemtype## : ##reservation.itemtype##\n\n ##lang.reservation.item## : ##reservation.item##\n \n ##reservation.url## \n\n ##ENDFOREACHreservations##', '<p>##lang.reservation.entity## : ##reservation.entity## <br /> <br />\n##FOREACHreservations## <br />##lang.reservation.itemtype## : ##reservation.itemtype##<br />\n ##lang.reservation.item## : ##reservation.item##<br /> <br />\n <a href="##reservation.url##"> ##reservation.url##</a><br />\n ##ENDFOREACHreservations##</p>'), +(4, 4, '', '##ticket.action## ##ticket.title##', ' ##IFticket.storestatus=5##\n ##lang.ticket.url## : ##ticket.urlapprove##\n ##lang.ticket.autoclosewarning##\n ##lang.ticket.solvedate## : ##ticket.solvedate##\n ##lang.ticket.solution.type## : ##ticket.solution.type##\n ##lang.ticket.solution.description## : ##ticket.solution.description## ##ENDIFticket.storestatus##\n ##ELSEticket.storestatus## ##lang.ticket.url## : ##ticket.url## ##ENDELSEticket.storestatus##\n\n ##lang.ticket.description##\n\n ##lang.ticket.title## : ##ticket.title##\n ##lang.ticket.authors## : ##IFticket.authors## ##ticket.authors## ##ENDIFticket.authors## ##ELSEticket.authors##--##ENDELSEticket.authors##\n ##lang.ticket.creationdate## : ##ticket.creationdate##\n ##lang.ticket.closedate## : ##ticket.closedate##\n ##lang.ticket.requesttype## : ##ticket.requesttype##\n##lang.ticket.item.name## : \n\n##FOREACHitems##\n\n ##IFticket.itemtype## \n ##ticket.itemtype## - ##ticket.item.name## \n ##IFticket.item.model## ##lang.ticket.item.model## : ##ticket.item.model## ##ENDIFticket.item.model## \n ##IFticket.item.serial## ##lang.ticket.item.serial## : ##ticket.item.serial## ##ENDIFticket.item.serial## \n ##IFticket.item.otherserial## ##lang.ticket.item.otherserial## : ##ticket.item.otherserial## ##ENDIFticket.item.otherserial## \n ##ENDIFticket.itemtype##\n\n##ENDFOREACHitems##\n##IFticket.assigntousers## ##lang.ticket.assigntousers## : ##ticket.assigntousers## ##ENDIFticket.assigntousers##\n ##lang.ticket.status## : ##ticket.status##\n##IFticket.assigntogroups## ##lang.ticket.assigntogroups## : ##ticket.assigntogroups## ##ENDIFticket.assigntogroups##\n ##lang.ticket.urgency## : ##ticket.urgency##\n ##lang.ticket.impact## : ##ticket.impact##\n ##lang.ticket.priority## : ##ticket.priority##\n##IFticket.user.email## ##lang.ticket.user.email## : ##ticket.user.email ##ENDIFticket.user.email##\n##IFticket.category## ##lang.ticket.category## : ##ticket.category## ##ENDIFticket.category## ##ELSEticket.category## ##lang.ticket.nocategoryassigned## ##ENDELSEticket.category##\n ##lang.ticket.content## : ##ticket.content##\n ##IFticket.storestatus=6##\n\n ##lang.ticket.solvedate## : ##ticket.solvedate##\n ##lang.ticket.solution.type## : ##ticket.solution.type##\n ##lang.ticket.solution.description## : ##ticket.solution.description##\n ##ENDIFticket.storestatus##\n ##lang.ticket.numberoffollowups## : ##ticket.numberoffollowups##\n\n##FOREACHfollowups##\n\n [##followup.date##] ##lang.followup.isprivate## : ##followup.isprivate##\n ##lang.followup.author## ##followup.author##\n ##lang.followup.description## ##followup.description##\n ##lang.followup.date## ##followup.date##\n ##lang.followup.requesttype## ##followup.requesttype##\n\n##ENDFOREACHfollowups##\n ##lang.ticket.numberoftasks## : ##ticket.numberoftasks##\n\n##FOREACHtasks##\n\n [##task.date##] ##lang.task.isprivate## : ##task.isprivate##\n ##lang.task.author## ##task.author##\n ##lang.task.description## ##task.description##\n ##lang.task.time## ##task.time##\n ##lang.task.category## ##task.category##\n\n##ENDFOREACHtasks##', '<!-- description{ color: inherit; background: #ebebeb; border-style: solid;border-color: #8d8d8d; border-width: 0px 1px 1px 0px; } -->\n<div>##IFticket.storestatus=5##</div>\n<div>##lang.ticket.url## : <a href="##ticket.urlapprove##">##ticket.urlapprove##</a> <strong> </strong></div>\n<div><strong>##lang.ticket.autoclosewarning##</strong></div>\n<div><span style="color: #888888;"><strong><span style="text-decoration: underline;">##lang.ticket.solvedate##</span></strong></span> : ##ticket.solvedate##<br /><span style="text-decoration: underline; color: #888888;"><strong>##lang.ticket.solution.type##</strong></span> : ##ticket.solution.type##<br /><span style="text-decoration: underline; color: #888888;"><strong>##lang.ticket.solution.description##</strong></span> : ##ticket.solution.description## ##ENDIFticket.storestatus##</div>\n<div>##ELSEticket.storestatus## ##lang.ticket.url## : <a href="##ticket.url##">##ticket.url##</a> ##ENDELSEticket.storestatus##</div>\n<p class="description b"><strong>##lang.ticket.description##</strong></p>\n<p><span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;"> ##lang.ticket.title##</span> :##ticket.title## <br /> <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;"> ##lang.ticket.authors##</span> :##IFticket.authors## ##ticket.authors## ##ENDIFticket.authors## ##ELSEticket.authors##--##ENDELSEticket.authors## <br /> <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;"> ##lang.ticket.creationdate##</span> :##ticket.creationdate## <br /> <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;"> ##lang.ticket.closedate##</span> :##ticket.closedate## <br /> <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;"> ##lang.ticket.requesttype##</span> :##ticket.requesttype##<br />\n<br /><span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;"> ##lang.ticket.item.name##</span> : \n<p>##FOREACHitems##</p>\n<div class="description b">##IFticket.itemtype## ##ticket.itemtype## - ##ticket.item.name## ##IFticket.item.model## ##lang.ticket.item.model## : ##ticket.item.model## ##ENDIFticket.item.model## ##IFticket.item.serial## ##lang.ticket.item.serial## : ##ticket.item.serial## ##ENDIFticket.item.serial## ##IFticket.item.otherserial## ##lang.ticket.item.otherserial## : ##ticket.item.otherserial## ##ENDIFticket.item.otherserial## ##ENDIFticket.itemtype## </div><br />\n<p>##ENDFOREACHitems##</p>\n##IFticket.assigntousers## <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;"> ##lang.ticket.assigntousers##</span> : ##ticket.assigntousers## ##ENDIFticket.assigntousers##<br /> <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;">##lang.ticket.status## </span> : ##ticket.status##<br /> ##IFticket.assigntogroups## <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;"> ##lang.ticket.assigntogroups##</span> : ##ticket.assigntogroups## ##ENDIFticket.assigntogroups##<br /> <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;"> ##lang.ticket.urgency##</span> : ##ticket.urgency##<br /> <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;"> ##lang.ticket.impact##</span> : ##ticket.impact##<br /> <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;"> ##lang.ticket.priority##</span> : ##ticket.priority## <br /> ##IFticket.user.email##<span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;"> ##lang.ticket.user.email##</span> : ##ticket.user.email ##ENDIFticket.user.email## <br /> ##IFticket.category##<span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;">##lang.ticket.category## </span> :##ticket.category## ##ENDIFticket.category## ##ELSEticket.category## ##lang.ticket.nocategoryassigned## ##ENDELSEticket.category## <br /> <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;"> ##lang.ticket.content##</span> : ##ticket.content##</p>\n<br />##IFticket.storestatus=6##<br /><span style="text-decoration: underline;"><strong><span style="color: #888888;">##lang.ticket.solvedate##</span></strong></span> : ##ticket.solvedate##<br /><span style="color: #888888;"><strong><span style="text-decoration: underline;">##lang.ticket.solution.type##</span></strong></span> : ##ticket.solution.type##<br /><span style="text-decoration: underline; color: #888888;"><strong>##lang.ticket.solution.description##</strong></span> : ##ticket.solution.description##<br />##ENDIFticket.storestatus##</p>\n<div class="description b">##lang.ticket.numberoffollowups## : ##ticket.numberoffollowups##</div>\n<p>##FOREACHfollowups##</p>\n<div class="description b"><br /> <strong> [##followup.date##] <em>##lang.followup.isprivate## : ##followup.isprivate## </em></strong><br /> <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;"> ##lang.followup.author## </span> ##followup.author##<br /> <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;"> ##lang.followup.description## </span> ##followup.description##<br /> <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;"> ##lang.followup.date## </span> ##followup.date##<br /> <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;"> ##lang.followup.requesttype## </span> ##followup.requesttype##</div>\n<p>##ENDFOREACHfollowups##</p>\n<div class="description b">##lang.ticket.numberoftasks## : ##ticket.numberoftasks##</div>\n<p>##FOREACHtasks##</p>\n<div class="description b"><br /> <strong> [##task.date##] <em>##lang.task.isprivate## : ##task.isprivate## </em></strong><br /> <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;"> ##lang.task.author##</span> ##task.author##<br /> <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;"> ##lang.task.description##</span> ##task.description##<br /> <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;"> ##lang.task.time##</span> ##task.time##<br /> <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;"> ##lang.task.category##</span> ##task.category##</div>\n<p>##ENDFOREACHtasks##</p>'), +(5, 12, '', '##contract.action## ##contract.entity##', '##lang.contract.entity## : ##contract.entity##\n\n##FOREACHcontracts##\n##lang.contract.name## : ##contract.name##\n##lang.contract.number## : ##contract.number##\n##lang.contract.time## : ##contract.time##\n##IFcontract.type####lang.contract.type## : ##contract.type####ENDIFcontract.type##\n##contract.url##\n##ENDFOREACHcontracts##', '<p>##lang.contract.entity## : ##contract.entity##<br />\n<br />##FOREACHcontracts##<br />##lang.contract.name## :\n##contract.name##<br />\n##lang.contract.number## : ##contract.number##<br />\n##lang.contract.time## : ##contract.time##<br />\n##IFcontract.type####lang.contract.type## : ##contract.type##\n##ENDIFcontract.type##<br />\n<a href="##contract.url##">\n##contract.url##</a><br />\n##ENDFOREACHcontracts##</p>'), +(6, 5, '', '##ticket.action## ##ticket.title##', '##lang.ticket.url## : ##ticket.url## \n\n##lang.ticket.description## \n\n\n##lang.ticket.title##  :##ticket.title## \n\n##lang.ticket.authors##  :##IFticket.authors##\n##ticket.authors## ##ENDIFticket.authors##\n##ELSEticket.authors##--##ENDELSEticket.authors##  \n\n##IFticket.category## ##lang.ticket.category##  :##ticket.category##\n##ENDIFticket.category## ##ELSEticket.category##\n##lang.ticket.nocategoryassigned## ##ENDELSEticket.category##\n\n##lang.ticket.content##  : ##ticket.content##\n##IFticket.itemtype##\n##lang.ticket.item.name##  : ##ticket.itemtype## - ##ticket.item.name##\n##ENDIFticket.itemtype##', '<div>##lang.ticket.url## : <a href="##ticket.url##">\n##ticket.url##</a></div>\n<div class="description b">\n##lang.ticket.description##</div>\n<p><span\nstyle="color: #8b8c8f; font-weight: bold; text-decoration: underline;">\n##lang.ticket.title##</span> :##ticket.title##\n<br /> <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;">\n##lang.ticket.authors##</span>\n##IFticket.authors## ##ticket.authors##\n##ENDIFticket.authors##\n##ELSEticket.authors##--##ENDELSEticket.authors##\n<span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;"> \n;</span><br /> <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;"> </span>\n##IFticket.category##<span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;">\n##lang.ticket.category## </span> :##ticket.category##\n##ENDIFticket.category## ##ELSEticket.category##\n##lang.ticket.nocategoryassigned## ##ENDELSEticket.category##\n<br /> <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;">\n##lang.ticket.content##</span> :\n##ticket.content##<br />##IFticket.itemtype##\n<span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;">\n##lang.ticket.item.name##</span> :\n##ticket.itemtype## - ##ticket.item.name##\n##ENDIFticket.itemtype##</p>'), +(15, 15, '', '##lang.unicity.action##', '##lang.unicity.entity## : ##unicity.entity## \n\n##lang.unicity.itemtype## : ##unicity.itemtype## \n\n##lang.unicity.message## : ##unicity.message## \n\n##lang.unicity.action_user## : ##unicity.action_user## \n\n##lang.unicity.action_type## : ##unicity.action_type## \n\n##lang.unicity.date## : ##unicity.date##', '<p>##lang.unicity.entity## : ##unicity.entity##</p>\n<p>##lang.unicity.itemtype## : ##unicity.itemtype##</p>\n<p>##lang.unicity.message## : ##unicity.message##</p>\n<p>##lang.unicity.action_user## : ##unicity.action_user##</p>\n<p>##lang.unicity.action_type## : ##unicity.action_type##</p>\n<p>##lang.unicity.date## : ##unicity.date##</p>'), +(7, 7, '', '##ticket.action## ##ticket.title##', '##FOREACHvalidations##\n\n##IFvalidation.storestatus=2##\n##validation.submission.title##\n##lang.validation.commentsubmission## : ##validation.commentsubmission##\n##ENDIFvalidation.storestatus##\n##ELSEvalidation.storestatus## ##validation.answer.title## ##ENDELSEvalidation.storestatus##\n\n##lang.ticket.url## : ##ticket.urlvalidation##\n\n##IFvalidation.status## ##lang.validation.status## : ##validation.status## ##ENDIFvalidation.status##\n##IFvalidation.commentvalidation##\n##lang.validation.commentvalidation## : ##validation.commentvalidation##\n##ENDIFvalidation.commentvalidation##\n##ENDFOREACHvalidations##', '<div>##FOREACHvalidations##</div>\n<p>##IFvalidation.storestatus=2##</p>\n<div>##validation.submission.title##</div>\n<div>##lang.validation.commentsubmission## : ##validation.commentsubmission##</div>\n<div>##ENDIFvalidation.storestatus##</div>\n<div>##ELSEvalidation.storestatus## ##validation.answer.title## ##ENDELSEvalidation.storestatus##</div>\n<div></div>\n<div>\n<div>##lang.ticket.url## : <a href="##ticket.urlvalidation##"> ##ticket.urlvalidation## </a></div>\n</div>\n<p>##IFvalidation.status## ##lang.validation.status## : ##validation.status## ##ENDIFvalidation.status##\n<br /> ##IFvalidation.commentvalidation##<br /> ##lang.validation.commentvalidation## :\n  ##validation.commentvalidation##<br /> ##ENDIFvalidation.commentvalidation##\n<br />##ENDFOREACHvalidations##</p>'), +(8, 6, '', '##ticket.action## ##ticket.entity##', '##lang.ticket.entity## : ##ticket.entity##\n \n##FOREACHtickets##\n\n##lang.ticket.title## : ##ticket.title##\n ##lang.ticket.status## : ##ticket.status##\n\n ##ticket.url## \n ##ENDFOREACHtickets##', '<table class="tab_cadre" border="1" cellspacing="2" cellpadding="3">\n<tbody>\n<tr>\n<td style="text-align: left;" width="auto" bgcolor="#cccccc"><span style="font-size: 11px; text-align: left;">##lang.ticket.authors##</span></td>\n<td style="text-align: left;" width="auto" bgcolor="#cccccc"><span style="font-size: 11px; text-align: left;">##lang.ticket.title##</span></td>\n<td style="text-align: left;" width="auto" bgcolor="#cccccc"><span style="font-size: 11px; text-align: left;">##lang.ticket.priority##</span></td>\n<td style="text-align: left;" width="auto" bgcolor="#cccccc"><span style="font-size: 11px; text-align: left;">##lang.ticket.status##</span></td>\n<td style="text-align: left;" width="auto" bgcolor="#cccccc"><span style="font-size: 11px; text-align: left;">##lang.ticket.attribution##</span></td>\n<td style="text-align: left;" width="auto" bgcolor="#cccccc"><span style="font-size: 11px; text-align: left;">##lang.ticket.creationdate##</span></td>\n<td style="text-align: left;" width="auto" bgcolor="#cccccc"><span style="font-size: 11px; text-align: left;">##lang.ticket.content##</span></td>\n</tr>\n##FOREACHtickets## \n<tr>\n<td width="auto"><span style="font-size: 11px; text-align: left;">##ticket.authors##</span></td>\n<td width="auto"><span style="font-size: 11px; text-align: left;"><a href="##ticket.url##">##ticket.title##</a></span></td>\n<td width="auto"><span style="font-size: 11px; text-align: left;">##ticket.priority##</span></td>\n<td width="auto"><span style="font-size: 11px; text-align: left;">##ticket.status##</span></td>\n<td width="auto"><span style="font-size: 11px; text-align: left;">##IFticket.assigntousers####ticket.assigntousers##<br />##ENDIFticket.assigntousers####IFticket.assigntogroups##<br />##ticket.assigntogroups## ##ENDIFticket.assigntogroups####IFticket.assigntosupplier##<br />##ticket.assigntosupplier## ##ENDIFticket.assigntosupplier##</span></td>\n<td width="auto"><span style="font-size: 11px; text-align: left;">##ticket.creationdate##</span></td>\n<td width="auto"><span style="font-size: 11px; text-align: left;">##ticket.content##</span></td>\n</tr>\n##ENDFOREACHtickets##\n</tbody>\n</table>'), +(9, 9, '', '##consumable.action## ##consumable.entity##', '##lang.consumable.entity## : ##consumable.entity##\n \n\n##FOREACHconsumables##\n##lang.consumable.item## : ##consumable.item##\n \n\n##lang.consumable.reference## : ##consumable.reference##\n\n##lang.consumable.remaining## : ##consumable.remaining##\n\n##consumable.url## \n\n##ENDFOREACHconsumables##', '<p>\n##lang.consumable.entity## : ##consumable.entity##\n<br /> <br />##FOREACHconsumables##\n<br />##lang.consumable.item## : ##consumable.item##<br />\n<br />##lang.consumable.reference## : ##consumable.reference##<br />\n##lang.consumable.remaining## : ##consumable.remaining##<br />\n<a href="##consumable.url##"> ##consumable.url##</a><br />\n ##ENDFOREACHconsumables##</p>'), +(10, 8, '', '##cartridge.action## ##cartridge.entity##', '##lang.cartridge.entity## : ##cartridge.entity##\n \n\n##FOREACHcartridges##\n##lang.cartridge.item## : ##cartridge.item##\n \n\n##lang.cartridge.reference## : ##cartridge.reference##\n\n##lang.cartridge.remaining## : ##cartridge.remaining##\n\n##cartridge.url## \n ##ENDFOREACHcartridges##', '<p>##lang.cartridge.entity## : ##cartridge.entity##\n<br /> <br />##FOREACHcartridges##\n<br />##lang.cartridge.item## :\n##cartridge.item##<br /> <br />\n##lang.cartridge.reference## :\n##cartridge.reference##<br />\n##lang.cartridge.remaining## :\n##cartridge.remaining##<br />\n<a href="##cartridge.url##">\n##cartridge.url##</a><br />\n##ENDFOREACHcartridges##</p>'), +(11, 10, '', '##infocom.action## ##infocom.entity##', '##lang.infocom.entity## : ##infocom.entity## \n \n\n##FOREACHinfocoms## \n\n##lang.infocom.itemtype## : ##infocom.itemtype##\n\n##lang.infocom.item## : ##infocom.item##\n \n\n##lang.infocom.expirationdate## : ##infocom.expirationdate##\n\n##infocom.url## \n ##ENDFOREACHinfocoms##', '<p>##lang.infocom.entity## : ##infocom.entity##\n<br /> <br />##FOREACHinfocoms##\n<br />##lang.infocom.itemtype## : ##infocom.itemtype##<br />\n##lang.infocom.item## : ##infocom.item##<br /> <br />\n##lang.infocom.expirationdate## : ##infocom.expirationdate##\n<br /> <a href="##infocom.url##">\n##infocom.url##</a><br />\n##ENDFOREACHinfocoms##</p>'), +(12, 11, '', '##license.action## ##license.entity##', '##lang.license.entity## : ##license.entity##\n\n##FOREACHlicenses## \n\n##lang.license.item## : ##license.item##\n\n##lang.license.serial## : ##license.serial##\n\n##lang.license.expirationdate## : ##license.expirationdate##\n\n##license.url## \n ##ENDFOREACHlicenses##', '<p>\n##lang.license.entity## : ##license.entity##<br />\n##FOREACHlicenses##\n<br />##lang.license.item## : ##license.item##<br />\n##lang.license.serial## : ##license.serial##<br />\n##lang.license.expirationdate## : ##license.expirationdate##\n<br /> <a href="##license.url##"> ##license.url##\n</a><br /> ##ENDFOREACHlicenses##</p>'), +(13, 13, '', '##user.action##', '##user.realname## ##user.firstname##\n\n##lang.passwordforget.information##\n\n##lang.passwordforget.link## ##user.passwordforgeturl##', '<p><strong>##user.realname## ##user.firstname##</strong></p>\n<p>##lang.passwordforget.information##</p>\n<p>##lang.passwordforget.link## <a title="##user.passwordforgeturl##" href="##user.passwordforgeturl##">##user.passwordforgeturl##</a></p>'), +(14, 14, '', '##ticket.action## ##ticket.title##', '##lang.ticket.title## : ##ticket.title##\n\n##lang.ticket.closedate## : ##ticket.closedate##\n\n##lang.satisfaction.text## ##ticket.urlsatisfaction##', '<p>##lang.ticket.title## : ##ticket.title##</p>\n<p>##lang.ticket.closedate## : ##ticket.closedate##</p>\n<p>##lang.satisfaction.text## <a href="##ticket.urlsatisfaction##">##ticket.urlsatisfaction##</a></p>'), +(16, 16, '', '##crontask.action##', '##lang.crontask.warning## \n\n##FOREACHcrontasks## \n ##crontask.name## : ##crontask.description##\n \n##ENDFOREACHcrontasks##', '<p>##lang.crontask.warning##</p>\n<p>##FOREACHcrontasks## <br /><a href="##crontask.url##">##crontask.name##</a> : ##crontask.description##<br /> <br />##ENDFOREACHcrontasks##</p>'), +(17, 17, '', '##problem.action## ##problem.title##', '##IFproblem.storestatus=5##\n ##lang.problem.url## : ##problem.urlapprove##\n ##lang.problem.solvedate## : ##problem.solvedate##\n ##lang.problem.solution.type## : ##problem.solution.type##\n ##lang.problem.solution.description## : ##problem.solution.description## ##ENDIFproblem.storestatus##\n ##ELSEproblem.storestatus## ##lang.problem.url## : ##problem.url## ##ENDELSEproblem.storestatus##\n\n ##lang.problem.description##\n\n ##lang.problem.title##  :##problem.title##\n ##lang.problem.authors##  :##IFproblem.authors## ##problem.authors## ##ENDIFproblem.authors## ##ELSEproblem.authors##--##ENDELSEproblem.authors##\n ##lang.problem.creationdate##  :##problem.creationdate##\n ##IFproblem.assigntousers## ##lang.problem.assigntousers##  : ##problem.assigntousers## ##ENDIFproblem.assigntousers##\n ##lang.problem.status##  : ##problem.status##\n ##IFproblem.assigntogroups## ##lang.problem.assigntogroups##  : ##problem.assigntogroups## ##ENDIFproblem.assigntogroups##\n ##lang.problem.urgency##  : ##problem.urgency##\n ##lang.problem.impact##  : ##problem.impact##\n ##lang.problem.priority## : ##problem.priority##\n##IFproblem.category## ##lang.problem.category##  :##problem.category## ##ENDIFproblem.category## ##ELSEproblem.category## ##lang.problem.nocategoryassigned## ##ENDELSEproblem.category##\n ##lang.problem.content##  : ##problem.content##\n\n##IFproblem.storestatus=6##\n ##lang.problem.solvedate## : ##problem.solvedate##\n ##lang.problem.solution.type## : ##problem.solution.type##\n ##lang.problem.solution.description## : ##problem.solution.description##\n##ENDIFproblem.storestatus##\n ##lang.problem.numberoftickets## : ##problem.numberoftickets##\n\n##FOREACHtickets##\n [##ticket.date##] ##lang.problem.title## : ##ticket.title##\n ##lang.problem.content## ##ticket.content##\n\n##ENDFOREACHtickets##\n ##lang.problem.numberoftasks## : ##problem.numberoftasks##\n\n##FOREACHtasks##\n [##task.date##]\n ##lang.task.author## ##task.author##\n ##lang.task.description## ##task.description##\n ##lang.task.time## ##task.time##\n ##lang.task.category## ##task.category##\n\n##ENDFOREACHtasks##\n', '<p>##IFproblem.storestatus=5##</p>\n<div>##lang.problem.url## : <a href="##problem.urlapprove##">##problem.urlapprove##</a></div>\n<div><span style="color: #888888;"><strong><span style="text-decoration: underline;">##lang.problem.solvedate##</span></strong></span> : ##problem.solvedate##<br /><span style="text-decoration: underline; color: #888888;"><strong>##lang.problem.solution.type##</strong></span> : ##problem.solution.type##<br /><span style="text-decoration: underline; color: #888888;"><strong>##lang.problem.solution.description##</strong></span> : ##problem.solution.description## ##ENDIFproblem.storestatus##</div>\n<div>##ELSEproblem.storestatus## ##lang.problem.url## : <a href="##problem.url##">##problem.url##</a> ##ENDELSEproblem.storestatus##</div>\n<p class="description b"><strong>##lang.problem.description##</strong></p>\n<p><span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;"> ##lang.problem.title##</span> :##problem.title## <br /> <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;"> ##lang.problem.authors##</span> :##IFproblem.authors## ##problem.authors## ##ENDIFproblem.authors## ##ELSEproblem.authors##--##ENDELSEproblem.authors## <br /> <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;"> ##lang.problem.creationdate##</span> :##problem.creationdate## <br /> ##IFproblem.assigntousers## <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;"> ##lang.problem.assigntousers##</span> : ##problem.assigntousers## ##ENDIFproblem.assigntousers##<br /> <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;">##lang.problem.status## </span> : ##problem.status##<br /> ##IFproblem.assigntogroups## <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;"> ##lang.problem.assigntogroups##</span> : ##problem.assigntogroups## ##ENDIFproblem.assigntogroups##<br /> <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;"> ##lang.problem.urgency##</span> : ##problem.urgency##<br /> <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;"> ##lang.problem.impact##</span> : ##problem.impact##<br /> <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;"> ##lang.problem.priority##</span> : ##problem.priority## <br />##IFproblem.category##<span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;">##lang.problem.category## </span> :##problem.category## ##ENDIFproblem.category## ##ELSEproblem.category## ##lang.problem.nocategoryassigned## ##ENDELSEproblem.category## <br /> <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;"> ##lang.problem.content##</span> : ##problem.content##</p>\n<p>##IFproblem.storestatus=6##<br /><span style="text-decoration: underline;"><strong><span style="color: #888888;">##lang.problem.solvedate##</span></strong></span> : ##problem.solvedate##<br /><span style="color: #888888;"><strong><span style="text-decoration: underline;">##lang.problem.solution.type##</span></strong></span> : ##problem.solution.type##<br /><span style="text-decoration: underline; color: #888888;"><strong>##lang.problem.solution.description##</strong></span> : ##problem.solution.description##<br />##ENDIFproblem.storestatus##</p>\n<div class="description b">##lang.problem.numberoftickets## : ##problem.numberoftickets##</div>\n<p>##FOREACHtickets##</p>\n<div><strong> [##ticket.date##] <em>##lang.problem.title## : <a href="##ticket.url##">##ticket.title## </a></em></strong><br /> <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;"> </span><span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;">##lang.problem.content## </span> ##ticket.content##\n<p>##ENDFOREACHtickets##</p>\n<div class="description b">##lang.problem.numberoftasks## : ##problem.numberoftasks##</div>\n<p>##FOREACHtasks##</p>\n<div class="description b"><strong>[##task.date##] </strong><br /> <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;"> ##lang.task.author##</span> ##task.author##<br /> <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;"> ##lang.task.description##</span> ##task.description##<br /> <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;"> ##lang.task.time##</span> ##task.time##<br /> <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;"> ##lang.task.category##</span> ##task.category##</div>\n<p>##ENDFOREACHtasks##</p>\n</div>'), +(18, 18, '', '##recall.action##: ##recall.item.name##', '##recall.action##: ##recall.item.name##\n\n##recall.item.content##\n\n##lang.recall.planning.begin##: ##recall.planning.begin##\n##lang.recall.planning.end##: ##recall.planning.end##\n##lang.recall.planning.state##: ##recall.planning.state##\n##lang.recall.item.private##: ##recall.item.private##', '<p>##recall.action##: <a href="##recall.item.url##">##recall.item.name##</a></p>\n<p>##recall.item.content##</p>\n<p>##lang.recall.planning.begin##: ##recall.planning.begin##<br />##lang.recall.planning.end##: ##recall.planning.end##<br />##lang.recall.planning.state##: ##recall.planning.state##<br />##lang.recall.item.private##: ##recall.item.private##<br /><br /></p>\n<p><br /><br /></p>'), +(19, 19, '', '##change.action## ##change.title##', '##IFchange.storestatus=5##\n ##lang.change.url## : ##change.urlapprove##\n ##lang.change.solvedate## : ##change.solvedate##\n ##lang.change.solution.type## : ##change.solution.type##\n ##lang.change.solution.description## : ##change.solution.description## ##ENDIFchange.storestatus##\n ##ELSEchange.storestatus## ##lang.change.url## : ##change.url## ##ENDELSEchange.storestatus##\n\n ##lang.change.description##\n\n ##lang.change.title## :##change.title##\n ##lang.change.authors## :##IFchange.authors## ##change.authors## ##ENDIFchange.authors## ##ELSEchange.authors##--##ENDELSEchange.authors##\n ##lang.change.creationdate## :##change.creationdate##\n ##IFchange.assigntousers## ##lang.change.assigntousers## : ##change.assigntousers## ##ENDIFchange.assigntousers##\n ##lang.change.status## : ##change.status##\n ##IFchange.assigntogroups## ##lang.change.assigntogroups## : ##change.assigntogroups## ##ENDIFchange.assigntogroups##\n ##lang.change.urgency## : ##change.urgency##\n ##lang.change.impact## : ##change.impact##\n ##lang.change.priority## : ##change.priority##\n##IFchange.category## ##lang.change.category## :##change.category## ##ENDIFchange.category## ##ELSEchange.category## ##lang.change.nocategoryassigned## ##ENDELSEchange.category##\n ##lang.change.content## : ##change.content##\n\n##IFchange.storestatus=6##\n ##lang.change.solvedate## : ##change.solvedate##\n ##lang.change.solution.type## : ##change.solution.type##\n ##lang.change.solution.description## : ##change.solution.description##\n##ENDIFchange.storestatus##\n ##lang.change.numberofproblems## : ##change.numberofproblems##\n\n##FOREACHproblems##\n [##problem.date##] ##lang.change.title## : ##problem.title##\n ##lang.change.content## ##problem.content##\n\n##ENDFOREACHproblems##\n ##lang.change.numberoftasks## : ##change.numberoftasks##\n\n##FOREACHtasks##\n [##task.date##]\n ##lang.task.author## ##task.author##\n ##lang.task.description## ##task.description##\n ##lang.task.time## ##task.time##\n ##lang.task.category## ##task.category##\n\n##ENDFOREACHtasks##\n', '<p>##IFchange.storestatus=5##</p>\n<div>##lang.change.url## : <a href="##change.urlapprove##">##change.urlapprove##</a></div>\n<div><span style="color: #888888;"><strong><span style="text-decoration: underline;">##lang.change.solvedate##</span></strong></span> : ##change.solvedate##<br /><span style="text-decoration: underline; color: #888888;"><strong>##lang.change.solution.type##</strong></span> : ##change.solution.type##<br /><span style="text-decoration: underline; color: #888888;"><strong>##lang.change.solution.description##</strong></span> : ##change.solution.description## ##ENDIFchange.storestatus##</div>\n<div>##ELSEchange.storestatus## ##lang.change.url## : <a href="##change.url##">##change.url##</a> ##ENDELSEchange.storestatus##</div>\n<p class="description b"><strong>##lang.change.description##</strong></p>\n<p><span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;"> ##lang.change.title##</span> :##change.title## <br /> <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;"> ##lang.change.authors##</span> :##IFchange.authors## ##change.authors## ##ENDIFchange.authors## ##ELSEchange.authors##--##ENDELSEchange.authors## <br /> <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;"> ##lang.change.creationdate##</span> :##change.creationdate## <br /> ##IFchange.assigntousers## <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;"> ##lang.change.assigntousers##</span> : ##change.assigntousers## ##ENDIFchange.assigntousers##<br /> <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;">##lang.change.status## </span> : ##change.status##<br /> ##IFchange.assigntogroups## <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;"> ##lang.change.assigntogroups##</span> : ##change.assigntogroups## ##ENDIFchange.assigntogroups##<br /> <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;"> ##lang.change.urgency##</span> : ##change.urgency##<br /> <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;"> ##lang.change.impact##</span> : ##change.impact##<br /> <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;"> ##lang.change.priority##</span> : ##change.priority## <br />##IFchange.category##<span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;">##lang.change.category## </span> :##change.category## ##ENDIFchange.category## ##ELSEchange.category## ##lang.change.nocategoryassigned## ##ENDELSEchange.category## <br /> <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;"> ##lang.change.content##</span> : ##change.content##</p>\n<p>##IFchange.storestatus=6##<br /><span style="text-decoration: underline;"><strong><span style="color: #888888;">##lang.change.solvedate##</span></strong></span> : ##change.solvedate##<br /><span style="color: #888888;"><strong><span style="text-decoration: underline;">##lang.change.solution.type##</span></strong></span> : ##change.solution.type##<br /><span style="text-decoration: underline; color: #888888;"><strong>##lang.change.solution.description##</strong></span> : ##change.solution.description##<br />##ENDIFchange.storestatus##</p>\n<div class="description b">##lang.change.numberofproblems## : ##change.numberofproblems##</div>\n<p>##FOREACHproblems##</p>\n<div><strong> [##problem.date##] <em>##lang.change.title## : <a href="##problem.url##">##problem.title## </a></em></strong><br /> <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;"> </span><span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;">##lang.change.content## </span> ##problem.content##\n<p>##ENDFOREACHproblems##</p>\n<div class="description b">##lang.change.numberoftasks## : ##change.numberoftasks##</div>\n<p>##FOREACHtasks##</p>\n<div class="description b"><strong>[##task.date##] </strong><br /> <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;"> ##lang.task.author##</span> ##task.author##<br /> <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;"> ##lang.task.description##</span> ##task.description##<br /> <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;"> ##lang.task.time##</span> ##task.time##<br /> <span style="color: #8b8c8f; font-weight: bold; text-decoration: underline;"> ##lang.task.category##</span> ##task.category##</div>\n<p>##ENDFOREACHtasks##</p>\n</div>'), +(20, 20, '', '##mailcollector.action##', '##FOREACHmailcollectors##\n##lang.mailcollector.name## : ##mailcollector.name##\n##lang.mailcollector.errors## : ##mailcollector.errors##\n##mailcollector.url##\n##ENDFOREACHmailcollectors##', '<p>##FOREACHmailcollectors##<br />##lang.mailcollector.name## : ##mailcollector.name##<br /> ##lang.mailcollector.errors## : ##mailcollector.errors##<br /><a href="##mailcollector.url##">##mailcollector.url##</a><br /> ##ENDFOREACHmailcollectors##</p>\n<p></p>'), +(21, 21, '', '##project.action## ##project.name## ##project.code##', '##lang.project.url## : ##project.url##\n\n##lang.project.description##\n\n##lang.project.name## : ##project.name##\n##lang.project.code## : ##project.code##\n##lang.project.manager## : ##project.manager##\n##lang.project.managergroup## : ##project.managergroup##\n##lang.project.creationdate## : ##project.creationdate##\n##lang.project.priority## : ##project.priority##\n##lang.project.state## : ##project.state##\n##lang.project.type## : ##project.type##\n##lang.project.description## : ##project.description##\n\n##lang.project.numberoftasks## : ##project.numberoftasks##\n\n\n\n##FOREACHtasks##\n\n[##task.creationdate##]\n##lang.task.name## : ##task.name##\n##lang.task.state## : ##task.state##\n##lang.task.type## : ##task.type##\n##lang.task.percent## : ##task.percent##\n##lang.task.description## : ##task.description##\n\n##ENDFOREACHtasks##', '<p>##lang.project.url## : <a href="##project.url##">##project.url##</a></p>\n<p><strong>##lang.project.description##</strong></p>\n<p>##lang.project.name## : ##project.name##<br />##lang.project.code## : ##project.code##<br /> ##lang.project.manager## : ##project.manager##<br />##lang.project.managergroup## : ##project.managergroup##<br /> ##lang.project.creationdate## : ##project.creationdate##<br />##lang.project.priority## : ##project.priority## <br />##lang.project.state## : ##project.state##<br />##lang.project.type## : ##project.type##<br />##lang.project.description## : ##project.description##</p>\n<p>##lang.project.numberoftasks## : ##project.numberoftasks##</p>\n<div>\n<p>##FOREACHtasks##</p>\n<div><strong>[##task.creationdate##] </strong><br /> ##lang.task.name## : ##task.name##<br />##lang.task.state## : ##task.state##<br />##lang.task.type## : ##task.type##<br />##lang.task.percent## : ##task.percent##<br />##lang.task.description## : ##task.description##</div>\n<p>##ENDFOREACHtasks##</p>\n</div>'), +(22, 22, '', '##projecttask.action## ##projecttask.name##', '##lang.projecttask.url## : ##projecttask.url##\n\n##lang.projecttask.description##\n\n##lang.projecttask.name## : ##projecttask.name##\n##lang.projecttask.project## : ##projecttask.name##\n##lang.projecttask.creationdate## : ##projecttask.creationdate##\n##lang.projecttask.state## : ##projecttask.state##\n##lang.projecttask.type## : ##projecttask.type##\n##lang.projecttask.description## : ##projecttask.description##\n\n##lang.projecttask.numberoftasks## : ##projecttask.numberoftasks##\n\n\n\n##FOREACHtasks##\n\n[##task.creationdate##]\n##lang.task.name## : ##task.name##\n##lang.task.state## : ##task.state##\n##lang.task.type## : ##task.type##\n##lang.task.percent## : ##task.percent##\n##lang.task.description## : ##task.description##\n\n##ENDFOREACHtasks##', '<p>##lang.projecttask.url## : <a href="##projecttask.url##">##projecttask.url##</a></p>\n<p><strong>##lang.projecttask.description##</strong></p>\n<p>##lang.projecttask.name## : ##projecttask.name##<br />##lang.projecttask.project## : <a href="##projecttask.projecturl##">##projecttask.name##</a><br />##lang.projecttask.creationdate## : ##projecttask.creationdate##<br />##lang.projecttask.state## : ##projecttask.state##<br />##lang.projecttask.type## : ##projecttask.type##<br />##lang.projecttask.description## : ##projecttask.description##</p>\n<p>##lang.projecttask.numberoftasks## : ##projecttask.numberoftasks##</p>\n<div>\n<p>##FOREACHtasks##</p>\n<div><strong>[##task.creationdate##] </strong><br />##lang.task.name## : ##task.name##<br />##lang.task.state## : ##task.state##<br />##lang.task.type## : ##task.type##<br />##lang.task.percent## : ##task.percent##<br />##lang.task.description## : ##task.description##</div>\n<p>##ENDFOREACHtasks##</p>\n</div>'), +(23, 23, '', '##lang.notimported.action## : ##notimported.entity##', '\r\n\n##lang.notimported.action## : ##notimported.entity##\n\n##FOREACHnotimported## \n##lang.notimported.reason## : ##notimported.reason##\n##lang.notimported.name## : ##notimported.name##\n##lang.notimported.deviceid## : ##notimported.deviceid##\n##lang.notimported.tag## : ##notimported.tag##\n##lang.notimported.serial## : ##notimported.serial## \r\n\n ##notimported.url## \n##ENDFOREACHnotimported## \r\n', '<p>##lang.notimported.action## : ##notimported.entity##<br /><br />##FOREACHnotimported## <br />##lang.notimported.reason## : ##notimported.reason##<br />##lang.notimported.name## : ##notimported.name##<br />##lang.notimported.deviceid## : ##notimported.deviceid##<br />##lang.notimported.tag## : ##notimported.tag##<br />##lang.notimported.serial## : ##notimported.serial##</p>\r\n<p><a href="##notimported.url##">##notimported.url##</a><br />##ENDFOREACHnotimported##</p>'); + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_notimportedemails` +-- + +CREATE TABLE IF NOT EXISTS `glpi_notimportedemails` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `from` varchar(255) NOT NULL, + `to` varchar(255) NOT NULL, + `mailcollectors_id` int(11) NOT NULL DEFAULT '0', + `date` datetime NOT NULL, + `subject` text, + `messageid` varchar(255) NOT NULL, + `reason` int(11) NOT NULL DEFAULT '0', + `users_id` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `users_id` (`users_id`), + KEY `mailcollectors_id` (`mailcollectors_id`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_operatingsystems` +-- + +CREATE TABLE IF NOT EXISTS `glpi_operatingsystems` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `name` (`name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_operatingsystemservicepacks` +-- + +CREATE TABLE IF NOT EXISTS `glpi_operatingsystemservicepacks` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `name` (`name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_operatingsystemversions` +-- + +CREATE TABLE IF NOT EXISTS `glpi_operatingsystemversions` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `name` (`name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_peripheralmodels` +-- + +CREATE TABLE IF NOT EXISTS `glpi_peripheralmodels` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `name` (`name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_peripherals` +-- + +CREATE TABLE IF NOT EXISTS `glpi_peripherals` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `entities_id` int(11) NOT NULL DEFAULT '0', + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `date_mod` datetime DEFAULT NULL, + `contact` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `contact_num` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `users_id_tech` int(11) NOT NULL DEFAULT '0', + `groups_id_tech` int(11) NOT NULL DEFAULT '0', + `comment` text COLLATE utf8_unicode_ci, + `serial` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `otherserial` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `locations_id` int(11) NOT NULL DEFAULT '0', + `peripheraltypes_id` int(11) NOT NULL DEFAULT '0', + `peripheralmodels_id` int(11) NOT NULL DEFAULT '0', + `brand` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `manufacturers_id` int(11) NOT NULL DEFAULT '0', + `is_global` tinyint(1) NOT NULL DEFAULT '0', + `is_deleted` tinyint(1) NOT NULL DEFAULT '0', + `is_template` tinyint(1) NOT NULL DEFAULT '0', + `template_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `users_id` int(11) NOT NULL DEFAULT '0', + `groups_id` int(11) NOT NULL DEFAULT '0', + `states_id` int(11) NOT NULL DEFAULT '0', + `ticket_tco` decimal(20,4) DEFAULT '0.0000', + `is_dynamic` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `name` (`name`), + KEY `is_template` (`is_template`), + KEY `is_global` (`is_global`), + KEY `entities_id` (`entities_id`), + KEY `manufacturers_id` (`manufacturers_id`), + KEY `groups_id` (`groups_id`), + KEY `users_id` (`users_id`), + KEY `locations_id` (`locations_id`), + KEY `peripheralmodels_id` (`peripheralmodels_id`), + KEY `states_id` (`states_id`), + KEY `users_id_tech` (`users_id_tech`), + KEY `peripheraltypes_id` (`peripheraltypes_id`), + KEY `is_deleted` (`is_deleted`), + KEY `date_mod` (`date_mod`), + KEY `groups_id_tech` (`groups_id_tech`), + KEY `is_dynamic` (`is_dynamic`), + KEY `serial` (`serial`), + KEY `otherserial` (`otherserial`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_peripheraltypes` +-- + +CREATE TABLE IF NOT EXISTS `glpi_peripheraltypes` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `name` (`name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_phonemodels` +-- + +CREATE TABLE IF NOT EXISTS `glpi_phonemodels` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `name` (`name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_phonepowersupplies` +-- + +CREATE TABLE IF NOT EXISTS `glpi_phonepowersupplies` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `name` (`name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_phones` +-- + +CREATE TABLE IF NOT EXISTS `glpi_phones` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `entities_id` int(11) NOT NULL DEFAULT '0', + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `date_mod` datetime DEFAULT NULL, + `contact` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `contact_num` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `users_id_tech` int(11) NOT NULL DEFAULT '0', + `groups_id_tech` int(11) NOT NULL DEFAULT '0', + `comment` text COLLATE utf8_unicode_ci, + `serial` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `otherserial` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `firmware` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `locations_id` int(11) NOT NULL DEFAULT '0', + `phonetypes_id` int(11) NOT NULL DEFAULT '0', + `phonemodels_id` int(11) NOT NULL DEFAULT '0', + `brand` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `phonepowersupplies_id` int(11) NOT NULL DEFAULT '0', + `number_line` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `have_headset` tinyint(1) NOT NULL DEFAULT '0', + `have_hp` tinyint(1) NOT NULL DEFAULT '0', + `manufacturers_id` int(11) NOT NULL DEFAULT '0', + `is_global` tinyint(1) NOT NULL DEFAULT '0', + `is_deleted` tinyint(1) NOT NULL DEFAULT '0', + `is_template` tinyint(1) NOT NULL DEFAULT '0', + `template_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `users_id` int(11) NOT NULL DEFAULT '0', + `groups_id` int(11) NOT NULL DEFAULT '0', + `states_id` int(11) NOT NULL DEFAULT '0', + `ticket_tco` decimal(20,4) DEFAULT '0.0000', + `is_dynamic` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `name` (`name`), + KEY `is_template` (`is_template`), + KEY `is_global` (`is_global`), + KEY `entities_id` (`entities_id`), + KEY `manufacturers_id` (`manufacturers_id`), + KEY `groups_id` (`groups_id`), + KEY `users_id` (`users_id`), + KEY `locations_id` (`locations_id`), + KEY `phonemodels_id` (`phonemodels_id`), + KEY `phonepowersupplies_id` (`phonepowersupplies_id`), + KEY `states_id` (`states_id`), + KEY `users_id_tech` (`users_id_tech`), + KEY `phonetypes_id` (`phonetypes_id`), + KEY `is_deleted` (`is_deleted`), + KEY `date_mod` (`date_mod`), + KEY `groups_id_tech` (`groups_id_tech`), + KEY `is_dynamic` (`is_dynamic`), + KEY `serial` (`serial`), + KEY `otherserial` (`otherserial`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_phonetypes` +-- + +CREATE TABLE IF NOT EXISTS `glpi_phonetypes` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `name` (`name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_planningrecalls` +-- + +CREATE TABLE IF NOT EXISTS `glpi_planningrecalls` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `items_id` int(11) NOT NULL DEFAULT '0', + `itemtype` varchar(100) COLLATE utf8_unicode_ci NOT NULL, + `users_id` int(11) NOT NULL DEFAULT '0', + `before_time` int(11) NOT NULL DEFAULT '-10', + `when` datetime DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `unicity` (`itemtype`,`items_id`,`users_id`), + KEY `users_id` (`users_id`), + KEY `before_time` (`before_time`), + KEY `when` (`when`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_plugins` +-- + +CREATE TABLE IF NOT EXISTS `glpi_plugins` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `directory` varchar(255) COLLATE utf8_unicode_ci NOT NULL, + `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL, + `version` varchar(255) COLLATE utf8_unicode_ci NOT NULL, + `state` int(11) NOT NULL DEFAULT '0' COMMENT 'see define.php PLUGIN_* constant', + `author` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `homepage` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `license` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `unicity` (`directory`), + KEY `state` (`state`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=2 ; + +-- +-- Contenu de la table `glpi_plugins` +-- + +INSERT INTO `glpi_plugins` (`id`, `directory`, `name`, `version`, `state`, `author`, `homepage`, `license`) VALUES +(1, 'ocsinventoryng', 'OCS Inventory NG', '1.1.1', 1, 'Remi Collet, Nelly Mahu-Lasson, David Durieux, Xavier Caillaud, Walid Nouh, Arthur Jaouen', 'https://forge.indepnet.net/projects/ocsinventoryng', 'GPLv2+'); + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_plugin_ocsinventoryng_configs` +-- + +CREATE TABLE IF NOT EXISTS `glpi_plugin_ocsinventoryng_configs` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `thread_log_frequency` int(11) NOT NULL DEFAULT '10', + `is_displayempty` int(1) NOT NULL DEFAULT '1', + `import_limit` int(11) NOT NULL DEFAULT '0', + `delay_refresh` int(11) NOT NULL DEFAULT '0', + `allow_ocs_update` tinyint(1) NOT NULL DEFAULT '0', + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=2 ; + +-- +-- Contenu de la table `glpi_plugin_ocsinventoryng_configs` +-- + +INSERT INTO `glpi_plugin_ocsinventoryng_configs` (`id`, `thread_log_frequency`, `is_displayempty`, `import_limit`, `delay_refresh`, `allow_ocs_update`, `comment`) VALUES +(1, 2, 1, 0, 0, 0, NULL); + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_plugin_ocsinventoryng_details` +-- + +CREATE TABLE IF NOT EXISTS `glpi_plugin_ocsinventoryng_details` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `entities_id` int(11) NOT NULL DEFAULT '0', + `plugin_ocsinventoryng_threads_id` int(11) NOT NULL DEFAULT '0', + `rules_id` text COLLATE utf8_unicode_ci, + `threadid` int(11) NOT NULL DEFAULT '0', + `ocsid` int(11) NOT NULL DEFAULT '0', + `computers_id` int(11) NOT NULL DEFAULT '0', + `action` int(11) NOT NULL DEFAULT '0', + `process_time` datetime DEFAULT NULL, + `plugin_ocsinventoryng_ocsservers_id` int(11) NOT NULL DEFAULT '1', + PRIMARY KEY (`id`), + KEY `end_time` (`process_time`), + KEY `process_thread` (`plugin_ocsinventoryng_threads_id`,`threadid`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_plugin_ocsinventoryng_devicebiosdatas` +-- + +CREATE TABLE IF NOT EXISTS `glpi_plugin_ocsinventoryng_devicebiosdatas` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `designation` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + `date` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `assettag` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `manufacturers_id` int(11) NOT NULL DEFAULT '0', + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `manufacturers_id` (`manufacturers_id`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_plugin_ocsinventoryng_items_devicebiosdatas` +-- + +CREATE TABLE IF NOT EXISTS `glpi_plugin_ocsinventoryng_items_devicebiosdatas` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `items_id` int(11) NOT NULL DEFAULT '0', + `itemtype` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `plugin_ocsinventoryng_devicebiosdatas_id` int(11) NOT NULL DEFAULT '0', + `is_deleted` tinyint(1) NOT NULL DEFAULT '0', + `is_dynamic` tinyint(1) NOT NULL DEFAULT '0', + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `computers_id` (`items_id`), + KEY `plugin_ocsinventoryng_devicebiosdatas_id` (`plugin_ocsinventoryng_devicebiosdatas_id`), + KEY `is_deleted` (`is_deleted`), + KEY `is_dynamic` (`is_dynamic`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`), + KEY `item` (`itemtype`,`items_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_plugin_ocsinventoryng_networkports` +-- + +CREATE TABLE IF NOT EXISTS `glpi_plugin_ocsinventoryng_networkports` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `networkports_id` int(11) NOT NULL DEFAULT '0', + `TYPE` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `TYPEMIB` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `items_devicenetworkcards_id` int(11) NOT NULL DEFAULT '0', + `speed` varchar(255) COLLATE utf8_unicode_ci DEFAULT '10mb/s', + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + UNIQUE KEY `networkports_id` (`networkports_id`), + KEY `TYPE` (`TYPE`), + KEY `TYPEMIB` (`TYPEMIB`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_plugin_ocsinventoryng_networkporttypes` +-- + +CREATE TABLE IF NOT EXISTS `glpi_plugin_ocsinventoryng_networkporttypes` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `OCS_TYPE` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '', + `OCS_TYPEMIB` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '', + `instantiation_type` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `type` varchar(10) COLLATE utf8_unicode_ci DEFAULT '' COMMENT 'T, LX, SX', + `speed` int(11) DEFAULT '10' COMMENT 'Mbit/s: 10, 100, 1000, 10000', + `version` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT 'a, a/b, a/b/g, a/b/g/n, a/b/g/n/y', + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `OCS_TYPE` (`OCS_TYPE`), + KEY `OCS_TYPEMIB` (`OCS_TYPEMIB`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=5 ; + +-- +-- Contenu de la table `glpi_plugin_ocsinventoryng_networkporttypes` +-- + +INSERT INTO `glpi_plugin_ocsinventoryng_networkporttypes` (`id`, `name`, `OCS_TYPE`, `OCS_TYPEMIB`, `instantiation_type`, `type`, `speed`, `version`, `comment`) VALUES +(1, 'Unkown port', '*', '*', 'PluginOcsinventoryngNetworkPort', NULL, NULL, NULL, NULL), +(2, 'Ethernet port', 'Ethernet', '*', 'NetworkPortEthernet', 'T', 10, NULL, NULL), +(3, 'Wifi port', 'Wifi', '*', 'NetworkPortWifi', NULL, NULL, 'a', NULL), +(4, 'Loopback port', 'Local', '*', 'NetworkPortLocal', NULL, NULL, NULL, NULL); + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_plugin_ocsinventoryng_notimportedcomputers` +-- + +CREATE TABLE IF NOT EXISTS `glpi_plugin_ocsinventoryng_notimportedcomputers` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `entities_id` int(11) NOT NULL DEFAULT '0', + `rules_id` text COLLATE utf8_unicode_ci, + `comment` text COLLATE utf8_unicode_ci, + `ocsid` int(11) NOT NULL DEFAULT '0', + `plugin_ocsinventoryng_ocsservers_id` int(11) NOT NULL, + `ocs_deviceid` varchar(255) COLLATE utf8_unicode_ci NOT NULL, + `useragent` varchar(255) COLLATE utf8_unicode_ci NOT NULL, + `tag` varchar(255) COLLATE utf8_unicode_ci NOT NULL, + `serial` varchar(255) COLLATE utf8_unicode_ci NOT NULL, + `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL, + `ipaddr` varchar(255) COLLATE utf8_unicode_ci NOT NULL, + `domain` varchar(255) COLLATE utf8_unicode_ci NOT NULL, + `last_inventory` datetime DEFAULT NULL, + `reason` int(11) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `ocs_id` (`plugin_ocsinventoryng_ocsservers_id`,`ocsid`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_plugin_ocsinventoryng_ocsadmininfoslinks` +-- + +CREATE TABLE IF NOT EXISTS `glpi_plugin_ocsinventoryng_ocsadmininfoslinks` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `glpi_column` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `ocs_column` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `plugin_ocsinventoryng_ocsservers_id` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `plugin_ocsinventoryng_ocsservers_id` (`plugin_ocsinventoryng_ocsservers_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- +LOCK TABLES `glpi_plugin_ocsinventoryng_ocsadmininfoslinks` WRITE; +/*!40000 ALTER TABLE `glpi_plugin_ocsinventoryng_ocsadmininfoslinks` DISABLE KEYS */; +INSERT INTO `glpi_plugin_ocsinventoryng_ocsadmininfoslinks` VALUES (10,'contact_num','HARDWARE_ID',1),(9,'networks_id','HARDWARE_ID',1),(8,'groups_id','0',1),(7,'otherserial','HARDWARE_ID',1),(6,'locations_id','TAG',1); +/*!40000 ALTER TABLE `glpi_plugin_ocsinventoryng_ocsadmininfoslinks` ENABLE KEYS */; +UNLOCK TABLES; +-- +-- Structure de la table `glpi_plugin_ocsinventoryng_ocslinks` +-- + +CREATE TABLE IF NOT EXISTS `glpi_plugin_ocsinventoryng_ocslinks` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `computers_id` int(11) NOT NULL DEFAULT '0', + `ocsid` int(11) NOT NULL DEFAULT '0', + `ocs_deviceid` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `use_auto_update` tinyint(1) NOT NULL DEFAULT '1', + `last_update` datetime DEFAULT NULL, + `last_ocs_update` datetime DEFAULT NULL, + `last_ocs_conn` datetime DEFAULT NULL, + `ip_src` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `computer_update` longtext COLLATE utf8_unicode_ci, + `plugin_ocsinventoryng_ocsservers_id` int(11) NOT NULL DEFAULT '0', + `ocs_agent_version` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `entities_id` int(11) NOT NULL DEFAULT '0', + `tag` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `unicity` (`plugin_ocsinventoryng_ocsservers_id`,`ocsid`), + KEY `last_update` (`last_update`), + KEY `ocs_deviceid` (`ocs_deviceid`), + KEY `last_ocs_update` (`plugin_ocsinventoryng_ocsservers_id`,`last_ocs_update`), + KEY `computers_id` (`computers_id`), + KEY `use_auto_update` (`use_auto_update`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_plugin_ocsinventoryng_ocsservers` +-- + +CREATE TABLE IF NOT EXISTS `glpi_plugin_ocsinventoryng_ocsservers` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `ocs_db_user` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `ocs_db_passwd` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `ocs_db_host` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `ocs_db_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `ocs_db_utf8` tinyint(1) NOT NULL DEFAULT '0', + `checksum` int(11) NOT NULL DEFAULT '0', + `import_periph` tinyint(1) NOT NULL DEFAULT '0', + `import_monitor` tinyint(1) NOT NULL DEFAULT '0', + `import_software` tinyint(1) NOT NULL DEFAULT '0', + `import_printer` tinyint(1) NOT NULL DEFAULT '0', + `import_general_name` tinyint(1) NOT NULL DEFAULT '0', + `import_general_os` tinyint(1) NOT NULL DEFAULT '0', + `import_general_serial` tinyint(1) NOT NULL DEFAULT '0', + `import_general_model` tinyint(1) NOT NULL DEFAULT '0', + `import_general_manufacturer` tinyint(1) NOT NULL DEFAULT '0', + `import_general_type` tinyint(1) NOT NULL DEFAULT '0', + `import_general_domain` tinyint(1) NOT NULL DEFAULT '0', + `import_general_contact` tinyint(1) NOT NULL DEFAULT '0', + `import_general_comment` tinyint(1) NOT NULL DEFAULT '0', + `import_device_processor` tinyint(1) NOT NULL DEFAULT '0', + `import_device_memory` tinyint(1) NOT NULL DEFAULT '0', + `import_device_hdd` tinyint(1) NOT NULL DEFAULT '0', + `import_device_iface` tinyint(1) NOT NULL DEFAULT '0', + `import_device_gfxcard` tinyint(1) NOT NULL DEFAULT '0', + `import_device_sound` tinyint(1) NOT NULL DEFAULT '0', + `import_device_drive` tinyint(1) NOT NULL DEFAULT '0', + `import_device_port` tinyint(1) NOT NULL DEFAULT '0', + `import_device_modem` tinyint(1) NOT NULL DEFAULT '0', + `import_device_bios` tinyint(1) NOT NULL DEFAULT '1', + `import_registry` tinyint(1) NOT NULL DEFAULT '0', + `import_os_serial` tinyint(1) NOT NULL DEFAULT '0', + `import_ip` tinyint(1) NOT NULL DEFAULT '0', + `import_disk` tinyint(1) NOT NULL DEFAULT '0', + `import_monitor_comment` tinyint(1) NOT NULL DEFAULT '0', + `states_id_default` int(11) NOT NULL DEFAULT '0', + `tag_limit` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `tag_exclude` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `use_soft_dict` tinyint(1) NOT NULL DEFAULT '0', + `cron_sync_number` int(11) DEFAULT '1', + `deconnection_behavior` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `ocs_url` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `date_mod` datetime DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + `is_active` tinyint(1) NOT NULL DEFAULT '0', + `use_massimport` tinyint(1) NOT NULL DEFAULT '0', + `deleted_behavior` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '1', + `import_vms` tinyint(1) NOT NULL DEFAULT '0', + `import_general_uuid` tinyint(1) NOT NULL DEFAULT '0', + `ocs_version` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `conn_type` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `date_mod` (`date_mod`), + KEY `is_active` (`is_active`), + KEY `use_massimport` (`use_massimport`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=2 ; + +-- +-- Contenu de la table `glpi_plugin_ocsinventoryng_ocsservers` +-- + +INSERT INTO `glpi_plugin_ocsinventoryng_ocsservers` (`id`, `name`, `ocs_db_user`, `ocs_db_passwd`, `ocs_db_host`, `ocs_db_name`, `ocs_db_utf8`, `checksum`, `import_periph`, `import_monitor`, `import_software`, `import_printer`, `import_general_name`, `import_general_os`, `import_general_serial`, `import_general_model`, `import_general_manufacturer`, `import_general_type`, `import_general_domain`, `import_general_contact`, `import_general_comment`, `import_device_processor`, `import_device_memory`, `import_device_hdd`, `import_device_iface`, `import_device_gfxcard`, `import_device_sound`, `import_device_drive`, `import_device_port`, `import_device_modem`, `import_device_bios`, `import_registry`, `import_os_serial`, `import_ip`, `import_disk`, `import_monitor_comment`, `states_id_default`, `tag_limit`, `tag_exclude`, `use_soft_dict`, `cron_sync_number`, `deconnection_behavior`, `ocs_url`, `date_mod`, `comment`, `is_active`, `use_massimport`, `deleted_behavior`, `import_vms`, `import_general_uuid`, `ocs_version`, `conn_type`) VALUES (1, 'localhost', 'ocs', 'pwdocs', 'localhost', 'ocsweb', 0, 55687, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, NULL, NULL, 0, 1, NULL, NULL, '2016-01-22 12:59:15', '', 1, 0, '1', 0, 1, '7006', 0); + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_plugin_ocsinventoryng_ocsservers_profiles` +-- + +CREATE TABLE IF NOT EXISTS `glpi_plugin_ocsinventoryng_ocsservers_profiles` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `plugin_ocsinventoryng_ocsservers_id` int(11) NOT NULL DEFAULT '0', + `profiles_id` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `plugin_ocsinventoryng_ocsservers_id` (`plugin_ocsinventoryng_ocsservers_id`), + KEY `profiles_id` (`profiles_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=2 ; + +-- +-- Contenu de la table `glpi_plugin_ocsinventoryng_ocsservers_profiles` +-- + +INSERT INTO `glpi_plugin_ocsinventoryng_ocsservers_profiles` (`id`, `plugin_ocsinventoryng_ocsservers_id`, `profiles_id`) VALUES +(1, 1, 4); + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_plugin_ocsinventoryng_registrykeys` +-- + +CREATE TABLE IF NOT EXISTS `glpi_plugin_ocsinventoryng_registrykeys` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `computers_id` int(11) NOT NULL DEFAULT '0', + `hive` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `path` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `value` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `ocs_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `computers_id` (`computers_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_plugin_ocsinventoryng_servers` +-- + +CREATE TABLE IF NOT EXISTS `glpi_plugin_ocsinventoryng_servers` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `plugin_ocsinventoryng_ocsservers_id` int(11) NOT NULL DEFAULT '0', + `max_ocsid` int(11) DEFAULT NULL, + `max_glpidate` datetime DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `plugin_ocsinventoryng_ocsservers_id` (`plugin_ocsinventoryng_ocsservers_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_plugin_ocsinventoryng_threads` +-- + +CREATE TABLE IF NOT EXISTS `glpi_plugin_ocsinventoryng_threads` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `threadid` int(11) NOT NULL DEFAULT '0', + `start_time` datetime DEFAULT NULL, + `end_time` datetime DEFAULT NULL, + `status` int(11) NOT NULL DEFAULT '0', + `error_msg` text COLLATE utf8_unicode_ci NOT NULL, + `imported_machines_number` int(11) NOT NULL DEFAULT '0', + `synchronized_machines_number` int(11) NOT NULL DEFAULT '0', + `failed_rules_machines_number` int(11) NOT NULL DEFAULT '0', + `linked_machines_number` int(11) NOT NULL DEFAULT '0', + `notupdated_machines_number` int(11) NOT NULL DEFAULT '0', + `not_unique_machines_number` int(11) NOT NULL DEFAULT '0', + `link_refused_machines_number` int(11) NOT NULL DEFAULT '0', + `total_number_machines` int(11) NOT NULL DEFAULT '0', + `plugin_ocsinventoryng_ocsservers_id` int(11) NOT NULL DEFAULT '1', + `processid` int(11) NOT NULL DEFAULT '0', + `entities_id` int(11) NOT NULL DEFAULT '0', + `rules_id` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `end_time` (`end_time`), + KEY `process_thread` (`processid`,`threadid`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_printermodels` +-- + +CREATE TABLE IF NOT EXISTS `glpi_printermodels` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `name` (`name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_printers` +-- + +CREATE TABLE IF NOT EXISTS `glpi_printers` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `date_mod` datetime DEFAULT NULL, + `contact` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `contact_num` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `users_id_tech` int(11) NOT NULL DEFAULT '0', + `groups_id_tech` int(11) NOT NULL DEFAULT '0', + `serial` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `otherserial` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `have_serial` tinyint(1) NOT NULL DEFAULT '0', + `have_parallel` tinyint(1) NOT NULL DEFAULT '0', + `have_usb` tinyint(1) NOT NULL DEFAULT '0', + `have_wifi` tinyint(1) NOT NULL DEFAULT '0', + `have_ethernet` tinyint(1) NOT NULL DEFAULT '0', + `comment` text COLLATE utf8_unicode_ci, + `memory_size` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `locations_id` int(11) NOT NULL DEFAULT '0', + `domains_id` int(11) NOT NULL DEFAULT '0', + `networks_id` int(11) NOT NULL DEFAULT '0', + `printertypes_id` int(11) NOT NULL DEFAULT '0', + `printermodels_id` int(11) NOT NULL DEFAULT '0', + `manufacturers_id` int(11) NOT NULL DEFAULT '0', + `is_global` tinyint(1) NOT NULL DEFAULT '0', + `is_deleted` tinyint(1) NOT NULL DEFAULT '0', + `is_template` tinyint(1) NOT NULL DEFAULT '0', + `template_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `init_pages_counter` int(11) NOT NULL DEFAULT '0', + `last_pages_counter` int(11) NOT NULL DEFAULT '0', + `users_id` int(11) NOT NULL DEFAULT '0', + `groups_id` int(11) NOT NULL DEFAULT '0', + `states_id` int(11) NOT NULL DEFAULT '0', + `ticket_tco` decimal(20,4) DEFAULT '0.0000', + `is_dynamic` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `name` (`name`), + KEY `is_template` (`is_template`), + KEY `is_global` (`is_global`), + KEY `domains_id` (`domains_id`), + KEY `entities_id` (`entities_id`), + KEY `manufacturers_id` (`manufacturers_id`), + KEY `groups_id` (`groups_id`), + KEY `users_id` (`users_id`), + KEY `locations_id` (`locations_id`), + KEY `printermodels_id` (`printermodels_id`), + KEY `networks_id` (`networks_id`), + KEY `states_id` (`states_id`), + KEY `users_id_tech` (`users_id_tech`), + KEY `printertypes_id` (`printertypes_id`), + KEY `is_deleted` (`is_deleted`), + KEY `date_mod` (`date_mod`), + KEY `groups_id_tech` (`groups_id_tech`), + KEY `last_pages_counter` (`last_pages_counter`), + KEY `is_dynamic` (`is_dynamic`), + KEY `serial` (`serial`), + KEY `otherserial` (`otherserial`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_printertypes` +-- + +CREATE TABLE IF NOT EXISTS `glpi_printertypes` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `name` (`name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_problemcosts` +-- + +CREATE TABLE IF NOT EXISTS `glpi_problemcosts` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `problems_id` int(11) NOT NULL DEFAULT '0', + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + `begin_date` date DEFAULT NULL, + `end_date` date DEFAULT NULL, + `actiontime` int(11) NOT NULL DEFAULT '0', + `cost_time` decimal(20,4) NOT NULL DEFAULT '0.0000', + `cost_fixed` decimal(20,4) NOT NULL DEFAULT '0.0000', + `cost_material` decimal(20,4) NOT NULL DEFAULT '0.0000', + `budgets_id` int(11) NOT NULL DEFAULT '0', + `entities_id` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `name` (`name`), + KEY `problems_id` (`problems_id`), + KEY `begin_date` (`begin_date`), + KEY `end_date` (`end_date`), + KEY `entities_id` (`entities_id`), + KEY `budgets_id` (`budgets_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_problems` +-- + +CREATE TABLE IF NOT EXISTS `glpi_problems` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `is_deleted` tinyint(1) NOT NULL DEFAULT '0', + `status` int(11) NOT NULL DEFAULT '1', + `content` longtext COLLATE utf8_unicode_ci, + `date_mod` datetime DEFAULT NULL, + `date` datetime DEFAULT NULL, + `solvedate` datetime DEFAULT NULL, + `closedate` datetime DEFAULT NULL, + `due_date` datetime DEFAULT NULL, + `users_id_recipient` int(11) NOT NULL DEFAULT '0', + `users_id_lastupdater` int(11) NOT NULL DEFAULT '0', + `urgency` int(11) NOT NULL DEFAULT '1', + `impact` int(11) NOT NULL DEFAULT '1', + `priority` int(11) NOT NULL DEFAULT '1', + `itilcategories_id` int(11) NOT NULL DEFAULT '0', + `impactcontent` longtext COLLATE utf8_unicode_ci, + `causecontent` longtext COLLATE utf8_unicode_ci, + `symptomcontent` longtext COLLATE utf8_unicode_ci, + `solutiontypes_id` int(11) NOT NULL DEFAULT '0', + `solution` longtext COLLATE utf8_unicode_ci, + `actiontime` int(11) NOT NULL DEFAULT '0', + `begin_waiting_date` datetime DEFAULT NULL, + `waiting_duration` int(11) NOT NULL DEFAULT '0', + `close_delay_stat` int(11) NOT NULL DEFAULT '0', + `solve_delay_stat` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `name` (`name`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`), + KEY `is_deleted` (`is_deleted`), + KEY `date` (`date`), + KEY `closedate` (`closedate`), + KEY `status` (`status`), + KEY `priority` (`priority`), + KEY `date_mod` (`date_mod`), + KEY `itilcategories_id` (`itilcategories_id`), + KEY `users_id_recipient` (`users_id_recipient`), + KEY `solvedate` (`solvedate`), + KEY `solutiontypes_id` (`solutiontypes_id`), + KEY `urgency` (`urgency`), + KEY `impact` (`impact`), + KEY `due_date` (`due_date`), + KEY `users_id_lastupdater` (`users_id_lastupdater`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_problems_suppliers` +-- + +CREATE TABLE IF NOT EXISTS `glpi_problems_suppliers` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `problems_id` int(11) NOT NULL DEFAULT '0', + `suppliers_id` int(11) NOT NULL DEFAULT '0', + `type` int(11) NOT NULL DEFAULT '1', + `use_notification` tinyint(1) NOT NULL DEFAULT '0', + `alternative_email` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `unicity` (`problems_id`,`type`,`suppliers_id`), + KEY `group` (`suppliers_id`,`type`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_problems_tickets` +-- + +CREATE TABLE IF NOT EXISTS `glpi_problems_tickets` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `problems_id` int(11) NOT NULL DEFAULT '0', + `tickets_id` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `unicity` (`problems_id`,`tickets_id`), + KEY `tickets_id` (`tickets_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_problems_users` +-- + +CREATE TABLE IF NOT EXISTS `glpi_problems_users` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `problems_id` int(11) NOT NULL DEFAULT '0', + `users_id` int(11) NOT NULL DEFAULT '0', + `type` int(11) NOT NULL DEFAULT '1', + `use_notification` tinyint(1) NOT NULL DEFAULT '0', + `alternative_email` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `unicity` (`problems_id`,`type`,`users_id`,`alternative_email`), + KEY `user` (`users_id`,`type`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_problemtasks` +-- + +CREATE TABLE IF NOT EXISTS `glpi_problemtasks` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `problems_id` int(11) NOT NULL DEFAULT '0', + `taskcategories_id` int(11) NOT NULL DEFAULT '0', + `date` datetime DEFAULT NULL, + `begin` datetime DEFAULT NULL, + `end` datetime DEFAULT NULL, + `users_id` int(11) NOT NULL DEFAULT '0', + `users_id_tech` int(11) NOT NULL DEFAULT '0', + `content` longtext COLLATE utf8_unicode_ci, + `actiontime` int(11) NOT NULL DEFAULT '0', + `state` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `problems_id` (`problems_id`), + KEY `users_id` (`users_id`), + KEY `users_id_tech` (`users_id_tech`), + KEY `date` (`date`), + KEY `begin` (`begin`), + KEY `end` (`end`), + KEY `state` (`state`), + KEY `taskcategories_id` (`taskcategories_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_profilerights` +-- + +CREATE TABLE IF NOT EXISTS `glpi_profilerights` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `profiles_id` int(11) NOT NULL DEFAULT '0', + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `rights` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `unicity` (`profiles_id`,`name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=790 ; + +-- +-- Contenu de la table `glpi_profilerights` +-- + +INSERT INTO `glpi_profilerights` (`id`, `profiles_id`, `name`, `rights`) VALUES +(1, 1, 'computer', 0), +(2, 1, 'monitor', 0), +(3, 1, 'software', 0), +(4, 1, 'networking', 0), +(5, 1, 'internet', 0), +(6, 1, 'printer', 0), +(7, 1, 'peripheral', 0), +(8, 1, 'cartridge', 0), +(9, 1, 'consumable', 0), +(10, 1, 'phone', 0), +(734, 6, 'queuedmail', 0), +(12, 1, 'contact_enterprise', 0), +(13, 1, 'document', 0), +(14, 1, 'contract', 0), +(15, 1, 'infocom', 0), +(16, 1, 'knowbase', 2048), +(20, 1, 'reservation', 1024), +(21, 1, 'reports', 0), +(22, 1, 'dropdown', 0), +(24, 1, 'device', 0), +(25, 1, 'typedoc', 0), +(26, 1, 'link', 0), +(27, 1, 'config', 0), +(29, 1, 'rule_ticket', 0), +(30, 1, 'rule_import', 0), +(31, 1, 'rule_ldap', 0), +(32, 1, 'rule_softwarecategories', 0), +(33, 1, 'search_config', 0), +(684, 5, 'location', 0), +(679, 7, 'domain', 31), +(36, 1, 'profile', 0), +(37, 1, 'user', 0), +(39, 1, 'group', 0), +(40, 1, 'entity', 0), +(41, 1, 'transfer', 0), +(42, 1, 'logs', 0), +(43, 1, 'reminder_public', 1), +(44, 1, 'rssfeed_public', 1), +(45, 1, 'bookmark_public', 0), +(46, 1, 'backup', 0), +(47, 1, 'ticket', 5), +(51, 1, 'followup', 5), +(52, 1, 'task', 1), +(64, 1, 'planning', 0), +(716, 2, 'state', 0), +(709, 2, 'taskcategory', 0), +(67, 1, 'statistic', 0), +(68, 1, 'password_update', 1), +(70, 1, 'show_group_hardware', 0), +(71, 1, 'rule_dictionnary_software', 0), +(72, 1, 'rule_dictionnary_dropdown', 0), +(73, 1, 'budget', 0), +(75, 1, 'notification', 0), +(76, 1, 'rule_mailcollector', 0), +(728, 7, 'solutiontemplate', 31), +(79, 1, 'calendar', 0), +(80, 1, 'sla', 0), +(81, 1, 'rule_dictionnary_printer', 0), +(85, 1, 'problem', 0), +(702, 2, 'netpoint', 0), +(697, 4, 'knowbasecategory', 31), +(691, 5, 'itilcategory', 0), +(89, 1, 'tickettemplate', 0), +(90, 1, 'ticketrecurrent', 0), +(91, 1, 'ticketcost', 1), +(671, 6, 'changevalidation', 20), +(94, 1, 'ticketvalidation', 0), +(95, 2, 'computer', 33), +(96, 2, 'monitor', 33), +(97, 2, 'software', 33), +(98, 2, 'networking', 33), +(99, 2, 'internet', 1), +(100, 2, 'printer', 33), +(101, 2, 'peripheral', 33), +(102, 2, 'cartridge', 33), +(103, 2, 'consumable', 33), +(104, 2, 'phone', 33), +(733, 5, 'queuedmail', 0), +(106, 2, 'contact_enterprise', 33), +(107, 2, 'document', 33), +(108, 2, 'contract', 33), +(109, 2, 'infocom', 1), +(110, 2, 'knowbase', 2049), +(114, 2, 'reservation', 1025), +(115, 2, 'reports', 1), +(116, 2, 'dropdown', 0), +(118, 2, 'device', 0), +(119, 2, 'typedoc', 1), +(120, 2, 'link', 1), +(121, 2, 'config', 0), +(123, 2, 'rule_ticket', 0), +(124, 2, 'rule_import', 0), +(125, 2, 'rule_ldap', 0), +(126, 2, 'rule_softwarecategories', 0), +(127, 2, 'search_config', 1055), +(683, 4, 'location', 31), +(678, 6, 'domain', 0), +(130, 2, 'profile', 0), +(131, 2, 'user', 2049), +(133, 2, 'group', 1), +(134, 2, 'entity', 32), +(135, 2, 'transfer', 0), +(136, 2, 'logs', 0), +(137, 2, 'reminder_public', 0), +(138, 2, 'rssfeed_public', 0), +(139, 2, 'bookmark_public', 0), +(140, 2, 'backup', 1024), +(141, 2, 'ticket', 37917), +(145, 2, 'followup', 5), +(146, 2, 'task', 1), +(748, 6, 'projecttask', 1025), +(749, 7, 'projecttask', 1025), +(158, 2, 'planning', 1), +(715, 1, 'state', 0), +(708, 1, 'taskcategory', 0), +(161, 2, 'statistic', 1), +(162, 2, 'password_update', 1), +(164, 2, 'show_group_hardware', 0), +(165, 2, 'rule_dictionnary_software', 0), +(166, 2, 'rule_dictionnary_dropdown', 0), +(167, 2, 'budget', 33), +(169, 2, 'notification', 0), +(170, 2, 'rule_mailcollector', 0), +(726, 5, 'solutiontemplate', 0), +(727, 6, 'solutiontemplate', 0), +(173, 2, 'calendar', 0), +(174, 2, 'sla', 0), +(175, 2, 'rule_dictionnary_printer', 0), +(179, 2, 'problem', 1057), +(701, 1, 'netpoint', 0), +(696, 3, 'knowbasecategory', 31), +(690, 4, 'itilcategory', 31), +(183, 2, 'tickettemplate', 0), +(184, 2, 'ticketrecurrent', 0), +(185, 2, 'ticketcost', 1), +(669, 4, 'changevalidation', 1044), +(670, 5, 'changevalidation', 20), +(188, 2, 'ticketvalidation', 15384), +(189, 3, 'computer', 127), +(190, 3, 'monitor', 127), +(191, 3, 'software', 127), +(192, 3, 'networking', 127), +(193, 3, 'internet', 31), +(194, 3, 'printer', 127), +(195, 3, 'peripheral', 127), +(196, 3, 'cartridge', 127), +(197, 3, 'consumable', 127), +(198, 3, 'phone', 127), +(732, 4, 'queuedmail', 31), +(200, 3, 'contact_enterprise', 127), +(201, 3, 'document', 127), +(202, 3, 'contract', 127), +(203, 3, 'infocom', 31), +(204, 3, 'knowbase', 6175), +(208, 3, 'reservation', 1055), +(209, 3, 'reports', 1), +(210, 3, 'dropdown', 31), +(212, 3, 'device', 31), +(213, 3, 'typedoc', 31), +(214, 3, 'link', 31), +(215, 3, 'config', 0), +(217, 3, 'rule_ticket', 0), +(218, 3, 'rule_import', 0), +(219, 3, 'rule_ldap', 0), +(220, 3, 'rule_softwarecategories', 0), +(221, 3, 'search_config', 3103), +(682, 3, 'location', 31), +(677, 5, 'domain', 0), +(224, 3, 'profile', 1), +(225, 3, 'user', 7199), +(227, 3, 'group', 31), +(228, 3, 'entity', 96), +(229, 3, 'transfer', 0), +(230, 3, 'logs', 0), +(231, 3, 'reminder_public', 0), +(232, 3, 'rssfeed_public', 0), +(233, 3, 'bookmark_public', 0), +(234, 3, 'backup', 1024), +(235, 3, 'ticket', 128031), +(239, 3, 'followup', 15383), +(240, 3, 'task', 13329), +(745, 3, 'projecttask', 1025), +(746, 4, 'projecttask', 1025), +(747, 5, 'projecttask', 0), +(252, 3, 'planning', 3073), +(714, 7, 'taskcategory', 31), +(707, 7, 'netpoint', 31), +(255, 3, 'statistic', 1), +(256, 3, 'password_update', 1), +(258, 3, 'show_group_hardware', 0), +(259, 3, 'rule_dictionnary_software', 0), +(260, 3, 'rule_dictionnary_dropdown', 0), +(261, 3, 'budget', 127), +(263, 3, 'notification', 0), +(264, 3, 'rule_mailcollector', 0), +(724, 3, 'solutiontemplate', 31), +(725, 4, 'solutiontemplate', 31), +(267, 3, 'calendar', 31), +(268, 3, 'sla', 0), +(269, 3, 'rule_dictionnary_printer', 0), +(273, 3, 'problem', 1151), +(695, 2, 'knowbasecategory', 0), +(689, 3, 'itilcategory', 31), +(277, 3, 'tickettemplate', 0), +(278, 3, 'ticketrecurrent', 0), +(279, 3, 'ticketcost', 31), +(667, 2, 'changevalidation', 1044), +(668, 3, 'changevalidation', 1044), +(282, 3, 'ticketvalidation', 15384), +(283, 4, 'computer', 127), +(284, 4, 'monitor', 127), +(285, 4, 'software', 127), +(286, 4, 'networking', 127), +(287, 4, 'internet', 31), +(288, 4, 'printer', 127), +(289, 4, 'peripheral', 127), +(290, 4, 'cartridge', 127), +(291, 4, 'consumable', 127), +(292, 4, 'phone', 127), +(294, 4, 'contact_enterprise', 127), +(295, 4, 'document', 127), +(296, 4, 'contract', 127), +(297, 4, 'infocom', 31), +(298, 4, 'knowbase', 7199), +(302, 4, 'reservation', 1055), +(303, 4, 'reports', 1), +(304, 4, 'dropdown', 31), +(306, 4, 'device', 31), +(307, 4, 'typedoc', 31), +(308, 4, 'link', 31), +(309, 4, 'config', 31), +(311, 4, 'rule_ticket', 1055), +(312, 4, 'rule_import', 31), +(313, 4, 'rule_ldap', 31), +(314, 4, 'rule_softwarecategories', 31), +(315, 4, 'search_config', 3103), +(681, 2, 'location', 0), +(676, 4, 'domain', 31), +(318, 4, 'profile', 31), +(319, 4, 'user', 7199), +(321, 4, 'group', 31), +(322, 4, 'entity', 3199), +(323, 4, 'transfer', 31), +(324, 4, 'logs', 1), +(325, 4, 'reminder_public', 31), +(326, 4, 'rssfeed_public', 31), +(327, 4, 'bookmark_public', 31), +(328, 4, 'backup', 1055), +(329, 4, 'ticket', 128031), +(333, 4, 'followup', 15383), +(334, 4, 'task', 13329), +(742, 7, 'project', 1151), +(743, 1, 'projecttask', 0), +(744, 2, 'projecttask', 1025), +(346, 4, 'planning', 3073), +(713, 6, 'taskcategory', 0), +(706, 6, 'netpoint', 0), +(349, 4, 'statistic', 1), +(350, 4, 'password_update', 1), +(352, 4, 'show_group_hardware', 0), +(353, 4, 'rule_dictionnary_software', 31), +(354, 4, 'rule_dictionnary_dropdown', 31), +(355, 4, 'budget', 127), +(357, 4, 'notification', 31), +(358, 4, 'rule_mailcollector', 31), +(722, 1, 'solutiontemplate', 0), +(723, 2, 'solutiontemplate', 0), +(361, 4, 'calendar', 31), +(362, 4, 'sla', 31), +(363, 4, 'rule_dictionnary_printer', 31), +(367, 4, 'problem', 1151), +(694, 1, 'knowbasecategory', 0), +(688, 2, 'itilcategory', 0), +(371, 4, 'tickettemplate', 31), +(372, 4, 'ticketrecurrent', 31), +(373, 4, 'ticketcost', 31), +(665, 7, 'change', 1151), +(666, 1, 'changevalidation', 0), +(376, 4, 'ticketvalidation', 15384), +(377, 5, 'computer', 0), +(378, 5, 'monitor', 0), +(379, 5, 'software', 0), +(380, 5, 'networking', 0), +(381, 5, 'internet', 0), +(382, 5, 'printer', 0), +(383, 5, 'peripheral', 0), +(384, 5, 'cartridge', 0), +(385, 5, 'consumable', 0), +(386, 5, 'phone', 0), +(731, 3, 'queuedmail', 0), +(388, 5, 'contact_enterprise', 0), +(389, 5, 'document', 0), +(390, 5, 'contract', 0), +(391, 5, 'infocom', 0), +(392, 5, 'knowbase', 0), +(396, 5, 'reservation', 0), +(397, 5, 'reports', 0), +(398, 5, 'dropdown', 0), +(400, 5, 'device', 0), +(401, 5, 'typedoc', 0), +(402, 5, 'link', 0), +(403, 5, 'config', 0), +(405, 5, 'rule_ticket', 0), +(406, 5, 'rule_import', 0), +(407, 5, 'rule_ldap', 0), +(408, 5, 'rule_softwarecategories', 0), +(409, 5, 'search_config', 0), +(680, 1, 'location', 0), +(675, 3, 'domain', 31), +(412, 5, 'profile', 0), +(413, 5, 'user', 1025), +(415, 5, 'group', 0), +(416, 5, 'entity', 0), +(417, 5, 'transfer', 0), +(418, 5, 'logs', 0), +(419, 5, 'reminder_public', 0), +(420, 5, 'rssfeed_public', 0), +(421, 5, 'bookmark_public', 0), +(422, 5, 'backup', 0), +(423, 5, 'ticket', 9223), +(427, 5, 'followup', 12295), +(428, 5, 'task', 8193), +(739, 4, 'project', 1151), +(740, 5, 'project', 1150), +(741, 6, 'project', 1151), +(440, 5, 'planning', 1), +(712, 5, 'taskcategory', 0), +(705, 5, 'netpoint', 0), +(443, 5, 'statistic', 1), +(444, 5, 'password_update', 1), +(446, 5, 'show_group_hardware', 0), +(447, 5, 'rule_dictionnary_software', 0), +(448, 5, 'rule_dictionnary_dropdown', 0), +(449, 5, 'budget', 0), +(451, 5, 'notification', 0), +(452, 5, 'rule_mailcollector', 0), +(720, 6, 'state', 0), +(721, 7, 'state', 31), +(455, 5, 'calendar', 0), +(456, 5, 'sla', 0), +(457, 5, 'rule_dictionnary_printer', 0), +(461, 5, 'problem', 1024), +(700, 7, 'knowbasecategory', 31), +(687, 1, 'itilcategory', 0), +(465, 5, 'tickettemplate', 1), +(466, 5, 'ticketrecurrent', 0), +(467, 5, 'ticketcost', 31), +(663, 5, 'change', 1054), +(664, 6, 'change', 1151), +(470, 5, 'ticketvalidation', 3088), +(471, 6, 'computer', 127), +(472, 6, 'monitor', 127), +(473, 6, 'software', 127), +(474, 6, 'networking', 127), +(475, 6, 'internet', 31), +(476, 6, 'printer', 127), +(477, 6, 'peripheral', 127), +(478, 6, 'cartridge', 127), +(479, 6, 'consumable', 127), +(480, 6, 'phone', 127), +(730, 2, 'queuedmail', 0), +(482, 6, 'contact_enterprise', 96), +(483, 6, 'document', 127), +(484, 6, 'contract', 96), +(485, 6, 'infocom', 0), +(486, 6, 'knowbase', 6175), +(490, 6, 'reservation', 1055), +(491, 6, 'reports', 1), +(492, 6, 'dropdown', 0), +(494, 6, 'device', 0), +(495, 6, 'typedoc', 0), +(496, 6, 'link', 0), +(497, 6, 'config', 0), +(499, 6, 'rule_ticket', 0), +(500, 6, 'rule_import', 0), +(501, 6, 'rule_ldap', 0), +(502, 6, 'rule_softwarecategories', 0), +(503, 6, 'search_config', 0), +(674, 2, 'domain', 0), +(506, 6, 'profile', 0), +(507, 6, 'user', 1055), +(509, 6, 'group', 1), +(510, 6, 'entity', 97), +(511, 6, 'transfer', 1), +(512, 6, 'logs', 0), +(513, 6, 'reminder_public', 31), +(514, 6, 'rssfeed_public', 31), +(515, 6, 'bookmark_public', 0), +(516, 6, 'backup', 0), +(517, 6, 'ticket', 37895), +(521, 6, 'followup', 13319), +(522, 6, 'task', 13329), +(736, 1, 'project', 0), +(737, 2, 'project', 1025), +(738, 3, 'project', 1151), +(534, 6, 'planning', 1), +(711, 4, 'taskcategory', 31), +(704, 4, 'netpoint', 31), +(537, 6, 'statistic', 1), +(538, 6, 'password_update', 1), +(540, 6, 'show_group_hardware', 0), +(541, 6, 'rule_dictionnary_software', 0), +(542, 6, 'rule_dictionnary_dropdown', 0), +(543, 6, 'budget', 96), +(545, 6, 'notification', 0), +(546, 6, 'rule_mailcollector', 0), +(718, 4, 'state', 31), +(719, 5, 'state', 0), +(549, 6, 'calendar', 0), +(550, 6, 'sla', 1), +(551, 6, 'rule_dictionnary_printer', 0), +(555, 6, 'problem', 1121), +(699, 6, 'knowbasecategory', 0), +(693, 7, 'itilcategory', 31), +(686, 7, 'location', 31), +(559, 6, 'tickettemplate', 1), +(560, 6, 'ticketrecurrent', 1), +(561, 6, 'ticketcost', 31), +(661, 3, 'change', 1151), +(662, 4, 'change', 1151), +(564, 6, 'ticketvalidation', 3088), +(565, 7, 'computer', 127), +(566, 7, 'monitor', 127), +(567, 7, 'software', 127), +(568, 7, 'networking', 127), +(569, 7, 'internet', 31), +(570, 7, 'printer', 127), +(571, 7, 'peripheral', 127), +(572, 7, 'cartridge', 127), +(573, 7, 'consumable', 127), +(574, 7, 'phone', 127), +(729, 1, 'queuedmail', 0), +(576, 7, 'contact_enterprise', 96), +(577, 7, 'document', 127), +(578, 7, 'contract', 96), +(579, 7, 'infocom', 0), +(580, 7, 'knowbase', 6175), +(584, 7, 'reservation', 1055), +(585, 7, 'reports', 1), +(586, 7, 'dropdown', 0), +(588, 7, 'device', 0), +(589, 7, 'typedoc', 0), +(590, 7, 'link', 0), +(591, 7, 'config', 0), +(593, 7, 'rule_ticket', 1055), +(594, 7, 'rule_import', 0), +(595, 7, 'rule_ldap', 0), +(596, 7, 'rule_softwarecategories', 0), +(597, 7, 'search_config', 0), +(673, 1, 'domain', 0), +(600, 7, 'profile', 0), +(601, 7, 'user', 1055), +(603, 7, 'group', 1), +(604, 7, 'entity', 97), +(605, 7, 'transfer', 1), +(606, 7, 'logs', 1), +(607, 7, 'reminder_public', 31), +(608, 7, 'rssfeed_public', 31), +(609, 7, 'bookmark_public', 0), +(610, 7, 'backup', 0), +(611, 7, 'ticket', 128031), +(615, 7, 'followup', 13335), +(616, 7, 'task', 13329), +(735, 7, 'queuedmail', 0), +(628, 7, 'planning', 2049), +(710, 3, 'taskcategory', 31), +(703, 3, 'netpoint', 31), +(631, 7, 'statistic', 1), +(632, 7, 'password_update', 1), +(634, 7, 'show_group_hardware', 0), +(635, 7, 'rule_dictionnary_software', 0), +(636, 7, 'rule_dictionnary_dropdown', 0), +(637, 7, 'budget', 96), +(639, 7, 'notification', 0), +(640, 7, 'rule_mailcollector', 31), +(672, 7, 'changevalidation', 1044), +(717, 3, 'state', 31), +(643, 7, 'calendar', 31), +(644, 7, 'sla', 31), +(645, 7, 'rule_dictionnary_printer', 0), +(649, 7, 'problem', 1151), +(698, 5, 'knowbasecategory', 0), +(692, 6, 'itilcategory', 0), +(685, 6, 'location', 0), +(653, 7, 'tickettemplate', 31), +(654, 7, 'ticketrecurrent', 31), +(655, 7, 'ticketcost', 31), +(659, 1, 'change', 0), +(660, 2, 'change', 1057), +(658, 7, 'ticketvalidation', 15384), +(750, 1, 'plugin_ocsinventoryng', 0), +(751, 2, 'plugin_ocsinventoryng', 0), +(752, 3, 'plugin_ocsinventoryng', 0), +(785, 4, 'plugin_ocsinventoryng', 23), +(754, 5, 'plugin_ocsinventoryng', 0), +(755, 6, 'plugin_ocsinventoryng', 0), +(756, 7, 'plugin_ocsinventoryng', 0), +(757, 1, 'plugin_ocsinventoryng_sync', 0), +(758, 2, 'plugin_ocsinventoryng_sync', 0), +(759, 3, 'plugin_ocsinventoryng_sync', 0), +(786, 4, 'plugin_ocsinventoryng_sync', 3), +(761, 5, 'plugin_ocsinventoryng_sync', 0), +(762, 6, 'plugin_ocsinventoryng_sync', 0), +(763, 7, 'plugin_ocsinventoryng_sync', 0), +(764, 1, 'plugin_ocsinventoryng_view', 0), +(765, 2, 'plugin_ocsinventoryng_view', 0), +(766, 3, 'plugin_ocsinventoryng_view', 0), +(787, 4, 'plugin_ocsinventoryng_view', 1), +(768, 5, 'plugin_ocsinventoryng_view', 0), +(769, 6, 'plugin_ocsinventoryng_view', 0), +(770, 7, 'plugin_ocsinventoryng_view', 0), +(771, 1, 'plugin_ocsinventoryng_clean', 0), +(772, 2, 'plugin_ocsinventoryng_clean', 0), +(773, 3, 'plugin_ocsinventoryng_clean', 0), +(788, 4, 'plugin_ocsinventoryng_clean', 3), +(775, 5, 'plugin_ocsinventoryng_clean', 0), +(776, 6, 'plugin_ocsinventoryng_clean', 0), +(777, 7, 'plugin_ocsinventoryng_clean', 0), +(778, 1, 'plugin_ocsinventoryng_rule', 0), +(779, 2, 'plugin_ocsinventoryng_rule', 0), +(780, 3, 'plugin_ocsinventoryng_rule', 0), +(789, 4, 'plugin_ocsinventoryng_rule', 3), +(782, 5, 'plugin_ocsinventoryng_rule', 0), +(783, 6, 'plugin_ocsinventoryng_rule', 0), +(784, 7, 'plugin_ocsinventoryng_rule', 0); + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_profiles` +-- + +CREATE TABLE IF NOT EXISTS `glpi_profiles` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `interface` varchar(255) COLLATE utf8_unicode_ci DEFAULT 'helpdesk', + `is_default` tinyint(1) NOT NULL DEFAULT '0', + `helpdesk_hardware` int(11) NOT NULL DEFAULT '0', + `helpdesk_item_type` text COLLATE utf8_unicode_ci, + `ticket_status` text COLLATE utf8_unicode_ci COMMENT 'json encoded array of from/dest allowed status change', + `date_mod` datetime DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + `problem_status` text COLLATE utf8_unicode_ci COMMENT 'json encoded array of from/dest allowed status change', + `create_ticket_on_login` tinyint(1) NOT NULL DEFAULT '0', + `tickettemplates_id` int(11) NOT NULL DEFAULT '0', + `change_status` text COLLATE utf8_unicode_ci COMMENT 'json encoded array of from/dest allowed status change', + PRIMARY KEY (`id`), + KEY `interface` (`interface`), + KEY `is_default` (`is_default`), + KEY `date_mod` (`date_mod`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=8 ; + +-- +-- Contenu de la table `glpi_profiles` +-- + +INSERT INTO `glpi_profiles` (`id`, `name`, `interface`, `is_default`, `helpdesk_hardware`, `helpdesk_item_type`, `ticket_status`, `date_mod`, `comment`, `problem_status`, `create_ticket_on_login`, `tickettemplates_id`, `change_status`) VALUES +(1, 'Self-Service', 'helpdesk', 1, 1, '["Computer","Monitor","NetworkEquipment","Peripheral","Phone","Printer","Software"]', '{"1":{"2":0,"3":0,"4":0,"5":0,"6":0},"2":{"1":0,"3":0,"4":0,"5":0,"6":0},"3":{"1":0,"2":0,"4":0,"5":0,"6":0},"4":{"1":0,"2":0,"3":0,"5":0,"6":0},"5":{"1":0,"2":0,"3":0,"4":0},"6":{"1":0,"2":0,"3":0,"4":0,"5":0}}', NULL, NULL, '[]', 0, 0, NULL), +(2, 'Observer', 'central', 0, 1, '["Computer","Monitor","NetworkEquipment","Peripheral","Phone","Printer","Software"]', '[]', NULL, NULL, '[]', 0, 0, NULL), +(3, 'Admin', 'central', 0, 3, '["Computer","Monitor","NetworkEquipment","Peripheral","Phone","Printer","Software"]', '[]', NULL, NULL, '[]', 0, 0, NULL), +(4, 'Super-Admin', 'central', 0, 3, '["Computer","Monitor","NetworkEquipment","Peripheral","Phone","Printer","Software"]', '[]', NULL, NULL, '[]', 0, 0, NULL), +(5, 'Hotliner', 'central', 0, 3, '["Computer","Monitor","NetworkEquipment","Peripheral","Phone","Printer","Software"]', '[]', NULL, NULL, '[]', 1, 0, NULL), +(6, 'Technician', 'central', 0, 3, '["Computer","Monitor","NetworkEquipment","Peripheral","Phone","Printer","Software"]', '[]', NULL, NULL, '[]', 0, 0, NULL), +(7, 'Supervisor', 'central', 0, 3, '["Computer","Monitor","NetworkEquipment","Peripheral","Phone","Printer","Software"]', '[]', NULL, NULL, '[]', 0, 0, NULL); + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_profiles_reminders` +-- + +CREATE TABLE IF NOT EXISTS `glpi_profiles_reminders` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `reminders_id` int(11) NOT NULL DEFAULT '0', + `profiles_id` int(11) NOT NULL DEFAULT '0', + `entities_id` int(11) NOT NULL DEFAULT '-1', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `reminders_id` (`reminders_id`), + KEY `profiles_id` (`profiles_id`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_profiles_rssfeeds` +-- + +CREATE TABLE IF NOT EXISTS `glpi_profiles_rssfeeds` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `rssfeeds_id` int(11) NOT NULL DEFAULT '0', + `profiles_id` int(11) NOT NULL DEFAULT '0', + `entities_id` int(11) NOT NULL DEFAULT '-1', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `rssfeeds_id` (`rssfeeds_id`), + KEY `profiles_id` (`profiles_id`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_profiles_users` +-- + +CREATE TABLE IF NOT EXISTS `glpi_profiles_users` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `users_id` int(11) NOT NULL DEFAULT '0', + `profiles_id` int(11) NOT NULL DEFAULT '0', + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '1', + `is_dynamic` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `entities_id` (`entities_id`), + KEY `profiles_id` (`profiles_id`), + KEY `users_id` (`users_id`), + KEY `is_recursive` (`is_recursive`), + KEY `is_dynamic` (`is_dynamic`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=6 ; + +-- +-- Contenu de la table `glpi_profiles_users` +-- + +INSERT INTO `glpi_profiles_users` (`id`, `users_id`, `profiles_id`, `entities_id`, `is_recursive`, `is_dynamic`) VALUES +(2, 2, 4, 0, 1, 0), +(3, 3, 1, 0, 1, 0), +(4, 4, 6, 0, 1, 0), +(5, 5, 2, 0, 1, 0); + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_projectcosts` +-- + +CREATE TABLE IF NOT EXISTS `glpi_projectcosts` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `projects_id` int(11) NOT NULL DEFAULT '0', + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + `begin_date` date DEFAULT NULL, + `end_date` date DEFAULT NULL, + `cost` decimal(20,4) NOT NULL DEFAULT '0.0000', + `budgets_id` int(11) NOT NULL DEFAULT '0', + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `name` (`name`), + KEY `projects_id` (`projects_id`), + KEY `begin_date` (`begin_date`), + KEY `end_date` (`end_date`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`), + KEY `budgets_id` (`budgets_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_projects` +-- + +CREATE TABLE IF NOT EXISTS `glpi_projects` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `code` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `priority` int(11) NOT NULL DEFAULT '1', + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `projects_id` int(11) NOT NULL DEFAULT '0', + `projectstates_id` int(11) NOT NULL DEFAULT '0', + `projecttypes_id` int(11) NOT NULL DEFAULT '0', + `date` datetime DEFAULT NULL, + `date_mod` datetime DEFAULT NULL, + `users_id` int(11) NOT NULL DEFAULT '0', + `groups_id` int(11) NOT NULL DEFAULT '0', + `plan_start_date` datetime DEFAULT NULL, + `plan_end_date` datetime DEFAULT NULL, + `real_start_date` datetime DEFAULT NULL, + `real_end_date` datetime DEFAULT NULL, + `percent_done` int(11) NOT NULL DEFAULT '0', + `show_on_global_gantt` tinyint(1) NOT NULL DEFAULT '0', + `content` longtext COLLATE utf8_unicode_ci, + `comment` longtext COLLATE utf8_unicode_ci, + `is_deleted` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `name` (`name`), + KEY `code` (`code`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`), + KEY `projects_id` (`projects_id`), + KEY `projectstates_id` (`projectstates_id`), + KEY `projecttypes_id` (`projecttypes_id`), + KEY `priority` (`priority`), + KEY `date` (`date`), + KEY `date_mod` (`date_mod`), + KEY `users_id` (`users_id`), + KEY `groups_id` (`groups_id`), + KEY `plan_start_date` (`plan_start_date`), + KEY `plan_end_date` (`plan_end_date`), + KEY `real_start_date` (`real_start_date`), + KEY `real_end_date` (`real_end_date`), + KEY `percent_done` (`percent_done`), + KEY `show_on_global_gantt` (`show_on_global_gantt`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_projectstates` +-- + +CREATE TABLE IF NOT EXISTS `glpi_projectstates` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + `color` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `is_finished` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `name` (`name`), + KEY `is_finished` (`is_finished`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=4 ; + +-- +-- Contenu de la table `glpi_projectstates` +-- + +INSERT INTO `glpi_projectstates` (`id`, `name`, `comment`, `color`, `is_finished`) VALUES +(1, 'New', NULL, '#06ff00', 0), +(2, 'Processing', NULL, '#ffb800', 0), +(3, 'Closed', NULL, '#ff0000', 1); + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_projecttasks` +-- + +CREATE TABLE IF NOT EXISTS `glpi_projecttasks` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `content` longtext COLLATE utf8_unicode_ci, + `comment` longtext COLLATE utf8_unicode_ci, + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `projects_id` int(11) NOT NULL DEFAULT '0', + `projecttasks_id` int(11) NOT NULL DEFAULT '0', + `date` datetime DEFAULT NULL, + `date_mod` datetime DEFAULT NULL, + `plan_start_date` datetime DEFAULT NULL, + `plan_end_date` datetime DEFAULT NULL, + `real_start_date` datetime DEFAULT NULL, + `real_end_date` datetime DEFAULT NULL, + `planned_duration` int(11) NOT NULL DEFAULT '0', + `effective_duration` int(11) NOT NULL DEFAULT '0', + `projectstates_id` int(11) NOT NULL DEFAULT '0', + `projecttasktypes_id` int(11) NOT NULL DEFAULT '0', + `users_id` int(11) NOT NULL DEFAULT '0', + `percent_done` int(11) NOT NULL DEFAULT '0', + `is_milestone` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `name` (`name`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`), + KEY `projects_id` (`projects_id`), + KEY `projecttasks_id` (`projecttasks_id`), + KEY `date` (`date`), + KEY `date_mod` (`date_mod`), + KEY `users_id` (`users_id`), + KEY `plan_start_date` (`plan_start_date`), + KEY `plan_end_date` (`plan_end_date`), + KEY `real_start_date` (`real_start_date`), + KEY `real_end_date` (`real_end_date`), + KEY `percent_done` (`percent_done`), + KEY `projectstates_id` (`projectstates_id`), + KEY `projecttasktypes_id` (`projecttasktypes_id`), + KEY `is_milestone` (`is_milestone`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_projecttasks_tickets` +-- + +CREATE TABLE IF NOT EXISTS `glpi_projecttasks_tickets` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `tickets_id` int(11) NOT NULL DEFAULT '0', + `projecttasks_id` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `unicity` (`tickets_id`,`projecttasks_id`), + KEY `projects_id` (`projecttasks_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_projecttaskteams` +-- + +CREATE TABLE IF NOT EXISTS `glpi_projecttaskteams` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `projecttasks_id` int(11) NOT NULL DEFAULT '0', + `itemtype` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL, + `items_id` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `unicity` (`projecttasks_id`,`itemtype`,`items_id`), + KEY `item` (`itemtype`,`items_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_projecttasktypes` +-- + +CREATE TABLE IF NOT EXISTS `glpi_projecttasktypes` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `name` (`name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_projectteams` +-- + +CREATE TABLE IF NOT EXISTS `glpi_projectteams` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `projects_id` int(11) NOT NULL DEFAULT '0', + `itemtype` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL, + `items_id` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `unicity` (`projects_id`,`itemtype`,`items_id`), + KEY `item` (`itemtype`,`items_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_projecttypes` +-- + +CREATE TABLE IF NOT EXISTS `glpi_projecttypes` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `name` (`name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_queuedmails` +-- + +CREATE TABLE IF NOT EXISTS `glpi_queuedmails` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `itemtype` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL, + `items_id` int(11) NOT NULL DEFAULT '0', + `notificationtemplates_id` int(11) NOT NULL DEFAULT '0', + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_deleted` tinyint(1) NOT NULL DEFAULT '0', + `sent_try` int(11) NOT NULL DEFAULT '0', + `create_time` datetime DEFAULT NULL, + `send_time` datetime DEFAULT NULL, + `sent_time` datetime DEFAULT NULL, + `name` text COLLATE utf8_unicode_ci, + `sender` text COLLATE utf8_unicode_ci, + `sendername` text COLLATE utf8_unicode_ci, + `recipient` text COLLATE utf8_unicode_ci, + `recipientname` text COLLATE utf8_unicode_ci, + `replyto` text COLLATE utf8_unicode_ci, + `replytoname` text COLLATE utf8_unicode_ci, + `headers` text COLLATE utf8_unicode_ci, + `body_html` longtext COLLATE utf8_unicode_ci, + `body_text` longtext COLLATE utf8_unicode_ci, + `messageid` text COLLATE utf8_unicode_ci, + `documents` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `item` (`itemtype`,`items_id`,`notificationtemplates_id`), + KEY `is_deleted` (`is_deleted`), + KEY `entities_id` (`entities_id`), + KEY `sent_try` (`sent_try`), + KEY `create_time` (`create_time`), + KEY `send_time` (`send_time`), + KEY `sent_time` (`sent_time`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_registeredids` +-- + +CREATE TABLE IF NOT EXISTS `glpi_registeredids` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `items_id` int(11) NOT NULL DEFAULT '0', + `itemtype` varchar(100) COLLATE utf8_unicode_ci NOT NULL, + `device_type` varchar(100) COLLATE utf8_unicode_ci NOT NULL COMMENT 'USB, PCI ...', + PRIMARY KEY (`id`), + KEY `name` (`name`), + KEY `item` (`items_id`,`itemtype`), + KEY `device_type` (`device_type`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_reminders` +-- + +CREATE TABLE IF NOT EXISTS `glpi_reminders` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `date` datetime DEFAULT NULL, + `users_id` int(11) NOT NULL DEFAULT '0', + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `text` text COLLATE utf8_unicode_ci, + `begin` datetime DEFAULT NULL, + `end` datetime DEFAULT NULL, + `is_planned` tinyint(1) NOT NULL DEFAULT '0', + `date_mod` datetime DEFAULT NULL, + `state` int(11) NOT NULL DEFAULT '0', + `begin_view_date` datetime DEFAULT NULL, + `end_view_date` datetime DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `date` (`date`), + KEY `begin` (`begin`), + KEY `end` (`end`), + KEY `users_id` (`users_id`), + KEY `is_planned` (`is_planned`), + KEY `state` (`state`), + KEY `date_mod` (`date_mod`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_reminders_users` +-- + +CREATE TABLE IF NOT EXISTS `glpi_reminders_users` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `reminders_id` int(11) NOT NULL DEFAULT '0', + `users_id` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `reminders_id` (`reminders_id`), + KEY `users_id` (`users_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_requesttypes` +-- + +CREATE TABLE IF NOT EXISTS `glpi_requesttypes` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `is_helpdesk_default` tinyint(1) NOT NULL DEFAULT '0', + `is_mail_default` tinyint(1) NOT NULL DEFAULT '0', + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `name` (`name`), + KEY `is_helpdesk_default` (`is_helpdesk_default`), + KEY `is_mail_default` (`is_mail_default`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=7 ; + +-- +-- Contenu de la table `glpi_requesttypes` +-- + +INSERT INTO `glpi_requesttypes` (`id`, `name`, `is_helpdesk_default`, `is_mail_default`, `comment`) VALUES +(1, 'Helpdesk', 1, 0, NULL), +(2, 'E-Mail', 0, 1, NULL), +(3, 'Phone', 0, 0, NULL), +(4, 'Direct', 0, 0, NULL), +(5, 'Written', 0, 0, NULL), +(6, 'Other', 0, 0, NULL); + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_reservationitems` +-- + +CREATE TABLE IF NOT EXISTS `glpi_reservationitems` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `itemtype` varchar(100) COLLATE utf8_unicode_ci NOT NULL, + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `items_id` int(11) NOT NULL DEFAULT '0', + `comment` text COLLATE utf8_unicode_ci, + `is_active` tinyint(1) NOT NULL DEFAULT '1', + `is_deleted` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `is_active` (`is_active`), + KEY `item` (`itemtype`,`items_id`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`), + KEY `is_deleted` (`is_deleted`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_reservations` +-- + +CREATE TABLE IF NOT EXISTS `glpi_reservations` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `reservationitems_id` int(11) NOT NULL DEFAULT '0', + `begin` datetime DEFAULT NULL, + `end` datetime DEFAULT NULL, + `users_id` int(11) NOT NULL DEFAULT '0', + `comment` text COLLATE utf8_unicode_ci, + `group` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `begin` (`begin`), + KEY `end` (`end`), + KEY `reservationitems_id` (`reservationitems_id`), + KEY `users_id` (`users_id`), + KEY `resagroup` (`reservationitems_id`,`group`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_rssfeeds` +-- + +CREATE TABLE IF NOT EXISTS `glpi_rssfeeds` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `users_id` int(11) NOT NULL DEFAULT '0', + `comment` text COLLATE utf8_unicode_ci, + `url` text COLLATE utf8_unicode_ci, + `refresh_rate` int(11) NOT NULL DEFAULT '86400', + `max_items` int(11) NOT NULL DEFAULT '20', + `have_error` tinyint(1) NOT NULL DEFAULT '0', + `is_active` tinyint(1) NOT NULL DEFAULT '0', + `date_mod` datetime DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `name` (`name`), + KEY `users_id` (`users_id`), + KEY `date_mod` (`date_mod`), + KEY `have_error` (`have_error`), + KEY `is_active` (`is_active`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_rssfeeds_users` +-- + +CREATE TABLE IF NOT EXISTS `glpi_rssfeeds_users` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `rssfeeds_id` int(11) NOT NULL DEFAULT '0', + `users_id` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `rssfeeds_id` (`rssfeeds_id`), + KEY `users_id` (`users_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_ruleactions` +-- + +CREATE TABLE IF NOT EXISTS `glpi_ruleactions` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `rules_id` int(11) NOT NULL DEFAULT '0', + `action_type` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT 'VALUE IN (assign, regex_result, append_regex_result, affectbyip, affectbyfqdn, affectbymac)', + `field` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `value` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `rules_id` (`rules_id`), + KEY `field_value` (`field`(50),`value`(50)) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=9 ; + +-- +-- Contenu de la table `glpi_ruleactions` +-- + +INSERT INTO `glpi_ruleactions` (`id`, `rules_id`, `action_type`, `field`, `value`) VALUES +(6, 6, 'fromitem', 'locations_id', '1'), +(2, 2, 'assign', 'entities_id', '0'), +(3, 3, 'assign', 'entities_id', '0'), +(4, 4, 'assign', '_refuse_email_no_response', '1'), +(5, 5, 'assign', '_refuse_email_no_response', '1'), +(7, 7, 'fromuser', 'locations_id', '1'), +(8, 8, 'assign', 'entities_id', '0'); + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_rulecriterias` +-- + +CREATE TABLE IF NOT EXISTS `glpi_rulecriterias` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `rules_id` int(11) NOT NULL DEFAULT '0', + `criteria` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `condition` int(11) NOT NULL DEFAULT '0' COMMENT 'see define.php PATTERN_* and REGEX_* constant', + `pattern` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `rules_id` (`rules_id`), + KEY `condition` (`condition`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=15 ; + +-- +-- Contenu de la table `glpi_rulecriterias` +-- + +INSERT INTO `glpi_rulecriterias` (`id`, `rules_id`, `criteria`, `condition`, `pattern`) VALUES +(9, 6, 'locations_id', 9, '1'), +(2, 2, 'uid', 0, '*'), +(3, 2, 'samaccountname', 0, '*'), +(4, 2, 'MAIL_EMAIL', 0, '*'), +(5, 3, 'subject', 6, '/.*/'), +(6, 4, 'x-auto-response-suppress', 6, '/\\S+/'), +(7, 5, 'auto-submitted', 6, '/\\S+/'), +(8, 5, 'auto-submitted', 1, 'no'), +(10, 6, 'items_locations', 8, '1'), +(11, 7, 'locations_id', 9, '1'), +(12, 7, 'users_locations', 8, '1'), +(13, 8, 'TAG', 0, '*'), +(14, 8, 'OCS_SERVER', 0, '1'); + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_rulerightparameters` +-- + +CREATE TABLE IF NOT EXISTS `glpi_rulerightparameters` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `value` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=15 ; + +-- +-- Contenu de la table `glpi_rulerightparameters` +-- + +INSERT INTO `glpi_rulerightparameters` (`id`, `name`, `value`, `comment`) VALUES +(1, '(LDAP)Organization', 'o', ''), +(2, '(LDAP)Common Name', 'cn', ''), +(3, '(LDAP)Department Number', 'departmentnumber', ''), +(4, '(LDAP)Email', 'mail', ''), +(5, 'Object Class', 'objectclass', ''), +(6, '(LDAP)User ID', 'uid', ''), +(7, '(LDAP)Telephone Number', 'phone', ''), +(8, '(LDAP)Employee Number', 'employeenumber', ''), +(9, '(LDAP)Manager', 'manager', ''), +(10, '(LDAP)DistinguishedName', 'dn', ''), +(12, '(AD)User ID', 'samaccountname', ''), +(13, '(LDAP) Title', 'title', ''), +(14, '(LDAP) MemberOf', 'memberof', ''); + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_rules` +-- + +CREATE TABLE IF NOT EXISTS `glpi_rules` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `entities_id` int(11) NOT NULL DEFAULT '0', + `sub_type` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '', + `ranking` int(11) NOT NULL DEFAULT '0', + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `description` text COLLATE utf8_unicode_ci, + `match` char(10) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT 'see define.php *_MATCHING constant', + `is_active` tinyint(1) NOT NULL DEFAULT '1', + `comment` text COLLATE utf8_unicode_ci, + `date_mod` datetime DEFAULT NULL, + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `uuid` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `condition` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `entities_id` (`entities_id`), + KEY `is_active` (`is_active`), + KEY `sub_type` (`sub_type`), + KEY `date_mod` (`date_mod`), + KEY `is_recursive` (`is_recursive`), + KEY `condition` (`condition`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=9 ; + +-- +-- Contenu de la table `glpi_rules` +-- + +INSERT INTO `glpi_rules` (`id`, `entities_id`, `sub_type`, `ranking`, `name`, `description`, `match`, `is_active`, `comment`, `date_mod`, `is_recursive`, `uuid`, `condition`) VALUES +(2, 0, 'RuleRight', 1, 'Root', '', 'OR', 1, NULL, NULL, 0, '500717c8-2bd6e957-53a12b5fd35745.02608131', 0), +(3, 0, 'RuleMailCollector', 3, 'Root', '', 'OR', 1, NULL, NULL, 0, '500717c8-2bd6e957-53a12b5fd36404.54713349', 0), +(4, 0, 'RuleMailCollector', 1, 'Auto-Reply X-Auto-Response-Suppress', 'Exclude Auto-Reply emails using X-Auto-Response-Suppress header', 'AND', 1, NULL, '2011-01-18 11:40:42', 1, '500717c8-2bd6e957-53a12b5fd36d97.94503423', 0), +(5, 0, 'RuleMailCollector', 2, 'Auto-Reply Auto-Submitted', 'Exclude Auto-Reply emails using Auto-Submitted header', 'AND', 1, NULL, '2011-01-18 11:40:42', 1, '500717c8-2bd6e957-53a12b5fd376c2.87642651', 0), +(6, 0, 'RuleTicket', 1, 'Ticket location from item', '', 'AND', 0, 'Automatically generated by GLPI 0.84', NULL, 1, '500717c8-2bd6e957-53a12b5fd37f94.10365341', 1), +(7, 0, 'RuleTicket', 2, 'Ticket location from user', '', 'AND', 0, 'Automatically generated by GLPI 0.84', NULL, 1, '500717c8-2bd6e957-53a12b5fd38869.86002585', 1), +(8, 0, 'RuleImportEntity', 1, 'RootOcs', '', 'AND', 1, 'Généré automatiquement par GLPI 110', NULL, 1, NULL, 0); + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_slalevelactions` +-- + +CREATE TABLE IF NOT EXISTS `glpi_slalevelactions` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `slalevels_id` int(11) NOT NULL DEFAULT '0', + `action_type` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `field` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `value` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `slalevels_id` (`slalevels_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_slalevelcriterias` +-- + +CREATE TABLE IF NOT EXISTS `glpi_slalevelcriterias` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `slalevels_id` int(11) NOT NULL DEFAULT '0', + `criteria` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `condition` int(11) NOT NULL DEFAULT '0' COMMENT 'see define.php PATTERN_* and REGEX_* constant', + `pattern` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `slalevels_id` (`slalevels_id`), + KEY `condition` (`condition`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_slalevels` +-- + +CREATE TABLE IF NOT EXISTS `glpi_slalevels` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `slas_id` int(11) NOT NULL DEFAULT '0', + `execution_time` int(11) NOT NULL, + `is_active` tinyint(1) NOT NULL DEFAULT '1', + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `match` char(10) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT 'see define.php *_MATCHING constant', + `uuid` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `name` (`name`), + KEY `is_active` (`is_active`), + KEY `slas_id` (`slas_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_slalevels_tickets` +-- + +CREATE TABLE IF NOT EXISTS `glpi_slalevels_tickets` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `tickets_id` int(11) NOT NULL DEFAULT '0', + `slalevels_id` int(11) NOT NULL DEFAULT '0', + `date` datetime DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `tickets_id` (`tickets_id`), + KEY `slalevels_id` (`slalevels_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_slas` +-- + +CREATE TABLE IF NOT EXISTS `glpi_slas` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `comment` text COLLATE utf8_unicode_ci, + `resolution_time` int(11) NOT NULL, + `calendars_id` int(11) NOT NULL DEFAULT '0', + `date_mod` datetime DEFAULT NULL, + `definition_time` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `end_of_working_day` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `name` (`name`), + KEY `calendars_id` (`calendars_id`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`), + KEY `date_mod` (`date_mod`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_softwarecategories` +-- + +CREATE TABLE IF NOT EXISTS `glpi_softwarecategories` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + `softwarecategories_id` int(11) NOT NULL DEFAULT '0', + `completename` text COLLATE utf8_unicode_ci, + `level` int(11) NOT NULL DEFAULT '0', + `ancestors_cache` longtext COLLATE utf8_unicode_ci, + `sons_cache` longtext COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `softwarecategories_id` (`softwarecategories_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=2 ; + +-- +-- Contenu de la table `glpi_softwarecategories` +-- + +INSERT INTO `glpi_softwarecategories` (`id`, `name`, `comment`, `softwarecategories_id`, `completename`, `level`, `ancestors_cache`, `sons_cache`) VALUES +(1, 'FUSION', NULL, 0, 'FUSION', 1, NULL, NULL); + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_softwarelicenses` +-- + +CREATE TABLE IF NOT EXISTS `glpi_softwarelicenses` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `softwares_id` int(11) NOT NULL DEFAULT '0', + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `number` int(11) NOT NULL DEFAULT '0', + `softwarelicensetypes_id` int(11) NOT NULL DEFAULT '0', + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `serial` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `otherserial` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `softwareversions_id_buy` int(11) NOT NULL DEFAULT '0', + `softwareversions_id_use` int(11) NOT NULL DEFAULT '0', + `expire` date DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + `date_mod` datetime DEFAULT NULL, + `is_valid` tinyint(1) NOT NULL DEFAULT '1', + PRIMARY KEY (`id`), + KEY `name` (`name`), + KEY `serial` (`serial`), + KEY `otherserial` (`otherserial`), + KEY `expire` (`expire`), + KEY `softwareversions_id_buy` (`softwareversions_id_buy`), + KEY `entities_id` (`entities_id`), + KEY `softwarelicensetypes_id` (`softwarelicensetypes_id`), + KEY `softwareversions_id_use` (`softwareversions_id_use`), + KEY `date_mod` (`date_mod`), + KEY `softwares_id_expire` (`softwares_id`,`expire`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_softwarelicensetypes` +-- + +CREATE TABLE IF NOT EXISTS `glpi_softwarelicensetypes` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `name` (`name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=2 ; + +-- +-- Contenu de la table `glpi_softwarelicensetypes` +-- + +INSERT INTO `glpi_softwarelicensetypes` (`id`, `name`, `comment`) VALUES +(1, 'OEM', ''); + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_softwares` +-- + +CREATE TABLE IF NOT EXISTS `glpi_softwares` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + `locations_id` int(11) NOT NULL DEFAULT '0', + `users_id_tech` int(11) NOT NULL DEFAULT '0', + `groups_id_tech` int(11) NOT NULL DEFAULT '0', + `is_update` tinyint(1) NOT NULL DEFAULT '0', + `softwares_id` int(11) NOT NULL DEFAULT '0', + `manufacturers_id` int(11) NOT NULL DEFAULT '0', + `is_deleted` tinyint(1) NOT NULL DEFAULT '0', + `is_template` tinyint(1) NOT NULL DEFAULT '0', + `template_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `date_mod` datetime DEFAULT NULL, + `users_id` int(11) NOT NULL DEFAULT '0', + `groups_id` int(11) NOT NULL DEFAULT '0', + `ticket_tco` decimal(20,4) DEFAULT '0.0000', + `is_helpdesk_visible` tinyint(1) NOT NULL DEFAULT '1', + `softwarecategories_id` int(11) NOT NULL DEFAULT '0', + `is_valid` tinyint(1) NOT NULL DEFAULT '1', + PRIMARY KEY (`id`), + KEY `date_mod` (`date_mod`), + KEY `name` (`name`), + KEY `is_template` (`is_template`), + KEY `is_update` (`is_update`), + KEY `softwarecategories_id` (`softwarecategories_id`), + KEY `entities_id` (`entities_id`), + KEY `manufacturers_id` (`manufacturers_id`), + KEY `groups_id` (`groups_id`), + KEY `users_id` (`users_id`), + KEY `locations_id` (`locations_id`), + KEY `users_id_tech` (`users_id_tech`), + KEY `softwares_id` (`softwares_id`), + KEY `is_deleted` (`is_deleted`), + KEY `is_helpdesk_visible` (`is_helpdesk_visible`), + KEY `groups_id_tech` (`groups_id_tech`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_softwareversions` +-- + +CREATE TABLE IF NOT EXISTS `glpi_softwareversions` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `softwares_id` int(11) NOT NULL DEFAULT '0', + `states_id` int(11) NOT NULL DEFAULT '0', + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + `operatingsystems_id` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `name` (`name`), + KEY `softwares_id` (`softwares_id`), + KEY `states_id` (`states_id`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`), + KEY `operatingsystems_id` (`operatingsystems_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_solutiontemplates` +-- + +CREATE TABLE IF NOT EXISTS `glpi_solutiontemplates` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `content` text COLLATE utf8_unicode_ci, + `solutiontypes_id` int(11) NOT NULL DEFAULT '0', + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `name` (`name`), + KEY `is_recursive` (`is_recursive`), + KEY `solutiontypes_id` (`solutiontypes_id`), + KEY `entities_id` (`entities_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_solutiontypes` +-- + +CREATE TABLE IF NOT EXISTS `glpi_solutiontypes` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '1', + PRIMARY KEY (`id`), + KEY `name` (`name`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_ssovariables` +-- + +CREATE TABLE IF NOT EXISTS `glpi_ssovariables` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=7 ; + +-- +-- Contenu de la table `glpi_ssovariables` +-- + +INSERT INTO `glpi_ssovariables` (`id`, `name`, `comment`) VALUES +(1, 'HTTP_AUTH_USER', ''), +(2, 'REMOTE_USER', ''), +(3, 'PHP_AUTH_USER', ''), +(4, 'USERNAME', ''), +(5, 'REDIRECT_REMOTE_USER', ''), +(6, 'HTTP_REMOTE_USER', ''); + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_states` +-- + +CREATE TABLE IF NOT EXISTS `glpi_states` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `comment` text COLLATE utf8_unicode_ci, + `states_id` int(11) NOT NULL DEFAULT '0', + `completename` text COLLATE utf8_unicode_ci, + `level` int(11) NOT NULL DEFAULT '0', + `ancestors_cache` longtext COLLATE utf8_unicode_ci, + `sons_cache` longtext COLLATE utf8_unicode_ci, + `is_visible_computer` tinyint(1) NOT NULL DEFAULT '1', + `is_visible_monitor` tinyint(1) NOT NULL DEFAULT '1', + `is_visible_networkequipment` tinyint(1) NOT NULL DEFAULT '1', + `is_visible_peripheral` tinyint(1) NOT NULL DEFAULT '1', + `is_visible_phone` tinyint(1) NOT NULL DEFAULT '1', + `is_visible_printer` tinyint(1) NOT NULL DEFAULT '1', + `is_visible_softwareversion` tinyint(1) NOT NULL DEFAULT '1', + PRIMARY KEY (`id`), + KEY `name` (`name`), + KEY `unicity` (`states_id`,`name`), + KEY `is_visible_computer` (`is_visible_computer`), + KEY `is_visible_monitor` (`is_visible_monitor`), + KEY `is_visible_networkequipment` (`is_visible_networkequipment`), + KEY `is_visible_peripheral` (`is_visible_peripheral`), + KEY `is_visible_phone` (`is_visible_phone`), + KEY `is_visible_printer` (`is_visible_printer`), + KEY `is_visible_softwareversion` (`is_visible_softwareversion`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_suppliers` +-- + +CREATE TABLE IF NOT EXISTS `glpi_suppliers` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `suppliertypes_id` int(11) NOT NULL DEFAULT '0', + `address` text COLLATE utf8_unicode_ci, + `postcode` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `town` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `state` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `country` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `website` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `phonenumber` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + `is_deleted` tinyint(1) NOT NULL DEFAULT '0', + `fax` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `email` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `name` (`name`), + KEY `entities_id` (`entities_id`), + KEY `suppliertypes_id` (`suppliertypes_id`), + KEY `is_deleted` (`is_deleted`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_suppliers_tickets` +-- + +CREATE TABLE IF NOT EXISTS `glpi_suppliers_tickets` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `tickets_id` int(11) NOT NULL DEFAULT '0', + `suppliers_id` int(11) NOT NULL DEFAULT '0', + `type` int(11) NOT NULL DEFAULT '1', + `use_notification` tinyint(1) NOT NULL DEFAULT '0', + `alternative_email` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `unicity` (`tickets_id`,`type`,`suppliers_id`), + KEY `group` (`suppliers_id`,`type`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_suppliertypes` +-- + +CREATE TABLE IF NOT EXISTS `glpi_suppliertypes` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `name` (`name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_taskcategories` +-- + +CREATE TABLE IF NOT EXISTS `glpi_taskcategories` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `taskcategories_id` int(11) NOT NULL DEFAULT '0', + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `completename` text COLLATE utf8_unicode_ci, + `comment` text COLLATE utf8_unicode_ci, + `level` int(11) NOT NULL DEFAULT '0', + `ancestors_cache` longtext COLLATE utf8_unicode_ci, + `sons_cache` longtext COLLATE utf8_unicode_ci, + `is_helpdeskvisible` tinyint(1) NOT NULL DEFAULT '1', + PRIMARY KEY (`id`), + KEY `name` (`name`), + KEY `taskcategories_id` (`taskcategories_id`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`), + KEY `is_helpdeskvisible` (`is_helpdeskvisible`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_ticketcosts` +-- + +CREATE TABLE IF NOT EXISTS `glpi_ticketcosts` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `tickets_id` int(11) NOT NULL DEFAULT '0', + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + `begin_date` date DEFAULT NULL, + `end_date` date DEFAULT NULL, + `actiontime` int(11) NOT NULL DEFAULT '0', + `cost_time` decimal(20,4) NOT NULL DEFAULT '0.0000', + `cost_fixed` decimal(20,4) NOT NULL DEFAULT '0.0000', + `cost_material` decimal(20,4) NOT NULL DEFAULT '0.0000', + `budgets_id` int(11) NOT NULL DEFAULT '0', + `entities_id` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `name` (`name`), + KEY `tickets_id` (`tickets_id`), + KEY `begin_date` (`begin_date`), + KEY `end_date` (`end_date`), + KEY `entities_id` (`entities_id`), + KEY `budgets_id` (`budgets_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_ticketfollowups` +-- + +CREATE TABLE IF NOT EXISTS `glpi_ticketfollowups` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `tickets_id` int(11) NOT NULL DEFAULT '0', + `date` datetime DEFAULT NULL, + `users_id` int(11) NOT NULL DEFAULT '0', + `content` longtext COLLATE utf8_unicode_ci, + `is_private` tinyint(1) NOT NULL DEFAULT '0', + `requesttypes_id` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `date` (`date`), + KEY `users_id` (`users_id`), + KEY `tickets_id` (`tickets_id`), + KEY `is_private` (`is_private`), + KEY `requesttypes_id` (`requesttypes_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_ticketrecurrents` +-- + +CREATE TABLE IF NOT EXISTS `glpi_ticketrecurrents` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `is_active` tinyint(1) NOT NULL DEFAULT '0', + `tickettemplates_id` int(11) NOT NULL DEFAULT '0', + `begin_date` datetime DEFAULT NULL, + `periodicity` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `create_before` int(11) NOT NULL DEFAULT '0', + `next_creation_date` datetime DEFAULT NULL, + `calendars_id` int(11) NOT NULL DEFAULT '0', + `end_date` datetime DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`), + KEY `is_active` (`is_active`), + KEY `tickettemplates_id` (`tickettemplates_id`), + KEY `next_creation_date` (`next_creation_date`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_tickets` +-- + +CREATE TABLE IF NOT EXISTS `glpi_tickets` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `entities_id` int(11) NOT NULL DEFAULT '0', + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `date` datetime DEFAULT NULL, + `closedate` datetime DEFAULT NULL, + `solvedate` datetime DEFAULT NULL, + `date_mod` datetime DEFAULT NULL, + `users_id_lastupdater` int(11) NOT NULL DEFAULT '0', + `status` int(11) NOT NULL DEFAULT '1', + `users_id_recipient` int(11) NOT NULL DEFAULT '0', + `requesttypes_id` int(11) NOT NULL DEFAULT '0', + `content` longtext COLLATE utf8_unicode_ci, + `urgency` int(11) NOT NULL DEFAULT '1', + `impact` int(11) NOT NULL DEFAULT '1', + `priority` int(11) NOT NULL DEFAULT '1', + `itilcategories_id` int(11) NOT NULL DEFAULT '0', + `type` int(11) NOT NULL DEFAULT '1', + `solutiontypes_id` int(11) NOT NULL DEFAULT '0', + `solution` longtext COLLATE utf8_unicode_ci, + `global_validation` int(11) NOT NULL DEFAULT '1', + `slas_id` int(11) NOT NULL DEFAULT '0', + `slalevels_id` int(11) NOT NULL DEFAULT '0', + `due_date` datetime DEFAULT NULL, + `begin_waiting_date` datetime DEFAULT NULL, + `sla_waiting_duration` int(11) NOT NULL DEFAULT '0', + `waiting_duration` int(11) NOT NULL DEFAULT '0', + `close_delay_stat` int(11) NOT NULL DEFAULT '0', + `solve_delay_stat` int(11) NOT NULL DEFAULT '0', + `takeintoaccount_delay_stat` int(11) NOT NULL DEFAULT '0', + `actiontime` int(11) NOT NULL DEFAULT '0', + `is_deleted` tinyint(1) NOT NULL DEFAULT '0', + `locations_id` int(11) NOT NULL DEFAULT '0', + `validation_percent` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `date` (`date`), + KEY `closedate` (`closedate`), + KEY `status` (`status`), + KEY `priority` (`priority`), + KEY `request_type` (`requesttypes_id`), + KEY `date_mod` (`date_mod`), + KEY `entities_id` (`entities_id`), + KEY `users_id_recipient` (`users_id_recipient`), + KEY `solvedate` (`solvedate`), + KEY `urgency` (`urgency`), + KEY `impact` (`impact`), + KEY `global_validation` (`global_validation`), + KEY `slas_id` (`slas_id`), + KEY `slalevels_id` (`slalevels_id`), + KEY `due_date` (`due_date`), + KEY `users_id_lastupdater` (`users_id_lastupdater`), + KEY `type` (`type`), + KEY `solutiontypes_id` (`solutiontypes_id`), + KEY `itilcategories_id` (`itilcategories_id`), + KEY `is_deleted` (`is_deleted`), + KEY `name` (`name`), + KEY `locations_id` (`locations_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_ticketsatisfactions` +-- + +CREATE TABLE IF NOT EXISTS `glpi_ticketsatisfactions` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `tickets_id` int(11) NOT NULL DEFAULT '0', + `type` int(11) NOT NULL DEFAULT '1', + `date_begin` datetime DEFAULT NULL, + `date_answered` datetime DEFAULT NULL, + `satisfaction` int(11) DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + UNIQUE KEY `tickets_id` (`tickets_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_tickets_tickets` +-- + +CREATE TABLE IF NOT EXISTS `glpi_tickets_tickets` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `tickets_id_1` int(11) NOT NULL DEFAULT '0', + `tickets_id_2` int(11) NOT NULL DEFAULT '0', + `link` int(11) NOT NULL DEFAULT '1', + PRIMARY KEY (`id`), + KEY `unicity` (`tickets_id_1`,`tickets_id_2`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_tickets_users` +-- + +CREATE TABLE IF NOT EXISTS `glpi_tickets_users` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `tickets_id` int(11) NOT NULL DEFAULT '0', + `users_id` int(11) NOT NULL DEFAULT '0', + `type` int(11) NOT NULL DEFAULT '1', + `use_notification` tinyint(1) NOT NULL DEFAULT '1', + `alternative_email` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `unicity` (`tickets_id`,`type`,`users_id`,`alternative_email`), + KEY `user` (`users_id`,`type`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_tickettasks` +-- + +CREATE TABLE IF NOT EXISTS `glpi_tickettasks` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `tickets_id` int(11) NOT NULL DEFAULT '0', + `taskcategories_id` int(11) NOT NULL DEFAULT '0', + `date` datetime DEFAULT NULL, + `users_id` int(11) NOT NULL DEFAULT '0', + `content` longtext COLLATE utf8_unicode_ci, + `is_private` tinyint(1) NOT NULL DEFAULT '0', + `actiontime` int(11) NOT NULL DEFAULT '0', + `begin` datetime DEFAULT NULL, + `end` datetime DEFAULT NULL, + `state` int(11) NOT NULL DEFAULT '1', + `users_id_tech` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `date` (`date`), + KEY `users_id` (`users_id`), + KEY `tickets_id` (`tickets_id`), + KEY `is_private` (`is_private`), + KEY `taskcategories_id` (`taskcategories_id`), + KEY `state` (`state`), + KEY `users_id_tech` (`users_id_tech`), + KEY `begin` (`begin`), + KEY `end` (`end`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_tickettemplatehiddenfields` +-- + +CREATE TABLE IF NOT EXISTS `glpi_tickettemplatehiddenfields` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `tickettemplates_id` int(11) NOT NULL DEFAULT '0', + `num` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `unicity` (`tickettemplates_id`,`num`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_tickettemplatemandatoryfields` +-- + +CREATE TABLE IF NOT EXISTS `glpi_tickettemplatemandatoryfields` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `tickettemplates_id` int(11) NOT NULL DEFAULT '0', + `num` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `unicity` (`tickettemplates_id`,`num`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=2 ; + +-- +-- Contenu de la table `glpi_tickettemplatemandatoryfields` +-- + +INSERT INTO `glpi_tickettemplatemandatoryfields` (`id`, `tickettemplates_id`, `num`) VALUES +(1, 1, 21); + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_tickettemplatepredefinedfields` +-- + +CREATE TABLE IF NOT EXISTS `glpi_tickettemplatepredefinedfields` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `tickettemplates_id` int(11) NOT NULL DEFAULT '0', + `num` int(11) NOT NULL DEFAULT '0', + `value` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `unicity` (`tickettemplates_id`,`num`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_tickettemplates` +-- + +CREATE TABLE IF NOT EXISTS `glpi_tickettemplates` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `name` (`name`), + KEY `entities_id` (`entities_id`), + KEY `is_recursive` (`is_recursive`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=2 ; + +-- +-- Contenu de la table `glpi_tickettemplates` +-- + +INSERT INTO `glpi_tickettemplates` (`id`, `name`, `entities_id`, `is_recursive`, `comment`) VALUES +(1, 'Default', 0, 1, NULL); + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_ticketvalidations` +-- + +CREATE TABLE IF NOT EXISTS `glpi_ticketvalidations` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `entities_id` int(11) NOT NULL DEFAULT '0', + `users_id` int(11) NOT NULL DEFAULT '0', + `tickets_id` int(11) NOT NULL DEFAULT '0', + `users_id_validate` int(11) NOT NULL DEFAULT '0', + `comment_submission` text COLLATE utf8_unicode_ci, + `comment_validation` text COLLATE utf8_unicode_ci, + `status` int(11) NOT NULL DEFAULT '2', + `submission_date` datetime DEFAULT NULL, + `validation_date` datetime DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `entities_id` (`entities_id`), + KEY `users_id` (`users_id`), + KEY `users_id_validate` (`users_id_validate`), + KEY `tickets_id` (`tickets_id`), + KEY `submission_date` (`submission_date`), + KEY `validation_date` (`validation_date`), + KEY `status` (`status`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_transfers` +-- + +CREATE TABLE IF NOT EXISTS `glpi_transfers` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `keep_ticket` int(11) NOT NULL DEFAULT '0', + `keep_networklink` int(11) NOT NULL DEFAULT '0', + `keep_reservation` int(11) NOT NULL DEFAULT '0', + `keep_history` int(11) NOT NULL DEFAULT '0', + `keep_device` int(11) NOT NULL DEFAULT '0', + `keep_infocom` int(11) NOT NULL DEFAULT '0', + `keep_dc_monitor` int(11) NOT NULL DEFAULT '0', + `clean_dc_monitor` int(11) NOT NULL DEFAULT '0', + `keep_dc_phone` int(11) NOT NULL DEFAULT '0', + `clean_dc_phone` int(11) NOT NULL DEFAULT '0', + `keep_dc_peripheral` int(11) NOT NULL DEFAULT '0', + `clean_dc_peripheral` int(11) NOT NULL DEFAULT '0', + `keep_dc_printer` int(11) NOT NULL DEFAULT '0', + `clean_dc_printer` int(11) NOT NULL DEFAULT '0', + `keep_supplier` int(11) NOT NULL DEFAULT '0', + `clean_supplier` int(11) NOT NULL DEFAULT '0', + `keep_contact` int(11) NOT NULL DEFAULT '0', + `clean_contact` int(11) NOT NULL DEFAULT '0', + `keep_contract` int(11) NOT NULL DEFAULT '0', + `clean_contract` int(11) NOT NULL DEFAULT '0', + `keep_software` int(11) NOT NULL DEFAULT '0', + `clean_software` int(11) NOT NULL DEFAULT '0', + `keep_document` int(11) NOT NULL DEFAULT '0', + `clean_document` int(11) NOT NULL DEFAULT '0', + `keep_cartridgeitem` int(11) NOT NULL DEFAULT '0', + `clean_cartridgeitem` int(11) NOT NULL DEFAULT '0', + `keep_cartridge` int(11) NOT NULL DEFAULT '0', + `keep_consumable` int(11) NOT NULL DEFAULT '0', + `date_mod` datetime DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + `keep_disk` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `date_mod` (`date_mod`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=2 ; + +-- +-- Contenu de la table `glpi_transfers` +-- + +INSERT INTO `glpi_transfers` (`id`, `name`, `keep_ticket`, `keep_networklink`, `keep_reservation`, `keep_history`, `keep_device`, `keep_infocom`, `keep_dc_monitor`, `clean_dc_monitor`, `keep_dc_phone`, `clean_dc_phone`, `keep_dc_peripheral`, `clean_dc_peripheral`, `keep_dc_printer`, `clean_dc_printer`, `keep_supplier`, `clean_supplier`, `keep_contact`, `clean_contact`, `keep_contract`, `clean_contract`, `keep_software`, `clean_software`, `keep_document`, `clean_document`, `keep_cartridgeitem`, `clean_cartridgeitem`, `keep_cartridge`, `keep_consumable`, `date_mod`, `comment`, `keep_disk`) VALUES +(1, 'complete', 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, NULL, NULL, 1); + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_usercategories` +-- + +CREATE TABLE IF NOT EXISTS `glpi_usercategories` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `name` (`name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_useremails` +-- + +CREATE TABLE IF NOT EXISTS `glpi_useremails` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `users_id` int(11) NOT NULL DEFAULT '0', + `is_default` tinyint(1) NOT NULL DEFAULT '0', + `is_dynamic` tinyint(1) NOT NULL DEFAULT '0', + `email` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `unicity` (`users_id`,`email`), + KEY `email` (`email`), + KEY `is_default` (`is_default`), + KEY `is_dynamic` (`is_dynamic`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_users` +-- + +CREATE TABLE IF NOT EXISTS `glpi_users` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `password` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `phone` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `phone2` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `mobile` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `realname` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `firstname` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `locations_id` int(11) NOT NULL DEFAULT '0', + `language` char(10) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT 'see define.php CFG_GLPI[language] array', + `use_mode` int(11) NOT NULL DEFAULT '0', + `list_limit` int(11) DEFAULT NULL, + `is_active` tinyint(1) NOT NULL DEFAULT '1', + `comment` text COLLATE utf8_unicode_ci, + `auths_id` int(11) NOT NULL DEFAULT '0', + `authtype` int(11) NOT NULL DEFAULT '0', + `last_login` datetime DEFAULT NULL, + `date_mod` datetime DEFAULT NULL, + `date_sync` datetime DEFAULT NULL, + `is_deleted` tinyint(1) NOT NULL DEFAULT '0', + `profiles_id` int(11) NOT NULL DEFAULT '0', + `entities_id` int(11) NOT NULL DEFAULT '0', + `usertitles_id` int(11) NOT NULL DEFAULT '0', + `usercategories_id` int(11) NOT NULL DEFAULT '0', + `date_format` int(11) DEFAULT NULL, + `number_format` int(11) DEFAULT NULL, + `names_format` int(11) DEFAULT NULL, + `csv_delimiter` char(1) COLLATE utf8_unicode_ci DEFAULT NULL, + `is_ids_visible` tinyint(1) DEFAULT NULL, + `dropdown_chars_limit` int(11) DEFAULT NULL, + `use_flat_dropdowntree` tinyint(1) DEFAULT NULL, + `show_jobs_at_login` tinyint(1) DEFAULT NULL, + `priority_1` char(20) COLLATE utf8_unicode_ci DEFAULT NULL, + `priority_2` char(20) COLLATE utf8_unicode_ci DEFAULT NULL, + `priority_3` char(20) COLLATE utf8_unicode_ci DEFAULT NULL, + `priority_4` char(20) COLLATE utf8_unicode_ci DEFAULT NULL, + `priority_5` char(20) COLLATE utf8_unicode_ci DEFAULT NULL, + `priority_6` char(20) COLLATE utf8_unicode_ci DEFAULT NULL, + `followup_private` tinyint(1) DEFAULT NULL, + `task_private` tinyint(1) DEFAULT NULL, + `default_requesttypes_id` int(11) DEFAULT NULL, + `password_forget_token` char(40) COLLATE utf8_unicode_ci DEFAULT NULL, + `password_forget_token_date` datetime DEFAULT NULL, + `user_dn` text COLLATE utf8_unicode_ci, + `registration_number` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `show_count_on_tabs` tinyint(1) DEFAULT NULL, + `refresh_ticket_list` int(11) DEFAULT NULL, + `set_default_tech` tinyint(1) DEFAULT NULL, + `personal_token` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `personal_token_date` datetime DEFAULT NULL, + `display_count_on_home` int(11) DEFAULT NULL, + `notification_to_myself` tinyint(1) DEFAULT NULL, + `duedateok_color` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `duedatewarning_color` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `duedatecritical_color` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `duedatewarning_less` int(11) DEFAULT NULL, + `duedatecritical_less` int(11) DEFAULT NULL, + `duedatewarning_unit` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `duedatecritical_unit` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `display_options` text COLLATE utf8_unicode_ci, + `is_deleted_ldap` tinyint(1) NOT NULL DEFAULT '0', + `pdffont` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `picture` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `begin_date` datetime DEFAULT NULL, + `end_date` datetime DEFAULT NULL, + `keep_devices_when_purging_item` tinyint(1) DEFAULT NULL, + `privatebookmarkorder` longtext COLLATE utf8_unicode_ci, + `backcreated` tinyint(1) DEFAULT NULL, + `task_state` int(11) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `unicity` (`name`), + KEY `firstname` (`firstname`), + KEY `realname` (`realname`), + KEY `entities_id` (`entities_id`), + KEY `profiles_id` (`profiles_id`), + KEY `locations_id` (`locations_id`), + KEY `usertitles_id` (`usertitles_id`), + KEY `usercategories_id` (`usercategories_id`), + KEY `is_deleted` (`is_deleted`), + KEY `is_active` (`is_active`), + KEY `date_mod` (`date_mod`), + KEY `authitem` (`authtype`,`auths_id`), + KEY `is_deleted_ldap` (`is_deleted_ldap`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=6 ; + +-- +-- Contenu de la table `glpi_users` +-- + +INSERT INTO `glpi_users` (`id`, `name`, `password`, `phone`, `phone2`, `mobile`, `realname`, `firstname`, `locations_id`, `language`, `use_mode`, `list_limit`, `is_active`, `comment`, `auths_id`, `authtype`, `last_login`, `date_mod`, `date_sync`, `is_deleted`, `profiles_id`, `entities_id`, `usertitles_id`, `usercategories_id`, `date_format`, `number_format`, `names_format`, `csv_delimiter`, `is_ids_visible`, `dropdown_chars_limit`, `use_flat_dropdowntree`, `show_jobs_at_login`, `priority_1`, `priority_2`, `priority_3`, `priority_4`, `priority_5`, `priority_6`, `followup_private`, `task_private`, `default_requesttypes_id`, `password_forget_token`, `password_forget_token_date`, `user_dn`, `registration_number`, `show_count_on_tabs`, `refresh_ticket_list`, `set_default_tech`, `personal_token`, `personal_token_date`, `display_count_on_home`, `notification_to_myself`, `duedateok_color`, `duedatewarning_color`, `duedatecritical_color`, `duedatewarning_less`, `duedatecritical_less`, `duedatewarning_unit`, `duedatecritical_unit`, `display_options`, `is_deleted_ldap`, `pdffont`, `picture`, `begin_date`, `end_date`, `keep_devices_when_purging_item`, `privatebookmarkorder`, `backcreated`, `task_state`) VALUES +(2, 'glpi', '$2y$10$5upG6.XYnLxkZgtJrKPESuEoO/9jYP1TkAckMfABuC8NBN.h8l3UK', '', '', '', '', NULL, 0, 'fr_FR', 0, 20, 1, NULL, 0, 1, '2016-01-20 15:32:14', '2016-01-20 14:38:08', NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +(3, 'post-only', '3177926a7314de24680a9938aaa97703', '', '', '', '', NULL, 0, 'en_GB', 0, 20, 1, NULL, 0, 0, NULL, NULL, NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +(4, 'tech', 'd9f9133fb120cd6096870bc2b496805b', '', '', '', '', NULL, 0, 'en_GB', 0, 20, 1, NULL, 0, 0, NULL, NULL, NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +(5, 'normal', 'fea087517c26fadd409bd4b9dc642555', '', '', '', '', NULL, 0, 'en_GB', 0, 20, 1, NULL, 0, 0, NULL, NULL, NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_usertitles` +-- + +CREATE TABLE IF NOT EXISTS `glpi_usertitles` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `name` (`name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_virtualmachinestates` +-- + +CREATE TABLE IF NOT EXISTS `glpi_virtualmachinestates` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '', + `comment` text COLLATE utf8_unicode_ci NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_virtualmachinesystems` +-- + +CREATE TABLE IF NOT EXISTS `glpi_virtualmachinesystems` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '', + `comment` text COLLATE utf8_unicode_ci NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_virtualmachinetypes` +-- + +CREATE TABLE IF NOT EXISTS `glpi_virtualmachinetypes` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '', + `comment` text COLLATE utf8_unicode_ci NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_vlans` +-- + +CREATE TABLE IF NOT EXISTS `glpi_vlans` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `comment` text COLLATE utf8_unicode_ci, + `tag` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `name` (`name`), + KEY `entities_id` (`entities_id`), + KEY `tag` (`tag`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `glpi_wifinetworks` +-- + +CREATE TABLE IF NOT EXISTS `glpi_wifinetworks` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `entities_id` int(11) NOT NULL DEFAULT '0', + `is_recursive` tinyint(1) NOT NULL DEFAULT '0', + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `essid` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `mode` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT 'ad-hoc, access_point', + `comment` text COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`), + KEY `entities_id` (`entities_id`), + KEY `essid` (`essid`), + KEY `name` (`name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-glpi/postservices/01-update-glpi b/seed/release/eole-2.7/2.7.1/applicationservice/eole-glpi/postservices/01-update-glpi new file mode 100644 index 0000000000000000000000000000000000000000..c3e3782f8d05709e082d603570780971c7a239af --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-glpi/postservices/01-update-glpi @@ -0,0 +1,43 @@ +#!/bin/bash + +if [ "$(CreoleGet activer_glpi non)" = "oui" ] +then + #Update GLPI database + php /var/www/html/glpi/tools/cliupdate.php --fr --upgrade + + #Update plugin ocsinventoryng database + cd /var/www/html/glpi/plugins/ocsinventoryng/tools/ + php ./ocs_update.php + + #Update connexion parameters for plugin ocsinventoryng + if [ "$(CreoleGet activer_ocsinventory non)" = "oui" ] + then + container_path_web=$(CreoleGet container_path_web) + container_ip_mysql=$(CreoleGet container_ip_mysql) + adresse_ip_mysql=$(CreoleGet adresse_ip_mysql) + if [ "$adresse_ip_mysql" = "localhost" ] + then + adresse_ip_mysql="127.0.0.1" + fi + + # récupération des paramètres de connexion à la base de données OCS + USEROCS=$(grep -R 'COMPTE_BASE' $container_path_web/usr/share/ocsinventory-reports/dbconfig.inc.php |cut -d'"' -f4) + PWDOCS=$(grep -R 'PSWD_BASE' $container_path_web/usr/share/ocsinventory-reports/dbconfig.inc.php |cut -d'"' -f4) + + # récupération des paramètres de connexion à la base de données GLPI + PWDGLPI=$(grep -R 'dbpassword' $container_path_web/var/www/html/glpi/config/config_db.php |cut -d'"' -f2) + + # mise à jour du champ TRACE_DELETED à 1 (true) de la table config de la base ocsweb pour fonctionnement du plugin ocsinventoryng + /usr/bin/mysql -u$USEROCS -p$PWDOCS -D ocsweb -h$adresse_ip_mysql -e "UPDATE config SET IVALUE = 1 WHERE config.NAME = 'TRACE_DELETED'" + + # mise à jour de la table contenant les paramètres de connexion glpi à la base OCS + /usr/bin/mysql -u admin_glpi -p$PWDGLPI -D glpi -h$adresse_ip_mysql -e "UPDATE glpi_plugin_ocsinventoryng_ocsservers SET ocs_db_passwd = '"$PWDOCS"',ocs_db_user = '"$USEROCS"' WHERE glpi_plugin_ocsinventoryng_ocsservers.name = 'localhost'" + fi + inst=/var/www/html/glpi/install/install.php + if [ -e $inst ] + then + rm $inst + fi +fi + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-glpi/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-glpi/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..82a375381e52851af8253b853462ffa5b4d7de8f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-glpi/service.yml @@ -0,0 +1,41 @@ +format: '0.1' +name: eole-glpi +version: |- + 2.7.1-17 +description: |- + Dictionnaire, templates et utilitaires pour GLPI + Pour toute information complementaire, veuillez vous rendre + sur le site du Projet Eole a l'adresse suivante : + . + http://eole.orion.education.fr +depends: + - eole-web + - eole-mysql + - eole-db + - eole-client-annuaire +packages: [] +dictionaries: + - 52_esbl_glpi.xml +extra_dictionaries: {} +templates: + - apache-glpi.conf + - glpi-update.sql + - glpi.yml + - glpi_config_db.php +creole_funcs: [] +preservices: [] +postservices: + - 01-update-glpi +pretemplates: [] +posttemplates: [] +files: + /usr/share/eole/db/glpi/gen/0_eole-glpi.sql: + owner: root + group: root + mode: '0644' + /usr/share/eole/db/glpi/gen/1_eole-glpi.sql: + owner: root + group: root + mode: '0644' +excluding_regexp: + /usr/share/doc: 3 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-glpi/templates/apache-glpi.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-glpi/templates/apache-glpi.conf new file mode 100644 index 0000000000000000000000000000000000000000..52b2fb4ee72c1ce31c06f1cb3b0b803c506733be --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-glpi/templates/apache-glpi.conf @@ -0,0 +1,10 @@ +Alias /glpi /var/www/html/glpi +<Directory "/var/www/html/glpi"> + AddDefaultCharset ISO-8859-1 + AllowOverride None + DirectoryIndex index.php + Require all granted +%if %%is_defined('activer_fusioninventory') and %%activer_fusioninventory == 'oui' + php_admin_flag allow_url_fopen On +%end if +</Directory> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-glpi/templates/glpi-update.sql b/seed/release/eole-2.7/2.7.1/applicationservice/eole-glpi/templates/glpi-update.sql new file mode 100644 index 0000000000000000000000000000000000000000..6e07b8d974ea4c05c9ad9cedd90c38a1d06e2685 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-glpi/templates/glpi-update.sql @@ -0,0 +1,78 @@ +-- ------------------------------------------------- -- +-- configuration de l'authentification CAS dans GLPI -- +-- ------------------------------------------------- -- + +\r glpi +-- documentation URL +%set %%helpdesk_doc_url = %%getVar('glpi_helpdesk_doc_url', 'http://www.glpi-project.org/spip.php?rubrique3') +%set %%central_doc_url = %%getVar('glpi_central_doc_url', 'http://www.glpi-project.org/spip.php?rubrique3') +LOCK TABLES `glpi_configs` WRITE; +UPDATE `glpi`.`glpi_configs` SET `value` = '%%helpdesk_doc_url' WHERE `glpi_configs`.`name` ='helpdesk_doc_url'; +UPDATE `glpi`.`glpi_configs` SET `value` = '%%central_doc_url' WHERE `glpi_configs`.`name` ='central_doc_url'; +UNLOCK TABLES; + +%if %%glpi_config_email == 'oui' +-- mail admin glpi -- +LOCK TABLES `glpi_configs` WRITE; +%if %%glpi_admin_email != '' +UPDATE `glpi`.`glpi_configs` SET `value` = '%%glpi_admin_email' WHERE `glpi_configs`.`name` ='admin_email'; +%end if +%if %%system_mail_from != '' +UPDATE `glpi`.`glpi_configs` SET `value` = '%%system_mail_from' WHERE `glpi_configs`.`name` ='admin_reply'; +%end if +UNLOCK TABLES; +%end if + + +%if %%getVar('glpi_ldap_auth', 'ne rien faire') == "oui" +-- LDAP -- +-- procedure de MAJ du groupe DomainAdmins si auth_ldap -- +DELIMITER // +DROP PROCEDURE IF EXISTS AddDomainAdmins// +CREATE PROCEDURE AddDomainAdmins() +BEGIN + DECLARE compteur int(5) default 0; + SELECT count(*) FROM `glpi_groups` WHERE `name`='LDAPAdmins' INTO compteur; + IF compteur = 0 THEN INSERT INTO `glpi_groups` (`entities_id`, `is_recursive`, `name`, `comment`, `groups_id`, `ldap_field`, `ldap_value`, `ldap_group_dn`, `completename`,`level`,`is_requester`, `is_assign`, `is_notify`, `is_itemgroup`, `is_usergroup`) VALUES (0,0,'LDAPAdmins',NULL,0,NULL,NULL,'%%glpi_domainadmins_dn','LDAPAdmins',1,1,1,1,1,1); + INSERT INTO `glpi_authldaps` (`id`) VALUES (1); + INSERT INTO `glpi_rules` (`entities_id`, `sub_type`, `ranking`, `name`, `description`, `match`, `is_active`, `comment`, `is_recursive`) VALUES (0,'RuleRight',2,'LDAPAdmins','','OR',1,'',0); + set @LDAPAdmins_rule_id=(SELECT `glpi_rules`.`id` FROM `glpi_rules` WHERE `glpi_rules`.`name`='LDAPAdmins'); + INSERT INTO `glpi_rulecriterias` (`rules_id`, `criteria`, `condition`, `pattern`) VALUES (@LDAPAdmins_rule_id,'GROUPS',0,'1'); + INSERT INTO `glpi_ruleactions` (`rules_id`, `action_type`, `field`, `value`) VALUES (@LDAPAdmins_rule_id,'assign','profiles_id','4'); + ELSE UPDATE `glpi`.`glpi_groups` SET `ldap_group_dn`='%%glpi_domainadmins_dn' WHERE name='LDAPAdmins'; + END IF; +END// +DELIMITER ; +-- Fin procedure -- + +CALL AddDomainAdmins(); +DROP PROCEDURE IF EXISTS AddDomainAdmins; +LOCK TABLES `glpi_authldaps` WRITE; +%if %%ldap_tls == 'oui' +-- probleme de certificat pour TLS, desactive (#3936) +-- %set %%use_tls = 1 +%set %%use_tls = 0 +%else +%set %%use_tls = 0 +%end if +UPDATE `glpi`.`glpi_authldaps` SET `name` = 'LDAP', `host` = '%%adresse_ip_ldap', `basedn` = '%%glpi_domainadmins_dn', `port` = 389, +`login_field` = 'mail', `use_tls` = %%use_tls, `group_condition` = '(objectClass=posixGroup)', `group_search_type` = 1, +`group_member_field` = 'memberuid', `email1_field` = 'mail', `realname_field` = 'sn', `firstname_field` = 'givenname', `use_dn` = 0, +`is_default` = 1, `is_active` = 1, `comment_field` = 'departmentnumber' WHERE `glpi_authldaps`.`id` =1 LIMIT 1 ; +UNLOCK TABLES; +%end if + +%if %%getVar('glpi_cas_auth', 'ne rien faire') == "oui" +-- CAS -- +LOCK TABLES `glpi_configs` WRITE; +UPDATE `glpi`.`glpi_configs` SET `value` = '%%eolesso_adresse' WHERE `glpi_configs`.`name` ='cas_host'; +UPDATE `glpi`.`glpi_configs` SET `value` = '%%eolesso_port' WHERE `glpi_configs`.`name` ='cas_port'; +UPDATE `glpi`.`glpi_configs` SET `value` = '%%getVar("eolesso_cas_folder", "")' WHERE `glpi_configs`.`name` ='cas_uri'; +UPDATE `glpi`.`glpi_configs` SET `value` = 'https://%%eolesso_adresse:%%eolesso_port/logout?service=https://%%web_url/glpi/front/login.php' WHERE `glpi_configs`.`name` ='cas_logout'; +%elif %%glpi_cas_auth == "non" +UPDATE `glpi`.`glpi_configs` SET `value` = '' WHERE `glpi_configs`.`name` ='cas_host'; +UPDATE `glpi`.`glpi_configs` SET `value` = '' WHERE `glpi_configs`.`name` ='cas_port'; +UPDATE `glpi`.`glpi_configs` SET `value` = '' WHERE `glpi_configs`.`name` ='cas_uri'; +UPDATE `glpi`.`glpi_configs` SET `value` = '' WHERE `glpi_configs`.`name` ='cas_logout'; +UNLOCK TABLES; +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-glpi/templates/glpi.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-glpi/templates/glpi.yml new file mode 100644 index 0000000000000000000000000000000000000000..b56ef607377442fd8142b523c9764458b8de603d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-glpi/templates/glpi.yml @@ -0,0 +1,30 @@ +%set %%db_mode = %%getVar('glpi_db_mode') +%set %%client_hosts = list(set(["127.0.0.1", "localhost", %%adresse_ip_br0, %%adresse_ip_root, %%adresse_ip_mysql, %%adresse_ip_web])) +%set %%extra_client_hosts = %%getVar('glpi_db_extra_allowed_hosts', []) +%%client_hosts.extend(%%extra_client_hosts) +%set %%client_hosts = [str(host) for host in %%client_hosts] +dbtype: mysql +dbname: glpi +dbuser: admin_glpi +dbpass: "EeX7Aewe" +client_hosts: %%client_hosts +%if %%db_mode != 'default' +%set %%db_host = %%getVar('glpi_db_host') +%if %%db_host == 'localhost' +%set %%db_host = '127.0.0.1' +%end if +dbhost: %%db_host +%end if +%if %%db_mode == 'externe' +dbport: %%glpi_db_port +dbroot: %%glpi_db_root +dbrootpwd: %%glpi_db_root_passwd_path +%end if +createscript: "/usr/share/eole/db/glpi/gen/0_eole-glpi.sql" +sqlscripts: ["/usr/share/eole/db/glpi/gen/1_eole-glpi.sql"] +updatescripts: ["/usr/share/eole/db/glpi/updates/glpi-update.sql"] +pwd_files: + - {file: '%%container_path_web/var/www/html/glpi/config/config_db.php', + pattern: 'var $dbpassword="', + owner: 'www-data:www-data', + mod: '540'} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-glpi/templates/glpi_config_db.php b/seed/release/eole-2.7/2.7.1/applicationservice/eole-glpi/templates/glpi_config_db.php new file mode 100644 index 0000000000000000000000000000000000000000..09661a5b1a57e00195952df96effce888c8be571 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-glpi/templates/glpi_config_db.php @@ -0,0 +1,12 @@ +<?php +%set %%db_host = %%getVar('glpi_db_host', %%adresse_ip_mysql) +%if %%db_host == 'localhost' +%set %%db_host = '127.0.0.1' +%end if + class DB extends DBmysql { +var $dbhost ="%%db_host"; +var $dbuser ="admin_glpi"; +var $dbpassword="glpi"; +var $dbdefault="glpi"; +} +?> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-glusterfs/dictionaries/00_eole-glusterfs_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-glusterfs/dictionaries/00_eole-glusterfs_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..380c8c5f1652908846bda5e50a3c0b70b3adab63 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-glusterfs/dictionaries/00_eole-glusterfs_packages.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>glusterfs-server</package> + <package>glusterfs-client</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-glusterfs/dictionaries/80_gluster.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-glusterfs/dictionaries/80_gluster.xml new file mode 100644 index 0000000000000000000000000000000000000000..03ce05424cefe42659d1d4976deb413dd30de224 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-glusterfs/dictionaries/80_gluster.xml @@ -0,0 +1,26 @@ +<creole> + <files> + <service_access service='glusterd'> + <port>24007</port> + <port>24008</port> + <port>49152</port> + <port>38465</port> + <port>38466</port> + <port>38467</port> + </service_access> + </files> + <variables> + <family name='glusterfs'> + <variable name='glusterfs_servername' description='Nom du noeud du glusterfs' type="domain_strict" mandatory="True" auto_freeze="True"/> + <variable name='glusterfs_remote_servername' description='Nom des noeuds du glusterfs' multi="True" type="domain_strict" mandatory="True" auto_freeze="True"/> + <variable name='glusterfs_name' description='Nom du volume' type="string" mandatory="True" auto_freeze="True"/> + <variable name='glusterfs_dirname_data' description='Répertoire contenant les données du cluster' type="filename" mandatory="True" auto_freeze="True"/> + <variable name='glusterfs_dirname' description='Point de montage du glusterfs' type="filename" mandatory="True" auto_freeze="True"/> + </family> + </variables> + <constraints> + <fill name='calc_val' target='glusterfs_servername'> + <param type='eole' name='valeur'>nom_domaine_machine</param> + </fill> + </constraints> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-glusterfs/files/usr/lib/eole/func_glust.sh b/seed/release/eole-2.7/2.7.1/applicationservice/eole-glusterfs/files/usr/lib/eole/func_glust.sh new file mode 100644 index 0000000000000000000000000000000000000000..00e9f72102da0850c0b35d36415614e523fc0562 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-glusterfs/files/usr/lib/eole/func_glust.sh @@ -0,0 +1,73 @@ +#!/bin/bash + +function glusterTest { + hostname=$(CreoleGet glusterfs_servername) + for remote_name in $(CreoleGet glusterfs_remote_servername); do + if [ -z $first_host ]; then + first_host=$remote_name + fi + if [[ $remote_name != $hostname ]]; then + tcpcheck 2 $remote_name:24007 > /dev/null 2>&1 + [[ $? != 0 ]] && echo "le port 24007 n'est pas accessible pour $remote_name" && exit 1 + if [[ $2 != 'remote' ]]; then + tcpcheck 2 $remote_name:22 > /dev/null 2>&1 + if [[ $? != 0 ]]; then + echo "le port 22 (SSH) n'est pas accessible pour $remote_name" + echo "Veuillez lancer le script de test './glusterfs_init test' sur $remote_name et valider si le test est ok" + read a + else + ssh root@$remote_name "/usr/share/eole/sbin/glusterfs_init test remote" + [[ $? != 0 ]] && echo "le test est en erreur sur $remote_name" && exit 1 + fi + fi + if [ $first_host = $hostname ]; then + # if not primary, test only primary + break + fi + fi + done + dirname_data=$(CreoleGet glusterfs_dirname_data) + if [ ! -d "$dirname_data" ]; then + echo "le répertoire $dirname_data n'existe pas" + exit 1 + fi + if [[ $2 = 'remote' && $first_host = $hostname ]]; then + # we are in master node + mount_point="$(CreoleGet glusterfs_servername):/$(CreoleGet glusterfs_name)" + df|grep -q ^"$mount_point " + if [ ! $? = 0 ]; then + echo "$mount_point n'est pas monté sur $hostname" + exit 1 + fi + fi + if [[ $2 != 'remote' ]]; then + echo "L'accès aux différents noeuds est ok" + fi +} + +error(){ + echo "ERREUR : parametres invalides !" >&2 + echo "utilisez l'option -h pour en savoir plus" >&2 + exit 1 +} + +usage(){ + echo "Usage for test: ./glusterfs_init [options]" + echo "Usage for install : ./glusterfs_init" + echo "-h : afficher l'aide" + echo "test : Tester les serveurs distants" +} + + +# Pas de paramètre +[[ $1 ]] && [[ $1 != "test" ]] && [[ $1 != '-h' ]] && error + +while getopts ":b:h" option; do + case "$option" in + test) glusterfs_init test ;; + :) error ;; + h) usage ;; + *) error ;; + esac + exit 0 +done diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-glusterfs/files/usr/share/eole/sbin/glusterfs_init b/seed/release/eole-2.7/2.7.1/applicationservice/eole-glusterfs/files/usr/share/eole/sbin/glusterfs_init new file mode 100644 index 0000000000000000000000000000000000000000..c1838804db13c6699455e7ccf4f77e85c093b945 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-glusterfs/files/usr/share/eole/sbin/glusterfs_init @@ -0,0 +1,56 @@ +#!/bin/bash + + +systemctl disable glustereventsd.service 2> /dev/null + +if [ -f /etc/eole/config.eol ]; then + hostname=$(CreoleGet glusterfs_servername) + glusterfs_name=$(CreoleGet glusterfs_name) + source /usr/lib/eole/func_glust.sh + glusterTest $@ + if [[ $# != 0 ]] && [[ $1 = "test" ]]; then + exit 0 + fi + found=0 + for name in $(CreoleGet glusterfs_remote_servername); do + [ "$name" = "$hostname" ] && found=1 && break + done + [ $found = 0 ] && echo "Le noeud local doit faire partie de 'glusterfs_remote_servername'" && exit 1 + + if [ "$(gluster volume info 2>&1)" = "No volumes present" ]; then + CMD='' + idx=0 + glusterfs_dirname_data=$(CreoleGet glusterfs_dirname_data) + for name in $(CreoleGet glusterfs_remote_servername); do + if [ ! "$name" = "$hostname" ]; then + gluster peer probe $name + fi + CMD="$CMD $name:$glusterfs_dirname_data/$glusterfs_name" + idx=$((idx+1)) + done + gluster volume create $glusterfs_name replica $idx$CMD + gluster volume start $glusterfs_name + fi + grep "^$hostname:/$glusterfs_name" /etc/fstab + if [ ! "$?" = "0" ]; then + all_server='' + for name in $(CreoleGet glusterfs_remote_servername); do + if [ ! "$name" = "$hostname" ]; then + [ ! "$all_server" = "" ] && all_server+=":" + all_server+="$name" + fi + done + destdir=$(CreoleGet glusterfs_dirname) + mkdir -p $destdir + echo "$hostname:/$glusterfs_name $destdir glusterfs backupvolfile-server=$all_server,defaults,_netdev 0 0" >> /etc/fstab + mv "$destdir" "${destdir%/}.old" + mkdir "$destdir" + mount -a + mv "${destdir%/}.old"/* "$destdir/" + rmdir "${destdir%/}.old" + fi +else + echo "Le serveur n'est pas configuré, config.eol inexistant" + exit 1 +fi +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-glusterfs/files/usr/share/eole/sbin/splitbrain b/seed/release/eole-2.7/2.7.1/applicationservice/eole-glusterfs/files/usr/share/eole/sbin/splitbrain new file mode 100644 index 0000000000000000000000000000000000000000..fdfde27a75219d1ca50245e4f47bbbf9b80f77b2 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-glusterfs/files/usr/share/eole/sbin/splitbrain @@ -0,0 +1,91 @@ +#!/usr/bin/env python3 + +import subprocess +from sys import exit +import xml.etree.cElementTree as etree + +brick = 'datastore0' + +def get_node_uuid(): + cmd = ["gluster", "system::", "uuid", "get", "--xml"] + out = execute(cmd) + + tree = etree.fromstring(out) + uuid_el = tree.find("uuidGenerate/uuid") + return uuid_el.text + + +def execute(cmd): + p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + out, err = p.communicate() + ret_code = p.returncode + if ret_code != 0: + print('error with execute {}'.format(' '.join(cmd))) + print(out) + exit(1) + return out + + +def get_external_bricks(): + pass + + +def find_sb_files(): + cmd = ['gluster', 'volume', 'heal', brick, 'info', '--xml'] + tree = etree.fromstring(execute(cmd)) + current = False + files = {} + for p in tree.findall('healInfo/bricks/brick'): + current_files = [] + for f in p.findall('file'): + filename = f.text + if filename != '/': + current_files.append(f.text) + files[p.get('hostUuid')] = {'name': p.find('name').text, + 'files': current_files} + + return files + + +def manager_file(rep, fil, bricks): + if rep.lower() == 'o': + if len(bricks) == 1: + dst_brick = bricks[0] + else: + for idx, br in enumerate(bricks): + print('{}: {}'.format(0, br)) + ret = int(input('numéro : ')) + dst_brick = bricks[ret] + cmd = ['gluster', 'volume', 'heal', brick, 'split-brain', + 'source-brick', dst_brick, fil] + execute(cmd) + + +def main(): + my_uuid = get_node_uuid() + files = find_sb_files() + files_managed = [] + for fil in files[my_uuid]['files']: + bricks = [] + for uuid in files: + if uuid != my_uuid and fil in files[uuid]['files']: + bricks.append(files[uuid]['name']) + + if bricks: + files_managed.append(fil) + rep = input('le fichier "{}" est désynchronisé, supprimer la version locale ? (o/N) : '.format(fil)) + manager_file(rep, fil, bricks) + + files_bricks = {} + for uuid in files: + if uuid != my_uuid: + for fil in files[uuid]['files']: + if fil not in files_managed: + files_bricks.setdefault(fil, []).append(files[uuid]['name']) + for fil, bricks in files_bricks.items(): + rep = input('le fichier "{}" est inexistant, récupérer le fichier ? (o/N) : '.format(fil)) + manager_file(rep, fil, bricks) + + +if __name__ == "__main__": + main() diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-glusterfs/postservices/00-glusterfs b/seed/release/eole-2.7/2.7.1/applicationservice/eole-glusterfs/postservices/00-glusterfs new file mode 100644 index 0000000000000000000000000000000000000000..a4004ca9aefe2978983738faab6fa8f6b7b76d33 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-glusterfs/postservices/00-glusterfs @@ -0,0 +1,24 @@ +#!/bin/bash + +. /usr/lib/eole/ihm.sh +option=$1 + +mount_point="$(CreoleGet glusterfs_servername):/$(CreoleGet glusterfs_name)" +df|grep -q ^"$mount_point " +if [ ! $? = 0 ]; then + if [ $option = 'instance' ]; then + Question_ouinon "Voulez vous initialiser les glusterfs (tous les noeuds doivent être accessible) ?" "True" "non" "warn" + if [ $? = 0 ]; then + glusterfs_init + if [ ! $? = 0 ]; then + EchoRouge "Glusterfs non initilisé" + exit 1 + fi + else + EchoOrange "Penser à initiliser glusterfs via la commande 'glusterfs_init'" + fi + else + EchoOrange "Penser à initiliser glusterfs via la commande 'glusterfs_init'" + fi +fi +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-glusterfs/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-glusterfs/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..dd91fdd168bf5b86129ddc3af8de7e31790af511 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-glusterfs/service.yml @@ -0,0 +1,40 @@ +format: '0.1' +name: eole-glusterfs +version: |- + 2.7.1-3 +description: |- + Eolisation for GlusterFS + This package provides the configuration structure of GlusterFS for EOLE servers. + . + It contains: + - the EOLE XML schemas + - the scripts to initialise and manage GlusterFS +depends: [] +packages: + - glusterfs-server + - glusterfs-client +dictionaries: + - 80_gluster.xml +extra_dictionaries: {} +templates: [] +creole_funcs: [] +preservices: [] +postservices: + - 00-glusterfs +pretemplates: [] +posttemplates: [] +files: + /usr/lib/eole/func_glust.sh: + owner: root + group: root + mode: '0644' + /usr/share/eole/sbin/glusterfs_init: + owner: root + group: root + mode: '0755' + /usr/share/eole/sbin/splitbrain: + owner: root + group: root + mode: '0755' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-gpo-script/dictionaries/00_eole-gpo-script_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gpo-script/dictionaries/00_eole-gpo-script_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..c990901f7934b5fe929d20bb2839656c5884751a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gpo-script/dictionaries/00_eole-gpo-script_packages.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>eole-gpo-script-pkg</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-gpo-script/dictionaries/25_gposcript.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gpo-script/dictionaries/25_gposcript.xml new file mode 100644 index 0000000000000000000000000000000000000000..3e205aaf21fdaa7db0e0f6aa209439057e928fba --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gpo-script/dictionaries/25_gposcript.xml @@ -0,0 +1,28 @@ +<?xml version='1.0' encoding='utf-8'?> + +<creole> + + <files> + <file name='/etc/eole/gposcript.conf'/> + </files> + + <variables> + + <family name='GPO' icon='windows'> + <variable name='activer_gpo_script' type='oui/non' description="Activer l'exécution de scripts à la connexion des utilisateurs" /> + </family> + + </variables> + + <constraints> + </constraints> + + <help> + <family name='GPO'>Paramétrage des GPO EOLE</family> + <variable name='activer_gpo_script'>Active l'exécution de scripts de "Logon"</variable> + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-gpo-script/files/usr/share/eole/gpo/reg/Machine/EnableLinkedConnections.reg b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gpo-script/files/usr/share/eole/gpo/reg/Machine/EnableLinkedConnections.reg new file mode 100644 index 0000000000000000000000000000000000000000..7cb4e2ad5901e0a877bce959c8bc1436337c57a0 Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gpo-script/files/usr/share/eole/gpo/reg/Machine/EnableLinkedConnections.reg differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-gpo-script/files/usr/share/eole/gpo/script/Machine/psscripts.ini b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gpo-script/files/usr/share/eole/gpo/script/Machine/psscripts.ini new file mode 100644 index 0000000000000000000000000000000000000000..5d939f8fe602c3c80034d463d7843937090e855b Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gpo-script/files/usr/share/eole/gpo/script/Machine/psscripts.ini differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-gpo-script/files/usr/share/eole/gpo/script/Machine/scripts.ini b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gpo-script/files/usr/share/eole/gpo/script/Machine/scripts.ini new file mode 100644 index 0000000000000000000000000000000000000000..49cc8ef0e116cef009fe0bd72473a964bbd07f9b Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gpo-script/files/usr/share/eole/gpo/script/Machine/scripts.ini differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-gpo-script/files/usr/share/eole/gpo/script/User/ps.ps1 b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gpo-script/files/usr/share/eole/gpo/script/User/ps.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..81abbdfd7535f5f06da977310ae764a085697d53 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gpo-script/files/usr/share/eole/gpo/script/User/ps.ps1 @@ -0,0 +1,172 @@ +Start-Transcript -Path "$env:temp\eole_script.log" -Append +Set-PSDebug -Trace 1 + +$before_netuse = @() +$after_netuse = @() + +function read_logon_script($path) { + + if(test-path $path) { + Write-Host "found", $path + $is_before = $true + Get-Content $path | ForEach-Object { + if ( $_ -eq "%%NetUse%%" -or $_ -eq "%NetUse%" ) { + $is_before = $false + } elseif ( $is_before -eq $true) { + $global:before_netuse += [System.Environment]::ExpandEnvironmentVariables($_) + } else { + $global:after_netuse += [System.Environment]::ExpandEnvironmentVariables($_) + } + } + } + else { + Write-Host "not found $path" + } +} + +function execute_cmd($items) { + if($items.length -gt 1) { + $cmd, $args = $items[1].split(' ', 2, [System.StringSplitOptions]::RemoveEmptyEntries) + if($cmd) { + $hide = $false + $wait = $true + if ($items.length -gt 2) { + $option = $items[2].Trim().ToUpper() + if($option -eq "HIDDEN") { + $hide = $true + } elseif ($option -eq "NOWAIT") { + $wait = $false + } else { + Write-Host "Unknown option $option for cmd $items" + return + } + } + if($items.length -gt 3) { + $option = $items[3].Trim().ToUpper() + if($option -eq "HIDDEN") { + $hide = $true + } elseif ($option -eq "NOWAIT") { + $wait = $false + } else { + Write-Host "Unknown option $option for cmd $items" + return + } + } + if($hide) { + $windowstyle = "Hidden" + } else { + $windowstyle = "Normal" + } + if($args) { + Write-Host "Launch command $cmd with arguments $args" + Start-Process -FilePath $cmd -WindowStyle $windowstyle -Wait:$wait -ArgumentList $args.split(' ') + } + else { + Write-Host "Launch command $cmd" + Start-Process -FilePath $cmd -WindowStyle $windowstyle -Wait:$wait + } + } + else { + Write-Host "Invalid line $items" + } + } + else { + Write-Host "Invalid line $items" + } + +} + +function execute_drive($items) { + if($items.length -eq 3) { + Try { + [ValidatePattern('^[a-zA-Z]:$')]$letter = $items[1] + } + catch { + Write-Host "Invalid letter for $items" + return + } + $unc = $items[2] + Write-Host "Map drive $unc in $letter" + Start-Process -FilePath "net" -ArgumentList "use","${letter}","$unc","/PERSISTENT:NO" -Wait -WindowStyle Hidden + } + else { + Write-Host "Invalid line $items" + } +} + +function execute($line) { + $items = $line.Split(',') + $type = $items[0] + if( $type -eq 'cmd' ) { + execute_cmd $items + } + elseif ( $type -eq 'lecteur' ) { + execute_drive $items + } + else { + Write-Host "unknown action type $_" + } +} + +#FIXME : $servername = $env:USERDNSDOMAIN +#ou si serveur de logon : $env:LOGONSERVER +$scripts_path = "$env:LOGONSERVER\sysvol\$env:USERDNSDOMAIN\scripts" + +# Personal script +$user = $env:USERNAME +$path = "$scripts_path\users\$user.txt" +read_logon_script $path + +# pour raison de compatibilité +$path = "$scripts_path\os\Vista.txt" +read_logon_script $path + +$major = [Environment]::OSVersion.Version.Major +$path = "$scripts_path\os\$major.txt" +read_logon_script $path + +$build = [Environment]::OSVersion.Version.Build +$path = "$scripts_path\os\$major\$build.txt" +read_logon_script $path + +# pour raison de compatibilité +$path = "$scripts_path\os\Vista\users\$user.txt" +read_logon_script $path +$path = "$scripts_path\os\$major\users\$user.txt" +read_logon_script $path +$path = "$scripts_path\os\$major\$build\users\$user.txt" +read_logon_script $path + +# Groups scripts +$Identity = [Security.Principal.WindowsIdentity]::GetCurrent() +$Principal = New-Object System.Security.Principal.WindowsPrincipal($Identity) + +$Groups = $Identity.Groups | ForEach-Object { $_.Translate([Security.Principal.NTAccount]) } + +$Groups |ForEach { + $group = $_.toString() + if ($group.StartsWith("$env:USERDOMAIN\")) { + $group = $group.Split('\', 2)[1] + $path = "$scripts_path\groups\$group.txt" + read_logon_script $path + # pour raison de compatibilité + $path = "$scripts_path\os\Vista\groups\$group.txt" + read_logon_script $path + $path = "$scripts_path\os\$major\groups\$group.txt" + read_logon_script $path + $path = "$scripts_path\os\$major\$build\groups\$group.txt" + read_logon_script $path + } +} + +$path = "$scripts_path\machines\$env:COMPUTERNAME.txt" +read_logon_script $path + +$before_netuse |ForEach { + execute $_ +} +$after_netuse |ForEach { + execute $_ +} + +Stop-Transcript diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-gpo-script/files/usr/share/eole/gpo/script/User/psscripts.ini b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gpo-script/files/usr/share/eole/gpo/script/User/psscripts.ini new file mode 100644 index 0000000000000000000000000000000000000000..cbc5548bb500db0cf1a29fe122d200ab0c1b438e Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gpo-script/files/usr/share/eole/gpo/script/User/psscripts.ini differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-gpo-script/files/usr/share/eole/gpo/script/User/scripts.ini b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gpo-script/files/usr/share/eole/gpo/script/User/scripts.ini new file mode 100644 index 0000000000000000000000000000000000000000..49cc8ef0e116cef009fe0bd72473a964bbd07f9b Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gpo-script/files/usr/share/eole/gpo/script/User/scripts.ini differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-gpo-script/files/usr/share/eole/gpo/script/importation.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gpo-script/files/usr/share/eole/gpo/script/importation.py new file mode 100644 index 0000000000000000000000000000000000000000..e8cccf553a26e16dae147b49d29f15b1e99fb795 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gpo-script/files/usr/share/eole/gpo/script/importation.py @@ -0,0 +1,169 @@ +#!/usr/bin/env python +import optparse +import ldb +import ntpath +from os.path import basename, exists, join +from glob import glob +from samba import smb +import samba.getopt as options +from samba.netcmd.gpo import samdb_connect, dc_url +from samba.dcerpc import nbt +from samba.net import Net +from samba.credentials import MUST_USE_KERBEROS +from samba.credentials import Credentials +from gpo_utils.policy import GPOVersion, savecontent, update_gpt_version, \ + update_gpc_version, set_ownership_and_mode, \ + gpc_update_extension + + +class ConnectBag: + pass + + +def connexion(lp, creds): + # Open connection SamDB and SMB + # We need to know writable DC to setup SMB connection + net = Net(creds=creds, lp=lp) + flags = (nbt.NBT_SERVER_LDAP | + nbt.NBT_SERVER_DS | + nbt.NBT_SERVER_WRITABLE) + cldap_ret = net.finddc(domain=lp.get('realm'), flags=flags) + dc_hostname = cldap_ret.pdc_dns_name + + realm = cldap_ret.dns_domain + + # Connect to DC over SMB + try: + conn = smb.SMB(dc_hostname, 'sysvol', lp=lp, creds=creds) + except Exception, e: + raise Exception("Error connecting to '%s' using SMB" % dc_hostname, e) + return conn, realm + + +def get_samdb(lp, creds, url): + bag = ConnectBag() + bag.lp = lp + bag.creds = creds + bag.url = url + samdb_connect(bag) + return bag.samdb + + +def get_gpo_informations(samdb, gpo_name): + base_dn = samdb.get_default_basedn() + base_dn.add_child(ldb.Dn(samdb, "CN=Policies,CN=System")) + search_scope = ldb.SCOPE_ONELEVEL + search_expr = "(&(objectClass=groupPolicyContainer)(displayname=%s))" % ldb.binary_encode(gpo_name) + # find groupPolicyContainer for given display name + try: + gpc_entry = samdb.search(base=base_dn, scope=search_scope, + expression=search_expr, + attrs=['versionNumber', + 'name', + 'gPCMachineExtensionNames', + 'gPCUserExtensionNames'])[0] + except Exception: + raise Exception("Container '%s' does not exist" % gpo_name) + gpo_id = gpc_entry['name'] + gpo_dn = gpc_entry['dn'] + gpo_version = int(str(gpc_entry['versionNumber'])) + return gpo_id, gpo_dn, gpo_version, gpc_entry + + +def main(gpo_name, context, policy_type, policy_unix_path, policy_smb_path): + """ + * copy @policy_unix_path@ file into @gpo_name@ policy directory + * update sam.ldb with gpc informations + ** gpo_name : the name of the GPO + ** context : "User" or "Machine" + ** policy_type : "Scripts" or 'Registry" (perhaps more in the future) + ** policy_unix_path : file to copy + ** policy_smb_path : policy path relative path + """ + + gpc_ext_list = {} + gpc_ext_list['Machine'] = {} + gpc_ext_list['User'] = {} + gpc_ext_list['Machine']['Scripts'] = ["{42B5FAAE-6536-11D2-AE5A-0000F87571E3}{40B6664F-4972-11D1-A7CA-0000F87571E3}"] + gpc_ext_list['User']['Scripts'] = ["{42B5FAAE-6536-11D2-AE5A-0000F87571E3}{40B66650-4972-11D1-A7CA-0000F87571E3}"] + gpc_ext_list['Machine']['Registry'] = ["{00000000-0000-0000-0000-000000000000}{BEE07A6A-EC9F-4659-B8C9-0B1937907C83}", "{B087BE9D-ED37-454F-AF9C-04291E351182}{BEE07A6A-EC9F-4659-B8C9-0B1937907C83}"] + gpc_ext_list['User']['Registry'] = ["{00000000-0000-0000-0000-000000000000}{BEE07A6A-EC9F-4659-B8C9-0B1937907C83}", "{B087BE9D-ED37-454F-AF9C-04291E351182}{BEE07A6A-EC9F-4659-B8C9-0B1937907C83}"] + try: + gpc_extension = gpc_ext_list[context][policy_type] + except: + print("Context {0} with {1} type not managed.".format(context, policy_type)) + raise + + parser = optparse.OptionParser() + lp = options.SambaOptions(parser).get_loadparm() + #creds = options.CredentialsOptions(parser).get_credentials(lp, fallback_machine=True) + creds = Credentials() + creds.guess(lp) + creds.set_kerberos_state(MUST_USE_KERBEROS) + + url = dc_url(lp, creds, None) + + samdb = get_samdb(lp, creds, url) + samdb.transaction_start() + try: + # connexion + conn, realm = connexion(lp, creds) + + gpo_id, gpo_dn, gpo_version, gpc_entry = get_gpo_informations(samdb, gpo_name) + sharepath = '{}\\Policies\\{}'.format(realm, gpo_id) + # load content if file exists + smb_path = ntpath.join(sharepath, policy_smb_path) + + # write file + with open(policy_unix_path, 'r') as contentfh: + content = contentfh.read() + try: + savecontent(smb_path, content, conn=conn) + except TypeError: + local_path = join('/home/sysvol/{}/Policies/{}'.format(realm, gpo_id), policy_smb_path) + savecontent(local_path, content) + + # modify gPCExtension field for GPO + gpc_update_extension(gpo_dn, gpc_entry, (context, gpc_extension), samdb) + + # update GPO version + gpoversion = GPOVersion() + gpoversion.extract(gpo_version) + gpoversion.add(context) + + # modify version in GPT + update_gpt_version(sharepath, gpoversion.value(), conn=conn) + + # modify version for groupPolicyContainer + update_gpc_version(gpo_dn, gpoversion.value(), samdb) + + # fix ownership + set_ownership_and_mode(smb_path, gpo=str(gpo_id), conn=conn, samdb=samdb) + + except Exception: + samdb.transaction_cancel() + raise + else: + samdb.transaction_commit() + +# Import Logon PowerShell scripts +for script_file in glob('/usr/share/eole/gpo/script/User/*.ini'): + main('eole_script', 'User', 'Scripts', script_file, join('User/Scripts', basename(script_file))) +for script_file in glob('/usr/share/eole/gpo/script/User/*.ps1'): + main('eole_script', 'User', 'Scripts', script_file, join('User/Scripts/Logon', basename(script_file))) + +# Import Machine StartUp PowerShell scripts +for script_file in glob('/usr/share/eole/gpo/script/Machine/*.ini'): + main('eole_script', 'Machine', 'Scripts', script_file, join('Machine/Scripts', basename(script_file))) +for script_file in glob('/usr/share/eole/gpo/script/Machine/*.ps1'): + main('eole_script', 'Machine', 'Scripts', script_file, join('Machine/Scripts/StartUp', basename(script_file))) + +# Import Machine Registry XML +regxml_file = '/usr/share/eole/gpo/reg/Machine/Registry.xml' +if exists(regxml_file): + main('eole_script', 'Machine', 'Registry', regxml_file, 'Machine/Preferences/Registry/Registry.xml') + +# Import User Registry XML +regxml_file = '/usr/share/eole/gpo/reg/User/Registry.xml' +if exists(regxml_file): + main('eole_script', 'User', 'Registry', regxml_file, 'User/Preferences/Registry/Registry.xml') diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-gpo-script/files/usr/share/eole/gpo/script/reg_to_xml.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gpo-script/files/usr/share/eole/gpo/script/reg_to_xml.py new file mode 100644 index 0000000000000000000000000000000000000000..9da7e3b70a279ca07335fc6163b0ae88abc2985e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gpo-script/files/usr/share/eole/gpo/script/reg_to_xml.py @@ -0,0 +1,161 @@ +#!/usr/bin/env python +# -*- coding: UTF-8 -*- + +import re +import io +import uuid +from time import strftime +from glob import glob +from os import unlink +from os.path import exists, join +from configparser import ConfigParser +from lxml.etree import Element, SubElement, tostring + + +def read_reg(filename, encoding='utf-16'): + """ + Returns array of regkey informations from a regfile + Ret : [[key_path, key_name, key_type, key_value], [......]] + """ + with io.open(filename, encoding=encoding) as f: + data = f.read() + # get rid of non-section strings in the beginning of .reg file + data = re.sub(r'^[^\[]*\n', '', data, flags=re.S) + cfg = ConfigParser(strict=False) + # dirty hack for "disabling" case-insensitive keys in "configparser" + cfg.optionxform=str + cfg.read_string(data) + data = [] + # iterate over sections and keys and generate `data` + for s in cfg.sections(): + if not cfg[s]: + data.append([s, None, None, None]) + for key in cfg[s]: + tp = val = None + if cfg[s][key]: + # take care of value type + if ':' in cfg[s][key]: + tp, val = cfg[s][key].split(':') + else: + val = cfg[s][key].replace('"', '').replace(r'\\\n', '') + data.append([s, key.replace('"', ''), tp, val]) + return data + +def hex_to_str(hex_val): + """ + Returns array of string from regfile hex values + * hex_val example : "aa, 00, 30, 00, 00, 31, 00, 00, 00" + """ + ret = [] + hex_values = re.split(",00,00,00,*", hex_val.replace("\\\n", "")) + try: + hex_values.remove('00,00') + except: + hex_values.remove('') + for hex_value in hex_values: + key_value = "" + for hex_char in hex_value.replace(",00", "").split(','): + key_value += str(chr(int("0x" + hex_char, 16))) + ret.append(key_value) + return ret + +def gen_RegXML(data): + """ + Returns RegXml from array of regkey informations + """ + + if data == []: + return "" + + Reg_key_type = {"dword":"REG_DWORD", + "hex":"REG_BINARY", + "hex(7)":"REG_MULTI_SZ", + "hex(2)":"REG_EXPAND_SZ", + "hex(b)":"REG_QWORD" + } + RegistrySettings_clsid = "{A3CCFC41-DFDB-43a5-8D26-0FE8B954DA51}" + RegistryElement_clsid = "{9CD4B2F4-923D-47f5-A062-E897DD1DAD50}" + root_element = Element("RegistrySettings") + root_element.set("clsid", RegistrySettings_clsid) + key_change = strftime("%Y-%m-%d %H:%M:%S") + for reg_entry in data: + key_name = reg_entry[1] + if key_name is None: + continue + guid = str(uuid.uuid4()) + uid = "{%s}" % guid.upper() + keypath = reg_entry[0].split('\\') + key_hive = keypath[0] + key_location = "\\".join(keypath[1:]) + multi_val = [] + if reg_entry[2] is not None: + key_type = Reg_key_type[reg_entry[2]] + else: + key_type = "REG_SZ" + if key_type == "REG_BINARY": + key_image = "17" + key_value = reg_entry[3].replace(",", "").upper() + elif key_type == "REG_SZ": + key_image = "7" + key_value = reg_entry[3] + elif key_type == "REG_MULTI_SZ": + key_image = "7" + multi_val = hex_to_str(reg_entry[3]) + key_value = " ".join(multi_val) + elif key_type == "REG_EXPAND_SZ": + key_image = "7" + key_value = hex_to_str(reg_entry[3])[0] + elif key_type == "REG_QWORD": + key_image = "12" + key_value = reg_entry[3].replace(",", "").upper() + else: + key_image = "12" + key_value = reg_entry[3] + RegistryElement = SubElement(root_element, "Registry") + RegistryElement.set("clsid", RegistryElement_clsid) + RegistryElement.set("name", key_name) + RegistryElement.set("status", key_name) + RegistryElement.set("image", key_image) + RegistryElement.set("change", key_change) + RegistryElement.set("uid", uid) + PropertiesElement = SubElement(RegistryElement, "Properties") + PropertiesElement.set("action", "U") + PropertiesElement.set("displayDecimal", "1") + PropertiesElement.set("default", "0") + PropertiesElement.set("hive", key_hive) + PropertiesElement.set("key", key_location) + PropertiesElement.set("name", key_name) + PropertiesElement.set("type", key_type) + PropertiesElement.set("value", key_value) + if multi_val != []: + PropertiesElement.set("value", " ".join(multi_val)) + ValuesElement = SubElement(PropertiesElement, "Values") + for value in multi_val: + ValueElement = SubElement(ValuesElement, "Value") + ValueElement.text = value + + return tostring(root_element, encoding="UTF-8", xml_declaration=True) + + +def main(reg_path): + """ + Convert exported registry files to Registry.xml into @reg_files_path@ + * reg_path : path containing reg files to convert to Registry.xml + """ + data = [] + for regfile in glob(join(reg_path, '*.reg')): + data += read_reg(regfile) + RegistryXML = gen_RegXML(data) + regxml_filepath = join(reg_path, "Registry.xml") + if RegistryXML == "": + if exists(regxml_filepath): + unlink(regxml_filepath) + else: + with open(regxml_filepath, "w") as reg: + reg.write(RegistryXML) + +# Convert Machine registry files to usr/share/eole/gpo/reg/Machine/Registry.xml +main('/usr/share/eole/gpo/reg/Machine') + +# Convert User registry files to usr/share/eole/gpo/reg/User/Registry.xml +main('/usr/share/eole/gpo/reg/User') diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-gpo-script/postservices/30-gposcript b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gpo-script/postservices/30-gposcript new file mode 100644 index 0000000000000000000000000000000000000000..58cc4ccc23ff429344867344ebb0ab2305b51831 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gpo-script/postservices/30-gposcript @@ -0,0 +1,74 @@ +#!/bin/bash + +set -e + +. /etc/eole/gposcript.conf +. /etc/eole/samba4-vars.conf +KEYFILE="/tmp/gpoinit.keytab" +[ -f "$KEYFILE" ] && rm -f "$KEYFILE" +GPONAME="eole_script" +USER="$AD_ADMIN@"$(echo $AD_REALM | tr a-z A-Z) +SCRIPTS_DIR="/home/sysvol/$AD_REALM/scripts" + +function kinituser() +{ + # init kerberos ticket + samba-tool domain exportkeytab "$KEYFILE" --principal="$USER" > /dev/null 2>&1 + kinit "$USER" -k -t "$KEYFILE" +} + +function kdestroyuser() +{ + # destroy kerberos ticket + kdestroy + rm -f "$KEYFILE" +} + +function makedirs() +{ + if [ -d $SCRIPTS_DIR ];then + for dir in users groups machines os;do + [ -d "$SCRIPTS_DIR/$dir" ] || mkdir "$SCRIPTS_DIR/$dir" + done + fi +} + +if [ $GPOSCRIPT -eq 0 ]; then + + kinituser + makedirs + + # exit if GPO already exists, should update it if needs + if $(samba-tool gpo listall -k 1 |grep -q "display name : $GPONAME"); + then + kdestroyuser + exit 0 + fi + + echo "Enregistrement du GPO EOLE \"$GPONAME\"" + + # create GPO + msg=$(samba-tool gpo create "$GPONAME" -k 1) + GPOID=$(echo $msg | awk -F" created as " '{ print $2 }') + + # register WaitNetwork policy and configure it + gpo-tool policy inspect WaitNetwork > /dev/null 2>&1 || gpo-tool policy register 'WaitNetwork' '{35378EAC-683F-11D2-A89A-00C04FBBCFA2}{D02B1F73-3407-48AE-BA88-E8213C6761F1}' 'Registry.pol' 'User' 'HKLM\Software\Policies\Microsoft\Windows NT\CurrentVersion\Winlogon;SyncForegroundPolicy;REG_DWORD;4;{value}' + gpo-tool policy add "$GPONAME" "WaitNetwork" -v "value:1" -k 1 + + # link to base DN + samba-tool gpo setlink "$BASEDN" $GPOID -k 1 > /dev/null + + # Convert regfiles in Registry.xml format + /usr/share/eole/gpo/script/reg_to_xml.py + + # import scripts and Registry.xml files in GPO + /usr/share/eole/gpo/script/importation.py +else + GPOID=$(ldbsearch -H /var/lib/samba/private/sam.ldb "(&(objectClass=groupPolicyContainer)(displayname=$GPONAME))" cn|grep ^"cn: {"|cut -d " " -f2) + [ -z $GPOID ] && exit 0 + echo "Suppression du GPO EOLE \"$GPONAME\"" + kinituser + samba-tool gpo del $GPOID -k 1 +fi + +kdestroyuser diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-gpo-script/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gpo-script/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..b352148ceda8d9d2aa4e7f462387e74f746d4215 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gpo-script/service.yml @@ -0,0 +1,58 @@ +format: '0.1' +name: eole-gpo-script +version: |- + 2.7.1-9 +description: |- + Script GPO de connexion des utilisateurs + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: [] +packages: + - eole-gpo-script-pkg +dictionaries: + - 25_gposcript.xml +extra_dictionaries: {} +templates: + - gposcript.conf +creole_funcs: [] +preservices: [] +postservices: + - 30-gposcript +pretemplates: [] +posttemplates: [] +files: + /usr/share/eole/gpo/reg/Machine/EnableLinkedConnections.reg: + owner: root + group: root + mode: '0755' + /usr/share/eole/gpo/script/Machine/psscripts.ini: + owner: root + group: root + mode: '0755' + /usr/share/eole/gpo/script/Machine/scripts.ini: + owner: root + group: root + mode: '0755' + /usr/share/eole/gpo/script/User/ps.ps1: + owner: root + group: root + mode: '0755' + /usr/share/eole/gpo/script/User/psscripts.ini: + owner: root + group: root + mode: '0755' + /usr/share/eole/gpo/script/User/scripts.ini: + owner: root + group: root + mode: '0755' + /usr/share/eole/gpo/script/importation.py: + owner: root + group: root + mode: '0755' + /usr/share/eole/gpo/script/reg_to_xml.py: + owner: root + group: root + mode: '0755' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-gpo-script/templates/gposcript.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gpo-script/templates/gposcript.conf new file mode 100644 index 0000000000000000000000000000000000000000..bd7e0875e66eb1f31f216f550db8ec70332b0ba0 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-gpo-script/templates/gposcript.conf @@ -0,0 +1,5 @@ +%if %%activer_gpo_script == 'oui' +GPOSCRIPT=0 +%else +GPOSCRIPT=1 +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-hapy-market/dictionaries/30_hapy-market.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-hapy-market/dictionaries/30_hapy-market.xml new file mode 100644 index 0000000000000000000000000000000000000000..062e7a57fa026dcec2cee1c6a71e06dbf72805b7 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-hapy-market/dictionaries/30_hapy-market.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<creole> + <files/> + <containers/> + <variables> + <family name='general'> + <variable name='eole_module' redefine='True' > + <value>hapy-market</value> + </variable> + <!-- <variable name='nombre_interfaces' redefine='True' mode='expert'/>--> + </family> + <!--<family name='Interface-0'> + <variable name='eth0_method' redefine='True' hidden='True'> + <value>statique</value> + </variable> + </family>--> + <separators/> + </variables> + <constraints/> + <help/> +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-hapy-market/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-hapy-market/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..df49eb4345bb6a1df7099281698b3cbb91791322 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-hapy-market/service.yml @@ -0,0 +1,23 @@ +format: '0.1' +name: eole-hapy-market +version: |- + 2.6.2-4 +description: |- + configuration du module EOLE : Hâpy + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: + - eole-server +packages: [] +dictionaries: + - 30_hapy-market.xml +extra_dictionaries: {} +templates: [] +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: [] +files: {} +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-hapy-master/dictionaries/30_hapy-master.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-hapy-master/dictionaries/30_hapy-master.xml new file mode 100644 index 0000000000000000000000000000000000000000..1c4e6b6eb4532e7b2b76eeb44c761057186c8a31 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-hapy-master/dictionaries/30_hapy-master.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<creole> + <files/> + <containers/> + <variables> + <family name='general'> + <variable name='eole_module' redefine='True' > + <value>hapy-master</value> + </variable> + <!-- <variable name='nombre_interfaces' redefine='True' mode='expert'/>--> + </family> + <family name='virtualisation'> + <variable name='activer_multinode' redefine='True' hidden='True' remove_condition='True'> + <value>oui</value> + </variable> + </family> + <!--<family name='Interface-0'> + <variable name='eth0_method' redefine='True' hidden='True'> + <value>statique</value> + </variable> + </family>--> + <separators/> + </variables> + <constraints/> + <help/> +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-hapy-master/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-hapy-master/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..099558171bec2e8da07d97aeccf8e01374159d30 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-hapy-master/service.yml @@ -0,0 +1,23 @@ +format: '0.1' +name: eole-hapy-master +version: |- + 2.6.2-4 +description: |- + configuration du module EOLE : Hâpy + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: + - eole-server +packages: [] +dictionaries: + - 30_hapy-master.xml +extra_dictionaries: {} +templates: [] +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: [] +files: {} +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-hapy-node/dictionaries/30_hapy-node.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-hapy-node/dictionaries/30_hapy-node.xml new file mode 100644 index 0000000000000000000000000000000000000000..a40b8257467335c69ab3155057d82107520ddb9c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-hapy-node/dictionaries/30_hapy-node.xml @@ -0,0 +1,50 @@ +<?xml version="1.0" encoding="utf-8"?> +<creole> + <files/> + <containers/> + <variables> + <family name='general'> + <variable name='eole_module' redefine='True' > + <value>hapy-node</value> + </variable> + <!-- <variable name='nombre_interfaces' redefine='True' mode='expert'/>--> + </family> + + + <family name='système'> + + <!-- We need to recalculate the variables --> + <variable name='eole_lv_names' redefine='True' remove_check='True' /> + <variable name='eole_lv_standard_extends' redefine='True' remove_check='True' /> + + </family> + <!--<family name='Interface-0'> + <variable name='eth0_method' redefine='True' hidden='True'> + <value>statique</value> + </variable> + </family>--> + <separators/> + </variables> + + <constraints> + <!-- Default AmonEcole* logical volumes --> + <auto name='calc_multi_val' target='eole_lv_names'> + <param>root</param> + <param>tmp</param> + <param>var</param> + <param>var+lib+one</param> + </auto> + + <!-- Default AmonEcole* logical volumes extension: 100% /home --> + <auto name='calc_multi_val' target='eole_lv_standard_extends'> + <param type='number'>0</param> + <param type='number'>0</param> + <param type='number'>0</param> + <param type='number'>100</param> + </auto> + + </constraints> + <help/> +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-hapy-node/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-hapy-node/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..cec86e33709f5092e27f6f986ecaa3d824f16b5c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-hapy-node/service.yml @@ -0,0 +1,23 @@ +format: '0.1' +name: eole-hapy-node +version: |- + 2.6.2-4 +description: |- + configuration du module EOLE : Hâpy + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: + - eole-server +packages: [] +dictionaries: + - 30_hapy-node.xml +extra_dictionaries: {} +templates: [] +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: [] +files: {} +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-hapy/dictionaries/30_hapy.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-hapy/dictionaries/30_hapy.xml new file mode 100644 index 0000000000000000000000000000000000000000..91c2c18bcc518c35c2272fbf5ac2fef0c1a306fa --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-hapy/dictionaries/30_hapy.xml @@ -0,0 +1,52 @@ +<?xml version="1.0" encoding="utf-8"?> +<creole> + <files/> + <containers/> + <variables> + <family name='general'> + <variable name='eole_module' redefine='True' > + <value>hapy</value> + </variable> + <!-- <variable name='nombre_interfaces' redefine='True' mode='expert'/>--> + </family> + + <family name='système'> + + <!-- We need to recalculate the variables --> + <variable name='eole_lv_names' redefine='True' remove_check='True' /> + <variable name='eole_lv_standard_extends' redefine='True' remove_check='True' /> + + </family> + + <!--<family name='Interface-0'> + <variable name='eth0_method' redefine='True' hidden='True'> + <value>statique</value> + </variable> + </family>--> + <separators/> + </variables> + <constraints> + + <!-- Default AmonEcole* logical volumes --> + <auto name='calc_multi_val' target='eole_lv_names'> + <param>root</param> + <param>tmp</param> + <param>var</param> + <param>var+tmp</param> + <param>var+lib+one</param> + </auto> + + <!-- Default AmonEcole* logical volumes extension: 100% /home --> + <auto name='calc_multi_val' target='eole_lv_standard_extends'> + <param type='number'>0</param> + <param type='number'>0</param> + <param type='number'>0</param> + <param type='number'>0</param> + <param type='number'>100</param> + </auto> + + </constraints> + <help/> +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-hapy/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-hapy/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..23b5f8708000d3aeaa97b976e1cd47118d856237 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-hapy/service.yml @@ -0,0 +1,23 @@ +format: '0.1' +name: eole-hapy +version: |- + 2.6.2-4 +description: |- + configuration du module EOLE : Hâpy + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: + - eole-server +packages: [] +dictionaries: + - 30_hapy.xml +extra_dictionaries: {} +templates: [] +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: [] +files: {} +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-horus/dictionaries/00_eole-horus_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-horus/dictionaries/00_eole-horus_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..3aee0c72b2bbd14dac662cff3a7b4a59d2b6c987 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-horus/dictionaries/00_eole-horus_packages.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>frontend-horus</package> + <package>minedu-scripts</package> + <package>eole-horus-backend</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-horus/dictionaries/30_horus.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-horus/dictionaries/30_horus.xml new file mode 100644 index 0000000000000000000000000000000000000000..ae476974b3f81fdfc76445622d0fe6955d160f57 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-horus/dictionaries/30_horus.xml @@ -0,0 +1,107 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + <service servicelist='horus_frontend'>horus_frontend</service> + </files> + + <containers> + <container name="mysql"> + <file filelist='mysql' name='/etc/mysql/conf.d/capti.cnf'/> + </container> + </containers> + + <variables> + + <family name='general'> + <variable name='eole_module' redefine='True'> + <value>horus</value> + </variable> + <variable name='nombre_interfaces' redefine='True' mode='expert'/> + </family> + + <family name='Interface-0'> + <variable name='eth0_method' redefine='True' hidden='True'> + <value>statique</value> + </variable> + </family> + + <family name='services'> + <variable name='horus_frontend' type='oui/non' description="Activation du service horus_frontend" > + <value>non</value> + </variable> + <variable name='activer_apache' redefine='True' > + <value>non</value> + </variable> + <variable name='activer_client_ldap' redefine='True' hidden='True'/> + <!-- service eole-sso local activé par défaut --> + <variable name='activer_sso' redefine='True'> + <value>local</value> + </variable> + <!-- Esu inactif par défaut --> + <variable name='activer_esu' redefine='True' hidden='False'> + <value>non</value> + </variable> + </family> + + <family name='système'> + + <!-- We need to recalculate the variables --> + <variable name='eole_lv_names' redefine='True' remove_check='True' /> + <variable name='eole_lv_standard_extends' redefine='True' remove_check='True' /> + + </family> + + <family name='mysql'> + <variable name='mysql_open_firewall' redefine='True'> + <value>oui</value> + </variable> + </family> + + <separators/> + + </variables> + + <constraints> + + <condition name='disabled_if_in' source='horus_frontend'> + <param>non</param> + <target type='servicelist'>horus_frontend</target> + </condition> + + <!-- Mysql ouvert sur le réseau local par défaut #18963 --> + <fill name='calc_val' target='ip_my_dist'> + <param type='eole' name='valeur'>adresse_network_eth0</param> + </fill> + <fill name='calc_val' target='mask_my_dist'> + <param type='eole' name='valeur'>adresse_netmask_eth0</param> + </fill> + + <!-- Default AmonEcole* logical volumes --> + <auto name='calc_multi_val' target='eole_lv_names'> + <param>root</param> + <param>tmp</param> + <param>var</param> + <param>var+lib</param> + <param>var+log</param> + <param>home</param> + </auto> + + <!-- Default AmonEcole* logical volumes extension: 100% /home --> + <auto name='calc_multi_val' target='eole_lv_standard_extends'> + <param type='number'>0</param> + <param type='number'>0</param> + <param type='number'>0</param> + <param type='number'>0</param> + <param type='number'>0</param> + <param type='number'>100</param> + </auto> + + </constraints> + + <help/> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-horus/dictionaries/40_horus_conteneurs.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-horus/dictionaries/40_horus_conteneurs.xml new file mode 100644 index 0000000000000000000000000000000000000000..36ef7592affa101b62af4c00aba87e8198a62434 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-horus/dictionaries/40_horus_conteneurs.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <containers> + <container name="bdd" id="50"/> + <container name="reseau" id="51"/> + <container name="partage" id="52"/> + <container name="mysql" group="bdd"/> + <container name="annuaire" group="bdd"/> + <container name="interbase" group="bdd"/> + <container name="web" group="reseau"/> + <container name="fichier" group="partage"/> + <container name="ftp" group="partage"/> + <container name="dhcp" group="partage"/> + </containers> + + <variables/> + + <constraints/> + + <help/> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-horus/files/usr/share/ead2/backend/config/actions/actions_horus.cfg b/seed/release/eole-2.7/2.7.1/applicationservice/eole-horus/files/usr/share/ead2/backend/config/actions/actions_horus.cfg new file mode 100644 index 0000000000000000000000000000000000000000..c6d5a2e7c3795e328993962caf2d94909d7ab999 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-horus/files/usr/share/ead2/backend/config/actions/actions_horus.cfg @@ -0,0 +1,8 @@ +horus/connexion +horus/gestion +horus/gestion_account +horus/gestion_group +horus/gestion_share +horus/gestion_user +horus/extraction_aaf +horus/scripts_admin diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-horus/files/usr/share/ead2/backend/config/perms/perm_horus.ini b/seed/release/eole-2.7/2.7.1/applicationservice/eole-horus/files/usr/share/ead2/backend/config/perms/perm_horus.ini new file mode 100644 index 0000000000000000000000000000000000000000..82c23a26ee5c1e723e19ed9a2877298b6b8be1fe --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-horus/files/usr/share/ead2/backend/config/perms/perm_horus.ini @@ -0,0 +1,23 @@ +[roles] +admin=Administrateur + +[permissions] +isis=admin +isis_stop=admin +isis_disconnect=admin +isis_sendmsg=admin +isis_login=admin +isis_quota=admin +gestion_index=admin +gestion_user_modify=admin +gestion_user_create=admin +gestion_user_suppr=admin +gestion_share_create=admin +gestion_share_modify=admin +gestion_share_suppr=admin +gestion_group_create=admin +gestion_group_modify=admin +gestion_group_suppr=admin +gestion_account_suppr=admin +extraction_aaf=admin +scripts_admin=admin diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-horus/files/usr/share/eole/config/grp_eole/DomainAdmins.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-horus/files/usr/share/eole/config/grp_eole/DomainAdmins.xml new file mode 100644 index 0000000000000000000000000000000000000000..746a7c9d0ebd0740ea07b64e18c168199a62e922 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-horus/files/usr/share/eole/config/grp_eole/DomainAdmins.xml @@ -0,0 +1,303 @@ +<?xml version="1.0"?> +<ESU> + <Serie>GU</Serie> + <Version>v4RC42</Version> + <Regles> + <Chemin nom="INI://%appdata%\Mozilla\Firefox\profiles.ini?section=Profile0"> + <Variable nom="Name" OS="254" type="STRING">Defaut</Variable> + <Variable nom="Path" OS="254" type="STRING">Profiles/Defaut</Variable> + <Variable nom="IsRelative" OS="254" type="BOOLEAN">1</Variable> + </Chemin> + <Chemin nom="JS://%appdata%\Mozilla\Firefox\Profiles\Defaut\user.js"> + <Variable nom="browser.startup.homepage" OS="254" type="STRING">http://eole.orion.education.fr/</Variable> + <Variable nom="browser.download.dir" OS="254" type="STRING">%PERSONAL%</Variable> + <Variable nom="browser.download.folderList" OS="254" type="DWORD">2</Variable> +%if %%getVar('esu_proxy_default', 'non') == 'oui' + <Variable nom="network.proxy.type" OS="254" type="DWORD">1</Variable> + <Variable nom="network.proxy.http" OS="254" type="STRING">%ESU_PROXY_HOST%</Variable> + <Variable nom="network.proxy.http_port" OS="254" type="DWORD">%ESU_PROXY_PORT%</Variable> + <Variable nom="network.proxy.no_proxies_on" OS="254" type="STRING">%ESU_PROXY_BYPASS%</Variable> + <Variable nom="network.proxy.share_proxy_settings" OS="254" type="BOOLEAN">true</Variable> +%end if + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders"> + <Variable nom="Personal" OS="254" type="STRING">U:\</Variable> + <Variable nom="My Pictures" OS="254" type="STRING">U:\Mes Images</Variable> + <Variable nom="Templates" OS="254" type="STRING">U:\Modèles</Variable> + <Variable nom="Favorites" OS="254" type="STRING">U:\config_eole\Favoris\</Variable> + <Variable nom="AppData" OS="254" type="STRING">U:\config_eole\Application Data\</Variable> + <Variable nom="History" OS="254" type="STRING">U:\config_eole\Local Settings\Historique\</Variable> + <Variable nom="Cookies" OS="254" type="STRING">U:\config_eole\Cookies\</Variable> + <Variable nom="Desktop" OS="254" type="STRING">R:\grp_eole\DomainAdmins\Bureau</Variable> + <Variable nom="Start Menu" OS="254" type="STRING">R:\grp_eole\DomainAdmins\Menu Démarrer</Variable> + <Variable nom="Startup" OS="254" type="STRING">R:\grp_eole\DomainAdmins\Menu Démarrer\Programmes\Démarrage</Variable> + <Variable nom="Programs" OS="254" type="STRING">R:\grp_eole\DomainAdmins\Menu Démarrer\Programmes</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\System"> + <Variable nom="ExcludeProfileDirs" OS="14" type="STRING">Mes Documents;Favoris;Bureau;Menu démarrer;Application Data;cookies;modèles</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\NetCache"> + <Variable nom="NoConfigCache" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="NoCacheViewer" OS="14" type="DWORD">1</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System"> + <Variable nom="DisableRegistryTools" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoDispCPL" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoDispBackgroundPage" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoDispScrSavPage" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NovisualStyleChoice" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="NoSizeChoice" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="NoColorChoice" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="SetVisualStyle" OS="6" type="STRING">%windir%\resources\themes\luna\luna.msstyles</Variable> + <Variable nom="NoDevMgrPage" OS="224" type="DWORD">SUPPR</Variable> + <Variable nom="NoConfigPage" OS="224" type="DWORD">SUPPR</Variable> + <Variable nom="NoFileSysPage" OS="224" type="DWORD">SUPPR</Variable> + <Variable nom="NoVirtMemPage" OS="224" type="DWORD">SUPPR</Variable> + <Variable nom="DisableTaskMgr" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="DisableLockWorkstation" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoSecCPL" OS="254" type="DWORD">SUPPR</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\software\microsoft\windows\currentversion\policies\explorer"> + <Variable nom="NoWelcomeScreen" OS="30" type="DWORD">SUPPR</Variable> + <Variable nom="NoDeletePrinter" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoAddPrinter" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoControlPanel" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="NoThemesTab" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="NoTrayContextMenu" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="LockTaskBar" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="notrayitemsdisplay" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="NoToolbarsOnTaskbar" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="noautotraynotify" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="HideClock" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="NoComputersNearMe" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="NoHardwareTab" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="NoDfsTab" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="NoSecurityTab" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="NoFileMenu" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoViewContextMenu" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoChangeAnimation" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="noshellsearchbutton" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="LinkResolveIgnoreLinkInfo" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoInstrumentation" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="NoNetConnectDisconnect" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="ClassicShell" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoDesktop" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="nomovingBands" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoDesktopCleanupWizard" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="NoSaveSettings" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoPropertiesMyComputer" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="NoManageMyComputerVerb" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="NoNetHood" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoRecentDocsNethood" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="NoInternetIcon" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoPropertiesMyDocuments" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="DisablePersonalDirChange" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="NoPropertiesRecycleBin" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="NoActiveDesktop" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoActiveDesktopChanges" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="nochangestartmenu" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoWindowsUpdate" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="nosmballoontip" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="nocommongroups" OS="30" type="DWORD">SUPPR</Variable> + <Variable nom="nostartmenusubfolders" OS="30" type="DWORD">SUPPR</Variable> + <Variable nom="nofavoritesmenu" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="norecentdocsmenu" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="nofind" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="norun" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="nosmhelp" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="nonetworkconnections" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="ForceStartMenuLogoff" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="NoSetActiveDesktop" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoSetFolders" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoFolderOptions" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="nosettaskbar" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="clearrecentdocsonexit" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="norecentdocshistory" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="nosimplestartmenu" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="nosmmydocs" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="nostartmenumymusic" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="nosmmypictures" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="nostartmenunetworkplaces" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="NoStartMenuPinnedList" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="NoStartMenuMfuProgramsList" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="NoStartMenuMorePrograms" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="NoUsernameInStartMenu" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="IntelliMenus" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="NoFileUrl" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="btnencoding" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="btnpaste" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="btncopy" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="btncut" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="btndiscussions" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="btnedit" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="btnprint" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="btnsize" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="btnmailnews" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="btntools" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="btnfullscreen" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="btnfolders" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="btnmedia" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="btnhistory" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="btnfavorites" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="btnsearch" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="btnhome" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="btnrefresh" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="btnstop" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="btnforward" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="btnback" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="SpecifyDefaultButtons" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoToolbarCustomize" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoBandCustomize" OS="254" type="DWORD">SUPPR</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\software\microsoft\windows\currentversion\policies\activedesktop"> + <Variable nom="NoDispAppearancePage" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoDispSettingsPage" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoHtmlWallpaper" OS="14" type="DWORD">SUPPR</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\software\policies\microsoft\windows\control panel\desktop"> + <Variable nom="screensaveactive" OS="254" type="DWORD">SUPPR</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\software\policies\microsoft\windows nt\printers\wizard"> + <Variable nom="Downlevel Browse" OS="14" type="DWORD">1</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\SOFTWARE\CRDP Bretagne\ESU"> + <Variable nom="LImprimantes" OS="30" type="STRING">SUPPR</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\software\CRDP Bretagne\esu\"> + <Variable nom="SetDefautPrinter" OS="30" type="DWORD">SUPPR</Variable> + <Variable nom="DelNotInList" OS="30" type="DWORD">SUPPR</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Network"> + <Variable nom="NoNetSetup" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoPrintSharingControl" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoFileSharingControl" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoRecycleFiles" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="ConfirmFileDelete" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="NoEntireNetwork" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="NoCdBurning" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="NoSharedDocuments" OS="6" type="DWORD">SUPPR</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Control Panel\Keyboard"> + <Variable nom="InitialKeyboardIndicators" OS="254" type="STRING">2</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\WinOldApp"> + <Variable nom="NoRealMode" OS="224" type="DWORD">SUPPR</Variable> + <Variable nom="disabled" OS="224" type="DWORD">SUPPR</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced"> + <Variable nom="Hidden" OS="254" type="DWORD">1</Variable> + <Variable nom="HideFileExt" OS="254" type="DWORD">0</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\software\microsoft\windows\currentversion\policies\nonenum"> + <Variable nom="{20D04FE0-3AEA-1069-A2D8-08002B30309D}" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="{450D8FBA-AD25-11D0-98A8-0800361B1103}" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="{645FF040-5081-101B-9F08-00AA002F954E}" OS="14" type="DWORD">SUPPR</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace\{2227A280-3AEA-1069-A2DE-08002B30309D}"> + <Variable nom="Info" OS="254" type="STRING">SUPPRALL</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Control Panel\Desktop"> + <Variable nom="Wallpaper" OS="254" type="STRING">SUPPR</Variable> + <Variable nom="TileWallpaper" OS="254" type="STRING">1</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings"> +%if %%getVar('esu_proxy_default', 'non') == 'oui' + <Variable nom="ProxyEnable" OS="254" type="DWORD">1</Variable> + <Variable nom="ProxyServer" OS="254" type="STRING">%ESU_PROXY_HOST%:%ESU_PROXY_PORT%</Variable> + <Variable nom="ProxyOverride" OS="254" type="STRING">%ESU_PROXY_BYPASS%</Variable> +%else + <Variable nom="ProxyEnable" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="ProxyServer" OS="254" type="STRING">IGNORE</Variable> + <Variable nom="ProxyOverride" OS="254" type="STRING">IGNORE</Variable> +%end if + <Variable nom="AutoConfigURL" OS="254" type="STRING">SUPPR</Variable> + <Variable nom="DisableCachingOfSSLPages" OS="254" type="DWORD">0</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Control Panel"> +%if %%getVar('esu_proxy_default', 'non') == 'oui' + <Variable nom="Proxy" OS="254" type="DWORD">1</Variable> +%else + <Variable nom="Proxy" OS="254" type="DWORD">SUPPR</Variable> +%end if + <Variable nom="SecurityTab" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="ContentTab" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="ConnectionsTab" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="ProgramsTab" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="AdvancedTab" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="HomePage" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="Cache" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="History" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="Colors" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="links" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="Fonts" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="Languages" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="Accessibility" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="Ratings" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="Certificates" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="Profiles" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="Wallet" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="Connection Wizard" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="Connection Settings" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="CalendarContact" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="CheckIfDefault" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="Advanced" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="Autoconfig" OS="254" type="DWORD">SUPPR</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Restrictions"> + <Variable nom="NoBrowserOptions" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="RestGoMenu" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoPrinting" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoSelectDownloadDir" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoBrowserSaveAs" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoFileOpen" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoViewSource" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoTheaterMode" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoFavorites" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoHelpMenu" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoHelpItemTipOfTheDay" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoHelpItemNetscapeHelp" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoHelpItemSendFeedback" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoBrowserContextMenu" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoBrowserBars" OS="254" type="DWORD">SUPPR</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\software\microsoft\Internet Explorer\Main"> + <Variable nom="Start Page" OS="254" type="STRING">IGNORE</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\software\policies\microsoft\windows\currentversion\identities"> + <Variable nom="locked down" OS="254" type="DWORD">SUPPR</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\software\policies\microsoft\windows\currentversion\internet settings"> + <Variable nom="Messaging" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="ResetWebSettings" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="FormSuggest" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="FormSuggest Passwords" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="CheckIfDefault" OS="254" type="DWORD">SUPPR</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Microsoft\Ftp"> + <Variable nom="Use PASV" OS="254" type="STRING">no</Variable> + <Variable nom="Use Web Based FTP" OS="254" type="STRING">no</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Cache"> + <Variable nom="Persistent" OS="254" type="DWORD">1</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Infodelivery\Restrictions"> + <Variable nom="NoChannelUI" OS="254" type="DWORD">SUPPR</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer"> + <Variable nom="Download Directory" OS="254" type="STRING"></Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\software\microsoft\outlook express"> + <Variable nom="BlockExeAttachments" OS="254" type="DWORD">0</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Toolbars\Restrictions"> + <Variable nom="NoLinksBar" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoAddressBar" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoToolBar" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoToolbarOptions" OS="254" type="DWORD">SUPPR</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\software\microsoft\windows\currentversion\policies\explorer\restrictcpl"> + <Variable nom="ForceClassicControlPanel" OS="6" type="DWORD">1</Variable> + </Chemin> + </Regles> + <numeroSerie>5nbVifon8P7J3JBCYXCx8Hh5fi0=</numeroSerie> +</ESU> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-horus/files/usr/share/eole/config/grp_eole/DomainUsers.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-horus/files/usr/share/eole/config/grp_eole/DomainUsers.xml new file mode 100644 index 0000000000000000000000000000000000000000..4e6427fa5a037f0eea961872e371577279ba6dab --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-horus/files/usr/share/eole/config/grp_eole/DomainUsers.xml @@ -0,0 +1,195 @@ +<?xml version="1.0"?> +<ESU> + <Serie>GU</Serie> + <Version>v4.0.2</Version> + <Regles> + <Chemin nom="INI://%appdata%\Mozilla\Firefox\profiles.ini?section=Profile0"> + <Variable nom="Name" OS="254" type="STRING">Defaut</Variable> + <Variable nom="Path" OS="254" type="STRING">Profiles/Defaut</Variable> + <Variable nom="IsRelative" OS="254" type="BOOLEAN">1</Variable> + </Chemin> + <Chemin nom="JS://%appdata%\Mozilla\Firefox\Profiles\Defaut\user.js"> + <Variable nom="browser.startup.homepage" OS="254" type="STRING">http://eole.orion.education.fr/</Variable> + <Variable nom="browser.download.dir" OS="254" type="STRING">%PERSONAL%</Variable> + <Variable nom="browser.download.folderList" OS="254" type="DWORD">2</Variable> +%if %%getVar('esu_proxy_default', 'non') == 'oui' + <Variable nom="network.proxy.type" OS="254" type="DWORD">1</Variable> + <Variable nom="network.proxy.http" OS="254" type="STRING">%ESU_PROXY_HOST%</Variable> + <Variable nom="network.proxy.http_port" OS="254" type="DWORD">%ESU_PROXY_PORT%</Variable> + <Variable nom="network.proxy.no_proxies_on" OS="254" type="STRING">%ESU_PROXY_BYPASS%</Variable> + <Variable nom="network.proxy.share_proxy_settings" OS="254" type="BOOLEAN">true</Variable> +%end if + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\software\policies\microsoft\windows\control panel\desktop"> + <Variable nom="screensaveactive" OS="254" type="DWORD">1</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\software\CRDP Bretagne\esu\"> + <Variable nom="DelNotInList" OS="30" type="DWORD">1</Variable> + <Variable nom="SetDefautPrinter" OS="30" type="DWORD">1</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\software\policies\microsoft\windows nt\printers\wizard"> + <Variable nom="Downlevel Browse" OS="14" type="DWORD">0</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\software\microsoft\windows\currentversion\policies\explorer\restrictcpl"> + <Variable nom="ForceClassicControlPanel" OS="6" type="DWORD">SUPPR</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\WinOldApp"> + <Variable nom="disabled" OS="224" type="DWORD">SUPPR</Variable> + <Variable nom="NoRealMode" OS="224" type="DWORD">SUPPR</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\software\microsoft\windows\currentversion\policies\activedesktop"> + <Variable nom="NoDispSettingsPage" OS="254" type="DWORD">1</Variable> + <Variable nom="NoDispAppearancePage" OS="254" type="DWORD">1</Variable> + <Variable nom="NoHtmlWallpaper" OS="14" type="DWORD">SUPPR</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace\{2227A280-3AEA-1069-A2DE-08002B30309D}"> + <Variable nom="Info" OS="254" type="STRING">SUPPRALL</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings"> +%if %%getVar('esu_proxy_default', 'non') == 'oui' + <Variable nom="ProxyEnable" OS="254" type="DWORD">1</Variable> + <Variable nom="ProxyServer" OS="254" type="STRING">%ESU_PROXY_HOST%:%ESU_PROXY_PORT%</Variable> + <Variable nom="ProxyOverride" OS="254" type="STRING">%ESU_PROXY_BYPASS%</Variable> +%else + <Variable nom="ProxyEnable" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="ProxyServer" OS="254" type="STRING">IGNORE</Variable> + <Variable nom="ProxyOverride" OS="254" type="STRING">IGNORE</Variable> +%end if + <Variable nom="AutoConfigURL" OS="254" type="STRING">SUPPR</Variable> + <Variable nom="DisableCachingOfSSLPages" OS="254" type="DWORD">0</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Control Panel"> +%if %%getVar('esu_proxy_default', 'non') == 'oui' + <Variable nom="Proxy" OS="254" type="DWORD">1</Variable> +%else + <Variable nom="Proxy" OS="254" type="DWORD">SUPPR</Variable> +%end if + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\software\microsoft\windows\currentversion\policies\nonenum"> + <Variable nom="{645FF040-5081-101B-9F08-00AA002F954E}" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="{450D8FBA-AD25-11D0-98A8-0800361B1103}" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="{20D04FE0-3AEA-1069-A2D8-08002B30309D}" OS="14" type="DWORD">SUPPR</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced"> + <Variable nom="HideFileExt" OS="254" type="DWORD">1</Variable> + <Variable nom="Hidden" OS="254" type="DWORD">0</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\software\policies\microsoft\windows\netcache"> + <Variable nom="NoConfigCache" OS="6" type="DWORD">1</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\software\microsoft\windows\currentversion\policies\network"> + <Variable nom="ConfirmFileDelete" OS="6" type="DWORD">1</Variable> + <Variable nom="NoRecycleFiles" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="NoEntireNetwork" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="NoCdBurning" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="NoSharedDocuments" OS="6" type="DWORD">1</Variable> + <Variable nom="NoFileSharingControl" OS="254" type="DWORD">1</Variable> + <Variable nom="NoPrintSharingControl" OS="254" type="DWORD">1</Variable> + <Variable nom="NoNetSetup" OS="254" type="DWORD">1</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System"> + <Variable nom="NoSecCPL" OS="254" type="DWORD">1</Variable> + <Variable nom="SetVisualStyle" OS="6" type="STRING">%windir%\resources\themes\luna\luna.msstyles</Variable> + <Variable nom="NoColorChoice" OS="6" type="DWORD">1</Variable> + <Variable nom="NoSizeChoice" OS="6" type="DWORD">1</Variable> + <Variable nom="NovisualStyleChoice" OS="6" type="DWORD">1</Variable> + <Variable nom="NoDispScrSavPage" OS="254" type="DWORD">1</Variable> + <Variable nom="NoDispBackgroundPage" OS="254" type="DWORD">1</Variable> + <Variable nom="DisableLockWorkstation" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="DisableTaskMgr" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="DisableRegistryTools" OS="254" type="DWORD">1</Variable> + <Variable nom="NoVirtMemPage" OS="224" type="DWORD">1</Variable> + <Variable nom="NoFileSysPage" OS="224" type="DWORD">1</Variable> + <Variable nom="NoConfigPage" OS="224" type="DWORD">1</Variable> + <Variable nom="NoDevMgrPage" OS="224" type="DWORD">1</Variable> + <Variable nom="NoDispCPL" OS="254" type="DWORD">1</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Control Panel\Keyboard"> + <Variable nom="InitialKeyboardIndicators" OS="254" type="STRING">2</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\software\microsoft\windows\currentversion\policies\explorer"> + <Variable nom="NoThemesTab" OS="6" type="DWORD">1</Variable> + <Variable nom="NoAddPrinter" OS="254" type="DWORD">1</Variable> + <Variable nom="NoDeletePrinter" OS="254" type="DWORD">1</Variable> + <Variable nom="nosettaskbar" OS="254" type="DWORD">1</Variable> + <Variable nom="NoFolderOptions" OS="254" type="DWORD">1</Variable> + <Variable nom="NoSetActiveDesktop" OS="254" type="DWORD">1</Variable> + <Variable nom="NoWelcomeScreen" OS="30" type="DWORD">1</Variable> + <Variable nom="HideClock" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="noautotraynotify" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="LockTaskBar" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoTrayContextMenu" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoComputersNearMe" OS="14" type="DWORD">1</Variable> + <Variable nom="noshellsearchbutton" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="NoViewContextMenu" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoFileMenu" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="ClassicShell" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoInstrumentation" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="NoActiveDesktopChanges" OS="14" type="DWORD">1</Variable> + <Variable nom="NoActiveDesktop" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoPropertiesRecycleBin" OS="14" type="DWORD">1</Variable> + <Variable nom="NoInternetIcon" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoNetHood" OS="254" type="DWORD">1</Variable> + <Variable nom="nomovingBands" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoDesktop" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoSetFolders" OS="254" type="DWORD">1</Variable> + <Variable nom="IntelliMenus" OS="6" type="DWORD">1</Variable> + <Variable nom="NoUsernameInStartMenu" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="NoStartMenuMorePrograms" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="NoStartMenuMfuProgramsList" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="NoStartMenuPinnedList" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="nostartmenunetworkplaces" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="nosmmypictures" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="nostartmenumymusic" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="nosmmydocs" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="nosimplestartmenu" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="norecentdocshistory" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="clearrecentdocsonexit" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="nosmhelp" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="norun" OS="254" type="DWORD">1</Variable> + <Variable nom="nofind" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="norecentdocsmenu" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="nofavoritesmenu" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="nostartmenusubfolders" OS="30" type="DWORD">SUPPR</Variable> + <Variable nom="nosmballoontip" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="ForceStartMenuLogoff" OS="14" type="DWORD">1</Variable> + <Variable nom="nonetworkconnections" OS="254" type="DWORD">1</Variable> + <Variable nom="nocommongroups" OS="30" type="DWORD">1</Variable> + <Variable nom="NoWindowsUpdate" OS="254" type="DWORD">1</Variable> + <Variable nom="nochangestartmenu" OS="254" type="DWORD">1</Variable> + <Variable nom="NoPropertiesMyDocuments" OS="14" type="DWORD">1</Variable> + <Variable nom="DisablePersonalDirChange" OS="14" type="DWORD">1</Variable> + <Variable nom="NoRecentDocsNethood" OS="14" type="DWORD">1</Variable> + <Variable nom="NoManageMyComputerVerb" OS="14" type="DWORD">1</Variable> + <Variable nom="NoPropertiesMyComputer" OS="14" type="DWORD">1</Variable> + <Variable nom="NoSaveSettings" OS="254" type="DWORD">1</Variable> + <Variable nom="NoDesktopCleanupWizard" OS="6" type="DWORD">1</Variable> + <Variable nom="NoSecurityTab" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="NoDfsTab" OS="14" type="DWORD">1</Variable> + <Variable nom="NoHardwareTab" OS="14" type="DWORD">1</Variable> + <Variable nom="NoChangeAnimation" OS="14" type="DWORD">1</Variable> + <Variable nom="NoNetConnectDisconnect" OS="254" type="DWORD">1</Variable> + <Variable nom="LinkResolveIgnoreLinkInfo" OS="254" type="DWORD">1</Variable> + <Variable nom="NoToolbarsOnTaskbar" OS="254" type="DWORD">1</Variable> + <Variable nom="notrayitemsdisplay" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="NoControlPanel" OS="14" type="DWORD">1</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\System"> + <Variable nom="ExcludeProfileDirs" OS="14" type="STRING">Mes Documents;Favoris;Bureau;Menu démarrer;Application Data;cookies;modèles</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders"><Variable nom="Personal" OS="254" type="STRING">U:\</Variable> + <Variable nom="Personal" OS="254" type="STRING">U:\</Variable> + <Variable nom="My Pictures" OS="254" type="STRING">U:\Mes Images</Variable> + <Variable nom="Templates" OS="254" type="STRING">U:\Modèles</Variable> + <Variable nom="Favorites" OS="254" type="STRING">U:\config_eole\Favoris\</Variable> + <Variable nom="AppData" OS="254" type="STRING">U:\config_eole\Application Data\</Variable> + <Variable nom="History" OS="254" type="STRING">U:\config_eole\Local Settings\Historique\</Variable> + <Variable nom="Cookies" OS="254" type="STRING">U:\config_eole\Cookies\</Variable> + <Variable nom="Desktop" OS="254" type="STRING">R:\grp_eole\DomainUsers\Bureau</Variable> + <Variable nom="Start Menu" OS="254" type="STRING">R:\grp_eole\DomainUsers\Menu Démarrer</Variable> + <Variable nom="Startup" OS="254" type="STRING">R:\grp_eole\DomainUsers\Menu Démarrer\Programmes\Démarrage</Variable> + <Variable nom="Programs" OS="254" type="STRING">R:\grp_eole\DomainUsers\Menu Démarrer\Programmes</Variable> + </Chemin> + </Regles> + <numeroSerie>0wRXJXd2d1Inq5lSYEcbIdRBcfc=</numeroSerie> +</ESU> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-horus/files/usr/share/eole/config/grp_eole/_ListeUtilisateurs.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-horus/files/usr/share/eole/config/grp_eole/_ListeUtilisateurs.xml new file mode 100644 index 0000000000000000000000000000000000000000..f954fb527a67c5f23a02d6ccddb10b6b8dfb7afd --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-horus/files/usr/share/eole/config/grp_eole/_ListeUtilisateurs.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="ISO-8859-1"?> +<ESU_ListeUtilisateurs> + <GU nom="DomainAdmins" type="G"/> + <GU nom="DomainUsers" type="G"/> + <numeroSerie>e9nWduIg6l7yAtJOyz88g6jAhR0=</numeroSerie></ESU_ListeUtilisateurs> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-horus/files/usr/share/eole/config/grp_eole/_Machine.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-horus/files/usr/share/eole/config/grp_eole/_Machine.xml new file mode 100644 index 0000000000000000000000000000000000000000..a6db149eb397680bd21180eed4395ec0b5841230 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-horus/files/usr/share/eole/config/grp_eole/_Machine.xml @@ -0,0 +1,55 @@ +<?xml version="1.0"?> +<ESU> + <Serie>GU</Serie> + <Version>v4RC42</Version> + <Regles> + <Chemin nom="REG://HKEY_LOCAL_MACHINE\Software\CRDP Bretagne\ESU"> + <Variable nom="CleanRegistry" OS="254" type="DWORD">1</Variable> + <Variable nom="DisconnectBadUsers" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="ModeDebug" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="ShowUsername" OS="254" type="DWORD">1</Variable> + </Chemin> + <Chemin nom="REG://HKEY_LOCAL_MACHINE\Network\Logon"> + <Variable nom="MustBeValidated" OS="224" type="DWORD">1</Variable> + <Variable nom="DontShowLastUser" OS="224" type="DWORD">1</Variable> + <Variable nom="UserProfiles" OS="224" type="DWORD">0</Variable> + </Chemin> + <Chemin nom="REG://HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\Network"> + <Variable nom="DisablePwdCaching" OS="224" type="DWORD">1</Variable> + </Chemin> + <Chemin nom="REG://HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"> + <Variable nom="DontDisplayLastUserName" OS="16" type="DWORD">1</Variable> + </Chemin> + <Chemin nom="REG://HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System"> + <Variable nom="DontDisplayLastUserName" OS="14" type="DWORD">1</Variable> + <Variable nom="ShutdownWithoutLogon" OS="254" type="DWORD">1</Variable> + <Variable nom="DisableCAD" OS="254" type="DWORD">1</Variable> + </Chemin> + <Chemin nom="REG://HKEY_LOCAL_MACHINE\Software\CRDP Bretagne\ESU\"> + <Variable nom="TimeServer" OS="254" type="STRING">SUPPR</Variable> + </Chemin> + <Chemin nom="REG://HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\System"> + <Variable nom="DeleteRoamingCache" OS="30" type="DWORD">1</Variable> + </Chemin> + <Chemin nom="PRIVILEGE"> + <Variable nom="SeSystemtimePrivilege" OS="30" type="STRING">SUPPR</Variable> + </Chemin> + <Chemin nom="REG://HKEY_LOCAL_MACHINE\software\microsoft\windows\currentversion\policies\explorer"> + <Variable nom="NoWelcomeScreen" OS="254" type="DWORD">SUPPR</Variable> + </Chemin> + <Chemin nom="REG://HKEY_USERS\.DEFAULT\Control Panel\Keyboard\"> + <Variable nom="InitialKeyboardIndicators" OS="254" type="STRING">2</Variable> + </Chemin> + <Chemin nom="REG://HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders"> + <Variable nom="Common Desktop" OS="254" type="STRING">R:\grp_eole\_Machine\Bureau</Variable> + <Variable nom="Common Startup" OS="254" type="STRING">R:\grp_eole\_Machine\Menu Démarrer\Programmes\Démarrage</Variable> + <Variable nom="Common Programs" OS="254" type="STRING">R:\grp_eole\_Machine\Menu Démarrer\Programmes\</Variable> + <Variable nom="Common Start Menu" OS="254" type="STRING">R:\grp_eole\_Machine\Menu Démarrer\</Variable> + <Variable nom="Common AppData" OS="224" type="STRING">R:\grp_eole\_Machine\Application Data</Variable> + </Chemin> + <Chemin nom="REG://HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\NetCache"> + <Variable nom="Enabled" OS="14" type="DWORD">0</Variable> + </Chemin> + </Regles> + <numeroSerie>U5Ee54DpQZjqUN8Kwtn1zY++ENo=</numeroSerie> +</ESU> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-horus/files/usr/share/eole/diagnose/22-frontend-horus b/seed/release/eole-2.7/2.7.1/applicationservice/eole-horus/files/usr/share/eole/diagnose/22-frontend-horus new file mode 100644 index 0000000000000000000000000000000000000000..c3684463171ae2a36a0950fb215d18148e660c5a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-horus/files/usr/share/eole/diagnose/22-frontend-horus @@ -0,0 +1,11 @@ +#!/bin/bash +. /usr/lib/eole/diagnose.sh + +EchoGras "*** Outil d'administration" +if [ $(CreoleGet horus_frontend) = 'oui' ];then + TestService "Frontend Horus" $(CreoleGet adresse_ip_eth0):7080 +else + Inactif "Frontend Horus" +fi +echo +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-horus/files/usr/share/zephir/monitor/configs/ldaphorus.agent b/seed/release/eole-2.7/2.7.1/applicationservice/eole-horus/files/usr/share/zephir/monitor/configs/ldaphorus.agent new file mode 100644 index 0000000000000000000000000000000000000000..bd6bea377787280a0c6c10cfddf16da9f4e454a0 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-horus/files/usr/share/zephir/monitor/configs/ldaphorus.agent @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +""" +Contenu de l'annuaire LDAP d'Horus +""" + +from zephir.monitor.agents.ldaphorus import LdapHorus + +# période de 3 minute -> 180 +period = 180 + +annu = LdapHorus('annuaire', + description = """Contenu de l'annuaire""", + period = period, + section = """Utilisation""", + requires = ['ldap'] + ) + +# liste des agents qui seront chargés +AGENTS = [annu] diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-horus/files/usr/share/zephir/monitor/configs/services/30_horus_frontend.srv b/seed/release/eole-2.7/2.7.1/applicationservice/eole-horus/files/usr/share/zephir/monitor/configs/services/30_horus_frontend.srv new file mode 100644 index 0000000000000000000000000000000000000000..b6a07f92a5f20f9e3dc9041af25184bfc6414370 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-horus/files/usr/share/zephir/monitor/configs/services/30_horus_frontend.srv @@ -0,0 +1,12 @@ +# -*- coding: UTF-8 -*- +""" +Surveillance du horus_frontend +""" + +from zephir.monitor.agents.services import TCPServices +from zephir.monitor.agentmanager.config import HORUS_FRONTEND + +if HORUS_FRONTEND: + data = {'localhost:7080': "Frontend Horus"} + AGENTS.append(TCPServices('horus_frontend', data, + period=115, description='Etat du service horus_frontend')) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-horus/pretemplates/01-horus b/seed/release/eole-2.7/2.7.1/applicationservice/eole-horus/pretemplates/01-horus new file mode 100644 index 0000000000000000000000000000000000000000..d93a40818a213f7a22f3b7e26bcb96cad3134583 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-horus/pretemplates/01-horus @@ -0,0 +1,26 @@ +#!/bin/bash + +WORKGROUPS=/home/workgroups + +if [ ! -d $WORKGROUPS ];then + mkdir -p $WORKGROUPS + chmod a+rx $WORKGROUPS +fi + +# On corrige le lien /data +if [ -d /home/data ];then + mv /home/data/* $WORKGROUPS + rm -rf /home/data + [ -L /data ] && ln -nsf $WORKGROUPS /data +fi + +# Ajout du lien /data -> /home/workgroups +[ ! -L /data ] && ln -nsf /home/workgroups /data + +# Ajout du lien dans le conteneur +container_path_fichier=$(CreoleGet container_path_fichier) +if [ "$container_path_fichier" != "" ];then + [ ! -L $container_path_fichier/data ] && ln -s /home/workgroups $container_path_fichier/data +fi + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-horus/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-horus/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..19e11c2cc07d375d5d6f043bb4f22e80de99c601 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-horus/service.yml @@ -0,0 +1,81 @@ +format: '0.1' +name: eole-horus +version: |- + 2.7.0-5 +description: |- + configuration du module EOLE : Horus + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: + - eole-annuaire + - eole-antivirus + - eole-bareos-mysql + - eole-client + - eole-cups + - eole-dhcp + - eole-esu + - eole-interbase + - eole-mysql + - eole-adminer + - eole-proftpd + - eole-sso + - eole-web + - eole-fichier-primaire + - eole-scribehorus + - horus-ad + - eole-server +packages: + - frontend-horus + - minedu-scripts + - eole-horus-backend +dictionaries: + - 30_horus.xml + - 40_horus_conteneurs.xml +extra_dictionaries: {} +templates: + - capti.cnf +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: + - 01-horus +posttemplates: [] +files: + /usr/share/ead2/backend/config/actions/actions_horus.cfg: + owner: root + group: root + mode: '0644' + /usr/share/ead2/backend/config/perms/perm_horus.ini: + owner: root + group: root + mode: '0644' + /usr/share/eole/config/grp_eole/DomainAdmins.xml: + owner: root + group: root + mode: '0644' + /usr/share/eole/config/grp_eole/DomainUsers.xml: + owner: root + group: root + mode: '0644' + /usr/share/eole/config/grp_eole/_ListeUtilisateurs.xml: + owner: root + group: root + mode: '0644' + /usr/share/eole/config/grp_eole/_Machine.xml: + owner: root + group: root + mode: '0644' + /usr/share/eole/diagnose/22-frontend-horus: + owner: root + group: root + mode: '0755' + /usr/share/zephir/monitor/configs/ldaphorus.agent: + owner: root + group: root + mode: '0644' + /usr/share/zephir/monitor/configs/services/30_horus_frontend.srv: + owner: root + group: root + mode: '0644' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-horus/templates/capti.cnf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-horus/templates/capti.cnf new file mode 100644 index 0000000000000000000000000000000000000000..ba4f2f7f6b5ff36eb01e3879c5a77698dc6a1f44 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-horus/templates/capti.cnf @@ -0,0 +1,13 @@ +[mysqld] +# !MODIF GFC POUR CAPTI! +lower_case_table_names=1 +log_bin_trust_function_creators=1 +innodb_buffer_pool_size = 16M +#innodb_log_arch_dir = /var/lib/mysql +#innodb_log_group_home_dir = /var/lib/mysql +innodb_data_file_path = ibdata1:10M:autoextend:max:2048M +innodb_log_file_size = 5M +innodb_log_buffer_size = 8M +innodb_log_files_in_group=2 +innodb_flush_log_at_trx_commit = 1 +#innodb_lock_wait_timeout = 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-infosquota/dictionaries/00_eole-infosquota_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-infosquota/dictionaries/00_eole-infosquota_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..3d38685c3833f08d2dea8ca529570a6374b393a5 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-infosquota/dictionaries/00_eole-infosquota_packages.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>eole-infosquota-apps</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-infosquota/dictionaries/52_infosquota.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-infosquota/dictionaries/52_infosquota.xml new file mode 100644 index 0000000000000000000000000000000000000000..f4ed5d9e420a8701a8f788daa1c1257c5807a729 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-infosquota/dictionaries/52_infosquota.xml @@ -0,0 +1,23 @@ +<?xml version='1.0' encoding='utf-8'?> +<creole> + + <files> + <service method='apache' servicelist='apache'>infosquota.conf</service> + </files> + + <variables> + <family name='applications web'> + <variable name='activer_infosquota' type='oui/non' description="Activer Infosquota (visualisation des quotas disques)" hidden='True'> + <value>oui</value> + </variable> + </family> + </variables> + + <constraints> + </constraints> + + <help> + <variable name='activer_infosquota'>Infosquota est un outil de visualisation des quotas disque des utilisateurs du réseau pédagogique</variable> + </help> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-infosquota/files/etc/cron.d/infosquota b/seed/release/eole-2.7/2.7.1/applicationservice/eole-infosquota/files/etc/cron.d/infosquota new file mode 100644 index 0000000000000000000000000000000000000000..2349a1de2898a727fa469081a2e8fc70991ca3ae --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-infosquota/files/etc/cron.d/infosquota @@ -0,0 +1,2 @@ +# infosquota : genere le fichier quotas.txt toutes les 10 minutes +*/10 * * * * root /usr/sbin/repquota /home | awk '(substr($1,0,1) !~ /#/) && ($2 ~ /--/||/\+-/) {print $1","$3","$4","$5","$6}' > /home/netlogon/infosquota/quotas.txt diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-infosquota/files/etc/cron.weekly/findfic b/seed/release/eole-2.7/2.7.1/applicationservice/eole-infosquota/files/etc/cron.weekly/findfic new file mode 100644 index 0000000000000000000000000000000000000000..37d611d1e69119f855f689a453f0d8640ee0b939 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-infosquota/files/etc/cron.weekly/findfic @@ -0,0 +1,153 @@ +#!/bin/bash +################################################################## +# Transfert des dossiers perso +# Sicep - Fred P. - Novembre 2011 +################################################################## + +# Declaration des variables +home_source="/home" +home_rech="/home/workgroups" +liste_fichiers="liste_fichiers.log" +passage=0 +fich_tempo=/tmp/fichier_user.tmp +date=`date` +#effacer le fichier de log avant de commencer ? +che_log=/var/log/infosquota +fichier_log=/var/log/infosquota/recherche-fich-users.log +chemin=0 +drive=0 +i=1 +nbr_tab=0 +# debut du script +################################################# +# test de la presence de /var/log/infosquota +if [ -d $che_log ] +then + echo $date > $fichier_log + echo >> $fichier_log + echo "========== debut de la recherche =========" >> $fichier_log +else + mkdir $che_log + echo $date > $fichier_log + echo >> $fichier_log + echo "========== debut de la recherche =========" >> $fichier_log +fi + + + +################################################# +# recupération des mappages + +mappage=`ldapsearch -x | grep -B 2 sambaShareDrive` +for ligne in $mappage +do + if [ $chemin == 1 ] + then + tableau[i]=$ligne + let i=i+1 + chemin=0 + fi + if [ $drive == 1 ] + then + tableau[i]=$ligne + drive=0 + let i=i+1 + fi + if [ $ligne = "sambaFilePath:" ] + then + chemin=1 + fi + if [ $ligne = "sambaShareDrive:" ] + then + drive=1 + fi +done +nbr_tab=$i + + + + +################################################# +# début de la recherche + +ldapsearch -x cn=DomainUsers|grep memberUid|awk '{print $2}'|while read i; +do + let nb_user=nb_user+1 + echo $nb_user > $fich_tempo +done +nb_user=$(cat $fich_tempo) +rm -f $fich_tempo + +ldapsearch -x cn=DomainUsers|grep memberUid|awk '{print $2}'|while read i; +do + let passage=passage+1 + echo >> $fichier_log + echo "--------------------------------------" >> $fichier_log +#pour un affichage à l'écran de l'utilisateur en cours de recherche : décommenter [echo "$passage / $nb_user $i"] +# echo "$passage / $nb_user $i" + echo $i >> $fichier_log + +# test si l'utilisateur à un dossier perso + if [ -d $home_source/${i:0:1}/$i ] + then + echo "le dossier $home_source/${i:0:1}/$i est présent" >> $fichier_log + dos1="$home_source/${i:0:1}/$i" + che1=1 + else + echo "Pas de dossier perso pour $i" >> $fichier_log + che1=0 + fi + +# s'il existe un dossier perso pour l'utilisateur + if [[ ($che1 == 1) ]] + then + echo "fichier de destination : $home_source/${i:0:1}/$i/perso/$liste_fichiers" >> $fichier_log + echo $date > $home_source/${i:0:1}/$i/perso/$liste_fichiers + echo "Liste de vos fichiers personnels stockés sur le serveur pédagogique." >> $home_source/${i:0:1}/$i/perso/$liste_fichiers + echo "Ne sont pas listé ici les fichiers contenus dans u:\ " >> $home_source/${i:0:1}/$i/perso/$liste_fichiers + echo "-----------" >> $home_source/${i:0:1}/$i/perso/$liste_fichiers + #find $home_rech ! -regex ".*/\..*" -user $i -type f | sed -e "s+`echo $home_rech/`++" >> $home_source/${i:0:1}/$i/perso/$liste_fichiers + find $home_rech ! -regex ".*/\..*" -user $i -type f -exec ls -lh {} \; | awk '{print $8 " " $9 " " $10 " " $11 " " $12 " " $13 " -> " $5}' >> $home_source/${i:0:1}/$i/perso/$liste_fichiers + #fichier=`find $home_rech ! -regex ".*/\..*" -user $i -type f` + #find $home_rech ! -regex ".*/\..*" -user $i -type f + # traitement pour affichage dans le fichier de log de l'utilisateur + #for ligne in $fichier + #do + # echo $ligne + # j=1 + # echo $ligne | grep ${tableau[$j]} + # if [ $? == 0 ] + # then + # echo ${tableau[$j+1]} $ligne + # fi + # done + + + + else + echo "Pas de dossier destination pour $i !!!!" >> $fichier_log + fi + + j=1 +# cp $home_source/${i:0:1}/$i/perso/$liste_fichiers /tmp/liste-fichiers.tmp + while [ $j -lt $nbr_tab ] + do + che_sub=${tableau[$j]} + lettre_sub=${tableau[$j+1]} + cat $home_source/${i:0:1}/$i/perso/$liste_fichiers | sed -e "s+$che_sub+$lettre_sub+g" > /tmp/liste-fichiers.tmp + cp /tmp/liste-fichiers.tmp $home_source/${i:0:1}/$i/perso/$liste_fichiers + let j=j+2 + done + cat $home_source/${i:0:1}/$i/perso/$liste_fichiers | sed -e "s+/home/workgroups+S:+g" > /tmp/liste-fichiers.tmp + sed 's#\/#\\#g' /tmp/liste-fichiers.tmp > $home_source/${i:0:1}/$i/perso/$liste_fichiers + cp $home_source/${i:0:1}/$i/perso/$liste_fichiers /var/www/html/outils/quotas/log/$i.log +# cp /tmp/liste-fichiers.tmp $home_source/${i:0:1}/$i/perso/$liste_fichiers +done + +chown -R root:www-data /var/www/html/outils/quotas/log/ +chmod -R 2750 /var/www/html/outils/quotas/log/ + +echo >> $fichier_log +echo "--------------------------------------" >> $fichier_log +echo `date` >> $fichier_log +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-infosquota/files/home/netlogon/infosquota/infosquota.exe b/seed/release/eole-2.7/2.7.1/applicationservice/eole-infosquota/files/home/netlogon/infosquota/infosquota.exe new file mode 100644 index 0000000000000000000000000000000000000000..4d6b71d3d1d79adf4d8d9df33038c1fc680aadef Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-infosquota/files/home/netlogon/infosquota/infosquota.exe differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-infosquota/files/home/netlogon/infosquota/infosquota.ini.sample b/seed/release/eole-2.7/2.7.1/applicationservice/eole-infosquota/files/home/netlogon/infosquota/infosquota.ini.sample new file mode 100644 index 0000000000000000000000000000000000000000..3dd65d65015f2aa5677b5a542b584124855c1adb --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-infosquota/files/home/netlogon/infosquota/infosquota.ini.sample @@ -0,0 +1,48 @@ + +[OSDelay] +; délai par défaut : 0 s +; nombre entier entre 0 et 30 +; choix : "WIN_2008R2", "WIN_7", "WIN_8", "WIN_2008", "WIN_VISTA", "WIN_2003", "WIN_XP", "WIN_XPe", "WIN_2000" +; possibilité de prévoir pour plusieurs systèmes +WIN_XP = 0 +Win_7 = 20 + + +[ini] + +seuil = 90 + +; définit, en %, le seuil d'alerte en prévention pour l'utilisateur (entre 1 et 100) +; par défaut : 90 + + +temps_affichage = 5 + +; durée d'affichage (en s) de la fenêtre lorsqu'il n'y a pas dépassement ou en cas d'alerte (entre 1s et 60s) +; par défaut : 5 + + +aff_stockage = 1 + +; affiche ou non (1 ou 0) l'espace utilisé (en temps normal) par des utilisateurs concernés par un quota +; par défaut : 1 + + +aff_quota_0 = 1 + +; affiche ou non (1 ou 0) l'espace utilisé pour les utilisateurs sans quota +; par défaut : 1 + + +aff_delai = 1 + +; affiche ou non (1 ou 0) le délai restant avant blocage en cas de dépassement du quota +; par défaut : 1 + + +aff_alertes = 1 + +; affiche ou non (1 ou 0) un message d'erreur en cas d'indisponibilité / d'erreur de lecture du quota +; par défaut : 0 + + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-infosquota/files/home/netlogon/infosquota/version.txt b/seed/release/eole-2.7/2.7.1/applicationservice/eole-infosquota/files/home/netlogon/infosquota/version.txt new file mode 100644 index 0000000000000000000000000000000000000000..8c7fafd365322ec4dd915a53003816c4b5977662 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-infosquota/files/home/netlogon/infosquota/version.txt @@ -0,0 +1 @@ +4.1.3 \ No newline at end of file diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-infosquota/postservices/90-infosquota b/seed/release/eole-2.7/2.7.1/applicationservice/eole-infosquota/postservices/90-infosquota new file mode 100644 index 0000000000000000000000000000000000000000..a479e02e4b6ba56393ca72df823bf749e6ec2fdb --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-infosquota/postservices/90-infosquota @@ -0,0 +1,29 @@ +#!/bin/bash +. /usr/lib/eole/ihm.sh + +NETLOGON="/home/netlogon/infosquota" +DOMAINUSERS="/home/netlogon/scripts/groups/DomainUsers.txt" + +if [ ! -f "$NETLOGON/infosquota.ini" ];then + # mise en place de la configuation initiale + cp "$NETLOGON/infosquota.ini.sample" "$NETLOGON/infosquota.ini" +fi + +grep -q infosquota.exe $DOMAINUSERS 2>/dev/null +if [ $? -ne 0 ];then + echo "Mise en place de la commande infosquota dans DomainUsers.txt" + echo "cmd,\\\\$(CreoleGet adresse_ip_eth0)\\netlogon\\infosquota\\infosquota.exe,NOWAIT" >> $DOMAINUSERS +fi + +if [ ! -f /var/log/infosquota/recherche-fich-users.log ];then + echo "Première exécution de infosquota2" + EchoOrange "Lancement de la recherche, " + EchoOrange "veuillez patienter quelques minutes." + EchoOrange "Merci ..." + /etc/cron.weekly/findfic + if [ $? -ne 0 ] ; then + EchoRouge "Problème lors de l'exécution de /etc/cron.weekly/findfic" + fi +fi + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-infosquota/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-infosquota/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..5ff5894e7b8223986562f46145ab0aa025af7612 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-infosquota/service.yml @@ -0,0 +1,47 @@ +format: '0.1' +name: eole-infosquota +version: |- + 4.1.4-4 +description: |- + Configuration EOLE pour Infosquota + Informations Quota est un outil qui permet de mettre en place + les quotas de manière très souple et très pédagogique. + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: [] +packages: + - eole-infosquota-apps +dictionaries: + - 52_infosquota.xml +extra_dictionaries: {} +templates: [] +creole_funcs: [] +preservices: [] +postservices: + - 90-infosquota +pretemplates: [] +posttemplates: [] +files: + /home/netlogon/infosquota/infosquota.exe: + owner: root + group: root + mode: '0755' + /home/netlogon/infosquota/infosquota.ini.sample: + owner: root + group: root + mode: '0644' + /home/netlogon/infosquota/version.txt: + owner: root + group: root + mode: '0644' + /etc/cron.weekly/findfic: + owner: root + group: root + mode: '0755' + /etc/cron.d/infosquota: + owner: root + group: root + mode: '0644' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-interbase/dictionaries/20_interbase.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-interbase/dictionaries/20_interbase.xml new file mode 100644 index 0000000000000000000000000000000000000000..5140ea45f8c0c7090174adbdcf800482f73876bb --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-interbase/dictionaries/20_interbase.xml @@ -0,0 +1,41 @@ +<?xml version='1.0' encoding='utf-8'?> + +<creole> + <files> + <file filelist='interbase' name='/etc/bareos/bareosfichiers.d/interbase.conf' source='bareos-interbase.conf' rm='True'/> + </files> + <containers> + <container name="interbase" id='16'> + <package>eole-interbase-pkg</package> + <service servicelist='interbase'>xinetd</service> + <service_access service='interbase'> + <port>3050</port> + <tcpwrapper>gds_inet_server</tcpwrapper> + </service_access> + <file filelist='interbase' name='/etc/xinetd.d/gds_db' rm='True'/> + </container> + </containers> + <variables> + <family name='services'> + <variable name='activer_interbase' type='oui/non' description="Activer xinetd pour InterBase" > + <value>non</value> + </variable> + </family> + <separators/> + </variables> + + <constraints> + <condition name='disabled_if_in' source='activer_interbase'> + <param>non</param> + <target type='filelist'>interbase</target> + <target type='servicelist'>interbase</target> + </condition> + </constraints> + + <help> + <variable name='activer_interbase'>InterBase est un système de gestion de base de données</variable> + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-interbase/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-interbase/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..6a532acb0f9e122b4c55669d8d42eb153b89acd9 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-interbase/service.yml @@ -0,0 +1,24 @@ +format: '0.1' +name: eole-interbase +version: |- + 2.6.0-2 +description: |- + Dictionnaires et templates pour Interbase-5.6 + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: [] +packages: [] +dictionaries: + - 20_interbase.xml +extra_dictionaries: {} +templates: + - bareos-interbase.conf + - gds_db +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: [] +files: {} +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-interbase/templates/bareos-interbase.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-interbase/templates/bareos-interbase.conf new file mode 100644 index 0000000000000000000000000000000000000000..0ba91eed86c5a3156c4445e4ab38a4285df02dcb --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-interbase/templates/bareos-interbase.conf @@ -0,0 +1,8 @@ +Include { + Options { + aclsupport = no + @/etc/bareos/include-options.conf + } + File = %%container_path_interbase/opt/interbase/isc4.gdb + File = %%container_path_interbase/opt/interbase/ib_license.dat +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-interbase/templates/gds_db b/seed/release/eole-2.7/2.7.1/applicationservice/eole-interbase/templates/gds_db new file mode 100644 index 0000000000000000000000000000000000000000..8bf1e32b43417fbbf7c5f5f5e33615728155c6c0 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-interbase/templates/gds_db @@ -0,0 +1,22 @@ +######################################## +# +# Fichier de configuration pour Interbase +# +# Definition du Template pour Eole-2.3 +# +# Eole Dijon - 2010 +# +######################################### +## default: on +## description: Borland/Interbase Database Remote Server +service gds_db +{ +port = 3050 +disable = no +protocol = tcp +socket_type = stream +wait = no +user = root +server = /usr/interbase/bin/gds_inet_server +log_on_failure +=USERID +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-libvirt/dictionaries/00_eole-libvirt_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-libvirt/dictionaries/00_eole-libvirt_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..eaad990b6fc2f862bff9ff31b626dc10e2edbcbf --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-libvirt/dictionaries/00_eole-libvirt_packages.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>libvirt-bin</package> + <package>qemu-kvm</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-libvirt/dictionaries/97_libvirt.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-libvirt/dictionaries/97_libvirt.xml new file mode 100644 index 0000000000000000000000000000000000000000..82fe542e2027749857d606c2c8b2474d3eee2093 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-libvirt/dictionaries/97_libvirt.xml @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="utf-8"?> +<creole> + <files> + <service>libvirtd</service> + <file filelist='libvirt' name='/etc/libvirt/qemu.conf' rm='True'/> + <file filelist='libvirt' name='/etc/libvirt/libvirtd.conf' rm='True'/> + </files> + <variables> + <family name='Services'> + <variable name='activer_libvirt' type='oui/non' description="Activer la bibliothèque de gestion des machines virtuelles libvirt" mode='expert'> + <value>oui</value> + </variable> + </family> + <family name='Virtualisation'> + <variable name='virt_user' type='string' description="Utilisateur d'exécution de la bibliothèque" mode='expert'> + <value>oneadmin</value> + </variable> + <variable name='virt_group' type='string' description="Groupe d'exécution de la bibliothèque" mode='expert'> + <value>oneadmin</value> + </variable> + </family> + <separators> + <separator name='virt_user'>Configuration de la bibliothèque de gestion des machines virtuelles</separator> + </separators> + </variables> + + <constraints> + <condition name='disabled_if_in' source='activer_libvirt'> + <param>non</param> + <target type='filelist'>libvirt</target> + <target type='variable'>virt_user</target> + <target type='variable'>virt_group</target> + </condition> + </constraints> + <help> + <variable name='activer_libvirt'>Bibliothèque de gestion de machines virtuelles</variable> + </help> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-libvirt/files/etc/systemd/system/libvirtd.service.d/bastion-dep.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-libvirt/files/etc/systemd/system/libvirtd.service.d/bastion-dep.conf new file mode 100644 index 0000000000000000000000000000000000000000..de59f637e7a442edb95bf35f37532d7e92b541ef --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-libvirt/files/etc/systemd/system/libvirtd.service.d/bastion-dep.conf @@ -0,0 +1,3 @@ +[Unit] +After=multi-user.target +After=bastion.service diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-libvirt/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-libvirt/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..7eda5327fd51ada223fa2b0e14e028469982cff3 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-libvirt/service.yml @@ -0,0 +1,31 @@ +format: '0.1' +name: eole-libvirt +version: |- + 2.7.0-1 +description: |- + Dictionnaires et templates pour libvirt, un logiciel libre de gestion de plateformes de virtualisation. Elle supporte Linux KVM, Xen, VMware ESX, QEMU entre autres + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: [] +packages: + - libvirt-bin + - qemu-kvm +dictionaries: + - 97_libvirt.xml +extra_dictionaries: {} +templates: + - libvirtd.conf + - qemu.conf +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: [] +files: + /etc/systemd/system/libvirtd.service.d/bastion-dep.conf: + owner: root + group: root + mode: '0644' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-libvirt/templates/libvirtd.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-libvirt/templates/libvirtd.conf new file mode 100644 index 0000000000000000000000000000000000000000..c1e2ba2af7d8d93397a9cf1fa3dae1cf89f68d75 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-libvirt/templates/libvirtd.conf @@ -0,0 +1,410 @@ +# Master libvirt daemon configuration file +# +# For further information consult http://libvirt.org/format.html +# +# NOTE: the tests/daemon-conf regression test script requires +# that each "PARAMETER = VALUE" line in this file have the parameter +# name just after a leading "#". + +################################################################# +# +# Network connectivity controls +# + +# Flag listening for secure TLS connections on the public TCP/IP port. +# NB, must pass the --listen flag to the libvirtd process for this to +# have any effect. +# +# It is necessary to setup a CA and issue server certificates before +# using this capability. +# +# This is enabled by default, uncomment this to disable it +#listen_tls = 0 + +# Listen for unencrypted TCP connections on the public TCP/IP port. +# NB, must pass the --listen flag to the libvirtd process for this to +# have any effect. +# +# Using the TCP socket requires SASL authentication by default. Only +# SASL mechanisms which support data encryption are allowed. This is +# DIGEST_MD5 and GSSAPI (Kerberos5) +# +# This is disabled by default, uncomment this to enable it. +#listen_tcp = 1 + + + +# Override the port for accepting secure TLS connections +# This can be a port number, or service name +# +#tls_port = "16514" + +# Override the port for accepting insecure TCP connections +# This can be a port number, or service name +# +#tcp_port = "16509" + + +# Override the default configuration which binds to all network +# interfaces. This can be a numeric IPv4/6 address, or hostname +# +#listen_addr = "192.168.0.1" + + +# Flag toggling mDNS advertizement of the libvirt service. +# +# Alternatively can disable for all services on a host by +# stopping the Avahi daemon +# +# This is disabled by default, uncomment this to enable it +#mdns_adv = 1 + +# Override the default mDNS advertizement name. This must be +# unique on the immediate broadcast network. +# +# The default is "Virtualization Host HOSTNAME", where HOSTNAME +# is subsituted for the short hostname of the machine (without domain) +# +#mdns_name = "Virtualization Host Joe Demo" + + +################################################################# +# +# UNIX socket access controls +# + +# Set the UNIX domain socket group ownership. This can be used to +# allow a 'trusted' set of users access to management capabilities +# without becoming root. +# +# This is restricted to 'root' by default. +unix_sock_group = "%%virt_group" + +# Set the UNIX socket permissions for the R/O socket. This is used +# for monitoring VM status only +# +# Default allows any user. If setting group ownership may want to +# restrict this to: +#unix_sock_ro_perms = "0777" + +# Set the UNIX socket permissions for the R/W socket. This is used +# for full management of VMs +# +# Default allows only root. If PolicyKit is enabled on the socket, +# the default will change to allow everyone (eg, 0777) +# +# If not using PolicyKit and setting group ownership for access +# control then you may want to relax this to: +unix_sock_rw_perms = "0770" + +# Set the name of the directory in which sockets will be found/created. +#unix_sock_dir = "/var/run/libvirt" + +################################################################# +# +# Authentication. +# +# - none: do not perform auth checks. If you can connect to the +# socket you are allowed. This is suitable if there are +# restrictions on connecting to the socket (eg, UNIX +# socket permissions), or if there is a lower layer in +# the network providing auth (eg, TLS/x509 certificates) +# +# - sasl: use SASL infrastructure. The actual auth scheme is then +# controlled from /etc/sasl2/libvirt.conf. For the TCP +# socket only GSSAPI & DIGEST-MD5 mechanisms will be used. +# For non-TCP or TLS sockets, any scheme is allowed. +# +# - polkit: use PolicyKit to authenticate. This is only suitable +# for use on the UNIX sockets. The default policy will +# require a user to supply their own password to gain +# full read/write access (aka sudo like), while anyone +# is allowed read/only access. +# +# Set an authentication scheme for UNIX read-only sockets +# By default socket permissions allow anyone to connect +# +# To restrict monitoring of domains you may wish to enable +# an authentication mechanism here +auth_unix_ro = "none" + +# Set an authentication scheme for UNIX read-write sockets +# By default socket permissions only allow root. If PolicyKit +# support was compiled into libvirt, the default will be to +# use 'polkit' auth. +# +# If the unix_sock_rw_perms are changed you may wish to enable +# an authentication mechanism here +auth_unix_rw = "none" + +# Change the authentication scheme for TCP sockets. +# +# If you don't enable SASL, then all TCP traffic is cleartext. +# Don't do this outside of a dev/test scenario. For real world +# use, always enable SASL and use the GSSAPI or DIGEST-MD5 +# mechanism in /etc/sasl2/libvirt.conf +#auth_tcp = "sasl" + +# Change the authentication scheme for TLS sockets. +# +# TLS sockets already have encryption provided by the TLS +# layer, and limited authentication is done by certificates +# +# It is possible to make use of any SASL authentication +# mechanism as well, by using 'sasl' for this option +#auth_tls = "none" + + +# Change the API access control scheme +# +# By default an authenticated user is allowed access +# to all APIs. Access drivers can place restrictions +# on this. By default the 'nop' driver is enabled, +# meaning no access control checks are done once a +# client has authenticated with libvirtd +# +#access_drivers = [ "polkit" ] + +################################################################# +# +# TLS x509 certificate configuration +# + + +# Override the default server key file path +# +#key_file = "/etc/pki/libvirt/private/serverkey.pem" + +# Override the default server certificate file path +# +#cert_file = "/etc/pki/libvirt/servercert.pem" + +# Override the default CA certificate path +# +#ca_file = "/etc/pki/CA/cacert.pem" + +# Specify a certificate revocation list. +# +# Defaults to not using a CRL, uncomment to enable it +#crl_file = "/etc/pki/CA/crl.pem" + + + +################################################################# +# +# Authorization controls +# + + +# Flag to disable verification of our own server certificates +# +# When libvirtd starts it performs some sanity checks against +# its own certificates. +# +# Default is to always run sanity checks. Uncommenting this +# will disable sanity checks which is not a good idea +#tls_no_sanity_certificate = 1 + +# Flag to disable verification of client certificates +# +# Client certificate verification is the primary authentication mechanism. +# Any client which does not present a certificate signed by the CA +# will be rejected. +# +# Default is to always verify. Uncommenting this will disable +# verification - make sure an IP whitelist is set +#tls_no_verify_certificate = 1 + + +# A whitelist of allowed x509 Distinguished Names +# This list may contain wildcards such as +# +# "C=GB,ST=London,L=London,O=Red Hat,CN=*" +# +# See the POSIX fnmatch function for the format of the wildcards. +# +# NB If this is an empty list, no client can connect, so comment out +# entirely rather than using empty list to disable these checks +# +# By default, no DN's are checked +#tls_allowed_dn_list = ["DN1", "DN2"] + + +# A whitelist of allowed SASL usernames. The format for usernames +# depends on the SASL authentication mechanism. Kerberos usernames +# look like username@REALM +# +# This list may contain wildcards such as +# +# "*@EXAMPLE.COM" +# +# See the POSIX fnmatch function for the format of the wildcards. +# +# NB If this is an empty list, no client can connect, so comment out +# entirely rather than using empty list to disable these checks +# +# By default, no Username's are checked +#sasl_allowed_username_list = ["joe@EXAMPLE.COM", "fred@EXAMPLE.COM" ] + + + +################################################################# +# +# Processing controls +# + +# The maximum number of concurrent client connections to allow +# over all sockets combined. +#max_clients = 20 + +# The maximum length of queue of connections waiting to be +# accepted by the daemon. Note, that some protocols supporting +# retransmission may obey this so that a later reattempt at +# connection succeeds. +#max_queued_clients = 1000 + + +# The minimum limit sets the number of workers to start up +# initially. If the number of active clients exceeds this, +# then more threads are spawned, up to max_workers limit. +# Typically you'd want max_workers to equal maximum number +# of clients allowed +#min_workers = 5 +#max_workers = 20 + + +# The number of priority workers. If all workers from above +# pool will stuck, some calls marked as high priority +# (notably domainDestroy) can be executed in this pool. +#prio_workers = 5 + +# Total global limit on concurrent RPC calls. Should be +# at least as large as max_workers. Beyond this, RPC requests +# will be read into memory and queued. This directly impact +# memory usage, currently each request requires 256 KB of +# memory. So by default up to 5 MB of memory is used +# +# XXX this isn't actually enforced yet, only the per-client +# limit is used so far +#max_requests = 20 + +# Limit on concurrent requests from a single client +# connection. To avoid one client monopolizing the server +# this should be a small fraction of the global max_requests +# and max_workers parameter +#max_client_requests = 5 + +################################################################# +# +# Logging controls +# + +# Logging level: 4 errors, 3 warnings, 2 information, 1 debug +# basically 1 will log everything possible +log_level = 3 + +# Logging filters: +# A filter allows to select a different logging level for a given category +# of logs +# The format for a filter is one of: +# x:name +# x:+name +# where name is a string which is matched against source file name, +# e.g., "remote", "qemu", or "util/json", the optional "+" prefix +# tells libvirt to log stack trace for each message matching name, +# and x is the minimal level where matching messages should be logged: +# 1: DEBUG +# 2: INFO +# 3: WARNING +# 4: ERROR +# +# Multiple filter can be defined in a single @filters, they just need to be +# separated by spaces. +# +# e.g. to only get warning or errors from the remote layer and only errors +# from the event layer: +#log_filters="3:remote 4:event" + +# Logging outputs: +# An output is one of the places to save logging information +# The format for an output can be: +# x:stderr +# output goes to stderr +# x:syslog:name +# use syslog for the output and use the given name as the ident +# x:file:file_path +# output to a file, with the given filepath +# In all case the x prefix is the minimal level, acting as a filter +# 1: DEBUG +# 2: INFO +# 3: WARNING +# 4: ERROR +# +# Multiple output can be defined, they just need to be separated by spaces. +# e.g. to log all warnings and errors to syslog under the libvirtd ident: +#log_outputs="3:syslog:libvirtd" +# + +# Log debug buffer size: default 64 +# The daemon keeps an internal debug log buffer which will be dumped in case +# of crash or upon receiving a SIGUSR2 signal. This setting allows to override +# the default buffer size in kilobytes. +# If value is 0 or less the debug log buffer is deactivated +#log_buffer_size = 64 + + +################################################################## +# +# Auditing +# +# This setting allows usage of the auditing subsystem to be altered: +# +# audit_level == 0 -> disable all auditing +# audit_level == 1 -> enable auditing, only if enabled on host (default) +# audit_level == 2 -> enable auditing, and exit if disabled on host +# +#audit_level = 2 +# +# If set to 1, then audit messages will also be sent +# via libvirt logging infrastructure. Defaults to 0 +# +#audit_logging = 1 + +################################################################### +# UUID of the host: +# Provide the UUID of the host here in case the command +# 'dmidecode -s system-uuid' does not provide a valid uuid. In case +# 'dmidecode' does not provide a valid UUID and none is provided here, a +# temporary UUID will be generated. +# Keep the format of the example UUID below. UUID must not have all digits +# be the same. + +# NB This default all-zeros UUID will not work. Replace +# it with the output of the 'uuidgen' command and then +# uncomment this entry +#host_uuid = "00000000-0000-0000-0000-000000000000" + +################################################################### +# Keepalive protocol: +# This allows libvirtd to detect broken client connections or even +# dead client. A keepalive message is sent to a client after +# keepalive_interval seconds of inactivity to check if the client is +# still responding; keepalive_count is a maximum number of keepalive +# messages that are allowed to be sent to the client without getting +# any response before the connection is considered broken. In other +# words, the connection is automatically closed approximately after +# keepalive_interval * (keepalive_count + 1) seconds since the last +# message received from the client. If keepalive_interval is set to +# -1, libvirtd will never send keepalive requests; however clients +# can still send them and the deamon will send responses. When +# keepalive_count is set to 0, connections will be automatically +# closed after keepalive_interval seconds of inactivity without +# sending any keepalive messages. +# +#keepalive_interval = 5 +#keepalive_count = 5 +# +# If set to 1, libvirtd will refuse to talk to clients that do not +# support keepalive protocol. Defaults to 0. +# +#keepalive_required = 1 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-libvirt/templates/qemu.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-libvirt/templates/qemu.conf new file mode 100644 index 0000000000000000000000000000000000000000..e9f8eb9786a6aebfcccb875383bd2f4bb742b0ac --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-libvirt/templates/qemu.conf @@ -0,0 +1,465 @@ +# Master configuration file for the QEMU driver. +# All settings described here are optional - if omitted, sensible +# defaults are used. + +# VNC is configured to listen on 127.0.0.1 by default. +# To make it listen on all public interfaces, uncomment +# this next option. +# +# NB, strong recommendation to enable TLS + x509 certificate +# verification when allowing public access +# +#vnc_listen = "0.0.0.0" + +# Enable this option to have VNC served over an automatically created +# unix socket. This prevents unprivileged access from users on the +# host machine, though most VNC clients do not support it. +# +# This will only be enabled for VNC configurations that do not have +# a hardcoded 'listen' or 'socket' value. This setting takes preference +# over vnc_listen. +# +#vnc_auto_unix_socket = 1 + +# Enable use of TLS encryption on the VNC server. This requires +# a VNC client which supports the VeNCrypt protocol extension. +# Examples include vinagre, virt-viewer, virt-manager and vencrypt +# itself. UltraVNC, RealVNC, TightVNC do not support this +# +# It is necessary to setup CA and issue a server certificate +# before enabling this. +# +#vnc_tls = 1 + + +# Use of TLS requires that x509 certificates be issued. The +# default it to keep them in /etc/pki/libvirt-vnc. This directory +# must contain +# +# ca-cert.pem - the CA master certificate +# server-cert.pem - the server certificate signed with ca-cert.pem +# server-key.pem - the server private key +# +# This option allows the certificate directory to be changed +# +#vnc_tls_x509_cert_dir = "/etc/pki/libvirt-vnc" + + +# The default TLS configuration only uses certificates for the server +# allowing the client to verify the server's identity and establish +# an encrypted channel. +# +# It is possible to use x509 certificates for authentication too, by +# issuing a x509 certificate to every client who needs to connect. +# +# Enabling this option will reject any client who does not have a +# certificate signed by the CA in /etc/pki/libvirt-vnc/ca-cert.pem +# +#vnc_tls_x509_verify = 1 + + +# The default VNC password. Only 8 letters are significant for +# VNC passwords. This parameter is only used if the per-domain +# XML config does not already provide a password. To allow +# access without passwords, leave this commented out. An empty +# string will still enable passwords, but be rejected by QEMU, +# effectively preventing any use of VNC. Obviously change this +# example here before you set this. +# +#vnc_password = "XYZ12345" + + +# Enable use of SASL encryption on the VNC server. This requires +# a VNC client which supports the SASL protocol extension. +# Examples include vinagre, virt-viewer and virt-manager +# itself. UltraVNC, RealVNC, TightVNC do not support this +# +# It is necessary to configure /etc/sasl2/qemu.conf to choose +# the desired SASL plugin (eg, GSSPI for Kerberos) +# +#vnc_sasl = 1 + + +# The default SASL configuration file is located in /etc/sasl2/ +# When running libvirtd unprivileged, it may be desirable to +# override the configs in this location. Set this parameter to +# point to the directory, and create a qemu.conf in that location +# +#vnc_sasl_dir = "/some/directory/sasl2" + + +# QEMU implements an extension for providing audio over a VNC connection, +# though if your VNC client does not support it, your only chance for getting +# sound output is through regular audio backends. By default, libvirt will +# disable all QEMU sound backends if using VNC, since they can cause +# permissions issues. Enabling this option will make libvirtd honor the +# QEMU_AUDIO_DRV environment variable when using VNC. +# +#vnc_allow_host_audio = 0 + + + +# SPICE is configured to listen on 127.0.0.1 by default. +# To make it listen on all public interfaces, uncomment +# this next option. +# +# NB, strong recommendation to enable TLS + x509 certificate +# verification when allowing public access +# +#spice_listen = "0.0.0.0" + + +# Enable use of TLS encryption on the SPICE server. +# +# It is necessary to setup CA and issue a server certificate +# before enabling this. +# +#spice_tls = 1 + + +# Use of TLS requires that x509 certificates be issued. The +# default it to keep them in /etc/pki/libvirt-spice. This directory +# must contain +# +# ca-cert.pem - the CA master certificate +# server-cert.pem - the server certificate signed with ca-cert.pem +# server-key.pem - the server private key +# +# This option allows the certificate directory to be changed. +# +#spice_tls_x509_cert_dir = "/etc/pki/libvirt-spice" + + +# The default SPICE password. This parameter is only used if the +# per-domain XML config does not already provide a password. To +# allow access without passwords, leave this commented out. An +# empty string will still enable passwords, but be rejected by +# QEMU, effectively preventing any use of SPICE. Obviously change +# this example here before you set this. +# +#spice_password = "XYZ12345" + + +# Enable use of SASL encryption on the SPICE server. This requires +# a SPICE client which supports the SASL protocol extension. +# +# It is necessary to configure /etc/sasl2/qemu.conf to choose +# the desired SASL plugin (eg, GSSPI for Kerberos) +# +#spice_sasl = 1 + +# The default SASL configuration file is located in /etc/sasl2/ +# When running libvirtd unprivileged, it may be desirable to +# override the configs in this location. Set this parameter to +# point to the directory, and create a qemu.conf in that location +# +#spice_sasl_dir = "/some/directory/sasl2" + + +# By default, if no graphical front end is configured, libvirt will disable +# QEMU audio output since directly talking to alsa/pulseaudio may not work +# with various security settings. If you know what you're doing, enable +# the setting below and libvirt will passthrough the QEMU_AUDIO_DRV +# environment variable when using nographics. +# +#nographics_allow_host_audio = 1 + + +# Override the port for creating both VNC and SPICE sessions (min). +# This defaults to 5900 and increases for consecutive sessions +# or when ports are occupied, until it hits the maximum. +# +# Minimum must be greater than or equal to 5900 as lower number would +# result into negative vnc display number. +# +# Maximum must be less than 65536, because higher numbers do not make +# sense as a port number. +# +#remote_display_port_min = 5900 +#remote_display_port_max = 65535 + +# VNC WebSocket port policies, same rules apply as with remote display +# ports. VNC WebSockets use similar display <-> port mappings, with +# the exception being that ports starts from 5700 instead of 5900. +# +#remote_websocket_port_min = 5700 +#remote_websocket_port_max = 65535 + +# The default security driver is SELinux. If SELinux is disabled +# on the host, then the security driver will automatically disable +# itself. If you wish to disable QEMU SELinux security driver while +# leaving SELinux enabled for the host in general, then set this +# to 'none' instead. It's also possible to use more than one security +# driver at the same time, for this use a list of names separated by +# comma and delimited by square brackets. For example: +# +# security_driver = [ "selinux", "apparmor" ] +# +# Notes: The DAC security driver is always enabled; as a result, the +# value of security_driver cannot contain "dac". The value "none" is +# a special value; security_driver can be set to that value in +# isolation, but it cannot appear in a list of drivers. +# +security_driver = "none" + +# If set to non-zero, then the default security labeling +# will make guests confined. If set to zero, then guests +# will be unconfined by default. Defaults to 1. +#security_default_confined = 1 + +# If set to non-zero, then attempts to create unconfined +# guests will be blocked. Defaults to 0. +#security_require_confined = 1 + +# The user for QEMU processes run by the system instance. It can be +# specified as a user name or as a user id. The qemu driver will try to +# parse this value first as a name and then, if the name doesn't exist, +# as a user id. +# +# Since a sequence of digits is a valid user name, a leading plus sign +# can be used to ensure that a user id will not be interpreted as a user +# name. +# +# Some examples of valid values are: +# +# user = "qemu" # A user named "qemu" +# user = "+0" # Super user (uid=0) +# user = "100" # A user named "100" or a user with uid=100 +# +user = "%%virt_user" + +# The group for QEMU processes run by the system instance. It can be +# specified in a similar way to user. +group = "%%virt_group" + +# Whether libvirt should dynamically change file ownership +# to match the configured user/group above. Defaults to 1. +# Set to 0 to disable file ownership changes. +dynamic_ownership = 0 + + +# What cgroup controllers to make use of with QEMU guests +# +# - 'cpu' - use for schedular tunables +# - 'devices' - use for device whitelisting +# - 'memory' - use for memory tunables +# - 'blkio' - use for block devices I/O tunables +# - 'cpuset' - use for CPUs and memory nodes +# - 'cpuacct' - use for CPUs statistics. +# +# NB, even if configured here, they won't be used unless +# the administrator has mounted cgroups, e.g.: +# +# mkdir /dev/cgroup +# mount -t cgroup -o devices,cpu,memory,blkio,cpuset none /dev/cgroup +# +# They can be mounted anywhere, and different controllers +# can be mounted in different locations. libvirt will detect +# where they are located. +# +#cgroup_controllers = [ "cpu", "devices", "memory", "blkio", "cpuset", "cpuacct" ] + +# This is the basic set of devices allowed / required by +# all virtual machines. +# +# As well as this, any configured block backed disks, +# all sound device, and all PTY devices are allowed. +# +# This will only need setting if newer QEMU suddenly +# wants some device we don't already know about. +# +#cgroup_device_acl = [ +# "/dev/null", "/dev/full", "/dev/zero", +# "/dev/random", "/dev/urandom", +# "/dev/ptmx", "/dev/kvm", "/dev/kqemu", +# "/dev/rtc","/dev/hpet", "/dev/vfio/vfio" +#] + + +# The default format for Qemu/KVM guest save images is raw; that is, the +# memory from the domain is dumped out directly to a file. If you have +# guests with a large amount of memory, however, this can take up quite +# a bit of space. If you would like to compress the images while they +# are being saved to disk, you can also set "lzop", "gzip", "bzip2", or "xz" +# for save_image_format. Note that this means you slow down the process of +# saving a domain in order to save disk space; the list above is in descending +# order by performance and ascending order by compression ratio. +# +# save_image_format is used when you use 'virsh save' or 'virsh managedsave' +# at scheduled saving, and it is an error if the specified save_image_format +# is not valid, or the requested compression program can't be found. +# +# dump_image_format is used when you use 'virsh dump' at emergency +# crashdump, and if the specified dump_image_format is not valid, or +# the requested compression program can't be found, this falls +# back to "raw" compression. +# +# snapshot_image_format specifies the compression algorithm of the memory save +# image when an external snapshot of a domain is taken. This does not apply +# on disk image format. It is an error if the specified format isn't valid, +# or the requested compression program can't be found. +# +#save_image_format = "raw" +#dump_image_format = "raw" +#snapshot_image_format = "raw" + +# When a domain is configured to be auto-dumped when libvirtd receives a +# watchdog event from qemu guest, libvirtd will save dump files in directory +# specified by auto_dump_path. Default value is /var/lib/libvirt/qemu/dump +# +#auto_dump_path = "/var/lib/libvirt/qemu/dump" + +# When a domain is configured to be auto-dumped, enabling this flag +# has the same effect as using the VIR_DUMP_BYPASS_CACHE flag with the +# virDomainCoreDump API. That is, the system will avoid using the +# file system cache while writing the dump file, but may cause +# slower operation. +# +#auto_dump_bypass_cache = 0 + +# When a domain is configured to be auto-started, enabling this flag +# has the same effect as using the VIR_DOMAIN_START_BYPASS_CACHE flag +# with the virDomainCreateWithFlags API. That is, the system will +# avoid using the file system cache when restoring any managed state +# file, but may cause slower operation. +# +#auto_start_bypass_cache = 0 + +# If provided by the host and a hugetlbfs mount point is configured, +# a guest may request huge page backing. When this mount point is +# unspecified here, determination of a host mount point in /proc/mounts +# will be attempted. Specifying an explicit mount overrides detection +# of the same in /proc/mounts. Setting the mount point to "" will +# disable guest hugepage backing. +# +# NB, within this mount point, guests will create memory backing files +# in a location of $MOUNTPOINT/libvirt/qemu +# +#hugetlbfs_mount = "/dev/hugepages" + + +# Path to the setuid helper for creating tap devices. This executable +# is used to create <source type='bridge'> interfaces when libvirtd is +# running unprivileged. libvirt invokes the helper directly, instead +# of using "-netdev bridge", for security reasons. +#bridge_helper = "/usr/libexec/qemu-bridge-helper" + + + +# If clear_emulator_capabilities is enabled, libvirt will drop all +# privileged capabilities of the QEmu/KVM emulator. This is enabled by +# default. +# +# Warning: Disabling this option means that a compromised guest can +# exploit the privileges and possibly do damage to the host. +# +#clear_emulator_capabilities = 1 + + +# If enabled, libvirt will have QEMU set its process name to +# "qemu:VM_NAME", where VM_NAME is the name of the VM. The QEMU +# process will appear as "qemu:VM_NAME" in process listings and +# other system monitoring tools. By default, QEMU does not set +# its process title, so the complete QEMU command (emulator and +# its arguments) appear in process listings. +# +#set_process_name = 1 + + +# If max_processes is set to a positive integer, libvirt will use +# it to set the maximum number of processes that can be run by qemu +# user. This can be used to override default value set by host OS. +# The same applies to max_files which sets the limit on the maximum +# number of opened files. +# +#max_processes = 0 +#max_files = 0 + + + +# mac_filter enables MAC addressed based filtering on bridge ports. +# This currently requires ebtables to be installed. +# +#mac_filter = 1 + + +# By default, PCI devices below non-ACS switch are not allowed to be assigned +# to guests. By setting relaxed_acs_check to 1 such devices will be allowed to +# be assigned to guests. +# +#relaxed_acs_check = 1 + + +# If allow_disk_format_probing is enabled, libvirt will probe disk +# images to attempt to identify their format, when not otherwise +# specified in the XML. This is disabled by default. +# +# WARNING: Enabling probing is a security hole in almost all +# deployments. It is strongly recommended that users update their +# guest XML <disk> elements to include <driver type='XXXX'/> +# elements instead of enabling this option. +# +#allow_disk_format_probing = 1 + + +# To enable 'Sanlock' project based locking of the file +# content (to prevent two VMs writing to the same +# disk), uncomment this +# +#lock_manager = "sanlock" + + + +# Set limit of maximum APIs queued on one domain. All other APIs +# over this threshold will fail on acquiring job lock. Specially, +# setting to zero turns this feature off. +# Note, that job lock is per domain. +# +#max_queued = 0 + +################################################################### +# Keepalive protocol: +# This allows qemu driver to detect broken connections to remote +# libvirtd during peer-to-peer migration. A keepalive message is +# sent to the deamon after keepalive_interval seconds of inactivity +# to check if the deamon is still responding; keepalive_count is a +# maximum number of keepalive messages that are allowed to be sent +# to the deamon without getting any response before the connection +# is considered broken. In other words, the connection is +# automatically closed approximately after +# keepalive_interval * (keepalive_count + 1) seconds since the last +# message received from the deamon. If keepalive_interval is set to +# -1, qemu driver will not send keepalive requests during +# peer-to-peer migration; however, the remote libvirtd can still +# send them and source libvirtd will send responses. When +# keepalive_count is set to 0, connections will be automatically +# closed after keepalive_interval seconds of inactivity without +# sending any keepalive messages. +# +#keepalive_interval = 5 +#keepalive_count = 5 + + + +# Use seccomp syscall whitelisting in QEMU. +# 1 = on, 0 = off, -1 = use QEMU default +# Defaults to -1. +# +#seccomp_sandbox = 1 + + + +# Override the listen address for all incoming migrations. Defaults to +# 0.0.0.0, or :: if both host and qemu are capable of IPv6. +#migration_address = "127.0.0.1" + + +# Override the port range used for incoming migrations. +# +# Minimum must be greater than 0, however when QEMU is not running as root, +# setting the minimum to be lower than 1024 will not work. +# +# Maximum must not be greater than 65535. +# +#migration_port_min = 49152 +#migration_port_max = 49215 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/dictionaries/30_ltsp.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/dictionaries/30_ltsp.xml new file mode 100644 index 0000000000000000000000000000000000000000..579ef5547a271e9ba0655cc9a192aacaea6fa914 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/dictionaries/30_ltsp.xml @@ -0,0 +1,174 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <containers> + + <container name='ltspserver' id='54'> + + <service_access service='ldm'> + <port>9571</port> + <tcpwrapper>ldminfod</tcpwrapper> + </service_access> + <service_access service='nbd'> + <port>10809</port> + </service_access> + + <package>eole-ltsp-server-pkg</package> + <package>eole-client-annuaire-pkg</package> + + <file name='/etc/idmapd.conf' instance_mode='when_no_container' /> + <file name='/etc/default/nfs-common' instance_mode='when_no_container' /> + <file name='/etc/default/portmap' instance_mode='when_no_container' /> + <file name='/etc/nslcd.conf'/> + + <!-- For LDAP clients --> + <file name='/etc/nsswitch.conf' source='nsswitch.conf.default' /> + <file name='/etc/ldap/ldap.conf' /> + <file name='/etc/ldap.conf' /> + + <file name='/etc/eole/eole-ltsp.conf'/> + <file name='/etc/ltsp/ltsp-build-client.conf'/> + <file name='/etc/nbd-server/conf.d/swap.conf'/> + <file name='/etc/ltsp/seconde_image.conf' filelist="seconde_image"/> + <file name='/etc/X11/Xsession.d/60scribe-xfce4-session'/> + <file name='/etc/security/group.conf'/> + <file name='/etc/pam.d/common-auth'/> + <file name='/usr/share/ltsp/plugins/ltsp-build-client/Ubuntu/010-apt-eole'/> + <file name='/usr/share/ltsp/plugins/ltsp-build-client/Ubuntu/031-nbd-tftp'/> + <file name='/usr/share/ltsp/plugins/ltsp-build-client/Ubuntu/031-gaspacho-agent'/> + <file name='/usr/share/ltsp/plugins/ltsp-build-client/Ubuntu/031-correct-ltsconf-path'/> + + </container> + + </containers> + + <variables> + + <family name="services"> + <variable name='activer_client_ldap' redefine='True' hidden='True'> + <value>distant</value> + </variable> + <variable name='activer_dhcp' redefine='True' mode='expert'> + <value>non</value> + </variable> + <variable name='activer_tftp' redefine='True' hidden='True'> + <value>oui</value> + </variable> + </family> + + <family name="ltsp" icon='book'> + <variable name='adresse_serveur_nfs' type='domain' description="Adresse IP ou nom DNS du serveur NFS" mandatory='True'/> + <variable name='ltsp_chroot_base' type='filename' description="Répertoire du chroot et des images pour les clients légers" mode='expert'> + <value>/opt/ltsp</value> + </variable> + <variable name='bureau_graphique_thin' type='string' description="Nom du bureau graphique pour les clients légers thin" mode='expert'> + <value>mate</value> + </variable> + <variable name="ltsp_client_type" type="string" description="Type de l'image à générer sur le serveur" mandatory="True"> + <value>thin</value> + </variable> + <variable name='ltsp_client_arch' type='string' description="Architecture matérielle de l'image" mandatory="True"> + <value>amd64</value> + </variable> + <variable name='bureau_graphique' type='string' description="Nom du bureau graphique" mode='expert'> + <value>mate</value> + </variable> + <!-- seconde image pour les clients légers --> + <variable name="activer_seconde_image" type="oui/non" description="Générer une configuration pour une deuxième image"> + <value>non</value> + </variable> + <variable name="ltsp_client_type_1" type="string" description="Type de l'image à générer sur le serveur" mandatory="True"> + <value>fat</value> + </variable> + <variable name='ltsp_client_arch_1' type='string' description="Architecture matérielle de l'image" mandatory="True"> + <value>amd64</value> + </variable> + <variable name='bureau_graphique_1' type='string' description="Nom du bureau graphique" mode='expert'> + <value>mate</value> + </variable> + </family> + + <family name="annuaire"> + <variable name='ldap_nss' redefine='True' hidden='True'> + <value>oui</value> + </variable> + </family> + + <family name='tftp' mode='expert'> + <variable name='adresse_ip_tftp' redefine='True' hidden='True'/> + <variable name='repertoire_tftp' redefine='True'> + <value>/var/lib/tftpboot/ltsp/</value> + </variable> + <variable name='chemin_fichier_pxe' redefine='True' hidden='True' remove_condition='True'/> + </family> + <separators> + <separator name='adresse_serveur_nfs'>Configuration générale de l'environnement</separator> + <separator name='ltsp_client_type'>Configuration de l'image par défaut</separator> + <separator name='activer_seconde_image'>Configuration d'une seconde image</separator> + </separators> + </variables> + + <constraints> + <check name='valid_enum' target='ltsp_client_type'> + <param>['fat','thin']</param> + </check> + <check name='valid_enum' target='ltsp_client_type_1'> + <param>['fat','thin']</param> + </check> + <check name='valid_enum' target='ltsp_client_arch'> + <param>['amd64','i386']</param> + </check> + <check name='valid_enum' target='ltsp_client_arch_1'> + <param>['amd64','i386']</param> + </check> + <check name='valid_enum' target='bureau_graphique_thin'> + <param>['mate','xfce4']</param> + </check> + <check name='valid_enum' target='bureau_graphique'> + <param>['mate']</param> + </check> + <check name='valid_enum' target='bureau_graphique_1'> + <param>['mate']</param> + </check> + + <condition name="disabled_if_in" source="activer_seconde_image"> + <param>non</param> + <target>ltsp_client_type_1</target> + <target>ltsp_client_arch_1</target> + <target>bureau_graphique_1</target> + <target type="filelist">seconde_image</target> + </condition> + <condition name="disabled_if_in" source='ltsp_client_type'> + <param>thin</param> + <target>bureau_graphique</target> + </condition> + <condition name="disabled_if_in" source='ltsp_client_type_1'> + <param>thin</param> + <target>bureau_graphique_1</target> + </condition> + <fill name='calc_val' target='adresse_serveur_nfs'> + <param type='eole'>adresse_ip_ldap</param> + </fill> + <!-- + <auto name='concat_path' target='repertoire_tftp'> + <param>/var/lib/tftpboot/ltsp/</param> + <param type='eole'>ltsp_client_arch</param> + </auto> + <fill name='calc_val' target='adresse_ip_gaspacho'> + <param type='eole'>adresse_ip_ldap</param> + </fill>--> + + </constraints> + + <help> + <family name='ltsp'>Configuration générale du serveur de clients légers</family> + <variable name='bureau_graphique'>Nom de l'environnement de bureau par défaut pour les clients légers</variable> + <variable name='adresse_serveur_nfs'>Nom de domaine ou l'adresse IP du serveur NFS</variable> + <variable name='ltsp_client_arch'>Architecture matérielle des clients légers</variable> + <variable name='ltsp_chroot_base'>Répertoire de base du chroot et des images pour les clients légers</variable> + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/files/usr/share/eole/diagnose/60-ltsp b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/files/usr/share/eole/diagnose/60-ltsp new file mode 100644 index 0000000000000000000000000000000000000000..3edf228a4514cda05e160d912ee8b935ad2e4de7 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/files/usr/share/eole/diagnose/60-ltsp @@ -0,0 +1,35 @@ +#!/bin/bash + +. /usr/lib/eole/diagnose.sh + +mode_container_actif=$(CreoleGet mode_conteneur_actif) +container_ip_ltspserver=$(CreoleGet container_ip_ltspserver) + +EchoGras "*** Serveur LTSP" +TestService "NBD" "$container_ip_ltspserver":10809 +TestService "Display Manager" "$container_ip_ltspserver":9571 +if [ "$mode_container_actif" = "non" ];then + TestService "NFS distant" $(CreoleGet adresse_serveur_nfs):2049 +fi +#if [ $(CreoleGet activer_gaspacho_agent) = 'oui' ];then +# TestService Gaspacho $(CreoleGet adresse_ip_gaspacho):8080 +#else +# Inactif Gaspacho +#fi +#Test de la présence d'une image pour clients légers +CHROOT=$(CreoleGet container_path_ltspserver)$(CreoleGet ltsp_chroot_base) +THIN_CLIENT_ARCH=$(CreoleGet ltsp_client_type)_$(CreoleGet ltsp_client_arch) +printf ". %${len_pf}s => " "Image client" +if ! [ -f $CHROOT/images/$THIN_CLIENT_ARCH.img ];then + EchoRouge "Pas d'image générée" +else + EchoVert "OK" +fi + + + + + +echo + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/postservices/00-ltsp b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/postservices/00-ltsp new file mode 100644 index 0000000000000000000000000000000000000000..43add7e58c86ba46a643061ca03784f62ecbb776 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/postservices/00-ltsp @@ -0,0 +1,17 @@ +#!/bin/bash + +set -e + +case "$1" in + instance|reconfigure) + CreoleRun "/usr/share/eole/sbin/configure-ltspserver-container ${1}" ltspserver + CreoleRun "eole-gen-ltsp-images ${1}" ltspserver + ;; + + *) + echo "posttemplate called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..1ee19b77f4cd1e56ba64a44d578903cdd0976054 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/service.yml @@ -0,0 +1,47 @@ +format: '0.1' +name: eole-ltsp-server +version: |- + 2.7.0-4 +description: |- + configuration du module Eole : Eclair + Pour toute information complementaire, + veuillez vous rendre + sur le site du Projet a l'adresse suivante : + . + http://eole.orion.education.fr +depends: + - eole-client-annuaire + - eole-dhcp +packages: [] +dictionaries: + - 30_ltsp.xml +extra_dictionaries: {} +templates: + - 010-apt-eole + - 031-correct-ltsconf-path + - 031-gaspacho-agent + - 031-nbd-tftp + - 60scribe-xfce4-session + - common-auth + - eole-ltsp.conf + - group.conf + - idmapd.conf + - ltsp-build-client.conf + - nfs-common + - nslcd.conf + - portmap + - seconde_image.conf + - swap.conf +creole_funcs: [] +preservices: [] +postservices: + - 00-ltsp +pretemplates: [] +posttemplates: [] +files: + /usr/share/eole/diagnose/60-ltsp: + owner: root + group: root + mode: '0755' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/templates/010-apt-eole b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/templates/010-apt-eole new file mode 100644 index 0000000000000000000000000000000000000000..2a6ea8f40b993b0d6d37f3b115bd9c7b4e381053 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/templates/010-apt-eole @@ -0,0 +1,26 @@ +case "$MODE" in + install) + mkdir -p $ROOT/etc/apt/{sources.list.d,preferences.d} + cp /etc/apt/apt-eole.conf $ROOT/etc/apt/ +%if %%getVar('activer_gaspacho_agent', 'non') == 'oui' + + : > $ROOT/etc/apt/sources.list.d/gaspacho.list + : > $ROOT/etc/apt/preferences.d/gaspacho.pref + + for release in $(awk '/\/eole / {print $6}' /etc/apt/sources.list) + do + echo "deb [ arch=amd64 ] http://%%serveur_maj[0]/eole $release main cloud" >> $ROOT/etc/apt/sources.list.d/gaspacho.list + cat << EOF >> $ROOT/etc/apt/preferences.d/gaspacho.pref +Package: * +Pin: release n=$release +Pin-Priority: -1 + +Package: gaspacho-agent +Pin: release n=$release +Pin-Priority: 500 + +EOF + done +%end if + ;; +esac diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/templates/031-correct-ltsconf-path b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/templates/031-correct-ltsconf-path new file mode 100644 index 0000000000000000000000000000000000000000..685122424a32d6362f1a86cd310a186a9683381b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/templates/031-correct-ltsconf-path @@ -0,0 +1,7 @@ +#Manage lts.conf path through dhcp filename rather than boot_image +case "$MODE" in + after-install) + #Comment boot_image from /proc/cmdline so it default to pxefilename + sed -e '/BOOT_IMAGE=/ s/^#*/#/' -i $BASE/$CHROOT/usr/share/ltsp/init-ltsp.d/05-getltsconffile + ;; +esac diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/templates/031-gaspacho-agent b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/templates/031-gaspacho-agent new file mode 100644 index 0000000000000000000000000000000000000000..d11cff1c7beb81c3af0e2206bcc4f1b036778440 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/templates/031-gaspacho-agent @@ -0,0 +1,17 @@ +case "$MODE" in + finalization) + if [ $(CreoleGet 'activer_gaspacho_agent' 'non') == 'oui' ];then + sed 's/^hostname*/#hostname/' /etc/gaspacho-agent/gaspacho-agent.conf > $ROOT/etc/gaspacho-agent/gaspacho-agent.conf + cat << EOF > $ROOT/etc/cron.hourly/gaspacho-agent +#!/bin/bash + +/usr/share/gaspacho-agent/computer.py + +EOF + if [ -f /usr/local/share/ca-certificates/gaspacho-server.crt ];then + cp /usr/local/share/ca-certificates/gaspacho-server.crt $ROOT/usr/local/share/ca-certificates/ + chroot $ROOT update-ca-certificates + fi + fi + ;; +esac diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/templates/031-nbd-tftp b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/templates/031-nbd-tftp new file mode 100644 index 0000000000000000000000000000000000000000..3a6c87aaebfde07843a87e6a98b1e3c7942e37b3 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/templates/031-nbd-tftp @@ -0,0 +1,6 @@ +#Gestion du path nbd pour l'image embarquée +case "$MODE" in + after-install) + sed -i 's?CMDLINE_NBD.*$?CMDLINE_NBD="root=/dev/nbd0 nbdroot='$NBDSERVER${BASE%/}/$CHROOT'"?' $BASE/$CHROOT/etc/ltsp/update-kernels.conf + ;; +esac diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/templates/60scribe-xfce4-session b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/templates/60scribe-xfce4-session new file mode 100644 index 0000000000000000000000000000000000000000..f1ed416214fe2f1e442ec0824c44ff6270ce6009 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/templates/60scribe-xfce4-session @@ -0,0 +1,28 @@ +# -*- sh -*- +# Ajout des raccourcis à thunar +BASESTARTUP=$(basename "$STARTUP" | cut -d\ -f1) +if [ "$BASESTARTUP" = x-session-manager ]; then + BASESTARTUP=$(basename $(readlink /etc/alternatives/x-session-manager)) +fi +case "$BASESTARTUP" in + xfce4-session|startxfce4|mate-session) + %if %%getVar('activer_gaspacho_agent', 'non') == 'oui' + [ -r /etc/gaspacho-agent/users/$(whoami)/dconf.sh ] && . /etc/gaspacho-agent/users/$(whoami)/dconf.sh + %end if + if ! [ -d ${HOME}/.config/gtk-3.0 ];then + mkdir -p ${HOME}/.config/gtk-3.0 + fi + for link in `ls ${HOME%/perso}/.ftp/`;do + if [ $link != "perso" ];then + grep ${link} ${HOME}/.config/gtk-3.0/bookmarks + if [ $? != 0 ];then + echo "file://${HOME%/perso}/.ftp/${link}" >> "${HOME}/.config/gtk-3.0/bookmarks" + fi + fi + done + if ! [ -s "$HOME/.gtk-bookmarks" ];then + ln -s "${HOME}/.config/gtk-3.0/bookmarks" "$HOME/.gtk-bookmarks" + fi +esac + + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/templates/common-auth b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/templates/common-auth new file mode 100644 index 0000000000000000000000000000000000000000..70b5a6a2441ea3ee3b818f17e09be2f9ace9449e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/templates/common-auth @@ -0,0 +1,28 @@ +# +# /etc/pam.d/common-auth - authentication settings common to all services +# +# This file is included from other service-specific PAM config files, +# and should contain a list of the authentication modules that define +# the central authentication scheme for use on the system +# (e.g., /etc/shadow, LDAP, Kerberos, etc.). The default is to use the +# traditional Unix authentication mechanisms. +# +# As of pam 1.0.1-6, this file is managed by pam-auth-update by default. +# To take advantage of this, it is recommended that you configure any +# local modules either before or after the default block, and use +# pam-auth-update to manage selection of other modules. See +# pam-auth-update(8) for details. + +# here are the per-package modules (the "Primary" block) +auth [success=2 default=ignore] pam_unix.so nullok_secure +auth [success=1 default=ignore] pam_ldap.so use_first_pass +# here's the fallback if no module succeeds +auth requisite pam_deny.so +# prime the stack with a positive return value if there isn't one already; +# this avoids us returning an error just because nothing sets a success code +# since the modules above will each just jump around +auth required pam_permit.so +# and here are more per-package modules (the "Additional" block) +## end of pam-auth-update config +auth optional pam_group.so + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/templates/eole-ltsp.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/templates/eole-ltsp.conf new file mode 100644 index 0000000000000000000000000000000000000000..41558dfd07455b73c27ce3a0ce2b32387d6ad7da --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/templates/eole-ltsp.conf @@ -0,0 +1,20 @@ +# -*- shell-script -*- + +# Configuration file in sh format + +CONTAINER_PATH_LTSPSERVER="%%container_path_ltspserver" +REPERTOIRE_TFTP="%%repertoire_tftp" +BUREAU_GRAPHIQUE_THIN="%%bureau_graphique_thin" +LTSP_CLIENT_TYPE="%%ltsp_client_type" +LTSP_CLIENT_ARCH="%%ltsp_client_arch" + +%if %%getVar('adresse_serveur_nfs', None) is not None +ADRESSE_IP_ETH0="%%adresse_ip_eth0" +ADRESSE_SERVEUR_NFS="%%adresse_serveur_nfs" +%end if + +ACTIVER_SECONDE_IMAGE="%%activer_seconde_image" +%if %%activer_seconde_image == 'oui' +LTSP_CLIENT_TYPE_1="%%ltsp_client_type_1" +LTSP_CLIENT_ARCH_1="%%ltsp_client_arch_1" +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/templates/group.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/templates/group.conf new file mode 100644 index 0000000000000000000000000000000000000000..1edb7ac1feb09f710b4b8f2e615ec9be67c72af0 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/templates/group.conf @@ -0,0 +1,103 @@ +# +# This is the configuration file for the pam_group module. +# + +# +# *** Please note that giving group membership on a session basis is +# *** NOT inherently secure. If a user can create an executable that +# *** is setgid a group that they are infrequently given membership +# *** of, they can basically obtain group membership any time they +# *** like. Example: games are allowed between the hours of 6pm and 6am +# *** user joe logs in at 7pm writes a small C-program toplay.c that +# *** invokes their favorite shell, compiles it and does +# *** "chgrp play toplay; chmod g+s toplay". They are basically able +# *** to play games any time... You have been warned. AGM +# + +# +# The syntax of the lines is as follows: +# +# services;ttys;users;times;groups +# +# white space is ignored and lines maybe extended with '\\n' (escaped +# newlines). From reading these comments, it is clear that +# text following a '#' is ignored to the end of the line. +# +# the combination of individual users/terminals etc is a logic list +# namely individual tokens that are optionally prefixed with '!' (logical +# not) and separated with '&' (logical and) and '|' (logical or). +# +# services +# is a logic list of PAM service names that the rule applies to. +# +# ttys +# is a logic list of terminal names that this rule applies to. +# +# users +# is a logic list of users or a netgroup of users to whom this +# rule applies. +# +# NB. For these items the simple wildcard '*' may be used only once. +# With netgroups no wildcards or logic operators are allowed. +# +# times +# It is used to indicate "when" these groups are to be given to the +# user. The format here is a logic list of day/time-range +# entries the days are specified by a sequence of two character +# entries, MoTuSa for example is Monday Tuesday and Saturday. Note +# that repeated days are unset MoMo = no day, and MoWk = all weekdays +# bar Monday. The two character combinations accepted are +# +# Mo Tu We Th Fr Sa Su Wk Wd Al +# +# the last two being week-end days and all 7 days of the week +# respectively. As a final example, AlFr means all days except Friday. +# +# Each day/time-range can be prefixed with a '!' to indicate "anything +# but" +# +# The time-range part is two 24-hour times HHMM separated by a hyphen +# indicating the start and finish time (if the finish time is smaller +# than the start time it is deemed to apply on the following day). +# +# groups +# The (comma or space separated) list of groups that the user +# inherits membership of. These groups are added if the previous +# fields are satisfied by the user's request +# +# For a rule to be active, ALL of service+ttys+users must be satisfied +# by the applying process. +# + +# +# Note, to get this to work as it is currently typed you need +# +# 1. to run an application as root +# 2. add the following groups to the /etc/group file: +# floppy, play, sound +# + +# +# Here is a simple example: running 'xsh' on tty* (any ttyXXX device), +# the user 'us' is given access to the floppy (through membership of +# the floppy group) +# + +#xsh;tty*&!ttyp*;us;Al0000-2400;floppy + +# +# another example: running 'xsh' on tty* (any ttyXXX device), +# the user 'sword' is given access to games (through membership of +# the sound and play group) after work hours. +# + +#xsh; tty* ;sword;!Wk0900-1800;sound, play +#xsh; tty* ;*;Al0900-1800;floppy + +#Ajout des groupes a la volée pour les peripherisues locaux au client léger +*;*;*;Al0000-2400;audio,cdrom,dialout,floppy,fuse,video + +# +# End of group.conf file +# +# diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/templates/idmapd.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/templates/idmapd.conf new file mode 100644 index 0000000000000000000000000000000000000000..f6e29e65ab1f9db0f3854e51ed698ab55fec4527 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/templates/idmapd.conf @@ -0,0 +1,14 @@ +[General] + +Verbosity = 0 +Pipefs-Directory = /var/lib/nfs/rpc_pipefs +Domain = %%nom_domaine_local + +[Mapping] + +Nobody-User = nobody +Nobody-Group = nogroup + +[Translation] + +Method = nsswitch diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/templates/ltsp-build-client.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/templates/ltsp-build-client.conf new file mode 100644 index 0000000000000000000000000000000000000000..36728dac77e65a7810e9fc362bf59b2f81def72f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/templates/ltsp-build-client.conf @@ -0,0 +1,42 @@ +ARCH=%%ltsp_client_arch +BASE=%%ltsp_chroot_base +CHROOT=%%{ltsp_client_type}_%%{ltsp_client_arch} +DIST=%%ubuntu_version +MIRROR="http://%%ubuntu_update_mirrors[0]/ubuntu/" + +APT_GET_OPTS="--config-file /etc/apt/apt-eole.conf -y" + +APT_KEYS="/etc/apt/trusted.gpg.d/eole-archive-keyring.gpg" +LOCALE="fr_FR.UTF-8" + +%if %%mode_conteneur_actif == 'oui' +NBDSERVER=%%adresse_ip_eclair_link +%end if + +%if %%ltsp_client_type == 'thin' +LATE_PACKAGES=" +firefox +firefox-locale-fr +smplayer +%if %%getVar('activer_gaspacho_agent', 'non') == 'oui' +gaspacho-agent +dbus-x11 +%end if +" +%else +FAT_CLIENT_DESKTOPS="mate-desktop" +LATE_PACKAGES=" +mate-desktop* +ubuntu-mate-themes +oem-config-slideshow-ubuntu-mate +ubuntu-mate-icon-themes +ubuntu-mate-welcome +firefox +firefox-locale-fr +smplayer +%if %%getVar('activer_gaspacho_agent', 'non') == 'oui' +gaspacho-agent +dbus-x11 +%end if +" +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/templates/nfs-common b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/templates/nfs-common new file mode 100644 index 0000000000000000000000000000000000000000..5e732308a93b8ed8e2489c654205b36d6a1495c9 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/templates/nfs-common @@ -0,0 +1,19 @@ +# If you do not set values for the NEED_ options, they will be attempted +# autodetected; this should be sufficient for most people. Valid alternatives +# for the NEED_ options are "yes" and "no". + +# Do you want to start the statd daemon? It is not needed for NFSv4. +NEED_STATD=no + +# Options for rpc.statd. +# Should rpc.statd listen on a specific port? This is especially useful +# when you have a port-based firewall. To use a fixed port, set this +# this variable to a statd argument like: "--port 4000 --outgoing-port 4001". +# For more information, see rpc.statd(8) or http://wiki.debian.org/?SecuringNFS +STATDOPTS= + +# Do you want to start the idmapd daemon? It is only needed for NFSv4. +NEED_IDMAPD=yes + +# Do you want to start the gssd daemon? It is required for Kerberos mounts. +NEED_GSSD=no diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/templates/nslcd.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/templates/nslcd.conf new file mode 100644 index 0000000000000000000000000000000000000000..238464a0b0d806410c4285a6aebe4e3838f29075 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/templates/nslcd.conf @@ -0,0 +1,30 @@ +# /etc/nslcd.conf +# nslcd configuration file. See nslcd.conf(5) +# for details. + +# The user and group nslcd should run as. +uid nslcd +gid nslcd + +# The location at which the LDAP server(s) should be reachable. +uri ldap://%%adresse_ip_ldap:389/ + +# The search base that will be used for all queries. +base %%ldap_base_dn + +# The LDAP protocol version to use. +#ldap_version 3 + +# The DN to bind with for normal lookups. +#binddn cn=annonymous,dc=example,dc=net +#bindpw secret + +# SSL options +ssl start_tls +tls_reqcert never + +# The search scope. +#scope sub + +#map passwd homeDirectory "${homeDirectory}/perso" +map passwd homeDirectory "${homeDirectory}/perso" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/templates/portmap b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/templates/portmap new file mode 100644 index 0000000000000000000000000000000000000000..37d9a63bfc93aad7826f01895e3f0bce3d8df53f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/templates/portmap @@ -0,0 +1,11 @@ +# Portmap configuration file +# +# Note: if you manually edit this configuration file, +# portmap configuration scripts will avoid modifying it +# (for example, by running 'dpkg-reconfigure portmap'). + +# If you want portmap to listen only to the loopback +# interface, uncomment the following line (it will be +# uncommented automatically if you configure this +# through debconf). +OPTIONS="-i 127.0.0.1" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/templates/seconde_image.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/templates/seconde_image.conf new file mode 100644 index 0000000000000000000000000000000000000000..19daeda1f1b9228277ff622e2cddfcde3c173667 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/templates/seconde_image.conf @@ -0,0 +1,3 @@ +%set global %%ltsp_client_type=%%ltsp_client_type_1 +%set global %%ltsp_client_arch=%%ltsp_client_arch_1 +%include "/var/lib/creole/ltsp-build-client.conf" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/templates/swap.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/templates/swap.conf new file mode 100644 index 0000000000000000000000000000000000000000..e9afb5870ee511b7f264fc7a70284f79016ea177 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ltsp-server/templates/swap.conf @@ -0,0 +1,5 @@ +[swap] +exportname = /opt/nbd-swap/%s +prerun = nbdswapd %s +postrun = rm -f %s +authfile = /etc/ltsp/nbd-server.allow diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/dictionaries/00_eole-lxc-controller_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/dictionaries/00_eole-lxc-controller_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..33613be03afa96abe64024ab1d96d36b8ad872bd --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/dictionaries/00_eole-lxc-controller_packages.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>lxc1</package> + <package>lxc-templates</package> + <package>debootstrap</package> + <package>cgroup-lite</package> + <package>eole-ssmtp-pkg</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/dictionaries/01_container.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/dictionaries/01_container.xml new file mode 100644 index 0000000000000000000000000000000000000000..f904e7df1f11189e06a5e3dd808caece38b89a17 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/dictionaries/01_container.xml @@ -0,0 +1,48 @@ +<?xml version="1.0" encoding="utf-8"?> +<creole> + + <files> + <file name='/usr/share/eole/bastion/data/90-lxc_rules' mode='0755' rm='True' filelist='container' /> + <!-- Lock file, must not be removed --> + <file name='/etc/eole/.VirtEnabled.lock' rm='False' source='container.lockfile' filelist='container' /> + <file name='/etc/lxc/default.conf' source='lxc.conf' filelist='container' /> + <file name='/etc/init/lxc.override' filelist='container' /> + <file name='/etc/dnsmasq.d/lxc' source='dnsmasq-lxc' filelist='container' /> + <file name='/etc/default/lxc-net' source='lxc-net.default' filelist='container' /> + </files> + + <containers> + <all> + <file name='/etc/ssh/sshd_config' source='sshd_config.lxc' filelist='container' /> + <file name='/usr/share/eole/bastion/data/50-nat_rules' mkdir="True" mode='0755' filelist='era_not_installed' rm='True' instance_mode='when_container'/> + <file name='/usr/share/eole/bastion/data/00-container' mkdir="True" mode='0755' filelist='container'/> + <file name='/etc/hosts' source='lxc.hosts' filelist='container'/> + <file name='/etc/eole/hosts.allow' filelist='era_not_installed' mkdir='True' instance_mode='when_container'/> + <file name='/etc/hosts.deny' filelist='container'/> + <file name='/etc/timezone' filelist='container'/> + <file name='/etc/resolv.conf' filelist='container'/> + <file name='/etc/vim/vimrc' filelist='container'/> + <file name='../config' source='lxc.config' filelist='container'/> + <file name='../fstab' source='lxc.fstab' filelist='container'/> + <file name='../devices.hook' source='lxc.devices.hook' mode='0755' filelist='container'/> + <file name='/etc/network/interfaces' source='lxc.interfaces' filelist='container'/> + <file name='/etc/rsyslog.conf' source="rsyslog.conf.container" filelist='container'/> + </all> + </containers> + + <variables> + <family name='general'> + <variable name='mode_conteneur_actif' redefine='True'> + <value>oui</value> + </variable> + </family> + </variables> + + <constraints> + <condition name='disabled_if_in' source='mode_conteneur_actif'> + <param>non</param> + <target type='filelist'>container</target> + </condition> + </constraints> + <help/> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/files/etc/apparmor.d/lxc/lxc-default-with-cdrom b/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/files/etc/apparmor.d/lxc/lxc-default-with-cdrom new file mode 100644 index 0000000000000000000000000000000000000000..86dee9dba81b3180c5d78ed6e194019d9c8fceaf --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/files/etc/apparmor.d/lxc/lxc-default-with-cdrom @@ -0,0 +1,20 @@ +# Do not load this file. Rather, load /etc/apparmor.d/lxc-containers, which +# will source all profiles under /etc/apparmor.d/lxc + +profile lxc-container-default-with-cdrom flags=(attach_disconnected,mediate_deleted) { + #include <abstractions/lxc/container-base> + + # the container may never be allowed to mount devpts. If it does, it + # will remount the host's devpts. We could allow it to do it with + # the newinstance option (but, right now, we don't). + deny mount fstype=devpts, + + # allow standard blockdevtypes. + # The concern here is in-kernel superblock parsers bringing down the + # host with bad data. However, we continue to disallow proc, sys, securityfs, + # etc to nonstandard locations. + mount fstype=iso9660, + + # Enable systemd cgroup mount in container + mount fstype=cgroup -> /sys/fs/cgroup/**, +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/files/usr/sbin/gen_conteneurs b/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/files/usr/sbin/gen_conteneurs new file mode 100644 index 0000000000000000000000000000000000000000..9abcbf3f64fbb7f4a00b98e1524b1b59c43324d3 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/files/usr/sbin/gen_conteneurs @@ -0,0 +1,106 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +########################################################################## +# creole.containers - management of LXC containers +# Copyright © 2012,2013 Pôle de compétences EOLE <eole@ac-dijon.fr> +# +# License CeCILL: +# * in french: http://www.cecill.info/licences/Licence_CeCILL_V2-fr.html +# * in english http://www.cecill.info/licences/Licence_CeCILL_V2-en.html +########################################################################## + +"""Generate LXC containers + +`gen_conteneurs` generate the base LXC chroot and instanciate basic +LXC configuration files. + +""" + +import sys +import argparse +import traceback +from os import system, remove +from os.path import isdir, isfile + +from pyeole import scriptargs +from pyeole.log import init_logging +from pyeole import ihm +from pyeole.service import unmanaged_service +from pyeole.service.error import ServiceError +from pyeole.i18n import i18n +_ = i18n('eole-common') + +from creole.config import gen_conteneurs_needed +from creole.reconfigure import containers, install_packages, \ + container_instance_lockfile, options, restart_creoled + +_CACHE_DIR = '/opt/cache' + +def parse_cmdline(): + """Parse commande line. + """ + parser = argparse.ArgumentParser(description=u"Génération et configuration" + u" des conteneurs LXC", + parents=[scriptargs.logging()]) + opts = parser.parse_args() + + options.update_from_cmdline(force_options={'interactive': True}) + if opts.verbose: + opts.log_level = 'info' + if opts.debug: + opts.log_level = 'debug' + + return opts + +def user_exit(*args, **kwargs): + """ + sortie utilisateur "propre" + """ + ihm.print_orange(_(u'! Abandoning container generation !')) + ihm.print_orange(_(u'System may be in an incoherent state.\n\n')) + sys.exit(1) + +def main(): + """Setup environnment and run LXC generation. + """ + + options = parse_cmdline() + try: + log = init_logging(level=options.log_level) + try: + unmanaged_service(u'status', u'lxc-net', u'upstart') + except ServiceError: + unmanaged_service(u'start', u'lxc-net', u'upstart', + display='console') + ihm.catch_signal(user_exit) + restart_creoled() + if isdir(_CACHE_DIR): + question = _("LXC cache already exists, do you want to remove it ?") + try: + if ihm.question_ouinon(question) == 'oui': + system('rm -rf {0}'.format(_CACHE_DIR)) + except EOFError: + user_exit() + + file(container_instance_lockfile, 'w').write('') + if isfile(gen_conteneurs_needed): + remove(gen_conteneurs_needed) + containers(minimal=True, log_=log) + ihm.print_title(_("Installing additional packages")) + if options.log_level in ['info', 'debug']: + silent = False + else: + silent = True + install_packages(silent=silent) + ihm.print_title(_("Containers generation terminated")) + except Exception, err: + if options.debug: + log.debug(traceback.format_exc()) + else: + log.error(err) + sys.exit(1) + sys.exit(0) + +if __name__ == '__main__': + main() diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/files/usr/sbin/lxc-status b/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/files/usr/sbin/lxc-status new file mode 100644 index 0000000000000000000000000000000000000000..9d7b9c8dee8cb9485e2fb740a3fb56eec84896be --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/files/usr/sbin/lxc-status @@ -0,0 +1,41 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# +########################################################################## +# lxc-status +# Copyright © 2014 Pôle de compétences EOLE <eole@ac-dijon.fr> +# +# License CeCILL: +# * in french: http://www.cecill.info/licences/Licence_CeCILL_V2-fr.html +# * in english http://www.cecill.info/licences/Licence_CeCILL_V2-en.html +########################################################################## + +from sys import exit + +from creole.containers import is_lxc_started, is_lxc_running +from creole.client import CreoleClient +from pyeole.ansiprint import print_red, print_green + +from pyeole.i18n import i18n +_ = i18n('eole-common') + +def main(): + client = CreoleClient() + error = False + for group in client.get_groups(): + if group not in ['root', 'all']: + container = client.get_group_infos(group) + if not is_lxc_started(container): + error = True + print_red(_('container {0} not started').format(group)) + elif not is_lxc_running(container): + error = True + print_red(_('container {0} started but not available').format(group)) + else: + print_green(_('container {0} available').format(group)) + + if error: + exit(1) + +if __name__ == '__main__': + main() diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/files/usr/share/lxc/templates/lxc-eole b/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/files/usr/share/lxc/templates/lxc-eole new file mode 100644 index 0000000000000000000000000000000000000000..8caad562e145b85f14fda10f341a5c8e44a978f6 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/files/usr/share/lxc/templates/lxc-eole @@ -0,0 +1,987 @@ +#!/bin/bash + +# +# template script for generating ubuntu container for LXC +# +# This script consolidates and extends the existing lxc ubuntu scripts +# + +# Copyright © 2011 Serge Hallyn <serge.hallyn@canonical.com> +# Copyright © 2010 Wilhelm Meier +# Copyright © 2012-2016 Équipe EOLE <eole@ac-dijon.fr> +# Author: Wilhelm Meier <wilhelm.meier@fh-kl.de> +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. + +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +# Detect use under userns (unsupported) +for arg in "$@"; do + [ "$arg" = "--" ] && break + if [ "$arg" = "--mapped-uid" -o "$arg" = "--mapped-gid" ]; then + echo "This template can't be used for unprivileged containers." 1>&2 + echo "You may want to try the \"download\" template instead." 1>&2 + exit 1 + fi +done + +# Make sure the usual locations are in PATH +export PATH=$PATH:/usr/sbin:/usr/bin:/sbin:/bin + +set -x +set -e + +LOCALSTATEDIR="/opt" +LXC_TEMPLATE_CONFIG="/usr/share/lxc/config" +# Allows the lxc-cache directory to be set by environment variable +LXC_CACHE_PATH=${LXC_CACHE_PATH:-"$LOCALSTATEDIR/cache/lxc"} + +if [ -r /etc/default/lxc ]; then + . /etc/default/lxc +fi + +EOLE_GPG_KEYS=/etc/apt/trusted.gpg.d/eole-archive-keyring.gpg +INSTALL_CDROM=0 + +# Check if given path is in a btrfs partition +is_btrfs() +{ + [ -e $1 -a $(stat -f -c '%T' $1) = "btrfs" ] +} + +# Check if given path is the root of a btrfs subvolume +is_btrfs_subvolume() +{ + [ -d $1 -a $(stat -f -c '%T' $1) = "btrfs" -a $(stat -c '%i' $1) -eq 256 ] +} + +try_mksubvolume() +{ + path=$1 + [ -d $path ] && return 0 + mkdir -p $(dirname $path) + if which btrfs >/dev/null 2>&1 && is_btrfs $(dirname $path); then + btrfs subvolume create $path + else + mkdir -p $path + fi +} + +try_rmsubvolume() +{ + path=$1 + [ -d $path ] || return 0 + if which btrfs >/dev/null 2>&1 && is_btrfs_subvolume $path; then + btrfs subvolume delete $path + else + rm -rf $path + fi +} + +configure_ubuntu() +{ + rootfs=$1 + hostname=$2 + release=$3 + user=$4 + password=$5 + + # configure the network using the dhcp + cat <<EOF > $rootfs/etc/network/interfaces +# This file describes the network interfaces available on your system +# and how to activate them. For more information, see interfaces(5). + +# The loopback network interface +auto lo +iface lo inet loopback + +auto eth0 +iface eth0 inet dhcp +EOF + + # set the hostname + cat <<EOF > $rootfs/etc/hostname +$hostname +EOF + # set minimal hosts + cat <<EOF > $rootfs/etc/hosts +127.0.0.1 localhost +127.0.1.1 $hostname + +# The following lines are desirable for IPv6 capable hosts +::1 ip6-localhost ip6-loopback +fe00::0 ip6-localnet +ff00::0 ip6-mcastprefix +ff02::1 ip6-allnodes +ff02::2 ip6-allrouters +EOF + + if [ ! -f $rootfs/etc/init/container-detect.conf ]; then + # suppress log level output for udev + sed -i "s/=\"err\"/=0/" $rootfs/etc/udev/udev.conf + + # remove jobs for consoles 3, 4, 5 and 6 since we only create 4 consoles in + # this template + rm -f $rootfs/etc/init/tty{3,4,5,6}.conf + fi + + # if [ -z "$bindhome" ]; then + # chroot $rootfs useradd --create-home -s /bin/bash $user + # echo "$user:$password" | chroot $rootfs chpasswd + # fi + + # Generating locales + echo 'locales locales/default_environment_locale select fr_FR.UTF-8' \ + | chroot $rootfs debconf-set-selections 2>/dev/null + echo 'locales locales/locales_to_be_generated multiselect fr_FR.UTF-8 UTF-8' \ + | chroot $rootfs debconf-set-selections 2> /dev/null + chroot $rootfs locale-gen --lang fr_FR.UTF-8 2> /dev/null + + # make sure we have the current locale defined in the container + if [ -z "$LANG" ] || echo $LANG | grep -E -q "^C(\..+)*$"; then + chroot $rootfs locale-gen en_US.UTF-8 || true + chroot $rootfs update-locale LANG=en_US.UTF-8 || true + else + chroot $rootfs locale-gen $LANG || true + chroot $rootfs update-locale LANG=$LANG || true + fi + + # Configure keyboard + cp /etc/default/keyboard $rootfs/etc/default/keyboard + + # generate new SSH keys + if [ -x $rootfs/var/lib/dpkg/info/openssh-server.postinst ]; then + cat > $rootfs/usr/sbin/policy-rc.d << EOF +#!/bin/sh +exit 101 +EOF + chmod +x $rootfs/usr/sbin/policy-rc.d + + rm -f $rootfs/etc/ssh/ssh_host_*key* + if [ -f $rootfs/etc/init/ssh.conf ];then + mv $rootfs/etc/init/ssh.conf $rootfs/etc/init/ssh.conf.disabled + fi + DPKG_MAINTSCRIPT_PACKAGE=openssh DPKG_MAINTSCRIPT_NAME=postinst chroot $rootfs /var/lib/dpkg/info/openssh-server.postinst configure + if [ -f $rootfs/etc/init/ssh.conf.disabled ];then + mv $rootfs/etc/init/ssh.conf.disabled $rootfs/etc/init/ssh.conf + fi + + sed -i "s/root@$(hostname)/root@$hostname/g" $rootfs/etc/ssh/ssh_host_*.pub + + rm -f $rootfs/usr/sbin/policy-rc.d + fi + + return 0 +} + +configure_eole() +{ + trootfs=${1} + trap cleanup EXIT SIGHUP SIGINT SIGTERM + if [ $INSTALL_CDROM -eq 1 ] ; then + mount --bind /media/cdrom $trootfs/media/cdrom + fi + # Disable service at installation + cat > $trootfs/usr/sbin/policy-rc.d << EOF +#!/bin/sh +exit 101 +EOF + chmod +x $trootfs/usr/sbin/policy-rc.d + + # Divert "hostname --fqdn" for ssmtp + echo -e '#!/bin/sh\ncat /etc/hostname' > $trootfs/usr/local/bin/hostname + chmod +x $trootfs/usr/local/bin/hostname + chroot $trootfs apt-get purge --force-yes -y resolvconf + chroot $trootfs apt-get install --force-yes -y --no-install-recommends eole-lxc-container-pkg + if [ -L "$trootfs/etc/resolv.conf" ] + then + rm -f "$trootfs/etc/resolv.conf" + fi + # Remove divertion + rm -f $trootfs/usr/sbin/policy-rc.d + rm -f $trootfs/usr/local/bin/hostname + chroot $trootfs apt-get clean + if [ $INSTALL_CDROM -eq 1 ] ; then + umount $trootfs/media/cdrom + fi + trap EXIT + trap SIGHUP + trap SIGINT + trap SIGTERM +} + + +# finish setting up the user in the container by injecting ssh key and +# adding sudo group membership. +# passed-in user is either 'ubuntu' or the user to bind in from host. +finalize_user() +{ + user=$1 + + sudo_version=$(chroot $rootfs dpkg-query -W -f='${Version}' sudo) + + if chroot $rootfs dpkg --compare-versions $sudo_version gt "1.8.3p1-1"; then + groups="sudo" + else + groups="sudo admin" + fi + + for group in $groups; do + chroot $rootfs groupadd --system $group >/dev/null 2>&1 || true + chroot $rootfs adduser ${user} $group >/dev/null 2>&1 || true + done + + if [ -n "$auth_key" -a -f "$auth_key" ]; then + u_path="/home/${user}/.ssh" + root_u_path="$rootfs/$u_path" + mkdir -p $root_u_path + cp $auth_key "$root_u_path/authorized_keys" + chroot $rootfs chown -R ${user}: "$u_path" + + echo "Inserted SSH public key from $auth_key into /home/${user}/.ssh/authorized_keys" + fi + return 0 +} + +finalize_root() +{ + local user='root' + local u_path="/${user}/.ssh" + local lxc_u_path="$rootfs/$u_path" + + # Set root password in container equal to the one outside + # echo "Set container root password" + # local shadow=`getent shadow root` + # sed -ie "/^root.*\$/d; 1 i\\${shadow}" "$rootfs/etc/shadow" + + test -d "$u_path" || mkdir -p "$u_path" + + if [ -z "$auth_key" -o ! -f "$auth_key" ]; then + auth_key="$u_path/id_rsa" + fi + if [[ "${auth_key}" =~ \.pub$ ]]; then + auth_key="${auth_key%.pub}" + fi + if [ ! -f "$auth_key" ]; then + # Password less ssh key + ssh-keygen -f "$auth_key" -N '' + fi + + mkdir -p "$lxc_u_path" + cp "${auth_key}.pub" "$lxc_u_path/authorized_keys" + chroot "$rootfs" chown -R "${user}": "$u_path" + + echo "Inserted SSH public key from $auth_key into /${user}/.ssh/authorized_keys" + return 0 +} + +# A function to try and autodetect squid-deb-proxy servers on the local network +# if either the squid-deb-proxy-client package is installed on the host or +# a parent container set the 50squid-deb-proxy-client file. +squid_deb_proxy_autodetect() +{ + local apt_discover=/usr/share/squid-deb-proxy-client/apt-avahi-discover + local proxy_file=/etc/apt/apt.conf.d/50squid-deb-proxy-client + squid_proxy_line= # That's a global :/ + + # Maybe the host is aware of a squid-deb-proxy? + if [ -f $apt_discover ]; then + echo -n "Discovering squid-deb-proxy..." + squid_proxy_line=$($apt_discover) + if [ -n "$squid_proxy_line" ]; then + echo "found squid-deb-proxy: $squid_proxy_line" + else + echo "no squid-deb-proxy found" + fi + fi + + # Are we in a nested container, and the parent already knows of a proxy? + if [ -f $proxy_file ]; then + # Extract the squid URL from the file (whatever is between "") + squid_proxy_line=`cat $proxy_file | sed "s/.*\"\(.*\)\".*/\1/"` + fi +} + +# +# Choose proxies for container +# http_proxy will be used by debootstrap on the host. +# APT_PROXY will be used to set /etc/apt/apt.conf.d/70proxy in the container. +# +choose_container_proxy() +{ + local rootfs=$1 + local arch=$2 + + if [ -z "$HTTP_PROXY" ]; then + HTTP_PROXY="none" + fi + case "$HTTP_PROXY" in + none) + squid_deb_proxy_autodetect + if [ -n "$squid_proxy_line" ]; then + APT_PROXY=$squid_proxy_line + export http_proxy=$squid_proxy_line + else + APT_PROXY= + fi + ;; + apt) + RES=`apt-config shell APT_PROXY Acquire::http::Proxy` + eval $RES + [ -z "$APT_PROXY" ] || export http_proxy=$APT_PROXY + ;; + *) + APT_PROXY=$HTTP_PROXY + export http_proxy=$HTTP_PROXY + ;; + esac +} + +write_sourceslist() +{ +# # $1 => path to the partial cache or the rootfs +# # $2 => architecture we want to add +# # $3 => whether to use the multi-arch syntax or not +# +# if [ -n "$APT_PROXY" ]; then +# mkdir -p $1/etc/apt/apt.conf.d +# cat > $1/etc/apt/apt.conf.d/70proxy << EOF +#Acquire::http::Proxy "$APT_PROXY" ; +#EOF +# fi +# +# case $2 in +# amd64|i386) +# MIRROR=${MIRROR:-http://archive.ubuntu.com/ubuntu} +# SECURITY_MIRROR=${SECURITY_MIRROR:-http://security.ubuntu.com/ubuntu} +# ;; +# *) +# MIRROR=${MIRROR:-http://ports.ubuntu.com/ubuntu-ports} +# SECURITY_MIRROR=${SECURITY_MIRROR:-http://ports.ubuntu.com/ubuntu-ports} +# ;; +# esac +# if [ -n "$3" ]; then +# cat >> "$1/etc/apt/sources.list" << EOF +#deb [arch=$2] $MIRROR ${release} main restricted universe multiverse +#deb [arch=$2] $MIRROR ${release}-updates main restricted universe multiverse +#deb [arch=$2] $SECURITY_MIRROR ${release}-security main restricted universe multiverse +#EOF +# else +# cat >> "$1/etc/apt/sources.list" << EOF +#deb $MIRROR ${release} main restricted universe multiverse +#deb $MIRROR ${release}-updates main restricted universe multiverse +#deb $SECURITY_MIRROR ${release}-security main restricted universe multiverse +#EOF + trootfs=$1 + cp -af /etc/apt/sources.list $cache/partial-$arch/etc/apt/sources.list + if [ -f "${EOLE_GPG_KEYS}" ]; then + echo "Adding EOLE APT keyring" + cp "${EOLE_GPG_KEYS}" "$cache/partial-$arch/${EOLE_GPG_KEYS}" + fi +} + +install_packages() +{ + local rootfs="$1" + shift + local packages="$*" + if [ -z $update ] + then + chroot $rootfs apt-get update + update=true + fi + if [ -n "${packages}" ] + then + chroot $rootfs apt-get install --force-yes -y --no-install-recommends ${packages} + fi +} + +cleanup() +{ + try_rmsubvolume $cache/partial-$arch + try_rmsubvolume $cache/rootfs-$arch + if [ $INSTALL_CDROM -eq 1 ] ; then + umount "$cache/partial-$arch/media/cdrom" + fi +} + +suggest_flush() +{ + echo "Container upgrade failed. The container cache may be out of date," + echo "in which case flushing the cache (see -F in the help output) may help." +} + +download_ubuntu() +{ + cache=$1 + arch=$2 + release=$3 + +# case $2 in +# amd64|i386) +# MIRROR=${MIRROR:-http://archive.ubuntu.com/ubuntu} +# SECURITY_MIRROR=${SECURITY_MIRROR:-http://security.ubuntu.com/ubuntu} +# ;; +# *) +# MIRROR=${MIRROR:-http://ports.ubuntu.com/ubuntu-ports} +# SECURITY_MIRROR=${SECURITY_MIRROR:-http://ports.ubuntu.com/ubuntu-ports} +# ;; +# esac + packages_template=nano,vim,openssh-server,net-tools + packages_template=${packages_template:-"ssh,vim"} +# debootstrap_parameters= + debootstrap_parameters=$TRUSTED + + # Try to guess a list of langpacks to install + langpacks="language-pack-en" + + if which dpkg >/dev/null 2>&1; then + langpacks=`(echo $langpacks && + dpkg -l | grep -E "^ii language-pack-[a-z]* " | + cut -d ' ' -f3) | sort -u` + fi + packages_template="${packages_template},$(echo $langpacks | sed 's/ /,/g')" + + if [ -n "$variant" ]; then + debootstrap_parameters="$debootstrap_parameters --variant=$variant" + fi + if [ "$variant" = 'minbase' ]; then + packages_template="${packages_template},sudo,ifupdown,isc-dhcp-client" + fi + + echo "Installing packages in template: ${packages_template}" + + trap cleanup EXIT SIGHUP SIGINT SIGTERM + # check the mini ubuntu was not already downloaded + try_mksubvolume "$cache/partial-$arch" + if [ $? -ne 0 ]; then + echo "Failed to create '$cache/partial-$arch' directory" + return 1 + fi + + choose_container_proxy $cache/partial-$arch/ $arch + # download a mini ubuntu into a cache + echo "Downloading ubuntu $release minimal ..." + if [ -n "$(which qemu-debootstrap)" ]; then + qemu-debootstrap --verbose $debootstrap_parameters --components=main,universe --arch=$arch --include=${packages_template} $release $cache/partial-$arch $MIRROR + else + debootstrap --verbose $debootstrap_parameters --components=main,universe --arch=$arch --include=${packages_template} $release $cache/partial-$arch $MIRROR + fi + #reconfigurer le clavier (#13600) + service console-setup start + if [ $? -ne 0 ]; then + echo "Failed to download the rootfs, aborting." + return 1 + fi + + # Serge isn't sure whether we should avoid doing this when + # $release == `distro-info -d` + echo "Installing updates" + > $cache/partial-$arch/etc/apt/sources.list + write_sourceslist $cache/partial-$arch/ $arch + if [ $INSTALL_CDROM -eq 1 ] ; then + mkdir -p "$cache/partial-$arch/media/cdrom" + mount --bind /media/cdrom "$cache/partial-$arch/media/cdrom" + fi + + chroot "$1/partial-${arch}" ifconfig lo 127.0.0.1 + chroot "$1/partial-${arch}" apt-get update + if [ $? -ne 0 ]; then + echo "Failed to update the apt cache" + return 1 + fi + cat > "$1/partial-${arch}"/usr/sbin/policy-rc.d << EOF +#!/bin/sh +exit 101 +EOF + chmod +x "$1/partial-${arch}"/usr/sbin/policy-rc.d + + lxc-unshare -s MOUNT -- chroot "$1/partial-${arch}" apt-get dist-upgrade -y || { suggest_flush; false; } + rm -f "$1/partial-${arch}"/usr/sbin/policy-rc.d + + chroot "$1/partial-${arch}" apt-get clean + + mv "$1/partial-$arch" "$1/rootfs-$arch" + trap EXIT + trap SIGINT + trap SIGTERM + trap SIGHUP + echo "Download complete" + return 0 +} + +copy_ubuntu() +{ + cache=$1 + arch=$2 + rootfs=$3 + + # make a local copy of the miniubuntu + echo "Copying rootfs to $rootfs ..." + try_mksubvolume $rootfs + if which btrfs >/dev/null 2>&1 && is_btrfs_subvolume $cache/rootfs-$arch && is_btrfs_subvolume $rootfs; then + realrootfs=$(dirname $config)/rootfs + [ "$rootfs" = "$realrootfs" ] || umount $rootfs || return 1 + btrfs subvolume delete $realrootfs || return 1 + btrfs subvolume snapshot $cache/rootfs-$arch $realrootfs || return 1 + [ "$rootfs" = "$realrootfs" ] || mount --bind $realrootfs $rootfs || return 1 + else + rsync -Ha $cache/rootfs-$arch/ $rootfs/ || return 1 + fi + return 0 +} + +install_ubuntu() +{ + rootfs=$1 + release=$2 + flushcache=$3 + cache="$LOCALSTATEDIR/cache/lxc/eole" + mkdir -p $LOCALSTATEDIR/lock/subsys/ + + ( + flock -x 9 + if [ $? -ne 0 ]; then + echo "Cache repository is busy." + return 1 + fi + + + if [ $flushcache -eq 1 ]; then + echo "Flushing cache..." + try_rmsubvolume $cache/partial-$arch + try_rmsubvolume $cache/rootfs-$arch + fi + + echo "Checking cache download in $cache/rootfs-$arch ... " + if [ ! -e "$cache/rootfs-$arch" ]; then + download_ubuntu $cache $arch $release + if [ $? -ne 0 ]; then + echo "Failed to download 'ubuntu $release base'" + return 1 + fi + configure_eole $cache/rootfs-$arch + if [ $? -ne 0 ]; then + echo "failed to preinstall container" + exit 1 + fi + fi + + echo "Copy $cache/rootfs-$arch to $rootfs ... " + copy_ubuntu $cache $arch $rootfs + if [ $? -ne 0 ]; then + echo "Failed to copy rootfs" + return 1 + fi + + return 0 + + ) 9>$LOCALSTATEDIR/lock/subsys/lxc-ubuntu$release + + return $? +} + +copy_configuration() +{ + path=$1 + rootfs=$2 + name=$3 + arch=$4 + release=$5 + + if [ $arch = "i386" ]; then + arch="i686" + fi + + # if there is exactly one veth network entry, make sure it has an + # associated hwaddr. + nics=`grep -e '^lxc\.network\.type[ \t]*=[ \t]*veth' $path/config | wc -l` + if [ $nics -eq 1 ]; then + grep -q "^lxc.network.hwaddr" $path/config || sed -i -e "/^lxc\.network\.type[ \t]*=[ \t]*veth/a lxc.network.hwaddr = 00:16:3e:$(openssl rand -hex 3| sed 's/\(..\)/\1:/g; s/.$//')" $path/config + fi + + # Generate the configuration file + ## Relocate all the network config entries + sed -i -e "/lxc.network/{w ${path}/config-network" -e "d}" $path/config + + ## Relocate any other config entries + sed -i -e "/lxc./{w ${path}/config-auto" -e "d}" $path/config + + ## Add all the includes + echo "" >> $path/config + echo "# Common configuration" >> $path/config + if [ -e "${LXC_TEMPLATE_CONFIG}/ubuntu.common.conf" ]; then + echo "lxc.include = ${LXC_TEMPLATE_CONFIG}/ubuntu.common.conf" >> $path/config + fi + if [ -e "${LXC_TEMPLATE_CONFIG}/ubuntu.${release}.conf" ]; then + echo "lxc.include = ${LXC_TEMPLATE_CONFIG}/ubuntu.${release}.conf" >> $path/config + fi + + ## Add the container-specific config + echo "" >> $path/config + echo "# Container specific configuration" >> $path/config + [ -e "$path/config-auto" ] && cat $path/config-auto >> $path/config && rm $path/config-auto + grep -q "^lxc.rootfs" $path/config 2>/dev/null || echo "lxc.rootfs = $rootfs" >> $path/config + cat <<EOF >> $path/config +lxc.uts.name = $name +lxc.arch = $arch +EOF + + ## Re-add the previously removed network config + echo "" >> $path/config + echo "# Network configuration" >> $path/config + cat $path/config-network >> $path/config + rm $path/config-network + + if [ $? -ne 0 ]; then + echo "Failed to add configuration" + return 1 + fi + + return 0 +} + +post_process() +{ + rootfs=$1 + release=$2 + packages=$3 + + # Disable service startup + cat > $rootfs/usr/sbin/policy-rc.d << EOF +#!/bin/sh +exit 101 +EOF + chmod +x $rootfs/usr/sbin/policy-rc.d + + # If the container isn't running a native architecture, setup multiarch + if [ -x "$(ls -1 ${rootfs}/usr/bin/qemu-*-static 2>/dev/null)" ]; then + dpkg_version=$(chroot $rootfs dpkg-query -W -f='${Version}' dpkg) + if chroot $rootfs dpkg --compare-versions $dpkg_version ge "1.16.2"; then + chroot $rootfs dpkg --add-architecture ${hostarch} + else + mkdir -p ${rootfs}/etc/dpkg/dpkg.cfg.d + echo "foreign-architecture ${hostarch}" > ${rootfs}/etc/dpkg/dpkg.cfg.d/lxc-multiarch + fi + + # Save existing value of MIRROR and SECURITY_MIRROR + DEFAULT_MIRROR=$MIRROR + DEFAULT_SECURITY_MIRROR=$SECURITY_MIRROR + + # Write a new sources.list containing both native and multiarch entries + > ${rootfs}/etc/apt/sources.list + write_sourceslist $rootfs $arch "native" + + MIRROR=$DEFAULT_MIRROR + SECURITY_MIRROR=$DEFAULT_SECURITY_MIRROR + write_sourceslist $rootfs $hostarch "multiarch" + + # Finally update the lists and install upstart using the host architecture + HOST_PACKAGES="upstart:${hostarch} mountall:${hostarch} isc-dhcp-client:${hostarch}" + chroot $rootfs apt-get update + if chroot $rootfs dpkg -l iproute2 | grep -q ^ii; then + HOST_PACKAGES="$HOST_PACKAGES iproute2:${hostarch}" + else + HOST_PACKAGES="$HOST_PACKAGES iproute:${hostarch}" + fi + install_packages $rootfs $HOST_PACKAGES + fi + + # Install Packages in container + if [ -n "$packages" ] + then + local packages="`echo $packages | sed 's/,/ /g'`" + echo "Installing packages: ${packages}" + install_packages $rootfs $packages + fi + + # Set initial timezone as on host + if [ -f /etc/timezone ]; then + cat /etc/timezone > $rootfs/etc/timezone + chroot $rootfs dpkg-reconfigure -f noninteractive tzdata + elif [ -f /etc/sysconfig/clock ]; then + . /etc/sysconfig/clock + echo $ZONE > $rootfs/etc/timezone + chroot $rootfs dpkg-reconfigure -f noninteractive tzdata + else + echo "Timezone in container is not configured. Adjust it manually." + fi + + # rmdir /dev/shm for containers that have /run/shm + # I'm afraid of doing rm -rf $rootfs/dev/shm, in case it did + # get bind mounted to the host's /run/shm. So try to rmdir + # it, and in case that fails move it out of the way. + # NOTE: This can only be removed once 12.04 goes out of support + if [ ! -L $rootfs/dev/shm ] && [ -e $rootfs/dev/shm ]; then + rmdir $rootfs/dev/shm 2>/dev/null || mv $rootfs/dev/shm $rootfs/dev/shm.bak + ln -s /run/shm $rootfs/dev/shm + fi + + # Re-enable service startup + rm $rootfs/usr/sbin/policy-rc.d +} + +guess_mirror() +{ + release=$1 + SLIST=/etc/apt/sources.list + SLIST_LINE=$(grep -h -r -m 1 "^deb.*$release" ${SLIST}) + export MIRROR=$(echo -n $SLIST_LINE | sed -e 's,\(.*\)\(\w\w\w[file|http]:[^[:space:]]*\)\(.*\),\2,') + set +x + echo $SLIST + echo "-${SLIST_LINE}-" + echo "-${MIRROR}-" + set -x + if [ "$SLIST_LINE" = "$MIRROR" ]; then + echo "Impossible de retrouver le miroir dans le fichier $SLIST : $SLIST_LINE" + exit 1 + fi + if echo $MIRROR | grep -qE '^(cdrom|file):' + then + # mode CDROM, signed with EOLE key + TRUSTED="--keyring=$EOLE_GPG_KEYS" + INSTALL_CDROM=1 + fi +} + +do_bindhome() +{ + rootfs=$1 + user=$2 + + # copy /etc/passwd, /etc/shadow, and /etc/group entries into container + pwd=`getent passwd $user` || { echo "Failed to copy password entry for $user"; false; } + echo $pwd >> $rootfs/etc/passwd + + # make sure user's shell exists in the container + shell=`echo $pwd | cut -d: -f 7` + if [ ! -x $rootfs/$shell ]; then + echo "shell $shell for user $user was not found in the container." + pkg=`dpkg -S $(readlink -m $shell) | cut -d ':' -f1` + echo "Installing $pkg" + install_packages $rootfs $pkg + fi + + shad=`getent shadow $user` + echo "$shad" >> $rootfs/etc/shadow + + # bind-mount the user's path into the container's /home + h=`getent passwd $user | cut -d: -f 6` + mkdir -p $rootfs/$h + + # use relative path in container + h2=${h#/} + while [ ${h2:0:1} = "/" ]; do + h2=${h2#/} + done + echo "lxc.mount.entry = $h $h2 none bind 0 0" >> $path/config + + # Make sure the group exists in container + grp=`echo $pwd | cut -d: -f 4` # group number for $user + grpe=`getent group $grp` || return 0 # if host doesn't define grp, ignore in container + chroot $rootfs getent group "$grpe" || echo "$grpe" >> $rootfs/etc/group +} + +usage() +{ + cat <<EOF +$1 -h|--help [-a|--arch] [-b|--bindhome <user>] [-d|--debug] + [-F | --flush-cache] [-r|--release <release>] [-v|--variant] [ -S | --auth-key <keyfile>] + [--rootfs <rootfs>] [--packages <packages>] [-u|--user <user>] [--password <password>] + [--mirror <url>] [--security-mirror <url>] +release: the ubuntu release (e.g. precise): defaults to host release on ubuntu, otherwise uses latest LTS +variant: debootstrap variant to use (see debootstrap(8)) +bindhome: bind <user>'s home into the container + The ubuntu user will not be created, and <user> will have + sudo access. +arch: the container architecture (e.g. amd64): defaults to host arch +auth-key: SSH Public key file to inject into container +packages: list of packages to add comma separated +mirror,security-mirror: mirror for download and /etc/apt/sources.list +EOF + return 0 +} + +options=$(getopt -o a:b:hp:r:v:n:FS:du: -l arch:,bindhome:,help,path:,release:,variant:,name:,flush-cache,auth-key:,debug,rootfs:,packages:,user:,password:,mirror:,security-mirror: -- "$@") +if [ $? -ne 0 ]; then + usage $(basename $0) + exit 1 +fi +eval set -- "$options" + +release=precise # Default to the last Ubuntu LTS release for non-Ubuntu systems +if [ -f /etc/lsb-release ]; then + . /etc/lsb-release + if [ "$DISTRIB_ID" = "Ubuntu" ]; then + release=$DISTRIB_CODENAME + fi +fi + +bindhome= + +# Code taken from debootstrap +if [ -x /usr/bin/dpkg ] && /usr/bin/dpkg --print-architecture >/dev/null 2>&1; then + arch=`/usr/bin/dpkg --print-architecture` +elif which udpkg >/dev/null 2>&1 && udpkg --print-architecture >/dev/null 2>&1; then + arch=`/usr/bin/udpkg --print-architecture` +else + arch=$(uname -m) + if [ "$arch" = "i686" ]; then + arch="i386" + elif [ "$arch" = "x86_64" ]; then + arch="amd64" + elif [ "$arch" = "armv7l" ]; then + arch="armhf" + elif [ "$arch" = "aarch64" ]; then + arch="arm64" + elif [ "$arch" = "ppc64le" ]; then + arch="ppc64el" + fi +fi + +debug=0 +hostarch=$arch +flushcache=0 +packages="" +user="ubuntu" +password="ubuntu" + +while true +do + case "$1" in + -h|--help) usage $0 && exit 0;; + --rootfs) rootfs=$2; shift 2;; + -p|--path) path=$2; shift 2;; + -n|--name) name=$2; shift 2;; + -u|--user) user=$2; shift 2;; + --password) password=$2; shift 2;; + -F|--flush-cache) flushcache=1; shift 1;; + -r|--release) release=$2; shift 2;; + -v|--variant) variant=$2; shift 2;; + --packages) packages=$2; shift 2;; + -b|--bindhome) bindhome=$2; shift 2;; + -a|--arch) arch=$2; shift 2;; + -S|--auth-key) auth_key=$2; shift 2;; + -d|--debug) debug=1; shift 1;; + --mirror) MIRROR=$2; shift 2;; + --security-mirror) SECURITY_MIRROR=$2; shift 2;; + --) shift 1; break ;; + *) break ;; + esac +done + +if [ $debug -eq 1 ]; then + set -x +fi + +if [ -n "$bindhome" ]; then + pwd=`getent passwd $bindhome` + if [ $? -ne 0 ]; then + echo "Error: no password entry found for $bindhome" + exit 1 + fi +fi + + +if [ "$arch" = "i686" ]; then + arch=i386 +fi + +if [ $hostarch = "i386" -a $arch = "amd64" ]; then + echo "can't create $arch container on $hostarch" + exit 1 +fi + +if [ $hostarch = "armhf" -o $hostarch = "armel" -o $hostarch = "arm64" ] && \ + [ $arch != "armhf" -a $arch != "armel" -a $arch != "arm64" ]; then + echo "can't create $arch container on $hostarch" + exit 1 +fi + +if [ $arch = "arm64" ] && [ $hostarch != "arm64" ]; then + echo "can't create $arch container on $hostarch" + exit 1 +fi + +if [ $hostarch = "powerpc" -a $arch != "powerpc" ]; then + echo "can't create $arch container on $hostarch" + exit 1 +fi + +which debootstrap >/dev/null 2>&1 || { echo "'debootstrap' command is missing" >&2; false; } + +if [ -z "$path" ]; then + echo "'path' parameter is required" + exit 1 +fi + +if [ "$(id -u)" != "0" ]; then + echo "This script should be run as 'root'" + exit 1 +fi + +# detect rootfs +config="$path/config" +# if $rootfs exists here, it was passed in with --rootfs +if [ -z "$rootfs" ]; then + if grep -q '^lxc.rootfs' $config 2>/dev/null ; then + rootfs=$(awk -F= '/^lxc.rootfs =/{ print $2 }' $config) + else + rootfs=$path/rootfs + fi +fi + +if [ -z "${MIRROR}" ]; then + echo -n "Guessing http mirror... " + guess_mirror $release + echo "$MIRROR" +fi + +# Use proxy from APT if not defined +if [ -z "${http_proxy}" ] +then + HTTP_PROXY=apt +else + HTTP_PROXY="${http_proxy}" +fi + +# Disable prompts while installing packages +export DEBIAN_FRONTEND=noninteractive + +install_ubuntu $rootfs $release $flushcache $LXC_CACHE_PATH +if [ $? -ne 0 ]; then + echo "failed to install ubuntu $release" + exit 1 +fi + +configure_ubuntu $rootfs $name $release $user $password +if [ $? -ne 0 ]; then + echo "failed to configure ubuntu $release for a container" + exit 1 +fi + +copy_configuration $path $rootfs $name $arch $release +if [ $? -ne 0 ]; then + echo "failed write configuration file" + exit 1 +fi + +post_process $rootfs $release $trim_container $packages + +finalize_root + +echo "" +echo "##" +echo "# The default user is 'root' with password disabled!" +echo "##" +echo "" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..08022841e137bba44eafb09c8b7ffd0ade62b404 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/service.yml @@ -0,0 +1,58 @@ +format: '0.1' +name: eole-lxc-controller +version: |- + 2.7.1-20 +description: |- + Utilitaire pour la mise en place des conteneurs EOLE + Ce paquet fourni la base commune à tous les modules EOLE. + . + Ce paquet n’est destiné qu’au contrôleur LXC, appelé « serveur + maître » dans la documentation EOLE. +depends: + - eole-apt-cacher-ng + - eole-server +packages: + - lxc1 + - lxc-templates + - debootstrap + - cgroup-lite + - eole-ssmtp-pkg +dictionaries: + - 01_container.xml +extra_dictionaries: {} +templates: + - 90-lxc_rules + - dnsmasq-lxc + - lxc-net.default + - lxc.conf + - lxc.config + - lxc.devices.hook + - lxc.fstab + - lxc.hosts + - lxc.interfaces + - lxc.override + - sshd_config.lxc +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: [] +files: + /etc/apparmor.d/lxc/lxc-default-with-cdrom: + owner: root + group: root + mode: '0644' + /usr/sbin/gen_conteneurs: + owner: root + group: root + mode: '0755' + /usr/sbin/lxc-status: + owner: root + group: root + mode: '0755' + /usr/share/lxc/templates/lxc-eole: + owner: root + group: root + mode: '0755' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/templates/90-lxc_rules b/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/templates/90-lxc_rules new file mode 100644 index 0000000000000000000000000000000000000000..00b4cb0383b00622196093ec30f86b53b29a77e2 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/templates/90-lxc_rules @@ -0,0 +1,21 @@ +%if not %%is_defined('type_amon') +#!/bin/bash +%end if +# Accept from containers to LXC controller +/sbin/iptables -A INPUT -i br0 -s %%adresse_network_br0/%%adresse_netmask_br0 -j ACCEPT + +# Accept from LXC controller to containers +/sbin/iptables -A OUTPUT -o br0 -d %%adresse_network_br0/%%adresse_netmask_br0 -j ACCEPT + +# Accept from containers to containers +/sbin/iptables -A FORWARD -i br0 -o br0 -s %%adresse_network_br0/%%adresse_netmask_br0 -d %%adresse_network_br0/%%adresse_netmask_br0 -j ACCEPT + +# Accept from containers to outside +/sbin/iptables -A FORWARD -i br0 -j ACCEPT + +# Accept ESTABLISHED from outside to containers +# Required in forteress mode +/sbin/iptables -A FORWARD -o br0 -m state --state ESTABLISHED,RELATED -j ACCEPT + +# MASQUERADE containers getting outside +/sbin/iptables -t nat -A POSTROUTING -s %%adresse_network_br0/%%adresse_netmask_br0 ! -o br0 -j MASQUERADE diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/templates/dnsmasq-lxc b/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/templates/dnsmasq-lxc new file mode 100644 index 0000000000000000000000000000000000000000..f91fa7f66e47d47efd6acb8db73a2fa2ac290edf --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/templates/dnsmasq-lxc @@ -0,0 +1,5 @@ +# Tell any system-wide dnsmasq instance to make sure to bind to interfaces +# instead of listening on 0.0.0.0 +# WARNING: changes to this file will get lost if lxc is removed. +bind-interfaces +except-interface=br0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/templates/lxc-net.default b/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/templates/lxc-net.default new file mode 100644 index 0000000000000000000000000000000000000000..5a6745c1126f49769438d59bbef1b956b7fff49c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/templates/lxc-net.default @@ -0,0 +1,30 @@ +# This file is auto-generated by lxc.postinst if it does not +# exist. Customizations will not be overridden. +# Leave USE_LXC_BRIDGE as "true" if you want to use br0 for your +# containers. Set to "false" if you'll use virbr0 or another existing +# bridge, or mavlan to your host's NIC. +USE_LXC_BRIDGE="true" + +# If you change the LXC_BRIDGE to something other than lxcbr0, then +# you will also need to update your /etc/lxc/lxc.conf as well as the +# configuration (/var/lib/lxc/<container>/config) for any containers +# already created using the default config to reflect the new bridge +# name. +# If you have the dnsmasq daemon installed, you'll also have to update +# /etc/dnsmasq.d/lxc and restart the system wide dnsmasq daemon. +LXC_BRIDGE="br0" +LXC_ADDR="%%adresse_ip_br0" +LXC_NETMASK="%%adresse_netmask_br0" +LXC_NETWORK="%%adresse_network_br0/%%calc_classe(%%adresse_netmask_br0)" +LXC_DHCP_RANGE="%%{adresse_ip_br0}98,%%{adresse_ip_br0}99" +# LXC_DHCP_MAX="253" +# Uncomment the next line if you'd like to use a conf-file for the br0 +# dnsmasq. For instance, you can use 'dhcp-host=mail1,10.0.3.100' to have +# container 'mail1' always get ip address 10.0.3.100. +#LXC_DHCP_CONFILE=/etc/lxc/dnsmasq.conf + +# Uncomment the next line if you want br0's dnsmasq to resolve the .lxc +# domain. You can then add "server=/lxc/10.0.3.1' (or your actual ) +# to /etc/dnsmasq.conf, after which 'container1.lxc' will resolve on your +# host. +#LXC_DOMAIN="lxc" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/templates/lxc.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/templates/lxc.conf new file mode 100644 index 0000000000000000000000000000000000000000..a8a564eda61e45fdff1f387563438fc1e273e1f0 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/templates/lxc.conf @@ -0,0 +1,4 @@ +lxc.net.0.type=veth +lxc.net.0.link=br0 +lxc.net.0.flags=up +lxc.net.0.hwaddr = 00:16:3e:xx:xx:xx diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/templates/lxc.config b/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/templates/lxc.config new file mode 100644 index 0000000000000000000000000000000000000000..5faf67e707e2aff7925f38bf040b9f1d8b631623 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/templates/lxc.config @@ -0,0 +1,69 @@ +# Template used to create this container: /usr/share/lxc/templates/lxc-eole +# Parameters passed to the template: +# For additional config options, please look at lxc.container.conf(5) +%set %%nettype = {'bridge':'veth', 'macvlan':'macvlan'} +%set %%name = %%current_container.name +%set %%base = %%os.path.dirname(%%current_container.path) + +# Common configuration +lxc.include = /usr/share/lxc/config/ubuntu.common.conf + +# Enable mounting iso9660 FS in containers +%if %%name == 'ltspserver' +lxc.apparmor.profile = lxc-container-for-eclair +%else +lxc.apparmor.profile = lxc-container-default-with-cdrom +%end if + +# Container specific configuration +lxc.uts.name = mail +lxc.arch = amd64 +lxc.rootfs.path = %%current_container.path +lxc.mount.fstab = %%base/fstab + +# Automatic start at bootup +lxc.start.auto = 1 +# lxc.group = ? +# lxc.start.order = ? + +# Network configuration +# +%for %%idx, %%interface in %%enumerate(%%current_container.interfaces) +%if 'ip' not in %%interface or %%interface.ip is None + %continue +%end if +# %%interface.name on %%interface.linkto +%if %%interface.linkto == 'br0' +%set %%link = 'br0' +%else +%set %%link = %%getVar("nom_zone_" + %%interface.linkto) +%end if +lxc.net.%%{idx}.type = %%nettype[%%interface.method] +lxc.net.%%{idx}.link = %%link +lxc.net.%%{idx}.flags = up +lxc.net.%%{idx}.name = %%interface.name +lxc.net.%%{idx}.mtu = 1500 +%if %%interface.method == 'bridge' +lxc.net.%%{idx}.veth.pair = %%{current_container.name}_%%link.lstrip('br') +%elif %%interface.method == 'macvlan' +lxc.net.%%{idx}.macvlan.mode = bridge +%end if +µµµµµµµµµµ Generate MAC address from MD5 of static informations +%set %%md5 = %%hashlib.md5(%%current_container.name + %%interface.linkto + %%interface.ip).hexdigest() +lxc.net.%%{idx}.hwaddr = 00:16:3e:%%md5[0:2]:%%md5[2:4]:%%md5[4:6] +%end for + +lxc.hook.autodev = %%base/devices.hook +%if 'disknods' in %%current_container and %%len(%%current_container.disknods) > 0 +# +## Extra devices of %%current_container.name +# + %for %%dev in %%current_container.disknods +# %%dev.name +lxc.cgroup.devices.%%dev.permission = %%dev.type %%dev.major:%%dev.minor %%dev.mode + %end for +%end if +%for %%dev in %%cdrom_devices +# cdrom %%dev +lxc.cgroup.devices.allow = b %%dev.cdrom_major:%%dev.cdrom_minor rm +%end for diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/templates/lxc.devices.hook b/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/templates/lxc.devices.hook new file mode 100644 index 0000000000000000000000000000000000000000..b992c6b84c444edf9894f5a377de825b6fada831 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/templates/lxc.devices.hook @@ -0,0 +1,23 @@ +#!/bin/bash + +%for %%dev in %%cdrom_devices +# cdrom %%dev +mknod ${LXC_ROOTFS_MOUNT}%%dev b %%dev.cdrom_major %%dev.cdrom_minor +chmod 664 ${LXC_ROOTFS_MOUNT}%%dev +chgrp cdrom ${LXC_ROOTFS_MOUNT}%%dev +%end for + +%if 'disknods' in %%current_container and %%len(%%current_container.disknods) > 0 +# +## Extra devices of %%current_container.name +# + %for %%dev in %%current_container.disknods +# %%dev.name +%set %%device = %%get_mount_point_device(%%dev.name) +mkdir -p $(dirname ${LXC_ROOTFS_MOUNT}%%device.name) +mknod ${LXC_ROOTFS_MOUNT}%%device.name %%dev.type %%dev.major %%dev.minor +chmod %%device.mode ${LXC_ROOTFS_MOUNT}%%device.name +chown %%device.uid:%%device.gid ${LXC_ROOTFS_MOUNT}%%device.name + %end for +%end if + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/templates/lxc.fstab b/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/templates/lxc.fstab new file mode 100644 index 0000000000000000000000000000000000000000..375ea1456952b994428fb61271eef4b32cd5ebf6 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/templates/lxc.fstab @@ -0,0 +1,22 @@ +# <file system> <mount point> <type> <options> <dump> <pass> +%if 'fstabs' in %%current_container and %%len(%%current_container.fstabs) > 0 +# +## Mount points of %%current_container.name +# + %for %%fstab in %%current_container.fstabs + %if 'options' not in %%fstab or %%len(%%fstab.options) == 0 + %set %%fstab['options'] = 'defaults' + %end if + %if 'checks' not in %%fstab or %%len(%%fstab.checks) == 0 + %set %%fstab['checks'] = '0 0' + %end if + %if 'mount_point' not in %%fstab or %%len(%%fstab.mount_point) == 0 + %set %%fstab['mount_point'] = %%fstab['name'] + %end if + %if %%fstab.type == 'bind' +%%os.path.normpath(%%fstab.name) %%os.path.normpath(%%concat_path(%%current_container.path, %%fstab.mount_point)) none bind,%%fstab.options %%fstab.checks + %else +%%os.path.normpath(%%fstab.name) %%os.path.normpath(%%fstab.mount_point) %%fstab.fstype %%fstab.options %%fstab.checks + %end if + %end for +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/templates/lxc.hosts b/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/templates/lxc.hosts new file mode 100644 index 0000000000000000000000000000000000000000..3fd1594f0b13b3e2c3f3ddd767d72119d42922de --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/templates/lxc.hosts @@ -0,0 +1,22 @@ +# Autogenerated by EOLE / Autogénéré par EOLE +# Do not modify manually / Ne pas modifier manuellement + +127.0.0.1 localhost.localdomain localhost +127.0.1.1 %%current_container[u'name'].%%nom_domaine_local %%current_container[u'name'] + +# The following lines are desirable for IPv6 capable hosts +::1 ip6-localhost ip6-loopback +fe00::0 ip6-localnet +ff00::0 ip6-mcastprefix +ff02::1 ip6-allnodes +ff02::2 ip6-allrouters + +%for %%host in %%get_etc_hosts(%%current_container, %%nom_domaine_local): + %if %%is_ip(%%host[u'fqdn']): + %continue + %end if + %if %%host.get(u'comment', None) is not None: +%%host[u'comment'] + %end if +%%host[u'ip'] %%host[u'fqdn'] +%end for diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/templates/lxc.interfaces b/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/templates/lxc.interfaces new file mode 100644 index 0000000000000000000000000000000000000000..e2d2c19f758b23b8cfc0a761daa465c04705d69a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/templates/lxc.interfaces @@ -0,0 +1,21 @@ +# This file describes the network interfaces available on your system +# and how to activate them. For more information, see interfaces(5). + +# The loopback network interface +auto lo +iface lo inet loopback + +%for %%interface in %%current_container.interfaces +%if 'ip' not in %%interface or %%interface.ip is None + %continue +%end if +auto %%interface.name +iface %%interface.name inet static + address %%interface.ip + netmask %%interface.mask + broadcast %%interface.bcast + %if %%interface.name == %%current_container.gateway.interface + gateway %%current_container.gateway.ip + %end if + +%end for diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/templates/lxc.override b/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/templates/lxc.override new file mode 100644 index 0000000000000000000000000000000000000000..e75aa8c50ff2abfac5ae9ce0e75f1542e34e67cd --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/templates/lxc.override @@ -0,0 +1 @@ +start on runlevel [2345] and started cgmanager diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/templates/sshd_config.lxc b/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/templates/sshd_config.lxc new file mode 100644 index 0000000000000000000000000000000000000000..a911a8325206f7b75cace5b3cfdc7b2c93ba1685 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-lxc-controller/templates/sshd_config.lxc @@ -0,0 +1,112 @@ +############################################################## +# sshd_config : fichier de configuration du service ssh +# Pour EOLE +#samuel morin <samuel.morin@ac-dijon.fr> +############################################################## +#OpenBSD: sshd_config + +# This is the sshd server system-wide configuration file. See +# sshd_config(5) for more information. + +# This sshd was compiled with PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin + +# The strategy used for options in the default sshd_config shipped with +# OpenSSH is to specify options with their default value where +# possible, but leave them commented. Uncommented options change a +# default value. + +Port 22 +Protocol 2 +#Evite les erreurs "WARNING: Not loading blacklisted module ipv6" +AddressFamily inet + +#ListenAddress + +#ListenAddress :: + +# HostKey for protocol version 1 +#HostKey /etc/ssh/ssh_host_key +# HostKeys for protocol version 2 +HostKey /etc/ssh/ssh_host_rsa_key +HostKey /etc/ssh/ssh_host_dsa_key + +# Lifetime and size of ephemeral version 1 server key +KeyRegenerationInterval 3600 +ServerKeyBits 2048 + +# Logging +#obsoletes QuietMode and FascistLogging +SyslogFacility AUTH +LogLevel INFO + +# Authentication: + +LoginGraceTime 600 + +StrictModes yes + +RSAAuthentication yes +PubkeyAuthentication yes +AuthorizedKeysFile %h/.ssh/authorized_keys + +# rhosts authentication should not be used +#RhostsAuthentication no +# Don't read the user's ~/.rhosts and ~/.shosts files +IgnoreRhosts yes +# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts +RhostsRSAAuthentication no +# similar for protocol version 2 +HostbasedAuthentication no +# Change to yes if you don't trust ~/.ssh/known_hosts for +# RhostsRSAAuthentication and HostbasedAuthentication +#IgnoreUserKnownHosts yes +AllowUsers root +PermitRootLogin yes +#PermitRootLogin no + +# To disable tunneled clear text passwords, change to no here! +PasswordAuthentication no +PermitEmptyPasswords no + +# Change to no to disable s/key passwords +ChallengeResponseAuthentication no + +# Kerberos options +#KerberosAuthentication no +#KerberosOrLocalPasswd yes +#KerberosTicketCleanup yes + +#AFSTokenPassing no + +# Kerberos TGT Passing only works with the AFS kaserver +#KerberosTgtPassing no + +# Set this to 'yes' to enable PAM keyboard-interactive authentication +# Warning: enabling this may bypass the setting of 'PasswordAuthentication' +#PAMAuthenticationViaKbdInt yes + +X11Forwarding yes +X11DisplayOffset 10 +#X11UseLocalhost yes +PrintMotd no +#PrintLastLog yes +TCPKeepAlive yes +#UseLogin no +UsePrivilegeSeparation yes +#Compression yes + +#MaxStartups 10 +# no default banner path +#Banner /some/path +#VerifyReverseMapping no + +#Suppress DNS verification +UseDNS no + +# Allow client to pass locale environment variables +AcceptEnv LANG LANGUAGE LC_* EDITOR + +UsePAM yes +# override default of no subsystems +Subsystem sftp /usr/lib/sftp-server + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-mode-zephir/dictionaries/29_mode_zephir.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-mode-zephir/dictionaries/29_mode_zephir.xml new file mode 100644 index 0000000000000000000000000000000000000000..4163d1b441cfbf3d1d635a00173aba76167fbc06 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-mode-zephir/dictionaries/29_mode_zephir.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + <files/> + <variables> + <family name='general'> + <variable name='mode_zephir' type='oui/non' hidden='True'> + <value>oui</value> + </variable> + </family> + <separators/> + </variables> + <constraints/> + <help/> +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-mode-zephir/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-mode-zephir/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..028762b3a743b4a481f1a6992e28d14b5ca1df73 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-mode-zephir/service.yml @@ -0,0 +1,25 @@ +format: '0.1' +name: eole-mode-zephir +version: |- + 2.7.1-20 +description: |- + Enable the Zephir mode + This package enable the Zephir mode by providing a dedicated EOLE + XML schema file. + . + This package is only used by the “dl-schemas†tool in “zephir-parc†+ to update the EOLE XML schema files for the Zephir module. +depends: [] +packages: [] +dictionaries: + - 29_mode_zephir.xml +extra_dictionaries: {} +templates: [] +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: [] +files: {} +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-mysql/dictionaries/00_eole-mysql_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-mysql/dictionaries/00_eole-mysql_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..a451dfc1ced29e2434655c3448ce11ec844d47b3 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-mysql/dictionaries/00_eole-mysql_packages.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>python-eolesql</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-mysql/dictionaries/22_mysql.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-mysql/dictionaries/22_mysql.xml new file mode 100644 index 0000000000000000000000000000000000000000..b181ddc0b5abcc368f0312e49ef65cf7da61552d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-mysql/dictionaries/22_mysql.xml @@ -0,0 +1,92 @@ +<?xml version='1.0' encoding='utf-8'?> + +<creole> + + <files> + <file name='/etc/bareos/bareosfichiers.d/mysql.conf' source='bareos-mysql.conf' filelist='mysql-bareos'/> + <file name='/etc/rsyslog.d/eole-traps/debian-start.conf' source='rsyslog_traps_debian-start.conf' mkdir="True"/> + <file name='/etc/logrotate.d/mysql' source='mysql.logrotate'/> + <file name='/etc/apparmor.d/local/usr.sbin.mysqld' source="mysqld.apparmor.conf"/> + </files> + + <containers> + <container name="mysql" id='14'> + <package>eole-mysql-pkg</package> + <service servicelist='mysql'>mysql</service> + <file filelist='mysql' name='/etc/mysql/mysql.conf.d/mysqld.cnf'/> + <file filelist='mysql' name='/etc/mysql/conf.d/mysql_mode.cnf'/> + + <service_access service='mysql'> + <port service_accesslist='myPort'>3306</port> + <tcpwrapper service_accesslist='myPort'>mysqld</tcpwrapper> + </service_access> + <service_restriction service='mysql'> + <ip interface='if_my_dist' interface_type="SymLinkOption" netmask='mask_my_dist' netmask_type='SymLinkOption' ip_type='SymLinkOption'>ip_my_dist</ip> + </service_restriction> + </container> + </containers> + + <variables> + <family name='services'> + <variable name='activer_mysql' type='oui/non' description="Activer le serveur de bases de données MySQL" > + <value>oui</value> + </variable> + </family> + <family name='mysql' mode='expert' icon='mysql-alt'> + <variable name='mysql_max_connexions' type='number' description='Nombre maximum de connexions simultanées'> + <value>200</value> + </variable> + <variable name='mysql_open_firewall' type='oui/non' description="Permettre l'accès au serveur depuis l'extérieur"> + <value>non</value> + </variable> + <variable name='ip_my_dist' type='network' description="Adresse IP réseau autorisée pour les connexions distantes au serveur MYSQL" multi='True' mandatory='True'/> + <variable name='mask_my_dist' type='netmask' description="Masque du sous réseau pour les connexions distantes au serveur MySQL" mandatory='True'/> + <variable name='if_my_dist' type='string' description="Interface pour les connexions distantes au serveur MySQL" mandatory='True'> + <value>auto</value> + </variable> + </family> + <separators> + <separator name='mysql_max_connexions'>Configuration</separator> + <!--<separator name='ip_my_dist'>Sécurité</separator>--> + </separators> + </variables> + + <constraints> + <condition name='disabled_if_in' source='activer_mysql'> + <param>non</param> + <target type='filelist'>mysql</target> + <target type='filelist'>mysql-bareos</target> + <target type='servicelist'>mysql</target> + <target type='family'>mysql</target> + </condition> + <condition name='disabled_if_in' source='mysql_open_firewall'> + <param>non</param> + <target type='service_accesslist'>myPort</target> + <target type='variable'>ip_my_dist</target> + <target type='variable'>mask_my_dist</target> + <target type='variable'>if_my_dist</target> + </condition> + <condition name='disabled_if_in' source='activer_bareos_dir' fallback='True'> + <param>non</param> + <target type='filelist'>mysql-bareos</target> + </condition> + <check name="valid_networknetmask" target="mask_my_dist" level="warning"> + <param type='eole'>ip_my_dist</param> + </check> + <check name='valid_enum' target='if_my_dist'> + <param>['auto', 'all', 'eth0', 'eth1', 'eth2', 'eth3', 'eth4']</param> + </check> + <group master='ip_my_dist'> + <slave>mask_my_dist</slave> + <slave>if_my_dist</slave> + </group> + </constraints> + + <help> + <variable name='activer_mysql'>MySQL est un serveur de bases de données relationnelles SQL</variable> + <family name='mysql'>Paramétrage avancé du serveur de gestion de bases de données MySQL</family> + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-mysql/extra_dictionaries/schedule/01_mysql.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-mysql/extra_dictionaries/schedule/01_mysql.xml new file mode 100644 index 0000000000000000000000000000000000000000..02675e260e65ffc3fc938b040330ec0e9f68fb59 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-mysql/extra_dictionaries/schedule/01_mysql.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + <variables> + <family name="mysql" description="Exportation des bases de données MySQL"> + <variable name="description" type="string" hidden="True"><value>Exportation des bases MySQL</value></variable> + <variable name="day" type="schedule" description="Périodicité d'exécution"></variable> + <variable name="mode" type="schedulemod" hidden="True"><value>pre</value></variable> + </family> + </variables> + <constraints> + <fill name='calc_multi_condition' target='schedule.mysql.day'> + <param>non</param> + <param type='eole' name='condition_1'>activer_mysql</param> + <param name='match'>none</param> + <param name='mismatch'>daily</param> + </fill> + </constraints> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-mysql/files/etc/logrotate.d/eolesql b/seed/release/eole-2.7/2.7.1/applicationservice/eole-mysql/files/etc/logrotate.d/eolesql new file mode 100644 index 0000000000000000000000000000000000000000..41a45c1c088d246ca651c4ee07f7fe43a0e6ec86 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-mysql/files/etc/logrotate.d/eolesql @@ -0,0 +1,7 @@ +/var/log/databases.log { + rotate 10 + missingok + notifempty + weekly + compress +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-mysql/files/usr/share/eole/bareos/restore/mysql.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-mysql/files/usr/share/eole/bareos/restore/mysql.py new file mode 100644 index 0000000000000000000000000000000000000000..c3486e4ac4a95b43588259dfa055ef74d81b8ec7 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-mysql/files/usr/share/eole/bareos/restore/mysql.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +"""Module mysql""" +from os.path import join +from shutil import copyfile +from eolesql.db_cmd import dump_sql_file2 +from glob import glob +from pyeole.bareosrestore import exit_if_running_jobs, bareos_mark_path, \ + bareos_restore +from creole.client import CreoleClient + +mysqlsavdir = '/home/backup/sql/' +container_path_mysql = CreoleClient().get_creole('container_path_mysql') +debian_cnf = '/etc/mysql/debian.cnf' +debian_cnf_bak = '/etc/mysql/debian.cnf.bak' + +def execute(option, opt_str, value, parser, jobid, test_jobs=True): + """ldap helper""" + if len(parser.rargs) > 0: + option = parser.rargs[0] + if option == 'pre': + pre() + elif option == 'post': + post() + else: + if test_jobs: + exit_if_running_jobs() + job(jobid) + +def pre(): + print "pre mysql" + +def post(): + print "post mysql" + mysql_bdd = join(mysqlsavdir, 'mysql.sql') + for files in glob("{0}/*.sql".format(mysqlsavdir)): + if files == mysql_bdd: + continue + print "restauration de {0}".format(files) + dump_sql_file2(files, default_file=debian_cnf_bak) + # bdd mysql restaurée en dernier + print "restauration de {0}".format(mysql_bdd) + dump_sql_file2(mysql_bdd, default_file=debian_cnf_bak) + +def job(jobid): + print "Restauration mysql" + # sauvegarde de l'actuel fichier debian.cnf + copyfile(container_path_mysql+debian_cnf, container_path_mysql+debian_cnf_bak) + # marquage du fichier debian.cnf + marked_paths = bareos_mark_path(container_path_mysql + debian_cnf) + # marquage du dossier sql + marked_paths += bareos_mark_path(mysqlsavdir) + # restauration des fichiers marqués + bareos_restore(jobid, selection=marked_paths) + +priority = 30 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-mysql/files/usr/share/eole/diagnose/61-mysql b/seed/release/eole-2.7/2.7.1/applicationservice/eole-mysql/files/usr/share/eole/diagnose/61-mysql new file mode 100644 index 0000000000000000000000000000000000000000..bbe0630ab8fa4859942748d51a4119f1ee4ad8b2 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-mysql/files/usr/share/eole/diagnose/61-mysql @@ -0,0 +1,10 @@ +#!/bin/bash + +if [ $(CreoleGet activer_mysql) = 'oui' ];then + . /usr/lib/eole/diagnose.sh + EchoGras "*** Bases de données" + TestService MySQL $(CreoleGet container_ip_mysql):3306 + echo +fi + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-mysql/files/usr/share/eole/schedule/scripts/mysql b/seed/release/eole-2.7/2.7.1/applicationservice/eole-mysql/files/usr/share/eole/schedule/scripts/mysql new file mode 100644 index 0000000000000000000000000000000000000000..21ade4e95d30229858b40a596b9b18f471016f2e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-mysql/files/usr/share/eole/schedule/scripts/mysql @@ -0,0 +1,26 @@ +#!/bin/bash + +set -e + +DESC="Exportation des bases MySQL" + +. /usr/share/eole/schedule/config.sh + +MYSQLSAVDIR=$SAVDIR/sql + +rm -f $MYSQLSAVDIR/*.sql +mkdir -p $MYSQLSAVDIR + +CMD="mysql --defaults-file=/etc/mysql/debian.cnf -e 'show databases' | grep -v '^Database$'" +DATABASES=$(CreoleRun "$CMD" mysql) +for databasename in $DATABASES; do + case "$databasename" in + information_schema|performance_schema|bareos) + continue + ;; + *) + CMD="mysqldump --defaults-file=/etc/mysql/debian.cnf --databases $databasename --flush-privileges --create-options --quote-names --complete-insert --single-transaction" + CreoleRun "$CMD" mysql > $MYSQLSAVDIR/$databasename.sql + ;; + esac +done diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-mysql/files/usr/share/zephir/monitor/configs/services/22_mysql.srv b/seed/release/eole-2.7/2.7.1/applicationservice/eole-mysql/files/usr/share/zephir/monitor/configs/services/22_mysql.srv new file mode 100644 index 0000000000000000000000000000000000000000..27d47872b679a0736f4cda12536587711f609978 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-mysql/files/usr/share/zephir/monitor/configs/services/22_mysql.srv @@ -0,0 +1,13 @@ +# -*- coding: UTF-8 -*- +""" +Surveillance du service Mysql +""" + +from zephir.monitor.agents.services import TCPServices +from zephir.monitor.agentmanager.config import ACTIVER_MYSQL, ADRESSE_IP_MYSQL + +if ACTIVER_MYSQL: + test = '%s:3306' % ADRESSE_IP_MYSQL + data = {test : "Bases de données (MySQL)"} + AGENTS.append(TCPServices('mysql', data, period=115, + description="Etat du serveur de bases de bases de données (MySQL)")) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-mysql/postservices/00-mysql-native-password b/seed/release/eole-2.7/2.7.1/applicationservice/eole-mysql/postservices/00-mysql-native-password new file mode 100644 index 0000000000000000000000000000000000000000..521fd516d3c058f8c4713414febf946d562b94cb --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-mysql/postservices/00-mysql-native-password @@ -0,0 +1,11 @@ +#!/bin/bash + +plugin=$(mysql --skip-column-names --batch -e 'use mysql;select plugin from user where user="root" and plugin="auth_socket";' 2>/dev/null) +[ $? -ne 0 ] && exit 0 + +if [ "${plugin##plugin}" = "auth_socket" ];then + echo "Modification du plugin d'authentification pour l'utilisateur root"; + mysql -e 'use mysql;update user set plugin="mysql_native_password" where user="root";flush privileges;' +fi + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-mysql/posttemplates/00-mysql b/seed/release/eole-2.7/2.7.1/applicationservice/eole-mysql/posttemplates/00-mysql new file mode 100644 index 0000000000000000000000000000000000000000..8fc609d9fc679c0e12dc08ed69ad7dc0e535e69a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-mysql/posttemplates/00-mysql @@ -0,0 +1,15 @@ +#!/bin/bash + +[ $(CreoleGet activer_mysql) = "non" ] && exit 0 + +# Génération des bases de données +/usr/share/eole/sbin/gen_databases.py +echo + +# Mise à jour des bases de données +/usr/share/eole/sbin/update_databases.py +# On remet le service dans son état d'origine (#5815) +CreoleService -c mysql mysql stop +echo + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-mysql/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-mysql/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..891c167562c5ddfac5ce52165788eb0ab8a857a6 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-mysql/service.yml @@ -0,0 +1,55 @@ +format: '0.1' +name: eole-mysql +version: |- + 2.7.0-6 +description: |- + Templates et dictionnaires pour le service MySQL + Configuration du serveur MySQL + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: [] +packages: + - python-eolesql +dictionaries: + - 22_mysql.xml +extra_dictionaries: + schedule: + - 01_mysql.xml +templates: + - bareos-mysql.conf + - mysql.logrotate + - mysql_mode.cnf + - mysqld.apparmor.conf + - mysqld.cnf + - rsyslog_traps_debian-start.conf +creole_funcs: [] +preservices: [] +postservices: + - 00-mysql-native-password +pretemplates: [] +posttemplates: + - 00-mysql +files: + /etc/logrotate.d/eolesql: + owner: root + group: root + mode: '0644' + /usr/share/eole/bareos/restore/mysql.py: + owner: root + group: root + mode: '0644' + /usr/share/eole/diagnose/61-mysql: + owner: root + group: root + mode: '0755' + /usr/share/eole/schedule/scripts/mysql: + owner: root + group: root + mode: '0755' + /usr/share/zephir/monitor/configs/services/22_mysql.srv: + owner: root + group: root + mode: '0644' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-mysql/templates/bareos-mysql.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-mysql/templates/bareos-mysql.conf new file mode 100644 index 0000000000000000000000000000000000000000..21e7f1032af6fa6e4ff2414164621da313abc3f7 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-mysql/templates/bareos-mysql.conf @@ -0,0 +1,9 @@ +Include { + Options { + aclsupport = no + signature = md5 + @/etc/bareos/include-options.conf + } + File = %%container_path_mysql/etc/mysql/debian.cnf +} + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-mysql/templates/mysql.logrotate b/seed/release/eole-2.7/2.7.1/applicationservice/eole-mysql/templates/mysql.logrotate new file mode 100644 index 0000000000000000000000000000000000000000..2c01e6b3fea20f32482587ffd3621f07b48eb4ed --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-mysql/templates/mysql.logrotate @@ -0,0 +1,8 @@ +missingok +notifempty +compress + +/var/log/rsyslog/local/mysql/*.log { + rotate 15 + weekly +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-mysql/templates/mysql_mode.cnf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-mysql/templates/mysql_mode.cnf new file mode 100644 index 0000000000000000000000000000000000000000..0baf2b2e5ea3972ad36ac485cd367b539061850a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-mysql/templates/mysql_mode.cnf @@ -0,0 +1,2 @@ +[mysqld] +sql_mode = "ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-mysql/templates/mysqld.apparmor.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-mysql/templates/mysqld.apparmor.conf new file mode 100644 index 0000000000000000000000000000000000000000..0a5d0e2df51ddaff40bc4495ee19720c806f181e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-mysql/templates/mysqld.apparmor.conf @@ -0,0 +1,9 @@ +# Site-specific additions and overrides for usr.bin.mysqld. +# For more details, please see /etc/apparmor.d/local/README. +%if %%getVar('activer_client_ldap', False) + /etc/ldap/ldap.conf r, +%end if +%if %%is_defined('horus_frontend') + /home/workgroups/minedu/windata/mysql/ r, + /home/workgroups/minedu/windata/mysql/** rwk, +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-mysql/templates/mysqld.cnf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-mysql/templates/mysqld.cnf new file mode 100644 index 0000000000000000000000000000000000000000..6c7e8b72dba4165ea23eea59785f578dd33de94b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-mysql/templates/mysqld.cnf @@ -0,0 +1,125 @@ +# +# The MySQL database server configuration file. +# +# You can copy this to one of: +# - "/etc/mysql/my.cnf" to set global options, +# - "~/.my.cnf" to set user-specific options. +# +# One can use all long options that the program supports. +# Run program with --help to get a list of available options and with +# --print-defaults to see which it would actually understand and use. +# +# For explanations see +# http://dev.mysql.com/doc/mysql/en/server-system-variables.html + +# This will be passed to all mysql clients +# It has been reported that passwords should be enclosed with ticks/quotes +# escpecially if they contain "#" chars... +# Remember to edit /etc/mysql/debian.cnf when changing the socket location. + +# Here is entries for some specific programs +# The following values assume you have at least 32M ram + +[mysqld_safe] +socket = /var/run/mysqld/mysqld.sock +nice = 0 + +[mysqld] +# +# * Basic Settings +# +user = mysql +pid-file = /var/run/mysqld/mysqld.pid +socket = /var/run/mysqld/mysqld.sock +port = 3306 +basedir = /usr +datadir = /var/lib/mysql +tmpdir = /tmp +lc-messages-dir = /usr/share/mysql +skip-external-locking +# +# Instead of skip-networking the default is now to listen only on +# localhost which is more compatible and is not less secure. +bind-address = 0.0.0.0 +#Pas de resolution DNS +skip-name-resolve +# +# * Fine Tuning +# +key_buffer_size = 16M +max_allowed_packet = 16M +thread_stack = 192K +thread_cache_size = 8 +# This replaces the startup script and checks MyISAM tables if needed +# the first time they are touched +myisam-recover-options = BACKUP +max_connections = %%mysql_max_connexions +#table_cache = 64 +#thread_concurrency = 10 +# +# * Query Cache Configuration +# +query_cache_limit = 1M +query_cache_size = 16M +# +# * Logging and Replication +# +# Both location gets rotated by the cronjob. +# Be aware that this log type is a performance killer. +# As of 5.1 you can enable the log at runtime! +#general_log_file = /var/log/mysql/mysql.log +#general_log = 1 +# +# Error log - should be very few entries. +# +log_error = /var/log/mysql/error.log +# +# Here you can see queries with especially long duration +#log_slow_queries = /var/log/mysql/mysql-slow.log +#long_query_time = 2 +#log-queries-not-using-indexes +# +# The following can be used as easy to replay backup logs or for replication. +# note: if you are setting up a replication slave, see README.Debian about +# other settings you may need to change. +#server-id = 1 +#log_bin = /var/log/mysql/mysql-bin.log +expire_logs_days = 10 +max_binlog_size = 100M +#binlog_do_db = include_database_name +#binlog_ignore_db = include_database_name +# +# * InnoDB +# +# InnoDB is enabled by default with a 10MB datafile in /var/lib/mysql/. +# Read the manual for more InnoDB related options. There are many! +# +# * Security Features +# +# Read the manual, too, if you want chroot! +# chroot = /var/lib/mysql/ +# +# For generating SSL certificates I recommend the OpenSSL GUI "tinyca". +# +# ssl-ca=/etc/mysql/cacert.pem +# ssl-cert=/etc/mysql/server-cert.pem +# ssl-key=/etc/mysql/server-key.pem + + + +[mysqldump] +quick +quote-names +max_allowed_packet = 16M + +[mysql] +#no-auto-rehash # faster start of mysql but no tab completition + +[isamchk] +key_buffer = 16M + +# +# * IMPORTANT: Additional settings that can override those from this file! +# The files must end with '.cnf', otherwise they'll be ignored. +# +!includedir /etc/mysql/conf.d/ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-mysql/templates/rsyslog_traps_debian-start.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-mysql/templates/rsyslog_traps_debian-start.conf new file mode 100644 index 0000000000000000000000000000000000000000..8fb33d5fb00755039ab9b5f6ca129cec4a6eebbc --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-mysql/templates/rsyslog_traps_debian-start.conf @@ -0,0 +1,22 @@ +# Templates for local and remote logging +$template DynLocalDebianStart, "/var/log/rsyslog/local/mysql/debian-start.%syslogseverity-text%.log" +$template DynRemoteDebianStart, "/var/log/rsyslog/remote/%fromhost%/mysql/debian-start.%syslogseverity-text%.log" +%if %%getVar("activer_reception_logs", "non") == 'non' +# all messages go in local branch +:syslogtag, startswith, "/etc/mysql/debian-start" ?DynLocalDebianStart +& stop +%else +# all messages from localhost go in local branch +if $syslogtag startswith '/etc/mysql/debian-start' and $fromhost-ip startswith '127' then ?DynLocalDebianStart +& stop + %if %%mode_conteneur_actif == 'oui' +# all messages from containers go in local branch +if $syslogtag startswith '/etc/mysql/debian-start' and $fromhost-ip startswith '%%adresse_ip_br0[:-2]' then ?DynLocalDebianStart +& stop +if $syslogtag startswith '/etc/mysql/debian-start' and $fromhost startswith '%%adresse_ip_br0[:-2]' then ?DynLocalDebianStart +& stop + %end if +# all remaining messages go in remote branch +:syslogtag, startswith, "/etc/mysql/debian-start" ?DynRemoteDebianStart +& stop +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-nfs/dictionaries/00_eole-nfs_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-nfs/dictionaries/00_eole-nfs_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..93c66388e802ab6f011eaaa129a1ba37165146dd --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-nfs/dictionaries/00_eole-nfs_packages.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>nfs-kernel-server</package> + <package>nfs-common</package> + <package>nfs4-acl-tools</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-nfs/dictionaries/20_nfs.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-nfs/dictionaries/20_nfs.xml new file mode 100644 index 0000000000000000000000000000000000000000..585ed3eac193fb3ae155cc4443dbc517a5d89302 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-nfs/dictionaries/20_nfs.xml @@ -0,0 +1,58 @@ +<?xml version="1.0" encoding="utf-8"?> +<creole> + + <files> + <file filelist='nfs' name='/etc/idmapd.conf'/> + <file filelist='nfs' name='/etc/modprobe.d/local.conf'/> + <file filelist='nfs' name='/etc/default/nfs-common'/> + <file filelist='nfs' name='/etc/default/nfs-kernel-server'/> + <file filelist='nfs' name='/etc/default/portmap'/> + <file filelist='nfs' name='/etc/exports' rm='True'/> + <service servicelist='nfs'>nfs-kernel-server</service> + <service_access service='nfs'> + <port>2049</port> + <port>111</port> + <port protocol='udp'>111</port> + <tcpwrapper>portmap</tcpwrapper> + <port>4005</port> + <tcpwrapper>lockd</tcpwrapper> + <port>4003</port> + <tcpwrapper>mountd</tcpwrapper> + </service_access> + <service_restriction service='nfs'> + <ip interface='auto' ip_type='SymLinkOption'>adresses_ip_clients_nfs</ip> + </service_restriction> + </files> + + <variables> + <family name='services'> + <variable name='activer_serveur_nfs' type='oui/non' description='Activer le serveur NFS'> + <value>oui</value> + </variable> + </family> + <family name='nfs' icon='share'> + <variable name='adresses_ip_clients_nfs' type='ip' multi='True' mandatory='True' + description="Adresse IP autorisée à monter les export NFS"> + <value/> + </variable> + </family> + </variables> + + <constraints> + <condition name='disabled_if_in' source='activer_serveur_nfs'> + <param>non</param> + <target type='family'>nfs</target> + <target type='filelist'>nfs</target> + <target type='servicelist'>nfs</target> + </condition> + </constraints> + + <help> + <family name='nfs'>Configuration du serveur NFS</family> + <variable name='activer_serveur_nfs'>NFS (Network File System) est un protocole qui permet de partager des fichiers via le réseau</variable> + <variable name='adresses_ip_clients_nfs'>Il s'agit généralement de l'adresse du serveur Eclair autorisé à se connecter au module</variable> + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-nfs/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-nfs/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..2a78a1195661f0e0e2ebaf67d68bb09ce0f2422c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-nfs/service.yml @@ -0,0 +1,34 @@ +format: '0.1' +name: eole-nfs +version: |- + 2.6.0-2 +description: |- + Paramètrage du serveur NFS pour EOLE + Dictionnaires et templates pour faciliter la mise en place + de la communication entre les modules Scribe et Eclair + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: [] +packages: + - nfs-kernel-server + - nfs-common + - nfs4-acl-tools +dictionaries: + - 20_nfs.xml +extra_dictionaries: {} +templates: + - local.conf + - exports + - idmapd.conf + - portmap + - nfs-common + - nfs-kernel-server +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: [] +files: {} +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-nfs/templates/exports b/seed/release/eole-2.7/2.7.1/applicationservice/eole-nfs/templates/exports new file mode 100644 index 0000000000000000000000000000000000000000..ce1b39fff20020452cb284dc5428e5cf0ef614f6 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-nfs/templates/exports @@ -0,0 +1,13 @@ +# /etc/exports: the access control list for filesystems which may be exported +# to NFS clients. See exports(5). +# +# Example for NFSv2 and NFSv3: +# /srv/homes hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check) +# +# Example for NFSv4: +# /srv/nfs4 gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check) +# /srv/nfs4/homes gss/krb5i(rw,sync,no_subtree_check) +# +%for %%address_eclair in %%adresses_ip_clients_nfs +/home %%{address_eclair}(rw,insecure,no_subtree_check,async,root_squash,acl) +%end for diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-nfs/templates/idmapd.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-nfs/templates/idmapd.conf new file mode 100644 index 0000000000000000000000000000000000000000..4ff1cfe5dd9be53f33c6a2aeb76a0e1670729dbd --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-nfs/templates/idmapd.conf @@ -0,0 +1,16 @@ +[General] + +Verbosity = 0 +Pipefs-Directory = /var/lib/nfs/rpc_pipefs +#Pas necessaire pour l'instant +#Attention le client doit avoir le même parametrage +#Domain = %%nom_domaine_local + +[Mapping] + +Nobody-User = nobody +Nobody-Group = nogroup + +[Translation] + +Method = nsswitch diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-nfs/templates/local.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-nfs/templates/local.conf new file mode 100644 index 0000000000000000000000000000000000000000..5fcdc782422a8c6a48d32ea3751a1650941eb2d3 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-nfs/templates/local.conf @@ -0,0 +1,3 @@ +#options pour lockd +options lockd nlm_udpport=4005 nlm_tcpport=4006 +options nfs callback_tcpport=4007 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-nfs/templates/nfs-common b/seed/release/eole-2.7/2.7.1/applicationservice/eole-nfs/templates/nfs-common new file mode 100644 index 0000000000000000000000000000000000000000..a0bb98826354c4fb6e0302f0c08f998641f0f11c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-nfs/templates/nfs-common @@ -0,0 +1,19 @@ +# If you do not set values for the NEED_ options, they will be attempted +# autodetected; this should be sufficient for most people. Valid alternatives +# for the NEED_ options are "yes" and "no". + +# Do you want to start the statd daemon? It is not needed for NFSv4. +NEED_STATD=no + +# Options for rpc.statd. +# Should rpc.statd listen on a specific port? This is especially useful +# when you have a port-based firewall. To use a fixed port, set this +# this variable to a statd argument like: "--port 4000 --outgoing-port 4001". +# For more information, see rpc.statd(8) or http://wiki.debian.org/?SecuringNFS +STATDOPTS="--port 4000 --outgoing-port 4001" + +# Do you want to start the idmapd daemon? It is only needed for NFSv4. +NEED_IDMAPD=yes + +# Do you want to start the gssd daemon? It is required for Kerberos mounts. +NEED_GSSD=no diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-nfs/templates/nfs-kernel-server b/seed/release/eole-2.7/2.7.1/applicationservice/eole-nfs/templates/nfs-kernel-server new file mode 100644 index 0000000000000000000000000000000000000000..f2c81f5e448c91c0577ce7db4b58225ba8cacd11 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-nfs/templates/nfs-kernel-server @@ -0,0 +1,18 @@ +# Number of servers to start up +RPCNFSDCOUNT=8 + +# Runtime priority of server (see nice(1)) +RPCNFSDPRIORITY=0 + +# Options for rpc.mountd. +# If you have a port-based firewall, you might want to set up +# a fixed port here using the --port option. For more information, +# see rpc.mountd(8) or http://wiki.debian.org/?SecuringNFS +RPCMOUNTDOPTS="--manage-gids -p 4003" + +# Do you want to start the svcgssd daemon? It is only required for Kerberos +# exports. Valid alternatives are "yes" and "no"; the default is "no". +NEED_SVCGSSD=no + +# Options for rpc.svcgssd. +RPCSVCGSSDOPTS= diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-nfs/templates/portmap b/seed/release/eole-2.7/2.7.1/applicationservice/eole-nfs/templates/portmap new file mode 100644 index 0000000000000000000000000000000000000000..f813c460e33bd031760b9571d65ae1f1ba1d49b5 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-nfs/templates/portmap @@ -0,0 +1,11 @@ +# Portmap configuration file +# +# Note: if you manually edit this configuration file, +# portmap configuration scripts will avoid modifying it +# (for example, by running 'dpkg-reconfigure portmap'). + +# If you want portmap to listen only to the loopback +# interface, uncomment the following line (it will be +# uncommented automatically if you configure this +# through debconf). +OPTIONS="-i 0.0.0.0" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-nut/dictionaries/00_eole-nut_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-nut/dictionaries/00_eole-nut_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..6a8370e2d5bf93bc5ce70ed7d5b7e31d47dbee88 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-nut/dictionaries/00_eole-nut_packages.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>nut</package> + <package>creole</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-nut/dictionaries/20_nut.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-nut/dictionaries/20_nut.xml new file mode 100644 index 0000000000000000000000000000000000000000..3541351c79dec195da96d4b0207d8938b7e54147 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-nut/dictionaries/20_nut.xml @@ -0,0 +1,171 @@ +<?xml version="1.0" encoding="utf-8"?> +<creole> + + <files> + <service servicelist='nut-server'>nut-server</service> + <service servicelist='nut-server'>nut-driver</service> + <service servicelist='nut'>nut-monitor</service> + <service_access service='nut'> + <port>3493</port> + <tcpwrapper>upsd</tcpwrapper> + </service_access> + <service_restriction service='nut'> + <ip interface='auto' netmask='nut_monitor_netmask' netmask_type='SymLinkOption' ip_type='SymLinkOption'>nut_monitor_host</ip> + </service_restriction> + <file name="/etc/nut/nut.conf"/> + <file name="/etc/nut/ups.conf" owner="nut" group="nut" mode="640" filelist="nutmaster" rm='True'/> + <file name="/etc/nut/upsd.conf" owner="nut" group="nut" mode="640" filelist="nutmaster" rm='True'/> + <file name="/etc/nut/upsd.users" owner="nut" group="nut" mode="640" filelist="nutmaster" rm='True'/> + <file name="/etc/nut/upsmon.conf" owner="nut" group="nut" mode="640" filelist="nut" rm='True'/> + </files> + + <variables> + + <family name="services"> + <variable name="activer_nut" type="oui/non" description="Activer la gestion de l'onduleur NUT"> + <value>non</value> + </variable> + </family> + + <family name='onduleur' icon='bolt'> + + <variable name="nut_ups_daemon" type="oui/non" description="Configuration sur un serveur maître"> + <value>oui</value> + </variable> + + <!--l'onduleur est distant--> + <variable name="nut_monitor_foreign_name" type="string" description="Nom de l'onduleur distant" mandatory='True'/> + <variable name="nut_monitor_foreign_host" type="domain" description="Hôte gérant l'onduleur" mandatory='True'/> + <variable name="nut_monitor_foreign_user" type="unix_user" description="Utilisateur de l'hôte distant" mandatory='True'/> + <!-- Le mot de passe ne doit contenir que des chiffres ou des lettres --> + <variable name="nut_monitor_foreign_password" type="password" description="Mot de passe de l'hôte distant" mandatory='True'/> + + <!--si l'onduleur est local--> + <variable name="nut_ups_name" type="hostname_strict" description="Nom de l'onduleur" multi="True" mandatory='True'/> + <variable name="nut_ups_driver" type="string" description="Pilote de communication de l'onduleur"> + <value>usbhid-ups</value> + </variable> + <variable name="nut_ups_port" type="string" description="Port de communication de l'onduleur" mandatory='True'> + <value>auto</value> + </variable> + <variable name="nut_ups_serial" type="string" description="Numéro de série de l'onduleur (facultatif)"/> + <variable name="nut_ups_productid" type="string" description="Productid de l'onduleur (facultatif)"/> + <variable name="nut_ups_upstype" type="string" description="Upstype de l'onduleur (facultatif)"/> + <!-- Le mot de passe ne doit contenir que des chiffres ou des lettres --> + <variable name="nut_ups_password" type="password" description="Mot de passe de l'administrateur local de l'onduleur" hidden="True"/> + + <!--autoriser utilisateur distant--> + <variable name="nut_monitor" type='oui/non' description="Autoriser des esclaves distants à se connecter"> + <value>non</value> + </variable> + <variable name="nut_monitor_user" type="unix_user" description="Utilisateur de surveillance de l'onduleur" multi="True" mandatory='True'/> + <!-- Le mot de passe ne doit contenir que des chiffres ou des lettres --> + <variable name="nut_monitor_password" type="password" description="Mot de passe de surveillance de l'onduleur" mandatory='True'/> + <variable name="nut_monitor_host" type="network" description="Adresse IP du réseau de l'esclave" mandatory='True'/> + <variable name="nut_monitor_netmask" type="netmask" description="Masque de l'IP du réseau de l'esclave" mandatory='True'/> + + </family> + + <separators> + <separator name="nut_monitor">Esclaves distants</separator> + </separators> + + </variables> + + <constraints> + + <check name="valid_networknetmask" target="nut_monitor_netmask"> + <param type='eole'>nut_monitor_host</param> + </check> + + <fill name='gen_random' target='nut_ups_password'/> + + <condition name="disabled_if_in" source="nut_ups_daemon"> + <param>non</param> + <target type="servicelist">nut-server</target> + </condition> + + <condition name="disabled_if_in" source="activer_nut"> + <param>non</param> + <target type="family">onduleur</target> + <target type="servicelist">nut</target> + <target type="filelist">nut</target> + </condition> + + <condition name="disabled_if_in" source="nut_ups_daemon"> + <param>oui</param> + <target type="variable">nut_monitor_foreign_name</target> + <target type="variable">nut_monitor_foreign_host</target> + <target type="variable">nut_monitor_foreign_user</target> + <target type="variable">nut_monitor_foreign_password</target> + </condition> + + <condition name="disabled_if_in" source="nut_ups_daemon"> + <param>non</param> + <target type="variable">nut_ups_name</target> + <target type="variable">nut_ups_driver</target> + <target type="variable">nut_ups_port</target> + <target type="variable">nut_ups_serial</target> + <target type="variable">nut_ups_productid</target> + <target type="variable">nut_ups_upstype</target> + <target type="variable">nut_monitor</target> + </condition> + + <condition name='disabled_if_in' source='nut_monitor'> + <param>non</param> + <target type="variable">nut_monitor_user</target> + <target type="variable">nut_monitor_password</target> + <target type="variable">nut_monitor_host</target> + <target type="variable">nut_monitor_netmask</target> + </condition> + + <condition name="disabled_if_in" source="nut_ups_daemon"> + <param>non</param> + <target type="filelist">nutmaster</target> + </condition> + + <check name="valid_enum" target="nut_ups_driver"> + <param type="python">eosfunc.list_files('/lib/nut/', default=['al175', 'apcsmart', 'apcsmart-old', 'apcupsd-ups', 'bcmxcp', 'bcmxcp_usb', 'belkin', 'belkinunv', 'bestfcom', 'bestfortress', 'bestuferrups', 'bestups', 'blazer_ser', 'blazer_usb', 'clone', 'clone-outlet', 'dummy-ups', 'etapro', 'everups', 'gamatronic', 'genericups', 'isbmex', 'ivtscd', 'liebert', 'liebert-esp2', 'masterguard', 'metasys', 'mge-shut', 'mge-utalk', 'microdowell', 'nutdrv_atcl_usb', 'nutdrv_qx', 'oldmge-shut', 'oneac', 'optiups', 'powercom', 'powerpanel', 'rhino', 'richcomm_usb', 'riello_ser', 'riello_usb', 'safenet', 'solis', 'tripplite', 'tripplite_usb', 'tripplitesu', 'upscode2', 'usbhid-ups', 'victronups'], exception=['upsd', 'upsmon'], substring=False)</param> + <param name="checkval">False</param> + </check> + + <check name="valid_enum" target="nut_ups_port"> + <param>['auto','/dev/ttyS0','/dev/ttyS1']</param> + <param name="checkval">False</param> + </check> + + <group master='nut_monitor_user'> + <slave>nut_monitor_password</slave> + <slave>nut_monitor_host</slave> + <slave>nut_monitor_netmask</slave> + </group> + + <group master='nut_ups_name'> + <slave>nut_ups_port</slave> + <slave>nut_ups_driver</slave> + <slave>nut_ups_serial</slave> + <slave>nut_ups_productid</slave> + <slave>nut_ups_upstype</slave> + </group> + + </constraints> + + <help> + + <family name='onduleur'>Paramétrage de la gestion des onduleurs par NUT</family> + <variable name="activer_nut">NUT (Network UPS Tools) est un ensemble d'outils permettant de gérer et de superviser un système relié à un ou des onduleurs</variable> + <variable name="nut_ups_daemon">Activer la gestion d'onduleur. Ce service est a activer si ce serveur est connecté à un onduleur (cable RS232 ou USB). Sinon, le service se connecte à un autre serveur NUT.</variable> + <variable name="nut_ups_name">Nom de l'onduleur géré par le service NUT.</variable> + <variable name="nut_ups_driver">Pilote de communication de l'onduleur.</variable> + <variable name="nut_ups_port">Port de communication de l'onduleur. Pour les onduleurs USB ce port doit être "auto".</variable> + <variable name="nut_ups_serial">Valeur spécifique pour le champ "serial" associé à l'onduleur dans /etc/ups/ups.conf</variable> + <variable name="nut_ups_productid">Valeur spécifique pour le champ "productid" associé à l'onduleur dans /etc/ups/ups.conf</variable> + <variable name="nut_ups_upstype">Valeur spécifique pour le champ "upstype" associé à l'onduleur dans /etc/ups/ups.conf</variable> + <variable name="nut_monitor_user">Nom d'utilisateur de surveillance de l'onduleur.</variable> + <variable name="nut_monitor_password">Mot de passe de l'utilisateur de surveillance de l'onduleur.</variable> + + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-nut/files/usr/share/eole/diagnose/80-nut b/seed/release/eole-2.7/2.7.1/applicationservice/eole-nut/files/usr/share/eole/diagnose/80-nut new file mode 100644 index 0000000000000000000000000000000000000000..d06e3d536ac35dcd4e9c6b284b0da04faae69725 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-nut/files/usr/share/eole/diagnose/80-nut @@ -0,0 +1,50 @@ +#!/bin/bash + +if [ $(CreoleGet activer_nut) = "oui" ]; then + if [ $(CreoleGet nut_ups_daemon) = "oui" ]; then + for nut_ups_name in $(CreoleGet nut_ups_name); do + monitors="$monitors$nut_ups_name@localhost " + done + else + monitors="$(CreoleGet nut_monitor_foreign_name)@$(CreoleGet nut_monitor_foreign_host)" + fi + . /usr/lib/eole/diagnose.sh + EchoGras "*** Onduleur" + for monitor in $monitors; do + printf ". %${len_pf}s => " $monitor + status=$(/bin/upsc $monitor ups.status 2> /dev/null) + if [ $? -ne 0 ];then + status=$(/bin/upsc $monitor ups.status 2>&1 | grep -v 'Init SSL without certificate database') + EchoRouge "$status" + else + charge=`/bin/upsc $monitor battery.charge 2> /dev/null| cut -d'.' -f1` + #si OL dans le status + for a in $status; do + [ "$a" = "OL" ] && ok=true + if [ "$a" = "ALARM" ] + then + ok=false + alarm=$(/bin/upsc $monitor ups.alarm 2>&1) + if [ $? -ne 0 ] + then + alarm="Type d'alarme inconnue" + else + alarm=$(sed -e 's/Init SSL without certificate database//g' <<< $alarm) + fi + break + fi + done + + if [ "$ok" = "true" ]; then + EchoVert "OK ($charge%)" + elif [ "$ok" = "false" ]; then + EchoRouge "$alarm" + elif [ "$charge" -lt "20" ]; then + EchoRouge "Charge batterie faible ($charge%)" + else + EchoOrange "Fonctionnement sur batterie ($charge%)" + fi + fi + done + echo +fi diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-nut/files/usr/share/eole/sbin/nut_alerte.sh b/seed/release/eole-2.7/2.7.1/applicationservice/eole-nut/files/usr/share/eole/sbin/nut_alerte.sh new file mode 100644 index 0000000000000000000000000000000000000000..a49249dd15f121a791f178d4e31b6ebd4df99988 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-nut/files/usr/share/eole/sbin/nut_alerte.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +HOST=`hostname` +DEST=root +case ${1} in + + ONBATT) + echo "$HOST : The UPS is currently running on battery power!"|mail -s "$HOST : The UPS is currently running on battery power!" UPS $DEST + ;; + LOWBATT) + echo "$HOST : UPS is on battery and has a low battery"|mail -s "$HOST : UPS is on battery and has a low battery" $DEST + ;; + REPLBATT) + echo "$HOST : The UPS battery is bad and needs to be replaced"|mail -s "$HOST : The UPS battery is bad and needs to be replaced" $DEST + ;; + SHUTDOWN) + echo "$HOST : The system is being shutdown"|mail -s "$HOST : The system is being shutdown" $DEST + ;; + ONLINE) + echo "$HOST : UPS is back online"|mail -s "$HOST : UPS is back online" $DEST +esac + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-nut/files/usr/share/zephir/monitor/configs/nut.agent b/seed/release/eole-2.7/2.7.1/applicationservice/eole-nut/files/usr/share/zephir/monitor/configs/nut.agent new file mode 100644 index 0000000000000000000000000000000000000000..6bedb6fe2954d260c6b1b2d23a420be4d6162f1c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-nut/files/usr/share/zephir/monitor/configs/nut.agent @@ -0,0 +1,23 @@ +# -*- coding: UTF-8 -*- +""" +Onduleur +""" + +from os.path import isfile +from zephir.monitor.agentmanager.config import ACTIVER_NUT, NUT_UPS_NAME, NUT_UPS_HOST + +AGENTS = [] + +if ACTIVER_NUT: + from zephir.monitor.agents.nut import Nut + monitors = [] + for idx, monitor in enumerate(NUT_UPS_NAME): + host = NUT_UPS_HOST[idx] + monitors.append("{0}@{1}".format(monitor, host)) + for idx, monitor in enumerate(monitors): + AGENTS.append(Nut("nut{0}".format(idx), + monitor, + period = 300, + description = """Onduleur ({0})""".format(monitor), + section = """Système""", + )) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-nut/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-nut/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..43680dfbe274de91092b5d305c5b997063a2a228 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-nut/service.yml @@ -0,0 +1,43 @@ +format: '0.1' +name: eole-nut +version: |- + 2.7.0-3 +description: |- + Templates et dictionnaires pour Nut + Configuration de la gestion d'onduleur NUT + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: [] +packages: + - nut + - creole +dictionaries: + - 20_nut.xml +extra_dictionaries: {} +templates: + - nut.conf + - ups.conf + - upsd.conf + - upsd.users + - upsmon.conf +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: [] +files: + /usr/share/eole/diagnose/80-nut: + owner: root + group: root + mode: '0755' + /usr/share/eole/sbin/nut_alerte.sh: + owner: root + group: root + mode: '0755' + /usr/share/zephir/monitor/configs/nut.agent: + owner: root + group: root + mode: '0644' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-nut/templates/nut.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-nut/templates/nut.conf new file mode 100644 index 0000000000000000000000000000000000000000..b8dc7c7fa53b0a8bfce7eef730792fa97a8d3122 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-nut/templates/nut.conf @@ -0,0 +1,36 @@ +# Network UPS Tools: example nut.conf +# +############################################################################## +# General section +############################################################################## +# The MODE determines which part of the NUT is to be started, and which +# configuration files must be modified. +# +# This file try to standardize the various files being found in the field, like +# /etc/default/nut on Debian based systems, /etc/sysconfig/ups on RedHat based +# systems, ... Distribution's init script should source this file to see which +# component(s) has to be started. +# +# The values of MODE can be: +# - none: NUT is not configured, or use the Integrated Power Management, or use +# some external system to startup NUT components. So nothing is to be started. +# - standalone: This mode address a local only configuration, with 1 UPS +# protecting the local system. This implies to start the 3 NUT layers (driver, +# upsd and upsmon) and the matching configuration files. This mode can also +# address UPS redundancy. +# - netserver: same as for the standalone configuration, but also need +# some more network access controls (firewall, tcp-wrappers) and possibly a +# specific LISTEN directive in upsd.conf. +# Since this MODE is opened to the network, a special care should be applied +# to security concerns. +# - netclient: this mode only requires upsmon. + +%if %%activer_nut == 'oui' +%if %%nut_ups_daemon == 'oui' +MODE=netserver +%else +MODE=netclient +%end if +%else +MODE=none +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-nut/templates/ups.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-nut/templates/ups.conf new file mode 100644 index 0000000000000000000000000000000000000000..20609808c75be675e57e84d5d5bc60272da43f8d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-nut/templates/ups.conf @@ -0,0 +1,118 @@ +# Network UPS Tools: example ups.conf +# +# --- SECURITY NOTE --- +# +# If you use snmp-ups and set a community string in here, you +# will have to secure this file to keep other users from obtaining +# that string. It needs to be readable by upsdrvctl and any drivers, +# and by upsd. +# +# --- +# +# This is where you configure all the UPSes that this system will be +# monitoring directly. These are usually attached to serial ports, but +# USB devices and SNMP devices are also supported. +# +# This file is used by upsdrvctl to start and stop your driver(s), and +# is also used by upsd to determine which drivers to monitor. The +# drivers themselves also read this file for configuration directives. +# +# The general form is: +# +# [upsname] +# driver = <drivername> +# port = <portname> +# < any other directives here > +# +# The section header ([upsname]) can be just about anything as long as +# it is a single word inside brackets. upsd uses this to uniquely +# identify a UPS on this system. +# +# If you have a UPS called snoopy, your section header would be "[snoopy]". +# On a system called "doghouse", the line in your upsmon.conf to monitor +# it would look something like this: +# +# MONITOR snoopy@doghouse 1 upsmonuser mypassword master +# +# It might look like this if monitoring in slave mode: +# +# MONITOR snoopy@doghouse 1 upsmonuser mypassword slave +# +# Configuration directives +# ------------------------ +# +# These directives are common to all drivers that support ups.conf: +# +# driver: REQUIRED. Specify the program to run to talk to this UPS. +# apcsmart, bestups, and sec are some examples. +# +# port: REQUIRED. The serial port where your UPS is connected. +# /dev/ttyS0 is usually the first port on Linux boxes, for example. +# +# sdorder: optional. When you have multiple UPSes on your system, you +# usually need to turn them off in a certain order. upsdrvctl +# shuts down all the 0s, then the 1s, 2s, and so on. To exclude +# a UPS from the shutdown sequence, set this to -1. +# +# The default value for this parameter is 0. +# +# nolock: optional, and not recommended for use in this file. +# +# If you put nolock in here, the driver will not lock the +# serial port every time it starts. This may allow other +# processes to seize the port if you start more than one by +# mistake. +# +# This is only intended to be used on systems where locking +# absolutely must be disabled for the software to work. +# +# maxstartdelay: optional. This can be set as a global variable +# above your first UPS definition and it can also be +# set in a UPS section. This value controls how long +# upsdrvctl will wait for the driver to finish starting. +# This keeps your system from getting stuck due to a +# broken driver or UPS. +# +# The default is 45 seconds. +# +# +# Anything else is passed through to the hardware-specific part of +# the driver. +# +# Examples +# -------- +# +# A simple example for a UPS called "powerpal" that uses the megatec +# driver on /dev/ttyS0 is: +# +# [powerpal] +# driver = megatec +# port = /dev/ttyS0 +# desc = "Web server" +# +# If your UPS driver requires additional settings, you can specify them +# here. For example, if it supports a setting of "1234" for the +# variable "cable", it would look like this: +# +# [myups] +# driver = mydriver +# port = /dev/ttyS1 +# cable = 1234 +# desc = "Something descriptive" +# +# To find out if your driver supports any extra settings, start it with +# the -h option and/or read the driver's documentation. + +%if %%nut_ups_daemon == 'oui' + %for %%nut_ups in %%nut_ups_name +[%%nut_ups] + driver = %%nut_ups.nut_ups_driver + port = %%nut_ups.nut_ups_port + %for %%field in ['serial', 'productid', 'upstype'] + %if %%getattr(%%nut_ups, 'nut_ups_'+%%field) is not None + %%field = %%getattr(%%nut_ups, 'nut_ups_'+%%field) + %end if + %end for + %end for +%end if + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-nut/templates/upsd.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-nut/templates/upsd.conf new file mode 100644 index 0000000000000000000000000000000000000000..f2bc4ff60a23d1570f91c1159bf8380ad108eca6 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-nut/templates/upsd.conf @@ -0,0 +1,42 @@ +# Network UPS Tools: example upsd configuration file +# +# This file contains access control data, you should keep it secure. +# +# It should only be readable by the user that upsd becomes. See the FAQ. + +# ======================================================================= +# MAXAGE <seconds> +# MAXAGE 15 +# +# This defaults to 15 seconds. After a UPS driver has stopped updating +# the data for this many seconds, upsd marks it stale and stops making +# that information available to clients. After all, the only thing worse +# than no data is bad data. +# +# You should only use this if your driver has difficulties keeping +# the data fresh within the normal 15 second interval. Watch the syslog +# for notifications from upsd about staleness. + +# ======================================================================= +# LISTEN <address> [<port>] +# LISTEN 127.0.0.1 3493 +LISTEN 0.0.0.0 3493 +# +# This defaults to the localhost listening address and port 3493. You +# may specify each interface you want upsd to listen on for connections, +# optionally with a port number. +# +# You may need this if you have multiple interfaces on your machine and +# you don't want upsd to listen to all interfaces (for instance on a +# firewall, you may not want to listen to the external interface). +# +# This will only be read at startup of upsd. If you make changes here, +# you'll need to restart upsd, reload will have no effect. + +# ======================================================================= +# MAXCONN <connections> +# +# This defaults to maximum number allowed on your system. Each UPS, each +# LISTEN address and each client count as one connection. If the server +# runs out of connections, it will no longer accept new incoming client +# connections. Only set this if you know exactly what you're doing. diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-nut/templates/upsd.users b/seed/release/eole-2.7/2.7.1/applicationservice/eole-nut/templates/upsd.users new file mode 100644 index 0000000000000000000000000000000000000000..1c4d9c7bf0b72dfc6b8f86507ea6831a2c49bdf9 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-nut/templates/upsd.users @@ -0,0 +1,92 @@ +# Network UPS Tools: Example upsd.users +# +# This file sets the permissions for upsd - the UPS network daemon. +# Users are defined here, are given passwords, and their privileges are +# controlled here too. Since this file will contain passwords, keep it +# secure, with only enough permissions for upsd to read it. + +# -------------------------------------------------------------------------- + +# Each user gets a section. To start a section, put the username in +# brackets on a line by itself. To set something for that user, specify +# it under that section heading. The username is case-sensitive, so +# admin and AdMiN are two different users. +# +# Possible settings: +# +# password: The user's password. This is case-sensitive. +# +# -------------------------------------------------------------------------- +# +# allowfrom: ACL names that this user may connect from. ACLs are +# defined in upsd.conf. +# +# -------------------------------------------------------------------------- +# +# actions: Let the user do certain things with upsd. +# +# Valid actions are: +# +# SET - change the value of certain variables in the UPS +# FSD - set the "forced shutdown" flag in the UPS +# +# -------------------------------------------------------------------------- +# +# instcmds: Let the user initiate specific instant commands. Use "ALL" +# to grant all commands automatically. There are many possible +# commands, so use 'upscmd -l' to see what your hardware supports. Here +# are a few examples: +# +# test.panel.start - Start a front panel test +# test.battery.start - Start battery test +# test.battery.stop - Stop battery test +# calibrate.start - Start calibration +# calibrate.stop - Stop calibration +# +# -------------------------------------------------------------------------- +# +# Example: +# +# [admin] +# password = mypass +# allowfrom = admworkstation admhome +# actions = SET +# instcmds = ALL +# + +# +# --- Configuring for upsmon +# +# To add a user for your upsmon, use this example: +# +# [monuser] +# password = pass +# allowfrom = bigserver +# +# upsmon master (or upsmon slave) +# +# The matching MONITOR line in your upsmon.conf would look like this: +# +# MONITOR myups@myhost 1 monuser pass master (or slave) + +%if %%nut_ups_daemon == 'oui' +# Administrator is allow only from localhost +[root] + password = %%nut_ups_password + actions = SET + instcmds = ALL + +[localmonitor] + password = %%nut_ups_password + upsmon master + + %if %%nut_monitor == 'oui' +# Monitor user + %for %%nut_user in %%nut_monitor_user +[%%nut_user] + password = %%nut_user.nut_monitor_password + upsmon master + + %end for + %end if +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-nut/templates/upsmon.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-nut/templates/upsmon.conf new file mode 100644 index 0000000000000000000000000000000000000000..116d7a18bdae04eaee8bb241aceb35cab397a922 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-nut/templates/upsmon.conf @@ -0,0 +1,303 @@ +# Network UPS Tools: example upsmon configuration +# +# This file contains passwords, so keep it secure. + +# -------------------------------------------------------------------------- +# RUN_AS_USER <userid> +# +# By default, upsmon splits into two processes. One stays as root and +# waits to run the SHUTDOWNCMD. The other one switches to another userid +# and does everything else. +# +# The default nonprivileged user is set at compile-time with +# 'configure --with-user=...'. +# +# You can override it with '-u <user>' when starting upsmon, or just +# define it here for convenience. +# +# Note: if you plan to use the reload feature, this file (upsmon.conf) +# must be readable by this user! Since it contains passwords, DO NOT +# make it world-readable. Also, do not make it writable by the upsmon +# user, since it creates an opportunity for an attack by changing the +# SHUTDOWNCMD to something malicious. +# +# For best results, you should create a new normal user like "nutmon", +# and make it a member of a "nut" group or similar. Then specify it +# here and grant read access to the upsmon.conf for that group. +# +# This user should not have write access to upsmon.conf. +# +# RUN_AS_USER nutmon + +# -------------------------------------------------------------------------- +# MONITOR <system> <powervalue> <username> <password> ("master"|"slave") +# +# List systems you want to monitor. Not all of these may supply power +# to the system running upsmon, but if you want to watch it, it has to +# be in this section. +# +# You must have at least one of these declared. +# +# <system> is a UPS identifier in the form <upsname>@<hostname>[:<port>] +# like ups@localhost, su700@mybox, etc. +# +# Examples: +# +# - "su700@mybox" means a UPS called "su700" on a system called "mybox" +# +# - "fenton@bigbox:5678" is a UPS called "fenton" on a system called +# "bigbox" which runs upsd on port "5678". +# +# The UPS names like "su700" and "fenton" are set in your ups.conf +# in [brackets] which identify a section for a particular driver. +# +# If the ups.conf on host "doghouse" has a section called "snoopy", the +# identifier for it would be "snoopy@doghouse". +# +# <powervalue> is an integer - the number of power supplies that this UPS +# feeds on this system. Most computers only have one power supply, so this +# is normally set to 1. You need a pretty big or special box to have any +# other value here. +# +# You can also set this to 0 for a system that doesn't supply any power, +# but you still want to monitor. Use this when you want to hear about +# changes for a given UPS without shutting down when it goes critical, +# unless <powervalue> is 0. +# +# <username> and <password> must match an entry in that system's +# upsd.users. If your username is "monmaster" and your password is +# "blah", the upsd.users would look like this: +# +# [monmaster] +# password = blah +# allowfrom = (whatever applies to this host) +# upsmon master (or slave) +# +# "master" means this system will shutdown last, allowing the slaves +# time to shutdown first. +# +# "slave" means this system shuts down immediately when power goes critical. +# +# Examples: +# +# MONITOR myups@bigserver 1 monmaster blah master +# MONITOR su700@server.example.com 1 upsmon secretpass slave + +%if %%nut_ups_daemon == 'oui' +MONITOR %%nut_ups_name[0]@localhost 1 localmonitor %%nut_ups_password master +%else +MONITOR %%nut_monitor_foreign_name@%%nut_monitor_foreign_host 1 %%nut_monitor_foreign_user %%nut_monitor_foreign_password slave +%end if + +# -------------------------------------------------------------------------- +# MINSUPPLIES <num> +# +# Give the number of power supplies that must be receiving power to keep +# this system running. Most systems have one power supply, so you would +# put "1" in this field. +# +# Large/expensive server type systems usually have more, and can run with +# a few missing. The HP NetServer LH4 can run with 2 out of 4, for example, +# so you'd set that to 2. The idea is to keep the box running as long +# as possible, right? +# +# Obviously you have to put the redundant supplies on different UPS circuits +# for this to make sense! See big-servers.txt in the docs subdirectory +# for more information and ideas on how to use this feature. + +MINSUPPLIES 1 + +# -------------------------------------------------------------------------- +# SHUTDOWNCMD "<command>" +# +# upsmon runs this command when the system needs to be brought down. +# +# This should work just about everywhere ... if it doesn't, well, change it. + +SHUTDOWNCMD "/sbin/shutdown -h +0" + +# -------------------------------------------------------------------------- +# NOTIFYCMD <command> +# +# upsmon calls this to send messages when things happen +# +# This command is called with the full text of the message as one argument. +# The environment string NOTIFYTYPE will contain the type string of +# whatever caused this event to happen. +# +# Note that this is only called for NOTIFY events that have EXEC set with +# NOTIFYFLAG. See NOTIFYFLAG below for more details. +# +# Making this some sort of shell script might not be a bad idea. For more +# information and ideas, see pager.txt in the docs directory. +# +# Example: +# NOTIFYCMD /usr/local/ups/bin/notifyme + +# -------------------------------------------------------------------------- +# POLLFREQ <n> +# +# Polling frequency for normal activities, measured in seconds. +# +# Adjust this to keep upsmon from flooding your network, but don't make +# it too high or it may miss certain short-lived power events. + +POLLFREQ 5 + +# -------------------------------------------------------------------------- +# POLLFREQALERT <n> +# +# Polling frequency in seconds while UPS on battery. +# +# You can make this number lower than POLLFREQ, which will make updates +# faster when any UPS is running on battery. This is a good way to tune +# network load if you have a lot of these things running. +# +# The default is 5 seconds for both this and POLLFREQ. + +POLLFREQALERT 5 + +# -------------------------------------------------------------------------- +# HOSTSYNC - How long upsmon will wait before giving up on another upsmon +# +# The master upsmon process uses this number when waiting for slaves to +# disconnect once it has set the forced shutdown (FSD) flag. If they +# don't disconnect after this many seconds, it goes on without them. +# +# Similarly, upsmon slave processes wait up to this interval for the +# master upsmon to set FSD when a UPS they are monitoring goes critical - +# that is, on battery and low battery. If the master doesn't do its job, +# the slaves will shut down anyway to avoid damage to the file systems. +# +# This "wait for FSD" is done to avoid races where the status changes +# to critical and back between polls by the master. + +HOSTSYNC 15 + +# -------------------------------------------------------------------------- +# DEADTIME - Interval to wait before declaring a stale ups "dead" +# +# upsmon requires a UPS to provide status information every few seconds +# (see POLLFREQ and POLLFREQALERT) to keep things updated. If the status +# fetch fails, the UPS is marked stale. If it stays stale for more than +# DEADTIME seconds, the UPS is marked dead. +# +# A dead UPS that was last known to be on battery is assumed to have gone +# to a low battery condition. This may force a shutdown if it is providing +# a critical amount of power to your system. +# +# Note: DEADTIME should be a multiple of POLLFREQ and POLLFREQALERT. +# Otherwise you'll have "dead" UPSes simply because upsmon isn't polling +# them quickly enough. Rule of thumb: take the larger of the two +# POLLFREQ values, and multiply by 3. + +DEADTIME 15 + +# -------------------------------------------------------------------------- +# POWERDOWNFLAG - Flag file for forcing UPS shutdown on the master system +# +# upsmon will create a file with this name in master mode when it's time +# to shut down the load. You should check for this file's existence in +# your shutdown scripts and run 'upsdrvctl shutdown' if it exists. +# +# See the shutdown.txt file in the docs subdirectory for more information. + +POWERDOWNFLAG /etc/killpower + +# -------------------------------------------------------------------------- +# NOTIFYMSG - change messages sent by upsmon when certain events occur +# +# You can change the default messages to something else if you like. +# +# NOTIFYMSG <notify type> "message" +# +# NOTIFYMSG ONLINE "UPS %s on line power" +# NOTIFYMSG ONBATT "UPS %s on battery" +# NOTIFYMSG LOWBATT "UPS %s battery is low" +# NOTIFYMSG FSD "UPS %s: forced shutdown in progress" +# NOTIFYMSG COMMOK "Communications with UPS %s established" +# NOTIFYMSG COMMBAD "Communications with UPS %s lost" +# NOTIFYMSG SHUTDOWN "Auto logout and shutdown proceeding" +# NOTIFYMSG REPLBATT "UPS %s battery needs to be replaced" +# NOTIFYMSG NOCOMM "UPS %s is unavailable" +# NOTIFYMSG NOPARENT "upsmon parent process died - shutdown impossible" +# +# Note that %s is replaced with the identifier of the UPS in question. +# +# Possible values for <notify type>: +# +# ONLINE : UPS is back online +# ONBATT : UPS is on battery +# LOWBATT : UPS has a low battery (if also on battery, it's "critical") +# FSD : UPS is being shutdown by the master (FSD = "Forced Shutdown") +# COMMOK : Communications established with the UPS +# COMMBAD : Communications lost to the UPS +# SHUTDOWN : The system is being shutdown +# REPLBATT : The UPS battery is bad and needs to be replaced +# NOCOMM : A UPS is unavailable (can't be contacted for monitoring) +# NOPARENT : The process that shuts down the system has died (shutdown impossible) + +# -------------------------------------------------------------------------- +# NOTIFYFLAG - change behavior of upsmon when NOTIFY events occur +# +# By default, upsmon sends walls (global messages to all logged in users) +# and writes to the syslog when things happen. You can change this. +# +# NOTIFYFLAG <notify type> <flag>[+<flag>][+<flag>] ... +# +# NOTIFYFLAG ONLINE SYSLOG+WALL +# NOTIFYFLAG ONBATT SYSLOG+WALL +# NOTIFYFLAG LOWBATT SYSLOG+WALL +# NOTIFYFLAG FSD SYSLOG+WALL +# NOTIFYFLAG COMMOK SYSLOG+WALL +# NOTIFYFLAG COMMBAD SYSLOG+WALL +# NOTIFYFLAG SHUTDOWN SYSLOG+WALL +# NOTIFYFLAG REPLBATT SYSLOG+WALL +# NOTIFYFLAG NOCOMM SYSLOG+WALL +# NOTIFYFLAG NOPARENT SYSLOG+WALL +# +# Possible values for the flags: +# +# SYSLOG - Write the message in the syslog +# WALL - Write the message to all users on the system +# EXEC - Execute NOTIFYCMD (see above) with the message +# IGNORE - Don't do anything +# +# If you use IGNORE, don't use any other flags on the same line. + +# -------------------------------------------------------------------------- +# RBWARNTIME - replace battery warning time in seconds +# +# upsmon will normally warn you about a battery that needs to be replaced +# every 43200 seconds, which is 12 hours. It does this by triggering a +# NOTIFY_REPLBATT which is then handled by the usual notify structure +# you've defined above. +# +# If this number is not to your liking, override it here. + +RBWARNTIME 43200 + +# -------------------------------------------------------------------------- +# NOCOMMWARNTIME - no communications warning time in seconds +# +# upsmon will let you know through the usual notify system if it can't +# talk to any of the UPS entries that are defined in this file. It will +# trigger a NOTIFY_NOCOMM by default every 300 seconds unless you +# change the interval with this directive. + +NOCOMMWARNTIME 300 + +# -------------------------------------------------------------------------- +# FINALDELAY - last sleep interval before shutting down the system +NOTIFYCMD "/usr/share/eole/sbin/nut_alerte.sh $NOTIFYTYPE" +NOTIFYFLAG ONBATT SYSLOG+EXEC +NOTIFYFLAG ONLINE SYSLOG+EXEC +NOTIFYFLAG LOWBATT SYSLOG+EXEC +# Alternatively, you can set this very low so you don't wait around when +# it's time to shut down. Some UPSes don't give much warning for low +# battery and will require a value of 0 here for a safe shutdown. +# +# Note: If FINALDELAY on the slave is greater than HOSTSYNC on the master, +# the master will give up waiting for the slave to disconnect. + +FINALDELAY 5 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-flow/dictionaries/00_eole-one-flow_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-flow/dictionaries/00_eole-one-flow_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..65018b65c3aea4e84ae27a4d91566bc5356cd3ea --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-flow/dictionaries/00_eole-one-flow_packages.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>opennebula-flow</package> + <package>ruby-treetop</package> + <package>ruby-polyglot</package> + <package>ruby-parse-cron</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-flow/dictionaries/99_one-flow.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-flow/dictionaries/99_one-flow.xml new file mode 100644 index 0000000000000000000000000000000000000000..bc985db7320aa692cf93bd31cfb8fcafc47fe89b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-flow/dictionaries/99_one-flow.xml @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="utf-8"?> +<creole> + <files> + <service servicelist='opennebula-flow'>opennebula-flow</service> + <file filelist='oneflow' name='/etc/one/oneflow-server.conf' rm='True'/> + <!--service_access service='oneflow'> + <port port_type="SymLinkOption">port_oneflow</port> + </service_access--> + <service_restriction service='oneflow'> + <ip interface='eth0' netmask='netmask_ssh_eth0' netmask_type='SymLinkOption' ip_type='SymLinkOption'>ip_ssh_eth0</ip> + </service_restriction> + </files> + <variables> + <family name='services'> + <variable name='activer_oneflow' type='oui/non' description="Activer le service OpenNebula Flow" mode='expert'> + <value>non</value> + </variable> + </family> + <family name='OpenNebula Flow' icon='cloud' mode='expert'> + <variable name='ip_oneflow' type='ip' description="Adresse IP d'écoute du service OpenNebula Flow"> + <value>127.0.0.1</value> + </variable> + <variable name='port_oneflow' type='number' description="Numéro de port d'écoute du service OpenNebula Flow"> + <value>2474</value> + </variable> + </family> + </variables> + + <constraints> + <condition name='disabled_if_in' source='activer_oneflow'> + <param>non</param> + <target type='servicelist'>opennebula-flow</target> + <target type='filelist'>oneflow</target> + <target type='family'>OpenNebula Flow</target> + </condition> + </constraints> + <help> + <family name='OpenNebula Flow'>Configuration du service de gestion des dépendances entre machines virtuelles</family> + <variable name='activer_oneflow'>OpenNebula Flow permet de gérer les dépendances entre machines virtuelles</variable> + </help> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-flow/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-flow/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..9cdfa3dc09949627d62a4143fe3338c0da4f6090 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-flow/service.yml @@ -0,0 +1,28 @@ +format: '0.1' +name: eole-one-flow +version: |- + 2.7.0-1 +description: |- + Dictionnaires et templates pour configurer le serveur OpenNebula Flow + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: [] +packages: + - opennebula-flow + - ruby-treetop + - ruby-polyglot + - ruby-parse-cron +dictionaries: + - 99_one-flow.xml +extra_dictionaries: {} +templates: + - oneflow-server.conf +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: [] +files: {} +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-flow/templates/oneflow-server.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-flow/templates/oneflow-server.conf new file mode 100644 index 0000000000000000000000000000000000000000..d91f10cb53b28d29224f967e5ee779a7deaeeb8e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-flow/templates/oneflow-server.conf @@ -0,0 +1,74 @@ +# -------------------------------------------------------------------------- # +# Copyright 2002-2018, OpenNebula Project, OpenNebula Systems # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); you may # +# not use this file except in compliance with the License. You may obtain # +# a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +#--------------------------------------------------------------------------- # + +################################################################################ +# Server Configuration +################################################################################ + +# OpenNebula daemon contact information +# +:one_xmlrpc: http://localhost:2633/RPC2 + +# Time in seconds between Life Cycle Manager steps +# +:lcm_interval: 30 + +# Host and port where OneFlow server will run +:host: %%getVar('ip_oneflow', '127.0.0.1') +:port: %%getVar('port_oneflow', '2474') + +################################################################################ +# Defaults +################################################################################ + +# Default cooldown period after a scale operation, in seconds +:default_cooldown: 300 + +# Default shutdown action. Values: 'terminate', 'terminate-hard' +:shutdown_action: 'terminate' + +# Default number of virtual machines (action_number) that will receive the +# given call in each interval defined by action_period, when an action +# is performed on a role. +:action_number: 1 +:action_period: 60 + +# Default name for the Virtual Machines created by oneflow. You can use any +# of the following placeholders: +# $SERVICE_ID +# $SERVICE_NAME +# $ROLE_NAME +# $VM_NUMBER + +:vm_name_template: '$ROLE_NAME_$VM_NUMBER_(service_$SERVICE_ID)' + +############################################################# +# Auth +############################################################# + +# Authentication driver to communicate with OpenNebula core +# - cipher, for symmetric cipher encryption of tokens +# - x509, for x509 certificate encryption of tokens +:core_auth: cipher + +################################################################################ +# Log +################################################################################ + +# Log debug level +# 0 = ERROR, 1 = WARNING, 2 = INFO, 3 = DEBUG +# +:debug_level: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/dictionaries/00_eole-one-frontend_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/dictionaries/00_eole-one-frontend_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..f04e4022884ddb5fd106ff8fb629fe35bc7d6bc1 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/dictionaries/00_eole-one-frontend_packages.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>opennebula-sunstone</package> + <package>ruby-net-ldap</package> + <package>python-numpy</package> + <package>ruby-dalli</package> + <package>memcached</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/dictionaries/99_one-frontend.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/dictionaries/99_one-frontend.xml new file mode 100644 index 0000000000000000000000000000000000000000..9a6efe7fb0b4d1e087ca3986241eb6ddeeb2f5d1 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/dictionaries/99_one-frontend.xml @@ -0,0 +1,110 @@ +<?xml version="1.0" encoding="utf-8"?> +<creole> + <files> + <service>opennebula-sunstone</service> + <file filelist='onefrontend' name='/etc/one/sunstone-server.conf'/> + <file filelist='onefrontend' name='/etc/one/sunstone-logos.yaml'/> + + <file filelist='onefrontend' name='/etc/one/sunstone-views/kvm/admin.yaml' source='kvm-admin.yaml'/> + <file filelist='onefrontend' name='/etc/one/sunstone-views/kvm/cloud.yaml' source='kvm-cloud.yaml'/> + <file filelist='onefrontend' name='/etc/one/sunstone-views/kvm/groupadmin.yaml' source='kvm-groupadmin.yaml'/> + <file filelist='onefrontend' name='/etc/one/sunstone-views/kvm/user.yaml' source='kvm-user.yaml'/> + + <file filelist='onefrontend' name='/etc/one/sunstone-views/mixed/admin.yaml' source='mixed-admin.yaml'/> + <file filelist='onefrontend' name='/etc/one/sunstone-views/mixed/cloud.yaml' source='mixed-cloud.yaml'/> + <file filelist='onefrontend' name='/etc/one/sunstone-views/mixed/groupadmin.yaml' source='mixed-groupadmin.yaml'/> + <file filelist='onefrontend' name='/etc/one/sunstone-views/mixed/user.yaml' source='mixed-user.yaml'/> + + <file filelist='onefrontend' name='/etc/one/sunstone-views/vcenter/admin.yaml' source='vcenter-admin.yaml'/> + <file filelist='onefrontend' name='/etc/one/sunstone-views/vcenter/cloud.yaml' source='vcenter-cloud.yaml'/> + <file filelist='onefrontend' name='/etc/one/sunstone-views/vcenter/groupadmin.yaml' source='vcenter-groupadmin.yaml'/> + <file filelist='onefrontend' name='/etc/one/sunstone-views/vcenter/user.yaml' source='vcenter-user.yaml'/> + + + <file filelist='onefrontend' name='/etc/nginx/sites-available/nebula.conf' source='nginx-nebula.conf'/> + + <service_access service='sunstoneHttps'> + <port>443</port> + </service_access> + <service_restriction service='sunstoneHttps'> + <ip interface='eth0' netmask='netmask_admin_eth0' netmask_type='SymLinkOption' ip_type='SymLinkOption'>ip_admin_eth0</ip> + </service_restriction> + <service_access service='sunstone'> + <port port_type="SymLinkOption">port_sunstone</port> + <port port_type="SymLinkOption">vnc_proxy_port_sunstone</port> + </service_access> + <service_restriction service='sunstone'> + <ip interface='eth0' netmask='netmask_ssh_eth0' netmask_type='SymLinkOption' ip_type='SymLinkOption'>ip_ssh_eth0</ip> + </service_restriction> + </files> + <variables> + <family name='Annuaire'> + <variable name='ldap_nss' redefine='True' hidden='True'/> + </family> + <family name='Services'> + <variable name='activer_onefrontend' type='oui/non' description="Activer l'application web OpenNebula Sunstone" mode="expert"> + <value>oui</value> + </variable> + </family> + <family name='Virtualisation'> + <variable name='sunstone_view_mode' type='string' description='Mode d’affichage par défaut des vues' mode='expert'> + <value>kvm</value> + </variable> + <variable name='sunstone_auth_modes' type='string' description="Modes supplémentaires d'authentification des utilisateurs" mode='expert'/> + <variable name='port_sunstone' type='number' description="Numéro de port d'écoute" mode="expert" hidden='True'> + <value>9000</value> + </variable> + <variable name='ip_sunstone' type='ip' description="Adresse IP d'écoute" mandatory="True" mode="expert"/> + <variable name='vnc_proxy_port_sunstone' type='number' description="Numéro de port d'écoute du proxy VNC" mode='expert'> + <value>29876</value> + </variable> + <variable name='langue_sunstone' type='string' description="Langue par défaut" mode='expert' mandatory="True"> + <value>fr_FR</value> + </variable> + <variable name='sunstone_logo' type='string' description="Logo pour l'interface Sunstone" mode='expert'> + <value>opennebula-sunstone-v4.0.png</value> + </variable> + </family> + <separators> + <separator name='sunstone_view_mode'>Configuration du l'application web OpenNebula Sunstone</separator> + </separators> + </variables> + + <constraints> + <check name='valid_enum' target='sunstone_view_mode'> + <param>['kvm', 'mixed', 'vcenter']</param> + </check> + + <fill name='calc_val' target='ip_sunstone'> + <param type='eole' name='valeur'>adresse_ip_eth0</param> + </fill> + <check name='valid_enum' target='sunstone_auth_modes'> + <param>['', 'ldap']</param> + </check> + + <auto name='calc_multi_condition' target='activer_client_ldap'> + <param>ldap</param> + <param type='eole' name='condition_1'>sunstone_auth_modes</param> + <param name='match'>distant</param> + <param name='mismatch'>non</param> + </auto> + + <condition name='disabled_if_in' source='activer_onefrontend'> + <param>non</param> + <target type='filelist'>onefrontend</target> + <target type='variable'>port_sunstone</target> + <target type='variable'>vnc_proxy_port_sunstone</target> + <target type='variable'>ip_sunstone</target> + <target type='variable'>langue_sunstone</target> + <target type='variable'>sunstone_logo</target> + </condition> + + </constraints> + <help> + <variable name='sunstone_view_mode'>Utiliser l’un des types de vues par défaut en fonction de l’hyperviseur</variable> + <variable name='port_sunstone'>Numéro de port d'écoute d'OpenNebula Sunstone</variable> + <variable name='vnc_proxy_port_sunstone'>Numéro de port d'écoute du proxy VNC (novnc)</variable> + <variable name='ip_sunstone'>Adresse IP d'écoute pour OpenNebula Sunstone</variable> + <variable name='langue_sunstone'>Langue par défaut de l'interface OpenNebula Sunstone</variable> + </help> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/files/etc/systemd/system/opennebula-sunstone.service.d/one-dep.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/files/etc/systemd/system/opennebula-sunstone.service.d/one-dep.conf new file mode 100644 index 0000000000000000000000000000000000000000..c0f039a33708f21ed5e5791840e3fdce0b960f0f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/files/etc/systemd/system/opennebula-sunstone.service.d/one-dep.conf @@ -0,0 +1,3 @@ +[Unit] +After=multi-user.target +After=opennebula.service diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/posttemplates/02-nebula-nginx b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/posttemplates/02-nebula-nginx new file mode 100644 index 0000000000000000000000000000000000000000..5edf3f2bc3972d04f7771edd02bca8f01136be27 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/posttemplates/02-nebula-nginx @@ -0,0 +1,14 @@ +#!/bin/bash + +ENABLE=$(CreoleGet activer_onefrontend 'non') +CONF_FILE='nebula.conf' + +if [ -L /etc/nginx/sites-enabled/${CONF_FILE} ];then + rm /etc/nginx/sites-enabled/${CONF_FILE} +fi +if [ -L /etc/nginx/sites-enabled/eoleapps.conf ];then + rm /etc/nginx/sites-enabled/eoleapps.conf +fi +if [ "${ENABLE}" = 'oui' ];then + ln -s /etc/nginx/sites-available/${CONF_FILE} /etc/nginx/sites-enabled/${CONF_FILE} +fi diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/posttemplates/02-nebula-novnc b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/posttemplates/02-nebula-novnc new file mode 100644 index 0000000000000000000000000000000000000000..8e474412ac7f539bb67f4df8595b997fc8021fca --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/posttemplates/02-nebula-novnc @@ -0,0 +1,15 @@ +#!/bin/bash + +########### +## novnc ## +########### + +. /usr/lib/eole/utils.sh + +# Install ssl files +user=$(systemctl -p Group show --value opennebula-novnc) +group=$(systemctl -p User show --value opennebula-novnc) +novnc_conf_dir="/etc/one" +InstallSSLFiles novnc $user $group ${novnc_conf_dir}/ssl root + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..604582e0e691a62d37a1a19e3aa1d3042f40cc3d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/service.yml @@ -0,0 +1,50 @@ +format: '0.1' +name: eole-one-frontend +version: |- + 2.7.1-1 +description: |- + Dictionnaires et templates pour configurer OpenNebula Sunstone + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: + - eole-client-annuaire +packages: + - opennebula-sunstone + - ruby-net-ldap + - python-numpy + - ruby-dalli + - memcached +dictionaries: + - 99_one-frontend.xml +extra_dictionaries: {} +templates: + - kvm-admin.yaml + - kvm-cloud.yaml + - kvm-groupadmin.yaml + - kvm-user.yaml + - mixed-admin.yaml + - mixed-cloud.yaml + - mixed-groupadmin.yaml + - mixed-user.yaml + - nginx-nebula.conf + - sunstone-logos.yaml + - sunstone-server.conf + - vcenter-admin.yaml + - vcenter-cloud.yaml + - vcenter-groupadmin.yaml + - vcenter-user.yaml +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: + - 02-nebula-nginx + - 02-nebula-novnc +files: + /etc/systemd/system/opennebula-sunstone.service.d/one-dep.conf: + owner: root + group: root + mode: '0644' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/templates/kvm-admin.yaml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/templates/kvm-admin.yaml new file mode 100644 index 0000000000000000000000000000000000000000..389127ba97bb13960a4656cb81c802da4d985a8d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/templates/kvm-admin.yaml @@ -0,0 +1,858 @@ +%set oneflow = %%getVar('activer_oneflow','non') == 'oui' +small_logo: images/opennebula-5.0.png +provision_logo: images/opennebula-5.0.png +link_logo: +text_link_logo: +confirm_vms: false +filter-view: true +enabled_tabs: + - dashboard-tab + - instances-top-tab + - vms-tab +%if %%oneflow + - oneflow-services-tab +%end if + - vrouters-tab + - templates-top-tab + - templates-tab +%if %%oneflow + - oneflow-templates-tab +%end if + - vrouter-templates-tab + - storage-top-tab + - datastores-tab + - images-tab + - files-tab + - marketplaces-tab + - marketplaceapps-tab + - network-top-tab + - vnets-tab + - vnets-topology-tab + - secgroups-tab + - infrastructure-top-tab + - clusters-tab + - hosts-tab + - zones-tab + - system-top-tab + - users-tab + - groups-tab + - vdcs-tab + - acls-tab + - settings-tab + # Do not enable external checking + # - support-tab + # - upgrade-top-tab + - vmgroup-tab +features: + # True to show showback monthly reports, and VM cost + showback: true + + # Allows to change the security groups for each network interface + # on the VM creation dialog + secgroups: true + + # True to hide the CPU setting in the VM creation dialog + instantiate_hide_cpu: false + + # False to not scale the CPU. Number to scale from VCPU + instantiate_cpu_factor: false + + # True to show the option to make an instance persistent + instantiate_persistent: true + + # True to show the datastore datatable to instantiate VM + show_ds_instantiate: true + + # True to show the vmgroup datatable to instantiate VM + show_vmgroup_instantiate: true + + # True to show the vnet datatable to instantiate VM + show_vnet_instantiate: true + + # True to show the host datatable to instantiate VM + show_host_instantiate: true + + # True to show an input to specify the the VMs and Template path/folder where a vCenter VM will + # deployed to + vcenter_vm_folder: false + + # True to show the monitoring info (VM & VRouters) + show_monitoring_info: true + + # True to show the attributes info (VM & VRouters) + show_attributes_info: true + + # True to show the user datatable to instantiate VM + show_as_uid_instantiate: true + + # True to show the group datatable to instantiate VM + show_as_gid_instantiate: true +tabs: + dashboard-tab: + # The following widgets can be used inside any of the '_per_row' settings + # bellow. As the name suggest, the widgets will be scaled to fit one, + # two, or three per row. The footer uses the widgets at full size, i.e. + # one per row. + # + # - storage + # - users + # - network + # - hosts + # - vms + # - groupquotas + # - quotas + panel_tabs: + actions: + Dashboard.refresh: false + Sunstone.toggle_top: false + widgets_one_per_row: + - hosts + widgets_three_per_row: + widgets_two_per_row: + - vms + - users + - storage + - network + widgets_one_footer: + system-top-tab: + panel_tabs: + actions: + users-tab: + panel_tabs: + user_info_tab: true + user_quotas_tab: true + user_groups_tab: true + user_accounting_tab: true + user_showback_tab: true + user_auth_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Group + - 4 # Auth driver + #- 5 # Password + - 6 # VMs + - 7 # Memory + - 8 # CPU + #- 9 # Group ID + #- 10 # Hidden User Data + #- 11 # Labels + #- 12 # Search data + actions: + User.refresh: true + User.create_dialog: true + User.update_password: true + User.login_token: true + User.quotas_dialog: true + User.groups_dialog: true + User.chgrp: true + User.change_authentication: true + User.delete: true + User.edit_labels: true + User.menu_labels: true + groups-tab: + panel_tabs: + group_info_tab: true + group_users_tab: true + group_quotas_tab: true + group_accounting_tab: true + group_showback_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Users + - 4 # VMs + - 5 # Memory + - 6 # CPU + #- 7 # Labels + actions: + Group.refresh: true + Group.create_dialog: true + Group.update_dialog: true + Group.quotas_dialog: true + Group.delete: true + Group.edit_admins: true + Group.edit_labels: true + Group.menu_labels: true + vdcs-tab: + panel_tabs: + vdc_info_tab: true + vdc_groups_tab: true + vdc_resources_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Groups + - 4 # Clusters + - 5 # Hosts + - 6 # VNets + - 7 # Datastores + #- 8 # Labels + actions: + Vdc.refresh: true + Vdc.create_dialog: true + Vdc.update_dialog: true + Vdc.rename: true + Vdc.delete: true + Vdc.edit_labels: true + Vdc.menu_labels: true + acls-tab: + panel_tabs: + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Applies to + - 3 # Affected resources + - 4 # Resource ID / Owned by + - 5 # Allowed operations + - 6 # Zone + #- 7 # ACL String + actions: + Acl.refresh: true + Acl.create_dialog: true + Acl.delete: true + templates-top-tab: + panel_tabs: + actions: + templates-tab: + panel_tabs: + template_info_tab: true + template_template_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # Registration time + #- 6 # Labels + #- 7 # Search data + actions: + Template.refresh: true + Template.create_dialog: true + Template.import_dialog: false + Template.update_dialog: true + Template.instantiate_vms: true + Template.rename: true + Template.chown: true + Template.chgrp: true + Template.chmod: true + Template.clone_dialog: true + Template.delete_dialog: true + Template.share: true + Template.unshare: true + Template.edit_labels: true + Template.menu_labels: true + template_creation_tabs: + general: true + storage: true + network: true + os_booting: true + features: true + input_output: true + context: true + actions: true + scheduling: true + hybrid: true + vmgroup: true + other: true + oneflow-templates-tab: + panel_tabs: + service_template_info_tab: true + service_template_roles_tab: true + service_template_template_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + #- 5 # Labels + #- 6 # Search data + actions: + ServiceTemplate.refresh: true + ServiceTemplate.create_dialog: true + ServiceTemplate.update_dialog: true + ServiceTemplate.instantiate: true + ServiceTemplate.chown: true + ServiceTemplate.chgrp: true + ServiceTemplate.chmod: true + ServiceTemplate.rename: true + ServiceTemplate.clone_dialog: true + ServiceTemplate.delete: true + ServiceTemplate.edit_labels: true + ServiceTemplate.menu_labels: true + vrouter-templates-tab: + panel_tabs: + vrouter_template_info_tab: true + vrouter_template_template_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # Registration time + #- 6 # Labels + #- 7 # Search data + actions: + VirtualRouterTemplate.refresh: true + VirtualRouterTemplate.create_dialog: true + VirtualRouterTemplate.update_dialog: true + VirtualRouterTemplate.instantiate_dialog: true + VirtualRouterTemplate.rename: true + VirtualRouterTemplate.chown: true + VirtualRouterTemplate.chgrp: true + VirtualRouterTemplate.chmod: true + VirtualRouterTemplate.clone_dialog: true + VirtualRouterTemplate.delete_dialog: true + VirtualRouterTemplate.share: true + VirtualRouterTemplate.unshare: true + VirtualRouterTemplate.edit_labels: true + VirtualRouterTemplate.menu_labels: true + template_creation_tabs: + general: true + storage: true + network: true + os_booting: true + features: true + input_output: true + context: true + scheduling: true + hybrid: true + other: true + instances-top-tab: + panel_tabs: + actions: + vms-tab: + panel_tabs: + vm_info_tab: true + vm_capacity_tab: true + vm_storage_tab: true + vm_network_tab: true + vm_snapshot_tab: true + vm_placement_tab: true + vm_actions_tab: true + vm_conf_tab: true + vm_template_tab: true + vm_log_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # Status + #- 6 # Used CPU + #- 7 # Used Memory + - 8 # Host + - 9 # IPs + #- 10 # Start Time + - 11 # VNC + #- 12 # Hidden Template + #- 13 # Labels + #- 14 # Search data + actions: + VM.refresh: true + VM.create_dialog: true + VM.rename: true + VM.chown: true + VM.chgrp: true + VM.chmod: true + VM.deploy: true + VM.migrate: true + VM.migrate_live: true + VM.hold: true + VM.release: true + VM.suspend: true + VM.resume: true + VM.stop: true + VM.recover: true + VM.reboot: true + VM.reboot_hard: true + VM.poweroff: true + VM.poweroff_hard: true + VM.undeploy: true + VM.undeploy_hard: true + VM.terminate: true + VM.terminate_hard: true + VM.resize: true + VM.disk_resize: true + VM.attachdisk: true + VM.detachdisk: true + VM.disk_saveas: true + VM.attachnic: true + VM.detachnic: true + VM.snapshot_create: true + VM.snapshot_revert: true + VM.snapshot_delete: true + VM.disk_snapshot_create: true + VM.disk_snapshot_revert: true + VM.disk_snapshot_delete: true + VM.resched: true + VM.unresched: true + VM.save_as_template: true + VM.updateconf: true + VM.edit_labels: true + VM.menu_labels: true + oneflow-services-tab: + panel_tabs: + service_info_tab: true + service_roles_tab: true + service_log_tab: true + panel_tabs_actions: + service_roles_tab: + Role.scale: true + Role.hold: true + Role.release: true + Role.suspend: true + Role.resume: true + Role.stop: true + Role.reboot: true + Role.reboot_hard: true + Role.poweroff: true + Role.poweroff_hard: true + Role.undeploy: true + Role.undeploy_hard: true + Role.terminate: true + Role.terminate_hard: true + RoleVM.hold: true + RoleVM.release: true + RoleVM.suspend: true + RoleVM.resume: true + RoleVM.stop: true + RoleVM.reboot: true + RoleVM.reboot_hard: true + RoleVM.poweroff: true + RoleVM.poweroff_hard: true + RoleVM.undeploy: true + RoleVM.undeploy_hard: true + RoleVM.terminate: true + RoleVM.terminate_hard: true + RoleVM.resched: true + RoleVM.unresched: true + RoleVM.recover: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # State + #- 6 # Labels + #- 7 # Search data + actions: + Service.refresh: true + Service.create_dialog: true + Service.chown: true + Service.chgrp: true + Service.chmod: true + Service.rename: true + Service.shutdown: true + Service.recover: true + Service.delete: true + Service.edit_labels: true + Service.menu_labels: true + vrouters-tab: + panel_tabs: + virtual_router_info_tab: true + virtual_router_vms_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Owner + - 3 # Group + - 4 # Name + #- 5 # Labels + #- 6 # Search data + actions: + VirtualRouter.refresh: true + VirtualRouter.create_dialog: true + VirtualRouter.rename: true + VirtualRouter.chown: true + VirtualRouter.chgrp: true + VirtualRouter.chmod: true + VirtualRouter.delete: true + VirtualRouter.attachnic: true + VirtualRouter.detachnic: true + VirtualRouter.edit_labels: true + VirtualRouter.menu_labels: true + infrastructure-top-tab: + panel_tabs: + actions: + clusters-tab: + panel_tabs: + cluster_info_tab: true + cluster_host_tab: true + cluster_vnet_tab: true + cluster_datastore_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Hosts + - 4 # VNets + - 5 # Datastores + #- 6 # Labels + actions: + Cluster.refresh: true + Cluster.create_dialog: true + Cluster.update_dialog: true + Cluster.delete: true + Cluster.rename: true + Cluster.edit_labels: true + Cluster.menu_labels: true + hosts-tab: + panel_tabs: + host_info_tab: true + host_monitoring_tab: true + host_vms_tab: true + host_wilds_tab: true + host_zombies_tab: true + host_esx_tab: true + host_pci_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Cluster + - 4 # RVMs + #- 5 # Real CPU + - 6 # Allocated CPU + #- 7 # Real MEM + - 8 # Allocated MEM + - 9 # Status + #- 10 # IM MAD + #- 11 # VM MAD + #- 12 # Last monitored on + #- 13 # Labels + #- 14 # Search data + actions: + Host.refresh: true + Host.create_dialog: true + Host.addtocluster: true + Host.rename: true + Host.enable: true + Host.disable: true + Host.offline: true + Host.delete: true + Host.edit_labels: true + Host.menu_labels: true + zones-tab: + panel_tabs: + zone_info_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Endpoint + #- 4 # Labels + actions: + Zone.refresh: true + Zone.create_dialog: true + Zone.rename: true + Zone.delete: true + Zone.edit_labels: true + Zone.menu_labels: true + storage-top-tab: + panel_tabs: + actions: + datastores-tab: + panel_tabs: + datastore_info_tab: true + datastore_image_tab: true + datastore_clusters_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # Capacity + - 6 # Cluster + #- 7 # Basepath + #- 8 # TM + #- 9 # DS + - 10 # Type + - 11 # Status + #- 12 # Labels + #- 13 # Search data + actions: + Datastore.refresh: true + Datastore.create_dialog: true + Datastore.import_dialog: false + Datastore.addtocluster: true + Datastore.rename: true + Datastore.chown: true + Datastore.chgrp: true + Datastore.chmod: true + Datastore.delete: true + Datastore.enable: true + Datastore.disable: true + Datastore.edit_labels: true + Datastore.menu_labels: true + images-tab: + panel_tabs: + image_info_tab: true + image_vms_tab: true + image_snapshots_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # Datastore + #- 6 # Size + - 7 # Type + #- 8 # Registration time + #- 9 # Persistent + - 10 # Status + - 11 # #VMs + #- 12 # Target + #- 13 # Labels + #- 14 # Search data + actions: + Image.refresh: true + Image.create_dialog: true + Image.import_dialog: false + Image.upload_marketplace_dialog: true + Image.rename: true + Image.chown: true + Image.chgrp: true + Image.chmod: true + Image.enable: true + Image.disable: true + Image.persistent: true + Image.nonpersistent: true + Image.clone_dialog: true + Image.delete: true + Image.snapshot_flatten: true + Image.snapshot_revert: true + Image.snapshot_delete: true + Image.edit_labels: true + Image.menu_labels: true + files-tab: + panel_tabs: + file_info_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # Datastore + #- 6 # Size + - 7 # Type + #- 8 # Registration time + #- 9 # Persistent + - 10 # Status + #- 11 # #VMs + #- 12 # Target + #- 13 # Labels + #- 14 # Search data + actions: + File.refresh: true + File.create_dialog: true + File.rename: true + File.chown: true + File.chgrp: true + File.chmod: true + File.enable: true + File.disable: true + File.delete: true + File.edit_labels: true + File.menu_labels: true + marketplaces-tab: + panel_tabs: + marketplace_info_tab: true + marketplace_apps_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # Capacity + - 6 # Apps + - 7 # Driver + - 8 # Zone + #- 9 # Labels + #- 10 # Search data + actions: + MarketPlace.refresh: true + MarketPlace.create_dialog: true + MarketPlace.update_dialog: true + MarketPlace.rename: true + MarketPlace.chown: true + MarketPlace.chgrp: true + MarketPlace.chmod: true + MarketPlace.delete: true + MarketPlace.edit_labels: true + MarketPlace.menu_labels: true + marketplaceapps-tab: + panel_tabs: + marketplaceapp_info_tab: true + marketplaceapp_templates_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + #- 5 # Version + - 6 # Size + - 7 # State + #- 8 # Type + - 9 # Registration + - 10 # Marketplace + - 11 # Zone + #- 12 # Labels + #- 13 # Search data + actions: + MarketPlaceApp.refresh: true + MarketPlaceApp.create_dialog: true + MarketPlaceApp.download_opennebula_dialog: true + MarketPlaceApp.download_local: true + MarketPlaceApp.rename: true + MarketPlaceApp.chown: true + MarketPlaceApp.chgrp: true + MarketPlaceApp.chmod: true + MarketPlaceApp.enable: true + MarketPlaceApp.disable: true + MarketPlaceApp.delete: true + MarketPlaceApp.edit_labels: true + MarketPlaceApp.menu_labels: true + network-top-tab: + panel_tabs: + actions: + vnets-tab: + panel_tabs: + vnet_info_tab: true + vnet_ar_list_tab: true + vnet_leases_tab: true + vnet_sg_list_tab: true + vnet_vr_list_tab: true + vnet_clusters_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # Reservation + - 6 # Cluster + #- 7 # Bridge + - 8 # Leases + #- 9 # VLAN ID + #- 10 # Labels + #- 11 # Search data + actions: + Network.refresh: true + Network.create_dialog: true + Network.import_dialog: false + Network.update_dialog: true + Network.reserve_dialog: true + Network.addtocluster: true + Network.rename: true + Network.chown: true + Network.chgrp: true + Network.chmod: true + Network.delete: true + Network.hold_lease: true + Network.release_lease: true + Network.add_ar: true + Network.remove_ar: true + Network.update_ar: true + Network.edit_labels: true + Network.menu_labels: true + vnets-topology-tab: + panel_tabs: + actions: + NetworkTopology.refresh: true + NetworkTopology.fit: true + NetworkTopology.collapseVMs: true + NetworkTopology.openVMs: true + secgroups-tab: + panel_tabs: + security_group_info_tab: true + security_group_vms_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + #- 5 # Labels + #- 6 # Search data + actions: + SecurityGroup.refresh: true + SecurityGroup.create_dialog: true + SecurityGroup.update_dialog: true + SecurityGroup.rename: true + SecurityGroup.chown: true + SecurityGroup.chgrp: true + SecurityGroup.chmod: true + SecurityGroup.clone_dialog: true + SecurityGroup.commit_dialog: true + SecurityGroup.delete: true + SecurityGroup.edit_labels: true + SecurityGroup.menu_labels: true + support-tab: + panel_tabs: + support_info_tab: true + table_columns: + #- 0 # Checkbox + - 1 # ID + - 2 # Subject + - 3 # Created at + - 4 # Status + actions: + Support.refresh: true + Support.create_dialog: true + settings-tab: + panel_tabs: + settings_info_tab: true + settings_config_tab: false + settings_quotas_tab: true + settings_group_quotas_tab: true + settings_accounting_tab: true + settings_showback_tab: true + settings_auth_tab: true + actions: + # Buttons for settings_info_tab + User.update_password: true + User.login_token: true + # Buttons for settings_config_tab + Settings.change_language: true + Settings.change_password: true + Settings.change_view: true + Settings.ssh_key: true + Settings.login_token: true + # Edit button in settings_quotas_tab + User.quotas_dialog: false + upgrade-top-tab: + panel_tabs: + actions: + vmgroup-tab: + panel_tabs: + vm_group_info_tab: true + vm_group_vms_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # Vms + #- 6 # Labels + #- 7 # Search data + actions: + VMGroup.create_dialog: true + VMGroup.update_dialog: true + VMGroup.chmod: true + VMGroup.chown: true + VMGroup.chgrp: true diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/templates/kvm-cloud.yaml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/templates/kvm-cloud.yaml new file mode 100644 index 0000000000000000000000000000000000000000..98280b1c7d4f5508e1efe0392661eea4aa1b3f6f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/templates/kvm-cloud.yaml @@ -0,0 +1,190 @@ +%set oneflow = %%getVar('activer_oneflow','non') == 'oui' +provision_logo: images/opennebula-5.0.png +link_logo: +text_link_logo: +confirm_vms: false +enabled_tabs: + - provision-tab + - settings-tab +features: + # True to show showback monthly reports, and VM cost + showback: true + + # Allows to change the security groups for each network interface + # on the VM creation dialog + secgroups: true + + # True to hide the CPU setting in the VM creation dialog + instantiate_hide_cpu: false + + # False to not scale the CPU. Number to scale from VCPU + instantiate_cpu_factor: false + + # True to show the option to make an instance persistent + instantiate_persistent: true + + # True to allow to create machines to cloud users + cloud_vm_create: true + + # True to show the monitoring info (VM & VRouters) + show_monitoring_info: true + + # True to show the attributes info (VM & VRouters) + show_attributes_info: true + + # True to show the vCenter info (VM & VRouters) + show_vcenter_info: true +tabs: + provision-tab: + panel_tabs: + vm_info_tab: false + vm_capacity_tab: true + vm_storage_tab: true + vm_network_tab: true + vm_snapshot_tab: true + vm_placement_tab: false + vm_actions_tab: true + vm_conf_tab: false + vm_template_tab: false + vm_log_tab: false + provision_tabs: +%if %%oneflow + flows: true +%else + flows: false +%end if + templates: true + actions: &provisionactions + # In the cloud view, delete is the equivalent + # of 'onetemplate chmod --recursive' + Template.chmod: false + + # In the cloud view, delete is the equivalent + # of 'onetemplate delete --recursive' + Template.delete: true + VM.rename: true + VM.resume: true + VM.reboot: true + VM.reboot_hard: true + VM.poweroff: true + VM.poweroff_hard: true + VM.undeploy: false + VM.undeploy_hard: false + VM.terminate: true + VM.terminate_hard: true + VM.resize: true + VM.disk_resize: true + VM.attachdisk: true + VM.detachdisk: true + VM.disk_saveas: true + VM.attachnic: true + VM.detachnic: true + VM.snapshot_create: true + VM.snapshot_revert: true + VM.snapshot_delete: true + VM.disk_snapshot_create: true + VM.disk_snapshot_revert: true + VM.disk_snapshot_delete: true + VM.save_as_template: true + dashboard: + # Connected user's quotas + quotas: true + # Overview of connected user's VMs + vms: true + # Group's quotas + groupquotas: false + # Overview of group's VMs + groupvms: false + create_vm: + # True to allow capacity (CPU, MEMORY, VCPU) customization + capacity_select: true + # True to allow NIC customization + network_select: true + # True to allow vmgroup customization + vmgroup_select: true + # True to allow DISK size customization + disk_resize: true + # True to allow datastore customization + datastore_select: true + settings-tab: + panel_tabs: + settings_info_tab: false + settings_config_tab: true + settings_quotas_tab: true + settings_accounting_tab: true + settings_showback_tab: true + actions: + # Buttons for settings_info_tab + User.update_password: true + User.login_token: true + # Buttons for settings_config_tab + Settings.change_language: true + Settings.change_password: true + Settings.change_view: true + Settings.ssh_key: true + Settings.login_token: true + # Edit button in settings_quotas_tab + User.quotas_dialog: false + vms-tab: + actions: *provisionactions + images-tab: + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Onwer + - 4 # Group + - 5 # Datastore + #- 6 # Size + - 7 # Type + #- 8 # Registration time + #- 9 # Persistent + - 10 # Status + - 11 # #VMs + #- 12 # Target + vnets-tab: + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + #- 3 # Owner + - 4 # Group + #- 5 # Reservation + #- 6 # Cluster + #- 7 # Bridge + #- 8 # Leases + #- 9 # VLAN ID + secgroups-tab: + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + #- 3 # Owner + - 4 # Group + #- 5 # Labels + vmgroup-tab: + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # Vms + #- 6 # Labels + #- 7 # Search data + datastores-tab: + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + #- 5 # Capacity + #- 6 # Cluster + #- 7 # Basepath + #- 8 # TM + #- 9 # DS + #- 10 # Type + - 11 # Status + #- 12 # Labels + #- 13 # Search data diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/templates/kvm-groupadmin.yaml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/templates/kvm-groupadmin.yaml new file mode 100644 index 0000000000000000000000000000000000000000..bd25b384c3bed0ff63e4c7fb3fb437b5062bec4e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/templates/kvm-groupadmin.yaml @@ -0,0 +1,856 @@ +%set oneflow = %%getVar('activer_oneflow','non') == 'oui' +small_logo: images/opennebula-5.0.png +provision_logo: images/opennebula-5.0.png +link_logo: +text_link_logo: +confirm_vms: false +filter-view: true +enabled_tabs: + - dashboard-tab + - instances-top-tab + - vms-tab +%if %%oneflow + - oneflow-services-tab +%end if + - vrouters-tab + - templates-top-tab + - templates-tab +%if %%oneflow + - oneflow-templates-tab +%end if + - vrouter-templates-tab + #- storage-top-tab + #- datastores-tab + #- images-tab + #- files-tab + #- marketplaces-tab + #- marketplaceapps-tab + - network-top-tab + - vnets-tab + - vnets-topology-tab + - secgroups-tab + #- infrastructure-top-tab + #- clusters-tab + #- hosts-tab + #- zones-tab + - system-top-tab + - users-tab + - groups-tab + #- vdcs-tab + #- acls-tab + - settings-tab + #- support-tab + #- upgrade-top-tab + - vmgroup-tab +features: + # True to show showback monthly reports, and VM cost + showback: true + + # Allows to change the security groups for each network interface + # on the VM creation dialog + secgroups: true + + # True to hide the CPU setting in the VM creation dialog + instantiate_hide_cpu: false + + # False to not scale the CPU. Number to scale from VCPU + instantiate_cpu_factor: false + + # True to show the option to make an instance persistent + instantiate_persistent: true + + # True to show the datastore datatable to instantiate VM + show_ds_instantiate: false + + # True to show the vmgroup datatable to instantiate VM + show_vmgroup_instantiate: true + + # True to show the vnet datatable to instantiate VM + show_vnet_instantiate: true + + # True to show the host datatable to instantiate VM + show_host_instantiate: false + + # True to show an input to specify the the VMs and Template path/folder where a vCenter VM will + # deployed to + vcenter_vm_folder: false + + # True to show the monitoring info (VM & VRouters) + show_monitoring_info: true + + # True to show the attributes info (VM & VRouters) + show_attributes_info: true + + # True to show the user datatable to instantiate VM + show_as_uid_instantiate: true + + # True to show the group datatable to instantiate VM + show_as_gid_instantiate: true +tabs: + dashboard-tab: + # The following widgets can be used inside any of the '_per_row' settings + # bellow. As the name suggest, the widgets will be scaled to fit one, + # two, or three per row. The footer uses the widgets at full size, i.e. + # one per row. + # + # - storage + # - users + # - network + # - hosts + # - vms + # - groupquotas + # - quotas + panel_tabs: + actions: + Dashboard.refresh: false + Sunstone.toggle_top: false + widgets_one_per_row: + widgets_three_per_row: + widgets_two_per_row: + - vms + - users + - groupquotas + - quotas + widgets_one_footer: + system-top-tab: + panel_tabs: + actions: + users-tab: + panel_tabs: + user_info_tab: true + user_quotas_tab: true + user_groups_tab: true + user_accounting_tab: true + user_showback_tab: true + user_auth_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + #- 3 # Group + #- 4 # Auth driver + #- 5 # Password + - 6 # VMs + - 7 # Memory + - 8 # CPU + #- 9 # Group ID + #- 10 # Hidden User Data + #- 11 # Labels + #- 12 # Search data + actions: + User.refresh: true + User.create_dialog: true + User.update_password: true + User.login_token: true + User.quotas_dialog: true + User.groups_dialog: false + User.chgrp: false + User.change_authentication: false + User.delete: true + User.edit_labels: true + User.menu_labels: true + groups-tab: + panel_tabs: + group_info_tab: true + group_users_tab: true + group_quotas_tab: true + group_accounting_tab: true + group_showback_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Users + - 4 # VMs + - 5 # Memory + - 6 # CPU + #- 7 # Labels + actions: + Group.refresh: true + Group.create_dialog: false + Group.update_dialog: false + Group.quotas_dialog: false + Group.delete: false + Group.edit_admins: false + Group.edit_labels: true + Group.menu_labels: true + vdcs-tab: + panel_tabs: + vdc_info_tab: true + vdc_groups_tab: true + vdc_resources_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Groups + - 4 # Clusters + - 5 # Hosts + - 6 # VNets + - 7 # Datastores + #- 8 # Labels + actions: + Vdc.refresh: true + Vdc.create_dialog: true + Vdc.update_dialog: true + Vdc.rename: true + Vdc.delete: true + Vdc.edit_labels: true + Vdc.menu_labels: true + acls-tab: + panel_tabs: + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Applies to + - 3 # Affected resources + - 4 # Resource ID / Owned by + - 5 # Allowed operations + - 6 # Zone + #- 7 # ACL String + actions: + Acl.refresh: true + Acl.create_dialog: true + Acl.delete: true + templates-top-tab: + panel_tabs: + actions: + templates-tab: + panel_tabs: + template_info_tab: true + template_template_tab: false + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # Registration time + #- 6 # Labels + #- 7 # Search data + actions: + Template.refresh: true + Template.create_dialog: false + Template.import_dialog: false + Template.update_dialog: false + Template.instantiate_vms: true + Template.rename: true + Template.chown: true + Template.chgrp: false + Template.chmod: false + Template.clone_dialog: true + Template.delete_dialog: true + Template.share: true + Template.unshare: true + Template.edit_labels: true + Template.menu_labels: true + template_creation_tabs: + general: true + storage: true + network: true + os_booting: true + features: true + input_output: true + context: true + actions: true + scheduling: true + hybrid: true + vmgroup: true + other: true + oneflow-templates-tab: + panel_tabs: + service_template_info_tab: true + service_template_roles_tab: true + service_template_template_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + #- 5 # Labels + #- 6 # Search data + actions: + ServiceTemplate.refresh: true + ServiceTemplate.create_dialog: false + ServiceTemplate.update_dialog: false + ServiceTemplate.instantiate: true + ServiceTemplate.chown: false + ServiceTemplate.chgrp: false + ServiceTemplate.chmod: false + ServiceTemplate.rename: false + ServiceTemplate.clone_dialog: false + ServiceTemplate.delete: false + ServiceTemplate.edit_labels: true + ServiceTemplate.menu_labels: true + vrouter-templates-tab: + panel_tabs: + vrouter_template_info_tab: true + vrouter_template_template_tab: false + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # Registration time + #- 6 # Labels + #- 7 # Search data + actions: + VirtualRouterTemplate.refresh: true + VirtualRouterTemplate.create_dialog: false + VirtualRouterTemplate.update_dialog: false + VirtualRouterTemplate.instantiate_dialog: false + VirtualRouterTemplate.rename: true + VirtualRouterTemplate.chown: true + VirtualRouterTemplate.chgrp: false + VirtualRouterTemplate.chmod: false + VirtualRouterTemplate.clone_dialog: true + VirtualRouterTemplate.delete_dialog: true + VirtualRouterTemplate.share: true + VirtualRouterTemplate.unshare: true + VirtualRouterTemplate.edit_labels: true + VirtualRouterTemplate.menu_labels: true + template_creation_tabs: + general: true + storage: true + network: true + os_booting: true + features: true + input_output: true + context: true + scheduling: true + hybrid: true + other: true + instances-top-tab: + panel_tabs: + actions: + vms-tab: + panel_tabs: + vm_info_tab: true + vm_capacity_tab: true + vm_storage_tab: true + vm_network_tab: true + vm_snapshot_tab: false + vm_placement_tab: false + vm_actions_tab: false + vm_conf_tab: false + vm_template_tab: false + vm_log_tab: false + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + #- 3 # Owner + - 4 # Group + - 5 # Status + #- 6 # Used CPU + #- 7 # Used Memory + #- 8 # Host + - 9 # IPs + #- 10 # Start Time + - 11 # VNC + #- 12 # Hidden Template + #- 13 # Labels + #- 14 # Search data + actions: + VM.refresh: true + VM.create_dialog: true + VM.rename: true + VM.chown: true + VM.chgrp: false + VM.chmod: false + VM.deploy: false + VM.migrate: false + VM.migrate_live: false + VM.hold: true + VM.release: true + VM.suspend: false + VM.resume: true + VM.stop: false + VM.recover: false + VM.reboot: true + VM.reboot_hard: true + VM.poweroff: true + VM.poweroff_hard: true + VM.undeploy: true + VM.undeploy_hard: true + VM.terminate: true + VM.terminate_hard: true + VM.resize: false + VM.attachdisk: false + VM.detachdisk: false + VM.disk_saveas: false + VM.disk_resize: false + VM.attachnic: false + VM.detachnic: false + VM.snapshot_create: false + VM.snapshot_revert: false + VM.snapshot_delete: false + VM.disk_snapshot_create: false + VM.disk_snapshot_revert: false + VM.disk_snapshot_delete: false + VM.resched: false + VM.unresched: false + VM.save_as_template: true + VM.updateconf: false + VM.edit_labels: true + VM.menu_labels: true + oneflow-services-tab: + panel_tabs: + service_info_tab: true + service_roles_tab: true + service_log_tab: true + panel_tabs_actions: + service_roles_tab: + Role.scale: true + Role.hold: true + Role.release: true + Role.suspend: false + Role.resume: true + Role.stop: false + Role.reboot: true + Role.reboot_hard: true + Role.poweroff: true + Role.poweroff_hard: true + Role.undeploy: true + Role.undeploy_hard: true + Role.terminate: true + Role.terminate_hard: true + RoleVM.hold: true + RoleVM.release: true + RoleVM.suspend: false + RoleVM.resume: true + RoleVM.stop: false + RoleVM.reboot: true + RoleVM.reboot_hard: true + RoleVM.poweroff: true + RoleVM.poweroff_hard: true + RoleVM.undeploy: true + RoleVM.undeploy_hard: true + RoleVM.terminate: true + RoleVM.terminate_hard: true + RoleVM.resched: false + RoleVM.unresched: false + RoleVM.recover: false + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + #- 3 # Owner + - 4 # Group + - 5 # State + #- 6 # Labels + #- 7 # Search data + actions: + Service.refresh: true + Service.create_dialog: true + Service.chown: true + Service.chgrp: false + Service.chmod: false + Service.rename: true + Service.shutdown: true + Service.recover: true + Service.delete: true + Service.edit_labels: true + Service.menu_labels: true + vrouters-tab: + panel_tabs: + virtual_router_info_tab: true + virtual_router_vms_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + #- 3 # Owner + - 4 # Group + #- 5 # Labels + #- 6 # Search data + actions: + VirtualRouter.refresh: true + VirtualRouter.create_dialog: true + VirtualRouter.rename: true + VirtualRouter.chown: true + VirtualRouter.chgrp: false + VirtualRouter.chmod: false + VirtualRouter.delete: true + VirtualRouter.attachnic: false + VirtualRouter.detachnic: false + VirtualRouter.edit_labels: true + VirtualRouter.menu_labels: true + infrastructure-top-tab: + panel_tabs: + actions: + clusters-tab: + panel_tabs: + cluster_info_tab: true + cluster_host_tab: true + cluster_vnet_tab: true + cluster_datastore_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Hosts + - 4 # VNets + - 5 # Datastores + #- 6 # Labels + actions: + Cluster.refresh: true + Cluster.create_dialog: true + Cluster.update_dialog: true + Cluster.delete: true + Cluster.rename: true + Cluster.edit_labels: true + Cluster.menu_labels: true + hosts-tab: + panel_tabs: + host_info_tab: true + host_monitoring_tab: true + host_vms_tab: true + host_wilds_tab: true + host_zombies_tab: true + host_esx_tab: true + host_pci_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Cluster + - 4 # RVMs + #- 5 # Real CPU + - 6 # Allocated CPU + #- 7 # Real MEM + - 8 # Allocated MEM + - 9 # Status + #- 10 # IM MAD + #- 11 # VM MAD + #- 12 # Last monitored on + #- 13 # Labels + #- 14 # Search data + actions: + Host.refresh: true + Host.create_dialog: true + Host.addtocluster: true + Host.rename: true + Host.enable: true + Host.disable: true + Host.offline: true + Host.delete: true + Host.edit_labels: true + Host.menu_labels: true + zones-tab: + panel_tabs: + zone_info_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Endpoint + #- 4 # Labels + actions: + Zone.refresh: true + Zone.create_dialog: true + Zone.rename: true + Zone.delete: true + Zone.edit_labels: true + Zone.menu_labels: true + storage-top-tab: + panel_tabs: + actions: + datastores-tab: + panel_tabs: + datastore_info_tab: true + datastore_image_tab: true + datastore_clusters_tab: false + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # Capacity + - 6 # Cluster + #- 7 # Basepath + #- 8 # TM + #- 9 # DS + - 10 # Type + - 11 # Status + #- 12 # Labels + #- 13 # Search data + actions: + Datastore.refresh: true + Datastore.create_dialog: true + Datastore.import_dialog: false + Datastore.addtocluster: true + Datastore.rename: true + Datastore.chown: true + Datastore.chgrp: true + Datastore.chmod: true + Datastore.delete: true + Datastore.enable: true + Datastore.disable: true + Datastore.edit_labels: true + Datastore.menu_labels: true + images-tab: + panel_tabs: + image_info_tab: true + image_vms_tab: true + image_snapshots_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # Datastore + #- 6 # Size + - 7 # Type + #- 8 # Registration time + #- 9 # Persistent + - 10 # Status + - 11 # #VMs + #- 12 # Target + #- 13 # Labels + #- 14 # Search data + actions: + Image.refresh: true + Image.create_dialog: true + Image.import_dialog: false + Image.upload_marketplace_dialog: true + Image.rename: true + Image.chown: true + Image.chgrp: true + Image.chmod: true + Image.enable: true + Image.disable: true + Image.persistent: true + Image.nonpersistent: true + Image.clone_dialog: true + Image.delete: true + Image.snapshot_flatten: true + Image.snapshot_revert: true + Image.snapshot_delete: true + Image.edit_labels: true + Image.menu_labels: true + files-tab: + panel_tabs: + file_info_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # Datastore + #- 6 # Size + - 7 # Type + #- 8 # Registration time + #- 9 # Persistent + - 10 # Status + #- 11 # #VMs + #- 12 # Target + #- 13 # Labels + #- 14 # Search data + actions: + File.refresh: true + File.create_dialog: true + File.rename: true + File.chown: true + File.chgrp: true + File.chmod: true + File.enable: true + File.disable: true + File.delete: true + File.edit_labels: true + File.menu_labels: true + marketplaces-tab: + panel_tabs: + marketplace_info_tab: true + marketplace_apps_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # Capacity + - 6 # Apps + - 7 # Driver + - 8 # Zone + #- 9 # Labels + #- 10 # Search data + actions: + MarketPlace.refresh: true + MarketPlace.create_dialog: true + MarketPlace.update_dialog: true + MarketPlace.rename: true + MarketPlace.chown: true + MarketPlace.chgrp: true + MarketPlace.chmod: true + MarketPlace.delete: true + MarketPlace.edit_labels: true + MarketPlace.menu_labels: true + marketplaceapps-tab: + panel_tabs: + marketplaceapp_info_tab: true + marketplaceapp_templates_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + #- 5 # Version + - 6 # Size + - 7 # State + #- 8 # Type + - 9 # Registration + - 10 # Marketplace + - 11 # Zone + #- 12 # Labels + #- 13 # Search data + actions: + MarketPlaceApp.refresh: true + MarketPlaceApp.create_dialog: true + MarketPlaceApp.download_opennebula_dialog: true + MarketPlaceApp.download_local: true + MarketPlaceApp.rename: true + MarketPlaceApp.chown: true + MarketPlaceApp.chgrp: true + MarketPlaceApp.chmod: true + MarketPlaceApp.enable: true + MarketPlaceApp.disable: true + MarketPlaceApp.delete: true + MarketPlaceApp.edit_labels: true + MarketPlaceApp.menu_labels: true + network-top-tab: + panel_tabs: + actions: + vnets-tab: + panel_tabs: + vnet_info_tab: false + vnet_ar_list_tab: false + vnet_leases_tab: true + vnet_sg_list_tab: true + vnet_vr_list_tab: false + vnet_clusters_tab: false + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + #- 3 # Owner + #- 4 # Group + #- 5 # Reservation + #- 6 # Cluster + #- 7 # Bridge + #- 8 # Leases + #- 9 # VLAN ID + #- 10 # Labels + #- 11 # Search data + actions: + Network.refresh: true + Network.create_dialog: false + Network.import_dialog: false + Network.update_dialog: false + Network.reserve_dialog: false + Network.addtocluster: false + Network.rename: false + Network.chown: false + Network.chgrp: false + Network.chmod: false + Network.delete: false + Network.hold_lease: false + Network.release_lease: false + Network.add_ar: false + Network.remove_ar: false + Network.update_ar: false + Network.edit_labels: true + Network.menu_labels: true + vnets-topology-tab: + panel_tabs: + actions: + NetworkTopology.refresh: true + NetworkTopology.fit: true + NetworkTopology.collapseVMs: true + NetworkTopology.openVMs: true + secgroups-tab: + panel_tabs: + security_group_info_tab: true + security_group_vms_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + #- 2 # Name + #- 3 # Owner + - 4 # Group + #- 5 # Labels + #- 6 # Search data + actions: + SecurityGroup.refresh: true + SecurityGroup.create_dialog: false + SecurityGroup.update_dialog: false + SecurityGroup.rename: false + SecurityGroup.chown: false + SecurityGroup.chgrp: false + SecurityGroup.chmod: false + SecurityGroup.clone_dialog: false + SecurityGroup.commit_dialog: false + SecurityGroup.delete: false + SecurityGroup.edit_labels: true + SecurityGroup.menu_labels: true + support-tab: + panel_tabs: + support_info_tab: true + table_columns: + #- 0 # Checkbox + - 1 # ID + - 2 # Subject + - 3 # Created at + - 4 # Status + actions: + Support.refresh: true + Support.create_dialog: true + settings-tab: + panel_tabs: + settings_info_tab: true + settings_config_tab: false + settings_quotas_tab: true + settings_group_quotas_tab: true + settings_accounting_tab: true + settings_showback_tab: true + settings_auth_tab: true + actions: + # Buttons for settings_info_tab + User.update_password: true + User.login_token: true + # Buttons for settings_config_tab + Settings.change_language: true + Settings.change_password: true + Settings.change_view: true + Settings.ssh_key: true + Settings.login_token: true + # Edit button in settings_quotas_tab + User.quotas_dialog: false + upgrade-top-tab: + panel_tabs: + actions: + vmgroup-tab: + panel_tabs: + vm_group_info_tab: true + vm_group_vms_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # Vms + #- 6 # Labels + #- 7 # Search data + actions: + VMGroup.create_dialog: true + VMGroup.update_dialog: true + VMGroup.chmod: true + VMGroup.chown: true + VMGroup.chgrp: true diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/templates/kvm-user.yaml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/templates/kvm-user.yaml new file mode 100644 index 0000000000000000000000000000000000000000..6e0a9a1c86bbd528526af474fd91427b639a9c2c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/templates/kvm-user.yaml @@ -0,0 +1,849 @@ +%set oneflow = %%getVar('activer_oneflow','non') == 'oui' +small_logo: images/opennebula-5.0.png +provision_logo: images/opennebula-5.0.png +link_logo: +text_link_logo: +confirm_vms: false +filter-view: true +enabled_tabs: + - dashboard-tab + - instances-top-tab + - vms-tab +%if %%oneflow + - oneflow-services-tab +%end if + - vrouters-tab + - templates-top-tab + - templates-tab +%if %%oneflow + - oneflow-templates-tab +%end if + - vrouter-templates-tab + - storage-top-tab + - datastores-tab + - images-tab + - files-tab + - marketplaces-tab + - marketplaceapps-tab + - network-top-tab + - vnets-tab + - vnets-topology-tab + - secgroups-tab + #- infrastructure-top-tab + #- clusters-tab + #- hosts-tab + #- zones-tab + #- system-top-tab + #- users-tab + #- groups-tab + #- vdcs-tab + #- acls-tab + - settings-tab + #- support-tab + #- upgrade-top-tab + - vmgroup-tab +features: + # True to show showback monthly reports, and VM cost + showback: true + + # Allows to change the security groups for each network interface + # on the VM creation dialog + secgroups: true + + # True to hide the CPU setting in the VM creation dialog + instantiate_hide_cpu: false + + # False to not scale the CPU. Number to scale from VCPU + instantiate_cpu_factor: false + + # True to show the option to make an instance persistent + instantiate_persistent: true + + # True to show the datastore datatable to instantiate VM + show_ds_instantiate: false + + # True to show the vmgroup datatable to instantiate VM + show_vmgroup_instantiate: true + + # True to show the vnet datatable to instantiate VM + show_vnet_instantiate: true + + # True to show the host datatable to instantiate VM + show_host_instantiate: false + + # True to show an input to specify the the VMs and Template path/folder where a vCenter VM will + # deployed to + vcenter_vm_folder: false + + # True to show the monitoring info (VM & VRouters) + show_monitoring_info: true + + # True to show the attributes info (VM & VRouters) + show_attributes_info: true +tabs: + dashboard-tab: + # The following widgets can be used inside any of the '_per_row' settings + # bellow. As the name suggest, the widgets will be scaled to fit one, + # two, or three per row. The footer uses the widgets at full size, i.e. + # one per row. + # + # - storage + # - users + # - network + # - hosts + # - vms + # - groupquotas + # - quotas + panel_tabs: + actions: + Dashboard.refresh: false + Sunstone.toggle_top: false + widgets_one_per_row: + - vms + widgets_three_per_row: + widgets_two_per_row: + - network + - storage + widgets_one_footer: + system-top-tab: + panel_tabs: + actions: + users-tab: + panel_tabs: + user_info_tab: true + user_quotas_tab: true + user_groups_tab: true + user_accounting_tab: true + user_showback_tab: true + user_auth_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Group + - 4 # Auth driver + #- 5 # Password + - 6 # VMs + - 7 # Memory + - 8 # CPU + #- 9 # Group ID + #- 10 # Hidden User Data + #- 11 # Labels + #- 12 # Search data + actions: + User.refresh: true + User.create_dialog: true + User.update_password: true + User.login_token: true + User.quotas_dialog: true + User.groups_dialog: true + User.chgrp: true + User.change_authentication: true + User.delete: true + User.edit_labels: true + User.menu_labels: true + groups-tab: + panel_tabs: + group_info_tab: true + group_users_tab: true + group_quotas_tab: true + group_accounting_tab: true + group_showback_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Users + - 4 # VMs + - 5 # Memory + - 6 # CPU + #- 7 # Labels + actions: + Group.refresh: true + Group.create_dialog: true + Group.update_dialog: true + Group.quotas_dialog: true + Group.delete: true + Group.edit_admins: true + Group.edit_labels: true + Group.menu_labels: true + vdcs-tab: + panel_tabs: + vdc_info_tab: true + vdc_groups_tab: true + vdc_resources_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Groups + - 4 # Clusters + - 5 # Hosts + - 6 # VNets + - 7 # Datastores + #- 8 # Labels + actions: + Vdc.refresh: true + Vdc.create_dialog: true + Vdc.update_dialog: true + Vdc.rename: true + Vdc.delete: true + Vdc.edit_labels: true + Vdc.menu_labels: true + acls-tab: + panel_tabs: + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Applies to + - 3 # Affected resources + - 4 # Resource ID / Owned by + - 5 # Allowed operations + - 6 # Zone + #- 7 # ACL String + actions: + Acl.refresh: true + Acl.create_dialog: true + Acl.delete: true + templates-top-tab: + panel_tabs: + actions: + templates-tab: + panel_tabs: + template_info_tab: true + template_template_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Owner + - 3 # Group + - 4 # Name + - 5 # Registration time + #- 6 # Labels + #- 7 # Search data + actions: + Template.refresh: true + Template.create_dialog: true + Template.import_dialog: false + Template.update_dialog: true + Template.instantiate_vms: true + Template.rename: true + Template.chown: false + Template.chgrp: false + Template.chmod: true + Template.clone_dialog: true + Template.delete_dialog: true + Template.share: true + Template.unshare: true + Template.edit_labels: true + Template.menu_labels: true + template_creation_tabs: + general: true + storage: true + network: true + os_booting: true + features: true + input_output: true + context: true + actions: true + scheduling: false + hybrid: true + vmgroup: true + other: true + oneflow-templates-tab: + panel_tabs: + service_template_info_tab: true + service_template_roles_tab: true + service_template_template_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Owner + - 3 # Group + - 4 # Name + #- 5 # Labels + #- 6 # Search data + actions: + ServiceTemplate.refresh: true + ServiceTemplate.create_dialog: true + ServiceTemplate.update_dialog: true + ServiceTemplate.instantiate: true + ServiceTemplate.chown: false + ServiceTemplate.chgrp: false + ServiceTemplate.chmod: true + ServiceTemplate.rename: true + ServiceTemplate.clone_dialog: true + ServiceTemplate.delete: true + ServiceTemplate.edit_labels: true + ServiceTemplate.menu_labels: true + vrouter-templates-tab: + panel_tabs: + vrouter_template_info_tab: true + vrouter_template_template_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Owner + - 3 # Group + - 4 # Name + - 5 # Registration time + #- 6 # Labels + #- 7 # Search data + actions: + VirtualRouterTemplate.refresh: true + VirtualRouterTemplate.create_dialog: true + VirtualRouterTemplate.update_dialog: true + VirtualRouterTemplate.instantiate_dialog: true + VirtualRouterTemplate.rename: true + VirtualRouterTemplate.chown: false + VirtualRouterTemplate.chgrp: false + VirtualRouterTemplate.chmod: true + VirtualRouterTemplate.clone_dialog: true + VirtualRouterTemplate.delete_dialog: true + VirtualRouterTemplate.share: true + VirtualRouterTemplate.unshare: true + VirtualRouterTemplate.edit_labels: true + VirtualRouterTemplate.menu_labels: true + template_creation_tabs: + general: true + storage: true + network: true + os_booting: true + features: true + input_output: true + context: true + scheduling: true + hybrid: true + other: true + instances-top-tab: + panel_tabs: + actions: + vms-tab: + panel_tabs: + vm_info_tab: true + vm_capacity_tab: true + vm_storage_tab: true + vm_network_tab: true + vm_snapshot_tab: true + vm_placement_tab: false + vm_actions_tab: true + vm_conf_tab: true + vm_template_tab: false + vm_log_tab: false + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Owner + - 3 # Group + - 4 # Name + - 5 # Status + #- 6 # Used CPU + #- 7 # Used Memory + - 8 # Host + - 9 # IPs + #- 10 # Start Time + - 11 # VNC + #- 12 # Hidden Template + #- 13 # Labels + #- 14 # Search data + actions: + VM.refresh: true + VM.create_dialog: true + VM.rename: true + VM.chown: false + VM.chgrp: false + VM.chmod: true + VM.deploy: false + VM.migrate: false + VM.migrate_live: false + VM.hold: true + VM.release: true + VM.suspend: true + VM.resume: true + VM.stop: true + VM.recover: false + VM.reboot: true + VM.reboot_hard: true + VM.poweroff: true + VM.poweroff_hard: true + VM.undeploy: true + VM.undeploy_hard: true + VM.terminate: true + VM.terminate_hard: true + VM.resize: true + VM.attachdisk: true + VM.detachdisk: true + VM.disk_saveas: true + VM.disk_resize: false + VM.attachnic: true + VM.detachnic: true + VM.snapshot_create: true + VM.snapshot_revert: true + VM.snapshot_delete: true + VM.disk_snapshot_create: true + VM.disk_snapshot_revert: true + VM.disk_snapshot_delete: true + VM.resched: false + VM.unresched: false + VM.save_as_template: true + VM.updateconf: true + VM.edit_labels: true + VM.menu_labels: true + oneflow-services-tab: + panel_tabs: + service_info_tab: true + service_roles_tab: true + service_log_tab: true + panel_tabs_actions: + service_roles_tab: + Role.scale: true + Role.hold: true + Role.release: true + Role.suspend: true + Role.resume: true + Role.stop: true + Role.reboot: true + Role.reboot_hard: true + Role.poweroff: true + Role.poweroff_hard: true + Role.undeploy: true + Role.undeploy_hard: true + Role.terminate: true + Role.terminate_hard: true + RoleVM.hold: true + RoleVM.release: true + RoleVM.suspend: true + RoleVM.resume: true + RoleVM.stop: true + RoleVM.reboot: true + RoleVM.reboot_hard: true + RoleVM.poweroff: true + RoleVM.poweroff_hard: true + RoleVM.undeploy: true + RoleVM.undeploy_hard: true + RoleVM.terminate: true + RoleVM.terminate_hard: true + RoleVM.resched: false + RoleVM.unresched: false + RoleVM.recover: false + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Owner + - 3 # Group + - 4 # Name + - 5 # State + #- 6 # Labels + #- 7 # Search data + actions: + Service.refresh: true + Service.create_dialog: true + Service.chown: false + Service.chgrp: false + Service.chmod: true + Service.rename: true + Service.shutdown: true + Service.recover: true + Service.delete: true + Service.edit_labels: true + Service.menu_labels: true + vrouters-tab: + panel_tabs: + virtual_router_info_tab: true + virtual_router_vms_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Owner + - 3 # Group + - 4 # Name + #- 5 # Labels + #- 6 # Search data + actions: + VirtualRouter.refresh: true + VirtualRouter.create_dialog: true + VirtualRouter.rename: true + VirtualRouter.chown: true + VirtualRouter.chgrp: true + VirtualRouter.chmod: true + VirtualRouter.delete: true + VirtualRouter.attachnic: true + VirtualRouter.detachnic: true + VirtualRouter.edit_labels: true + VirtualRouter.menu_labels: true + infrastructure-top-tab: + panel_tabs: + actions: + clusters-tab: + panel_tabs: + cluster_info_tab: true + cluster_host_tab: true + cluster_vnet_tab: true + cluster_datastore_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Hosts + - 4 # VNets + - 5 # Datastores + #- 6 # Labels + actions: + Cluster.refresh: true + Cluster.create_dialog: true + Cluster.update_dialog: true + Cluster.delete: true + Cluster.rename: true + Cluster.edit_labels: true + Cluster.menu_labels: true + hosts-tab: + panel_tabs: + host_info_tab: true + host_monitoring_tab: true + host_vms_tab: true + host_wilds_tab: true + host_zombies_tab: true + host_esx_tab: true + host_pci_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Cluster + - 4 # RVMs + #- 5 # Real CPU + - 6 # Allocated CPU + #- 7 # Real MEM + - 8 # Allocated MEM + - 9 # Status + #- 10 # IM MAD + #- 11 # VM MAD + #- 12 # Last monitored on + #- 13 # Labels + #- 14 # Search data + actions: + Host.refresh: true + Host.create_dialog: true + Host.addtocluster: true + Host.rename: true + Host.enable: true + Host.disable: true + Host.offline: true + Host.delete: true + Host.edit_labels: true + Host.menu_labels: true + zones-tab: + panel_tabs: + zone_info_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Endpoint + #- 4 # Labels + actions: + Zone.refresh: true + Zone.create_dialog: true + Zone.rename: true + Zone.delete: true + Zone.edit_labels: true + Zone.menu_labels: true + storage-top-tab: + panel_tabs: + actions: + datastores-tab: + panel_tabs: + datastore_info_tab: false + datastore_image_tab: true + datastore_clusters_tab: false + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Owner + - 3 # Group + - 4 # Name + - 5 # Capacity + - 6 # Cluster + #- 7 # Basepath + #- 8 # TM + #- 9 # DS + #- 10 # Type + #- 11 # Status + #- 12 # Labels + #- 13 # Search data + actions: + Datastore.refresh: true + Datastore.create_dialog: false + Datastore.import_dialog: false + Datastore.addtocluster: false + Datastore.rename: true + Datastore.chown: false + Datastore.chgrp: false + Datastore.chmod: true + Datastore.delete: false + Datastore.enable: false + Datastore.disable: false + Datastore.edit_labels: true + Datastore.menu_labels: true + images-tab: + panel_tabs: + image_info_tab: true + image_vms_tab: true + image_snapshots_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Owner + - 3 # Group + - 4 # Name + - 5 # Datastore + #- 6 # Size + - 7 # Type + #- 8 # Registration time + #- 9 # Persistent + - 10 # Status + - 11 # #VMs + #- 12 # Target + #- 13 # Labels + #- 14 # Search data + actions: + Image.refresh: true + Image.create_dialog: true + Image.import_dialog: false + Image.upload_marketplace_dialog: true + Image.rename: true + Image.chown: false + Image.chgrp: false + Image.chmod: true + Image.enable: true + Image.disable: true + Image.persistent: true + Image.nonpersistent: true + Image.clone_dialog: true + Image.delete: true + Image.snapshot_flatten: true + Image.snapshot_revert: true + Image.snapshot_delete: true + Image.edit_labels: true + Image.menu_labels: true + files-tab: + panel_tabs: + file_info_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Owner + - 3 # Group + - 4 # Name + - 5 # Datastore + #- 6 # Size + - 7 # Type + #- 8 # Registration time + #- 9 # Persistent + - 10 # Status + #- 11 # #VMs + #- 12 # Target + #- 13 # Labels + #- 14 # Search data + actions: + File.refresh: true + File.create_dialog: true + File.rename: true + File.chown: false + File.chgrp: false + File.chmod: true + File.enable: true + File.disable: true + File.delete: true + File.edit_labels: true + File.menu_labels: true + marketplaces-tab: + panel_tabs: + marketplace_info_tab: true + marketplace_apps_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Owner + - 3 # Group + - 4 # Name + - 5 # Capacity + - 6 # Apps + - 7 # Driver + - 8 # Zone + #- 9 # Labels + #- 10 # Search data + actions: + MarketPlace.refresh: true + MarketPlace.create_dialog: true + MarketPlace.update_dialog: true + MarketPlace.rename: true + MarketPlace.chown: true + MarketPlace.chgrp: true + MarketPlace.chmod: true + MarketPlace.delete: true + MarketPlace.edit_labels: true + MarketPlace.menu_labels: true + marketplaceapps-tab: + panel_tabs: + marketplaceapp_info_tab: true + marketplaceapp_templates_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Owner + - 3 # Group + - 4 # Name + #- 5 # Version + - 6 # Size + - 7 # State + #- 8 # Type + - 9 # Registration + - 10 # Marketplace + - 11 # Zone + #- 12 # Labels + #- 13 # Search data + actions: + MarketPlaceApp.refresh: true + MarketPlaceApp.create_dialog: true + MarketPlaceApp.download_opennebula_dialog: true + MarketPlaceApp.download_local: true + MarketPlaceApp.rename: true + MarketPlaceApp.chown: true + MarketPlaceApp.chgrp: true + MarketPlaceApp.chmod: true + MarketPlaceApp.enable: true + MarketPlaceApp.disable: true + MarketPlaceApp.delete: true + MarketPlaceApp.edit_labels: true + MarketPlaceApp.menu_labels: true + network-top-tab: + panel_tabs: + actions: + vnets-tab: + panel_tabs: + vnet_info_tab: true + vnet_ar_list_tab: true + vnet_leases_tab: true + vnet_sg_list_tab: true + vnet_vr_list_tab: true + vnet_clusters_tab: false + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Owner + - 3 # Group + - 4 # Name + - 5 # Reservation + - 6 # Cluster + #- 7 # Bridge + - 8 # Leases + #- 9 # VLAN ID + #- 10 # Labels + #- 11 # Search data + actions: + Network.refresh: true + Network.create_dialog: false + Network.import_dialog: false + Network.update_dialog: true + Network.reserve_dialog: true + Network.addtocluster: false + Network.rename: true + Network.chown: false + Network.chgrp: false + Network.chmod: true + Network.delete: true + Network.hold_lease: true + Network.release_lease: true + Network.add_ar: false + Network.remove_ar: true + Network.update_ar: true + Network.edit_labels: true + Network.menu_labels: true + vnets-topology-tab: + panel_tabs: + actions: + NetworkTopology.refresh: true + NetworkTopology.fit: true + NetworkTopology.collapseVMs: true + NetworkTopology.openVMs: true + secgroups-tab: + panel_tabs: + security_group_info_tab: true + security_group_vms_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Owner + - 3 # Group + - 4 # Name + #- 5 # Labels + #- 6 # Search data + actions: + SecurityGroup.refresh: true + SecurityGroup.create_dialog: true + SecurityGroup.update_dialog: true + SecurityGroup.rename: true + SecurityGroup.chown: true + SecurityGroup.chgrp: true + SecurityGroup.chmod: true + SecurityGroup.clone_dialog: true + SecurityGroup.commit_dialog: true + SecurityGroup.delete: true + SecurityGroup.edit_labels: true + SecurityGroup.menu_labels: true + support-tab: + panel_tabs: + support_info_tab: true + table_columns: + #- 0 # Checkbox + - 1 # ID + - 2 # Subject + - 3 # Created at + - 4 # Status + actions: + Support.refresh: true + Support.create_dialog: true + settings-tab: + panel_tabs: + settings_info_tab: true + settings_config_tab: false + settings_quotas_tab: true + settings_group_quotas_tab: true + settings_accounting_tab: true + settings_showback_tab: true + settings_auth_tab: true + actions: + # Buttons for settings_info_tab + User.update_password: true + User.login_token: true + # Buttons for settings_config_tab + Settings.change_language: true + Settings.change_password: true + Settings.change_view: true + Settings.ssh_key: true + Settings.login_token: true + # Edit button in settings_quotas_tab + User.quotas_dialog: false + upgrade-top-tab: + panel_tabs: + actions: + vmgroup-tab: + panel_tabs: + vm_group_info_tab: true + vm_group_vms_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Group + - 4 # Owner + - 5 # Vms + #- 6 # Labels + #- 7 # Search data + actions: + VMGroup.create_dialog: true + VMGroup.update_dialog: true + VMGroup.chmod: true + VMGroup.chown: true + VMGroup.chgrp: true diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/templates/mixed-admin.yaml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/templates/mixed-admin.yaml new file mode 100644 index 0000000000000000000000000000000000000000..7113f5a4bceccc9a7b176683f3df20953234be99 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/templates/mixed-admin.yaml @@ -0,0 +1,858 @@ +%set oneflow = %%getVar('activer_oneflow','non') == 'oui' +small_logo: images/opennebula-5.0.png +provision_logo: images/opennebula-5.0.png +link_logo: +text_link_logo: +confirm_vms: false +filter-view: true +enabled_tabs: + - dashboard-tab + - instances-top-tab + - vms-tab +%if %%oneflow + - oneflow-services-tab +%end if + - vrouters-tab + - templates-top-tab + - templates-tab +%if %%oneflow + - oneflow-templates-tab +%end if + - vrouter-templates-tab + - storage-top-tab + - datastores-tab + - images-tab + - files-tab + - marketplaces-tab + - marketplaceapps-tab + - network-top-tab + - vnets-tab + - vnets-topology-tab + - secgroups-tab + - infrastructure-top-tab + - clusters-tab + - hosts-tab + - zones-tab + - system-top-tab + - users-tab + - groups-tab + - vdcs-tab + - acls-tab + - settings-tab + # Do not enable external checking + # - support-tab + # - upgrade-top-tab + - vmgroup-tab +features: + # True to show showback monthly reports, and VM cost + showback: true + + # Allows to change the security groups for each network interface + # on the VM creation dialog + secgroups: true + + # True to hide the CPU setting in the VM creation dialog + instantiate_hide_cpu: false + + # False to not scale the CPU. Number to scale from VCPU + instantiate_cpu_factor: false + + # True to show the option to make an instance persistent + instantiate_persistent: true + + # True to show the datastore datatable to instantiate VM + show_ds_instantiate: true + + # True to show the vmgroup datatable to instantiate VM + show_vmgroup_instantiate: true + + # True to show the vnet datatable to instantiate VM + show_vnet_instantiate: true + + # True to show the host datatable to instantiate VM + show_host_instantiate: true + + # True to show an input to specify the the VMs and Template path/folder where a vCenter VM will + # deployed to + vcenter_vm_folder: true + + # True to show the monitoring info (VM & VRouters) + show_monitoring_info: true + + # True to show the attributes info (VM & VRouters) + show_attributes_info: true + + # True to show the user datatable to instantiate VM + show_as_uid_instantiate: true + + # True to show the group datatable to instantiate VM + show_as_gid_instantiate: true +tabs: + dashboard-tab: + # The following widgets can be used inside any of the '_per_row' settings + # bellow. As the name suggest, the widgets will be scaled to fit one, + # two, or three per row. The footer uses the widgets at full size, i.e. + # one per row. + # + # - storage + # - users + # - network + # - hosts + # - vms + # - groupquotas + # - quotas + panel_tabs: + actions: + Dashboard.refresh: false + Sunstone.toggle_top: false + widgets_one_per_row: + - hosts + widgets_three_per_row: + widgets_two_per_row: + - vms + - users + - storage + - network + widgets_one_footer: + system-top-tab: + panel_tabs: + actions: + users-tab: + panel_tabs: + user_info_tab: true + user_quotas_tab: true + user_groups_tab: true + user_accounting_tab: true + user_showback_tab: true + user_auth_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Group + - 4 # Auth driver + #- 5 # Password + - 6 # VMs + - 7 # Memory + - 8 # CPU + #- 9 # Group ID + #- 10 # Hidden User Data + #- 11 # Labels + #- 12 # Search data + actions: + User.refresh: true + User.create_dialog: true + User.update_password: true + User.login_token: true + User.quotas_dialog: true + User.groups_dialog: true + User.chgrp: true + User.change_authentication: true + User.delete: true + User.edit_labels: true + User.menu_labels: true + groups-tab: + panel_tabs: + group_info_tab: true + group_users_tab: true + group_quotas_tab: true + group_accounting_tab: true + group_showback_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Users + - 4 # VMs + - 5 # Memory + - 6 # CPU + #- 7 # Labels + actions: + Group.refresh: true + Group.create_dialog: true + Group.update_dialog: true + Group.quotas_dialog: true + Group.delete: true + Group.edit_admins: true + Group.edit_labels: true + Group.menu_labels: true + vdcs-tab: + panel_tabs: + vdc_info_tab: true + vdc_groups_tab: true + vdc_resources_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Groups + - 4 # Clusters + - 5 # Hosts + - 6 # VNets + - 7 # Datastores + #- 8 # Labels + actions: + Vdc.refresh: true + Vdc.create_dialog: true + Vdc.update_dialog: true + Vdc.rename: true + Vdc.delete: true + Vdc.edit_labels: true + Vdc.menu_labels: true + acls-tab: + panel_tabs: + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Applies to + - 3 # Affected resources + - 4 # Resource ID / Owned by + - 5 # Allowed operations + - 6 # Zone + #- 7 # ACL String + actions: + Acl.refresh: true + Acl.create_dialog: true + Acl.delete: true + templates-top-tab: + panel_tabs: + actions: + templates-tab: + panel_tabs: + template_info_tab: true + template_template_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # Registration time + #- 6 # Labels + #- 7 # Search data + actions: + Template.refresh: true + Template.create_dialog: true + Template.import_dialog: true + Template.update_dialog: true + Template.instantiate_vms: true + Template.rename: true + Template.chown: true + Template.chgrp: true + Template.chmod: true + Template.clone_dialog: true + Template.delete_dialog: true + Template.share: true + Template.unshare: true + Template.edit_labels: true + Template.menu_labels: true + template_creation_tabs: + general: true + storage: true + network: true + os_booting: true + features: true + input_output: true + context: true + actions: true + scheduling: true + hybrid: true + vmgroup: true + other: true + oneflow-templates-tab: + panel_tabs: + service_template_info_tab: true + service_template_roles_tab: true + service_template_template_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + #- 5 # Labels + #- 6 # Search data + actions: + ServiceTemplate.refresh: true + ServiceTemplate.create_dialog: true + ServiceTemplate.update_dialog: true + ServiceTemplate.instantiate: true + ServiceTemplate.chown: true + ServiceTemplate.chgrp: true + ServiceTemplate.chmod: true + ServiceTemplate.rename: true + ServiceTemplate.clone_dialog: true + ServiceTemplate.delete: true + ServiceTemplate.edit_labels: true + ServiceTemplate.menu_labels: true + vrouter-templates-tab: + panel_tabs: + vrouter_template_info_tab: true + vrouter_template_template_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # Registration time + #- 6 # Labels + #- 7 # Search data + actions: + VirtualRouterTemplate.refresh: true + VirtualRouterTemplate.create_dialog: true + VirtualRouterTemplate.update_dialog: true + VirtualRouterTemplate.instantiate_dialog: true + VirtualRouterTemplate.rename: true + VirtualRouterTemplate.chown: true + VirtualRouterTemplate.chgrp: true + VirtualRouterTemplate.chmod: true + VirtualRouterTemplate.clone_dialog: true + VirtualRouterTemplate.delete_dialog: true + VirtualRouterTemplate.share: true + VirtualRouterTemplate.unshare: true + VirtualRouterTemplate.edit_labels: true + VirtualRouterTemplate.menu_labels: true + template_creation_tabs: + general: true + storage: true + network: true + os_booting: true + features: true + input_output: true + context: true + scheduling: true + hybrid: true + other: true + instances-top-tab: + panel_tabs: + actions: + vms-tab: + panel_tabs: + vm_info_tab: true + vm_capacity_tab: true + vm_storage_tab: true + vm_network_tab: true + vm_snapshot_tab: true + vm_placement_tab: true + vm_actions_tab: true + vm_conf_tab: true + vm_template_tab: true + vm_log_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # Status + #- 6 # Used CPU + #- 7 # Used Memory + - 8 # Host + - 9 # IPs + #- 10 # Start Time + - 11 # VNC + #- 12 # Hidden Template + #- 13 # Labels + #- 14 # Search data + actions: + VM.refresh: true + VM.create_dialog: true + VM.rename: true + VM.chown: true + VM.chgrp: true + VM.chmod: true + VM.deploy: true + VM.migrate: true + VM.migrate_live: true + VM.hold: true + VM.release: true + VM.suspend: true + VM.resume: true + VM.stop: true + VM.recover: true + VM.reboot: true + VM.reboot_hard: true + VM.poweroff: true + VM.poweroff_hard: true + VM.undeploy: true + VM.undeploy_hard: true + VM.terminate: true + VM.terminate_hard: true + VM.resize: true + VM.disk_resize: true + VM.attachdisk: true + VM.detachdisk: true + VM.disk_saveas: true + VM.attachnic: true + VM.detachnic: true + VM.snapshot_create: true + VM.snapshot_revert: true + VM.snapshot_delete: true + VM.disk_snapshot_create: true + VM.disk_snapshot_revert: true + VM.disk_snapshot_delete: true + VM.resched: true + VM.unresched: true + VM.save_as_template: true + VM.updateconf: true + VM.edit_labels: true + VM.menu_labels: true + oneflow-services-tab: + panel_tabs: + service_info_tab: true + service_roles_tab: true + service_log_tab: true + panel_tabs_actions: + service_roles_tab: + Role.scale: true + Role.hold: true + Role.release: true + Role.suspend: true + Role.resume: true + Role.stop: true + Role.reboot: true + Role.reboot_hard: true + Role.poweroff: true + Role.poweroff_hard: true + Role.undeploy: true + Role.undeploy_hard: true + Role.terminate: true + Role.terminate_hard: true + RoleVM.hold: true + RoleVM.release: true + RoleVM.suspend: true + RoleVM.resume: true + RoleVM.stop: true + RoleVM.reboot: true + RoleVM.reboot_hard: true + RoleVM.poweroff: true + RoleVM.poweroff_hard: true + RoleVM.undeploy: true + RoleVM.undeploy_hard: true + RoleVM.terminate: true + RoleVM.terminate_hard: true + RoleVM.resched: true + RoleVM.unresched: true + RoleVM.recover: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # State + #- 6 # Labels + #- 7 # Search data + actions: + Service.refresh: true + Service.create_dialog: true + Service.chown: true + Service.chgrp: true + Service.chmod: true + Service.rename: true + Service.shutdown: true + Service.recover: true + Service.delete: true + Service.edit_labels: true + Service.menu_labels: true + vrouters-tab: + panel_tabs: + virtual_router_info_tab: true + virtual_router_vms_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Owner + - 3 # Group + - 4 # Name + #- 5 # Labels + #- 6 # Search data + actions: + VirtualRouter.refresh: true + VirtualRouter.create_dialog: true + VirtualRouter.rename: true + VirtualRouter.chown: true + VirtualRouter.chgrp: true + VirtualRouter.chmod: true + VirtualRouter.delete: true + VirtualRouter.attachnic: true + VirtualRouter.detachnic: true + VirtualRouter.edit_labels: true + VirtualRouter.menu_labels: true + infrastructure-top-tab: + panel_tabs: + actions: + clusters-tab: + panel_tabs: + cluster_info_tab: true + cluster_host_tab: true + cluster_vnet_tab: true + cluster_datastore_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Hosts + - 4 # VNets + - 5 # Datastores + #- 6 # Labels + actions: + Cluster.refresh: true + Cluster.create_dialog: true + Cluster.update_dialog: true + Cluster.delete: true + Cluster.rename: true + Cluster.edit_labels: true + Cluster.menu_labels: true + hosts-tab: + panel_tabs: + host_info_tab: true + host_monitoring_tab: true + host_vms_tab: true + host_wilds_tab: true + host_zombies_tab: true + host_esx_tab: true + host_pci_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Cluster + - 4 # RVMs + #- 5 # Real CPU + - 6 # Allocated CPU + #- 7 # Real MEM + - 8 # Allocated MEM + - 9 # Status + #- 10 # IM MAD + #- 11 # VM MAD + #- 12 # Last monitored on + #- 13 # Labels + #- 14 # Search data + actions: + Host.refresh: true + Host.create_dialog: true + Host.addtocluster: true + Host.rename: true + Host.enable: true + Host.disable: true + Host.offline: true + Host.delete: true + Host.edit_labels: true + Host.menu_labels: true + zones-tab: + panel_tabs: + zone_info_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Endpoint + #- 4 # Labels + actions: + Zone.refresh: true + Zone.create_dialog: true + Zone.rename: true + Zone.delete: true + Zone.edit_labels: true + Zone.menu_labels: true + storage-top-tab: + panel_tabs: + actions: + datastores-tab: + panel_tabs: + datastore_info_tab: true + datastore_image_tab: true + datastore_clusters_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # Capacity + - 6 # Cluster + #- 7 # Basepath + #- 8 # TM + #- 9 # DS + - 10 # Type + - 11 # Status + #- 12 # Labels + #- 13 # Search data + actions: + Datastore.refresh: true + Datastore.create_dialog: true + Datastore.import_dialog: true + Datastore.addtocluster: true + Datastore.rename: true + Datastore.chown: true + Datastore.chgrp: true + Datastore.chmod: true + Datastore.delete: true + Datastore.enable: true + Datastore.disable: true + Datastore.edit_labels: true + Datastore.menu_labels: true + images-tab: + panel_tabs: + image_info_tab: true + image_vms_tab: true + image_snapshots_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # Datastore + #- 6 # Size + - 7 # Type + #- 8 # Registration time + #- 9 # Persistent + - 10 # Status + - 11 # #VMs + #- 12 # Target + #- 13 # Labels + #- 14 # Search data + actions: + Image.refresh: true + Image.create_dialog: true + Image.import_dialog: true + Image.upload_marketplace_dialog: true + Image.rename: true + Image.chown: true + Image.chgrp: true + Image.chmod: true + Image.enable: true + Image.disable: true + Image.persistent: true + Image.nonpersistent: true + Image.clone_dialog: true + Image.delete: true + Image.snapshot_flatten: true + Image.snapshot_revert: true + Image.snapshot_delete: true + Image.edit_labels: true + Image.menu_labels: true + files-tab: + panel_tabs: + file_info_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # Datastore + #- 6 # Size + - 7 # Type + #- 8 # Registration time + #- 9 # Persistent + - 10 # Status + #- 11 # #VMs + #- 12 # Target + #- 13 # Labels + #- 14 # Search data + actions: + File.refresh: true + File.create_dialog: true + File.rename: true + File.chown: true + File.chgrp: true + File.chmod: true + File.enable: true + File.disable: true + File.delete: true + File.edit_labels: true + File.menu_labels: true + marketplaces-tab: + panel_tabs: + marketplace_info_tab: true + marketplace_apps_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # Capacity + - 6 # Apps + - 7 # Driver + - 8 # Zone + #- 9 # Labels + #- 10 # Search data + actions: + MarketPlace.refresh: true + MarketPlace.create_dialog: true + MarketPlace.update_dialog: true + MarketPlace.rename: true + MarketPlace.chown: true + MarketPlace.chgrp: true + MarketPlace.chmod: true + MarketPlace.delete: true + MarketPlace.edit_labels: true + MarketPlace.menu_labels: true + marketplaceapps-tab: + panel_tabs: + marketplaceapp_info_tab: true + marketplaceapp_templates_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + #- 5 # Version + - 6 # Size + - 7 # State + #- 8 # Type + - 9 # Registration + - 10 # Marketplace + - 11 # Zone + #- 12 # Labels + #- 13 # Search data + actions: + MarketPlaceApp.refresh: true + MarketPlaceApp.create_dialog: true + MarketPlaceApp.download_opennebula_dialog: true + MarketPlaceApp.download_local: true + MarketPlaceApp.rename: true + MarketPlaceApp.chown: true + MarketPlaceApp.chgrp: true + MarketPlaceApp.chmod: true + MarketPlaceApp.enable: true + MarketPlaceApp.disable: true + MarketPlaceApp.delete: true + MarketPlaceApp.edit_labels: true + MarketPlaceApp.menu_labels: true + network-top-tab: + panel_tabs: + actions: + vnets-tab: + panel_tabs: + vnet_info_tab: true + vnet_ar_list_tab: true + vnet_leases_tab: true + vnet_sg_list_tab: true + vnet_vr_list_tab: true + vnet_clusters_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # Reservation + - 6 # Cluster + #- 7 # Bridge + - 8 # Leases + #- 9 # VLAN ID + #- 10 # Labels + #- 11 # Search data + actions: + Network.refresh: true + Network.create_dialog: true + Network.import_dialog: true + Network.update_dialog: true + Network.reserve_dialog: true + Network.addtocluster: true + Network.rename: true + Network.chown: true + Network.chgrp: true + Network.chmod: true + Network.delete: true + Network.hold_lease: true + Network.release_lease: true + Network.add_ar: true + Network.remove_ar: true + Network.update_ar: true + Network.edit_labels: true + Network.menu_labels: true + vnets-topology-tab: + panel_tabs: + actions: + NetworkTopology.refresh: true + NetworkTopology.fit: true + NetworkTopology.collapseVMs: true + NetworkTopology.openVMs: true + secgroups-tab: + panel_tabs: + security_group_info_tab: true + security_group_vms_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + #- 5 # Labels + #- 6 # Search data + actions: + SecurityGroup.refresh: true + SecurityGroup.create_dialog: true + SecurityGroup.update_dialog: true + SecurityGroup.rename: true + SecurityGroup.chown: true + SecurityGroup.chgrp: true + SecurityGroup.chmod: true + SecurityGroup.clone_dialog: true + SecurityGroup.commit_dialog: true + SecurityGroup.delete: true + SecurityGroup.edit_labels: true + SecurityGroup.menu_labels: true + support-tab: + panel_tabs: + support_info_tab: true + table_columns: + #- 0 # Checkbox + - 1 # ID + - 2 # Subject + - 3 # Created at + - 4 # Status + actions: + Support.refresh: true + Support.create_dialog: true + settings-tab: + panel_tabs: + settings_info_tab: true + settings_config_tab: false + settings_quotas_tab: true + settings_group_quotas_tab: true + settings_accounting_tab: true + settings_showback_tab: true + settings_auth_tab: true + actions: + # Buttons for settings_info_tab + User.update_password: true + User.login_token: true + # Buttons for settings_config_tab + Settings.change_language: true + Settings.change_password: true + Settings.change_view: true + Settings.ssh_key: true + Settings.login_token: true + # Edit button in settings_quotas_tab + User.quotas_dialog: false + upgrade-top-tab: + panel_tabs: + actions: + vmgroup-tab: + panel_tabs: + vm_group_info_tab: true + vm_group_vms_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # Vms + #- 6 # Labels + #- 7 # Search data + actions: + VMGroup.create_dialog: true + VMGroup.update_dialog: true + VMGroup.chmod: true + VMGroup.chown: true + VMGroup.chgrp: true diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/templates/mixed-cloud.yaml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/templates/mixed-cloud.yaml new file mode 100644 index 0000000000000000000000000000000000000000..98280b1c7d4f5508e1efe0392661eea4aa1b3f6f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/templates/mixed-cloud.yaml @@ -0,0 +1,190 @@ +%set oneflow = %%getVar('activer_oneflow','non') == 'oui' +provision_logo: images/opennebula-5.0.png +link_logo: +text_link_logo: +confirm_vms: false +enabled_tabs: + - provision-tab + - settings-tab +features: + # True to show showback monthly reports, and VM cost + showback: true + + # Allows to change the security groups for each network interface + # on the VM creation dialog + secgroups: true + + # True to hide the CPU setting in the VM creation dialog + instantiate_hide_cpu: false + + # False to not scale the CPU. Number to scale from VCPU + instantiate_cpu_factor: false + + # True to show the option to make an instance persistent + instantiate_persistent: true + + # True to allow to create machines to cloud users + cloud_vm_create: true + + # True to show the monitoring info (VM & VRouters) + show_monitoring_info: true + + # True to show the attributes info (VM & VRouters) + show_attributes_info: true + + # True to show the vCenter info (VM & VRouters) + show_vcenter_info: true +tabs: + provision-tab: + panel_tabs: + vm_info_tab: false + vm_capacity_tab: true + vm_storage_tab: true + vm_network_tab: true + vm_snapshot_tab: true + vm_placement_tab: false + vm_actions_tab: true + vm_conf_tab: false + vm_template_tab: false + vm_log_tab: false + provision_tabs: +%if %%oneflow + flows: true +%else + flows: false +%end if + templates: true + actions: &provisionactions + # In the cloud view, delete is the equivalent + # of 'onetemplate chmod --recursive' + Template.chmod: false + + # In the cloud view, delete is the equivalent + # of 'onetemplate delete --recursive' + Template.delete: true + VM.rename: true + VM.resume: true + VM.reboot: true + VM.reboot_hard: true + VM.poweroff: true + VM.poweroff_hard: true + VM.undeploy: false + VM.undeploy_hard: false + VM.terminate: true + VM.terminate_hard: true + VM.resize: true + VM.disk_resize: true + VM.attachdisk: true + VM.detachdisk: true + VM.disk_saveas: true + VM.attachnic: true + VM.detachnic: true + VM.snapshot_create: true + VM.snapshot_revert: true + VM.snapshot_delete: true + VM.disk_snapshot_create: true + VM.disk_snapshot_revert: true + VM.disk_snapshot_delete: true + VM.save_as_template: true + dashboard: + # Connected user's quotas + quotas: true + # Overview of connected user's VMs + vms: true + # Group's quotas + groupquotas: false + # Overview of group's VMs + groupvms: false + create_vm: + # True to allow capacity (CPU, MEMORY, VCPU) customization + capacity_select: true + # True to allow NIC customization + network_select: true + # True to allow vmgroup customization + vmgroup_select: true + # True to allow DISK size customization + disk_resize: true + # True to allow datastore customization + datastore_select: true + settings-tab: + panel_tabs: + settings_info_tab: false + settings_config_tab: true + settings_quotas_tab: true + settings_accounting_tab: true + settings_showback_tab: true + actions: + # Buttons for settings_info_tab + User.update_password: true + User.login_token: true + # Buttons for settings_config_tab + Settings.change_language: true + Settings.change_password: true + Settings.change_view: true + Settings.ssh_key: true + Settings.login_token: true + # Edit button in settings_quotas_tab + User.quotas_dialog: false + vms-tab: + actions: *provisionactions + images-tab: + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Onwer + - 4 # Group + - 5 # Datastore + #- 6 # Size + - 7 # Type + #- 8 # Registration time + #- 9 # Persistent + - 10 # Status + - 11 # #VMs + #- 12 # Target + vnets-tab: + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + #- 3 # Owner + - 4 # Group + #- 5 # Reservation + #- 6 # Cluster + #- 7 # Bridge + #- 8 # Leases + #- 9 # VLAN ID + secgroups-tab: + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + #- 3 # Owner + - 4 # Group + #- 5 # Labels + vmgroup-tab: + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # Vms + #- 6 # Labels + #- 7 # Search data + datastores-tab: + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + #- 5 # Capacity + #- 6 # Cluster + #- 7 # Basepath + #- 8 # TM + #- 9 # DS + #- 10 # Type + - 11 # Status + #- 12 # Labels + #- 13 # Search data diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/templates/mixed-groupadmin.yaml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/templates/mixed-groupadmin.yaml new file mode 100644 index 0000000000000000000000000000000000000000..bd25b384c3bed0ff63e4c7fb3fb437b5062bec4e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/templates/mixed-groupadmin.yaml @@ -0,0 +1,856 @@ +%set oneflow = %%getVar('activer_oneflow','non') == 'oui' +small_logo: images/opennebula-5.0.png +provision_logo: images/opennebula-5.0.png +link_logo: +text_link_logo: +confirm_vms: false +filter-view: true +enabled_tabs: + - dashboard-tab + - instances-top-tab + - vms-tab +%if %%oneflow + - oneflow-services-tab +%end if + - vrouters-tab + - templates-top-tab + - templates-tab +%if %%oneflow + - oneflow-templates-tab +%end if + - vrouter-templates-tab + #- storage-top-tab + #- datastores-tab + #- images-tab + #- files-tab + #- marketplaces-tab + #- marketplaceapps-tab + - network-top-tab + - vnets-tab + - vnets-topology-tab + - secgroups-tab + #- infrastructure-top-tab + #- clusters-tab + #- hosts-tab + #- zones-tab + - system-top-tab + - users-tab + - groups-tab + #- vdcs-tab + #- acls-tab + - settings-tab + #- support-tab + #- upgrade-top-tab + - vmgroup-tab +features: + # True to show showback monthly reports, and VM cost + showback: true + + # Allows to change the security groups for each network interface + # on the VM creation dialog + secgroups: true + + # True to hide the CPU setting in the VM creation dialog + instantiate_hide_cpu: false + + # False to not scale the CPU. Number to scale from VCPU + instantiate_cpu_factor: false + + # True to show the option to make an instance persistent + instantiate_persistent: true + + # True to show the datastore datatable to instantiate VM + show_ds_instantiate: false + + # True to show the vmgroup datatable to instantiate VM + show_vmgroup_instantiate: true + + # True to show the vnet datatable to instantiate VM + show_vnet_instantiate: true + + # True to show the host datatable to instantiate VM + show_host_instantiate: false + + # True to show an input to specify the the VMs and Template path/folder where a vCenter VM will + # deployed to + vcenter_vm_folder: false + + # True to show the monitoring info (VM & VRouters) + show_monitoring_info: true + + # True to show the attributes info (VM & VRouters) + show_attributes_info: true + + # True to show the user datatable to instantiate VM + show_as_uid_instantiate: true + + # True to show the group datatable to instantiate VM + show_as_gid_instantiate: true +tabs: + dashboard-tab: + # The following widgets can be used inside any of the '_per_row' settings + # bellow. As the name suggest, the widgets will be scaled to fit one, + # two, or three per row. The footer uses the widgets at full size, i.e. + # one per row. + # + # - storage + # - users + # - network + # - hosts + # - vms + # - groupquotas + # - quotas + panel_tabs: + actions: + Dashboard.refresh: false + Sunstone.toggle_top: false + widgets_one_per_row: + widgets_three_per_row: + widgets_two_per_row: + - vms + - users + - groupquotas + - quotas + widgets_one_footer: + system-top-tab: + panel_tabs: + actions: + users-tab: + panel_tabs: + user_info_tab: true + user_quotas_tab: true + user_groups_tab: true + user_accounting_tab: true + user_showback_tab: true + user_auth_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + #- 3 # Group + #- 4 # Auth driver + #- 5 # Password + - 6 # VMs + - 7 # Memory + - 8 # CPU + #- 9 # Group ID + #- 10 # Hidden User Data + #- 11 # Labels + #- 12 # Search data + actions: + User.refresh: true + User.create_dialog: true + User.update_password: true + User.login_token: true + User.quotas_dialog: true + User.groups_dialog: false + User.chgrp: false + User.change_authentication: false + User.delete: true + User.edit_labels: true + User.menu_labels: true + groups-tab: + panel_tabs: + group_info_tab: true + group_users_tab: true + group_quotas_tab: true + group_accounting_tab: true + group_showback_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Users + - 4 # VMs + - 5 # Memory + - 6 # CPU + #- 7 # Labels + actions: + Group.refresh: true + Group.create_dialog: false + Group.update_dialog: false + Group.quotas_dialog: false + Group.delete: false + Group.edit_admins: false + Group.edit_labels: true + Group.menu_labels: true + vdcs-tab: + panel_tabs: + vdc_info_tab: true + vdc_groups_tab: true + vdc_resources_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Groups + - 4 # Clusters + - 5 # Hosts + - 6 # VNets + - 7 # Datastores + #- 8 # Labels + actions: + Vdc.refresh: true + Vdc.create_dialog: true + Vdc.update_dialog: true + Vdc.rename: true + Vdc.delete: true + Vdc.edit_labels: true + Vdc.menu_labels: true + acls-tab: + panel_tabs: + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Applies to + - 3 # Affected resources + - 4 # Resource ID / Owned by + - 5 # Allowed operations + - 6 # Zone + #- 7 # ACL String + actions: + Acl.refresh: true + Acl.create_dialog: true + Acl.delete: true + templates-top-tab: + panel_tabs: + actions: + templates-tab: + panel_tabs: + template_info_tab: true + template_template_tab: false + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # Registration time + #- 6 # Labels + #- 7 # Search data + actions: + Template.refresh: true + Template.create_dialog: false + Template.import_dialog: false + Template.update_dialog: false + Template.instantiate_vms: true + Template.rename: true + Template.chown: true + Template.chgrp: false + Template.chmod: false + Template.clone_dialog: true + Template.delete_dialog: true + Template.share: true + Template.unshare: true + Template.edit_labels: true + Template.menu_labels: true + template_creation_tabs: + general: true + storage: true + network: true + os_booting: true + features: true + input_output: true + context: true + actions: true + scheduling: true + hybrid: true + vmgroup: true + other: true + oneflow-templates-tab: + panel_tabs: + service_template_info_tab: true + service_template_roles_tab: true + service_template_template_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + #- 5 # Labels + #- 6 # Search data + actions: + ServiceTemplate.refresh: true + ServiceTemplate.create_dialog: false + ServiceTemplate.update_dialog: false + ServiceTemplate.instantiate: true + ServiceTemplate.chown: false + ServiceTemplate.chgrp: false + ServiceTemplate.chmod: false + ServiceTemplate.rename: false + ServiceTemplate.clone_dialog: false + ServiceTemplate.delete: false + ServiceTemplate.edit_labels: true + ServiceTemplate.menu_labels: true + vrouter-templates-tab: + panel_tabs: + vrouter_template_info_tab: true + vrouter_template_template_tab: false + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # Registration time + #- 6 # Labels + #- 7 # Search data + actions: + VirtualRouterTemplate.refresh: true + VirtualRouterTemplate.create_dialog: false + VirtualRouterTemplate.update_dialog: false + VirtualRouterTemplate.instantiate_dialog: false + VirtualRouterTemplate.rename: true + VirtualRouterTemplate.chown: true + VirtualRouterTemplate.chgrp: false + VirtualRouterTemplate.chmod: false + VirtualRouterTemplate.clone_dialog: true + VirtualRouterTemplate.delete_dialog: true + VirtualRouterTemplate.share: true + VirtualRouterTemplate.unshare: true + VirtualRouterTemplate.edit_labels: true + VirtualRouterTemplate.menu_labels: true + template_creation_tabs: + general: true + storage: true + network: true + os_booting: true + features: true + input_output: true + context: true + scheduling: true + hybrid: true + other: true + instances-top-tab: + panel_tabs: + actions: + vms-tab: + panel_tabs: + vm_info_tab: true + vm_capacity_tab: true + vm_storage_tab: true + vm_network_tab: true + vm_snapshot_tab: false + vm_placement_tab: false + vm_actions_tab: false + vm_conf_tab: false + vm_template_tab: false + vm_log_tab: false + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + #- 3 # Owner + - 4 # Group + - 5 # Status + #- 6 # Used CPU + #- 7 # Used Memory + #- 8 # Host + - 9 # IPs + #- 10 # Start Time + - 11 # VNC + #- 12 # Hidden Template + #- 13 # Labels + #- 14 # Search data + actions: + VM.refresh: true + VM.create_dialog: true + VM.rename: true + VM.chown: true + VM.chgrp: false + VM.chmod: false + VM.deploy: false + VM.migrate: false + VM.migrate_live: false + VM.hold: true + VM.release: true + VM.suspend: false + VM.resume: true + VM.stop: false + VM.recover: false + VM.reboot: true + VM.reboot_hard: true + VM.poweroff: true + VM.poweroff_hard: true + VM.undeploy: true + VM.undeploy_hard: true + VM.terminate: true + VM.terminate_hard: true + VM.resize: false + VM.attachdisk: false + VM.detachdisk: false + VM.disk_saveas: false + VM.disk_resize: false + VM.attachnic: false + VM.detachnic: false + VM.snapshot_create: false + VM.snapshot_revert: false + VM.snapshot_delete: false + VM.disk_snapshot_create: false + VM.disk_snapshot_revert: false + VM.disk_snapshot_delete: false + VM.resched: false + VM.unresched: false + VM.save_as_template: true + VM.updateconf: false + VM.edit_labels: true + VM.menu_labels: true + oneflow-services-tab: + panel_tabs: + service_info_tab: true + service_roles_tab: true + service_log_tab: true + panel_tabs_actions: + service_roles_tab: + Role.scale: true + Role.hold: true + Role.release: true + Role.suspend: false + Role.resume: true + Role.stop: false + Role.reboot: true + Role.reboot_hard: true + Role.poweroff: true + Role.poweroff_hard: true + Role.undeploy: true + Role.undeploy_hard: true + Role.terminate: true + Role.terminate_hard: true + RoleVM.hold: true + RoleVM.release: true + RoleVM.suspend: false + RoleVM.resume: true + RoleVM.stop: false + RoleVM.reboot: true + RoleVM.reboot_hard: true + RoleVM.poweroff: true + RoleVM.poweroff_hard: true + RoleVM.undeploy: true + RoleVM.undeploy_hard: true + RoleVM.terminate: true + RoleVM.terminate_hard: true + RoleVM.resched: false + RoleVM.unresched: false + RoleVM.recover: false + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + #- 3 # Owner + - 4 # Group + - 5 # State + #- 6 # Labels + #- 7 # Search data + actions: + Service.refresh: true + Service.create_dialog: true + Service.chown: true + Service.chgrp: false + Service.chmod: false + Service.rename: true + Service.shutdown: true + Service.recover: true + Service.delete: true + Service.edit_labels: true + Service.menu_labels: true + vrouters-tab: + panel_tabs: + virtual_router_info_tab: true + virtual_router_vms_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + #- 3 # Owner + - 4 # Group + #- 5 # Labels + #- 6 # Search data + actions: + VirtualRouter.refresh: true + VirtualRouter.create_dialog: true + VirtualRouter.rename: true + VirtualRouter.chown: true + VirtualRouter.chgrp: false + VirtualRouter.chmod: false + VirtualRouter.delete: true + VirtualRouter.attachnic: false + VirtualRouter.detachnic: false + VirtualRouter.edit_labels: true + VirtualRouter.menu_labels: true + infrastructure-top-tab: + panel_tabs: + actions: + clusters-tab: + panel_tabs: + cluster_info_tab: true + cluster_host_tab: true + cluster_vnet_tab: true + cluster_datastore_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Hosts + - 4 # VNets + - 5 # Datastores + #- 6 # Labels + actions: + Cluster.refresh: true + Cluster.create_dialog: true + Cluster.update_dialog: true + Cluster.delete: true + Cluster.rename: true + Cluster.edit_labels: true + Cluster.menu_labels: true + hosts-tab: + panel_tabs: + host_info_tab: true + host_monitoring_tab: true + host_vms_tab: true + host_wilds_tab: true + host_zombies_tab: true + host_esx_tab: true + host_pci_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Cluster + - 4 # RVMs + #- 5 # Real CPU + - 6 # Allocated CPU + #- 7 # Real MEM + - 8 # Allocated MEM + - 9 # Status + #- 10 # IM MAD + #- 11 # VM MAD + #- 12 # Last monitored on + #- 13 # Labels + #- 14 # Search data + actions: + Host.refresh: true + Host.create_dialog: true + Host.addtocluster: true + Host.rename: true + Host.enable: true + Host.disable: true + Host.offline: true + Host.delete: true + Host.edit_labels: true + Host.menu_labels: true + zones-tab: + panel_tabs: + zone_info_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Endpoint + #- 4 # Labels + actions: + Zone.refresh: true + Zone.create_dialog: true + Zone.rename: true + Zone.delete: true + Zone.edit_labels: true + Zone.menu_labels: true + storage-top-tab: + panel_tabs: + actions: + datastores-tab: + panel_tabs: + datastore_info_tab: true + datastore_image_tab: true + datastore_clusters_tab: false + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # Capacity + - 6 # Cluster + #- 7 # Basepath + #- 8 # TM + #- 9 # DS + - 10 # Type + - 11 # Status + #- 12 # Labels + #- 13 # Search data + actions: + Datastore.refresh: true + Datastore.create_dialog: true + Datastore.import_dialog: false + Datastore.addtocluster: true + Datastore.rename: true + Datastore.chown: true + Datastore.chgrp: true + Datastore.chmod: true + Datastore.delete: true + Datastore.enable: true + Datastore.disable: true + Datastore.edit_labels: true + Datastore.menu_labels: true + images-tab: + panel_tabs: + image_info_tab: true + image_vms_tab: true + image_snapshots_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # Datastore + #- 6 # Size + - 7 # Type + #- 8 # Registration time + #- 9 # Persistent + - 10 # Status + - 11 # #VMs + #- 12 # Target + #- 13 # Labels + #- 14 # Search data + actions: + Image.refresh: true + Image.create_dialog: true + Image.import_dialog: false + Image.upload_marketplace_dialog: true + Image.rename: true + Image.chown: true + Image.chgrp: true + Image.chmod: true + Image.enable: true + Image.disable: true + Image.persistent: true + Image.nonpersistent: true + Image.clone_dialog: true + Image.delete: true + Image.snapshot_flatten: true + Image.snapshot_revert: true + Image.snapshot_delete: true + Image.edit_labels: true + Image.menu_labels: true + files-tab: + panel_tabs: + file_info_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # Datastore + #- 6 # Size + - 7 # Type + #- 8 # Registration time + #- 9 # Persistent + - 10 # Status + #- 11 # #VMs + #- 12 # Target + #- 13 # Labels + #- 14 # Search data + actions: + File.refresh: true + File.create_dialog: true + File.rename: true + File.chown: true + File.chgrp: true + File.chmod: true + File.enable: true + File.disable: true + File.delete: true + File.edit_labels: true + File.menu_labels: true + marketplaces-tab: + panel_tabs: + marketplace_info_tab: true + marketplace_apps_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # Capacity + - 6 # Apps + - 7 # Driver + - 8 # Zone + #- 9 # Labels + #- 10 # Search data + actions: + MarketPlace.refresh: true + MarketPlace.create_dialog: true + MarketPlace.update_dialog: true + MarketPlace.rename: true + MarketPlace.chown: true + MarketPlace.chgrp: true + MarketPlace.chmod: true + MarketPlace.delete: true + MarketPlace.edit_labels: true + MarketPlace.menu_labels: true + marketplaceapps-tab: + panel_tabs: + marketplaceapp_info_tab: true + marketplaceapp_templates_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + #- 5 # Version + - 6 # Size + - 7 # State + #- 8 # Type + - 9 # Registration + - 10 # Marketplace + - 11 # Zone + #- 12 # Labels + #- 13 # Search data + actions: + MarketPlaceApp.refresh: true + MarketPlaceApp.create_dialog: true + MarketPlaceApp.download_opennebula_dialog: true + MarketPlaceApp.download_local: true + MarketPlaceApp.rename: true + MarketPlaceApp.chown: true + MarketPlaceApp.chgrp: true + MarketPlaceApp.chmod: true + MarketPlaceApp.enable: true + MarketPlaceApp.disable: true + MarketPlaceApp.delete: true + MarketPlaceApp.edit_labels: true + MarketPlaceApp.menu_labels: true + network-top-tab: + panel_tabs: + actions: + vnets-tab: + panel_tabs: + vnet_info_tab: false + vnet_ar_list_tab: false + vnet_leases_tab: true + vnet_sg_list_tab: true + vnet_vr_list_tab: false + vnet_clusters_tab: false + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + #- 3 # Owner + #- 4 # Group + #- 5 # Reservation + #- 6 # Cluster + #- 7 # Bridge + #- 8 # Leases + #- 9 # VLAN ID + #- 10 # Labels + #- 11 # Search data + actions: + Network.refresh: true + Network.create_dialog: false + Network.import_dialog: false + Network.update_dialog: false + Network.reserve_dialog: false + Network.addtocluster: false + Network.rename: false + Network.chown: false + Network.chgrp: false + Network.chmod: false + Network.delete: false + Network.hold_lease: false + Network.release_lease: false + Network.add_ar: false + Network.remove_ar: false + Network.update_ar: false + Network.edit_labels: true + Network.menu_labels: true + vnets-topology-tab: + panel_tabs: + actions: + NetworkTopology.refresh: true + NetworkTopology.fit: true + NetworkTopology.collapseVMs: true + NetworkTopology.openVMs: true + secgroups-tab: + panel_tabs: + security_group_info_tab: true + security_group_vms_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + #- 2 # Name + #- 3 # Owner + - 4 # Group + #- 5 # Labels + #- 6 # Search data + actions: + SecurityGroup.refresh: true + SecurityGroup.create_dialog: false + SecurityGroup.update_dialog: false + SecurityGroup.rename: false + SecurityGroup.chown: false + SecurityGroup.chgrp: false + SecurityGroup.chmod: false + SecurityGroup.clone_dialog: false + SecurityGroup.commit_dialog: false + SecurityGroup.delete: false + SecurityGroup.edit_labels: true + SecurityGroup.menu_labels: true + support-tab: + panel_tabs: + support_info_tab: true + table_columns: + #- 0 # Checkbox + - 1 # ID + - 2 # Subject + - 3 # Created at + - 4 # Status + actions: + Support.refresh: true + Support.create_dialog: true + settings-tab: + panel_tabs: + settings_info_tab: true + settings_config_tab: false + settings_quotas_tab: true + settings_group_quotas_tab: true + settings_accounting_tab: true + settings_showback_tab: true + settings_auth_tab: true + actions: + # Buttons for settings_info_tab + User.update_password: true + User.login_token: true + # Buttons for settings_config_tab + Settings.change_language: true + Settings.change_password: true + Settings.change_view: true + Settings.ssh_key: true + Settings.login_token: true + # Edit button in settings_quotas_tab + User.quotas_dialog: false + upgrade-top-tab: + panel_tabs: + actions: + vmgroup-tab: + panel_tabs: + vm_group_info_tab: true + vm_group_vms_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # Vms + #- 6 # Labels + #- 7 # Search data + actions: + VMGroup.create_dialog: true + VMGroup.update_dialog: true + VMGroup.chmod: true + VMGroup.chown: true + VMGroup.chgrp: true diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/templates/mixed-user.yaml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/templates/mixed-user.yaml new file mode 100644 index 0000000000000000000000000000000000000000..6e0a9a1c86bbd528526af474fd91427b639a9c2c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/templates/mixed-user.yaml @@ -0,0 +1,849 @@ +%set oneflow = %%getVar('activer_oneflow','non') == 'oui' +small_logo: images/opennebula-5.0.png +provision_logo: images/opennebula-5.0.png +link_logo: +text_link_logo: +confirm_vms: false +filter-view: true +enabled_tabs: + - dashboard-tab + - instances-top-tab + - vms-tab +%if %%oneflow + - oneflow-services-tab +%end if + - vrouters-tab + - templates-top-tab + - templates-tab +%if %%oneflow + - oneflow-templates-tab +%end if + - vrouter-templates-tab + - storage-top-tab + - datastores-tab + - images-tab + - files-tab + - marketplaces-tab + - marketplaceapps-tab + - network-top-tab + - vnets-tab + - vnets-topology-tab + - secgroups-tab + #- infrastructure-top-tab + #- clusters-tab + #- hosts-tab + #- zones-tab + #- system-top-tab + #- users-tab + #- groups-tab + #- vdcs-tab + #- acls-tab + - settings-tab + #- support-tab + #- upgrade-top-tab + - vmgroup-tab +features: + # True to show showback monthly reports, and VM cost + showback: true + + # Allows to change the security groups for each network interface + # on the VM creation dialog + secgroups: true + + # True to hide the CPU setting in the VM creation dialog + instantiate_hide_cpu: false + + # False to not scale the CPU. Number to scale from VCPU + instantiate_cpu_factor: false + + # True to show the option to make an instance persistent + instantiate_persistent: true + + # True to show the datastore datatable to instantiate VM + show_ds_instantiate: false + + # True to show the vmgroup datatable to instantiate VM + show_vmgroup_instantiate: true + + # True to show the vnet datatable to instantiate VM + show_vnet_instantiate: true + + # True to show the host datatable to instantiate VM + show_host_instantiate: false + + # True to show an input to specify the the VMs and Template path/folder where a vCenter VM will + # deployed to + vcenter_vm_folder: false + + # True to show the monitoring info (VM & VRouters) + show_monitoring_info: true + + # True to show the attributes info (VM & VRouters) + show_attributes_info: true +tabs: + dashboard-tab: + # The following widgets can be used inside any of the '_per_row' settings + # bellow. As the name suggest, the widgets will be scaled to fit one, + # two, or three per row. The footer uses the widgets at full size, i.e. + # one per row. + # + # - storage + # - users + # - network + # - hosts + # - vms + # - groupquotas + # - quotas + panel_tabs: + actions: + Dashboard.refresh: false + Sunstone.toggle_top: false + widgets_one_per_row: + - vms + widgets_three_per_row: + widgets_two_per_row: + - network + - storage + widgets_one_footer: + system-top-tab: + panel_tabs: + actions: + users-tab: + panel_tabs: + user_info_tab: true + user_quotas_tab: true + user_groups_tab: true + user_accounting_tab: true + user_showback_tab: true + user_auth_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Group + - 4 # Auth driver + #- 5 # Password + - 6 # VMs + - 7 # Memory + - 8 # CPU + #- 9 # Group ID + #- 10 # Hidden User Data + #- 11 # Labels + #- 12 # Search data + actions: + User.refresh: true + User.create_dialog: true + User.update_password: true + User.login_token: true + User.quotas_dialog: true + User.groups_dialog: true + User.chgrp: true + User.change_authentication: true + User.delete: true + User.edit_labels: true + User.menu_labels: true + groups-tab: + panel_tabs: + group_info_tab: true + group_users_tab: true + group_quotas_tab: true + group_accounting_tab: true + group_showback_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Users + - 4 # VMs + - 5 # Memory + - 6 # CPU + #- 7 # Labels + actions: + Group.refresh: true + Group.create_dialog: true + Group.update_dialog: true + Group.quotas_dialog: true + Group.delete: true + Group.edit_admins: true + Group.edit_labels: true + Group.menu_labels: true + vdcs-tab: + panel_tabs: + vdc_info_tab: true + vdc_groups_tab: true + vdc_resources_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Groups + - 4 # Clusters + - 5 # Hosts + - 6 # VNets + - 7 # Datastores + #- 8 # Labels + actions: + Vdc.refresh: true + Vdc.create_dialog: true + Vdc.update_dialog: true + Vdc.rename: true + Vdc.delete: true + Vdc.edit_labels: true + Vdc.menu_labels: true + acls-tab: + panel_tabs: + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Applies to + - 3 # Affected resources + - 4 # Resource ID / Owned by + - 5 # Allowed operations + - 6 # Zone + #- 7 # ACL String + actions: + Acl.refresh: true + Acl.create_dialog: true + Acl.delete: true + templates-top-tab: + panel_tabs: + actions: + templates-tab: + panel_tabs: + template_info_tab: true + template_template_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Owner + - 3 # Group + - 4 # Name + - 5 # Registration time + #- 6 # Labels + #- 7 # Search data + actions: + Template.refresh: true + Template.create_dialog: true + Template.import_dialog: false + Template.update_dialog: true + Template.instantiate_vms: true + Template.rename: true + Template.chown: false + Template.chgrp: false + Template.chmod: true + Template.clone_dialog: true + Template.delete_dialog: true + Template.share: true + Template.unshare: true + Template.edit_labels: true + Template.menu_labels: true + template_creation_tabs: + general: true + storage: true + network: true + os_booting: true + features: true + input_output: true + context: true + actions: true + scheduling: false + hybrid: true + vmgroup: true + other: true + oneflow-templates-tab: + panel_tabs: + service_template_info_tab: true + service_template_roles_tab: true + service_template_template_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Owner + - 3 # Group + - 4 # Name + #- 5 # Labels + #- 6 # Search data + actions: + ServiceTemplate.refresh: true + ServiceTemplate.create_dialog: true + ServiceTemplate.update_dialog: true + ServiceTemplate.instantiate: true + ServiceTemplate.chown: false + ServiceTemplate.chgrp: false + ServiceTemplate.chmod: true + ServiceTemplate.rename: true + ServiceTemplate.clone_dialog: true + ServiceTemplate.delete: true + ServiceTemplate.edit_labels: true + ServiceTemplate.menu_labels: true + vrouter-templates-tab: + panel_tabs: + vrouter_template_info_tab: true + vrouter_template_template_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Owner + - 3 # Group + - 4 # Name + - 5 # Registration time + #- 6 # Labels + #- 7 # Search data + actions: + VirtualRouterTemplate.refresh: true + VirtualRouterTemplate.create_dialog: true + VirtualRouterTemplate.update_dialog: true + VirtualRouterTemplate.instantiate_dialog: true + VirtualRouterTemplate.rename: true + VirtualRouterTemplate.chown: false + VirtualRouterTemplate.chgrp: false + VirtualRouterTemplate.chmod: true + VirtualRouterTemplate.clone_dialog: true + VirtualRouterTemplate.delete_dialog: true + VirtualRouterTemplate.share: true + VirtualRouterTemplate.unshare: true + VirtualRouterTemplate.edit_labels: true + VirtualRouterTemplate.menu_labels: true + template_creation_tabs: + general: true + storage: true + network: true + os_booting: true + features: true + input_output: true + context: true + scheduling: true + hybrid: true + other: true + instances-top-tab: + panel_tabs: + actions: + vms-tab: + panel_tabs: + vm_info_tab: true + vm_capacity_tab: true + vm_storage_tab: true + vm_network_tab: true + vm_snapshot_tab: true + vm_placement_tab: false + vm_actions_tab: true + vm_conf_tab: true + vm_template_tab: false + vm_log_tab: false + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Owner + - 3 # Group + - 4 # Name + - 5 # Status + #- 6 # Used CPU + #- 7 # Used Memory + - 8 # Host + - 9 # IPs + #- 10 # Start Time + - 11 # VNC + #- 12 # Hidden Template + #- 13 # Labels + #- 14 # Search data + actions: + VM.refresh: true + VM.create_dialog: true + VM.rename: true + VM.chown: false + VM.chgrp: false + VM.chmod: true + VM.deploy: false + VM.migrate: false + VM.migrate_live: false + VM.hold: true + VM.release: true + VM.suspend: true + VM.resume: true + VM.stop: true + VM.recover: false + VM.reboot: true + VM.reboot_hard: true + VM.poweroff: true + VM.poweroff_hard: true + VM.undeploy: true + VM.undeploy_hard: true + VM.terminate: true + VM.terminate_hard: true + VM.resize: true + VM.attachdisk: true + VM.detachdisk: true + VM.disk_saveas: true + VM.disk_resize: false + VM.attachnic: true + VM.detachnic: true + VM.snapshot_create: true + VM.snapshot_revert: true + VM.snapshot_delete: true + VM.disk_snapshot_create: true + VM.disk_snapshot_revert: true + VM.disk_snapshot_delete: true + VM.resched: false + VM.unresched: false + VM.save_as_template: true + VM.updateconf: true + VM.edit_labels: true + VM.menu_labels: true + oneflow-services-tab: + panel_tabs: + service_info_tab: true + service_roles_tab: true + service_log_tab: true + panel_tabs_actions: + service_roles_tab: + Role.scale: true + Role.hold: true + Role.release: true + Role.suspend: true + Role.resume: true + Role.stop: true + Role.reboot: true + Role.reboot_hard: true + Role.poweroff: true + Role.poweroff_hard: true + Role.undeploy: true + Role.undeploy_hard: true + Role.terminate: true + Role.terminate_hard: true + RoleVM.hold: true + RoleVM.release: true + RoleVM.suspend: true + RoleVM.resume: true + RoleVM.stop: true + RoleVM.reboot: true + RoleVM.reboot_hard: true + RoleVM.poweroff: true + RoleVM.poweroff_hard: true + RoleVM.undeploy: true + RoleVM.undeploy_hard: true + RoleVM.terminate: true + RoleVM.terminate_hard: true + RoleVM.resched: false + RoleVM.unresched: false + RoleVM.recover: false + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Owner + - 3 # Group + - 4 # Name + - 5 # State + #- 6 # Labels + #- 7 # Search data + actions: + Service.refresh: true + Service.create_dialog: true + Service.chown: false + Service.chgrp: false + Service.chmod: true + Service.rename: true + Service.shutdown: true + Service.recover: true + Service.delete: true + Service.edit_labels: true + Service.menu_labels: true + vrouters-tab: + panel_tabs: + virtual_router_info_tab: true + virtual_router_vms_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Owner + - 3 # Group + - 4 # Name + #- 5 # Labels + #- 6 # Search data + actions: + VirtualRouter.refresh: true + VirtualRouter.create_dialog: true + VirtualRouter.rename: true + VirtualRouter.chown: true + VirtualRouter.chgrp: true + VirtualRouter.chmod: true + VirtualRouter.delete: true + VirtualRouter.attachnic: true + VirtualRouter.detachnic: true + VirtualRouter.edit_labels: true + VirtualRouter.menu_labels: true + infrastructure-top-tab: + panel_tabs: + actions: + clusters-tab: + panel_tabs: + cluster_info_tab: true + cluster_host_tab: true + cluster_vnet_tab: true + cluster_datastore_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Hosts + - 4 # VNets + - 5 # Datastores + #- 6 # Labels + actions: + Cluster.refresh: true + Cluster.create_dialog: true + Cluster.update_dialog: true + Cluster.delete: true + Cluster.rename: true + Cluster.edit_labels: true + Cluster.menu_labels: true + hosts-tab: + panel_tabs: + host_info_tab: true + host_monitoring_tab: true + host_vms_tab: true + host_wilds_tab: true + host_zombies_tab: true + host_esx_tab: true + host_pci_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Cluster + - 4 # RVMs + #- 5 # Real CPU + - 6 # Allocated CPU + #- 7 # Real MEM + - 8 # Allocated MEM + - 9 # Status + #- 10 # IM MAD + #- 11 # VM MAD + #- 12 # Last monitored on + #- 13 # Labels + #- 14 # Search data + actions: + Host.refresh: true + Host.create_dialog: true + Host.addtocluster: true + Host.rename: true + Host.enable: true + Host.disable: true + Host.offline: true + Host.delete: true + Host.edit_labels: true + Host.menu_labels: true + zones-tab: + panel_tabs: + zone_info_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Endpoint + #- 4 # Labels + actions: + Zone.refresh: true + Zone.create_dialog: true + Zone.rename: true + Zone.delete: true + Zone.edit_labels: true + Zone.menu_labels: true + storage-top-tab: + panel_tabs: + actions: + datastores-tab: + panel_tabs: + datastore_info_tab: false + datastore_image_tab: true + datastore_clusters_tab: false + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Owner + - 3 # Group + - 4 # Name + - 5 # Capacity + - 6 # Cluster + #- 7 # Basepath + #- 8 # TM + #- 9 # DS + #- 10 # Type + #- 11 # Status + #- 12 # Labels + #- 13 # Search data + actions: + Datastore.refresh: true + Datastore.create_dialog: false + Datastore.import_dialog: false + Datastore.addtocluster: false + Datastore.rename: true + Datastore.chown: false + Datastore.chgrp: false + Datastore.chmod: true + Datastore.delete: false + Datastore.enable: false + Datastore.disable: false + Datastore.edit_labels: true + Datastore.menu_labels: true + images-tab: + panel_tabs: + image_info_tab: true + image_vms_tab: true + image_snapshots_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Owner + - 3 # Group + - 4 # Name + - 5 # Datastore + #- 6 # Size + - 7 # Type + #- 8 # Registration time + #- 9 # Persistent + - 10 # Status + - 11 # #VMs + #- 12 # Target + #- 13 # Labels + #- 14 # Search data + actions: + Image.refresh: true + Image.create_dialog: true + Image.import_dialog: false + Image.upload_marketplace_dialog: true + Image.rename: true + Image.chown: false + Image.chgrp: false + Image.chmod: true + Image.enable: true + Image.disable: true + Image.persistent: true + Image.nonpersistent: true + Image.clone_dialog: true + Image.delete: true + Image.snapshot_flatten: true + Image.snapshot_revert: true + Image.snapshot_delete: true + Image.edit_labels: true + Image.menu_labels: true + files-tab: + panel_tabs: + file_info_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Owner + - 3 # Group + - 4 # Name + - 5 # Datastore + #- 6 # Size + - 7 # Type + #- 8 # Registration time + #- 9 # Persistent + - 10 # Status + #- 11 # #VMs + #- 12 # Target + #- 13 # Labels + #- 14 # Search data + actions: + File.refresh: true + File.create_dialog: true + File.rename: true + File.chown: false + File.chgrp: false + File.chmod: true + File.enable: true + File.disable: true + File.delete: true + File.edit_labels: true + File.menu_labels: true + marketplaces-tab: + panel_tabs: + marketplace_info_tab: true + marketplace_apps_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Owner + - 3 # Group + - 4 # Name + - 5 # Capacity + - 6 # Apps + - 7 # Driver + - 8 # Zone + #- 9 # Labels + #- 10 # Search data + actions: + MarketPlace.refresh: true + MarketPlace.create_dialog: true + MarketPlace.update_dialog: true + MarketPlace.rename: true + MarketPlace.chown: true + MarketPlace.chgrp: true + MarketPlace.chmod: true + MarketPlace.delete: true + MarketPlace.edit_labels: true + MarketPlace.menu_labels: true + marketplaceapps-tab: + panel_tabs: + marketplaceapp_info_tab: true + marketplaceapp_templates_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Owner + - 3 # Group + - 4 # Name + #- 5 # Version + - 6 # Size + - 7 # State + #- 8 # Type + - 9 # Registration + - 10 # Marketplace + - 11 # Zone + #- 12 # Labels + #- 13 # Search data + actions: + MarketPlaceApp.refresh: true + MarketPlaceApp.create_dialog: true + MarketPlaceApp.download_opennebula_dialog: true + MarketPlaceApp.download_local: true + MarketPlaceApp.rename: true + MarketPlaceApp.chown: true + MarketPlaceApp.chgrp: true + MarketPlaceApp.chmod: true + MarketPlaceApp.enable: true + MarketPlaceApp.disable: true + MarketPlaceApp.delete: true + MarketPlaceApp.edit_labels: true + MarketPlaceApp.menu_labels: true + network-top-tab: + panel_tabs: + actions: + vnets-tab: + panel_tabs: + vnet_info_tab: true + vnet_ar_list_tab: true + vnet_leases_tab: true + vnet_sg_list_tab: true + vnet_vr_list_tab: true + vnet_clusters_tab: false + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Owner + - 3 # Group + - 4 # Name + - 5 # Reservation + - 6 # Cluster + #- 7 # Bridge + - 8 # Leases + #- 9 # VLAN ID + #- 10 # Labels + #- 11 # Search data + actions: + Network.refresh: true + Network.create_dialog: false + Network.import_dialog: false + Network.update_dialog: true + Network.reserve_dialog: true + Network.addtocluster: false + Network.rename: true + Network.chown: false + Network.chgrp: false + Network.chmod: true + Network.delete: true + Network.hold_lease: true + Network.release_lease: true + Network.add_ar: false + Network.remove_ar: true + Network.update_ar: true + Network.edit_labels: true + Network.menu_labels: true + vnets-topology-tab: + panel_tabs: + actions: + NetworkTopology.refresh: true + NetworkTopology.fit: true + NetworkTopology.collapseVMs: true + NetworkTopology.openVMs: true + secgroups-tab: + panel_tabs: + security_group_info_tab: true + security_group_vms_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Owner + - 3 # Group + - 4 # Name + #- 5 # Labels + #- 6 # Search data + actions: + SecurityGroup.refresh: true + SecurityGroup.create_dialog: true + SecurityGroup.update_dialog: true + SecurityGroup.rename: true + SecurityGroup.chown: true + SecurityGroup.chgrp: true + SecurityGroup.chmod: true + SecurityGroup.clone_dialog: true + SecurityGroup.commit_dialog: true + SecurityGroup.delete: true + SecurityGroup.edit_labels: true + SecurityGroup.menu_labels: true + support-tab: + panel_tabs: + support_info_tab: true + table_columns: + #- 0 # Checkbox + - 1 # ID + - 2 # Subject + - 3 # Created at + - 4 # Status + actions: + Support.refresh: true + Support.create_dialog: true + settings-tab: + panel_tabs: + settings_info_tab: true + settings_config_tab: false + settings_quotas_tab: true + settings_group_quotas_tab: true + settings_accounting_tab: true + settings_showback_tab: true + settings_auth_tab: true + actions: + # Buttons for settings_info_tab + User.update_password: true + User.login_token: true + # Buttons for settings_config_tab + Settings.change_language: true + Settings.change_password: true + Settings.change_view: true + Settings.ssh_key: true + Settings.login_token: true + # Edit button in settings_quotas_tab + User.quotas_dialog: false + upgrade-top-tab: + panel_tabs: + actions: + vmgroup-tab: + panel_tabs: + vm_group_info_tab: true + vm_group_vms_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Group + - 4 # Owner + - 5 # Vms + #- 6 # Labels + #- 7 # Search data + actions: + VMGroup.create_dialog: true + VMGroup.update_dialog: true + VMGroup.chmod: true + VMGroup.chown: true + VMGroup.chgrp: true diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/templates/nginx-nebula.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/templates/nginx-nebula.conf new file mode 100644 index 0000000000000000000000000000000000000000..c3830a2487e0dcdc9885b20c2ebb543dc248a220 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/templates/nginx-nebula.conf @@ -0,0 +1,30 @@ +#### OpenNebula Sunstone upstream +upstream sunstone { + server %%adresse_ip_eth0:%%port_sunstone; +} + +#### cloudserver.org HTTP virtual host +server { + listen 80; + server_name cloudserver.org; + + ### Permanent redirect to HTTPS (optional) + return 301 https://$server_name:443; +} + +#### cloudserver.org HTTPS virtual host +server { + listen 443; + server_name cloudserver.org; + + ### SSL Parameters + ssl on; + ssl_certificate %%server_pem; + ssl_certificate_key %%server_key; + + client_max_body_size 1536M; + ### Proxy requests to upstream + location / { + proxy_pass http://sunstone; + } +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/templates/sunstone-logos.yaml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/templates/sunstone-logos.yaml new file mode 100644 index 0000000000000000000000000000000000000000..ddd42d119f9332da21c498b5415cacb044a22296 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/templates/sunstone-logos.yaml @@ -0,0 +1,19 @@ +# You can add custom logos here, or disable any of the default ones commenting +# out its line +- { 'name': "Alpine Linux", 'path': "images/logos/alpine.png"} +- { 'name': "ALT", 'path': "images/logos/alt.png"} +- { 'name': "Arch Linux", 'path': "images/logos/arch.png"} +- { 'name': "CentOS", 'path': "images/logos/centos.png"} +- { 'name': "Debian", 'path': "images/logos/debian.png"} +- { 'name': "Fedora", 'path': "images/logos/fedora.png"} +- { 'name': "FreeBSD", 'path': "images/logos/freebsd.png"} +- { 'name': "HardenedBSD", 'path': "images/logos/hardenedbsd.png"} +- { 'name': "Knoppix", 'path': "images/logos/knoppix-logo.png"} +- { 'name': "Linux", 'path': "images/logos/linux.png"} +- { 'name': "Oracle", 'path': "images/logos/oel.png"} +- { 'name': "Redhat", 'path': "images/logos/redhat.png"} +- { 'name': "SUSE", 'path': "images/logos/suse.png"} +- { 'name': "Ubuntu", 'path': "images/logos/ubuntu.png"} +- { 'name': "Windows XP/2003", 'path': "images/logos/windowsxp.png"} +- { 'name': "Windows 8/2012", 'path': "images/logos/windows8.png"} +- { 'name': "Windows 10/2016", 'path': "images/logos/windows8.png"} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/templates/sunstone-server.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/templates/sunstone-server.conf new file mode 100644 index 0000000000000000000000000000000000000000..650127163dfc76f9b3af4f65d063188e560d29d8 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/templates/sunstone-server.conf @@ -0,0 +1,196 @@ +# -------------------------------------------------------------------------- # +# Copyright 2002-2018, OpenNebula Project, OpenNebula Systems # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); you may # +# not use this file except in compliance with the License. You may obtain # +# a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +#--------------------------------------------------------------------------- # + +################################################################################ +# Server Configuration +################################################################################ + +# Directory to store temp files when uploading images +# +:tmpdir: /var/tmp + +# OpenNebula sever contact information +# +%if %%activer_one_ha == 'oui' +:one_xmlrpc: http://%%adresse_ip_eth0:2633/RPC2 +%else +:one_xmlrpc: http://localhost:2633/RPC2 +%end if +:one_xmlrpc_timeout: 60 + +# Server Configuration +# +%if %%activer_one_ha == 'oui' +:host: 0.0.0.0 +:port: %%port_sunstone +%else +:host: %%ip_sunstone +:port: %%port_sunstone +%end if + +# Place where to store sessions, this value can be memory, memcache or memcache-dalli +# Use memcache when starting multiple server processes, for example, +# with passenger +# +# NOTE. memcache needs a separate memcached server to be configured. Refer +# to memcached documentation to configure the server. +:sessions: memory + +# Memcache configuration +:memcache_host: localhost +:memcache_port: 11211 +:memcache_namespace: opennebula.sunstone + +# Excution environment for Sunstone +# dev, Instead of pulling the minified js all the files will be pulled (app/main.js) +# Check the Building from Source guide in the docs, for details on how to run +# Sunstone in development +# prod, the minified js will be used (dist/main.js) +:env: 'prod' + +# Maximum allowed size of uploaded images (in bytes). Leave commented for +# unlimited size +# :max_upload_file_size: 10737418240 # 10 GiB + +################################################################################ +# Log +################################################################################ + +# Log debug level +# 0 = ERROR, 1 = WARNING, 2 = INFO, 3 = DEBUG +# +:debug_level: 3 + +################################################################################ +# Proxy +################################################################################ + +# Enable an http proxy for the support portal and to download MarketPlaceApps +# from the MarketPlace to the user's desktop. +# :proxy: http://<hostname>:<port> + +################################################################################ +# Auth +################################################################################ + +# Authentication driver for incoming requests +# sunstone: for OpenNebula's user-password scheme +# x509: for x509 certificates based authentication +# opennebula: the authentication will be done by the opennebula core using the +# driver defined for the user +# remote: performs the login based on a Kerberos REMOTE_USER +# +:auth: opennebula + +# Authentication driver to communicate with OpenNebula core +# cipher, for symmetric cipher encryption of tokens +# x509, for x509 certificate encryption of tokens +# +:core_auth: cipher + +################################################################################ +# Check Upgrades +################################################################################ + +# To check for the latest release. Comment this value if you don't want to check +# this. +:remote_version: http://downloads.opennebula.org/latest + +################################################################################ +# UI Settings +################################################################################ +# :vnc_proxy_ +# port: port where the vnc proxy will listen +# support_wss: no | yes | only. For yes and only, provide path to +# cert and key. "yes" means both ws and wss connections will be +# supported. +# vnc_proxy_cert: Certificate to encrypt wss connections. +# vnc_proxy_key: Key for wss connections. Only necessary if not included in cert. +# vnc_proxy_ipv6: Enable ipv6 support for novnc-server +# +# :vnc_request_password: true | false +# Request VNC password for external windows, by default it will not be requested +# +:vnc_proxy_port: %%vnc_proxy_port_sunstone +:vnc_proxy_support_wss: yes +:vnc_proxy_cert: /etc/one/ssl/certs/novnc.crt +:vnc_proxy_key: /etc/one/ssl/private/novnc.key +:vnc_proxy_ipv6: false +:vnc_request_password: false + +# Login Session Length in seconds, defaults to 1 hour. +#:session_expire_time: 3600 + +# Default language setting +:lang: %%langue_sunstone + +# Default table order +:table_order: desc + +# Default views directory +:mode: '%%sunstone_view_mode' + +################################################################################ +# Marketplace +################################################################################ + +# Marketplace username and password +# If no credentials are provided, an anonymous client will be used +# +#:marketplace_username: +#:marketplace_password: + +# Marketplace endpoint +# The url should not include the /appliance path since it will be automatically +# included +# +:marketplace_url: http://marketplace.opennebula.systems/ + +%if %%getVar('activer_oneflow', 'non') == 'oui' +################################################################################ +# OneFlow +################################################################################ + +# OneFlow endpoint +# +:oneflow_server: http://%%getVar('ip_oneflow','172.0.0.1'):%%getVar('port_oneflow','2474')/ +%end if + +################################################################################ +# Routes +################################################################################ + +# Array of files containing ruby code to extend the default sunstone-server +# routes. These files must be placed inside the custom_routes directory +# in the sunstone root dir (/usr/lib/one/sunstone/routes) +# +# Example: +# $ ls /usr/lib/one/sunstone/routes +# custom.rb other.rb +# +# $ cat /usr/lib/one/sunstone/routes/example.rb +# get '/custom' do +# body "It works" +# end +# +#:routes: +# - custom +# - other + +:routes: + - oneflow + - vcenter + - support diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/templates/vcenter-admin.yaml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/templates/vcenter-admin.yaml new file mode 100644 index 0000000000000000000000000000000000000000..c6cacecd565797f9a62068f71fc8c31131abf20b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/templates/vcenter-admin.yaml @@ -0,0 +1,855 @@ +%set oneflow = %%getVar('activer_oneflow','non') == 'oui' +small_logo: images/opennebula-5.0.png +provision_logo: images/opennebula-5.0.png +link_logo: +text_link_logo: +confirm_vms: false +filter-view: true +enabled_tabs: + - dashboard-tab + - instances-top-tab + - vms-tab +%if %%oneflow + - oneflow-services-tab +%end if + - vrouters-tab + - templates-top-tab + - templates-tab +%if %%oneflow + - oneflow-templates-tab +%end if + - vrouter-templates-tab + - storage-top-tab + - datastores-tab + - images-tab + #- files-tab + - marketplaces-tab + - marketplaceapps-tab + - network-top-tab + - vnets-tab + - vnets-topology-tab + #- secgroups-tab + - infrastructure-top-tab + - clusters-tab + - hosts-tab + - zones-tab + - system-top-tab + - users-tab + - groups-tab + - vdcs-tab + - acls-tab + - settings-tab + - support-tab + - upgrade-top-tab + - vmgroup-tab +features: + # True to show showback monthly reports, and VM cost + showback: true + + # Allows to change the security groups for each network interface + # on the VM creation dialog + secgroups: false + + # True to hide the CPU setting in the VM creation dialog + instantiate_hide_cpu: false + + # False to not scale the CPU. Number to scale from VCPU + instantiate_cpu_factor: false + + # True to show the option to make an instance persistent + instantiate_persistent: true + + # True to show the datastore datatable to instantiate VM + show_ds_instantiate: false + + # True to show the vmgroup datatable to instantiate VM + show_vmgroup_instantiate: true + + # True to show the vnet datatable to instantiate VM + show_vnet_instantiate: true + + # True to show the host datatable to instantiate VM + show_host_instantiate: false + + # True to show an input to specify the the VMs and Template path/folder where a vCenter VM will + # deployed to + vcenter_vm_folder: true + + # True to show the monitoring info (VM & VRouters) + show_monitoring_info: true + + # True to show the attributes info (VM & VRouters) + show_attributes_info: true + + # True to show the user datatable to instantiate VM + show_as_uid_instantiate: true + + # True to show the group datatable to instantiate VM + show_as_gid_instantiate: true +tabs: + dashboard-tab: + # The following widgets can be used inside any of the '_per_row' settings + # bellow. As the name suggest, the widgets will be scaled to fit one, + # two, or three per row. The footer uses the widgets at full size, i.e. + # one per row. + # + # - storage + # - users + # - network + # - hosts + # - vms + # - groupquotas + # - quotas + panel_tabs: + actions: + Dashboard.refresh: false + Sunstone.toggle_top: false + widgets_one_per_row: + - hosts + widgets_three_per_row: + widgets_two_per_row: + - vms + - users + widgets_one_footer: + system-top-tab: + panel_tabs: + actions: + users-tab: + panel_tabs: + user_info_tab: true + user_quotas_tab: true + user_groups_tab: true + user_accounting_tab: true + user_showback_tab: true + user_auth_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Group + - 4 # Auth driver + #- 5 # Password + - 6 # VMs + - 7 # Memory + - 8 # CPU + #- 9 # Group ID + #- 10 # Hidden User Data + #- 11 # Labels + #- 12 # Search data + actions: + User.refresh: true + User.create_dialog: true + User.update_password: true + User.login_token: true + User.quotas_dialog: true + User.groups_dialog: true + User.chgrp: true + User.change_authentication: true + User.delete: true + User.edit_labels: true + User.menu_labels: true + groups-tab: + panel_tabs: + group_info_tab: true + group_users_tab: true + group_quotas_tab: true + group_accounting_tab: true + group_showback_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Users + - 4 # VMs + - 5 # Memory + - 6 # CPU + #- 7 # Labels + actions: + Group.refresh: true + Group.create_dialog: true + Group.update_dialog: true + Group.quotas_dialog: true + Group.delete: true + Group.edit_admins: true + Group.edit_labels: true + Group.menu_labels: true + vdcs-tab: + panel_tabs: + vdc_info_tab: true + vdc_groups_tab: true + vdc_resources_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Groups + - 4 # Clusters + - 5 # Hosts + - 6 # VNets + - 7 # Datastores + #- 8 # Labels + actions: + Vdc.refresh: true + Vdc.create_dialog: true + Vdc.update_dialog: true + Vdc.rename: true + Vdc.delete: true + Vdc.edit_labels: true + Vdc.menu_labels: true + acls-tab: + panel_tabs: + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Applies to + - 3 # Affected resources + - 4 # Resource ID / Owned by + - 5 # Allowed operations + - 6 # Zone + #- 7 # ACL String + actions: + Acl.refresh: true + Acl.create_dialog: true + Acl.delete: true + templates-top-tab: + panel_tabs: + actions: + templates-tab: + panel_tabs: + template_info_tab: true + template_template_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # Registration time + #- 6 # Labels + #- 7 # Search data + actions: + Template.refresh: true + Template.create_dialog: true + Template.import_dialog: true + Template.update_dialog: true + Template.instantiate_vms: true + Template.rename: true + Template.chown: true + Template.chgrp: true + Template.chmod: true + Template.clone_dialog: true + Template.delete_dialog: true + Template.share: false + Template.unshare: false + Template.edit_labels: true + Template.menu_labels: true + template_creation_tabs: + general: true + storage: true + network: true + os_booting: true + features: true + input_output: true + context: true + actions: true + scheduling: true + hybrid: true + vmgroup: true + other: true + oneflow-templates-tab: + panel_tabs: + service_template_info_tab: true + service_template_roles_tab: true + service_template_template_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + #- 5 # Labels + #- 6 # Search data + actions: + ServiceTemplate.refresh: true + ServiceTemplate.create_dialog: true + ServiceTemplate.update_dialog: true + ServiceTemplate.instantiate: true + ServiceTemplate.chown: true + ServiceTemplate.chgrp: true + ServiceTemplate.chmod: true + ServiceTemplate.rename: true + ServiceTemplate.clone_dialog: true + ServiceTemplate.delete: true + ServiceTemplate.edit_labels: true + ServiceTemplate.menu_labels: true + vrouter-templates-tab: + panel_tabs: + vrouter_template_info_tab: true + vrouter_template_template_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # Registration time + #- 6 # Labels + #- 7 # Search data + actions: + VirtualRouterTemplate.refresh: true + VirtualRouterTemplate.create_dialog: true + VirtualRouterTemplate.update_dialog: true + VirtualRouterTemplate.instantiate_dialog: true + VirtualRouterTemplate.rename: true + VirtualRouterTemplate.chown: true + VirtualRouterTemplate.chgrp: true + VirtualRouterTemplate.chmod: true + VirtualRouterTemplate.clone_dialog: true + VirtualRouterTemplate.delete_dialog: true + VirtualRouterTemplate.share: false + VirtualRouterTemplate.unshare: false + VirtualRouterTemplate.edit_labels: true + VirtualRouterTemplate.menu_labels: true + template_creation_tabs: + general: true + storage: true + network: true + os_booting: true + features: true + input_output: true + context: true + scheduling: true + hybrid: true + other: true + instances-top-tab: + panel_tabs: + actions: + vms-tab: + panel_tabs: + vm_info_tab: true + vm_capacity_tab: true + vm_storage_tab: true + vm_network_tab: true + vm_snapshot_tab: true + vm_placement_tab: true + vm_actions_tab: true + vm_conf_tab: true + vm_template_tab: true + vm_log_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # Status + #- 6 # Used CPU + #- 7 # Used Memory + - 8 # Host + - 9 # IPs + #- 10 # Start Time + - 11 # VNC + #- 12 # Hidden Template + #- 13 # Labels + #- 14 # Search data + actions: + VM.refresh: true + VM.create_dialog: true + VM.rename: true + VM.chown: true + VM.chgrp: true + VM.chmod: true + VM.deploy: true + VM.migrate: false + VM.migrate_live: false + VM.hold: true + VM.release: true + VM.suspend: true + VM.resume: true + VM.stop: true + VM.recover: true + VM.reboot: true + VM.reboot_hard: true + VM.poweroff: true + VM.poweroff_hard: true + VM.undeploy: true + VM.undeploy_hard: true + VM.terminate: true + VM.terminate_hard: true + VM.resize: true + VM.attachdisk: true + VM.detachdisk: true + VM.disk_saveas: true + VM.disk_resize: true + VM.attachnic: true + VM.detachnic: true + VM.snapshot_create: true + VM.snapshot_revert: true + VM.snapshot_delete: true + VM.disk_snapshot_create: false + VM.disk_snapshot_revert: false + VM.disk_snapshot_delete: false + VM.resched: true + VM.unresched: true + VM.save_as_template: true + VM.updateconf: true + VM.edit_labels: true + VM.menu_labels: true + oneflow-services-tab: + panel_tabs: + service_info_tab: true + service_roles_tab: true + service_log_tab: true + panel_tabs_actions: + service_roles_tab: + Role.scale: true + Role.hold: true + Role.release: true + Role.suspend: true + Role.resume: true + Role.stop: true + Role.reboot: true + Role.reboot_hard: true + Role.poweroff: true + Role.poweroff_hard: true + Role.undeploy: true + Role.undeploy_hard: true + Role.terminate: true + Role.terminate_hard: true + RoleVM.hold: true + RoleVM.release: true + RoleVM.suspend: true + RoleVM.resume: true + RoleVM.stop: true + RoleVM.reboot: true + RoleVM.reboot_hard: true + RoleVM.poweroff: true + RoleVM.poweroff_hard: true + RoleVM.undeploy: true + RoleVM.undeploy_hard: true + RoleVM.terminate: true + RoleVM.terminate_hard: true + RoleVM.resched: true + RoleVM.unresched: true + RoleVM.recover: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # State + #- 6 # Labels + #- 7 # Search data + actions: + Service.refresh: true + Service.create_dialog: true + Service.chown: true + Service.chgrp: true + Service.chmod: true + Service.rename: true + Service.shutdown: true + Service.recover: true + Service.delete: true + Service.edit_labels: true + Service.menu_labels: true + vrouters-tab: + panel_tabs: + virtual_router_info_tab: true + virtual_router_vms_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + #- 5 # Labels + #- 6 # Search data + actions: + VirtualRouter.refresh: true + VirtualRouter.create_dialog: true + VirtualRouter.rename: true + VirtualRouter.chown: true + VirtualRouter.chgrp: true + VirtualRouter.chmod: true + VirtualRouter.delete: true + VirtualRouter.attachnic: true + VirtualRouter.detachnic: true + VirtualRouter.edit_labels: true + VirtualRouter.menu_labels: true + infrastructure-top-tab: + panel_tabs: + actions: + clusters-tab: + panel_tabs: + cluster_info_tab: true + cluster_host_tab: true + cluster_vnet_tab: true + cluster_datastore_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Hosts + - 4 # VNets + - 5 # Datastores + #- 6 # Labels + actions: + Cluster.refresh: true + Cluster.create_dialog: true + Cluster.update_dialog: true + Cluster.delete: true + Cluster.rename: true + Cluster.edit_labels: true + Cluster.menu_labels: true + hosts-tab: + panel_tabs: + host_info_tab: true + host_monitoring_tab: true + host_vms_tab: true + host_wilds_tab: true + host_zombies_tab: true + host_esx_tab: true + host_pci_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Cluster + - 4 # RVMs + #- 5 # Real CPU + - 6 # Allocated CPU + #- 7 # Real MEM + - 8 # Allocated MEM + - 9 # Status + #- 10 # IM MAD + #- 11 # VM MAD + #- 12 # Last monitored on + #- 13 # Labels + #- 14 # Search data + actions: + Host.refresh: true + Host.create_dialog: true + Host.addtocluster: true + Host.rename: true + Host.enable: true + Host.disable: true + Host.offline: true + Host.delete: true + Host.edit_labels: true + Host.menu_labels: true + zones-tab: + panel_tabs: + zone_info_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Endpoint + #- 4 # Labels + actions: + Zone.refresh: true + Zone.create_dialog: true + Zone.rename: true + Zone.delete: true + Zone.edit_labels: true + Zone.menu_labels: true + storage-top-tab: + panel_tabs: + actions: + datastores-tab: + panel_tabs: + datastore_info_tab: true + datastore_image_tab: true + datastore_clusters_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # Capacity + - 6 # Cluster + #- 7 # Basepath + #- 8 # TM + #- 9 # DS + - 10 # Type + - 11 # Status + #- 12 # Labels + #- 13 # Search data + actions: + Datastore.refresh: true + Datastore.create_dialog: false + Datastore.import_dialog: true + Datastore.addtocluster: true + Datastore.rename: true + Datastore.chown: true + Datastore.chgrp: true + Datastore.chmod: true + Datastore.delete: true + Datastore.enable: true + Datastore.disable: true + Datastore.edit_labels: true + Datastore.menu_labels: true + images-tab: + panel_tabs: + image_info_tab: true + image_vms_tab: true + image_snapshots_tab: false + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # Datastore + #- 6 # Size + - 7 # Type + #- 8 # Registration time + #- 9 # Persistent + - 10 # Status + - 11 # #VMs + #- 12 # Target + #- 13 # Labels + #- 14 # Search data + actions: + Image.refresh: true + Image.create_dialog: true + Image.import_dialog: true + Image.upload_marketplace_dialog: true + Image.rename: true + Image.chown: true + Image.chgrp: true + Image.chmod: true + Image.enable: true + Image.disable: true + Image.persistent: true + Image.nonpersistent: true + Image.clone_dialog: true + Image.delete: true + Image.snapshot_flatten: false + Image.snapshot_revert: false + Image.snapshot_delete: false + Image.edit_labels: true + Image.menu_labels: true + files-tab: + panel_tabs: + file_info_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # Datastore + #- 6 # Size + - 7 # Type + #- 8 # Registration time + #- 9 # Persistent + - 10 # Status + #- 11 # #VMs + #- 12 # Target + #- 13 # Labels + #- 14 # Search data + actions: + File.refresh: true + File.create_dialog: true + File.rename: true + File.chown: true + File.chgrp: true + File.chmod: true + File.enable: true + File.disable: true + File.delete: true + File.edit_labels: true + File.menu_labels: true + marketplaces-tab: + panel_tabs: + marketplace_info_tab: true + marketplace_apps_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # Capacity + - 6 # Apps + - 7 # Driver + - 8 # Zone + #- 9 # Labels + #- 10 # Search data + actions: + MarketPlace.refresh: true + MarketPlace.create_dialog: true + MarketPlace.update_dialog: true + MarketPlace.rename: true + MarketPlace.chown: true + MarketPlace.chgrp: true + MarketPlace.chmod: true + MarketPlace.delete: true + MarketPlace.edit_labels: true + MarketPlace.menu_labels: true + marketplaceapps-tab: + panel_tabs: + marketplaceapp_info_tab: true + marketplaceapp_templates_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + #- 5 # Version + - 6 # Size + - 7 # State + #- 8 # Type + - 9 # Registration + - 10 # Marketplace + - 11 # Zone + #- 12 # Labels + #- 13 # Search data + actions: + MarketPlaceApp.refresh: true + MarketPlaceApp.create_dialog: true + MarketPlaceApp.download_opennebula_dialog: true + MarketPlaceApp.download_local: true + MarketPlaceApp.rename: true + MarketPlaceApp.chown: true + MarketPlaceApp.chgrp: true + MarketPlaceApp.chmod: true + MarketPlaceApp.enable: true + MarketPlaceApp.disable: true + MarketPlaceApp.delete: true + MarketPlaceApp.edit_labels: true + MarketPlaceApp.menu_labels: true + network-top-tab: + panel_tabs: + actions: + vnets-tab: + panel_tabs: + vnet_info_tab: true + vnet_ar_list_tab: true + vnet_leases_tab: true + vnet_sg_list_tab: false + vnet_vr_list_tab: true + vnet_clusters_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # Reservation + - 6 # Cluster + #- 7 # Bridge + - 8 # Leases + #- 9 # VLAN ID + #- 10 # Labels + #- 11 # Search data + actions: + Network.refresh: true + Network.create_dialog: true + Network.import_dialog: true + Network.update_dialog: true + Network.reserve_dialog: true + Network.addtocluster: true + Network.rename: true + Network.chown: true + Network.chgrp: true + Network.chmod: true + Network.delete: true + Network.hold_lease: true + Network.release_lease: true + Network.add_ar: true + Network.remove_ar: true + Network.update_ar: true + Network.edit_labels: true + Network.menu_labels: true + vnets-topology-tab: + panel_tabs: + actions: + NetworkTopology.refresh: true + NetworkTopology.fit: true + NetworkTopology.collapseVMs: true + NetworkTopology.openVMs: true + secgroups-tab: + panel_tabs: + security_group_info_tab: true + security_group_vms_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + #- 5 # Labels + #- 6 # Search data + actions: + SecurityGroup.refresh: true + SecurityGroup.create_dialog: true + SecurityGroup.update_dialog: true + SecurityGroup.rename: true + SecurityGroup.chown: true + SecurityGroup.chgrp: true + SecurityGroup.chmod: true + SecurityGroup.clone_dialog: true + SecurityGroup.commit_dialog: true + SecurityGroup.delete: true + SecurityGroup.edit_labels: true + SecurityGroup.menu_labels: true + support-tab: + panel_tabs: + support_info_tab: true + table_columns: + #- 0 # Checkbox + - 1 # ID + - 2 # Subject + - 3 # Created at + - 4 # Status + actions: + Support.refresh: true + Support.create_dialog: true + settings-tab: + panel_tabs: + settings_info_tab: true + settings_config_tab: false + settings_quotas_tab: true + settings_group_quotas_tab: true + settings_accounting_tab: true + settings_showback_tab: true + settings_auth_tab: true + actions: + # Buttons for settings_info_tab + User.update_password: true + User.login_token: true + # Buttons for settings_config_tab + Settings.change_language: true + Settings.change_password: true + Settings.change_view: true + Settings.ssh_key: true + Settings.login_token: true + # Edit button in settings_quotas_tab + User.quotas_dialog: false + upgrade-top-tab: + panel_tabs: + actions: + vmgroup-tab: + panel_tabs: + vm_group_info_tab: true + vm_group_vms_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # Vms + #- 6 # Labels + #- 7 # Search data + actions: + VMGroup.create_dialog: true + VMGroup.update_dialog: true + VMGroup.chmod: true + VMGroup.chown: true + VMGroup.chgrp: true diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/templates/vcenter-cloud.yaml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/templates/vcenter-cloud.yaml new file mode 100644 index 0000000000000000000000000000000000000000..b52175633edf9e2faf92745e6cafe8bfa2635d68 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/templates/vcenter-cloud.yaml @@ -0,0 +1,191 @@ +%set oneflow = %%getVar('activer_oneflow','non') == 'oui' +provision_logo: images/opennebula-5.0.png +link_logo: +text_link_logo: +confirm_vms: false +enabled_tabs: + - provision-tab + - settings-tab +features: + # True to show showback monthly reports, and VM cost + showback: true + + # Allows to change the security groups for each network interface + # on the VM creation dialog + secgroups: false + + # True to hide the CPU setting in the VM creation dialog + instantiate_hide_cpu: false + + # False to not scale the CPU. Number to scale from VCPU + instantiate_cpu_factor: false + + # True to show the option to make an instance persistent + instantiate_persistent: true + + # True to allow to create machines to cloud users + cloud_vm_create: true + + # True to show the monitoring info (VM & VRouters) + show_monitoring_info: true + + # True to show the attributes info (VM & VRouters) + show_attributes_info: true + + # True to show the vCenter info (VM & VRouters) + show_vcenter_info: true +tabs: + provision-tab: + panel_tabs: + vm_info_tab: false + vm_capacity_tab: true + vm_storage_tab: true + vm_network_tab: true + vm_snapshot_tab: true + vm_placement_tab: false + vm_actions_tab: true + vm_conf_tab: false + vm_template_tab: false + vm_log_tab: false + provision_tabs: +%if %%oneflow + flows: true +%else + flows: false +%end if + templates: true + + actions: &provisionactions + # In the cloud view, delete is the equivalent + # of 'onetemplate chmod --recursive' + Template.chmod: false + + # In the cloud view, delete is the equivalent + # of 'onetemplate delete --recursive' + Template.delete: true + VM.rename: true + VM.resume: true + VM.reboot: true + VM.reboot_hard: true + VM.poweroff: true + VM.poweroff_hard: true + VM.undeploy: false + VM.undeploy_hard: false + VM.terminate: true + VM.terminate_hard: true + VM.resize: true + VM.disk_resize: true + VM.attachdisk: true + VM.detachdisk: true + VM.disk_saveas: true + VM.attachnic: true + VM.detachnic: true + VM.snapshot_create: true + VM.snapshot_revert: true + VM.snapshot_delete: true + VM.disk_snapshot_create: true + VM.disk_snapshot_revert: true + VM.disk_snapshot_delete: true + VM.save_as_template: true + dashboard: + # Connected user's quotas + quotas: true + # Overview of connected user's VMs + vms: true + # Group's quotas + groupquotas: false + # Overview of group's VMs + groupvms: false + create_vm: + # True to allow capacity (CPU, MEMORY, VCPU) customization + capacity_select: true + # True to allow NIC customization + network_select: true + # True to allow vmgroup customization + vmgroup_select: true + # True to allow DISK size customization + disk_resize: true + # True to allow datastore customization + datastore_select: true + settings-tab: + panel_tabs: + settings_info_tab: false + settings_config_tab: true + settings_quotas_tab: true + settings_accounting_tab: true + settings_showback_tab: true + actions: + # Buttons for settings_info_tab + User.update_password: true + User.login_token: true + # Buttons for settings_config_tab + Settings.change_language: true + Settings.change_password: true + Settings.change_view: true + Settings.ssh_key: true + Settings.login_token: true + # Edit button in settings_quotas_tab + User.quotas_dialog: false + vms-tab: + actions: *provisionactions + images-tab: + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Onwer + - 4 # Group + - 5 # Datastore + #- 6 # Size + - 7 # Type + #- 8 # Registration time + #- 9 # Persistent + - 10 # Status + - 11 # #VMs + #- 12 # Target + vnets-tab: + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + #- 3 # Owner + - 4 # Group + #- 5 # Reservation + #- 6 # Cluster + #- 7 # Bridge + #- 8 # Leases + #- 9 # VLAN ID + secgroups-tab: + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + #- 3 # Owner + - 4 # Group + #- 5 # Labels + vmgroup-tab: + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # Vms + #- 6 # Labels + #- 7 # Search data + datastores-tab: + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + #- 5 # Capacity + #- 6 # Cluster + #- 7 # Basepath + #- 8 # TM + #- 9 # DS + #- 10 # Type + - 11 # Status + #- 12 # Labels + #- 13 # Search data diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/templates/vcenter-groupadmin.yaml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/templates/vcenter-groupadmin.yaml new file mode 100644 index 0000000000000000000000000000000000000000..3b2488f86fc7e94f84245a2a593948f9c3b2bd96 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/templates/vcenter-groupadmin.yaml @@ -0,0 +1,856 @@ +%set oneflow = %%getVar('activer_oneflow','non') == 'oui' +small_logo: images/opennebula-5.0.png +provision_logo: images/opennebula-5.0.png +link_logo: +text_link_logo: +confirm_vms: false +filter-view: true +enabled_tabs: + - dashboard-tab + - instances-top-tab + - vms-tab +%if %%oneflow + - oneflow-services-tab +%end if + - vrouters-tab + - templates-top-tab + #- templates-tab +%if %%oneflow + - oneflow-templates-tab +%end if + #- vrouter-templates-tab + #- storage-top-tab + #- datastores-tab + #- images-tab + #- files-tab + #- marketplaces-tab + #- marketplaceapps-tab + - network-top-tab + - vnets-tab + - vnets-topology-tab + #- secgroups-tab + #- infrastructure-top-tab + #- clusters-tab + #- hosts-tab + #- zones-tab + - system-top-tab + - users-tab + - groups-tab + #- vdcs-tab + #- acls-tab + - settings-tab + #- support-tab + #- upgrade-top-tab + - vmgroup-tab +features: + # True to show showback monthly reports, and VM cost + showback: true + + # Allows to change the security groups for each network interface + # on the VM creation dialog + secgroups: false + + # True to hide the CPU setting in the VM creation dialog + instantiate_hide_cpu: true + + # False to not scale the CPU. Number to scale from VCPU + instantiate_cpu_factor: false + + # True to show the option to make an instance persistent + instantiate_persistent: true + + # True to show the datastore datatable to instantiate VM + show_ds_instantiate: false + + # True to show the vmgroup datatable to instantiate VM + show_vmgroup_instantiate: true + + # True to show the vnet datatable to instantiate VM + show_vnet_instantiate: true + + # True to show the host datatable to instantiate VM + show_host_instantiate: false + + # True to show an input to specify the the VMs and Template path/folder where a vCenter VM will + # deployed to + vcenter_vm_folder: false + + # True to show the monitoring info (VM & VRouters) + show_monitoring_info: true + + # True to show the attributes info (VM & VRouters) + show_attributes_info: true + + # True to show the user datatable to instantiate VM + show_as_uid_instantiate: true + + # True to show the group datatable to instantiate VM + show_as_gid_instantiate: true +tabs: + dashboard-tab: + # The following widgets can be used inside any of the '_per_row' settings + # bellow. As the name suggest, the widgets will be scaled to fit one, + # two, or three per row. The footer uses the widgets at full size, i.e. + # one per row. + # + # - storage + # - users + # - network + # - hosts + # - vms + # - groupquotas + # - quotas + panel_tabs: + actions: + Dashboard.refresh: false + Sunstone.toggle_top: false + widgets_one_per_row: + widgets_three_per_row: + widgets_two_per_row: + - vms + - users + - groupquotas + - quotas + widgets_one_footer: + system-top-tab: + panel_tabs: + actions: + users-tab: + panel_tabs: + user_info_tab: true + user_quotas_tab: true + user_groups_tab: true + user_accounting_tab: true + user_showback_tab: true + user_auth_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + #- 3 # Group + #- 4 # Auth driver + #- 5 # Password + - 6 # VMs + - 7 # Memory + - 8 # CPU + #- 9 # Group ID + #- 10 # Hidden User Data + #- 11 # Labels + #- 12 # Search data + actions: + User.refresh: true + User.create_dialog: true + User.update_password: true + User.login_token: true + User.quotas_dialog: true + User.groups_dialog: false + User.chgrp: false + User.change_authentication: false + User.delete: true + User.edit_labels: true + User.menu_labels: true + groups-tab: + panel_tabs: + group_info_tab: true + group_users_tab: true + group_quotas_tab: true + group_accounting_tab: true + group_showback_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Users + - 4 # VMs + - 5 # Memory + - 6 # CPU + #- 7 # Labels + actions: + Group.refresh: true + Group.create_dialog: false + Group.update_dialog: false + Group.quotas_dialog: false + Group.delete: false + Group.edit_admins: false + Group.edit_labels: true + Group.menu_labels: true + vdcs-tab: + panel_tabs: + vdc_info_tab: true + vdc_groups_tab: true + vdc_resources_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Groups + - 4 # Clusters + - 5 # Hosts + - 6 # VNets + - 7 # Datastores + #- 8 # Labels + actions: + Vdc.refresh: true + Vdc.create_dialog: true + Vdc.update_dialog: true + Vdc.rename: true + Vdc.delete: true + Vdc.edit_labels: true + Vdc.menu_labels: true + acls-tab: + panel_tabs: + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Applies to + - 3 # Affected resources + - 4 # Resource ID / Owned by + - 5 # Allowed operations + - 6 # Zone + #- 7 # ACL String + actions: + Acl.refresh: true + Acl.create_dialog: true + Acl.delete: true + templates-top-tab: + panel_tabs: + actions: + templates-tab: + panel_tabs: + template_info_tab: true + template_template_tab: false + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # Registration time + #- 6 # Labels + #- 7 # Search data + actions: + Template.refresh: true + Template.create_dialog: false + Template.import_dialog: false + Template.update_dialog: false + Template.instantiate_vms: true + Template.rename: true + Template.chown: true + Template.chgrp: false + Template.chmod: false + Template.clone_dialog: true + Template.delete_dialog: true + Template.share: true + Template.unshare: true + Template.edit_labels: true + Template.menu_labels: true + template_creation_tabs: + general: true + storage: true + network: true + os_booting: true + features: true + input_output: true + context: true + actions: true + scheduling: true + hybrid: true + vmgroup: true + other: true + oneflow-templates-tab: + panel_tabs: + service_template_info_tab: true + service_template_roles_tab: true + service_template_template_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + #- 5 # Labels + #- 6 # Search data + actions: + ServiceTemplate.refresh: true + ServiceTemplate.create_dialog: false + ServiceTemplate.update_dialog: false + ServiceTemplate.instantiate: true + ServiceTemplate.chown: false + ServiceTemplate.chgrp: false + ServiceTemplate.chmod: false + ServiceTemplate.rename: false + ServiceTemplate.clone_dialog: false + ServiceTemplate.delete: false + ServiceTemplate.edit_labels: true + ServiceTemplate.menu_labels: true + vrouter-templates-tab: + panel_tabs: + vrouter_template_info_tab: true + vrouter_template_template_tab: false + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # Registration time + #- 6 # Labels + #- 7 # Search data + actions: + VirtualRouterTemplate.refresh: true + VirtualRouterTemplate.create_dialog: false + VirtualRouterTemplate.update_dialog: false + VirtualRouterTemplate.instantiate_dialog: false + VirtualRouterTemplate.rename: true + VirtualRouterTemplate.chown: true + VirtualRouterTemplate.chgrp: false + VirtualRouterTemplate.chmod: false + VirtualRouterTemplate.clone_dialog: true + VirtualRouterTemplate.delete_dialog: true + VirtualRouterTemplate.share: true + VirtualRouterTemplate.unshare: true + VirtualRouterTemplate.edit_labels: true + VirtualRouterTemplate.menu_labels: true + template_creation_tabs: + general: true + storage: true + network: true + os_booting: true + features: true + input_output: true + context: true + scheduling: true + hybrid: true + other: true + instances-top-tab: + panel_tabs: + actions: + vms-tab: + panel_tabs: + vm_info_tab: true + vm_capacity_tab: true + vm_storage_tab: true + vm_network_tab: true + vm_snapshot_tab: false + vm_placement_tab: false + vm_actions_tab: false + vm_conf_tab: false + vm_template_tab: false + vm_log_tab: false + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + #- 3 # Owner + - 4 # Group + - 5 # Status + #- 6 # Used CPU + #- 7 # Used Memory + #- 8 # Host + - 9 # IPs + #- 10 # Start Time + - 11 # VNC + #- 12 # Hidden Template + #- 13 # Labels + #- 14 # Search data + actions: + VM.refresh: true + VM.create_dialog: true + VM.rename: true + VM.chown: true + VM.chgrp: false + VM.chmod: false + VM.deploy: false + VM.migrate: false + VM.migrate_live: false + VM.hold: true + VM.release: true + VM.suspend: false + VM.resume: true + VM.stop: false + VM.recover: false + VM.reboot: true + VM.reboot_hard: true + VM.poweroff: true + VM.poweroff_hard: true + VM.undeploy: true + VM.undeploy_hard: true + VM.terminate: true + VM.terminate_hard: true + VM.resize: false + VM.attachdisk: false + VM.detachdisk: false + VM.disk_saveas: false + VM.disk_resize: false + VM.attachnic: false + VM.detachnic: false + VM.snapshot_create: false + VM.snapshot_revert: false + VM.snapshot_delete: false + VM.disk_snapshot_create: false + VM.disk_snapshot_revert: false + VM.disk_snapshot_delete: false + VM.resched: false + VM.unresched: false + VM.save_as_template: false + VM.updateconf: false + VM.edit_labels: true + VM.menu_labels: true + oneflow-services-tab: + panel_tabs: + service_info_tab: true + service_roles_tab: true + service_log_tab: true + panel_tabs_actions: + service_roles_tab: + Role.scale: true + Role.hold: true + Role.release: true + Role.suspend: false + Role.resume: true + Role.stop: false + Role.reboot: true + Role.reboot_hard: true + Role.poweroff: true + Role.poweroff_hard: true + Role.undeploy: true + Role.undeploy_hard: true + Role.terminate: true + Role.terminate_hard: true + RoleVM.hold: true + RoleVM.release: true + RoleVM.suspend: false + RoleVM.resume: true + RoleVM.stop: false + RoleVM.reboot: true + RoleVM.reboot_hard: true + RoleVM.poweroff: true + RoleVM.poweroff_hard: true + RoleVM.undeploy: true + RoleVM.undeploy_hard: true + RoleVM.terminate: true + RoleVM.terminate_hard: true + RoleVM.resched: false + RoleVM.unresched: false + RoleVM.recover: false + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + #- 3 # Owner + - 4 # Group + - 5 # State + #- 6 # Labels + #- 7 # Search data + actions: + Service.refresh: true + Service.create_dialog: true + Service.chown: true + Service.chgrp: false + Service.chmod: false + Service.rename: true + Service.shutdown: true + Service.recover: true + Service.delete: true + Service.edit_labels: true + Service.menu_labels: true + vrouters-tab: + panel_tabs: + virtual_router_info_tab: true + virtual_router_vms_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + #- 3 # Owner + - 4 # Group + #- 5 # Labels + #- 6 # Search data + actions: + VirtualRouter.refresh: true + VirtualRouter.create_dialog: true + VirtualRouter.rename: true + VirtualRouter.chown: true + VirtualRouter.chgrp: false + VirtualRouter.chmod: false + VirtualRouter.delete: true + VirtualRouter.attachnic: false + VirtualRouter.detachnic: false + VirtualRouter.edit_labels: true + VirtualRouter.menu_labels: true + infrastructure-top-tab: + panel_tabs: + actions: + clusters-tab: + panel_tabs: + cluster_info_tab: true + cluster_host_tab: true + cluster_vnet_tab: true + cluster_datastore_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Hosts + - 4 # VNets + - 5 # Datastores + #- 6 # Labels + actions: + Cluster.refresh: true + Cluster.create_dialog: true + Cluster.update_dialog: true + Cluster.delete: true + Cluster.rename: true + Cluster.edit_labels: true + Cluster.menu_labels: true + hosts-tab: + panel_tabs: + host_info_tab: true + host_monitoring_tab: true + host_vms_tab: true + host_wilds_tab: true + host_zombies_tab: true + host_esx_tab: true + host_pci_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Cluster + - 4 # RVMs + #- 5 # Real CPU + - 6 # Allocated CPU + #- 7 # Real MEM + - 8 # Allocated MEM + - 9 # Status + #- 10 # IM MAD + #- 11 # VM MAD + #- 12 # Last monitored on + #- 13 # Labels + #- 14 # Search data + actions: + Host.refresh: true + Host.create_dialog: true + Host.addtocluster: true + Host.rename: true + Host.enable: true + Host.disable: true + Host.offline: true + Host.delete: true + Host.edit_labels: true + Host.menu_labels: true + zones-tab: + panel_tabs: + zone_info_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Endpoint + #- 4 # Labels + actions: + Zone.refresh: true + Zone.create_dialog: true + Zone.rename: true + Zone.delete: true + Zone.edit_labels: true + Zone.menu_labels: true + storage-top-tab: + panel_tabs: + actions: + datastores-tab: + panel_tabs: + datastore_info_tab: true + datastore_image_tab: true + datastore_clusters_tab: false + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # Capacity + - 6 # Cluster + #- 7 # Basepath + #- 8 # TM + #- 9 # DS + - 10 # Type + - 11 # Status + #- 12 # Labels + #- 13 # Search data + actions: + Datastore.refresh: true + Datastore.create_dialog: true + Datastore.import_dialog: false + Datastore.addtocluster: true + Datastore.rename: true + Datastore.chown: true + Datastore.chgrp: true + Datastore.chmod: true + Datastore.delete: true + Datastore.enable: true + Datastore.disable: true + Datastore.edit_labels: true + Datastore.menu_labels: true + images-tab: + panel_tabs: + image_info_tab: true + image_vms_tab: true + image_snapshots_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # Datastore + #- 6 # Size + - 7 # Type + #- 8 # Registration time + #- 9 # Persistent + - 10 # Status + - 11 # #VMs + #- 12 # Target + #- 13 # Labels + #- 14 # Search data + actions: + Image.refresh: true + Image.create_dialog: true + Image.import_dialog: true + Image.upload_marketplace_dialog: false + Image.rename: true + Image.chown: true + Image.chgrp: true + Image.chmod: true + Image.enable: true + Image.disable: true + Image.persistent: true + Image.nonpersistent: true + Image.clone_dialog: true + Image.delete: true + Image.snapshot_flatten: true + Image.snapshot_revert: true + Image.snapshot_delete: true + Image.edit_labels: true + Image.menu_labels: true + files-tab: + panel_tabs: + file_info_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # Datastore + #- 6 # Size + - 7 # Type + #- 8 # Registration time + #- 9 # Persistent + - 10 # Status + #- 11 # #VMs + #- 12 # Target + #- 13 # Labels + #- 14 # Search data + actions: + File.refresh: true + File.create_dialog: true + File.rename: true + File.chown: true + File.chgrp: true + File.chmod: true + File.enable: true + File.disable: true + File.delete: true + File.edit_labels: true + File.menu_labels: true + marketplaces-tab: + panel_tabs: + marketplace_info_tab: true + marketplace_apps_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # Capacity + - 6 # Apps + - 7 # Driver + - 8 # Zone + #- 9 # Labels + #- 10 # Search data + actions: + MarketPlace.refresh: true + MarketPlace.create_dialog: true + MarketPlace.update_dialog: true + MarketPlace.rename: true + MarketPlace.chown: true + MarketPlace.chgrp: true + MarketPlace.chmod: true + MarketPlace.delete: true + MarketPlace.edit_labels: true + MarketPlace.menu_labels: true + marketplaceapps-tab: + panel_tabs: + marketplaceapp_info_tab: true + marketplaceapp_templates_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + #- 5 # Version + - 6 # Size + - 7 # State + #- 8 # Type + - 9 # Registration + - 10 # Marketplace + - 11 # Zone + #- 12 # Labels + #- 13 # Search data + actions: + MarketPlaceApp.refresh: true + MarketPlaceApp.create_dialog: true + MarketPlaceApp.download_opennebula_dialog: true + MarketPlaceApp.download_local: true + MarketPlaceApp.rename: true + MarketPlaceApp.chown: true + MarketPlaceApp.chgrp: true + MarketPlaceApp.chmod: true + MarketPlaceApp.enable: true + MarketPlaceApp.disable: true + MarketPlaceApp.delete: true + MarketPlaceApp.edit_labels: true + MarketPlaceApp.menu_labels: true + network-top-tab: + panel_tabs: + actions: + vnets-tab: + panel_tabs: + vnet_info_tab: false + vnet_ar_list_tab: false + vnet_leases_tab: true + vnet_sg_list_tab: false + vnet_vr_list_tab: false + vnet_clusters_tab: false + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + #- 3 # Owner + #- 4 # Group + #- 5 # Reservation + #- 6 # Cluster + #- 7 # Bridge + #- 8 # Leases + #- 9 # VLAN ID + #- 10 # Labels + #- 11 # Search data + actions: + Network.refresh: true + Network.create_dialog: false + Network.import_dialog: false + Network.update_dialog: false + Network.reserve_dialog: false + Network.addtocluster: false + Network.rename: false + Network.chown: false + Network.chgrp: false + Network.chmod: false + Network.delete: false + Network.hold_lease: false + Network.release_lease: false + Network.add_ar: false + Network.remove_ar: false + Network.update_ar: false + Network.edit_labels: true + Network.menu_labels: true + vnets-topology-tab: + panel_tabs: + actions: + NetworkTopology.refresh: true + NetworkTopology.fit: true + NetworkTopology.collapseVMs: true + NetworkTopology.openVMs: true + secgroups-tab: + panel_tabs: + security_group_info_tab: true + security_group_vms_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + #- 2 # Name + #- 3 # Owner + - 4 # Group + #- 5 # Labels + #- 6 # Search data + actions: + SecurityGroup.refresh: true + SecurityGroup.create_dialog: false + SecurityGroup.update_dialog: false + SecurityGroup.rename: false + SecurityGroup.chown: false + SecurityGroup.chgrp: false + SecurityGroup.chmod: false + SecurityGroup.clone_dialog: false + SecurityGroup.commit_dialog: false + SecurityGroup.delete: false + SecurityGroup.edit_labels: true + SecurityGroup.menu_labels: true + support-tab: + panel_tabs: + support_info_tab: true + table_columns: + #- 0 # Checkbox + - 1 # ID + - 2 # Subject + - 3 # Created at + - 4 # Status + actions: + Support.refresh: true + Support.create_dialog: true + settings-tab: + panel_tabs: + settings_info_tab: true + settings_config_tab: false + settings_quotas_tab: true + settings_group_quotas_tab: true + settings_accounting_tab: true + settings_showback_tab: true + settings_auth_tab: true + actions: + # Buttons for settings_info_tab + User.update_password: true + User.login_token: true + # Buttons for settings_config_tab + Settings.change_language: true + Settings.change_password: true + Settings.change_view: true + Settings.ssh_key: true + Settings.login_token: true + # Edit button in settings_quotas_tab + User.quotas_dialog: false + upgrade-top-tab: + panel_tabs: + actions: + vmgroup-tab: + panel_tabs: + vm_group_info_tab: true + vm_group_vms_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Owner + - 4 # Group + - 5 # Vms + #- 6 # Labels + #- 7 # Search data + actions: + VMGroup.create_dialog: true + VMGroup.update_dialog: true + VMGroup.chmod: true + VMGroup.chown: true + VMGroup.chgrp: true diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/templates/vcenter-user.yaml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/templates/vcenter-user.yaml new file mode 100644 index 0000000000000000000000000000000000000000..6e0a9a1c86bbd528526af474fd91427b639a9c2c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-frontend/templates/vcenter-user.yaml @@ -0,0 +1,849 @@ +%set oneflow = %%getVar('activer_oneflow','non') == 'oui' +small_logo: images/opennebula-5.0.png +provision_logo: images/opennebula-5.0.png +link_logo: +text_link_logo: +confirm_vms: false +filter-view: true +enabled_tabs: + - dashboard-tab + - instances-top-tab + - vms-tab +%if %%oneflow + - oneflow-services-tab +%end if + - vrouters-tab + - templates-top-tab + - templates-tab +%if %%oneflow + - oneflow-templates-tab +%end if + - vrouter-templates-tab + - storage-top-tab + - datastores-tab + - images-tab + - files-tab + - marketplaces-tab + - marketplaceapps-tab + - network-top-tab + - vnets-tab + - vnets-topology-tab + - secgroups-tab + #- infrastructure-top-tab + #- clusters-tab + #- hosts-tab + #- zones-tab + #- system-top-tab + #- users-tab + #- groups-tab + #- vdcs-tab + #- acls-tab + - settings-tab + #- support-tab + #- upgrade-top-tab + - vmgroup-tab +features: + # True to show showback monthly reports, and VM cost + showback: true + + # Allows to change the security groups for each network interface + # on the VM creation dialog + secgroups: true + + # True to hide the CPU setting in the VM creation dialog + instantiate_hide_cpu: false + + # False to not scale the CPU. Number to scale from VCPU + instantiate_cpu_factor: false + + # True to show the option to make an instance persistent + instantiate_persistent: true + + # True to show the datastore datatable to instantiate VM + show_ds_instantiate: false + + # True to show the vmgroup datatable to instantiate VM + show_vmgroup_instantiate: true + + # True to show the vnet datatable to instantiate VM + show_vnet_instantiate: true + + # True to show the host datatable to instantiate VM + show_host_instantiate: false + + # True to show an input to specify the the VMs and Template path/folder where a vCenter VM will + # deployed to + vcenter_vm_folder: false + + # True to show the monitoring info (VM & VRouters) + show_monitoring_info: true + + # True to show the attributes info (VM & VRouters) + show_attributes_info: true +tabs: + dashboard-tab: + # The following widgets can be used inside any of the '_per_row' settings + # bellow. As the name suggest, the widgets will be scaled to fit one, + # two, or three per row. The footer uses the widgets at full size, i.e. + # one per row. + # + # - storage + # - users + # - network + # - hosts + # - vms + # - groupquotas + # - quotas + panel_tabs: + actions: + Dashboard.refresh: false + Sunstone.toggle_top: false + widgets_one_per_row: + - vms + widgets_three_per_row: + widgets_two_per_row: + - network + - storage + widgets_one_footer: + system-top-tab: + panel_tabs: + actions: + users-tab: + panel_tabs: + user_info_tab: true + user_quotas_tab: true + user_groups_tab: true + user_accounting_tab: true + user_showback_tab: true + user_auth_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Group + - 4 # Auth driver + #- 5 # Password + - 6 # VMs + - 7 # Memory + - 8 # CPU + #- 9 # Group ID + #- 10 # Hidden User Data + #- 11 # Labels + #- 12 # Search data + actions: + User.refresh: true + User.create_dialog: true + User.update_password: true + User.login_token: true + User.quotas_dialog: true + User.groups_dialog: true + User.chgrp: true + User.change_authentication: true + User.delete: true + User.edit_labels: true + User.menu_labels: true + groups-tab: + panel_tabs: + group_info_tab: true + group_users_tab: true + group_quotas_tab: true + group_accounting_tab: true + group_showback_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Users + - 4 # VMs + - 5 # Memory + - 6 # CPU + #- 7 # Labels + actions: + Group.refresh: true + Group.create_dialog: true + Group.update_dialog: true + Group.quotas_dialog: true + Group.delete: true + Group.edit_admins: true + Group.edit_labels: true + Group.menu_labels: true + vdcs-tab: + panel_tabs: + vdc_info_tab: true + vdc_groups_tab: true + vdc_resources_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Groups + - 4 # Clusters + - 5 # Hosts + - 6 # VNets + - 7 # Datastores + #- 8 # Labels + actions: + Vdc.refresh: true + Vdc.create_dialog: true + Vdc.update_dialog: true + Vdc.rename: true + Vdc.delete: true + Vdc.edit_labels: true + Vdc.menu_labels: true + acls-tab: + panel_tabs: + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Applies to + - 3 # Affected resources + - 4 # Resource ID / Owned by + - 5 # Allowed operations + - 6 # Zone + #- 7 # ACL String + actions: + Acl.refresh: true + Acl.create_dialog: true + Acl.delete: true + templates-top-tab: + panel_tabs: + actions: + templates-tab: + panel_tabs: + template_info_tab: true + template_template_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Owner + - 3 # Group + - 4 # Name + - 5 # Registration time + #- 6 # Labels + #- 7 # Search data + actions: + Template.refresh: true + Template.create_dialog: true + Template.import_dialog: false + Template.update_dialog: true + Template.instantiate_vms: true + Template.rename: true + Template.chown: false + Template.chgrp: false + Template.chmod: true + Template.clone_dialog: true + Template.delete_dialog: true + Template.share: true + Template.unshare: true + Template.edit_labels: true + Template.menu_labels: true + template_creation_tabs: + general: true + storage: true + network: true + os_booting: true + features: true + input_output: true + context: true + actions: true + scheduling: false + hybrid: true + vmgroup: true + other: true + oneflow-templates-tab: + panel_tabs: + service_template_info_tab: true + service_template_roles_tab: true + service_template_template_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Owner + - 3 # Group + - 4 # Name + #- 5 # Labels + #- 6 # Search data + actions: + ServiceTemplate.refresh: true + ServiceTemplate.create_dialog: true + ServiceTemplate.update_dialog: true + ServiceTemplate.instantiate: true + ServiceTemplate.chown: false + ServiceTemplate.chgrp: false + ServiceTemplate.chmod: true + ServiceTemplate.rename: true + ServiceTemplate.clone_dialog: true + ServiceTemplate.delete: true + ServiceTemplate.edit_labels: true + ServiceTemplate.menu_labels: true + vrouter-templates-tab: + panel_tabs: + vrouter_template_info_tab: true + vrouter_template_template_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Owner + - 3 # Group + - 4 # Name + - 5 # Registration time + #- 6 # Labels + #- 7 # Search data + actions: + VirtualRouterTemplate.refresh: true + VirtualRouterTemplate.create_dialog: true + VirtualRouterTemplate.update_dialog: true + VirtualRouterTemplate.instantiate_dialog: true + VirtualRouterTemplate.rename: true + VirtualRouterTemplate.chown: false + VirtualRouterTemplate.chgrp: false + VirtualRouterTemplate.chmod: true + VirtualRouterTemplate.clone_dialog: true + VirtualRouterTemplate.delete_dialog: true + VirtualRouterTemplate.share: true + VirtualRouterTemplate.unshare: true + VirtualRouterTemplate.edit_labels: true + VirtualRouterTemplate.menu_labels: true + template_creation_tabs: + general: true + storage: true + network: true + os_booting: true + features: true + input_output: true + context: true + scheduling: true + hybrid: true + other: true + instances-top-tab: + panel_tabs: + actions: + vms-tab: + panel_tabs: + vm_info_tab: true + vm_capacity_tab: true + vm_storage_tab: true + vm_network_tab: true + vm_snapshot_tab: true + vm_placement_tab: false + vm_actions_tab: true + vm_conf_tab: true + vm_template_tab: false + vm_log_tab: false + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Owner + - 3 # Group + - 4 # Name + - 5 # Status + #- 6 # Used CPU + #- 7 # Used Memory + - 8 # Host + - 9 # IPs + #- 10 # Start Time + - 11 # VNC + #- 12 # Hidden Template + #- 13 # Labels + #- 14 # Search data + actions: + VM.refresh: true + VM.create_dialog: true + VM.rename: true + VM.chown: false + VM.chgrp: false + VM.chmod: true + VM.deploy: false + VM.migrate: false + VM.migrate_live: false + VM.hold: true + VM.release: true + VM.suspend: true + VM.resume: true + VM.stop: true + VM.recover: false + VM.reboot: true + VM.reboot_hard: true + VM.poweroff: true + VM.poweroff_hard: true + VM.undeploy: true + VM.undeploy_hard: true + VM.terminate: true + VM.terminate_hard: true + VM.resize: true + VM.attachdisk: true + VM.detachdisk: true + VM.disk_saveas: true + VM.disk_resize: false + VM.attachnic: true + VM.detachnic: true + VM.snapshot_create: true + VM.snapshot_revert: true + VM.snapshot_delete: true + VM.disk_snapshot_create: true + VM.disk_snapshot_revert: true + VM.disk_snapshot_delete: true + VM.resched: false + VM.unresched: false + VM.save_as_template: true + VM.updateconf: true + VM.edit_labels: true + VM.menu_labels: true + oneflow-services-tab: + panel_tabs: + service_info_tab: true + service_roles_tab: true + service_log_tab: true + panel_tabs_actions: + service_roles_tab: + Role.scale: true + Role.hold: true + Role.release: true + Role.suspend: true + Role.resume: true + Role.stop: true + Role.reboot: true + Role.reboot_hard: true + Role.poweroff: true + Role.poweroff_hard: true + Role.undeploy: true + Role.undeploy_hard: true + Role.terminate: true + Role.terminate_hard: true + RoleVM.hold: true + RoleVM.release: true + RoleVM.suspend: true + RoleVM.resume: true + RoleVM.stop: true + RoleVM.reboot: true + RoleVM.reboot_hard: true + RoleVM.poweroff: true + RoleVM.poweroff_hard: true + RoleVM.undeploy: true + RoleVM.undeploy_hard: true + RoleVM.terminate: true + RoleVM.terminate_hard: true + RoleVM.resched: false + RoleVM.unresched: false + RoleVM.recover: false + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Owner + - 3 # Group + - 4 # Name + - 5 # State + #- 6 # Labels + #- 7 # Search data + actions: + Service.refresh: true + Service.create_dialog: true + Service.chown: false + Service.chgrp: false + Service.chmod: true + Service.rename: true + Service.shutdown: true + Service.recover: true + Service.delete: true + Service.edit_labels: true + Service.menu_labels: true + vrouters-tab: + panel_tabs: + virtual_router_info_tab: true + virtual_router_vms_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Owner + - 3 # Group + - 4 # Name + #- 5 # Labels + #- 6 # Search data + actions: + VirtualRouter.refresh: true + VirtualRouter.create_dialog: true + VirtualRouter.rename: true + VirtualRouter.chown: true + VirtualRouter.chgrp: true + VirtualRouter.chmod: true + VirtualRouter.delete: true + VirtualRouter.attachnic: true + VirtualRouter.detachnic: true + VirtualRouter.edit_labels: true + VirtualRouter.menu_labels: true + infrastructure-top-tab: + panel_tabs: + actions: + clusters-tab: + panel_tabs: + cluster_info_tab: true + cluster_host_tab: true + cluster_vnet_tab: true + cluster_datastore_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Hosts + - 4 # VNets + - 5 # Datastores + #- 6 # Labels + actions: + Cluster.refresh: true + Cluster.create_dialog: true + Cluster.update_dialog: true + Cluster.delete: true + Cluster.rename: true + Cluster.edit_labels: true + Cluster.menu_labels: true + hosts-tab: + panel_tabs: + host_info_tab: true + host_monitoring_tab: true + host_vms_tab: true + host_wilds_tab: true + host_zombies_tab: true + host_esx_tab: true + host_pci_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Cluster + - 4 # RVMs + #- 5 # Real CPU + - 6 # Allocated CPU + #- 7 # Real MEM + - 8 # Allocated MEM + - 9 # Status + #- 10 # IM MAD + #- 11 # VM MAD + #- 12 # Last monitored on + #- 13 # Labels + #- 14 # Search data + actions: + Host.refresh: true + Host.create_dialog: true + Host.addtocluster: true + Host.rename: true + Host.enable: true + Host.disable: true + Host.offline: true + Host.delete: true + Host.edit_labels: true + Host.menu_labels: true + zones-tab: + panel_tabs: + zone_info_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Endpoint + #- 4 # Labels + actions: + Zone.refresh: true + Zone.create_dialog: true + Zone.rename: true + Zone.delete: true + Zone.edit_labels: true + Zone.menu_labels: true + storage-top-tab: + panel_tabs: + actions: + datastores-tab: + panel_tabs: + datastore_info_tab: false + datastore_image_tab: true + datastore_clusters_tab: false + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Owner + - 3 # Group + - 4 # Name + - 5 # Capacity + - 6 # Cluster + #- 7 # Basepath + #- 8 # TM + #- 9 # DS + #- 10 # Type + #- 11 # Status + #- 12 # Labels + #- 13 # Search data + actions: + Datastore.refresh: true + Datastore.create_dialog: false + Datastore.import_dialog: false + Datastore.addtocluster: false + Datastore.rename: true + Datastore.chown: false + Datastore.chgrp: false + Datastore.chmod: true + Datastore.delete: false + Datastore.enable: false + Datastore.disable: false + Datastore.edit_labels: true + Datastore.menu_labels: true + images-tab: + panel_tabs: + image_info_tab: true + image_vms_tab: true + image_snapshots_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Owner + - 3 # Group + - 4 # Name + - 5 # Datastore + #- 6 # Size + - 7 # Type + #- 8 # Registration time + #- 9 # Persistent + - 10 # Status + - 11 # #VMs + #- 12 # Target + #- 13 # Labels + #- 14 # Search data + actions: + Image.refresh: true + Image.create_dialog: true + Image.import_dialog: false + Image.upload_marketplace_dialog: true + Image.rename: true + Image.chown: false + Image.chgrp: false + Image.chmod: true + Image.enable: true + Image.disable: true + Image.persistent: true + Image.nonpersistent: true + Image.clone_dialog: true + Image.delete: true + Image.snapshot_flatten: true + Image.snapshot_revert: true + Image.snapshot_delete: true + Image.edit_labels: true + Image.menu_labels: true + files-tab: + panel_tabs: + file_info_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Owner + - 3 # Group + - 4 # Name + - 5 # Datastore + #- 6 # Size + - 7 # Type + #- 8 # Registration time + #- 9 # Persistent + - 10 # Status + #- 11 # #VMs + #- 12 # Target + #- 13 # Labels + #- 14 # Search data + actions: + File.refresh: true + File.create_dialog: true + File.rename: true + File.chown: false + File.chgrp: false + File.chmod: true + File.enable: true + File.disable: true + File.delete: true + File.edit_labels: true + File.menu_labels: true + marketplaces-tab: + panel_tabs: + marketplace_info_tab: true + marketplace_apps_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Owner + - 3 # Group + - 4 # Name + - 5 # Capacity + - 6 # Apps + - 7 # Driver + - 8 # Zone + #- 9 # Labels + #- 10 # Search data + actions: + MarketPlace.refresh: true + MarketPlace.create_dialog: true + MarketPlace.update_dialog: true + MarketPlace.rename: true + MarketPlace.chown: true + MarketPlace.chgrp: true + MarketPlace.chmod: true + MarketPlace.delete: true + MarketPlace.edit_labels: true + MarketPlace.menu_labels: true + marketplaceapps-tab: + panel_tabs: + marketplaceapp_info_tab: true + marketplaceapp_templates_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Owner + - 3 # Group + - 4 # Name + #- 5 # Version + - 6 # Size + - 7 # State + #- 8 # Type + - 9 # Registration + - 10 # Marketplace + - 11 # Zone + #- 12 # Labels + #- 13 # Search data + actions: + MarketPlaceApp.refresh: true + MarketPlaceApp.create_dialog: true + MarketPlaceApp.download_opennebula_dialog: true + MarketPlaceApp.download_local: true + MarketPlaceApp.rename: true + MarketPlaceApp.chown: true + MarketPlaceApp.chgrp: true + MarketPlaceApp.chmod: true + MarketPlaceApp.enable: true + MarketPlaceApp.disable: true + MarketPlaceApp.delete: true + MarketPlaceApp.edit_labels: true + MarketPlaceApp.menu_labels: true + network-top-tab: + panel_tabs: + actions: + vnets-tab: + panel_tabs: + vnet_info_tab: true + vnet_ar_list_tab: true + vnet_leases_tab: true + vnet_sg_list_tab: true + vnet_vr_list_tab: true + vnet_clusters_tab: false + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Owner + - 3 # Group + - 4 # Name + - 5 # Reservation + - 6 # Cluster + #- 7 # Bridge + - 8 # Leases + #- 9 # VLAN ID + #- 10 # Labels + #- 11 # Search data + actions: + Network.refresh: true + Network.create_dialog: false + Network.import_dialog: false + Network.update_dialog: true + Network.reserve_dialog: true + Network.addtocluster: false + Network.rename: true + Network.chown: false + Network.chgrp: false + Network.chmod: true + Network.delete: true + Network.hold_lease: true + Network.release_lease: true + Network.add_ar: false + Network.remove_ar: true + Network.update_ar: true + Network.edit_labels: true + Network.menu_labels: true + vnets-topology-tab: + panel_tabs: + actions: + NetworkTopology.refresh: true + NetworkTopology.fit: true + NetworkTopology.collapseVMs: true + NetworkTopology.openVMs: true + secgroups-tab: + panel_tabs: + security_group_info_tab: true + security_group_vms_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Owner + - 3 # Group + - 4 # Name + #- 5 # Labels + #- 6 # Search data + actions: + SecurityGroup.refresh: true + SecurityGroup.create_dialog: true + SecurityGroup.update_dialog: true + SecurityGroup.rename: true + SecurityGroup.chown: true + SecurityGroup.chgrp: true + SecurityGroup.chmod: true + SecurityGroup.clone_dialog: true + SecurityGroup.commit_dialog: true + SecurityGroup.delete: true + SecurityGroup.edit_labels: true + SecurityGroup.menu_labels: true + support-tab: + panel_tabs: + support_info_tab: true + table_columns: + #- 0 # Checkbox + - 1 # ID + - 2 # Subject + - 3 # Created at + - 4 # Status + actions: + Support.refresh: true + Support.create_dialog: true + settings-tab: + panel_tabs: + settings_info_tab: true + settings_config_tab: false + settings_quotas_tab: true + settings_group_quotas_tab: true + settings_accounting_tab: true + settings_showback_tab: true + settings_auth_tab: true + actions: + # Buttons for settings_info_tab + User.update_password: true + User.login_token: true + # Buttons for settings_config_tab + Settings.change_language: true + Settings.change_password: true + Settings.change_view: true + Settings.ssh_key: true + Settings.login_token: true + # Edit button in settings_quotas_tab + User.quotas_dialog: false + upgrade-top-tab: + panel_tabs: + actions: + vmgroup-tab: + panel_tabs: + vm_group_info_tab: true + vm_group_vms_tab: true + table_columns: + - 0 # Checkbox + - 1 # ID + - 2 # Name + - 3 # Group + - 4 # Owner + - 5 # Vms + #- 6 # Labels + #- 7 # Search data + actions: + VMGroup.create_dialog: true + VMGroup.update_dialog: true + VMGroup.chmod: true + VMGroup.chown: true + VMGroup.chgrp: true diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/dictionaries/00_eole-one-master_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/dictionaries/00_eole-one-master_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..f06e247552abc90a61d477ebddc26b5c24317083 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/dictionaries/00_eole-one-master_packages.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>sqlite3</package> + <package>ruby-xmlrpc</package> + <package>opennebula</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/dictionaries/29_one-master.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/dictionaries/29_one-master.xml new file mode 100644 index 0000000000000000000000000000000000000000..3fad953d87b73888bd322e6530a487c7dce4c366 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/dictionaries/29_one-master.xml @@ -0,0 +1,384 @@ +<?xml version="1.0" encoding="utf-8"?> +<creole> + <files> + <!--file filelist='onesinglenode' name='/etc/one/sunstone-server.conf' rm='True' mkdir='True'/--> + <file filelist='onesinglenode' name='/etc/one/vmm_exec/vmm_exec_kvm.conf' rm='True' mkdir='True'/> + <file filelist='onesinglenode' name='/etc/one/oned.conf' rm='True'/> + <file filelist='onesinglenode' name='/etc/one/sched.conf' rm='True'/> + <file filelist='onesinglenode' name='/var/lib/one/remotes/etc/vnm/OpenNebulaNetwork.conf' rm='True' mkdir='True'/> + <file filelist='onesinglenode' name='/etc/one/auth/ldap_auth.conf'/> + <file filelist='one_ha' name='/usr/share/eole/bastion/data/60-one' mode='755'/> + + <service>opennebula</service> + <service>opennebula-scheduler</service> + + <service_access service='one-ssh'> + <tcpwrapper>sshd</tcpwrapper> + </service_access> + + <service_restriction service='one-ssh'> + <ip interface='eth0' ip_type='SymLinkOption'>adresse_ip_eth0</ip> + </service_restriction> + + <service_access service='sunstone'> + <port port_type="SymLinkOption">port_sunstone</port> + <port port_type="SymLinkOption">vnc_proxy_port_sunstone</port> + </service_access> + + <service_access service='sunstone_xmlrpc'> + <port service_accesslist="sunstone_xmlrpc">2633</port> + </service_access> + + <service_restriction service='sunstone_xmlrpc'> + <ip interface='one_node_int_name' interface_type='SymLinkOption' ip_type='SymLinkOption'>one_nodes</ip> + </service_restriction> + </files> + <variables> + <family name='general'> + <variable name='nom_machine' redefine='True' auto_freeze='True'/> + </family> + <family name='services'> + <variable name='activer_onesinglenode' type='oui/non' description="Activer l'orchestrateur de virtualisation" mode='expert'> + <value>oui</value> + </variable> + </family> + <family name='Virtualisation' icon='cloud'> + <variable name='one_cluster_name' type='string' description="Nom de la grappe OpenNebula par défaut" mode='expert'> + <value>default</value> + </variable> + + <!-- Base de donnée --> + <variable name="one_database_type" description="Moteur de base de données a utiliser" type="string" mode="expert"> + <value>sqlite</value> + </variable> + <variable name="one_database_host" description="Adresse du serveur de base de données (MySQL uniquement)" mandatory="True" mode="expert"/> + <variable name="one_database_port" description="Port d'écoute du serveur de base de données" mode="expert" type="number" mandatory="True"> + <value>3306</value> + </variable> + <variable name="one_database_name" description="Nom de la base de données" type="string" mandatory="True"> + <value>onedb</value> + </variable> + <variable name="one_database_user" description="Utilisateur pour se connecter à la base de données" type="string" mandatory="True"> + <value>one</value> + </variable> + <variable name="one_database_pass" description="Mot de passe pour se connecter à la base de données" type="password" mandatory="True"/> + <variable name="one_database_connections" description="Nombre de connection à la base de données" type="number" mandatory="True" mode="expert"><value>50</value></variable> + + <!-- VNETS --> + <variable name='vnet_pilote' type='string' description='Pilote utilisé pour le réseau virtuel' hidden='True' /> + <variable name='vnets' type='string' description="Nom du réseau virtuel à plage d'adresse IP" multi='True'/> + <variable name='vnet_range_start' type='ip' description='Première IP de la plage' mandatory="True"/> + <variable name='vnet_range_size' type='number' description="Nombre d'adresses disponible" mandatory="True"/> + <variable name='vnet_network_addr' type='network' description='Adresse du réseau virtuel'/> + <variable name='vnet_network_mask' type='netmask' description='Masque du réseau virtuel'/> + <variable name='vnet_network_gw' type='ip' description='Passerelle du réseau virtuel'/> + <variable name='vnet_network_dns' type='ip' description='Adresse du serveur DNS'/> + <variable name='vnet_vlan_tag' type='number' description='Numéro du VLAN'/> + <variable name='vnet_vlan_trunk' type='number' description="VLAN à transporter (trunk)" mode='expert'/> + + <variable name='l2_vnets' type='string' description="Nom du réseau virtuel à plage d'adresse ethernet" multi='True'/> + <variable name='l2_vnet_first_mac' type='string' description='Première adresse MAC' mode='expert'/> + <variable name='l2_vnet_size' type='number' description="Nombre d'adresse MAC disponible" mandatory="True"/> + <variable name='l2_vnet_vlan_tag' type='number' description='Numéro du VLAN'/> + <variable name='l2_vnet_vlan_trunk' type='number' description="VLAN à transporter (trunk)" mode='expert'/> + + <variable name='one_ds_system_prefix' description="Préfixe de l'espace de stockage système" auto_freeze='True'> + <value>system-</value> + </variable> + <variable name='one_ds_iso_name' description="Nom de l'espace de stockage des images ISO" auto_freeze='True'> + <value>iso-images</value> + </variable> + <variable name='one_ds_image_name' description="Nom de l'espace de stockage des images disques" auto_freeze='True'> + <value>images-disques</value> + </variable> + <variable name='one_disk_cache' type='oui/non' description='Activer le cache pour les images Qcow2' mode='expert'> + <value>oui</value> + </variable> + <variable name='one_video_driver' type='string' description='Pilote vidéo par défaut' mode='expert'> + <value>vga</value> + </variable> + <variable name='arp_cache_poisoning' type='oui/non' description="Activer la protection contre l'ARP Poisoning" mode='expert'> + <value>non</value> + </variable> + <variable name='activer_hooks' type='oui/non' description="Utiliser des hooks personnalisés" mode='expert'> + <value>non</value> + </variable> + <variable name='activer_one_ha' type='oui/non' description="Activer le support pour la haute disponibilité OpenNebula" mode='expert'> + <value>non</value> + </variable> + <variable name='activer_multinode' description="Activer l'intégration de plusieurs nÅ“uds de virtualisation" mode='expert' type='oui/non'/> + <variable name='one_nodes' type='domain' description="Nom du nÅ“ud de virtualisation" multi='True' mandatory='True'/> + <variable name="one_ha_server_index" description="Index du serveur dans la liste des nÅ“uds de virtualisation" type="number" mandatory="True"/> + <variable name='one_node_int' type='domain' description="Interface de communication des nÅ“uds" mandatory='True'/> + <variable name='one_node_int_name' type='domain' description="Nom de l'interface de communication des nÅ“uds"/> + <variable name="one_vip" description="Adresse IP de la VIP OpenNebula" type="ip" mandatory="True"/> + <variable name="one_vip_mask" description="Masque de sous-réseau de la VIP OpenNebula" type="netmask" mandatory="True"/> + </family> + <family name='Modèle' icon='cloud'> + <variable name='hapy_init_master' type='oui/non' description="Activer l'auto-création du modèle de machine virtuelle pour installer un module EOLE"> + <value>non</value> + </variable> + <variable name='hapy_init_master_iso_version' type='string' description="Version de l'image ISO EOLE à télécharger" mandatory="True"/> + <variable name='hapy_init_master_disk_size' type='number' description="Taille en giga-octets du disque dur vierge"> + <value>40</value> + </variable> + </family> + <family name='Hooks' icon='anchor'> + <variable name='hapy_vm_hooks' type='oui/non' description="Hooks sur les machines virtuelles" mode='expert' mandatory='True'> + <value>non</value> + </variable> + <variable name='hapy_vm_hook' type='string' description="Nom du hook des machines virtuelles" multi='True' mode='expert'/> + <variable name='hapy_vm_hook_on' type='string' description="Déclencheur (on)" mode='expert'/> + <variable name='hapy_vm_hook_command' type='string' description="Script à déclencher (command)" mode='expert'/> + <variable name='hapy_vm_hook_arguments' type='string' description="Arguments à passer au script (arguments)" mode='expert'/> + <variable name='hapy_vm_hook_remote' type='oui/non' description="Exécuter sur les nÅ“uds (remote)" mode='expert'> + <value>non</value> + </variable> + <variable name='hapy_vm_hook_state' type='string' description='État attendu en déclencheur CUSTOM (state)' mode='expert'/> + <variable name='hapy_vm_hook_lcm_state' type='string' description='État LCM attendu en déclencheur CUSTOM (lcm_state)' mode='expert'/> + + <variable name='hapy_user_hooks' type='oui/non' description="Hooks sur les utilisateurs" mode='expert' mandatory='True'> + <value>non</value> + </variable> + <variable name='hapy_user_hook' type='string' description="Nom du hook d'utilisateur" multi='True' mode='expert'/> + <variable name='hapy_user_hook_on' type='string' description="Déclencheur (on)" mode='expert' mandatory='True'/> + <variable name='hapy_user_hook_command' type='string' description="Script à déclencher (command)" mode='expert' mandatory='True'/> + <variable name='hapy_user_hook_arguments' type='string' description="Arguments à passer au script (arguments)" mode='expert'/> + </family> + <separators> + <separator name="one_database_type">Configuration de la base de données</separator> + <separator name='vnet_pilote'>Configuration des réseaux de l'orchestrateur</separator> + <separator name='one_ds_system_prefix'>Configuration de l'orchestrateur</separator> + <separator name='activer_one_ha'>Configuration des nÅ“uds de virtualisation</separator> + </separators> + </variables> + + <constraints> + <check name="valid_enum" target="vnet_pilote"> + <param>['openvswitch']</param> + </check> + <auto name='calc_multi_condition' target='activer_openvswitch'> + <param>openvswitch</param> + <param type="eole" name="condition_1">vnet_pilote</param> + </auto> + + <check name="valid_enum" target="one_database_type"> + <param>['sqlite','mysql']</param> + </check> + + <check name='valid_enum' target='one_video_driver'> + <param>['qxl','vga','std','cirrus']</param> + <param name='checkval'>False</param> + </check> + + <condition name='disabled_if_in' source='activer_onesinglenode'> + <param>non</param> + <target type='filelist'>onesinglenode</target> + <target type='filelist'>one_ha</target> + <target type='family'>Modèle</target> + <target type='variable'>one_ds_system_prefix</target> + <target type='variable'>one_ds_iso_name</target> + <target type='variable'>one_ds_image_name</target> + <target type='variable'>vnets</target> + <target type='variable'>vnet_network_addr</target> + <target type='variable'>vnet_network_mask</target> + <target type='variable'>vnet_network_dns</target> + <target type='variable'>vnet_network_gw</target> + <target type='variable'>vnet_range_start</target> + <target type='variable'>vnet_range_size</target> + <target type='variable'>vnet_vlan_tag</target> + <target type='variable'>vnet_vlan_trunk</target> + <target type='variable'>activer_multinode</target> + <target type='variable'>l2_vnets</target> + <target type='variable'>l2_vnet_first_mac</target> + <target type='variable'>l2_vnet_size</target> + <target type='variable'>l2_vnet_vlan_tag</target> + <target type='variable'>l2_vnet_vlan_trunk</target> + <target type='variable'>arp_cache_poisoning</target> + </condition> + + <condition name="disabled_if_in" source="one_database_type"> + <param>sqlite</param> + <target type="variable">one_database_host</target> + <target type="variable">one_database_port</target> + <target type="variable">one_database_name</target> + <target type="variable">one_database_user</target> + <target type="variable">one_database_pass</target> + <target type="variable">one_database_connections</target> + </condition> + + <check name="valid_enum" target="one_node_int"> + <param>['0','1','2','3','4']</param> + </check> + <auto name='concat' target='one_node_int_name'> + <param>eth</param> + <param type='eole'>one_node_int</param> + </auto> + + <condition name='disabled_if_in' source='activer_multinode'> + <param>non</param> + <target type='variable'>one_nodes</target> + <target type='variable'>one_node_int</target> + <target type='variable'>one_node_int_name</target> + </condition> + <fill name='calc_val' target='activer_multinode'> + <param type='eole' name='valeur'>activer_one_ha</param> + </fill> + <condition name='frozen_if_in' source='activer_one_ha'> + <param>oui</param> + <target type='variable'>activer_multinode</target> + </condition> + + <condition name='disabled_if_in' source='activer_one_ha'> + <param>non</param> + <target type='variable'>one_ha_server_index</target> + <target type='variable'>one_vip</target> + <target type='variable'>one_vip_mask</target> + <target type='service_accesslist'>sunstone_xmlrpc</target> + <target type='filelist'>one_ha</target> + </condition> + + <fill name='calc_val' target='one_vip_mask'> + <param type='eole' name='valeur'>adresse_netmask_eth0</param> + </fill> + + <check name="valid_differ" target="adresse_ip_eth0"> + <param type='eole' hidden='False'>one_vip</param> + </check> + <check name="valid_differ" target="adresse_ip_gw"> + <param type='eole' hidden='False'>one_vip</param> + </check> + <check name="valid_ipnetmask" target="one_vip_mask" level="warning"> + <param type='eole'>one_vip</param> + </check> + + <group master='vnets'> + <slave>vnet_range_start</slave> + <slave>vnet_range_size</slave> + <slave>vnet_network_addr</slave> + <slave>vnet_network_mask</slave> + <slave>vnet_network_gw</slave> + <slave>vnet_network_dns</slave> + <slave>vnet_vlan_tag</slave> + <slave>vnet_vlan_trunk</slave> + </group> + + <group master='l2_vnets'> + <slave>l2_vnet_first_mac</slave> + <slave>l2_vnet_size</slave> + <slave>l2_vnet_vlan_tag</slave> + <slave>l2_vnet_vlan_trunk</slave> + </group> + + <check name='valid_enum' target='vnets'> + <param>['internet','admin','pedago','dmzpub','dmzpriv','wifi']</param> + <param name='checkval'>False</param> + </check> + + <check name='valid_enum' target='l2_vnets'> + <param>['internet','admin','pedago','dmzpub','dmzpriv','wifi']</param> + <param name='checkval'>False</param> + </check> + + <condition name='disabled_if_in' source='activer_openvswitch'> + <param>non</param> + <target type='variable'>vnets</target> + <target type='variable'>vnet_network_addr</target> + <target type='variable'>vnet_network_dns</target> + <target type='variable'>vnet_network_mask</target> + <target type='variable'>vnet_network_gw</target> + <target type='variable'>vnet_range_start</target> + <target type='variable'>vnet_range_size</target> + <target type='variable'>vnet_vlan_tag</target> + <target type='variable'>vnet_vlan_trunk</target> + <target type='variable'>l2_vnet_first_mac</target> + <target type='variable'>l2_vnet_size</target> + <target type='variable'>l2_vnet_vlan_tag</target> + <target type='variable'>l2_vnet_vlan_trunk</target> + <target type='variable'>arp_cache_poisoning</target> + </condition> + + <condition name='disabled_if_in' source='activer_hooks'> + <param>non</param> + <target type='family'>Hooks</target> + </condition> + + <check name="valid_enum" target="hapy_vm_hook_on"> + <param>['CREATE','RUNNING','SHUTDOWN','STOP','DONE','UNKNOWN','FAILED','CUSTOM']</param> + </check> + + <condition name='disabled_if_in' source='hapy_vm_hooks'> + <param>non</param> + <target type='variable'>hapy_vm_hook</target> + </condition> + <group master='hapy_vm_hook'> + <slave>hapy_vm_hook_on</slave> + <slave>hapy_vm_hook_command</slave> + <slave>hapy_vm_hook_arguments</slave> + <slave>hapy_vm_hook_remote</slave> + <slave>hapy_vm_hook_state</slave> + <slave>hapy_vm_hook_lcm_state</slave> + </group> + + <check name="valid_enum" target="hapy_user_hook_on"> + <param>['CREATE','REMOVE']</param> + </check> + + <condition name='disabled_if_in' source='hapy_user_hooks'> + <param>non</param> + <target type='variable'>hapy_user_hook</target> + </condition> + <group master='hapy_user_hook'> + <slave>hapy_user_hook_on</slave> + <slave>hapy_user_hook_command</slave> + <slave>hapy_user_hook_arguments</slave> + </group> + <condition name='disabled_if_in' source='hapy_init_master'> + <param>non</param> + <target type='variable'>hapy_init_master_iso_version</target> + <target type='variable'>hapy_init_master_disk_size</target> + </condition> + + <fill name='calc_val' target='hapy_init_master_iso_version'> + <param type='eole' name='valeur'>eole_release</param> + </fill> + <auto name='calc_network' target='vnet_network_addr'> + <param type='eole' name='ip'>vnet_range_start</param> + <param type='eole' name='netmask'>vnet_network_mask</param> + </auto> + <check name="valid_in_network" target="vnet_network_gw" level="warning"> + <param type='eole'>vnet_network_addr</param> + <param type='eole'>vnet_network_mask</param> + </check> + <check name="valid_differ" target="vnet_network_gw" level="warning"> + <param type='eole'>vnet_range_start</param> + </check> + <check name="valid_differ" target="vnet_network_dns" level="warning"> + <param type='eole'>vnet_range_start</param> + </check> + </constraints> + + <help> + <variable name='arp_cache_poisoning'>Active la protection contre les attaques par empoisonnement ARP. Non compatible avec les réseaux à plage d'adresse ethernet</variable> + <family name='Hooks'>Gestion des hooks personnalisés</family> + <variable name='hapy_vm_hook'>Nom du hook de machine virtuelle</variable> + <variable name='hapy_vm_hook_on'>Déclencheur du hook</variable> + <variable name='hapy_vm_hook_command'>Script lancé par le hook</variable> + <variable name='hapy_vm_hook_arguments'>Arguments passés au script lancé par le hook de machine virtuelle</variable> + <variable name='hapy_vm_hook_remote'>Exécuter le script sur le nÅ“ud plutôt que sur l'orchestrateur</variable> + <variable name='hapy_vm_hook_state'>État attendu par le hook lorsque le déclencheur est "CUSTOM"</variable> + <variable name='hapy_vm_hook_lcm_state'>État LCM attendu par le hook lorsque le déclencheur est "CUSTOM"</variable> + <variable name='hapy_user_hook'>Nom du hook d'utilisateur</variable> + <variable name='hapy_user_hook_on'>Déclencheur du hook</variable> + <variable name='hapy_user_hook_command'>Script lancé par le hook</variable> + <variable name='hapy_user_hook_arguments'>Arguments passés au script lancé par le hook</variable> + <family name='Modèle'>Configuration d'un modèle de machine virtuelle par défaut</family> + <variable name='hapy_init_master'>Initialiser OpenNebula avec quelques fonctions de base : ISO EOLE, Disque dur vierge et template d'installation d'Eolebase. ATTENTION, provoque le téléchargement de l'ISO EOLE</variable> + <variable name='hapy_init_master_iso_version'>Version de l'ISO EOLE à télécharger lors de l'initialisation</variable> + <variable name='vnets'>Réseau de type IPv4 (niveau 3 du modèle OSI)</variable> + <variable name='l2_vnets'>Réseau de type ethernet (niveau 2 du modèle OSI)</variable> + <variable name='one_ha_server_index'>Le leader à l'index 0, les followers commencent à 1</variable> + <variable name='activer_one_ha'>Active la possibilité d'intégrer Hâpy dans une grappe de haute disponibilité OpenNebula</variable> + <variable name="one_vip">Adresse IP virtuelle (VIP) utilisée pour joindre le "Leader" de la grappe, les usagés utiliseront cette IP pour contacter la grappe</variable> + </help> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/files/etc/systemd/system/opennebula.service.d/libvirt-dep.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/files/etc/systemd/system/opennebula.service.d/libvirt-dep.conf new file mode 100644 index 0000000000000000000000000000000000000000..ebc70dc070f0847bd35ee255ce3c980874875afb --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/files/etc/systemd/system/opennebula.service.d/libvirt-dep.conf @@ -0,0 +1,3 @@ +[Unit] +After=multi-user.target +After=libvirt-bin.service diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/files/lib/systemd/system/onenode.service b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/files/lib/systemd/system/onenode.service new file mode 100644 index 0000000000000000000000000000000000000000..9a165a64c2111e8768a448641e05c52b4cefed40 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/files/lib/systemd/system/onenode.service @@ -0,0 +1,22 @@ +[Unit] +Description=OpenNebula Node starter +After=opennebula.service opennebula-sunstone.service libvirt-bin.service +ConditionPathExists=/etc/eole/release +After=multi-user.target + +[Service] +Type=oneshot +Environment=CREDS=/var/lib/one/.one/one_auth +Environment=ENDPOINT=http://127.0.0.1:2633/RPC2 +RemainAfterExit=yes +Restart=no +ExecStart=/usr/share/eole/sbin/onevm-all -c ${CREDS} -e ${ENDPOINT} -a "resume" +# Permit to start remaining VMs at distance by a simple restart +ExecReload=/usr/share/eole/sbin/onevm-all -c ${CREDS} -e ${ENDPOINT} -a "resume" +ExecStop=/usr/share/eole/sbin/onevm-all -w 300 -c ${CREDS} -e ${ENDPOINT} -a "suspend" +# Keep some marging with timeout +TimeoutStartSec=120s +TimeoutStopSec=360s + +[Install] +WantedBy=multi-user.target diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/files/usr/share/eole/diagnose/04-virtualisation b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/files/usr/share/eole/diagnose/04-virtualisation new file mode 100644 index 0000000000000000000000000000000000000000..dfc15a5703982e0994fa501cba538def7acdb3a3 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/files/usr/share/eole/diagnose/04-virtualisation @@ -0,0 +1,92 @@ +#!/bin/bash + +. /usr/lib/eole/diagnose.sh + + +eKO() { + EchoRouge "Erreur" +} + +eOK() { + EchoVert "Ok" +} + +one() +{ + su oneadmin -s /bin/sh -c "$@" +} + +TestServiceStatus() { + printf ". %${len_pf}s => " "$1" + service $2 status >/dev/null 2>&1 + if [ $? -eq 0 ] ; then + eOK + else + eKO + fi +} + +eOneStatus() { + [ "$1" = "STOPPED" -o "$1" = "UNKNOWN" ] && EchoRouge "$1" && return + [ "$1" = "off" ] && EchoRouge "$1" && return + [ "$1" = "ACTIVE" -o "$1" = "on" ] && EchoVert "$1" && return + EchoOrange "$1" +} + + +EchoGras "*** Virtualisation" + +if [ "$(CreoleGet 'activer_openvswitch')" != "oui" ]; then + printf ". %${len_pf}s => " "Virutalisation" + EchoOrange "Non actif" + fi + +TestServiceStatus "libvirt" libvirt-bin +TestServiceStatus "OpenNebula" opennebula +TestService "XMLRPC" "localhost:2633" +TestService "Sunstone" $(CreoleGet "ip_sunstone"):$(CreoleGet "port_sunstone") +TestService "Proxy VNC" $(CreoleGet "ip_sunstone"):$(CreoleGet "vnc_proxy_port_sunstone") +if [ "$(CreoleGet 'activer_oneflow' 'non')" == 'oui' ]; then +TestService "OneFlow" $(CreoleGet "ip_oneflow"):$(CreoleGet "port_oneflow") +fi +TestServiceStatus "OpenVswitch" openvswitch-switch +echo "" + +if [[ $(CreoleGet activer_onesinglenode 2>&1) == 'oui' ]] +then + EchoGras "*** Noeuds du cluster Hâpy" + + NODES=$(one 'onehost list -l ID,NAME,STAT' | awk '!/ID.*NAME.*STAT/ {print $1 ":" $2 ":" $3}') + for elm in ${NODES} + do + node=(${elm//:/ }) + id=${node[0]} + name=${node[1]} + state=${node[2]} + + printf ". %${len_pf}s => " "$name" + eOneStatus "${state}" + done + echo +fi + +EchoGras "*** Machines Virtuelles" + +# Les machines virtuelles se terminant par -TEST ne sont pas vérifiées +VMs=$( one 'onevm list -l ID,NAME,STAT' | tail -n +2 | grep -ve '\-TEST ' | awk '{print $1}' ) +if [[ -z ${VMs} ]] +then + printf ". %${len_pf}s " "Aucune machine virtuelle instanciée" + echo "" +else + for VM in $VMs ; do + NAME=$( one "onevm show $VM" | grep '^NAME' | cut -d: -f2 ) + STAT=$(one "onevm show $VM" | grep '^STATE' | cut -d: -f2 | tr -d ' ' ) + printf ". %${len_pf}s => " "$NAME" + eOneStatus "$STAT" + done +fi + +echo "" + + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/files/usr/share/eole/sbin/onehost_create_all b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/files/usr/share/eole/sbin/onehost_create_all new file mode 100644 index 0000000000000000000000000000000000000000..994719aad9259a9bc6c94d0751dcbb26a24a6e7a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/files/usr/share/eole/sbin/onehost_create_all @@ -0,0 +1,230 @@ +#!/usr/bin/env bash + +# +# Register all Hâpy Cluster Nodes +# + +. /usr/lib/eole/ihm.sh + +# +# NAME: copy_ssh_id +# AIM: Copy the ssh key on the host +# PARAM: the hostname of the node +# +function copy_ssh_id() +{ + local host=${1} + + CLEF=$(cat ~oneadmin/.ssh/id_rsa.pub) + ssh ${host} bash <<EOF +if ! grep -qs "$CLEF" ~oneadmin/.ssh/authorized_keys; then + echo "$CLEF" >> ~oneadmin/.ssh/authorized_keys + chown oneadmin:oneadmin ~oneadmin/.ssh/authorized_keys + su - oneadmin -c "ssh-keyscan $host" + cat ~oneadmin/.ssh/id_rsa.pub >> ~oneadmin/.ssh/authorized_keys +fi +EOF + [[ ${?} -ne 0 ]] && EchoRouge "Erreur lors de l'échange de clés SSH avec le noeud ${host}" + REMOTEKEY=$(su - oneadmin -c "ssh ${host} 'cat ~oneadmin/.ssh/id_rsa.pub'") + if ! grep -qs "$REMOTEKEY" ~oneadmin/.ssh/authorized_keys; then + su - oneadmin -c "echo ${REMOTEKEY} >> ~oneadmin/.ssh/authorized_keys" + su - oneadmin -c "ssh-keyscan $host" + fi +} + +function copy_files() +{ + local host=${1} + su - oneadmin -c "scp .one/* ${host}:.one/" +} + + +# +# NAME: sync_db +# AIM: Sync onedb in HA and sqlite mode +# PARAM: the hostname of the node +# +function sync_db() +{ + local ip=${1} + local user="oneadmin" + local DBFILE="/var/lib/one/one.db" + local DBBCK="/tmp/one.db.bck" + local ret=0 + + if [[ ! -f ${DBBCK} ]] + then + cmd="onedb backup --sqlite ${DBFILE} ${DBBCK}" + ret=$(su - ${user} -c -- "${cmd}") + fi + + cmd2="scp ${DBBCK} ${ip}:${DBFILE}.leader" + ret=$(su - ${user} -c -- "${cmd2}") + return ${?} +} + +# +# NAME: sync_nodes +# AIM: force nodes sync with rsync (ONE 5.6.1 bug) +# PARAM: none +# +function sync_nodes() +{ + # Need to sync hosts with rsync after creation, ONE 5.6.1 bug + cmd2="onehost sync -f --rsync" + ret2=$(su - ${ONEUSER} -c -- "${cmd2}") + return ${?} +} + +# +# NAME: register_node +# AIM: register the node in OpenNebula master +# PARAM: the node hostname +# +function register_node() +{ + cmd="onehost create -i kvm -v kvm -c 0 ${1}" + + ret=$(su - ${ONEUSER} -c -- "${cmd}") + if [[ ${?} -ne 0 ]] + then + EchoRouge "Hosts register failed $res" + else + EchoVert "Hosts register OK" + fi +} + + +# +# NAME: wait_node_ok +# AIM: Wait until the node is OK or ERROR +# PARAM: The node name +# +function wait_node_ok() +{ + local cmd="onehost show ${1} | awk '/^STATE/ {print \$3}'" + local spinstr='|/-\' + local delay=0.75 + local cnt=0 + + while [ 1 ] + do + st=$(su - ${ONEUSER} -c "${cmd}") + [[ ${st} == "MONITORED" ]] && break + [[ ${st} == '' ]] && break + if [[ ${st} == "ERROR" ]] + then + if [ $cnt -gt 160 ]; then + EchoRouge "Erreur lors de l'enregistrement du noeud ${host} !" + break + fi + fi + + local temp=${spinstr#?} + printf " [%c] " "$spinstr" + local spinstr=$temp${spinstr%"$temp"} + sleep $delay + printf "\b\b\b\b\b\b" + cnt=$((cnt+1)) + done + printf " \b\b\b\b" +} + +function init_ha_leader() { + # server with index 1 exists if already instanciate + onezone show 0 | grep -A 3 ^"HA & FEDERATION SYNC STATUS" | tail -n 1 | grep -q ^" 1 " + if [ ! $? = 0 ]; then + FOLLOWER=$(CreoleGet one_nodes) + for follower in $FOLLOWER; do + onezone server-add 0 --name $follower --rpc http://$follower:2633/RPC2 + done + fi +} + +# +# MAIN +# +HAPY_ACTIF=$(echo $(CreoleGet activer_onesinglenode)) +if [[ $HAPY_ACTIF == "non" ]] +then + EchoRouge "Le serveur de virtualisation n'est pas activé dans l'interface de configuration du module" + exit 1 +fi + +HAPY_NODE_SUPPORT=$(echo $(CreoleGet activer_multinode)) +if [[ $HAPY_NODE_SUPPORT == "non" ]] +then + EchoRouge "Le mode multi-noeuds n'est pas activé dans l'interface de configuration du module" + exit 1 +fi + +HAPY_HA=$(CreoleGet activer_one_ha "non") + +master=1 +if [[ ${HAPY_HA} == "oui" ]]; then + idx=$(CreoleGet one_ha_server_index) + if [[ ${idx} = "0" ]]; then + master=0 + else + master=2 + fi +fi + +declare -a HAPY_SLV=('') +ONEUSER=$(CreoleGet virt_user) +HAPY_SLV=$(echo $(CreoleGet one_nodes) | sed -e "s/\n/ /g") +DBMODE=$(CreoleGet one_database_type "none") + +echo -e "\n" +EchoBleu "Vous allez inscrire un noeud dans une grappe Hâpy" +EchoBleu "Pour ce faire vous devez vous munir du mot de passe de l'utilisateur 'root' de chacun des noeuds" +Question_ouinon "Voulez-vous commencer ?" 'True' "oui" +if [[ $? -ne 0 ]] +then + EchoOrange "Abandon de l'enregistrement" + exit 1 +fi + + +for host in ${HAPY_SLV}; do + echo -e "\n" + EchoOrange "Traitement du noeud ${host}" + echo + EchoVert " * Gestion des clés SSH" + echo + copy_ssh_id ${host} + if [ $master = 2 ]; then + continue + fi + if [ $master = 0 ]; then + copy_files ${host} + fi + + EchoVert " * Enregistrement du noeud" + register_node ${host} + if [[ ${HAPY_HA} == "oui" ]] + then + if [[ $DBMODE == "sqlite" ]] + then + if [[ $(CreoleGet one_ha_server_index) == "0" ]] + then + sync_db ${host} + fi + fi + fi + if [[ ${HAPY_HA} != "oui" ]] + then + sync_nodes + wait_node_ok ${HAPY_SLV[${i}]} + if [[ ${?} -ne 0 ]] + then + EchoRouge "Erreur lors de l'enregistrement du noeud ${HAPY_SLV[${i}]} !" + fi + fi +done + +if [ $master = 0 ]; then + init_ha_leader +fi +echo -e "\n" +EchoVert "Enregistrement des noeuds terminé" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/files/usr/share/eole/sbin/onevm-all b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/files/usr/share/eole/sbin/onevm-all new file mode 100644 index 0000000000000000000000000000000000000000..efb12d1efdccedb6fe3e264779895693be58df4b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/files/usr/share/eole/sbin/onevm-all @@ -0,0 +1,279 @@ +#!/usr/bin/env ruby + +# Do not buffer output +STDOUT.sync = TRUE + +############################################################################## +# Environment Configuration +############################################################################## +ONE_LOCATION=ENV["ONE_LOCATION"] +USER=ENV["user"] +RUNVMFILE="/var/lib/one/running.bck" +TIMEOUT=20 + +# oneadmin user flag value +USERFLAG=-2 + +if !ONE_LOCATION + RUBY_LIB_LOCATION="/usr/lib/one/ruby" +else + RUBY_LIB_LOCATION=ONE_LOCATION+"/lib/ruby" +end + +$: << RUBY_LIB_LOCATION + +############################################################################## +# Required libraries +############################################################################## +require 'opennebula' +require 'optparse' + +include OpenNebula + +MAXWAIT=60 +INTERVAL=1 + +# List of supported actions +ACTIONS = [ + 'status', # Get the status of all VMs in OpenNebula VM pool + 'suspend', # Suspend all VMs in RUNNING state + 'resume', # Resume all VMs in SUSPENDED or UNKNOWN state +] + + +# Map each action with a target state +EXPECTED_STATUS_MAP = { + 'status' => nil, + 'boot' => 'runn', + 'suspend' => 'susp', + 'resume' => 'runn' +} + +def dump_running_vms_file() + if File.exist?(RUNVMFILE) + running_vms = File.readlines(RUNVMFILE).uniq + else + running_vms = [] + end + + return running_vms +end + +def CreoleGet(variable) + begin + value = `CreoleGet #{variable}` + return value + rescue + return nil + end +end + +def _do_wait(vms, action, maxwait) + if maxwait == 0 and action == 'resume' + # User explicitely don't want to wait + vms.clear + return 0 + end + + print "Wait #{maxwait}s for VMs to #{action}" + for try in 0..maxwait + vms.delete_if do |vm| + vm.info + vm.status == EXPECTED_STATUS_MAP[action] + end + break if vms.empty? + print "." + sleep(1) + end + if vms.empty? + puts " OK" + return 0 + else + puts " FAIL" + return -1 + end +end + + +# +# NAME: _do_suspend +# PARAM: OpenNebula::VirtualMachine object +# AIM: Suspend a virtual machine +# +def _do_suspend(vm) + fd = File.open(RUNVMFILE,'a') + if vm.status == "runn" + puts("Suspending #{vm.id} - #{vm.name}... ") + fd.write("#{vm.id}\n") + rc = vm.suspend + if OpenNebula.is_error?(rc) + puts rc.message + else + puts "scheduled" + end + end + fd.close +end + +# +# NAME: _do_resume +# PARAM: OpenNebula::VirtualMachine object +# AIM: Resum a suspended virtual machines +# +def _do_resume(vm) + print("Resume #{vm.id} - #{vm.name}... ") + rc = vm.resume + if OpenNebula.is_error?(rc) + puts rc.message + else + puts "scheduled" + end +end + + +options = {:creds => nil, :action => nil, :endpoint => nil, + :timeout => nil} + +parser = OptionParser.new do|opts| + opts.banner = "Usage: #{File.basename(__FILE__)} [options]" + opts.on('-c', '--creds file', 'Crediential file') do |value| + options[:creds] = value; + end + + opts.on('-a', '--action action', 'Action to run') do |value| + options[:action] = value; + end + + opts.on('-e', '--end-point url', 'End point URL') do |value| + options[:endpoint] = value; + end + + opts.on('-t', '--timeout timeout', 'Timeout for opennebula connection') do |value| + options[:timeout] = value.to_i; + end + + opts.on('-w', '--wait timeout', 'Wait for action ends') do |value| + options[:wait] = value.to_i + end + + opts.on('-h', '--help', 'Displays Help') do + puts opts + exit + end + +end + +parser.parse! + +# OpenNebula credentials +if not options[:creds] + options[:creds] = "/var/lib/one/.one/one_auth" +end + +if not options[:action] + options[:action] = "status" +end + +if not options[:endpoint] + ip = CreoleGet('adresse_ip_eth0').chomp + options[:endpoint] = "http://#{ip}:2633/RPC2" +end + +if not options[:timeout] + options[:timeout] = TIMEOUT +end + +if not options[:wait] + options[:wait] = MAXWAIT +end + + +if not ACTIONS.include?(options[:action]) + puts("Action : #{options[:action]}) is not supported") + exit(-1) +end + + +begin + File.readlines(options[:creds]).each do |line| + CREDENTIALS = line + end +rescue + puts("#{options[:creds]}: Problem loading credentials, check if file exists.") + exit(-1) +end + + +exit_code = 0 +begin + client = Client.new(CREDENTIALS, options[:endpoint]) + + vm_pool = VirtualMachinePool.new(client, USERFLAG) + + # Try to load vm pool infos from OpenNebula until timeout expires + rc = vm_pool.info + cnt = 0 + while OpenNebula.is_error?(rc) + if cnt == options[:timeout] + puts rc.message + exit(-1) + end + rc = vm_pool.info + sleep(1) + cnt += 1 + end + + if options[:action] == "resume" + running_vms = dump_running_vms_file() + running_vms.each do |vmid| + vm = VirtualMachine.new_with_id(vmid, client) + vm.info + _do_resume(vm) + end + + else + vm_pool.each do |vm| + case options[:action] + when "status" + puts "#{vm.name}\t#{vm.status}" + + when "suspend" + _do_suspend(vm) + end + end + + # Update list of suspended VMs + running_vms = dump_running_vms_file() + end + + if options[:action] != 'status' + vms = [] + running_vms.each do |vmid| + vm = VirtualMachine.new_with_id(vmid, client) + vms.push(vm) + end + exit_code = _do_wait(vms, options[:action], options[:wait]) + end + + if options[:action] == "resume" + if vms.empty? + File.truncate(RUNVMFILE, 0) if File.exists?(RUNVMFILE) + else + fd = File.open(RUNVMFILE,'w') + vms.each do |vm| + fd.write("#{vm.id}\n") + end + end + end + +rescue Exception => e + puts e.message + puts e.backtrace + exit(-1) +end + +exit(exit_code) + +# Local Variables: +# ruby-indent-level: 4 +# End: diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/files/usr/share/zephir/monitor/configs/services/30_libvirt.srv b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/files/usr/share/zephir/monitor/configs/services/30_libvirt.srv new file mode 100644 index 0000000000000000000000000000000000000000..291eb0dae1010ebc48f91c7613a2cd0e53120e39 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/files/usr/share/zephir/monitor/configs/services/30_libvirt.srv @@ -0,0 +1,9 @@ +# -*- coding: UTF-8 -*- +""" +Surveillance des services OpenNebula +""" + +from zephir.monitor.agents.services import StatusService + +AGENTS.append(StatusService('libvirt', {'libvirt-bin' : "Libvirt"}, period=115, + description="Etat du serveur Libvirt")) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/files/usr/share/zephir/monitor/configs/services/31_opennebula.srv b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/files/usr/share/zephir/monitor/configs/services/31_opennebula.srv new file mode 100644 index 0000000000000000000000000000000000000000..234cef529c5f7955a691d8009fdde77bc6da55e7 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/files/usr/share/zephir/monitor/configs/services/31_opennebula.srv @@ -0,0 +1,9 @@ +# -*- coding: UTF-8 -*- +""" +Surveillance des services OpenNebula +""" + +from zephir.monitor.agents.services import StatusService + +AGENTS.append(StatusService('opennebula', {'opennebula' : "OpenNebula"}, period=115, + description="Etat du serveur OpenNebula")) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/files/usr/share/zephir/monitor/configs/services/32_xmlrpc.srv b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/files/usr/share/zephir/monitor/configs/services/32_xmlrpc.srv new file mode 100644 index 0000000000000000000000000000000000000000..fd94cb04f78b9001fe8b99dedcbcf93b6bd5ccb3 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/files/usr/share/zephir/monitor/configs/services/32_xmlrpc.srv @@ -0,0 +1,9 @@ +# -*- coding: UTF-8 -*- +""" +Surveillance des services OpenNebula +""" + +from zephir.monitor.agents.services import TCPServices + +AGENTS.append(TCPServices('xmlrpc', {'localhost:2633': "XMLRPC"}, period=115, + description="Etat du serveur XMLRPC")) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/files/usr/share/zephir/monitor/configs/services/33_sunstone.srv b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/files/usr/share/zephir/monitor/configs/services/33_sunstone.srv new file mode 100644 index 0000000000000000000000000000000000000000..8d9340b4cce3dee8f26b1036f4f882fa443b22db --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/files/usr/share/zephir/monitor/configs/services/33_sunstone.srv @@ -0,0 +1,12 @@ +# -*- coding: UTF-8 -*- +""" +Surveillance des services OpenNebula +""" + +from zephir.monitor.agents.services import TCPServices +from zephir.monitor.agentmanager.config import (IP_SUNSTONE, + PORT_SUNSTONE) + +test = '{}:{}'.format(IP_SUNSTONE, PORT_SUNSTONE) +AGENTS.append(TCPServices('sunstone', {test : "Sunstone"}, period=115, + description="Etat du serveur Sunstone")) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/files/usr/share/zephir/monitor/configs/services/34_proxyvnc.srv b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/files/usr/share/zephir/monitor/configs/services/34_proxyvnc.srv new file mode 100644 index 0000000000000000000000000000000000000000..daa9ba25cd86007be5f161173a62f6031e49097e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/files/usr/share/zephir/monitor/configs/services/34_proxyvnc.srv @@ -0,0 +1,12 @@ +# -*- coding: UTF-8 -*- +""" +Surveillance des services OpenNebula +""" + +from zephir.monitor.agents.services import TCPServices +from zephir.monitor.agentmanager.config import (IP_SUNSTONE, + VNC_PROXY_PORT_SUNSTONE) + +test = '{}:{}'.format(IP_SUNSTONE, VNC_PROXY_PORT_SUNSTONE) +AGENTS.append(TCPServices('proxyvnc', {test: "Proxy VNC"}, period=115, + description="Etat du serveur Proxy VNC")) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/files/usr/share/zephir/monitor/configs/services/35_oneflow.srv b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/files/usr/share/zephir/monitor/configs/services/35_oneflow.srv new file mode 100644 index 0000000000000000000000000000000000000000..d61d55ca0bdf8d3e8a5df857507d1c0497f7fe2b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/files/usr/share/zephir/monitor/configs/services/35_oneflow.srv @@ -0,0 +1,14 @@ +# -*- coding: UTF-8 -*- +""" +Surveillance des services OpenNebula +""" + +from zephir.monitor.agents.services import TCPServices +from zephir.monitor.agentmanager.config import (ACTIVER_ONEFLOW, + IP_ONEFLOW, + PORT_ONEFLOW) + +if ACTIVER_ONEFLOW: + test = '{}:{}'.format(IP_ONEFLOW, PORT_ONEFLOW) + AGENTS.append(TCPServices('oneflow', {test: "oneFlow"}, period=115, + description="Etat du serveur oneFlow")) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/files/usr/share/zephir/monitor/configs/services/36_openvswitch.srv b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/files/usr/share/zephir/monitor/configs/services/36_openvswitch.srv new file mode 100644 index 0000000000000000000000000000000000000000..fa2994342ddd304f349e69339438060cd5a80ede --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/files/usr/share/zephir/monitor/configs/services/36_openvswitch.srv @@ -0,0 +1,9 @@ +# -*- coding: UTF-8 -*- +""" +Surveillance des services OpenNebula +""" + +from zephir.monitor.agents.services import StatusService + +AGENTS.append(StatusService('openvswitch', {'openvswitch-switch' : "OpenVswitch"}, period=115, + description="Etat du serveur OpenVswitch")) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/files/var/lib/one/remotes/hooks/eole/graphicsfw b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/files/var/lib/one/remotes/hooks/eole/graphicsfw new file mode 100644 index 0000000000000000000000000000000000000000..1865cb8b696a21f19e3c279c1669460a0b915a70 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/files/var/lib/one/remotes/hooks/eole/graphicsfw @@ -0,0 +1,73 @@ +#!/bin/bash + +SELF_DIR="$(dirname $(readlink -e ${0}))" +BASE_DIR="$(dirname $(dirname ${SELF_DIR}))" +SCRIPTCOMMON="${BASE_DIR}/scripts_common.sh" + +. ${SCRIPTCOMMON} + +IPTABLES="sudo iptables" +XPATH="${BASE_DIR}/datastore/xpath.rb --stdin --base64" + +RULES_FILE="/run/one/one_graphics_rules" + +function one_get_port() +{ + ${XPATH} ${1} '/VM/TEMPLATE/GRAPHICS/PORT' +} + +function open_port() +{ + declare -a authorized_ip + declare -a authorized_netmask + + vm_port=$(one_get_port ${1}) + [[ -z "${vm_port}" ]] && return 2 + authorized_ip=( $(CreoleGet ip_ssh_eth0) ) + [[ -z "${authorized_ip}" ]] && return 2 + authorized_netmask=( $(CreoleGet netmask_ssh_eth0) ) + [[ -z "${authorized_netmask}" ]] && return 2 + + for ((i = 0; i < ${#authorized_ip[*]}; i +=1)) + do + ${IPTABLES} -I eth0-root -s ${authorized_ip[$i]}/${authorized_netmask[$i]} -p tcp -m tcp --dport ${vm_port} --tcp-flags FIN,SYN,RST,ACK SYN -j ACCEPT + [[ ${?} -eq 0 ]] && echo "/sbin/iptables -I eth0-root -s ${authorized_ip[$i]}/${authorized_netmask[$i]} -p tcp -m tcp --dport ${vm_port} --tcp-flags FIN,SYN,RST,ACK SYN -j ACCEPT" >> "${RULES_FILE}" + ${IPTABLES} -I eth0-root -s $(CreoleGet one_master_ip) -p tcp -m tcp --dport ${vm_port} --tcp-flags FIN,SYN,RST,ACK SYN -j ACCEPT + [[ ${?} -eq 0 ]] && echo "/sbin/iptables -I eth0-root -s $(CreoleGet one_master_ip) -p tcp -m tcp --dport ${vm_port} --tcp-flags FIN,SYN,RST,ACK SYN -j ACCEPT" >> "${RULES_FILE}" + done +} + + +function close_port() +{ + vm_port=$(one_get_port ${1}) + [[ -n "${vm_port}" ]] || return 2 + rule_ids=$(${IPTABLES} -n --line-numbers -L eth0-root | awk "/dpt:${vm_port}/ {print \$1}") + for rule_id in ${rule_ids} + do + ${IPTABLES} -D eth0-root ${rule_id} + if [[ $? -eq 0 ]] + then + sed -i "/--dport ${vm_port}/d" "${RULES_FILE}" + fi + done +} + + +action=${1} +template=${2} + +case $action in + open) + open_port ${template} + exit $? + ;; + close) + close_port ${template} + exit $? + ;; + *) + echo "Unknown action '$action'" >&2 + exit 127 + ;; +esac diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/postservices/30-one-mng b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/postservices/30-one-mng new file mode 100644 index 0000000000000000000000000000000000000000..93526f07f5c2e51466df119e22406aa4a6b15e2c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/postservices/30-one-mng @@ -0,0 +1,494 @@ +#!/usr/bin/env bash + +. /usr/lib/eole/utils.sh + +function error() +{ + MSG=${1} + echo "[ERROR][${MSG}]" + exit 1 +} + +function get_user_home() +{ + HOMEDIR=$(getent passwd ${1} | cut -d ':' -f 6) + echo ${HOMEDIR} +} + +function get_one_auth() +{ + CMD="cat" + HOME=$(get_user_home oneadmin) + FILE="${HOME}/.one/one_auth" + ${CMD} ${FILE} +} + +function check_default_cluster() +{ + name="${1}" + cmd="onecluster show 0" + auth=$(get_one_auth) + + DEFAULT_NAME=$(${cmd} --user ${auth%:*} --password ${auth#*:} | awk '/^NAME/ {print $3}') + [[ "${name}" = "${DEFAULT_NAME}" ]] +} + +function rename_default_cluster() +{ + NAME="${1}" + CMD="onecluster rename 0 ${NAME}" + AUTH=$(get_one_auth) + + if ! check_default_cluster "${NAME}" + then + + if ${CMD} --user ${AUTH%:*} --password ${AUTH#*:} + then + echo "The default cluster name is now '${NAME}'" + else + error "The default cluster can not be renamed" + fi + else + echo "The default cluster name is already \"${NAME}\"" + fi +} + +function check_host() +{ + name="${1}" + cmd="onehost" + opt="list" + auth=$(get_one_auth) + + res=0 + clst_list=$(${cmd} ${opt} --user ${auth%:*} --password ${auth#*:} | tail -n +2 | awk -F ' ' '{print $2}') + for hst in ${clst_list} + do + [[ "${NAME}" = "${hst}" ]] && res=$((res+1)) + done + return ${res} +} + +# Fix host creation error from 5.6.1 with sync methode rsync +function sync_host() +{ + CMD="onehost" + OPT="sync -f --rsync" + AUTH=$(get_one_auth) + res=$(su - oneadmin -c "${CMD} ${OPT} --user ${AUTH%:*} --password ${AUTH#*:}") + if [[ ${?} -ne 0 ]] + then + error "Hosts sync failed" + else + echo "Hosts sync OK" + fi +} + +function manage_host() +{ + NAME=${1} + CMD="onehost" + IM_MAD='kvm' + VM_MAD='kvm' + OPT="create ${NAME} -i ${IM_MAD} -v ${VM_MAD}" + AUTH=$(get_one_auth) + + check_host ${NAME} + if [[ ${?} -eq 0 ]] + then + res=$(${CMD} ${OPT} --user ${AUTH%:*} --password ${AUTH#*:}) + if [[ ${?} -ne 0 ]] + then + error "Host creation failed" + else + echo "Host ${NAME} created" + fi + else + echo "Host ${NAME} already exist" + fi +} + +function get_cluster_id_by_name() +{ + name=${1} + cmd="onecluster" + opt="show ${name}" + opt="list -l ID,NAME -f NAME=${name} --csv" + + + res=$(${cmd} ${opt} --user ${AUTH%:*} --password ${AUTH#*:} | awk -F ',' '/^[0-9]/ { print $1 }') + if [[ ${?} -eq 0 ]] + then + echo ${res#*:} + return 0 + else + echo "" + return 1 + fi +} + +# +# Get Host ID by a name +# +function get_host_id_by_name() +{ + name=${1} + cmd="onehost" + opt="show ${name}" + + res=$(${cmd} ${opt} --user ${AUTH%:*} --password ${AUTH#*:} | grep "ID.*:") + if [[ ${?} -eq 0 ]] + then + echo ${res#*:} + return 0 + else + echo "" + return 1 + fi +} + +# +# Get Datastore ID by a name +# +function get_ds_id_by_name() +{ + name=${1} + cmd="onedatastore" + opt="show ${name}" + + res=$(${cmd} ${opt} --user ${AUTH%:*} --password ${AUTH#*:} | grep "ID.*:") + if [[ ${?} -eq 0 ]] + then + echo ${res#*:} + return 0 + else + echo "ERR" + return 1 + fi +} + +# +# check_host_in_cluster +# if host is attached to cluster : return 0 +# if host not attached to cluster : return 1 +# +function check_host_in_cluster() +{ + hst=${1} + clst=${2} + auth=$(get_one_auth) + cmd="onehost" + opt="show ${hst} --user ${AUTH%:*} --password ${AUTH#*:}" + + RES=$(${cmd} ${opt} | grep CLUSTER) + cluster=${RES#*:} + # clean Outpu + cluster="${cluster#"${cluster%%[![:space:]]*}"}" # remove leading whitespace characters + cluster="${cluster%"${cluster##*[![:space:]]}"}" # remove trailing whitespace characters + if [[ "${cluster}" = "${clst}" ]] + then + return 0 + else + return 1 + fi +} + +# +# Attach a host to a cluster +# +function attach_host() +{ + HOST=${1} + CLST=${2} + # ref https://dev-eole.ac-dijon.fr/issues/16797 + #CLST_ID=$(get_cluster_id_by_name ${CLST}) + CLST_ID=0 + HST_ID=$(get_host_id_by_name ${HOST}) + AUTH=$(get_one_auth) + CMD="onecluster" + OPT="addhost ${CLST_ID} ${HST_ID}" + + check_host_in_cluster ${HOST} ${CLST} + if [[ ${?} -eq 1 ]] + then + if [[ -n ${CLST_ID} ]] + then + if [[ -n ${HST_ID} ]] + then + RES=$(${CMD} ${OPT} --user ${AUTH%:*} --password ${AUTH#*:}) + if [[ ${?} -ne 0 ]] + then + error "Attaching ${HOST} to ${CLST} failed" + else + echo "${HOST} attached to ${CLST}" + return 0 + fi + else + error "No host id for ${HOST}" + fi + else + error "No Cluster id for ${CLST}" + fi + else + echo "Host ${HOST} already present in cluster ${CLST}" + fi + return 0 +} + +# +# Attach a datastore to a cluster +# +# ref https://dev-eole.ac-dijon.fr/issues/16797 +#function attach_ds_to_cluster() +#{ +# DS=${1} +# CLST=${2} +# CLST_ID=$(get_cluster_id_by_name ${CLST}) +# DS_ID=$(get_ds_id_by_name ${ds_name}) +# AUTH=$(get_one_auth) +# CMD="onecluster" +# OPT="adddatastore ${CLST_ID} ${DS_ID}" +# +# RES=$(${CMD} ${OPT} --user ${AUTH%:*} --password ${AUTH#*:}) +# if [[ ${?} -ne 0 ]] +# then +# error "Attaching ${DS} to ${CLST} failed." +# else +# echo "Datastore ${DS} attached to ${CLST}." +# return 0 +# fi +# return 0 +#} + +function create_datastore() +{ + ds_type="${1}" + ds_name="${2}" + local ha=$(CreoleGet activer_one_ha) + # ref https://dev-eole.ac-dijon.fr/issues/16797 + #ds_cluster="${3}" + + if [[ $(CreoleGet activer_multinode 2>&1) == 'oui' ]] && [[ ${ha} == "non" ]] + then + SYS_TM_MAD='ssh' + ISO_TM_MAD='ssh' + IMG_TM_MAD='ssh' + else + SYS_TM_MAD='shared' + ISO_TM_MAD='shared' + IMG_TM_MAD='qcow2' + fi + + echo "Creating datastore ${ds_name}" + TMPL_FILE=$(mktemp) + case ${ds_type} in + "SYSTEM") + cat <<__EOF__ > ${TMPL_FILE} +NAME = ${ds_name} +TM_MAD = ${SYS_TM_MAD} +TYPE = SYSTEM_DS +__EOF__ + ;; + "ISO") + cat <<__EOF__ > ${TMPL_FILE} +NAME = ${ds_name} +DS_MAD = fs +TM_MAD = ${ISO_TM_MAD} +TYPE = IMAGE_DS +__EOF__ + ;; + "IMAGE") + cat <<__EOF__ > ${TMPL_FILE} +NAME = ${ds_name} +DS_MAD = fs +TM_MAD = ${ISO_TM_MAD} +TYPE = IMAGE_DS +__EOF__ + ;; + + *) echo "Nothing to do with ${ds_type}" + ;; + esac + + auth=$(get_one_auth) + cmd="onedatastore" + opt="create --user ${AUTH%:*} --password ${AUTH#*:} ${TMPL_FILE}" + RUN=$(${cmd} ${opt}) + if [[ ${?} -eq 0 ]] + then + # ref https://dev-eole.ac-dijon.fr/issues/16797 + #attach_ds_to_cluster ${ds_name} ${ds_cluster} + rm ${TMPL_FILE} + return 0 + else + return 1 + fi +} + +function update_datastore() +{ + local auth=${1} + local ds_id=${2} + local cmd="onedatastore" + local opt="show" + local multinode=$(CreoleGet activer_multinode 2>&1) + local ha=$(CreoleGet activer_one_ha) + ds_type="" + ds_mad="" + ds_name="" + + TMPL_FILE=$(mktemp) + + if [[ ${multinode} == 'oui' ]] && [[ ${ha} == "non" ]] + then + SYS_TM_MAD='ssh' + ISO_TM_MAD='ssh' + IMG_TM_MAD='ssh' + else + SYS_TM_MAD='shared' + ISO_TM_MAD='shared' + IMG_TM_MAD='qcow2' + fi + + out=$(${cmd} ${opt} ${ds_id} --user ${auth%:*} --password ${auth#*:} | \ + awk -F ':' '/^DATASTORE.*INFORMATION/,/DATASTORE CAPACITY/ {gsub(" |\t",""); print $1 ":" $2 " " }') + for line in ${out} + do + [[ ${line} =~ ^TM_MAD ]] && ds_mad=${line#*:} + [[ ${line} =~ ^NAME ]] && ds_name=${line#*:} + [[ ${line} =~ ^TYPE ]] && ds_type=${line#*:} + done + + if [[ ${ds_name} == "$(CreoleGet one_ds_system_prefix 2>&1)$(CreoleGet one_cluster_name 2>&1)" ]] + then + cat <<__EOF__ > ${TMPL_FILE} +NAME = ${ds_name} +TM_MAD = ${SYS_TM_MAD} +TYPE = SYSTEM_DS +__EOF__ + elif [[ ${ds_name} == "$(CreoleGet one_ds_iso_name 2>&1)" ]] + then + cat <<__EOF__ > ${TMPL_FILE} +NAME = ${ds_name} +DS_MAD = fs +TM_MAD = ${ISO_TM_MAD} +TYPE = IMAGE_DS +__EOF__ + elif [[ ${ds_name} == "$(CreoleGet one_ds_image_name 2>&1)" ]] + then + cat <<__EOF__ > ${TMPL_FILE} +NAME = ${ds_name} +DS_MAD = fs +TM_MAD = ${ISO_TM_MAD} +TYPE = IMAGE_DS +__EOF__ + else + echo "Nothing to do with ${ds_name}" + fi + + if [[ -s ${TMPL_FILE} ]] + then + echo "Updating ${ds_name} datastore" + opt="update ${ds_id} --user ${AUTH%:*} --password ${AUTH#*:} ${TMPL_FILE}" + RUN=$(${cmd} ${opt}) + rm ${TMPL_FILE} + return ${?} + else + rm ${TMPL_FILE} + return 1 + fi +} + +function manage_datastores() +{ + # ref https://dev-eole.ac-dijon.fr/issues/16797 + #cluster=${1} + AUTH=$(get_one_auth) + + # ref https://dev-eole.ac-dijon.fr/issues/16797 + #SYSTEM_DS="$(CreoleGet 'one_ds_system_prefix')${cluster}" + SYSTEM_DS="$(CreoleGet 'one_ds_system_prefix')default" + ISO_DS=$(CreoleGet 'one_ds_iso_name') + IMAGE_DS=$(CreoleGet 'one_ds_image_name') + + echo "Configuring datastores for Cluster" + sid=$(get_ds_id_by_name ${SYSTEM_DS}) + if [[ ${sid} = "ERR" ]] + then + # ref https://dev-eole.ac-dijon.fr/issues/16797 + #create_datastore "SYSTEM" "${SYSTEM_DS}" "${cluster}" + create_datastore "SYSTEM" "${SYSTEM_DS}" + else + update_datastore ${AUTH} ${sid} + fi + + imgid=$(get_ds_id_by_name ${IMAGE_DS}) + if [[ ${imgid} = "ERR" ]] + then + # ref https://dev-eole.ac-dijon.fr/issues/16797 + #create_datastore "IMAGE" "${IMAGE_DS}" "${cluster}" + create_datastore "IMAGE" "${IMAGE_DS}" + else + update_datastore ${AUTH} ${imgid} + fi + + isoid=$(get_ds_id_by_name ${ISO_DS}) + if [[ ${isoid} = "ERR" ]] + then + # ref https://dev-eole.ac-dijon.fr/issues/16797 + #create_datastore "ISO" "${ISO_DS}" "${cluster}" + create_datastore "ISO" "${ISO_DS}" + else + update_datastore ${AUTH} ${isoid} + fi + return 0 +} + +function main() +{ + wait_true_retcode "Wait for oned to be started" "onecluster show 0 > /dev/null" + if [ "$(CreoleGet activer_one_ha)" = "oui" ]; then + if [ "$(CreoleGet one_ha_server_index)" != "0" ]; then + # ne pas faire sur les followers + return + fi + fi + # + # Rename default cluster + clst_name=$(CreoleGet one_cluster_name) + rename_default_cluster "${clst_name}" + + # Wait 4 seconds for service (ref #16848) + sleep 4 + + # + # Creating Host + # + if [ ! "$(CreoleGet activer_one_ha)" = "oui" ]; then + if [[ $(CreoleGet eole_module non) != 'hapy-master' ]] + then + host=$(CreoleGet nom_machine) + manage_host ${host} + fi + fi + + # + # Attaching Host to the Cluster + # + attach_host ${host} "${clst_name}" + + # + # Force host synchronisation + # + sync_host + + # + # Création des Datastores + # + manage_datastores "${clst_name}" + +} + +main $@ + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/postservices/31-one-netmng b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/postservices/31-one-netmng new file mode 100644 index 0000000000000000000000000000000000000000..abb2a40fd3b9febaf3eda6040994aab9db2353c6 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/postservices/31-one-netmng @@ -0,0 +1,383 @@ +#!/usr/bin/env python + +from pyeole import process +from pyeole.log import init_logging + +from creole.client import CreoleClient +from tempfile import mkstemp + +import sys +import os +import csv +import logging +import re + +LOG_FILE = '/var/log/one/eole-one-node.log' + +logger = None + +class RunCmdError(Exception): + pass + + +class OneClient(): + + def __init__(self, user): + self.user = None + self.auth = None + self.root = '/var/lib/one' + + if user: + self.user = user + else: + self.user = 'oneadmin' + + user_info = process.system_out(['getent', 'passwd', user])[1] + if user_info: + self.root = user_info.split(':')[5] + + command = ['cat', u'{0}/.one/one_auth'.format(self.root)] + res = process.system_out(command) + if res[0] == 0: + self.auth = res[1].split(':') + else: + msg = u"OneClient: unable to authenticate: '{stdout}', '{stderr}'" + logger.error(msg.format(stdout=res[1], stderr=res[2])) + + + def __run_cmd__(self, cmd): + logger.debug(u"OneClient: execute command '{cmd}'".format(cmd=cmd)) + + command = list(cmd) + command.extend(['--user', self.auth[0]]) + command.extend(['--password', self.auth[1]]) + + res = process.system_out(command) + if res[0] == 0: + if 'list' in cmd: + out_lines = [] + if res: + for line in res[1].split('\n'): + if len(line) == 0: + next + elif re.match('^.*ID ', line): + next + else: + out_lines.append(line.split()) + return out_lines + else: + return res + else: + msg = u"OneClient: error executing '{cmd}': '{stdout}', '{stderr}'" + logger.error(msg.format(cmd=cmd, stdout=res[1], stderr=res[2])) + return False + + def get_hosts(self): + """ get the list of hosts + """ + logger.debug(u"OneClient: list all hosts") + cmd = ['onehost', 'list'] + cmd.extend(['-l', 'ID,NAME']) + res = self.__run_cmd__(cmd) + return(res) + + def get_clusters(self): + """ get the cluster list + """ + logger.debug(u"OneClient: list all clusters") + cmd = ['onecluster', 'list'] + cmd.extend(['-l', 'ID,NAME']) + return self.__run_cmd__(cmd) + + def get_networks(self): + """ get the virtual network list + """ + logger.debug(u"OneClient: list all networks") + cmd = ['onevnet', 'list'] + cmd.extend(['-l', 'ID,NAME']) + return self.__run_cmd__(cmd) + + def get_cluster_id_by_name(self, name): + logger.debug(u"OneClient: get cluster named '{name}'".format(name=name)) + cmd = ['onecluster', 'list'] + cmd.extend(['-f', 'NAME={0}'.format(name)]) + res = self.__run_cmd__(cmd) + ID = res[0][0] + return ID + + def get_vnet_id_by_name(self, name): + logger.debug(u"OneClient: get network named '{name}'".format(name=name)) + cmd = ['onevnet', 'list'] + cmd.extend(['-f', 'NAME={0}'.format(name)]) + res = self.__run_cmd__(cmd) + ID = res[0][0] + return ID + + def create_network(self, templatefile, cluster, vnet_name): + """ Create a network + """ + logger.info(u"OneClient: create network named '{name}'".format(name=vnet_name)) + cmd = ['onevnet', 'create', templatefile] + res = self.__run_cmd__(cmd) + if res and res[0] == 0: + msg = u"OneClient: attach vnet '{vnet}' to cluster '{cluster}'" + logger.info(msg.format(vnet=vnet_name, cluster=cluster)) + + clt_id = self.get_cluster_id_by_name(cluster) + vnet_id = self.get_vnet_id_by_name(vnet_name) + res = self.__run_cmd__(['onecluster', 'addvnet', clt_id, vnet_id]) + + if not res: + print("Error attaching {0} vnet to {1} cluster".format(vnet_name, cluster)) + return False + else: + os.remove(templatefile) + return True + else: + logger.error(u"Creation of virtual network with template {0} failed".format(templatefile)) + return False + + + def update_network(self, templatefile, cluster, vnet_name): + """ Update a network + """ + logger.info(u"OneClient: update network named '{name}'".format(name=vnet_name)) + vnet_id = self.get_vnet_id_by_name(vnet_name) + cmd = ['onevnet', 'update'] + cmd.extend(['--user', self.auth[0]]) + cmd.extend(['--password', self.auth[1][:-1]]) + cmd.extend([vnet_id, templatefile]) + + res = process.system_out(cmd) + if res[0] == 0: + os.remove(templatefile) + return True + else: + logger.error(u"Update of virtual network with template {0} failed".format(templatefile)) + return False + + def delete_network(self, vnet_id): + logger.info(u"OneClient: delete network with ID '{id}'".format(id=vnet_id)) + cmd = ['onevnet', 'delete'] + cmd.extend(['--user', self.auth[0]]) + cmd.extend(['--password', self.auth[1][:-1]]) + cmd.append(vnet_id) + + res = process.system_out(cmd) + if res[0] == 0: + logger.info(u"Network {0} deleted".format(vnet_id)) + return True + else: + logger.error(u"Error deleting network {0}".format(vnet_id)) + return False + + +class OneNetwork(): + def create(self, one_client): + logger.debug(u"OneNetwork: create network named '{name}'".format(name=self.zone)) + tmpl_file = self.create_template() + if one_client.create_network(tmpl_file, self.cluster, self.zone): + logger.info(u"Virtual network {0} created".format(self.zone)) + return True + else: + logger.error(u"Error Creating virtual network {0}".format(self.zone)) + return False + + def update(self, one_client): + logger.debug(u"OneNetwork: update network named '{name}'".format(name=self.zone)) + tmpl_file = self.create_template(True) + if one_client.update_network(tmpl_file, self.cluster, self.zone): + logger.info(u"Virtual network {0} updated".format(self.zone)) + return True + else: + logger.error(u"Error Updating virtual network {0}".format(self.zone)) + return False + + def manage(self, one_client): + logger.debug(u"OneNetwork: manage network named '{name}'".format(name=self.zone)) + found = False + vnet = one_client.get_networks() + network_name = self.zone + for net in vnet: + if network_name in net: + found = True + break + + if not found: + return self.create(one_client) + else: + return self.update(one_client) + +class OneNetworkL3(OneNetwork): + def __init__(self, net_info, cluster): + self.swname = net_info[0] + self.zone = u'{0}{1}'.format(net_info[10], net_info[1]) + self.vlan = net_info[2] + self.vnet_addr = net_info[3] + self.vnet_mask = net_info[4] + self.vnet_gw = net_info[5] + self.vnet_rg_start = net_info[6] + self.vnet_rg_size = net_info[7] + self.vnet_dns = net_info[8] + self.vnet_trunk = net_info[9] + self.cluster = cluster + + def create_template(self, update=False): + logger.debug(u"OneNetworkL3: create template for network named '{name}'".format(name=self.zone)) + fd, tmp_path = mkstemp(prefix='oneVnet-') + template = open(tmp_path, 'w') + template.write('NAME = "{0}"\n'.format(self.zone)) + template.write('VN_MAD = ovswitch\n') + + if (update is False): + if self.vnet_rg_start and self.vnet_rg_size: + template.write('AR=[\n') + template.write('TYPE = "IP4",\n') + template.write('IP = "{0}",\n'.format(self.vnet_rg_start)) + template.write('SIZE = "{0}"\n'.format(self.vnet_rg_size)) + template.write(']\n') + else: + template.write('TYPE = FIXED\n') + + if self.vlan: + template.write('VLAN = yes\n') + template.write('VLAN_ID = {0}\n'.format(self.vlan)) + + if self.vnet_trunk: + template.write('VLAN_TAGGED_ID = {0}\n'.format(self.vnet_trunk)) + + template.write('BRIDGE = {0}\n'.format(self.swname)) + template.write('NETWORK_ADDRESS = {0}\n'.format(self.vnet_addr)) + template.write('NETWORK_MASK = {0}\n'.format(self.vnet_mask)) + template.write('GATEWAY = {0}\n'.format(self.vnet_gw)) + template.write('DNS = {0}\n'.format(self.vnet_dns)) + template.close() + return tmp_path + + +class OneNetworkL2(OneNetwork): + def __init__(self, net_info, cluster): + self.swname = net_info[0] + self.zone = u'{0}{1}'.format(net_info[6], net_info[1]) + self.net_size = net_info[2] + self.first_mac = net_info[3] + self.tag = net_info[4] + self.trunk = net_info[5] + self.cluster = cluster + + def create_template(self,update=False): + logger.debug(u"OneNetworkL2: create template for network named '{name}'".format(name=self.zone)) + fd, tmp_path = mkstemp(prefix='oneVnet-') + template = open(tmp_path, 'w') + template.write('NAME = "{0}"\n'.format(self.zone)) + template.write('VN_MAD = ovswitch\n') + + if self.tag: + template.write('VLAN = yes\n') + template.write('VLAN_ID = "{0}"\n'.format(self.tag)) + + if self.trunk: + template.write('VLAN_TAGGED_ID = "{0}""\n'.format(self.trunk)) + + template.write('BRIDGE = {0}\n'.format(self.swname)) + if update is False and self.net_size: + template.write("AR=[\n") + template.write(' TYPE = "ETHER",\n') + + if self.first_mac: + template.write(' MAC = "{0}",\n'.format(self.first_mac)) + + template.write(' SIZE = "{0}"\n'.format(self.net_size)) + template.write("]\n") + template.close() + return tmp_path + +def main(): + global logger + logger = init_logging(name='postservice.opennebula.network', + level=u'INFO', + as_root=True, + console=True, + syslog=True) + + logger.debug(u"Configure OpenNebula networks") + + client = CreoleClient() + + mode_ha = client.get_creole('activer_one_ha') + if mode_ha == "oui": + indx = client.get_creole('one_ha_server_index') + if indx != 0: + # Mode HA is on and we are not in the Leader + exit(0) + + one_client = OneClient('oneadmin') + networks = [] + cluster = client.get_creole('one_cluster_name') + swname = client.get_creole('ovs_sw_name') + zones = client.get_creole('vnets') + vlans = client.get_creole('vnet_vlan_tag') + vnet_addr = client.get_creole('vnet_network_addr') + vnet_mask = client.get_creole('vnet_network_mask') + vnet_dns = client.get_creole('vnet_network_dns') + vnet_gw = client.get_creole('vnet_network_gw') + vnet_rg_start = client.get_creole('vnet_range_start') + vnet_rg_size = client.get_creole('vnet_range_size') + vnet_trunk = client.get_creole('vnet_vlan_trunk') + + l2_vnet = client.get_creole('l2_vnets') + l2_vnet_size = client.get_creole('l2_vnet_size') + l2_vnet_vlan_tag = client.get_creole('l2_vnet_vlan_tag') + l2_vnet_vlan_trunk = client.get_creole('l2_vnet_vlan_trunk') + l2_vnet_first_mac = client.get_creole('l2_vnet_first_mac') + + net_prefix = "CR_" + + processed = [] + for cpt in range(len(zones)): + if zones[cpt] not in processed: + info = [] + info.append(swname) + info.append(zones[cpt]) + info.append(vlans[cpt]) + info.append(vnet_addr[cpt]) + info.append(vnet_mask[cpt]) + info.append(vnet_gw[cpt]) + info.append(vnet_rg_start[cpt]) + info.append(vnet_rg_size[cpt]) + info.append(vnet_dns[cpt]) + info.append(vnet_trunk[cpt]) + info.append(net_prefix) + networks.append(OneNetworkL3(info, cluster)) + processed.append(zones[cpt]) + + for i in range(len(l2_vnet)): + if l2_vnet[i] not in processed: + net_info = [] + net_info.append(swname) + net_info.append(l2_vnet[i]) + net_info.append(l2_vnet_size[i]) + net_info.append(l2_vnet_first_mac[i]) + net_info.append(l2_vnet_vlan_tag[i]) + net_info.append(l2_vnet_vlan_trunk[i]) + net_info.append(net_prefix) + networks.append(OneNetworkL2(net_info, cluster)) + processed.append(l2_vnet[i]) + + if client.get_creole('activer_openvswitch'): + for network in networks: + if not network.manage(one_client): + exit(1) + else: + logger.info(u'Open vSwitch disabled no need to configure virtual networks') + + networks = one_client.get_networks() + for net in networks: + name = net[1] + if name.startswith(net_prefix): + if not name[3:] in zones and not name[3:] in l2_vnet: + one_client.delete_network(net[0]) + + exit(0) + +main() diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/postservices/99-create-eoleone-user b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/postservices/99-create-eoleone-user new file mode 100644 index 0000000000000000000000000000000000000000..b4e797f2b70136f55dc2c92d713e19aa4c686a57 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/postservices/99-create-eoleone-user @@ -0,0 +1,57 @@ +#!/bin/bash + +function error() +{ + MSG=${1} + echo "[ERROR][${MSG}]" + exit 1 +} + +function get_user_home() +{ + HOMEDIR=$(getent passwd ${1} | cut -d ':' -f 6) + echo ${HOMEDIR} +} + +function get_one_auth() +{ + CMD="cat" + HOME=$(get_user_home oneadmin) + FILE="${HOME}/.one/one_auth" + ${CMD} ${FILE} +} + + +if [ "$1" != 'instance' ];then + exit 0 +fi + +USER=eoleone +AUTH=$(get_one_auth) + +if oneuser show $USER --user ${AUTH%:*} --password ${AUTH#*:} &> /dev/null +then + echo "$USER existe déjà , abandon." + exit 0 +fi + +echo +echo "Initialisation du mot de passe pour l'utilisateur \"$USER\" pour l'accès à l'interface Web Sunstone" +echo +newpass1=a +newpass2=b +while [ $newpass1 != $newpass2 ] +do + echo -n "Entrez le nouveau mot de passe : " + read -s newpass1 + echo + echo -n "Retapez le nouveau mot de passe : " + read -s newpass2 + echo + [ $newpass1 != $newpass2 ] && echo "Les mots de passe ne correspondent pas, recommencez" +done +oneuser create $USER $newpass1 --user ${AUTH%:*} --password ${AUTH#*:} +echo +echo "Inscription de l'utilisateur $USER dans le groupe oneadmin" +echo +oneuser chgrp $USER oneadmin --user ${AUTH%:*} --password ${AUTH#*:} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/postservices/99-init-hapy-master b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/postservices/99-init-hapy-master new file mode 100644 index 0000000000000000000000000000000000000000..cfbc3a16709905997798f6267e9b9bb2444a2d97 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/postservices/99-init-hapy-master @@ -0,0 +1,158 @@ +#!/bin/bash + +[ $(CreoleGet hapy_init_master) == non ] && exit 0 + +function error() +{ + MSG=${1} + echo "[ERROR][${MSG}]" + exit 1 +} + +function get_user_home() +{ + HOMEDIR=$(getent passwd ${1} | cut -d ':' -f 6) + echo ${HOMEDIR} +} + +function get_one_auth() +{ + CMD="cat" + HOME=$(get_user_home oneadmin) + FILE="${HOME}/.one/one_auth" + ${CMD} ${FILE} +} + +function runOneCmd() +{ + local cmd=${1} + local opt=${2} + local auth=$(get_one_auth) + + $cmd ${opt} --user ${auth%:*} --password ${auth#*:} + return ${?} +} + +if [ $(CreoleGet activer_proxy_client 'non') = 'oui' ] +then + PROXY_SERVER=$(CreoleGet proxy_client_adresse) + PROXY_PORT=$(CreoleGet proxy_client_port) + PROXY_OPT="--proxy http://${PROXY_SERVER}:${PROXY_PORT}" +fi + +DISKSIZE=$(CreoleGet hapy_init_master_disk_size) +DISKNAME="DSK-${DISKSIZE}-Go" +DISKDESC="Disque vide de ${DISKSIZE} Go" + +VERSIONISO=$(CreoleGet hapy_init_master_iso_version) +MAJORVERSION=${VERSIONISO:0:3} +POINT_RELEASE=$(eole-iso ${PROXY_OPT} --release ${VERSIONISO} get-last-point-release) +ISONAME=$(eole-iso ${PROXY_OPT} --release ${VERSIONISO} get-iso-name) +ISODESC="Image ISO EOLE ${POINT_RELEASE} 64 bits" +ISOURL=$(eole-iso ${PROXY_OPT} --release ${VERSIONISO} get-iso-url) + +TMPLNAME="install-eole-${POINT_RELEASE}-amd64" +TMPLDESC="Modèle de VM permettant d'installer un module EOLE ${POINT_RELEASE} 64 bits (non persistente)" + +#echo "########### suppr ${DISKNAME} ###############" +#oneimage delete ${DISKNAME} +#echo +#echo "########### suppr ${ISONAME} ###################" +#oneimage delete ${ISONAME} +#echo +#echo "########### suppr ${TMPLNAME} ###################" +#onetemplate delete ${TMPLNAME} +#echo + +#***************************************************** +# DISQUE VIDE +#***************************************************** +if ! runOneCmd "oneimage" "show ${DISKNAME}" &>/dev/null +then + echo "***** Création de ${DISKNAME} *****" + + ## Attention oneimage create --datastore ne fonctionne pas dans runOneCmd ... + auth=$(get_one_auth) + oneimage create --datastore $(CreoleGet one_ds_image_name) \ + --name ${DISKNAME} --type DATABLOCK --description "${DISKDESC}" \ + --size $((${DISKSIZE}*1024)) --prefix vd --driver qcow2 --user ${auth%:*} --password ${auth#*:} + + runOneCmd "oneimage" "chtype ${DISKNAME} OS" +else + echo "***** ${DISKNAME} existe déjà *****" +fi +echo + +#***************************************************** +# Image ISO EOLE Latest Stable +#***************************************************** +if ! runOneCmd "oneimage" "show ${ISONAME}" &>/dev/null +then + echo -ne "***** Création de l'image ${ISONAME} *****\n\n" + + FILE=$(mktemp) + cat > ${FILE} <<EOF +NAME="${ISONAME}" +TYPE="CDROM" +DESCRIPTION="${ISODESC}" +DEV_PREFIX="hd" +PATH="${ISOURL}" +PERSISTENT="No" +EOF + runOneCmd "oneimage" "create -d $(CreoleGet one_ds_iso_name) ${FILE}" + /bin/rm -f ${FILE} + + spin='-\|/' + i=0 + while : + do + imgState=$(runOneCmd "oneimage" "show ${ISONAME}" | awk '{if ($1 == "STATE") {print $3}}') + if [[ ${imgState} == "lock" ]] + then + i=$(( (i+1) %4 )) + printf "\rInitialisation en cours, merci de patienter [${spin:$i:1}] " + sleep 2 + else + printf "\r Création terminée, l'image a le statut : ${imgState}\n" + break + fi + done + rm -f "/tmp/${ISONAME}" +else + echo "***** ${ISONAME} existe déjà *****" +fi +echo + + +#***************************************************** +# Template EOLEBASE +#***************************************************** +if ! onetemplate show "${TMPLNAME}" &>/dev/null +then + echo "***** Création de ${TMPLNAME} *****" + FILE=$(mktemp) + cat > ${FILE} <<EOF +NAME="${TMPLNAME}" +DESCRIPTION="${TMPLDESC}" +INPUT=[BUS="usb",TYPE="tablet"] +CPU="0.2" +DISK=[DEV_PREFIX="vd",IMAGE_UNAME="oneadmin",IMAGE="${DISKNAME}",DRIVER="qcow2"] +DISK=[DEV_PREFIX="hd",IMAGE_UNAME="oneadmin",IMAGE="${ISONAME}",DRIVER="raw"] +FEATURES=[ACPI="yes",PAE="no"] +VCPU="1" +GRAPHICS=[LISTEN="0.0.0.0",TYPE="vnc",KEYMAP="fr"] +OS = [ ARCH = "x86_64", BOOT = "disk0,disk1" ] +MEMORY="1024" +EOF + + +#NIC=[MODEL="virtio",NETWORK="CR_eole"] + runOneCmd "onetemplate" "create ${FILE}" + + /bin/rm -f ${FILE} +else + echo "***** ${TMPLNAME} existe déjà *****" +fi +echo +exit 0 + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/postservices/99-z-ha b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/postservices/99-z-ha new file mode 100644 index 0000000000000000000000000000000000000000..3519978322cc3f9d16fc3127fa04ae207b4399a5 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/postservices/99-z-ha @@ -0,0 +1,10 @@ +#!/bin/bash + +if [[ ${1} == "instance" ]]; then + ha=$(CreoleGet activer_one_ha non) + if [[ ${ha} == "oui" ]] + then + /usr/share/eole/sbin/onehost_create_all + fi +fi +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/posttemplates/10-libvirt-guests b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/posttemplates/10-libvirt-guests new file mode 100644 index 0000000000000000000000000000000000000000..88eef61037a55c51b20b137bca4fb065ba6beaf5 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/posttemplates/10-libvirt-guests @@ -0,0 +1,9 @@ +#!/bin/sh + +echo "Disable and mask libvirt-guests service" +for action in stop disable mask +do + systemctl ${action} libvirt-guests.service 2> /dev/null +done + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/posttemplates/90-one-db b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/posttemplates/90-one-db new file mode 100644 index 0000000000000000000000000000000000000000..213d0010e0d0f76f6a6effa479145d7003e9ad11 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/posttemplates/90-one-db @@ -0,0 +1,84 @@ +#!/bin/bash + +# +# AIM : Manage Opennebula database update +# +# + +. /usr/lib/eole/ihm.sh +script="$1" + +function clean_backups() +{ + file=${1} + ls ${file}_* > /dev/null 2>&1 + if [ $? = 0 ]; then + bcks=($(ls ${file}_*)) + nbbck=$(expr ${#bcks[@]} - 2) + + + if [[ ${nbbck} -gt 1 ]] + then + EchoGras "Cleaning up old backups !" + for idx in `seq 0 ${nbbck}` + do + rm -f ${bcks[${idx}]} + done + fi + fi +} + +function updateDB() +{ + local dbfile='/var/lib/one/one.db' + local cmd="onedb" + local res=0 + + if [[ -f ${dbfile} ]] + then + if [ $(CreoleGet one_database_type) = "mysql" ]; then + if [ $(CreoleGet one_ha_server_index 0) = "0" ]; then + HOST=$(CreoleGet one_database_host) + DB=$(CreoleGet one_database_name) + USER=$(CreoleGet one_database_user) + PASS=$(CreoleGet one_database_pass) + $cmd upgrade -f -u $USER -p $PASS -d $DB -S $HOST + fi + else + $cmd upgrade -f -s ${dbfile} + fi + res=${?} + clean_backups ${dbfile} + return ${res} + else + return 0 + fi +} + +function to_mysql() { + if [ "$script" = 'instance' ] && [ $(CreoleGet one_database_type) = "mysql" ] && [ $(CreoleGet one_ha_server_index 0) = "0" ]; then + Question_ouinon "Voulez-vous migrer de SQLite à Mysql ?" "True" "oui" "warn" + rep=$(echo "$?") + if [ "$rep" == "0" ]; then + # do not recover db on follower + HOST=$(CreoleGet one_database_host) + DB=$(CreoleGet one_database_name) + USER=$(CreoleGet one_database_user) + PASS=$(CreoleGet one_database_pass) + cp -a /etc/one/oned.conf /etc/one/oned.conf.ori + # HA ne doit pas être activer pour la migration + CreoleCat -s /usr/share/eole/creole/distrib/oned-ha-mysql.conf -o /etc/one/oned.conf + oned -i + onedb sqlite2mysql -s /var/lib/one/one.db -u $USER -p $PASS -d $DB -S $HOST + cp -a /etc/one/oned.conf.ori /etc/one/oned.conf + fi + fi +} + +echo +to_mysql +echo +EchoGras "Mise à jour de la base de données ONE" +echo +updateDB +exit ${?} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/preservices/30-one-auth b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/preservices/30-one-auth new file mode 100644 index 0000000000000000000000000000000000000000..9722a18a8c0d010530c917ed8bd458d606e6113a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/preservices/30-one-auth @@ -0,0 +1,17 @@ +#!/bin/bash + +auth_mode="$(CreoleGet sunstone_auth_modes '')" +unlink /var/lib/one/remotes/auth/default 2>/dev/null + +if [ -z "${auth_mode}" ]; then + ln -s /var/lib/one/remotes/auth/{dummy,default} +else + ln -s /var/lib/one/remotes/auth/{${auth_mode},default} +fi + +# creation de la base /var/lib/one/one.db +if [ ! -e /var/lib/one/one.db ]; then + systemctl daemon-reload + systemctl start opennebula.service +fi +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/preservices/31-one-ha b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/preservices/31-one-ha new file mode 100644 index 0000000000000000000000000000000000000000..d19a938afb562752e39a4c6264929415aa934c09 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/preservices/31-one-ha @@ -0,0 +1,26 @@ +#!/bin/bash + +HA=$(CreoleGet activer_one_ha non) +DBMODE=$(CreoleGet one_database_type "none") +LEADER_DB_FILE="/var/lib/one/one.db.leader" +DBFILE="/var/lib/one/one.db" + +# If HA is enabled and a leader database file is present +# we restore the leader database. + +if [[ ${HA} == "oui" ]] && [[ ${DBMODE} == "sqlite" ]] +then + if [[ -f ${LEADER_DB_FILE} ]] + then + if [[ $(CreoleGet one_ha_server_index) != "0" ]] + then + onedb restore --sqlite ${DBFILE} ${LEADER_DB_FILE} -f + if [[ $? -eq 0 ]] + then + rm ${LEADER_DB_FILE} + exit ${?} + fi + fi + fi +fi +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..835586cbef28284f1d5136438c97e564d58fedbd --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/service.yml @@ -0,0 +1,96 @@ +format: '0.1' +name: eole-one-master +version: |- + 2.7.1-2 +description: |- + Dictionnaires et templates pour configurer OpenNebula en mode Single Node + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: + - eole-ovs + - eole-libvirt +packages: + - sqlite3 + - ruby-xmlrpc + - opennebula +dictionaries: + - 29_one-master.xml +extra_dictionaries: {} +templates: + - 60-one + - OpenNebulaNetwork.conf + - ldap_auth.conf + - oned-ha-mysql.conf + - oned.conf + - sched.conf + - vmm_exec_kvm.conf +creole_funcs: [] +preservices: + - 30-one-auth + - 31-one-ha +postservices: + - 30-one-mng + - 31-one-netmng + - 99-create-eoleone-user + - 99-init-hapy-master + - 99-z-ha +pretemplates: [] +posttemplates: + - 10-libvirt-guests + - 90-one-db +files: + /etc/systemd/system/opennebula.service.d/libvirt-dep.conf: + owner: root + group: root + mode: '0644' + /lib/systemd/system/onenode.service: + owner: root + group: root + mode: '0644' + /usr/share/eole/diagnose/04-virtualisation: + owner: root + group: root + mode: '0755' + /usr/share/eole/sbin/onehost_create_all: + owner: root + group: root + mode: '0755' + /usr/share/eole/sbin/onevm-all: + owner: root + group: root + mode: '0755' + /usr/share/zephir/monitor/configs/services/30_libvirt.srv: + owner: root + group: root + mode: '0644' + /usr/share/zephir/monitor/configs/services/31_opennebula.srv: + owner: root + group: root + mode: '0644' + /usr/share/zephir/monitor/configs/services/32_xmlrpc.srv: + owner: root + group: root + mode: '0644' + /usr/share/zephir/monitor/configs/services/33_sunstone.srv: + owner: root + group: root + mode: '0644' + /usr/share/zephir/monitor/configs/services/34_proxyvnc.srv: + owner: root + group: root + mode: '0644' + /usr/share/zephir/monitor/configs/services/35_oneflow.srv: + owner: root + group: root + mode: '0644' + /usr/share/zephir/monitor/configs/services/36_openvswitch.srv: + owner: root + group: root + mode: '0644' + /var/lib/one/remotes/hooks/eole/graphicsfw: + owner: root + group: root + mode: '0755' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/templates/60-one b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/templates/60-one new file mode 100644 index 0000000000000000000000000000000000000000..24d4dfcafdaae6693918b40166bed958b7391852 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/templates/60-one @@ -0,0 +1,5 @@ +#!/bin/bash + +%for %%host in %%one_nodes +/sbin/iptables -A eth%%{one_node_int}-root -s %%host -p tcp --syn -j ACCEPT +%end for diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/templates/OpenNebulaNetwork.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/templates/OpenNebulaNetwork.conf new file mode 100644 index 0000000000000000000000000000000000000000..3ab10a6f0d3f8cd3cbd93c69333b8c44e8f14567 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/templates/OpenNebulaNetwork.conf @@ -0,0 +1,105 @@ +# -------------------------------------------------------------------------- # +# Copyright 2002-2018, OpenNebula Project, OpenNebula Systems # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); you may # +# not use this file except in compliance with the License. You may obtain # +# a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +#--------------------------------------------------------------------------- # + +################################################################################ +# Overriding Options in Network Template +################################################################################ +# +# Option can be overridden or added per network using this format +# in the network template: +# +# CONF="vxlan_mc=239.0.100.0,test=false,validate_vlan_id=true" +# BRIDGE_CONF="sethello=6" +# OVS_BRIDGE_CONF="stp_enable=true" +# IP_LINK_CONF="tos=10,udpcsum=,udp6zerocsumrx=__delete__" +# +# Options can have empty value when they don't need a parameter. Also the +# special value "__delete__" can be used to delete parameters set here. + +# Set to true to check that no other vlans are connected to the bridge. +# Works with 802.1Q and VXLAN. +:validate_vlan_id: false + +################################################################################ +# Open vSwitch Options +################################################################################ + +# Enable ARP Cache Poisoning Prevention Rules +%if %%getVar('arp_cache_poisoning','non') == 'oui' +:arp_cache_poisoning: true +%else +:arp_cache_poisoning: false +%end if + +################################################################################ +# 802.1Q Options +################################################################################ + +# Default MTU for the 802.1Q interface +:vlan_mtu: 1500 + +################################################################################ +# VXLAN Options +################################################################################ + +# Base multicast address for each VLAN. The mc address is :vxlan_mc + :vlan_id +:vxlan_mc: 239.0.0.0 +# Time To Live (TTL) should be > 1 in routed multicast networks (IGMP) +:vxlan_ttl: 16 +# Default MTU for the VXLAN interface +:vxlan_mtu: 1500 + +################################################################################ +# Security Group Options +################################################################################ + +# Maximal number of entries in the IP set +:ipset_maxelem: 65536 + +################################################################################ +# Bridge and Interface Creation Options +################################################################################ + +# Don't delete bridge with no virtual interfaces left +:keep_empty_bridge: false + +# These options will execute brctl commands with these values. For example, +# this option will execute: +# +# brctl stp <bridge name> on +# +# :bridge_conf: +# :stp: on + + +# These options are set on the OvS bridge. For example, +# this command will be trigged for the following option: +# +# ovs-vsctl set-bridge <bridge name> stp_enable=true +# +# :ovs_bridge_conf: +# :stp_enable: true + + +# These options will be added to the ip link add command. For example: +# +# sudo ip link add lxcbr0.260 type vxlan id 260 group 239.0.101.4 \ +# ttl 16 dev lxcbr0 udp6zerocsumrx tos 3 +# +# :ip_link_conf: +# :udp6zerocsumrx: +# :tos: 3 + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/templates/ldap_auth.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/templates/ldap_auth.conf new file mode 100644 index 0000000000000000000000000000000000000000..3269ee4d7a72d334b9aaf9fe2e4d94ed96d34c84 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/templates/ldap_auth.conf @@ -0,0 +1,73 @@ +# ---------------------------------------------------------------------------- # +# Copyright 2002-2018, OpenNebula Project, OpenNebula Systems # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); you may # +# not use this file except in compliance with the License. You may obtain # +# a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +# ---------------------------------------------------------------------------- # + +%if %%getVar('sunstone_auth_modes', None) == 'ldap' +server 1: + # Ldap user able to query, if not set connects as anonymous. For + # Active Directory append the domain name. Example: + # Administrator@my.domain.com + #:user: 'admin' + #:password: 'password' + + # Ldap authentication method + :auth_method: :simple + + # Ldap server + :host: %%adresse_ip_ldap + :port: %%ldap_port +%if %%getVar('ldap_tls', 'non') == 'oui' + + # Uncomment this line for tls conections + :encryption: :simple_tls +%end if + + # base hierarchy where to search for users and groups + :base: %%ldap_base_dn + + # group the users need to belong to. If not set any user will do + #:group: 'cn=cloud,ou=groups,dc=domain' + + # field that holds the user name, if not set 'cn' will be used + :user_field: 'uid' + + # for Active Directory use this user_field instead + #:user_field: 'sAMAccountName' + + # field name for group membership, by default it is 'member' + #:group_field: 'member' + + # user field that is in the group group_field, if not set 'dn' will be used + #:user_group_field: 'dn' + + # Generate mapping file from group template info + :mapping_generate: true + + # Seconds a mapping file remain untouched until the next regeneration + :mapping_timeout: 300 + + # Name of the mapping file in OpenNebula var diretory + :mapping_filename: server1.yaml + + # Key from the OpenNebula template to map to an AD group + :mapping_key: GROUP_DN + + # Default group ID used for users in an AD group not mapped + :mapping_default: 1 + +# List the order the servers are queried +:order: + - server 1 +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/templates/oned-ha-mysql.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/templates/oned-ha-mysql.conf new file mode 100644 index 0000000000000000000000000000000000000000..17b618c12dadec6d8e189031eabbe04c75f04a6d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/templates/oned-ha-mysql.conf @@ -0,0 +1,2 @@ +%set global %%activer_one_ha='non' +%include '/var/lib/creole/oned.conf' diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/templates/oned.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/templates/oned.conf new file mode 100644 index 0000000000000000000000000000000000000000..ed0b40736a3208dca8a12e54db9371c3492eaf7b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/templates/oned.conf @@ -0,0 +1,1493 @@ +#******************************************************************************* +# OpenNebula Configuration file +#******************************************************************************* + +#******************************************************************************* +# Daemon configuration attributes +#------------------------------------------------------------------------------- +# MANAGER_TIMER: Time in seconds the core uses to evaluate periodical functions. +# MONITORING_INTERVAL cannot have a smaller value than MANAGER_TIMER. +# +# MONITORING_INTERVAL: Time in seconds between host and VM monitorization. +# +# MONITORING_THREADS: Max. number of threads used to process monitor messages +# +# HOST_PER_INTERVAL: Number of hosts monitored in each interval. +# HOST_MONITORING_EXPIRATION_TIME: Time, in seconds, to expire monitoring +# information. Use 0 to disable HOST monitoring recording. +# +# VM_INDIVIDUAL_MONITORING: VM monitoring information is obtained along with the +# host information. For some custom monitor drivers you may need activate the +# individual VM monitoring process. +# VM_PER_INTERVAL: Number of VMs monitored in each interval, if the individual +# VM monitoring is set to yes. +# VM_MONITORING_EXPIRATION_TIME: Time, in seconds, to expire monitoring +# information. Use 0 to disable VM monitoring recording. +# +# SCRIPTS_REMOTE_DIR: Remote path to store the monitoring and VM management +# scripts. +# +# PORT: Port where oned will listen for xmlrpc calls. +# LISTEN_ADDRESS: Host IP to listen on for xmlrpc calls (default: all IPs). +# +# DB: Configuration attributes for the database backend +# backend : can be sqlite or mysql (default is sqlite) +# server : (mysql) host name or an IP address for the MySQL server +# port : (mysql) port for the connection to the server. +# If set to 0, the default port is used. +# user : (mysql) user's MySQL login ID +# passwd : (mysql) the password for user +# db_name : (mysql) the database name +# connections: (mysql) number of max. connections to mysql server +# +# VNC_PORTS: VNC port pool for automatic VNC port assignment, if possible the +# port will be set to ``START`` + ``VMID`` +# start : first port to assign +# reserved: comma separated list of ports or ranges. Two numbers separated by +# a colon indicate a range. +# +# LOG: Configuration for the logging system +# system: defines the logging system: +# file to log in the oned.log file +# syslog to use the syslog facilities +# std to use the default log stream (stderr) to use with systemd +# debug_level: 0 = ERROR, 1 = WARNING, 2 = INFO, 3 = DEBUG +# +# VM_SUBMIT_ON_HOLD: Forces VMs to be created on hold state instead of pending. +# Values: YES or NO. +#******************************************************************************* + +LOG = [ + SYSTEM = "file", + DEBUG_LEVEL = 3 +] + +#MANAGER_TIMER = 15 + +MONITORING_INTERVAL = 60 +MONITORING_THREADS = 50 + +#HOST_PER_INTERVAL = 15 +#HOST_MONITORING_EXPIRATION_TIME = 43200 + +#VM_INDIVIDUAL_MONITORING = "no" +#VM_PER_INTERVAL = 5 +#VM_MONITORING_EXPIRATION_TIME = 14400 + +SCRIPTS_REMOTE_DIR=/var/tmp/one + +PORT = 2633 + +%if %%activer_one_ha == 'non' +LISTEN_ADDRESS = "127.0.0.1" +%end if + +%if %%one_database_type == "sqlite" +DB = [ BACKEND = "sqlite" ] +%else +# Sample configuration for MySQL +DB = [ BACKEND = "mysql", + SERVER = "%%one_database_host", + PORT = %%one_database_port, + USER = "%%one_database_user", + PASSWD = "%%one_database_pass", + DB_NAME = "%%one_database_name", + CONNECTIONS = %%one_database_connections ] +%end if + +VNC_PORTS = [ + START = 5900 +# RESERVED = "6800, 6801, 6810:6820, 9869" +] + +#VM_SUBMIT_ON_HOLD = "NO" + +#******************************************************************************* +# Federation & HA configuration attributes +#------------------------------------------------------------------------------- +# Control the federation capabilities of oned. Operation in a federated setup +# requires a special DB configuration. +# +# FEDERATION: Federation attributes +# MODE: Operation mode of this oned. +# STANDALONE no federated.This is the default operational mode +# MASTER this oned is the master zone of the federation +# SLAVE this oned is a slave zone +# ZONE_ID: The zone ID as returned by onezone command +# SERVER_ID: ID identifying this server in the zone as returned by the +# onezone server-add command. This ID controls the HA configuration of +# OpenNebula: +# -1 (default) OpenNebula will operate in "solo" mode no HA +# <id> Operate in HA (leader election and state replication) +# MASTER_ONED: The xml-rpc endpoint of the master oned, e.g. +# http://master.one.org:2633/RPC2 +# +# +# RAFT: Algorithm attributes +# LIMIT_PURGE: Number of logs that will be deleted on each purge. +# LOG_RETENTION: Number of DB log records kept, it determines the +# synchronization window across servers and extra storage space needed. +# LOG_PURGE_TIMEOUT: How often applied records are purged according the log +# retention value. (in seconds) +# ELECTION_TIMEOUT_MS: Timeout to start a election process if no heartbeat +# or log is received from leader. +# BROADCAST_TIMEOUT_MS: How often heartbeats are sent to followers. +# XMLRPC_TIMEOUT_MS: To timeout raft related API calls +# +# RAFT_LEADER_HOOK: Executed when a server transits from follower->leader +# The purpose of this hook is to configure the Virtual IP. +# COMMAND: raft/vip.sh is a fully working script, this should not be changed +# ARGUMENTS: <interface> and <ip_cidr> must be replaced. For example +# ARGUMENTS = "leader ens1 10.0.0.2/24" +# +# RAFT_FOLLOWER_HOOK: Executed when a server transits from leader->follower +# The purpose of this hook is to configure the Virtual IP. +# COMMAND: raft/vip.sh is a fully working script, this should not be changed +# ARGUMENTS: <interface> and <ip_cidr> must be replaced. For example +# ARGUMENTS = "follower ens1 10.0.0.2/24" +# +# NOTE: Timeout tunning depends on the latency of the servers (network and load) +# as well as the max downtime tolerated by the system. Timeouts needs to be +# greater than 10ms +# +#******************************************************************************* + +FEDERATION = [ + MODE = "STANDALONE", + ZONE_ID = 0, +%if %%activer_one_ha == 'oui' + SERVER_ID = %%one_ha_server_index, +%else + SERVER_ID = -1, +%end if + MASTER_ONED = "" +] + +RAFT = [ + LIMIT_PURGE = 100000, + LOG_RETENTION = 500000, + LOG_PURGE_TIMEOUT = 600, + ELECTION_TIMEOUT_MS = 2500, + BROADCAST_TIMEOUT_MS = 500, + XMLRPC_TIMEOUT_MS = 450 +] + +%if %%activer_one_ha == 'oui' +# Executed when a server transits from follower->leader +RAFT_LEADER_HOOK = [ + COMMAND = "raft/vip.sh", + ARGUMENTS = "leader %%nom_zone_eth0 %%one_vip/%%calc_classe(%%one_vip_mask)" +] + +# Executed when a server transits from leader->follower +RAFT_FOLLOWER_HOOK = [ + COMMAND = "raft/vip.sh", + ARGUMENTS = "follower %%nom_zone_eth0 %%one_vip/%%calc_classe(%%one_vip_mask)" +] +%end if + +#******************************************************************************* +# Default showback cost +#------------------------------------------------------------------------------- +# The following attributes define the default cost for Virtual Machines that +# don't have a CPU, MEMORY or DISK cost. This is used by the oneshowback +# calculate method. +#******************************************************************************* + +DEFAULT_COST = [ + CPU_COST = 0, + MEMORY_COST = 0, + DISK_COST = 0 +] + +#******************************************************************************* +# XML-RPC server configuration +#------------------------------------------------------------------------------- +# These are configuration parameters for oned's xmlrpc-c server +# +# MAX_CONN: Maximum number of simultaneous TCP connections the server +# will maintain +# +# MAX_CONN_BACKLOG: Maximum number of TCP connections the operating system +# will accept on the server's behalf without the server accepting them from +# the operating system +# +# KEEPALIVE_TIMEOUT: Maximum time in seconds that the server allows a +# connection to be open between RPCs +# +# KEEPALIVE_MAX_CONN: Maximum number of RPCs that the server will execute on +# a single connection +# +# TIMEOUT: Maximum time in seconds the server will wait for the client to +# do anything while processing an RPC. This timeout will be also used when +# proxy calls to the master in a federation. +# +# RPC_LOG: Create a separated log file for xml-rpc requests, in +# "/var/log/one/one_xmlrpc.log". +# +# MESSAGE_SIZE: Buffer size in bytes for XML-RPC responses. +# +# LOG_CALL_FORMAT: Format string to log XML-RPC calls. Interpreted strings: +# %i -- request id +# %m -- method name +# %u -- user id +# %U -- user name +# %l[number] -- param list and number of characters (optional) to print +# each parameter, default is 20. Example: %l300 +# %p -- user password +# %g -- group id +# %G -- group name +# %a -- auth token +# %% -- % +#******************************************************************************* + +#MAX_CONN = 15 +#MAX_CONN_BACKLOG = 15 +#KEEPALIVE_TIMEOUT = 15 +#KEEPALIVE_MAX_CONN = 30 +#TIMEOUT = 15 +#RPC_LOG = NO +#MESSAGE_SIZE = 1073741824 +#LOG_CALL_FORMAT = "Req:%i UID:%u %m invoked %l20" + +#******************************************************************************* +# Physical Networks configuration +#******************************************************************************* +# NETWORK_SIZE: Here you can define the default size for the virtual networks +# +# MAC_PREFIX: Default MAC prefix to be used to create the auto-generated MAC +# addresses is defined here (this can be overwritten by the Virtual Network +# template) +# +# VLAN_IDS: VLAN ID pool for the automatic VLAN_ID assignment. This pool +# is for 802.1Q networks (Open vSwitch and 802.1Q drivers). The driver +# will try first to allocate VLAN_IDS[START] + VNET_ID +# start: First VLAN_ID to use +# reserved: Comma separated list of VLAN_IDs or ranges. Two numbers +# separated by a colon indicate a range. +# +# VXLAN_IDS: Automatic VXLAN Network ID (VNI) assignment. This is used +# for vxlan networks. +# start: First VNI to use +# NOTE: reserved is not supported by this pool +# +# PCI_PASSTHROUGH_BUS: Default bus to attach passthrough devices in the guest, +# in hex notation. It may be overwritten in the PCI device using the BUS +# attribute. +#******************************************************************************* + +NETWORK_SIZE = 254 + +MAC_PREFIX = "02:00" + +VLAN_IDS = [ + START = "2", + RESERVED = "0, 1, 4095" +] + +VXLAN_IDS = [ + START = "2" +] + +#PCI_PASSTHROUGH_BUS = "0x01" + +#******************************************************************************* +# DataStore Configuration +#******************************************************************************* +# DATASTORE_LOCATION: Path for Datastores. It IS the same for all the hosts +# and front-end. It defaults to /var/lib/one/datastores (in self-contained mode +# defaults to $ONE_LOCATION/var/datastores). Each datastore has its own +# directory (called BASE_PATH) in the form: $DATASTORE_LOCATION/<datastore_id> +# You can symlink this directory to any other path if needed. BASE_PATH is +# generated from this attribute each time oned is started. +# +# DATASTORE_CAPACITY_CHECK: Checks that there is enough capacity before +# creating a new image. Defaults to Yes +# +# DEFAULT_IMAGE_TYPE: This can take values +# OS Image file holding an operating system +# CDROM Image file holding a CDROM +# DATABLOCK Image file holding a datablock, created as an empty block +# +# DEFAULT_DEVICE_PREFIX: This can be set to +# hd IDE prefix +# sd SCSI +# vd KVM virtual disk +# +# DEFAULT_CDROM_DEVICE_PREFIX: Same as above but for CDROM devices. +# +# DEFAULT_IMAGE_PERSISTENT: Control the default value for the PERSISTENT +# attribute on image creation (oneimage clone, onevm disk-saveas). If blank +# images will inherit the persistent attribute from the base image. +# +# DEFAULT_IMAGE_PERSISTENT_NEW: Control the default value for the PERSISTENT +# attribute on image creation (oneimage create). By default images are no +# persistent if not set. +#******************************************************************************* + +#DATASTORE_LOCATION = /var/lib/one/datastores + +DATASTORE_CAPACITY_CHECK = "yes" + +DEFAULT_DEVICE_PREFIX = "vd" +DEFAULT_CDROM_DEVICE_PREFIX = "hd" + +DEFAULT_IMAGE_TYPE = "OS" +#DEFAULT_IMAGE_PERSISTENT = "" +#DEFAULT_IMAGE_PERSISTENT_NEW = "" + +#******************************************************************************* +# Information Driver Configuration +#******************************************************************************* +# You can add more information managers with different configurations but make +# sure it has different names. +# +# name : name for this information manager +# +# executable: path of the information driver executable, can be an +# absolute path or relative to $ONE_LOCATION/lib/mads (or +# /usr/lib/one/mads/ if OpenNebula was installed in /) +# +# arguments : for the driver executable, usually a probe configuration file, +# can be an absolute path or relative to $ONE_LOCATION/etc (or +# /etc/one/ if OpenNebula was installed in /) +#******************************************************************************* + +#------------------------------------------------------------------------------- +# Information Collector for KVM IM's. +#------------------------------------------------------------------------------- +# This driver CANNOT BE ASSIGNED TO A HOST, and needs to be used with KVM +# -h prints this help. +# -a Address to bind the collectd socket (default 0.0.0.0) +# -p UDP port to listen for monitor information (default 4124) +# -f Interval in seconds to flush collected information (default 5) +# -t Number of threads for the server (default 50) +# -i Time in seconds of the monitorization push cycle. This parameter must +# be smaller than MONITORING_INTERVAL, otherwise push monitorization will +# not be effective. +# -w Timeout in seconds to execute external commands (default unlimited) +#------------------------------------------------------------------------------- +IM_MAD = [ + NAME = "collectd", + EXECUTABLE = "collectd", + ARGUMENTS = "-p 4124 -f 5 -t 50 -i 20" ] +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# KVM UDP-push Information Driver Manager Configuration +# -r number of retries when monitoring a host +# -t number of threads, i.e. number of hosts monitored at the same time +# -w Timeout in seconds to execute external commands (default unlimited) +#------------------------------------------------------------------------------- +IM_MAD = [ + NAME = "kvm", + SUNSTONE_NAME = "KVM", + EXECUTABLE = "one_im_ssh", + ARGUMENTS = "-r 3 -t 15 -w 90 kvm" ] +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# KVM SSH-pull Information Driver Manager Configuration +# -r number of retries when monitoring a host +# -t number of threads, i.e. number of hosts monitored at the same time +# -w Timeout in seconds to execute external commands (default unlimited) +#------------------------------------------------------------------------------- +# IM_MAD = [ +# NAME = "kvm", +# SUNSTONE_NAME = "kvm-ssh", +# EXECUTABLE = "one_im_ssh", +# ARGUMENTS = "-r 3 -t 15 -w 90 kvm-probes" ] +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# vCenter Information Driver Manager Configuration +# -r number of retries when monitoring a host +# -t number of threads, i.e. number of hosts monitored at the same time +# -w Timeout in seconds to execute external commands (default unlimited) +#------------------------------------------------------------------------------- +IM_MAD = [ + NAME = "vcenter", + SUNSTONE_NAME = "VMWare vCenter", + EXECUTABLE = "one_im_sh", + ARGUMENTS = "-c -t 15 -r 0 vcenter" ] +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# EC2 Information Driver Manager Configuration +# -r number of retries when monitoring a host +# -t number of threads, i.e. number of hosts monitored at the same time +# -w Timeout in seconds to execute external commands (default unlimited) +#------------------------------------------------------------------------------- +#IM_MAD = [ +# NAME = "ec2", +# SUNSTONE_NAME = "Amazon EC2", +# EXECUTABLE = "one_im_sh", +# ARGUMENTS = "-c -t 1 -r 0 -w 600 ec2" ] +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# Azure Information Driver Manager Configuration +# -r number of retries when monitoring a host +# -t number of threads, i.e. number of hosts monitored at the same time +# -w Timeout in seconds to execute external commands (default unlimited) +#------------------------------------------------------------------------------- +#IM_MAD = [ +# NAME = "az", +# SUNSTONE_NAME = "Microsoft Azure", +# EXECUTABLE = "one_im_sh", +# ARGUMENTS = "-c -t 1 -r 0 az" ] +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# Hybrid OpenNebula Information Driver Manager Configuration +# -r number of retries when monitoring a host +# -t number of threads, i.e. number of hosts monitored at the same time +#------------------------------------------------------------------------------- +# IM_MAD = [ +# NAME = "one", +# SUNSTONE_NAME = "OpenNebula", +# EXECUTABLE = "one_im_sh", +# ARGUMENTS = "-c -t 1 -r 0 one" ] +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# Dummy Information Driver Manager Configuration +#------------------------------------------------------------------------------- +#IM_MAD = [ NAME="dummy", SUNSTONE_NAME="Testing", EXECUTABLE="one_im_dummy"] +#------------------------------------------------------------------------------- + +#******************************************************************************* +# Virtualization Driver Configuration +#******************************************************************************* +# You can add more virtualization managers with different configurations but +# make sure it has different names. +# +# name : name of the virtual machine manager driver +# +# executable: path of the virtualization driver executable, can be an +# absolute path or relative to $ONE_LOCATION/lib/mads (or +# /usr/lib/one/mads/ if OpenNebula was installed in /) +# +# arguments : for the driver executable +# +# default : default values and configuration parameters for the driver, can +# be an absolute path or relative to $ONE_LOCATION/etc (or +# /etc/one/ if OpenNebula was installed in /) +# +# type : driver type, supported drivers: xen, kvm, xml +# +# keep_snapshots: do not remove snapshots on power on/off cycles and live +# migrations if the hypervisor supports that. +# +# imported_vms_actions : comma-separated list of actions supported +# for imported vms. The available actions are: +# migrate +# live-migrate +# terminate +# terminate-hard +# undeploy +# undeploy-hard +# hold +# release +# stop +# suspend +# resume +# delete +# delete-recreate +# reboot +# reboot-hard +# resched +# unresched +# poweroff +# poweroff-hard +# disk-attach +# disk-detach +# nic-attach +# nic-detach +# snap-create +# snap-delete +#******************************************************************************* + +#------------------------------------------------------------------------------- +# KVM Virtualization Driver Manager Configuration +# -r number of retries when monitoring a host +# -t number of threads, i.e. number of hosts monitored at the same time +# -l <actions[=command_name]> actions executed locally, command can be +# overridden for each action. +# Valid actions: deploy, shutdown, cancel, save, restore, migrate, poll +# An example: "-l migrate=migrate_local,save" +# -p more than one action per host in parallel, needs support from hypervisor +# -s <shell> to execute remote commands, bash by default +# -w Timeout in seconds to execute external commands (default unlimited) +# +# Note: You can use type = "qemu" to use qemu emulated guests, e.g. if your +# CPU does not have virtualization extensions or use nested Qemu-KVM hosts +#------------------------------------------------------------------------------- +VM_MAD = [ + NAME = "kvm", + SUNSTONE_NAME = "KVM", + EXECUTABLE = "one_vmm_exec", + ARGUMENTS = "-t 15 -r 0 kvm", + DEFAULT = "vmm_exec/vmm_exec_kvm.conf", + TYPE = "kvm", + KEEP_SNAPSHOTS = "yes", + IMPORTED_VMS_ACTIONS = "terminate, terminate-hard, hold, release, suspend, + resume, delete, reboot, reboot-hard, resched, unresched, disk-attach, + disk-detach, nic-attach, nic-detach, snap-create, snap-delete" +] + +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# vCenter Virtualization Driver Manager Configuration +# -r number of retries when monitoring a host +# -t number of threads, i.e. number of hosts monitored at the same time +# -p more than one action per host in parallel, needs support from hypervisor +# -s <shell> to execute commands, bash by default +# -d default snapshot strategy. It can be either 'detach' or 'suspend'. It +# defaults to 'suspend'. +# -w Timeout in seconds to execute external commands (default unlimited) +#------------------------------------------------------------------------------- +VM_MAD = [ + NAME = "vcenter", + SUNSTONE_NAME = "VMWare vCenter", + EXECUTABLE = "one_vmm_sh", + ARGUMENTS = "-p -t 15 -r 0 vcenter -s sh", + DEFAULT = "vmm_exec/vmm_exec_vcenter.conf", + TYPE = "xml", + KEEP_SNAPSHOTS = "yes", + IMPORTED_VMS_ACTIONS = "terminate, terminate-hard, hold, release, suspend, + resume, delete, reboot, reboot-hard, resched, unresched, poweroff, + poweroff-hard, disk-attach, disk-detach, nic-attach, nic-detach, + snap-create, snap-delete, migrate, live-migrate" +] +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# EC2 Virtualization Driver Manager Configuration +# -r number of retries when monitoring a host +# -t number of threads, i.e. number of actions performed at the same time +# -w Timeout in seconds to execute external commands (default unlimited) +# -p more than one action per host in parallel, needs support from hypervisor +#------------------------------------------------------------------------------- +#VM_MAD = [ +# NAME = "ec2", +# SUNSTONE_NAME = "Amazon EC2", +# EXECUTABLE = "one_vmm_sh", +# ARGUMENTS = "-t 15 -r 0 -w 600 -p ec2", +# TYPE = "xml", +# KEEP_SNAPSHOTS = "no", +# IMPORTED_VMS_ACTIONS = "terminate, terminate-hard, hold, release, suspend, +# resume, delete, reboot, reboot-hard, resched, unresched, poweroff, +# poweroff-hard, disk-attach, disk-detach, nic-attach, nic-detach, +# snap-create, snap-delete" +#] +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# Azure Virtualization Driver Manager Configuration +# -r number of retries when monitoring a host +# -t number of threads, i.e. number of actions performed at the same time +# -w Timeout in seconds to execute external commands (default unlimited) +#------------------------------------------------------------------------------- +#VM_MAD = [ +# NAME = "az", +# SUNSTONE_NAME = "Microsoft Azure", +# EXECUTABLE = "one_vmm_sh", +# ARGUMENTS = "-t 15 -r 0 az", +# TYPE = "xml", +# KEEP_SNAPSHOTS = "no", +# IMPORTED_VMS_ACTIONS = "terminate, terminate-hard, hold, release, suspend, +# resume, delete, reboot, reboot-hard, resched, unresched, poweroff, +# poweroff-hard, disk-attach, disk-detach, nic-attach, nic-detach, +# snap-create, snap-delete" +#] +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# Hybrid OpenNebula Virtualization Driver Manager Configuration +# -r number of retries when monitoring a host +# -t number of threads, i.e. number of actions performed at the same time +#------------------------------------------------------------------------------- +# VM_MAD = [ +# NAME = "one", +# SUNSTONE_NAME = "OpenNebula", +# EXECUTABLE = "one_vmm_sh", +# ARGUMENTS = "-t 15 -r 0 one", +# TYPE = "xml", +# KEEP_SNAPSHOTS = "no", +# IMPORTED_VMS_ACTIONS = "terminate, terminate-hard, hold, release, suspend, +# resume, delete, reboot, reboot-hard, resched, unresched, poweroff, +# poweroff-hard" +# ] +#------------------------------------------------------------------------------- + + +#------------------------------------------------------------------------------- +# Dummy Virtualization Driver Configuration +#------------------------------------------------------------------------------- +#VM_MAD = [ NAME="dummy", SUNSTONE_NAME="Testing", EXECUTABLE="one_vmm_dummy", +# TYPE="xml" ] +#------------------------------------------------------------------------------- + +#******************************************************************************* +# Transfer Manager Driver Configuration +#******************************************************************************* +# You can add more transfer managers with different configurations but make +# sure it has different names. +# name : name for this transfer driver +# +# executable: path of the transfer driver executable, can be an +# absolute path or relative to $ONE_LOCATION/lib/mads (or +# /usr/lib/one/mads/ if OpenNebula was installed in /) +# arguments : +# -t: number of threads, i.e. number of transfers made at the same time +# -d: list of transfer drivers separated by commas, if not defined all the +# drivers available will be enabled +# -w: Timeout in seconds to execute external commands (default unlimited) +#******************************************************************************* + +TM_MAD = [ + EXECUTABLE = "one_tm", + ARGUMENTS = "-t 15 -d dummy,lvm,shared,fs_lvm,qcow2,ssh,ceph,dev,vcenter,iscsi_libvirt" +] + +#******************************************************************************* +# Datastore Driver Configuration +#******************************************************************************* +# Drivers to manage the datastores, specialized for the storage backend +# executable: path of the transfer driver executable, can be an +# absolute path or relative to $ONE_LOCATION/lib/mads (or +# /usr/lib/one/mads/ if OpenNebula was installed in /) +# +# arguments : for the driver executable +# -t number of threads, i.e. number of repo operations at the same time +# -d datastore mads separated by commas +# -s system datastore tm drivers, used to monitor shared system ds. +# -w Timeout in seconds to execute external commands (default unlimited) +#******************************************************************************* + +DATASTORE_MAD = [ + EXECUTABLE = "one_datastore", + ARGUMENTS = "-t 15 -d dummy,fs,lvm,ceph,dev,iscsi_libvirt,vcenter -s shared,ssh,ceph,fs_lvm,qcow2,vcenter" +] + +#******************************************************************************* +# Marketplace Driver Configuration +#******************************************************************************* +# Drivers to manage different marketplaces, specialized for the storage backend +# executable: path of the transfer driver executable, can be an +# absolute path or relative to $ONE_LOCATION/lib/mads (or +# /usr/lib/one/mads/ if OpenNebula was installed in /) +# +# arguments : for the driver executable +# -t number of threads, i.e. number of repo operations at the same time +# -m marketplace mads separated by commas +# --proxy proxy address if required to access the internet +# -w Timeout in seconds to execute external commands (default unlimited) +#******************************************************************************* + +MARKET_MAD = [ + EXECUTABLE = "one_market", + ARGUMENTS = "-t 15 -m http,s3,one" +] + +#******************************************************************************* +# IPAM Driver Configuration +#******************************************************************************* +# Drivers to manage different IPAMs +# executable: path of the IPAM driver executable, can be an +# absolute path or relative to $ONE_LOCATION/lib/mads (or +# /usr/lib/one/mads/ if OpenNebula was installed in /) +# +# arguments : for the driver executable +# -t number of threads, i.e. number of operations at the same time +# -i IPAM mads separated by commas +#******************************************************************************* + +IPAM_MAD = [ + EXECUTABLE = "one_ipam", + ARGUMENTS = "-t 1 -i dummy" +] + +#******************************************************************************* +# Hook Manager Configuration +#******************************************************************************* +# The Driver (HM_MAD) +# ----------------------------------------------- +# +# Used to execute the Hooks: +# executable: path of the hook driver executable, can be an +# absolute path or relative to $ONE_LOCATION/lib/mads (or +# /usr/lib/one/mads/ if OpenNebula was installed in /) +# +# arguments : for the driver executable, can be an absolute path or relative +# to $ONE_LOCATION/etc (or /etc/one/ if OpenNebula was installed +# in /) +# +# Virtual Machine Hooks (VM_HOOK) +# ------------------------------- +# +# Defined by: +# name : for the hook, useful to track the hook (OPTIONAL) +# on : when the hook should be executed, +# - CREATE, when the VM is created (onevm create) +# - PROLOG, when the VM is in the prolog state +# - RUNNING, after the VM is successfully booted +# - UNKNOWN, when the VM is in the unknown state +# - SHUTDOWN, after the VM is shutdown +# - STOP, after the VM is stopped (including VM image transfers) +# - DONE, after the VM is deleted or shutdown +# - CUSTOM, user defined specific STATE and LCM_STATE combination +# of states to trigger the hook. +# command : path is relative to $ONE_LOCATION/var/remotes/hook +# (self-contained) or to /var/lib/one/remotes/hook (system-wide). +# That directory will be copied on the hosts under +# SCRIPTS_REMOTE_DIR. It can be an absolute path that must exist +# on the target host +# arguments : for the hook. You can access to VM information with $ +# - $ID, the ID of the virtual machine +# - $TEMPLATE, the VM template in xml and base64 encoded +# - $PREV_STATE, the previous STATE of the Virtual Machine +# - $PREV_LCM_STATE, the previous LCM STATE of the Virtual Machine +# remote : values, +# - YES, The hook is executed in the host where the VM was +# allocated +# - NO, The hook is executed in the OpenNebula server (default) +# +# Example Virtual Machine Hook +# ---------------------------- +# +# VM_HOOK = [ +# name = "advanced_hook", +# on = "CUSTOM", +# state = "ACTIVE", +# lcm_state = "BOOT_UNKNOWN", +# command = "log.rb", +# arguments = "$ID $PREV_STATE $PREV_LCM_STATE" ] +# +# Host Hooks (HOST_HOOK) +# ------------------------------- +# +# Defined by: +# name : for the hook, useful to track the hook (OPTIONAL) +# on : when the hook should be executed, +# - CREATE, when the Host is created (onehost create) +# - ERROR, when the Host enters the error state +# - DISABLE, when the Host is disabled +# command : path is relative to $ONE_LOCATION/var/remotes/hook +# (self-contained) or to /var/lib/one/remotes/hook (system-wide). +# That directory will be copied on the hosts under +# SCRIPTS_REMOTE_DIR. It can be an absolute path that must exist +# on the target host. +# arguments : for the hook. You can use the following Host information: +# - $ID, the ID of the host +# - $TEMPLATE, the Host template in xml and base64 encoded +# remote : values, +# - YES, The hook is executed in the host +# - NO, The hook is executed in the OpenNebula server (default) +# +# Virtual Network (VNET_HOOK) +# Virtual Router (VROUTER_HOOK) +# User (USER_HOOK) +# Group (GROUP_HOOK) +# Image (IMAGE_HOOK) +# ------------------------------- +# +# These hooks are executed when one of the referring entities are created or +# removed. Each hook is defined by: +# name : for the hook, useful to track the hook (OPTIONAL) +# on : when the hook should be executed, +# - CREATE, when the vnet is created +# - REMOVE, when the vnet is removed +# command : path is relative to $ONE_LOCATION/var/remotes/hook +# (self-contained) or to /var/lib/one/remotes/hook (system-wide). +# That directory will be copied on the hosts under +# SCRIPTS_REMOTE_DIR. It can be an absolute path that must exist +# on the target host. +# arguments : for the hook. You can use the following Host information: +# - $ID, the ID of the host +# - $TEMPLATE, the vnet template in xml and base64 encoded +# +# Please note: In a Federation, User and Group hooks can only be defined in +# the master OpenNebula. +#------------------------------------------------------------------------------- +# +VM_HOOK = [ + name = "open_ports", + on = "RUNNING", + command = "eole/graphicsfw", + arguments = "open $TEMPLATE", + remote = "YES" +] + +VM_HOOK = [ + name = "close_ports", + on = "DONE", + command = "eole/graphicsfw", + arguments = "close $TEMPLATE", + remote = "YES" +] + +VM_HOOK = [ + name = "close_ports", + on = "STOP", + command = "eole/graphicsfw", + arguments = "close $TEMPLATE", + remote = "YES" +] + +VM_HOOK = [ + name = "close_ports", + on = "SHUTDOWN", + command = "eole/graphicsfw", + arguments = "close $TEMPLATE", + remote = "YES" +] + +%if %%getVar('activer_hooks', 'non') == 'oui' +#******************************************************************************* +# Personal Hooks +#******************************************************************************* +# VM +#******************************************************************************* + %if %%hapy_vm_hooks == 'oui' + %for %%hook in %%hapy_vm_hook +VM_HOOK = [ + name = "%%hook", + on = "%%hook.hapy_vm_hook_on", + %if %%hook.hapy_vm_hook_on == "CUSTOM" + state = "%%hook.hapy_vm_hook_state", + lcm_state = "%%hook.hapy_vm_hook_lcm_state", + %end if + command = "%%hook.hapy_vm_hook_command", + arguments = "%%hook.hapy_vm_hook_arguments", + %if %%hook.hapy_vm_hook_remote == 'oui' + remote = "YES" + %else + remote = "NO" + %end if +] + %end for + %end if + +#******************************************************************************* +# USER +#******************************************************************************* + %if %%hapy_user_hooks == 'oui' + %for %%hook in %%hapy_user_hook +USER_HOOK = [ + name = "%%hook", + on = "%%hook.hapy_user_hook_on", + command = "%%hook.hapy_user_hook_command", + arguments = "%%hook.hapy_user_hook_arguments" +] + %end for + %end if +%end if + +HM_MAD = [ + EXECUTABLE = "one_hm" ] + +#VNET_HOOK = [ +# name = "vcenter_net_create", +# on = "CREATE", +# command = "vcenter/create_vcenter_net.rb", +# arguments = "$ID $TEMPLATE"] + +#VNET_HOOK = [ +# name = "vcenter_net_delete", +# on = "REMOVE", +# command = "vcenter/delete_vcenter_net.rb", +# arguments = "$ID $TEMPLATE"] + +#******************************************************************************* +# Fault Tolerance Hooks +#******************************************************************************* +# This hook is used to perform recovery actions when a host fails. +# Script to implement host failure tolerance +# One of the following modes must be chosen +# -m resched VMs to another host. (Only for images in shared storage!) +# -r recreate VMs running in the host. State will be lost. +# -d delete VMs running in the host +# +# Additional flags +# -f resubmit suspended and powered off VMs (only for recreate) +# -p <n> avoid resubmission if host comes back after n monitoring +# cycles. 0 to disable it. Default is 2. +# -u disables fencing. Fencing is enabled by default. Don't disable it +# unless you are very sure about what you're doing +#******************************************************************************* +# +#HOST_HOOK = [ +# NAME = "error", +# ON = "ERROR", +# COMMAND = "ft/host_error.rb", +# ARGUMENTS = "$ID -m -p 5", +# REMOTE = "no" ] +#------------------------------------------------------------------------------- + +%if %%getVar('activer_hooks', 'non') == 'oui' +#******************************************************************************* +# Personal Hooks +#******************************************************************************* +# VM +#******************************************************************************* + %if %%hapy_vm_hooks == 'oui' + %for %%hook in %%hapy_vm_hook +VM_HOOK = [ + name = "%%hook", + on = "%%hook.hapy_vm_hook_on", + %if %%hook.hapy_vm_hook_on == "CUSTOM" + state = "%%hook.hapy_vm_hook_state", + lcm_state = "%%hook.hapy_vm_hook_lcm_state", + %end if + command = "%%hook.hapy_vm_hook_command", + arguments = "%%hook.hapy_vm_hook_arguments", + %if %%hook.hapy_vm_hook_remote == 'oui' + remote = "YES" + %else + remote = "NO" + %end if +] + %end for + %end if +#******************************************************************************* +# USER +#******************************************************************************* + %if %%hapy_user_hooks == 'oui' + %for %%hook in %%hapy_user_hook +USER_HOOK = [ + name = "%%hook", + on = "%%hook.hapy_user_hook_on", + command = "%%hook.hapy_user_hook_command", + arguments = "%%hook.hapy_user_hook_arguments" +] + %end for + %end if +%end if + + +#******************************************************************************* +# Auth Manager Configuration +#******************************************************************************* +# AUTH_MAD: The Driver that will be used to authenticate (authn) and +# authorize (authz) OpenNebula requests. If defined OpenNebula will use the +# built-in auth policies. +# +# executable: path of the auth driver executable, can be an +# absolute path or relative to $ONE_LOCATION/lib/mads (or +# /usr/lib/one/mads/ if OpenNebula was installed in /) +# +# authn : list of authentication modules separated by commas, if not +# defined all the modules available will be enabled +# authz : list of authentication modules separated by commas +# +# DEFAULT_AUTH: The default authentication driver to use when OpenNebula does +# not know the user and needs to authenticate it externally. If you want to +# use "default" (not recommended, but supported for backwards compatibility +# reasons) make sure you create a symlink pointing to the actual authentication +# driver in /var/lib/one/remotes/auth, and add "default" to the 'auth' +# parameter in the 'AUTH_MAD' section. +# +# SESSION_EXPIRATION_TIME: Time in seconds to keep an authenticated token as +# valid. During this time, the driver is not used. Use 0 to disable session +# caching +# +# ENABLE_OTHER_PERMISSIONS: Whether or not users can set the permissions for +# 'other', so publishing or sharing resources with others. Users in the oneadmin +# group will still be able to change these permissions. Values: YES or NO. +# +# DEFAULT_UMASK: Similar to Unix umask, sets the default resources permissions. +# Its format must be 3 octal digits. For example a umask of 137 will set +# the new object's permissions to 640 "um- u-- ---" +#******************************************************************************* + +AUTH_MAD = [ + EXECUTABLE = "one_auth_mad", + AUTHN = "ssh,x509,ldap,server_cipher,server_x509" +] + +%if %%getVar('sunstone_auth_modes','') == 'ldap' +DEFAULT_AUTH = "ldap" +%end if + +SESSION_EXPIRATION_TIME = 900 + +#ENABLE_OTHER_PERMISSIONS = "YES" + +DEFAULT_UMASK = 177 + +#******************************************************************************* +# OneGate +# ONEGATE_ENDPOINT: The URL for the onegate server (the Gate to OpenNebula for +# VMs). The onegate server is started using a separate command. The endpoint +# MUST be consistent with the values in onegate-server.conf +#******************************************************************************* + +#ONEGATE_ENDPOINT = "http://frontend:5030" + +#******************************************************************************* +# VM Operations Permissions +#****************************************************************************** +# The following parameters define the operations associated to the ADMIN, +# MANAGE and USE permissions. Note that some VM operations require additional +# permissions on other objects. Also some operations refers to a class of +# actions: +# - disk-snapshot, includes create, delete and revert actions +# - disk-attach, includes attach and detach actions +# - nic-attach, includes attach and detach actions +# - snapshot, includes create, delete and revert actions +# - resched, includes resched and unresched actions +#****************************************************************************** + +VM_ADMIN_OPERATIONS = "migrate, delete, recover, retry, deploy, resched" + +VM_MANAGE_OPERATIONS = "undeploy, hold, release, stop, suspend, resume, reboot, + poweroff, disk-attach, nic-attach, disk-snapshot, terminate, disk-resize, + snapshot, updateconf, rename, resize, update, disk-saveas" + +VM_USE_OPERATIONS = "" + +#******************************************************************************* +# Default Permissions for VDC ACL rules +#******************************************************************************* +# Default ACL rules created when resource is added to a VDC. The following +# attributes configures the permissions granted to the VDC group for each +# resource types: +# DEFAULT_VDC_HOST_ACL: permissions granted on hosts added to a VDC. +# DEFAULT_VDC_NET_ACL: permissions granted on vnets added to a VDC. +# DEFAULT_VDC_DATASTORE_ACL: permissions granted on datastores to a VDC. +# +# DEFAULT_VDC_CLUSTER_HOST_ACL: permissions granted to cluster hosts when a +# cluster is added to the VDC. +# DEFAULT_VDC_CLUSTER_NET_ACL: permissions granted to cluster vnets when a +# cluster is added to the VDC. +# DEFAULT_VDC_CLUSTER_DATASTORE_ACL: permissions granted to cluster datastores +# when a cluster is added to the VDC. +# +# When defining the permissions you can use "" or "-" to not add any rule to +# that specific resource. Also you can combine several permissions with "+", +# for exampl "MANAGE+USE". Valid permissions are USE, MANAGE or ADMIN. +# +# Example: +# DEFAULT_VDC_HOST_ACL = "MANAGE" +# Adds @<gid> HOST/#<hid> MANAGE #<zid> when a host is added to the VDC, +# eg. onevdc addhost <vdc> <zid> <hid> +# +# DEFAULT_VDC_VNET_ACL = "USE" +# Adds @<gid> NET/#<vnetid> USE #<zid> when a vnet is added to the VDC, +# eg. onevdc addvnet <vdc> <zid> <vnetid> +# +# DEFAULT_VDC_DATASTORE_ACL = "USE" +# Adds @<gid> DATASTORE/#<dsid> USE #<zid> when a vnet is added to the VDC, +# eg. onevdc adddatastore <vdc> <zid> <dsid> +# +# DEFAULT_VDC_CLUSTER_HOST_ACL = "MANAGE" +# DEFAULT_VDC_CLUSTER_NET_ACL = "USE" +# DEFAULT_VDC_CLUSTER_DATASTORE_ACL = "USE" +# Adds: +# @<gid> HOST/%<cid> MANAGE #<zid> +# @<gid> DATASTORE+NET/%<cid> USE #<zid> +# when a cluster is added to the VDC, e.g. onevdc addcluster <vdc> <zid> <cid> +#******************************************************************************* + +DEFAULT_VDC_HOST_ACL = "MANAGE" +DEFAULT_VDC_VNET_ACL = "USE" +DEFAULT_VDC_DATASTORE_ACL = "USE" + +DEFAULT_VDC_CLUSTER_HOST_ACL = "MANAGE" +DEFAULT_VDC_CLUSTER_NET_ACL = "USE" +DEFAULT_VDC_CLUSTER_DATASTORE_ACL = "USE" + +#******************************************************************************* +# Restricted Attributes Configuration +#******************************************************************************* +# The following attributes are restricted to users outside the oneadmin group +#******************************************************************************* + +VM_RESTRICTED_ATTR = "CONTEXT/FILES" +VM_RESTRICTED_ATTR = "NIC/MAC" +VM_RESTRICTED_ATTR = "NIC/VLAN_ID" +VM_RESTRICTED_ATTR = "NIC/BRIDGE" +VM_RESTRICTED_ATTR = "NIC/INBOUND_AVG_BW" +VM_RESTRICTED_ATTR = "NIC/INBOUND_PEAK_BW" +VM_RESTRICTED_ATTR = "NIC/INBOUND_PEAK_KB" +VM_RESTRICTED_ATTR = "NIC/OUTBOUND_AVG_BW" +VM_RESTRICTED_ATTR = "NIC/OUTBOUND_PEAK_BW" +VM_RESTRICTED_ATTR = "NIC/OUTBOUND_PEAK_KB" +VM_RESTRICTED_ATTR = "NIC/OPENNEBULA_MANAGED" +VM_RESTRICTED_ATTR = "NIC/VCENTER_INSTANCE_ID" +VM_RESTRICTED_ATTR = "NIC/VCENTER_NET_REF" +VM_RESTRICTED_ATTR = "NIC/VCENTER_PORTGROUP_TYPE" +VM_RESTRICTED_ATTR = "NIC_DEFAULT/MAC" +VM_RESTRICTED_ATTR = "NIC_DEFAULT/VLAN_ID" +VM_RESTRICTED_ATTR = "NIC_DEFAULT/BRIDGE" +VM_RESTRICTED_ATTR = "DISK/TOTAL_BYTES_SEC" +VM_RESTRICTED_ATTR = "DISK/TOTAL_BYTES_SEC_MAX_LENGTH" +VM_RESTRICTED_ATTR = "DISK/TOTAL_BYTES_SEC_MAX" +VM_RESTRICTED_ATTR = "DISK/READ_BYTES_SEC" +VM_RESTRICTED_ATTR = "DISK/READ_BYTES_SEC_MAX_LENGTH" +VM_RESTRICTED_ATTR = "DISK/READ_BYTES_SEC_MAX" +VM_RESTRICTED_ATTR = "DISK/WRITE_BYTES_SEC" +VM_RESTRICTED_ATTR = "DISK/WRITE_BYTES_SEC_MAX_LENGTH" +VM_RESTRICTED_ATTR = "DISK/WRITE_BYTES_SEC_MAX" +VM_RESTRICTED_ATTR = "DISK/TOTAL_IOPS_SEC" +VM_RESTRICTED_ATTR = "DISK/TOTAL_IOPS_SEC_MAX_LENGTH" +VM_RESTRICTED_ATTR = "DISK/TOTAL_IOPS_SEC_MAX" +VM_RESTRICTED_ATTR = "DISK/READ_IOPS_SEC" +VM_RESTRICTED_ATTR = "DISK/READ_IOPS_SEC_MAX_LENGTH" +VM_RESTRICTED_ATTR = "DISK/READ_IOPS_SEC_MAX" +VM_RESTRICTED_ATTR = "DISK/WRITE_IOPS_SEC" +VM_RESTRICTED_ATTR = "DISK/WRITE_IOPS_SEC_MAX_LENGTH" +VM_RESTRICTED_ATTR = "DISK/WRITE_IOPS_SEC_MAX" +VM_RESTRICTED_ATTR = "DISK/OPENNEBULA_MANAGED" +VM_RESTRICTED_ATTR = "DISK/VCENTER_DS_REF" +VM_RESTRICTED_ATTR = "DISK/VCENTER_INSTANCE_ID" +#VM_RESTRICTED_ATTR = "DISK/SIZE" +VM_RESTRICTED_ATTR = "DISK/ORIGINAL_SIZE" +VM_RESTRICTED_ATTR = "DISK/SIZE_PREV" +VM_RESTRICTED_ATTR = "CPU_COST" +VM_RESTRICTED_ATTR = "MEMORY_COST" +VM_RESTRICTED_ATTR = "DISK_COST" +VM_RESTRICTED_ATTR = "PCI" +VM_RESTRICTED_ATTR = "EMULATOR" +VM_RESTRICTED_ATTR = "RAW" +VM_RESTRICTED_ATTR = "USER_PRIORITY" +VM_RESTRICTED_ATTR = "USER_INPUTS/CPU" +VM_RESTRICTED_ATTR = "USER_INPUTS/MEMORY" +VM_RESTRICTED_ATTR = "USER_INPUTS/VCPU" +VM_RESTRICTED_ATTR = "VCENTER_VM_FOLDER" + +#VM_RESTRICTED_ATTR = "RANK" +#VM_RESTRICTED_ATTR = "SCHED_RANK" +#VM_RESTRICTED_ATTR = "REQUIREMENTS" +#VM_RESTRICTED_ATTR = "SCHED_REQUIREMENTS" + +IMAGE_RESTRICTED_ATTR = "SOURCE" +IMAGE_RESTRICTED_ATTR = "VCENTER_IMPORTED" + +#******************************************************************************* +# The following restricted attributes only apply to VNets that are a reservation. +# Normal VNets do not have restricted attributes. +#******************************************************************************* + +VNET_RESTRICTED_ATTR = "VN_MAD" +VNET_RESTRICTED_ATTR = "PHYDEV" +VNET_RESTRICTED_ATTR = "VLAN_ID" +VNET_RESTRICTED_ATTR = "BRIDGE" +VNET_RESTRICTED_ATTR = "CONF" +VNET_RESTRICTED_ATTR = "BRIDGE_CONF" +VNET_RESTRICTED_ATTR = "OVS_BRIDGE_CONF" +VNET_RESTRICTED_ATTR = "IP_LINK_CONF" + +VNET_RESTRICTED_ATTR = "AR/VN_MAD" +VNET_RESTRICTED_ATTR = "AR/PHYDEV" +VNET_RESTRICTED_ATTR = "AR/VLAN_ID" +VNET_RESTRICTED_ATTR = "AR/BRIDGE" + +#******************************************************************************* +# Inherited Attributes Configuration +#******************************************************************************* +# The following attributes will be copied from the resource template to the +# instantiated VMs. More than one attribute can be defined. +# +# INHERIT_IMAGE_ATTR: Attribute to be copied from the Image template +# to each VM/DISK. +# +# INHERIT_DATASTORE_ATTR: Attribute to be copied from the Datastore template +# to each VM/DISK. +# +# INHERIT_VNET_ATTR: Attribute to be copied from the Network template +# to each VM/NIC. +#******************************************************************************* + +#INHERIT_IMAGE_ATTR = "EXAMPLE" +#INHERIT_IMAGE_ATTR = "SECOND_EXAMPLE" +#INHERIT_DATASTORE_ATTR = "COLOR" +#INHERIT_VNET_ATTR = "BANDWIDTH_THROTTLING" + +INHERIT_DATASTORE_ATTR = "CEPH_HOST" +INHERIT_DATASTORE_ATTR = "CEPH_SECRET" +INHERIT_DATASTORE_ATTR = "CEPH_KEY" +INHERIT_DATASTORE_ATTR = "CEPH_USER" +INHERIT_DATASTORE_ATTR = "CEPH_CONF" +INHERIT_DATASTORE_ATTR = "POOL_NAME" + +INHERIT_DATASTORE_ATTR = "ISCSI_USER" +INHERIT_DATASTORE_ATTR = "ISCSI_USAGE" +INHERIT_DATASTORE_ATTR = "ISCSI_HOST" + +INHERIT_IMAGE_ATTR = "ISCSI_USER" +INHERIT_IMAGE_ATTR = "ISCSI_USAGE" +INHERIT_IMAGE_ATTR = "ISCSI_HOST" +INHERIT_IMAGE_ATTR = "ISCSI_IQN" + +INHERIT_DATASTORE_ATTR = "GLUSTER_HOST" +INHERIT_DATASTORE_ATTR = "GLUSTER_VOLUME" + +INHERIT_DATASTORE_ATTR = "DISK_TYPE" +INHERIT_DATASTORE_ATTR = "ALLOW_ORPHANS" + +INHERIT_DATASTORE_ATTR = "VCENTER_ADAPTER_TYPE" +INHERIT_DATASTORE_ATTR = "VCENTER_DISK_TYPE" +INHERIT_DATASTORE_ATTR = "VCENTER_DS_REF" +INHERIT_DATASTORE_ATTR = "VCENTER_DS_IMAGE_DIR" +INHERIT_DATASTORE_ATTR = "VCENTER_DS_VOLATILE_DIR" +INHERIT_DATASTORE_ATTR = "VCENTER_INSTANCE_ID" + +INHERIT_IMAGE_ATTR = "DISK_TYPE" +INHERIT_IMAGE_ATTR = "VCENTER_ADAPTER_TYPE" +INHERIT_IMAGE_ATTR = "VCENTER_DISK_TYPE" + +INHERIT_VNET_ATTR = "VLAN_TAGGED_ID" +INHERIT_VNET_ATTR = "FILTER_IP_SPOOFING" +INHERIT_VNET_ATTR = "FILTER_MAC_SPOOFING" +INHERIT_VNET_ATTR = "MTU" +INHERIT_VNET_ATTR = "INBOUND_AVG_BW" +INHERIT_VNET_ATTR = "INBOUND_PEAK_BW" +INHERIT_VNET_ATTR = "INBOUND_PEAK_KB" +INHERIT_VNET_ATTR = "OUTBOUND_AVG_BW" +INHERIT_VNET_ATTR = "OUTBOUND_PEAK_BW" +INHERIT_VNET_ATTR = "OUTBOUND_PEAK_KB" +INHERIT_VNET_ATTR = "CONF" +INHERIT_VNET_ATTR = "BRIDGE_CONF" +INHERIT_VNET_ATTR = "OVS_BRIDGE_CONF" +INHERIT_VNET_ATTR = "IP_LINK_CONF" + +INHERIT_VNET_ATTR = "VCENTER_NET_REF" +INHERIT_VNET_ATTR = "VCENTER_SWITCH_NAME" +INHERIT_VNET_ATTR = "VCENTER_SWITCH_NPORTS" +INHERIT_VNET_ATTR = "VCENTER_PORTGROUP_TYPE" +INHERIT_VNET_ATTR = "VCENTER_CCR_REF" +INHERIT_VNET_ATTR = "VCENTER_INSTANCE_ID" + +#******************************************************************************* +# Transfer Manager Driver Behavior Configuration +#******************************************************************************* +# The configuration for each driver is defined in TM_MAD_CONF. These +# values are used when creating a new datastore and should not be modified +# since they define the datastore behavior. +# name : name of the transfer driver, listed in the -d option of the +# TM_MAD section +# ln_target : determines how the persistent images will be cloned when +# a new VM is instantiated. +# NONE: The image will be linked and no more storage capacity will be used +# SELF: The image will be cloned in the Images datastore +# SYSTEM: The image will be cloned in the System datastore +# clone_target : determines how the non persistent images will be +# cloned when a new VM is instantiated. +# NONE: The image will be linked and no more storage capacity will be used +# SELF: The image will be cloned in the Images datastore +# SYSTEM: The image will be cloned in the System datastore +# shared : determines if the storage holding the system datastore is shared +# among the different hosts or not. Valid values: "yes" or "no" +# ds_migrate : The driver allows migrations across datastores. Valid values: +# "yes" or "no". Note: THIS ONLY APPLIES TO SYSTEM DS. +# allow_orphans: Snapshots can live without parents +#******************************************************************************* + +TM_MAD_CONF = [ + NAME = "dummy", LN_TARGET = "NONE", CLONE_TARGET = "SYSTEM", SHARED = "YES", + DS_MIGRATE = "YES" +] + +TM_MAD_CONF = [ + NAME = "lvm", LN_TARGET = "NONE", CLONE_TARGET = "SELF", SHARED = "YES" +] + +TM_MAD_CONF = [ + NAME = "shared", LN_TARGET = "NONE", CLONE_TARGET = "SYSTEM", SHARED = "YES", + DS_MIGRATE = "YES", TM_MAD_SYSTEM = "ssh", LN_TARGET_SSH = "SYSTEM", + CLONE_TARGET_SSH = "SYSTEM", DISK_TYPE_SSH = "FILE" +] + +TM_MAD_CONF = [ + NAME = "fs_lvm", LN_TARGET = "SYSTEM", CLONE_TARGET = "SYSTEM", SHARED="YES", + DRIVER = "raw" +] + +TM_MAD_CONF = [ + NAME = "qcow2", LN_TARGET = "NONE", CLONE_TARGET = "SYSTEM", SHARED = "YES", + DRIVER = "qcow2" +] + +TM_MAD_CONF = [ + NAME = "ssh", LN_TARGET = "SYSTEM", CLONE_TARGET = "SYSTEM", SHARED = "NO", + DS_MIGRATE = "YES" +] + +TM_MAD_CONF = [ + NAME = "ceph", LN_TARGET = "NONE", CLONE_TARGET = "SELF", SHARED = "YES", + DS_MIGRATE = "NO", DRIVER = "raw", ALLOW_ORPHANS="yes", TM_MAD_SYSTEM = "ssh", + LN_TARGET_SSH = "SYSTEM", CLONE_TARGET_SSH = "SYSTEM", DISK_TYPE_SSH = "FILE" +] + +TM_MAD_CONF = [ + NAME = "iscsi_libvirt", LN_TARGET = "NONE", CLONE_TARGET = "SELF", SHARED = "YES", + DS_MIGRATE = "NO" +] + +TM_MAD_CONF = [ + NAME = "dev", LN_TARGET = "NONE", CLONE_TARGET = "NONE", SHARED = "YES" +] + +TM_MAD_CONF = [ + NAME = "vcenter", LN_TARGET = "NONE", CLONE_TARGET = "SYSTEM", SHARED = "YES" +] + +#******************************************************************************* +# Datastore Manager Driver Behavior Configuration +#******************************************************************************* +# The configuration for each driver is defined in DS_MAD_CONF. These +# values are used when creating a new datastore and should not be modified +# since they define the datastore behavior. +# name : name of the transfer driver, listed in the -d option of the +# DS_MAD section +# required_attrs : comma separated list of required attributes in the DS +# template +# persistent_only: specifies whether the datastore can only manage persistent +# images +#******************************************************************************* + +DS_MAD_CONF = [ + NAME = "ceph", + REQUIRED_ATTRS = "DISK_TYPE,BRIDGE_LIST", + PERSISTENT_ONLY = "NO", + MARKETPLACE_ACTIONS = "export" +] + +DS_MAD_CONF = [ + NAME = "dev", REQUIRED_ATTRS = "DISK_TYPE", PERSISTENT_ONLY = "YES" +] + +DS_MAD_CONF = [ + NAME = "iscsi_libvirt", REQUIRED_ATTRS = "DISK_TYPE,ISCSI_HOST", + PERSISTENT_ONLY = "YES" +] + +DS_MAD_CONF = [ + NAME = "dummy", REQUIRED_ATTRS = "", PERSISTENT_ONLY = "NO" +] + +DS_MAD_CONF = [ + NAME = "fs", REQUIRED_ATTRS = "", PERSISTENT_ONLY = "NO", + MARKETPLACE_ACTIONS = "export" +] + +DS_MAD_CONF = [ + NAME = "lvm", REQUIRED_ATTRS = "DISK_TYPE,BRIDGE_LIST", + PERSISTENT_ONLY = "NO" +] + +DS_MAD_CONF = [ + NAME = "vcenter", + REQUIRED_ATTRS = "VCENTER_INSTANCE_ID,VCENTER_DS_REF,VCENTER_DC_REF", + PERSISTENT_ONLY = "NO", + MARKETPLACE_ACTIONS = "export" +] + +#******************************************************************************* +# MarketPlace Driver Behavior Configuration +#******************************************************************************* +# The configuration for each driver is defined in MARKET_MAD_CONF. These +# values are used when creating a new marketplaces and should not be modified +# since they define the marketplace behavior. +# name : name of the market driver +# required_attrs : comma separated list of required attributes in the Market +# template +# app_actions: List of actions allowed for a MarketPlaceApp +# - monitor The apps of the marketplace will be monitored +# - create, the app in the marketplace +# - delete, the app from the marketplace +# public: set to yes for external marketplaces. A public marketplace can be +# removed even if it has registered apps. +#******************************************************************************* + +MARKET_MAD_CONF = [ + NAME = "one", + SUNSTONE_NAME = "OpenNebula.org Marketplace", + REQUIRED_ATTRS = "", + APP_ACTIONS = "monitor", + PUBLIC = "yes" +] + +MARKET_MAD_CONF = [ + NAME = "http", + SUNSTONE_NAME = "HTTP server", + REQUIRED_ATTRS = "BASE_URL,PUBLIC_DIR", + APP_ACTIONS = "create, delete, monitor" +] + +MARKET_MAD_CONF = [ + NAME = "s3", + SUNSTONE_NAME = "Amazon S3", + REQUIRED_ATTRS = "ACCESS_KEY_ID,SECRET_ACCESS_KEY,REGION,BUCKET", + APP_ACTIONS = "create, delete, monitor" +] + +#******************************************************************************* +# Authentication Driver Behavior Definition +#******************************************************************************* +# The configuration for each driver is defined in AUTH_MAD_CONF. These +# values must not be modified since they define the driver behavior. +# name : name of the auth driver +# password_change : allow the end users to change their own password. Oneadmin +# can still change other user's passwords +# driver_managed_groups : allow the driver to set the user's group even after +# user creation. In this case addgroup, delgroup and chgrp +# will be disabled, with the exception of chgrp to one of +# the groups in the list of secondary groups +# max_token_time : limit the maximum token validity, in seconds. Use -1 for +# unlimited maximum, 0 to disable login tokens +#******************************************************************************* + +AUTH_MAD_CONF = [ + NAME = "core", + PASSWORD_CHANGE = "YES", + DRIVER_MANAGED_GROUPS = "NO", + MAX_TOKEN_TIME = "-1" +] + +AUTH_MAD_CONF = [ + NAME = "public", + PASSWORD_CHANGE = "NO", + DRIVER_MANAGED_GROUPS = "NO", + MAX_TOKEN_TIME = "-1" +] + +AUTH_MAD_CONF = [ + NAME = "ssh", + PASSWORD_CHANGE = "YES", + DRIVER_MANAGED_GROUPS = "NO", + MAX_TOKEN_TIME = "-1" +] + +AUTH_MAD_CONF = [ + NAME = "x509", + PASSWORD_CHANGE = "NO", + DRIVER_MANAGED_GROUPS = "NO", + MAX_TOKEN_TIME = "-1" +] + +AUTH_MAD_CONF = [ + NAME = "ldap", + PASSWORD_CHANGE = "YES", + DRIVER_MANAGED_GROUPS = "NO", + MAX_TOKEN_TIME = "86400" +] + +AUTH_MAD_CONF = [ + NAME = "server_cipher", + PASSWORD_CHANGE = "NO", + DRIVER_MANAGED_GROUPS = "NO", + MAX_TOKEN_TIME = "-1" +] + +AUTH_MAD_CONF = [ + NAME = "server_x509", + PASSWORD_CHANGE = "NO", + DRIVER_MANAGED_GROUPS = "NO", + MAX_TOKEN_TIME = "-1" +] + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/templates/sched.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/templates/sched.conf new file mode 100644 index 0000000000000000000000000000000000000000..938e044d8e7a84fb70cf228dad18b4ff5f916d6e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/templates/sched.conf @@ -0,0 +1,110 @@ +#******************************************************************************* +# OpenNebula Configuration file +#******************************************************************************* + +#******************************************************************************* +# Daemon configuration attributes +#------------------------------------------------------------------------------- +# MESSAGE_SIZE: Buffer size in bytes for XML-RPC responses. +# +# XMLRPC_TIMEOUT: Seconds to timeout XML-RPC calls to oned +# +# ONE_XMLRPC: URL to connect to the OpenNebula daemon (oned) +# +# SCHED_INTERVAL: Seconds between two scheduling actions +# +# MAX_VM: Maximum number of Virtual Machines scheduled in each scheduling +# action. Use 0 to schedule all pending VMs each time. +# +# MAX_DISPATCH: Maximum number of Virtual Machines actually dispatched to a +# host in each scheduling action +# +# MAX_HOST: Maximum number of Virtual Machines dispatched to a given host in +# each scheduling action +# +# LIVE_RESCHEDS: Perform live (1) or cold migrations (0) when rescheduling a VM +# +# DEFAULT_SCHED: Definition of the default scheduling algorithm +# - policy: +# 0 = Packing. Heuristic that minimizes the number of hosts in use by +# packing the VMs in the hosts to reduce VM fragmentation +# 1 = Striping. Heuristic that tries to maximize resources available for +# the VMs by spreading the VMs in the hosts +# 2 = Load-aware. Heuristic that tries to maximize resources available for +# the VMs by using those nodes with less load +# 3 = Custom. +# - rank: Custom arithmetic expression to rank suitable hosts based in their +# attributes +# 4 = Fixed. Hosts will be ranked according to the PRIORITY attribute found +# in the Host or Cluster template. +# +# DEFAULT_DS_SCHED: Definition of the default storage scheduling algorithm +# - policy: +# 0 = Packing. Tries to optimize storage usage by selecting the DS with +# less free space +# 1 = Striping. Tries to optimize I/O by distributing the VMs across +# datastores. +# 2 = Custom. +# - rank: Custom arithmetic exprission to rank suitable datastores based on +# their attributes +# 3 = Fixed. Datastores will be ranked according to the PRIORITY attribute +# found in the Datastore template. +# +# +# LOG: Configuration for the logging system +# - system: defines the logging system: +# file to log in the sched.log file +# syslog to use the syslog facilities +# - debug_level: +# 0 = ERROR +# 1 = WARNING +# 2 = INFO +# 3 = DEBUG Includes general scheduling information (default) +# 4 = DDEBUG Includes time taken for each step +# 5 = DDDEBUG Includes detailed information about the scheduling +# decision, such as VM requirements, Host ranking for +# each VM, etc. This will impact the performance +# +# MEMORY_SYSTEM_DS_SCALE: This factor scales the VM usage of the system DS with +# the memory size. This factor can be use to make the scheduler consider the +# overhead of checkpoint files: +# system_ds_usage = system_ds_usage + memory_system_ds_scale * memory +# +#******************************************************************************* + +MESSAGE_SIZE = 1073741824 +TIMEOUT = 60 + +%if %%activer_one_ha == 'oui' +ONE_XMLRPC = "http://%%adresse_ip_eth0:2633/RPC2" +%else +ONE_XMLRPC = "http://localhost:2633/RPC2" +%end if + +SCHED_INTERVAL = 30 + +MAX_VM = 5000 +MAX_DISPATCH = 30 +MAX_HOST = 1 + +LIVE_RESCHEDS = 0 + +MEMORY_SYSTEM_DS_SCALE = 0 + +DEFAULT_SCHED = [ + policy = 1 +] + +DEFAULT_DS_SCHED = [ + policy = 1 +] + +#DEFAULT_SCHED = [ +# policy = 3, +# rank = "- (RUNNING_VMS * 50 + FREE_CPU)" +#] + +LOG = [ + system = "file", + debug_level = 3 +] diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/templates/vmm_exec_kvm.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/templates/vmm_exec_kvm.conf new file mode 100644 index 0000000000000000000000000000000000000000..e856119d5c4c201af014c83025ae8f7d22aad44f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-master/templates/vmm_exec_kvm.conf @@ -0,0 +1,56 @@ +# -------------------------------------------------------------------------- # +# Copyright 2002-2018, OpenNebula Project, OpenNebula Systems # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); you may # +# not use this file except in compliance with the License. You may obtain # +# a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +#--------------------------------------------------------------------------- # + +# Default configuration attributes for the KVM driver +# (all domains will use these values as defaults). These values can +# be overridden in each VM template. Valid atributes are: +# - emulator +# - os [kernel,initrd,boot,root,kernel_cmd,arch,machine] +# - vcpu +# - features [acpi, pae, apic, hyperv, localtime, guest_agent, virtio_scsi_queues] +# - disk [driver, cache, io, discard, total_bytes_sec, total_iops_sec, read_bytes_sec, write_bytes_sec, read_iops_sec, write_iops_sec] +# - nic [filter, model] +# - raw +# - hyperv_options: options used for FEATURES = [ HYPERV = yes ] +# NOTE: raw attribute value is appended to that on the VM template + +EMULATOR = /usr/bin/qemu-system-x86_64 + +#VCPU = 1 + +OS = [ arch = "x86_64" ] +FEATURES = [ PAE = "no", ACPI = "yes", APIC = "no", HYPERV = "no", GUEST_AGENT = "no", + VIRTIO_SCSI_QUEUES = "0" ] + +DISK = [ driver = "raw" , cache = "none"] + +#NIC = [ filter = "clean-traffic", model="virtio" ] +#RAW = "<devices><serial type=\"pty\"><source path=\"/dev/pts/5\"/><target port=\"0\"/></serial><console type=\"pty\" tty=\"/dev/pts/5\"><source path=\"/dev/pts/5\"/><target port=\"0\"/></console></devices>" + +HYPERV_OPTIONS="<relaxed state='on'/><vapic state='on'/><spinlocks state='on' retries='4096'/>" + +SPICE_OPTIONS=" + <video> + <model type='qxl' heads='1'/> + </video> + <sound model='ich6' /> + <channel type='spicevmc'> + <target type='virtio' name='com.redhat.spice.0'/> + </channel> + <redirdev bus='usb' type='spicevmc'/> + <redirdev bus='usb' type='spicevmc'/> + <redirdev bus='usb' type='spicevmc'/>" + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-node/dictionaries/00_eole-one-node_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-node/dictionaries/00_eole-one-node_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..1f1f166e0fa1a1c47f8cd9168b5f51d4548f23d6 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-node/dictionaries/00_eole-one-node_packages.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>opennebula-node</package> + <package>qemu-utils</package> + <package>ipxe-qemu</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-node/dictionaries/29_one-node.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-node/dictionaries/29_one-node.xml new file mode 100644 index 0000000000000000000000000000000000000000..3e8fabedd3c75eae0ad199bc5448ff0f11abf63f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-node/dictionaries/29_one-node.xml @@ -0,0 +1,66 @@ +<?xml version="1.0" encoding="utf-8"?> +<creole> + <files> + <!--<file filelist='onenode' name='/etc/onenode/qemu.conf' rm='True' mkdir='True'/--> + </files> + <variables> + <family name='general'> + <variable name='nombre_interfaces' redefine='True'/> + </family> + + <family name='Services'> + <variable name='activer_onenode' type='oui/non' description="Activer l'hyperviseur" mode='expert'> + <value>oui</value> + </variable> + <variable name='test_local_orchestrator' type='oui/non' description="L'orchestrateur est local"/> + </family> + <family name='Virtualisation' icon='cloud'> + <variable name='one_master' type='hostname_strict' description="Nom de l'orchestrateur" mandatory='True' mode='basic'/> + <variable name='one_master_ip' type='ip' description="Adresse IP de l'orchestrateur" mandatory='True' mode='basic'/> + </family> + <separators> + <separator name='one_master'>Configuration de l'hyperviseur</separator> + </separators> + </variables> + + <constraints> + <check name="valid_enum" target="nombre_interfaces"> + <param>['2','3','4','5']</param> + </check> + <condition name='disabled_if_in' source='activer_onenode'> + <param>non</param> + <target type='variable'>one_master</target> + <target type='variable'>one_master_ip</target> + </condition> + <condition name='frozen_if_in' source='test_local_orchestrator'> + <param>oui</param> + <target type='variable'>one_master</target> + <target type='variable'>one_master_ip</target> + </condition> + <auto name='calc_multi_condition' target='test_local_orchestrator'> + <param>oui</param> + <param type='eole' name='condition_1' optional='True'>activer_onesinglenode</param> + <param name='condition_2'>non</param> + <param name="operator">OR</param> + </auto> + <fill name='calc_multi_condition' target='one_master'> + <param>oui</param> + <param type='eole' name='condition_1'>test_local_orchestrator</param> + <param type='eole' name='match'>nom_machine</param> + <param name='mismatch'>None</param> + <param name='eval_mismatch'>True</param> + + </fill> + <fill name='calc_multi_condition' target='one_master_ip'> + <param>oui</param> + <param type='eole' name='condition_1'>test_local_orchestrator</param> + <param type='eole' name='match'>adresse_ip_eth0</param> + <param name='default_match'>None</param> + <param name='mismatch'>None</param> + <param name='eval_mismatch'>True</param> + + </fill> + </constraints> + <help> + </help> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-node/files/usr/share/eole/bastion/post_cache/one_graphics_ports b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-node/files/usr/share/eole/bastion/post_cache/one_graphics_ports new file mode 100644 index 0000000000000000000000000000000000000000..b0bc9e99ca5e725e02747df4ee292ccb244136b2 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-node/files/usr/share/eole/bastion/post_cache/one_graphics_ports @@ -0,0 +1,15 @@ +#!/bin/bash + +if [ ! -d /run/one ] +then +mkdir /run/one +chown oneadmin:root /run/one +fi + +if [[ -e /run/one/one_graphics_rules ]] +then + . /run/one/one_graphics_rules + exit ${?} +else + exit 0 +fi diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-node/postservices/30-one-node b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-node/postservices/30-one-node new file mode 100644 index 0000000000000000000000000000000000000000..ae8232c57920196d22300079f703e85a40d22300 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-node/postservices/30-one-node @@ -0,0 +1,9 @@ +#!/bin/sh + +if virsh net-info default | grep -qs 'automat.*yes$' +then + virsh net-destroy default > /dev/null 2>&1 + virsh net-autostart --disable default > /dev/null 2>&1 +fi + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-node/posttemplates/30-eole-one-node b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-node/posttemplates/30-eole-one-node new file mode 100644 index 0000000000000000000000000000000000000000..18d318254e01d1f35e9bcb3f6c9168ebfff6f723 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-node/posttemplates/30-eole-one-node @@ -0,0 +1,29 @@ +#!/bin/bash + +ONE_USER=$(CreoleGet 'virt_user') +ONE_GROUP=$(CreoleGet 'virt_group') +[[ -z ${ONE_USER} ]] && ONE_USER='oneadmin' + +HOME_DIR=$(eval echo ~${ONE_USER}) +SSH_DIR="${HOME_DIR}/.ssh" +AUTHORIZED_KEYS="${SSH_DIR}/authorized_keys" + +if [[ $(CreoleGet activer_onesinglenode 2>&1) == "oui" ]] +then + if [[ -f ${AUTHORIZED_KEYS} ]] + then + for key in $(ls ${SSH_DIR}/*.pub) + do + grep "$(cat ${key})" ${AUTHORIZED_KEYS} 2>&1 >> /dev/null + if [[ $? -ne 0 ]] + then + echo "Adding SSH Key" + cat ${key} >> ${AUTHORIZED_KEYS} + fi + done + fi +fi + + +# Pour ne pas avoir d'erreur au reconfigure +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-node/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-node/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..9f6fad97ebe580a58286c7b9e074d81ffe383d1e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-one-node/service.yml @@ -0,0 +1,34 @@ +format: '0.1' +name: eole-one-node +version: |- + 2.6.1-2 +description: |- + Dictionnaires et templates pour configurer un noeud OpenNebula + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: + - eole-ovs + - eole-libvirt +packages: + - opennebula-node + - qemu-utils + - ipxe-qemu +dictionaries: + - 29_one-node.xml +extra_dictionaries: {} +templates: [] +creole_funcs: [] +preservices: [] +postservices: + - 30-one-node +pretemplates: [] +posttemplates: + - 30-eole-one-node +files: + /usr/share/eole/bastion/post_cache/one_graphics_ports: + owner: root + group: root + mode: '0755' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-open-iscsi/dictionaries/00_eole-open-iscsi_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-open-iscsi/dictionaries/00_eole-open-iscsi_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..3700844cbe8c83dedf8ab090ebd00e8cc526084b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-open-iscsi/dictionaries/00_eole-open-iscsi_packages.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>open-iscsi</package> + <package>multipath-tools</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-open-iscsi/dictionaries/02_iscsi.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-open-iscsi/dictionaries/02_iscsi.xml new file mode 100644 index 0000000000000000000000000000000000000000..3bc9a8970baa8290e23c02c9b6b5ccc85eb95bda --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-open-iscsi/dictionaries/02_iscsi.xml @@ -0,0 +1,47 @@ +<?xml version="1.0" encoding="utf-8"?> +<creole> + + <files> + <service servicelist='open-iscsi'>open-iscsi</service> + <service servicelist='multipath'>multipath-tools</service> + <file filelist='open-iscsi' name='/etc/iscsi/iscsid.conf' source='iscsid.conf' mkdir='True' mode='0644' rm='True'/> + <file filelist='multipath' name='/etc/multipath.conf' source='multipath.conf' mkdir='True' mode='0644' rm='True'/> + </files> + + <variables> + <family name='services'> + <variable name='activer_openiscsi' type='oui/non' description="Activer open-iscsi"> + <value>non</value> + </variable> + </family> + <family name='open-iscsi' icon='suitcase'> + <variable name='montage_auto' type='oui/non' description="Activation du montage automatique des ressources"> + <value>non</value> + </variable> + <variable name='activer_multipath' type='oui/non' description="Activation du multipath pour gérer des accès multiples à des ressources"> + <value>non</value> + </variable> + </family> + <separators/> + </variables> + + <constraints> + <condition name='disabled_if_in' source='activer_openiscsi'> + <param>non</param> + <target type='family'>open-iscsi</target> + <target type='servicelist'>open-iscsi</target> + <target type='filelist'>open-iscsi</target> + </condition> + <condition name='disabled_if_in' source='activer_multipath'> + <param>non</param> + <target type='servicelist'>multipath</target> + <target type='filelist'>multipath</target> + </condition> + </constraints> + + <help> + <family name='open-iscsi'>Configuration du stockage réseau</family> + <variable name='activer_openiscsi'>iSCSI (Internet Small Computer System Interface) est un protocole de stockage en réseau basé sur le protocole IP destiné à relier les installations de stockage de données</variable> + </help> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-open-iscsi/postservices/00-mount_iscsi b/seed/release/eole-2.7/2.7.1/applicationservice/eole-open-iscsi/postservices/00-mount_iscsi new file mode 100644 index 0000000000000000000000000000000000000000..f8a7f367d5d23c07cae7ecc5450f39f17efea28d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-open-iscsi/postservices/00-mount_iscsi @@ -0,0 +1,5 @@ +#!/bin/bash +activer_multipath=$(CreoleGet activer_multipath non) +if [ "$activer_multipath" = 'oui' ];then + mount -a -O _netdev >/dev/null 2>&1 +fi diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-open-iscsi/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-open-iscsi/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..d51513c9e29ec714238f51a2f107556b1e572478 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-open-iscsi/service.yml @@ -0,0 +1,29 @@ +format: '0.1' +name: eole-open-iscsi +version: |- + 2.6.2-1 +description: |- + Implémentation d'open-iscsi sur les modules EOLE + Dictionnaires, templates et scripts pour open-iscsi + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: [] +packages: + - open-iscsi + - multipath-tools +dictionaries: + - 02_iscsi.xml +extra_dictionaries: {} +templates: + - iscsid.conf + - multipath.conf +creole_funcs: [] +preservices: [] +postservices: + - 00-mount_iscsi +pretemplates: [] +posttemplates: [] +files: {} +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-open-iscsi/templates/iscsid.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-open-iscsi/templates/iscsid.conf new file mode 100644 index 0000000000000000000000000000000000000000..a8ed0f8533d15abcbe9bd07a4bcbaeb670de6148 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-open-iscsi/templates/iscsid.conf @@ -0,0 +1,312 @@ +# +# Open-iSCSI default configuration. +# Could be located at /etc/iscsi/iscsid.conf or ~/.iscsid.conf +# +# Note: To set any of these values for a specific node/session run +# the iscsiadm --mode node --op command for the value. See the README +# and man page for iscsiadm for details on the --op command. +# + +###################### +# iscsid daemon config +###################### +# If you want iscsid to start the first time a iscsi tool +# needs to access it, instead of starting it when the init +# scripts run, set the iscsid startup command here. This +# should normally only need to be done by distro package +# maintainers. +# +# Default for Fedora and RHEL. (uncomment to activate). +# iscsid.startup = /etc/rc.d/init.d/iscsid force-start +# +# Default for upstream open-iscsi scripts (uncomment to activate). +iscsid.startup = /usr/sbin/iscsid + + +############################# +# NIC/HBA and driver settings +############################# +# open-iscsi can create a session and bind it to a NIC/HBA. +# To set this up see the example iface config file. + +#***************** +# Startup settings +#***************** + +# To request that the iscsi initd scripts startup a session set to "automatic". +# node.startup = automatic +# +# To manually startup the session set to "manual". The default is manual. +%if %%montage_auto == 'oui' +node.startup = automatic +%else +node.startup = manual +%end if + +# For "automatic" startup nodes, setting this to "Yes" will try logins on each +# available iface until one succeeds, and then stop. The default "No" will try +# logins on all availble ifaces simultaneously. +node.leading_login = No + +# ************* +# CHAP Settings +# ************* + +# To enable CHAP authentication set node.session.auth.authmethod +# to CHAP. The default is None. +#node.session.auth.authmethod = CHAP + +# To set a CHAP username and password for initiator +# authentication by the target(s), uncomment the following lines: +#node.session.auth.username = username +#node.session.auth.password = password + +# To set a CHAP username and password for target(s) +# authentication by the initiator, uncomment the following lines: +#node.session.auth.username_in = username_in +#node.session.auth.password_in = password_in + +# To enable CHAP authentication for a discovery session to the target +# set discovery.sendtargets.auth.authmethod to CHAP. The default is None. +#discovery.sendtargets.auth.authmethod = CHAP + +# To set a discovery session CHAP username and password for the initiator +# authentication by the target(s), uncomment the following lines: +#discovery.sendtargets.auth.username = username +#discovery.sendtargets.auth.password = password + +# To set a discovery session CHAP username and password for target(s) +# authentication by the initiator, uncomment the following lines: +#discovery.sendtargets.auth.username_in = username_in +#discovery.sendtargets.auth.password_in = password_in + +# ******** +# Timeouts +# ******** +# +# See the iSCSI REAME's Advanced Configuration section for tips +# on setting timeouts when using multipath or doing root over iSCSI. +# +# To specify the length of time to wait for session re-establishment +# before failing SCSI commands back to the application when running +# the Linux SCSI Layer error handler, edit the line. +# The value is in seconds and the default is 120 seconds. +# Special values: +# - If the value is 0, IO will be failed immediately. +# - If the value is less than 0, IO will remain queued until the session +# is logged back in, or until the user runs the logout command. +node.session.timeo.replacement_timeout = 120 + +# To specify the time to wait for login to complete, edit the line. +# The value is in seconds and the default is 15 seconds. +node.conn[0].timeo.login_timeout = 15 + +# To specify the time to wait for logout to complete, edit the line. +# The value is in seconds and the default is 15 seconds. +node.conn[0].timeo.logout_timeout = 15 + +# Time interval to wait for on connection before sending a ping. +node.conn[0].timeo.noop_out_interval = 5 + +# To specify the time to wait for a Nop-out response before failing +# the connection, edit this line. Failing the connection will +# cause IO to be failed back to the SCSI layer. If using dm-multipath +# this will cause the IO to be failed to the multipath layer. +node.conn[0].timeo.noop_out_timeout = 5 + +# To specify the time to wait for abort response before +# failing the operation and trying a logical unit reset edit the line. +# The value is in seconds and the default is 15 seconds. +node.session.err_timeo.abort_timeout = 15 + +# To specify the time to wait for a logical unit response +# before failing the operation and trying session re-establishment +# edit the line. +# The value is in seconds and the default is 30 seconds. +node.session.err_timeo.lu_reset_timeout = 30 + +# To specify the time to wait for a target response +# before failing the operation and trying session re-establishment +# edit the line. +# The value is in seconds and the default is 30 seconds. +node.session.err_timeo.tgt_reset_timeout = 30 + + +#****** +# Retry +#****** + +# To specify the number of times iscsid should retry a login +# if the login attempt fails due to the node.conn[0].timeo.login_timeout +# expiring modify the following line. Note that if the login fails +# quickly (before node.conn[0].timeo.login_timeout fires) because the network +# layer or the target returns an error, iscsid may retry the login more than +# node.session.initial_login_retry_max times. +# +# This retry count along with node.conn[0].timeo.login_timeout +# determines the maximum amount of time iscsid will try to +# establish the initial login. node.session.initial_login_retry_max is +# multiplied by the node.conn[0].timeo.login_timeout to determine the +# maximum amount. +# +# The default node.session.initial_login_retry_max is 8 and +# node.conn[0].timeo.login_timeout is 15 so we have: +# +# node.conn[0].timeo.login_timeout * node.session.initial_login_retry_max = +# 120 seconds +# +# Valid values are any integer value. This only +# affects the initial login. Setting it to a high value can slow +# down the iscsi service startup. Setting it to a low value can +# cause a session to not get logged into, if there are distuptions +# during startup or if the network is not ready at that time. +node.session.initial_login_retry_max = 8 + +################################ +# session and device queue depth +################################ + +# To control how many commands the session will queue set +# node.session.cmds_max to an integer between 2 and 2048 that is also +# a power of 2. The default is 128. +node.session.cmds_max = 128 + +# To control the device's queue depth set node.session.queue_depth +# to a value between 1 and 1024. The default is 32. +node.session.queue_depth = 32 + +################################## +# MISC SYSTEM PERFORMANCE SETTINGS +################################## + +# For software iscsi (iscsi_tcp) and iser (ib_iser) each session +# has a thread used to transmit or queue data to the hardware. For +# cxgb3i you will get a thread per host. +# +# Setting the thread's priority to a lower value can lead to higher throughput +# and lower latencies. The lowest value is -20. Setting the priority to +# a higher value, can lead to reduced IO performance, but if you are seeing +# the iscsi or scsi threads dominate the use of the CPU then you may want +# to set this value higher. +# +# Note: For cxgb3i you must set all sessions to the same value, or the +# behavior is not defined. +# +# The default value is -20. The setting must be between -20 and 20. +node.session.xmit_thread_priority = -20 + + +#*************** +# iSCSI settings +#*************** + +# To enable R2T flow control (i.e., the initiator must wait for an R2T +# command before sending any data), uncomment the following line: +# +#node.session.iscsi.InitialR2T = Yes +# +# To disable R2T flow control (i.e., the initiator has an implied +# initial R2T of "FirstBurstLength" at offset 0), uncomment the following line: +# +# The defaults is No. +node.session.iscsi.InitialR2T = No + +# +# To disable immediate data (i.e., the initiator does not send +# unsolicited data with the iSCSI command PDU), uncomment the following line: +# +#node.session.iscsi.ImmediateData = No +# +# To enable immediate data (i.e., the initiator sends unsolicited data +# with the iSCSI command packet), uncomment the following line: +# +# The default is Yes +node.session.iscsi.ImmediateData = Yes + +# To specify the maximum number of unsolicited data bytes the initiator +# can send in an iSCSI PDU to a target, edit the following line. +# +# The value is the number of bytes in the range of 512 to (2^24-1) and +# the default is 262144 +node.session.iscsi.FirstBurstLength = 262144 + +# To specify the maximum SCSI payload that the initiator will negotiate +# with the target for, edit the following line. +# +# The value is the number of bytes in the range of 512 to (2^24-1) and +# the defauls it 16776192 +node.session.iscsi.MaxBurstLength = 16776192 + +# To specify the maximum number of data bytes the initiator can receive +# in an iSCSI PDU from a target, edit the following line. +# +# The value is the number of bytes in the range of 512 to (2^24-1) and +# the default is 262144 +node.conn[0].iscsi.MaxRecvDataSegmentLength = 262144 + +# To specify the maximum number of data bytes the initiator will send +# in an iSCSI PDU to the target, edit the following line. +# +# The value is the number of bytes in the range of 512 to (2^24-1). +# Zero is a special case. If set to zero, the initiator will use +# the target's MaxRecvDataSegmentLength for the MaxXmitDataSegmentLength. +# The default is 0. +node.conn[0].iscsi.MaxXmitDataSegmentLength = 0 + +# To specify the maximum number of data bytes the initiator can receive +# in an iSCSI PDU from a target during a discovery session, edit the +# following line. +# +# The value is the number of bytes in the range of 512 to (2^24-1) and +# the default is 32768 +# +discovery.sendtargets.iscsi.MaxRecvDataSegmentLength = 32768 + +# To allow the targets to control the setting of the digest checking, +# with the initiator requesting a preference of enabling the checking, uncomment# one or both of the following lines: +#node.conn[0].iscsi.HeaderDigest = CRC32C,None +#node.conn[0].iscsi.DataDigest = CRC32C,None +# +# To allow the targets to control the setting of the digest checking, +# with the initiator requesting a preference of disabling the checking, +# uncomment one or both of the following lines: +#node.conn[0].iscsi.HeaderDigest = None,CRC32C +#node.conn[0].iscsi.DataDigest = None,CRC32C +# +# To enable CRC32C digest checking for the header and/or data part of +# iSCSI PDUs, uncomment one or both of the following lines: +#node.conn[0].iscsi.HeaderDigest = CRC32C +#node.conn[0].iscsi.DataDigest = CRC32C +# +# To disable digest checking for the header and/or data part of +# iSCSI PDUs, uncomment one or both of the following lines: +#node.conn[0].iscsi.HeaderDigest = None +#node.conn[0].iscsi.DataDigest = None +# +# The default is to never use DataDigests or HeaderDigests. +# + +# For multipath configurations, you may want more than one session to be +# created on each iface record. If node.session.nr_sessions is greater +# than 1, performing a 'login' for that node will ensure that the +# appropriate number of sessions is created. +node.session.nr_sessions = 1 + +#************ +# Workarounds +#************ + +# Some targets like IET prefer after an initiator has sent a task +# management function like an ABORT TASK or LOGICAL UNIT RESET, that +# it does not respond to PDUs like R2Ts. To enable this behavior uncomment +# the following line (The default behavior is Yes): +node.session.iscsi.FastAbort = Yes + +# Some targets like Equalogic prefer that after an initiator has sent +# a task management function like an ABORT TASK or LOGICAL UNIT RESET, that +# it continue to respond to R2Ts. To enable this uncomment this line +# node.session.iscsi.FastAbort = No +%if %%activer_multipath == 'oui' +Multipath = portalgroup +%end if + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-open-iscsi/templates/multipath.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-open-iscsi/templates/multipath.conf new file mode 100644 index 0000000000000000000000000000000000000000..851001700f17eb608c95b57cbc15bfbfc45c845e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-open-iscsi/templates/multipath.conf @@ -0,0 +1,14 @@ +defaults { + polling_interval 10 + path_selector "round-robin 0" + path_grouping_policy multibus + failback immediate + no_path_retry fail + user_friendly_names yes +} +blacklist { + wwid 26353900f02796769 + devnode "^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*" + devnode "^hd[a-z]" + devnode "^dcssblk[0-9]*" +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ovs/dictionaries/00_eole-ovs_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ovs/dictionaries/00_eole-ovs_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..cbaeb8a1f41eb0f3aa7b75866cbb9334bfced33c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ovs/dictionaries/00_eole-ovs_packages.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>openvswitch-switch</package> + <package>python-pyeole</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ovs/dictionaries/28_openvswitch.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ovs/dictionaries/28_openvswitch.xml new file mode 100644 index 0000000000000000000000000000000000000000..e9b5e245ee243a80590fea0d82c54043d4de12fb --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ovs/dictionaries/28_openvswitch.xml @@ -0,0 +1,166 @@ +<?xml version="1.0" encoding="utf-8"?> +<creole> + <files> + <service>openvswitch-switch</service> + <!--<file filelist='openvswitch' name='' rm='True' mkdir='True'/>--> + <file name='/etc/systemd/network/interface_1.network' filelist='interface_1_manual' /> + <file name='/etc/systemd/network/interface_2.network' filelist='interface_2_manual' /> + <file name='/etc/systemd/network/interface_3.network' filelist='interface_3_manual' /> + <file name='/etc/systemd/network/interface_4.network' filelist='interface_4_manual' /> + </files> + <variables> + <family name='services'> + <variable name='activer_openvswitch' type='oui/non' description="Activer le commutateur virtuel Open vSwitch" /> + </family> + <family name='Interface-1'> + <variable name='eth1_method' redefine='True' mode='expert' hidden='False'> + <value>manuel</value> + </variable> + </family> + + <family name='Interface-2'> + <variable name='eth2_method' redefine='True' mode='expert' hidden='False'> + <value>manuel</value> + </variable> + </family> + + <family name='Interface-3'> + <variable name='eth3_method' redefine='True' mode='expert' hidden='False'> + <value>manuel</value> + </variable> + </family> + + <family name='Interface-4'> + <variable name='eth4_method' redefine='True' mode='expert' hidden='False'> + <value>manuel</value> + </variable> + </family> + + <family name='Commutateur virtuel' icon='cloud'> + <variable name='ovs_sw_name' type='string' description="Nom du commutateur virtuel utilisé par les réseaux virtuels" auto_freeze="True"> + <value>vswitch</value> + </variable> + <variable name='ovs_sw_zones' type='string' description="Nom du port du commutateur virtuel associé à une interface physique" multi="True"/> + <variable name='ovs_sw_zone_iface' type='string' description="Interface physique" mandatory="True"/> + <variable name='ovs_sw_tag_mode' mode='expert' type='string' description="Mode du VLAN virtuel"/> + <variable name='ovs_sw_vlan_tag' type='string' description="Identifiant du VLAN virtuel"/> + </family> + </variables> + + <constraints> + <!-- Interface1 --> + <check name="valid_enum" target="eth1_method"> + <param>['statique','dhcp','manuel']</param> + </check> + <condition name='disabled_if_in' source='eth1_method'> + <param>manuel</param> + <target type='variable'>adresse_ip_eth1</target> + <target type='variable'>adresse_netmask_eth1</target> + <target type='variable'>adresse_network_eth1</target> + <target type='variable'>adresse_broadcast_eth1</target> + <target type='variable'>ssh_eth1</target> + <target type='variable'>admin_eth1</target> + <target type='variable'>alias_eth1</target> + <target type='variable'>vlan_eth1</target> + <target type='variable'>frontend_ead_distant_eth1</target> + </condition> + + <condition name='disabled_if_not_in' source='eth1_method'> + <param>manuel</param> + <target type='filelist'>interface_1_manual</target> + </condition> + + <!-- Interface2 --> + <check name="valid_enum" target="eth2_method"> + <param>['statique','dhcp','manuel']</param> + </check> + <condition name='disabled_if_in' source='eth2_method'> + <param>manuel</param> + <target type='variable'>adresse_ip_eth2</target> + <target type='variable'>adresse_netmask_eth2</target> + <target type='variable'>adresse_network_eth2</target> + <target type='variable'>adresse_broadcast_eth2</target> + <target type='variable'>ssh_eth2</target> + <target type='variable'>admin_eth2</target> + <target type='variable'>alias_eth2</target> + <target type='variable'>vlan_eth2</target> + <target type='variable'>frontend_ead_distant_eth2</target> + </condition> + + <condition name='disabled_if_not_in' source='eth2_method'> + <param>manuel</param> + <target type='filelist'>interface_2_manual</target> + </condition> + + <!-- Interface3 --> + <check name="valid_enum" target="eth3_method"> + <param>['statique','dhcp','manuel']</param> + </check> + <condition name='disabled_if_in' source='eth3_method'> + <param>manuel</param> + <target type='variable'>adresse_ip_eth3</target> + <target type='variable'>adresse_netmask_eth3</target> + <target type='variable'>adresse_network_eth3</target> + <target type='variable'>adresse_broadcast_eth3</target> + <target type='variable'>ssh_eth3</target> + <target type='variable'>admin_eth3</target> + <target type='variable'>alias_eth3</target> + <target type='variable'>vlan_eth3</target> + <target type='variable'>frontend_ead_distant_eth3</target> + </condition> + + <condition name='disabled_if_not_in' source='eth3_method'> + <param>manuel</param> + <target type='filelist'>interface_3_manual</target> + </condition> + + <!-- Interface4 --> + <check name="valid_enum" target="eth4_method"> + <param>['statique','dhcp','manuel']</param> + </check> + <condition name='disabled_if_in' source='eth4_method'> + <param>manuel</param> + <target type='variable'>adresse_ip_eth4</target> + <target type='variable'>adresse_netmask_eth4</target> + <target type='variable'>adresse_network_eth4</target> + <target type='variable'>adresse_broadcast_eth4</target> + <target type='variable'>ssh_eth4</target> + <target type='variable'>admin_eth4</target> + <target type='variable'>alias_eth4</target> + <target type='variable'>vlan_eth4</target> + <target type='variable'>frontend_ead_distant_eth4</target> + </condition> + + <condition name='disabled_if_not_in' source='eth4_method'> + <param>manuel</param> + <target type='filelist'>interface_4_manual</target> + </condition> + + <!-- List of all physical interfaces --> + <check name='valid_enum' target='ovs_sw_zone_iface'> + <param>['eth1','eth2','eth3','eth4']</param> + </check> + + <condition name='disabled_if_in' source='activer_openvswitch'> + <param>non</param> + <target type='filelist'>openvswitch</target> + <target type='family'>Commutateur virtuel</target> + </condition> + + <check name='valid_enum' target='ovs_sw_zones'> + <param>['internet','admin','pedago','dmzpub','dmzpriv','wifi']</param> + <param name='checkval'>False</param> + </check> + <check name='valid_enum' target='ovs_sw_tag_mode'> + <param>['', 'access','native-tagged','native-untagged','trunk']</param> + </check> + <group master='ovs_sw_zones'> + <slave>ovs_sw_zone_iface</slave> + <slave>ovs_sw_vlan_tag</slave> + <slave>ovs_sw_tag_mode</slave> + </group> + </constraints> + <help> + <family name='Commutateur virtuel'>Configuration du commutateur virtuel Open vSwitch</family> + </help> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ovs/postservices/29-ovs-mng b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ovs/postservices/29-ovs-mng new file mode 100644 index 0000000000000000000000000000000000000000..b1baf3de9029d5e5b2023562a6495e54da046c9a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ovs/postservices/29-ovs-mng @@ -0,0 +1,274 @@ +#!/usr/bin/env python + +from pyeole import ihm +from pyeole import process +from creole.client import CreoleClient +from creole.eosfunc import get_net_devices + +import sys +import csv +import logging +import re + +LOG_FILE = '/var/log/openvswitch/eole-openvswitch.log' + +#= Configure Logger === +logger = logging.getLogger(__name__) +std_handler = logging.StreamHandler( sys.stdout ) +file_handler = logging.FileHandler( LOG_FILE ) + +logger.setLevel( logging.INFO ) +std_handler.setLevel( logging.INFO ) +file_handler.setLevel( logging.INFO ) + +formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') +std_formatter = logging.Formatter(' %(message)s') +std_handler.setFormatter( std_formatter ) +file_handler.setFormatter( formatter ) + +logger.addHandler( std_handler ) +logger.addHandler( file_handler ) +#= End Logger === + +class RunCmdError(Exception): + pass + +class ConfigError(Exception): + pass + +OVSVSCTL = 'ovs-vsctl' +OVSDB_NAME = 'Open_vSwitch' +CONF_FILE = '/etc/openvswitch/conf.db' +BCK_CONF_FILE = CONF_FILE + '.bck' + +def bck_conf(OVSDB_NAME): + """Save Open vSwitch database in json format + """ + cmd = ['ovsdb-client', 'dump', OVSDB_NAME, '--format=json'] + try: + res = process.system_out(cmd) + if res[0] == 0: + with open(BCK_CONF_FILE, 'w') as ovsdb_conf: + ovsdb_conf.write(res[1]) + else: + msg = u'Error running command [{0}]'.format(' '.join(cmd)) + raise RunCmdError(msg) + except Exception as err: + logger.error(err.message, exc_info=True) + + pass + +def ovs_sw_exists(name): + """ Check if a switch exists (search by name) + """ + logger.debug("Checking for switch '{0}'...".format(name)) + cmd = [OVSVSCTL, 'list-br'] + try: + res = process.system_out(cmd) + if res[0] == 0: + sws = res[1].split() + if name in sws: + return True + else: + msg = u'Error running command [{0}]'.format(' '.join(cmd)) + raise RunCmdError(msg) + except Exception as err: + logger.error(err.message, exc_info=True) + return False + +def ovs_port_exists(switch, name): + """ Check if a port exists in a switch + + :param switch: Switch name + :type switch: `str` + :param name: Port name + :type name: `str` + """ + logger.debug("Checking for port {0} in switch...".format(name, switch)) + cmd = [OVSVSCTL, 'list-ports', switch] + try: + res = process.system_out(cmd) + if res[0] == 0: + if name in res[1].split(): + return True + else: + msg = u'Error running command [{0}]'.format(' '.join(cmd)) + raise RunCmdError(msg) + except Exception as err: + logger.error(err.message, exc_info=True) + return False + +def create_switch(name): + """ Create a new switch + + :param name: virtual switch name + :type name: `str` + """ + if ovs_sw_exists(name): + logger.info("Virtual switch {0} already exist".format(name)) + else: + cmd = [OVSVSCTL, 'add-br', name] + try: + res = process.system_out(cmd) + if res[0] == 0: + logger.info("new switch {0} added".format(name)) + else: + msg = u'Error running command [{0}]'.format(' '.join(cmd)) + raise RunCmdError(msg) + except Exception as err: + logger.error(err.message, exc_info=True) + + +def ovs_port_conf_get(port_name): + """ Retreive port configuration + + :param name: Port name + :type name: `str` + """ + cmd = [OVSVSCTL,'-f', 'csv', 'find', 'Port'] + cmd.append(u'name={0}'.format(port_name)) + try: + res = process.system_out(cmd) + if res[0] == 0: + conf = res[1].split('\n') + data = list(csv.reader(conf)) + tag = data[1][data[0].index('tag')] + if tag == "[]": + tag = 0 + vlan_mode = data[1][data[0].index('vlan_mode')] + + return {'name': port_name, 'tag': tag, 'vlan_mode': vlan_mode} + else: + msg = u'Error running command [{0}]'.format(' '.join(cmd)) + raise RunCmdError(msg) + except Exception as err: + logger.error(err.message, exc_info=True) + + +def create_port(swname, portname, iface, vlan, vlanmode): + cmd = [OVSVSCTL,'--', '--may-exist'] + if iface: + cmd.extend(['add-port', swname, iface]) + cmd.append('name={0}'.format(portname)) + if vlanmode and vlan: + if vlanmode == "trunk": + if re.match("^[0-9,]*$", vlan): + cmd.append('trunk={0}'.format(vlan)) + cmd.append('vlan_mode=trunk') + else: + msg = u"With vlan mode 'trunk' " + msg += u"ovs_sw_vlan_tag must contain only digits and commas " + msg += u"([0-9] and ',') " + msg += u"\n|--> Please run gen_config and correct this value" + raise ConfigError(msg) + elif vlanmode == "native-untagged": + cmd.append('vlan_mode={0}'.format(vlanmode)) + else: + cmd.append('vlan_mode={0}'.format(vlanmode)) + cmd.append('tag={0}'.format(vlan)) + elif vlan : + cmd.append('tag={0}'.format(vlan)) + + else: + cmd.extend(['add-port', swname, portname]) + if vlan: + cmd.append('tag={0}'.format(vlan)) + if vlanmode: + cmd.append('vlan_mode={0}'.format(vlanmode)) + logger.debug(cmd) + try: + res = process.system_out(cmd) + if res[0] == 0: + logger.info("Port {0} created".format(portname)) + else: + msg = u'error running command [{0}]'.format(' '.join(cmd)) + raise RunCmdError(msg) + except Exception as err: + logger.error(err.message, exc_info=True) + +def clean_up(swname, iface=None, port=None): + """ Remove port by interface or by port name, To support updating port configuration we remove + the port with the interface, this way we can update all parameters + :param swname: the switch name + :type swname: `str` + :type iface: `str` + :param iface: interface name + :type port: `str` + :param port: port name + """ + cmd = [OVSVSCTL, '--', u'--if-exists'] + target = None + msg = "" + if iface: + cmd.append(u'--with-iface') + msg = "\tCleaning port for interface" + target = iface + elif port: + msg = "\tCleaning port" + target = port + + cmd = cmd + [u'del-port', swname, target] + + try: + if target: + res = process.system_out(cmd) + if res[0] == 0: + logger.info("{0} {1}".format(msg,target)) + else: + msg = u'error running command [{0}]'.format(' '.join(cmd)) + raise RunCmdError(msg) + except Exception as err: + logger.error(err.message, exc_info=True) + +def main(): + client = CreoleClient() + + if client.get_creole('activer_openvswitch'): + + swname = client.get_creole('ovs_sw_name') + zones = client.get_creole('ovs_sw_zones') + ifaces = client.get_creole('ovs_sw_zone_iface') + vlans = client.get_creole('ovs_sw_vlan_tag') + tagged = client.get_creole('ovs_sw_tag_mode') + + ihm.print_line(u'Open vSwitch configuration') + + bck_conf(OVSDB_NAME) + create_switch(swname) + + # Cleanning up all ports with interfaces + netcards = get_net_devices() + if client.get_creole('bonding_is_active') == 'oui': + for nzone in range(int(client.get_creole('nombre_interfaces'))): + name = client.get_creole(u'nom_zone_eth{0}'.format(nzone)) + if name not in netcards: + netcards.append(name) + + for card in netcards: + clean_up(swname, iface=card) + + cs_zones = {} + for cpt in range(len(zones)): + name = zones[cpt] + zn = { 'iface': client.get_creole(u'nom_zone_{0}'.format(ifaces[cpt])), + 'vlan' : vlans[cpt], + 'tag' : tagged[cpt]} + if name in cs_zones.keys(): + nm = name + str(cpt) + cs_zones[nm] = [zn] + else: + cs_zones[name] = [zn] + + for key in cs_zones.keys(): + for zn in cs_zones[key]: + try: + clean_up(swname, port=key) + create_port(swname, key, zn['iface'], zn['vlan'], zn['tag']) + except ConfigError as e: + print("ERROR : {0}".format(e)) + exit(3) + + else: + ihm.print_line(u'Open vSwitch disabled') + +main() diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ovs/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ovs/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..de1fa53fd154db7e72d850f080f7ba914e8c80cf --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ovs/service.yml @@ -0,0 +1,30 @@ +format: '0.1' +name: eole-ovs +version: |- + 2.7.0-1 +description: |- + Open vSwitch virtual switch for linux + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: [] +packages: + - openvswitch-switch + - python-pyeole +dictionaries: + - 28_openvswitch.xml +extra_dictionaries: {} +templates: + - interface_1.network + - interface_2.network + - interface_3.network + - interface_4.network +creole_funcs: [] +preservices: [] +postservices: + - 29-ovs-mng +pretemplates: [] +posttemplates: [] +files: {} +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ovs/templates/interface_1.network b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ovs/templates/interface_1.network new file mode 100644 index 0000000000000000000000000000000000000000..86fe685f34ebf2be07a6f3907a1dab5109a08971 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ovs/templates/interface_1.network @@ -0,0 +1,3 @@ +# Activate interface in manual mode +[Match] +Name=%%nom_zone_eth1 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ovs/templates/interface_2.network b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ovs/templates/interface_2.network new file mode 100644 index 0000000000000000000000000000000000000000..edbea180989e899cbb7b4be2fcbab531577f39a0 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ovs/templates/interface_2.network @@ -0,0 +1,3 @@ +# Activate interface in manual mode +[Match] +Name=%%nom_zone_eth2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ovs/templates/interface_3.network b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ovs/templates/interface_3.network new file mode 100644 index 0000000000000000000000000000000000000000..b6f55441e599ab65635d77d2006fe6df82715990 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ovs/templates/interface_3.network @@ -0,0 +1,3 @@ +# Activate interface in manual mode +[Match] +Name=%%nom_zone_eth3 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-ovs/templates/interface_4.network b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ovs/templates/interface_4.network new file mode 100644 index 0000000000000000000000000000000000000000..18d396609be13c1b9a5e2af6004c0d5b5347fdd2 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-ovs/templates/interface_4.network @@ -0,0 +1,3 @@ +# Activate interface in manual mode +[Match] +Name=%%nom_zone_eth4 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-pacemaker/dictionaries/00_eole-pacemaker_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-pacemaker/dictionaries/00_eole-pacemaker_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..2fdf950ca1eeb4a901cfc0497aedc752f4e7415b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-pacemaker/dictionaries/00_eole-pacemaker_packages.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>pacemaker</package> + <package>crmsh</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-pacemaker/dictionaries/02_haute_dispo.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-pacemaker/dictionaries/02_haute_dispo.xml new file mode 100644 index 0000000000000000000000000000000000000000..9f6c0299ef02b1e3815548b41d8f52d08911b4b4 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-pacemaker/dictionaries/02_haute_dispo.xml @@ -0,0 +1,233 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + <files> + <file filelist='h_dispo' name='/etc/logrotate.d/haute_dispo' source='haute_dispo.logrotate' rm='True'/> + <file filelist='h_dispo' name='/etc/corosync/corosync.conf'/> + <file name='/etc/default/corosync'/> + <file name='/etc/default/pacemaker'/> + <file filelist='h_dispo' name='/etc/rsyslog.d/eole-traps/haute-dispo.conf' source='rsyslog_traps_haute-dispo.conf' mkdir="True"/> + <service_access service='corosync'> + <port protocol='udp' port_type="SymLinkOption">corosync_mcastport</port> + </service_access> + <service_restriction service='corosync'> + <ip service_restrictionlist='h_dispo' interface='corosync_restricted_int' interface_type='SymLinkOption' netmask='0.0.0.0'>0.0.0.0</ip> + </service_restriction> + </files> + + <variables> + <family name='services'> + <variable name='activer_haute_dispo' type='string' description="Activer la haute disponibilité" > + <value>non</value> + </variable> + </family> + + <family name='haute-dispo' icon='bar-chart'> + <variable name='corosync_dial_if' type='string' description="Interface de dialogue inter nÅ“ud" mandatory='True' /> + <variable name='corosync_restricted_int' type='string' description="corosync_dial_if avec eth"/> + <variable name='corosync_mcastaddr' type='ip' description="Adresse multicast pour le dialogue inter nÅ“ud" mode='expert' mandatory='True'> + <value>226.94.1.1</value> + </variable> + <variable name='corosync_mcastport' type='string' description="Port UDP pour le dialogue inter nÅ“ud" mode='expert' mandatory='True' > + <value>5405</value> + </variable> + <variable name='nom_machine_maitre' type='string' description="Nom de machine du nÅ“ud maitre" mandatory='True' /> + <variable name='ip_machine_maitre' type='ip' description="Adresse IP du nÅ“ud maitre sur l'interface de dialogue inter nÅ“ud" mandatory='True' /> + <variable name='nom_machine_esclave' type='string' description="Nom de machine du nÅ“ud esclave" mandatory='True' /> + <variable name='ip_machine_esclave' type='ip' description="Adresse IP du nÅ“ud esclave sur l'interface de dialogue inter nÅ“ud" mandatory='True' /> + <variable name='activer_mail_ha' type='oui/non' description="Activer l'envoi d'un courrier électronique lors d'une bascule de nÅ“ud"> + <value>non</value> + </variable> + <variable name='mail_ha_resource_name' type='string' description="Nom de la ressource mail" hidden='True' mandatory='True'> + <value>mail_admin</value> + </variable> + <variable name='to_mail_ha' type='string' description="Destinataire du courrier électronique" mandatory='True' /> + <variable name='subject_mail_ha' type='string' description="Sujet du courrier électronique"> + <value>Haute dispo - bascule de serveur</value> + </variable> + <variable name='vip_resource_name' type='string' description="Nom de la ressource" multi='True' mandatory='True' /> + <variable name='vip_resource_if' type='string' description="Interface de l'adresse IP redondée (VIP)" mandatory='True' /> + <variable name='vip_resource_adresseip' type='ip' description="Adresse IP redondée (VIP)" mandatory='True' /> + <variable name='vip_resource_netmask' type='netmask' description="Masque de sous réseau de l'adresse IP redondée (VIP)" mandatory='True' /> + <variable name='vip_resource_gw' type='ip' description="Passerelle de l'adresse IP redondée (VIP)" hidden='True' /> + <variable name='vip_resource_location' type='string' description="NÅ“ud préféré pour cette ressource" mandatory='True' /> + <variable name='activer_service_resource' type='oui/non' description="Déclarer des ressources de type service"> + <value>non</value> + </variable> + <variable name='service_resource_name' type='string' description="Nom de la ressource" multi='True' mandatory='True' /> + <variable name='service_resource_script' type='string' description="Service à superviser" mandatory='True' /> + <variable name='service_resource_location' type='string' description="NÅ“ud préféré pour ce service" mandatory='True'> + <value>maitre</value> + </variable> + <variable name='service_resource_interval' type='number' description="Intervalle de vérification (en secondes)" mode='expert' mandatory='True'> + <value>10</value> + </variable> + <variable name='service_resource_timeout' type='number' description="Délai d'attente avant échec de la vérification (en secondes)" mode='expert' mandatory='True'> + <value>30</value> + </variable> + <variable name='service_resource_startdelay' type='number' description="Délai d'attente au lancement avant supervision (en secondes)" mode='expert' mandatory='True'> + <value>15</value> + </variable> + <variable name='pingd_resource_name' type='string' description="Nom de la ressource" /> + <variable name='pingd_resource_adresseip' type='ip' description="Adresse IP à tester (doit répondre au ping)" multi='True' /> + <variable name='synchro_fichiers' type='string' description="Fichier ou répertoire à synchroniser sur le nÅ“ud distant" multi='True' /> + </family> + + <separators> +<!-- <separator name='dyn_route'>Paramètres de routage</separator> --> + <separator name='corosync_dial_if'>Paramètrage de corosync</separator> + <separator name='vip_resource_name'>Ressources de type IP Virtuelle</separator> + <separator name='activer_service_resource'>Ressources de type Service</separator> + <separator name='pingd_resource_name'>Ressources de type Ping</separator> + <separator name='synchro_fichiers'>Synchronisation des fichiers de configuration sur le nÅ“ud distant</separator> + </separators> + </variables> + + <constraints> + <!-- **** Listes deroulantes **** --> + <check name="valid_enum" target='activer_haute_dispo'> + <param>['non','maitre','esclave']</param> + </check> + <check name="valid_enum" target="corosync_dial_if"> + <param>['0','1','2','3','4']</param> + </check> + <check name="valid_enum" target="vip_resource_if"> + <param>['0','1','2','3','4']</param> + </check> + <check name="valid_enum" target='vip_resource_location'> + <param>['maitre', 'esclave', 'LB']</param> + </check> + <check name="valid_enum" target='service_resource_location'> + <param>['maitre', 'esclave', 'LB']</param> + </check> + + <check name='valid_regexp' target='subject_mail_ha'> + <param>^[\x20-\x7E]+$</param> + <param name='err_msg'>Le sujet du courrier électronique ne doit comporter que des caractères ASCII.</param> + </check> + + <!-- *** Groupes de variables **** --> + <group master='vip_resource_name'> + <slave>vip_resource_if</slave> + <slave>vip_resource_adresseip</slave> + <slave>vip_resource_netmask</slave> + <slave>vip_resource_gw</slave> + <slave>vip_resource_location</slave> + </group> + + <group master='service_resource_name'> + <slave>service_resource_script</slave> + <slave>service_resource_location</slave> + <slave>service_resource_interval</slave> + <slave>service_resource_timeout</slave> + <slave>service_resource_startdelay</slave> + </group> + + <!-- **** Conditions **** --> + <condition name='disabled_if_in' source='activer_mail_ha'> + <param>non</param> + <target type='variable'>mail_ha_resource_name</target> + <target type='variable'>to_mail_ha</target> + <target type='variable'>subject_mail_ha</target> + </condition> + <condition name='disabled_if_in' source='activer_haute_dispo'> + <param>non</param> + <param>esclave</param> + <target type='variable'>nom_machine_esclave</target> + <target type='variable'>ip_machine_esclave</target> + <target type='variable'>activer_mail_ha</target> + <target type='variable'>vip_resource_name</target> + <target type='variable'>vip_resource_if</target> + <target type='variable'>vip_resource_adresseip</target> + <target type='variable'>vip_resource_netmask</target> + <target type='variable'>vip_resource_gw</target> + <target type='variable'>vip_resource_location</target> + <target type='variable'>activer_service_resource</target> + <target type='variable'>service_resource_name</target> + <target type='variable'>service_resource_script</target> + <target type='variable'>service_resource_location</target> + <target type='variable'>service_resource_interval</target> + <target type='variable'>service_resource_timeout</target> + <target type='variable'>service_resource_startdelay</target> + <target type='variable'>pingd_resource_name</target> + <target type='variable'>pingd_resource_adresseip</target> + </condition> + <condition name='disabled_if_in' source='activer_haute_dispo'> + <param>non</param> + <param>maitre</param> + <target type='variable'>nom_machine_maitre</target> + <target type='variable'>ip_machine_maitre</target> + </condition> + <condition name='disabled_if_in' source='activer_haute_dispo'> + <param>non</param> + <target type='filelist'>h_dispo</target> + <target type='service_restrictionlist'>h_dispo</target> + <target type='family'>haute-dispo</target> + </condition> + <condition name='disabled_if_in' source='activer_service_resource'> + <param>non</param> + <target type='variable'>service_resource_name</target> + <target type='variable'>service_resource_script</target> + <target type='variable'>service_resource_location</target> + <target type='variable'>service_resource_interval</target> + <target type='variable'>service_resource_timeout</target> + <target type='variable'>service_resource_startdelay</target> + </condition> + + <!-- **** Remplissage fill **** --> + <fill name='calc_val' target='to_mail_ha'> + <param type='eole' name='valeur'>system_mail_to</param> + </fill> + <fill name='calc_val' target='pingd_resource_name'> + <param>gw_pingd</param> + </fill> + <fill name='calc_val' target='pingd_resource_adresseip'> + <param type='eole' name='valeur'>adresse_ip_gw</param> + </fill> + <auto name='calc_if_in_network' target='vip_resource_gw'> + <param type='eole' name='ip_addr1'>adresse_ip_gw</param> + <param type='eole' name='netmask1'>adresse_netmask_eth0</param> + <param type='eole' name='ip_addr2'>vip_resource_adresseip</param> + <param type='eole' name='netmask2'>vip_resource_netmask</param> + </auto> + <auto name='concat' target='corosync_restricted_int'> + <param>eth</param> + <param type='eole'>corosync_dial_if</param> + </auto> + + </constraints> + + <help> + <variable name='activer_haute_dispo'>L'activation de la haute-disponibilité permet mettre en oeuvre un cluster de deux machines</variable> + <family name='haute-dispo'>Configuration de la haute-disponibilité et des ressources du cluster</family> + <variable name='corosync_dial_if'>Interface de dialogue entre les nÅ“uds du cluster. Préférer une connexion directe</variable> + <variable name='corosync_mcastaddr'>Adresse IP multicast pour le dialogue du cluster</variable> + <variable name='corosync_mcastport'>Port UDP pour le dialogue multicast du cluster</variable> + <variable name='nom_machine_maitre'>Nom de machine du nÅ“ud maître</variable> + <variable name='ip_machine_maitre'>Adresse IP du nÅ“ud maître sur l'interface de dialogue inter nÅ“ud</variable> + <variable name='nom_machine_esclave'>Nom de machine du nÅ“ud esclave</variable> + <variable name='ip_machine_esclave'>Adresse IP du nÅ“ud esclave sur l'interface de dialogue inter nÅ“ud</variable> + <variable name='activer_mail_ha'>Activer l'envoi d'un courrier électronique lors d'une bascule de nÅ“ud</variable> + <variable name='mail_ha_resource_name'>Nom de la ressource pacemaker pour l'envoi de mail lors d'évènements sur le cluster</variable> + <variable name='to_mail_ha'>Destinataire des mail envoyés lors d'évènements sur le cluster</variable> + <variable name='subject_mail_ha'>Sujet des mail envoyés lors d'évènements sur le cluster</variable> + <variable name='vip_resource_name'>Nom de la ressource pacemaker de type adresse IP virtuelle</variable> + <variable name='vip_resource_if'>Interface sur laquelle sera positionnée l'adresse IP virtuelle</variable> + <variable name='vip_resource_adresseip'>Adresse IP virtuelle de la ressource</variable> + <variable name='vip_resource_netmask'>Masque de sous réseau de l'adresse IP virtuelle</variable> + <variable name='vip_resource_location'>Préférence de nÅ“ud de la ressource : maitre, esclave ou Load Balancing</variable> + <variable name='activer_service_resource'>Déclarer des resources pacemaker de type service</variable> + <variable name='service_resource_name'>Nom de la ressource pacemaker de type service</variable> + <variable name='service_resource_script'>Nom du service à superviser (system V ou systemd).</variable> + <variable name='service_resource_location'>Préférence de nÅ“ud de la ressource : maitre, esclave ou Load Balancing</variable> + <variable name='service_resource_interval'>Intervalle de vérification de l'état du service en secondes</variable> + <variable name='service_resource_timeout'>Timeout au bout duquel le service sera considérée en erreur</variable> + <variable name='service_resource_startdelay'>Délai avant de contrôler l'état du service. Cela lui laisse le temps de démarrer.</variable> + <variable name='pingd_resource_name'>Nom de la ressource de type pingd</variable> + <variable name='pingd_resource_adresseip'>Adresse(s) IP à pinguer. En cas d'impossibilité, les ressources basculent sur l'autre nÅ“ud.</variable> + <variable name='synchro_fichiers'>Liste de fichiers et répertoires à synchroniser sur le nÅ“ud distant par le script synchro-nodes.sh</variable> + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-pacemaker/files/usr/share/eole/diagnose/150-ha b/seed/release/eole-2.7/2.7.1/applicationservice/eole-pacemaker/files/usr/share/eole/diagnose/150-ha new file mode 100644 index 0000000000000000000000000000000000000000..56f254c3c49bbf21894cc59aec8374c6c854fd7c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-pacemaker/files/usr/share/eole/diagnose/150-ha @@ -0,0 +1,150 @@ +#!/bin/bash + +. /usr/lib/eole/diagnose.sh + +# +# Parse the Cluster status +# using crm_mon +# +function _crm_mon_info_get() +{ + + crm_mon -1 -n 2>&1 | \ + awk -v len_pf=${len_pf} \ + 'BEGIN { + dateformat = "%s|%s/%s/%s|%s " + nodeformat = "%s|%s|%s " + resformat = "%s|%s|%s|%s " + } + { + if (/^Last updated:/) { + update_print = update_print sprintf(dateformat, "Update", $5, $4, $7, $6) + } + + if (/^Last change:/) { + update_print = update_print sprintf(dateformat, "Change", $5, $4, $7, $6) + } + + if (/^Node/) { + gsub(":$", "", $2) + currnode = $2 + if ($3 == "online") { + node_print = node_print sprintf(nodeformat, "Noeud", currnode, "OK") + } + else { + node_print = node_print sprintf(nodeformat, "Noeud", currnode, $3) + } + } + + if (/^\t/){ + if ($3 == "Started") { + status = "OK" + } + else { + status = $3 + } + rec_print = rec_print sprintf(resformat, "Ressource", $1, status, currnode) + } + } + END { + print node_print update_print rec_print + }' +} + +# +# Show the Nodes status with diagnose format +# +function _show_node_status() +{ + local node=$1 + local state=$2 + + printf ". %${len_pf}s %s => " "Noeud" "${node}" + if [[ "${state}" == "OK" ]] + then + EchoVert "OK" + else + EchoRouge "${state}" + fi +} + +# +# Show the update and change dates with diagnose format +# +function _show_dates() +{ + local subject=$1 + local date=$2 + local hour=$3 + + printf ". %${len_pf}s => %s %s\n" "${subject}" "${date}" "${hour}" +} + +# +# Show the resources with diagnose format +# +function _show_resource() +{ + local name=${1} + local state=${2} + local node=${3} + + printf ". %${len_pf}s %s => " "Ressource" "${name}" + + if [[ ${state} == "OK" ]] + then + EchoVert "${state} (${node})" + else + EchoRouge "${state} (${node})" + fi + +} + +# +# Print the Cluster status with diagnose formating +# +function _crm_mon_show() +{ + info=$(_crm_mon_info_get) + for elm in ${info} + do + IFS="|" read -a array <<< "${elm}" + if [[ ${array[0]} == "Noeud" ]] + then + _show_node_status ${array[1]} ${array[2]} + elif [[ ${array[0]} == "Update" ]] || [[ ${array[0]} == "Change" ]] + then + _show_dates ${array[0]} ${array[1]} ${array[2]} + elif [[ ${array[0]} == "Ressource" ]] + then + _show_resource ${array[1]} ${array[2]} ${array[3]} + fi + done +} + +function _check_corosync() +{ + + printf ". %${len_pf}s => " "Service Corosync" + + output=$(crm_mon -1 -n 2>&1) + if [[ ${?} -ne 0 ]] + then + EchoRouge "KO" + return 10 + else + EchoVert "OK" + return 0 + fi +} + +activer_haute_dispo=$(CreoleGet activer_haute_dispo 2>/dev/null) + +if [ "$activer_haute_dispo" = "maitre" ] || [ "$activer_haute_dispo" == "esclave" ]; then + EchoGras "*** Haute disponibilité" + _check_corosync + [[ ${?} -ne 0 ]] && exit 0 + _crm_mon_show + echo "" +fi +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-pacemaker/files/usr/share/eole/sbin/appliquer_hautedispo b/seed/release/eole-2.7/2.7.1/applicationservice/eole-pacemaker/files/usr/share/eole/sbin/appliquer_hautedispo new file mode 100644 index 0000000000000000000000000000000000000000..7fa410587dbe399f4cb69249717748068bcd5a28 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-pacemaker/files/usr/share/eole/sbin/appliquer_hautedispo @@ -0,0 +1,250 @@ +#!/bin/bash + +. /usr/lib/eole/diagnose.sh +. /usr/lib/eole/utils.sh + +function test_corosync() +{ + output=$(crm_mon -1 -n 2>&1) + return ${?} +} + +declare -a ARR_HA_VIP_NAMES=('') +declare -a ARR_HA_VIP_IPS=('') +declare -a ARR_HA_VIP_MSK=('') +declare -a ARR_HA_VIP_INT=('') +declare -a ARR_HA_SCE_NAMES=('') +declare -a ARR_HA_SCE_SCRIPTS=('') +declare -a ARR_HA_SCE_INTERVAL=('') +declare -a ARR_HA_SCE_TIMEOUT=('') +declare -a ARR_HA_SCE_STARTDELAY=('') +declare -a ARR_HA_PINGD_ADRESSEIP=('') + +CRM="/usr/sbin/crm" +CIBADMIN="/usr/sbin/cibadmin" +SCRIPT=$(mktemp) +CURRENT_SCRIPT="/etc/eole/crm_script.current" +APPLI_PERSO='/usr/share/eole/appliquer_hautedispo_perso' +RSC_LIST="/etc/ha.d/.rsc_list" +>$RSC_LIST + +touch ${SCRIPT} +chmod 600 ${SCRIPT} + +if [ "$(CreoleGet activer_haute_dispo)" != "maitre" ] +then + EchoRouge "Cette commande doit être lancée sur le maitre" + exit 0 + fi + +# Test if corosync is running +test_corosync +if [[ ${?} -ne 0 ]] +then + EchoRouge "Le démon Corosync ne fonctionne pas !" + exit 10 +fi + +> ${SCRIPT} +active_configuration=$(${CRM} configure show) + +# Disable Stonith and ignore quorum policy +echo "property stonith-enabled=\"false\" no-quorum-policy=\"ignore\"" >> ${SCRIPT} + +#IP's resources +ARR_HA_VIP_NAMES=($(echo $(CreoleGet vip_resource_name)|sed -e "s/\n/ /g")) +ARR_HA_VIP_INT=($(echo $(CreoleGet vip_resource_if)|sed -e "s/\n/ /g")) +ARR_HA_VIP_IPS=($(echo $(CreoleGet vip_resource_adresseip)|sed -e "s/\n/ /g")) +ARR_HA_VIP_MSK=($(echo $(CreoleGet vip_resource_netmask)|sed -e "s/\n/ /g")) +ARR_HA_VIP_GW=($(echo $(CreoleGet vip_resource_gw)|sed -e "s/\n/ /g")) +ARR_HA_VIP_LOCATIONS=($(echo $(CreoleGet vip_resource_location)|sed -e "s/\n/ /g")) +nb_vip=${#ARR_HA_VIP_NAMES[*]} + +#service's resources +ARR_HA_SCE_NAMES=($(echo $(CreoleGet service_resource_name '')|sed -e "s/\n/ /g")) +ARR_HA_SCE_SCRIPTS=($(echo $(CreoleGet service_resource_script '')|sed -e "s/\n/ /g")) +ARR_HA_SCE_LOCATIONS=($(echo $(CreoleGet service_resource_location '')|sed -e "s/\n/ /g")) +ARR_HA_SCE_INTERVAL=($(echo $(CreoleGet service_resource_interval '')|sed -e "s/\n/ /g")) +ARR_HA_SCE_TIMEOUT=($(echo $(CreoleGet service_resource_timeout '')|sed -e "s/\n/ /g")) +ARR_HA_SCE_STARTDELAY=($(echo $(CreoleGet service_resource_startdelay '')|sed -e "s/\n/ /g")) +nb_sce=${#ARR_HA_SCE_NAMES[*]} + +#ping's resources +ARR_HA_PINGD_ADRESSEIP=($(echo $(CreoleGet pingd_resource_adresseip)|sed -e "s/\n/ /g")) +nb_ping_hosts=${#ARR_HA_PINGD_ADRESSEIP[*]} +pingd_resource_name=$(CreoleGet pingd_resource_name) +nom_machine=$(CreoleGet nom_machine) +nom_machine_esclave=$(CreoleGet nom_machine_esclave) + +activer_mail_ha=$(CreoleGet activer_mail_ha) + +primitive_master="" +primitive_slave="" +primitive_LB="" +#add all VIPS in primitive +for ((i = 0; i < $nb_vip; i +=1)) +do + if [ "${ARR_HA_VIP_LOCATIONS[i]}" = 'maitre' ] + then + primitive_master="$primitive_master ${ARR_HA_VIP_NAMES[i]}" + elif [ "${ARR_HA_VIP_LOCATIONS[i]}" = 'esclave' ] + then + primitive_slave="$primitive_slave ${ARR_HA_VIP_NAMES[i]}" + elif [ "${ARR_HA_VIP_LOCATIONS[i]}" = 'LB' ] + then + primitive_LB="$primitive_LB ${ARR_HA_VIP_NAMES[i]}" + if [ "${ARR_HA_VIP_INT[$i]}" = "0" ] + then + primitive_LB="$primitive_LB VIP_src_addr" + fi + fi +done + +for ((i = 0; i < $nb_vip; i +=1)) +do + ETH_VARNAME="nom_zone_eth${ARR_HA_VIP_INT[$i]}" + NIC_NAME="$(CreoleGet $ETH_VARNAME)" + echo "primitive ${ARR_HA_VIP_NAMES[$i]} ocf:heartbeat:IPaddr2 params ip=\"${ARR_HA_VIP_IPS[$i]}\" cidr_netmask=\"${ARR_HA_VIP_MSK[$i]}\" nic=\"${NIC_NAME}\" op monitor interval=\"10s\" disabled=\"false\" meta target-role=\"started\"" >> ${SCRIPT} + +### FIXME la route n'est pas utilisable telle quelle +### Cela n'empêche pas le fonctionnement du VPN +### Supprimée pour traiter #16062 +# if [ ! "${ARR_HA_VIP_GW[$i]}" = "255.255.255.255" ] +# then +# VIP_SRC_NAME="VIP_src_addr" +# if [ "${ARR_HA_VIP_LOCATIONS[i]}" = 'maitre' ] +# then +# VIP_SRC_NAME=${VIP_SRC_NAME}"_master_22${i}" +# primitive_master="${primitive_master} ${VIP_SRC_NAME}" +# elif [ "${ARR_HA_VIP_LOCATIONS[i]}" = 'esclave' ] +# then +# VIP_SRC_NAME=${VIP_SRC_NAME}"_slave_22${i}" +# primitive_slave="${primitive_slave} ${VIP_SRC_NAME}" +# fi +# echo "primitive ${VIP_SRC_NAME} ocf:heartbeat:Route params destination=\"default\" gateway=\"${ARR_HA_VIP_GW[$i]}\" source=\"${ARR_HA_VIP_IPS[$i]}\" table=\"22${i}\" op monitor interval=\"10s\" disabled=\"false\" meta target-role=\"started\"" >> ${SCRIPT} +# fi +done + +#add all services in primitive +for ((i = 0; i < $nb_sce; i +=1)) +do + if [ ${ARR_HA_SCE_LOCATIONS[i]} = 'maitre' ] + then + primitive_master="$primitive_master ${ARR_HA_SCE_NAMES[i]}" + elif [ ${ARR_HA_SCE_LOCATIONS[i]} = 'esclave' ] + then + primitive_slave="$primitive_slave ${ARR_HA_SCE_NAMES[i]}" + elif [ ${ARR_HA_SCE_LOCATIONS[i]} = 'LB' ] + then + primitive_LB="$primitive_LB ${ARR_HA_SCE_NAMES[i]}" + fi + echo "sce_rsc ${ARR_HA_SCE_NAMES[i]} ${ARR_HA_SCE_SCRIPTS[i]} ${ARR_HA_SCE_LOCATIONS[i]}" >> $RSC_LIST +done + +if [ "${activer_mail_ha}" = "oui" ] +then + to_mail_ha=$(CreoleGet to_mail_ha) + subject_mail_ha=$(CreoleGet subject_mail_ha) + mail_ha_resource_name=$(CreoleGet mail_ha_resource_name) + primitive_master=$primitive_master" "$mail_ha_resource_name +fi + +for ((i = 0; i < $nb_sce; i +=1)) +do + timeout=${ARR_HA_SCE_TIMEOUT[$i]} + interval=${ARR_HA_SCE_INTERVAL[$i]} + startdelay=${ARR_HA_SCE_STARTDELAY[$i]} + echo "primitive ${ARR_HA_SCE_NAMES[$i]} service::${ARR_HA_SCE_SCRIPTS[$i]} op start timeout=\"240s\" op monitor interval=\"${interval}s\" timeout=\"${timeout}s\" start-delay=\"${startdelay}s\" disabled=\"false\" meta target-role=\"started\"" >> ${SCRIPT} +done + +if [[ "${activer_mail_ha}" == "oui" ]] +then + echo "primitive ${mail_ha_resource_name} ocf:heartbeat:MailTo params email=\"${to_mail_ha}\" subject=\"${subject_mail_ha}\" op monitor interval=\"10s\" disabled=\"true\" meta target-role=\"started\"" >> ${SCRIPT} +fi + +[ -f "$APPLI_PERSO" ] && . $APPLI_PERSO + +# VIPCluster group prefers master node +if [[ -n ${primitive_master} ]] +then + echo "group VIPCluster ${primitive_master} meta target-role=\"started\"">> ${SCRIPT} + echo "location VIPCluster_prefers_master VIPCluster rule 50: #uname eq ${nom_machine}" >> ${SCRIPT} + echo "location VIPCluster_on_slave VIPCluster rule 40: #uname eq ${nom_machine_esclave}" >> ${SCRIPT} +fi +# VIPSlave group prefers slave node +if [[ -n ${primitive_slave} ]] +then + echo "group VIPSlave ${primitive_slave} meta target-role=\"started\"">> ${SCRIPT} + echo "location VIPSlave_prefers_slave VIPSlave rule 50: #uname eq ${nom_machine_esclave}" >> ${SCRIPT} + echo "location VIPSlave_on_master VIPSlave rule 40: #uname eq ${nom_machine}" >> ${SCRIPT} +fi +# Clone VIPLB for Load Balancing +if [[ -n ${primitive_LB} ]] +then + echo "group VIPLB ${primitive_LB} meta target-role=\"started\"">> ${SCRIPT} + echo "clone VIPLB_clone VIPLB meta globally-unique=false" >> ${SCRIPT} +fi + +# *** Primitive pingd *** +if [ $nb_ping_hosts -gt 0 ] +then + echo "primitive ${pingd_resource_name} ocf:pacemaker:ping params host_list=\"${ARR_HA_PINGD_ADRESSEIP[@]}\" multiplier=100 op monitor interval=15s timeout=5s" >> ${SCRIPT} + echo "clone ${pingd_resource_name}_clone ${pingd_resource_name} meta globally-unique=false" >> ${SCRIPT} + + echo "location VIPClusterping VIPCluster rule -inf: not_defined pingd or pingd lte 0" >> ${SCRIPT} + if [ ! "${primitive_slave}" = "" ] + then + echo "location VIPSlaveping VIPSlave rule -inf: not_defined pingd or pingd lte 0" >> ${SCRIPT} + fi +fi +# *** Fin primitive pingd *** +if [[ -f ${SCRIPT} ]] +then + # On lance corosync si il n'est pas lancé + service corosync status > /dev/null 2>&1 + if [[ $? -ne 0 ]] + then + service corosync start + wait_true_retcode "Attente démarrage corosync" "service corosync status > /dev/null 2>&1" + fi + # On lance pacemaker si il n'est pas lancé + service pacemaker status > /dev/null 2>&1 + if [[ $? -ne 0 ]] + then + service pacemaker start + wait_true_retcode "Attente démarrage pacemaker" "service pacemaker status > /dev/null 2>&1" + fi + # On vérifie que le noeud est bien Online + crm node online ${nom_machine} > /dev/null 2>&1 + wait_true_retcode "Attente noeud Online" "crm_mon -1|grep -qsE \"^Online: \[.* ${nom_machine} .*\]\"" + + # Activation du mode automatique pour la gestion des groupes de resources + crm options manage-children always + + # Stopping resources + clone_resources=$(${CRM} configure show|grep -e "clone"|awk -F" " '{print $2}') + for clone_resource in $clone_resources + do + ${CRM} resource stop $clone_resource + wait_true_retcode "Arrêt ressource $clone_resource" "crm resource show ${clone_resource} 2>&1|grep -qsE \"is NOT running\"" + done + + actives_resources_groups=$(${CRM} configure show|grep -e "group"|awk -F" " '{print $2}') + for active_resource_group in $actives_resources_groups + do + ${CRM} resource stop $active_resource_group + wait_true_retcode "Arrêt ressource $active_resource_group" "crm resource show ${active_resource_group} 2>&1|grep -qsE \"is NOT running\"" + done + + actives_primitives=$(${CRM} configure show|grep -e "primitive"|awk -F" " '{print $2}') + for active_primitive in $actives_primitives + do + ${CRM} resource stop $active_primitive + wait_true_retcode "Arrêt ressource $active_primitive" "crm resource show ${active_primitive} 2>&1|grep -qsE \"is NOT running\"" + done + # End of stopping resources + + crm_mon -1 + ${CRM} configure load replace ${SCRIPT} + rm -f ${SCRIPT} +fi diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-pacemaker/files/usr/share/eole/sbin/haute_dispo_maintenance b/seed/release/eole-2.7/2.7.1/applicationservice/eole-pacemaker/files/usr/share/eole/sbin/haute_dispo_maintenance new file mode 100644 index 0000000000000000000000000000000000000000..35642fbb842b9e690d635fcc153bdd6ca2abb8ff --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-pacemaker/files/usr/share/eole/sbin/haute_dispo_maintenance @@ -0,0 +1,173 @@ +#!/bin/bash + +. /usr/lib/eole/utils.sh + +IFS=" " +declare -a RESOURCE_MASTER=("VIPCluster") +declare -a RESOURCE_SLAVE=("VIPSlave") +declare -a RESOURCE_MS=("${RESOURCE_MASTER[@]} ${RESOURCE_SLAVE[@]}") +LOCAL_NODE=$(CreoleGet nom_machine) +activer_haute_dispo=$(CreoleGet activer_haute_dispo) +if [ "${activer_haute_dispo}" == "maitre" ] +then + REMOTE_NODE=$(CreoleGet nom_machine_esclave) +else + REMOTE_NODE=$(CreoleGet nom_machine_maitre) +fi + +if [ ! "$1" = "manage" ] && [ ! "$1" = "unmanage" ] && \ + [ ! "$1" = "migrate" ] && [ ! "$1" = "unmigrate" ] && \ + [ ! "$1" = "deactivate" ] && [ ! "$1" = "activate" ] && \ + [ ! "$1" = "beginlogrotate" ] && [ ! "$1" = "endlogrotate" ] +then + echo "Option inconnue" + echo "Doit être :" + echo " manage : remise en monitoring des ressources" + echo " unmanage : ne monitore plus les ressources locales" + echo " migrate : migration des ressources sur le noeud distant" + echo " unmigrate : rapatriement des ressources préférant le noeud local" + echo " activate : arrête corosync/pacemaker" + echo " deactivate : relance corosync/pacemaker" + echo " beginlogrotate : met les ressources en unmanage si pas de lock logrotate distant" + echo " endlogrotate : met les ressources en manage si pas de lock logrotate distant" + exit 1 +fi + +function SetRsc() { + crm status >> /dev/null 2>&1 + if [ $? -eq 0 ]; then + [ "$1" == "manage" ] && maintenance="false" + [ "$1" == "unmanage" ] && maintenance="true" + crm configure property maintenance-mode=${maintenance} + fi + return 0 +} + +function migrate() { + crm status >> /dev/null 2>&1 + if [ $? -eq 0 ]; then + if [ "$1" == "migrate" ]; then + # migration de toutes les ressources sur le noeud distant + for rsc_grp in $RESOURCE_MS; do + crm resource show $rsc_grp >> /dev/null 2>&1 + [ $? -ne 0 ] && continue + crm resource unmigrate $rsc_grp >> /dev/null 2>&1 + crm resource migrate $rsc_grp $REMOTE_NODE >> /dev/null 2>&1 + wait_true_retcode "Migration de la ressource ${rsc_grp} sur ${REMOTE_NODE}" "crm resource show ${rsc_grp} 2>>/dev/null| grep -sqE \"${rsc_grp} is running on: ${REMOTE_NODE} $\"" + sleep 1 + done + elif [ "$1" == "unmigrate" ]; then + if [ "${activer_haute_dispo}" == "maitre" ]; then + # Rapatriement des ressources préférées sur le noeud maître + for rsc_grp in $RESOURCE_MASTER; do + crm resource show $rsc_grp >> /dev/null 2>&1 + [ $? -ne 0 ] && continue + crm resource unmigrate $rsc_grp >> /dev/null 2>&1 + crm resource migrate $rsc_grp $LOCAL_NODE >> /dev/null 2>&1 + wait_true_retcode "Migration de la ressource ${rsc_grp} sur ${LOCAL_NODE}" "crm resource show ${rsc_grp} 2>>/dev/null| grep -sqE \"${rsc_grp} is running on: ${LOCAL_NODE} $\"" + done + elif [ "${activer_haute_dispo}" == "esclave" ]; then + # Rapatriement des ressources préférées sur le noeud esclave + for rsc_grp in $RESOURCE_SLAVE; do + crm resource show $rsc_grp >> /dev/null 2>&1 + [ $? -ne 0 ] && continue + crm resource unmigrate $rsc_grp >> /dev/null 2>&1 + crm resource migrate $rsc_grp $LOCAL_NODE >> /dev/null 2>&1 + wait_true_retcode "Migration de la ressource ${rsc_grp} sur ${LOCAL_NODE}" "crm resource show ${rsc_grp} 2>>/dev/null| grep -sqE \"${rsc_grp} is running on: ${LOCAL_NODE} $\"" + done + fi + fi + fi +} + +function activate() { + if [ "$1" == "deactivate" ]; then + # On lance corosync si il n'est pas lancé + service corosync status > /dev/null 2>&1 + if [ ! $? -eq 0 ] + then + service corosync start + wait_true_retcode "Attente démarrage corosync" "service corosync status >> /dev/null 2>&1" + fi + # On lance pacemaker si il n'est pas lancé + service pacemaker status > /dev/null 2>&1 + if [ ! $? -eq 0 ] + then + service pacemaker start + wait_true_retcode "Attente démarrage pacemaker" "service pacemaker status >> /dev/null 2>&1" + fi + elif [ "$1" == "activate" ]; then + service pacemaker stop + pgrep -f pacemaker > /dev/null 2>&1 && pkill -f pacemaker > /dev/null 2>&1 + pgrep -f pacemaker > /dev/null 2>&1 && pkill -9 pacamaker 2>&1 >/dev/null + service corosync stop + pgrep -f corosync > /dev/null 2>&1 && pkill -f corosync > /dev/null 2>&1 + pgrep -f corosync > /dev/null 2>&1 && pkill -9 corosync 2>&1 >/dev/null + fi + return 0 +} + +function MngLock() +{ + local lockname=${1} + local action=${2} + local host=${3} + local sshcmd="ssh -q -o LogLevel=ERROR -o StrictHostKeyChecking=no " + local cmd="CreoleLock" + local cmdOpt="${action} --name ${lockname}" + [[ ${action} == "release" ]] && cmdOpt="$cmdOpt --force" + + if [[ ${action} == "acquire" ]] || \ + [[ ${action} == "is_locked" ]] || \ + [[ ${action} == "release" ]] + then + if [[ -z ${host} ]] + then + $($cmd $cmdOpt) + return ${?} + else + $(${sshcmd} root@${host} "$cmd $cmdOpt") + return ${?} + fi + else + return 127 + fi +} + +function logRotate() { + if [ "$1" == "beginlogrotate" ]; then + MngLock logrotate acquire + MngLock logrotate is_locked $REMOTE_NODE + if [ $? -ne 0 ]; then + SetRsc unmanage + fi + elif [ "$1" == "endlogrotate" ]; then + MngLock logrotate release + MngLock logrotate is_locked $REMOTE_NODE + if [ $? -ne 0 ]; then + SetRsc manage + fi + else + return 127 + fi +} + +if [ "$1" == "manage" ] || [ "$1" == "unmanage" ]; then + SetRsc $1 + exit $? +fi + +if [ "$1" == "migrate" ] || [ "$1" == "unmigrate" ]; then + migrate $1 + exit $? +fi + +if [ "$1" == "activate" ] || [ "$1" == "deactivate" ]; then + activate $1 + exit $? +fi + +if [ "$1" == "beginlogrotate" ] || [ "$1" == "endlogrotate" ]; then + logRotate $1 + exit $? +fi diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-pacemaker/files/usr/share/eole/sbin/synchro-nodes.sh b/seed/release/eole-2.7/2.7.1/applicationservice/eole-pacemaker/files/usr/share/eole/sbin/synchro-nodes.sh new file mode 100644 index 0000000000000000000000000000000000000000..3f2e9a3e67064f9b962c02934a42abeb798e62c8 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-pacemaker/files/usr/share/eole/sbin/synchro-nodes.sh @@ -0,0 +1,103 @@ +#!/bin/bash + +. /usr/lib/eole/ihm.sh + +function synchro_files() { +# Synchronisation des fichiers +# Params : +# 1: "maitre"/"esclave" +# 2: nom_machine_locale +# 3: ip_noeud_local +# 4: nom_machine_distante +# 5: ip_noeud_distant + + local HA_PATH="/etc/ha.d/" + local HA_INITIALIZED="${HA_PATH}.hdinitialized" + local RSC_FILE="${HA_PATH}.rsc_list" + tcpcheck 3 $5:22 | grep -q alive + if [ $? -ne 0 ] + then + distant="maitre" + [ "$1" = maitre ] && distant="esclave" + EchoOrange " ERREUR : Noeud $distant injoignable !" + EchoOrange " Relancer synchro-nodes.sh quand les 2 serveurs seront instanciés !!!" + [ -e ${HA_INITIALIZED} ] && rm -f $HA_INITIALIZED + echo + exit 0 + fi + if [ ! -e ${HA_INITIALIZED} ] + then + echo "Envoi de la clé RSA sur $4 --> $5" + ssh-copy-id -i /root/.ssh/id_rsa.pub root@$5 + touch $HA_INITIALIZED + fi + +# On envoie la liste des resources service sur l'esclave + if [ "$1" = "maitre" ]; then + if [[ -f $RSC_FILE ]]; then + /usr/bin/rsync -e ssh --owner --group --recursive --links --perms --times --delete $RSC_FILE $5:$HA_PATH + else + echo "Fichier $RSC_FILE inexistant !!!" + echo "Lancez le script 'appliquer_hautedispo' pour le créer" + exit 0 + fi + fi + + # On ne synchronise que si le node est actif + ACTIVE_NODE=1 + if [ -f $RSC_FILE ]; then + ACTIVE_NODE=0 + while read sce_rsc; do + RSC=$(echo $sce_rsc|cut -d" " -f2) + FIND_PATTERN="^resource ${RSC} is running on: ${2} $" + crm resource show ${RSC} | grep -qE "${FIND_PATTERN}" + RC=$? + [ $RC -ne 0 ] && ACTIVE_NODE=1 && break + done < $RSC_FILE + fi + if [ $ACTIVE_NODE -eq 0 ] + then + for fichier in $(CreoleGet synchro_fichiers) + do + if [ -d $fichier ] + then + # Synchro d'un répertoire + echo "Synchronisation du répertoire $fichier" + repertoire=`dirname $fichier`/`basename $fichier`/ + /usr/bin/rsync -e ssh --owner --group --recursive --links --perms --times --delete $repertoire $5:$repertoire + elif [ -f $fichier ] + then + # Synchro d'un fichier + echo "Synchronisation du fichier $fichier" + repertoire=`dirname $fichier`/ + /usr/bin/rsync -e ssh --owner --group --recursive --links --perms --times --delete $fichier $5:$repertoire + else + echo "Information : $fichier inexistant sur le nÅ“ud $1, non synchronisé" + fi + done + fi +} + +echo "Synchronisation des nodes ...." +echo + +activer_haute_dispo="$(CreoleGet activer_haute_dispo)" +nom_machine_locale="$(CreoleGet nom_machine)" + +if [ "$activer_haute_dispo" = "maitre" ] +then + nom_machine_distante="$(CreoleGet nom_machine_esclave)" + ip_machine_distante="$(CreoleGet ip_machine_esclave)" +fi + +if [ "$activer_haute_dispo" = "esclave" ] +then + nom_machine_distante="$(CreoleGet nom_machine_maitre)" + ip_machine_distante="$(CreoleGet ip_machine_maitre)" +fi + +if [ "$activer_haute_dispo" != "non" ] +then + ip_machine_locale="$(CreoleGet "adresse_ip_eth$(CreoleGet corosync_dial_if)")" + synchro_files $activer_haute_dispo $nom_machine_locale $ip_machine_locale $nom_machine_distante $ip_machine_distante +fi diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-pacemaker/postservices/00-haute-dispo b/seed/release/eole-2.7/2.7.1/applicationservice/eole-pacemaker/postservices/00-haute-dispo new file mode 100644 index 0000000000000000000000000000000000000000..a0f6fe1890cdab7e89adac61e4e48ddc2eaccb97 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-pacemaker/postservices/00-haute-dispo @@ -0,0 +1,98 @@ +#!/bin/bash + +. /usr/lib/eole/ihm.sh +. /usr/lib/eole/utils.sh + +activer_haute_dispo=$(CreoleGet activer_haute_dispo) +nom_machine=$(CreoleGet nom_machine) +option="$1" + +if [ "${activer_haute_dispo}" == "non" ] +then +# Si haute dispo désactivée, on stoppe corosync + service pacemaker stop + pgrep -f pacemaker > /dev/null 2>&1 && pkill -f pacemaker > /dev/null 2>&1 + pgrep -f pacemaker > /dev/null 2>&1 && pkill -9 pacamaker 2>&1 >/dev/null + service corosync stop + pgrep -f corosync > /dev/null 2>&1 && pkill -f corosync > /dev/null 2>&1 + pgrep -f corosync > /dev/null 2>&1 && pkill -9 corosync 2>&1 >/dev/null + rm -f /var/lib/pacemaker/cib/* +else + corosync_dial_if=$(CreoleGet corosync_dial_if) + id eole &>/dev/null + if [ $? -eq 0 ] + then + groups eole |grep haclient >/dev/null + if [ $? -ne 0 ] + then + usermod -G haclient -a eole + fi + fi + # On genere un bi-clef rsa sur chaque machine si il n'existe pas + if [ ! -e /root/.ssh/id_rsa.pub ] && + [ ! -e /root/.ssh/id_rsa ] + then + ssh-keygen -t rsa -b 2048 -f /root/.ssh/id_rsa -N "" -q + fi + + # on renseigne le noeud distant + if [ "${activer_haute_dispo}" == "maitre" ] + then + remote_node=$(CreoleGet nom_machine_esclave) + elif [ "${activer_haute_dispo}" == "esclave" ] + then + remote_node=$(CreoleGet nom_machine_maitre) + fi + + if [ "$option" = "instance" ] + then + ## Suppression de l'ancienne conf pacemaker + if [ -e /var/lib/pacemaker/cib/cib.xml ] + then + # Arrête corosync et pacemaker + /usr/share/eole/sbin/haute_dispo_maintenance activate + rm -f /var/lib/pacemaker/cib/* + fi + fi + # Lancement corosync et pacemaker si arrêtés + /usr/share/eole/sbin/haute_dispo_maintenance deactivate + + # Le cluster sort du mode maintenance + /usr/share/eole/sbin/haute_dispo_maintenance manage + /usr/share/eole/sbin/haute_dispo_maintenance unmigrate + + if [ "${activer_haute_dispo}" = "maitre" ] + then + /usr/share/eole/sbin/appliquer_hautedispo + # On attend que les ressources soient montées + wait_true_retcode "Attente ressources montées" "crm resource show 2>&1|grep -s -q 'Started'" + fi + + if [ ! "$option" = "reconfigure" ]; then + EchoOrange "Les serveurs maître et esclave doivent pouvoir dialoguer en ssh sur l'interface $corosync_dial_if" + Question_ouinon "Voulez-vous synchroniser les noeuds ?" 'True' "non" + rep=$? + else + rep=1 + fi + if [ $rep -eq 0 ] + then + # on attend que les 2 noeuds soient Online + crm node online ${nom_machine} > /dev/null 2>&1 + cmd="crm_mon -1|grep -qs -e \"^Online: \[ ${nom_machine} ${remote_node} \]\" -e \"^Online: \[ ${remote_node} ${nom_machine} \]\"" + wait_true_retcode "Attente noeuds $nom_machine et ${remote_node} Online" "${cmd}" + crm resource show VIPCluster > /dev/null 2>&1 + if [ $? -eq 0 ] + then + # On attend que les ressources soient montées si elles sont déclarées + wait_true_retcode "Attente ressources montées" "crm resource show 2>&1|grep -s -q 'Started'" + fi + /usr/share/eole/sbin/synchro-nodes.sh + else + if [ ! "$option" = "reconfigure" ]; then + EchoOrange "Pour forcer la synchronisation, vous pouvez lancer le script 'synchro-nodes.sh' manuellement une fois les deux noeuds 'Online'" + EchoOrange "Vous pouvez vérifier leur status à l'aide de la commande 'crm_mon -1'" + fi + fi + exit 0 +fi diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-pacemaker/preservices/00-haute-dispo b/seed/release/eole-2.7/2.7.1/applicationservice/eole-pacemaker/preservices/00-haute-dispo new file mode 100644 index 0000000000000000000000000000000000000000..d19ecd9a04ffe5aaef30b5ce28e93a3150005730 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-pacemaker/preservices/00-haute-dispo @@ -0,0 +1,16 @@ +#!/bin/bash + + +activer_haute_dispo=$(CreoleGet activer_haute_dispo) + +if [ "$activer_haute_dispo" != "non" ] +then + [ "$1" = "instance" ] && [ -e /etc/ha.d/.hdinitialized ] && rm -f /etc/ha.d/.hdinitialized + if [ "$1" = "reconfigure" ]; then + /usr/share/eole/sbin/synchro-nodes.sh + /usr/share/eole/sbin/haute_dispo_maintenance migrate + /usr/share/eole/sbin/haute_dispo_maintenance unmanage + /usr/share/eole/sbin/haute_dispo_maintenance activate + fi +fi +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-pacemaker/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-pacemaker/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..29bc091d022d7435071e95183fe1e86932850395 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-pacemaker/service.yml @@ -0,0 +1,50 @@ +format: '0.1' +name: eole-pacemaker +version: |- + 2.6.2-1 +description: |- + Templates, dictionnaire et scripts pour la gestion de la haute + disponibilité + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE : + http://eole.orion.education.fr +depends: [] +packages: + - pacemaker + - crmsh +dictionaries: + - 02_haute_dispo.xml +extra_dictionaries: {} +templates: + - rsyslog_traps_haute-dispo.conf + - corosync.conf + - corosync + - haute_dispo.logrotate + - pacemaker +creole_funcs: [] +preservices: + - 00-haute-dispo +postservices: + - 00-haute-dispo +pretemplates: [] +posttemplates: [] +files: + /usr/share/eole/sbin/synchro-nodes.sh: + owner: root + group: root + mode: '0755' + /usr/share/eole/sbin/haute_dispo_maintenance: + owner: root + group: root + mode: '0755' + /usr/share/eole/sbin/appliquer_hautedispo: + owner: root + group: root + mode: '0755' + /usr/share/eole/diagnose/150-ha: + owner: root + group: root + mode: '0755' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-pacemaker/templates/corosync b/seed/release/eole-2.7/2.7.1/applicationservice/eole-pacemaker/templates/corosync new file mode 100644 index 0000000000000000000000000000000000000000..28528b2a4c08d798aa29cf371f8fa5597aa2378a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-pacemaker/templates/corosync @@ -0,0 +1,6 @@ +# start corosync at boot [yes|no] +%if %%activer_haute_dispo != 'non' +START=yes +%else +START=no +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-pacemaker/templates/corosync.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-pacemaker/templates/corosync.conf new file mode 100644 index 0000000000000000000000000000000000000000..73e014f58a83f713323e5fdfdefb6789b1ef9143 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-pacemaker/templates/corosync.conf @@ -0,0 +1,88 @@ +# Please read the openais.conf.5 manual page + +totem { + version: 2 + + # How long before declaring a token lost (ms) + token: 3000 + + # How many token retransmits before forming a new configuration + token_retransmits_before_loss_const: 10 + + # How long to wait for join messages in the membership protocol (ms) + join: 60 + + # How long to wait for consensus to be achieved before starting a new round of membership configuration (ms) + consensus: 3600 + + # Turn off the virtual synchrony filter + vsftype: none + + # Number of messages that may be sent by one processor on receipt of the token + max_messages: 20 + + # Limit generated nodeids to 31-bits (positive signed integers) + clear_node_high_bit: yes + + # Disable encryption + secauth: off + + # How many threads to use for encryption/decryption + threads: 0 + + # Optionally assign a fixed node id (integer) + # nodeid: 1234 + + # This specifies the mode of redundant ring, which may be none, active, or passive. + rrp_mode: none + + interface { + # The following values need to be set based on your environment + ringnumber: 0 +%if %%activer_haute_dispo != 'non' + %set %%corosync_dial_if_num=%%corosync_dial_if[-1] + %if %%int(%%corosync_dial_if_num) < %%int(%%nombre_interfaces) + bindnetaddr: %%getVar('adresse_network_eth' + %%corosync_dial_if) + %else + bindnetaddr: %%getVar('adresse_network_eth' + %%str(%%int(%%int(%%nombre_interfaces)-1))) + %end if +%else + bindnetaddr:127.0.0.1 +%end if + mcastaddr: %%corosync_mcastaddr + mcastport: %%corosync_mcastport + } +} + +amf { + mode: disabled +} + +quorum { + # Quorum for the Pacemaker Cluster Resource Manager + provider: corosync_votequorum + expected_votes: 1 + two_nodes: 1 + wait_for_all: 0 + last_man_standing: 1 +} + +aisexec { + user: root + group: root +} + +logging { + fileline: off + to_stderr: yes + to_logfile: no + to_syslog: yes + syslog_facility: daemon + debug: off + timestamp: on + logger_subsys { + subsys: AMF + debug: off + tags: enter|leave|trace1|trace2|trace3|trace4|trace6 + } +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-pacemaker/templates/haute_dispo.logrotate b/seed/release/eole-2.7/2.7.1/applicationservice/eole-pacemaker/templates/haute_dispo.logrotate new file mode 100644 index 0000000000000000000000000000000000000000..d3c0580b09a3e212faba47bee9ec8583a36eef38 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-pacemaker/templates/haute_dispo.logrotate @@ -0,0 +1,16 @@ +/var/log/rsyslog/local/haute-dispo/*.log { + missingok + compress + notifempty + rotate 10 + weekly + prerotate + # HA prerotate operations + /usr/share/eole/sbin/haute_dispo_maintenance beginlogrotate + endscript + postrotate + # HA postrotate operations + service rsyslog reload + /usr/share/eole/sbin/haute_dispo_maintenance endlogrotate + endscript +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-pacemaker/templates/pacemaker b/seed/release/eole-2.7/2.7.1/applicationservice/eole-pacemaker/templates/pacemaker new file mode 100644 index 0000000000000000000000000000000000000000..36a49488595ac3275d927a640ed6a9f24b6a1b6c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-pacemaker/templates/pacemaker @@ -0,0 +1,101 @@ +# For non-systemd based systems, prefix export to each enabled line + +# Turn on special handling for CMAN clusters in the init script +# Without this, fenced (and by inference, cman) cannot reliably be made to shut down +# export PCMK_STACK=cman + +#==#==# Variables that control logging + +# Enable debug logging globally or per-subsystem +# Multiple subsystems may me listed separated by commas +# eg. export PCMK_debug=crmd,pengine +# export PCMK_debug=yes|no|crmd|pengine|cib|stonith-ng|attrd|pacemakerd + +# Send INFO (and higher) messages to the named log file +# Additional messages may also appear here depending on any configured debug and trace settings +# By default Pacemaker will inherit the logfile specified in corosync.conf +# export PCMK_debugfile=/var/log/pacemaker.log + +# Specify an alternate syslog target for NOTICE (and higher) messages +# Use 'none' to disable - not recommended +# The default value is 'daemon' +# export PCMK_logfacility=none|daemon|user|local0|local1|local2|local3|local4|local5|local6|local7 + +# Send all messages up-to-and-including the configured priority to syslog +# A value of 'info' will be far too verbose for most installations and 'debug' is almost certain to send you blind +# The default value is 'notice' +# export PCMK_logpriority=emerg|alert|crit|error|warning|notice|info|debug + +# Log all messages from a comma-separated list of functions +# export PCMK_trace_functions=function1,function2,function3 + +# Log all messages from a comma-separated list of files (no path) +# Supports wildcards eg. export PCMK_trace_files=prefix*.c +# export PCMK_trace_files=file.c,other.h + +# Log all messages matching comma-separated list of formats +# export PCMK_trace_formats="Sent delete %d" + +# Log all messages from a comma-separated list of tags +# export PCMK_trace_tags=tag1,tag2 + +# Dump the blackbox whenever the message at function and line is printed +# eg. export PCMK_trace_blackbox=te_graph_trigger:223,unpack_clone:81 +# export PCMK_trace_blackbox=fn:line,fn2:line2,... + +# Enable blackbox logging globally or per-subsystem +# The blackbox contains a rolling buffer of all logs (including info+debug+trace) +# and is written after a crash, assertion failure and/or when SIGTRAP is recieved +# +# The blackbox recorder can also be enabled for Pacemaker daemons at runtime by sending SIGUSR1 +# +# Multiple subsystems may me listed separated by commas +# eg. export PCMK_blackbox=crmd,pengine +# export PCMK_blackbox=yes|no|crmd|pengine|cib|stonith-ng|attrd|pacemakerd + +#==#==# Advanced use only + +# Enable this for compatibility with older corosync (prior to 2.0) +# based clusters which used the nodes uname as its uuid also +# export PCMK_uname_is_uuid=no + +# Specify an alternate location for RNG schemas and XSL transforms +# Mostly only useful for developer testing +# export PCMK_schema_directory=/some/path + +# Enable this for rebooting this machine at the time of process (subsystem) failure +# export PCMK_fail_fast=no + +#==#==# Pacemaker Remote +# Use a custom directory for finding the authkey. +# export PCMK_authkey_location=/etc/pacemaker/authkey +# +# Specify a custom port for Pacemaker Remote connections +# export PCMK_remote_port=3121 + +#==#==# IPC + +# Force use of a particular class of IPC connection +# export PCMK_ipc_type=shared-mem|socket|posix|sysv + +# Specify an IPC buffer size in bytes +# Useful when connecting to really big clusters that exceed the default 20k buffer +# export PCMK_ipc_buffer=20480 + +#==#==# Profiling and memory leak testing + +# Variables for running child daemons under valgrind and/or checking for memory problems +# G_SLICE=always-malloc +# MALLOC_PERTURB_=221 # or 0 +# MALLOC_CHECK_=3 # or 0,1,2 +# export PCMK_valgrind_enabled=yes +# export PCMK_valgrind_enabled=cib,crmd +# export PCMK_callgrind_enabled=yes +# export PCMK_callgrind_enabled=cib,crmd +# VALGRIND_OPTS="--leak-check=full --trace-children=no --num-callers=25 --log-file=/var/lib/pacemaker/valgrind-%p --suppressions=/usr/share/pacemaker/tests/valgrind-pcmk.suppressions --gen-suppressions=all" +# start pacemaker at boot [yes|no] +%if %%activer_haute_dispo != 'non' +START=yes +%else +START=no +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-pacemaker/templates/rsyslog_traps_haute-dispo.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-pacemaker/templates/rsyslog_traps_haute-dispo.conf new file mode 100644 index 0000000000000000000000000000000000000000..7f34b2fd8240564d9bf0e424caa02ef4d1fae703 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-pacemaker/templates/rsyslog_traps_haute-dispo.conf @@ -0,0 +1,194 @@ +# Templates for local and remote logging + +$template DynLocalHauteDispo, "/var/log/rsyslog/local/haute-dispo/haute-dispo.%syslogseverity-text%.log" + +$template DynRemoteHauteDispo, "/var/log/rsyslog/remote/%fromhost%/haute-dispo/haute-dispo.%syslogseverity-text%.log" +%if %%getVar("activer_reception_logs", "non") == 'non' +# all messages go in local branch +:programname, startswith, "ipsecSphynx(" ?DynLocalHauteDispo +& stop +:programname, isequal, "pacemakerd" ?DynLocalHauteDispo +& stop +:programname, isequal, "crmd" ?DynLocalHauteDispo +& stop +:programname, isequal, "stonith-ng" ?DynLocalHauteDispo +& stop +:programname, isequal, "lrmd" ?DynLocalHauteDispo +& stop +:programname, isequal, "corosync" ?DynLocalHauteDispo +& stop +:programname, isequal, "attrd" ?DynLocalHauteDispo +& stop +:programname, isequal, "cib" ?DynLocalHauteDispo +& stop +:programname, startswith, "IPaddr2(" ?DynLocalHauteDispo +& stop +:programname, startswith, "Route(" ?DynLocalHauteDispo +& stop +:programname, isequal, "pingd" ?DynLocalHauteDispo +& stop +:programname, isequal, "MailTo" ?DynLocalHauteDispo +& stop +:programname, isequal, "crm_attribute" ?DynLocalHauteDispo +& stop +:programname, isequal, "cibadmin" ?DynLocalHauteDispo +& stop +:programname, isequal, "crm_resource" ?DynLocalHauteDispo +& stop +:programname, isequal, "crm_verify" ?DynLocalHauteDispo +& stop +:programname, isequal, "pengine" ?DynLocalHauteDispo +& stop +:programname, isequal, "crm_shadow" ?DynLocalHauteDispo +& stop +%else +# all messages from localhost go in local branch +if $programname startswith 'ipsecSphynx(' and $fromhost-ip startswith '127' then ?DynLocalHauteDispo +& stop +if $programname == 'pacemakerd' and $fromhost-ip startswith '127' then ?DynLocalHauteDispo +& stop +if $programname == 'crmd' and $fromhost-ip startswith '127' then ?DynLocalHauteDispo +& stop +if $programname == 'stonith-ng' and $fromhost-ip startswith '127' then ?DynLocalHauteDispo +& stop +if $programname == 'lrmd' and $fromhost-ip startswith '127' then ?DynLocalHauteDispo +& stop +if $programname == 'corosync' and $fromhost-ip startswith '127' then ?DynLocalHauteDispo +& stop +if $programname == 'attrd' and $fromhost-ip startswith '127' then ?DynLocalHauteDispo +& stop +if $programname == 'cib' and $fromhost-ip startswith '127' then ?DynLocalHauteDispo +& stop +if $programname startswith 'IPaddr2(' and $fromhost-ip startswith '127' then ?DynLocalHauteDispo +& stop +if $programname startswith 'Route(' and $fromhost-ip startswith '127' then ?DynLocalHauteDispo +& stop +if $programname == 'pingd' and $fromhost-ip startswith '127' then ?DynLocalHauteDispo +& stop +:programname, isequal, "MailTo" ?DynLocalHauteDispo +& stop +if $programname == 'crm_attribute' and $fromhost-ip startswith '127' then ?DynLocalHauteDispo +& stop +if $programname == 'cibadmin' and $fromhost-ip startswith '127' then ?DynLocalHauteDispo +& stop +if $programname == 'crm_resource' and $fromhost-ip startswith '127' then ?DynLocalHauteDispo +& stop +if $programname == 'crm_verify' and $fromhost-ip startswith '127' then ?DynLocalHauteDispo +& stop +if $programname == 'pengine' and $fromhost-ip startswith '127' then ?DynLocalHauteDispo +& stop +if $programname == 'crm_shadow' and $fromhost-ip startswith '127' then ?DynLocalHauteDispo +& stop +%if %%mode_conteneur_actif == 'oui' +# all messages from containers go in local branch +if $programname startswith 'ipsecSphynx(' and $fromhost-ip startswith '%%adresse_ip_br0[:-2]' then ?DynLocalHauteDispo +& stop +if $programname == 'pacemakerd' and $fromhost-ip startswith '%%adresse_ip_br0[:-2]' then ?DynLocalHauteDispo +& stop +if $programname == 'crmd' and $fromhost-ip startswith '%%adresse_ip_br0[:-2]' then ?DynLocalHauteDispo +& stop +if $programname == 'stonith-ng' and $fromhost-ip startswith '%%adresse_ip_br0[:-2]' then ?DynLocalHauteDispo +& stop +if $programname == 'lrmd' and $fromhost-ip startswith '%%adresse_ip_br0[:-2]' then ?DynLocalHauteDispo +& stop +if $programname == 'corosync' and $fromhost-ip startswith '%%adresse_ip_br0[:-2]' then ?DynLocalHauteDispo +& stop +if $programname == 'attrd' and $fromhost-ip startswith '%%adresse_ip_br0[:-2]' then ?DynLocalHauteDispo +& stop +if $programname == 'cib' and $fromhost-ip startswith '%%adresse_ip_br0[:-2]' then ?DynLocalHauteDispo +& stop +if $programname startswith 'IPaddr2(' and $fromhost-ip startswith '%%adresse_ip_br0[:-2]' then ?DynLocalHauteDispo +& stop +if $programname startswith 'Route(' and $fromhost-ip startswith '%%adresse_ip_br0[:-2]' then ?DynLocalHauteDispo +& stop +if $programname == 'pingd' and $fromhost-ip startswith '%%adresse_ip_br0[:-2]' then ?DynLocalHauteDispo +& stop +:programname, isequal, "MailTo" ?DynLocalHauteDispo +& stop +if $programname == 'crm_attribute' and $fromhost-ip startswith '%%adresse_ip_br0[:-2]' then ?DynLocalHauteDispo +& stop +if $programname == 'cibadmin' and $fromhost-ip startswith '%%adresse_ip_br0[:-2]' then ?DynLocalHauteDispo +& stop +if $programname == 'crm_resource' and $fromhost-ip startswith '%%adresse_ip_br0[:-2]' then ?DynLocalHauteDispo +& stop +if $programname == 'crm_verify' and $fromhost-ip startswith '%%adresse_ip_br0[:-2]' then ?DynLocalHauteDispo +& stop +if $programname == 'pengine' and $fromhost-ip startswith '%%adresse_ip_br0[:-2]' then ?DynLocalHauteDispo +& stop +if $programname == 'crm_shadow' and $fromhost-ip startswith '%%adresse_ip_br0[:-2]' then ?DynLocalHauteDispo +& stop +if $programname startswith 'ipsecSphynx(' and $fromhost startswith '%%adresse_ip_br0[:-2]' then ?DynLocalHauteDispo +& stop +if $programname == 'pacemakerd' and $fromhost startswith '%%adresse_ip_br0[:-2]' then ?DynLocalHauteDispo +& stop +if $programname == 'crmd' and $fromhost startswith '%%adresse_ip_br0[:-2]' then ?DynLocalHauteDispo +& stop +if $programname == 'stonith-ng' and $fromhost startswith '%%adresse_ip_br0[:-2]' then ?DynLocalHauteDispo +& stop +if $programname == 'lrmd' and $fromhost startswith '%%adresse_ip_br0[:-2]' then ?DynLocalHauteDispo +& stop +if $programname == 'corosync' and $fromhost startswith '%%adresse_ip_br0[:-2]' then ?DynLocalHauteDispo +& stop +if $programname == 'attrd' and $fromhost startswith '%%adresse_ip_br0[:-2]' then ?DynLocalHauteDispo +& stop +if $programname == 'cib' and $fromhost startswith '%%adresse_ip_br0[:-2]' then ?DynLocalHauteDispo +& stop +if $programname startswith 'IPaddr2(' and $fromhost startswith '%%adresse_ip_br0[:-2]' then ?DynLocalHauteDispo +& stop +if $programname startswith 'Route(' and $fromhost startswith '%%adresse_ip_br0[:-2]' then ?DynLocalHauteDispo +& stop +if $programname == 'pingd' and $fromhost startswith '%%adresse_ip_br0[:-2]' then ?DynLocalHauteDispo +& stop +:programname, isequal, "MailTo" ?DynLocalHauteDispo +& stop +if $programname == 'crm_attribute' and $fromhost startswith '%%adresse_ip_br0[:-2]' then ?DynLocalHauteDispo +& stop +if $programname == 'cibadmin' and $fromhost startswith '%%adresse_ip_br0[:-2]' then ?DynLocalHauteDispo +& stop +if $programname == 'crm_resource' and $fromhost startswith '%%adresse_ip_br0[:-2]' then ?DynLocalHauteDispo +& stop +if $programname == 'crm_verify' and $fromhost startswith '%%adresse_ip_br0[:-2]' then ?DynLocalHauteDispo +& stop +if $programname == 'pengine' and $fromhost startswith '%%adresse_ip_br0[:-2]' then ?DynLocalHauteDispo +& stop +if $programname == 'crm_shadow' and $fromhost startswith '%%adresse_ip_br0[:-2]' then ?DynLocalHauteDispo +& stop +%end if +# all remaining messages go in remote branch +:programname, startswith, "ipsecSphynx(" ?DynRemoteHauteDispo +& stop +:programname, isequal, "pacemakerd" ?DynRemoteHauteDispo +& stop +:programname, isequal, "crmd" ?DynRemoteHauteDispo +& stop +:programname, isequal, "stonith-ng" ?DynRemoteHauteDispo +& stop +:programname, isequal, "lrmd" ?DynRemoteHauteDispo +& stop +:programname, isequal, "corosync" ?DynRemoteHauteDispo +& stop +:programname, isequal, "attrd" ?DynRemoteHauteDispo +& stop +:programname, isequal, "cib" ?DynRemoteHauteDispo +& stop +:programname, startswith, "IPaddr2(" ?DynRemoteHauteDispo +& stop +:programname, startswith, "Route(" ?DynRemoteHauteDispo +& stop +:programname, isequal, "pingd" ?DynRemoteHauteDispo +& stop +:programname, isequal, "MailTo" ?DynLocalHauteDispo +& stop +:programname, isequal, "crm_attribute" ?DynRemoteHauteDispo +& stop +:programname, isequal, "cibadmin" ?DynRemoteHauteDispo +& stop +:programname, isequal, "crm_resource" ?DynRemoteHauteDispo +& stop +:programname, isequal, "crm_verify" ?DynRemoteHauteDispo +& stop +:programname, isequal, "pengine" ?DynRemoteHauteDispo +& stop +:programname, isequal, "crm_shadow" ?DynRemoteHauteDispo +& stop +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-phpmyadmin/dictionaries/23_phpmyadmin.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-phpmyadmin/dictionaries/23_phpmyadmin.xml new file mode 100644 index 0000000000000000000000000000000000000000..bcc8db5f1606fce7bef0fedcadb2ac4ece01e53b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-phpmyadmin/dictionaries/23_phpmyadmin.xml @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <containers> + <container name='web'> + <package>eole-phpmyadmin-pkg</package> + <service method="apache" servicelist="myadmin">phpmyadmin</service> + <file name='/etc/apache2/sites-available/phpmyadmin' source='apache-phpmyadmin.conf'/> + <file filelist='myadmin' name='/etc/phpmyadmin/config-db.php'/> + </container> + </containers> + + <variables> + <family name='applications web'> + <variable name='activer_phpmyadmin' type='oui/non' description="Activer phpMyAdmin (administration des bases MySQL)"> + <value>non</value> + </variable> + </family> + </variables> + + <constraints> + <condition name='disabled_if_in' source='activer_mysql'> + <param>non</param> + <target type='variable'>activer_phpmyadmin</target> + </condition> + <condition name='disabled_if_in' source='activer_phpmyadmin'> + <param>non</param> + <target type='filelist'>myadmin</target> + <target type='servicelist'>myadmin</target> + </condition> + </constraints> + + <help> + <variable name='activer_phpmyadmin'>phpMyAdmin permet d'administrer en ligne les bases de données MySQL du serveur</variable> + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-phpmyadmin/files/usr/share/eole/applications/gen/phpmyadmin.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-phpmyadmin/files/usr/share/eole/applications/gen/phpmyadmin.py new file mode 100644 index 0000000000000000000000000000000000000000..d6dcf5c349804764ee612ce63bd0216e9bda2a08 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-phpmyadmin/files/usr/share/eole/applications/gen/phpmyadmin.py @@ -0,0 +1,30 @@ +#-*-coding:utf-8-*- +########################################################################### +""" + Configuration pour la création de la base de données de mon appli +""" +from os.path import join +from eolesql.db_test import db_exists, test_var +from creole.client import CreoleClient + +client = CreoleClient() + +TABLEFILENAMES = [join('/', client.get_creole('container_path_web'), 'usr/share/dbconfig-common/data/phpmyadmin/install/mysql')] + +def test(): + """ + test l'existence de la base de donnée roundcube + """ + return test_var('activer_phpmyadmin') and not db_exists('phpmyadmin') + +def pregen_func(db_handler): + """ + Fonction exécutée avant la génération si le test est bon + """ + db_handler.simple_query('create database phpmyadmin') + +conf_dict = dict(filenames=TABLEFILENAMES, + test=test, database='phpmyadmin', + pregen=pregen_func) + + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-phpmyadmin/postservices/01-phpmyadmin b/seed/release/eole-2.7/2.7.1/applicationservice/eole-phpmyadmin/postservices/01-phpmyadmin new file mode 100644 index 0000000000000000000000000000000000000000..971ffe8d760683a3ecfc0a6b277cf4fd65a166b7 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-phpmyadmin/postservices/01-phpmyadmin @@ -0,0 +1,14 @@ +#!/bin/bash + +# accès à root depuis le container web pour phpMyAdmin (#1792) +activer_phpmyadmin=$(CreoleGet activer_phpmyadmin non) +mode_conteneur_actif=$(CreoleGet mode_conteneur_actif) + +if [ "$activer_phpmyadmin" = 'oui' -a $mode_conteneur_actif = 'oui' ];then + container_ip_web=$(CreoleGet container_ip_web) + sql="CREATE USER IF NOT EXISTS root@$container_ip_web;" + sql="${sql} GRANT ALL PRIVILEGES ON *.* TO root@$container_ip_web WITH GRANT OPTION; FLUSH PRIVILEGES;" + CreoleRun "echo \"${sql}\" | mysql --defaults-file=/etc/mysql/debian.cnf" "mysql" +fi + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-phpmyadmin/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-phpmyadmin/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..c38ed824c45cf08f558e21be25903cc6233ef4c3 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-phpmyadmin/service.yml @@ -0,0 +1,31 @@ +format: '0.1' +name: eole-phpmyadmin +version: |- + 2.6.0-4 +description: |- + Templates et dictionnaires pour l'application phpMyAdmin + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: + - eole-web + - eole-mysql +packages: [] +dictionaries: + - 23_phpmyadmin.xml +extra_dictionaries: {} +templates: + - apache-phpmyadmin.conf + - config-db.php +creole_funcs: [] +preservices: [] +postservices: + - 01-phpmyadmin +pretemplates: [] +posttemplates: [] +files: + /usr/share/eole/applications/gen/phpmyadmin.py: + owner: root + group: root + mode: '0644' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-phpmyadmin/templates/apache-phpmyadmin.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-phpmyadmin/templates/apache-phpmyadmin.conf new file mode 100644 index 0000000000000000000000000000000000000000..c9f4e7292543f6e175a95609d398a84cf6165234 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-phpmyadmin/templates/apache-phpmyadmin.conf @@ -0,0 +1,43 @@ +######################################################## +# +## Configuration Apache/PHPMyadmin +# +## Equipe Eole eole@ac-dijon.fr +# +######################################################## + +%def allow_ip(%%ip_admin, %%netmask_admin) +Allow from %%ip_admin/%%netmask_admin +%end def + +Alias /myadmin /usr/share/phpmyadmin +Include /etc/phpmyadmin/apache.conf +<Directory /usr/share/phpmyadmin> + Order Deny,Allow +%if %%is_defined('ip_admin_eth0') + %for %%ip_admin in %%ip_admin_eth0 + %%allow_ip(%%ip_admin, %%ip_admin.netmask_admin_eth0) + %end for +%end if +%if %%is_defined('ip_admin_eth1') + %for %%ip_admin in %%ip_admin_eth1 + %%allow_ip(%%ip_admin, %%ip_admin.netmask_admin_eth1) + %end for +%end if +%if %%is_defined('ip_admin_eth2') + %for %%ip_admin in %%ip_admin_eth2 + %%allow_ip(%%ip_admin, %%ip_admin.netmask_admin_eth2) + %end for +%end if +%if %%is_defined('ip_admin_eth3') + %for %%ip_admin in %%ip_admin_eth3 + %%allow_ip(%%ip_admin, %%ip_admin.netmask_admin_eth3) + %end for +%end if +%if %%is_defined('ip_admin_eth4') + %for %%ip_admin in %%ip_admin_eth4 + %%allow_ip(%%ip_admin, %%ip_admin.netmask_admin_eth4) + %end for +%end if + Deny from all +</Directory> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-phpmyadmin/templates/config-db.php b/seed/release/eole-2.7/2.7.1/applicationservice/eole-phpmyadmin/templates/config-db.php new file mode 100644 index 0000000000000000000000000000000000000000..bd253375c25fff0db3cebb784b9295c0be75507f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-phpmyadmin/templates/config-db.php @@ -0,0 +1,19 @@ +<?php +## +## database access settings in php format +## automatically generated from /etc/dbconfig-common/phpmyadmin.conf +## by /usr/sbin/dbconfig-generate-include +## Wed, 20 Jul 2011 11:00:21 +0200 +## +## by default this file is managed via ucf, so you shouldn't have to +## worry about manual changes being silently discarded. *however*, +## you'll probably also want to edit the configuration file mentioned +## above too. +## +$dbuser=''; +$dbpass=''; +$basepath=''; +$dbname='phpmyadmin'; +$dbserver='%%adresse_ip_mysql'; +$dbport=''; +$dbtype='mysql'; diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgis/dictionaries/23_postgis.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgis/dictionaries/23_postgis.xml new file mode 100644 index 0000000000000000000000000000000000000000..5b25dff20d4b370f20a71d37dd4be6e177c92538 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgis/dictionaries/23_postgis.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + <file filelist='postgis' name='/etc/eole/eole-db.d/template_postgis.yml' mkdir='True' rm='True'/> + </files> + <containers> + <container name='postgresql' id='11'> + <package>eole-postgis-pkg</package> + </container> + </containers> + + <variables> + <family name='postgresql' mode='expert' icon='postgres'> + <variable name='pg_additional_db_template' redefine='True'/> + <variable name='pg_activer_postgis' type='oui/non' description="Créer le modèle postgis" mode='expert'/> + </family> + <separators> + <separator name='pg_activer_postgis'>Modèle de base géographique</separator> + </separators> + </variables> + + <constraints> + <check name='valid_enum' target='pg_additional_db_template'> + <param>['postgres', 'postgis']</param> + <param name='checkval'>False</param> + </check> + <condition name='disabled_if_in' source='pg_activer_postgis'> + <param>non</param> + <target type='filelist'>postgis</target> + </condition> + </constraints> + <help> + <variable name='pg_activer_postgis'>Déclencher la création d'un template template_postgis avec activation de l'extension spatiale postgis utilisable pour créer des bases spatiales.</variable> + </help> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgis/files/usr/share/eole/postgres/postgis/gen/create_database.sql b/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgis/files/usr/share/eole/postgres/postgis/gen/create_database.sql new file mode 100644 index 0000000000000000000000000000000000000000..d27789cb3901d235ab7f0b066163945dff22b3ec --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgis/files/usr/share/eole/postgres/postgis/gen/create_database.sql @@ -0,0 +1 @@ +CREATE DATABASE template_postgis TEMPLATE template0 ENCODING 'UTF8'; diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgis/files/usr/share/eole/postgres/postgis/gen/load_extensions.sql b/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgis/files/usr/share/eole/postgres/postgis/gen/load_extensions.sql new file mode 100644 index 0000000000000000000000000000000000000000..fc68b7238df931d5d45faa6880922a14f3c38352 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgis/files/usr/share/eole/postgres/postgis/gen/load_extensions.sql @@ -0,0 +1,2 @@ +CREATE EXTENSION IF NOT EXISTS postgis; +CREATE EXTENSION IF NOT EXISTS postgis_topology; diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgis/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgis/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..bed427faa9353c43f7137c5c6b88dbaea505a6f0 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgis/service.yml @@ -0,0 +1,33 @@ +format: '0.1' +name: eole-postgis +version: |- + 2.7.0-3 +description: |- + Configuration EOLE pour le service PostgreSQL + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: + - eole-postgresql + - eole-db +packages: [] +dictionaries: + - 23_postgis.xml +extra_dictionaries: {} +templates: + - template_postgis.yml +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: [] +files: + /usr/share/eole/postgres/postgis/gen/create_database.sql: + owner: root + group: root + mode: '0644' + /usr/share/eole/postgres/postgis/gen/load_extensions.sql: + owner: root + group: root + mode: '0644' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgis/templates/template_postgis.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgis/templates/template_postgis.yml new file mode 100644 index 0000000000000000000000000000000000000000..81624ab27bfd261f8168b591f9d7bbb0a0827ae7 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgis/templates/template_postgis.yml @@ -0,0 +1,7 @@ +dbuser: postgis +dbpass: toor +dbname: template_postgis +dbtype: postgres +createscript: '/usr/share/eole/postgres/postgis/gen/create_database.sql' +sqlscripts: ['/usr/share/eole/postgres/postgis/gen/load_extensions.sql'] +is_template: True diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgresql/creole_funcs/pg_funcs.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgresql/creole_funcs/pg_funcs.py new file mode 100644 index 0000000000000000000000000000000000000000..3313a9298cfafe61b18efd34b3701a794d5351d0 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgresql/creole_funcs/pg_funcs.py @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- + + +def pg_valid_object(db_object): + """ + Raise ValueError if db_object does not conform to pattern + :param db_object: postgresql database object identification + :type db_object: unicode + """ + if len(db_object.split('.')) not in [1, 2, 3]: + raise ValueError("L'objet doit être identifié par un chemin complet de type database.schema.table") + + +def pg_valid_perms(perms): + """ + Raise ValueError if perms contains not allowed values. + :param perms: list of permissions + :type perms: unicode + """ + allowed_perms = set(["SELECT", "INSERT", "UPDATE", "DELETE", "TRUNCATE", + "REFERENCES", "TRIGGER", "CREATE", "CONNECT", + "TEMPORARY", "TEMP", "EXECUTE", "USAGE", "ALL"]) + perms = set([p.upper() for p in perms.split()]) + if not perms.issubset(allowed_perms): + raise ValueError("Permissions farfelues.") + + +def pg_hbalize(perms): + """ + Return perms as access rules in pg_hba.conf format + :param perms: permissions information + :type perms: creole.template.CreoleMaster + """ + from itertools import product + source_ip = perms.slave['pg_role_perms_source_ip'] + source_netmask = perms.slave['pg_role_perms_source_netmask'] + role = perms.slave['pg_role_perms_name'] + db = perms.slave['pg_role_perms_object'].split('.')[0] + + db = db if db != "*" else "all" + if source_ip == '127.0.0.1': + mode = "local" + source_ip = None + source_netmask = None + else: + mode = "host" + + parameters = list(product(*[p.split('|') for p in (mode, db, role, source_ip, source_netmask, 'md5') + if p is not None])) + return '\n'.join(['\t'.join(parameter) for parameter in parameters]) + +def pg_listen_all(perms): + """ + Return True if perms has ip different of localhost or 127.0.0.1 + :param perms: list of permissions + :type perms: list of creole.template.CreoleMaster + """ + local_ip = ['127.0.0.1'] + source_ip = [perm.slave['pg_role_perms_source_ip'] + for perm in perms + if perm.slave['pg_role_perms_source_ip'] not in local_ip] + return len(source_ip) != 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgresql/dictionaries/22_postgresql.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgresql/dictionaries/22_postgresql.xml new file mode 100644 index 0000000000000000000000000000000000000000..0ecd2459bbdc0d69953726febd72c7de7ffffae1 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgresql/dictionaries/22_postgresql.xml @@ -0,0 +1,256 @@ +<?xml version="1.0" encoding="utf-8"?> +<creole> + <files> + <file filelist='postgresql' name='/etc/bareos/bareosfichiers.d/postgresql.conf' source='bareos_postgresql.conf' mkdir='True'/> + <file filelist='eoledb' name='/etc/eole/eole-db.d/postgresql_databases.yml'/> + <service_access service='postgresql'> + <port>5432</port> + <tcpwrapper>postgresql</tcpwrapper> + </service_access> + </files> + <containers> + <container name='postgresql' id='11'> + <file filelist='postgresql' name='/etc/postgresql/10/main/postgresql.conf' del_comment='#'/> + <file filelist='postgresql' name='/etc/postgresql/10/main/pg_hba.conf'/> + <file filelist='postgresql' name='/etc/postgresql/10/main/pg_ident.conf'/> + <service servicelist='postgresql'>postgresql</service> + <package>eole-postgresql-pkg</package> + </container> + </containers> + + <variables> + + <family name='services'> + <variable name='activer_postgresql' type='oui/non' description='Activer le serveur de bases de données PostgreSQL'> + <value>oui</value> + </variable> + </family> + + <family name='postgresql' mode='expert' icon='postgres'> + + <variable name='pg_additional_db' type='oui/non' description="Bases de données PostgreSQL supplémentaires"> + <value>non</value> + </variable> + <variable name='pg_additional_db_name' type='string' description="Nom de la base de données supplémentaire" mandatory='True' multi='True' mode='expert'/> + <variable name='pg_additional_db_template' type='string' description="Modèle de base de données" mode='expert' mandatory='True'/> + <variable name='pg_additional_db_admin' type='string' description="Administrateur de la base de données" mode='expert'> + <value>postgres</value> + </variable> + <variable name='pg_additional_db_admin_createrole' type='oui/non' description='Donner le droit de créer des rôles à l’administrateur de la base'> + <value>non</value> + </variable> + <variable name='pg_additional_db_admin_superuser' type='oui/non' description='Donner le role superuser à l’administrateur de la base'> + <value>non</value> + </variable> + <variable name='pg_additional_db_admin_login' type='oui/non' description='Il s agit d un role de connexion'> + <value>oui</value> + </variable> + + <variable name='pg_additional_role' type='oui/non' description="Créer des rôles" mode='expert'> + <value>non</value> + </variable> + <variable name='pg_additional_role_name' type='string' description="Nom du rôle" multi='True' mandatory='True' mode='expert'/> + <variable name='pg_additional_role_createrole' type='oui/non' description='Donner le droit de créer des rôles au rôle courant'> + <value>non</value> + </variable> + <variable name='pg_additional_role_superuser' type='oui/non' description='Donner le role superuser au role courant'> + <value>non</value> + </variable> + <variable name='pg_additional_role_login' type='oui/non' description='Il s agit d un role de connexion'> + <value>oui</value> + </variable> + <variable name='pg_additional_role_pwd' type='string' description="Gestion du mot de passe" mandatory='True' mode='expert'> + <value>auto</value> + </variable> + <variable name='set_pg_role_perms' type='oui/non' description="Paramétrer des permissions pour les rôles" mandatory='True' mode='expert'> + <value>non</value> + </variable> + <variable name='pg_role_perms' type='string' description="Permissions des rôles" multi='True' mandatory='True' mode='expert'/> + <variable name='pg_role_perms_name' type='string' description="Rôle affecté par les permissions" mandatory='True' mode='expert'/> + <variable name='pg_role_perms_object' type='string' description="Objet cible des permissions" mandatory='True' mode='expert'/> + <variable name='pg_role_perms_source_ip' type='ip' description="IP/réseau source de connexion" mandatory='True' mode='expert'/> + <variable name='pg_role_perms_source_netmask' type='netmask' description="Netmask" mandatory='True' mode='expert'/> + <variable name='pg_role_perms_hba_only' type='oui/non' description='Permission uniquement définie pour l’accès au serveur' mode='expert'> + <value>non</value> + </variable> + + <variable name='pg_max_connections' type='number' description='Nombre maximum de connexions'> + <value>100</value> + </variable> + <variable name='pg_authentication_timeout' type='number' description='Délai de connexion maximum (en secondes)'> + <value>60</value> + </variable> + <variable name='pg_server_key' type='filename' description="Emplacement de la clé SSL du serveur PostgreSQL" mode='expert'> + <value>/etc/postgresql/10/main/server.key</value> + </variable> + <variable name='pg_server_cert' type='filename' description="Emplacement du certificat du serveur PostgreSQL" mode='expert'> + <value>/etc/postgresql/10/main/server.crt</value> + </variable> + <variable name='pg_data_directory' type='filename' description="Répertoire contenant les bases de données PostgreSQL"> + <value>/var/lib/postgresql/10/main</value> + </variable> + + <variable name='pg_custom_backup_script' type='filename' description="Chemin du script de sauvegarde personnalisé"/> + <variable name='pg_custom_bs_param_name' type='string' description="Paramètre pour le script" multi='True'/> + <variable name='pg_custom_bs_param_value' type='string' description='Valeur pour le paramètre' multi='True'/> + <variable name='pg_custom_bs_database' type='string' description='Base de données à sauvegarder' multi='True'/> + + <variable name='pg_work_mem' type='number' description="Mémoire tampon allouée aux opérations de tri et tables de hash" mode='expert'> + <value>4</value> + </variable> + <variable name='pg_work_mem_unit' type='string' description='Unité de la mémoire tampon' mode='expert'> + <value>MB</value> + </variable> + <variable name='pg_maintenance_work_mem' type='number' description="Mémoire tampon allouée pour les opérations de maintenance" mode='expert'> + <value>64</value> + </variable> + <variable name='pg_maintenance_work_mem_unit' type='string' description='Unité de la mémoire tampon' mode='expert'> + <value>MB</value> + </variable> + <variable name='pg_wal_buffers' type='number' description="Mémoire tampon allouée pour les journaux" mode='expert'> + <value>-1</value> + </variable> + <variable name='pg_max_wal_size' type='number' description="Limite douce du Write Ahead Log" mode='expert'> + <value>1</value> + </variable> + <variable name='pg_max_wal_size_unit' type='string' description="Unité de la limite douce du Write Ahead Log"> + <value>GB</value> + </variable> + <variable name='pg_shared_buffers' type='number' description='Quantité de mémoire pour les buffers partagés'> + <value>128</value> + </variable> + <variable name='pg_shared_buffers_unit' type='string' description='Unité de la quantité de mémoire pour les buffers partagés'> + <value>MB</value> + </variable> + <variable name='pg_effective_cache_size' type='number' description='Taille du cache (blocs de 8ko)' mandatory='True'/> + <variable name='pg_effective_cache_size_unit' type='string' description='Unité de la taille du cache'> + <value>kB</value> + </variable> + + </family> + + <separators> + <separator name='pg_additional_db'>Gestion des bases et utilisateurs</separator> + <separator name='pg_roles_perms'>Permissions</separator> + <separator name='pg_custom_backup_script'>Méthode de sauvegarde personnalisée</separator> + <separator name='pg_work_mem'>Optimisation</separator> + </separators> + + </variables> + + <constraints> + <check name='valid_enum' target='pg_additional_db_template'> + <param>['postgres']</param> + <param name='checkval'>False</param> + </check> + <check name="valid_enum" target="pg_additional_role_pwd"> + <param>['auto', 'manuelle']</param> + </check> + <check name='pg_valid_object' target='pg_role_perms_object'/> + <!-- <check name='pg_valid_perms' target='pg_role_perms'/> passage de la variable maître problèmatique--> + <check name="valid_enum" target="pg_shared_buffers_unit"> + <param>['MB','kB']</param> + </check> + <check name="valid_enum" target="pg_effective_cache_size_unit"> + <param>['MB','kB']</param> + </check> + <check name="valid_enum" target="pg_max_wal_size_unit"> + <param>['GB','MB','kB']</param> + </check> + <check name="valid_enum" target="pg_work_mem_unit"> + <param>['MB','kB']</param> + </check> + <check name="valid_enum" target="pg_maintenance_work_mem_unit"> + <param>['MB','kB']</param> + </check> + <fill name='calc_pg_cache_size' target='pg_effective_cache_size'/> + <condition name='disabled_if_in' source='activer_postgresql'> + <param>non</param> + <target type='filelist'>postgresql</target> + <target type='servicelist'>postgresql</target> + <target type='family'>postgresql</target> + </condition> + <condition name='disabled_if_in' source='activer_eoledb' fallback='True'> + <param>non</param> + <target type='filelist'>eoledb</target> + <target>pg_additional_db</target> + <target>pg_additional_role</target> + </condition> + <condition name='disabled_if_in' source='pg_additional_db'> + <param>non</param> + <target>pg_additional_db_name</target> + <target>pg_additional_db_template</target> + <target>pg_additional_db_admin</target> + </condition> + <group master='pg_additional_db_name'> + <slave>pg_additional_db_template</slave> + <slave>pg_additional_db_admin</slave> + <slave>pg_additional_db_admin_createrole</slave> + <slave>pg_additional_db_admin_superuser</slave> + <slave>pg_additional_db_admin_login</slave> + </group> + <condition name='disabled_if_in' source='pg_additional_role'> + <param>non</param> + <target>pg_additional_role_name</target> + <target>pg_additional_role_createrole</target> + <target>pg_additional_role_pwd</target> + <target>pg_additional_role_superuser</target> + <target>set_pg_role_perms</target> + </condition> + <condition name='disabled_if_in' source='set_pg_role_perms'> + <param>non</param> + <target>pg_role_perms</target> + <target>pg_role_perms_name</target> + <target>pg_role_perms_object</target> + <target>pg_role_perms_source_ip</target> + <target>pg_role_perms_source_netmask</target> + <target>pg_role_perms_hba_only</target> + </condition> + <group master='pg_additional_role_name'> + <slave>pg_additional_role_createrole</slave> + <slave>pg_additional_role_pwd</slave> + <slave>pg_additional_role_superuser</slave> + <slave>pg_additional_role_login</slave> + </group> + <group master='pg_role_perms'> + <slave>pg_role_perms_name</slave> + <slave>pg_role_perms_object</slave> + <slave>pg_role_perms_source_ip</slave> + <slave>pg_role_perms_source_netmask</slave> + <slave>pg_role_perms_hba_only</slave> + </group> + <group master='pg_custom_bs_param_name'> + <slave>pg_custom_bs_param_value</slave> + </group> + </constraints> + + <help> + <variable name='activer_postgresql'>PostgreSQL est un système de gestion de base de données relationnelle et objet</variable> + <family name='postgresql'>Paramétrage avancé du serveur de gestion de bases de données PostgreSQL</family> + <variable name='pg_additional_db'>Déclaration de bases de données sans configuration eole-db</variable> + <variable name='pg_additional_db_name'>Nom de la base de données (doit être unique dans le cluster)</variable> + <variable name='pg_additional_db_admin'>Propriétaire de la base de données PostgreSQL (ne nécessite pas la déclaration spécifique de droits)</variable> + <variable name='pg_additional_db_template'>Modèle de base de données servant à créer la base</variable> + <variable name='pg_additional_role'>Déclaration de rôles dans PostgreSQL</variable> + <variable name='pg_additional_role_name'>Nom du rôle (doit être unique, insensible à la casse)</variable> + <variable name='pg_additional_role_pwd'>Mode de gestion du mot de passe (renouvelé automatiquement au reconfigure si auto)</variable> + <variable name='pg_role_perms'>Permissions à appliquer pour un rôle donné, sous la forme d'une série des termes parmi SELECT INSERT UPDATE DELETE TRUNCATE REFERENCES TRIGGER CREATE CONNECT TEMPORARY TEMP EXECUTE USAGE ALL (séparation par espace).</variable> + <variable name='pg_role_perms_name'>Rôle affecté par les permissions (seuls les rôles existants dans PostgreSQL sont traités)</variable> + <variable name='pg_role_perms_object'>Objet (base, schema, table) sur lequel porte les permissions identifier par son nom complet de type database[.schema[.table]] (utiliser * pour ne pas spécifier le schéma ou la table, la base devant être spécifiée). Pour chaque niveau, plusieurs membres peuvent être déclarés en les séparant par le caractère "|" (par ex. base1|base2.public.table1|table2)</variable> + <variable name='pg_role_perms_source_ip'>Adresse IP pour restreindre le domaine d'accès d'un rôle (all si 0.0.0.0 avec un netmask identique, local si 127.0.0.1)</variable> + <variable name='pg_role_perms_hba_only'>La permissions servira uniquement à remplir le fichier pg_hba.conf et pas à créer les permissions dans les bases de données</variable> + <variable name='pg_max_connections'>Nombre maximum de connexions concurrentes au serveur de base de données</variable> + <variable name='pg_authentication_timeout'>Temps maximum pour terminer l'authentification du client</variable> + <variable name='pg_data_directory'>Répertoire à utiliser pour l'entrepôt de données</variable> + <variable name='pg_work_mem'>Quantité de mémoire allouée à chaque opération avant écriture sur le disque (par défaut : 4MB)</variable> + <variable name='pg_maintenance_work_mem'>Quantité de mémoire allouée à chaque opération avant écriture sur le disque (par défaut : 64MB, minimum: 1024kB)</variable> + <variable name='pg_wal_buffers'>Quantité de mémoire allouée avant écriture sur le disque (par défaut : -1, soit 1/32ème de la valeur de shared_buffers)</variable> + <variable name='pg_max_wal_size'>Limite douce pour le Write Ahead Log</variable> + <variable name='pg_shared_buffers'>Quantité de mémoire que le serveur de bases de données utilise comme mémoire partagée</variable> + <variable name='pg_effective_cache_size'>Initialise l'estimation faite par le planificateur de la taille réelle du cache disque disponible pour une requête</variable> + <variable name='pg_custom_backup_script'>Emplacement du script de sauvegarde personnalisé prenant le pas sur la sauvegarde 'normal' des bases de données spécifiées</variable> + <variable name='pg_custom_bs_param_name'>Nom du paramètre à fournir au script de sauvegarde</variable> + <variable name='pg_custom_bs_param_value'>Valeur à fournir au script pour le paramètre parent</variable> + <variable name='pg_custom_bs_database'>Nom de base de données à sauvegarder via le script personnalisé (exclut cette base de la gestion des sauvegardes EOLE</variable> + </help> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgresql/extra_dictionaries/schedule/01_postgresql.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgresql/extra_dictionaries/schedule/01_postgresql.xml new file mode 100644 index 0000000000000000000000000000000000000000..e87ed9b7fb07631901694d8203ee5e1bc6467723 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgresql/extra_dictionaries/schedule/01_postgresql.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + <variables> + <family name='postgresql'> + <variable name="description" type="string"><value>Exportation des bases PostgreSQL</value></variable> + <variable name="day" type="schedule"></variable> + <variable name="mode" type="schedulemod"><value>pre</value></variable> + </family> + </variables> + <constraints> + <fill name='calc_multi_condition' target='schedule.postgresql.day'> + <param>non</param> + <param type='eole' name='condition_1'>activer_postgresql</param> + <param name='match'>none</param> + <param name='mismatch'>daily</param> + </fill> + </constraints> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgresql/files/usr/share/eole/bareos/restore/postgresql.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgresql/files/usr/share/eole/bareos/restore/postgresql.py new file mode 100644 index 0000000000000000000000000000000000000000..1f9c6764efd7a58e60eaef3d42eb604207899aa6 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgresql/files/usr/share/eole/bareos/restore/postgresql.py @@ -0,0 +1,119 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +"""Module postgresql""" +from os.path import join, isfile +from os import listdir +import os +import re +import pwd +import sys +import shlex +import shutil +import tempfile +from subprocess import check_call, check_output +sys.path.append('/usr/share/eole/sbin') +from pyeole.bareosrestore import bareos_restore_one_folder, \ + bareos_restore_one_file, exit_if_running_jobs +from creole.client import CreoleClient + +PGSQLSAVDIR = '/home/backup/postgresql' +PGSQL_HOST = CreoleClient().get_creole('container_ip_postgresql') +PGSQL_HOST_OPTION = "-h {}".format(PGSQL_HOST) if PGSQL_HOST != '127.0.0.1' else "" +BACKUP_RE = re.compile(r'(?P<database>.*?).backup'.format(PGSQLSAVDIR)) +PGDM_MAGIC = 'PGDM' + +def demote(uid, gid): + """ + Switch user and group + :param uid: user id + :type uid: int + :param gid: group id + :type gid: int + """ + def set_ids(): + os.setgid(gid) + os.setuid(uid) + return set_ids + + +def load_file_into_pg_db(filename, clean=False, create=False): + """ + Load given file in database to restore content. + :param filename: database dump to restore + :type filename: str + :param database: target database + :type database: str + :param clean: flag for clean option to drop database before loading + :type clean: boolean + :param create: flag for create option to create database before loading + :type create: boolean + """ + uid = pwd.getpwnam('postgres').pw_uid + gid = pwd.getpwnam('postgres').pw_gid + temp_filename = tempfile.mktemp(dir='/tmp') + shutil.copy(filename, temp_filename) + os.chown(temp_filename, uid, gid) + with open(filename, 'rb') as bin_file: + magic_number = bin_file.read(4) + if magic_number == PGDM_MAGIC: + options = [] + options.append('-c' if clean else '') + options.append('-C' if create else '') + options = ' '.join(options) + cmd = "pg_restore {0} {1}".format(options, temp_filename) + result = check_output(shlex.split(cmd), + preexec_fn=demote(uid, gid)) + with open(temp_filename, 'w') as sql: + sql.write(result) + cmd = "psql -f {0}".format(temp_filename) + try: + with open(os.devnull) as devnull: + code = check_call(shlex.split(cmd), + stdout=devnull, + stderr=devnull, + preexec_fn=demote(uid, gid)) + finally: + os.unlink(temp_filename) + + +def execute(option, opt_str, value, parser, jobid, test_jobs=True): + """ldap helper""" + if len(parser.rargs) > 0: + option = parser.rargs[0] + if option == 'pre': + pre() + elif option == 'post': + post() + else: + if test_jobs: + exit_if_running_jobs() + job(jobid) + + +def pre(): + print "pre postgresql" + + +def post(databases=None): + """ + Load backup into database cluster + :param databases: list of databases to restore (all if none listed) + :type databases: list + """ + print "post postgresql" + if databases is None: + databases = [backup for backup in listdir(PGSQLSAVDIR) + if isfile(join(PGSQLSAVDIR, backup)) and + BACKUP_RE.match(backup)] + databases.sort() + for backup in [join(PGSQLSAVDIR, database) for database in databases]: + print "restauration de {0}".format(backup) + load_file_into_pg_db(backup, clean=True, create=True) + + +def job(jobid): + print "Restauration postgressql" + # restauration des dumps sql + bareos_restore_one_folder(PGSQLSAVDIR, jobid) + +priority = 30 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgresql/files/usr/share/eole/certs/01_postgresql.gen_cert b/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgresql/files/usr/share/eole/certs/01_postgresql.gen_cert new file mode 100644 index 0000000000000000000000000000000000000000..fbe2043fdad1604326d187ca5ab413e9530ef20d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgresql/files/usr/share/eole/certs/01_postgresql.gen_cert @@ -0,0 +1,13 @@ +if client.get_creole('activer_postgresql') == 'oui': + pg_server_cert = client.get_creole('pg_server_cert') + pg_server_key = client.get_creole('pg_server_key') + if not os.path.isfile(pg_server_cert): + gen_certif(certfile=pg_server_cert, keyfile=pg_server_key, + cert_user='postgres', cert_grp='postgres', cert_chmod='0640', + key_user='postgres', key_grp='postgres', key_chmod='0600') + + chain = get_intermediate_certs(pg_server_cert) + chain.insert(0, pg_server_cert) + pg_server_ca_chain = splitext(pg_server_cert)[0] + '_ca-chain.crt' + concat_fic(pg_server_ca_chain, chain, True) + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgresql/files/usr/share/eole/diagnose/151-postgresql b/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgresql/files/usr/share/eole/diagnose/151-postgresql new file mode 100644 index 0000000000000000000000000000000000000000..ec67e8ec575badbdfe5ede31b07364d550794c53 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgresql/files/usr/share/eole/diagnose/151-postgresql @@ -0,0 +1,9 @@ +#!/bin/bash + +if [ $(CreoleGet activer_postgresql) = "oui" ];then + . /usr/lib/eole/diagnose.sh + EchoGras "*** Bases de données" + TestPid PostgreSQL postgres + echo +fi +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgresql/files/usr/share/eole/sbin/pg_pwd.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgresql/files/usr/share/eole/sbin/pg_pwd.py new file mode 100644 index 0000000000000000000000000000000000000000..4db9ae22019096b02b42bbe5d3de01d007dfc18e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgresql/files/usr/share/eole/sbin/pg_pwd.py @@ -0,0 +1,107 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import yaml +import argparse +from os import listdir, devnull +from os.path import join +import re +import getpass +from subprocess import check_call +import shlex +import operator +from creole.utils import gen_random + + +CONF_FILE_RE = re.compile(r'^.*\.yml$') +DEFAULT_ROLE_FILTERS = {'pwd_mode': 'manuelle' , + 'dbtype': 'postgres'} + + +def gen_password(): + """ + Return random password + """ + return gen_random() + + +def get_roles(conf_path, role_filters=DEFAULT_ROLE_FILTERS): + """ + Return list of role matching given filter + :param conf_path: path of configuration file + :type conf: str + :param role_filter: filter with key and value to match + :type role_filter: dict + """ + with open(conf_path, 'r') as conf_stream: + conf = yaml.load(conf_stream) + if conf is not None and 'additional_roles' in conf: + roles = [role for role in conf['additional_roles'] + if reduce(operator.and_, [conf['additional_roles'][role].get(key, False) == value for key, value in role_filters.iteritems()])] + else: + roles = [] + return roles + + +def change_password(role): + """ + Execute ALTER ROLE sql command for role with generated password or password + input by user + :param role: name of the role + :type role: str + """ + print "Changement du mot de passe pour {}".format(role) + if is_validated(raw_input("Générer un mot de passe aléatoire ?")): + password = gen_password() + else: + password = getpass.getpass('Mot de passe pour le role {} :'.format(role)) + sql = "ALTER ROLE {0} WITH PASSWORD '{1}';".format(role, password) + cmd = 'psql -U postgres -c "{0}" '.format(sql) + with open(devnull, 'w') as dev_null: + code = check_call(shlex.split(cmd), + stdout=dev_null, + stderr=dev_null) + if code == 0: + return (role, password) + else: + return (role, None) + + +def is_validated(user_input): + """ + Return True if user_input is considered positive answer. + :param user_input: user input + :type user_input: str + """ + return user_input.lower() in ['yes', 'oui', 'y', 'o'] + + +def main(): + arg_parser = argparse.ArgumentParser(description='EOLE PostgreSQL role password manager') + arg_parser.add_argument('-c', '--config', metavar='CONFIG_FILE', + default='/etc/eole/eole-db.conf', + help='eole database configuration file)') + arg_parser.add_argument('-d', '--dbdir', metavar='DB_CONFIG_DIR', + default='/etc/eole/eole-db.d/', + help='eole database configuration directory)') + arg_parser.add_argument('-r', '--report', action='store_true', default=False, + help="afficher les couples role, mot de passe modifiés à la sortie du programme") + + args = arg_parser.parse_args() + + roles = [] + for conf_path in listdir(args.dbdir): + if CONF_FILE_RE.match(conf_path): + roles.extend(get_roles(join(args.dbdir, conf_path))) + + passwords = [] + for role in roles: + if is_validated(raw_input("Voulez-vous changer le mot de passe pour le rôle {} ?".format(role))): + passwords.append(change_password(role)) + len_pwd = len(passwords) + print "{0} mot{1} de passe modifié{1}".format(len_pwd, '' if len_pwd < 2 else 's') + if args.report is True: + print '\n'.join(['\t'.join(password) for password in passwords]) + +if __name__ == '__main__': + main() diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgresql/files/usr/share/eole/schedule/scripts/postgresql b/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgresql/files/usr/share/eole/schedule/scripts/postgresql new file mode 100644 index 0000000000000000000000000000000000000000..2812dcab2f5c67a8a9397cc0d62de22ac5672ca2 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgresql/files/usr/share/eole/schedule/scripts/postgresql @@ -0,0 +1,77 @@ +#!/bin/bash + +set -e + +DESC="Exportation des bases PostgreSQL" +PG_USER="postgres" + +. /usr/share/eole/schedule/config.sh + +function RunAs() +{ + user=${1} + cmd=${2} + su - ${user} -c "${cmd}" + return ${?} +} + +function RcPwd() +{ + if [ -f /root/.pgpass ] + then + PG_PWD=$(cat /root/.pgpass | grep $PG_USER) + RunAs ${PG_USER} "echo '$PG_PWD' > ~/.pgpass" + RunAs ${PG_USER} "chmod 600 ~/.pgpass" + fi +} + + + +# Defining database host parameter +dbhost=$(CreoleGet container_ip_postgresql) +if [ "$dbhost" = '127.0.0.1' ] +then + dbhost='' +else + dbhost="-h $dbhost" +fi + +# backup folder +POSTGRESQLSAVDIR=$SAVDIR/postgresql +rm -f $POSTGRESQLSAVDIR/* +mkdir -p $POSTGRESQLSAVDIR + +#Store PG_USER password, if exists +RcPwd + +# listing databases to backup +locked_templates='template0 template1' +excluded_databases="$(CreoleGet pg_custom_bs_database)" +templates_names=$(RunAs ${PG_USER} "psql -c \"SELECT datname FROM pg_database WHERE datistemplate = '1';\" -t postgres postgres") +db_names=$(RunAs ${PG_USER} "psql -c \"SELECT datname FROM pg_database WHERE datistemplate = '0';\" -t postgres postgres") + +# dumping databases +# cluster data first with 00- prefixed name to "ensure" restoration in first place +RunAs ${PG_USER} "pg_dumpall -U postgres $dbhost --globals-only" > ${POSTGRESQLSAVDIR}/00-cluster-wide-data.backup +# templates +for locked_template in $locked_templates +do + templates_names=${templates_names/$locked_template/} +done +for template_name in $templates_names +do + RunAs ${PG_USER} "pg_dump -Fc $dbhost -U postgres -w -d $template_name" > ${POSTGRESQLSAVDIR}/${template_name}.backup +done +# databases +for excluded_database in $excluded_databases +do + db_names=${db_names/$excluded_database/} +done +for db_name in $db_names +do + RunAs "${PG_USER}" "pg_dump -Fc $dbhost -U postgres -w -d $db_name" > ${POSTGRESQLSAVDIR}/${db_name}.backup +done + +RunAs ${PG_USER} "rm -f ~/.pgpass" + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgresql/files/usr/share/zephir/monitor/configs/services/20_postgresql.srv b/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgresql/files/usr/share/zephir/monitor/configs/services/20_postgresql.srv new file mode 100644 index 0000000000000000000000000000000000000000..fb94a907908cae8d7f7977e1986c33a97fd6c772 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgresql/files/usr/share/zephir/monitor/configs/services/20_postgresql.srv @@ -0,0 +1,13 @@ +# -*- coding: UTF-8 -*- +""" +Surveillance du service Postgresql +""" + +from zephir.monitor.agents.services import PIDService +from zephir.monitor.agentmanager.config import ACTIVER_POSTGRESQL + +if ACTIVER_POSTGRESQL: + data = {'postgres' : "Base de données (PostgreSQL)"} + AGENTS.append(PIDService('postgresql', data, period=115, + description="Etat du serveur de bases de données (PostgreSQL)")) + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgresql/pretemplates/03-eole-postgresql b/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgresql/pretemplates/03-eole-postgresql new file mode 100644 index 0000000000000000000000000000000000000000..b8f3173d8a5bbeb82e7747a8e351ceeb7f70ddde --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgresql/pretemplates/03-eole-postgresql @@ -0,0 +1,30 @@ +#!/bin/bash + +activer_postgresql="$(CreoleGet activer_postgresql)" +pg_data_directory="$(CreoleGet pg_data_directory)" + +if [ "$activer_postgresql" = "oui" ];then + if [ "$pg_data_directory" != "/var/lib/postgresql/10/main" ];then + if [ ! -d "$pg_data_directory" ]; then + mkdir -p $pg_data_directory + chown postgres:postgres $pg_data_directory + chmod 700 $pg_data_directory + else + chown postgres:postgres $pg_data_directory + chmod 700 $pg_data_directory + fi + acces=$(su postgres -c "ls -al $pg_data_directory") + testacces=$? + if [ $testacces -ne 0 ] + then + echo "L utilisateur postgresql n a pas le droit d'atteindre le dossier $pg_data_directory ! arrêt de la procedure" + exit 1 + fi + nbFic=$(ls -a /var/lib/postgresql/10/main/ |sed -e "/\.$/d"|wc -l) + if [ $nbFic -ne 0 ]; then + mv /var/lib/postgresql/10/main/* $pg_data_directory + fi + fi +fi +exit 0 + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgresql/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgresql/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..f90399c9b9756e236344a9bdbb974edbde24caf4 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgresql/service.yml @@ -0,0 +1,55 @@ +format: '0.1' +name: eole-postgresql +version: |- + 2.7.0-3 +description: |- + Configuration EOLE pour le service PostgreSQL + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: [] +packages: [] +dictionaries: + - 22_postgresql.xml +extra_dictionaries: + schedule: + - 01_postgresql.xml +templates: + - bareos_postgresql.conf + - pg_hba.conf + - pg_ident.conf + - postgresql.conf + - postgresql_databases.yml +creole_funcs: + - pg_funcs.py +preservices: [] +postservices: [] +pretemplates: + - 03-eole-postgresql +posttemplates: [] +files: + /usr/share/eole/bareos/restore/postgresql.py: + owner: root + group: root + mode: '0644' + /usr/share/eole/certs/01_postgresql.gen_cert: + owner: root + group: root + mode: '0644' + /usr/share/eole/diagnose/151-postgresql: + owner: root + group: root + mode: '0755' + /usr/share/eole/sbin/pg_pwd.py: + owner: root + group: root + mode: '0755' + /usr/share/eole/schedule/scripts/postgresql: + owner: root + group: root + mode: '0755' + /usr/share/zephir/monitor/configs/services/20_postgresql.srv: + owner: root + group: root + mode: '0644' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgresql/templates/bareos_postgresql.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgresql/templates/bareos_postgresql.conf new file mode 100644 index 0000000000000000000000000000000000000000..4fd0167a7423df983bb3d46ce05949b3f926db6f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgresql/templates/bareos_postgresql.conf @@ -0,0 +1,10 @@ +# fichiers pour postgresql +%if %%getVar('pg_custom_backup_script', None) is not None +Include { + Options { + aclsupport = no + @/etc/bareos/include-options.conf + } + File = %%pg_custom_backup_script +} +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgresql/templates/pg_hba.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgresql/templates/pg_hba.conf new file mode 100644 index 0000000000000000000000000000000000000000..c5778de902d916dd48007c55f43e92871b46782d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgresql/templates/pg_hba.conf @@ -0,0 +1,89 @@ +# PostgreSQL Client Authentication Configuration File +# =================================================== +# +# Refer to the PostgreSQL Administrator's Guide, chapter "Client +# Authentication" for a complete description. A short synopsis +# follows. +# +# This file controls: which hosts are allowed to connect, how clients +# are authenticated, which PostgreSQL user names they can use, which +# databases they can access. Records take one of these forms: +# +# local DATABASE USER METHOD [OPTION] +# host DATABASE USER CIDR-ADDRESS METHOD [OPTION] +# hostssl DATABASE USER CIDR-ADDRESS METHOD [OPTION] +# hostnossl DATABASE USER CIDR-ADDRESS METHOD [OPTION] +# +# (The uppercase items must be replaced by actual values.) +# +# The first field is the connection type: "local" is a Unix-domain socket, +# "host" is either a plain or SSL-encrypted TCP/IP socket, "hostssl" is an +# SSL-encrypted TCP/IP socket, and "hostnossl" is a plain TCP/IP socket. +# +# DATABASE can be "all", "sameuser", "samerole", a database name, or +# a comma-separated list thereof. +# +# USER can be "all", a user name, a group name prefixed with "+", or +# a comma-separated list thereof. In both the DATABASE and USER fields +# you can also write a file name prefixed with "@" to include names from +# a separate file. +# +# CIDR-ADDRESS specifies the set of hosts the record matches. +# It is made up of an IP address and a CIDR mask that is an integer +# (between 0 and 32 (IPv4) or 128 (IPv6) inclusive) that specifies +# the number of significant bits in the mask. Alternatively, you can write +# an IP address and netmask in separate columns to specify the set of hosts. +# +# METHOD can be "trust", "reject", "md5", "crypt", "password", +# "krb5", "ident", or "pam". Note that "password" sends passwords +# in clear text; "md5" is preferred since it sends encrypted passwords. +# +# OPTION is the ident map or the name of the PAM service, depending on METHOD. +# +# Database and user names containing spaces, commas, quotes and other special +# characters must be quoted. Quoting one of the keywords "all", "sameuser" or +# "samerole" makes the name lose its special character, and just match a +# database or username with that name. +# +# This file is read on server startup and when the postmaster receives +# a SIGHUP signal. If you edit the file on a running system, you have +# to SIGHUP the postmaster for the changes to take effect. You can use +# "pg_ctl reload" to do that. + +# Put your actual configuration here +# ---------------------------------- +# +# If you want to allow non-local connections, you need to add more +# "host" records. In that case you will also need to make PostgreSQL listen +# on a non-local interface via the listen_addresses configuration parameter, +# or via the -i or -h command line switches. +# + +# CAUTION: Configuring the system for local "trust" authentication allows +# any local user to connect as any PostgreSQL user, including the database +# superuser. If you do not trust all your local users, use another +# authentication method. + + +# TYPE DATABASE USER CIDR-ADDRESS METHOD + +# "local" is for Unix domain socket connections only +%if %%getVar('mode_conteneur_actif', 'non') == 'oui' +host all postgres %%adresse_ip_br0/32 ident map=pg_map +host all all %%adresse_ip_br0/32 password +%else +local all postgres ident map=pg_map +local all all password +host all all 127.0.0.1/32 password +%end if +# IPv4 local connections: +# IPv6 local connections: +# host all all ::1/128 password +# distant_users +local zephir zephir md5 +%if %%getVar('set_pg_role_perms', 'non') == 'oui' +%for %%perms in %%pg_role_perms +%%pg_hbalize(%%perms) +%end for +%end if +# end distant_users diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgresql/templates/pg_ident.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgresql/templates/pg_ident.conf new file mode 100644 index 0000000000000000000000000000000000000000..bfd7b6cf8fc9a73adc15ef7f4083895315ddd7cd --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgresql/templates/pg_ident.conf @@ -0,0 +1,41 @@ +# PostgreSQL User Name Maps +# ========================= +# +# Refer to the PostgreSQL Administrator's Guide, chapter "Client +# Authentication" for a complete description. A short synopsis follows. +# +# This file controls PostgreSQL username mapping. It maps +# external user names to their corresponding +# PostgreSQL user names. Records are of the form: +# +# MAPNAME SYSTEM-USERNAME PG-USERNAME +# +# (The uppercase quantities must be replaced by actual values.) +# +# MAPNAME is the (otherwise freely chosen) map name that was used in +# pg_hba.conf. SYSTEM-USERNAME is the detected user name of the +# client. PG-USERNAME is the requested PostgreSQL user name. The +# existence of a record specifies that SYSTEM-USERNAME may connect as +# PG-USERNAME. +# +# If SYSTEM-USERNAME starts with a slash (/), it will be treated as +# a regular expression. Optionally this can contain a capture (a +# parenthesized subexpression). The substring matching the capture +# will be substituted for \1 (backslash-one) if present in PG-USERNAME. +# +# Multiple maps may be specified in this file and used by pg_hba.conf. +# +# No map names are defined in the default configuration. If all system +# user names and PostgreSQL user names are the same, you don't need +# anything in this file. +# +# This file is read on server startup and when the postmaster receives +# a SIGHUP signal. If you edit the file on a running system, you have +# to SIGHUP the postmaster for the changes to take effect. You can use +# "pg_ctl reload" to do that. + +# Put your actual configuration here +# ---------------------------------- + +# MAPNAME SYSTEM-USERNAME PG-USERNAME +pg_map postgres postgres diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgresql/templates/postgresql.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgresql/templates/postgresql.conf new file mode 100644 index 0000000000000000000000000000000000000000..c91e2415db5f9ce112ec0493c3ce7fc38757b997 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgresql/templates/postgresql.conf @@ -0,0 +1,609 @@ +%compiler-settings +cheetahVarStartToken = §§ +directiveStartToken = § +%end compiler-settings +# ----------------------------- +# PostgreSQL configuration file +# ----------------------------- +# +# This file consists of lines of the form: +# +# name = value +# +# (The "=" is optional.) Whitespace may be used. Comments are introduced with +# "#" anywhere on a line. The complete list of parameter names and allowed +# values can be found in the PostgreSQL documentation. +# +# The commented-out settings shown in this file represent the default values. +# Re-commenting a setting is NOT sufficient to revert it to the default value; +# you need to reload the server. +# +# This file is read on server startup and when the server receives a SIGHUP +# signal. If you edit the file on a running system, you have to SIGHUP the +# server for the changes to take effect, or use "pg_ctl reload". Some +# parameters, which are marked below, require a server shutdown and restart to +# take effect. +# +# Any parameter can also be given as a command-line option to the server, e.g., +# "postgres -c log_connections=on". Some parameters can be changed at run time +# with the "SET" SQL command. +# +# Memory units: kB = kilobytes Time units: ms = milliseconds +# MB = megabytes s = seconds +# GB = gigabytes min = minutes +# h = hours +# d = days + + +#------------------------------------------------------------------------------ +# FILE LOCATIONS +#------------------------------------------------------------------------------ + +# The default values of these variables are driven from the -D command-line +# option or PGDATA environment variable, represented here as ConfigDir. + +data_directory = '§§pg_data_directory' # use data in another directory + # (change requires restart) +hba_file = '/etc/postgresql/10/main/pg_hba.conf' # host-based authentication file + # (change requires restart) +ident_file = '/etc/postgresql/10/main/pg_ident.conf' # ident configuration file + # (change requires restart) + +# If external_pid_file is not explicitly set, no extra PID file is written. +external_pid_file = '/var/run/postgresql/10-main.pid' # write an extra PID file + # (change requires restart) + + +#------------------------------------------------------------------------------ +# CONNECTIONS AND AUTHENTICATION +#------------------------------------------------------------------------------ + +# - Connection Settings - +# listen_addresses utilise un placeholder pour le formattage de chaine après templatisation + +§if §§getVar('mode_conteneur_actif', 'non') == 'oui' or (§§getVar('set_pg_role_perms', 'non') == 'oui' and §§pg_listen_all(§§getVar('pg_role_perms'))) +listen_addresses = '*' +§else +listen_addresses = 'localhost' +§end if +#listen_addresses = {listen_addresses} # what IP address(es) to listen on; + # comma-separated list of addresses; + # defaults to 'localhost'; use '*' for all + # (change requires restart) +port = 5432 # (change requires restart) +max_connections = §§pg_max_connections # (change requires restart) +# Note: Increasing max_connections costs ~400 bytes of shared memory per +# connection slot, plus lock space (see max_locks_per_transaction). +#superuser_reserved_connections = 3 # (change requires restart) +unix_socket_directories = '/var/run/postgresql' # comma-separated list of directories + # (change requires restart) +#unix_socket_group = '' # (change requires restart) +#unix_socket_permissions = 0777 # begin with 0 to use octal notation + # (change requires restart) +#bonjour = off # advertise server via Bonjour + # (change requires restart) +#bonjour_name = '' # defaults to the computer name + # (change requires restart) + +# - Security and Authentication - + +authentication_timeout = §§{pg_authentication_timeout}s # 1s-600s +ssl = true # (change requires restart) +#ssl_ciphers = 'DEFAULT:!LOW:!EXP:!MD5:@STRENGTH' # allowed SSL ciphers + # (change requires restart) +#ssl_renegotiation_limit = 512MB # amount of data between renegotiations +§import os +§set §§pg_server_cert_chain = os.path.splitext(§§getVar('pg_server_cert'))[0] + '_ca-chain.crt' +ssl_cert_file = '§§pg_server_cert_chain' # (change requires restart) +ssl_key_file = '§§pg_server_key' # (change requires restart) +#ssl_ca_file = '' # (change requires restart) +#ssl_crl_file = '' # (change requires restart) +#password_encryption = on +#db_user_namespace = off + +# Kerberos and GSSAPI +#krb_server_keyfile = '' +#krb_srvname = 'postgres' # (Kerberos only) +#krb_caseins_users = off + +# - TCP Keepalives - +# see "man 7 tcp" for details + +#tcp_keepalives_idle = 0 # TCP_KEEPIDLE, in seconds; + # 0 selects the system default +#tcp_keepalives_interval = 0 # TCP_KEEPINTVL, in seconds; + # 0 selects the system default +#tcp_keepalives_count = 0 # TCP_KEEPCNT; + # 0 selects the system default + + +#------------------------------------------------------------------------------ +# RESOURCE USAGE (except WAL) +#------------------------------------------------------------------------------ + +# - Memory - + +shared_buffers = §§{pg_shared_buffers}§§pg_shared_buffers_unit # min 128kB + # (change requires restart) +#temp_buffers = 8MB # min 800kB +#max_prepared_transactions = 0 # zero disables the feature + # (change requires restart) +# Note: Increasing max_prepared_transactions costs ~600 bytes of shared memory +# per transaction slot, plus lock space (see max_locks_per_transaction). +# It is not advisable to set max_prepared_transactions nonzero unless you +# actively intend to use prepared transactions. +work_mem = §§{pg_work_mem}§§pg_work_mem_unit # min 64kB +maintenance_work_mem = §§{pg_maintenance_work_mem}§§pg_maintenance_work_mem_unit # min 1MB +#max_stack_depth = 2MB # min 100kB + +# - Disk - + +#temp_file_limit = -1 # limits per-session temp file space + # in kB, or -1 for no limit + +# - Kernel Resource Usage - + +#max_files_per_process = 1000 # min 25 + # (change requires restart) +#shared_preload_libraries = '' # (change requires restart) + +# - Cost-Based Vacuum Delay - + +#vacuum_cost_delay = 0 # 0-100 milliseconds +#vacuum_cost_page_hit = 1 # 0-10000 credits +#vacuum_cost_page_miss = 10 # 0-10000 credits +#vacuum_cost_page_dirty = 20 # 0-10000 credits +#vacuum_cost_limit = 200 # 1-10000 credits + +# - Background Writer - + +#bgwriter_delay = 200ms # 10-10000ms between rounds +#bgwriter_lru_maxpages = 100 # 0-1000 max buffers written/round +#bgwriter_lru_multiplier = 2.0 # 0-10.0 multipler on buffers scanned/round + +# - Asynchronous Behavior - + +#effective_io_concurrency = 1 # 1-1000; 0 disables prefetching + + +#------------------------------------------------------------------------------ +# WRITE AHEAD LOG +#------------------------------------------------------------------------------ + +# - Settings - + +#wal_level = minimal # minimal, archive, or hot_standby + # (change requires restart) +#fsync = on # turns forced synchronization on or off +#synchronous_commit = on # synchronization level; + # off, local, remote_write, or on +#wal_sync_method = fsync # the default is the first option + # supported by the operating system: + # open_datasync + # fdatasync (default on Linux) + # fsync + # fsync_writethrough + # open_sync +#full_page_writes = on # recover from partial page writes +wal_buffers = §§pg_wal_buffers # min 32kB, -1 sets based on shared_buffers + # (change requires restart) +#wal_writer_delay = 200ms # 1-10000 milliseconds + +#commit_delay = 0 # range 0-100000, in microseconds +#commit_siblings = 5 # range 1-1000 + +# - Checkpoints - + +max_wal_size = §§{pg_max_wal_size}§§pg_max_wal_size_unit +#checkpoint_segments = 3 # in logfile segments, min 1, 16MB each +#checkpoint_timeout = 5min # range 30s-1h +#checkpoint_completion_target = 0.5 # checkpoint target duration, 0.0 - 1.0 +#checkpoint_warning = 30s # 0 disables + +# - Archiving - + +#archive_mode = off # allows archiving to be done + # (change requires restart) +#archive_command = '' # command to use to archive a logfile segment + # placeholders: %p = path of file to archive + # %f = file name only + # e.g. 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f' +#archive_timeout = 0 # force a logfile segment switch after this + # number of seconds; 0 disables + + +#------------------------------------------------------------------------------ +# REPLICATION +#------------------------------------------------------------------------------ + +# - Sending Server(s) - + +# Set these on the master and on any standby that will send replication data. + +#max_wal_senders = 0 # max number of walsender processes + # (change requires restart) +#wal_keep_segments = 0 # in logfile segments, 16MB each; 0 disables +#wal_sender_timeout = 60s # in milliseconds; 0 disables + +# - Master Server - + +# These settings are ignored on a standby server. + +#synchronous_standby_names = '' # standby servers that provide sync rep + # comma-separated list of application_name + # from standby(s); '*' = all +#vacuum_defer_cleanup_age = 0 # number of xacts by which cleanup is delayed + +# - Standby Servers - + +# These settings are ignored on a master server. + +#hot_standby = off # "on" allows queries during recovery + # (change requires restart) +#max_standby_archive_delay = 30s # max delay before canceling queries + # when reading WAL from archive; + # -1 allows indefinite delay +#max_standby_streaming_delay = 30s # max delay before canceling queries + # when reading streaming WAL; + # -1 allows indefinite delay +#wal_receiver_status_interval = 10s # send replies at least this often + # 0 disables +#hot_standby_feedback = off # send info from standby to prevent + # query conflicts +#wal_receiver_timeout = 60s # time that receiver waits for + # communication from master + # in milliseconds; 0 disables + + +#------------------------------------------------------------------------------ +# QUERY TUNING +#------------------------------------------------------------------------------ + +# - Planner Method Configuration - + +#enable_bitmapscan = on +#enable_hashagg = on +#enable_hashjoin = on +#enable_indexscan = on +#enable_indexonlyscan = on +#enable_material = on +#enable_mergejoin = on +#enable_nestloop = on +#enable_seqscan = on +#enable_sort = on +#enable_tidscan = on + +# - Planner Cost Constants - + +#seq_page_cost = 1.0 # measured on an arbitrary scale +#random_page_cost = 4.0 # same scale as above +#cpu_tuple_cost = 0.01 # same scale as above +#cpu_index_tuple_cost = 0.005 # same scale as above +#cpu_operator_cost = 0.0025 # same scale as above +effective_cache_size = §§{pg_effective_cache_size}§§pg_effective_cache_size_unit + +# - Genetic Query Optimizer - + +#geqo = on +#geqo_threshold = 12 +#geqo_effort = 5 # range 1-10 +#geqo_pool_size = 0 # selects default based on effort +#geqo_generations = 0 # selects default based on effort +#geqo_selection_bias = 2.0 # range 1.5-2.0 +#geqo_seed = 0.0 # range 0.0-1.0 + +# - Other Planner Options - + +#default_statistics_target = 100 # range 1-10000 +#constraint_exclusion = partition # on, off, or partition +#cursor_tuple_fraction = 0.1 # range 0.0-1.0 +#from_collapse_limit = 8 +#join_collapse_limit = 8 # 1 disables collapsing of explicit + # JOIN clauses + + +#------------------------------------------------------------------------------ +# ERROR REPORTING AND LOGGING +#------------------------------------------------------------------------------ + +# - Where to Log - + +log_destination = 'syslog' # Valid values are combinations of + # stderr, csvlog, syslog, and eventlog, + # depending on platform. csvlog + # requires logging_collector to be on. + +# This is used when logging to stderr: +#logging_collector = off # Enable capturing of stderr and csvlog + # into log files. Required to be on for + # csvlogs. + # (change requires restart) + +# These are only used if logging_collector is on: +#log_directory = 'pg_log' # directory where log files are written, + # can be absolute or relative to PGDATA +#log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' # log file name pattern, + # can include strftime() escapes +#log_file_mode = 0600 # creation mode for log files, + # begin with 0 to use octal notation +#log_truncate_on_rotation = off # If on, an existing log file with the + # same name as the new log file will be + # truncated rather than appended to. + # But such truncation only occurs on + # time-driven rotation, not on restarts + # or size-driven rotation. Default is + # off, meaning append to existing files + # in all cases. +#log_rotation_age = 1d # Automatic rotation of logfiles will + # happen after that time. 0 disables. +#log_rotation_size = 10MB # Automatic rotation of logfiles will + # happen after that much log output. + # 0 disables. + +# These are relevant when logging to syslog: +#syslog_facility = 'LOCAL0' +#syslog_ident = 'postgres' + +# This is only relevant when logging to eventlog (win32): +#event_source = 'PostgreSQL' + +# - When to Log - + +#client_min_messages = notice # values in order of decreasing detail: + # debug5 + # debug4 + # debug3 + # debug2 + # debug1 + # log + # notice + # warning + # error + +#log_min_messages = warning # values in order of decreasing detail: + # debug5 + # debug4 + # debug3 + # debug2 + # debug1 + # info + # notice + # warning + # error + # log + # fatal + # panic + +#log_min_error_statement = error # values in order of decreasing detail: + # debug5 + # debug4 + # debug3 + # debug2 + # debug1 + # info + # notice + # warning + # error + # log + # fatal + # panic (effectively off) + +#log_min_duration_statement = -1 # -1 is disabled, 0 logs all statements + # and their durations, > 0 logs only + # statements running at least this number + # of milliseconds + + +# - What to Log - + +#debug_print_parse = off +#debug_print_rewritten = off +#debug_print_plan = off +#debug_pretty_print = on +#log_checkpoints = off +#log_connections = off +#log_disconnections = off +#log_duration = off +#log_error_verbosity = default # terse, default, or verbose messages +#log_hostname = off +#log_line_prefix = '%t ' # special values: + # %a = application name + # %u = user name + # %d = database name + # %r = remote host and port + # %h = remote host + # %p = process ID + # %t = timestamp without milliseconds + # %m = timestamp with milliseconds + # %i = command tag + # %e = SQL state + # %c = session ID + # %l = session line number + # %s = session start timestamp + # %v = virtual transaction ID + # %x = transaction ID (0 if none) + # %q = stop here in non-session + # processes + # %% = '%' + # e.g. '<%u%%%d> ' +#log_lock_waits = off # log lock waits >= deadlock_timeout +#log_statement = 'none' # none, ddl, mod, all +#log_temp_files = -1 # log temporary files equal or larger + # than the specified size in kilobytes; + # -1 disables, 0 logs all temp files +log_timezone = 'localtime' + + +#------------------------------------------------------------------------------ +# RUNTIME STATISTICS +#------------------------------------------------------------------------------ + +# - Query/Index Statistics Collector - + +#track_activities = on +#track_counts = on +#track_io_timing = off +#track_functions = none # none, pl, all +#track_activity_query_size = 1024 # (change requires restart) +#update_process_title = on +#stats_temp_directory = 'pg_stat_tmp' + + +# - Statistics Monitoring - + +#log_parser_stats = off +#log_planner_stats = off +#log_executor_stats = off +#log_statement_stats = off + + +#------------------------------------------------------------------------------ +# AUTOVACUUM PARAMETERS +#------------------------------------------------------------------------------ + +#autovacuum = on # Enable autovacuum subprocess? 'on' + # requires track_counts to also be on. +#log_autovacuum_min_duration = -1 # -1 disables, 0 logs all actions and + # their durations, > 0 logs only + # actions running at least this number + # of milliseconds. +#autovacuum_max_workers = 3 # max number of autovacuum subprocesses + # (change requires restart) +#autovacuum_naptime = 1min # time between autovacuum runs +#autovacuum_vacuum_threshold = 50 # min number of row updates before + # vacuum +#autovacuum_analyze_threshold = 50 # min number of row updates before + # analyze +#autovacuum_vacuum_scale_factor = 0.2 # fraction of table size before vacuum +#autovacuum_analyze_scale_factor = 0.1 # fraction of table size before analyze +#autovacuum_freeze_max_age = 200000000 # maximum XID age before forced vacuum + # (change requires restart) +#autovacuum_multixact_freeze_max_age = 400000000 # maximum Multixact age + # before forced vacuum + # (change requires restart) +#autovacuum_vacuum_cost_delay = 20ms # default vacuum cost delay for + # autovacuum, in milliseconds; + # -1 means use vacuum_cost_delay +#autovacuum_vacuum_cost_limit = -1 # default vacuum cost limit for + # autovacuum, -1 means use + # vacuum_cost_limit + + +#------------------------------------------------------------------------------ +# CLIENT CONNECTION DEFAULTS +#------------------------------------------------------------------------------ + +# - Statement Behavior - + +#search_path = '"$user",public' # schema names +#default_tablespace = '' # a tablespace name, '' uses the default +#temp_tablespaces = '' # a list of tablespace names, '' uses + # only default tablespace +#check_function_bodies = on +#default_transaction_isolation = 'read committed' +#default_transaction_read_only = off +#default_transaction_deferrable = off +#session_replication_role = 'origin' +#statement_timeout = 0 # in milliseconds, 0 is disabled +#lock_timeout = 0 # in milliseconds, 0 is disabled +#vacuum_freeze_min_age = 50000000 +#vacuum_freeze_table_age = 150000000 +#vacuum_multixact_freeze_min_age = 5000000 +#vacuum_multixact_freeze_table_age = 150000000 +#bytea_output = 'hex' # hex, escape +#xmlbinary = 'base64' +#xmloption = 'content' + +# - Locale and Formatting - + +datestyle = 'iso, dmy' +#intervalstyle = 'postgres' +timezone = 'localtime' +#timezone_abbreviations = 'Default' # Select the set of available time zone + # abbreviations. Currently, there are + # Default + # Australia (historical usage) + # India + # You can create your own file in + # share/timezonesets/. +#extra_float_digits = 0 # min -15, max 3 +#client_encoding = sql_ascii # actually, defaults to database + # encoding + +# These settings are initialized by initdb, but they can be changed. +lc_messages = 'fr_FR.UTF-8' # locale for system error message + # strings +lc_monetary = 'fr_FR.UTF-8' # locale for monetary formatting +lc_numeric = 'fr_FR.UTF-8' # locale for number formatting +lc_time = 'fr_FR.UTF-8' # locale for time formatting + +# default configuration for text search +default_text_search_config = 'pg_catalog.french' + +# - Other Defaults - + +#dynamic_library_path = '$libdir' +#local_preload_libraries = '' + + +#------------------------------------------------------------------------------ +# LOCK MANAGEMENT +#------------------------------------------------------------------------------ + +#deadlock_timeout = 1s +#max_locks_per_transaction = 64 # min 10 + # (change requires restart) +# Note: Each lock table slot uses ~270 bytes of shared memory, and there are +# max_locks_per_transaction * (max_connections + max_prepared_transactions) +# lock table slots. +#max_pred_locks_per_transaction = 64 # min 10 + # (change requires restart) + + +#------------------------------------------------------------------------------ +# VERSION/PLATFORM COMPATIBILITY +#------------------------------------------------------------------------------ + +# - Previous PostgreSQL Versions - + +#array_nulls = on +#backslash_quote = safe_encoding # on, off, or safe_encoding +#default_with_oids = off +#escape_string_warning = on +#lo_compat_privileges = off +#quote_all_identifiers = off +#sql_inheritance = on +#standard_conforming_strings = on +#synchronize_seqscans = on + +# - Other Platforms and Clients - + +#transform_null_equals = off + + +#------------------------------------------------------------------------------ +# ERROR HANDLING +#------------------------------------------------------------------------------ + +#exit_on_error = off # terminate session on any error? +#restart_after_crash = on # reinitialize after backend crash? + + +#------------------------------------------------------------------------------ +# CONFIG FILE INCLUDES +#------------------------------------------------------------------------------ + +# These options allow settings to be loaded from files other than the +# default postgresql.conf. + +#include_dir = 'conf.d' # include files ending in '.conf' from + # directory 'conf.d' +#include_if_exists = 'exists.conf' # include file only if it exists +#include = 'special.conf' # include file + + +#------------------------------------------------------------------------------ +# CUSTOMIZED OPTIONS +#------------------------------------------------------------------------------ + +# Add settings for extensions here diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgresql/templates/postgresql_databases.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgresql/templates/postgresql_databases.yml new file mode 100644 index 0000000000000000000000000000000000000000..92888e91e5e650bb5ee1c9f3708234d69eb153fd --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-postgresql/templates/postgresql_databases.yml @@ -0,0 +1,45 @@ +%if %%getVar('pg_additional_db', 'non') == 'oui' +%set %%db_templates = {'postgres': 'template1', 'postgis': 'template_postgis'} +%def aggregate_role_options(%%master, %%*options) +%set %%role_options = [] +%for %%option in %%options +%if %%hasattr(%%master, %%option) and %%getattr(%%master, %%option) == 'oui' +%set %%option_str = %%option.split('_')[-1].upper() +%%role_options.append(%%option_str)) +%end if +%end for +%return %%role_options +%end def +--- +additional_db: +%for %%base in %%getVar('pg_additional_db_name', []) + %%base: + dbuser: %%base.pg_additional_db_admin + dbuser_options: %%aggregate_role_options(%%base, 'pg_additional_db_admin_createrole','pg_additional_db_admin_superuser','pg_additional_db_admin_login') + dbhost: 127.0.0.1 + dbport: 5432 + dbtype: postgres + dbname: %%base + template: %%db_templates[%%base.pg_additional_db_template] +%end for +%end if +%if %%getVar('pg_additional_role', 'non') == 'oui' +%set %%privileges_by_role = {} +%for %%perms in [rp for rp in %%getVar('pg_role_perms', []) if rp.pg_role_perms_hba_only == 'non'] +%silent %%privileges_by_role.setdefault(%%perms.pg_role_perms_name, []).append((%%perms.pg_role_perms_object, %%perms)) +%end for +additional_roles: +%for %%role in %%getVar('pg_additional_role_name', []) + %%role: + role: %%role + options: %%aggregate_role_options(%%role, 'pg_additional_role_createrole','pg_additional_role_superuser','pg_additional_role_login') + dbtype: postgres + pwd_mode: %%role.pg_additional_role_pwd +%if %%role._value in %%privileges_by_role + privileges: +%for %%privilege in %%privileges_by_role[%%role._value] + - {'objet': %%privilege[0], 'privilege': %%privilege[1]} +%end for +%end if +%end for +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proftpd/dictionaries/00_eole-proftpd_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proftpd/dictionaries/00_eole-proftpd_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..7e0bc3d48c2409b305a740967cb4f92da6f6857c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proftpd/dictionaries/00_eole-proftpd_packages.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>eole-sso-client</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proftpd/dictionaries/25_proftpd.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proftpd/dictionaries/25_proftpd.xml new file mode 100644 index 0000000000000000000000000000000000000000..1a591ea3e96d1aad596457b64e747b12f97635fc --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proftpd/dictionaries/25_proftpd.xml @@ -0,0 +1,155 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + <file filelist='proftpd_container' name='/usr/share/eole/bastion/data/11-proftpd' rm='True' mode='0755'/> + </files> + + <containers> + <!-- FIXME : 2.4 : nécessite eole-fichier ? --> + <container name='ftp' id='25'> + <!--<disknod>/home</disknod>--> + <!--attention, redefini dans 50_amonecole--> + <package>eole-proftpd-pkg</package> + <package instance_mode='when_no_container'>eole-antivirus-pkg</package> + <package instance_mode='when_container'>eole-antivirus-container-pkg</package> + <service servicelist='proftpd'>proftpd</service> + <service_access service='proftpd'> + <port service_accesslist='proftpd_container'>21</port> + </service_access> + <service servicelist='antivirus_ftp'>clamav-daemon</service> + <file filelist='proftpd' name='/etc/proftpd/proftpd.conf'/> + <file filelist='proftpd' name='/etc/pam.d/proftpd' source='pam_proftpd'/> + <!-- eole-proftpd depends on eole-sso-client --> + <file filelist='ssoclient' name='/etc/pam_cas.conf' source='pam_cas_auth.conf'/> + <!-- clamd.conf is provided by eole-antivirus --> + <file filelist='antivirus_ftp' name='/etc/clamav/clamd.conf'/> + </container> + </containers> + + <variables> + <family name='services'> + <variable name='activer_proftpd' type='oui/non' description="Activer l'accès FTP" > + <value>oui</value> + </variable> + </family> + <family name='clamav' hidden='True'> + <variable name='ftp_scan' type='oui/non' description="Activer l'anti-virus temps réel sur FTP"> + <value>oui</value> + </variable> + </family> + <family name='proftpd' mode='expert' icon='cloud-download'> + <variable name='ftp_servername' type='string' description='Nom du serveur FTP'/> + <variable name='ftp_tls' type='oui/non' description="Activer le chiffrement TLS"> + <value>non</value> + </variable> + <variable name='activer_ftp_anonymous_access' type='oui/non' description="Activer l'accès anonyme"> + <value>non</value> + </variable> + <variable name='ftp_anonymous_directory' type='filename' description="Chemin du répertoire anonyme" mandatory='True'/> + <variable name='activer_ftp_access' type='oui/non' description="Activer des accès FTP supplémentaires"> + <value>non</value> + </variable> + <variable name='ftp_access_directory' type='filename' description="Chemin du répertoire FTP supplémentaire" multi='True' mandatory='True'/> + <variable name='ftp_pam_ldap' type='oui/non' description="Autoriser les comptes LDAP à se connecter en accès FTP"> + <value>oui</value> + </variable> + <variable name='ftp_pam_sso' type='oui/non' description="Autoriser CAS en accès FTP" > + <value>oui</value> + </variable> + <variable name='ftp_maxclients' type='number' description="Nombre maximum d'utilisateurs simultanés"> + <value>50</value> + </variable> + <variable name='ftp_maxinstances' type='number' description="Nombre maximum de processus pour ProFTPD"> + <value>40</value> + </variable> + <variable name='ftp_maxretrievefilesize' type='number' description="Taille maximum du fichier récupéré (download) en Mb"> + <value>500</value> + </variable> + <variable name='ftp_maxstorefilesize' type='number' description="Taille maximum du fichier déposé (upload) en Mb"> + <value>100</value> + </variable> + <variable name='ftp_timeoutidle' type='number' description="Temps maximum d'inactivité avant déconnexion (en secondes)"> + <value>1200</value> + </variable> + </family> + <separators> + <!--<separator name='activer_ftp_anonymous_access'>Gestion des accès</separator> + <separator name='ftp_maxclients'>Configuration avancée</separator>--> + </separators> + </variables> + + <constraints> + + <check name='valid_regexp' target='ftp_anonymous_directory'> + <param>^/</param> + <param name='err_msg'>Renseigner un chemin absolu</param> + </check> + + <check name='valid_regexp' target='ftp_access_directory'> + <param>^/</param> + <param name='err_msg'>Renseigner un chemin absolu</param> + </check> + + <fill name='calc_val' target='ftp_servername'> + <param type='eole' name='valeur'>libelle_etab</param> + </fill> + + <condition name='disabled_if_in' source='activer_proftpd'> + <param>non</param> + <target type='filelist'>proftpd</target> + <target type='servicelist'>proftpd</target> + <target type='family'>proftpd</target> + <target type='variable'>ftp_scan</target> + <target type='filelist'>proftpd_container</target> + <target type='service_accesslist'>proftpd_container</target> + </condition> + <condition name='disabled_if_in' source='mode_conteneur_actif'> + <param>oui</param> + <target type='filelist'>proftpd_container</target> + <target type='service_accesslist'>proftpd_container</target> + </condition> + <condition name='disabled_if_in' source='activer_ftp_anonymous_access'> + <param>non</param> + <target type='variable'>ftp_anonymous_directory</target> + </condition> + <condition name='disabled_if_in' source='activer_ftp_access'> + <param>non</param> + <target type='variable'>ftp_access_directory</target> + </condition> + + <!-- Anti-virus sur FTP --> + <condition name='disabled_if_in' source='activer_clam'> + <param>non</param> + <target type='servicelist'>antivirus_ftp</target> + <target type='filelist'>antivirus_ftp</target> + </condition> + <condition name='disabled_if_in' source='ftp_scan'> + <param>non</param> + <target type='servicelist'>antivirus_ftp</target> + <target type='filelist'>antivirus_ftp</target> + </condition> + <condition name='disabled_if_in' source='activer_client_ldap' fallback='True'> + <param>non</param> + <target type='variable'>ftp_pam_ldap</target> + </condition> + <condition name='disabled_if_in' source='ftp_pam_ldap'> + <param>non</param> + <target type='variable'>ftp_pam_sso</target> + </condition> + <condition name='disabled_if_in' source='activer_sso'> + <param>non</param> + <target type='variable'>ftp_pam_sso</target> + </condition> + + </constraints> + + <help> + <variable name='activer_proftpd'>ProFTPD est un serveur FTP</variable> + <family name='proftpd'>Paramétrage avancé du serveur FTP</family> + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proftpd/files/usr/share/eole/diagnose/43-proftpd b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proftpd/files/usr/share/eole/diagnose/43-proftpd new file mode 100644 index 0000000000000000000000000000000000000000..5df4c41e40381e019bc8b942335c97429e82ef40 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proftpd/files/usr/share/eole/diagnose/43-proftpd @@ -0,0 +1,10 @@ +#!/bin/bash + +if [ $(CreoleGet activer_proftpd) = "oui" ];then + . /usr/lib/eole/diagnose.sh + EchoGras "*** Serveur FTP" + TestService ProFTPD $(CreoleGet container_ip_ftp):21 + echo +fi + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proftpd/files/usr/share/zephir/monitor/configs/services/21_ftp.srv b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proftpd/files/usr/share/zephir/monitor/configs/services/21_ftp.srv new file mode 100644 index 0000000000000000000000000000000000000000..02984cca04eb8ceb783e6d8e6de6242af9827182 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proftpd/files/usr/share/zephir/monitor/configs/services/21_ftp.srv @@ -0,0 +1,12 @@ +# -*- coding: UTF-8 -*- +""" +Surveillance du service Proftpd +""" + +from zephir.monitor.agents.services import PIDService +from zephir.monitor.agentmanager.config import ACTIVER_PROFTPD + +if ACTIVER_PROFTPD: + data = {'proftpd' : "Transfert de fichiers (FTP)"} + AGENTS.append(PIDService('ftp', data, period=115, + description="Etat du service de transfert de fichiers (FTP)")) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proftpd/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proftpd/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..af027b81aac6e97a96b6695630f33b9473febd61 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proftpd/service.yml @@ -0,0 +1,37 @@ +format: '0.1' +name: eole-proftpd +version: |- + 2.7.1-1 +description: |- + Templates et dictionnaires pour le service proftpd + Configuration du serveur FTP : ProFTPd + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: + - eole-antivirus +packages: + - eole-sso-client +dictionaries: + - 25_proftpd.xml +extra_dictionaries: {} +templates: + - 11-proftpd + - pam_proftpd + - proftpd.conf +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: [] +files: + /usr/share/eole/diagnose/43-proftpd: + owner: root + group: root + mode: '0755' + /usr/share/zephir/monitor/configs/services/21_ftp.srv: + owner: root + group: root + mode: '0644' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proftpd/templates/11-proftpd b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proftpd/templates/11-proftpd new file mode 100644 index 0000000000000000000000000000000000000000..6ff1e406af4e1c6d4e53d6091acf9fecd5d4154b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proftpd/templates/11-proftpd @@ -0,0 +1,4 @@ +#!/bin/bash + +## Charger le module FTP +modprobe ip_conntrack_ftp diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proftpd/templates/pam_proftpd b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proftpd/templates/pam_proftpd new file mode 100644 index 0000000000000000000000000000000000000000..0ee6691515546e40af3bdd05c6a1423598eed1e9 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proftpd/templates/pam_proftpd @@ -0,0 +1,13 @@ +%echo "#%PAM-1.0\n" +%if %%getVar('ftp_pam_ldap', 'non') == 'oui' + %if %%getVar('ftp_pam_sso', 'non') == 'oui' + %if %%container_ip_ftp != '127.0.0.1' + %set %%adresse = %%container_ip_ftp + %else + %set %%adresse = %%adresse_ip_eth0 + %end if +auth sufficient /lib/security/pam_cas.so -sftp://%%adresse -f/etc/pam_cas.conf + %end if +auth sufficient pam_ldap.so +%end if +@include login diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proftpd/templates/proftpd.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proftpd/templates/proftpd.conf new file mode 100644 index 0000000000000000000000000000000000000000..b99300e99dd91ac3e2120eb62c742feea39dd9b7 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proftpd/templates/proftpd.conf @@ -0,0 +1,249 @@ +# +# /etc/proftpd/proftpd.conf -- This is a basic ProFTPD configuration file. +# To really apply changes, reload proftpd after modifications, if +# it runs in daemon mode. It is not required in inetd/xinetd mode. +# + +# Includes DSO modules +#Include /etc/proftpd/modules.conf + +# Set off to disable IPv6 support which is annoying on IPv4 only boxes. +%if %%activer_ipv6 == 'oui' +UseIPv6 on +%else +UseIPv6 off +%end if + +# Normally, incoming active mode data connections +# and outgoing passive mode data connections +# have a reverse DNS lookup performed on the remote host's IP address. +# Disabling this directive prevents proftpd from attempting +# to reverse-lookup data connection IP addresses. +UseReverseDNS off + +# If set on you can experience a longer connection delay in many cases. +IdentLookups off + +ServerName "%%ftp_servername" +ServerType standalone +DeferWelcome off + +MultilineRFC2228 on +DefaultServer on +ShowSymlinks on + +# TimeoutNoTransfer -- Sets the connection without transfer timeout +TimeoutNoTransfer 600 +# TimeoutIdle -- Sets the idle connection timeout +TimeoutIdle %%ftp_timeoutidle + +# MaxClients -- Limits the number of users that can connect +MaxClients %%ftp_maxclients +# MaxInstances -- Sets the maximum number of child processes to be spawned +MaxInstances %%ftp_maxinstances +# MaxRetrieveFileSize -- Restrict size of downloaded files +MaxRetrieveFileSize %%ftp_maxretrievefilesize Mb +# MaxStoreFileSize -- Restrict size of uploaded files +MaxStoreFileSize %%ftp_maxstorefilesize Mb + +DisplayLogin welcome.msg +DisplayChdir .message true +ListOptions "-l" + +DenyFilter \*.*/ + +# Use this to jail all users in their homes +# DefaultRoot ~ + +# Users require a valid shell listed in /etc/shells to login. +# Use this directive to release that constrain. +# RequireValidShell off + +# Port 21 is the standard FTP port. +Port 21 + +# In some cases you have to specify passive ports range to by-pass +# firewall limitations. Ephemeral ports can be used for that, but +# feel free to use a more narrow range. +# PassivePorts 49152 65534 + +# If your host was NATted, this option is useful in order to +# allow passive tranfers to work. You have to use your public +# address and opening the passive ports used on your firewall as well. +# MasqueradeAddress 1.2.3.4 + +# This is useful for masquerading address with dynamic IPs: +# refresh any configured MasqueradeAddress directives every 8 hours +<IfModule mod_dynmasq.c> +# DynMasqRefresh 28800 +</IfModule> + +# To prevent DoS attacks, set the maximum number of child processes +# to 30. If you need to allow more than 30 concurrent connections +# at once, simply increase this value. Note that this ONLY works +# in standalone mode, in inetd mode you should use an inetd server +# that allows you to limit maximum number of processes per service +# (such as xinetd) +MaxInstances 30 + +# Set the user and group that the server normally runs at. +User proftpd +Group nogroup + +# Umask 022 is a good standard umask to prevent new files and dirs +# (second parm) from being group and world writable. +Umask 022 022 +# Normally, we want files to be overwriteable. +AllowOverwrite on + +# Uncomment this if you are using NIS or LDAP via NSS to retrieve passwords: +# PersistentPasswd off + +# This is required to use both PAM-based authentication and local passwords +# AuthOrder mod_auth_pam.c* mod_auth_unix.c + +# Be warned: use of this directive impacts CPU average load! +# Uncomment this if you like to see progress and transfer rate with ftpwho +# in downloads. That is not needed for uploads rates. +# +# UseSendFile off + +TransferLog /var/log/proftpd/xferlog +SystemLog /var/log/proftpd/proftpd.log + +# Logging onto /var/log/lastlog is enabled but set to off by default +#UseLastlog on + +# In order to keep log file dates consistent after chroot, use timezone info +# from /etc/localtime. If this is not set, and proftpd is configured to +# chroot (e.g. DefaultRoot or <Anonymous>), it will use the non-daylight +# savings timezone regardless of whether DST is in effect. +#SetEnv TZ :/etc/localtime + +<IfModule mod_quotatab.c> +QuotaEngine off +</IfModule> + +<IfModule mod_ratio.c> +Ratios off +</IfModule> + + +# Delay engine reduces impact of the so-called Timing Attack described in +# http://www.securityfocus.com/bid/11430/discuss +# It is on by default. +<IfModule mod_delay.c> +DelayEngine on +</IfModule> + +<IfModule mod_ctrls.c> +ControlsEngine off +ControlsMaxClients 2 +ControlsLog /var/log/proftpd/controls.log +ControlsInterval 5 +ControlsSocket /var/run/proftpd/proftpd.sock +</IfModule> + +<IfModule mod_ctrls_admin.c> +AdminControlsEngine off +</IfModule> + +# +# Alternative authentication frameworks +# +#Include /etc/proftpd/ldap.conf +#Include /etc/proftpd/sql.conf + +# activation du tls +%if %%ftp_tls == 'oui' +LoadModule mod_tls.c +<IfModule mod_tls.c> + TLSEngine on + TLSRequired on + TLSRSACertificateFile %%server_cert + TLSRSACertificateKeyFile %%server_key + TLSCACertificateFile /etc/ssl/certs/ca.crt + TLSProtocol TLSv1 + TLSCipherSuite ALL:!aNULL:!ADH:!eNULL:!LOW:!EXP:RC4+RSA:+HIGH:+MEDIUM +</IfModule> +%end if + +# antivirus +%if %%getVar('ftp_scan', 'non') == 'oui' +LoadModule mod_clamav.c +<IfModule mod_clamav.c> + ClamAV on + ClamLocalSocket /var/run/clamav/clamd.ctl + ClamMaxSize 5 Mb +</IfModule> +%end if + +# work around for symlinks with Filezilla (#7052) +# The mod_facts module is ProFTPD's module for handling the MLSD and MLST commands, +# in support of RFC 3659. +# In addition, the mod_facts module implements the MFF and MFMT commands defined in: +# http://tools.ietf.org/html/draft-somers-ftp-mfxx-04 +<IfModule mod_facts.c> + FactsOptions UseSlink +</IfModule> + +# +# Useful to keep VirtualHost/VirtualRoot directives separated +# +#Include /etc/proftpd/virtuals.con + +# Interdictions d'accès restrictives +<Directory /> + <Limit ALL> + Order Allow,Deny + Deny ALL + </Limit> +</Directory> + +# Needed for NIS. +PersistentPasswd off + +# Default root can be used to put users in a chroot environment. +# As an example if you have a user foo and you want to put foo in /home/foo +# chroot environment you would do this: +# +# DefaultRoot /home/foo foo +# DefaultRoot /home + +# authentification PAM +AuthPAM on + +# service PAM utilisé (mettre ftp pour utiliser /etc/pam.d/ftp) +AuthPAMConfig proftpd + +# l'utilisateur n'a pas obligatoirement de shell +RequireValidShell off + +# on arrive dans le répertoire spécial FTP +DefaultChdir ~/.ftp + +%if %%activer_ftp_anonymous_access == 'oui' +<Anonymous %%ftp_anonymous_directory> + User ftp + Group ftp + UserAlias anonymous ftp + RequireValidShell off + <Limit WRITE> + DenyAll + </Limit> +</Anonymous> +%end if + +%if %%activer_ftp_access == 'oui' +%for %%acces in %%ftp_access_directory +<Directory %%acces> + <Limit ALL> + Order Allow,Deny + Allow ALL + </Limit> +</Directory> +%end for +%end if + +# Include other custom configuration files +Include /etc/proftpd/conf.d/ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy-bypass/dictionaries/24_proxy_bypass.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy-bypass/dictionaries/24_proxy_bypass.xml new file mode 100644 index 0000000000000000000000000000000000000000..59d3c95ddecdaf0a0da62de4af40ee3b07119164 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy-bypass/dictionaries/24_proxy_bypass.xml @@ -0,0 +1,259 @@ +<?xml version="1.0" encoding="utf-8"?> +<creole> + + <files/> + + <variables> + + <family name='exceptions proxy' icon='code-fork'> + + <!-- domaines de destination --> + <variable name='proxy_bypass_domain_eth0' type='domain_strict' description="Exceptions de type nom de domaine pour l'interface 0" multi='True'/> + <variable name='proxy_bypass_domain_eth1' type='domain_strict' description="Exceptions de type nom de domaine pour l'interface 1" multi='True'/> + <variable name='proxy_bypass_domain_eth2' type='domain_strict' description="Exceptions de type nom de domaine pour l'interface 2" multi='True'/> + <variable name='proxy_bypass_domain_eth3' type='domain_strict' description="Exceptions de type nom de domaine pour l'interface 3" multi='True'/> + <variable name='proxy_bypass_domain_eth4' type='domain_strict' description="Exceptions de type nom de domaine pour l'interface 4" multi='True'/> + + <!-- authentification --> + <variable name='proxy_noauth' type='string' description="Liste des domaines de destination à ne pas authentifier" multi='True'/> + <variable name='proxy_noauth_auto' type='string' description="Agrégation des domaines de destination à ne pas authentifier" multi='True'/> + + <!-- IP/réseaux de destination--> + <variable name='proxy_bypass_eth0' type='oui/non' description="Ajouter des exceptions de destination pour l'interface 0"> + <value>non</value> + </variable> + <variable name='proxy_bypass_network_eth0' type='network' description="Exceptions de type réseau pour l'interface 0" multi='True' mandatory='True'/> + <variable name='proxy_bypass_netmask_eth0' type='netmask' description="Masque de sous-réseau associé" mandatory='True'> + <value>255.255.255.255</value> + </variable> + <variable name='proxy_bypass_eth1' type='oui/non' description="Ajouter des exceptions de destination pour l'interface 1"> + <value>non</value> + </variable> + <variable name='proxy_bypass_network_eth1' type='network' description="Exceptions de type réseau pour l'interface 1" multi='True' mandatory='True'/> + <variable name='proxy_bypass_netmask_eth1' type='netmask' description="Masque de sous-réseau associé" mandatory='True'> + <value>255.255.255.255</value> + </variable> + <variable name='proxy_bypass_eth2' type='oui/non' description="Ajouter des exceptions de destination pour l'interface 2"> + <value>non</value> + </variable> + <variable name='proxy_bypass_network_eth2' type='network' description="Exceptions de type réseau pour l'interface 2" multi='True' mandatory='True'/> + <variable name='proxy_bypass_netmask_eth2' type='netmask' description="Masque de sous-réseau associé" mandatory='True'> + <value>255.255.255.255</value> + </variable> + <variable name='proxy_bypass_eth3' type='oui/non' description="Ajouter des exceptions de destination pour l'interface 3"> + <value>non</value> + </variable> + <variable name='proxy_bypass_network_eth3' type='network' description="Exceptions de type réseau pour l'interface 3" multi='True' mandatory='True'/> + <variable name='proxy_bypass_netmask_eth3' type='netmask' description="Masque de sous-réseau associé" mandatory='True'> + <value>255.255.255.255</value> + </variable> + <variable name='proxy_bypass_eth4' type='oui/non' description="Ajouter des exceptions de destination pour l'interface 4"> + <value>non</value> + </variable> + <variable name='proxy_bypass_network_eth4' type='network' description="Exceptions de type réseau pour l'interface 4" multi='True' mandatory='True'/> + <variable name='proxy_bypass_netmask_eth4' type='netmask' description="Masque de sous-réseau associé" mandatory='True'> + <value>255.255.255.255</value> + </variable> + + <!-- IP/réseaux source--> + <!--<variable name='proxy_bypass_src_network_eth0' type='network' description="Exception source de type réseau pour l'interface 0" multi='True'/> + <variable name='proxy_bypass_src_netmask_eth0' type='netmask' description="Masque de sous-réseau associé" mandatory='True'> + <value>255.255.255.255</value> + </variable>--> + <variable name='proxy_bypass_src_network_eth1' type='network' description="Exception source de type réseau pour l'interface 1" multi='True'/> + <variable name='proxy_bypass_src_netmask_eth1' type='netmask' description="Masque de sous-réseau associé" mandatory='True'> + <value>255.255.255.255</value> + </variable> + <variable name='proxy_bypass_src_network_eth2' type='network' description="Exception source de type réseau pour l'interface 2" multi='True'/> + <variable name='proxy_bypass_src_netmask_eth2' type='netmask' description="Masque de sous-réseau associé" mandatory='True'> + <value>255.255.255.255</value> + </variable> + <variable name='proxy_bypass_src_network_eth3' type='network' description="Exception source de type réseau pour l'interface 3" multi='True'/> + <variable name='proxy_bypass_src_netmask_eth3' type='netmask' description="Masque de sous-réseau associé" mandatory='True'> + <value>255.255.255.255</value> + </variable> + <variable name='proxy_bypass_src_network_eth4' type='network' description="Exception source de type réseau pour l'interface 4" multi='True'/> + <variable name='proxy_bypass_src_netmask_eth4' type='netmask' description="Masque de sous-réseau associé" mandatory='True'> + <value>255.255.255.255</value> + </variable> + </family> + + <separators> + <separator name='proxy_bypass_domain_eth0' never_hidden='True'>Exceptions de proxy pour des domaines de destination</separator> + <separator name='proxy_noauth'>Ne pas authentifier des domaines de destination</separator> + <separator name='proxy_bypass_eth0' never_hidden='True'>Exceptions de proxy pour des IP et adresses réseaux de destination</separator> + <!--<separator name='proxy_bypass_src_network_eth0' never_hidden='True'>Exceptions de proxy pour des IP et adresses réseaux source</separator>--> + <separator name='proxy_bypass_src_network_eth1'>Exceptions de proxy pour des IP et adresses réseaux source</separator> + </separators> + + </variables> + + <constraints> + + <auto name='calc_multi_val' target='proxy_noauth_auto'> + <param type='eole'>serveur_maj</param> + <param type='eole'>ubuntu_update_mirrors</param> + <param>eole.ac-dijon.fr</param> + <param>eoleng.ac-dijon.fr</param> + <param>bp-eole.ac-dijon.fr</param> + <param>test-eole.ac-dijon.fr</param> + <param>test-eoleng.ac-dijon.fr</param> + <param>ftp.crihan.fr</param> + <param>.archive.canonical.com</param> + <param>.ubuntu.com</param> + <param>.ppa.launchpad.net</param> + <param>.database.clamav.net</param> + <param>.db.fr.clamav.net</param> + <param>.pool.ntp.org</param> + <param>.services.openoffice.org</param> + <param>.windowsupdate.com</param> + <param>.wustat.windows.com</param> + <param>.microsoft.com</param> + <param>.pack.google.com</param> + <param>eqos.orion.education.fr</param> + </auto> + + <condition name='disabled_if_not_in' source='nombre_interfaces'> + <param>1</param> + <!--<target type='variable'>proxy_bypass_src_network_eth0</target> + <target type='variable'>proxy_bypass_src_netmask_eth0</target>--> + <target type='variable'>proxy_bypass_eth0</target> + <target type='variable'>proxy_bypass_domain_eth0</target> + </condition> + <condition name='disabled_if_in' source='proxy_bypass_eth0'> + <param>non</param> + <target type='variable'>proxy_bypass_network_eth0</target> + <target type='variable'>proxy_bypass_netmask_eth0</target> + </condition> + + <condition name='disabled_if_in' source='nombre_interfaces'> + <param>1</param> + <target type='variable'>proxy_bypass_src_network_eth1</target> + <target type='variable'>proxy_bypass_src_netmask_eth1</target> + <target type='variable'>proxy_bypass_eth1</target> + <target type='variable'>proxy_bypass_domain_eth1</target> + </condition> + <condition name='disabled_if_in' source='proxy_bypass_eth1'> + <param>non</param> + <target type='variable'>proxy_bypass_network_eth1</target> + <target type='variable'>proxy_bypass_netmask_eth1</target> + </condition> + + <condition name='disabled_if_in' source='nombre_interfaces'> + <param>1</param> + <param>2</param> + <target type='variable'>proxy_bypass_src_network_eth2</target> + <target type='variable'>proxy_bypass_src_netmask_eth2</target> + <target type='variable'>proxy_bypass_eth2</target> + <target type='variable'>proxy_bypass_domain_eth2</target> + </condition> + <condition name='disabled_if_in' source='proxy_bypass_eth2'> + <param>non</param> + <target type='variable'>proxy_bypass_network_eth2</target> + <target type='variable'>proxy_bypass_netmask_eth2</target> + </condition> + + <condition name='disabled_if_in' source='nombre_interfaces'> + <param>1</param> + <param>2</param> + <param>3</param> + <target type='variable'>proxy_bypass_src_network_eth3</target> + <target type='variable'>proxy_bypass_src_netmask_eth3</target> + <target type='variable'>proxy_bypass_eth3</target> + <target type='variable'>proxy_bypass_domain_eth3</target> + </condition> + <condition name='disabled_if_in' source='proxy_bypass_eth3'> + <param>non</param> + <target type='variable'>proxy_bypass_network_eth3</target> + <target type='variable'>proxy_bypass_netmask_eth3</target> + </condition> + + <condition name='disabled_if_in' source='nombre_interfaces'> + <param>1</param> + <param>2</param> + <param>3</param> + <param>4</param> + <target type='variable'>proxy_bypass_src_network_eth4</target> + <target type='variable'>proxy_bypass_src_netmask_eth4</target> + <target type='variable'>proxy_bypass_eth4</target> + <target type='variable'>proxy_bypass_domain_eth4</target> + </condition> + <condition name='disabled_if_in' source='proxy_bypass_eth4'> + <param>non</param> + <target type='variable'>proxy_bypass_network_eth4</target> + <target type='variable'>proxy_bypass_netmask_eth4</target> + </condition> + + <!--<group master='proxy_bypass_src_network_eth0'> + <slave>proxy_bypass_src_netmask_eth0</slave> + </group>--> + <group master='proxy_bypass_src_network_eth1'> + <slave>proxy_bypass_src_netmask_eth1</slave> + </group> + <group master='proxy_bypass_src_network_eth2'> + <slave>proxy_bypass_src_netmask_eth2</slave> + </group> + <group master='proxy_bypass_src_network_eth3'> + <slave>proxy_bypass_src_netmask_eth3</slave> + </group> + <group master='proxy_bypass_src_network_eth4'> + <slave>proxy_bypass_src_netmask_eth4</slave> + </group> + + <!--<check name="valid_networknetmask" target="proxy_bypass_src_netmask_eth0"> + <param type='eole'>proxy_bypass_src_network_eth0</param> + </check>--> + <check name="valid_networknetmask" target="proxy_bypass_src_netmask_eth1"> + <param type='eole'>proxy_bypass_src_network_eth1</param> + </check> + <check name="valid_networknetmask" target="proxy_bypass_src_netmask_eth2"> + <param type='eole'>proxy_bypass_src_network_eth2</param> + </check> + <check name="valid_networknetmask" target="proxy_bypass_src_netmask_eth3"> + <param type='eole'>proxy_bypass_src_network_eth3</param> + </check> + <check name="valid_networknetmask" target="proxy_bypass_src_netmask_eth4"> + <param type='eole'>proxy_bypass_src_network_eth4</param> + </check> + + <group master='proxy_bypass_network_eth0'> + <slave>proxy_bypass_netmask_eth0</slave> + </group> + <group master='proxy_bypass_network_eth1'> + <slave>proxy_bypass_netmask_eth1</slave> + </group> + <group master='proxy_bypass_network_eth2'> + <slave>proxy_bypass_netmask_eth2</slave> + </group> + <group master='proxy_bypass_network_eth3'> + <slave>proxy_bypass_netmask_eth3</slave> + </group> + <group master='proxy_bypass_network_eth4'> + <slave>proxy_bypass_netmask_eth4</slave> + </group> + + <check name="valid_networknetmask" target="proxy_bypass_netmask_eth0"> + <param type='eole'>proxy_bypass_network_eth0</param> + </check> + <check name="valid_networknetmask" target="proxy_bypass_netmask_eth1"> + <param type='eole'>proxy_bypass_network_eth1</param> + </check> + <check name="valid_networknetmask" target="proxy_bypass_netmask_eth2"> + <param type='eole'>proxy_bypass_network_eth2</param> + </check> + <check name="valid_networknetmask" target="proxy_bypass_netmask_eth3"> + <param type='eole'>proxy_bypass_network_eth3</param> + </check> + <check name="valid_networknetmask" target="proxy_bypass_netmask_eth4"> + <param type='eole'>proxy_bypass_network_eth4</param> + </check> + + </constraints> + + <help> + <family name='exceptions proxy'>Gestion des exceptions de proxy</family> + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy-bypass/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy-bypass/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..a2ee5c0e1491d9c8468eb6805084ee8cbe12935f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy-bypass/service.yml @@ -0,0 +1,22 @@ +format: '0.1' +name: eole-proxy-bypass +version: |- + 2.7.0-8 +description: |- + Configuration EOLE pour les exceptions de proxy + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: [] +packages: [] +dictionaries: + - 24_proxy_bypass.xml +extra_dictionaries: {} +templates: [] +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: [] +files: {} +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/dictionaries/00_eole-proxy_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/dictionaries/00_eole-proxy_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..52e65b94cef97db9f0e41295d7f50bfa9678ebf4 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/dictionaries/00_eole-proxy_packages.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>eole-amon-backend</package> + <package>lightsquid</package> + <package>snmp</package> + <package>xz-utils</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/dictionaries/22_logs_proxy.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/dictionaries/22_logs_proxy.xml new file mode 100644 index 0000000000000000000000000000000000000000..1cea7539d77bcf03510989e5b030220535834ec4 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/dictionaries/22_logs_proxy.xml @@ -0,0 +1,87 @@ +<?xml version='1.0' encoding='utf-8'?> + +<creole> + <files> + <file name='/etc/rsyslog.d/aggregation/squid.conf' source='rsyslog_aggregation_squid.conf' mkdir="True"/> + <file name='/etc/rsyslog.d/aggregation/dansguardian.conf' source='rsyslog_aggregation_dansguardian.conf' mkdir="True"/> + <file name='/etc/rsyslog.d/eole-traps/squid.conf' source='rsyslog_traps_squid.conf' mkdir="True"/> + <file name='/etc/rsyslog.d/eole-traps/dansguardian.conf' source='rsyslog_traps_dansguardian.conf' mkdir="True"/> + </files> + <variables> + <family name='logs'> + <variable name='envoyer_logs_squid' type='oui/non' description="Activer le transfert des logs de Squid"> + <value>non</value> + </variable> + <variable name='activate_squid_realtime' type='oui/non' description="Activer le transfert des logs de Squid en temps réel" hidden='True'> + <value>non</value> + </variable> + <variable name='squid_heure_debut' type='string' description="Heure de début du transfert des logs" hidden='True'> + <value></value> + </variable> + <variable name='squid_heure_fin' type='string' description="Heure de fin du transfert des logs" hidden='True'> + <value></value> + </variable> + <variable name='envoyer_logs_dansguardian' type='oui/non' description="Activer le transfert des logs de e2guardian"> + <value>non</value> + </variable> + <variable name='activate_dansguardian_realtime' type='oui/non' description="Activer le transfert des logs de e2guardian en temps réel" hidden='True'> + <value>non</value> + </variable> + <variable name='dansguardian_heure_debut' type='string' description="Heure de début du transfert des logs" hidden='True'> + <value></value> + </variable> + <variable name='dansguardian_heure_fin' type='string' description="Heure de fin du transfert des logs" hidden='True'> + <value></value> + </variable> + </family> + <separators> + <separator name='envoyer_logs_squid'>Squid</separator> + <separator name='envoyer_logs_dansguardian'>e2guardian</separator> + </separators> + </variables> + <constraints> + <check name='valid_enum' target='squid_heure_debut'> + <param>["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24"]</param> + </check> + <check name='valid_enum' target='squid_heure_fin'> + <param>["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24"]</param> + </check> + <check name='valid_enum' target='dansguardian_heure_debut'> + <param>["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24"]</param> + </check> + <check name='valid_enum' target='dansguardian_heure_fin'> + <param>["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24"]</param> + </check> + <!-- FIXME 2.4 #5440 --> + <!--<condition name='disabled_if_in' source='envoyer_tous_logs'> + <param>oui</param> + <target type='variable'>envoyer_logs_squid</target> + </condition>--> + <condition name='disabled_if_in' source='envoyer_logs_squid'> + <param>non</param> + <target type='variable'>activate_squid_realtime</target> + </condition> + <condition name='disabled_if_in' source='activate_squid_realtime'> + <param>oui</param> + <target type='variable'>squid_heure_debut</target> + <target type='variable'>squid_heure_fin</target> + </condition> + <!-- FIXME 2.4 #5440 --> + <!--<condition name='disabled_if_in' source='envoyer_tous_logs'> + <param>oui</param> + <target type='variable'>envoyer_logs_dansguardian</target> + </condition>--> + <condition name='disabled_if_in' source='envoyer_logs_dansguardian'> + <param>non</param> + <target type='variable'>activate_dansguardian_realtime</target> + </condition> + <condition name='disabled_if_in' source='activate_dansguardian_realtime'> + <param>oui</param> + <target type='variable'>dansguardian_heure_debut</target> + <target type='variable'>dansguardian_heure_fin</target> + </condition> + </constraints> + <help/> +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/dictionaries/23_proxy.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/dictionaries/23_proxy.xml new file mode 100644 index 0000000000000000000000000000000000000000..758c08ce95924349c0e817b050f1f59f57c7ee39 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/dictionaries/23_proxy.xml @@ -0,0 +1,1200 @@ +<?xml version='1.0' encoding='utf-8'?> +<creole> + + <files> + <file name='/usr/share/ead2/backend/config/perms/perm_proxy.ini'/> + <file name='/var/lib/eole/config/amon.cfg'/> + <!--Les logs sont sur le maitre donc ils doivent tourner sur le maitre --> + <file name='/etc/logrotate.d/squid_rsyslog' source='squid.logrotate'/> + <file name='/etc/lightsquid/lightsquid.cfg'/> + <file filelist='guardian' name='/etc/logrotate.d/guardian' source='guardian.logrotate' rm='True'/> + <file filelist='guardian' name='/usr/share/nginx/html/guardian.html' source='guardian-template-nginx.html' mkdir="True"/> + <service_access service='lightsquid'> + <port port_type='SymLinkOption'>lightsquid_port</port> + </service_access> + <service_restriction service='lightsquid'> + <ip interface='eth0' netmask='netmask_admin_eth0' netmask_type='SymLinkOption' ip_type='SymLinkOption'>ip_admin_eth0</ip> + <ip interface='eth1' netmask='netmask_admin_eth1' netmask_type='SymLinkOption' ip_type='SymLinkOption'>ip_admin_eth1</ip> + <ip interface='eth2' netmask='netmask_admin_eth2' netmask_type='SymLinkOption' ip_type='SymLinkOption'>ip_admin_eth2</ip> + <ip interface='eth3' netmask='netmask_admin_eth3' netmask_type='SymLinkOption' ip_type='SymLinkOption'>ip_admin_eth3</ip> + <ip interface='eth4' netmask='netmask_admin_eth4' netmask_type='SymLinkOption' ip_type='SymLinkOption'>ip_admin_eth4</ip> + </service_restriction> + </files> + + <containers> + <container name="proxy" id='20'> + <package>eole-proxy-pkg</package> + <package instance_mode='when_no_container'>eole-antivirus-pkg</package> + <package instance_mode='when_container'>eole-antivirus-container-pkg</package> + <service>squid</service> + <host hostlist='auth_smb' name='nom_serveur_smb' ip='ip_serveur_smb' instance_mode='when_container' + crossed='False' comment='serveurs d’authentification SMB'/> + <service_access service='squid3'> + <port>3128</port> + <port service_accesslist="squid3-2" port_type="SymLinkOption">proxy2_port</port> + </service_access> + <service_restriction service='squid3'> + <!--interface--> + <ip service_restrictionlist='proxy_eth0' interface='eth0' netmask='adresse_netmask_eth0' netmask_type='SymLinkOption' ip_type='SymLinkOption'>adresse_network_eth0</ip> + <ip service_restrictionlist='proxy_eth0' interface='eth0' netmask='proxy_eth0_netmask' netmask_type='SymLinkOption' ip_type='SymLinkOption'>proxy_eth0_ip</ip> + <ip interface='eth1' netmask='adresse_netmask_eth1' netmask_type='SymLinkOption' ip_type='SymLinkOption'>adresse_network_eth1</ip> + <ip interface='eth2' netmask='adresse_netmask_eth2' netmask_type='SymLinkOption' ip_type='SymLinkOption'>adresse_network_eth2</ip> + <ip interface='eth3' netmask='adresse_netmask_eth3' netmask_type='SymLinkOption' ip_type='SymLinkOption'>adresse_network_eth3</ip> + <ip interface='eth4' netmask='adresse_netmask_eth4' netmask_type='SymLinkOption' ip_type='SymLinkOption'>adresse_network_eth4</ip> + <!--vlan--> + <ip service_restrictionlist='proxy_eth0' interface='eth0' netmask='vlan_netmask_eth0' netmask_type='SymLinkOption' ip_type='SymLinkOption'>vlan_network_eth0</ip> + <ip interface='eth1' netmask='vlan_netmask_eth1' netmask_type='SymLinkOption' ip_type='SymLinkOption'>vlan_network_eth1</ip> + <ip interface='eth2' netmask='vlan_netmask_eth2' netmask_type='SymLinkOption' ip_type='SymLinkOption'>vlan_network_eth2</ip> + <ip interface='eth3' netmask='vlan_netmask_eth3' netmask_type='SymLinkOption' ip_type='SymLinkOption'>vlan_network_eth3</ip> + <ip interface='eth4' netmask='vlan_netmask_eth4' netmask_type='SymLinkOption' ip_type='SymLinkOption'>vlan_network_eth4</ip> + </service_restriction> + <service servicelist='squid2'>squid3-2</service> + <service servicelist='guardian'>eole-guardian</service> + <service servicelist='clamav_proxy'>clamav-daemon</service> + <!--eth0 est déjà définie au niveau du conteneur ! --> + <interface interfacelist='eth0_proxy_link' linkto="eth0" ip="adresse_ip_eth0_proxy_link" mask="adresse_mask_eth0_proxy_link" bcast="adresse_bcast_eth0_proxy_link">eth0</interface> + <interface interfacelist='eth1_proxy_link' linkto="eth1" ip="adresse_ip_eth1_proxy_link" mask="adresse_mask_eth1_proxy_link" bcast="adresse_bcast_eth1_proxy_link">eth1</interface> + <interface interfacelist='eth2_proxy_link' linkto="eth2" ip="adresse_ip_eth2_proxy_link" mask="adresse_mask_eth2_proxy_link" bcast="adresse_bcast_eth2_proxy_link">eth2</interface> + <interface interfacelist='eth3_proxy_link' linkto="eth3" ip="adresse_ip_eth3_proxy_link" mask="adresse_mask_eth3_proxy_link" bcast="adresse_bcast_eth3_proxy_link">eth3</interface> + <interface interfacelist='eth4_proxy_link' linkto="eth4" ip="adresse_ip_eth4_proxy_link" mask="adresse_mask_eth4_proxy_link" bcast="adresse_bcast_eth4_proxy_link">eth4</interface> + + <file filelist='guardian1' name='/etc/guardian/guardian0/guardian.conf' source="guardian-filtre1.conf" mkdir="True"/> + <file filelist='guardian1' name='/etc/guardian/guardian0/guardianf1.conf' source="guardianf1-filtre1.conf"/> + <file filelist='guardian1' name='/etc/guardian/guardian0/guardianf2.conf' source="guardianf2-filtre1.conf"/> + <file filelist='guardian1' name='/etc/guardian/guardian0/guardianf3.conf' source="guardianf3-filtre1.conf"/> + <file filelist='guardian1' name='/etc/guardian/guardian0/guardianf4.conf' source="guardianf4-filtre1.conf"/> + <file filelist='guardian1' name='/etc/guardian/guardian0/guardianf5.conf' source="guardianf5-filtre1.conf"/> + <file filelist='guardian1' name='/etc/guardian/guardian0/guardianf6.conf' source="guardianf6-filtre1.conf"/> + <file filelist='guardian1' name='/etc/guardian/guardian0/guardianf7.conf' source="guardianf7-filtre1.conf"/> + <file filelist='guardian1' name='/etc/guardian/guardian0/guardianf8.conf' source="guardianf8-filtre1.conf"/> + <file filelist='guardian1' name='/etc/guardian/guardian0/contentscanners/clamdscan.conf' source="guardian-clamdscan-filtre1.conf" mkdir="True"/> + <file filelist='guardian1' name='/etc/guardian/guardian0/common/bannediplist' source="guardian-bannediplist" mkdir="True"/> + <file filelist='guardian1' name='/etc/guardian/guardian0/common/exceptioniplist' source="guardian-exceptioniplist"/> + <file filelist='guardian1' name='/etc/guardian/guardian0/common/fancy.conf' source="guardian-fancy-filtre1.conf"/> + <file filelist='guardian1' name='/etc/guardian/guardian0/common/filtergroupslist' source="guardian-filtergroupslist-filtre1"/> + <file filelist='guardian1' name='/etc/guardian/guardian0/common/ip.conf' source="guardian-ip-filtre1.conf"/> + + <file filelist='guardian2' name='/etc/guardian/guardian1/guardian.conf' source="guardian-filtre2.conf" mkdir='True'/> + <file filelist='guardian2' name='/etc/guardian/guardian1/guardianf1.conf' source="guardianf1-filtre2.conf"/> + <file filelist='guardian2' name='/etc/guardian/guardian1/guardianf2.conf' source="guardianf2-filtre2.conf"/> + <file filelist='guardian2' name='/etc/guardian/guardian1/guardianf3.conf' source="guardianf3-filtre2.conf"/> + <file filelist='guardian2' name='/etc/guardian/guardian1/guardianf4.conf' source="guardianf4-filtre2.conf"/> + <file filelist='guardian2' name='/etc/guardian/guardian1/guardianf5.conf' source="guardianf5-filtre2.conf"/> + <file filelist='guardian2' name='/etc/guardian/guardian1/guardianf6.conf' source="guardianf6-filtre2.conf"/> + <file filelist='guardian2' name='/etc/guardian/guardian1/guardianf7.conf' source="guardianf7-filtre2.conf"/> + <file filelist='guardian2' name='/etc/guardian/guardian1/guardianf8.conf' source="guardianf8-filtre2.conf"/> + <file filelist='guardian2' name='/etc/guardian/guardian1/contentscanners/clamdscan.conf' source="guardian-clamdscan-filtre2.conf" mkdir="True"/> + <file filelist='guardian2' name='/etc/guardian/guardian1/common/bannediplist' source="guardian-bannediplist" mkdir="True"/> + <file filelist='guardian2' name='/etc/guardian/guardian1/common/exceptioniplist' source="guardian-exceptioniplist"/> + <file filelist='guardian2' name='/etc/guardian/guardian1/common/fancy.conf' source="guardian-fancy-filtre2.conf"/> + <file filelist='guardian2' name='/etc/guardian/guardian1/common/filtergroupslist' source="guardian-filtergroupslist-filtre2"/> + <file filelist='guardian2' name='/etc/guardian/guardian1/common/ip.conf' source="guardian-ip-filtre2.conf"/> + + <file filelist='guardian3' name='/etc/guardian/guardian2/guardian.conf' source="guardian-filtre3.conf" mkdir='True'/> + <file filelist='guardian3' name='/etc/guardian/guardian2/guardianf1.conf' source="guardianf1-filtre3.conf"/> + <file filelist='guardian3' name='/etc/guardian/guardian2/guardianf2.conf' source="guardianf2-filtre3.conf"/> + <file filelist='guardian3' name='/etc/guardian/guardian2/guardianf3.conf' source="guardianf3-filtre3.conf"/> + <file filelist='guardian3' name='/etc/guardian/guardian2/guardianf4.conf' source="guardianf4-filtre3.conf"/> + <file filelist='guardian3' name='/etc/guardian/guardian2/guardianf5.conf' source="guardianf5-filtre3.conf"/> + <file filelist='guardian3' name='/etc/guardian/guardian2/guardianf6.conf' source="guardianf6-filtre3.conf"/> + <file filelist='guardian3' name='/etc/guardian/guardian2/guardianf7.conf' source="guardianf7-filtre3.conf"/> + <file filelist='guardian3' name='/etc/guardian/guardian2/guardianf8.conf' source="guardianf8-filtre3.conf"/> + <file filelist='guardian3' name='/etc/guardian/guardian2/contentscanners/clamdscan.conf' source="guardian-clamdscan-filtre3.conf" mkdir="True"/> + <file filelist='guardian3' name='/etc/guardian/guardian2/common/bannediplist' source="guardian-bannediplist" mkdir="True"/> + <file filelist='guardian3' name='/etc/guardian/guardian2/common/exceptioniplist' source="guardian-exceptioniplist"/> + <file filelist='guardian3' name='/etc/guardian/guardian2/common/fancy.conf' source="guardian-fancy-filtre3.conf"/> + <file filelist='guardian3' name='/etc/guardian/guardian2/common/filtergroupslist' source="guardian-filtergroupslist-filtre3"/> + <file filelist='guardian3' name='/etc/guardian/guardian2/common/ip.conf' source="guardian-ip-filtre3.conf"/> + + <file filelist='guardian' name='/etc/e2guardian/languages/french/template.html' source='guardian-template.html'/> + <file filelist='guardian' name='/etc/e2guardian/languages/french/template-liste_blanche.html' source='guardian-template-liste_blanche.html'/> + <file filelist='guardian' name='/etc/e2guardian/languages/french/template-moderateur.html' source='guardian-template-moderateur.html'/> + <file filelist='guardian' name='/etc/e2guardian/languages/french/template-utilisateur_interdits.html' source='guardian-template-utilisateur_interdits.html'/> + + <file name='/etc/logrotate.d/winbind' source='winbind.logrotate'/> + <file name='/etc/pam.d/squid' source='squid.pam'/> + <!-- squid : parties communes --> + <file name='/etc/squid/common-squid1.conf' del_comment='#'/> + <file name='/etc/squid/common-squid2.conf' del_comment='#'/> + <!-- squid : 1ère instance --> + <file name='/etc/squid/squid.conf' source='01squid.conf' del_comment='#'/> + <file name='/etc/squid/01inc-squid.conf' del_comment='#'/> + <!-- squid : 2ème instance --> + <file filelist='squid2' name='/etc/squid/squid2.conf' source='02squid.conf' del_comment='#'/> + <file filelist='squid2' name='/etc/squid/02inc-squid.conf' del_comment='#'/> + <file name='/etc/squid/domaines_nocache'/> + <file name='/etc/squid/domaines_noauth'/> + + <!--authentification--> + <file name='/etc/nsswitch.conf' source='nsswitch-proxy_auth.conf'/> + <service servicelist='ntlm'>smbd</service> + <service servicelist='ntlm'>nmbd</service> + <service servicelist='ntlm'>winbind</service> + <file filelist='ntlm' name='/etc/samba/smb.conf' source='smb-proxy_auth.conf'/> + <file filelist='kerberos' name='/etc/samba/lmhosts' /> + <file filelist='kerberos' name='/etc/krb5.conf' /> + + <file filelist='clamav_proxy' name='/etc/clamav/clamd.conf'/> + + </container> + </containers> + + <variables> + + <family name='general'> + <variable name='url_maj_blacklist' type='web_address' description='Adresse web de mise à jour des blacklists' mode='expert' mandatory='True'> + <value>http://eole.orion.education.fr/maj/blacklists</value> + </variable> + </family> + + <family name='services'> + <variable name='activer_filtrage_proxy' type='oui/non' description='Activer le filtrage sur le proxy' mode='expert'> + <value>oui</value> + </variable> + <variable name='activer_clam' exists='False' type='oui/non' hidden='True'> + <value>non</value> + </variable> + </family> + + <family name='messagerie'> + <variable name='proxy_cachemaster' type='string' description="Adresse courriel du cachemaster"/> + </family> + + <family name='authentification' icon='key'> + <variable name='num_dansguardian_instance' type='string' description="Nombre de filtres web (filtrage web et pare-feu) configurables" hidden='True'/> + <variable name='activer_squid_auth' type='oui/non' description="Activer l'authentification web (proxy)" mode='basic'> + <value>non</value> + </variable> + <variable name='activer_squid2' type='oui/non' description="Activer une deuxième instance de Squid" > + <value>non</value> + </variable> + </family> + + <family name='clamav' hidden='True'> + <variable name='dansguardian_clam' type='oui/non' description="Activer l'anti-virus sur le proxy"> + <value>non</value> + </variable> + </family> + + <family name='Interface-0'> + <variable name='dansguardian_eth0' type='string' description='Filtre web à appliquer sur cette interface' mode='expert'> + <value>1</value> + </variable> + <variable name='adresse_ip_eth0_proxy_link' type='ip' description="Adresse IP pour le proxy" mandatory='True'/> + <variable name='adresse_mask_eth0_proxy_link' type='netmask' description="Masque de sous réseau du proxy" mandatory='True' mode='expert'/> + <variable name='adresse_bcast_eth0_proxy_link' type='broadcast' description="Broadcast pour le proxy" mandatory='True'/> + <variable name='activer_supp_proxy_eth0' type='oui/non' description='Autoriser des réseaux supplémentaires à se connecter sur le proxy' mode='expert'> + <value>non</value> + </variable> + <variable name='proxy_eth0_ip' type='network' description="Réseaux supplémentaires autorisés à se connecter sur le proxy" mode="expert" multi="True" mandatory='True'/> + <variable name='proxy_eth0_netmask' type='netmask' description="Masque de sous réseau" mode="expert" mandatory='True'/> + </family> + <family name='Interface-1'> + <variable name='nom_machine_eth1' type='hostname_strict' description="Nom de la zone (pour résolution DNS)" mandatory='True' /> + <!--**** variable de configuration pour dansguardian (choix de l'instance) ****--> + <variable name='dansguardian_eth1' type='string' description='Filtre web à appliquer sur cette interface' > + <value>1</value> + </variable> + <variable name='squid_auth_eth1' type='oui/non' description="Activer l'authentification sur cette interface" > + <value>oui</value> + </variable> + <variable name='adresse_ip_eth1_proxy_link' type='ip' description="Adresse IP pour le proxy" mandatory='True'/> + <variable name='adresse_mask_eth1_proxy_link' type='netmask' description="Masque de sous réseau du proxy" mandatory='True' mode='expert'/> + <variable name='adresse_bcast_eth1_proxy_link' type='broadcast' description="Broadcast pour le proxy" mandatory='True'/> + </family> + <family name='Interface-2'> + <variable name='nom_machine_eth2' type='hostname_strict' description="Nom de la zone (pour résolution DNS)" mandatory='True'/> + <!-- variable de configuration pour dansguardian (choix de l'instance) --> + <variable name='dansguardian_eth2' type='string' description='Filtre web à appliquer sur cette interface' > + <value>1</value> + </variable> + <variable name='squid_auth_eth2' type='oui/non' description="Activer l'authentification sur cette interface" > + <value>oui</value> + </variable> + <variable name='adresse_ip_eth2_proxy_link' type='ip' description="Adresse IP pour le proxy" mandatory='True'/> + <variable name='adresse_mask_eth2_proxy_link' type='netmask' description="Masque de sous réseau du proxy" mandatory='True' mode='expert'/> + <variable name='adresse_bcast_eth2_proxy_link' type='broadcast' description="Broadcast pour le proxy" mandatory='True'/> + </family> + <family name='Interface-3'> + <variable name='nom_machine_eth3' type='hostname_strict' description="Nom de la zone (pour résolution DNS)" mandatory='True'> + <value>dmz-priv</value> + </variable> + <!-- variable de configuration pour dansguardian (choix de l'instance) --> + <variable name='dansguardian_eth3' type='string' description='Filtre web à appliquer sur cette interface' > + <value>1</value> + </variable> + <variable name='squid_auth_eth3' type='oui/non' description="Activer l'authentification sur cette interface" > + <value>oui</value> + </variable> + <variable name='adresse_ip_eth3_proxy_link' type='ip' description="Adresse IP pour le proxy" mandatory='True'/> + <variable name='adresse_mask_eth3_proxy_link' type='netmask' description="Masque de sous réseau du proxy" mandatory='True' mode='expert'/> + <variable name='adresse_bcast_eth3_proxy_link' type='broadcast' description="Broadcast pour le proxy" mandatory='True'/> + </family> + <family name='Interface-4'> + <variable name='nom_machine_eth4' type='hostname_strict' description="Nom de la zone (pour résolution DNS)" mandatory='True'> + <value>dmz-pub</value> + </variable> + <!-- variable de configuration pour dansguardian (choix de l'instance) --> + <variable name='dansguardian_eth4' type='string' description='Filtre web à appliquer sur cette interface' > + <value>1</value> + </variable> + <variable name='squid_auth_eth4' type='oui/non' description="Activer l'authentification sur cette interface" > + <value>oui</value> + </variable> + <variable name='adresse_ip_eth4_proxy_link' type='ip' description="Adresse IP pour le proxy" mandatory='True'/> + <variable name='adresse_mask_eth4_proxy_link' type='netmask' description="Masque de sous réseau du proxy" mandatory='True' mode='expert'/> + <variable name='adresse_bcast_eth4_proxy_link' type='broadcast' description="Broadcast pour le proxy" mandatory='True'/> + </family> + + <family name='filtrage web' mode='expert' icon='code-fork'> + <variable name='dans_instance_1_active' type='oui/non' hidden='True'/> + <variable name='dans_instance_2_active' type='oui/non' hidden='True'/> + <variable name='dans_instance_3_active' type='oui/non' hidden='True'/> + <variable name="dans_num_opt_filters" type="string" description='Nombre de politiques optionnelles de filtrage par zone'> + <value>3</value> + </variable> + <variable name="docbodytimeout" type="number" description='Proxy Timeout (ex: Doc Body Timeout)'> + <value>20</value> + </variable> + <variable name="docheadertimeout" type="number" description='Proxy header exchange (ex: Doc Header Timeout)'> + <value>20</value> + </variable> + <variable name="headertimeout" type="number" description='Pconn timeout (ex: Header Timeout)'> + <value>55</value> + </variable> + <variable name="dansguardian_ead_log" type='string' description="Autoriser la consultation des logs liés au filtrage web dans l'EAD"> + <value>non</value> + </variable> + + <!-- filtre web 1 --> + <variable name="dansguardian_ead_filtre1" type="string" description="Libellé du filtre web 1 dans l'EAD"> + <value>Filtre web 1</value> + </variable> + <variable name='guardian_httpworkers1' type='number' description='Nombre de processus disponibles pour traiter les connexions'> + <value>1000</value> + </variable> + <variable name="dans_cachedir1" type="filename" description='Répertoire de cache'> + <value>/var/spool/guardian1</value> + </variable> + <variable name="dans_maxramsize1" type="number" description='Taille maximum de fichier à scanner conservé en mémoire (en Kibibytes)'> + <value>5000</value> + </variable> + <variable name="dans_maxfilesize1" type="number" description='Taille maximum de fichier à scanner conservé sur le disque (en Kibibytes)'> + <value>20000</value> + </variable> + <variable name="unactive_dansguardian_auth1" type="string" description="Désactiver les plugins qui logguent l'authentification sur la zone 1" hidden="True"> + <value>---</value> + </variable> + <variable name='naughtynesslimit1' type='number' description="Limite de pondération du filtrage"> + <value>50</value> + </variable> + + <!-- filtre web 2 --> + <variable name="dansguardian_ead_filtre2" type="string" description="Libellé du filtre web 2 dans l'EAD"> + <value>Filtre web 2</value> + </variable> + <variable name='guardian_httpworkers2' type='number' description='Nombre de processus disponibles pour traiter les connexions'> + <value>1000</value> + </variable> + <variable name="dans_cachedir2" type="filename" description='Répertoire de cache'> + <value>/var/spool/guardian2</value> + </variable> + <variable name="dans_maxramsize2" type="number" description='Taille maximum de fichier à scanner conservé en mémoire (en Kibibytes)'> + <value>5000</value> + </variable> + <variable name="dans_maxfilesize2" type="number" description='Taille maximum de fichier à scanner conservé sur le disque (en Kibibytes)'> + <value>20000</value> + </variable> + <variable name="unactive_dansguardian_auth2" type="string" description="Désactiver les plugins qui logguent l'authentification sur la zone 2" hidden="True"> + <value>---</value> + </variable> + <variable name='naughtynesslimit2' type='number' description="Limite de pondération du filtrage"> + <value>50</value> + </variable> + + <!-- filtre web 3 --> + <variable name="dansguardian_ead_filtre3" type="string" description="Libellé du filtre web 3 dans l'EAD"> + <value>Filtre web 3</value> + </variable> + <variable name='guardian_httpworkers3' type='number' description='Nombre de processus disponibles pour traiter les connexions'> + <value>1000</value> + </variable> + <variable name="dansguardian_port3" type="port" description="Port d'écoute pour le 3ème filtre web"> + <value>3129</value> + </variable> + <variable name="dans_cachedir3" type="filename" description='Répertoire de cache'> + <value>/var/spool/guardian3</value> + </variable> + <variable name="dans_maxramsize3" type="number" description='Taille maximum de fichier à scanner conservé en mémoire (en Kibibytes)'> + <value>5000</value> + </variable> + <variable name="dans_maxfilesize3" type="number" description='Taille maximum de fichier à scanner conservé sur le disque (en Kibibytes)'> + <value>20000</value> + </variable> + <variable name="unactive_dansguardian_auth3" type="string" description="Désactiver les plugins qui logguent l'authentification sur la zone 3" hidden="True"> + <value>---</value> + </variable> + <variable name='naughtynesslimit3' type='number' description="Limite de pondération du filtrage"> + <value>50</value> + </variable> + </family> + + <family name='squid' mode='expert' icon='code-fork'> + <variable name='lightsquid_auto' type='oui/non' description="Générer les statistiques Squid automatiquement"> + <value>non</value> + </variable> + <variable name='lightsquid_port' type='port' description="Port d'écoute du CGI LightSquid"> + <value>8062</value> + </variable> + <variable name='lightsquid_anon_mode' type='string' description="Méthode d’anonymisation des rapports LightSquid"> + <value>aucune</value> + </variable> + <variable name='https_port' type='port' description="Port d'écoute HTTPS de Squid"/> + <variable name='ssl_ports' type='port' description='"SSL_ports" supplémentaire' multi='True'/> + <variable name='safe_ports' type='port' description='"Safe_ports" supplémentaire' multi='True'/> + <variable name='number_of_basic_children' type='number' description="Nombre de processus associés au module d'authentification basique"> + <value>20</value> + </variable> + <variable name='number_of_ntlm_children' type='number' description="Nombre de processus associés au module d'authentification NTLM"> + <value>20</value> + </variable> + <variable name='squid_nopeerproxy_url_regex' type='oui/non' description='Activer les exceptions de cache père de type regexp'> + <value>non</value> + </variable> + <variable name='activer_proxy_refresh_pattern' type='oui/non' description='Personnaliser sélectivement la durée des caches'> + <value>non</value> + </variable> + <variable name="proxy_refresh_pattern_regexp" type='string' description="Expression rationnelle pour le site" mandatory="True" multi='True'/> + <variable name="proxy_refresh_pattern_case_sensitive" type='oui/non' description="L'expression rationnelle est sensible à la casse"> + <value>non</value> + </variable> + <variable name="proxy_refresh_pattern_min" type='number' description="Temps minimum de cache (en minutes)" mandatory="True"/> + <variable name='proxy_refresh_pattern_pourcent' type='number' description="Rapport entre l'âge de l'objet dans le cache et son âge sur le site (en pourcent)" mandatory='True'/> + <variable name='proxy_refresh_pattern_max' type='number' description="Temps maximum de cache (en minutes)" mandatory='True'/> + <variable name='proxy_refresh_pattern_options' type='string' description='Options'/> + <variable name='icp_port' type='port' description="Port d'écoute pour les requêtes ICP"> + <value>3130</value> + </variable> + <variable name='htcp_port' type='port' description="Port d'écoute pour les requêtes HTCP"> + <value>4827</value> + </variable> + <variable name='icp_query_timeout' type='number' description='Timout pour les requêtes ICP (en msec)'> + <value>0</value> + </variable> + <variable name='maximum_icp_query_timeout' type='number' description='Maximum_icp_query_timeout (en msec)'> + <value>2000</value> + </variable> + <!-- FIXME : mcast --> + <variable name='mcast_groups' type='string' description="Groupe de serveurs multicast" hidden='True'/> + <variable name='mcast_icp_query_timeout' type='number' description='Mcast_icp_query_timeout (en msec)' hidden='True'> + <value>2000</value> + </variable> + <!-- --> + <variable name='dead_peer_timeout' type='number' description='Dead_peer_timeout (en sec)'> + <value>10</value> + </variable> + <variable name='forward_max_tries' type='number' description='Nombre maximum de redirections testées'> + <value>25</value> + </variable> + <!--<variable name='cache_vary' type='string' description=''> + <value>on</value> + </variable>--> + <variable name='cache_mem' type='number' description='Taille maximale de la mémoire cache (en MB)'> + <value>256</value> + </variable> + <variable name='cache_swap_low' type='number' description='Cache_swap_low (en %)'> + <value>90</value> + </variable> + <variable name='cache_swap_high' type='number' description='Cache_swap_high (en %)'> + <value>95</value> + </variable> + <variable name='minimum_object_size' type='number' description='Minimum_object_size (en KB)'> + <value>0</value> + </variable> + <variable name='maximum_object_size' type='number' description='Maximum_object_size (en KB)'> + <value>32768</value> + </variable> + <variable name='maximum_object_size_in_memory' type='number' description="Taille maximum d'un objet à mettre en cache (en KB)"> + <value>512</value> + </variable> + <variable name='ipcache_size' type='number' description="Ipcache_size (en nombre d'entrées)"> + <value>1024</value> + </variable> + <variable name='ipcache_low' type='number' description='Ipcache_low (en %)'> + <value>90</value> + </variable> + <variable name='ipcache_high' type='number' description='Ipcache_high (en %)'> + <value>95</value> + </variable> + <variable name='fqdncache_size' type='number' description="Fqdncache_size (en nombre d'entrées)"> + <value>1024</value> + </variable> + <variable name='cache_replacement_policy' type='string' description='Cache_replacement_policy'> + <value>lru</value> + </variable> + <variable name='memory_replacement_policy' type='string' description='Memory_replacement_policy'> + <value>lru</value> + </variable> + <variable name='cache_dir' type='filename' description='Emplacement du cache' multi='True' mandatory='True'> + <value>/var/spool/squid</value> + </variable> + <variable name='cache_dir_type' type='string' description='Type de stockage utilisé'> + <value>ufs</value> + </variable> + <variable name='cache_dir_disk_space' type='string' description='Taille du cache (en MBytes)' mandatory='True'> + <value>1000</value> + </variable> + <variable name='cache_dir_firstLevel' type='string' description='Nombre maximum de répertoires de niveau 1' mandatory='True'> + <value>16</value> + </variable> + <variable name='cache_dir_secondLevel' type='string' description='Nombre maximum de répertoires de niveau 2' mandatory='True'> + <value>256</value> + </variable> + <variable name='log_mime_hdrs' type='on/off' description='Log_mime_hdrs'> + <value>off</value> + </variable> + <variable name='client_netmask' type='netmask' description='Masque réseau des clients '> + <value>255.255.255.255</value> + </variable> + <variable name='strip_query_terms' type='on/off' description='Activer la réduction URLs dans les logs'> + <value>off</value> + </variable> + <variable name='ftp_user' type='unix_user' description='Utilisateur FTP'> + <value>ftp</value> + </variable> + <!--<variable name='ftp_list_width' type='number' description=''> + <value>32</value> + </variable>--> + <variable name='ftp_passive' type='on/off' description='Autoriser les connexions FTP passives'> + <value>on</value> + </variable> + <variable name='ftp_sanitycheck' type='on/off' description='Activer la vérification des connexions FTP'> + <value>on</value> + </variable> + <variable name='ftp_telnet_protocol' type='on/off' description='Ftp_telnet_protocol'> + <value>on</value> + </variable> + <variable name='check_hostname' type='on/off' description="Activer la vérification des noms d'hôte"> + <value>off</value> + </variable> + <variable name='allow_underscore' type='on/off' description="Autoriser les underscore dans les noms d'hôte"> + <value>on</value> + </variable> + <!--<variable name='cache_dns_program' type='string' description=''> + <value>/usr/lib/squid/dnsserver</value> + </variable>--> + <!--<variable name='dns_children' type='number' description=''> + <value>5</value> + </variable> + <variable name='dns_retransmit_interval' type='number' description='en secondes'> + <value>5</value> + </variable> + <variable name='dns_timeout' type='number' description='Timeout des requêtes DNS (en minutes)'> + <value>2</value> + </variable>--> + <variable name='dns_defnames' type='on/off' description='Dns_defnames'> + <value>off</value> + </variable> + <variable name='dns_nameservers' type='domain' description='Utiliser un DNS spécifique' multi='True'/> + <variable name='hosts_file' type='filename' description='Emplacement du fichier hosts' hidden='True'> + <value>/etc/hosts</value> + </variable> + <!--<variable name='wais_relay_host' type='string' description=''> + <value></value> + </variable>--> + <!--<variable name='wais_relay_port' type='number' description=''> + <value>0</value> + </variable>--> + <variable name='request_header_max_size' type='number' description='Taille maximum des en-têtes HTTP dans une requête (en KB)'> + <value>64</value> + </variable> + <variable name='request_body_max_size' type='number' description="Taille maximum d'un corps de requête HTTP (en MB)"> + <value>0</value> + </variable> + <variable name='quick_abort_min' type='number' description='Quick_abort_min (en KB)'> + <value>16</value> + </variable> + <variable name='quick_abort_max' type='number' description='Quick_abort_max (en KB)'> + <value>16</value> + </variable> + <variable name='quick_abort_pct' type='number' description='Quick_abort_pct (en %)'> + <value>95</value> + </variable> + <variable name='read_ahead_gap' type='number' description='Read_ahead_gap (en KB)'> + <value>16</value> + </variable> + <variable name='negative_ttl' type='number' description='Time-to-Live par défaut pour les requêtes en échec (en min)'> + <value>0</value> + </variable> + <variable name='positive_dns_ttl' type='number' description='Positive_dns_ttl (en heures)'> + <value>6</value> + </variable> + <variable name='negative_dns_ttl' type='number' description='Negative_dns_ttl (en min)'> + <value>1</value> + </variable> + <variable name='range_offset_limit' type='number' description='Range_offset_limit (en KB)'> + <value>0</value> + </variable> + + <variable name='forward_timeout' type='number' description='Forward timeout (en sec)'> + <value>240</value> + </variable> + <variable name='connect_timeout' type='number' description='Connect timeout (en sec)'> + <value>60</value> + </variable> + <variable name='peer_connect_timeout' type='number' description='Peer connect timeout (en sec)'> + <value>30</value> + </variable> + <variable name='read_timeout' type='number' description='Read timeout (en sec)'> + <value>900</value> + </variable> + <variable name='request_timeout' type='number' description='Request timeout (en sec)'> + <value>300</value> + </variable> + <variable name='persistent_request_timeout' type='number' description='Persistent request timeout (en sec)'> + <value>120</value> + </variable> + + <variable name='client_lifetime' type='number' description='Durée maximum pendant laquelle un client peut rester connecté au cache (en min)'> + <value>1440</value> + </variable> + <variable name='half_closed_clients' type='on/off' description='Half_closed_clients'> + <value>off</value> + </variable> + <variable name='pconn_timeout' type='number' description='Timout pour les connexions persistantes (en sec)'> + <value>60</value> + </variable> + <variable name='ident_timeout' type='number' description='Ident_timeout (en sec)'> + <value>10</value> + </variable> + <variable name='shutdown_lifetime' type='number' description='Shutdown_lifetime (en sec)'> + <value>30</value> + </variable> + </family> + + <family name='squid2' mode='expert' icon='code-fork'> + <variable name='proxy2_port' type="port" description="Port d'écoute de la seconde instance de Squid" mandatory='True'/> + <variable name='cache_dir_2' type='filename' description='Emplacement du cache' multi='True' mandatory='True'> + <value>/var/spool/squid2</value> + </variable> + <variable name='cache_dir_type_2' type='string' description='Type de stockage utilisé'> + <value>ufs</value> + </variable> + <variable name='cache_dir_disk_space_2' type='number' description='Taille du cache (en MBytes)' mandatory='True'> + <value>1000</value> + </variable> + <variable name='cache_dir_firstLevel_2' type='number' description='Nombre maximum de répertoires de niveau 1' mandatory='True'> + <value>16</value> + </variable> + <variable name='cache_dir_secondLevel_2' type='number' description='Nombre maximum de répertoires de niveau 2' mandatory='True'> + <value>256</value> + </variable> + </family> + + <family name='proxy authentifié' icon='key'> + <variable name='type_squid_auth' type='string' description="Type d'authentification" mode='basic'> + <value>NTLM/SMB</value> + </variable> + <!-- **** LDAP **** --> + <variable name='ip_serveur_ldap1' type='ip' description='Adresse du premier serveur LDAP' mandatory='True' mode='basic'/> + <variable name='ip_serveur_ldap2' type='ip' description='Adresse du second serveur LDAP (si le 1er ne répond pas)' /> + <variable name='proxy_ldap_base_dn' type='string' description="Suffixe racine de l'annuaire LDAP (base DN)" mandatory='True' mode='basic'/> + <!-- **** LDAP (Active Directory)**** --> + <variable name='ip_serveur_ldapad' type='ip' description='Adresse IP du serveur LDAP (Active Directory)' mandatory='True'/> + <variable name='ldapad_base_dn' type='string' description="Suffixe racine de l'annuaire LDAP (base DN Active Directory)" mandatory='True'/> + <variable name='ldapad_user' type='string' description="Nom du compte nécessaire pour l'interrogation LDAP (Active Directory)" mandatory='True'/> + <variable name='ldapad_passwd' type='password' description="Mot de passe du compte nécessaire pour l'interrogation LDAP (Active Directory)" mandatory='True'/> + <!-- **** NTLM **** --> + <variable name='nom_serveur_smb' type='netbios' description='Nom du contrôleur de domaine SMB' mandatory='True'/> + <variable name='nom_domaine_smb' type='netbios' description='Nom du domaine SMB' mandatory='True'/> + <variable name='ip_serveur_smb' type='ip' description='Adresse IP du contrôleur de domaine SMB' mandatory='True'/> + <!-- **** KRB **** --> + <variable name='nom_serveur_krb' type='hostname_strict' description='Nom du contrôleur de domaine KERBEROS' mandatory='True'/> + <variable name='nom_domaine_krb' type='domain' description='Nom du domaine KERBEROS (fqdn)' mandatory='True'/> + <variable name='nom_domaine_windows' type='netbios' description='Nom du domaine Windows' mandatory='True'/> + <variable name='ip_serveur_krb' type='ip' description='Adresse IP du contrôleur de domaine KERBEROS' mandatory='True'/> + </family> + + <family name='proxy authentifié 2' icon='key'> + <variable name='type_squid_auth_2' type='string' description="Type d'authentification" > + <value>Ldap</value> + </variable> + <!-- **** LDAP **** --> + <variable name='ip_serveur_ldap1_2' type='ip' description='Adresse du premier serveur LDAP' mandatory='True'/> + <variable name='ip_serveur_ldap2_2' type='ip' description='Adresse du second serveur LDAP (si le 1er ne répond pas)' /> + <variable name='proxy_ldap_base_dn_2' type='string' description="Suffixe racine de l'annuaire LDAP (base DN)" mandatory='True'/> + <!-- **** LDAP (Active Directory)**** --> + <variable name='ip_serveur_ldapad_2' type='ip' description='Adresse IP du serveur LDAP (Active Directory)' mandatory='True'/> + <variable name='ldapad_base_dn_2' type='string' description="Suffixe racine de l'annuaire LDAP (base DN Active Directory)" mandatory='True'/> + <variable name='ldapad_user_2' type='string' description="Nom du compte nécessaire pour l'interrogation LDAP (Active Directory)" mandatory='True'/> + <variable name='ldapad_passwd_2' type='password' description="Mot de passe du compte nécessaire pour l'interrogation LDAP (Active Directory)" mandatory='True'/> + </family> + + <separators> + <separator name='dans_num_opt_filters'>Configuration commune aux deux zones</separator> + <separator name='dansguardian_ead_filtre1'>Filtre web 1</separator> + <separator name='dansguardian_ead_filtre2'>Filtre web 2</separator> + <separator name='dansguardian_ead_filtre3'>Filtre web 3</separator> + <separator name='activer_supp_proxy_eth0'>Réseau supplémentaire autorisé sur le proxy</separator> + <separator name='dansguardian_eth1'>Configuration de la politique de filtrage</separator> + <separator name='dansguardian_eth2'>Configuration de la politique de filtrage</separator> + <separator name='dansguardian_eth3'>Configuration de la politique de filtrage</separator> + <separator name='dansguardian_eth4'>Configuration de la politique de filtrage</separator> + <separator name="adresse_ip_eth0_proxy_link">Adresse pour le proxy</separator> + <separator name="adresse_ip_eth1_proxy_link">Adresse pour le proxy</separator> + <separator name="adresse_ip_eth2_proxy_link">Adresse pour le proxy</separator> + <separator name="adresse_ip_eth3_proxy_link">Adresse pour le proxy</separator> + <separator name="adresse_ip_eth4_proxy_link">Adresse pour le proxy</separator> + </separators> + + </variables> + + <constraints> + + <auto name='calc_multi_condition' target='num_dansguardian_instance'> + <param>non</param> + <param type='eole' name='condition_1' hidden='False'>activer_squid2</param> + <param name='match'>2</param> + <param name='mismatch'>3</param> + </auto> + + <condition name='disabled_if_in' source='lightsquid_auto'> + <param>non</param> + <target type='filelist'>lightsquid</target> + </condition> + + <check name='valid_enum' target='lightsquid_anon_mode'> + <param>['aucune', 'par IP', 'anonyme']</param> + </check> + + <condition name='disabled_if_in' source='activer_filtrage_proxy'> + <param>non</param> + <target type='family'>filtrage web</target> + <target type='filelist'>guardian</target> + <target type='filelist'>guardian1</target> + <target type='filelist'>guardian2</target> + <target type='filelist'>guardian3</target> + <target type='servicelist'>guardian</target> + <target type='variable'>url_maj_blacklist</target> + <target type='variable'>proxy_cachemaster</target> + <target type='variable'>dansguardian_clam</target> + <target type='variable'>dansguardian_eth0</target> + <target type='variable'>dansguardian_eth1</target> + <target type='variable'>dansguardian_eth2</target> + <target type='variable'>dansguardian_eth3</target> + <target type='variable'>dansguardian_eth4</target> + </condition> + + <fill name='concat' target='proxy_cachemaster'> + <param>cachemaster@</param> + <param type='eole'>nom_academie</param> + <param>.</param> + <param type='eole'>suffixe_domaine_academique</param> + </fill> + + <condition name='disabled_if_in' source='nombre_interfaces'> + <param>2</param> + <param>3</param> + <param>4</param> + <param>5</param> + <target type='variable'>dansguardian_eth0</target> + <target type='filelist'>guardian0</target> + <target type='service_restrictionlist'>proxy_eth0</target> + </condition> + + <auto name='calc_multi_condition' target='dans_instance_1_active'> + <param>1</param> + <param name="operator">OR</param> + <param type='eole' name='condition_1' hidden='False'>dansguardian_eth0</param> + <param type='eole' name='condition_2' hidden='False'>dansguardian_eth1</param> + <param type='eole' name='condition_3' hidden='False'>dansguardian_eth2</param> + <param type='eole' name='condition_4' hidden='False'>dansguardian_eth3</param> + <param type='eole' name='condition_5' hidden='False'>dansguardian_eth4</param> + <param name='match'>oui</param> + <param name='mismatch'>non</param> + </auto> + <auto name='calc_multi_condition' target='dans_instance_2_active'> + <param>2</param> + <param name="operator">OR</param> + <param type='eole' name='condition_1' hidden='False'>dansguardian_eth0</param> + <param type='eole' name='condition_2' hidden='False'>dansguardian_eth1</param> + <param type='eole' name='condition_3' hidden='False'>dansguardian_eth2</param> + <param type='eole' name='condition_4' hidden='False'>dansguardian_eth3</param> + <param type='eole' name='condition_5' hidden='False'>dansguardian_eth4</param> + <param name='match'>oui</param> + <param name='mismatch'>non</param> + </auto> + <auto name='calc_multi_condition' target='dans_instance_3_active'> + <param>oui</param> + <param type='eole' name='condition_1'>activer_squid_auth</param> + <param type='eole' name='condition_2' hidden='False'>activer_squid2</param> + <param name='match'>oui</param> + <param name='mismatch'>non</param> + </auto> + + <condition name='disabled_if_in' source='dans_instance_1_active'> + <param>non</param> + <target type='filelist'>guardian1</target> + </condition> + <condition name='disabled_if_in' source='dans_instance_2_active'> + <param>non</param> + <target type='filelist'>guardian2</target> + </condition> + <condition name='disabled_if_in' source='dans_instance_3_active'> + <param>non</param> + <target type='filelist'>guardian3</target> + </condition> + <check name='valid_enum' target='type_squid_auth'> + <param>['NTLM/SMB','Ldap','Ldap (Active Directory)','NTLM/KERBEROS','Fichier local']</param> + </check> + <check name='valid_enum' target='type_squid_auth_2'> + <param>['Ldap','Ldap (Active Directory)']</param> + </check> + <group master='proxy_eth0_ip'> + <slave>proxy_eth0_netmask</slave> + </group> + <condition name='disabled_if_in' source='nombre_interfaces'> + <param>1</param> + <target type='interfacelist'>eth1_proxy_link</target> + </condition> + <condition name='disabled_if_in' source='nombre_interfaces'> + <param>1</param> + <param>2</param> + <target type='interfacelist'>eth2_proxy_link</target> + </condition> + <condition name='disabled_if_in' source='nombre_interfaces'> + <param>1</param> + <param>2</param> + <param>3</param> + <target type='interfacelist'>eth3_proxy_link</target> + </condition> + <condition name='disabled_if_in' source='nombre_interfaces'> + <param>1</param> + <param>2</param> + <param>3</param> + <param>4</param> + <target type='interfacelist'>eth4_proxy_link</target> + </condition> + + <condition name='disabled_if_not_in' source='type_squid_auth'> + <param>NTLM/KERBEROS</param> + <target type='filelist'>kerberos</target> + </condition> + + <condition name='disabled_if_not_in' source='type_squid_auth'> + <param>NTLM/KERBEROS</param> + <param>NTLM/SMB</param> + <target type='servicelist'>ntlm</target> + <target type='filelist'>ntlm</target> + </condition> + + <condition name='disabled_if_not_in' source='type_squid_auth'> + <param>NTLM/SMB</param> + <target type='variable'>nom_serveur_smb</target> + <target type='variable'>nom_domaine_smb</target> + <target type='variable'>ip_serveur_smb</target> + <target type='hostlist'>auth_smb</target> + </condition> + <condition name='disabled_if_not_in' source='type_squid_auth'> + <param>NTLM/KERBEROS</param> + <target type='variable'>nom_serveur_krb</target> + <target type='variable'>nom_domaine_krb</target> + <target type='variable'>nom_domaine_windows</target> + <target type='variable'>ip_serveur_krb</target> + </condition> + <auto name='extract_ad_domain_from_realm' target='nom_domaine_windows'> + <param type='eole' name='realm'>nom_domaine_krb</param> + </auto> + <check name='valid_krb_name' target='nom_machine'> + <param type='eole' hidden="False">type_squid_auth</param> + </check> + <condition name='disabled_if_not_in' source='type_squid_auth'> + <param>Ldap</param> + <target type='variable'>ip_serveur_ldap1</target> + <target type='variable'>ip_serveur_ldap2</target> + <target type='variable'>proxy_ldap_base_dn</target> + </condition> + <condition name='disabled_if_not_in' source='type_squid_auth'> + <param>Ldap (Active Directory)</param> + <target type='variable'>ip_serveur_ldapad</target> + <target type='variable'>ldapad_base_dn</target> + <target type='variable'>ldapad_user</target> + <target type='variable'>ldapad_passwd</target> + </condition> + + <!--Deuxième instance de squid--> + <condition name='disabled_if_in' source='activer_squid_auth'> + <param>non</param> + <target type='variable'>activer_squid2</target> + </condition> + <condition name='disabled_if_in' source='activer_squid2'> + <param>non</param> + <target type='family'>squid2</target> + <target type='family'>proxy authentifié 2</target> + <target type='servicelist'>squid2</target> + <target type='filelist'>squid2</target> + <target type='variable'>dansguardian_ead_filtre3</target> + <target type='variable'>dansguardian_port3</target> + <target type='variable'>dans_cachedir3</target> + <target type='variable'>dans_maxramsize3</target> + <target type='variable'>dans_maxfilesize3</target> + <target type='variable'>naughtynesslimit3</target> + </condition> + <condition name='disabled_if_in' source='type_squid_auth_2'> + <param>Ldap (Active Directory)</param> + <target type='variable'>ip_serveur_ldap1_2</target> + <target type='variable'>ip_serveur_ldap2_2</target> + <target type='variable'>proxy_ldap_base_dn_2</target> + </condition> + <condition name='disabled_if_in' source='type_squid_auth_2'> + <param>Ldap</param> + <target type='variable'>ip_serveur_ldapad_2</target> + <target type='variable'>ldapad_base_dn_2</target> + <target type='variable'>ldapad_user_2</target> + <target type='variable'>ldapad_passwd_2</target> + </condition> + + <condition name='frozen_if_in' source='activer_filtrage_proxy'> + <param>oui</param> + <target type='variable'>proxy2_port</target> + </condition> + + <fill name='calc_val_first_value' target='proxy2_port'> + <param type='eole' hidden='False'>dansguardian_port3</param> + <param>3129</param> + </fill> + + <check name="valid_entier" target="proxy_refresh_pattern_pourcent"> + <param name="mini">0</param> + <param name="maxi">100</param> + </check> + + <!--variables communes aux deux zones--> + <check name="valid_enum" target="dans_num_opt_filters"> + <param>['0','1','2','3','4']</param> + </check> + <check name="valid_enum" target="dansguardian_ead_log"> + <param>['oui','non','admin seulement']</param> + </check> + <check name="valid_enum" target='dansguardian_eth0'> + <param>['1','2']</param> + </check> + <check name="valid_enum" target='dansguardian_eth1'> + <param>['1','2']</param> + </check> + <check name="valid_enum" target='dansguardian_eth2'> + <param>['1','2']</param> + </check> + <check name="valid_enum" target='dansguardian_eth3'> + <param>['1','2']</param> + </check> + <check name="valid_enum" target='dansguardian_eth4'> + <param>['1','2']</param> + </check> + + <!--variables de la zone 1 (guardian0)--> + <check name="valid_enum" target="unactive_dansguardian_auth1" > + <param>['---', 'oui','non']</param> + </check> + + <!--variables de la zone 2 (guardian1) --> + <check name="valid_enum" target="unactive_dansguardian_auth2" > + <param>['---','oui','non']</param> + </check> + + <!--variables de la zone 3 (guardian2) --> + <check name="valid_enum" target="unactive_dansguardian_auth3" > + <param>['---','oui','non']</param> + </check> + + <condition name='disabled_if_in' source='activer_squid_auth'> + <param>non</param> + <target type='family'>proxy authentifié</target> + <target type='variable'>squid_auth_eth1</target> + <target type='variable'>squid_auth_eth2</target> + <target type='variable'>squid_auth_eth3</target> + <target type='variable'>squid_auth_eth4</target> + </condition> + + <condition name='disabled_if_in' source='nombre_interfaces'> + <param>2</param> + <param>3</param> + <param>4</param> + <param>5</param> + <target type='interfacelist'>eth0_proxy_link</target> + <target>adresse_ip_eth0_proxy_link</target> + <target>adresse_mask_eth0_proxy_link</target> + <target>adresse_bcast_eth0_proxy_link</target> + <target>activer_supp_proxy_eth0</target> + </condition> + <condition name='disabled_if_in' source='activer_supp_proxy_eth0'> + <param>non</param> + <target>proxy_eth0_ip</target> + <target>proxy_eth0_netmask</target> + </condition> + <condition name='disabled_if_in' source='mode_conteneur_actif'> + <param>non</param> + <target>adresse_ip_eth0_proxy_link</target> + <target>adresse_mask_eth0_proxy_link</target> + <target>adresse_bcast_eth0_proxy_link</target> + <target>adresse_ip_eth1_proxy_link</target> + <target>adresse_mask_eth1_proxy_link</target> + <target>adresse_bcast_eth1_proxy_link</target> + <target>adresse_ip_eth2_proxy_link</target> + <target>adresse_mask_eth2_proxy_link</target> + <target>adresse_bcast_eth2_proxy_link</target> + <target>adresse_ip_eth3_proxy_link</target> + <target>adresse_mask_eth3_proxy_link</target> + <target>adresse_bcast_eth3_proxy_link</target> + <target>adresse_ip_eth4_proxy_link</target> + <target>adresse_mask_eth4_proxy_link</target> + <target>adresse_bcast_eth4_proxy_link</target> + </condition> + <check name="valid_in_network" target="adresse_ip_eth0_proxy_link" level="warning"> + <param type='eole' hidden="False">adresse_network_eth0</param> + <param type='eole' hidden="False">adresse_netmask_eth0</param> + </check> + <check name="valid_differ" target="adresse_ip_eth0_proxy_link"> + <param type='eole' hidden="False">adresse_ip_eth0</param> + </check> + <check name="valid_in_network" target="adresse_ip_eth1_proxy_link" level="warning"> + <param type='eole' hidden="False">adresse_network_eth1</param> + <param type='eole' hidden="False">adresse_netmask_eth1</param> + </check> + <check name="valid_differ" target="adresse_ip_eth1_proxy_link"> + <param type='eole' hidden="False">adresse_ip_eth1</param> + </check> + <check name="valid_in_network" target="adresse_ip_eth2_proxy_link" level="warning"> + <param type='eole' hidden="False">adresse_network_eth2</param> + <param type='eole' hidden="False">adresse_netmask_eth2</param> + </check> + <check name="valid_differ" target="adresse_ip_eth2_proxy_link"> + <param type='eole' hidden="False">adresse_ip_eth2</param> + </check> + <check name="valid_in_network" target="adresse_ip_eth3_proxy_link" level="warning"> + <param type='eole' hidden="False">adresse_network_eth3</param> + <param type='eole' hidden="False">adresse_netmask_eth3</param> + </check> + <check name="valid_differ" target="adresse_ip_eth3_proxy_link"> + <param type='eole' hidden="False">adresse_ip_eth3</param> + </check> + <check name="valid_in_network" target="adresse_ip_eth4_proxy_link" level="warning"> + <param type='eole' hidden="False">adresse_network_eth4</param> + <param type='eole' hidden="False">adresse_netmask_eth4</param> + </check> + <check name="valid_differ" target="adresse_ip_eth4_proxy_link"> + <param type='eole' hidden="False">adresse_ip_eth4</param> + </check> + <auto name='calc_broadcast' target='adresse_bcast_eth0_proxy_link'> + <param type='eole' name='ip'>adresse_ip_eth0_proxy_link</param> + <param type='eole' name='netmask'>adresse_mask_eth0_proxy_link</param> + </auto> + <fill name='calc_val' target='adresse_mask_eth0_proxy_link'> + <param type='eole' name='valeur'>adresse_netmask_eth0</param> + </fill> + <auto name='calc_broadcast' target='adresse_bcast_eth1_proxy_link'> + <param type='eole' name='ip'>adresse_ip_eth1_proxy_link</param> + <param type='eole' name='netmask'>adresse_mask_eth1_proxy_link</param> + </auto> + <fill name='calc_val' target='adresse_mask_eth1_proxy_link'> + <param type='eole' name='valeur'>adresse_netmask_eth1</param> + </fill> + <auto name='calc_broadcast' target='adresse_bcast_eth2_proxy_link'> + <param type='eole' name='ip'>adresse_ip_eth2_proxy_link</param> + <param type='eole' name='netmask'>adresse_mask_eth2_proxy_link</param> + </auto> + <fill name='calc_val' target='adresse_mask_eth2_proxy_link'> + <param type='eole' name='valeur'>adresse_netmask_eth2</param> + </fill> + <auto name='calc_broadcast' target='adresse_bcast_eth3_proxy_link'> + <param type='eole' name='ip'>adresse_ip_eth3_proxy_link</param> + <param type='eole' name='netmask'>adresse_mask_eth3_proxy_link</param> + </auto> + <fill name='calc_val' target='adresse_mask_eth3_proxy_link'> + <param type='eole' name='valeur'>adresse_netmask_eth3</param> + </fill> + <auto name='calc_broadcast' target='adresse_bcast_eth4_proxy_link'> + <param type='eole' name='ip'>adresse_ip_eth4_proxy_link</param> + <param type='eole' name='netmask'>adresse_mask_eth4_proxy_link</param> + </auto> + <fill name='calc_val' target='adresse_mask_eth4_proxy_link'> + <param type='eole' name='valeur'>adresse_netmask_eth4</param> + </fill> + + <fill name='calc_val' target='ip_serveur_ldap1'> + <param type='eole' name='valeur' optional='True'>adresse_ip_ldap</param> + </fill> + <fill name='calc_val' target='proxy_ldap_base_dn'> + <param type='eole' name='valeur' optional='True'>ldap_base_dn</param> + </fill> + <fill name='calc_val' target='ip_serveur_ldap1_2'> + <param type='eole' name='valeur' optional='True'>adresse_ip_ldap</param> + </fill> + <fill name='calc_val' target='proxy_ldap_base_dn_2'> + <param type='eole' name='valeur' optional='True'>ldap_base_dn</param> + </fill> + + <!--<check name="valid_enum" target='cache_vary'> + <param>['on','off']</param> + </check>--> + <check name="valid_enum" target="cache_replacement_policy"> + <param>['lru','heap GDSF','heap LFUDA','heap LRU']</param> + </check> + + <check name="valid_enum" target="memory_replacement_policy"> + <param>['lru','heap GDSF','heap LFUDA','heap LRU']</param> + </check> + <check name="valid_enum" target="cache_dir_type"> + <param>['ufs']</param> + </check> + <check name="valid_enum" target="cache_dir_type_2"> + <param>['ufs']</param> + </check> + <group master='proxy_refresh_pattern_regexp'> + <slave>proxy_refresh_pattern_case_sensitive</slave> + <slave>proxy_refresh_pattern_min</slave> + <slave>proxy_refresh_pattern_pourcent</slave> + <slave>proxy_refresh_pattern_max</slave> + <slave>proxy_refresh_pattern_options</slave> + </group> + <group master='cache_dir'> + <slave>cache_dir_type</slave> + <slave>cache_dir_disk_space</slave> + <slave>cache_dir_firstLevel</slave> + <slave>cache_dir_secondLevel</slave> + </group> + <group master='cache_dir_2'> + <slave>cache_dir_type_2</slave> + <slave>cache_dir_disk_space_2</slave> + <slave>cache_dir_firstLevel_2</slave> + <slave>cache_dir_secondLevel_2</slave> + </group> + <condition name='disabled_if_in' source='activer_clam'> + <param>non</param> + <target type='servicelist'>clamav_proxy</target> + <target type='filelist'>clamav_proxy</target> + </condition> + <condition name='disabled_if_in' source='activer_proxy_refresh_pattern'> + <param>non</param> + <target>proxy_refresh_pattern_regexp</target> + <target>proxy_refresh_pattern_case_sensitive</target> + <target>proxy_refresh_pattern_min</target> + <target>proxy_refresh_pattern_pourcent</target> + <target>proxy_refresh_pattern_max</target> + <target>proxy_refresh_pattern_options</target> + </condition> + <condition name='disabled_if_in' source='dansguardian_clam'> + <param>non</param> + <target type='servicelist'>clamav_proxy</target> + <target type='filelist'>clamav_proxy</target> + </condition> + <check name="valid_networknetmask" target="proxy_eth0_netmask"> + <param type='eole'>proxy_eth0_ip</param> + </check> + <fill name='calc_multi_condition' target='nom_machine_eth1'> + <param>2</param> + <param type='eole' name='condition_1'>nombre_interfaces</param> + <param name='match'>pedago</param> + <param name='mismatch'>admin</param> + </fill> + <fill name='calc_multi_condition' target='nom_machine_eth2'> + <param>2</param> + <param type='eole' name='condition_1'>nombre_interfaces</param> + <param name='match'>notset</param> + <param name='mismatch'>pedago</param> + </fill> + <check name="valid_differ" target="nom_machine_eth1"> + <param type='eole' hidden="False">nom_machine_eth2</param> + </check> + <check name="valid_differ" target="nom_machine_eth2"> + <param type='eole' hidden="False">nom_machine_eth3</param> + </check> + <check name="valid_differ" target="nom_machine_eth3"> + <param type='eole' hidden="False">nom_machine_eth4</param> + </check> + + <!-- Validation e2guardian Timeouts --> + + <!-- Proxy Timeout entre 5 et 100 --> + <check name='valid_entier' target='docbodytimeout'> + <param name="mini">5</param> + <param name="maxi">100</param> + </check> + <!-- ProxyExchange Timeout entre 20 et 300 --> + <check name='valid_entier' target='docheadertimeout'> + <param name="mini">20</param> + <param name="maxi">300</param> + </check> + <!-- PConTimeout entre 5 et 300 --> + <check name='valid_entier' target='headertimeout'> + <param name="mini">5</param> + <param name="maxi">300</param> + </check> + + <!-- nombre de processus par instance --> + <check name='valid_entier' target='guardian_httpworkers1'> + <param name="mini">20</param> + <param name="maxi">20000</param> + </check> + <check name='valid_entier' target='guardian_httpworkers2'> + <param name="mini">20</param> + <param name="maxi">20000</param> + </check> + <check name='valid_entier' target='guardian_httpworkers3'> + <param name="mini">20</param> + <param name="maxi">20000</param> + </check> + + </constraints> + + <help> + <family name='filtrage web'>Configuration avancée du logiciel de filtrage e2guardian</family> + <variable name='activer_filtrage_proxy'>Active le logiciel de filtrage e2guardian</variable> + <variable name='proxy_cachemaster'>Adresse électronique proposée pour les réclamations liées au filtrage des sites</variable> + <variable name='dansguardian_eth0'>Instance e2guardian à utiliser pour l'interface 0 (1=Configuration 1, 2=Configuration 2)</variable> + <variable name='dansguardian_eth1'>Instance e2guardian à utiliser pour l'interface 1 (1=Configuration 1, 2=Configuration 2)</variable> + <variable name='dansguardian_eth2'>Instance e2guardian à utiliser pour l'interface 2 (1=Configuration 1, 2=Configuration 2)</variable> + <variable name='dansguardian_eth3'>Instance e2guardian à utiliser pour l'interface 3 (1=Configuration 1, 2=Configuration 2)</variable> + <variable name='dansguardian_eth4'>Instance e2guardian à utiliser pour l'interface 4 (1=Configuration 1, 2=Configuration 2)</variable> + <variable name='dans_num_opt_filters'>Nombre de politiques optionnelles (1, 2 et 3) à activer, le diminuer permet un gain de performance</variable> + <variable name='adresse_ip_eth0_proxy_link'>Adresse IP supplémentaire sur cette interface réseau, utilisée pour accèder au proxy. Le serveur aura donc plusieurs adresses IP sur le réseau local.</variable> + <variable name='adresse_ip_eth1_proxy_link'>Adresse IP supplémentaire sur cette interface réseau, utilisée pour accèder au proxy. Le serveur aura donc plusieurs adresses IP sur le réseau local.</variable> + <variable name='adresse_ip_eth2_proxy_link'>Adresse IP supplémentaire sur cette interface réseau, utilisée pour accèder au proxy. Le serveur aura donc plusieurs adresses IP sur le réseau local.</variable> + + <family name='squid'>Configuration du proxy Squid</family> + <variable name='lightsquid_auto'>LightSquid est un analyseur de le log Squid permettant d'afficher sous forme de pages web l'utilisation du proxy</variable> + <variable name='lightsquid_anon_mode'>Méthode d’anonimisation des rapports LightSquid : + - aucune : le nom d’utilisateur est utilisé s’il est disponible + - par IP : les rapports sont générés par adresse IP + - anonyme : le nom « anonyme » est utilisé à la place du nom et de l’adresse IP + </variable> + <variable name='activer_proxy_refresh_pattern'>La directive refresh_pattern permet de personnaliser l'algorithme de gestion du rafraîchissement du cache par site</variable> + <variable name="proxy_refresh_pattern_min">Temps minimum de cache d'un objet sans expiration explicite en-deça duquel l'objet est déclaré "frais"</variable> + <variable name='proxy_refresh_pattern_pourcent'>Rapport entre l'âge de l'objet dans le cache et son âge sur le site en-deça duquel l'objet est déclaré "frais"</variable> + <variable name='proxy_refresh_pattern_max'>Temps maximum de cache d'un objet sans expiration explicite au-delà duquel l'objet est déclaré "périmé"</variable> + <variable name='squid_auth_eth1'>L'authentification sur cette interface s'applique aussi aux VLAN et alias</variable> + <variable name='squid_auth_eth2'>L'authentification sur cette interface s'applique aussi aux VLAN et alias</variable> + <variable name='squid_auth_eth3'>L'authentification sur cette interface s'applique aussi aux VLAN et alias</variable> + <variable name='squid_auth_eth4'>L'authentification sur cette interface s'applique aussi aux VLAN et alias</variable> + <family name='squid2'>Configuration de la seconde instance du proxy Squid</family> + <family name='authentification'>Configuration des authentifications proxy et FreeRADIUS</family> + <family name='proxy authentifié'>Configuration du proxy authentifié</family> + <family name='proxy authentifié 2'>Configuration de l'authentification sur la seconde instance du proxy Squid</family> + + <!-- Proxy Timeout entre 5 et 100 --> + <variable name='docbodytimeout'>Délai d'attente TCP entre le proxy et le guardian (Min 5, Max 100)</variable> + <!-- ProxyExchange Timeout entre 20 et 300 --> + <variable name='docheadertimeout'>Délai d'attente entre le proxy et le guardian (Min 20, Max 300)</variable> + <!-- PConTimeout entre 5 et 300 --> + <variable name='headertimeout'>Combien de secondes une connection persistante attend de nouvelles requêtes (Min 5, Max 300)</variable> + <variable name='guardian_httpworkers1'>1000 processus convient pour une centaine d'utilisateurs, il est possible d'augmenter le nombre de processus à 5000 pour une structure de taille moyenne, 10000 pour une grosse structure. La valeur est également dépendante du nombre de règles et de la quantité de mémoire RAM disponible. Le nombre maximum de processus est limité à 20000.</variable> + <variable name='guardian_httpworkers2'>1000 processus convient pour une centaine d'utilisateurs, il est possible d'augmenter le nombre de processus à 5000 pour une structure de taille moyenne, 10000 pour une grosse structure. La valeur est également dépendante du nombre de règles et de la quantité de mémoire RAM disponible. Le nombre maximum de processus est limité à 20000.</variable> + <variable name='guardian_httpworkers3'>1000 processus convient pour une centaine d'utilisateurs, il est possible d'augmenter le nombre de processus à 5000 pour une structure de taille moyenne, 10000 pour une grosse structure. La valeur est également dépendante du nombre de règles et de la quantité de mémoire RAM disponible. Le nombre maximum de processus est limité à 20000.</variable> + <variable name='naughtynesslimit1'>Limite de pondération du filtrage des pages, chaque élément de la page reçoit un score, la somme est faite et si le score est supérieur à cette limite la page est bloquée (jeunes enfants : 50, enfants : 100, jeunes adultes : 160)</variable> + <variable name='naughtynesslimit2'>Limite de pondération du filtrage des pages, chaque élément de la page reçoit un score, la somme est faite et si le score est supérieur à cette limite la page est bloquée (jeunes enfants : 50, enfants : 100, jeunes adultes : 160)</variable> + <variable name='naughtynesslimit3'>Limite de pondération du filtrage des pages, chaque élément de la page reçoit un score, la somme est faite et si le score est supérieur à cette limite la page est bloquée (jeunes enfants : 50, enfants : 100, jeunes adultes : 160)</variable> + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/dictionaries/24_proxy_parent.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/dictionaries/24_proxy_parent.xml new file mode 100644 index 0000000000000000000000000000000000000000..bd327951396f87c0b9d90731e099e7304120104a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/dictionaries/24_proxy_parent.xml @@ -0,0 +1,151 @@ +<?xml version='1.0' encoding='utf-8'?> +<creole> + + <files/> + + <containers> + + <container name="proxy"> + <service_access service='squid3sibling'> + <port port_type="SymLinkOption" protocol='udp'>icp_port</port> + </service_access> + <service_restriction service='squid3sibling'> + <ip interface='auto' ip_type='SymLinkOption'>proxy_sibling_ip</ip> + </service_restriction> + </container> + + </containers> + + <variables> + + <family name='proxy parent' mode='expert' icon='code-fork'> + + <!-- proxy web parent global --> + <variable name='activer_cache_pere' type='oui/non' description='Utiliser un proxy web parent global'> + <value>non</value> + </variable> + <variable name='nom_cache_pere' type='domain' description='Adresse du serveur proxy web parent' multi="True" mandatory='True'/> + <variable name='port_cache_pere' type='port' description='Port du serveur proxy web parent' mandatory='True'/> + <variable name='port_icp_cache_pere' type='port' description='Port ICP du serveur proxy web parent'> + <value>3130</value> + </variable> + <variable name='options_cache_pere' type='string' description='Options du serveur proxy web parent'> + <value>no-query</value> + </variable> + <variable name='proxy_pere_rvp' type='oui/non' description="Accès aux zones RVP en passant par le serveur proxy web parent global"> + <value>non</value> + </variable> + + <!-- proxy web parent par zone --> + <variable name='activer_cache_pere_zone' type='oui/non' description='Utiliser un proxy web parent par zone'> + <value>non</value> + </variable> + <variable name='nom_cache_pere_zone' type='domain' description='Adresse du serveur proxy web parent pour la zone' multi='True' mandatory='True'/> + <variable name='port_cache_pere_zone' type='port' description='Port du serveur web parent pour la zone' mandatory='True'/> + <variable name='port_icp_cache_pere_zone' type='port' description='Port ICP du serveur web parent pour la zone'> + <value>3130</value> + </variable> + <variable name='type_nom_zone_dns_cache' type='string' description="Méthode d'utilisation de la zone accessible via ce serveur web parent"> + <value>DNS</value> + </variable> + <variable name='nom_zone_dns_cache' type='string' description='Nom DNS ou nom de fichier de la zone accessible via ce serveur web parent' mandatory='True'/> + <variable name='autoriser_proxy_autres' type='oui/non' description="Autoriser son utilisation par d'autres zones que celle de l'interface 1"> + <value>non</value> + </variable> + <variable name='options_cache_pere_zone' type='string' description='Options du serveur proxy web parent'> + <value>proxy-only no-query</value> + </variable> + + <!-- coopération des caches --> + <variable name='activer_proxy_sibling' type='oui/non' description='Activer la coopération des caches'> + <value>non</value> + </variable> + <variable name='proxy_sibling_ip' type='ip' description='Adresse IP du serveur proxy distant' multi="True" mandatory='True'/> + <variable name='proxy_sibling_port' type='port' description='Port du serveur proxy distant' mandatory='True'/> + + </family> + + <separators> + <separator name='activer_cache_pere'>Proxy parent global</separator> + <separator name='activer_cache_pere_zone'>Proxy parent par zone</separator> + <separator name='activer_proxy_sibling'>Coopération des caches</separator> + </separators> + + </variables> + + <constraints> + + <!-- proxy web parent global --> + <group master='nom_cache_pere'> + <slave>port_cache_pere</slave> + <slave>port_icp_cache_pere</slave> + <slave>options_cache_pere</slave> + </group> + <condition name='disabled_if_in' source='activer_cache_pere'> + <param>non</param> + <target type='variable'>nom_cache_pere</target> + <target type='variable'>port_cache_pere</target> + <target type='variable'>port_icp_cache_pere</target> + <target type='variable'>options_cache_pere</target> + <target type='variable'>proxy_pere_rvp</target> + </condition> + <condition name='disabled_if_in' source='install_rvp' fallback='True'> + <param>non</param> + <target type='variable'>proxy_pere_rvp</target> + </condition> + + <!-- proxy web parent par zone --> + <check name='valid_enum' target='type_nom_zone_dns_cache'> + <param>['DNS', 'nom fichier']</param> + </check> + <group master='nom_cache_pere_zone'> + <slave>port_cache_pere_zone</slave> + <slave>port_icp_cache_pere_zone</slave> + <slave>type_nom_zone_dns_cache</slave> + <slave>nom_zone_dns_cache</slave> + <slave>autoriser_proxy_autres</slave> + <slave>options_cache_pere_zone</slave> + </group> + <condition name='disabled_if_in' source='activer_cache_pere_zone'> + <param>non</param> + <target type='variable'>nom_cache_pere_zone</target> + <target type='variable'>port_cache_pere_zone</target> + <target type='variable'>port_icp_cache_pere_zone</target> + <target type='variable'>type_nom_zone_dns_cache</target> + <target type='variable'>nom_zone_dns_cache</target> + <target type='variable'>autoriser_proxy_autres</target> + <target type='variable'>options_cache_pere_zone</target> + </condition> + + <condition name='disabled_if_in' source='nombre_interfaces'> + <param>1</param> + <target type='variable'>autoriser_proxy_autres</target> + </condition> + + <!-- coopération des caches --> + <group master='proxy_sibling_ip'> + <slave>proxy_sibling_port</slave> + </group> + <condition name='disabled_if_in' source='activer_proxy_sibling'> + <param>non</param> + <target type='variable'>proxy_sibling_ip</target> + <target type='variable'>proxy_sibling_port</target> + </condition> + + </constraints> + + <help> + + <family name='proxy parent'>Configuration du chaînage du proxy</family> + <variable name='activer_cache_pere'>Déclarer un ou plusieurs serveurs proxy parents qui seront utilisés pour toutes les zones DNS</variable> + <variable name='options_cache_pere'>Options, séparées par des espaces, ajoutées à la configuration du serveur cache parent (exemple "no-query no-netdb-exchange no-digest"). Attention, l'option "round-robin" est ajoutée automatiquement si plusieurs serveurs père sont définis.</variable> + <variable name='activer_cache_pere_zone'>Déclarer un ou plusieurs serveurs proxy parents associés à des zones DNS particulières</variable> + <variable name='type_nom_zone_dns_cache'>Les zones DNS de destination peuvent être soit renseignées directement dans la variable, soit renseignées dans un fichier texte</variable> + <variable name='options_cache_pere_zone'>Options, séparées par des espaces, ajoutées à la configuration du serveur cache parent de la zone (exemple "no-query no-netdb-exchange no-digest").</variable> + <variable name='nom_zone_dns_cache'>Le nom DNS commence généralement par un '.' (.example.net)</variable> + <variable name='activer_proxy_sibling'>Les serveurs frères (siblings) sont des serveurs de cache d'un niveau hiérarchique égal dont le but est de répartir la charge</variable> + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/extra_dictionaries/schedule/01_majblacklist.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/extra_dictionaries/schedule/01_majblacklist.xml new file mode 100644 index 0000000000000000000000000000000000000000..0f8d136effad4698e3bf97b0185b7c635b033fcd --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/extra_dictionaries/schedule/01_majblacklist.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + <variables> + <family name="majblacklist" description="Mise à jour des listes noires du serveur"> + <variable name="description" type="string" hidden="True"><value>Mise à jour blacklist du serveur</value></variable> + <variable name="day" type="schedule"></variable> + <variable name="mode" type="schedulemod" hidden="True"><value>post</value></variable> + </family> + </variables> + <constraints> + <fill name='calc_multi_condition' target='schedule.majblacklist.day'> + <param>non</param> + <param type='eole' name='condition_1'>activer_filtrage_proxy</param> + <param name='match'>none</param> + <param name='mismatch'>daily</param> + </fill> + </constraints> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/extra_dictionaries/schedule/02_purgecache.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/extra_dictionaries/schedule/02_purgecache.xml new file mode 100644 index 0000000000000000000000000000000000000000..a24bdb4cf2ad44c0bb615423dd9a6cf1cb34f47d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/extra_dictionaries/schedule/02_purgecache.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + <variables> + <family name="purgecache" description="Purge du cache eole-guardian"> + <variable name="description" type="string" hidden="True"><value>Purge du cache eole-guardian</value></variable> + <variable name="day" type="schedule"></variable> + <variable name="mode" type="schedulemod" hidden="True"><value>post</value></variable> + </family> + </variables> + <constraints> + <fill name='calc_multi_condition' target='schedule.purgecache.day'> + <param>non</param> + <param type='eole' name='condition_1'>activer_filtrage_proxy</param> + <param name='match'>none</param> + <param name='mismatch'>daily</param> + </fill> + </constraints> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/etc/bareos/bareosfichiers.d/proxy.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/etc/bareos/bareosfichiers.d/proxy.conf new file mode 100644 index 0000000000000000000000000000000000000000..4657c6659f611b3def02a9dab2505372a4f0bcaa --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/etc/bareos/bareosfichiers.d/proxy.conf @@ -0,0 +1,13 @@ +# fichiers pour le proxy +Include { + Options { + aclsupport = no + @/etc/bareos/include-options.conf + wildfile = "*squid1.info.log-*.lzma" + } + Options { + exclude = yes + regexfile = ".*" + } + File = /var/log/rsyslog/local/squid/ +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/ead2/backend/config/actions/actions_proxy.cfg b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/ead2/backend/config/actions/actions_proxy.cfg new file mode 100644 index 0000000000000000000000000000000000000000..30b6547e93aaf958cbf4e0edd8722cba64c3f5c7 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/ead2/backend/config/actions/actions_proxy.cfg @@ -0,0 +1,13 @@ +amon/navigation_filters_pedago +amon/navigation_filters_admin +amon/navigation_filters_web3 +amon/navigation_poste_admin +amon/navigation_poste_pedago +amon/navigation_visit_admin +amon/navigation_visit_pedago +amon/navigation_visit_web3 +amon/user_admin +amon/user_pedago +amon/user_web3 +amon/squid_list +lightsquid diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/ead2/backend/config/filtres-opt b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/ead2/backend/config/filtres-opt new file mode 100644 index 0000000000000000000000000000000000000000..7938412fd52966e25e2cc7100c4a39405cfd6ec1 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/ead2/backend/config/filtres-opt @@ -0,0 +1,37 @@ +agressif#sites racistes, antisémites, incitant à la haine +astrology#astrologie +audio-video#sites orientés vers l'audio et la vidéo +bank#banques en ligne +blog#sites hébergeant des blogs +celebrity#tout ce qui concerne l'actualite dite people +chat#sites de dialogue et de conversation en ligne +dangerous_material#sites décrivant des moyens de créer du matériel dangereux (explosif, poison, etc) +dating#sites de rencontres +drogue#drogue +filehosting#sites hébergeant des contenus (video, images, son) +financial#informations financières, bourses +forums#forums +gambling#sites de jeux en ligne, casino, etc +games#sites de jeux en ligne, ou de distribution de jeux +hacking#sites de piratage et d'agressions informatiques +lingerie#sites de lingerie +malware#sites qui injectent des malwares +manga#tout ce qui est lié à l'univers des mangas et de la bande dessinée +marketingware#sites de marketing très spéciaux +mixed_adult#sites qui contiennent des portions adultes +mobile-phone#sites pour les mobiles (sonneries, etc) +phishing#sites de phishing, de piéges bancaires ou autres +publicite#bandeaux publicitaires +radio#sites de radio sur Internet +reaffected#sites qui ont changé de propriétaire et donc de contenu +remote-control#sites permettant la prise de contrôle à distance +sect#sectes +shopping#sites de vente et d'achat en ligne +social_networks#sites de réseaux sociaux +sports#sports +strict_redirector#utilisation de proxy distants +strong_redirector#proxy spécifiques +translation#sites de traduction +tricheur#sites qui expliquent comme tricher aux examens +warez#sites de logiciels pirates +webmail#webmail que l'on trouve sur internet (hotmail, webmail.univ-tlse1.fr, etc) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/authplugins/ident.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/authplugins/ident.conf new file mode 100644 index 0000000000000000000000000000000000000000..92d61eebb31a60a97e2660f24e5578a50b16eeb6 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/authplugins/ident.conf @@ -0,0 +1,4 @@ +# Ident auth plugin +# Identifies users via IDENT servers running on client machines + +plugname = 'ident' diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/authplugins/proxy-basic.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/authplugins/proxy-basic.conf new file mode 100644 index 0000000000000000000000000000000000000000..ce365cd4a947f59262f06fe511321908cd722d1d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/authplugins/proxy-basic.conf @@ -0,0 +1,5 @@ +# Proxy-Basic auth plugin +# Identifies usernames in "Proxy-Authorization: Basic" headers; +# relies upon the upstream proxy (squid) to perform the actual password check. + +plugname = 'proxy-basic' diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/authplugins/proxy-ntlm.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/authplugins/proxy-ntlm.conf new file mode 100644 index 0000000000000000000000000000000000000000..dbdd08bd0069f38d3aa20db718f4402616b99b4e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/authplugins/proxy-ntlm.conf @@ -0,0 +1,5 @@ +# Proxy-NTLM auth plugin +# Identifies usernames in "Proxy-Authorization: NTLM" headers; +# relies on the upstream proxy (squid) to perform the actual password check. + +plugname = 'proxy-ntlm' diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/contentscanners/clamdscan.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/contentscanners/clamdscan.conf new file mode 100644 index 0000000000000000000000000000000000000000..c2b33b40d1b3289ddaec1d9dd61cbd077623c896 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/contentscanners/clamdscan.conf @@ -0,0 +1,18 @@ +plugname = 'clamdscan' + +# edit this to match the location of your ClamD UNIX domain socket +#clamdudsfile = '/var/run/clamav/clamd.sock' +clamdudsfile = '/var/run/clamav/clamd' + +# If this string is set, the text it contains shall be removed from the +# beginning of filenames when passing them to ClamD. +# Use it to - for example - support a ClamD running inside a chroot jail: +# if DG's filecachedir is set to "/var/clamdchroot/downloads/" and pathprefix +# is set to "/var/clamdchroot", then file names given to ClamD will be of the +# form "/downloads/tf*" instead of "/var/clamdchroot/downloads/tf*". +#pathprefix = '/var/clamdchroot' + +exceptionvirusmimetypelist = '/etc/guardian/guardian$z/lists/contentscanners/exceptionvirusmimetypelist' +exceptionvirusextensionlist = '/etc/guardian/guardian$z/lists/contentscanners/exceptionvirusextensionlist' +exceptionvirussitelist = '/etc/guardian/guardian$z/lists/contentscanners/exceptionvirussitelist' +exceptionvirusurllist = '/etc/guardian/guardian$z/lists/contentscanners/exceptionvirusurllist' diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/downloadmanagers/default.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/downloadmanagers/default.conf new file mode 100644 index 0000000000000000000000000000000000000000..f1bbb6ad9938ba122771375ad8430f40a669d094 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/downloadmanagers/default.conf @@ -0,0 +1,17 @@ +# The default download manager. +# This is the safest option for unknown user-agents and content types, and +# hence a good one to include last. + +# Which plugin should be loaded? +plugname = 'default' + +# Regular expression for matching user agents +# When not defined, matches all agents. +#useragentregexp = '.*' + +# Lists of mime types and extensions to manage +# When not defined, matches everything. +# These can be enabled separately, but when both enabled, +# a request must match both lists. +#managedmimetypelist = '' +#managedextensionlist = '' diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/init_dans.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/init_dans.py new file mode 100644 index 0000000000000000000000000000000000000000..f7a40dc3e91e9f79a1859955a62e26e8dcf6cec6 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/init_dans.py @@ -0,0 +1,46 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +########################################################################### +# EOLE - 2008-2013 +# Copyright Pole de Competence EOLE (Ministere Education - Academie Dijon) +# Licence CeCill cf /root/LicenceEole.txt +# eole@ac-dijon.fr +# +########################################################################### +from os.path import join, isfile + +from amon.guardian.config import DANS_LOCAL_SUBDIR, \ + LOCAL_TEMPLATE_DIR, optional_policies, local_deported_files +from amon.guardian.dans_tools import set_filtrage +from creole.client import CreoleClient + +def make_local_instance_spec_conf_files(num_zone, indice): + """ + Mise à jour des fichiers bannedurllist et bannedsitelist + """ + dirname = DANS_LOCAL_SUBDIR % (num_zone-1, indice) + ## les fichiers locaux dans lesquels on enlève/ajoute des # + for f_name in local_deported_files: + src = join(LOCAL_TEMPLATE_DIR, f_name) + dst = join(dirname, f_name) + # mise à jour des fichier pour utiliser les même filtres + # que ceux des templates (#2764) + lsrc = file(src).readlines() + ldst = file(dst).readlines() + final = [] + for line1 in lsrc: + current = line1 + for line2 in ldst: + if line1.endswith(line2): + # ligne trouvée avec ou sans # => on l'utilise + current = line2 + break + final.append(current) + file(dst, 'w').writelines(final) + +client = CreoleClient() +for num_zone in range(1, int(client.get_creole('num_dansguardian_instance'))+1): + if client.get_creole('dans_instance_{0}_active'.format(num_zone), 'non') == 'oui': + for policy in optional_policies: + make_local_instance_spec_conf_files(num_zone, policy) + set_filtrage(num_zone-1) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/interdit_templates/bannedsitelist b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/interdit_templates/bannedsitelist new file mode 100644 index 0000000000000000000000000000000000000000..d1e0c1e196dc2d237b22a3585da4bfe62e6782d6 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/interdit_templates/bannedsitelist @@ -0,0 +1,116 @@ +#domains in banned list +#Don't bother with the www. or the http:// + +#The bannedurllist is for blocking PART of a site +#The bannedsitelist is for blocking ALL of a site + +#You can include +#.tld so for example you can match .gov for example + +#The 'grey' lists override the 'banned' lists. +#The 'exception' lists override the 'banned' lists also. +#The difference is that the 'exception' lists completely switch +#off *all* other filtering for the match. 'grey' lists only +#stop the URL filtering and allow the normal filtering to work. + +#An example of grey list use is when in Blanket Block (whitelist) +#mode and you want to allow some sites but still filter as normal +#on their content + +#Another example of grey list use is when you ban a site but want +#to allow part of it. + +#To include additional files in this list use this example: +#.Include</etc/e2guardian/anotherbannedurllist> + +#You can have multiple .Includes. + +# Time limiting syntax: +# #time: <start hour> <start minute> <end hour> <end minute> <days> +# Example: +##time: 9 0 17 0 01234 +# Remove the first # from the line above to enable this list only from +# 9am to 5pm, Monday to Friday. + +# List categorisation +#listcategory: "Banned Sites" + +#List other sites to block: + +# badboys.com + +# NOTE: In e2guardian Blanket blocks are now ONLY supported in this top file +# WARNING: Blanket blocks in .included files will be silently ignored + +#Blanket Block. To block all sites except those in the +#exceptionsitelist and greysitelist files, remove +#the # from the next line to leave only a '**': +#UTILISATEUR INTERDIT +** + +#Blanket SSL/CONNECT Block. To block all SSL +#and CONNECT tunnels except to addresses in the +#exceptionsitelist and greysitelist files, remove +#the # from the next line to leave only a '**s': +#**s + +#Blanket IP Block. To block all sites specified only as an IP, +#remove the # from the next line to leave only a '*ip': +#*ip + +#Blanket SSL/CONNECT IP Block. To block all SSL and CONNECT +#tunnels to sites specified only as an IP, +#remove the # from the next line to leave only a '**ips': +#**ips + + +# The squidGuard advert domain/URL lists are now included by default. +# To work with advanced ad blocking & the logadblocks option, advert +# phrase/site/URL lists should have the string "ADs" in their listcategory. +# .Include</etc/e2guardian/lists/blacklists/ads/domains> + +#Remove the # from the following and edit as needed to use a stock +#squidGuard/urlblacklists collection. +#.Include</etc/e2guardian/lists/blacklists/adult/domains> +#.Include</etc/e2guardian/lists/blacklists/aggressive/domains> +#.Include</etc/e2guardian/lists/blacklists/artnudes/domains> +#.Include</etc/e2guardian/lists/blacklists/audio-video/domains> +#.Include</etc/e2guardian/lists/blacklists/beerliquorinfo/domains> +#.Include</etc/e2guardian/lists/blacklists/beerliquorsale/domains> +#.Include</etc/e2guardian/lists/blacklists/chat/domains> +#.Include</etc/e2guardian/lists/blacklists/childcare/domains> +#.Include</etc/e2guardian/lists/blacklists/clothing/domains> +#.Include</etc/e2guardian/lists/blacklists/culinary/domains> +#.Include</etc/e2guardian/lists/blacklists/dialers/domains> +#.Include</etc/e2guardian/lists/blacklists/drugs/domains> +#.Include</etc/e2guardian/lists/blacklists/entertainment/domains> +#.Include</etc/e2guardian/lists/blacklists/forums/domains> +#.Include</etc/e2guardian/lists/blacklists/frencheducation/domains> +#.Include</etc/e2guardian/lists/blacklists/gambling/domains> +#.Include</etc/e2guardian/lists/blacklists/government/domains> +#.Include</etc/e2guardian/lists/blacklists/hacking/domains> +#.Include</etc/e2guardian/lists/blacklists/homerepair/domains> +#.Include</etc/e2guardian/lists/blacklists/hygiene/domains> +#.Include</etc/e2guardian/lists/blacklists/jewelry/domains> +#.Include</etc/e2guardian/lists/blacklists/jobsearch/domains> +#.Include</etc/e2guardian/lists/blacklists/kidstimewasting/domains> +#.Include</etc/e2guardian/lists/blacklists/mail/domains> +#.Include</etc/e2guardian/lists/blacklists/news/domains> +#.Include</etc/e2guardian/lists/blacklists/onlineauctions/domains> +#.Include</etc/e2guardian/lists/blacklists/onlinegames/domains> +#.Include</etc/e2guardian/lists/blacklists/onlinepayment/domains> +#.Include</etc/e2guardian/lists/blacklists/personalfinance/domains> +#.Include</etc/e2guardian/lists/blacklists/pets/domains> +#.Include</etc/e2guardian/lists/blacklists/porn/domains> +#.Include</etc/e2guardian/lists/blacklists/proxy/domains> +#.Include</etc/e2guardian/lists/blacklists/publicite/domains> +#.Include</etc/e2guardian/lists/blacklists/redirector/domains> +#.Include</etc/e2guardian/lists/blacklists/ringtones/domains> +#.Include</etc/e2guardian/lists/blacklists/sportnews/domains> +#.Include</etc/e2guardian/lists/blacklists/sports/domains> +#.Include</etc/e2guardian/lists/blacklists/vacation/domains> +#.Include</etc/e2guardian/lists/blacklists/violence/domains> +#.Include</etc/e2guardian/lists/blacklists/virusinfected/domains> +#.Include</etc/e2guardian/lists/blacklists/warez/domains> + +# You will need to edit to add and remove categories you want diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/authplugins/ipgroups b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/authplugins/ipgroups new file mode 100644 index 0000000000000000000000000000000000000000..5ec6b58cfabbe91a17578bd8a453a40b73d652a0 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/authplugins/ipgroups @@ -0,0 +1,11 @@ +# IP-Group list +# Used by the IP-based auth plugin to assign IP addresses to filter groups. +# +# Examples: +# Straight IP matching: +#192.168.0.1 = filter1 +# Subnet matching: +#192.168.1.0/255.255.255.0 = filter1 +# Range matching: +#192.168.1.0-192.168.1.255 = filter1 + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/blacklists/ads/domains b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/blacklists/ads/domains new file mode 100644 index 0000000000000000000000000000000000000000..4b89f44b20465303764841020b397ca339b1790e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/blacklists/ads/domains @@ -0,0 +1,1264 @@ +# Advanced AD blocking & logadblocks options depend on having the phrase +# "ADs" in a list's category. + +#listcategory: "ADs" + +# Example list taken from squidGuard on 2005-10-24 + +# +# !!! WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING !!! +# +# This list is entierly a product of a dumb robot (squidGuardRobot-2.3.7). +# We strongly recommend that you review the lists before using them! +# Don't blame us if there are mistakes, but please report errors with +# the online tool at http://www.squidguard.org/blacklist/ +# +# !!! WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING !!! +# +# This list was compiled in 0:50:01 on 2005.10.22 00:50:10. +# This list was compiled from 0 link sources and 2172 links, +# of which 928 tested successfully. +# +81.19.70.1 +64.124.125.10 +206.50.181.10 +206.173.193.10 +216.40.195.10 +216.200.199.10 +216.34.209.10 +212.143.22.10 +80.190.228.10 +207.38.10.100 +208.184.138.100 +65.39.176.100 +207.150.181.100 +66.150.2.100 +209.132.205.100 +209.202.240.100 +83.220.152.101 +62.27.21.101 +209.132.218.101 +208.237.254.101 +4.18.162.102 +208.237.254.102 +212.27.63.103 +207.246.138.104 +213.244.168.104 +212.43.230.104 +216.187.109.105 +69.57.155.105 +195.101.94.105 +69.57.155.106 +81.176.76.106 +62.93.224.107 +200.152.161.108 +199.243.163.108 +64.106.206.108 +80.68.242.108 +213.219.36.108 +195.125.111.109 +193.149.121.11 +216.200.199.11 +64.191.218.11 +66.118.182.112 +66.98.218.112 +209.157.135.114 +209.132.218.114 +198.65.220.114 +66.45.240.114 +216.195.33.114 +81.22.33.114 +81.22.35.114 +200.154.52.114 +204.71.191.115 +208.232.163.116 +62.146.24.116 +63.236.18.117 +82.165.199.117 +216.167.104.118 +202.27.17.118 +65.39.176.118 +67.15.186.118 +65.54.194.118 +207.44.132.12 +216.200.199.12 +38.118.200.12 +208.237.254.122 +216.35.71.122 +64.58.80.122 +129.15.2.123 +64.7.207.123 +212.77.100.127 +207.44.153.128 +195.35.187.128 +209.112.183.129 +194.135.19.13 +209.132.193.13 +216.34.209.13 +216.49.88.130 +209.197.107.132 +216.52.167.132 +64.15.205.132 +209.15.44.132 +209.67.1.133 +69.10.136.133 +66.150.161.133 +210.245.166.133 +80.69.226.133 +194.67.35.133 +66.150.161.134 +65.221.102.135 +216.34.131.135 +213.228.192.135 +209.116.249.135 +195.161.113.136 +66.150.161.136 +213.228.192.136 +216.200.199.14 +216.34.209.14 +63.246.36.14 +66.150.161.140 +216.239.115.141 +195.60.12.141 +64.192.135.141 +66.150.161.141 +216.148.229.141 +217.148.189.142 +200.176.3.142 +216.127.39.142 +217.16.16.143 +194.158.120.145 +194.158.121.145 +207.182.248.145 +216.193.215.146 +69.10.138.147 +204.10.240.148 +194.126.131.15 +64.146.132.15 +209.132.193.15 +66.226.8.150 +38.113.1.151 +206.65.169.151 +130.160.240.152 +217.16.16.153 +212.48.1.154 +194.237.107.154 +195.154.195.154 +213.86.246.154 +212.172.60.154 +212.105.63.156 +64.154.80.156 +217.110.119.157 +66.235.134.157 +64.154.80.158 +38.113.1.159 +207.246.132.16 +207.68.178.16 +216.200.199.16 +216.92.21.16 +64.154.80.16 +216.250.97.16 +206.138.137.160 +170.224.21.160 +208.254.3.160 +64.154.80.160 +204.251.15.161 +64.136.24.162 +64.34.105.163 +66.154.47.163 +64.154.80.163 +209.132.97.163 +69.28.135.164 +213.205.137.165 +64.136.24.165 +213.205.137.166 +205.134.161.166 +195.131.4.166 +207.246.136.167 +65.108.44.167 +216.200.199.17 +216.187.103.170 +204.251.15.170 +217.212.240.170 +69.25.27.170 +216.92.27.170 +66.230.180.171 +216.92.211.171 +217.212.240.171 +69.25.27.171 +202.139.106.172 +204.251.15.172 +64.136.25.172 +69.25.27.172 +216.239.115.173 +66.28.250.173 +69.25.27.173 +69.31.98.173 +202.139.106.174 +66.28.250.174 +213.228.192.175 +207.246.136.176 +216.200.199.176 +207.188.7.176 +207.246.136.178 +66.115.157.178 +82.208.4.178 +70.84.89.178 +209.197.117.179 +209.62.176.179 +216.73.86.179 +216.200.199.18 +216.92.21.18 +211.100.26.180 +207.246.136.181 +209.62.176.181 +216.73.86.181 +209.62.176.182 +204.10.240.182 +64.152.73.182 +216.73.86.182 +204.179.240.184 +194.151.105.185 +200.80.18.185 +151.193.164.186 +200.80.18.186 +151.193.164.189 +212.72.51.189 +64.154.80.189 +209.67.181.19 +216.200.199.19 +72.3.235.19 +216.127.42.19 +64.246.56.19 +66.39.117.190 +64.154.80.190 +217.172.177.192 +81.255.196.192 +67.15.77.192 +66.111.40.193 +195.121.7.193 +70.86.54.194 +207.246.136.196 +64.125.99.196 +213.244.183.197 +216.15.212.197 +63.246.36.197 +207.200.89.197 +64.154.80.198 +64.90.175.199 +64.154.80.199 +64.124.125.2 +81.222.128.2 +209.123.16.2 +212.69.172.2 +82.161.231.2 +63.108.45.2 +204.9.53.2 +213.83.6.2 +194.117.69.2 +195.241.77.2 +192.190.109.20 +207.126.123.20 +216.130.161.20 +217.20.163.20 +209.132.193.20 +64.38.240.20 +216.52.245.20 +216.168.3.20 +66.179.5.20 +65.205.8.20 +205.134.183.200 +206.29.192.200 +207.246.136.201 +213.244.183.201 +64.15.205.202 +193.85.207.202 +212.27.40.202 +12.14.172.204 +213.244.183.204 +194.67.35.205 +213.244.183.206 +64.154.80.206 +209.202.240.208 +194.213.53.208 +212.48.11.21 +81.208.113.21 +63.161.150.21 +67.18.195.21 +216.200.199.21 +217.12.6.21 +195.250.147.210 +213.244.183.210 +213.61.105.212 +216.55.160.214 +83.149.224.214 +65.36.227.214 +213.199.154.22 +216.200.199.22 +63.123.248.22 +63.111.66.22 +64.81.69.22 +216.216.237.220 +216.10.104.221 +208.185.230.221 +216.131.83.222 +204.179.240.226 +203.99.65.226 +194.1.129.227 +64.73.24.229 +207.219.111.23 +216.200.199.23 +64.191.218.23 +193.85.233.23 +64.58.80.23 +216.73.86.23 +212.162.13.230 +64.210.243.231 +216.71.79.231 +64.94.162.232 +213.203.193.233 +161.58.12.234 +66.216.104.235 +64.62.137.235 +217.23.84.235 +216.130.197.236 +204.71.191.237 +64.94.162.238 +204.71.191.238 +204.71.191.239 +64.49.213.239 +213.158.72.24 +216.18.94.24 +195.161.119.240 +212.47.13.241 +194.98.19.242 +64.94.162.245 +216.92.187.245 +80.245.197.245 +64.49.254.245 +66.39.107.246 +139.223.200.246 +212.72.57.246 +216.220.40.247 +65.54.192.249 +213.180.216.249 +210.136.232.249 +63.146.109.25 +216.200.199.25 +64.94.162.250 +70.85.212.250 +64.154.80.250 +193.19.137.251 +209.207.137.253 +64.154.80.253 +161.58.191.254 +64.255.30.254 +61.145.75.254 +64.154.80.254 +207.44.198.26 +216.200.199.26 +207.44.198.27 +216.200.199.27 +206.112.73.27 +66.116.109.29 +209.123.16.29 +216.200.199.29 +209.240.140.3 +62.250.147.3 +205.179.93.3 +199.193.10.30 +207.246.141.30 +64.74.193.30 +216.200.199.30 +66.179.234.30 +192.245.235.30 +64.154.80.30 +216.200.199.31 +69.51.8.31 +63.77.84.31 +216.200.199.32 +216.200.199.33 +64.236.27.33 +69.51.8.33 +198.65.116.34 +209.132.193.34 +216.200.199.34 +209.132.220.34 +66.116.109.35 +216.200.199.35 +62.118.249.35 +195.241.80.35 +216.200.199.36 +209.132.220.36 +192.245.235.36 +212.45.97.36 +209.62.176.37 +193.111.92.37 +207.106.13.38 +66.230.158.38 +207.58.159.38 +216.200.199.38 +213.241.71.38 +216.200.199.39 +130.94.202.39 +209.132.220.39 +69.51.8.39 +216.147.95.39 +205.134.163.4 +82.161.231.4 +192.245.235.4 +194.186.25.4 +69.51.8.4 +217.173.149.40 +209.132.220.40 +208.237.254.40 +130.102.5.40 +66.179.107.41 +63.146.109.41 +216.200.199.41 +66.235.216.41 +209.132.220.41 +64.70.54.41 +205.180.85.41 +216.200.199.42 +205.180.85.42 +69.20.16.43 +204.179.240.43 +205.180.85.43 +64.40.102.44 +65.61.156.44 +216.200.199.44 +209.132.220.44 +80.190.240.44 +64.70.54.44 +207.188.7.44 +205.180.85.44 +216.200.199.45 +209.132.220.45 +205.180.85.45 +216.200.199.46 +209.132.220.46 +64.14.49.46 +205.180.85.46 +198.64.149.47 +209.132.193.47 +216.75.195.47 +216.200.199.47 +209.132.220.47 +207.234.224.47 +207.188.6.47 +205.180.85.47 +209.132.193.48 +216.200.199.48 +212.113.31.48 +205.180.85.48 +209.132.193.49 +216.200.199.49 +209.132.220.49 +205.180.85.49 +206.252.129.5 +209.132.193.5 +63.123.248.5 +216.250.97.5 +206.251.184.50 +209.132.220.50 +209.62.176.51 +216.200.199.51 +205.180.85.51 +216.73.86.51 +216.73.87.51 +80.80.10.52 +216.53.188.52 +216.200.199.52 +69.31.81.52 +205.180.85.52 +216.200.199.53 +216.34.207.53 +64.246.24.53 +203.199.83.53 +205.180.85.53 +216.200.199.54 +216.168.229.54 +212.113.31.54 +205.180.85.54 +64.42.128.55 +216.200.199.55 +217.74.65.55 +216.200.199.56 +62.104.23.56 +69.31.81.56 +216.168.229.57 +62.104.23.57 +212.24.129.58 +216.127.42.58 +65.205.8.58 +216.73.86.58 +216.168.229.59 +205.180.85.59 +216.200.145.60 +66.70.20.60 +206.51.224.60 +216.194.66.60 +205.180.85.60 +207.68.178.61 +216.127.42.61 +216.127.42.62 +209.15.51.62 +212.143.22.63 +216.35.123.65 +216.127.42.65 +209.145.128.66 +63.171.166.66 +207.188.30.66 +64.237.39.66 +216.127.42.66 +64.154.80.66 +66.230.158.67 +217.20.163.67 +216.127.42.67 +216.61.164.68 +209.132.218.68 +216.127.32.68 +67.19.42.68 +64.154.80.69 +217.20.131.7 +207.212.183.7 +66.220.2.7 +208.237.254.7 +12.130.91.7 +216.200.199.70 +64.154.80.70 +213.59.0.71 +209.132.218.71 +216.127.32.71 +64.58.80.71 +209.132.218.72 +209.225.4.72 +216.35.71.72 +66.118.182.73 +209.132.218.73 +213.158.72.73 +144.32.128.74 +63.215.202.74 +66.33.255.75 +216.71.76.75 +209.62.176.76 +209.132.220.76 +64.237.39.76 +61.152.117.78 +65.61.166.78 +66.33.212.78 +202.58.56.78 +63.94.64.78 +202.94.81.78 +61.152.117.79 +216.200.199.79 +216.148.233.79 +204.179.240.79 +207.230.156.8 +209.132.193.8 +82.149.231.8 +65.214.39.8 +199.181.132.80 +207.241.148.80 +65.39.176.80 +66.70.21.80 +65.39.176.81 +64.154.80.81 +216.73.86.81 +64.237.99.81 +65.39.176.82 +193.108.80.82 +65.39.176.83 +64.154.80.83 +65.39.176.84 +69.57.134.85 +209.132.218.86 +66.249.3.86 +64.124.125.9 +63.123.248.9 +216.250.97.9 +64.154.80.90 +209.132.218.91 +66.230.151.92 +200.225.157.92 +194.228.200.92 +209.132.218.92 +69.46.28.92 +217.115.193.93 +209.132.218.93 +216.35.123.94 +207.246.138.95 +81.3.37.95 +216.35.71.95 +63.208.235.96 +217.12.4.96 +216.35.71.96 +63.88.212.98 +212.59.22.98 +195.241.77.98 +213.158.72.99 +bannerlandia.com.ar +austria-chart.at +admaster.candela.com.au +niadsrv.news.com.au +ads.ninemsn.com.au +counter.uq.edu.au +hypermax.net.au +ads.banner-link.com.br +banner.grupos.com.br +adserver.ig.com.br +softclick.com.br +ads.terra.com.br +adworks.cc +g.adx.cc +schweiz-chart.ch +123banners.com +123go.com +ad2.163.com +popme.163.com +247media.com +7search.com +ad.abcnews.com +ad.abctv.com +click.absoluteagency.com +ad-up.com +adatom.com +adbot.com +adcomplete.com +adcycle.com +addfreestats.com +addme.com +adhost.com +ads-links.com +adsrotation.com +adultmegamall.com +adultrevenueservice.com +advertising.com +ads.amazingmedia.com +ads.amusive.com +webusers.anet-stl.com +ads.antionline.com +arachnidbait.com +server2.as5000.com +ashampoo.com +banner.avp2000.com +streamp.babenet.com +banners.babylon-x.com +babylonx.com +banner-mania.com +bannerco-op.com +bannerlandia.com +bannerpower.com +bannerspace.com +bannerswap.com +bannersxchange.com +member.bcentral.com +bserver.bclick.com +befree.com +best-ads.com +images.bigmailbox.com +bigwebtools.com +eval.bizrate.com +counter.bloke.com +ads.bloomberg.com +bluemongoose.com +s0.bluestreak.com +boxfrog.com +bpath.com +bravenet.com +brodia.com +ads.bugnet.com +bulkregister.com +ranking.buscarsexo.com +images.buy.com +refer.ccbill.com +cdu4.cduniverse.com +celebrityx.com +cj.com +clearchannel.com +click2paid.com +clickagents.com +clickit.com +clicks4u.com +clicksxchange.com +clickxchange.com +cz3.clickzs.com +cz6.clickzs.com +victory.cnn.com +ads2.collegclub.com +cometsystems.com +cometzone.com +data.coremetrics.com +counted.com +webaffiliate.covad.com +ad.clok.creative.com +us.creative.com +criticalmass.com +cyberbounty.com +cybereps.com +cybererotica.com +cybergorilla.com +cybersexent.com +cyberthrill.com +digemon.com +digits.com +dimeclicks.com +directhit.com +ads.online.discovery.com +doubleclick.com +adpush.dreamscape.com +dutchtopsites.com +banners.easydns.com +countus.editeurjavascript.com +electrongames.com +elitetoplist.com +clicks.equantum.com +graphics.equantum.com +ads.eudora.com +exapps.com +exchange-it.com +exitexchange.com +extreme-dm.com +adserv.exxxit.com +ezgreen.com +falkag.net +fastgraphics.com +fineclicks.com +firechicken.com +flowgo.com +fool.com +ads.foxhome.com +free-banners.com +ad.freefind.com +freehotcelebz.com +freeones.com +tracker.freerun.com +banner.freeservers.com +eqantics.freeservers.com +images.freeshop.com +freestats.com +ads.ft.com +counter.gamespy.com +gator.com +gayweb.com +ads1.gccx.com +getpaid4.com +ad.go.com +images.go2net.com +gohip.com +gopher.com +gozilla.com +headlightsw.com +helie.com +heraldstore.com +ads.heraldsun.com +adserver.hispavista.com +loga.hit-parade.com +logp.hit-parade.com +hitboss.com +adminec1.hitbox.com +counter2.hitbox.com +download.hitbox.com +ec1.hitbox.com +ehg-espn.hitbox.com +ehg-learningco.hitbox.com +ejs.hitbox.com +evwr.hitbox.com +host6.hitbox.com +ias.hitbox.com +js1.hitbox.com +mrtg.hitbox.com +nei.hitbox.com +noc.hitbox.com +rd1.hitbox.com +stats.hitbox.com +tools.hitbox.com +w10.hitbox.com +w11.hitbox.com +w110.hitbox.com +w112.hitbox.com +w113.hitbox.com +w114.hitbox.com +w115.hitbox.com +w116.hitbox.com +w117.hitbox.com +w118.hitbox.com +w119.hitbox.com +w12.hitbox.com +w13.hitbox.com +w140.hitbox.com +w144.hitbox.com +w147.hitbox.com +w153.hitbox.com +w154.hitbox.com +w157.hitbox.com +w159.hitbox.com +w16.hitbox.com +w17.hitbox.com +w20.hitbox.com +w21.hitbox.com +w22.hitbox.com +w24.hitbox.com +w26.hitbox.com +w27.hitbox.com +w28.hitbox.com +w29.hitbox.com +w3.hitbox.com +w4.hitbox.com +w5.hitbox.com +w6.hitbox.com +w7.hitbox.com +w8.hitbox.com +wwa.hitbox.com +wwd.hitbox.com +yang.hitbox.com +ying.hitbox.com +hitsquad.com +hollywood.com +banners.hotqueens.com +r.hotwired.com +httpwwwadserver.com +humanclick.com +hypercount.com +ads.iboost.com +ign.com +image-catcher.com +independentsolutions.com +chat.indya.com +inet-traffic.com +ads.inet1.com +infospace.com +popups.infostart.com +mjxads.internet.com +internetfuel.com +ad.ittoolbox.com +ads.jpost.com +desktop.kazaa.com +ad.keenspace.com +lesbianpink.com +link4link.com +image.linkexchange.com +links2u.com +linkshare.com +linkstoyou.com +banner.linksynergy.com +bizbuyer.linksynergy.com +click.linksynergy.com +dev.linksynergy.com +eshare.linksynergy.com +goldcrown.linksynergy.com +merchant.linksynergy.com +mreport.linksynergy.com +ss.linksynergy.com +tradeout.linksynergy.com +liveadvert.com +208.185.87.66.liveadvert.com +208.185.87.7.liveadvert.com +208.185.87.70.liveadvert.com +208.185.87.71.liveadvert.com +208.185.87.72.liveadvert.com +208.185.87.73.liveadvert.com +208.185.87.74.liveadvert.com +208.185.87.75.liveadvert.com +208.185.87.78.liveadvert.com +208.185.87.79.liveadvert.com +208.185.87.8.liveadvert.com +208.185.87.81.liveadvert.com +208.185.87.82.liveadvert.com +208.185.87.85.liveadvert.com +208.185.87.86.liveadvert.com +208.185.87.87.liveadvert.com +208.185.87.88.liveadvert.com +208.185.87.89.liveadvert.com +208.185.87.9.liveadvert.com +208.185.87.90.liveadvert.com +208.185.87.91.liveadvert.com +208.185.87.94.liveadvert.com +208.185.87.96.liveadvert.com +208.185.87.97.liveadvert.com +208.185.87.98.liveadvert.com +208.185.87.99.liveadvert.com +track.livestat.com +madison.com +makingitpay.com +masterbanners.com +ads.mcafee.com +mediacharger.com +mediaodyssey.com +mediaplex.com +megago.com +ads.msn.com +arc1.msn.com +arc2.msn.com +arc3.msn.com +arc4.msn.com +di.image.eshop.msn.com +ads.eu.msn.com +ads.jp.msn.com +msid.msn.com +myaffiliateprogram.com +mycometcursor.com +mycomputer.com +myflatcallusa.com +ad.myrice.com +mysimon.com +liquidad.narrowcastmedia.com +join.netbroadcaster.com +netmechanic2.com +netomia.com +nvostore.netopia.com +netsaits.com +cgi.netscape.com +nmia.com +nomorehits.com +oneandonlynetwork.com +onresponse.com +adserver.onwisconsin.com +ins1.opera.com +ins2.opera.com +fmads.osdn.com +lnads.osdn.com +pagoporubicacion.com +payperranking.com +paypertext.com +ad1.peel.com +ad3.peel.com +pegasoweb.com +pennyweb.com +ads.playnet.com +popuptraffic.com +pornaddict.com +artemis.porntrack.com +hekate.porntrack.com +stats1.porntrack.com +adserver.portalofevil.com +portdetective.com +gfx.postmasterdirect.com +premiumnetwork.com +twinkie.prognet.com +probe.prohosting.com +rankyou.com +jaune-4.real.com +proforma.real.com +registration.real.com +rnps.real.com +scooter.real.com +icover.realmedia.com +oad.realmedia.com +rd.realmedia.com +realads.realmedia.com +retaildirect.realmedia.com +realnetworks.com +realtracker.com +ads.rediff.com +futuresite.register.com +rg2.com +rg7.com +rightstats.com +rotolink.com +sabela.com +server.com +sexillustrated.com +sexlist.com +sextracker.com +logs.sexy-parade.com +shareasale.com +shout-ads.com +sm3.sitemeter.com +sm4.sitemeter.com +sitetracker.com +speedbit.com +spiderbait.com +sptimes.com +spylog.com +starsads.com +stats4you.com +ads.stileproject.com +strategy.com +ads.sublimedirectory.com +code.superstats.com +controlcenter.superstats.com +guestbook.superstats.com +targetnet.com +teensexaction.com +textlinks.com +thecounter.com +ads1.theglobeandmail.com +adbot.theonion.com +mediakit.theonion.com +thepostbox.com +thruport.com +thumbsearch.com +titvision.com +tomshardware.com +track-star.com +tradedoubler.com +trafficoverdrive.com +openad.travelnow.com +tribalfusion.com +adcreative.tribuneinteractive.com +adserver.tribuneinteractive.com +counter.tripod.com +theozone.tripod.com +html.tucows.com +ukbanners.com +adcontroller.unicast.com +ads.usatoday.com +cyberle.usww.com +images.v3.com +valueclick.com +vinculos.com +warezlist.com +ads.weather.com +web-stat.com +web4friends.com +ads.webattack.com +webcamworld.com +data.webhancer.com +adv.webmd.com +webshots.com +websidestory.com +websponsors.com +webstat.com +upload.webtrends.com +whenu.com +windowscasino.com +worldbannerexchange.com +worldbe.com +worldprofit.com +worldsex.com +ads3.wunderground.com +banners.wunderground.com +fr.adserver.yahoo.com +eur.rd.yahoo.com +it.rd.yahoo.com +yestime.com +br.yimg.com +img.zmedia.com +js.zmedia.com +adrenaline.cz +banners.arachne.cz +ad41.atlas.cz +banman.cz +billboard.cz +counter.cnw.cz +banners.czi.cz +reklama.internet.cz +ireklama.cz +adsweb.tiscali.cz +atdmt.com +adtech.de +adultboerse.de +bannerads.de +eurosponsor.de +ad03.freenet.de +webcounter.goweb.de +knallgirls.de +megacash.de +metropolis.de +money4exit.de +premiumcash.de +sexyempire.de +webhits.de +websitesponsor.de +ad.subnet.dk +atlas.services.ou.edu +cidyweb.free.fr +memoweb3.goto.fr +pubsec.goto.fr +pub.grolier.fr +pubs.lemonde.fr +adimg.voila.fr +dexter.monitor.hr +adware.adware.hu +sher.index.hu +ads.internic.co.il +adv.bbanner.it +ad.caos.it +adv.ilsole24ore.it +adserver.interfree.it +newadserver.interfree.it +u2.123go.net +ads.51.net +acegroup.net +ads.aceweb.net +adimg.activeadv.net +adv4.activeadv.net +ieee-images.adbureau.net +ai.net +bighits.net +blissnet.net +bns1.net +mds.centrport.net +n0cgi.distributed.net +ad.doubleclick.net +ad.be.doubleclick.net +ad.br.doubleclick.net +ad.ca.doubleclick.net +ad.ch.doubleclick.net +ad.de.doubleclick.net +ad.dk.doubleclick.net +ad.es.doubleclick.net +ad.fi.doubleclick.net +rd.hk.doubleclick.net +ad.in.doubleclick.net +rd.intl.doubleclick.net +ad.it.doubleclick.net +iv.doubleclick.net +rd.kr.doubleclick.net +ln.doubleclick.net +m.doubleclick.net +ad.no.doubleclick.net +ad.pt.doubleclick.net +ad.se.doubleclick.net +se1.doubleclick.net +ad.uk.doubleclick.net +uk1.doubleclick.net +m.us.doubleclick.net +david.noc.dti.net +thinknyc.eu-adcenter.net +ugo.eu-adcenter.net +vnu.eu-adcenter.net +ads.evansville.net +static.everyone.net +media1.fastclick.net +media2.fastclick.net +media3.fastclick.net +media4.fastclick.net +media5.fastclick.net +media6.fastclick.net +media7.fastclick.net +media8.fastclick.net +media9.fastclick.net +ads.flashtrack.net +ads.home.net +gcounter.hosting4u.net +hyebiz.net +ads01.hyperbanner.net +ads04.hyperbanner.net +ads05.hyperbanner.net +ads07.hyperbanner.net +ads08.hyperbanner.net +ads09.hyperbanner.net +ads12.hyperbanner.net +ads14.hyperbanner.net +ads16.hyperbanner.net +ads18.hyperbanner.net +ads19.hyperbanner.net +ads21.hyperbanner.net +ads25.hyperbanner.net +ads27.hyperbanner.net +ads28.hyperbanner.net +ads29.hyperbanner.net +ads32.hyperbanner.net +ads33.hyperbanner.net +ads36.hyperbanner.net +ads41.hyperbanner.net +ads42.hyperbanner.net +ads49.hyperbanner.net +ads50.hyperbanner.net +siterank.hypermart.net +linkcorp.net +escati.linkopp.net +ads.liteweb.net +ads09.liteweb.net +ads1.liteweb.net +ads2.liteweb.net +ads3.liteweb.net +ads4.liteweb.net +ads5.liteweb.net +ads6.liteweb.net +ads7.liteweb.net +ads8.liteweb.net +ads9.liteweb.net +utils.mediageneral.net +adimages.netdok.net +marketing.nyi.net +mirror.qkimg.net +qksrv.net +rename.net +reporting.net +dinoadserver1.roka.net +dinoadserver2.roka.net +stats.net +adsvr.taipeilink.net +ads.ukadbureau.net +uncovered.net +wamanet.virtualave.net +webclients.net +reporting.webconnect.net +webstat.net +aakro.nl +ads.detelefoongids.nl +funprice.nl +stats.go-west.nl +banners.hetnet.nl +netdirect.nl +ads.telegraaf.nl +ad.tijdbeursmedia.nl +adserver.wemnet.nl +worldonline.nl +netzapp.nu +creative.whi.co.nz +nzads.net.nz +ads.mm.ap.org +asacp.org +guid.org +joker.org +phreedom.org +seawood.org +ads.clickad.com.pl +adsv.interia.pl +adv.wp.pl +2sun.ru +stats.2u.ru +360.ru +adsmart.ru +rotabanner.auto.ru +bannerpoint.ru +bb.ru +bizlink.ru +clickhere.ru +da.ru +banners.df.ru +f2.ru +freetop.ru +hits.ru +j2.ru +krutilka.ru +members.lbe.ru +lbn.ru +linkexchange.ru +mafia.ru +stat.newman.ru +ext1.price.ru +rambler.ru +rating.ru +banner.rbc.ru +reclama.ru +dir.spylog.ru +tbn.ru +ushki.ru +az.yandex.ru +banners.zhurnal.ru +ads.asia1.com.sg +ads.box.sk +elf.box.sk +link.box.sk +newdata.box.sk +v3.come.to +360.com.ua +banner.echo.com.ua +tracker.echo.com.ua +topping.com.ua +banner.kiev.ua +topping.od.ua +ads.ahds.ac.uk +g.fool.co.uk +ads.newsquest.co.uk +multi1.rmuk.co.uk +ads.telegraph.co.uk +top50.co.uk +linkworld.ws +solair.eunet.yu diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/blacklists/ads/domains.processed b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/blacklists/ads/domains.processed new file mode 100644 index 0000000000000000000000000000000000000000..d49b633201f3c48a8fa255c2016082eafe09d6b1 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/blacklists/ads/domains.processed @@ -0,0 +1,1244 @@ +#listcategory:"ADs" +nzads.net.nz +creative.whi.co.nz +counter.cnw.cz +reklama.internet.cz +ad41.atlas.cz +banman.cz +banners.czi.cz +adsweb.tiscali.cz +adrenaline.cz +banners.arachne.cz +billboard.cz +ireklama.cz +solair.eunet.yu +az.yandex.ru +stats.2u.ru +adsmart.ru +bannerpoint.ru +hits.ru +rambler.ru +freetop.ru +rotabanner.auto.ru +2sun.ru +tbn.ru +lbn.ru +stat.newman.ru +banners.zhurnal.ru +bizlink.ru +ushki.ru +dir.spylog.ru +rating.ru +banners.df.ru +clickhere.ru +linkexchange.ru +ext1.price.ru +members.lbe.ru +banner.rbc.ru +bb.ru +reclama.ru +krutilka.ru +mafia.ru +da.ru +j2.ru +f2.ru +360.ru +netzapp.nu +sher.index.hu +adware.adware.hu +atlas.services.ou.edu +counter.uq.edu.au +hypermax.net.au +niadsrv.news.com.au +ads.ninemsn.com.au +admaster.candela.com.au +ad.caos.it +adv.bbanner.it +adv.ilsole24ore.it +newadserver.interfree.it +adserver.interfree.it +hyebiz.net +qksrv.net +adimg.activeadv.net +adv4.activeadv.net +ads.ukadbureau.net +ieee-images.adbureau.net +gcounter.hosting4u.net +mds.centrport.net +siterank.hypermart.net +blissnet.net +reporting.webconnect.net +webstat.net +webclients.net +bighits.net +stats.net +vnu.eu-adcenter.net +ugo.eu-adcenter.net +thinknyc.eu-adcenter.net +ads49.hyperbanner.net +ads29.hyperbanner.net +ads19.hyperbanner.net +ads09.hyperbanner.net +ads28.hyperbanner.net +ads18.hyperbanner.net +ads08.hyperbanner.net +ads27.hyperbanner.net +ads07.hyperbanner.net +ads36.hyperbanner.net +ads16.hyperbanner.net +ads25.hyperbanner.net +ads05.hyperbanner.net +ads14.hyperbanner.net +ads04.hyperbanner.net +ads33.hyperbanner.net +ads42.hyperbanner.net +ads32.hyperbanner.net +ads12.hyperbanner.net +ads41.hyperbanner.net +ads21.hyperbanner.net +ads01.hyperbanner.net +ads50.hyperbanner.net +acegroup.net +linkcorp.net +escati.linkopp.net +u2.123go.net +utils.mediageneral.net +adimages.netdok.net +adsvr.taipeilink.net +media9.fastclick.net +media8.fastclick.net +media7.fastclick.net +media6.fastclick.net +media5.fastclick.net +media4.fastclick.net +media3.fastclick.net +media2.fastclick.net +media1.fastclick.net +iv.doubleclick.net +ad.pt.doubleclick.net +ad.it.doubleclick.net +m.us.doubleclick.net +ad.es.doubleclick.net +rd.kr.doubleclick.net +ad.br.doubleclick.net +ad.no.doubleclick.net +ln.doubleclick.net +ad.in.doubleclick.net +m.doubleclick.net +rd.intl.doubleclick.net +ad.uk.doubleclick.net +rd.hk.doubleclick.net +ad.dk.doubleclick.net +ad.fi.doubleclick.net +ad.ch.doubleclick.net +ad.se.doubleclick.net +ad.de.doubleclick.net +ad.be.doubleclick.net +ad.doubleclick.net +ad.ca.doubleclick.net +uk1.doubleclick.net +se1.doubleclick.net +ads.flashtrack.net +marketing.nyi.net +david.noc.dti.net +ai.net +reporting.net +mirror.qkimg.net +falkag.net +wamanet.virtualave.net +static.everyone.net +ads.home.net +rename.net +ads.evansville.net +n0cgi.distributed.net +uncovered.net +ads.liteweb.net +ads9.liteweb.net +ads09.liteweb.net +ads8.liteweb.net +ads7.liteweb.net +ads6.liteweb.net +ads5.liteweb.net +ads4.liteweb.net +ads3.liteweb.net +ads2.liteweb.net +ads1.liteweb.net +ads.aceweb.net +dinoadserver2.roka.net +dinoadserver1.roka.net +bns1.net +ads.51.net +austria-chart.at +linkworld.ws +dexter.monitor.hr +pub.grolier.fr +pubsec.goto.fr +memoweb3.goto.fr +cidyweb.free.fr +pubs.lemonde.fr +adimg.voila.fr +banner.grupos.com.br +ads.banner-link.com.br +softclick.com.br +adserver.ig.com.br +ads.terra.com.br +bannerlandia.com.ar +v3.come.to +freehotcelebz.com +images.buy.com +cyberbounty.com +websidestory.com +ads.sublimedirectory.com +ads.online.discovery.com +counter.gamespy.com +dev.linksynergy.com +tradeout.linksynergy.com +mreport.linksynergy.com +merchant.linksynergy.com +ss.linksynergy.com +bizbuyer.linksynergy.com +banner.linksynergy.com +goldcrown.linksynergy.com +click.linksynergy.com +eshare.linksynergy.com +strategy.com +mediaodyssey.com +click.absoluteagency.com +makingitpay.com +ads.usatoday.com +celebrityx.com +thepostbox.com +stats.hitbox.com +tools.hitbox.com +ejs.hitbox.com +ias.hitbox.com +evwr.hitbox.com +ehg-learningco.hitbox.com +ehg-espn.hitbox.com +nei.hitbox.com +mrtg.hitbox.com +ying.hitbox.com +yang.hitbox.com +wwd.hitbox.com +download.hitbox.com +noc.hitbox.com +wwa.hitbox.com +w159.hitbox.com +w29.hitbox.com +w119.hitbox.com +w8.hitbox.com +w28.hitbox.com +w118.hitbox.com +w7.hitbox.com +w157.hitbox.com +w147.hitbox.com +w27.hitbox.com +w17.hitbox.com +w117.hitbox.com +w6.hitbox.com +host6.hitbox.com +w26.hitbox.com +w16.hitbox.com +w116.hitbox.com +w5.hitbox.com +w115.hitbox.com +w4.hitbox.com +w154.hitbox.com +w144.hitbox.com +w24.hitbox.com +w114.hitbox.com +w3.hitbox.com +w153.hitbox.com +w13.hitbox.com +w113.hitbox.com +counter2.hitbox.com +w22.hitbox.com +w12.hitbox.com +w112.hitbox.com +js1.hitbox.com +rd1.hitbox.com +adminec1.hitbox.com +ec1.hitbox.com +w21.hitbox.com +w11.hitbox.com +w140.hitbox.com +w20.hitbox.com +w10.hitbox.com +w110.hitbox.com +ad.ittoolbox.com +images.bigmailbox.com +babylonx.com +worldsex.com +mediaplex.com +ads1.gccx.com +banners.babylon-x.com +cyberle.usww.com +headlightsw.com +openad.travelnow.com +ad.abctv.com +linkstoyou.com +rankyou.com +stats4you.com +whenu.com +clicks4u.com +links2u.com +paypertext.com +ads.jpost.com +ads.iboost.com +adhost.com +warezlist.com +sexlist.com +elitetoplist.com +adcontroller.unicast.com +thruport.com +208.185.87.99.liveadvert.com +208.185.87.89.liveadvert.com +208.185.87.79.liveadvert.com +208.185.87.9.liveadvert.com +208.185.87.98.liveadvert.com +208.185.87.88.liveadvert.com +208.185.87.78.liveadvert.com +208.185.87.8.liveadvert.com +208.185.87.97.liveadvert.com +208.185.87.87.liveadvert.com +208.185.87.7.liveadvert.com +208.185.87.96.liveadvert.com +208.185.87.86.liveadvert.com +208.185.87.66.liveadvert.com +208.185.87.85.liveadvert.com +208.185.87.75.liveadvert.com +208.185.87.94.liveadvert.com +208.185.87.74.liveadvert.com +208.185.87.73.liveadvert.com +208.185.87.82.liveadvert.com +208.185.87.72.liveadvert.com +208.185.87.91.liveadvert.com +208.185.87.81.liveadvert.com +208.185.87.71.liveadvert.com +208.185.87.90.liveadvert.com +208.185.87.70.liveadvert.com +liveadvert.com +popups.infostart.com +countus.editeurjavascript.com +adbot.com +hypercount.com +cybersexent.com +atdmt.com +adserv.exxxit.com +clickit.com +directhit.com +worldprofit.com +speedbit.com +spiderbait.com +arachnidbait.com +exchange-it.com +ads.ft.com +ads.playnet.com +targetnet.com +mjxads.internet.com +ads.bugnet.com +twinkie.prognet.com +bravenet.com +streamp.babenet.com +images.go2net.com +pornaddict.com +gfx.postmasterdirect.com +ads.stileproject.com +track.livestat.com +webstat.com +web-stat.com +cz6.clickzs.com +cz3.clickzs.com +html.tucows.com +ad.abcnews.com +webshots.com +clickagents.com +nomorehits.com +digits.com +netsaits.com +rightstats.com +controlcenter.superstats.com +guestbook.superstats.com +code.superstats.com +addfreestats.com +freestats.com +hitboss.com +criticalmass.com +websponsors.com +eqantics.freeservers.com +banner.freeservers.com +masterbanners.com +ukbanners.com +123banners.com +free-banners.com +exapps.com +cybereps.com +vinculos.com +independentsolutions.com +banners.hotqueens.com +banners.easydns.com +cometsystems.com +bigwebtools.com +realnetworks.com +textlinks.com +ads-links.com +fineclicks.com +dimeclicks.com +dutchtopsites.com +freeones.com +sptimes.com +electrongames.com +upload.webtrends.com +web4friends.com +starsads.com +shout-ads.com +best-ads.com +data.coremetrics.com +fastgraphics.com +gator.com +mycometcursor.com +bannerpower.com +httpwwwadserver.com +server.com +mycomputer.com +bulkregister.com +futuresite.register.com +join.netbroadcaster.com +thecounter.com +sm4.sitemeter.com +sm3.sitemeter.com +tradedoubler.com +sextracker.com +realtracker.com +sitetracker.com +ads.weather.com +gopher.com +image-catcher.com +mediacharger.com +data.webhancer.com +track-star.com +ad-up.com +images.freeshop.com +bannerco-op.com +gohip.com +bannerswap.com +ranking.buscarsexo.com +ashampoo.com +fr.adserver.yahoo.com +it.rd.yahoo.com +eur.rd.yahoo.com +windowscasino.com +flowgo.com +megago.com +123go.com +ad.go.com +ads.heraldsun.com +tracker.freerun.com +ads.eu.msn.com +ads.msn.com +di.image.eshop.msn.com +ads.jp.msn.com +msid.msn.com +arc4.msn.com +arc3.msn.com +arc2.msn.com +arc1.msn.com +madison.com +mysimon.com +digemon.com +teensexaction.com +adsrotation.com +tribalfusion.com +titvision.com +adbot.theonion.com +mediakit.theonion.com +pagoporubicacion.com +victory.cnn.com +adserver.onwisconsin.com +ign.com +firechicken.com +ezgreen.com +lnads.osdn.com +fmads.osdn.com +clicks.equantum.com +graphics.equantum.com +adatom.com +extreme-dm.com +myaffiliateprogram.com +webusers.anet-stl.com +fool.com +cyberthrill.com +refer.ccbill.com +adultmegamall.com +adserver.portalofevil.com +ads1.theglobeandmail.com +internetfuel.com +clearchannel.com +ad3.peel.com +ad1.peel.com +member.bcentral.com +rnps.real.com +scooter.real.com +registration.real.com +proforma.real.com +jaune-4.real.com +oneandonlynetwork.com +premiumnetwork.com +lesbianpink.com +rotolink.com +link4link.com +humanclick.com +valueclick.com +doubleclick.com +bserver.bclick.com +ads.webattack.com +artemis.porntrack.com +hekate.porntrack.com +stats1.porntrack.com +s0.bluestreak.com +cj.com +bpath.com +thumbsearch.com +7search.com +ads.bloomberg.com +boxfrog.com +spylog.com +probe.prohosting.com +advertising.com +payperranking.com +br.yimg.com +ads.rediff.com +portdetective.com +adserver.tribuneinteractive.com +adcreative.tribuneinteractive.com +us.creative.com +ad.clok.creative.com +ads.amusive.com +trafficoverdrive.com +adcomplete.com +eval.bizrate.com +cdu4.cduniverse.com +bluemongoose.com +onresponse.com +heraldstore.com +tomshardware.com +linkshare.com +cgi.netscape.com +adpush.dreamscape.com +cometzone.com +ads.antionline.com +ads.foxhome.com +yestime.com +addme.com +adcycle.com +shareasale.com +counter.bloke.com +helie.com +bannersxchange.com +clicksxchange.com +clickxchange.com +exitexchange.com +worldbannerexchange.com +image.linkexchange.com +befree.com +ads.mcafee.com +logs.sexy-parade.com +logp.hit-parade.com +loga.hit-parade.com +adultrevenueservice.com +ad.myrice.com +bannerspace.com +infospace.com +ad.keenspace.com +worldbe.com +counter.tripod.com +theozone.tripod.com +hollywood.com +banners.wunderground.com +ads3.wunderground.com +ad.freefind.com +adv.webmd.com +webcamworld.com +click2paid.com +counted.com +sexillustrated.com +r.hotwired.com +webaffiliate.covad.com +hitsquad.com +popuptraffic.com +inet-traffic.com +ads2.collegclub.com +pennyweb.com +gayweb.com +pegasoweb.com +chat.indya.com +adserver.hispavista.com +myflatcallusa.com +ads.eudora.com +ins2.opera.com +ins1.opera.com +gozilla.com +cybergorilla.com +sabela.com +nvostore.netopia.com +banner-mania.com +netomia.com +nmia.com +brodia.com +bannerlandia.com +js.zmedia.com +img.zmedia.com +liquidad.narrowcastmedia.com +retaildirect.realmedia.com +realads.realmedia.com +icover.realmedia.com +rd.realmedia.com +oad.realmedia.com +ads.amazingmedia.com +247media.com +cybererotica.com +desktop.kazaa.com +rg7.com +getpaid4.com +images.v3.com +popme.163.com +ad2.163.com +rg2.com +netmechanic2.com +ads.inet1.com +server2.as5000.com +banner.avp2000.com +adv.wp.pl +ads.clickad.com.pl +adsv.interia.pl +stats.go-west.nl +banners.hetnet.nl +adserver.wemnet.nl +netdirect.nl +ads.detelefoongids.nl +aakro.nl +ads.telegraaf.nl +worldonline.nl +funprice.nl +ad.tijdbeursmedia.nl +ads.internic.co.il +ads.newsquest.co.uk +g.fool.co.uk +multi1.rmuk.co.uk +ads.telegraph.co.uk +top50.co.uk +ads.ahds.ac.uk +ads.box.sk +link.box.sk +elf.box.sk +newdata.box.sk +ad.subnet.dk +schweiz-chart.ch +ads.asia1.com.sg +joker.org +asacp.org +ads.mm.ap.org +phreedom.org +seawood.org +guid.org +money4exit.de +ad03.freenet.de +webhits.de +knallgirls.de +metropolis.de +bannerads.de +eurosponsor.de +websitesponsor.de +premiumcash.de +megacash.de +adtech.de +adultboerse.de +sexyempire.de +webcounter.goweb.de +g.adx.cc +adworks.cc +banner.kiev.ua +banner.echo.com.ua +tracker.echo.com.ua +topping.com.ua +360.com.ua +topping.od.ua +64.90.175.199 +64.154.80.199 +213.158.72.99 +151.193.164.189 +212.72.51.189 +64.154.80.189 +209.197.117.179 +216.73.86.179 +209.62.176.179 +216.200.199.79 +61.152.117.79 +216.148.233.79 +204.179.240.79 +64.154.80.69 +38.113.1.159 +216.168.229.59 +205.180.85.59 +213.180.216.249 +65.54.192.249 +210.136.232.249 +216.200.199.49 +205.180.85.49 +209.132.193.49 +209.132.220.49 +64.49.213.239 +204.71.191.239 +216.200.199.39 +69.51.8.39 +216.147.95.39 +130.94.202.39 +209.132.220.39 +64.73.24.229 +209.112.183.129 +216.200.199.29 +66.116.109.29 +209.123.16.29 +216.200.199.19 +64.246.56.19 +72.3.235.19 +216.127.42.19 +209.67.181.19 +195.125.111.109 +63.123.248.9 +216.250.97.9 +64.124.125.9 +64.154.80.198 +195.241.77.98 +212.59.22.98 +63.88.212.98 +70.84.89.178 +66.115.157.178 +207.246.136.178 +82.208.4.178 +61.152.117.78 +65.61.166.78 +202.58.56.78 +63.94.64.78 +66.33.212.78 +202.94.81.78 +209.132.218.68 +216.61.164.68 +67.19.42.68 +216.127.32.68 +64.154.80.158 +212.24.129.58 +65.205.8.58 +216.73.86.58 +216.127.42.58 +204.10.240.148 +216.200.199.48 +205.180.85.48 +209.132.193.48 +212.113.31.48 +64.94.162.238 +204.71.191.238 +216.200.199.38 +207.58.159.38 +66.230.158.38 +207.106.13.38 +213.241.71.38 +195.35.187.128 +207.44.153.128 +202.27.17.118 +67.15.186.118 +65.39.176.118 +65.54.194.118 +216.167.104.118 +216.200.199.18 +216.92.21.18 +194.213.53.208 +209.202.240.208 +213.219.36.108 +64.106.206.108 +199.243.163.108 +80.68.242.108 +200.152.161.108 +65.214.39.8 +207.230.156.8 +209.132.193.8 +82.149.231.8 +207.200.89.197 +63.246.36.197 +213.244.183.197 +216.15.212.197 +207.246.136.167 +65.108.44.167 +66.230.158.67 +217.20.163.67 +216.127.42.67 +217.110.119.157 +66.235.134.157 +216.168.229.57 +62.104.23.57 +216.220.40.247 +69.10.138.147 +216.200.199.47 +198.64.149.47 +207.188.6.47 +216.75.195.47 +205.180.85.47 +207.234.224.47 +209.132.193.47 +209.132.220.47 +204.71.191.237 +209.62.176.37 +193.111.92.37 +194.1.129.227 +212.77.100.127 +216.200.199.27 +207.44.198.27 +206.112.73.27 +82.165.199.117 +63.236.18.117 +216.200.199.17 +62.93.224.107 +208.237.254.7 +207.212.183.7 +66.220.2.7 +12.130.91.7 +217.20.131.7 +64.125.99.196 +207.246.136.196 +63.208.235.96 +217.12.4.96 +216.35.71.96 +200.80.18.186 +151.193.164.186 +209.132.218.86 +66.249.3.86 +216.200.199.176 +207.188.7.176 +207.246.136.176 +64.237.39.76 +209.62.176.76 +209.132.220.76 +213.205.137.166 +195.131.4.166 +205.134.161.166 +64.237.39.66 +209.145.128.66 +63.171.166.66 +216.127.42.66 +64.154.80.66 +207.188.30.66 +212.105.63.156 +64.154.80.156 +216.200.199.56 +62.104.23.56 +69.31.81.56 +212.72.57.246 +66.39.107.246 +139.223.200.246 +216.193.215.146 +216.200.199.46 +64.14.49.46 +205.180.85.46 +209.132.220.46 +216.130.197.236 +195.161.113.136 +213.228.192.136 +66.150.161.136 +216.200.199.36 +212.45.97.36 +192.245.235.36 +209.132.220.36 +203.99.65.226 +204.179.240.226 +216.200.199.26 +207.44.198.26 +62.146.24.116 +208.232.163.116 +216.200.199.16 +207.68.178.16 +216.250.97.16 +207.246.132.16 +216.92.21.16 +64.154.80.16 +213.244.183.206 +64.154.80.206 +81.176.76.106 +69.57.155.106 +207.246.138.95 +81.3.37.95 +216.35.71.95 +200.80.18.185 +194.151.105.185 +69.57.134.85 +213.228.192.175 +216.71.76.75 +66.33.255.75 +213.205.137.165 +64.136.24.165 +216.35.123.65 +216.127.42.65 +216.200.199.55 +64.42.128.55 +217.74.65.55 +80.245.197.245 +216.92.187.245 +64.49.254.245 +64.94.162.245 +207.182.248.145 +194.158.121.145 +194.158.120.145 +216.200.199.45 +205.180.85.45 +209.132.220.45 +64.62.137.235 +217.23.84.235 +66.216.104.235 +209.116.249.135 +213.228.192.135 +65.221.102.135 +216.34.131.135 +216.200.199.35 +62.118.249.35 +66.116.109.35 +195.241.80.35 +216.200.199.25 +63.146.109.25 +204.71.191.115 +209.132.193.15 +64.146.132.15 +194.126.131.15 +194.67.35.205 +216.187.109.105 +69.57.155.105 +195.101.94.105 +206.252.129.5 +63.123.248.5 +216.250.97.5 +209.132.193.5 +70.86.54.194 +216.35.123.94 +204.179.240.184 +65.39.176.84 +202.139.106.174 +66.28.250.174 +144.32.128.74 +63.215.202.74 +69.28.135.164 +61.145.75.254 +161.58.191.254 +64.154.80.254 +64.255.30.254 +194.237.107.154 +213.86.246.154 +195.154.195.154 +212.48.1.154 +212.172.60.154 +216.200.199.54 +216.168.229.54 +205.180.85.54 +212.113.31.54 +216.200.199.44 +207.188.7.44 +65.61.156.44 +205.180.85.44 +64.70.54.44 +64.40.102.44 +80.190.240.44 +209.132.220.44 +161.58.12.234 +66.150.161.134 +216.200.199.34 +198.65.116.34 +209.132.193.34 +209.132.220.34 +216.18.94.24 +213.158.72.24 +65.36.227.214 +83.149.224.214 +216.55.160.214 +209.132.218.114 +209.157.135.114 +81.22.35.114 +216.195.33.114 +81.22.33.114 +200.154.52.114 +66.45.240.114 +198.65.220.114 +216.200.199.14 +216.34.209.14 +63.246.36.14 +213.244.183.204 +12.14.172.204 +213.244.168.104 +207.246.138.104 +212.43.230.104 +69.51.8.4 +192.245.235.4 +194.186.25.4 +205.134.163.4 +82.161.231.4 +195.121.7.193 +66.111.40.193 +209.132.218.93 +217.115.193.93 +65.39.176.83 +64.154.80.83 +69.31.98.173 +69.25.27.173 +216.239.115.173 +66.28.250.173 +209.132.218.73 +66.118.182.73 +213.158.72.73 +209.132.97.163 +66.154.47.163 +64.34.105.163 +64.154.80.163 +212.143.22.63 +209.207.137.253 +64.154.80.253 +217.16.16.153 +216.200.199.53 +216.34.207.53 +205.180.85.53 +64.246.24.53 +203.199.83.53 +217.16.16.143 +69.20.16.43 +205.180.85.43 +204.179.240.43 +213.203.193.233 +210.245.166.133 +69.10.136.133 +80.69.226.133 +194.67.35.133 +66.150.161.133 +209.67.1.133 +216.200.199.33 +69.51.8.33 +64.236.27.33 +64.7.207.123 +129.15.2.123 +216.200.199.23 +64.191.218.23 +216.73.86.23 +193.85.233.23 +207.219.111.23 +64.58.80.23 +194.135.19.13 +216.34.209.13 +209.132.193.13 +212.27.63.103 +62.250.147.3 +205.179.93.3 +209.240.140.3 +217.172.177.192 +67.15.77.192 +81.255.196.192 +69.46.28.92 +209.132.218.92 +200.225.157.92 +66.230.151.92 +194.228.200.92 +216.73.86.182 +209.62.176.182 +64.152.73.182 +204.10.240.182 +65.39.176.82 +193.108.80.82 +69.25.27.172 +202.139.106.172 +64.136.25.172 +204.251.15.172 +209.132.218.72 +209.225.4.72 +216.35.71.72 +64.136.24.162 +216.127.42.62 +209.15.51.62 +130.160.240.152 +216.200.199.52 +216.53.188.52 +205.180.85.52 +69.31.81.52 +80.80.10.52 +194.98.19.242 +217.148.189.142 +216.127.39.142 +200.176.3.142 +216.200.199.42 +205.180.85.42 +64.94.162.232 +216.52.167.132 +209.197.107.132 +64.15.205.132 +209.15.44.132 +216.200.199.32 +216.131.83.222 +208.237.254.122 +216.35.71.122 +64.58.80.122 +216.200.199.22 +64.81.69.22 +63.123.248.22 +63.111.66.22 +213.199.154.22 +213.61.105.212 +66.98.218.112 +66.118.182.112 +216.200.199.12 +207.44.132.12 +38.118.200.12 +193.85.207.202 +64.15.205.202 +212.27.40.202 +208.237.254.102 +4.18.162.102 +194.117.69.2 +81.222.128.2 +195.241.77.2 +209.123.16.2 +213.83.6.2 +63.108.45.2 +64.124.125.2 +204.9.53.2 +212.69.172.2 +82.161.231.2 +209.132.218.91 +216.73.86.181 +209.62.176.181 +207.246.136.181 +64.237.99.81 +216.73.86.81 +65.39.176.81 +64.154.80.81 +69.25.27.171 +216.92.211.171 +66.230.180.171 +217.212.240.171 +209.132.218.71 +216.127.32.71 +64.58.80.71 +213.59.0.71 +204.251.15.161 +207.68.178.61 +216.127.42.61 +193.19.137.251 +206.65.169.151 +38.113.1.151 +216.200.199.51 +216.73.87.51 +216.73.86.51 +209.62.176.51 +205.180.85.51 +212.47.13.241 +216.148.229.141 +64.192.135.141 +216.239.115.141 +195.60.12.141 +66.150.161.141 +216.200.199.41 +63.146.109.41 +66.179.107.41 +66.235.216.41 +205.180.85.41 +64.70.54.41 +209.132.220.41 +216.71.79.231 +64.210.243.231 +216.200.199.31 +69.51.8.31 +63.77.84.31 +216.10.104.221 +208.185.230.221 +216.200.199.21 +217.12.6.21 +67.18.195.21 +81.208.113.21 +212.48.11.21 +63.161.150.21 +216.200.199.11 +64.191.218.11 +193.149.121.11 +207.246.136.201 +213.244.183.201 +209.132.218.101 +208.237.254.101 +83.220.152.101 +62.27.21.101 +81.19.70.1 +66.39.117.190 +64.154.80.190 +64.154.80.90 +211.100.26.180 +207.241.148.80 +65.39.176.80 +199.181.132.80 +66.70.21.80 +69.25.27.170 +216.92.27.170 +204.251.15.170 +216.187.103.170 +217.212.240.170 +216.200.199.70 +64.154.80.70 +206.138.137.160 +208.254.3.160 +170.224.21.160 +64.154.80.160 +216.194.66.60 +205.180.85.60 +216.200.145.60 +206.51.224.60 +66.70.20.60 +64.94.162.250 +70.85.212.250 +64.154.80.250 +66.226.8.150 +206.251.184.50 +209.132.220.50 +195.161.119.240 +66.150.161.140 +217.173.149.40 +130.102.5.40 +208.237.254.40 +209.132.220.40 +212.162.13.230 +216.49.88.130 +216.200.199.30 +192.245.235.30 +66.179.234.30 +64.74.193.30 +207.246.141.30 +64.154.80.30 +199.193.10.30 +216.216.237.220 +192.190.109.20 +65.205.8.20 +216.52.245.20 +66.179.5.20 +209.132.193.20 +217.20.163.20 +207.126.123.20 +216.168.3.20 +216.130.161.20 +64.38.240.20 +195.250.147.210 +213.244.183.210 +216.200.199.10 +216.34.209.10 +80.190.228.10 +216.40.195.10 +64.124.125.10 +206.173.193.10 +212.143.22.10 +206.50.181.10 +205.134.183.200 +206.29.192.200 +208.184.138.100 +65.39.176.100 +209.132.205.100 +66.150.2.100 +207.150.181.100 +209.202.240.100 +207.38.10.100 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/blacklists/ads/urls b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/blacklists/ads/urls new file mode 100644 index 0000000000000000000000000000000000000000..a2f41c424bb33664c6e1b0c7bfd208b17203e2e6 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/blacklists/ads/urls @@ -0,0 +1,77 @@ +# Advanced AD blocking & logadblocks options depend on having the phrase +# "ADs" in a list's category. + +#listcategory: "ADs" + +# Example list taken from squidGuard on 2005-10-24 + +# +# !!! WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING !!! +# +# This list is entierly a product of a dumb robot (squidGuardRobot-2.3.7). +# We strongly recommend that you review the lists before using them! +# Don't blame us if there are mistakes, but please report errors with +# the online tool at http://www.squidguard.org/blacklist/ +# +# !!! WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING !!! +# +# This list was compiled in 0:50:02 on 2005.10.22 00:50:11. +# This list was compiled from 0 link sources and 2172 links, +# of which 928 tested successfully. +# +193.69.165.21/annonser +194.67.246.5/system/img +194.67.57.26/cgi-bin/splash +194.67.57.50/cgi-bin/splash +195.2.91.115/cgi-bin/export +208.254.3.166/popupwrapper.jsp +209.185.182.250/images +212.100.234.54/images +212.100.234.54/media +213.180.204.11/gifs +213.209.108.155/data +216.34.32.118/banners +217.76.32.61/gallery +3dnews.ru/bs +3dnews.ru/i/rus/a +3dnews.ru/images/regular-3dnews +64.14.49.241/main2 +64.157.224.6/frontdoor +64.49.242.139/buy_now +64.70.54.71/zm +64.74.134.11/dpark +64.74.134.61/dpark +64.94.29.11/dpark +64.94.29.61/dpark +66.92.12.36/companysite +67.18.144.234/consoles +8.6.221.109/images +adsrv.iol.co.za/admin +affiliates.postmasterdirect.com/main2 +avantgo.com/frontdoor +avault.com/consoles +banners.adultfriendfinder.com/banners +domainsystems.com/buy_now +ezhe.ru/mirror/nedelki +gazeta.ru/cgi-bin/export +linux.org.ru/gallery +mail.ru/cgi-bin/splash +matrix.mediavantage.de/data +moniker.qsrch.com/dpark +osp.ru/system/img +pcnews.ru/out +postmasterbannernet.com/13355761570041/welcome.mhtml +postmasterbannernet.com/139881249620972/welcome.mhtml +search.com/banners +seeq.com/lander.jsp +seeq.com/popupwrapper.jsp +sitecentric.com/companysite +sitestat.hetnet.nl/cgi-bin/private/sitestat.exe +telecom-pros.com/images +theregister.co.uk/images +theregister.co.uk/media +tweaktown.com/images +vg.no/annonser +win.mail.ru/cgi-bin/splash +yandex.ru/gifs +zmedia.com/zm diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/contentscanners/exceptionvirusextensionlist b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/contentscanners/exceptionvirusextensionlist new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/contentscanners/exceptionvirusmimetypelist b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/contentscanners/exceptionvirusmimetypelist new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/contentscanners/exceptionvirussitelist b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/contentscanners/exceptionvirussitelist new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/contentscanners/exceptionvirusurllist b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/contentscanners/exceptionvirusurllist new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/downloadmanagers/managedextensionlist b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/downloadmanagers/managedextensionlist new file mode 100644 index 0000000000000000000000000000000000000000..0754a781ff34fcdcf5096deb735e6dad27a83e1b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/downloadmanagers/managedextensionlist @@ -0,0 +1,42 @@ +# Managed extension list +# For use as the 'managedextensionlist' option in the configuration of +# download managers supporting this feature. +# +# When enabled, only content matching the extensions given in this list will +# be handled by the download manager. +# If a managedmimetypelist is also enabled, then only content matching both +# a mimetype and an extension in the lists will be handled. + +.bat +.cab +.com +.crt +.exe +.hlp +.ini +.hta +.inf +.lnk +.mdb +.pcd +.sh +.vbs +.doc +.xls +.gz +.tar +.bz2 +.sit +.bin +.hqx +.zip +.sxw +.doc +.iso +.pdf +.rar +.ace +.arj +.dll +.mda +.mde diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/downloadmanagers/managedmimetypelist b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/downloadmanagers/managedmimetypelist new file mode 100644 index 0000000000000000000000000000000000000000..e82433b3cae862316972dc3a9b4ab6bf5e74c415 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/downloadmanagers/managedmimetypelist @@ -0,0 +1,174 @@ +# Managed mime type list +# For use as the 'managedmimetypelist' option in the configuration of +# download managers supporting this feature. +# +# When enabled, only content matching the mime types given in this list will +# be handled by the download manager. +# If a managedextensionlist is also enabled, then only content matching both +# a mimetype and an extension in the lists will be handled. + +# List originally by David Chewning <david.chewning@onedatacentral.com> + +# MIME Types Researched at http://filext.com/ +# bat +application/bat +application/x-bat +# cab +application/cab +zz-application/zz-winassoc-cab +# com +application/com +application/x-com +# crt +application/x-x509-ca-cert +application/pkix-cert +application/keychain_access +# exe +application/octet-stream +application/exe +application/x-exe +application/dos-exe +vms/exe +application/x-winexe +application/msdos-windows +# hlp +application/winhlp +application/x-helpfile +application/x-winhelp +zz-application/zz-winassoc-hlp +# ini +zz-application/zz-winassoc-ini +# hta +application/hta +# inf +text/inf +application/x-setupscript +# lnk +application/x-ms-shortcut +# mdb +application/x-msaccess +application/vnd.msaccess +application/mdb +application/x-mdb +zz-application/zz-winassoc-mdb +# pcd +image/pcd +image/x-photo-cd +# sh +application/x-sh +application/x-shar +# vbs +application/x-vbs +text/vbs +text/vbscript +# doc +application/msword +application/doc +application/vnd.msword +application/vnd.ms-word +application/winword +application/word +application/x-msw6 +application/x-msword +zz-application/zz-winassoc-doc +# xls +application/msexcel +application/x-msexcel +application/x-ms-excel +application/vnd.ms-excel +application/x-excel +application/x-dos_ms_excel +application/xls +application/x-xls +zz-application/zz-winassoc-xls +# gz +application/gzip +application/x-gunzip +application/gzipped +application/gzip-compressed +gzip/document +# tar +application/tar +applicaton/x-gtar +multipart/x-tar +# bz2 +application/bzip2 +application/x-bz2 +application/x-bzip +# sit +application/stuffit +application/x-sit +# bin +application/macbinary +application/x-macbinary +application/bin +application/binary +# hqx +application/binhex +application/mac-binhex +application/mac-binhex40 +application/x-winzip +# zip +application/zip +application/x-zip +multipart/x-zip + +# Audio/video types commented out to prevent breakage of streaming apps +# mp3 +#audio/mpeg +#audio/x-mpeg +#audio/mp3 +#audio/x-mp3 +#audio/mpeg3 +#audio/x-mpeg3 +#audio/mpg +#audio/x-mpg +#audio/x-mpegaudio +# mpeg +#video/mpeg +# avi +#video/avi +#video/msvideo +#video/x-msvideo +#image/avi +#video/xmpg2 +#application/x-troff-msvideo +#audio/aiff +#audio/avi +# asf +#audio/asf +#application/asx +#video/x-ms-asf-plugin +#application/x-mplayer2 +#video/x-ms-asf +#application/vnd.ms-asf +#video/x-ms-asf-plugin +#video/x-ms-wm +#video/x-ms-wmx +# ogg +#audio/x-ogg +#application/x-ogg + +# Multiple extensions +# bat, com, dll, exe +application/x-msdos-program +# cab, gz, tar, zip +application/x-compress +# cab, gz, tar, bz2, zip +application/x-compressed +# com, dll, exe, bin +application/x-msdownload +# mda, mdb, mde +application/msaccess +application/vnd.ms-access +# sct, wsc +text/scriptlet +# sit, bin, hqx +application/x-stuffit +# gz, hqx +application/x-gzip +# tar, hqx +application/x-tar +# hqx, zip +application/x-zip-compressed + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/badwords/weighted_dutch b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/badwords/weighted_dutch new file mode 100644 index 0000000000000000000000000000000000000000..a2299368a5d94f3f202186f6f065846f71dc8ef2 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/badwords/weighted_dutch @@ -0,0 +1,36 @@ +# +# Dutch Swear Words Weighted Phrases +# Taken from swif.zip from dansguardian website +# + +#listcategory: "Bad words (Dutch)" + +< apenaaier ><75> #monkey-fucker +< bruinweker ><50> #literally: brown-creeper = fagget +< droogkloot ><25> #literally: dry-nut (as in: testicle) +< flikker ><50> #fagget/sissy +< hoer ><25> #hooker +< hoerenjong ><65> #son-of-bitch +< hondelul ><50> #cock-of-a-dog (commonly used, also by kids) +< kak ><10> #shit +< klootzak ><50> #ass-hole +< kut ><50> #cunt/pussy +< kutwijf ><90> #fucking bitch +< lul ><50> #dick/cock +< moederneuker ><75> #motherfucker +< nauwe gaatje ><50> #literally: ass-hole +< paardenlul ><50> #horse-cock +< pik omhoog ><80> #boner +< reetneuker ><70> #literally: ass-fucker +< rukker ><50> #jerk-off +< schijt ><50> #shit +< schijtlul ><50> #literally: shit-cock; commonly used for a chicken-shit +< slet ><50> #slut +< smerige kankerhoer ><75> #fucking whore (bad..) +< spast ><50> #spastic +< stront ><25> #shit +< sufkut ><75> #literally; sleepy-cunt +< sukkel ><20> #dumbo +< vuile kankerlijer ><75> #fucking ass-hole (bad one) +< zakkewasser ><42> #ass-hole + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/badwords/weighted_french b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/badwords/weighted_french new file mode 100644 index 0000000000000000000000000000000000000000..8ab0b79bb437dc75cda94816e1f03f7fde530938 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/badwords/weighted_french @@ -0,0 +1,43 @@ +# +# French Swear Words Weighted Phrases +# + +#listcategory: "Bad words (French)" + +< merde ><50> +< tu m'emmerdes ><80> +< tu me fais chier ><50> # you are pissing me off +< retourne enculer ><80> # go and fuck yourself +< enculé ><70> +< salope ><60> +< conasse ><40> +< poufiasse ><40> +< ordure ><20> # mess / rubbish +< chier ><50> # to shit +< faire foutre ><80> +< fils de pute ><90> # son of a whore +< branler ><50> +< bique ><50> # cock +< trou du cul ><80> # literally hole of arse +< le con ><60> +< la chatte ><90> # pussy +< baiser ><60> +< conneries ><30> +< fait moi jouir ><80> # make me cum +< tête moi le dard ><80> +< tête moi le noeud ><80> +< pédé ><40> +< tantouze ><50> +< couilles ><60> # balls +< putain ><60> # whore +< pute ><60> +< cul ><40> +< pauvre con ><60> # poor bastard +< pisser dans ><50> +< fils de pute ><90> +< salope ><60> +< Va te branler ><70> +< Va te tripoter ><80> +< Va te faire enculer ><90> +< choleque de merde ><60> + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/badwords/weighted_german b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/badwords/weighted_german new file mode 100644 index 0000000000000000000000000000000000000000..89d0af7a02edc3582fe2a00e74258c1c99626449 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/badwords/weighted_german @@ -0,0 +1,34 @@ +# +# German Swear Words Weighted Phrases +# Taken from swif.zip from dansguardian website +# + +#listcategory: "Bad words (German)" + +< arschloch ><20> +< scheiss ><20> +< scheisse ><20> +< fotze ><20> +< schwuchtl ><20> +< lesbe ><20> +< mutterficker ><20> +< hurensohn ><20> +< hure ><20> +< arschgesicht ><20> +< fick ><20> +< scheissdreck ><20> +< arschficker ><20> +< arsch ><20> +< scheisskopf ><20> +< schnoodle noodle ><20> +< verpiss dich ><20> +< wichser ><20> +< arschgeige ><20> +< hosenscheisser ><20> +< schwanz ><20> +< affenschwanz ><20> +< schlampe><20> # - tramp or slut +< schweinebacke><20> # - double crossing so and so +< dumpfbacke><20> # - idiot (mainly for female) +< arschkriecher><20> # - person who kisses bosses arse + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/badwords/weighted_portuguese b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/badwords/weighted_portuguese new file mode 100644 index 0000000000000000000000000000000000000000..261c5a2fa0f0af2a7fee2189c4c4dc847840641b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/badwords/weighted_portuguese @@ -0,0 +1,16 @@ +# +# Brazilian Portuguese Swear Words Weighted Phrases +# + +#listcategory: "Bad words (Portuguese)" + +<filho da puta><80> +<corno><10> +<babaca><10> +<otário><10> +<otario><10> +<idiota><5> +<caga pau><10> +<paga pau><10> +< viad><15> + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/badwords/weighted_spanish b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/badwords/weighted_spanish new file mode 100644 index 0000000000000000000000000000000000000000..c91a45c8ae1e1456acb2c4ff778b610a9e7e40be --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/badwords/weighted_spanish @@ -0,0 +1,67 @@ +# +# Spanish Swear Words Weighted Phrases +# Taken from swif.zip from dansguardian website +# + +#listcategory: "Bad words (Spanish)" + +< marica ><20> +< maricón ><20> +< mariconazo ><20> +< mariquita ><20> +< chapero ><20> +< bastardo ><20> +< cabron ><20> +< polla ><20> +< nabo ><20> +< rabo ><20> +< verga ><20> +< cipote ><20> +< gilipollas ><20> +< tontopollas ><20> +< pichacorta ><20> +< cojones ><20> +< pelotas ><20> +< huevos ><20> +< cojonazos ><20> +< coño ><20> +< chocho ><20> +< raja ><20> +< chichi ><20> +< pelos de los huevos ><20> +< pelos de los coño ><20> +< mierda ><20> +< cagar ><20> +< jiñar ><20> +< chupame la polla ><20> +< chupamela ><20> +< chupar ><20> +< puta ><20> +< zorra ><20> +< guarra ><20> +< follar ><20> +< jode ><20> +< chingar ><20> +< me cago en ti ><20> +< que te jodan ><20> +< culo ><20> +< cabron ><20> +< calientapollas ><20> + +#South American spanish: +< mariposa ><20> +< joto ><20> +< pinga ><20> +< chilito ><20> +< panocha ><20> +< chimba ><20> +< chichis ><20> +< Chinga ><20> +< pendejo ><20> +< pendeja ><20> +< cago en tu leche ><20> +< hazte cojer ><20> +< pinche cabron ><20> +< concha ><20> +< coger ><20> + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/chat/weighted b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/chat/weighted new file mode 100644 index 0000000000000000000000000000000000000000..11dec579b211c7816ca98f257d34bf37f426887c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/chat/weighted @@ -0,0 +1,33 @@ +#listcategory: "Chat" + +< javachat ><50> +< webbchat ><50> +< webbtjatt ><50> +< webchat ><50> +< chatkamer ><50> +< chatroom ><50> +< irc ><50> +< ircd ><50> +< javachat ><50> +< javatjatt ><50> + +#Web-based Instant Messaging +< gaim ><30> +< icq ><30> +<msn2go><30> +<aimexpress><30> +< wbmsn ><30> +<iloveim><30> +< kiwibox ><30> +< webmessenger ><30> +< e-messenger ><30> +< web2messenger ><30> +< onlinemessenger ><30> +< msnger><30> +< jpager><30> +< easymessage ><30> +<trillian ><30> +< instant messenger ><10> +<web based>,<messenger>,< msn ><50> +<yahoo!>,<messenger><30> + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/chat/weighted_italian b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/chat/weighted_italian new file mode 100644 index 0000000000000000000000000000000000000000..e590314f9224fb8d8e788e640a6f3b4783048f0f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/chat/weighted_italian @@ -0,0 +1,26 @@ +#listcategory: "Chat (Italian)" + +< scegliere la ragazza><30> +< scegliere le ragazze><30> +<scegli la ragazza><30> +<scegli le ragazze><30> +<scegli >,< ragazza >,< preferita><30> +<scegli >,< ragazza >,< che preferisci><30> +< scegliere >,< ragazza >,< che preferisci><30> +< scegliere >,< ragazza >,< preferita><30> +< conoscere >,< ragazz><10> +< incontrare>,< ragazz><10> +< dal vivo><30> +< incontri eccitanti><30> +< incontrare persone><10> +< interagire con><10> +< chat><10> +<chatline><10> +<giovani fanciull><10> +< spregiudicat><10> +< eros ><10> +< video-chat><20> +< scambio coppie><30> +< videocamer>,< nascost><10> +< telecamer>,< nascost><10> + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/drugadvocacy/weighted b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/drugadvocacy/weighted new file mode 100644 index 0000000000000000000000000000000000000000..b5b169a825776c89434b4ee4f5c9009f975aac26 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/drugadvocacy/weighted @@ -0,0 +1,12 @@ +#listcategory: "Drug Advocacy" + +< american cannabis society ><40> +< drogenpolitik ><60> +< ganga ><50> +< ganja ><50> +< marihuanabeleid ><60> +< marijuanalagstiftning ><60> +< marijuanalovgivning ><60> +< medicinal marijuana ><40> +< spliff ><60> + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/gambling/banned b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/gambling/banned new file mode 100644 index 0000000000000000000000000000000000000000..03bab10f158ef00aba5b451e98ce2a393d90ad88 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/gambling/banned @@ -0,0 +1,13 @@ +#listcategory: "Gambling" + +<green card lottery> +<greencard lottery> +<kasino> +< loto > +< lotto > +< video poker > +<videopoker> +<virtual casino> +<virtualcasino> +<virtual vegas> + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/gambling/banned_portuguese b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/gambling/banned_portuguese new file mode 100644 index 0000000000000000000000000000000000000000..88a31d5282663ddcd792697af7f954cb54099b1d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/gambling/banned_portuguese @@ -0,0 +1,10 @@ +#listcategory: "Gambling (Portuguese)" + +< cassino virtual > +< cassinos virtuais > +< loteria virtual > +< loterias virtuais > +< lotomania virtual > +< megasena virtual > +< vegas virtual > + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/gambling/weighted b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/gambling/weighted new file mode 100644 index 0000000000000000000000000000000000000000..6ede17b638b98d7f38d1f69304216fc2ed746bcc --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/gambling/weighted @@ -0,0 +1,45 @@ +# +# Phraselists to block gambling sites +# + +#listcategory: "Gambling" + +< bet >,<poker><40> +< betting ><30> +< blackjack ><30> +< casino ><30> +< casinon ><30> +< casinos ><30> +< gamblers ><30> +< gambling ><30> +< jackpot ><20> +< jackpott ><20> +< kasino><30> +< kasinon ><30> +< loto ><30> +< lotteri ><30> +< lotterier ><30> +< lotteries ><20> +< lottery ><30> +< lotto ><30> +< prispott ><20> +< roulette ><30> +< snake eyes ><20> +< snakeeyes ><20> +< sports book ><10> +< sportsbook ><10> +< totalisator ><30> +< video poker ><30> +< wagering ><50> +< wager ><30> +<card room><10> +<green card lottery><30> +<greencard lottery><30> +<poker>,<online><50> +<poker>,<tournament><50> +<poker>,<virtual><50> +<videopoker><30> +<virtual casino><30> +<virtual vegas><30> +<virtualcasino><30> + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/gambling/weighted_portuguese b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/gambling/weighted_portuguese new file mode 100644 index 0000000000000000000000000000000000000000..87772fdb057623c0ccbfc4e622d66015fc824ef2 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/gambling/weighted_portuguese @@ -0,0 +1,12 @@ +#listcategory: "Gambling (Portuguese)" + +< aposta ><10> +< apostadores ><10> +< apostando ><10> +< casino><20> +< cassino><20> +< jogo de vinte e um ><10> +< jogos de vinte e um ><10> +< jogo de azar><10> +< jogos de azar><10> + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/games/weighted b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/games/weighted new file mode 100644 index 0000000000000000000000000000000000000000..2289c47f88b964e277565606c2c16c4c382d968c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/games/weighted @@ -0,0 +1,64 @@ +# +# Phraselists to block gaming websites +# Originally created by Fernand Jonker +# +# This list is seriously ALPHA - it blocks many pages, but may overblock. +# This list has NOT been tested in a production environment! +# If you use this list please send feedback to phrasemaster@dansguardian.org +# Waiting for input :-) +# + +#listcategory: "Games" + +< games><10> +< puzzles><10> +<online game><40> +<multiplayer><30> +<multi-player><30> +<arcade><20> + +#game names +<poker><30> +<solitaire><30> +<mahjong><30> +<mah jong><30> +<backgammon><30> +<wheel of fortune><30> +<scrabble><30> +<bejeweled><30> +<bingo><10> +<jewel quest><30> +<zuma><30> +<texttwist><30> +<bespelled><30> +<cubis><30> + +<close combat><30> +<combat task force><30> +<doom><30> +<delta force><30> +<mortal kombat><30> + +#game companies +<popcap><30> +<xbox><10> +<gamecube><10> +<playstation><10> +<game boy><20> +<sony>,< psp ><20> +<nintendo><20> +<dreamcast><20> +<bradygames><20> +<capcom><20> +<realarcade><20> + +#general gaming +<game>,<cheats><30> +<game>,<codes><30> +<game>,< simulation><30> +<game>,< strategy><30> +<game>,< adventure><30> +<game>,< action><30> +<game>,< rpg><30> +<game>,< sport><30> + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/goodphrases/exception b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/goodphrases/exception new file mode 100644 index 0000000000000000000000000000000000000000..c517fa629eb3be89673f3a4544e6ec21b8836373 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/goodphrases/exception @@ -0,0 +1,6 @@ +<ebay listings :> +#< ringtone > +#<ringtones> +<virgin rain forest> +<x-rated=no> + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/goodphrases/exception_email b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/goodphrases/exception_email new file mode 100644 index 0000000000000000000000000000000000000000..a8763c12551565979adc4ed2bf9e9e007552ddce --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/goodphrases/exception_email @@ -0,0 +1,11 @@ +<folder: inbox> +<hotmail - inbox> +<hotmail inbox> +<hotmail - junk mail> +<hotmail junk mail> +<hotmail>,<this is not junk mail> +<hotmail trash can> +<moemail> +<quicklist?curmbox> +<quiklist?curmbox> + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/goodphrases/weighted_general b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/goodphrases/weighted_general new file mode 100644 index 0000000000000000000000000000000000000000..56f449ebdf6ff9b32e49d9ffe104b67009ec178a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/goodphrases/weighted_general @@ -0,0 +1,405 @@ +< smoothwall ><-20> +<smoothwall ><-20> +<dansguardian><-30> +< dns ><-20> +< wikipedia ><-30> +<network management><-50> +<firewall><-20> +< vpn ><-20> +<network security><-50> +<anti-virus><-50> +<employment><-10> +<security><-10> +<networking><-10> +<ebay listings :><-50> +<make install><-10> +<troubleshooting><-10> +<howto><-10> +<glibc><-10> +<request lyrics><-20> +<submit lyrics><-20> +<rewrite><-20> +<draft version><-30> +<acknowledgment><-10> +<adult education><-50> +<advice><-20> +<advice>,<help>,<gay><-50> +<advice>,<help>,<lesbian><-50> +<advice>,<help>,<rape><-50> +<advice>,<help>,<sexual><-50> +<aids>,<breakthrough><-50> +<aids>,<cure>,<hiv><-50> +<aids epidemic><-50> +<aids>,<hospital><-30> +<aids>,<information><-30> +<aids>,<medical><-30> +<album><-20> +<albums>,<cd>,<cassette><-50> +< amd ><-20> +<analyse><-50> +<analysis><-50> +<andy warhol><-100> +<anti child pornography><-20> +<anti-piracy><-50> +<antipiracy><-50> +<anti pornography><-20> +<apparel><-10> +<archived lyrics><-50> +<article>,<cancer><-30> +<article>,<education><-30> +<article>,<environment><-30> +<article>,<health><-30> +<article>,<medical><-30> +<article>,<research><-30> +<article>,<sexuality><-30> +<article>,<social><-30> +<article>,<study><-30> +<assessment><-20> +<association news><-30> +<atari><-50> +<athlet>,<event><-30> +<athlet>,<record><-30> +<athlet>,<venue><-30> +<auditor><-10> +<authoritative><-10> +<back catalogue><-10> +<background briefing><-50> +<baptist><-20> +<beaut>,<hair>,<skin><-20> +<beauty facial><-20> +<beauty product><-20> +<beauty salon><-20> +<being defined><-10> +<benchmark><-20> +<bible><-10> +<bible study><-30> +<biblical><-10> +<bibliography><-50> +<biggest selling newspaper><-20> +<biology><-40> +<birth control><-10> +<body and spirit><-20> +<book forum><-20> +<book notes><-50> +<breast cancer><-50> +<breast>,<cancer>,<treatment><-50> +<breast>,<medical><-30> +<browse artists><-50> +<by artist><-10> +<cancer><-30> +<cancer>,<cure><-30> +<cancer>,<disease><-30> +<cancer>,<hospital><-30> +<cancer>,<medical><-30> +<cancer>,<radiation><-30> +<cancer>,<therapy><-30> +<cancer>,<treatment><-30> +<car accessories><-20> +<careers><-10> +<cat ><-10> +<catholic><-20> +<championship><-10> +<chapter><-20> +<character info><-50> +<character list><-40> +<chardonnay><-10> +<chemistry><-40> +<child psychologist><-40> +<christology><-20> +<church><-30> +<classical><-40> +<classicnote><-60> +<commentary><-10> +<commerce><-10> +<commissioner><-30> +<compensation><-20> +<composition><-20> +<conclusion><-20> +<congregation><-20> +<congress><-10> +<constitute a criminal><-10> +<content filter administrator><-1000> +<contraception><-10> +<contraceptive><-10> +<counseling><-30> +<crash kills><-20> +<criminal investigation><-30> +<cultural resources><-50> +<dance mix><-50> +<data about><-10> +<data on><-10> +<definition><-10> +<democrat><-10> +<dental care><-30> +<department of health><-30> +<dictionary>,<thesaurus><-50> +<discussion forum><-50> +<dj>,< vinyl><-50> +<documentary><-50> +<does not contain porn><-20> +<domestic violence><-30> +<donate><-20> +<dreamcast><-50> +<drug information><-20> +<drug research><-20> +<drum & bass><-40> +<dvd review><-40> +< e-card><-10> +< ecard><-10> +<education><-20> +<education>,<learning><-20> +<education>,<resource><-20> +<elder ><-10> +<elucidate><-20> +<emails of support><-20> +<encourages conduct><-10> +<environment><-20> +<essay><-30> +<ethicist><-50> +< ex-><-20> +<excellence in><-10> +<exodus><-5> +<ex-rated><-40> +<facial expression><-40> +<facial>,<mask><-20> +<facial>,<peel><-20> +<facial>,<plastic surgery><-60> +<facial>,<skin><-10> +<fact sheet><-20> +<fag break><-5> +<fallacies><-5> +<fallacy><-5> +<family problems><-30> +<fan site><-20> +<faq><-30> +<fda approved><-40> +<fda-approved><-40> +<federal court><-10> +<fight pedophilia><-20> +<first aid><-30> +<for educators><-30> +<fresh investigation><-50> +<full article><-20> +<full track list><-30> +<gay aware><-30> +<genre><-20> +<glossary of terms><-50> +<gospel><-20> +<grammar><-30> +<guitar><-50> +<happy hardcore><-40> +<hardback><-30> +<hardcore techno><-40> +<hard house><-40> +<hard trance><-40> +<hardware><-30> +<headquarters><-20> +< health ><-10> +<health><-30> +<health and beauty><-30> +<health>,<disease><-10> +<health>,<disorder><-20> +<health>,<intercourse><-20> +<health>,<penis><-20> +<health>,<physician><-20> +<health>,<virgina><-20> +<herbal><-20> +<hip-hop><-20> +< h.i.v ><-50> +< hiv ><-50> +<homily><-20> +<hormone>,<medical><-30> +<hormone replacement><-50> +<hormone>,<therapy><-30> +<hormone>,<treatment><-30> +<hospital><-10> +<human nature><-10> +<human rights><-30> +<imdb><-40> +< intel ><-20> +<intellectual property><-20> +<internet movie database><-80> +<interview><-20> +<intolerance><-10> +<investigative><-50> +<investigative documentary><-500> +<isbn><-40> +<is not porn><-20> +<issue>,<environment><-30> +<issue>,<medical><-30> +<jesus christ><-10> +<job search><-30> +<journal>,<education><-50> +<journal>,<findings><-50> +<journalism><-10> +<journal>,<medical><-50> +<journal>,<science><-50> +<legal aid><-30> +<letters to the editor><-40> +<literature><-20> +<losing streak><-30> +<lyrics><-60> +<lyrics archive><-20> +<lyrics by artist><-100> +<lyrics by title><-100> +<man charged><-20> +<mathematics><-50> +<mechanic><-30> +<medical><-20> +<medical>,<biology><-20> +<medical care><-50> +<medical condition><-50> +<medical problem><-50> +<message board><-10> +<messagemate><-10> +<metabolism><-50> +<ministry><-20> +<movie review><-40> +<music entertainment><-20> +<newsletter><-10> +<nintendo><-50> +<nonoxynol><-20> +<no porn policy><-30> +<official movie site><-50> +<open source><-5> +<ordination><-20> +<ornithology><-50> +<other articles><-20> +<otherwise objectionable><-10> +<overclocker><-80> +<paperback><-40> +<parliment><-10> +<partnership><-5> +<pathology><-20> +<pediatric><-40> +<pilot program><-50> +<plant><-30> +<plastic surgery><-30> +<playstation><-50> +<poems><-30> +<poetry><-30> +<police seized><-30> +<police spokesman><-30> +<police spokesperson><-30> +<police spokeswoman><-30> +<postmodern><-50> +<praise and criticism><-50> +<preface><-20> +<presbyterian><-20> +<prevent illegal distrubtion><-50> +<priest><-10> +<print article><-20> +<printer friendly version><-20> +<print story><-20> +<print this article><-20> +<print this story><-20> +<promote sexual abstinence><-50> +<proposal>,<draft><-30> +<pursue legal action><-20> +<radio national><-50> +<rain forest><-40> +<rape victim><-40> +<recommended publications><-40> +<recommended reading><-40> +<record collect><-50> +<record label><-50> +<reference material><-50> +<related stories><-40> +<related subjects><-30> +<remix>,<production>,<cd><-30> +<report child porn><-15> +<request song><-50> +< research ><-20> +<researcher><-20> +<reserves the right><-10> +<resource page><-30> +<safe sex><-20> +<satire><-50> +<satirical><-50> +<scholar><-20> +<science><-30> +<scientific><-30> +<script review><-40> +<servicemen><-30> +<sermon><-50> +<setting goals><-40> +<sex compaign><-30> +<sex education><-30> +<sex education web circle><-30> +<sexually transmitted><-30> +<short summary><-40> +<sign this guestbook><-50> +<skin care><-30> +<social issue><-30> +<sony music><-40> +<special investigation><-20> +<spermicide><-20> +<spiritual><-20> +<spoof><-30> +<starlet>,<toyota><-30> +<stop child porn><-30> +<stop child pornography><-30> +<stop illegal distrubtion><-50> +<stop pedophilia><-30> +<stop porn><-30> +<stop pornography><-30> +<student of the year><-30> +<study>,<character><-40> +<study guide><-50> +<study>,< poem><-50> +<study>,< poet><-50> +<study>,<reference><-50> +<study>,<text><-50> +<submit song><-50> +<supreme court><-20> +<sydney morning herald><-100> +<symposium><-50> +<syndrome><-50> +<teach><-5> +<term paper><-100> +<thinktank><-40> +<this is not a porn><-20> +<tournament><-20> +< trade ><-20> +<travel><-5> +<treatment><-20> +<tumor><-20> +<university><-5> +<unlawful>,<defamatory>,<obscene>,<vulgar><-20> +<vagina>,<education><-25> +<various artists><-20> +<video review><-40> +<violates or infringes><-10> +<vocation><-20> +<war stories><-30> +<war story><-30> +<webquest><-40> +<willow><-40> +<woman charged><-20> +<wrestlemania><-50> +<wrestling><-50> +< wwf><-50> +<x-box><-50> +<xbox><-50> +<xxx>,< ale><-20> +<xxx>,<beer><-10> +<xxx>,<drought><-20> +<you shall not>,<material>,<violates><-10> +< flight><-10> +< airline><-10> +< chicken>,<breast><-50> +< turkey>,<breast><-50> +< museum><-30> +<librar><-30> +< marriage><-30> +< lawyer><-30> +< vacation><-5> +<destination><-10> +<guests>,<children><-30> +<check-in><-10> +<travel agent><-30> +<booking><-5> +<travel><-5> +<flight><-10> +<reservation><-5> + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/goodphrases/weighted_general_danish b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/goodphrases/weighted_general_danish new file mode 100644 index 0000000000000000000000000000000000000000..5ac4d47065d79834033f961d173ec268be88992e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/goodphrases/weighted_general_danish @@ -0,0 +1,6 @@ +# +# Good phrases in Danish +# +<undervisning><-35> #education +<oplysning><-15> #educating information + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/goodphrases/weighted_general_dutch b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/goodphrases/weighted_general_dutch new file mode 100644 index 0000000000000000000000000000000000000000..3fe5965b75e6d00af6323696fd77155305649864 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/goodphrases/weighted_general_dutch @@ -0,0 +1,5 @@ +# +# Good phrases in Dutch +# +< kerk ><-60> #church + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/goodphrases/weighted_general_malay b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/goodphrases/weighted_general_malay new file mode 100644 index 0000000000000000000000000000000000000000..99a257090311da5415b7f357309bad42e0f31ea8 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/goodphrases/weighted_general_malay @@ -0,0 +1,8 @@ +# +# Created by Sazarul Izam <izam@oscc.org.my> +# Sorted by words +# +#listcategory: "GoodPhrases (Malay)" + +<zina>,<islam><-30> +<main><-10> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/goodphrases/weighted_general_portuguese b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/goodphrases/weighted_general_portuguese new file mode 100644 index 0000000000000000000000000000000000000000..c8e37893df88be14e93b2a2fd1830ea5dbc6812a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/goodphrases/weighted_general_portuguese @@ -0,0 +1,44 @@ +# +# Good phrases in Brazilian Portuguese +# +<doação><-20> +<doacao><-20> +<doaçao><-20> +<femea><-20> +<fêmea><-20> +<vira-lata><-20> +<filhote><-20> +<amor><-20> +<carinho><-20> +<afeto><-20> +<abandon><-30> +<desaparecid><-30> +<procura-se><-20> +<vendo><-15> +<deficiente><-20> +<deficiência><-20> +<deficiencia><-20> +<adoção><-20> +<adocao><-20> +<adotar><-20> +<tunning><-10> +<tunado><-10> +<noticia><-20> +<notícia><-20> +<software livre><-20> +<tutorial><-20> +<comunidade><-10> +<artigo><-20> +<foto>,<satelite><-20> +<foto>,<telescopio><-20> +<vestibular><-10> +<graduação><-10> +<graduacao><-10> +<pós-graduação><-10> +<pos-graduacao><-10> +<pesquisa><-10> +<cultura><-10> +<biblioteca><-10> +<museus><-10> +<museolog><-30> + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/goodphrases/weighted_news b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/goodphrases/weighted_news new file mode 100644 index 0000000000000000000000000000000000000000..7c467958a7bde890cc7801a463ca36d623e598af --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/goodphrases/weighted_news @@ -0,0 +1,36 @@ +# +# Good Weighted Phrases to prevent the blocking of news sites +# + +<newspaper online><-40> +<news>,<report><-50> +<news>,<solicitor><-30> +<national news><-50> +<news>,<article><-30> +<news headlines><-50> +<news>,<interview><-50> +<news>,<lawyer><-30> +<breaking headlines><-30> +<breaking news><-30> +<international news><-20> +<latest news><-20> +<sun newspaper><-50> +<world news><-20> +<top news><-30> +< headline><-10> +< weather >,< classifieds ><-40> + +<more articles><-20> +<more news><-10> +<morning herald><-80> +<news update><-20> +<technology news><-30> +<news>,<traffic>,<weather><-50> +<gun>,<control><-50> + +<sport>,<competition><-30> +<sport news><-40> +<sports news><-40> + + + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/googlesearches/banned b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/googlesearches/banned new file mode 100644 index 0000000000000000000000000000000000000000..2713f0009c665f90a19bd2cf6278165016f129b3 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/googlesearches/banned @@ -0,0 +1,674 @@ +# Image Search Site Blocks +# 05-08-03 JFH r4 + +#listcategory: "Google Searches" + +<nude>,<nude>,<nude>,<nude>,<nude>,<sex>,<girls> +<?q=nude> +<?q=naked+women&> +<?q=naked+girls&> +<?q=naked+men&> +<?q=oral&> +<?q=3+some&> +<?q=breast&> +<?q=boobs&> +<?q=tits&> +<?q=sperm&> +<?q=cock&> +<?q=cocks&> +<?q=penis&> +<?q=bdsm&> +<?q=anal&> +<?q=anamial+sex&> +<?q=house+sex&> +<?q=married+sex&> +<?q=virgin+girls&> +<?q=hot+girls&> +<?q=hot+guys&> +<?q=gay+guys&> +<?q=gay+women&> +<?q=homosexual+women&> +<?q=homosexual+girls&> +<?q=lesbin+girls&> +<?q=lesbian+girls&> +<?q=lesbian&> +<?q=boods&> +<?q=oral+sex&> +<?q=naked&> +<?q=naked+guys&> +<?q=sex&> +<?q=balls&> +<?q=cum&> +<?q=cleavage&> +<?q=twat&> +<?q=vagina&> +<?q=clitoris&> +<?q=sexy+teens&> +<?q=erotic&> +<?q=erotic+cartoon&> +<?q=erotic+sex&> +<?q=erotic+girls&> +<?q=sex+movies&> +<?q=sex+picts&> +<?q=pussy&> +<?q=lap+dance&> +<?q=breast+implants&> +<?q=implants&> +<?q=head+job&> +<?q=blow+job&> +<?q=blow+jobs&> +<?q=69&> +<?q=muff&> +<?q=muff+diving&> +<?q=butt+plug&> +<?q=buttplug&> +<?q=gay+boy&> +<?q=fag&> +<?q=g+spot&> +<?q=masterbation&> +<?q=sexy+women&> +<?q=1+sex&> +<?q=2+sex&> +<?q=3+sex&> +<?q=6+sex&> +# 05-09-03 JFH +<?q=homo&> +<?q=bitch&> +<?q=bastard&> +<?q=orgasm&> +<?q=hard+on&> +<?q=erection&> +<?q=fisting&> +<?q=ass&> +<?q=asshole&> +<?q=pecker&> +<?q=porn+queen&> +<?q=stripper&> +<?q=penitration&> +<?q=insest&> +<?q=wack+off&> +<?q=Felching&> +<?q=Flagellation&> +<?q=Glory+hole&> +<?q=Handballing&> +<?q=Incest&> +<?q=Poontang&> +<?q=Schlong&> +<?q=nude+nudes&> +<?q=exotic+nudes&> +<?q=nude+picture&> +<?q=nude+pictures&> + +# VARATIONS 05-14-03 JFH +<?q=rape&> +<?q=+naked+women> +<?q=+rape> +<?q=+naked+girls> +<?q=+naked+men> +<?q=+oral> +<?q=+3+some> +<?q=+breast> +<?q=+boobs> +<?q=+tits> +<?q=+sperm> +<?q=+cock> +<?q=+cocks> +<?q=+penis> +<?q=+bdsm> +<?q=+anal> +<?q=+anamial+sex> +<?q=+house+sex> +<?q=+married+sex> +<?q=+virgin+girls> +<?q=+hot+girls> +<?q=+hot+guys> +<?q=+gay+guys> +<?q=+gay+women> +<?q=+homosexual+women> +<?q=+homosexual+girls> +<?q=+lesbin+girls> +<?q=+lesbian+girls> +<?q=+lesbian> +<?q=+boods> +<?q=+oral+sex> +<?q=+naked> +<?q=+naked+guys> +<?q=+sex> +<?q=+balls> +<?q=+cum> +<?q=+cleavage> +<?q=+twat> +<?q=+vagina> +<?q=+clitoris> +<?q=+sexy+teens> +<?q=+erotic> +<?q=+erotic+cartoon> +<?q=+erotic+sex> +<?q=+erotic+girls> +<?q=+sex+movies> +<?q=+sex+picts> +<?q=+pussy> +<?q=+lap+dance> +<?q=+breast+implants> +<?q=+implants> +<?q=+head+job> +<?q=+blow+job> +<?q=+blow+jobs> +<?q=+69> +<?q=+muff> +<?q=+muff+diving> +<?q=+butt+plug> +<?q=+buttplug> +<?q=+gay+boy> +<?q=+fag> +<?q=+g+spot> +<?q=+masterbation> +<?q=+sexy+women> +<?q=+1+sex> +<?q=+2+sex> +<?q=+3+sex> +<?q=+6+sex> +<?q=+homo> +<?q=+bitch> +<?q=+bastard> +<?q=+orgasm> +<?q=+hard+on> +<?q=+erection> +<?q=+fisting> +<?q=+ass> +<?q=+asshole> +<?q=+pecker> +<?q=+porn+queen> +<?q=+stripper> +<?q=+penitration> +<?q=+insest> +<?q=+wack+off> +<?q=+Felching> +<?q=+Flagellation> +<?q=+Glory+hole> +<?q=+Handballing> +<?q=+Incest> +<?q=+Poontang> +<?q=+Schlong> +<?q=+nude+nudes> +<?q=+exotic+nudes> +<?q=+nude+picture> +<?q=+nude+pictures> + +<?q=+naked+women+> +<?q=+naked+girls+> +<?q=+naked+men+> +<?q=+oral+> +<?q=+3+some+> +<?q=+breast+> +<?q=+boobs+> +<?q=+tits+> +<?q=+sperm+> +<?q=+cock+> +<?q=+cocks+> +<?q=+penis+> +<?q=+bdsm+> +<?q=+anal+> +<?q=+anamial+sex+> +<?q=+house+sex+> +<?q=+married+sex+> +<?q=+virgin+girls+> +<?q=+hot+girls+> +<?q=+hot+guys+> +<?q=+gay+guys+> +<?q=+gay+women+> +<?q=+homosexual+women+> +<?q=+homosexual+girls+> +<?q=+lesbin+girls+> +<?q=+lesbian+girls+> +<?q=+lesbian+> +<?q=+boods+> +<?q=+oral+sex+> +<?q=+naked+> +<?q=+naked+guys+> +<?q=+sex+> +<?q=+balls+> +<?q=+cum+> +<?q=+cleavage+> +<?q=+twat+> +<?q=+vagina+> +<?q=+clitoris+> +<?q=+sexy+teens+> +<?q=+erotic+> +<?q=+erotic+cartoon+> +<?q=+erotic+sex+> +<?q=+erotic+girls+> +<?q=+sex+movies+> +<?q=+sex+picts+> +<?q=+pussy+> +<?q=+lap+dance+> +<?q=+breast+implants+> +<?q=+implants+> +<?q=+head+job+> +<?q=+blow+job+> +<?q=+blow+jobs+> +<?q=+69+> +<?q=+muff+> +<?q=+muff+diving+> +<?q=+butt+plug+> +<?q=+buttplug+> +<?q=+gay+boy+> +<?q=+fag+> +<?q=+g+spot+> +<?q=+masterbation+> +<?q=+sexy+women+> +<?q=+1+sex+> +<?q=+2+sex+> +<?q=+3+sex+> +<?q=+6+sex+> +<?q=+homo+> +<?q=+bitch+> +<?q=+bastard+> +<?q=+orgasm+> +<?q=+hard+on+> +<?q=+erection+> +<?q=+fisting+> +<?q=+ass+> +<?q=+asshole+> +<?q=+pecker+> +<?q=+porn+queen+> +<?q=+stripper+> +<?q=+penitration+> +<?q=+insest+> +<?q=+wack+off+> +<?q=+Felching+> +<?q=+Flagellation+> +<?q=+Glory+hole+> +<?q=+Handballing+> +<?q=+Incest+> +<?q=+Poontang+> +<?q=+Schlong+> +<?q=+nude+nudes+> +<?q=+exotic+nudes+> +<?q=+nude+picture+> +<?q=+nude+pictures+> +<?q=+rape+> +#05-15-03 JFH +<q=nudity female> +<q=nudity male> +<q=nudity> +<q=nudity girls> +<q= nudity boys> +<q=naked boys> +<q=gay naked boys> +# 05-19-03 JFH +<?q=bare> +#<?q=nip> +<?q=lust> +<?q=piering> +<?q=bodypiercing> +<?q=tatoos> +<?q=genitals> +<?q=male genitals> +<?q=female genitals> +<?q=jacking off> +<?q=hand job> +<?q=beat off> +<?q=masterbate> +<?q=passion> +<?q=sex toy> +<?q=sextoys> +<?q=sextoy> +<?q=sexy toy> +<?q=sexy toys> +<?q=sexkitten> +<?q=sex kitten> +<?q=pubic> +<?q=pubic hair> +# 10-13-03 JFH +#HENTAI PORN BLOCKS +<q=hentai> +#02-06-03 JFh +<www.sailormoonx.com> +<www.manga4free.com> +<www.sailor-moon-hentai.org> +<sailor>,<moon>,<hentai>,<picts> +# 02-23-04 JFH +<?q=hard+core&> +<?q=+hard+core&> +<?q=++hard++core&> +<?q=+++hard+core&> +<?q=++hard+core&> +<?q=topless&> +<?q=+topless&> +<?q=++topless&> +# 02-26-04 JFH +#SMS Access Issue +<q=titties> +<q=+titties> +<q=cartoons+having+sex> +<q=+cartoons+having+sex> +<q=having+sex> +<q=woman%27s+ass> +<q=woman%27s+boobs> +<q=woman%27s+tits> +<q=+woman%27s+ass> +<q=sex> +<q=+sex> +<q=sexy+cartoon> +<q=breasts> +<q=+breasts> +<q=++breasts> +<q=naked+woman> +<q=+naked+woman> +<q=+naked++woman> +<?q=body+art> +<?q=+body+art> +#03-04-04 JFH +<?q=porn> +<?q=+porn> +<?q=free+porn> +#03-11-04 JFH +<?q=b-u-t-t> +# 03-16-04 JFH +<?q=poop> +<?q=pee> +<?q=naked+> +<?q=booby> +<?q=boobies> +<?q=nudist+> +<?q=nudists> +<?q=+nudist+> +<?q=nudies> +#03-23-04 JFH +<?q=gay> +<?q=gay+> +<?q=fat+ass> +<?q=fat+pussy> +<images?q=brooke+burke> +<images?q=trish+stratus> +<images?q=jennifer+lopez> +<images?q=britney+spears> +<images?q=charlize+theron> +<?q=masturba> +#03-31-04 JFH +<?q=big+boobs> +#04-02-04 JFH +<?q=lesbos> +<?q=hot+girlz> +<?q=hot+girls> +<?q=+hot+girlz> +<?q=fuckin> +<?q=fuck> +<?q=+fuck> +<?q=gone+wild> +<?q=girls+gone+wild> +<?q=strip+clubs> +<?q=hardcore> +<?q=hot+sex> +<?q=hot+les> +<images?q=sweet+>,<safe=off>,<images.google.com> +#04-06-04 JFH +<?q=girlz> +<?q=+girlz> +<?q=girlz+> +<?q=fetiches> +<?q=+fetiches> +<?q=fetiches+> +#04-12-04 JFH +<?q=nude> +<?q=www.myfreepaysite> +<?imgurl=www.teen> +# 04-13-04 JFH +<images?q=women>,<safe=off>,<images.google.com> +<images?q=female>,<safe=off>,<images.google.com> +<?q=blowjob> +<?q=blow+job> +<?q=+blowjob> +<?q=nudist> +<?q=prostitute> +<?q=+prostitute> +#04-14-04 JFH +<?q=shit> +<images?q=hard> +<?q=nues> +< video porno > +<?q=blondes> +<?q=redheads> +<images?q=pamela+anderson> +<?q=underage+boys> +<?q=lesbo> +<?q=girl+girl> +<?q=girl>,<safe=off>,<images.google.com> +<?q=underage> +<?q=school+girls> +<?q=horney+girls> +#04-15-04 JFH +<images?q=teen>,<safe=off>,<images.google.com> +<images?q=dick>,<safe=off>,<images.google.com> +<images?q=kiddie+porn> +<?q=illigal> +<images?q=frog+sex> +<images?q=car+sex> +<images?q=bed+sex> +<images?q=house+sex> +<images?q=office+sex> +<images?q=carpet+sex> +<images?q=pet+sex> +<images?q=picts+of+sex> +<images?q=picts+of+virgin> +<images?q=picts+of+naked> +#04-22-04 JFH +<images?q=anna+nicole+smith> +<images?q=maxim> +<images?q=delete> +<images?q=south+park> +<images?q=playboy> +<images?q=wet+shirt> +<images?q=wet+tshirt> +<images?q=wet+t+shirt> +<images?q=skinny+dip> +<images?q=flash+me> +<images?q=no+shirt> +<images?q=no+tshirt> +<images?q=no+t+shirt> +<images?q=no+bra> +<images?q=intercourse> +<images?q=drunk+sluts> +<images?q=drunk+girls> +<images?q=drunk+teens> +<images?q=drunk+chix> +<images?q=drunk+chicks> +<images?q=tight+clothes> +<images?q=no+clothes> +#4-26-04 JFH +<images?q=britney+> +<images?q=hot&> +<images?q=anime> +<images?q=adult> +<images?q=free+games> +<images?q=free+picts+of+hot> +<images?q=hoes> +<images?q=obese+women> +<images?q=public+g-strings> +<images?q=pink+thongs> +<images?q=tit&> +<images?q=hairy&> +<images?q=co+ed> +<images?q=coed&> +<images?q=collage&> +<images?q=halle+berry> +#04-27-04 JFH +<images?q=boob> +<images?q=vagina> +#04-28-04 JFH +<images?q=thong> +<images?q=bootie> +<images?q=bobbi+billard> +<images?q=jennifer+gamer> +<images?q=big+bootie> +<images?q=bigbootiehoes> +<images?q=sailor+moon> +<images?q=the+name+jessica> +<images?q=wet+tee+shirt> +#05-03-04 JFH +<images?q=linsey> +<images?q=susan> +<images?q=lisa> +<images?q=nicole> +<images?q=amy> +<images?q=aimee> +<images?q=nikki> +<images?q=molly> +<images?q=sherri> +<images?q=rita> +<images?q=kim> +<images?q=doa> +<images?q=jane> +<images?q=joy> +<images?q=cindy> +<images?q=jenni> +<images?q=jenny> +<images?q=hand+job> +<images?q=handjob> +<images?q=hores> +<images?q=racheal> +<images?q=linda> +<images?q=no+swimsuit> +<images?q=mother>,<safe=off>,<images.google.com> +<images?q=1>,<safe=off>,<images.google.com> +<images?q=2>,<safe=off>,<images.google.com> +<images?q=3>,<safe=off>,<images.google.com> +<images?q=4>,<safe=off>,<images.google.com> +<images?q=5>,<safe=off>,<images.google.com> +<images?q=6>,<safe=off>,<images.google.com> +<images?q=7>,<safe=off>,<images.google.com> +<images?q=8>,<safe=off>,<images.google.com> +<images?q=9>,<safe=off>,<images.google.com> +<images?q=0>,<safe=off>,<images.google.com> + +#05-04-04 JFH +<images?q=foxy> +<images?q=karen> +<images?q=kristina> +<images?q=tina> +<images?q=roberta> +<images?q=amber> +<images?q=ashley> +<images?q=jaden> +<images?q=judit> +<images?q=katie> +<images?q=traci> +<images?q=zara> +<images?q=tori> +<images?q=sara> +<images?q=zara> +<images?q=bikini> +<images?q=wet+t> +<images?q=babes> +<images?q=beach+babes> +#05-06-04 JFH +<images?q=underwear> +<images?q=braless> +<images?q=no+bra> +<images?q=florence> +<images?q=manga> +<images?q=britny> +<images?q=g+string> +#05-07-04 JFH +<images?q=no+boob> +<images?q=facecum> +<images?q=suck> +<images?q=blow> +<images?q=making+> +#05-03-04 JFH +<images?q=+virgins>,<safe=off>,<images.google.com> +<images?q=lightspeed>,<safe=off>,<images.google.com> +<images?q=bad+girls> +<images?q=anna>,<safe=off>,<images.google.com> +<images?q=tites> +<images?q=allison>,<safe=off>,<images.google.com> +<images?q=kitty+porn> +#05-11-04 JFH +<images?q=pam>,<safe=off>,<images.google.com> +<images?q=brittney>,<safe=off>,<images.google.com> +<images?q=horny> +<images?q=whore> +<images?q=shaved+and+wet> +<images?q=shaved+wet> +<images?q=chick>,<safe=off>,<images.google.com> +<images?q=body+piercing>,<safe=off>,<images.google.com> +#05-11-04 JFH +<You must be over the age of 18 view mature content>,<adult > +<not be suitable for younger>,<over 18>,<images> +<images?q=jessica>,<safe=off>,<images.google.com> +<images?q=dirty+ho>,<safe=off>,<images.google.com> +<images?q=butt>,<safe=off>,<images.google.com> +#05-17-04 JFH +<images?q=sue>,<safe=off>,<images.google.com> +<images?q=teen+sex>,<safe=off>,<images.google.com> +<images?q=eva>,<safe=off>,<images.google.com> +<images?q=teen+tits>,<safe=off>,<images.google.com> +<images?q=female+models>,<safe=off>,<images.google.com> +<?q=nice+ass> +<?q=hot+chick> +<images?q=bondage> +<images?q=thin+thongs>,<safe=off>,<images.google.com> +<images?q=see+through>,<safe=off>,<images.google.com> +<images?q=skimpy>,<safe=off>,<images.google.com> +<images?q=hott+girls> +<images?q=hot+girls> +<images?q=hot+babes> +#05-18-04 JFH +<images?q=hott+>,<safe=off>,<images.google.com> +<images?q=felicia+tang>,<safe=off>,<images.google.com> +<images?q=hot+babes>,<safe=off>,<images.google.com> +<images?q=hip+hop+honeys>,<safe=off>,<images.google.com> +<images?q=jane>,<safe=off>,<images.google.com> +<images?q=hot+young>,<safe=off>,<images.google.com> +<images?q=hot+grandma>,<safe=off>,<images.google.com> +<images?q=sbanned+movie>,<safe=off>,<images.google.com> +#05-20-04 JFH +<images?q=hot+fox>,<safe=off>,<images.google.com> +<the family filter has detected adult content> +<images?q=jugs>,<safe=off>,<images.google.com> +<images?q=celbrities+>,<safe=off>,<images.google.com> +<images?q=milf>,<safe=off>,<images.google.com> +<images?q=pleasure>,<safe=off>,<images.google.com> +#05-24-04 JFH +<images?q=fox+girl>,<safe=off>,<images.google.com> +<images?q=fox+sex>,<safe=off>,<images.google.com> +<&p=wet+t> +<&p=girls> +<images?q=swim>,<safe=off>,<images.google.com> +<images?q=jacking>,<safe=off>,<images.google.com> +<images?q=small+nip>,<safe=off>,<images.google.com> +<images?q=large+nip>,<safe=off>,<images.google.com> +<images?q=strip+bar>,<safe=off>,<images.google.com> +<images?q=skinny>,<safe=off>,<images.google.com> +<images?q=horns>,<safe=off>,<images.google.com> +#05-25-04 JFH +<images?q=australian+>,<safe=off>,<images.google.com> +<images?q=uncensored>,<safe=off>,<images.google.com> +<images?q=anderson,+pam> +<images?q=tatas>,<safe=off>,<images.google.com> +<images?q=s-e-x> +<images?q=s-t-r-i-p-e-r> +<images?q=l-e-s-b> +<images?q=stacy+keibler> +#05-26-04 JFH +<images?q=hot+chix>,<safe=off>,<images.google.com> +<images?q=hott+chix>,<safe=off>,<images.google.com> +<images?q=f-e-m-a-l-e>,<safe=off>,<images.google.com> +<images?q=up+the+but>,<safe=off>,<images.google.com> +<images?q=p-o-r-n>,<safe=off>,<images.google.com> +<images?q=p-a-m>,<safe=off>,<images.google.com> +<images?q=fun-in-bed>,<safe=off>,<images.google.com> +<images?q=s-e-e+t>,<safe=off>,<images.google.com> +<images?q=p-a-n-t>,<safe=off>,<images.google.com> +<images?q=panties>,<safe=off>,<images.google.com> +<images?q=short+shorts>,<safe=off>,<images.google.com> +<images?q=drunk>,<safe=off>,<images.google.com> +<images?q=swimsuit>,<safe=off>,<images.google.com> +#05-28-04 JFH +<images?q=haley>,<safe=off>,<images.google.com> +<?q=tiny+teen> +<?q=tiny+butt> +<?q=tiny+boob> +<images?q=hailey>,<safe=off>,<images.google.com> + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/gore/weighted b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/gore/weighted new file mode 100644 index 0000000000000000000000000000000000000000..c9f8a5a697611204543e7ece83aab78028e65b37 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/gore/weighted @@ -0,0 +1,12 @@ +#listcategory: "Gore" + +<brutal>,<mutilation>,<gore><50> +<extremely gory><40> +<festering stinkpile><60> +<garbage house><30> +<gore gallery><60> +<gore>,<make you chuck><40> +<gore>,<make you upchuck><40> +<gore>,<make you vomit><40> +<gory pictures><40> +<pic>,<gore>,<make you queasy><60> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/gore/weighted_portuguese b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/gore/weighted_portuguese new file mode 100644 index 0000000000000000000000000000000000000000..c9d1d6488d5aa41eb18cb4359575c313c07552d8 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/gore/weighted_portuguese @@ -0,0 +1,11 @@ +#listcategory: "Gore (Portuguese)" + +< brutal>,<mutilação>,< sangrent><50> +< muito sangrenta><40> +< imagens sangrentas><60> +< imagem sangrenta><60> +< sangrent>,< vomitar><40> +< imagem>,< sangrent>,< com náusea><60> +< imagens>,< sangrent>,< com náusea><60> +< imagem>,< sangrent>,< enjoado><60> +< imagens>,< sangrent>,< enjoado><60> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/illegaldrugs/banned b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/illegaldrugs/banned new file mode 100644 index 0000000000000000000000000000000000000000..b98470c5824a61969ee92b8f2c969f3eb84bee32 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/illegaldrugs/banned @@ -0,0 +1,5 @@ +#listcategory: "Illegal Drugs" + +<crack cocaine> +< crackhouse> +< crackpipe> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/illegaldrugs/weighted b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/illegaldrugs/weighted new file mode 100644 index 0000000000000000000000000000000000000000..477debd076485e4403124d5ff2c5fe35a282c268 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/illegaldrugs/weighted @@ -0,0 +1,81 @@ +#listcategory: "Illegal Drugs" + +< 2cb ><25> +< alkylnitrat ><25> +< alkyl nitrate ><25> +< amfetamiini ><25> +< amphetamine ><25> +< amylnitrat ><25> +< amyl nitrate ><25> +< amylnitrit ><25> +< amyl nitrite ><25> +< anfetamina ><25> +< blowcaine ><25> +< bong ><25> +< butylnitrat ><25> +< butyl nitrate ><25> +< cannabis ><25> +< cocaine ><25> +< crack house ><25> +< crack pipe ><25> +< crystal meth ><25> +< gamma hydroxybutyrate ><25> +< gamma hydroxybutyric ><25> +< ganga ><25> +< ganja ><25> +< ghb ><25> +< hallucinogen ><25> +< hallucinogenic ><25> +< hallucinogens ><25> +< hallusinogeeni ><25> +< hallusinogeenit ><25> +< halluzinogen ><25> +< halluzinogene ><25> +< hanf ><25> +< hasch ><25> +< hashish ><25> +< heroiini ><25> +< heroin ><25> +< huffing ><25> +< inhalant ><20> +< inhalants ><20> +< jointkippe ><25> +< ketamine ><25> +< kokain ><25> +< koks ><25> +< lsd ><25> +< lysergic acid diethylamide ><25> +< marihuana ><25> +< marijuana ><25> +< methamphetamin ><25> +< methamphetamine ><25> +< methamphetamines ><25> +< methylenedioxyamphetamine ><25> +< methylenedioxyethylamphetamine ><25> +< methylenedioxymethamphetamine ><25> +< morphin ><25> +< morphine ><25> +< narcoti><25> +< narcotic ><25> +< narcotics ><25> +< narkotika ><25> +< opiate ><25> +< opium ><25> +< oppiare ><25> +< oppio ><25> +< pillole ><25> +< pills ><25> +< poppers ><25> +< reefer ><25> +< reefers ><25> +< roach clip ><25> +< rohypnol ><25> +< roofies ><25> +< rophies ><25> +< shrooms ><25> +< soufflette ><25> +< steriod ><25> +< steriods ><25> +< stimulant ><20> +< stimulants ><20> +< stoned ><25> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/illegaldrugs/weighted_portuguese b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/illegaldrugs/weighted_portuguese new file mode 100644 index 0000000000000000000000000000000000000000..220c65d24bb9e9a752c1d7adbad279ee62205a8d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/illegaldrugs/weighted_portuguese @@ -0,0 +1,35 @@ +#listcategory: "Illegal Drugs (Portuguese)" + +< 2cb ><25> +< amfetamiini ><25> +< anfetamina><25> +< bong ><25> +< butilnitrat ><25> +< nitrato de butil ><25> +< nitrato butil><25> +< cannabis ><25> +< cocaína ><25> +< cachimbo de crack ><25> +< cachimbo para crack ><25> +< ganga ><25> +< ganja ><25> +< ghb ><25> +< alucionógen><25> +< alucinogênic><25> +< haxixe><25> +< heroína ><25> +< huffing ><25> +< inalante ><20> +< koka ><25> +< koks ><25> +< lsd ><25> +< ácido lisérgico ><25> +< marihuana ><25> +< marijuana ><25> +< morfina><25> +< narcótico><25> +< ópio ><25> +< pílula><25> +< esteróide><25> +< chapado><25> +< zureta><25> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/intolerance/banned_portuguese b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/intolerance/banned_portuguese new file mode 100644 index 0000000000000000000000000000000000000000..66497f24fed81d84ddfd872ac91416fdf9800d79 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/intolerance/banned_portuguese @@ -0,0 +1,9 @@ +#listcategory: "Intolerance (Portuguese)" + +< honkey > +< supremacia da raça branca> +< superioridade da raça branca> +< supremacia da raça negra> +< superioridade da raça negra> +< supremacia da raça ariana> +< superioridade da raça ariana> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/intolerance/weighted b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/intolerance/weighted new file mode 100644 index 0000000000000000000000000000000000000000..867cb67c843001330e90f19886992f003ac3b051 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/intolerance/weighted @@ -0,0 +1,47 @@ +# +# Intolerance Weighted Phrases +# + +#listcategory: "Intolerance" + +< arabersmovs ><25> +< aryan ><25> +< aryan brotherhood ><25> +< aryan nation ><25> +< aryans ><25> +< bianco ><25> +< bichas ><25> +< black bastard><40> +< bleekscheet ><25> +< bush boogie ><25> +< coon ><25> +< fag ><25> +< fags ><25> +< flikker ><25> +< flikkers ><25> +< gook ><25> +< jigaboo ><25> +< joden ><25> +< kamelvasker ><25> +< ku klux klan ><35> +< neger ><25> +< negersvans ><25> +< negersvin ><25> +< nichten ><25> +< nikker><25> +< raghead ><25> +< spaghettivreters ><25> +< spics ><25> +< spleetoog ><25> +< whitey ><25> +< wigger ><25> +< wops ><25> +< faggot><25> +< honkey ><25> +< nigger ><45> +< niggere ><25> +< sambo ><45> +< spaggar ><45> +<white supremacy><25> +<black supremacy><25> + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/intolerance/weighted_portuguese b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/intolerance/weighted_portuguese new file mode 100644 index 0000000000000000000000000000000000000000..8d6bc2645052cd3ba6af9f38b952423676456472 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/intolerance/weighted_portuguese @@ -0,0 +1,20 @@ +#listcategory: "Intolerance (Portuguese)" + +< arian><25> +< irmandade ariana><25> +< irmandades arianas><25> +< nação ariana ><25> +< nações arianas><25> +< branquelo ><25> +< bichas ><25> +< preto desgraçado><40> +< preta desgraçada><40> +< pretinho desgraçado><40> +< pretinha desgraçada><40> +< negro desgraçado><40> +< negra desgraçada><40> +< negrinho desgraçado><40> +< negrinha desgraçada><40> +< viado ><25> +< viadinho><25> + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/legaldrugs/weighted b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/legaldrugs/weighted new file mode 100644 index 0000000000000000000000000000000000000000..5a7f0645ea2a32c03e14656f3dcd02fb9f8b16b8 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/legaldrugs/weighted @@ -0,0 +1,42 @@ +#listcategory: "Legal Drugs" + +< alcohol ><25> +< alcoholic ><25> +< alcohol still ><25> +< alkoholi ><25> +< alkoholismi ><25> +< alkoholisti ><25> +< bartender ><25> +< bartenders ><25> +< beer ><25> +< binge drinking ><25> +< bourbon ><25> +< breweries ><25> +< brewery ><25> +< chewing tobacco ><25> +< cigarettes ><25> +< cigars ><25> +< congnac ><25> +< drinking game ><25> +< drinking games ><25> +< humidor ><25> +< humidors ><25> +< jello shooter ><25> +< jello shooters ><25> +< keg ><25> +< kegs ><25> +< liquor ><25> +< malt liquor ><25> +< micro brew ><25> +< microbrew ><25> +< micro brewery ><25> +< microbrewery ><25> +< mixed drinks ><25> +< pipe tobacco ><25> +< smokeless tobacco ><25> +< tequila ><25> +< vodka ><25> +< whiskey ><25> +< wineries ><25> +< winery ><25> + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/malware/weighted b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/malware/weighted new file mode 100644 index 0000000000000000000000000000000000000000..d8cb8bfc7cfa791f38fa929a7c82e4d50fb5198e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/malware/weighted @@ -0,0 +1,107 @@ +# +# Phraselists to block malware (trojan, virus, spyware) and rogue anti-spyware websites +# See http://www.spywarewarrior.com/ for more information +# Originally created by Fernand Jonker +# +# If you use this list please send feedback to phrasemaster@dansguardian.org +# Waiting for input :-) +# + +#listcategory: "Malware" + +<regwrite>,<wsh><100> +<exhotbar><100> +<hotbar><20> +<windows>,<currentversion>,<run><100> +<search bar><30> +<precisiontime><100> +<gmt.exe><100> +<cmesys.exe><100> + +< spyware ><20> +< adware ><20> +< malware ><20> +< keylogger><20> +<your computer is infected><20> +<your pc is infected><20> + +< alertspy ><20> +< armorwall ><20> +< botsquash ><20> +< checkspy ><20> +< consumeridentity ><20> +< spybouncer ><20> +< microantivirus ><20> +< purityscan ><20> +< puritysweep ><20> +< adprotector ><20> +< spyblast ><20> +< ucontrol ><20> +< ultimate cleaner ><20> +< vbouncer ><20> +< addestroyer ><20> +< whenu ><20> +< gator >,<wallet><30> +<alligator><-50> +< crocodil><-20> +< claria ><20> +<spytrooper><40> +<Malware Wipe><20> +<spy axe><40> +<spy trooper><40> + +< coldlife ><20> +< decss ><20> +< fport ><20> +< john the ripper ><20> +< pchelps network tracer ><20> +< tcpip protector pro ><20> +< intellitamper ><20> + +< global killer ><20> +< artic ><20> +< kikbak ><20> +< winspy ><20> +< b-s spy ><20> +< netslayer ><20> +< comload ><20> + +< ezula ><20> +< cydoor ><20> +< casinoonnet ><20> +< midaddle ><20> +< bargainbuddy ><20> + +< mwsoemon><20> +< mywebsearch ><20> +< windupdates ><20> +< mediaaccess.exe ><20> +< mediaacck.exe ><20> +< istsvc.exe ><20> +< wtoolsa.exe ><20> +< wtoolss.exe ><20> +< apropos ><20> +< save.exe ><20> +< bargains.exe ><20> +< salm.exe ><20> +< 180search ><20> +< weathercast ><20> +< topicks ><20> +< gamespy arcade ><20> + +######################################## +#Fake security sites / Security Hijack Sites +######################################## + +<your system is vulnerable to hackers' attacks><100> +<your private information is in open access to other computers><100> +<the page you are looking for is blocked by the adware><100> +<attention! your system is currently exposed><100> +<your pc is infected with spyware><100> +<get list of available antispyware products><100> +<spyware detected><30> + + + + + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/meta/weighted b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/meta/weighted new file mode 100644 index 0000000000000000000000000000000000000000..48a39a43cc345a069bac8eaccfd8257dd4df54ae --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/meta/weighted @@ -0,0 +1,19436 @@ +< 2 days http ><-17> +< cyrealis name ><-16> +< cyrealis ><-16> +< creator content cyrealis ><-16> +< content cyrealis name ><-16> +< cyrealis name dc ><-16> +< content cyrealis ><-16> +< officiel de ><-15> +< actualite informatique ><-14> +< sante ><-14> +< actualite informatique news ><-14> +< exclusivite name ><-14> +< exclusivite name dc ><-14> +< keywords content actualite ><-14> +< informatique news ><-14> +< content actualite informatique ><-14> +< info exclusivite name ><-14> +< news info exclusivite ><-14> +< info exclusivite ><-14> +< informatique news info ><-14> +< 0 gen true ><-14> +< l 0 gen ><-14> +< 0 gen ><-14> +< site officiel de ><-14> +< vz 1 gen ><-13> +< parents ><-13> +< records ><-13> +< iso 8859 15 ><-13> +< yahoo com r ><-13> +< l r cz ><-13> +< for yahoo com ><-13> +< dossiers ><-13> +< 8859 15 ><-13> +< 1 gen ><-13> +< 1 gen true ><-13> +< grossesse ><-12> +< dans les ><-12> +< station ><-12> +< de produits ><-12> +< name dc format ><-12> +< dc format ><-12> +< droit ><-12> +< materiel ><-12> +< parc ><-12> +< enseignement ><-12> +< soccer ><-12> +< days name audience ><-12> +< tricot ><-12> +< content actualite ><-12> +< cz 1 lz ><-12> +< tourisme ><-11> +< sur la ><-11> +< nz 1 oz ><-11> +< dc format content ><-11> +< news info ><-11> +< lz 1 nz ><-11> +< elevage ><-11> +< domein ><-11> +< nationale ><-11> +< officiel de la ><-11> +< limited ><-11> +< produits et ><-11> +< site sur ><-11> +< reflexion ><-11> +< hp ><-11> +< enfants ><-11> +< voiture ><-11> +< psychologie ><-11> +< gastronomie ><-11> +< 0 yahoo! ><-11> +< the 2learn ><-11> +< 1 vr ><-11> +< 2learn ca ><-11> +< nf name description ><-11> +< de produits et ><-11> +< the 2learn ca ><-11> +< vr 1 ><-11> +< to the 2learn ><-11> +< au name ><-11> +< nouvel ><-11> +< nf name ><-11> +< 2learn ><-11> +< ca portal ><-11> +< diddl ><-11> +< 1 vr 1 ><-11> +< 2learn ca portal ><-11> +< la marque ><-11> +< l 0 yahoo! ><-11> +< bateau ><-11> +< la marque nf ><-11> +< marque nf ><-11> +< de la marque ><-11> +< le site officiel ><-11> +< dc date ><-11> +< name dc date ><-11> +< automobile ><-11> +< mp3 musique ><-11> +< encheres ><-11> +< asp ><-11> +< equipe ><-11> +< daniel ><-10> +< pull ><-10> +< modellenbureau ><-10> +< content 2000 ><-10> +< internet services ><-10> +< com au ><-10> +< route ><-10> +< monde du ><-10> +< de vacances ><-10> +< 8859 15 name ><-10> +< toute l ><-10> +< des informations ><-10> +< trends ><-10> +< consulter les ><-10> +< de services ><-10> +< ce qui ><-10> +< des entreprises ><-10> +< auto moto ><-10> +< robin ><-10> +< debat ><-10> +< industrie ><-10> +< matrix ><-10> +< et sur ><-10> +< auteurs ><-10> +< solidarite ><-10> +< standard ><-10> +< et de services ><-10> +< obtenir ><-10> +< renault ><-10> +< imaging ><-10> +< location de ><-10> +< jazz ><-10> +< listes de ><-10> +< sciences ><-10> +< decoration ><-10> +< maisons ><-10> +< address ><-10> +< cuisine ><-10> +< yahoo com ><-10> +< coupe ><-10> +< informations ><-10> +< denied ><-10> +< education ><-10> +< dos ><-10> +< comment obtenir ><-10> +< au name copyright ><-10> +< defense ><-10> +< la ville ><-10> +< nf et ><-10> +< ringtone ><-10> +< manufacturer ><-10> +< produits et de ><-10> +< clubic name robots ><-10> +< stephane ><-10> +< discographie ><-10> +< nf consulter ><-10> +< content rechercher ><-10> +< obtenir la ><-10> +< sur clubic name ><-10> +< coloriage ><-10> +< certifies ><-10> +< low ><-10> +< description content rechercher ><-10> +< rechercher une marque ><-10> +< entreprises titulaires comment ><-10> +< autour de ><-10> +< copyright content 2000 ><-10> +< enfance ><-10> +< content ni ><-10> +< lyric ><-10> +< historique ><-10> +< musical ><-10> +< trade ><-10> +< league ><-10> +< des entreprises titulaires ><-10> +< inde ><-10> +< 2005 girl ><-10> +< clubic name dc ><-10> +< havre name ><-10> +< charmed ><-10> +< video jeux ><-10> +< strategie ><-10> +< dc date created ><-10> +< de mon ><-10> +< by com ><-10> +< transport ><-10> +< content charset gb2312 ><-10> +< titulaires comment ><-10> +< laine ><-10> +< nf consulter les ><-10> +< bac ><-10> +< marque nf name ><-10> +< certifies nf ><-10> +< drama ><-10> +< entreprises titulaires ><-10> +< down ><-10> +< hiphop ><-10> +< vk 1 vr ><-10> +< keywords content rechercher ><-10> +< et des entreprises ><-10> +< handicap ><-10> +< copyright 1997 2005 ><-10> +< problems ><-10> +< charset gb2312 ><-10> +< parent ><-10> +< 91 ><-10> +< une marque nf ><-10> +< tricoter ><-10> +< debats ><-10> +< honda ><-10> +< content org ><-10> +< market ><-10> +< ancien ><-10> +< clubic name ><-10> +< tradition ><-10> +< prenoms ><-10> +< de son ><-10> +< copyright 1997 ><-10> +< oeuvres ><-10> +< content noindex follow ><-10> +< porsche ><-10> +< administration ><-10> +< e sante ><-10> +< date created content ><-10> +< fois ><-10> +< copyright content english ><-10> +< explications ><-10> +< pieces ><-10> +< content rechercher une ><-10> +< brother ><-10> +< nf et des ><-10> +< depression ><-10> +< certifies nf et ><-10> +< guadeloupe ><-10> +< wars ><-10> +< tele television ><-10> +< les listes de ><-10> +< titulaires comment obtenir ><-10> +< bricolage ><-10> +< com au name ><-10> +< comment obtenir la ><-10> +< conditions ><-10> +< et services ><-10> +< flash games ><-10> +< clubic name keywords ><-10> +< noord ><-10> +< 1 yahoo! ><-10> +< listes de produits ><-10> +< services certifies nf ><-10> +< 1997 2005 girl ><-10> +< girl com au ><-10> +< titulaires ><-10> +< 2005 girl com ><-10> +< presente ><-10> +< content test ><-10> +< 1997 2005 ><-10> +< robots content copyright ><-10> +< obtenir la marque ><-10> +< jeu video ><-10> +< guitar ><-10> +< pour l ><-10> +< clubic ><-10> +< consulter les listes ><-10> +< rechercher une ><-10> +< outil ><-10> +< description content top ><-10> +< metro ><-10> +< de services certifies ><-10> +< content copyright 1997 ><-10> +< marque nf consulter ><-10> +< gb2312 ><-10> +< darkness ><-10> +< sur clubic ><-10> +< la sante ><-10> +< services certifies ><-10> +< les listes ><-10> +< format content ><-10> +< 1 nz 1 ><-10> +< mer ><-10> +< 1 nz ><-10> +< dc creator content ><-10> +< dc creator ><-10> +< name dc creator ><-10> +< name dc publisher ><-10> +< dc publisher ><-10> +< dansguardian access ><-10> +< 1997 ><-10> +< dansguardian access denied ><-10> +< avion ><-10> +< equipement ><-10> +< sncf ><-10> +< dansguardian ><-10> +< bebe ><-10> +< webhosting ><-10> +< name dc coverage ><-10> +< louis ><-10> +< dc coverage ><-10> +< access denied ><-10> +< peinture ><-10> +< yahoo! ><-10> +< officiel ><-9> +< format content name ><-9> +< dc publisher content ><-9> +< fr name dc ><-9> +< site officiel ><-9> +< jan ><-9> +< 1 cb 1 ><-9> +< 1 cb ><-9> +< immobilier informatique ><-9> +< motor ><-9> +< recherche referencement ><-9> +< fnac ><-9> +< occasion ><-9> +< entreprises ><-9> +< religion ><-9> +< informatique internet ><-9> +< prints ><-9> +< quotidien ><-9> +< servers ><-9> +< firewall ><-9> +< title content caf ><-9> +< content test article ><-9> +< flower ><-9> +< foros ><-9> +< robes de ><-9> +< maillot de bain ><-9> +< bi ru ><-9> +< mystery ><-9> +< matelas ><-9> +< noord holland ><-9> +< graffiti ><-9> +< been ><-9> +< actante com ><-9> +< official web ><-9> +< marque nf le ><-9> +< web2d ><-9> +< author content actante ><-9> +< 2000 2002 ><-9> +< et de la ><-9> +< lutte ><-9> +< universite ><-9> +< cactus ><-9> +< club alpin ><-9> +< le havre name ><-9> +< athletes ><-9> +< maillot de ><-9> +< reduction ><-9> +< horoscopes ><-9> +< article preview ><-9> +< iedereen ><-9> +< peintures ><-9> +< actante ><-9> +< nf le ><-9> +< content get ><-9> +< le monde du ><-9> +< 2005 http equiv ><-9> +< club alpin name ><-9> +< posters prints ><-9> +< havre name dc ><-9> +< ni bi ru ><-9> +< rocket ><-9> +< western ><-9> +< keywords content ni ><-9> +< content caf ><-9> +< vogue ><-9> +< bonnes affaires ><-9> +< pop3 ><-9> +< 8 name author ><-9> +< test article preview ><-9> +< 1 snelstarter ><-9> +< hiver ><-9> +< centre de ><-9> +< web2d com name ><-9> +< enfant enfants ><-9> +< naissance ><-9> +< domein domeinnaam ><-9> +< ni bi ><-9> +< informations sur ><-9> +< patrimoine ><-9> +< big brother ><-9> +< test article ><-9> +< accessoire ><-9> +< evolution ><-9> +< volontaire ><-9> +< ligue ><-9> +< de la ville ><-9> +< activites ><-9> +< travel and ><-9> +< universal ><-9> +< des dossiers ><-9> +< content actante com ><-9> +< vehicules ><-9> +< keywords content blague ><-9> +< content caf le ><-9> +< content site pour ><-9> +< velo ><-9> +< lits ><-9> +< content actante ><-9> +< grece ><-9> +< centres ><-9> +< medecine ><-9> +< l academie ><-9> +< disques ><-9> +< instructional ><-9> +< retraite ><-9> +< 2005 http ><-9> +< caf le ><-9> +< nf le site ><-9> +< preview review ><-9> +< bruce ><-9> +< 8859 1 snelstarter ><-9> +< panda ><-9> +< snelstarter ><-9> +< ultrasound ><-9> +< problemes ><-9> +< hebergements ><-9> +< la mer ><-9> +< couverture ><-9> +< sidn ><-9> +< rubriques ><-9> +< ontwerpen ><-9> +< une association ><-9> +< alpin ><-9> +< 8859 1 caf ><-9> +< actante com web2d ><-9> +< accouchement ><-9> +< you need ><-9> +< suzuki ><-9> +< francophone name ><-9> +< chili ><-9> +< chute ><-9> +< reportages ><-9> +< ecrivain ><-9> +< cv ><-9> +< de leurs ><-9> +< games and ><-9> +< vh 1 vk ><-9> +< pour les femmes ><-9> +< com web2d com ><-9> +< forum board ><-9> +< mkb ><-9> +< web2d com ><-9> +< content org name ><-9> +< montagne ><-9> +< crochet ><-9> +< webmail ><-9> +< ontwerp ><-9> +< content club alpin ><-9> +< content internet services ><-9> +< caf le havre ><-9> +< scolaire ><-9> +< com web2d ><-9> +< echographie ><-9> +< all name dc ><-9> +< troc ><-9> +< learning ><-9> +< analysis ><-9> +< star wars ><-9> +< 1 caf le ><-9> +< cite ><-9> +< lop ><-9> +< tool ><-9> +< bosch ><-9> +< futbol ><-9> +< caf ><-9> +< keywords content cinema ><-9> +< yourself ><-9> +< com votre ><-9> +< details ><-9> +< article preview review ><-9> +< electric ><-9> +< d occasion ><-9> +< de bain ><-9> +< gynecologie ><-9> +< gezondheid ><-9> +< tricots ><-9> +< nouvel an ><-9> +< keywords content test ><-9> +< foot football ><-9> +< description content ni ><-9> +< 1 caf ><-9> +< alpin name ><-9> +< table ><-9> +< com name content ><-9> +< 8859 15 http ><-9> +< denis ><-9> +< alpin name revisit ><-9> +< traitement ><-9> +< 95 ><-9> +< service provider ><-9> +< vacances ><-9> +< history ><-9> +< loi ><-9> +< format ><-9> +< cours creation ><-9> +< content text ><-9> +< ecole ecran emploi ><-9> +< pierre plan porno ><-9> +< encheres equipe equipement ><-9> +< gay gestion ><-9> +< box ><-9> +< equipe equipement ><-9> +< magie ><-9> +< francais gratuit ><-9> +< photos pierre plan ><-9> +< monde moteur ><-9> +< cours creation cuisine ><-9> +< emploi encheres ><-9> +< photos pierre ><-9> +< vente video ><-9> +< subject content name ><-9> +< drogue ><-9> +< formation francais france ><-9> +< creation cuisine ><-9> +< itineraire ><-9> +< webcam www ><-9> +< vacances vente ><-9> +< law ><-9> +< web webcam www ><-9> +< livre location ><-9> +< ms ><-9> +< ile images ><-9> +< formation francais ><-9> +< perso photos ><-9> +< ecole ecran ><-9> +< 30 name dc ><-9> +< images immobilier ><-9> +< pierre plan ><-9> +< date content 2002 ><-9> +< emploi encheres equipe ><-9> +< sexe site ski ><-9> +< ile images immobilier ><-9> +< site ski ><-9> +< celebrite centre ><-9> +< france gay ><-9> +< stars telecharger ><-9> +< encheres equipe ><-9> +< coupe cours creation ><-9> +< paris perso photos ><-9> +< perso photos pierre ><-9> +< plan porno ><-9> +< marques ><-9> +< top tourisme ><-9> +< location logiciel loi ><-9> +< images immobilier informatique ><-9> +< club code ><-9> +< ecran emploi ><-9> +< paris perso ><-9> +< ecran emploi encheres ><-9> +< immobilier informatique internet ><-9> +< logiciel loi ><-9> +< jeu journal ><-9> +< 2002 name identifier ><-9> +< v5 0 name ><-9> +< concours conseil ><-9> +< location logiciel ><-9> +< vr ><-9> +< histoire homme ><-9> +< web webcam ><-9> +< livre location logiciel ><-9> +< coupe cours ><-9> +< exclusivite ><-9> +< immobilier ><-9> +< golf ><-9> +< dc relation ><-9> +< true for yahoo ><-9> +< name dc relation ><-9> +< paroles ><-9> +< for yahoo ><-9> +< sur l ><-9> +< webdesign ><-9> +< ecole ><-9> +< name dc type ><-9> +< dc type ><-9> +< actualite ><-8> +< football ><-8> +< to content org ><-8> +< psycho ><-8> +< animaux animal ><-8> +< manche ><-8> +< 1901 ><-8> +< guitare ><-8> +< solaris ><-8> +< des passionnes ><-8> +< weer ><-8> +< web html exporter ><-8> +< elf ><-8> +< copywritten work name ><-8> +< les forums ><-8> +< renaissance ><-8> +< hosting webhosting ><-8> +< mannen vrouwen ><-8> +< 1 seiko ><-8> +< technologie ><-8> +< obesite ><-8> +< jardins ><-8> +< mp3 free ><-8> +< web du ><-8> +< blocking ><-8> +< brugge ><-8> +< michael jackson ><-8> +< turkey ><-8> +< musicale ><-8> +< wind ><-8> +< oz 1 cb ><-8> +< mp3 http ><-8> +< hart ><-8> +< carriere ><-8> +< de mode ><-8> +< quizz ><-8> +< locales ><-8> +< content 300 ><-8> +< imagerie medicale ><-8> +< revision content ><-8> +< collective ><-8> +< for teens ><-8> +< photo numerique ><-8> +< uni ><-8> +< alimentaire ><-8> +< tissus ><-8> +< portes ><-8> +< du sein ><-8> +< le cinema ><-8> +< keywords content cd ><-8> +< domeinregistratie ><-8> +< amis d ><-8> +< of the world ><-8> +< surface ><-8> +< hommage ><-8> +< dc contributors content ><-8> +< holmes ><-8> +< baseball ><-8> +< surveillance ><-8> +< zine ><-8> +< online de ><-8> +< searches ><-8> +< tapis ><-8> +< op deze ><-8> +< franchise ><-8> +< tutoriaux ><-8> +< popular ><-8> +< e sante fr ><-8> +< d enfant ><-8> +< chirurgie ><-8> +< accessoires de ><-8> +< language scheme nisoz39 ><-8> +< lens ><-8> +< 8859 1 les ><-8> +< budget ><-8> +< 2002 2004 ><-8> +< gratis mp3 ><-8> +< musique name ><-8> +< realisateurs ><-8> +< createur ><-8> +< les deux ><-8> +< e zine ><-8> +< yarn ><-8> +< dans l espace ><-8> +< corporatename address content ><-8> +< campagne ><-8> +< server by com ><-8> +< orientation ><-8> +< un site sur ><-8> +< broderie ><-8> +< flash flash ><-8> +< club des ><-8> +< privacy ><-8> +< les textes ><-8> +< e tf1 name ><-8> +< championnat ><-8> +< nisoz39 ><-8> +< parcs ><-8> +< walt disney ><-8> +< solar ><-8> +< amenagement ><-8> +< counter strike ><-8> +< scheme nisoz39 ><-8> +< review of ><-8> +< gratuits pour ><-8> +< du groupe ><-8> +< creation et ><-8> +< proche ><-8> +< horoscope chinois ><-8> +< personnalise ><-8> +< aix ><-8> +< ru name keywords ><-8> +< de catalogue ><-8> +< cosmetique ><-8> +< en passant par ><-8> +< webpage ><-8> +< automotive ><-8> +< pour femmes et ><-8> +< 8859 1 seiko ><-8> +< ringtone ringtones ><-8> +< dc contributors ><-8> +< medecine sante ><-8> +< description content mp3 ><-8> +< presley ><-8> +< spirou ><-8> +< labrador ><-8> +< prime ><-8> +< placename content france ><-8> +< web html ><-8> +< waar ><-8> +< author content herve ><-8> +< de notre ><-8> +< ac ><-8> +< photo name dc ><-8> +< bureautique ><-8> +< registreren ><-8> +< cancer du ><-8> +< entre particuliers ><-8> +< without ><-8> +< volley ><-8> +< texto ><-8> +< examen ><-8> +< scheme nisoz39 50 ><-8> +< corporate content e ><-8> +< magnetique ><-8> +< square ><-8> +< passionnes de ><-8> +< analyse ><-8> +< locale ><-8> +< pyramide ><-8> +< communautaire ><-8> +< chalet ><-8> +< hop dance ><-8> +< refresh content 300 ><-8> +< point de croix ><-8> +< matt ><-8> +< systemes ><-8> +< radiology ><-8> +< projet ><-8> +< haber ><-8> +< de robes de ><-8> +< canciones ><-8> +< tutorials ><-8> +< kawasaki ><-8> +< de l ecriture ><-8> +< etudes ><-8> +< u2 ><-8> +< students ><-8> +< mp3 http equiv ><-8> +< cz 1 gen ><-8> +< days name owner ><-8> +< bicycle ><-8> +< mort ><-8> +< recipe ><-8> +< bible ><-8> +< reparation ><-8> +< tables ><-8> +< text name dc ><-8> +< music songs ><-8> +< d ailleurs ><-8> +< texture ><-8> +< actuelles ><-8> +< des de ><-8> +< de robes ><-8> +< cultures ><-8> +< demande de catalogue ><-8> +< professionnels et ><-8> +< kid ><-8> +< sites des ><-8> +< chaton ><-8> +< passant par ><-8> +< content tb default ><-8> +< corporatename content ><-8> +< en passant ><-8> +< r 1 ><-8> +< du name ><-8> +< content design ><-8> +< pelote ><-8> +< profiles ><-8> +< 0 name date ><-8> +< d echange ><-8> +< exporter 2 ><-8> +< revue de ><-8> +< dear ><-8> +< airline ><-8> +< en el ><-8> +< lan ><-8> +< modellenburo ><-8> +< shell ><-8> +< counters ><-8> +< m name ><-8> +< name dc contributors ><-8> +< nature pictures ><-8> +< digital photography ><-8> +< maison de ><-8> +< pour enfants ><-8> +< musique cinema ><-8> +< and their ><-8> +< america server by ><-8> +< council ><-8> +< apache ><-8> +< ho ><-8> +< programmes de ><-8> +< de prix ><-8> +< hip hop dance ><-8> +< 1 0 http ><-8> +< de cheveux ><-8> +< maternite ><-8> +< internet service ><-8> +< bouton ><-8> +< domein registratie ><-8> +< a entre ><-8> +< voyage voyages ><-8> +< outline ><-8> +< tous droits name ><-8> +< bouwen ><-8> +< glandes ><-8> +< zakelijk ><-8> +< ados ><-8> +< perles ><-8> +< episodes ><-8> +< onderhoud ><-8> +< archeologie ><-8> +< inde name ><-8> +< to know ><-8> +< portable portables ><-8> +< journaux ><-8> +< je ne ><-8> +< content christophe ><-8> +< drive ><-8> +< radiologie radiology ><-8> +< content mode ><-8> +< voetbal ><-8> +< lombard ><-8> +< model agency ><-8> +< equitation ><-8> +< tf1 name content ><-8> +< combat ><-8> +< et de l ><-8> +< istanbul ><-8> +< corporatename ><-8> +< piece ><-8> +< den bosch ><-8> +< annoncer ><-8> +< de vue ><-8> +< radiologie ><-8> +< safari ><-8> +< limited edition ><-8> +< joueur ><-8> +< wool ><-8> +< et ne ><-8> +< wildlife ><-8> +< nisoz39 50 content ><-8> +< nature photography ><-8> +< name outline ><-8> +< sheet ><-8> +< versailles ><-8> +< reggae ><-8> +< bungalow ><-8> +< prints and ><-8> +< composes ><-8> +< italie ><-8> +< actions ><-8> +< propre ><-8> +< step ><-8> +< design web ><-8> +< classical ><-8> +< location maison ><-8> +< in de ><-8> +< train ><-8> +< luminaires ><-8> +< 50 content ><-8> +< informations et ><-8> +< traditions ><-8> +< seiko ><-8> +< documents ><-8> +< content women ><-8> +< parenting ><-8> +< sportif ><-8> +< content michael ><-8> +< le blog ><-8> +< sur mer ><-8> +< in rete ><-8> +< logement ><-8> +< bier ><-8> +< communicatie ><-8> +< sociale ><-8> +< content cheval ><-8> +< server by ><-8> +< site http equiv ><-8> +< photography nature ><-8> +< sport sports ><-8> +< leading ><-8> +< internet services name ><-8> +< move ><-8> +< content name resource ><-8> +< alan ><-8> +< com has ><-8> +< afrique du ><-8> +< address content ><-8> +< hostbedrijven ><-8> +< essonne ><-8> +< generale ><-8> +< politika ><-8> +< content tf1 ><-8> +< keywords content gifs ><-8> +< annonces name keywords ><-8> +< content gifs ><-8> +< detection ><-8> +< marrakech ><-8> +< translation ><-8> +< entrez ><-8> +< didier ><-8> +< forum tchat ><-8> +< true name robots ><-8> +< 2001 2002 ><-8> +< droit de ><-8> +< publics ><-8> +< corporatename address ><-8> +< cigarette ><-8> +< petite enfance ><-8> +< nanterre ><-8> +< content societe ><-8> +< 8859 1 yahoo! ><-8> +< 1 les ><-8> +< rythme ><-8> +< i name description ><-8> +< content e tf1 ><-8> +< photographe de ><-8> +< site http ><-8> +< break dance ><-8> +< history of ><-8> +< utrecht ><-8> +< tarifs ><-8> +< official web site ><-8> +< l du ><-8> +< snel en ><-8> +< veritable ><-8> +< de croix ><-8> +< wave ><-8> +< weaver ><-8> +< organismes ><-8> +< using ><-8> +< de l academie ><-8> +< sante fr ><-8> +< cancer du sein ><-8> +< passant ><-8> +< montres ><-8> +< anges ><-8> +< sos ><-8> +< html exporter 2 ><-8> +< monitoring ><-8> +< o m ><-8> +< sa vie ><-8> +< name outline content ><-8> +< des meilleures ><-8> +< ventilation ><-8> +< neuf ><-8> +< university of ><-8> +< chemise ><-8> +< martinique guadeloupe ><-8> +< les jeux ><-8> +< archiv ><-8> +< goedkope ><-8> +< testament ><-8> +< model modellen ><-8> +< walt ><-8> +< exploitation ><-8> +< lop com ><-8> +< knitting ><-8> +< keywords content cheval ><-8> +< polar ><-8> +< 07 name ><-8> +< elvis ><-8> +< associatif ><-8> +< tb default ><-8> +< gratuitos ><-8> +< vr 1 lz ><-8> +< heroic ><-8> +< outline content ><-8> +< biedt ><-8> +< users ><-8> +< maggie ><-8> +< innovation ><-8> +< le de ><-8> +< dirt ><-8> +< nisoz39 50 ><-8> +< sarl ><-8> +< le magazine ><-8> +< vr 1 lc ><-8> +< l espace ><-8> +< recherche amis ><-8> +< consoles ><-8> +< fonds ecran ><-8> +< hard discount ><-8> +< e tf1 ><-8> +< fille prenoms ><-8> +< full service ><-8> +< pret ><-8> +< contributor ><-8> +< rencontres restaurant ><-8> +< cuisine droit ecole ><-8> +< content tysami le ><-8> +< emploi voyage ><-8> +< photos mp3 informatique ><-8> +< code commerce ><-8> +< site ski sms ><-8> +< gratuit sonneries ><-8> +< voiture voyage web ><-8> +< tysami web links ><-8> +< tourisme vacances ><-8> +< carte cd ><-8> +< soleil ><-8> +< content annonce anpe ><-8> +< tennis tf1 top ><-8> +< logiciel loi loto ><-8> +< point de ><-8> +< casino rencontre shopping ><-8> +< avion billet bourse ><-8> +< offres pages paris ><-8> +< links tysami com ><-8> +< restaurant saint ><-8> +< voyage web ><-8> +< la vente ><-8> +< generator content tysami ><-8> +< jeux sms casino ><-8> +< com tysami ><-8> +< type content text ><-8> +< saint sex ><-8> +< casino rencontre ><-8> +< prevoyance ><-8> +< itineraire jeu journal ><-8> +< tennis tf1 ><-8> +< le site du ><-8> +< celebrite centre chat ><-8> +< commerce concours conseil ><-8> +< annonce anpe ><-8> +< voyage sexe ><-8> +< homme horoscope ><-8> +< lettre lingerie ><-8> +< musique offres ><-8> +< fnac fond ><-8> +< ski sms ><-8> +< concert ><-8> +< voeux voiture ><-8> +< yahoo tysami ><-8> +< google gratuit histoire ><-8> +< prevoyance produit ><-8> +< offres pages ><-8> +< caramail carte cd ><-8> +< tysami name description ><-8> +< bourse business caramail ><-8> +< links tysami ><-8> +< sms casino ><-8> +< prevoyance produit recherche ><-8> +< meteo monde moteur ><-8> +< mp3 musique offres ><-8> +< fond football ><-8> +< rencontres restaurant saint ><-8> +< annonce anpe argus ><-8> +< mp3 informatique ><-8> +< automobile avion billet ><-8> +< moteur moto ><-8> +< loi loto maison ><-8> +< tysami moteur ><-8> +< google gratuit ><-8> +< humour ile ><-8> +< dc coverage placename ><-8> +< logos jeux sms ><-8> +< lingerie livre location ><-8> +< shopping photos mp3 ><-8> +< produit recherche referencement ><-8> +< pornographie prevoyance produit ><-8> +< telecharger telephone ><-8> +< registratie ><-8> +< webcam name abstract ><-8> +< jeu journal lettre ><-8> +< cuisine droit ><-8> +< ski sms sncf ><-8> +< internet itineraire ><-8> +< girl com ><-8> +< chevaux ><-8> +< security ><-8> +< tout pour ><-8> +< www xxx ><-8> +< manga materiel meteo ><-8> +< billet bourse ><-8> +< critiques ><-8> +< materiel meteo monde ><-8> +< loto maison ><-8> +< star stars telecharger ><-8> +< coverage placename ><-8> +< com tysami annuaire ><-8> +< business caramail ><-8> +< xxx yahoo tysami ><-8> +< gay gestion google ><-8> +< moto mp3 ><-8> +< journal lettre ><-8> +< centre chat cinema ><-8> +< equipement euro ><-8> +< code commerce concours ><-8> +< france gay gestion ><-8> +< caramail carte ><-8> +< www xxx yahoo ><-8> +< top tourisme vacances ><-8> +< finance ><-8> +< hotel humour ile ><-8> +< francais france gay ><-8> +< cinema club code ><-8> +< chat cinema ><-8> +< video voeux ><-8> +< anpe argus art ><-8> +< audience content general ><-8> +< minute ><-8> +< editions ><-8> +< sonneries logos jeux ><-8> +< eric ><-8> +< euro femmes ><-8> +< mp3 informatique emploi ><-8> +< football formation ><-8> +< telephone tennis ><-8> +< pornographie prevoyance ><-8> +< tysami annuaire francais ><-8> +< le guide name ><-8> +< coverage placename content ><-8> +< horoscope hotel humour ><-8> +< loto maison manga ><-8> +< annuaire francais gratuit ><-8> +< vente video voeux ><-8> +< equipe equipement euro ><-8> +< business caramail carte ><-8> +< sncf stage star ><-8> +< anpe argus ><-8> +< seine ><-8> +< produit recherche ><-8> +< tysami le guide ><-8> +< gestion google gratuit ><-8> +< humour ile images ><-8> +< web links tysami ><-8> +< tysami le ><-8> +< avion billet ><-8> +< moteur moto mp3 ><-8> +< carte cd celebrite ><-8> +< tf1 top tourisme ><-8> +< musique offres pages ><-8> +< l association ><-8> +< tourisme vacances vente ><-8> +< jardin ><-8> +< journal lettre lingerie ><-8> +< maritime ><-8> +< football formation francais ><-8> +< by tysami le ><-8> +< conseil coupe cours ><-8> +< emploi voyage sexe ><-8> +< tysami annuaire ><-8> +< homme horoscope hotel ><-8> +< tysami com tysami ><-8> +< porno pornographie prevoyance ><-8> +< lettre lingerie livre ><-8> +< pages paris perso ><-8> +< description content tysami ><-8> +< manga materiel ><-8> +< equipement euro femmes ><-8> +< materiel meteo ><-8> +< club code commerce ><-8> +< itineraire jeu ><-8> +< femmes fille fnac ><-8> +< stage star ><-8> +< moto mp3 musique ><-8> +< cd celebrite centre ><-8> +< telecharger telephone tennis ><-8> +< internet itineraire jeu ><-8> +< guide name keywords ><-8> +< content association ><-8> +< shopping photos ><-8> +< stage star stars ><-8> +< logos jeux ><-8> +< maison manga ><-8> +< euro femmes fille ><-8> +< fond football formation ><-8> +< loi loto ><-8> +< francais gratuit sonneries ><-8> +< rencontre shopping photos ><-8> +< informatique internet itineraire ><-8> +< referencement rencontres restaurant ><-8> +< gratuit sonneries logos ><-8> +< video voeux voiture ><-8> +< yahoo tysami name ><-8> +< argus art automobile ><-8> +< saint sex sexe ><-8> +< webcam www xxx ><-8> +< chat cinema club ><-8> +< plan porno pornographie ><-8> +< tysami name ><-8> +< voyage web webcam ><-8> +< content tysami web ><-8> +< cd celebrite ><-8> +< droit ecole ecran ><-8> +< vacances vente video ><-8> +< gestion google ><-8> +< cinema club ><-8> +< tf1 top ><-8> +< art automobile ><-8> +< maison manga materiel ><-8> +< rencontre shopping ><-8> +< port ><-8> +< content tysami moteur ><-8> +< art automobile avion ><-8> +< informatique emploi ><-8> +< recipes ><-8> +< billet bourse business ><-8> +< restaurant saint sex ><-8> +< referencement rencontres ><-8> +< conseil coupe ><-8> +< argus art ><-8> +< centre chat ><-8> +< sms casino rencontre ><-8> +< abstract content tysami ><-8> +< informatique emploi voyage ><-8> +< pages paris ><-8> +< horoscope hotel ><-8> +< fille fnac ><-8> +< bourse business ><-8> +< sms sncf stage ><-8> +< recherche referencement rencontres ><-8> +< droit ecole ><-8> +< telephone tennis tf1 ><-8> +< stars telecharger telephone ><-8> +< sncf stage ><-8> +< voeux voiture voyage ><-8> +< tysami moteur de ><-8> +< fonts ><-8> +< monde moteur moto ><-8> +< tysami web ><-8> +< concours conseil coupe ><-8> +< sex sexe site ><-8> +< gratuit histoire homme ><-8> +< sms sncf ><-8> +< lingerie livre ><-8> +< fille fnac fond ><-8> +< automobile avion ><-8> +< creation cuisine droit ><-8> +< histoire homme horoscope ><-8> +< meteo monde ><-8> +< fnac fond football ><-8> +< commerce concours ><-8> +< hotel humour ><-8> +< xxx yahoo ><-8> +< songs ><-8> +< name dc source ><-8> +< voiture voyage ><-8> +< sony ><-8> +< le guide ><-8> +< dc source ><-8> +< 1 1 rsac ><-8> +< voyages ><-8> +< dc type content ><-8> +< server ><-8> +< content name dc ><-8> +< nz 1 ><-8> +< stage ><-8> +< help ><-8> +< creator content ><-8> +< roman ><-8> +< nr 1 ><-8> +< 1 nr ><-8> +< science ><-8> +< anpe ><-8> +< 1 nr 1 ><-8> +< dc date content ><-8> +< 0 s 0 ><-8> +< formation ><-8> +< bain ><-8> +< noarchive name rating ><-8> +< lc 1 oz ><-8> +< disney ><-8> +< dragons ><-8> +< times ><-8> +< bmw ><-8> +< computers ><-8> +< publicitaire ><-8> +< anciens ><-8> +< compteur ><-8> +< ddmmyyyy ><-8> +< blues ><-8> +< content galerie ><-8> +< free music ><-8> +< voyance ><-8> +< ddmmyyyy content ><-8> +< fleurs ><-8> +< name dc contributor ><-8> +< exit content blendtrans ><-8> +< cms ><-8> +< creation ddmmyyyy ><-8> +< dc contributor ><-8> +< et jeux ><-8> +< mois ><-8> +< date creation ddmmyyyy ><-8> +< fleur ><-8> +< article ><-8> +< prenom ><-8> +< dit ><-8> +< 1995 ><-8> +< chateau ><-8> +< modified content ><-8> +< if ><-8> +< take ><-8> +< seine maritime ><-8> +< resultats ><-8> +< traffic ><-8> +< creation ddmmyyyy content ><-8> +< passionnes ><-8> +< abc ><-8> +< photographie photographies ><-8> +< bandeau ><-8> +< portail de ><-8> +< scanner ><-8> +< christophe ><-8> +< astrology ><-8> +< moto ><-8> +< maison ><-8> +< sonneries logos ><-8> +< jeux video ><-8> +< ski ><-8> +< i name ><-8> +< 2 days ><-8> +< content 2 days ><-8> +< info ><-8> +< s 0 v ><-8> +< n 0 ><-8> +< n 0 s ><-8> +< graphisme ><-8> +< king ><-8> +< rsaci north america ><-8> +< jeu jeux ><-8> +< hotels ><-8> +< cartes virtuelles ><-8> +< 2001 gmt ><-8> +< america server ><-8> +< north america server ><-8> +< source content ><-8> +< javascript ><-8> +< comment rsaci ><-8> +< rsaci north ><-8> +< plage ><-8> +< comment rsaci north ><-8> +< alcool ><-8> +< caramail ><-8> +< billet ><-8> +< francais france ><-8> +< cache name generator ><-8> +< north america ><-8> +< rsaci ><-8> +< composes de ><-8> +< minuscule orifice ><-8> +< salons conventions librairies ><-8> +< de citation ><-8> +< couverture planches cases ><-8> +< prelevement ><-8> +< dessinateurs histoires festivals ><-8> +< run ><-8> +< vih ><-8> +< bdtheque francophone belgique ><-8> +< dessinner ><-8> +< gratuit hebergement ><-8> +< none default videos ><-8> +< sont composes ><-8> +< industriels ><-8> +< dupuis dargaud ><-8> +< par application du ><-8> +< lit lits ><-8> +< nf produit service ><-8> +< portrait nu ><-8> +< rapidite ><-8> +< kennel ><-8> +< instituto de ><-8> +< reunion name robots ><-8> +< un but d ><-8> +< suivi ><-8> +< 3310 ><-8> +< 9eme ><-8> +< orifice a la ><-8> +< bienvenue dans l ><-8> +< basketball ><-8> +< londres ><-8> +< illustrations figurent sur ><-8> +< horoscope hebdomadaire ><-8> +< content cancer ><-8> +< bande sur ><-8> +< x adulte ><-8> +< xxx club tintinologie ><-8> +< ma cci ><-8> +< a tricoter ><-8> +< hotel hotels ><-8> +< 24 uur ><-8> +< more the ><-8> +< de certification ><-8> +< eindhoven ><-8> +< cbbd humanoides associes ><-8> +< document bienvenue ><-8> +< canadienne art ><-8> +< sein chacun ><-8> +< soap ><-8> +< associes spirou ><-8> +< de la bande ><-8> +< anton ><-8> +< animaux nature ><-8> +< sante health ><-8> +< chi ><-8> +< grand choix ><-8> +< de mon site ><-8> +< comics bd ><-8> +< oficial ><-8> +< pull pantalon ><-8> +< content uni ><-8> +< autorisation des ><-8> +< l histoire de ><-8> +< bande bande dessinee ><-8> +< habit ><-8> +< biopsie microbiopsie microbiopsy ><-8> +< content beaute ><-8> +< content tous droits ><-8> +< sahara ><-8> +< by jean ><-8> +< gb http ><-8> +< astronomy ><-8> +< name generatoryahoo! ><-8> +< souvenirs ><-8> +< mammographie mammography ><-8> +< anytime ><-8> +< bdtheque ><-8> +< everything you ><-8> +< delire name ><-8> +< internet multimedia ><-8> +< festivals organismes ><-8> +< du mamelon ><-8> +< terrier ><-8> +< de glandes ><-8> +< expires content wed ><-8> +< kayak ><-8> +< dargaud lombard casterman ><-8> +< cigarettes ><-8> +< et pour les ><-8> +< humanoides associes spirou ><-8> +< microsoft name ><-8> +< judith ><-8> +< commerces ><-8> +< medya ><-8> +< e per ><-8> +< figure ><-8> +< oiseaux ><-8> +< officiel de l ><-8> +< internet haut debit ><-8> +< rabelais ><-8> +< full line of ><-8> +< depistage ><-8> +< mobile gsm ><-8> +< chacun de ces ><-8> +< ceux ci ><-8> +< resonance ><-8> +< review hardware materiel ><-8> +< download music ><-8> +< nf bienvenue ><-8> +< desc content ><-8> +< lombard casterman ><-8> +< scifi ><-8> +< content cancer sein ><-8> +< cutesite builder web ><-8> +< registeren ><-8> +< secretent ><-8> +< ajaccio ><-8> +< medecine medecine sante ><-8> +< des cadeaux ><-8> +< logo sonnerie ><-8> +< ci s ><-8> +< seins sont ><-8> +< des associations ><-8> +< marshall ><-8> +< chambres d ><-8> +< content accueil ><-8> +< la vente de ><-8> +< free animated ><-8> +< journalistes ><-8> +< seins e sante ><-8> +< pour telephones ><-8> +< pilote ><-8> +< x nanterre ><-8> +< warren ><-8> +< le jour les ><-8> +< zines ><-8> +< pictures images ><-8> +< content swish v2 ><-8> +< histoires festivals organismes ><-8> +< britain ><-8> +< fr content certification ><-8> +< citation dans ><-8> +< didll ><-8> +< home of the ><-8> +< icon ><-8> +< affections ><-8> +< mpeg3 ><-8> +< default videos ><-8> +< et accessoires ><-8> +< le lait ><-8> +< gedichten ><-8> +< dessiner dessinner bande ><-8> +< escape ><-8> +< forment des grappes ><-8> +< alveoles ><-8> +< 03 name ><-8> +< en temps ><-8> +< digital cameras kyocera ><-8> +< academy 2 ><-8> +< chocolat ><-8> +< a la mer ><-8> +< sur la vie ><-8> +< builder web html ><-8> +< for new ><-8> +< hors ><-8> +< evier ><-8> +< description content review ><-8> +< free website ><-8> +< 1 content fr ><-8> +< soleil humanos ><-8> +< cadeaux cadeau ><-8> +< government ><-8> +< content blogspirit name ><-8> +< 1252 lop com ><-8> +< geen sex ><-8> +< in love ><-8> +< liege ><-8> +< sabine ><-8> +< internet haut ><-8> +< along with ><-8> +< control name ><-8> +< fes ><-8> +< advanced ><-8> +< modelfotografie ><-8> +< content music ><-8> +< copyright content uni ><-8> +< villes ><-8> +< lagaffe ><-8> +< 81 ><-8> +< wai ><-8> +< imagerie imaging imagerie ><-8> +< sites hebergement ><-8> +< marrakech ouarzazate ><-8> +< content blogspirit ><-8> +< ces conduits qui ><-8> +< des infos ><-8> +< pictures nature ><-8> +< pet ><-8> +< nf produit ><-8> +< les de ><-8> +< femmes femmes ><-8> +< album de ><-8> +< web designer ><-8> +< new year ><-8> +< qui secretent le ><-8> +< painter ><-8> +< adulte dessinateurs ><-8> +< toepassingen ><-8> +< textes du site ><-8> +< de certification de ><-8> +< ms locale ><-8> +< 2pac ><-8> +< dupuis dargaud lombard ><-8> +< grilles ><-8> +< du droit de ><-8> +< lutte contre ><-8> +< un minuscule orifice ><-8> +< granger ><-8> +< windows 1252 lop ><-8> +< glenat ><-8> +< author content mike ><-8> +< mensuel ><-8> +< introductie ><-8> +< aout ><-8> +< xxx club ><-8> +< retrouvailles ><-8> +< sur mesure ><-8> +< author content design ><-8> +< afspreken ><-8> +< film cinema ><-8> +< adoption ><-8> +< pays d ><-8> +< jeux gratuits jeu ><-8> +< default index ><-8> +< mincir ><-8> +< content the uk ><-8> +< dargaud lombard ><-8> +< kilos ><-8> +< casterman ><-8> +< smileys ><-8> +< artistes et ><-8> +< univers de ><-8> +< depistage screening echographie ><-8> +< oeuvre ><-8> +< content text charset ><-8> +< marque volontaire collective ><-8> +< exposer ><-8> +< dc description lang ><-8> +< linge de ><-8> +< mammography cancer ><-8> +< deal ><-8> +< bande herge dupuis ><-8> +< review hardware ><-8> +< humour albums ><-8> +< information et ><-8> +< andrews ><-8> +< cancer sein ><-8> +< etapes ><-8> +< forecast ><-8> +< personalname address content ><-8> +< d de ><-8> +< des quizz ><-8> +< skate ><-8> +< resonance magnetique ><-8> +< v5 0 http ><-8> +< groningen ><-8> +< franquin gaston ><-8> +< content tricot ><-8> +< belge canada ><-8> +< brevet ><-8> +< minuscules canaux ceux ><-8> +< club tintinologie name ><-8> +< a web ><-8> +< notes ><-8> +< on the move ><-8> +< v name ><-8> +< aux fours a ><-8> +< description content gratis ><-8> +< gag humour albums ><-8> +< michelin ><-8> +< en vogue ><-8> +< l homme ><-8> +< de la vente ><-8> +< contributor personalname ><-8> +< poney ><-8> +< depeche ><-8> +< turkiye ><-8> +< 7 0 1 ><-8> +< les programmes de ><-8> +< net name language ><-8> +< location saisonniere ><-8> +< les programmes ><-8> +< sante fr affections ><-8> +< en scene ><-8> +< com on 1999 ><-8> +< france belge ><-8> +< fr bienvenue ><-8> +< used ><-8> +< karaoke ><-8> +< general name dc ><-8> +< nyc ><-8> +< artistes name ><-8> +< poumons circulation ><-8> +< graisse ><-8> +< fr copyright 2003 ><-8> +< opleiding ><-8> +< betrouwbare ><-8> +< online lire ><-8> +< radiology mammographie mammography ><-8> +< 9e ><-8> +< convivialite ><-8> +< filles prenoms ><-8> +< 2000 la ><-8> +< dessinner bande bande ><-8> +< garden ><-8> +< illustration d ><-8> +< books and ><-8> +< minuscule orifice a ><-8> +< lagaffe tintin ><-8> +< canada canadienne art ><-8> +< pour rire ><-8> +< organisme ><-8> +< seins sont composes ><-8> +< boulogne sur ><-8> +< nord sud ><-8> +< elles ne ><-8> +< veut ><-8> +< mystery netzwerk ><-8> +< shady ><-8> +< chez les ><-8> +< apprenez ><-8> +< irm ><-8> +< kar ><-8> +< cascade ><-8> +< 3210 3310 ><-8> +< collective de certification ><-8> +< ministere ><-8> +< horoscope quotidien ><-8> +< ebay ><-8> +< le portail de ><-8> +< scripts php ><-8> +< trucs astuces ><-8> +< dargaud ><-8> +< title content de ><-8> +< sullivan ><-8> +< histoires festivals ><-8> +< occasion achat ><-8> +< amos ><-8> +< environnement ><-8> +< to other ><-8> +< sante health radiologie ><-8> +< anime gif ><-8> +< jeux sur ><-8> +< 75017 ><-8> +< 15 et 20 ><-8> +< lgbt ><-8> +< loiret ><-8> +< philosophie ><-8> +< blois ><-8> +< macrobiopsy ><-8> +< 8 19 ><-8> +< sans leur autorisation ><-8> +< dessinner bande ><-8> +< personalname address ><-8> +< kenya ><-8> +< etc de ><-8> +< sigourney weaver ><-8> +< avortement ><-8> +< content patrick ><-8> +< forum http ><-8> +< les illustrations figurent ><-8> +< histoire des ><-8> +< gloire ><-8> +< searching 4u ><-8> +< calculator ><-8> +< x name copyright ><-8> +< warner ><-8> +< cartes virtuelles et ><-8> +< seins e ><-8> +< leurs auteurs ><-8> +< elektronik ><-8> +< ci s unissent ><-8> +< union des ><-8> +< portal aybrbtu ><-8> +< forment des ><-8> +< assistance ><-8> +< 2200 name generatoryahoo! ><-8> +< allemand ><-8> +< auto s ><-8> +< livres livre ><-8> +< manga mangas comics ><-8> +< 3 suisses ><-8> +< alex ><-8> +< humanoides associes ><-8> +< publisher lang ><-8> +< sorcellerie ><-8> +< de plus gros ><-8> +< biens ><-8> +< vins ><-8> +< surprises ><-8> +< certification nf produit ><-8> +< certification nf ><-8> +< science fiction und ><-8> +< content nc ><-8> +< resonance magnetique irm ><-8> +< canadienne art 9e ><-8> +< true for icra ><-8> +< bienvenue lesfilles tm ><-8> +< poneys ><-8> +< cnbdi ><-8> +< sony music ><-8> +< lesfilles tm ><-8> +< pour former ><-8> +< peluche ><-8> +< und mystery ><-8> +< s en ><-8> +< horoscope hebdomadaire horoscope ><-8> +< lop com live ><-8> +< emoi ><-8> +< par application ><-8> +< circulation sanguine affections ><-8> +< affections des seins ><-8> +< figurent ><-8> +< content review of ><-8> +< service marque ><-8> +< cnbdi cbbd ><-8> +< contributor personalname address ><-8> +< cannet ><-8> +< horloges ><-8> +< gouffre ><-8> +< 12 http ><-8> +< screening echographie ultrasound ><-8> +< animes gifs animes ><-8> +< du festival ><-8> +< corse corse ><-8> +< nikon ><-8> +< farmer mylene ><-8> +< reproduits ><-8> +< certification ><-8> +< content tim ><-8> +< du mamelon name ><-8> +< description content get ><-8> +< ultrasound biopsie microbiopsie ><-8> +< association l ><-8> +< fours a pain ><-8> +< monde du travail ><-8> +< peuvent reproduits ><-8> +< mans ><-8> +< qui forment des ><-8> +< blogspirit name generator ><-8> +< de sante ><-8> +< health radiologie radiology ><-8> +< de fille prenoms ><-8> +< de mer ><-8> +< salons conventions ><-8> +< critiques revues journal ><-8> +< 60 days name ><-8> +< creator corporatename ><-8> +< bd sont ><-8> +< belgie name ><-8> +< des photographies ><-8> +< les nouveaux albums ><-8> +< de adulte ><-8> +< logos pour ><-8> +< canaux il y ><-8> +< yourself or ><-8> +< paroles de ><-8> +< poesies ><-8> +< comedians ><-8> +< balades ><-8> +< chatons ><-8> +< content coeur seins ><-8> +< seins poumons circulation ><-8> +< category lang ><-8> +< par une ><-8> +< root ><-8> +< searches for ><-8> +< secours ><-8> +< constituees en alveoles ><-8> +< boutiques en ><-8> +< alveoles qui forment ><-8> +< blagues et ><-8> +< martijn ><-8> +< broderie point ><-8> +< organismes salons conventions ><-8> +< calcio ><-8> +< glandes constituees en ><-8> +< journaux online ><-8> +< plomberie ><-8> +< text charset ><-8> +< personalname ><-8> +< gite ><-8> +< tomorrow ><-8> +< mammography cancer du ><-8> +< c o ><-8> +< votre espace ><-8> +< medical imaging ><-8> +< on trouve ><-8> +< glenat l ><-8> +< ma cci com ><-8> +< creator corporatename content ><-8> +< newsletter forum ><-8> +< c o m ><-8> +< keywords content content ><-8> +< locale content en ><-8> +< surf surfeur ><-8> +< librairies galeries gag ><-8> +< loir ><-8> +< fiction und ><-8> +< blogspirit name ><-8> +< de ressources ><-8> +< internationaux ><-8> +< 79 ><-8> +< bande bande ><-8> +< bottle ><-8> +< regie publicitaire ><-8> +< ns 1 ><-8> +< figurent sur ce ><-8> +< electricite ><-8> +< gb2312 name ><-8> +< keywords content a ><-8> +< vartan ><-8> +< coffee ><-8> +< donegal ><-8> +< windowsnt ><-8> +< keywords content e ><-8> +< associes spirou manga ><-8> +< turquie ><-8> +< conventions librairies galeries ><-8> +< carrelage ><-8> +< creez ><-8> +< internet service provider ><-8> +< yamaha ><-8> +< claude ><-8> +< bayonne ><-8> +< creation de site ><-8> +< france belge canada ><-8> +< public name dc ><-8> +< spirou manga mangas ><-8> +< swish v2 ><-8> +< mangas comics personnages ><-8> +< division ><-8> +< customer service ><-8> +< de ces conduits ><-8> +< photos de voitures ><-8> +< nf nf name ><-8> +< les personnes ><-8> +< author content didier ><-8> +< annonce location ><-8> +< imaging tomodensitometrie ><-8> +< critiques elles ><-8> +< kvk ><-8> +< laam ><-8> +< organismes salons ><-8> +< imaging tomodensitometrie scanner ><-8> +< bouquin ><-8> +< microbiopsie ><-8> +< photogallery ><-8> +< au jour le ><-8> +< iraq ><-8> +< content this is ><-8> +< fiber ><-8> +< cci com ><-8> +< content murgo ><-8> +< kyocera ><-8> +< reed ><-8> +< personnages dessinateurs x ><-8> +< south park ><-8> +< la reunion ><-8> +< op de ><-8> +< paris x nanterre ><-8> +< dans tous les ><-8> +< uur ><-8> +< de mariees ><-8> +< en alveoles qui ><-8> +< hampshire ><-8> +< apres un ><-8> +< hautes ><-8> +< etymologie ><-8> +< das science ><-8> +< download divx ><-8> +< la bande sur ><-8> +< me to ><-8> +< bouquins ><-8> +< etudiants ><-8> +< digital photography digital ><-8> +< but d ><-8> +< osmanli ><-8> +< javascripts ><-8> +< draveil ><-8> +< france normandie ><-8> +< base de adulte ><-8> +< content en ! ><-8> +< medieval ><-8> +< 01 07 ><-8> +< leisure ><-8> +< p3 ><-8> +< maintenance ><-8> +< spirou manga ><-8> +< addresses ><-8> +< blog weblog ><-8> +< s official ><-8> +< constituees ><-8> +< screening echographie ><-8> +< e mail email ><-8> +< friesland ><-8> +< forment ><-8> +< grappes autour ><-8> +< content aanmelden ><-8> +< la de leurs ><-8> +< former de ><-8> +< medical imaging tomodensitometrie ><-8> +< das science fiction ><-8> +< de rouen ><-8> +< sur sa ><-8> +< est une association ><-8> +< des gifs ><-8> +< rongeur ><-8> +< balneaire ><-8> +< mariees ><-8> +< art com ><-8> +< ville de ><-8> +< brandebourg ><-8> +< asso soleil ><-8> +< candies ><-8> +< 9e 9eme base ><-8> +< dragon prints ><-8> +< the move ><-8> +< pilule ><-8> +< virtuelles et ><-8> +< de laine ><-8> +< variete ><-8> +< chatterie ><-8> +< sein chacun de ><-8> +< dessinateurs ><-8> +< cancer sein breast ><-8> +< location vacances ><-8> +< et de glandes ><-8> +< content didier ><-8> +< l asso soleil ><-8> +< planches cases histoires ><-8> +< milletvekilleri ><-8> +< gratuit service ><-8> +< votre espace entreprise ><-8> +< scooter ><-8> +< wallpaper wallpapers ><-8> +< musique musical ><-8> +< dc author ><-8> +< chambre d ><-8> +< ya ><-8> +< en alveoles ><-8> +< kisisel ><-8> +< album de photos ><-8> +< mobiles mobiles ><-8> +< dossiers du ><-8> +< name ms ><-8> +< les domaines ><-8> +< asker ><-8> +< tf1 le ><-8> +< wissenschaft ><-8> +< tournois ><-8> +< etats ><-8> +< code de ><-8> +< content pascal ><-8> +< feest ><-8> +< circuits ><-8> +< native ><-8> +< vu ><-8> +< complets critiques ><-8> +< humanoides ><-8> +< truth ><-8> +< melodie ><-8> +< pour telephones portables ><-8> +< but d illustration ><-8> +< btvs ><-8> +< dessinnees dessiner ><-8> +< veste ><-8> +< animes gifs ><-8> +< pour former de ><-8> +< papiers peints ><-8> +< fr affections ><-8> +< to help ><-8> +< galeries gag humour ><-8> +< by com r ><-8> +< autorisation ><-8> +< 1 2 name ><-8> +< wright ><-8> +< botswana ><-8> +< 20 dans ><-8> +< star academy 2 ><-8> +< uk r ><-8> +< sur le cinema ><-8> +< diplome ><-8> +< est une galerie ><-8> +< lycee ><-8> +< en pays ><-8> +< top searches ><-8> +< collectible ><-8> +< unis ><-8> +< content murgo name ><-8> +< menuiserie ><-8> +< en ! ><-8> +< mylene ><-8> +< poumons circulation sanguine ><-8> +< worlds ><-8> +< top 40 ><-8> +< our online ><-8> +< strange ><-8> +< ouarzazate ><-8> +< and movie ><-8> +< leur autorisation ><-8> +< en a entre ><-8> +< sms logo ><-8> +< description content test ><-8> +< barry ><-8> +< zeitschrift ><-8> +< entre 15 et ><-8> +< board name ><-8> +< supporters ><-8> +< cavalier ><-8> +< accounts ><-8> +< 1252 name desciption ><-8> +< lollipops ><-8> +< animation web internet ><-8> +< neufs ><-8> +< stefan ><-8> +< tout ce qui ><-8> +< lyrics lyrics ><-8> +< acces internet ><-8> +< mp3 mp3 name ><-8> +< auteurs et ne ><-8> +< fr affections des ><-8> +< content linux ><-8> +< fabrication ><-8> +< keywords content pub ><-8> +< geddes ><-8> +< eng ><-8> +< content marque nf ><-8> +< sans autorisation ><-8> +< santa ><-8> +< grand choix de ><-8> +< les seins sont ><-8> +< albums animation ><-8> +< plus proche ><-8> +< gratuits jeu ><-8> +< 15 et ><-8> +< affections des ><-8> +< murgo ><-8> +< live online portal ><-8> +< iman ><-8> +< prenoms de ><-8> +< fr bienvenue sur ><-8> +< keyboard ><-8> +< ipr ><-8> +< 1 searching ><-8> +< que l ><-8> +< surface du ><-8> +< tomodensitometrie ><-8> +< coeur seins poumons ><-8> +< prenom fille ><-8> +< saisonniere ><-8> +< canaux il ><-8> +< buy purchase ><-8> +< interactive couverture planches ><-8> +< journaux online lire ><-8> +< ruban ><-8> +< bienvenue lesfilles ><-8> +< de nombreux services ><-8> +< karite ><-8> +< prints posters ><-8> +< employment ><-8> +< wonderful ><-8> +< dessiner dessinner ><-8> +< content sante ><-8> +< lit et ><-8> +< hardware materiel ><-8> +< mammographie ><-8> +< brava ><-8> +< builder web ><-8> +< content aux ><-8> +< online lire bdtheque ><-8> +< content swish ><-8> +< content 1995 ><-8> +< genealogie ><-8> +< medecine sante health ><-8> +< paris ! ><-8> +< articles de critiques ><-8> +< ms locale content ><-8> +< brian ><-8> +< microbiopsy macrobiopsie macrobiopsy ><-8> +< risque de ><-8> +< de leurs auteurs ><-8> +< ultrasound biopsie ><-8> +< description content marque ><-8> +< handicaps ><-8> +< name category lang ><-8> +< certification de ><-8> +< content certification ><-8> +< glenat l association ><-8> +< du sein breast ><-8> +< ou faire des ><-8> +< elles ne peuvent ><-8> +< radio des ><-8> +< tab ><-8> +< content review ><-8> +< fours a ><-8> +< reserved name author ><-8> +< achat name robots ><-8> +< distribution content general ><-8> +< offres de ><-8> +< sont disponibles ><-8> +< hyper ><-8> +< objective ><-8> +< de adulte adultes ><-8> +< rap hip ><-8> +< dealers ><-8> +< consultez le ><-8> +< sculpteurs ><-8> +< theme content cactus ><-8> +< charset gb2312 name ><-8> +< 12 http equiv ><-8> +< suchen ><-8> +< tornado ><-8> +< comics personnages dessinateurs ><-8> +< subject scheme ><-8> +< paris x ><-8> +< lire bdtheque francophone ><-8> +< tomodensitometrie scanner resonance ><-8> +< coton ><-8> +< en temps reel ><-8> +< half ><-8> +< grappes ><-8> +< site par application ><-8> +< backup ><-8> +< benelli ><-8> +< prenoms filles ><-8> +< musee ><-8> +< 20 dans chaque ><-8> +< de garde ><-8> +< guias ><-8> +< for icra org ><-8> +< k9 ><-8> +< mamelon name keywords ><-8> +< minuscules canaux ><-8> +< foros de ><-8> +< content stephane ><-8> +< dsl ><-8> +< humanos cnbdi ><-8> +< chiot ><-8> +< rap rap ><-8> +< ltd ><-8> +< s unissent ><-8> +< content logos ><-8> +< produit service ><-8> +< senologie ><-8> +< keywords content women ><-8> +< sans autorisation des ><-8> +< test page ><-8> +< conventions librairies ><-8> +< sur un minuscule ><-8> +< cci com votre ><-8> +< mosquee ><-8> +< highland ><-8> +< galeries gag ><-8> +< planches ><-8> +< pacific ><-8> +< bien plus ><-8> +< microbiopsy macrobiopsie ><-8> +< digital imaging ><-8> +< beaute sante ><-8> +< hebergement de site ><-8> +< trivia ><-8> +< description content aux ><-8> +< category lang fr ><-8> +< monuments ><-8> +< vergleichen ><-8> +< nf nf ><-8> +< fille prenoms de ><-8> +< continue ><-8> +< free horoscope ><-8> +< 9eme base de ><-8> +< mail email ><-8> +< fantasy art ><-8> +< thermalisme ><-8> +< orientale ><-8> +< keywords content mode ><-8> +< femmes rondes ><-8> +< a pain name ><-8> +< huiles ><-8> +< dance videos ><-8> +< volontaire collective ><-8> +< web internet interactive ><-8> +< debouche ><-8> +< aux professionnels ><-8> +< beheer website ><-8> +< de ce ><-8> +< la route ><-8> +< formula 1 ><-8> +< keywords content logos ><-8> +< mobile telephone ><-8> +< de citation dans ><-8> +< d abord ><-8> +< 900 http equiv ><-8> +< content girl ><-8> +< microbiopsy ><-8> +< foundation ><-8> +< franquin ><-8> +< content 900 ><-8> +< astronomie ><-8> +< futurs ><-8> +< intro ><-8> +< marque volontaire ><-8> +< l asso ><-8> +< dessinee bandes ><-8> +< du droit ><-8> +< aybrbtu ><-8> +< email content net ><-8> +< d1 ><-8> +< minuscules ><-8> +< suisse france belge ><-8> +< histoires complets critiques ><-8> +< 914 ><-8> +< lille nord ><-8> +< website website ><-8> +< pour les jeunes ><-8> +< rideaux ><-8> +< vache ><-8> +< s unissent pour ><-8> +< m a ><-8> +< expedition ><-8> +< aux fours ><-8> +< keywords content disney ><-8> +< makaveli ><-8> +< entrez dans ><-8> +< olive ><-8> +< jour le ><-8> +< sistema ><-8> +< des grappes autour ><-8> +< immo ><-8> +< nf marque volontaire ><-8> +< lac ><-8> +< rencontres en ><-8> +< association nationale ><-8> +< bd bd ><-8> +< des grappes ><-8> +< la mode ><-8> +< cell ><-8> +< une simple ><-8> +< calvados ><-8> +< mp3 mp3 http ><-8> +< murgo name ><-8> +< macrobiopsie macrobiopsy ><-8> +< bmx ><-8> +< copyright content 1995 ><-8> +< nr 1 vb ><-8> +< od 1 cb ><-8> +< tv name keywords ><-8> +< dupuis ><-8> +< jeu game ><-8> +< casablanca ><-8> +< breast medecine ><-8> +< d articles de ><-8> +< follow name classification ><-8> +< les et les ><-8> +< conduits qui ><-8> +< les seins ><-8> +< astuces de ><-8> +< drente ><-8> +< dessinees dessinnees ><-8> +< fr r nd ><-8> +< content certification nf ><-8> +< tintin comics bd ><-8> +< cbbd humanoides ><-8> +< debouche sur un ><-8> +< couverture planches ><-8> +< au jour ><-8> +< generator content blogspirit ><-8> +< reproduits sans ><-8> +< 9e 9eme ><-8> +< peuvent reproduits sans ><-8> +< robes de mariees ><-8> +< la surface du ><-8> +< cinema film ><-8> +< content 29 ><-8> +< l default ><-8> +< tant ><-8> +< tuning photos ><-8> +< content 900 http ><-8> +< cci ><-8> +< rap hip hop ><-8> +< normandy ><-8> +< missions ><-8> +< com votre espace ><-8> +< tintinologie name ><-8> +< v6 0 0 ><-8> +< lingua ><-8> +< sein breast medecine ><-8> +< verkoop ><-8> +< peuvent sans autorisation ><-8> +< leur autorisation les ><-8> +< ceremonie ><-8> +< textes de ><-8> +< medecine medecine ><-8> +< heureux ><-8> +< website ontwerpen ><-8> +< textes du ><-8> +< audios ><-8> +< expos ><-8> +< lire bdtheque ><-8> +< disneyland ><-8> +< canadienne ><-8> +< beheer ><-8> +< editor document bienvenue ><-8> +< bailey ><-8> +< plus gros canaux ><-8> +< des 3 ><-8> +< application du droit ><-8> +< francophone belgique suisse ><-8> +< opera ><-8> +< comics bd bande ><-8> +< soleil humanos cnbdi ><-8> +< yoda ><-8> +< content disney ><-8> +< phototheque ><-8> +< roland ><-8> +< journal journaux online ><-8> +< games flash ><-8> +< blatt ><-8> +< webpagina ><-8> +< soiree robes de ><-8> +< des sites des ><-8> +< pictures photos images ><-8> +< pret a porter ><-8> +< parole chanson ><-8> +< customer ><-8> +< annuaires de ><-8> +< accessoires pour ><-8> +< espace entreprise ><-8> +< associes ><-8> +< messageboard ><-8> +< graisse et ><-8> +< de plage ><-8> +< books books ><-8> +< name dc author ><-8> +< marque nf nf ><-8> +< und mystery netzwerk ><-8> +< adulte dessinateurs histoires ><-8> +< logging ><-8> +< ceux ci s ><-8> +< instruction ><-8> +< prenoms en vogue ><-8> +< keywords content email ><-8> +< lies ><-8> +< entre 15 ><-8> +< bateau bateaux ><-8> +< coeur seins ><-8> +< content 2003 01 ><-8> +< seins poumons ><-8> +< ordinateur ordinateurs ><-8> +< chaque sein chacun ><-8> +< d ici ><-8> +< de football ><-8> +< offres d ><-8> +< ne peuvent sans ><-8> +< name server ><-8> +< website hosting ><-8> +< printer ><-8> +< lease ><-8> +< equiv last ><-8> +< vacances et ><-8> +< 2 8 19 ><-8> +< et conseils ><-8> +< et jeunes ><-8> +< dessinateurs histoires ><-8> +< canarie ><-8> +< mali ><-8> +< preview review hardware ><-8> +< association l asso ><-8> +< tintin ><-8> +< prenoms en ><-8> +< produit service marque ><-8> +< franquin gaston lagaffe ><-8> +< chartres ><-8> +< name ms locale ><-8> +< rongeurs ><-8> +< dc contributor personalname ><-8> +< autorisation les ><-8> +< sondages ><-8> +< internet interactive couverture ><-8> +< infobebes com ><-8> +< systems ><-8> +< bande dessinee bandes ><-8> +< your computer ><-8> +< art 9e 9eme ><-8> +< palmer ><-8> +< humanos ><-8> +< informe sur ><-8> +< championship ><-8> +< chaine ><-8> +< forums forum ><-8> +< ados jeunes ><-8> +< nouveaux albums ><-8> +< magnetique irm mri ><-8> +< universities ><-8> +< address content fr ><-8> +< flash game ><-8> +< droit de citation ><-8> +< a la surface ><-8> +< danny ><-8> +< content le monde ><-8> +< etat ><-8> +< places ><-8> +< tintin comics ><-8> +< unissent pour former ><-8> +< prets ><-8> +< dawson ><-8> +< francophone belgique ><-8> +< partir de ><-8> +< est en ><-8> +< nf marque ><-8> +< grappes autour de ><-8> +< mammography ><-8> +< top searches for ><-8> +< autorisation des tous ><-8> +< le lait debouche ><-8> +< prenoms prenoms ><-8> +< service marque nf ><-8> +< des tous ><-8> +< http equiv last ><-8> +< beheermodule ><-8> +< conduits qui secretent ><-8> +< anime gif anime ><-8> +< brussel antwerpen ><-8> +< carrefour ><-8> +< keywords content kyocera ><-8> +< 107 ><-8> +< nicola ><-8> +< par la ><-8> +< lex ><-8> +< 01 07 name ><-8> +< papiers ><-8> +< les illustrations ><-8> +< humour albums animation ><-8> +< meilleures webcams ><-8> +< gratuit photographie ><-8> +< ou faire ><-8> +< exercices ><-8> +< winamp mp3 ><-8> +< de minuscules canaux ><-8> +< content name creation_date ><-8> +< citation dans un ><-8> +< bande herge ><-8> +< debouche sur ><-8> +< ferdinand ><-8> +< icra org r ><-8> +< voor je ><-8> +< volontaire collective de ><-8> +< site de tf1 ><-8> +< player mp3 ><-8> +< echange echange ><-8> +< tatil ><-8> +< lagaffe tintin comics ><-8> +< marque nf bienvenue ><-8> +< modules ><-8> +< horoscope mensuel ><-8> +< particuliers maison ><-8> +< islam ><-8> +< four ><-8> +< 59 ><-8> +< constituees en ><-8> +< diaporama pps ><-8> +< cigar ><-8> +< pascal name ><-8> +< ru name dc ><-8> +< papi ><-8> +< leads ><-8> +< wallpaper fond d ><-8> +< oiseau ><-8> +< gros canaux ><-8> +< music and ><-8> +< puzzle ><-8> +< hosten ><-8> +< limited editions ><-8> +< circulation sanguine ><-8> +< a entre 15 ><-8> +< physical ><-8> +< adulte adultes xx ><-8> +< colleges ><-8> +< complets ><-8> +< depistage screening ><-8> +< author content daniel ><-8> +< webdesignbureau ><-8> +< photo de la ><-8> +< internet interactive ><-8> +< devinettes ><-8> +< 9eme base ><-8> +< costa brava ><-8> +< instituto ><-8> +< magnetique irm ><-8> +< ru name robots ><-8> +< de voitures ><-8> +< tilburg ><-8> +< dans un but ><-8> +< de marseille ><-8> +< certification de produits ><-8> +< mp3 download ><-8> +< rubrieken ><-8> +< prevention de ><-8> +< description content in ><-8> +< find out ><-8> +< theories ><-8> +< medicale medical imaging ><-8> +< stones ><-8> +< le mans ><-8> +< unissent pour ><-8> +< mairie ><-8> +< available name ><-8> +< scsi ><-8> +< canaux ceux ci ><-8> +< art images ><-8> +< x adulte dessinateurs ><-8> +< instrumental ><-8> +< taxi ><-8> +< de critiques elles ><-8> +< 7 jours ><-8> +< essai ><-8> +< achat name ><-8> +< complets critiques revues ><-8> +< blog name ><-8> +< adultes xx ><-8> +< someone ><-8> +< homme enfant ><-8> +< jour le jour ><-8> +< adultes xx xxx ><-8> +< nil ><-8> +< scores ><-8> +< des bonnes ><-8> +< locale content ><-8> +< feb 2004 gmt ><-8> +< un minuscule ><-8> +< sport et ><-8> +< dans chaque ><-8> +< belgique suisse france ><-8> +< jeux video jeux ><-8> +< aydin ><-8> +< forum aux fours ><-8> +< d illustration ><-8> +< gay and ><-8> +< ne peuvent ><-8> +< paranormal ><-8> +< author content patrick ><-8> +< sigourney ><-8> +< echographie ultrasound biopsie ><-8> +< bdtheque francophone ><-8> +< professeurs ><-8> +< content ipr ><-8> +< pulls ><-8> +< compression ><-8> +< sprint ><-8> +< en gb http ><-8> +< wel ><-8> +< de graisse et ><-8> +< nature photography nature ><-8> +< dessiner ><-8> +< completed name ><-8> +< online portal ><-8> +< la surface ><-8> +< movie the ><-8> +< photos photographe ><-8> +< autour de minuscules ><-8> +< de graisse ><-8> +< sont la de ><-8> +< juste prix ><-8> +< flash 5 ><-8> +< kaarten ><-8> +< humanos cnbdi cbbd ><-8> +< nog veel ><-8> +< festival de ><-8> +< hebdomadaire horoscope ><-8> +< internetsite ><-8> +< 1 searching 4u ><-8> +< lesfilles tm fr ><-8> +< tx ><-8> +< simplifie ><-8> +< here are ><-8> +< financial ><-8> +< content cactus ><-8> +< gaston lagaffe tintin ><-8> +< offrez ><-8> +< herge ><-8> +< cbbd ><-8> +< discount hard ><-8> +< minuscule ><-8> +< de la reunion ><-8> +< biopsie ><-8> +< images pics ><-8> +< line of ><-8> +< creatif ><-8> +< live online ><-8> +< unissent ><-8> +< tabac ><-8> +< bodybuilders ><-8> +< photos forum ><-8> +< booster ><-8> +< humanitaire ><-8> +< construire ><-8> +< revues journal ><-8> +< mammographie mammography cancer ><-8> +< people and ><-8> +< 700 ><-8> +< art posters ><-8> +< canaux ceux ><-8> +< lait debouche ><-8> +< personnages dessinateurs ><-8> +< for icra ><-8> +< cortege ><-8> +< neige ><-8> +< content automobile ><-8> +< radiologie radiology mammographie ><-8> +< for finding ><-8> +< keywords content coeur ><-8> +< et 20 ><-8> +< langage content name ><-8> +< fre ><-8> +< des prenoms ><-8> +< tintinologie ><-8> +< contributor personalname content ><-8> +< imaging imagerie medicale ><-8> +< content mike ><-8> +< cancer gynecologie ><-8> +< fear ><-8> +< du nord ><-8> +< art gallery galleries ><-8> +< prenom fille prenoms ><-8> +< created by ><-8> +< identity ><-8> +< 800x600 ><-8> +< glandes constituees ><-8> +< astra ><-8> +< et 20 dans ><-8> +< online portal aybrbtu ><-8> +< microbiopsie microbiopsy ><-8> +< bi ru name ><-8> +< chirurgie esthetique ><-8> +< votre mariage ><-8> +< imagerie imaging ><-8> +< psychanalyse ><-8> +< class content completed ><-8> +< cases ><-8> +< knowledge ><-8> +< cases histoires complets ><-8> +< boulogne sur mer ><-8> +< xx xxx club ><-8> +< produits et services ><-8> +< content l default ><-8> +< de et de ><-8> +< lose ><-8> +< luthor ><-8> +< lex luthor ><-8> +< leurs auteurs et ><-8> +< filter ><-8> +< asp name ><-8> +< internet jeux ><-8> +< gros canaux il ><-8> +< blogspirit ><-8> +< de caractere ><-8> +< tomodensitometrie scanner ><-8> +< content completed name ><-8> +< dans tous ><-8> +< tm fr ><-8> +< air name ><-8> +< des tous droits ><-8> +< y en a ><-8> +< mangas comics ><-8> +< promotion et ><-8> +< bande bande herge ><-8> +< free domain ><-8> +< ghetto ><-8> +< chocolate ><-8> +< 900 http ><-8> +< reproduits sans leur ><-8> +< vaches ><-8> +< exporter 2 8 ><-8> +< de choses ><-8> +< orifice a ><-8> +< annuaire francophone ><-8> +< site pour les ><-8> +< central ><-8> +< horoscope quotidien horoscope ><-8> +< author content lycos ><-8> +< quotidien horoscope ><-8> +< documentary ><-8> +< crash ><-8> +< free computer ><-8> +< bd sont la ><-8> +< horoscope 2003 ><-8> +< nous sommes ><-8> +< sein breast ><-8> +< ligue 1 ><-8> +< canada canadienne ><-8> +< lombard casterman glenat ><-8> +< castle ><-8> +< description content news ><-8> +< aran ><-8> +< gewinnen ><-8> +< peints ><-8> +< ne peuvent reproduits ><-8> +< izmir ><-8> +< les films ><-8> +< 2003 01 ><-8> +< sanguine affections ><-8> +< couche ><-8> +< futures ><-8> +< along ><-8> +< 2003 horoscope ><-8> +< box office ><-8> +< lesfilles ><-8> +< chaque sein ><-8> +< rob ><-8> +< ce site par ><-8> +< circulation ><-8> +< lucas ><-8> +< content les textes ><-8> +< jeu d ><-8> +< illustration d articles ><-8> +< robes de soiree ><-8> +< de minuscules ><-8> +< peuvent sans ><-8> +< maisons de ><-8> +< amiens ><-8> +< biopsie microbiopsie ><-8> +< hebreu ><-8> +< yazarlar ><-8> +< tablatures ><-8> +< sans leur ><-8> +< desc ><-8> +< content netscape ><-8> +< de internet ><-8> +< soiree robes ><-8> +< jean de ><-8> +< abord ><-8> +< dessinnees dessiner dessinner ><-8> +< du travail ><-8> +< dessinateurs x ><-8> +< gaz ><-8> +< marque nf marque ><-8> +< infobebes ><-8> +< mri ><-8> +< autorisation les illustrations ><-8> +< org name dc ><-8> +< leidse ><-8> +< a themes ><-8> +< pensee ><-8> +< des 3 suisses ><-8> +< critiques revues ><-8> +< content astrologie ><-8> +< digimon ><-8> +< mousse ><-8> +< immigration ><-8> +< fours ><-8> +< 4u ><-8> +< keywords content linux ><-8> +< webmaster name keywords ><-8> +< champions ><-8> +< peintres ><-8> +< former de plus ><-8> +< dessinnees ><-8> +< planches cases ><-8> +< l innovation ><-8> +< breast cancer gynecologie ><-8> +< mae ><-8> +< 46 ><-8> +< 43 ><-8> +< des professionnels et ><-8> +< bedrijf ><-8> +< franchise name ><-8> +< 42 ><-8> +< genealogy ><-8> +< voie ><-8> +< gaston lagaffe ><-8> +< comics personnages ><-8> +< fiction und mystery ><-8> +< 1252 lop ><-8> +< songtexte ><-8> +< web promotie ><-8> +< personnalises ><-8> +< pregnancy ><-8> +< panel ><-8> +< microbiopsie microbiopsy macrobiopsie ><-8> +< dataverkeer ><-8> +< gratuits forum ><-8> +< congo ><-8> +< herge dupuis ><-8> +< art 9e ><-8> +< pret a ><-8> +< pop up ><-8> +< poumons ><-8> +< blague de ><-8> +< collectif ><-8> +< name desc ><-8> +< application du ><-8> +< content animaux ><-8> +< effectief ><-8> +< etoile ><-8> +< trailers and ><-8> +< offres d emploi ><-8> +< snoop ><-8> +< index name rev ><-8> +< l association l ><-8> +< lecteur ><-8> +< chat chats ><-8> +< tim ><-8> +< hermann ><-8> +< guyane ><-8> +< resources name keywords ><-8> +< artist gallery ><-8> +< eng name ><-8> +< des seins e ><-8> +< 8859 1 searching ><-8> +< ankara ><-8> +< parody ><-8> +< transfert ><-8> +< kodak ><-8> +< perso page ><-8> +< stations ><-8> +< de critiques ><-8> +< content computer ><-8> +< haus ><-8> +< large gamme ><-8> +< e tanto altro ><-8> +< content pub ><-8> +< club tintinologie ><-8> +< canape ><-8> +< karaoke musica ><-8> +< sidn nl ><-8> +< religions ><-8> +< 2 news ><-8> +< graisse et de ><-8> +< albums animation web ><-8> +< reunion name ><-8> +< watercolor ><-8> +< dans chaque sein ><-8> +< conduits ><-8> +< qc ><-8> +< casterman glenat ><-8> +< d illustration d ><-8> +< club club ><-8> +< health radiologie ><-8> +< 1993 ><-8> +< civilisation ><-8> +< swish v2 0 ><-8> +< asso soleil humanos ><-8> +< holland noord ><-8> +< fencing ><-8> +< generatoryahoo! ><-8> +< accessori ><-8> +< structure ><-8> +< dies ><-8> +< critiques elles ne ><-8> +< follow ma ><-8> +< interactive couverture ><-8> +< dessinateurs x adulte ><-8> +< maupassant ><-8> +< figurent sur ><-8> +< cases histoires ><-8> +< libros ><-8> +< fish ><-8> +< librairies galeries ><-8> +< futons ><-8> +< imagerie medicale medical ><-8> +< outillage ><-8> +< sein breast cancer ><-8> +< forum http equiv ><-8> +< pain name description ><-8> +< cameras kyocera ><-8> +< chinoise horoscope ><-8> +< qui secretent ><-8> +< transition 12 http ><-8> +< animation web ><-8> +< site par ><-8> +< etats unis ><-8> +< porsche 914 ><-8> +< fff ><-8> +< specific ><-8> +< stahl ><-8> +< tv show ><-8> +< informe ><-8> +< francais francophone ><-8> +< coloriages ><-8> +< content information name ><-8> +< breda ><-8> +< content dance ><-8> +< keywords content france ><-8> +< bron ><-8> +< content kyocera ><-8> +< keywords content bodybuilding ><-8> +< associative ><-8> +< festivals organismes salons ><-8> +< echographie ultrasound ><-8> +< site includes ><-8> +< journal journaux ><-8> +< full line ><-8> +< tv tele television ><-8> +< humains ><-8> +< gratuites pour ><-8> +< content vetement ><-8> +< nombreux services ><-8> +< com live online ><-8> +< copyright content swish ><-8> +< publisher content blogspirit ><-8> +< melodies ><-8> +< 1 bienvenue chez ><-8> +< mamelon name ><-8> +< esc ><-8> +< sanguine affections des ><-8> +< content daniel ><-8> +< creator corporatename address ><-8> +< la bande ><-8> +< jeux pour ><-8> +< s4 ><-8> +< s3 ><-8> +< tuin ><-8> +< content 01 ><-8> +< collective de ><-8> +< content bodybuilding ><-8> +< ces conduits ><-8> +< breast medecine medecine ><-8> +< auteurs et ><-8> +< alveoles qui ><-8> +< vous allez ><-8> +< revues journal journaux ><-8> +< composes de graisse ><-8> +< 3210 ><-8> +< personalname content ><-8> +< website ontwerp ><-8> +< afrique du sud ><-8> +< last minute ><-8> +< scanner resonance ><-8> +< domeinnaam huren ><-8> +< radiology mammographie ><-8> +< depeche mode ><-8> +< le cannet ><-8> +< gamme de produits ><-8> +< figurines ><-8> +< name desc content ><-8> +< large gamme de ><-8> +< nicolas ><-8> +< height ><-8> +< surface du mamelon ><-8> +< angles ><-8> +< dessinees dessinnees dessiner ><-8> +< les accessoires ><-8> +< sanguine ><-8> +< content top searches ><-8> +< puppy ><-8> +< secretent le lait ><-8> +< de television ><-8> +< casterman glenat l ><-8> +< noindex follow ma ><-8> +< cnbdi cbbd humanoides ><-8> +< wizard ><-8> +< un but ><-8> +< content marque ><-8> +< il y en ><-8> +< scanner resonance magnetique ><-8> +< telnet ><-8> +< content completed ><-8> +< qui forment ><-8> +< de soiree robes ><-8> +< follow ma cci ><-8> +< nf bienvenue dans ><-8> +< screening ><-8> +< political ><-8> +< macrobiopsie ><-8> +< rapports ><-8> +< description content blagues ><-8> +< histoires complets ><-8> +< author content christophe ><-8> +< jour les ><-8> +< content les seins ><-8> +< lait debouche sur ><-8> +< medicale medical ><-8> +< musculation ><-8> +< herge dupuis dargaud ><-8> +< completed ><-8> +< forum aux ><-8> +< zimbabwe ><-8> +< sulla ><-8> +< belge canada canadienne ><-8> +< photos de la ><-8> +< irm mri ><-8> +< blouse ><-8> +< net vous ><-8> +< femme mode ><-8> +< dc creator corporatename ><-8> +< 1 ns 1 ><-8> +< icra org ><-8> +< sont composes de ><-8> +< music video ><-8> +< et ne peuvent ><-8> +< gb http equiv ><-8> +< teenagers teens ><-8> +< imaging imagerie ><-8> +< violences ><-8> +< musiques actuelles ><-8> +< les textes du ><-8> +< tv tele ><-8> +< secretent le ><-8> +< de seine ><-8> +< content coeur ><-8> +< de maison ><-8> +< content angers ><-8> +< chez les jeunes ><-8> +< de grossesse ><-8> +< a c ><-8> +< illustrations figurent ><-8> +< produits de ><-8> +< des en ><-8> +< tolkien ><-8> +< nf name keywords ><-8> +< mangas etc ><-8> +< de glandes constituees ><-8> +< a z ><-8> +< poney equitation ><-8> +< american ><-8> +< offres ><-8> +< edition ><-8> +< ile ><-8> +< nature ><-8> +< r n 0 ><-8> +< magasin ><-8> +< anti ><-8> +< ringtones ><-8> +< cours ><-7> +< rock ><-7> +< kids ><-7> +< conseils ><-7> +< informatique ><-7> +< lol ><-7> +< programmation ><-7> +< villa ><-7> +< science fiction ><-7> +< martinique ><-7> +< driver ><-7> +< site officiel du ><-7> +< metty http equiv ><-7> +< fiches ><-7> +< esthetique ><-7> +< bibliotheque ><-7> +< mod ><-7> +< strong ><-7> +< weeks name dc ><-7> +< actors ><-7> +< de plus ><-7> +< genre ><-7> +< break ><-7> +< free mp3 ><-7> +< lettres ><-7> +< grands ><-7> +< specialise ><-7> +< noindex follow ><-7> +< cours de ><-7> +< estate ><-7> +< content 2002 01 ><-7> +< noarchive http ><-7> +< questions ><-7> +< 01 30 name ><-7> +< metty ><-7> +< turbo ><-7> +< publique ><-7> +< expositions ><-7> +< paintings ><-7> +< mp3 music ><-7> +< generator content metty ><-7> +< content eric ><-7> +< list name ><-7> +< babies ><-7> +< metty http ><-7> +< fr name rating ><-7> +< fr le site ><-7> +< modem ><-7> +< dans le monde ><-7> +< tracking ><-7> +< sejours ><-7> +< date created ><-7> +< polices ><-7> +< content metty http ><-7> +< une marque ><-7> +< entretien ><-7> +< list name dc ><-7> +< familie ><-7> +< bernard ><-7> +< officiel du ><-7> +< 01 dec ><-7> +< studies ><-7> +< travaux ><-7> +< dec 2001 gmt ><-7> +< en fr ><-7> +< utiles ><-7> +< lit ><-7> +< content metty ><-7> +< by the ><-7> +< justice ><-7> +< duration 0 ><-7> +< florence ><-7> +< expo ><-7> +< content en fr ><-7> +< weeks name distribution ><-7> +< type content hosting ><-7> +< mp3 divx ><-7> +< follow name publisher ><-7> +< gmt name dc ><-7> +< names ><-7> +< url content www ><-7> +< en europe ><-7> +< tue 01 dec ><-7> +< hosting list name ><-7> +< 01 30 ><-7> +< infographie ><-7> +< literature ><-7> +< gateway ><-7> +< alimentation ><-7> +< musique mp3 ><-7> +< 01 dec 2001 ><-7> +< terre ><-7> +< librairie ><-7> +< du de ><-7> +< ni 1 nr ><-7> +< hosting list ><-7> +< pantalon ><-7> +< content hosting list ><-7> +< top 50 ><-7> +< noarchive http equiv ><-7> +< 2002 01 ><-7> +< know ><-7> +< eine ><-7> +< blendtrans duration 0 ><-7> +< 2002 01 30 ><-7> +< identifier content 2 ><-7> +< egalement ><-7> +< espace ><-7> +< hip hop ><-7> +< s 0 ><-7> +< 0 v ><-7> +< 0 s ><-7> +< theatre ><-7> +< potter ><-7> +< sur ce ><-7> +< le havre ><-7> +< cheval ><-7> +< dc source content ><-7> +< evenements ><-7> +< gmt http ><-7> +< studios ><-7> +< concerts ><-7> +< la de ><-7> +< apres ><-7> +< course ><-7> +< harry ><-7> +< auteur ><-7> +< gmt http equiv ><-7> +< 40 ><-7> +< to content net ><-7> +< argus ><-7> +< serveur ><-7> +< after content 2 ><-7> +< dc language content ><-7> +< nz ><-7> +< gift ><-7> +< michael ><-7> +< name identifier content ><-7> +< classification content general ><-7> +< creator ><-7> +< cliparts ><-7> +< tennis ><-7> +< lyrics ><-7> +< rap ><-7> +< 0 v 0 ><-7> +< equiv window ><-7> +< equiv window target ><-7> +< http equiv window ><-7> +< et les ><-7> +< culture ><-7> +< sonneries ><-7> +< animation ><-7> +< pop ><-7> +< enfant ><-7> +< le monde ><-7> +< audio ><-7> +< name dc rights ><-7> +< dc rights ><-7> +< review ><-7> +< police ><-7> +< l r n ><-7> +< html l r ><-7> +< gb ><-7> +< annuaire moteur ><-7> +< havre ><-7> +< artists ><-7> +< street ><-7> +< site de la ><-7> +< bourse ><-7> +< mobiles ><-7> +< biographie ><-7> +< nl http ><-7> +< vue ><-7> +< gratuit histoire ><-7> +< textes ><-7> +< nl http equiv ><-7> +< content nl http ><-7> +< keywords content annonce ><-7> +< unix ><-7> +< nr ><-7> +< talk ><-7> +< library ><-7> +< tysami com name ><-7> +< content tysami com ><-7> +< local ><-7> +< museum ><-7> +< 29 ><-7> +< wanadoo ><-7> +< philippe ><-7> +< 1 welcome ><-7> +< lire ><-7> +< 8859 1 welcome ><-7> +< tysami com ><-7> +< food ><-7> +< content tysami ><-7> +< contre ><-7> +< 5 0 http ><-7> +< identifier content tysami ><-7> +< tysami ><-7> +< techno ><-7> +< placename ><-7> +< vendre ><-7> +< 1252 name author ><-7> +< by tysami ><-7> +< true comment rsaci ><-7> +< relation content ><-7> +< content tysami internet ><-7> +< modellen ><-7> +< portables ><-7> +< publisher content tysami ><-7> +< classification content internet ><-7> +< dc relation content ><-7> +< song ><-7> +< tysami internet name ><-7> +< communication ><-7> +< provider ><-7> +< 2002 by tysami ><-7> +< presentation ><-7> +< organisation ><-7> +< autour ><-7> +< cache name keywords ><-7> +< placename content ><-7> +< youth ><-7> +< en content ><-7> +< building ><-7> +< tysami internet ><-7> +< conte ><-7> +< author content tysami ><-7> +< musique ><-7> +< monde ><-7> +< a t ><-7> +< global name identifier ><-7> +< la musique ><-7> +< content 10 http ><-7> +< temps reel ><-7> +< argent gagner ><-7> +< morpheus ><-7> +< bateaux ><-7> +< moderne ><-7> +< spider ><-7> +< des services ><-7> +< telephones ><-7> +< copyright content club ><-7> +< chaque jour ><-7> +< ailleurs ><-7> +< manhattan ><-7> +< content in ><-7> +< networks ><-7> +< differents ><-7> +< rallye ><-7> +< hebdomadaire ><-7> +< demeure ><-7> +< postcard ><-7> +< les jeunes ><-7> +< around the world ><-7> +< edition name author ><-7> +< tableau ><-7> +< information name ><-7> +< content blague ><-7> +< teen chat ><-7> +< bains ><-7> +< bush ><-7> +< zodiac ><-7> +< goedkoop ><-7> +< internautes ><-7> +< jeux d ><-7> +< castellano ><-7> +< eure ><-7> +< garde ><-7> +< your source ><-7> +< official site ><-7> +< servicios ><-7> +< record ><-7> +< permanente ><-7> +< telephones portables ><-7> +< s adresse ><-7> +< aventures ><-7> +< contributors content ><-7> +< robert ><-7> +< the world s ><-7> +< competitions ><-7> +< content cd ><-7> +< contributors ><-7> +< france name dc ><-7> +< calais ><-7> +< content copywritten ><-7> +< electronic ><-7> +< rights content copywritten ><-7> +< de loisirs ><-7> +< jeux videos ><-7> +< lessons ><-7> +< discography ><-7> +< pas cher ><-7> +< de voyages ><-7> +< michelle gellar ><-7> +< eye ><-7> +< content copywritten work ><-7> +< crime ><-7> +< netscape ><-7> +< articles de ><-7> +< installation ><-7> +< application ><-7> +< description content galerie ><-7> +< paper ><-7> +< achat vente ><-7> +< canaux ><-7> +< personnages ><-7> +< de calais ><-7> +< copywritten ><-7> +< bezoekers ><-7> +< folk ><-7> +< content noarchive http ><-7> +< tm ><-7> +< plugin ><-7> +< herve ><-7> +< art and ><-7> +< van de ><-7> +< antivirus ><-7> +< pour rigoler ><-7> +< pas de calais ><-7> +< grand prix ><-7> +< debit ><-7> +< commande ><-7> +< content 7 i ><-7> +< catwalk ><-7> +< vitesse ><-7> +< chambres ><-7> +< keywords content jeux ><-7> +< audio video ><-7> +< charts ><-7> +< architecture ><-7> +< de tous les ><-7> +< voile ><-7> +< meubles ><-7> +< haut debit ><-7> +< episode ><-7> +< fabricant ><-7> +< regie ><-7> +< de discussion ><-7> +< island ><-7> +< man vrouw ><-7> +< 7 i ><-7> +< domaines ><-7> +< decouverte ><-7> +< rock pop ><-7> +< ecriture ><-7> +< mail e ><-7> +< asso ><-7> +< copywritten work ><-7> +< modern ><-7> +< bodybuilding ><-7> +< war ><-7> +< combs ><-7> +< listing ><-7> +< sur un ><-7> +< fils ><-7> +< 01 jan ><-7> +< collectibles ><-7> +< author content de ><-7> +< village ><-7> +< chasse ><-7> +< name keywords name ><-7> +< content moto ><-7> +< learn ><-7> +< ne 1 nr ><-7> +< mensen ><-7> +< webzine ><-7> +< ducati ><-7> +< lune ><-7> +< basic ><-7> +< apprendre ><-7> +< sarah michelle gellar ><-7> +< andere ><-7> +< 1 lz 1 ><-7> +< lz 1 ><-7> +< plans ><-7> +< album ><-7> +< hop ><-7> +< portable ><-7> +< 2002 by ><-7> +< john ><-7> +< hebergement ><-7> +< welcome to the ><-7> +< metal ><-7> +< uw ><-7> +< gestion ><-7> +< produit ><-7> +< fax ><-7> +< identifier content ><-7> +< guestbook ><-7> +< football soccer ><-7> +< work name coverage ><-7> +< sorciers ><-7> +< amis love ><-7> +< divertissant ><-7> +< suzanne ermann ><-7> +< internationales en name ><-7> +< youssouf kathar6 ><-7> +< prism ><-7> +< actuelles breton ><-7> +< 180 ><-7> +< genre philosophie psychologie ><-7> +< difficultes ><-7> +< de famille ><-7> +< site rencontrer l ><-7> +< counters website stats ><-7> +< editor natweb 1 ><-7> +< visibilita in rete ><-7> +< ou des ><-7> +< caution hip hop ><-7> +< tronchoscope ><-7> +< du sport ><-7> +< animaux convivialite ><-7> +< cantal ><-7> +< metissee ><-7> +< c 2000 2001 ><-7> +< residents ><-7> +< carmen miranda ><-7> +< de l internet ><-7> +< op deze en ><-7> +< sheet name ><-7> +< inedite retraite ><-7> +< iman flori ><-7> +< 1 union des ><-7> +< telecharger download ><-7> +< cineasie ><-7> +< lo strumento ideale ><-7> +< stellaire circonscrite ><-7> +< ambulancier jetable tyvek ><-7> +< content celebrities name ><-7> +< culotte balconnet ><-7> +< de para ><-7> +< nagravision ><-7> +< on 1999 11 ><-7> +< franquin etc ><-7> +< jeu jeux linge ><-7> +< classe copains ><-7> +< isps ><-7> +< 40 ans ><-7> +< ville d angers ><-7> +< 26 ans ><-7> +< lucille ><-7> +< asphalte ><-7> +< aidera ><-7> +< content asp ><-7> +< abc club ><-7> +< driver video ><-7> +< gratuit comique ><-7> +< feinte image ><-7> +< la grande ><-7> +< registratie sidn ><-7> +< official home ><-7> +< content ni putes ><-7> +< equipment service dog ><-7> +< casablanca marrakech ouarzazate ><-7> +< and foundation ><-7> +< pratiques tarifs ><-7> +< railing and ventilation ><-7> +< safari name reply ><-7> +< mesnil ><-7> +< meer dan 1000 ><-7> +< offrez vous ><-7> +< easy step by ><-7> +< dragon artist gallery ><-7> +< juridique ><-7> +< equestre ><-7> +< et offrez ><-7> +< wholesale ><-7> +< maquillage commande en ><-7> +< trial la ><-7> +< spacechemistry ><-7> +< creole ><-7> +< gerez ><-7> +< surveillance sessionwall ><-7> +< degeneres ><-7> +< pero sebastien http ><-7> +< driver download ><-7> +< conditions de travail ><-7> +< bain lingerie janine ><-7> +< respect valeur republique ><-7> +< mammotome ><-7> +< nt windows ><-7> +< for lacoccinelle ><-7> +< montres sport ou ><-7> +< nicolas tacquet name ><-7> +< festival musiques actuelles ><-7> +< televiseurs tv ><-7> +< step process ><-7> +< islami ><-7> +< promocion ><-7> +< commande en ligne ><-7> +< pistes ><-7> +< steiff ><-7> +< fr content expo ><-7> +< semi pros name ><-7> +< en op heel ><-7> +< solar spectrum ><-7> +< warren star ><-7> +< name owns content ><-7> +< boutique vente ><-7> +< interactieve ><-7> +< com printer ><-7> +< 1 prets ><-7> +< category content document ><-7> +< god jezus ><-7> +< programma verkoop cgi ><-7> +< images insolites galerie ><-7> +< she said ><-7> +< associatif associative 1901 ><-7> +< for fnac ><-7> +< communication opinion echange ><-7> +< tailles name ><-7> +< celine encre ><-7> +< fill ><-7> +< content auto ><-7> +< de photos enigmes ><-7> +< isere ><-7> +< embarrassment nouveau ><-7> +< title content interip ><-7> +< mougins mouginois mouans ><-7> +< page for apache ><-7> +< luxury kid ><-7> +< tourisme kassav fille ><-7> +< good boy name ><-7> +< infos sur ><-7> +< d esprit ><-7> +< kit webdesign sets ><-7> +< villegiature ><-7> +< 1999 2003 ><-7> +< 3410 3330 ><-7> +< numeriser transfert super ><-7> +< a grating ><-7> +< web surfing detection ><-7> +< papillon pomeranian west ><-7> +< dod ><-7> +< welke paginas ><-7> +< portal name keywords ><-7> +< mariage robes ><-7> +< aeronet webagency ><-7> +< spectacles de ><-7> +< ecoles ><-7> +< photos inedites ><-7> +< en345 image gant ><-7> +< bongenie ><-7> +< localement ><-7> +< stellaire circonscrite desorganisation ><-7> +< teen shops chat ><-7> +< translations along ><-7> +< collectif automobile ><-7> +< de warren de ><-7> +< milletvekili ><-7> +< des societes ><-7> +< content hip hop ><-7> +< whazzup budweiser ><-7> +< name language dear ><-7> +< w e ><-7> +< red hot chili ><-7> +< leidse regio ><-7> +< roman essai ><-7> +< bricolage videos ><-7> +< firewall security network ><-7> +< mais aussi et ><-7> +< telephone email ><-7> +< sonia name ><-7> +< stats website ><-7> +< sa discographie ><-7> +< com un ><-7> +< cesarienne ><-7> +< webmaster lo strumento ><-7> +< habit de bain ><-7> +< gratuit loterie ><-7> +< content q ><-7> +< webpagina s ><-7> +< com uk ><-7> +< content k ><-7> +< poneys ane ><-7> +< sentir ><-7> +< free url redirection ><-7> +< femmes rondes a ><-7> +< de chevaux ><-7> +< free support ><-7> +< sound driver ><-7> +< sortira ><-7> +< einem ><-7> +< trombinoscope ><-7> +< aran donegal ><-7> +< location vacances location ><-7> +< sonerie ><-7> +< web classement php ><-7> +< glasgow ><-7> +< and periodical ><-7> +< 2d ><-7> +< les femmes et ><-7> +< vente janine robin ><-7> +< rythme hebdomadaire comics ><-7> +< loved ><-7> +< 8859 1 webtropia ><-7> +< le cannet cannettan ><-7> +< chatroom teen ><-7> +< retriever labrador retriever ><-7> +< locoshop com ><-7> +< bike sport ><-7> +< grating complete with ><-7> +< de rajewicz fan ><-7> +< keywords content enseignement ><-7> +< photo page ><-7> +< content u paris10 ><-7> +< content goldenmarket goldenmarket ><-7> +< d avant amis ><-7> +< richesse ><-7> +< flevoland friesland ><-7> +< lottery gallery portfolio ><-7> +< hummingbird xdk 3d ><-7> +< flash game flash ><-7> +< break dance instructional ><-7> +< lifetime ><-7> +< butler ><-7> +< autographseek ><-7> +< af cavalier king ><-7> +< chen ><-7> +< lfp ><-7> +< equipment dog equipment ><-7> +< tester ><-7> +< delire avec des ><-7> +< gerald ><-7> +< ou comment modifier ><-7> +< dog obedience ><-7> +< content actricesdefrance org ><-7> +< transmusicales trans ><-7> +< content prenoms ><-7> +< dienstleistung forschung technik ><-7> +< manufacturer building materials ><-7> +< gosse beau ><-7> +< itchy ><-7> +< rythme de ><-7> +< 100 humour ><-7> +< webradio ><-7> +< panda prints ><-7> +< accessoires de bain ><-7> +< drente eindhoven ><-7> +< jan 2001 ><-7> +< heren dames ><-7> +< content blocco note ><-7> +< shopping trouver ><-7> +< de marque simone ><-7> +< officiel de resort ><-7> +< insolites galerie de ><-7> +< video audio ><-7> +< lauderbaugh name ><-7> +< content eng name ><-7> +< bd le magazine ><-7> +< spaniel ><-7> +< author content haplosciences ><-7> +< le rallye ><-7> +< des balises ><-7> +< son propre ><-7> +< dog equipment dog ><-7> +< gore cartes ><-7> +< weblog on the ><-7> +< abuse lan ><-7> +< commercieel site sites ><-7> +< peintre ><-7> +< point de vue ><-7> +< photo numerique appareil ><-7> +< mp3 samples ><-7> +< fixation cascade ><-7> +< sort son ><-7> +< bijoux montres bracelets ><-7> +< sherlock ><-7> +< robinet ><-7> +< cellulite ><-7> +< rom drivers ><-7> +< sujets de ><-7> +< resource online ><-7> +< content theleme theleme ><-7> +< monde chat engine ><-7> +< dan 1000 ><-7> +< homepage diouda ><-7> +< leidse regio noord ><-7> +< 79 windows ><-7> +< s a c ><-7> +< rencontre draveil juvisy ><-7> +< baladeur ><-7> +< classification content beaute ><-7> +< canvas ><-7> +< molinel ><-7> +< k9 k9 police ><-7> +< mace ><-7> +< jour un rythme ><-7> +< ressort ><-7> +< of self ><-7> +< en region ><-7> +< content yarn knitting ><-7> +< sonerie ringtone ><-7> +< breath of fresh ><-7> +< fencing and foundation ><-7> +< sailing ><-7> +< webcam astronomy ><-7> +< keywords content banque ><-7> +< automobile voiture ><-7> +< abstract content accro ><-7> +< security network monitor ><-7> +< and collectables ><-7> +< prenoms masculins name ><-7> +< chat chattes ><-7> +< stat ><-7> +< calm down ><-7> +< title content amateur ><-7> +< gli anime ><-7> +< 3d server solo ><-7> +< life counter strike ><-7> +< _top esc ><-7> +< boot disk ><-7> +< folklore ><-7> +< sonnerie logo ><-7> +< jeunesse ><-7> +< gif animes gratuits ><-7> +< l exigence de ><-7> +< danse art artistique ><-7> +< photoshop name ><-7> +< de catalogue conseils ><-7> +< vechtstreek gouda groningen ><-7> +< king charles spaniel ><-7> +< loi de ><-7> +< fiatavio itp turboprop ><-7> +< can easily ><-7> +< des passionnes de ><-7> +< annuaire lien bookmark ><-7> +< copyright content warren ><-7> +< sketches ><-7> +< greeting and ><-7> +< expose numeric ><-7> +< economie achat name ><-7> +< les coloris et ><-7> +< pacs ><-7> +< recycled one fine ><-7> +< et metissee black ><-7> +< mrwiggles biz ><-7> +< bath ><-7> +< maquinay name rating ><-7> +< temple ><-7> +< era ><-7> +< safari safari ><-7> +< anes name ><-7> +< ronde le specialiste ><-7> +< per maand ><-7> +< certainteed manufacturer ><-7> +< kabel ><-7> +< insan ><-7> +< 06150 06250 ><-7> +< presentation des ><-7> +< balconnet string bustier ><-7> +< boon danyboon ><-7> +< 03 i name ><-7> +< advice name description ><-7> +< mercerized rayon viscose ><-7> +< futurs parents ><-7> +< in all ><-7> +< forum et ><-7> +< international top model ><-7> +< d artistes et ><-7> +< hommes homme club ><-7> +< ergenekon mhp bayrak ><-7> +< cochon inde ><-7> +< politika siir aydin ><-7> +< de broderie ><-7> +< telephones mobiles mobiles ><-7> +< costumes forum ><-7> +< cache name mssmarttagspreventparsing ><-7> +< menschen ><-7> +< mode beaute ><-7> +< vitrine ><-7> +< all sonneries ><-7> +< and ventilation ><-7> +< hundeannoncer ><-7> +< shirt t shirt ><-7> +< yazarlar bozkurt ><-7> +< pictures forums ><-7> +< flight ><-7> +< quizz pour tester ><-7> +< portable telephones ><-7> +< line rapportages website ><-7> +< logiciels consommables et ><-7> +< content copyright 2000 ><-7> +< soothing menthol ><-7> +< coutumes ><-7> +< l comment rsaci ><-7> +< content copyright 2005 ><-7> +< mouans sartoux mouansois ><-7> +< description content accro ><-7> +< lu http ><-7> +< 2000 references name ><-7> +< locking poplocking ><-7> +< studio name keywords ><-7> +< de l du ><-7> +< description content montres ><-7> +< buffalo ><-7> +< chanteur name ><-7> +< maroc tradition traditions ><-7> +< 0 trial groupe ><-7> +< expose numeric argentic ><-7> +< jobs meteo ><-7> +< per i webmaster ><-7> +< marchander com ><-7> +< kyocera cameras ><-7> +< 3 0 le ><-7> +< nasser ><-7> +< eurodisney disneyland paris ><-7> +< 3suisse catalogue catalogues ><-7> +< formatter content microsoft ><-7> +< calming down top ><-7> +< forfait ><-7> +< refresh content 3suisses ><-7> +< sellers journal librairie ><-7> +< 8 19 mrwiggles ><-7> +< universite paris ><-7> +< customized web site ><-7> +< pratiques archives ><-7> +< merino mohair ><-7> +< identifie ><-7> +< zimbabwe name keywords ><-7> +< romancier nouvelles ><-7> +< snecma dailmer ><-7> +< personalized with chinese ><-7> +< officiels ><-7> +< tyvek molinel delta ><-7> +< hundehvalpe ><-7> +< esterel ><-7> +< calendar free lottery ><-7> +< telephones telephone mobile ><-7> +< mir ><-7> +< content vergleichen preis ><-7> +< usados ><-7> +< bain lingerie marque ><-7> +< description content 3suisses ><-7> +< verkoop chat ><-7> +< 1 au ><-7> +< bon genie ><-7> +< mobiles prix ><-7> +< 0500 ><-7> +< soigne ><-7> +< baladeur mp3 ><-7> +< module ><-7> +< les amoureux de ><-7> +< grandes tailles femmes ><-7> +< 2002 q ><-7> +< collectable ><-7> +< vous informe ><-7> +< top tips ><-7> +< et village ><-7> +< permanente les ><-7> +< dragons oriental art ><-7> +< 6 ammin youssouf ><-7> +< los servicios gratuitos ><-7> +< des conseils ><-7> +< community teen ><-7> +< specialises ><-7> +< no follow ><-7> +< alladvantage gratuit ><-7> +< turns ><-7> +< cyberlol com humour ><-7> +< cameras photography digital ><-7> +< fund ><-7> +< aqua ><-7> +< active server page ><-7> +< rigoler name robots ><-7> +< jefroux name author ><-7> +< tattoo artist tattoo ><-7> +< dienstleistung forschung ><-7> +< ontmoeten ontmoetingen spannend ><-7> +< pero sebastien ><-7> +< clips popping clips ><-7> +< les pubs ><-7> +< registrar ><-7> +< qualite ><-7> +< heren dames kinderen ><-7> +< dergisi ><-7> +< humor humorous ><-7> +< liberty access control ><-7> +< gratis dating sexy ><-7> +< lux ><-7> +< reba ><-7> +< gratos plan ><-7> +< visita foros de ><-7> +< sorties soirees ><-7> +< palmer s ><-7> +< safaris brunsperger voyage ><-7> +< shop galleries gifts ><-7> +< 26eme edition numero ><-7> +< irak ><-7> +< logos sonneries ><-7> +< de securite sont ><-7> +< after days ><-7> +< 3suisse ><-7> +< etions 19 passionnes ><-7> +< noces ><-7> +< title alternative content ><-7> +< angers mairie ><-7> +< nature histoire ><-7> +< langues cuisine ><-7> +< livres livre livre ><-7> +< de resort paris ><-7> +< l afrique du ><-7> +< montres classiques mais ><-7> +< litterature name ><-7> +< name dc last ><-7> +< blog de nc ><-7> +< graffiti alphabets breakdance ><-7> +< festival musiques ><-7> +< crepus ><-7> +< author content micrologiciel ><-7> +< personnel qui ><-7> +< interactieve interactief ><-7> +< frederik grue web ><-7> +< sous slip ><-7> +< epouse marie ><-7> +< gay lesbian homosexual ><-7> +< studio s tattoo ><-7> +< content date ><-7> +< a cette ><-7> +< haute visibilite pluie ><-7> +< de chien ><-7> +< femmes fortes ><-7> +< galerie expositions ><-7> +< paintings ink ><-7> +< content determiner le ><-7> +< content danse ><-7> +< lyrics name ><-7> +< asian dragons ><-7> +< content exposition ><-7> +< netstats ><-7> +< graffiti alphabets ><-7> +< relaties vriendschap bi ><-7> +< diyet ><-7> +< son nouvel ><-7> +< ouverte ><-7> +< collectables silver dragon ><-7> +< ouestu ><-7> +< shopping sports ><-7> +< all device types ><-7> +< toi emoi name ><-7> +< encore! ><-7> +< fr amazon ><-7> +< presspublisher net ><-7> +< virginal ><-7> +< realisations ><-7> +< femme cherche ><-7> +< 1252 castle ><-7> +< free lottery ><-7> +< ver 2 0 ><-7> +< drasan nitti ><-7> +< son nouveau ><-7> +< dealer ><-7> +< lecture lire lettres ><-7> +< lsf ><-7> +< hommes rencontre partenaire ><-7> +< pkk ><-7> +< darkroom ><-7> +< spor ><-7> +< sock lace vogue ><-7> +< pitre ><-7> +< pour moi ><-7> +< l espace professionnelbienvenue ><-7> +< union des centres ><-7> +< accent ><-7> +< software pics ><-7> +< lsd ><-7> +< oriental chinese japanese ><-7> +< volle ><-7> +< menthol ><-7> +< cite aire libre ><-7> +< french name resource ><-7> +< charset us ><-7> +< prevention de la ><-7> +< paris sites ><-7> +< contenus ><-7> +< des meres ><-7> +< pinar ><-7> +< captain jack ><-7> +< 2000 10 ><-7> +< mensen met ><-7> +< lancement a ne ><-7> +< content amateur spectroscopy ><-7> +< atlantic ><-7> +< forme de ><-7> +< 0 v 1 ><-7> +< gratuit top annonces ><-7> +< anime manga cartoni ><-7> +< goldenmarket fr photographe ><-7> +< delire le ><-7> +< dance instruction ><-7> +< an objective prism ><-7> +< son golf ><-7> +< handwerk ><-7> +< keywords content diouda ><-7> +< centres de ><-7> +< numericable fr ><-7> +< themes screensaver ><-7> +< cddb ><-7> +< hip hop history ><-7> +< et d actualite ><-7> +< compatibilites ><-7> +< banner banniere ><-7> +< ravage hom name ><-7> +< lang it content ><-7> +< fm carrickfergus the ><-7> +< mouans ><-7> +< genuwine hip hop ><-7> +< exercises ><-7> +< generic ><-7> +< producten! name ><-7> +< tunique ><-7> +< par ordinateur ><-7> +< 0 silver ><-7> +< expo photo accro ><-7> +< culture celine encre ><-7> +< de soins ><-7> +< et services http ><-7> +< of the movie ><-7> +< sport bijoux ><-7> +< vinyl siding vinyl ><-7> +< online com ><-7> +< gilles ><-7> +< ethnique cheveux frises ><-7> +< after name dc ><-7> +< cd dvd jeux ><-7> +< katharine hepburn ><-7> +< eenzaam adverteren ><-7> +< manufacturer roofing manufacturer ><-7> +< speciales ><-7> +< loubet del bayle ><-7> +< production http ><-7> +< gloria swanson ><-7> +< de defense ><-7> +< maillot deux pieces ><-7> +< content internet kisisel ><-7> +< postales francais ><-7> +< cheveux frises perruques ><-7> +< device driver ><-7> +< industriel ><-7> +< film reviews sites ><-7> +< photography digital imaging ><-7> +< i cartoni animati ><-7> +< 26eme edition ><-7> +< owns content andre ><-7> +< rigoler l univers ><-7> +< gratuites pour telephones ><-7> +< fille prenoms filles ><-7> +< rajewicz de brandebourg ><-7> +< qui veulent ><-7> +< gore comique ><-7> +< portrait lens film ><-7> +< roofing vinyl windows ><-7> +< 50 des ><-7> +< kyocera finecam finecam ><-7> +< filles en 2004 ><-7> +< ampli ><-7> +< aux nouvelles conditions ><-7> +< citoyen fraternite ><-7> +< 50 content dan ><-7> +< zonhumour com ><-7> +< lettres chercheur ><-7> +< cents fichiers remis ><-7> +< chien de ><-7> +< content directory ><-7> +< kodack ><-7> +< gratuit francophone ><-7> +< classiques mais ><-7> +< teen shopping ><-7> +< des musiques ><-7> +< escaliers ><-7> +< piercing cosmetics ><-7> +< black metisse name ><-7> +< 24x36 naked ><-7> +< height weight ><-7> +< keywords content horoscope ><-7> +< riddle ><-7> +< nature pictures nature ><-7> +< actuelles breton programmation ><-7> +< jongen meisje ><-7> +< content guilhot olivier ><-7> +< content welkom ><-7> +< sans pub ><-7> +< cannettan mandelieu ><-7> +< vriendschap bi homo ><-7> +< prelevement gadolinium iode ><-7> +< bezoeken uw ><-7> +< paris walt disney ><-7> +< keywords content mr ><-7> +< ink and watercolor ><-7> +< sous slip slips ><-7> +< accrophoto ><-7> +< content determiner ><-7> +< chroniques livres ><-7> +< citoyen echange colloque ><-7> +< plante ><-7> +< l alliance ><-7> +< difficult ><-7> +< string strings sous ><-7> +< q all sonneries ><-7> +< control network ><-7> +< dermablend ><-7> +< views ><-7> +< bourget ><-7> +< bourges ><-7> +< sujets de societe ><-7> +< camescope appareil ><-7> +< digital cameras finecam ><-7> +< internet kisisel ><-7> +< blouse tunique ><-7> +< rajewicz jet ><-7> +< sound drivers ><-7> +< espace professionnel nf ><-7> +< drivers dos ><-7> +< monastere ><-7> +< index certainteed ><-7> +< presspublisher net name ><-7> +< nanterre accueil ><-7> +< informatique langues ><-7> +< expositions conseils photo ><-7> +< gueguen ><-7> +< html name dc ><-7> +< feminismes ><-7> +< producer ><-7> +< lapin cochon ><-7> +< culture culturel accueil ><-7> +< chaussures lingerie lingerie ><-7> +< electric boogaloos ><-7> +< nuke 7 0 ><-7> +< michael dupont rigoler ><-7> +< beaute noire ><-7> +< keywords content dance ><-7> +< greta scacchi ><-7> +< and electric ><-7> +< booster son ><-7> +< inedites des sons ><-7> +< humax ><-7> +< expositions conseils ><-7> +< art wholesale ><-7> +< boutique creation ><-7> +< policier ><-7> +< adler ><-7> +< ke ><-7> +< manufacturer roofing ><-7> +< academy star ><-7> +< bayrak mp3 ><-7> +< uiterlijk ><-7> +< gynecologie senologie depistage ><-7> +< merino ><-7> +< the black ><-7> +< trans musicales transmusicales ><-7> +< bricolage bricolage ><-7> +< nfsite officiel ><-7> +< de professionnels ><-7> +< de mariee ><-7> +< horoscopes teen ><-7> +< coeur annonces ><-7> +< sante le ><-7> +< hot chili ><-7> +< de rajewicz mannequin ><-7> +< keywords content labrador ><-7> +< avant camarades ><-7> +< securite sont l ><-7> +< confirme ><-7> +< rexec xdm web ><-7> +< worlds dk name ><-7> +< projecteur ><-7> +< best mp3 ><-7> +< site francophone ><-7> +< amazon fr amazon ><-7> +< drivers modem drivers ><-7> +< hop resource online ><-7> +< professionnels et offrez ><-7> +< flori ><-7> +< mobilier ><-7> +< hard discount du ><-7> +< nouvelles normes ><-7> +< flore ><-7> +< advice teen advice ><-7> +< monitor intrusion detection ><-7> +< chartres chateauroux ><-7> +< un homme gratuit ><-7> +< bas collant chemise ><-7> +< logiciels name ><-7> +< kontakt darkroom gay ><-7> +< wallpaper mobiles prix ><-7> +< de bricolage ><-7> +< janine robin marque ><-7> +< destines ><-7> +< url free ><-7> +< video rock steady ><-7> +< grossesse sexualite ><-7> +< city news ><-7> +< phillips ><-7> +< sanitaire ><-7> +< bean ><-7> +< floyd ><-7> +< peres ><-7> +< gags sexy ><-7> +< server 3 ><-7> +< detection privacy violation ><-7> +< gratis scambio ><-7> +< garner ><-7> +< content revue de ><-7> +< pubdate ><-7> +< keywords content zouk ><-7> +< gratuits jeux ><-7> +< connor ><-7> +< content public http ><-7> +< cgi cgis formularios ><-7> +< dk worlds dk ><-7> +< poney poney ><-7> +< starten ><-7> +< asian dragons oriental ><-7> +< grossesse accouchement ><-7> +< teller voor ><-7> +< aeronet webagency lille ><-7> +< shops chat ><-7> +< fr quebec ><-7> +< 15 name keywords ><-7> +< luce ><-7> +< blink ><-7> +< s5 cameras photography ><-7> +< nitti name ><-7> +< bande univers ><-7> +< wholesale artwork ><-7> +< lequel on trouve ><-7> +< ile de la ><-7> +< aix linux ><-7> +< sexy surf ><-7> +< humour drole et ><-7> +< son cincroyable ><-7> +< watercolor ink dragon ><-7> +< visibilite pluie ><-7> +< toddler ><-7> +< content dany boon ><-7> +< tunisie tunis ><-7> +< wallpaper mobiles ><-7> +< anes name revisit ><-7> +< metamorfose ><-7> +< nitti name rating ><-7> +< set www warrenderajewicz ><-7> +< sein est ><-7> +< saddam ><-7> +< savoirs et textes ><-7> +< ru unknown identity ><-7> +< rating content arts ><-7> +< en content photo ><-7> +< porto ><-7> +< network s ><-7> +< etc driverguide ><-7> +< x windows xwindows ><-7> +< insulation roofing vinyl ><-7> +< servizi ><-7> +< coeur annonces rencontres ><-7> +< belles photos de ><-7> +< sites for teens ><-7> +< other useful features ><-7> +< coran ><-7> +< rencontre paris sites ><-7> +< rapportages ><-7> +< iode ><-7> +< des signes name ><-7> +< hosting hosting ><-7> +< lines spectrum objective ><-7> +< parlor tattoo ><-7> +< keywords content buffy ><-7> +< agression ><-7> +< de classe et ><-7> +< source content revues ><-7> +< 5 bienvenue ><-7> +< people finder ><-7> +< rencontre draveil ><-7> +< hit counters hit ><-7> +< image animaux ><-7> +< nylon culotte culottes ><-7> +< teenagers teens students ><-7> +< image gant blouse ><-7> +< art festival costumes ><-7> +< and scifi art ><-7> +< l a ><-7> +< webmaster amateur ><-7> +< page annuaire ><-7> +< gravhund miniature ><-7> +< hurlante name keywords ><-7> +< content sonnerie sonneries ><-7> +< chercheur novel ><-7> +< windows 1250 http ><-7> +< en content all ><-7> +< and file sharing ><-7> +< vragen duidelijke ><-7> +< content apple ><-7> +< du centre ><-7> +< mer de ><-7> +< collectibles collectables gallereis ><-7> +< mobile telephones ><-7> +< preferite ><-7> +< methodos savoirs et ><-7> +< sheikh ><-7> +< lopez harry ><-7> +< vente name robots ><-7> +< gratis aanmelden ><-7> +< shoulders ><-7> +< costumes forum explications ><-7> +< sex symbol aristocrate ><-7> +< banner scambio advert ><-7> +< beach linen pima ><-7> +< on 1997 ><-7> +< censure hentai ><-7> +< gagner economie achat ><-7> +< bleu liberte libre ><-7> +< gratuit humor jokes ><-7> +< safari name ><-7> +< dedicated to comics ><-7> +< teen opinions girls ><-7> +< artwork personalized art ><-7> +< toiture ><-7> +< keywords content karaoke ><-7> +< 3dimensions monde ><-7> +< japp whassup ><-7> +< annoncer kennel birkedal ><-7> +< bozkurt kurt insan ><-7> +< mangas etc toute ><-7> +< evacuation ><-7> +< birkedal og avl ><-7> +< mohamed dj ><-7> +< sets graphiques ><-7> +< noms de ><-7> +< hifi ><-7> +< programme tv name ><-7> +< 20040621 name date ><-7> +< numerique telephone dvd ><-7> +< history learn ><-7> +< eric name ><-7> +< verkoop cgi ><-7> +< abord anciens eleves ><-7> +< www warrenderajewicz com ><-7> +< sur fnac com ><-7> +< tourisme name ><-7> +< for sale ><-7> +< days karamba! ><-7> +< metissee black opal ><-7> +< rajewicz de ><-7> +< de mogelijkheid ><-7> +< ou montres ><-7> +< midi paroles wav ><-7> +< okacha abdelilah name ><-7> +< federation ><-7> +< mia farrow ><-7> +< suisses femme lingerie ><-7> +< artistique musique ><-7> +< rencontre partenaire rencontrer ><-7> +< filmo photo ><-7> +< chords ><-7> +< rajewicz fan club ><-7> +< consultez le top ><-7> +< television numerique ><-7> +< atelier ><-7> +< content le collectif ><-7> +< monitor driver ><-7> +< neuf et d ><-7> +< eleve ><-7> +< magnifique ><-7> +< fichiers remis jour ><-7> +< colloque ruban bleu ><-7> +< anglais cd ><-7> +< nog veel meer ><-7> +< boards uk ><-7> +< safaris ><-7> +< video drivers ><-7> +< your heroic search ><-7> +< sort son nouvel ><-7> +< vostre serie ><-7> +< rubrieken gratis ><-7> +< les photographes amateurs ><-7> +< direct cam cams ><-7> +< content 300 http ><-7> +< quotidiennement votre horoscope ><-7> +< remis jour un ><-7> +< jam ><-7> +< neu ><-7> +< an easy ><-7> +< bicycle racing ><-7> +< birkedal all ><-7> +< logo s ><-7> +< sites for ><-7> +< computer news ><-7> +< mobile telephone portable ><-7> +< deze en op ><-7> +< japp ><-7> +< en anglais cd ><-7> +< doherty holly ><-7> +< evenements assistance ><-7> +< delire com http ><-7> +< de st ><-7> +< tool tools ><-7> +< 4 2 ><-7> +< correspondance name ><-7> +< keywords content american ><-7> +< content photos des ><-7> +< achterhoek breda ><-7> +< description content certainteed ><-7> +< rare collectable ><-7> +< message board name ><-7> +< description content maillot ><-7> +< cards diddl enigmes ><-7> +< travail est ><-7> +< forts ><-7> +< gratuit asp banniere ><-7> +< network filtering network ><-7> +< americain musique ><-7> +< geocities r ><-7> +< lavabo ><-7> +< sexy dating afspreken ><-7> +< woo takeshi kitano ><-7> +< lire lettres chercheur ><-7> +< content paris10 fr ><-7> +< spectral ><-7> +< adapters windows ><-7> +< conax ><-7> +< content accro photo ><-7> +< katharine ><-7> +< itp turboprop turbo ><-7> +< infos pratiques tarifs ><-7> +< associations de ><-7> +< conan ><-7> +< wereld ><-7> +< en evolution permanente ><-7> +< utrecht eilanden ><-7> +< children s ><-7> +< peintures peinture equestres ><-7> +< head and shoulders ><-7> +< idees ><-7> +< internes ><-7> +< interesses ><-7> +< lunette casque accessoire ><-7> +< d ici ou ><-7> +< administration analysis ><-7> +< fanpage ><-7> +< fabricants et ><-7> +< en 2004 ><-7> +< nuit porte jartelle ><-7> +< forums de ><-7> +< mohair bulky chunky ><-7> +< semiologie ><-7> +< mysteres ><-7> +< ile vacances bronzage ><-7> +< imprimerie ><-7> +< garcons en ><-7> +< tout pour les ><-7> +< a driverguide ><-7> +< marchand shop ><-7> +< marchant name ><-7> +< sartoux mouansois ><-7> +< rajewicz mannequin homme ><-7> +< content danyboon ><-7> +< discussie ><-7> +< chicago artist ><-7> +< meisje jongen man ><-7> +< une section speciale ><-7> +< peluche grumly delires ><-7> +< dog equipment police ><-7> +< content asp name ><-7> +< scanner drivers cd ><-7> +< coquillages ><-7> +< public http equiv ><-7> +< bozkurt ><-7> +< certainteed manufacturer of ><-7> +< fnac fnac livres ><-7> +< modelagency ><-7> +< eleves trombinoscope copain ><-7> +< content litterature ><-7> +< mackenzie ><-7> +< promotions trucs astuces ><-7> +< roberts organic root ><-7> +< gavage ><-7> +< hot chili peppers ><-7> +< internet haut un ><-7> +< surf surfeur bad ><-7> +< contactzipcode content 75017 ><-7> +< resource online name ><-7> +< 06810 06210 06370 ><-7> +< chinese zodiac ><-7> +< steady crew and ><-7> +< hoeveel mensen ><-7> +< aux annuaires ><-7> +< cairn terrier ><-7> +< modial novita ><-7> +< associations de cannes ><-7> +< gmbh co kg ><-7> +< enseignement environnement ><-7> +< 1 arctura kinetic ><-7> +< name revision ><-7> +< perele chantelle ><-7> +< gateway unix sunos ><-7> +< scsi adapters sound ><-7> +< paintings dragon designs ><-7> +< toyota ><-7> +< devlet millet politika ><-7> +< content no accro ><-7> +< free mini bottle ><-7> +< dello ><-7> +< lila ><-7> +< association associatif associative ><-7> +< decouvrez son ><-7> +< griffiths ><-7> +< pattern fixation cascade ><-7> +< document bienvenue sur ><-7> +< enigmes devinettes blinkies ><-7> +< soneries ringtones ><-7> +< walt disney studios ><-7> +< hurlante name identifier ><-7> +< song songs ><-7> +< s best teen ><-7> +< le meilleur et ><-7> +< com internet ><-7> +< quizz pour ><-7> +< travail est en ><-7> +< cotte combinaison ><-7> +< des lesbiennes et ><-7> +< java html ><-7> +< chiens chats ><-7> +< milletvekilleri bozkurt ><-7> +< francais french ><-7> +< france cinema ><-7> +< napoule napoulois theoule ><-7> +< rajewicz name description ><-7> +< a cette page ><-7> +< haitian ><-7> +< poll ><-7> +< 2006 ><-7> +< terrier chihuahua ><-7> +< la beaute noire ><-7> +< textes url ><-7> +< painting logo ><-7> +< limpbizkit rollin ><-7> +< des amis d ><-7> +< virtual classroom ><-7> +< xwindows ><-7> +< our simple ><-7> +< organizasyon ><-7> +< online offres ><-7> +< anny blatt ><-7> +< fanart ><-7> +< dating teen ><-7> +< drawings original ><-7> +< sonorisation ><-7> +< semi pros ><-7> +< 9074 ><-7> +< kodack name ><-7> +< je homepage ><-7> +< and installing drivers ><-7> +< canary ><-7> +< montaigne duras angot ><-7> +< que des bonnes ><-7> +< way to ><-7> +< description content t ><-7> +< paris des dossiers ><-7> +< gratis gratos ><-7> +< dragon dragon ><-7> +< nfs ><-7> +< 1 v 4 ><-7> +< mandelocien pegomas la ><-7> +< mode femme magasin ><-7> +< alikes com ><-7> +< humidite ><-7> +< unknown identity ><-7> +< bd bouquin bouquins ><-7> +< belgie name description ><-7> +< rennes site ><-7> +< tekk nikkfurie ><-7> +< more full ><-7> +< mbo ><-7> +< eleveur ><-7> +< scolaire universite ><-7> +< calais france http ><-7> +< content revues name ><-7> +< aanmelden zoekmachines ><-7> +< professionals ><-7> +< mbk ><-7> +< body modification body ><-7> +< com you can ><-7> +< vt220 tn3270 ><-7> +< country music ><-7> +< driver modem driver ><-7> +< strings montres ><-7> +< stars and ><-7> +< solar spectrum spectroscope ><-7> +< interdiction ><-7> +< autographseek 011 default ><-7> +< ane ane anes ><-7> +< it s not ><-7> +< meteorology ><-7> +< vetement travail personnalise ><-7> +< keywords content marque ><-7> +< eindhoven flevoland ><-7> +< 1 histoire ><-7> +< teen chat room ><-7> +< de son petit ><-7> +< aerobics ><-7> +< calligraphy panda art ><-7> +< calligraphy spirit ><-7> +< branche ><-7> +< appel a ><-7> +< rencontres transmusicales festival ><-7> +< chaussures lingerie sexy ><-7> +< content microsoft name ><-7> +< generatorle site de ><-7> +< adsl adsl ><-7> +< signature ><-7> +< de ist ><-7> +< url short ><-7> +< lequel on ><-7> +< l name distribution ><-7> +< shows fashion ><-7> +< black opal iman ><-7> +< oriental watercolor ink ><-7> +< address content emoi ><-7> +< content okacha abdelilah ><-7> +< crowded house ><-7> +< sonneries soneries ringtones ><-7> +< turboprop turbo nfs ><-7> +< pour acheter ><-7> +< viscose needles bamboo ><-7> +< de couple pour ><-7> +< tape backup drivers ><-7> +< feminin horoscope ><-7> +< ken censura ><-7> +< working equipment ><-7> +< on trouve des ><-7> +< humourdunet ><-7> +< r 1 name ><-7> +< greeting cards fine ><-7> +< copains perdus ><-7> +< rire du ><-7> +< other useful ><-7> +< fr vivez au ><-7> +< infant ><-7> +< route des ><-7> +< islamic ><-7> +< koppeling ><-7> +< police dog equipment ><-7> +< consommation ><-7> +< producten! name robots ><-7> +< tv magnetoscope ><-7> +< la formation ><-7> +< building tools ><-7> +< ou des rencontres ><-7> +< sigle cartoons ><-7> +< content wed 01 ><-7> +< mois horoscope ><-7> +< les concours ><-7> +< secret de ><-7> +< pantalon blouson ><-7> +< graphiques camescope ><-7> +< kontakt afspraakjes ontmoeten ><-7> +< content formation ><-7> +< video jeu ><-7> +< ses son ><-7> +< en 2004 infobebes ><-7> +< portail sur ><-7> +< chaque jour plus ><-7> +< double knitting key ><-7> +< and fencing ><-7> +< afrique du nord ><-7> +< marocain traditions cuisine ><-7> +< bebek ><-7> +< en france de ><-7> +< obedience training equipment ><-7> +< telecharger logiciels petites ><-7> +< gerez gratuitement votre ><-7> +< jupe jeans ><-7> +< teenagers issues ><-7> +< rights content ipr ><-7> +< content news name ><-7> +< 50 name ><-7> +< soutenir ><-7> +< cheval cheval cheval ><-7> +< 06370 06580 ><-7> +< of warren de ><-7> +< preis und ><-7> +< officiel du festival ><-7> +< free hit ><-7> +< eclaircissant ><-7> +< content teen chat ><-7> +< cher avec ><-7> +< jeu flash ><-7> +< innovation seiko au ><-7> +< a breath ><-7> +< nicotine ><-7> +< webtropia ><-7> +< anes anes name ><-7> +< diouda le site ><-7> +< free horoscope horoscope ><-7> +< achat argent ><-7> +< de naissance ><-7> +< webvertisement commercieel ><-7> +< spectrum objective ><-7> +< dc coverage content ><-7> +< 1024x768 ><-7> +< la une ><-7> +< content women s ><-7> +< metteurs ><-7> +< 0 1 powered ><-7> +< qi ><-7> +< d avant camarades ><-7> +< homme anti rigolo ><-7> +< actricesdefrance org name ><-7> +< corpulentes larges ><-7> +< defrisants ><-7> +< magazine annuaire europe ><-7> +< cuisine marocaine ><-7> +< sonneries soneries ><-7> +< portables bureautique webcam ><-7> +< preferite di ><-7> +< asiatique new ><-7> +< 1 shoes paradise ><-7> +< oneself is ><-7> +< cs http ><-7> +< horoscope personnalise horoscope ><-7> +< generator content galerie ><-7> +< universite concours prix ><-7> +< foundation materials ><-7> +< site traffic analysis ><-7> +< brooks ><-7> +< ni soumises ><-7> +< cd singles buy ><-7> +< free gratuit gratis ><-7> +< coupons achats ><-7> +< counters website ><-7> +< com des sites ><-7> +< keywords content michael ><-7> +< instructional dance ><-7> +< detartrage ><-7> +< painting logo design ><-7> +< d europe ><-7> +< kennel birkedal og ><-7> +< wallpapers images ><-7> +< desktop wallpapers ><-7> +< keywords content personal ><-7> +< l ebusiness name ><-7> +< photo mariage photos ><-7> +< graphique cartes ><-7> +< filmo photo image ><-7> +< sulla censura ><-7> +< la pub est ><-7> +< jour mois ><-7> +< pomeranian west highland ><-7> +< counter free hit ><-7> +< photographies images peintures ><-7> +< actrice acteur ><-7> +< q all s ><-7> +< piece maillot deux ><-7> +< capirelax vente ><-7> +< guitar free ><-7> +< papas ><-7> +< safari safaris safaris ><-7> +< journal of ><-7> +< bozkurt ergenekon ><-7> +< com for fnac ><-7> +< yazarlar bozkurt ergenekon ><-7> +< habit de ><-7> +< content toute l ><-7> +< chicago artist drasan ><-7> +< noble sex symbol ><-7> +< teen advice teen ><-7> +< echange et ><-7> +< seiko au service ><-7> +< pour rigoler name ><-7> +< content natweb r ><-7> +< politique technique ><-7> +< brossard ><-7> +< celebrities name publisher ><-7> +< all in ><-7> +< seconds ><-7> +< ascendant free horoscope ><-7> +< sanat ><-7> +< c 2002 q ><-7> +< salvapantallas ><-7> +< webdesignbedrijf ><-7> +< poesies conte enfants ><-7> +< encre portail ><-7> +< le quotidien ><-7> +< dating afspreken meisje ><-7> +< sexueel relaties vriendschap ><-7> +< you can easily ><-7> +< magazines online teen ><-7> +< consider ><-7> +< avl af ><-7> +< d ivoire ><-7> +< hacking webcam ><-7> +< francophone des ><-7> +< keywords content berlin ><-7> +< name translations along ><-7> +< blog de ><-7> +< _top foro no ><-7> +< content nosland ><-7> +< ouest name author ><-7> +< 8859 1 wanadoo ><-7> +< classe copains perdus ><-7> +< kyosho ><-7> +< chinese calligraphy paintings ><-7> +< rigoler gratuit humor ><-7> +< de litterature ><-7> +< 06810 ><-7> +< step by ><-7> +< lb 1 oz ><-7> +< chinese watercolor ><-7> +< drivers cdrom drivers ><-7> +< content intel ><-7> +< pas une simple ><-7> +< tango ><-7> +< kassav ><-7> +< of drivers ><-7> +< annonces rencontres francophone ><-7> +< redirector ><-7> +< wiggles ><-7> +< postales francais france ><-7> +< histoire conte montaigne ><-7> +< expatriation ><-7> +< melodysoft com ><-7> +< nt windows 98 ><-7> +< content societe de ><-7> +< test jeux ><-7> +< sept cents fichiers ><-7> +< breakdance videos ><-7> +< jeux pour les ><-7> +< annuaire sur ><-7> +< 3410 3330 name ><-7> +< gaan ><-7> +< geller ><-7> +< ccd absorption ><-7> +< lucasfilm ><-7> +< men love sexy ><-7> +< linen pima ><-7> +< camera web classement ><-7> +< kodack name identifier ><-7> +< security snoop ><-7> +< photo photos photographe ><-7> +< 19 passionnes de ><-7> +< horloges la technologie ><-7> +< de 40 ><-7> +< alles over ><-7> +< namibie botswana zambie ><-7> +< vinyl windows manufacturer ><-7> +< ane ane ><-7> +< good boy ><-7> +< eenzaam dating ><-7> +< la lune mauve ><-7> +< accomodation ><-7> +< dating sexy dating ><-7> +< down calming ><-7> +< de robe robes ><-7> +< keywords content new ><-7> +< like usher ><-7> +< ferdinand discussion volume ><-7> +< true for accrophoto ><-7> +< ceci est un ><-7> +< ordinateurs portables ><-7> +< zoe ><-7> +< anglais cd dvd ><-7> +< polices fontes ><-7> +< wales ><-7> +< sept cents ><-7> +< cartes graphiques ><-7> +< dragons gift ><-7> +< silver dragon studios ><-7> +< teen problems ><-7> +< schumann http ><-7> +< goldenmarket fr ><-7> +< copyright 2001 e ><-7> +< encyclopedies ><-7> +< com has the ><-7> +< nikkfurie ><-7> +< owner content photo ><-7> +< mannequin homme mannequin ><-7> +< server for silverdragonstudio ><-7> +< content sonnerie ><-7> +< wildlife photography ><-7> +< game boy advance ><-7> +< ferdinand discussion ><-7> +< en nog veel ><-7> +< 3 3 cms ><-7> +< de maison canape ><-7> +< content pubs delire ><-7> +< page layout ><-7> +< suisse ch ><-7> +< vacances et de ><-7> +< maine ><-7> +< des videos name ><-7> +< daniel gueguen name ><-7> +< calming down ><-7> +< game jeux ><-7> +< photographie galerie expo ><-7> +< 26e rencontres trans ><-7> +< gratuis ><-7> +< dance instructional how ><-7> +< amis d des ><-7> +< ons ><-7> +< jan 1997 gmt ><-7> +< puedes ><-7> +< beauty kissable hair ><-7> +< acne ><-7> +< tattoo interviews ><-7> +< photo net r ><-7> +< javachat irc ><-7> +< content yarn ><-7> +< love sexy surf ><-7> +< magasin grandes ><-7> +< lune mauve de ><-7> +< 130 et un ><-7> +< content le de ><-7> +< sat 28 ><-7> +< privacy violation encryption ><-7> +< webvertisement ><-7> +< magasin fnac 24 ><-7> +< composite decking railing ><-7> +< gif gif ><-7> +< sahara fes ><-7> +< mon 30 may ><-7> +< ordenador en ><-7> +< enfance camarades ><-7> +< content okacha ><-7> +< graphique cartes graphiques ><-7> +< en voyage ><-7> +< s tattoo parlor ><-7> +< 31 mar ><-7> +< netstats website ><-7> +< automation ><-7> +< au rythme ><-7> +< mairie angers ville ><-7> +< froid ecusson ><-7> +< analyses ><-7> +< cascade king ><-7> +< all in one ><-7> +< server solo gateway ><-7> +< electronic postcards online ><-7> +< gallerie portfolio ><-7> +< foundation materials name ><-7> +< sound drivers mouse ><-7> +< de la chanson ><-7> +< online dog obedience ><-7> +< homme anti ><-7> +< sonerie soneries ringtone ><-7> +< detresse ><-7> +< mairie angers ><-7> +< louis brossard ><-7> +< minute de ><-7> +< products for new ><-7> +< citoyen echange ><-7> +< louis brossard beatrice ><-7> +< category content celebrities ><-7> +< webcams informatique disque ><-7> +< tones gratuit ><-7> +< bette midler ><-7> +< content editions du ><-7> +< volontariat ><-7> +< bottle refresh teenagers ><-7> +< printer drivers canon ><-7> +< vivez au ><-7> +< bibliographie ><-7> +< dysneyland tourisme ><-7> +< visitatori realmente ><-7> +< gelderland ><-7> +< 3suisses ><-7> +< stats name revisit ><-7> +< accessoires de securite ><-7> +< chinese dragon ><-7> +< beagle ><-7> +< les pubs tele ><-7> +< ceci est ><-7> +< yahoo! en ><-7> +< numerique cable acces ><-7> +< your name in ><-7> +< crowded house travel ><-7> +< true for moviegazette ><-7> +< thalassotherapie balneotherapie ><-7> +< abirnet sessionwall sessionwall ><-7> +< mouansois ><-7> +< network protection ><-7> +< pub est ><-7> +< installing ><-7> +< name reply content ><-7> +< visita formularios los ><-7> +< peluche grumly ><-7> +< zakelijk business ><-7> +< cascade king cole ><-7> +< une large gamme ><-7> +< loisirs la ><-7> +< a i ><-7> +< musical patrimoine region ><-7> +< dj fab ><-7> +< homepage free ><-7> +< content tim marchant ><-7> +< includes an ><-7> +< toepassingen applicaties ><-7> +< abou simbel ><-7> +< les professionnels ><-7> +< detection alert ><-7> +< metisse afro ><-7> +< en matiere ><-7> +< to peer ><-7> +< off road ><-7> +< with name ><-7> +< horoscope personnalise ><-7> +< musiques actuelles festival ><-7> +< de ist das ><-7> +< networks name description ><-7> +< titre traductions paroles ><-7> +< creatrice de ><-7> +< _top foro ><-7> +< grotte ><-7> +< content 75017 name ><-7> +< mohair annabel fox ><-7> +< parcs a ><-7> +< and community ><-7> +< perdus de ><-7> +< content vinz ><-7> +< 2 0 personal ><-7> +< nosland name ><-7> +< amis souvenirs ><-7> +< registration ><-7> +< of k9 police ><-7> +< balneaire pareo ><-7> +< randy lauderbaugh name ><-7> +< el mejor sistema ><-7> +< universe is a ><-7> +< musicales 2 ><-7> +< folder ><-7> +< norme cuisine ><-7> +< content manga manga ><-7> +< postcards online ><-7> +< freedom ><-7> +< votre site web ><-7> +< formularios los ><-7> +< encryption control liberty ><-7> +< nyheder ><-7> +< conseils pour ><-7> +< alternative content photographe ><-7> +< like michael ><-7> +< tattoo parlor ><-7> +< copyright content pero ><-7> +< 5 flash 6 ><-7> +< partout dans ><-7> +< og avl ><-7> +< house travel lodge ><-7> +< renard ><-7> +< polls teen opinions ><-7> +< gratuites gif ><-7> +< bulky chunky worsted ><-7> +< algeria ><-7> +< andre brunsperger ><-7> +< parisienne je ne ><-7> +< afspraakjes ontmoeten ontmoetingen ><-7> +< de toute ><-7> +< fun gore ><-7> +< reporting and ><-7> +< de choses a ><-7> +< van onze ><-7> +< du comique les ><-7> +< uk be ><-7> +< rires drole droles ><-7> +< matelas name ><-7> +< orangina japp ><-7> +< handicap prevention ><-7> +< sur 7 name ><-7> +< livre bandes ><-7> +< trans musicales 26eme ><-7> +< content haplosciences name ><-7> +< den bosch drechtsteden ><-7> +< informe sur l ><-7> +< knitting crochet wool ><-7> +< sons videos humour ><-7> +< sur un seul ><-7> +< fan website ><-7> +< filtering network scanning ><-7> +< boulogne billancourt boulogne ><-7> +< web numerosi ><-7> +< eumig kodak ><-7> +< melodies melodie melodies ><-7> +< cuisine bijoux ><-7> +< l etoile du ><-7> +< kreestal 2000 ><-7> +< ivg ><-7> +< movie trailer ><-7> +< webdesign freelance ><-7> +< wong kar wai ><-7> +< pour tester ><-7> +< parcs a themes ><-7> +< fernando ><-7> +< com nc ><-7> +< ligne pour ><-7> +< content veloxia ><-7> +< fun gore comique ><-7> +< print gallery personalized ><-7> +< bain articles de ><-7> +< mois annee ><-7> +< art gallery oriental ><-7> +< for surf traffic ><-7> +< frequentation ><-7> +< maquinay name ><-7> +< control liberty access ><-7> +< content sonneries soneries ><-7> +< telnet host explorer ><-7> +< village ! ><-7> +< sulle ><-7> +< kits de broderie ><-7> +< aviation ><-7> +< supercross bmx name ><-7> +< mouse ><-7> +< bill ryan people ><-7> +< description content oriental ><-7> +< domeinhosting ><-7> +< galeries galerie ><-7> +< dany danyboon net ><-7> +< nice ogcn ><-7> +< zoekertjes snuffel ><-7> +< shopping online ><-7> +< gallereis limited edition ><-7> +< de beaute les ><-7> +< fab mouloud ><-7> +< and shows ><-7> +< 8859 1 va ><-7> +< knowledge of ><-7> +< sex geen ><-7> +< defrisage cosmetique pour ><-7> +< interviews tattoo artist ><-7> +< nedstats nedstads ><-7> +< pros name abstract ><-7> +< et cassettes de ><-7> +< content je m ><-7> +< 2000 kennel ><-7> +< dragon drawing drawings ><-7> +< 8859 1 maillot ><-7> +< homme hommes enfant ><-7> +< cache pubs ><-7> +< 1 formula one ><-7> +< rire arire crigoler ><-7> +< soldano name ><-7> +< dictionnaires ><-7> +< genre pour rigoler ><-7> +< ontmoetingen spannend ><-7> +< guide net humourdunet ><-7> +< ringtones ring tone ><-7> +< keywords content vin ><-7> +< preschool ><-7> +< disney bienvenu e ><-7> +< horoscope cinema ><-7> +< la marque nfsite ><-7> +< name coxinelle ><-7> +< conseils personnalises ><-7> +< networks name ><-7> +< vauban ><-7> +< yourself or your ><-7> +< tee shirts ><-7> +< siagne mougins ><-7> +< valejo ><-7> +< et un internet ><-7> +< goldenmarket name dc ><-7> +< ! decouvrez ><-7> +< com printer drivers ><-7> +< 11 0800 ><-7> +< adverteren webvertisement commercieel ><-7> +< mer de balades ><-7> +< alphabets breakdance clips ><-7> +< for gazette co ><-7> +< aus dem ><-7> +< information sante ><-7> +< trans musicales rencontres ><-7> +< enfants parents ><-7> +< moto grand ><-7> +< 24 heures sur ><-7> +< pedagogique ><-7> +< rideaux matelas name ><-7> +< accro photo photography ><-7> +< monde du de ><-7> +< l univers de ><-7> +< generator content 79 ><-7> +< et quotidiennement votre ><-7> +< gueguen name robots ><-7> +< a calmer ><-7> +< ch at ><-7> +< les tissus les ><-7> +< proche de vous ><-7> +< galactographie mammotome imagerie ><-7> +< anes ><-7> +< content htm ><-7> +< recherches permanentes ><-7> +< content link ><-7> +< leukste links ><-7> +< et fils ><-7> +< faire son pain ><-7> +< created at ><-7> +< mrwiggles biz hompepage ><-7> +< bibliotheque bac granger ><-7> +< top tips for ><-7> +< inoltre tutto sulla ><-7> +< 50 4933 ><-7> +< linen ><-7> +< le site portail ><-7> +< description content cartes ><-7> +< religie religieus ><-7> +< tourisme education formation ><-7> +< and lovely ><-7> +< homme vacances ><-7> +< automobile des photos ><-7> +< gent brugge ><-7> +< la propria ><-7> +< limpbizkit ><-7> +< insolite recherche rire ><-7> +< academie d ><-7> +< gallery dragon drawing ><-7> +< des meilleures webcams ><-7> +< et metissee ><-7> +< visual page 2 ><-7> +< muller ><-7> +< content randy ><-7> +< de rajewicz jet ><-7> +< domain registration ><-7> +< artwork personalized ><-7> +< economie achat ><-7> +< with name in ><-7> +< hopkins ><-7> +< youssouf kathar6 webdesign ><-7> +< visiteurs visite ><-7> +< foro no encontrado ><-7> +< archipel ><-7> +< achats polices fontes ><-7> +< critique bibliotheque bac ><-7> +< comedies ><-7> +< theleme epistemon epistemon ><-7> +< author content stephane ><-7> +< cardio ><-7> +< les journalistes de ><-7> +< nude portrait lens ><-7> +< trans musicales ><-7> +< no abc ><-7> +< links give aways ><-7> +< finecam leaders in ><-7> +< de dany danyboon ><-7> +< charmel barbara ><-7> +< ameublement ><-7> +< violation encryption control ><-7> +< oneself is a ><-7> +< content document vierge ><-7> +< poney poneys poneys ><-7> +< consommables et jeux ><-7> +< chansons internationales ><-7> +< accro photo net ><-7> +< ontmoetingen ><-7> +< tchat e cards ><-7> +< l innovation seiko ><-7> +< voyance voyante auto ><-7> +< windows pvc ><-7> +< publier ><-7> +< aux jeunes ><-7> +< 3330 name keywords ><-7> +< accessoire ambulancier ><-7> +< site rencontre hommes ><-7> +< hundeannoncer annoncer ><-7> +< psychedelic ><-7> +< analyzer network administration ><-7> +< auxiliaire ><-7> +< archives des ><-7> +< card drivers mouse ><-7> +< discover the ><-7> +< insolites galerie ><-7> +< breton programmation ><-7> +< bien rubriques encore ><-7> +< traditions coutumes bijoux ><-7> +< noord limburg rivierenland ><-7> +< nosland ><-7> +< abstract content appel ><-7> +< equestre equestre equestres ><-7> +< pillou ><-7> +< remodeling name ><-7> +< sympath ><-7> +< equipment dog training ><-7> +< parc expo rennes ><-7> +< engine manufacturer ><-7> +< du site univers ><-7> +< vitrine pour tous ><-7> +< gratis dating ><-7> +< charmed alyssa ><-7> +< web abirnet ><-7> +< broad ><-7> +< art fnac ><-7> +< r n 1 ><-7> +< havre normandie ><-7> +< network abuse lan ><-7> +< namibie ><-7> +< und kaufen ><-7> +< painting dragons gift ><-7> +< bronzage ><-7> +< gifs animes images ><-7> +< feminine de ><-7> +< intranet intranet ><-7> +< timeline name author ><-7> +< rollin ><-7> +< la mort ><-7> +< schutzhund training schutzhund ><-7> +< favourite ><-7> +< give aways ><-7> +< commercieel realiseren ><-7> +< transfert super super8 ><-7> +< pictures images photos ><-7> +< windows 95 ><-7> +< bbc ><-7> +< prenoms prenoms feminins ><-7> +< motivation ><-7> +< channel dating ><-7> +< belgie vlaanderen ><-7> +< supplies chinese ><-7> +< breakdance ><-7> +< region parisienne je ><-7> +< nageur brassiere ><-7> +< bresilien habit ><-7> +< ablague ><-7> +< paginas bekijken ze ><-7> +< silverdragonstudio com on ><-7> +< music musique ><-7> +< katie holmes ><-7> +< melodysoft ><-7> +< bain articles ><-7> +< lettres education ><-7> +< toute une gamme ><-7> +< siagne ><-7> +< usine ><-7> +< en 2004 name ><-7> +< composite decking ><-7> +< tanzanie ><-7> +< defrisants catalogue ><-7> +< courants ><-7> +< cyberlol ><-7> +< general name identifie ><-7> +< eng name dc ><-7> +< dragon gifts and ><-7> +< dreamweaver name formatter ><-7> +< empresas ><-7> +< content 07 ><-7> +< dog equipment working ><-7> +< maison construire ><-7> +< coucher ><-7> +< terrain ><-7> +< philosophie psychologie oeuvres ><-7> +< girl videos ><-7> +< alessio soldano ><-7> +< sebastien http ><-7> +< bain lingerie fine ><-7> +< drums ><-7> +< animes images insolites ><-7> +< sessionwall 3 monitoring ><-7> +< s5 ><-7> +< live webcams ><-7> +< card with ><-7> +< keywords content aanmelden ><-7> +< 91 fra1904 ><-7> +< cancer gynecologie senologie ><-7> +< content du super ><-7> +< partenaire francais voyages ><-7> +< millet politika ><-7> +< celine encre portail ><-7> +< zimbabwe name ><-7> +< literie ><-7> +< and custom designs ><-7> +< abdelilah name ><-7> +< k9 training ><-7> +< searchengine name robots ><-7> +< differentes ><-7> +< ch http ><-7> +< are you looking ><-7> +< boutiques en ligne ><-7> +< for teenager ><-7> +< sc ><-7> +< mcd i name ><-7> +< content globetrotter ><-7> +< maillot 1 piece ><-7> +< sg ><-7> +< horoscopes teen links ><-7> +< des dossiers du ><-7> +< hope s ><-7> +< ouestu accueil ><-7> +< vous a ><-7> +< cheval des ><-7> +< vente de grandes ><-7> +< active server ><-7> +< les amoureux ><-7> +< shop collectibles collectables ><-7> +< c 2003 one ><-7> +< chat babbel database ><-7> +< et les autres ><-7> +< egalite ><-7> +< cool orangina japp ><-7> +< in italia ><-7> +< silverdragonstudio com ><-7> +< regionaal ><-7> +< numeric ><-7> +< hammamet ><-7> +< defrisage ><-7> +< guingamp ><-7> +< coupons achats polices ><-7> +< la galerie de ><-7> +< vous trouverez toutes ><-7> +< eumig ><-7> +< christophe loubet del ><-7> +< content abc ><-7> +< fr content universite ><-7> +< good name ><-7> +< journalier horoscope ><-7> +< tissus les ><-7> +< set graphique ><-7> +< academie de ><-7> +< content b2evolution ><-7> +< yyyymmdd content 20040621 ><-7> +< luik brussel ><-7> +< hip hop asphalte ><-7> +< candy store ><-7> +< designer dk ><-7> +< weblog on ><-7> +< forums chats ><-7> +< encryption control ><-7> +< aventures et ><-7> +< de construction ><-7> +< drivers sound ><-7> +< de rajewicz homme ><-7> +< incarnes ethnique cheveux ><-7> +< l academie de ><-7> +< aube ><-7> +< 1 shoes ><-7> +< studio video ><-7> +< les infos ><-7> +< portales de ><-7> +< ane ane ane ><-7> +< du rire ><-7> +< and note cards ><-7> +< zenith ><-7> +< content melodysoft ><-7> +< cuir en345 ><-7> +< genie ><-7> +< content dreamweaver name ><-7> +< internet name classification ><-7> +< securite chaussure ><-7> +< rap mp3 ><-7> +< bas debit ><-7> +< kutusu ><-7> +< chevaux poney ><-7> +< emergence ><-7> +< content disney paris ><-7> +< equestre equestre ><-7> +< with your name ><-7> +< keywords content scambio ><-7> +< hi tekk nikkfurie ><-7> +< foros libros ><-7> +< horoscope by ><-7> +< plantes ><-7> +< true for theleme ><-7> +< bootleg ><-7> +< de ses parcs ><-7> +< okacha abdelilah ><-7> +< publisher content pero ><-7> +< mystere ><-7> +< content 20040621 ><-7> +< essonne nature ><-7> +< et top ><-7> +< apo asker resim ><-7> +< indexation ><-7> +< dandruff shampoo head ><-7> +< sport programme ><-7> +< 138 bourget ><-7> +< bezoekers pageviews tellen ><-7> +< creation web ><-7> +< en continue ><-7> +< personalized dragon prints ><-7> +< juergen ><-7> +< humour com des ><-7> +< du sein est ><-7> +< content blocco ><-7> +< allez pouvoir y ><-7> +< essonne nature rencontre ><-7> +< strings sous ><-7> +< content pub publicites ><-7> +< source url ><-7> +< nedstat basic teller ><-7> +< vrouw sexueel relaties ><-7> +< un portail sur ><-7> +< kostenloses ><-7> +< censura censura censure ><-7> +< andie ><-7> +< news! name keywords ><-7> +< bain maillots ><-7> +< blinkies didll services ><-7> +< bouquins guide ><-7> +< entrez dans le ><-7> +< decran ><-7> +< de lancement ><-7> +< k9 police equipment ><-7> +< bain maillots de ><-7> +< crew and electric ><-7> +< hommage franquin ><-7> +< channel dating contact ><-7> +< de control ><-7> +< 3dfx voodoo ><-7> +< anti chute haute ><-7> +< dossiers bande dessinee ><-7> +< balneotherapie thermalisme ><-7> +< postcards name description ><-7> +< customs ><-7> +< copains d abord ><-7> +< l comment ><-7> +< dvd pull ><-7> +< moviegazette ><-7> +< students webchat message ><-7> +< sessionwall sessionwall 3 ><-7> +< ans 26eme ><-7> +< bureaux ><-7> +< portables bureautique ><-7> +< mac os ><-7> +< psg ><-7> +< lace vogue ><-7> +< site unique des ><-7> +< examen savoir ecrivain ><-7> +< com 2 ><-7> +< cams camera web ><-7> +< finecam leaders ><-7> +< classic and ><-7> +< barty ><-7> +< feminin horoscope cinema ><-7> +< cinema video ><-7> +< photo image interview ><-7> +< contraste opacite ><-7> +< psy ><-7> +< sonneries sonerie soneries ><-7> +< melodie melodies mp3 ><-7> +< deux pieces ><-7> +< la promotion ><-7> +< pictures tattoo ><-7> +< mode hiver ><-7> +< son univers ><-7> +< produkt dienstleistung ><-7> +< serie z ><-7> +< jours sur ><-7> +< podium ><-7> +< lyrics mp3 ><-7> +< keywords content auto ><-7> +< 8859 1 prets ><-7> +< vt200 ><-7> +< stellar and ><-7> +< anny ><-7> +< tradition tourisme ><-7> +< rocket roket ><-7> +< usados en castellano ><-7> +< digital revolution ><-7> +< wiggles best breakdance ><-7> +< les coloris ><-7> +< montee du ><-7> +< content michael dupont ><-7> +< movies movie ><-7> +< de pagina ><-7> +< itchy itchy scalp ><-7> +< spielwaren spielzeug ><-7> +< dessinees bd bd ><-7> +< uni name ><-7> +< modellenbureau modellenburo ><-7> +< content interip ><-7> +< watercolor paintings ><-7> +< metro chicago ><-7> +< censura censure hentai ><-7> +< pictures tattoo images ><-7> +< monitoring security snoop ><-7> +< dvd logiciels consommables ><-7> +< manufacturer insulation ><-7> +< afrique safari ><-7> +< for professional ><-7> +< soneries ringtone ><-7> +< alfa ><-7> +< metalliques ><-7> +< de pages ><-7> +< travailleuses ><-7> +< accrophoto net ><-7> +< content trans musicales ><-7> +< horoscope horoscope amour ><-7> +< realmente interessati name ><-7> +< sexualite prevention ><-7> +< page building tools ><-7> +< gorges bas nylon ><-7> +< advertenties zoekertjes snuffel ><-7> +< with aftercare ><-7> +< for geocities ><-7> +< photography digital cameras ><-7> +< cheval poney equitation ><-7> +< organizational ><-7> +< forums et ><-7> +< parents et ><-7> +< ! decouvrez son ><-7> +< supercross bmx ><-7> +< tus ><-7> +< arbres ><-7> +< buell ><-7> +< ibm lotus ><-7> +< spectra solar ><-7> +< 1 name microsoft ><-7> +< les trans rencontres ><-7> +< interfaces ><-7> +< with aftercare and ><-7> +< pour rigoler l ><-7> +< banner effectief chat ><-7> +< fr content femmes ><-7> +< quinlan ><-7> +< prism name ><-7> +< power e ><-7> +< name coxinelle ><-7> +< guitar tabs ><-7> +< lettres education poesies ><-7> +< ados ado jeunes ><-7> +< content fantasy art ><-7> +< voordelig ><-7> +< for teens meet ><-7> +< body piercing tribal ><-7> +< _top interip networks ><-7> +< transition 11 name ><-7> +< sexy dating ><-7> +< tv music ><-7> +< do brasil ><-7> +< 1 katz goldt ><-7> +< streisand ><-7> +< bande dessinees dessinnees ><-7> +< drente eindhoven flevoland ><-7> +< detection privacy ><-7> +< xbox live ><-7> +< super8 ><-7> +< goedkoopste ><-7> +< les dvd ><-7> +< topic content rencontres ><-7> +< deelnemer ><-7> +< immagini sigle ><-7> +< letras ><-7> +< hundehvalpe hunde hvalpe ><-7> +< pub pubs grumly ><-7> +< sur le monde ><-7> +< theme content clearday ><-7> +< annuaire des meilleures ><-7> +< hans ><-7> +< musicale dans ><-7> +< tape backup ><-7> +< cck mcd i ><-7> +< charte citoyen ><-7> +< fiction the ><-7> +< mannequin international ><-7> +< privacy violation ><-7> +< cameras photography ><-7> +< instructional dance videos ><-7> +< habitation ><-7> +< bezoekcijfers webpagina ><-7> +< glbt ><-7> +< art with ><-7> +< driver cdrom driver ><-7> +< le web des ><-7> +< verschiedene ><-7> +< teen polls ><-7> +< content mannen ><-7> +< paroles chansons ><-7> +< en 2004 top ><-7> +< chinese astrology ><-7> +< bezoekcijfers ><-7> +< rock steady ><-7> +< de visita foros ><-7> +< description content commandez ><-7> +< hebdomadaire comics ><-7> +< est souvent ><-7> +< boulogne photo boulogne ><-7> +< ecologie couples ><-7> +< droits reserves 1999 ><-7> +< the beats ><-7> +< locking ><-7> +< child children ><-7> +< content foros de ><-7> +< report surveillance ><-7> +< en ronde lille ><-7> +< creez et ><-7> +< and horoscope by ><-7> +< author content equipe ><-7> +< spacechemistry stars ><-7> +< oriental dragon ><-7> +< kinderen achterhoek ><-7> +< barbra ><-7> +< sociologie ><-7> +< publisher content vrp ><-7> +< half life counter ><-7> +< kr welcome ><-7> +< simmons ><-7> +< content drivers ><-7> +< con el ><-7> +< drivers video ><-7> +< theleme epistemon ><-7> +< beauty care beauty ><-7> +< easy step ><-7> +< ossia i cartoni ><-7> +< professionnels de ><-7> +< alphabets ><-7> +< dragon art ><-7> +< relation url content ><-7> +< des affaires au ><-7> +< url revues ><-7> +< gant blouse tunique ><-7> +< plus de 500 ><-7> +< created content 2004 ><-7> +< melodysoft recursos ><-7> +< internationale avec ><-7> +< baranger ><-7> +< wanadoo cable ><-7> +< rhin ><-7> +< 1 a ><-7> +< asp webhosting ><-7> +< la gloire ><-7> +< 1 d ><-7> +< numerique cable ><-7> +< soundcard drivers video ><-7> +< lovely defrisants ><-7> +< antilles zouk love ><-7> +< 1 s ><-7> +< radius 011 default ><-7> +< corriges ><-7> +< animal chat ><-7> +< ours grumly peluche ><-7> +< description content suivez ><-7> +< mesure de ><-7> +< bibliotheque bac ><-7> +< html banner ><-7> +< bonne histoire inedite ><-7> +< de strategie ><-7> +< sound card ><-7> +< auxerre ><-7> +< 9 0 11 ><-7> +< numerique telephone ><-7> +< author content presspublisher ><-7> +< amis de correspondance ><-7> +< culturel accueil ><-7> +< rights content pero ><-7> +< bijoux bracelets ><-7> +< magazines online ><-7> +< popping clips ><-7> +< driver device ><-7> +< silver dragon art ><-7> +< tekk nikkfurie ahmed ><-7> +< interactief toepassingen ><-7> +< silver dragon ><-7> +< francophone femme cherche ><-7> +< emploi themes screensaver ><-7> +< bresilien habit de ><-7> +< horoscope amour ><-7> +< telnet host ><-7> +< content ni bi ><-7> +< heures sur ><-7> +< modes ><-7> +< rire name ><-7> +< keywords content nc ><-7> +< art supplies ><-7> +< peugeot ><-7> +< you looking for ><-7> +< septentrion name ><-7> +< publications ><-7> +< bilardo ><-7> +< marrakech ouarzazate sahara ><-7> +< services pratiques programme ><-7> +< are your ><-7> +< vous les ><-7> +< l humanite ><-7> +< content aux annuaires ><-7> +< uw domeinnaam ><-7> +< telecharger logiciels ><-7> +< duras ><-7> +< ringtone gratuite name ><-7> +< alikes ><-7> +< lit et luminaires ><-7> +< des interpretes en ><-7> +< network protection firewall ><-7> +< fixation ><-7> +< pour tester votre ><-7> +< maquillage pour ><-7> +< chanteurs chanteuses ><-7> +< description content appel ><-7> +< speciale sur ><-7> +< par des passionnes ><-7> +< fra1904 paris rencontre ><-7> +< animaux animal chat ><-7> +< but de mon ><-7> +< montee ><-7> +< message boards javachat ><-7> +< agrees ><-7> +< dc rating content ><-7> +< la forme ><-7> +< for movie ><-7> +< i o ><-7> +< mp3 online ><-7> +< content goldenmarket ><-7> +< tattoo images ><-7> +< content numeriser transfert ><-7> +< cartier ><-7> +< tattoo pictures ><-7> +< aventure name keywords ><-7> +< e per i ><-7> +< breakdance tips ><-7> +< son nouvel album ><-7> +< postes ><-7> +< free email and ><-7> +< sri ><-7> +< cinema jeu ><-7> +< cultuel politique ><-7> +< a grating spectrograph ><-7> +< anime videos filmati ><-7> +< n roll ><-7> +< music pop ><-7> +< pouvoir y ><-7> +< for co uk ><-7> +< letras de canciones ><-7> +< chiennes de ><-7> +< village ! decouvrez ><-7> +< et acheter ><-7> +< engine manufacturer specific ><-7> +< wazzaa ><-7> +< tonos ><-7> +< 2000 name language ><-7> +< feminine janine ><-7> +< bezoeken uw welke ><-7> +< informatique disque dur ><-7> +< s3 finecam ><-7> +< s largest collection ><-7> +< poney poney poneys ><-7> +< content maillot ><-7> +< sports musculation ><-7> +< internet access ><-7> +< fr content fr ><-7> +< une gamme ><-7> +< osmanli devlet millet ><-7> +< hub ><-7> +< peau noire noire ><-7> +< 2pac tupac ><-7> +< choses a ><-7> +< content daniel gueguen ><-7> +< hetero sm ><-7> +< page vous allez ><-7> +< peinture equestres equestre ><-7> +< hui ><-7> +< abord anciens ><-7> +< 47 ><-7> +< unique des ><-7> +< josephine ><-7> +< sport ou ><-7> +< actricesdefrance ><-7> +< soutien gorge slip ><-7> +< le nom ><-7> +< accreditation en ><-7> +< nouveau secret de ><-7> +< siding ><-7> +< maquinay homme ><-7> +< over 100 000 ><-7> +< network adapters ><-7> +< plans gratos plan ><-7> +< hundekennel ><-7> +< karite palmer ><-7> +< loisirs animation ><-7> +< prism and reflective ><-7> +< ryan people ><-7> +< electric boogaloos http ><-7> +< rajewicz comte ><-7> +< supply schutzhund dog ><-7> +< content get a ><-7> +< protection dandruff shampoo ><-7> +< to look ><-7> +< rythme hebdomadaire ><-7> +< artisan ><-7> +< nouveau secret ><-7> +< author content vinz ><-7> +< afspraakjes ><-7> +< cites ><-7> +< toepassingen applicaties programma ><-7> +< officiel de warren ><-7> +< and fencing and ><-7> +< la lecture l ><-7> +< manufacturer specific discussion ><-7> +< photo boulogne photos ><-7> +< basketbol ><-7> +< let me ><-7> +< recherche rire arire ><-7> +< art pictures and ><-7> +< preis billig ><-7> +< gratuit horoscope ascendant ><-7> +< reflexion jeux ><-7> +< radio des services ><-7> +< roadster ><-7> +< photo mariage ><-7> +< vogue choix des ><-7> +< and their spectra ><-7> +< release dates ><-7> +< fr content aeronet ><-7> +< angeles lapd ><-7> +< des sons ><-7> +< tyvek molinel ><-7> +< dc last ><-7> +< drechtsteden drente ><-7> +< bande sur internet ><-7> +< comique gags sexy ><-7> +< el mayor ><-7> +< birkedal ><-7> +< content _top foro ><-7> +< com you ><-7> +< john woo ><-7> +< futon ><-7> +< alpes maritimes 06 ><-7> +< tarjeta de ><-7> +< friesland gooi ><-7> +< afspreken meisje ><-7> +< and reflective ><-7> +< arire crigoler ><-7> +< barbot name ><-7> +< amis photos de ><-7> +< ringtone ringtones ring ><-7> +< cannettan ><-7> +< hom name keywords ><-7> +< cartoni animati giapponesi ><-7> +< 1997 gmt http ><-7> +< l alcool ><-7> +< particulier domein ><-7> +< eenvoudig beheer ><-7> +< iso8601 ><-7> +< musician ><-7> +< sport velo volley ><-7> +< emoi com ><-7> +< afrique safari name ><-7> +< obedience training ><-7> +< content 2003 supercross ><-7> +< valette ><-7> +< market leading ><-7> +< ringtones logo ><-7> +< completed name doc ><-7> +< linen pima mercerized ><-7> +< but de ><-7> +< content cinema asiatique ><-7> +< voyance tarot ><-7> +< suzanne ermann paris ><-7> +< scifi art ><-7> +< fable romancier ><-7> +< s3 finecam s4 ><-7> +< passionnes de voyages ><-7> +< burners ><-7> +< numeriser transfert ><-7> +< refresh content dvdrama ><-7> +< content www les3epices ><-7> +< preis und kaufen ><-7> +< golf et ><-7> +< seiko montres hommes ><-7> +< insolites blinkies ><-7> +< bekijken ze het ><-7> +< thalassotherapie balneotherapie thermalisme ><-7> +< tuner ><-7> +< bali ><-7> +< cartoni animati immagini ><-7> +< de catalogue vente ><-7> +< wed 01 jan ><-7> +< bale ><-7> +< boreanaz ><-7> +< worsted double knitting ><-7> +< annuaire repertoire ><-7> +< links to other ><-7> +< horoscope fr horoscope ><-7> +< occasion ou ><-7> +< art posters prints ><-7> +< edition prints ><-7> +< dc generator content ><-7> +< paiement en ><-7> +< bookmark signet guide ><-7> +< sk name ><-7> +< beautiful hair beauty ><-7> +< reference top actualisateur ><-7> +< prototype ><-7> +< security network ><-7> +< several ><-7> +< iode contraste ><-7> +< hurlante hi ><-7> +< transmusicales trans les ><-7> +< les cartes ><-7> +< baladeurs mp3 dvd ><-7> +< asp banniere ><-7> +< date regio regionaal ><-7> +< love aimer ><-7> +< sur internet ! ><-7> +< programmation infos ><-7> +< coin ><-7> +< content foros ><-7> +< enseignement de ><-7> +< soiree robe de ><-7> +< travail du ><-7> +< snecma dailmer fiatavio ><-7> +< service du temps ><-7> +< chunky modial novita ><-7> +< blague humours ><-7> +< eumig kodack ><-7> +< shoulders itchy itchy ><-7> +< chihuahua name keywords ><-7> +< riviera paca provence ><-7> +< co kg ><-7> +< mathieu ><-7> +< cinema home ><-7> +< salon forum ><-7> +< ssilicon silicon fr ><-7> +< plus complet ><-7> +< des associations de ><-7> +< des fans ><-7> +< st pierre de ><-7> +< vente une large ><-7> +< maillots janine ><-7> +< educational ><-7> +< 06110 ><-7> +< alpha ><-7> +< concerts groupes ><-7> +< ici ou d ><-7> +< dv eumig ><-7> +< 1 interdiction ><-7> +< camescope appareil photo ><-7> +< helping ><-7> +< qui est la ><-7> +< la societe ><-7> +< registratiedienst name author ><-7> +< metisse afro antillaise ><-7> +< and home ><-7> +< finecam kyocera ><-7> +< rencontres trans ><-7> +< site! name ><-7> +< mouloud album warner ><-7> +< for a calmer ><-7> +< gratis heren dames ><-7> +< circonscrite desorganisation microcalcification ><-7> +< magasin grandes tailles ><-7> +< roofing manufacturer vinyl ><-7> +< de r cz ><-7> +< savoirs ><-7> +< the digital ><-7> +< adopter adoption ><-7> +< content drivers driver ><-7> +< roy ><-7> +< publisher content marc ><-7> +< professionnelbienvenue ><-7> +< irc community problems ><-7> +< elfwood ><-7> +< option ><-7> +< life soothing ><-7> +< rocket roket 138 ><-7> +< votre horoscope ><-7> +< theme content name ><-7> +< author content klodcabit ><-7> +< gant blouse ><-7> +< officiel de dany ><-7> +< graphic design ><-7> +< toi emoi com ><-7> +< hundred ><-7> +< roc ><-7> +< rigolo fun delire ><-7> +< annuaire et top ><-7> +< ligne dernieres ><-7> +< liens infos pratiques ><-7> +< recensioni e tanto ><-7> +< 06 0500 r ><-7> +< trouverez toutes les ><-7> +< argentique 24x36 ><-7> +< jour plus proche ><-7> +< alessio soldano name ><-7> +< microcalcification http equiv ><-7> +< cannois le ><-7> +< content lodel ><-7> +< andrew ><-7> +< classification content musique ><-7> +< kassav fille martinique ><-7> +< fleuve ><-7> +< reduction amazon gratuit ><-7> +< author content chanteur ><-7> +< calendar free ><-7> +< collectables ><-7> +< resimler pkk ><-7> +< beatrice mace ><-7> +< the pc ><-7> +< studies style theories ><-7> +< rivierenland tilburg ><-7> +< et internet ><-7> +< cassettes de dany ><-7> +< y arriver tout ><-7> +< ink painting dragons ><-7> +< 06 06400 ><-7> +< rater name page ><-7> +< training equipment service ><-7> +< chercher preis ><-7> +< spielzeug ><-7> +< millet ><-7> +< nedstat basic ><-7> +< care beautiful ><-7> +< 7 jours sur ><-7> +< qui presente ><-7> +< voiture occasion ><-7> +< gratuitos melodysoft recursos ><-7> +< star academy star ><-7> +< prints asian dragon ><-7> +< nouveau parc ><-7> +< 8 au ><-7> +< tattoo art pictures ><-7> +< buy sell ><-7> +< e mail pop3 ><-7> +< foot name ><-7> +< melodies melodie ><-7> +< vacances location de ><-7> +< content karaoke ><-7> +< name dc rating ><-7> +< or d ><-7> +< duidelijke ><-7> +< name topic ><-7> +< to comics name ><-7> +< melissa joan ><-7> +< amoureux de ><-7> +< d ailleurs acne ><-7> +< eleves ><-7> +< namibie botswana ><-7> +< content 1400 gifs ><-7> +< videos dance ><-7> +< rencontre essonne ><-7> +< system of a ><-7> +< lol cyberlol ><-7> +< femelle lapin ><-7> +< ingles ><-7> +< for silverdragonstudio com ><-7> +< ruban bleu liberte ><-7> +< miniball_3_gegen_3 ><-7> +< jeu radio des ><-7> +< mode robe de ><-7> +< terrier beagle gravhund ><-7> +< fanfic ><-7> +< teens students ><-7> +< groningen haarlem ><-7> +< driver cd rom ><-7> +< productive websurfing ><-7> +< shampoo head ><-7> +< marque simone ><-7> +< la langue ><-7> +< projecteur en ><-7> +< sexy surf surfeur ><-7> +< kids music ><-7> +< live concerts ><-7> +< microcalcification ><-7> +< produits ed ><-7> +< 0 silver dragon ><-7> +< 1 coupe ><-7> +< french titre ><-7> +< ideale per aumentare ><-7> +< des prenoms prenoms ><-7> +< s forest name ><-7> +< disney paris ><-7> +< charset us ascii ><-7> +< emotions ><-7> +< pkk name ><-7> +< windows manufacturer insulation ><-7> +< acheter name ><-7> +< loteries coupons achats ><-7> +< al proprio sito ><-7> +< droits des ><-7> +< location materiel ><-7> +< retrouver un ami ><-7> +< elephants ><-7> +< abba ><-7> +< boards driver uploading ><-7> +< cameras market ><-7> +< aquatique ><-7> +< encontrado ><-7> +< voitures prises par ><-7> +< content bongenie ><-7> +< gazette tim ><-7> +< shampoo hair ><-7> +< lens film name ><-7> +< chinese dragon dragon ><-7> +< keywords content association ><-7> +< vragen duidelijke en ><-7> +< gli anime e ><-7> +< toilettage ><-7> +< drivers cd drivers ><-7> +< asker resim yazarlar ><-7> +< sur tupac ><-7> +< sur les films ><-7> +< shop online offres ><-7> +< driver download sound ><-7> +< belge be ><-7> +< bain et de ><-7> +< voyance directe ><-7> +< how to do ><-7> +< how to breakdance ><-7> +< spectroscopy solar spectrum ><-7> +< spirit of asia ><-7> +< nedstat alles over ><-7> +< abuse lan analyzer ><-7> +< siding manufacturer vinyl ><-7> +< driver uploading ><-7> +< danny bon reduction ><-7> +< cole ><-7> +< free hit counter ><-7> +< veloxia ><-7> +< revues org name ><-7> +< u paris10 fr ><-7> +< like usher how ><-7> +< 3 v 4 ><-7> +< in name ><-7> +< paintign paintings ><-7> +< celebrities name ><-7> +< aways ><-7> +< technologie et l ><-7> +< de boulogne sur ><-7> +< hvalpe ><-7> +< 1 nouvelle ><-7> +< content jean denis ><-7> +< kyocera finecam kyocera ><-7> +< ubu ><-7> +< generatorle site ><-7> +< yarn name description ><-7> +< transarchives ><-7> +< bodrum ><-7> +< tapisser ><-7> +< inedite retraite mec ><-7> +< types the ><-7> +< vervoer ><-7> +< voyance voyante ><-7> +< toi emoi ><-7> +< ventilation composite ><-7> +< condition ><-7> +< education finance nature ><-7> +< content dies ist ><-7> +< more full line ><-7> +< dawsonscreek ><-7> +< _top driverguide com ><-7> +< equipment for professional ><-7> +< modified content 2003 ><-7> +< silk garden stahl ><-7> +< bustier nageur ><-7> +< scalp calm down ><-7> +< ellen degeneres ><-7> +< delires kiss cool ><-7> +< chercheur ><-7> +< hair beauty care ><-7> +< bill ryan ><-7> +< fra1904 ><-7> +< visibilita ><-7> +< crowded ><-7> +< blinkies tchat e ><-7> +< rete e ><-7> +< goldenmarket goldenmarket fr ><-7> +< collection maillot ><-7> +< digitaal ><-7> +< sexy divertissement ><-7> +< boogaloos ><-7> +< spannend eenzaam ><-7> +< is a monthly ><-7> +< signes ><-7> +< history of rap ><-7> +< accro photo photographie ><-7> +< un karaoke ><-7> +< content official web ><-7> +< by comuneris ><-7> +< du temps http ><-7> +< rlogin ><-7> +< hotel en ><-7> +< download sound driver ><-7> +< horoscope horoscope gratuit ><-7> +< model masculin warren ><-7> +< amazon gratuit ><-7> +< plans de ><-7> +< tilburg twente ><-7> +< altro sulle vostre ><-7> +< content kennel birkedal ><-7> +< signet ><-7> +< tacquet name generator ><-7> +< content danyboon name ><-7> +< 1901 charte citoyen ><-7> +< 8859 1 arctura ><-7> +< poneys poneys poneys ><-7> +< 0 personal ><-7> +< nationale de ><-7> +< blague feinte ><-7> +< escaflowne ><-7> +< suede ><-7> +< portail sur lequel ><-7> +< club des webmasters ><-7> +< paris sejours disneyland ><-7> +< natation ><-7> +< cette page ><-7> +< description content beaucoup ><-7> +< mhp ><-7> +< noire et metissee ><-7> +< to play ><-7> +< internet content ><-7> +< cgis formularios ><-7> +< association des en ><-7> +< ranma name author ><-7> +< passionnes et une ><-7> +< guatemala ><-7> +< chauffe ><-7> +< novel texte studies ><-7> +< rythme de l ><-7> +< alladvantage gratuit britney ><-7> +< xdm web ><-7> +< affaires pour ><-7> +< rubriques encore ><-7> +< theoulien siagne mougins ><-7> +< teentoday co ><-7> +< building products ><-7> +< un probleme ><-7> +< astrologie astrology chinese ><-7> +< tacquet ><-7> +< magical ><-7> +< records record ><-7> +< globetrotter ><-7> +< les sports ><-7> +< coudre ><-7> +< 31 name copyright ><-7> +< gueguen name ><-7> +< driver video drivers ><-7> +< de partir de ><-7> +< insulation roofing siding ><-7> +< vacaturebanken ><-7> +< fille martinique guadeloupe ><-7> +< content beaucoup ><-7> +< de reference name ><-7> +< je homepage name ><-7> +< dragon greeting ><-7> +< sur marchander ><-7> +< rater name ><-7> +< angot ><-7> +< wallpapers discussions ><-7> +< pageviews ><-7> +< paintings ink painting ><-7> +< buscadores ><-7> +< theleme ><-7> +< corporatename content goldenmarket ><-7> +< cotton merino mohair ><-7> +< hot hackers winamp ><-7> +< un site d ><-7> +< networks name author ><-7> +< world history ><-7> +< molinel delta plus ><-7> +< classiques mais aussi ><-7> +< formularios ><-7> +< opciones panel de ><-7> +< book photos de ><-7> +< content here you ><-7> +< all tattoos designs ><-7> +< 3330 melodie melodies ><-7> +< cannettan mandelieu mandelocien ><-7> +< review review name ><-7> +< multiplayer ><-7> +< web abirnet sessionwall ><-7> +< social handicap ><-7> +< fnac 24 ><-7> +< trans rencontres ><-7> +< citoyen fraternite salon ><-7> +< pubs grumly ><-7> +< schutzhund trainer ><-7> +< network monitor intrusion ><-7> +< natural fiber ><-7> +< hunde hvalpe ><-7> +< net blagues ><-7> +< le web pour ><-7> +< uk teen ><-7> +< voyante auto ><-7> +< by the way ><-7> +< manufacturer of ><-7> +< tv series ><-7> +< accro ><-7> +< petite annonce recherche ><-7> +< edel ><-7> +< annonces du ><-7> +< photos photo photographie ><-7> +< joan crawford ><-7> +< rejoignez ><-7> +< plus norme ><-7> +< organisation d ><-7> +< much much more! ><-7> +< sorcier ><-7> +< dies ist ><-7> +< location guadeloupe ><-7> +< charte ><-7> +< laughs ><-7> +< content revue ><-7> +< lottery gallery ><-7> +< journalier horoscope personnalise ><-7> +< les resultats ><-7> +< posters prints and ><-7> +< femmes sport bijoux ><-7> +< fabien ><-7> +< chatroom teen shops ><-7> +< gifs images gratuites ><-7> +< de maquillage commande ><-7> +< gamme de maillot ><-7> +< garden stahl ><-7> +< down calming down ><-7> +< disneyland parc ><-7> +< maillots de ><-7> +< telephone dvd pull ><-7> +< content paris10 ><-7> +< roken ><-7> +< afrique afrique du ><-7> +< warner tracklist ><-7> +< shops chat kids ><-7> +< teknoloji ><-7> +< trouverez sur ><-7> +< gratuites gif animes ><-7> +< world travel ><-7> +< tyson ><-7> +< to do graffiti ><-7> +< forks ><-7> +< content metro chicago ><-7> +< farmer mylene farmer ><-7> +< plage bikini ><-7> +< amis photos ><-7> +< chapeaux ><-7> +< siagne mougins mouginois ><-7> +< chat kids ><-7> +< de dany ><-7> +< of evil ><-7> +< content comment ><-7> +< and name translations ><-7> +< automobile name ><-7> +< ouest 2000 ><-7> +< eclaircissant name ><-7> +< riva ><-7> +< content silicon silicon ><-7> +< d1 d2 ><-7> +< body soutien ><-7> +< vmrl 3dimensions monde ><-7> +< theme content radius ><-7> +< fine strings montres ><-7> +< breda den bosch ><-7> +< tattoos designs ><-7> +< installing drivers ><-7> +< stars free ><-7> +< site univers ><-7> +< film jeu ><-7> +< cactus 011 default ><-7> +< advance stats ><-7> +< webcams du net! ><-7> +< chanteur danyboon net ><-7> +< camescope camescopes ><-7> +< voyages aventures ><-7> +< panda art giant ><-7> +< teen chat site ><-7> +< spectral plots ><-7> +< christmas holiday ><-7> +< artefact fr ><-7> +< thermalisme piscine ><-7> +< exposer numerique ><-7> +< leaders in ><-7> +< roket ><-7> +< ap ><-7> +< des pour ><-7> +< de votre mariage ><-7> +< content typo 3 ><-7> +< diouda ethnocosmetique black ><-7> +< spotlight ><-7> +< yes name audience ><-7> +< taxes ><-7> +< asp banniere active ><-7> +< album warner ><-7> +< expo exposition calendar ><-7> +< petersen ><-7> +< rencontres hommes rencontre ><-7> +< rollin video ><-7> +< moyen age ><-7> +< masculin beau ><-7> +< fiber silk ><-7> +< danny bon ><-7> +< org name date ><-7> +< de tf1 en ><-7> +< homo hetero sm ><-7> +< 7 name language ><-7> +< genie creez et ><-7> +< cancun ><-7> +< de tf1 et ><-7> +< taciz ><-7> +< regio noord holland ><-7> +< police caractere ><-7> +< outils outil ><-7> +< miniature gravhund ><-7> +< materials manufacturer ><-7> +< keywords content kennel ><-7> +< ax ><-7> +< carrickfergus ><-7> +< theoule theoulien siagne ><-7> +< rajewicz name ><-7> +< discussion d ><-7> +< affaires pour acheter ><-7> +< assistance forums ><-7> +< par le avec ><-7> +< personal edition name ><-7> +< s forest ><-7> +< alpaca cotton merino ><-7> +< helene ><-7> +< name revision content ><-7> +< t c ><-7> +< and page count ><-7> +< banniere active server ><-7> +< kodak heutier moteur ><-7> +< les en vogue ><-7> +< accessoire ambulancier jetable ><-7> +< web classement ><-7> +< no cache pubs ><-7> +< t s ><-7> +< specific discussion boards ><-7> +< horoscope 2003 horoscope ><-7> +< house travel ><-7> +< network blocking ><-7> +< beck ><-7> +< larges femmes ><-7> +< televiseur televiseurs tv ><-7> +< micrologiciel ><-7> +< e ouest com ><-7> +< design chinese ><-7> +< german shepherd ><-7> +< content ssilicon ><-7> +< 2002 2004 http ><-7> +< magazine annuaire ><-7> +< keywords content steiff ><-7> +< plage chemise ><-7> +< roofing manufacturer ><-7> +< pieces detachees ><-7> +< box channel dating ><-7> +< de bebe ><-7> +< studios parcs ><-7> +< ink painting ><-7> +< de grandes tailles ><-7> +< portfolio exposer ><-7> +< perdus ><-7> +< vinz porsche 914 ><-7> +< souvent delicat grace ><-7> +< de name category ><-7> +< top model book ><-7> +< mun name description ><-7> +< name contactzipcode content ><-7> +< sulle vostre ><-7> +< probeer een van ><-7> +< putes ni ><-7> +< a abus ><-7> +< 1 26e rencontres ><-7> +< lit lits luminaire ><-7> +< franck maquinay homme ><-7> +< content gifs images ><-7> +< congratulations ><-7> +< tourisme voyage ><-7> +< cannot ><-7> +< certainteed building ><-7> +< greenpeace ><-7> +< veritable vitrine ><-7> +< hetero live gratis ><-7> +< brunsperger voyage voyages ><-7> +< le ><-7> +< litteraire roman ><-7> +< photographe mariage ><-7> +< sm lesbisch ><-7> +< musicales 26eme edition ><-7> +< draveil juvisy essonne ><-7> +< animati inoltre tutto ><-7> +< hifi video ><-7> +< bijoux art ><-7> +< patrimoine region regionalisme ><-7> +< co uk r ><-7> +< annonces petites ><-7> +< asian dragon greeting ><-7> +< q all name ><-7> +< vacaturebanken advertentierubrieken vlaanderen ><-7> +< bat ><-7> +< consultancy ><-7> +< maillot bain lingerie ><-7> +< peau noire ><-7> +< breakdance tips history ><-7> +< registratiedienst ><-7> +< volume critique bibliotheque ><-7> +< black opal ><-7> +< wong kar ><-7> +< et les programmes ><-7> +< voyage martinique concours ><-7> +< mp3 best ><-7> +< advancestats free ><-7> +< etc toute ><-7> +< millenium ><-7> +< en telecinema name ><-7> +< de securite ><-7> +< description content reviews ><-7> +< keywords content world ><-7> +< beau gosse beau ><-7> +< calendriers ><-7> +< dry scalp calm ><-7> +< amateur spectroscopy ><-7> +< teen chat and ><-7> +< content tattoos ><-7> +< 1 coloriage ><-7> +< beziers ><-7> +< woods ><-7> +< flash 6 ><-7> +< boxster ><-7> +< talk message ><-7> +< driver sound ><-7> +< grandes tailles name ><-7> +< free lottery gallery ><-7> +< trans les trans ><-7> +< mp3 site ><-7> +< content la caution ><-7> +< en vogue choix ><-7> +< onze producten! name ><-7> +< delicat ><-7> +< gratuits jeu gratuit ><-7> +< interpretes en langue ><-7> +< content warren de ><-7> +< municipalite ><-7> +< easily build ><-7> +< nokia 3210 ><-7> +< for gazette com ><-7> +< archives transarchives ><-7> +< quirit ><-7> +< language dear girl ><-7> +< candy online ><-7> +< content actricesdefrance ><-7> +< s on ><-7> +< content bongenie bon ><-7> +< lesbian gay bisexual ><-7> +< horoscope journalier ><-7> +< turk turkish ><-7> +< originale et ><-7> +< hautes alpes ><-7> +< le fun ><-7> +< environnement patriotisme ><-7> +< sournoise minette ><-7> +< wheel ><-7> +< printer driver cdrom ><-7> +< fausses ><-7> +< liste name audience ><-7> +< bmx nbl ><-7> +< certainteed insulation ><-7> +< valeur republique ><-7> +< anne geddes ><-7> +< buitenland ><-7> +< horoscope horoscope mensuel ><-7> +< golive 6 http ><-7> +< placards ><-7> +< montaigne duras ><-7> +< votre magasin fnac ><-7> +< chinese calligraphy panda ><-7> +< savoir ecrivain roman ><-7> +< detectives ><-7> +< for yourself ><-7> +< institute ><-7> +< pelote de laine ><-7> +< author content afils ><-7> +< habitat ><-7> +< beepworld ><-7> +< la litterature ><-7> +< charmel barbara ravage ><-7> +< psychanalyse auteur ><-7> +< maroc okacha localyweb ><-7> +< camarade retrouver un ><-7> +< haplosciences name generator ><-7> +< archives transarchives name ><-7> +< patagonia ><-7> +< was created ><-7> +< killyan s forest ><-7> +< psychose ><-7> +< photographie photographies photography ><-7> +< images peintures peinture ><-7> +< bain maillot bain ><-7> +< lopez harry potter ><-7> +< nederlandstalig ><-7> +< students webchat ><-7> +< of asia oriental ><-7> +< equipment dog ><-7> +< lancement a ><-7> +< saisonnieres ><-7> +< universite paris x ><-7> +< topic content document ><-7> +< description content tutto ><-7> +< lsf langue des ><-7> +< enseignants ><-7> +< lune mauve ><-7> +< loyer ><-7> +< kroeg ><-7> +< de warren fan ><-7> +< aussi et horloges ><-7> +< objectif film ><-7> +< rajewicz sex symbol ><-7> +< 07 name dc ><-7> +< spielwaren ><-7> +< 2 high ><-7> +< somers ><-7> +< met dezelfde interesses ><-7> +< voir! blagues gifs ><-7> +< boon moins chers! ><-7> +< basee sur ><-7> +< feinte video mpg ><-7> +< teens meet talk ><-7> +< kostenlos kostenloses ><-7> +< bmx bmx racing ><-7> +< tips on ><-7> +< finding downloading ><-7> +< content bmx ><-7> +< advancestats free hit ><-7> +< rigolo rigoler meilleur ><-7> +< content chanteur name ><-7> +< rencontres moi name ><-7> +< d occasion achat ><-7> +< numerosi visitatori ><-7> +< to supercross ><-7> +< blitz 011 ><-7> +< jour horoscope 2003 ><-7> +< coxinelle content swish ><-7> +< best breakdance ><-7> +< dk name author ><-7> +< salsa ><-7> +< babbel box channel ><-7> +< 26eme edition 2 ><-7> +< magazine dedicated to ><-7> +< javachat irc community ><-7> +< cameras finecam ><-7> +< rajewicz official website ><-7> +< build a customized ><-7> +< 06150 06250 06550 ><-7> +< sphinx ><-7> +< gooi ><-7> +< carrickfergus 107 2new ><-7> +< dessinnee bd au ><-7> +< breakdance videos street ><-7> +< 50 content de ><-7> +< trouver chercher preis ><-7> +< music film ><-7> +< jour mois annee ><-7> +< keywords content astrologie ><-7> +< denis baranger ><-7> +< nations ><-7> +< webtropia com ><-7> +< station for ><-7> +< focus ><-7> +< les copains d ><-7> +< rue de ><-7> +< des interpretes ><-7> +< crew popping locking ><-7> +< beltonen ><-7> +< animaux convivialite culture ><-7> +< discrimination ><-7> +< kiss cool pub ><-7> +< grace a cette ><-7> +< after days name ><-7> +< gastronomie bijoux art ><-7> +< wirtschaft wissenschaft ><-7> +< 04gold i name ><-7> +< gooi en ><-7> +< to content paris10 ><-7> +< keywords content dauphins ><-7> +< septentrion ><-7> +< bmx name author ><-7> +< baladeur mp3 baladeurs ><-7> +< 26 jean louis ><-7> +< keywords content lycos ><-7> +< webcam webmaster amateur ><-7> +< reclame bureau ><-7> +< cinema asiatique ><-7> +< republicain ><-7> +< placename content metro ><-7> +< eilanden zuid limburg ><-7> +< societes ><-7> +< porter mode femme ><-7> +< manteau ><-7> +< marktplatz ><-7> +< et d occasion ><-7> +< look alikes ><-7> +< usher how ><-7> +< themes eurodisney ><-7> +< art print gallery ><-7> +< pubs pub ><-7> +< mer ou ><-7> +< lace vogue aran ><-7> +< programme exe zip ><-7> +< paris sejours ><-7> +< ethnocosmetique ><-7> +< content spip ><-7> +< posting boards ><-7> +< amour annonces ><-7> +< for gazette ><-7> +< gif anime image ><-7> +< dry scalp ><-7> +< moi name reply ><-7> +< sport bike ><-7> +< codecs ><-7> +< tables chaise chaises ><-7> +< dimorphisme male femelle ><-7> +< webchat message ><-7> +< sur mer de ><-7> +< accouchement grossesse ><-7> +< angers histoire angers ><-7> +< verkoop chat babbel ><-7> +< geen porno ><-7> +< sigle filmati ><-7> +< fr content michael ><-7> +< le blog de ><-7> +< futon lit ><-7> +< titre traductions ><-7> +< sournoise ><-7> +< non officiel de ><-7> +< boulogne photos ><-7> +< entertainment name author ><-7> +< and music ><-7> +< periodical resources name ><-7> +< like genuwine hip ><-7> +< snoop logging ><-7> +< teller voor je ><-7> +< description content par ><-7> +< stahl regia sock ><-7> +< le marche ><-7> +< filtering network ><-7> +< de fabricant createur ><-7> +< carte de france ><-7> +< association associatif ><-7> +< lang en us ><-7> +< aime en ><-7> +< accreditation en ligne ><-7> +< di scambio banner ><-7> +< 8 content mshtml ><-7> +< une large ><-7> +< interip networks name ><-7> +< avl hundehvalpe racehunde ><-7> +< keywords content certainteed ><-7> +< wed 01 ><-7> +< useful features name ><-7> +< portare al proprio ><-7> +< groningen haarlem leidse ><-7> +< cheung ><-7> +< parlor tattoo interviews ><-7> +< travail et aux ><-7> +< et quotidiennement ><-7> +< takeshi kitano ><-7> +< la culture ><-7> +< copyrigth ><-7> +< louer ><-7> +< content le zodiaque ><-7> +< for yourself or ><-7> +< votre propre annuaire ><-7> +< sont en ><-7> +< chemise de ><-7> +< fr name mssmarttagspreventparsing ><-7> +< parcs de loisirs ><-7> +< modellen gezocht ><-7> +< chihuahua ><-7> +< univers bd le ><-7> +< kreestal ><-7> +< comique insolite recherche ><-7> +< profession ><-7> +< all s ><-7> +< analyzer network ><-7> +< allaitement ><-7> +< content clearday 011 ><-7> +< casse ><-7> +< carrie fisher ><-7> +< achterhoek breda den ><-7> +< dandruff ><-7> +< lingerie feminine de ><-7> +< kari ><-7> +< sante social ><-7> +< vriendschap bi ><-7> +< aantal ><-7> +< la carte ><-7> +< kars ><-7> +< manga ossia ><-7> +< dakika ><-7> +< note di cartoon ><-7> +< scambio link pubblicita ><-7> +< chantelle lejaby lise ><-7> +< ouest com http ><-7> +< 5 mio ><-7> +< delicat grace a ><-7> +< cite citoyen echange ><-7> +< sneakers ><-7> +< graphiques coxinelle design ><-7> +< discounter ><-7> +< le but ><-7> +< author content kreestal ><-7> +< pas a pas ><-7> +< video rock ><-7> +< zidane ><-7> +< content free hit ><-7> +< diouda ><-7> +< plus norme cuisine ><-7> +< 1 wanadoo ><-7> +< occasion vente ><-7> +< setting ><-7> +< name publisher lang ><-7> +< pratiques archives transarchives ><-7> +< castel ><-7> +< debat houellebecq ><-7> +< negli anime name ><-7> +< photo photographie photographis ><-7> +< bretagne live concerts ><-7> +< perso shopping ><-7> +< webontwerp ><-7> +< nedstad ><-7> +< tahiti ><-7> +< modifier ><-7> +< svensk ><-7> +< equiv last modified ><-7> +< eastwood ><-7> +< web s ><-7> +< lavigne avril ><-7> +< hit counter web ><-7> +< nedstat ><-7> +< com mannequin ><-7> +< gorge slip ><-7> +< reference name ><-7> +< corpulentes larges femmes ><-7> +< dionysos ><-7> +< 100 prenoms garcons ><-7> +< kennel birkedal ><-7> +< granger liseurs debat ><-7> +< fabricant boutique vente ><-7> +< content photo com ><-7> +< cool pub ><-7> +< postcards name ><-7> +< drole rigolo ><-7> +< a themes eurodisney ><-7> +< blouson ><-7> +< mensen bezoeken ><-7> +< tarifs accreditation en ><-7> +< debats plus ><-7> +< advertentierubrieken vlaanderen ><-7> +< gratis e ><-7> +< for apache ><-7> +< content 51 cck ><-7> +< resim yazarlar ><-7> +< laurent boutonnat laurent ><-7> +< bain jupes ><-7> +< a customized web ><-7> +< head shoulders head ><-7> +< mode french ><-7> +< adaptent ><-7> +< homme gratuit plans ><-7> +< content faire ><-7> +< vidocq ><-7> +< nl name language ><-7> +< merchandise ><-7> +< musicales rencontres ><-7> +< dre ><-7> +< club club des ><-7> +< animati immagini ><-7> +< mobile mobiles portable ><-7> +< spears xxx hot ><-7> +< retriever labrador ><-7> +< encheres genealogie jobs ><-7> +< oriental dragon paintings ><-7> +< scolaire universite concours ><-7> +< paper name ><-7> +< shampoo hair care ><-7> +< spectroscopy name author ><-7> +< comic transformers ><-7> +< l etoile ><-7> +< album asphalte hurlante ><-7> +< tarifs accreditation ><-7> +< japanese asian dragons ><-7> +< content mac ><-7> +< du tres beau ><-7> +< hom franchise franchise ><-7> +< 011 name ><-7> +< etoile du rire ><-7> +< pillou name subject ><-7> +< stats name ><-7> +< partiler milletvekilleri bozkurt ><-7> +< kaufen bei ><-7> +< opale name keywords ><-7> +< contenus de film ><-7> +< cure ><-7> +< fnac on 1997 ><-7> +< amis d enfance ><-7> +< moi name ><-7> +< gateway unix ><-7> +< 0500 r ><-7> +< wiggles site ><-7> +< au service ><-7> +< construction and home ><-7> +< world news ><-7> +< editor document planete ><-7> +< savoir ecrivain ><-7> +< le monde magique ><-7> +< montres hommes ><-7> +< fr horoscope mois ><-7> +< histoire name ><-7> +< veloxia network ><-7> +< rigoler com ><-7> +< web s largest ><-7> +< catalogue conseils ><-7> +< prevention des ><-7> +< monitor drivers etc ><-7> +< html banner effectief ><-7> +< les tests ><-7> +< je ne cherche ><-7> +< chatkanaal ><-7> +< content dog ><-7> +< zoekertjes snuffel rubrieken ><-7> +< angot fable romancier ><-7> +< annuaire evenements ><-7> +< sunnydale ><-7> +< ink and ><-7> +< in rete e ><-7> +< laboratoires et fabricants ><-7> +< new year nouvel ><-7> +< adults magazines ><-7> +< de maquillage ><-7> +< album asphalte ><-7> +< communautaire permanente veritable ><-7> +< astrologie chinese astrology ><-7> +< wiggles best ><-7> +< ca name copyright ><-7> +< musculation futon lit ><-7> +< mariage photos mariage ><-7> +< boutique collection ><-7> +< uploading ><-7> +< equitation cheval cheval ><-7> +< no accro photo ><-7> +< faire son ><-7> +< micrologiciel by ><-7> +< pratiques programme ><-7> +< dessinee et ><-7> +< windows building ><-7> +< 24x36 ><-7> +< netherlands nederland ><-7> +< date dating contact ><-7> +< cite citoyen ><-7> +< 06110 06150 06250 ><-7> +< keywords content television ><-7> +< cahier ><-7> +< mode fashion men ><-7> +< chinois zodiaque ><-7> +< montres classiques ><-7> +< dragon studios ><-7> +< b2evolution 0 9 ><-7> +< vous informe sur ><-7> +< de vue les ><-7> +< download movie ><-7> +< shop collectibles ><-7> +< by comuneris http ><-7> +< du septentrion ><-7> +< interessante ><-7> +< nouvelles newsletter ><-7> +< dark and lovely ><-7> +< content photo name ><-7> +< content jeux video ><-7> +< e portare al ><-7> +< andere vragen duidelijke ><-7> +< de control name ><-7> +< com consultez le ><-7> +< piercing tribal ><-7> +< tracklist rap ><-7> +< content le but ><-7> +< chaise chaises tapis ><-7> +< 06 06400 06110 ><-7> +< lits luminaire luminaires ><-7> +< whazzup ><-7> +< webcams monde ><-7> +< pictures free animated ><-7> +< aanmeldservice ><-7> +< pearl ><-7> +< yarn knitting crochet ><-7> +< magique de ><-7> +< content 2004 04 ><-7> +< katz goldt ><-7> +< content hard discount ><-7> +< un projecteur ><-7> +< jupe jeans jean ><-7> +< chat and ><-7> +< detection abuse ><-7> +< arts oriental chinese ><-7> +< creatrice ><-7> +< vechtstreek ><-7> +< discussion volume ><-7> +< gratuite name description ><-7> +< tailles name keywords ><-7> +< beagle gravhund ><-7> +< professionnelbienvenue dans ><-7> +< la de la ><-7> +< engineer ><-7> +< pollution ><-7> +< gratuit loterie gallerie ><-7> +< everything you need ><-7> +< concours reunion name ><-7> +< expression webcam esterel ><-7> +< chicago il http ><-7> +< graham ><-7> +< nieuwsbrief ><-7> +< horticulteurs ><-7> +< telecinema super ><-7> +< site traffic ><-7> +< keywords content dandruff ><-7> +< for reporting ><-7> +< des laboratoires ><-7> +< bricoleur ><-7> +< le de la ><-7> +< ammin youssouf ><-7> +< dvd lecteurs dvd ><-7> +< board remoto buscador ><-7> +< verone ><-7> +< mahdessian name description ><-7> +< integrated ><-7> +< toda clase ><-7> +< forms name ><-7> +< defrisants catalogue poils ><-7> +< asker resim ><-7> +< salons de ><-7> +< 2000 10 0800 ><-7> +< after content 30days ><-7> +< histoire inedite retraite ><-7> +< netstats website statistieken ><-7> +< webmaster argent alladvantage ><-7> +< breakdance breakdance tips ><-7> +< travail et ><-7> +< the website ><-7> +< dj s ><-7> +< name country content ><-7> +< chat engine ><-7> +< tattoo parlor tattoo ><-7> +< lycos shopping ><-7> +< giveaways ><-7> +< worldwide name language ><-7> +< au juste prix ><-7> +< contracting ><-7> +< des contenus ><-7> +< les internautes ><-7> +< horoscope gratuit horoscope ><-7> +< video mariage ><-7> +< zip animation humour ><-7> +< video video eumig ><-7> +< portable portables nokia ><-7> +< ouest name rating ><-7> +< schutzhund dog training ><-7> +< homophobie ><-7> +< the official home ><-7> +< los servicios ><-7> +< nc name ><-7> +< iman flori roberts ><-7> +< et de lingerie ><-7> +< la richesse ><-7> +< verliefd ><-7> +< content focus in ><-7> +< locations de ><-7> +< radius ><-7> +< delicious ><-7> +< vlaanderen chat ><-7> +< to content delire ><-7> +< websurfing web surfing ><-7> +< terrier chihuahua hundeavl ><-7> +< heberge par ><-7> +< og avl af ><-7> +< mis en ><-7> +< content blitz 011 ><-7> +< breath of ><-7> +< forest ><-7> +< dragon drawing ><-7> +< anime videos ><-7> +< mariage name dc ><-7> +< acapulco ><-7> +< philosophie psychologie ><-7> +< chatkanaal babbelbox ><-7> +< roman louis ferdinand ><-7> +< scalp ><-7> +< yahoo! japan ><-7> +< interactieve interactief toepassingen ><-7> +< symbol aristocrate noble ><-7> +< oldies ><-7> +< name pubdate ><-7> +< relation content revues ><-7> +< gosse ><-7> +< son nouveau parc ><-7> +< baranger name owner ><-7> +< du temps ><-7> +< word 10 http ><-7> +< telephone mobile telephones ><-7> +< dance like michael ><-7> +< video sur clubic ><-7> +< content presspublisher net ><-7> +< bas nylon culotte ><-7> +< party anime ><-7> +< luminaires rideau ><-7> +< sneakercommunity ><-7> +< visitatori realmente interessati ><-7> +< ados ado ><-7> +< astrologie astrology ><-7> +< and file ><-7> +< 24x36 portrait ><-7> +< 1999 2003 veloxia ><-7> +< vue les copains ><-7> +< 8859 1 interdiction ><-7> +< cheval chevaux chevaux ><-7> +< contemporary ><-7> +< fils tricoter ><-7> +< mammotome imagerie imaging ><-7> +< de pagina met ><-7> +< brune homme anti ><-7> +< windows xwindows telnet ><-7> +< motorcycle motorcycles ><-7> +< aristocrate ><-7> +< 2004 universite ><-7> +< and lovely defrisants ><-7> +< sexy fond ><-7> +< webcam esterel ><-7> +< athenes ><-7> +< entreprise soigne son ><-7> +< gogh ><-7> +< beckham ><-7> +< boutique vente plage ><-7> +< maroc okacha ><-7> +< menthol tight ><-7> +< logging productive websurfing ><-7> +< poney equitation cheval ><-7> +< riverain ><-7> +< futon futons table ><-7> +< hershey ><-7> +< dragon prints and ><-7> +< createur propose ><-7> +< du festival de ><-7> +< graphiques camescope camescopes ><-7> +< videos street ><-7> +< and collectables silver ><-7> +< soutien aux ><-7> +< and accessories ><-7> +< fine yarn ><-7> +< associatif associative ><-7> +< torsion ><-7> +< gravhund ><-7> +< galactographie ><-7> +< droles rigoler gratuit ><-7> +< music film reviews ><-7> +< also available name ><-7> +< content metro ><-7> +< dating sexy chat ><-7> +< cool pub pubs ><-7> +< link to ><-7> +< langue des ><-7> +< of insulation roofing ><-7> +< allergie ><-7> +< maire angers municipalite ><-7> +< as you ><-7> +< fun delire ><-7> +< tout genre pour ><-7> +< son image name ><-7> +< aristocrate noble ><-7> +< _top de registratiedienst ><-7> +< epistemon epistemon ><-7> +< les archives des ><-7> +< aurillac ><-7> +< artistique musique musical ><-7> +< virtuelle name ><-7> +< ! name author ><-7> +< warrenderajewicz com ><-7> +< 1901 charte ><-7> +< veritable vitrine pour ><-7> +< dvd jeux ><-7> +< online service ><-7> +< gratuitement votre ><-7> +< follow index silicon ><-7> +< et jeunes mamans ><-7> +< foire ><-7> +< lan analyzer network ><-7> +< to breakdance ><-7> +< droite ><-7> +< a customized ><-7> +< autobots decepticons ><-7> +< aujourd hui ><-7> +< d elevage ><-7> +< fonte ><-7> +< shopping trouver chercher ><-7> +< la liste ><-7> +< langues cuisine litterature ><-7> +< music downloads ><-7> +< gay lesbisch ><-7> +< content 20010325 name ><-7> +< mp3 musique midi ><-7> +< manga manga anime ><-7> +< batiment ><-7> +< bd bouquin ><-7> +< interdiction suite a ><-7> +< online candy ><-7> +< musica mp3 ><-7> +< werkdag ><-7> +< annabel fox ><-7> +< contour ><-7> +< parquet ><-7> +< com! ><-7> +< de rajewicz comte ><-7> +< decking ><-7> +< 2003 supercross ><-7> +< art costumes explications ><-7> +< de top model ><-7> +< gifs gif ><-7> +< sexage dimorphisme male ><-7> +< etoile du ><-7> +< des droits ><-7> +< free url ><-7> +< espoir ><-7> +< safari safaris ><-7> +< cherche pas ><-7> +< circuiti di ><-7> +< male femelle lapin ><-7> +< vitrine pour ><-7> +< moto casting ><-7> +< lunette casque ><-7> +< url content la ><-7> +< interpretes ><-7> +< de musculation ><-7> +< de la pub ><-7> +< site non officiel ><-7> +< birkedal all rights ><-7> +< athletes and ><-7> +< appareils de musculation ><-7> +< copyright content goldenmarket ><-7> +< lo que ><-7> +< christophe loubet ><-7> +< dernieres nouvelles newsletter ><-7> +< uk s best ><-7> +< mail personal ><-7> +< cheveu ><-7> +< windows xwindows ><-7> +< creation maillots janine ><-7> +< livres histoire conte ><-7> +< big5 yahoo! ><-7> +< production http equiv ><-7> +< tf1 tv ><-7> +< onderhoudmodule ><-7> +< ch uk ><-7> +< aux nouvelles normes ><-7> +< buscador libros ><-7> +< magnetoscope jeu video ><-7> +< name sur infobebes ><-7> +< traffic analysis name ><-7> +< i manga ><-7> +< wel erotiek ><-7> +< le top 100 ><-7> +< rire en ><-7> +< scale model ><-7> +< hom name ><-7> +< content zonhumour com ><-7> +< stupefiant ><-7> +< prenoms filles prenoms ><-7> +< soundcard drivers ><-7> +< prenom prenoms ><-7> +< de solidarite ><-7> +< permanente veritable ><-7> +< 0 1 fr ><-7> +< watercolor painting oriental ><-7> +< formation creation ><-7> +< decoration informatique ><-7> +< drivers video driver ><-7> +< okacha localyweb fete ><-7> +< drivers network ><-7> +< welcome to supercross ><-7> +< belfast ><-7> +< poplocking break dance ><-7> +< du sport et ><-7> +< kissable hair free ><-7> +< festival breton rennes ><-7> +< self defense ><-7> +< strings sous sous ><-7> +< 1 fr copyright ><-7> +< dossiers bande ><-7> +< vous allez pouvoir ><-7> +< video jeu jeux ><-7> +< votre un hommage ><-7> +< bain de ><-7> +< custom designs name ><-7> +< teen posting ><-7> +< a home ><-7> +< content berlin ><-7> +< aftercare and ><-7> +< mohair annabel ><-7> +< brendon ><-7> +< d opale name ><-7> +< step by step ><-7> +< debats plus de ><-7> +< ane anes anes ><-7> +< cat cats ><-7> +< 1 je ><-7> +< voyages warez ><-7> +< muslims ><-7> +< content collection ><-7> +< 9074 dk worlds ><-7> +< institutions ><-7> +< artiste album ><-7> +< is de ><-7> +< alpaca cotton ><-7> +< billancourt ><-7> +< pictures sorted ><-7> +< duydunuzmu milliyetcilik itiraflar ><-7> +< ubu antipode ><-7> +< screen saver ><-7> +< tourisme kassav ><-7> +< disney paris sejours ><-7> +< des l ><-7> +< photographies images ><-7> +< keywords content warren ><-7> +< et debats plus ><-7> +< a company and ><-7> +< photodome ><-7> +< copyright content andre ><-7> +< ecrivain roman ><-7> +< 06400 ><-7> +< jeune public ><-7> +< de rajewicz sex ><-7> +< crochet wool ><-7> +< objective prism name ><-7> +< globe ><-7> +< darkroom gay bi ><-7> +< vous les photos ><-7> +< chihuahua name ><-7> +< hundeavl hunde ><-7> +< collant chemise de ><-7> +< articles de bain ><-7> +< de musculation futon ><-7> +< siding manufacturer ><-7> +< blog name robots ><-7> +< limburg rivierenland tilburg ><-7> +< debit http ><-7> +< owner content pero ><-7> +< content haplosciences ><-7> +< art supplies chinese ><-7> +< java javascript ><-7> +< nokia gratuites ><-7> +< mail gratis ><-7> +< tracking equipment ><-7> +< okacha ><-7> +< metz ><-7> +< counter for reporting ><-7> +< discusion ><-7> +< meilleures webcams du ><-7> +< chronograph ><-7> +< slayers ><-7> +< nou ><-7> +< debat houellebecq psychanalyse ><-7> +< roquette ><-7> +< heutier moteur ><-7> +< creation name ><-7> +< fine yarn name ><-7> +< la cite aire ><-7> +< meilleur bonne histoire ><-7> +< texte studies style ><-7> +< veel andere vragen ><-7> +< souvenirs photo de ><-7> +< catalogues demande ><-7> +< boulogne billancourt ><-7> +< djs ><-7> +< the net name ><-7> +< babbel database ><-7> +< plongee ><-7> +< top actualisateur free ><-7> +< de musiques actuelles ><-7> +< fabulous ><-7> +< nikkfurie ahmed mohamed ><-7> +< content nofollow http ><-7> +< patriotisme quartier defense ><-7> +< botswana zambie zimbabwe ><-7> +< along with aftercare ><-7> +< brunsperger afrique australe ><-7> +< de telephonie ><-7> +< creator personalname ><-7> +< content montres pour ><-7> +< annuaire sur internet ><-7> +< et jeux mangas ><-7> +< citoyenne retro elus ><-7> +< club de warren ><-7> +< reynaud ><-7> +< minolta ><-7> +< asia oriental ><-7> +< art artistique musique ><-7> +< 0 cheval ><-7> +< linge de maison ><-7> +< breton ><-7> +< commande en ><-7> +< community problems ><-7> +< subject content ni ><-7> +< brugge belgie name ><-7> +< le specialiste de ><-7> +< regionaal contact kontakt ><-7> +< 07 http equiv ><-7> +< pere ><-7> +< content suivez ><-7> +< blind date regio ><-7> +< pero ><-7> +< livre livre bandes ><-7> +< perdus de vue ><-7> +< musik music ><-7> +< deleted ><-7> +< sorted ><-7> +< schumann ><-7> +< generation underground kathar6 ><-7> +< designs tattoo pictures ><-7> +< cherche pas une ><-7> +< art supplies dragon ><-7> +< publicite pubs ><-7> +< nouvel album ><-7> +< testi ><-7> +< has the web ><-7> +< plus que ><-7> +< education poesies conte ><-7> +< business using our ><-7> +< to dance ><-7> +< fox noro kureyon ><-7> +< au service du ><-7> +< animation sailor ><-7> +< nordhorn ><-7> +< eure et loir ><-7> +< charme humour ><-7> +< musica en ><-7> +< faire un ><-7> +< editor document simplement ><-7> +< club internet ><-7> +< gif delire delire ><-7> +< truetype ><-7> +< dany boon moins ><-7> +< copyright content pubs ><-7> +< content url htm ><-7> +< jetable ><-7> +< asian asiatique new ><-7> +< boards driver ><-7> +< chers! name ><-7> +< sante social handicap ><-7> +< qui veut des ><-7> +< in italia name ><-7> +< carcassonne ><-7> +< horloges la ><-7> +< personalized art ><-7> +< etapes epouse marie ><-7> +< corpulentes ><-7> +< 75017 name contactstate ><-7> +< u2 mp3 ><-7> +< moto occasion ><-7> +< 8859 1 main ><-7> +< singles buy ><-7> +< diaporama pps jeux ><-7> +< content par le ><-7> +< direct dialogue ><-7> +< and driver ><-7> +< les formes s ><-7> +< welpen ><-7> +< content 3suisses ><-7> +< travail personnalise image ><-7> +< de dany boon ><-7> +< gilets ><-7> +< 2003 supercross bmx ><-7> +< keywords content scooter ><-7> +< arriver tout seul ><-7> +< jan 2001 gmt ><-7> +< groupe humour com ><-7> +< evaluation ><-7> +< exigence ><-7> +< le avec ><-7> +< sessionwall ><-7> +< visita formularios ><-7> +< de credito ><-7> +< fournitures ><-7> +< itp ><-7> +< ane anes ><-7> +< aristocrate noble sex ><-7> +< des blagues et ><-7> +< dimorphisme male ><-7> +< cooking ><-7> +< dysneyland tourisme france ><-7> +< boards teen posting ><-7> +< pour filles et ><-7> +< montages ><-7> +< content nedstat ><-7> +< streetwear ><-7> +< les particuliers ><-7> +< fashion men love ><-7> +< sculptures ><-7> +< tegen ><-7> +< voiture jeu ><-7> +< en langue ><-7> +< geocities r 1 ><-7> +< bande dessinnee ><-7> +< millet politika siir ><-7> +< frequency ><-7> +< plans name ><-7> +< ranma ken ><-7> +< 8859 1 au ><-7> +< it content ><-7> +< sat 28 feb ><-7> +< cotton merino ><-7> +< trans rencontres trans ><-7> +< advice name ><-7> +< u paris10 ><-7> +< pubs delire name ><-7> +< keywords content conseil ><-7> +< diddl enigmes devinettes ><-7> +< topic content musik ><-7> +< medico ><-7> +< votre propre ><-7> +< plus images wallpapers ><-7> +< bongenie bon genie ><-7> +< verhuizen ><-7> +< elvis presley ><-7> +< terrier beagle ><-7> +< bookstore ><-7> +< wav mp3 ><-7> +< balconnet ><-7> +< ccd ><-7> +< television series ><-7> +< enfants mode ><-7> +< ian ><-7> +< content pubs ><-7> +< geeft op deze ><-7> +< pattern fixation ><-7> +< themes ses ><-7> +< photo couleur ><-7> +< key largo ><-7> +< server content natweb ><-7> +< robe robes ><-7> +< un hommage franquin ><-7> +< de visites ><-7> +< entre les deux ><-7> +< ccd absorption lines ><-7> +< catalogues demande de ><-7> +< solidarite sport ><-7> +< acheter name keywords ><-7> +< creatifs ><-7> +< reese ><-7> +< accessoires et ><-7> +< jeux linge de ><-7> +< caution ><-7> +< content vinz porsche ><-7> +< disney studios parcs ><-7> +< site delire ><-7> +< blague feinte video ><-7> +< appel a des ><-7> +< interview film ><-7> +< simlock ><-7> +< k9 training equipment ><-7> +< serialz ><-7> +< fonctionnement ><-7> +< using our ><-7> +< free teen chat ><-7> +< subject content sonneries ><-7> +< webdesign flash ><-7> +< association loi 1901 ><-7> +< by jean pillou ><-7> +< url content melodysoft ><-7> +< entraide ><-7> +< and times ><-7> +< regionale ><-7> +< kids music film ><-7> +< stahl regia ><-7> +< voitures prises ><-7> +< belly ><-7> +< femme magasin ><-7> +< online offres speciales ><-7> +< video et ><-7> +< municipalite angers ><-7> +< prenoms garcons ><-7> +< argent gagner economie ><-7> +< courage ><-7> +< ethnocosmetique black defrisage ><-7> +< fr french http ><-7> +< website statistieken website ><-7> +< cincroyable incroyable ><-7> +< appareil photo numerique ><-7> +< publisher content kennel ><-7> +< blagues name ><-7> +< tutto sulla ><-7> +< discusion debate name ><-7> +< content no abc ><-7> +< and page ><-7> +< card with your ><-7> +< op heel ><-7> +< index du ><-7> +< c 1999 2003 ><-7> +< mouginois mouans sartoux ><-7> +< meet talk ><-7> +< cds and ><-7> +< paroles wav mod ><-7> +< tissus les coloris ><-7> +< avant amis photos ><-7> +< marchant 2002 ><-7> +< sex rongeurs sexage ><-7> +< a driverguide com ><-7> +< model casting ><-7> +< localyweb fete ><-7> +< montres appareils ><-7> +< la livecam sur ><-7> +< banner scambio link ><-7> +< siir aydin ><-7> +< indicator ><-7> +< breda den ><-7> +< flandres ><-7> +< robot content all ><-7> +< for teenager sites ><-7> +< sur la sante ><-7> +< step process for ><-7> +< mer noire ><-7> +< gavage name ><-7> +< nedstads netstats ><-7> +< soutiens ><-7> +< un moment de ><-7> +< wig ><-7> +< et gerez ><-7> +< beauty lifestyle ><-7> +< horoscope mensuel horoscope ><-7> +< clips popping ><-7> +< hop history learn ><-7> +< hair shampoo hair ><-7> +< jours sur 7 ><-7> +< limburg belgie vlaanderen ><-7> +< speciale sur le ><-7> +< server page annuaire ><-7> +< 8859 1 google ><-7> +< son cincroyable incroyable ><-7> +< page homepage ><-7> +< gagner economie ><-7> +< scalp scalp hair ><-7> +< registraties ><-7> +< counters and stats ><-7> +< aude ><-7> +< nr 1 vk ><-7> +< content goldenmarket all ><-7> +< moteur pas a ><-7> +< chunky worsted double ><-7> +< cams camera ><-7> +< coreen ><-7> +< 1 formula ><-7> +< arkadiusz ><-7> +< cuisine marocaine gastronomie ><-7> +< masculin mannequin ><-7> +< nr 1 va ><-7> +< servicios gratuitos usados ><-7> +< driver archive printer ><-7> +< gratos plan gratuit ><-7> +< lire lettres ><-7> +< rural ><-7> +< fnac com votre ><-7> +< an easy step ><-7> +< l exigence ><-7> +< travel lodge ><-7> +< over blog com ><-7> +< mpeg webmaster argent ><-7> +< copyright content accro ><-7> +< kid mohair bulky ><-7> +< bottoni ><-7> +< brune homme ><-7> +< informatique home cinema ><-7> +< find candy ><-7> +< publisher content editions ><-7> +< e cards et ><-7> +< name pubdate content ><-7> +< video eumig kodak ><-7> +< revision content 2003 ><-7> +< beaute noire et ><-7> +< les photos et ><-7> +< robes de mariee ><-7> +< secret de beaute ><-7> +< nokia nokia 3210 ><-7> +< sartoux mouansois auribeau ><-7> +< pima mercerized rayon ><-7> +< name translations ><-7> +< fresh air ><-7> +< solar spectral ><-7> +< keywords content girl ><-7> +< insult ><-7> +< de la sante ><-7> +< content traduction parole ><-7> +< ouest 2000 name ><-7> +< florent name ><-7> +< conference danse art ><-7> +< darkroom gay ><-7> +< advertentierubrieken adverteren ><-7> +< jeremy chatelain ><-7> +< trial la lune ><-7> +< turbo nfs x ><-7> +< salon forum debat ><-7> +< content oriental dragon ><-7> +< grating complete ><-7> +< bulky ><-7> +< the bad ><-7> +< unobtrusive windows 95 ><-7> +< roofing siding ><-7> +< vacances rencontre ><-7> +< ryanair ><-7> +< content lars schumann ><-7> +< information sur ><-7> +< internet hebergement de ><-7> +< dog obedience training ><-7> +< karaoke musica musica ><-7> +< dernieres nouvelles ><-7> +< lecture l ><-7> +< drivers for all ><-7> +< 30days ><-7> +< shui ><-7> +< savage ><-7> +< okacha localyweb ><-7> +< 06370 ><-7> +< content 3suisses fr ><-7> +< marchander ><-7> +< content afrique safari ><-7> +< opinions girls opinions ><-7> +< antwoorden probeer een ><-7> +< catholique ><-7> +< drivers cd ><-7> +< ebusiness name ><-7> +< droles sont ><-7> +< net humourdunet ><-7> +< home cinema home ><-7> +< html editor natweb ><-7> +< m e ><-7> +< us ascii ><-7> +< cincroyable incroyable umour ><-7> +< dragonballgt ><-7> +< outil outils ><-7> +< website bezoekers pageviews ><-7> +< americain ><-7> +< tahlilleri ><-7> +< cactus 011 ><-7> +< ligne du catalogue ><-7> +< soothing menthol tight ><-7> +< liens infos ><-7> +< 1 fernando alonso ><-7> +< pronostic ><-7> +< plan gratuit greenpeace ><-7> +< 4 decembre ><-7> +< sons des videos ><-7> +< content traduction des ><-7> +< keywords lang it ><-7> +< cd dvd logiciels ><-7> +< author content lars ><-7> +< blagues gifs animes ><-7> +< de plage thalassotherapie ><-7> +< zimmer ><-7> +< terror ><-7> +< put ><-7> +< probleme de ><-7> +< services gratuits forum ><-7> +< mexique ><-7> +< de liefde ><-7> +< windsor ><-7> +< xstart xsession ><-7> +< publisher lang fr ><-7> +< root metisse ><-7> +< marmit ><-7> +< shareware jeux ><-7> +< theleme net r ><-7> +< keywords content silver ><-7> +< wanadoo name ><-7> +< equiv description name ><-7> +< room uk teenagers ><-7> +< owner content marc ><-7> +< 3 cms sneakercommunity ><-7> +< content chanteur ><-7> +< de balades en ><-7> +< photoway ><-7> +< magnetoscope ><-7> +< vt220 ><-7> +< 06250 ><-7> +< cuisine mariage ><-7> +< 02 name ><-7> +< hp printer drivers ><-7> +< proche de ><-7> +< cannes et ><-7> +< video sur ><-7> +< keywords content numeriser ><-7> +< xsession ><-7> +< kureyon silk garden ><-7> +< satis ><-7> +< site un ><-7> +< detection alert view ><-7> +< catalogue conseils personnalises ><-7> +< heel ><-7> +< intel ><-7> +< q all ><-7> +< photo pc telephone ><-7> +< gags sexy divertissement ><-7> +< 1973 ><-7> +< angers histoire ><-7> +< content expo photo ><-7> +< australe voyages aventures ><-7> +< content _top driverguide ><-7> +< des membres de ><-7> +< film de votre ><-7> +< page vous ><-7> +< dc relation url ><-7> +< genuwine hip ><-7> +< metisse name robots ><-7> +< dragon paintings dragon ><-7> +< modelfotograaf ><-7> +< contre l ><-7> +< deeper kyo ring ><-7> +< fci ><-7> +< luminaire luminaires ><-7> +< votre un ><-7> +< spannend eenzaam adverteren ><-7> +< tatu tatto tattoo ><-7> +< avertis ou ><-7> +< aide humanitaire ><-7> +< tiznit mariage ><-7> +< godreche ><-7> +< sexy et gore ><-7> +< materials name ><-7> +< underground kathar6 ><-7> +< melodysoft com name ><-7> +< danse art ><-7> +< vlaanderen luik ><-7> +< des sms ><-7> +< marque nfsite ><-7> +< letteratura ><-7> +< stunt ><-7> +< anglais americain ><-7> +< yazarlar name page ><-7> +< cheveux crepus ><-7> +< flood ><-7> +< onbeperkt ><-7> +< 1997 06 0500 ><-7> +< gratis heren ><-7> +< finding downloading and ><-7> +< control name keywords ><-7> +< 5 1 ><-7> +< luminaire ><-7> +< patrimoine region ><-7> +< pandas chicago ><-7> +< content 79 windows ><-7> +< directamente ><-7> +< surfing detection ><-7> +< exposer numerique argentique ><-7> +< engine rocket ><-7> +< nouvelles normes de ><-7> +< asia oriental watercolor ><-7> +< news ainsi que ><-7> +< critique bibliotheque ><-7> +< refresh content netscape ><-7> +< entreprise soigne ><-7> +< 1 s 0 ><-7> +< australie ><-7> +< symbol masculin ><-7> +< 06 0500 ><-7> +< le cheval ><-7> +< psy drogue ><-7> +< filmo ><-7> +< content rouen ><-7> +< refresh teenagers ><-7> +< gratuitos usados ><-7> +< content lycos fr ><-7> +< cannes et sa ><-7> +< camescopes ><-7> +< ringtone free ><-7> +< equipment dog tracking ><-7> +< lise charmel barbara ><-7> +< di cartoni animati ><-7> +< teen emotions ><-7> +< maillot deux ><-7> +< drivers cdrom ><-7> +< free game ><-7> +< birkedal og ><-7> +< koppelen ><-7> +< elageur ><-7> +< cubes ><-7> +< coutumes bijoux costumes ><-7> +< 138 bourget forum ><-7> +< homepagevorlagen ><-7> +< 79 windows nt ><-7> +< digital imaging name ><-7> +< sport sports musculation ><-7> +< content mariage name ><-7> +< retrouvailles recherche amis ><-7> +< et vente janine ><-7> +< altro sulle ><-7> +< pkk apo ><-7> +< bereikbaar ><-7> +< collectif automobile des ><-7> +< mensen met dezelfde ><-7> +< gites de ><-7> +< femmes feminismes ><-7> +< aimer coeur ><-7> +< slayers kimagure ><-7> +< mohair bulky ><-7> +< afils ><-7> +< game flash ><-7> +< langue des signes ><-7> +< meer bezoekers ><-7> +< pooh ><-7> +< civil ><-7> +< content sport ><-7> +< actief ><-7> +< plage thalassotherapie balneotherapie ><-7> +< pool ><-7> +< schumann name ><-7> +< bicycles ><-7> +< les horoscopes chinese ><-7> +< bien plus encore! ><-7> +< pmi pme ><-7> +< malte ><-7> +< desorganisation microcalcification ><-7> +< janine robin ><-7> +< internet explorer ><-7> +< le cancer du ><-7> +< official band ><-7> +< lose weight ><-7> +< supply schutzhund ><-7> +< du rire du ><-7> +< retrouve ><-7> +< culte cultuel ><-7> +< unicorn ><-7> +< soneries ><-7> +< studios dragon ><-7> +< uefa ><-7> +< et horloges la ><-7> +< peppers ><-7> +< negli ><-7> +< section speciale sur ><-7> +< negli anime ><-7> +< amour astrologie ><-7> +< svensk papillon pomeranian ><-7> +< en un karaoke ><-7> +< de films ><-7> +< paris mode fashion ><-7> +< and ventilation building ><-7> +< tips for a ><-7> +< windows pvc pipe ><-7> +< la creation ><-7> +< content klodcabit ><-7> +< decoration informatique home ><-7> +< quotidien horoscope jour ><-7> +< nfs x windows ><-7> +< anti chute ><-7> +< king cole luxury ><-7> +< sports musculation ordinateur ><-7> +< content elevage ><-7> +< numeriser ><-7> +< les boutiques en ><-7> +< bigfoot ><-7> +< grumly ><-7> +< loubet del ><-7> +< cgi java html ><-7> +< document vierge ><-7> +< region annuaire evenements ><-7> +< antwerpen gent brugge ><-7> +< bain de mer ><-7> +< device ><-7> +< are your heroic ><-7> +< description content kyocera ><-7> +< peer ><-7> +< rongeurs sexage dimorphisme ><-7> +< rating content home ><-7> +< instructional how ><-7> +< hair care ><-7> +< chaine la ><-7> +< content cartes ><-7> +< rayon viscose needles ><-7> +< online teen ><-7> +< petites annonces du ><-7> +< for apache installation ><-7> +< rater ><-7> +< les compatibilites les ><-7> +< les archives ><-7> +< portail litteraire roman ><-7> +< boards uk teen ><-7> +< oriental dragons oriental ><-7> +< loisirs hobbies ><-7> +< itchy scalp ><-7> +< melodysoft recursos cgi ><-7> +< avila ><-7> +< education formation enseignement ><-7> +< guide net name ><-7> +< counter web counter ><-7> +< content building ><-7> +< ipr name ><-7> +< hard drives ><-7> +< content normal http ><-7> +< hard discount hard ><-7> +< homosexuality ><-7> +< magique ><-7> +< club fan ><-7> +< loisirs dysneyland ><-7> +< e ouest name ><-7> +< yoda name reply ><-7> +< antipode liberte la ><-7> +< retailer ><-7> +< devlet millet ><-7> +< pps jeux ><-7> +< et les formes ><-7> +< jan 1997 ><-7> +< pictures photography ><-7> +< anes anes anes ><-7> +< gendarme ><-7> +< recherche amis souvenirs ><-7> +< ailleurs diouda le ><-7> +< welcome to advance ><-7> +< content vrp ><-7> +< licorne ><-7> +< poneys ane ane ><-7> +< nederlandstalige ><-7> +< spectrum spectroscope webcam ><-7> +< k9 schutzhund trainer ><-7> +< fraternite salon ><-7> +< oriental watercolor paintings ><-7> +< de fabricant ><-7> +< bd au jour ><-7> +< republique republicain ><-7> +< driverguide ><-7> +< warez hacking webcam ><-7> +< 8 au dv ><-7> +< ascendant ><-7> +< network administration analysis ><-7> +< kiss cool orangina ><-7> +< interviews tattoo ><-7> +< star trek ><-7> +< bd bande bande ><-7> +< costa de ><-7> +< en pays d ><-7> +< education poesies ><-7> +< cayenne ><-7> +< peintures peinture ><-7> +< the american ><-7> +< des informations et ><-7> +< prix achat ><-7> +< equestres ><-7> +< prix art fnac ><-7> +< moyen de ><-7> +< video driver soundcard ><-7> +< content aeronet webagency ><-7> +< 2000 gmt ><-7> +< website statistieken ><-7> +< short shorty ><-7> +< model masculin beau ><-7> +< divx mpeg ><-7> +< content horoscope ><-7> +< michel barbot name ><-7> +< 5 50 4933 ><-7> +< gratuit top ><-7> +< daily music ><-7> +< fortes et ><-7> +< aujourd ><-7> +< direction ><-7> +< sanat edebiyat ><-7> +< cloud ><-7> +< calmer life ><-7> +< droles sont ici ><-7> +< tv makers ><-7> +< bibliotheques ><-7> +< guy de ><-7> +< franchise franchise name ><-7> +< storage ><-7> +< intervention ><-7> +< author content warren ><-7> +< training schutzhund ><-7> +< nbl ><-7> +< angers conseil ><-7> +< pyrenees orientales ><-7> +< monitor driver video ><-7> +< labradors retriever labrador ><-7> +< description content welkom ><-7> +< artist drasan nitti ><-7> +< musea ><-7> +< de mariees et ><-7> +< xdk 3d ><-7> +< 1 name sur ><-7> +< gratis gratuitos ><-7> +< content offres ><-7> +< 5 name robots ><-7> +< organic ><-7> +< israel ><-7> +< l objet de ><-7> +< network scanning ><-7> +< content toute ><-7> +< la ville d ><-7> +< 3 monitoring security ><-7> +< com mannequin paris ><-7> +< stellar and solar ><-7> +< customized ><-7> +< 1 name location ><-7> +< boogaloos http ><-7> +< masculin warren ><-7> +< de musiques ><-7> +< content montres ><-7> +< tattoo pictures and ><-7> +< scalp dry ><-7> +< horoscope chinois 2003 ><-7> +< lci les ><-7> +< soutiens gorges ><-7> +< blagues gifs ><-7> +< refresh teenagers embarrassment ><-7> +< martinique concours reunion ><-7> +< site pour faire ><-7> +< divx episode ><-7> +< applicaties programma verkoop ><-7> +< gale ><-7> +< description content kennel ><-7> +< fr quebec ca ><-7> +< interdiction suite ><-7> +< jupe pull ><-7> +< ecrire ><-7> +< november ><-7> +< labrador retriever ><-7> +< postiches eclaircissant name ><-7> +< content franck ><-7> +< welke ><-7> +< nordhorn name ><-7> +< 15 name description ><-7> +< chevaux chevaux chevaux ><-7> +< cambodge ><-7> +< en matiere de ><-7> +< service du ><-7> +< de bd ><-7> +< lingerie marque ><-7> +< police equipment ><-7> +< boule et ><-7> +< pareo robe ><-7> +< le sexe des ><-7> +< grue web ><-7> +< german shepherd training ><-7> +< 2 et ><-7> +< com r ne ><-7> +< etancheite ><-7> +< daniel gueguen ><-7> +< com r nb ><-7> +< beats hip ><-7> +< 190 ><-7> +< natweb 1 0 ><-7> +< reduction amazon ><-7> +< prenoms de fille ><-7> +< 5 freeware ><-7> +< surfing detection abuse ><-7> +< escapade ><-7> +< suivez l etoile ><-7> +< que se ><-7> +< abstract content silicon ><-7> +< vosges ><-7> +< 28 feb ><-7> +< speciales name title ><-7> +< republique republicain cite ><-7> +< in chinese ><-7> +< aimer coeur annonces ><-7> +< music from ><-7> +< network scanning network ><-7> +< gift shop galleries ><-7> +< etonnant ><-7> +< top annonces recontres ><-7> +< par ordinateur appareil ><-7> +< whassup wazzaa ><-7> +< rolling stones ><-7> +< recensies ><-7> +< of breakdance ><-7> +< normal http equiv ><-7> +< webvertisement commercieel site ><-7> +< e sur le ><-7> +< images gratuites gif ><-7> +< conseils personnalises astuces ><-7> +< drivers network adapters ><-7> +< guide recherche ><-7> +< pc telephone telephones ><-7> +< hip hop timeline ><-7> +< petites annonces auto ><-7> +< servidor ><-7> +< bezoeken ><-7> +< camescope camescopes camescope ><-7> +< tourisme education ><-7> +< com index ><-7> +< riviera paca ><-7> +< tanto altro sulle ><-7> +< keywords content afrique ><-7> +< la roquette ><-7> +< baladeurs mp3 ><-7> +< paroles wav ><-7> +< professionnelbienvenue dans l ><-7> +< cartes graphiques camescope ><-7> +< poneys poneys ane ><-7> +< net artiste album ><-7> +< tones gratuit gratuits ><-7> +< description content und ><-7> +< king charles ><-7> +< lesbiennes et ><-7> +< interip ><-7> +< de vacances et ><-7> +< a vendre ><-7> +< image animaux sauvages ><-7> +< photography name abstract ><-7> +< cms sneakercommunity ><-7> +< equipment online dog ><-7> +< greenpeace ecologie ><-7> +< painting oriental dragon ><-7> +< mauve ><-7> +< argentic 24x36 ><-7> +< for theleme net ><-7> +< training equipment ><-7> +< humours blagues ><-7> +< gratuit mp3 ><-7> +< balneotherapie thermalisme piscine ><-7> +< mohamed ><-7> +< jeux video jeu ><-7> +< luxury kid mohair ><-7> +< mandelocien pegomas ><-7> +< drivers soundcard ><-7> +< pull pantalon chaussures ><-7> +< people comte warren ><-7> +< nedstads netstats website ><-7> +< betrouwbare antwoorden probeer ><-7> +< communautaire permanente ><-7> +< gorge soutiens gorges ><-7> +< de bain balneaire ><-7> +< mp3 sound ><-7> +< louis ferdinand discussion ><-7> +< websitebouw ><-7> +< test jeux video ><-7> +< appareil photo pc ><-7> +< ontwerp webhosting ><-7> +< will make your ><-7> +< content de et ><-7> +< lauderbaugh ><-7> +< nedstads ><-7> +< comics universe ><-7> +< un ami amis ><-7> +< bourse loteries coupons ><-7> +< pac ><-7> +< son petit rongeur ><-7> +< groupes ubu antipode ><-7> +< cd rom drivers ><-7> +< internet advertising ><-7> +< vinyl siding ><-7> +< copyright content micrologiciel ><-7> +< bottoni circuiti di ><-7> +< photo expo ><-7> +< scambio bottoni circuiti ><-7> +< quran ><-7> +< novita gedifra ><-7> +< us name rating ><-7> +< talk show ><-7> +< ravage hom franchise ><-7> +< b movie ><-7> +< giant panda ><-7> +< pad ><-7> +< adults magazines online ><-7> +< driver soundcard drivers ><-7> +< resimler pkk name ><-7> +< e ouest ><-7> +< kar wai ><-7> +< sainte ><-7> +< banner scambio ><-7> +< content renault ><-7> +< bedrijven ><-7> +< paris10 fr ><-7> +< caution sort ><-7> +< des sons des ><-7> +< dragon paintings ><-7> +< et l innovation ><-7> +< de travail ><-7> +< scambio bottoni ><-7> +< search profiles ><-7> +< hop resource ><-7> +< proprio ><-7> +< ring tones gratuit ><-7> +< coccinelle ><-7> +< enfant sport ><-7> +< martinique guadeloupe guyane ><-7> +< propria ><-7> +< cgis ><-7> +< de canciones ><-7> +< lausanne ><-7> +< indiana ><-7> +< police dog ><-7> +< lars ><-7> +< tn3270 tn5250 ><-7> +< d enfance ><-7> +< rencontre hommes homme ><-7> +< animes cinema ><-7> +< suisse ch blondes ><-7> +< saver ><-7> +< bac granger ><-7> +< houellebecq ><-7> +< hunks ><-7> +< offres speciales name ><-7> +< arts oriental dragons ><-7> +< tn5250 ><-7> +< direct cam ><-7> +< news ainsi ><-7> +< content 75017 ><-7> +< regia sock lace ><-7> +< qui veut ><-7> +< eurodisney disneyland ><-7> +< ecusson ><-7> +< futon futons ><-7> +< vergleichen preis und ><-7> +< 1900 gmt ><-7> +< content 1999 ><-7> +< designs name translation ><-7> +< mariage marocain ><-7> +< business using ><-7> +< charset big5 yahoo! ><-7> +< rider ><-7> +< rides ><-7> +< frances ><-7> +< piscine ile vacances ><-7> +< sonerie ringtone gratuite ><-7> +< entre particuliers maison ><-7> +< monitoring security ><-7> +< ecologie couples homme ><-7> +< content advancestats ><-7> +< 06250 06550 06810 ><-7> +< 3dfx ><-7> +< met dezelfde ><-7> +< gestion de la ><-7> +< content silver ><-7> +< booster son trafic ><-7> +< en images ><-7> +< 1 interdiction suite ><-7> +< keywords content computer ><-7> +< cable acces ><-7> +< kyo ><-7> +< gifts dragon ><-7> +< index follow lycos ><-7> +< habillage ><-7> +< supplies chinese watercolor ><-7> +< est souvent delicat ><-7> +< instrument de ><-7> +< heroic search results ><-7> +< milano combs ><-7> +< opacite ><-7> +< pubs delire le ><-7> +< travers l afrique ><-7> +< set www ><-7> +< dragons chinese ><-7> +< fab mouloud album ><-7> +< 996 ><-7> +< alert view ><-7> +< content certainteed insulation ><-7> +< title alternative ><-7> +< andre brunsperger afrique ><-7> +< de photo galerie ><-7> +< annonces automobiles ><-7> +< achterhoek ><-7> +< gargantua ><-7> +< maritimes 06 ><-7> +< communication opinion ><-7> +< bon genie creez ><-7> +< text homepage organizational ><-7> +< mammotome imagerie ><-7> +< homepage organizational name ><-7> +< images sons ><-7> +< 3suisses fr ><-7> +< access control ><-7> +< 20010325 ><-7> +< site en construction ><-7> +< content kreestal name ><-7> +< spectrum objective prism ><-7> +< content business ><-7> +< photo hot ><-7> +< people comte ><-7> +< carte graphique cartes ><-7> +< breton rennes ><-7> +< pam ><-7> +< tattoo tattooing tatoo ><-7> +< keywords content flash ><-7> +< betisier jour france ><-7> +< illustrator ><-7> +< 2003 veloxia network ><-7> +< proprio sito web ><-7> +< comment modifier un ><-7> +< style theories ><-7> +< du super 8 ><-7> +< polar education finance ><-7> +< complete with ><-7> +< portable mobile ><-7> +< pantalon blouson cotte ><-7> +< change ><-7> +< beaute black ><-7> +< php nuke 7 ><-7> +< camarades ><-7> +< xxx hot hackers ><-7> +< abc club club ><-7> +< dandruff protection dandruff ><-7> +< 1 main ><-7> +< models amsterdam ><-7> +< sunos ><-7> +< bezoekers informatie website ><-7> +< lyrics pictures ><-7> +< domain name ><-7> +< registratiedienst name abstract ><-7> +< model homme top ><-7> +< soothing ><-7> +< movie gazette com ><-7> +< poplocking ><-7> +< kassav fille ><-7> +< ordenador en un ><-7> +< l inde ><-7> +< photo galerie expositions ><-7> +< tf1 fr le ><-7> +< maternelle ><-7> +< equipment k9 k9 ><-7> +< femmes en ><-7> +< zambie ><-7> +< 1 ouestu accueil ><-7> +< de libros de ><-7> +< ecran fond ecran ><-7> +< webdesign freelance name ><-7> +< dolly parton ><-7> +< dc audience content ><-7> +< copains d avant ><-7> +< l industrie ><-7> +< brocante ><-7> +< aba bmx ><-7> +< on the market ><-7> +< volunteers ><-7> +< jongen man vrouw ><-7> +< photos et le ><-7> +< content normal ><-7> +< noord limburg ><-7> +< soldano name description ><-7> +< chaine la la ><-7> +< fille martinique ><-7> +< enfant enfants mode ><-7> +< cdrom driver modem ><-7> +< 2 days karamba! ><-7> +< lecteurs dvd televiseur ><-7> +< mmorpg ><-7> +< lingerie feminine creation ><-7> +< budweiser axe ><-7> +< recherche sante social ><-7> +< des signes ><-7> +< departement ><-7> +< napoule napoulois ><-7> +< permanente veritable vitrine ><-7> +< ch blondes ><-7> +< manufacturer building ><-7> +< schutzhund ><-7> +< comics universe is ><-7> +< gratuitos usados en ><-7> +< translations along with ><-7> +< bhumour guide net ><-7> +< souvent delicat ><-7> +< one fine ><-7> +< comparer shopping ><-7> +< download sound ><-7> +< stres ><-7> +< filtre ><-7> +< and driver search ><-7> +< parc a ><-7> +< girl magazines teen ><-7> +< art festival ><-7> +< poeme ><-7> +< artist gallery dragon ><-7> +< creator personalname content ><-7> +< virtuelles et name ><-7> +< tuyau ><-7> +< delire ablague son ><-7> +< labradors retriever ><-7> +< fabricant boutique ><-7> +< gallery name description ><-7> +< vogue choix ><-7> +< web site was ><-7> +< traffic com r ><-7> +< derbi ><-7> +< fre name ><-7> +< shopping chatroom teen ><-7> +< fine fabricant ><-7> +< les trans ><-7> +< malcolm ><-7> +< database koppeling ><-7> +< content site sur ><-7> +< akira ><-7> +< page name revisit ><-7> +< releases ><-7> +< chaussures lingerie ><-7> +< moto magazine ><-7> +< louise ><-7> +< content webcam webcams ><-7> +< amateur spectroscopy with ><-7> +< keywords content games ><-7> +< 3 monitoring ><-7> +< carrickfergus 107 ><-7> +< rapportages website ><-7> +< son golf et ><-7> +< andre fr ><-7> +< karaoke karaoke ><-7> +< miniature gravhund gravhund ><-7> +< expires content 01 ><-7> +< content eng ><-7> +< france name robots ><-7> +< goldenmarket name ><-7> +< month name author ><-7> +< les horoscopes ><-7> +< fnac com ><-7> +< bent ><-7> +< and horoscope ><-7> +< faire des affaires ><-7> +< photographies photography ><-7> +< image jpg ><-7> +< site univers bd ><-7> +< originaux ><-7> +< designs licensed art ><-7> +< content viamichelin ><-7> +< content jefroux name ><-7> +< applicatie ><-7> +< 2003 horoscope amoureux ><-7> +< 0 0 html ><-7> +< mythology ><-7> +< aanbod ><-7> +< rencontre paris rencontres ><-7> +< en betrouwbare ><-7> +< internationales en ><-7> +< meuble meubles ><-7> +< trouve des contenus ><-7> +< 2000 la rabade ><-7> +< chat room uk ><-7> +< charles spaniel ><-7> +< fr ca http ><-7> +< plans gratos ><-7> +< masculins name ><-7> +< nouvelles conditions de ><-7> +< televiseur televiseurs ><-7> +< vacances rencontre essonne ><-7> +< bookmark signet ><-7> +< 0 trial http ><-7> +< etc driverguide com ><-7> +< gargantua rabelais ><-7> +< dance history of ><-7> +< content jefroux ><-7> +< hom franchise ><-7> +< voyages aventures et ><-7> +< health name dc ><-7> +< author content veloxia ><-7> +< jeans jean chaussures ><-7> +< keywords content bmx ><-7> +< keywords content bricolage ><-7> +< follow lycos ><-7> +< 24x36 naked nude ><-7> +< fincam ><-7> +< bustier nageur brassiere ><-7> +< sponsors offres ><-7> +< parc a themes ><-7> +< en bois ><-7> +< identifier content revues ><-7> +< cyberlol com ><-7> +< une simple aventure ><-7> +< boutonnat ><-7> +< culture celine ><-7> +< hebergement payant ><-7> +< mobiles mobile ><-7> +< gestion de ><-7> +< icbm content 48 ><-7> +< crack hack ><-7> +< toevoegen ><-7> +< menthol tight scalp ><-7> +< mois horoscope gratuit ><-7> +< flockhart ><-7> +< and shoulders ><-7> +< de la moto ><-7> +< centrale ><-7> +< vrp ><-7> +< harassment ><-7> +< l annuaire des ><-7> +< en tout genre ><-7> +< your business using ><-7> +< content beaute black ><-7> +< los angeles lapd ><-7> +< astrology chinese ><-7> +< portable portables baladeur ><-7> +< vga ><-7> +< driver soundcard ><-7> +< cb 1 gen ><-7> +< slip culotte ><-7> +< mannequin paris mode ><-7> +< exposition agenda ><-7> +< couples homme vacances ><-7> +< 0 3suisses ><-7> +< gifs animes animes ><-7> +< drogues ><-7> +< blocco note ><-7> +< aka ><-7> +< cameras kyocera finecam ><-7> +< harmful ><-7> +< du tres ><-7> +< silk garden ><-7> +< to advance stats ><-7> +< uploading and file ><-7> +< angers ville ><-7> +< konzerte ><-7> +< hair shampoo ><-7> +< airlines ><-7> +< pas du ><-7> +< indre ><-7> +< ailleurs acne dermablend ><-7> +< fabricant createur ><-7> +< al proprio ><-7> +< chinese chinoise ><-7> +< street dance ><-7> +< du coeur ><-7> +< creator personalname address ><-7> +< dur disques ><-7> +< photos image ><-7> +< ulysse ><-7> +< _top driverguide ><-7> +< content jean christophe ><-7> +< horoscope amoureux astrologie ><-7> +< studios parcs de ><-7> +< editor natweb ><-7> +< horoscope jour horoscope ><-7> +< breakdance limpbizkit rollin ><-7> +< de rajewicz warren ><-7> +< official band website ><-7> +< mouginois mouans ><-7> +< content _top interip ><-7> +< publisher content juergen ><-7> +< images wallpapers discussions ><-7> +< ou d ailleurs ><-7> +< knitting crochet ><-7> +< reporting ><-7> +< de bain articles ><-7> +< poneys poneys ><-7> +< finecam ><-7> +< gratuitement et quotidiennement ><-7> +< drivers http ><-7> +< femelle lapin cochon ><-7> +< online the official ><-7> +< sahara fes nord ><-7> +< to content e ><-7> +< fichiers remis ><-7> +< refresh content asp ><-7> +< haut un portail ><-7> +< art giant panda ><-7> +< of rap ><-7> +< themes ses son ><-7> +< pour grosses ><-7> +< calmer ><-7> +< sugar ><-7> +< history of breakdance ><-7> +< des passionnes et ><-7> +< arcade ><-7> +< kimagure ><-7> +< tone ring ><-7> +< type of ><-7> +< antwerpen gent ><-7> +< filmati serie sailor ><-7> +< playa del ingles ><-7> +< content ccd ><-7> +< keywords content trans ><-7> +< marguerite ><-7> +< prenoms de garcon ><-7> +< hebdomadaire horoscope quotidien ><-7> +< content petite enfance ><-7> +< pvc pipe decking ><-7> +< religion culte cultuel ><-7> +< branche produkt ><-7> +< paiement en ligne ><-7> +< mensuel horoscope gratuit ><-7> +< 8859 1 bi ><-7> +< aumentare gratis la ><-7> +< redirection ><-7> +< avl ><-7> +< aba bmx nbl ><-7> +< las directamente ><-7> +< give aways free ><-7> +< apo asker ><-7> +< games sex ><-7> +< driver modem ><-7> +< lara fabian ><-7> +< continue par les ><-7> +< chinese calligraphy spirit ><-7> +< histoires betisier jour ><-7> +< novita gedifra pattern ><-7> +< ambulancier ><-7> +< grumly peluche grumly ><-7> +< karamba! welcome ><-7> +< content natweb ><-7> +< lovely defrisants catalogue ><-7> +< description content mannen ><-7> +< personnalise horoscope ><-7> +< photos inedites des ><-7> +< m aime ><-7> +< thriller ><-7> +< and installing ><-7> +< dutch name robots ><-7> +< sunos solaris ><-7> +< grating spectrograph and ><-7> +< maquillage commande ><-7> +< dandruff shampoo ><-7> +< conte montaigne duras ><-7> +< content blagues gifs ><-7> +< xwindows telnet ><-7> +< ski montagne ><-7> +< counters hit ><-7> +< a voir! ><-7> +< et horloges ><-7> +< kreestal name copyright ><-7> +< publisher content franck ><-7> +< strumento ideale ><-7> +< ost ><-7> +< sharing and ><-7> +< godreche achat argent ><-7> +< advertenties zoekertjes ><-7> +< toute l actualite ><-7> +< for accro photo ><-7> +< gallery expo exposition ><-7> +< fr tf1 le ><-7> +< hosting website ><-7> +< keywords content tricot ><-7> +< hair beauty ><-7> +< community problems advice ><-7> +< froid ><-7> +< content vin ><-7> +< comuneris http equiv ><-7> +< with chinese ><-7> +< safari safari safaris ><-7> +< reserver ><-7> +< description content viamichelin ><-7> +< maquinay ><-7> +< hommes enfant enfants ><-7> +< intrusion intranet ><-7> +< offers the ><-7> +< subject content kennel ><-7> +< parole chanson lyric ><-7> +< nedstat alles ><-7> +< relation url ><-7> +< young adults magazines ><-7> +< regie pub ><-7> +< content radius ><-7> +< dragon dragon artist ><-7> +< nu objectif ><-7> +< wav mod ><-7> +< arts oriental ><-7> +< cairn terrier beagle ><-7> +< 3330 melodie ><-7> +< azur riviera ><-7> +< english name distribution ><-7> +< un internet haut ><-7> +< sigle filmati recensioni ><-7> +< revues org ><-7> +< de lancement a ><-7> +< content mon 01 ><-7> +< cam cams camera ><-7> +< exe zip ><-7> +< 30 sur ><-7> +< plus droles sont ><-7> +< licensed art wholesale ><-7> +< liberty access ><-7> +< 3330 name dc ><-7> +< fuji ><-7> +< 1250 http ><-7> +< eilanden ><-7> +< horoscope journalier horoscope ><-7> +< gifts and collectables ><-7> +< de mer natation ><-7> +< backgrounds buttons ><-7> +< 1 maillot de ><-7> +< criteres de recherche ><-7> +< lol cyberlol com ><-7> +< rencontres transmusicales ><-7> +< numerologie ><-7> +< gerard mahdessian ><-7> +< finecam s3 finecam ><-7> +< heroic fantasy ><-7> +< du super ><-7> +< de lci les ><-7> +< jeux educatifs ><-7> +< site internet pour ><-7> +< circuiti ><-7> +< fes nord sud ><-7> +< www les3epices ><-7> +< en ligne mode ><-7> +< subtitle ><-7> +< connaissance exigence culture ><-7> +< tatu tatto ><-7> +< kimagure ranma name ><-7> +< edinburgh ><-7> +< mec warren de ><-7> +< of fresh ><-7> +< john woo takeshi ><-7> +< mpeg webmaster ><-7> +< e ouest 2000 ><-7> +< lequel ><-7> +< en continue par ><-7> +< abdelilah name description ><-7> +< domeinnaam name dc ><-7> +< phenicienne ><-7> +< beni ><-7> +< forme et ><-7> +< technique recherche ><-7> +< kids young adults ><-7> +< teaching ><-7> +< prenoms garcons en ><-7> +< yes http ><-7> +< gadolinium iode ><-7> +< photo name author ><-7> +< formularios los servicios ><-7> +< par over ><-7> +< content a la ><-7> +< lady di ><-7> +< des acteurs de ><-7> +< mylene farmer ><-7> +< assistance forums et ><-7> +< online teen links ><-7> +< danyboon name date ><-7> +< targa ><-7> +< hop asphalte hurlante ><-7> +< windows building materials ><-7> +< robes maillot ><-7> +< cdrom drivers modem ><-7> +< velos ><-7> +< sistema de las ><-7> +< de soiree robe ><-7> +< roman ecrivain polar ><-7> +< humoristique animaux ><-7> +< vets ><-7> +< larges femmes rondes ><-7> +< greek ><-7> +< description content featuring ><-7> +< bienvenu e sur ><-7> +< paris10 fr name ><-7> +< dial up ><-7> +< francophone connaissance exigence ><-7> +< prenoms masculins ><-7> +< guitare name ><-7> +< content certainteed building ><-7> +< mp3 archive ><-7> +< pubblicita gratis scambio ><-7> +< antwoorden ><-7> +< name keywords value ><-7> +< fernando alonso ><-7> +< all tattoos ><-7> +< tracing bezoekcijfers ><-7> +< robots in ><-7> +< edenpics nature photography ><-7> +< franck maquinay ><-7> +< basic teller voor ><-7> +< content par ><-7> +< content mariage marocain ><-7> +< server page ><-7> +< 07 http ><-7> +< exposer http ><-7> +< nieuws sport ><-7> +< sketches et des ><-7> +< vlaanderen luik brussel ><-7> +< nous etions ><-7> +< kontakt darkroom ><-7> +< flamenco ><-7> +< calligraphy paintings ><-7> +< homestead com ><-7> +< enfant sport decoration ><-7> +< content association des ><-7> +< content searchengine ><-7> +< 0 9 ><-7> +< le site non ><-7> +< exposition calendar free ><-7> +< essai critiques lecture ><-7> +< content de registratiedienst ><-7> +< rock steady crew ><-7> +< la cite ><-7> +< licensed art ><-7> +< gay youth ><-7> +< calligraphy spirit of ><-7> +< driverguide com ><-7> +< argentic ><-7> +< tn3270 tn5250 hummingbird ><-7> +< mosquitoes ><-7> +< dakar ><-7> +< 50 cent ><-7> +< vetement travail ><-7> +< pubs tele ><-7> +< perso hebergement ><-7> +< conseil mun ><-7> +< france name language ><-7> +< backup drivers hp ><-7> +< boy good boy ><-7> +< left ><-7> +< site d information ><-7> +< montres pour femmes ><-7> +< content webhosting ><-7> +< turboprop ><-7> +< inscriptions ><-7> +< owns content ><-7> +< references name ><-7> +< of celebrity ><-7> +< danseuse orientale ><-7> +< formations ><-7> +< ahmed ><-7> +< tracking tracing bezoekcijfers ><-7> +< www zexe ><-7> +< online internet ><-7> +< excursiones ><-7> +< after content nosland ><-7> +< network s l ><-7> +< ps ><-7> +< dog bite ><-7> +< content trans ><-7> +< lycos fr name ><-7> +< 2000 page ><-7> +< litterature scolaire universite ><-7> +< technologie et ><-7> +< creation prestige ><-7> +< de visita formularios ><-7> +< consultez gratuitement et ><-7> +< rajewicz warren de ><-7> +< correspondance dark ><-7> +< la bretagne ><-7> +< syndicat ><-7> +< 2001 gmt page ><-7> +< jean denis ><-7> +< dbgt ><-7> +< gent brugge belgie ><-7> +< solo gateway unix ><-7> +< publicites publicite ><-7> +< rlogin rexec ><-7> +< transformers ><-7> +< bandeau short shorty ><-7> +< 8859 1 ouestu ><-7> +< intrusion ><-7> +< 8859 1 union ><-7> +< van nederland name ><-7> +< content 2pac tupac ><-7> +< dc contributor corporatename ><-7> +< surf traffic ><-7> +< grumly ours ><-7> +< garcons en 2004 ><-7> +< gift ideas ><-7> +< trunk ><-7> +< site sites bouwen ><-7> +< prenoms feminins prenoms ><-7> +< mouloud album ><-7> +< collection of drivers ><-7> +< channing ><-7> +< dance dancing ><-7> +< gouda groningen ><-7> +< 2004 rennes site ><-7> +< aux nouvelles ><-7> +< sexisme sexisme forum ><-7> +< body modification ><-7> +< javachat ><-7> +< cinquieme ><-7> +< libros de ><-7> +< van onze producten! ><-7> +< careers ><-7> +< progressive ><-7> +< video toute ><-7> +< eumig kodak heutier ><-7> +< aide les ><-7> +< chat actualite ><-7> +< know about ><-7> +< site was ><-7> +< fine yarn all ><-7> +< for theleme ><-7> +< be suisse ch ><-7> +< clothes and ><-7> +< animes images ><-7> +< category content literature ><-7> +< online the ><-7> +< sejour vacances ><-7> +< numerique argentique 24x36 ><-7> +< e marketing ><-7> +< d humour et ><-7> +< droles rigoler ><-7> +< gif animes gifs ><-7> +< warren fan club ><-7> +< carpenter ><-7> +< nude portrait ><-7> +< maison canape futon ><-7> +< midi karaoke ><-7> +< la en ><-7> +< images bodyart ><-7> +< autographseek 011 ><-7> +< keywords content drivers ><-7> +< frises perruques ><-7> +< no accro ><-7> +< rubrieken gratis heren ><-7> +< liseurs debat houellebecq ><-7> +< keywords content angers ><-7> +< bonnes affaires pour ><-7> +< asphalte hurlante name ><-7> +< p2 ><-7> +< mannequin warren warren ><-7> +< televiseurs ><-7> +< mouse driver ><-7> +< droits name robots ><-7> +< content ssilicon silicon ><-7> +< on line rapportages ><-7> +< serie preferite di ><-7> +< p1 ><-7> +< disneyland paris walt ><-7> +< environnement patriotisme quartier ><-7> +< en 6 ><-7> +< willow ><-7> +< photo photographie photographies ><-7> +< half life ><-7> +< japanimation ><-7> +< description content tous ><-7> +< 6 ammin ><-7> +< comuneris http ><-7> +< nc blog ><-7> +< valais ><-7> +< cotte combinaison securite ><-7> +< chihuahua hundehvalpe ><-7> +< internet hebergement ><-7> +< catalogue catalogues demande ><-7> +< content suivez l ><-7> +< cartes postales francais ><-7> +< greeting and note ><-7> +< top annonces ><-7> +< mer natation ><-7> +< sebastien name owner ><-7> +< dc title alternative ><-7> +< description content advancestats ><-7> +< marseillais ><-7> +< tv reality ><-7> +< sites for teenager ><-7> +< homme club ><-7> +< zambie et ><-7> +< photographies de chevaux ><-7> +< portables nokia nokia ><-7> +< photographie photographis photographi ><-7> +< mind design ><-7> +< dessins animes cinema ><-7> +< artist drasan ><-7> +< process for ><-7> +< medieval renaissance ><-7> +< tattoos designs tattoo ><-7> +< locking poplocking break ><-7> +< ata osman osmanli ><-7> +< unknown ><-7> +< diets ><-7> +< robin boutique creation ><-7> +< content kyocera cameras ><-7> +< typographie ><-7> +< seul le ><-7> +< annuaire europe ><-7> +< teen shops ><-7> +< printer drivers soundcard ><-7> +< choquantes ><-7> +< here are your ><-7> +< p1 p2 p3 ><-7> +< pelote de ><-7> +< 3210 3310 3410 ><-7> +< carrey ><-7> +< arctura kinetic chronograph ><-7> +< beleggen ><-7> +< janine robin boutique ><-7> +< scambio advert ><-7> +< trans musicales 2 ><-7> +< dauphins ><-7> +< _top interip ><-7> +< advertentierubrieken adverteren webvertisement ><-7> +< vrouwen met ><-7> +< dailmer fiatavio ><-7> +< heche ><-7> +< les journalistes ><-7> +< des informations sur ><-7> +< modifier un projecteur ><-7> +< mace programmation liens ><-7> +< de bain maillots ><-7> +< animaux annonces ><-7> +< ablague son ><-7> +< guzzi ><-7> +< giant panda prints ><-7> +< recherche pour ><-7> +< pima mercerized ><-7> +< suivez ><-7> +< des lesbiennes ><-7> +< katz ><-7> +< anciens eleves trombinoscope ><-7> +< gazete ><-7> +< lodge ><-7> +< con tarjeta ><-7> +< name generatorle site ><-7> +< content veloxia network ><-7> +< registratiedienst name dc ><-7> +< gratis la propria ><-7> +< cards fine ><-7> +< lunatic ><-7> +< reba mcentire ><-7> +< un site qui ><-7> +< oman ><-7> +< garcon les ><-7> +< content homepage diouda ><-7> +< nosland name copyright ><-7> +< online name copyright ><-7> +< beepworld de seite ><-7> +< pull name ><-7> +< informatique disque ><-7> +< trial groupe ><-7> +< content commandez ><-7> +< finecam finecam digital ><-7> +< jour un ><-7> +< net name distribution ><-7> +< cards et bien ><-7> +< history and ><-7> +< e portare ><-7> +< twente utrecht eilanden ><-7> +< cotte ><-7> +< bottoni circuiti ><-7> +< remodeling ><-7> +< lingerie sexy soutien ><-7> +< gratuit greenpeace ><-7> +< poney poneys ><-7> +< by micrologiciel ><-7> +< domeinhost ><-7> +< dragons chinese calligraphy ><-7> +< la vente une ><-7> +< censure hentai hentai ><-7> +< libre expression webcam ><-7> +< sailor slayers ><-7> +< warnings ><-7> +< montreal new ><-7> +< bijoux montres ><-7> +< content afils ><-7> +< lars schumann ><-7> +< handicap handicaps ><-7> +< content certainteed ><-7> +< content afrique afrique ><-7> +< delire name description ><-7> +< subject content maillot ><-7> +< cheval cheval ><-7> +< miaou ><-7> +< danyboon ><-7> +< animation humour bhumour ><-7> +< int l ><-7> +< description content toute ><-7> +< vogue aran donegal ><-7> +< umour comique insolite ><-7> +< encheres genealogie ><-7> +< 2000 kennel birkedal ><-7> +< detection abuse intrusion ><-7> +< forum snecma ><-7> +< and electric boogaloos ><-7> +< et luminaires ><-7> +< love aimer coeur ><-7> +< chicago il ><-7> +< robes de robe ><-7> +< tapis lit lits ><-7> +< photographis photographi ><-7> +< bain balneaire ><-7> +< guilhot olivier name ><-7> +< materials manufacturer insulation ><-7> +< keywords content t ><-7> +< 20011001 name reply ><-7> +< cheveux crepus d ><-7> +< best teen chat ><-7> +< edenpics nature ><-7> +< history learn how ><-7> +< bijoux art festival ><-7> +< problems advice name ><-7> +< voyages voyage ><-7> +< annuaire lien ><-7> +< localyweb ><-7> +< content e ouest ><-7> +< keywords content maillot ><-7> +< paris sites de ><-7> +< toute une ><-7> +< une rencontre ou ><-7> +< a web site ><-7> +< seconds couteaux ><-7> +< anti sexisme ><-7> +< fichiers telephone ><-7> +< de photographies ><-7> +< anne heche ><-7> +< milletvekilleri bozkurt kurt ><-7> +< bosquet ><-7> +< comte warren de ><-7> +< programmer ><-7> +< autobots ><-7> +< combattant bel ><-7> +< finances ><-7> +< all sonneries soneries ><-7> +< content poil ><-7> +< name geo region ><-7> +< voyager ><-7> +< content alessio soldano ><-7> +< de robe ><-7> +< web camera ><-7> +< detective ><-7> +< maxi cd ><-7> +< prom ><-7> +< sante beaute ><-7> +< etapes epouse ><-7> +< appareil photo ><-7> +< bon genie annuaire ><-7> +< eiffel ><-7> +< voor je homepage ><-7> +< canarias ><-7> +< astronomy ccd absorption ><-7> +< mariage robes de ><-7> +< sorcerer ><-7> +< web site for ><-7> +< groupe humour ><-7> +< favoriser l ><-7> +< gallereis limited ><-7> +< arriver tout ><-7> +< musik music name ><-7> +< text and ><-7> +< laboratoires ><-7> +< 74 ><-7> +< bandeau short ><-7> +< de 2000 references ><-7> +< 76 ><-7> +< elizabeth taylor ><-7> +< driver cd ><-7> +< tyvek ><-7> +< psychologie oeuvres ><-7> +< same sex ><-7> +< osama ><-7> +< de site hebergement ><-7> +< cricket ><-7> +< jefroux ><-7> +< sunos solaris hpux ><-7> +< content la de ><-7> +< professionnel de ><-7> +< wool natural ><-7> +< 0 personal edition ><-7> +< bain et accessoires ><-7> +< brassiere bandeau short ><-7> +< abou ><-7> +< meteo mode pages ><-7> +< uk tribal ><-7> +< and scifi ><-7> +< initiative ><-7> +< mariage marocain traditions ><-7> +< etapes name ><-7> +< nouvelles conditions ><-7> +< cannois le cannet ><-7> +< scacchi ><-7> +< ebusiness http ><-7> +< nature histoire lettres ><-7> +< dragon studios dragon ><-7> +< guilhot olivier ><-7> +< available name keywords ><-7> +< culturel accueil loisirs ><-7> +< warren warren ><-7> +< annabel ><-7> +< lois ><-7> +< de l alliance ><-7> +< prenoms feminins ><-7> +< cheval des centaines ><-7> +< javascript java ><-7> +< methodos savoirs ><-7> +< finecam s3 ><-7> +< finecam s4 ><-7> +< finecam s5 ><-7> +< formula 1 formula ><-7> +< et de du ><-7> +< nouvel album asphalte ><-7> +< pokemons ><-7> +< 06110 06150 ><-7> +< okey ><-7> +< top tips top ><-7> +< aanbiedingen ><-7> +< of titan ><-7> +< fnac on ><-7> +< ca belge be ><-7> +< content c 1999 ><-7> +< culture culturel ><-7> +< siding vinyl windows ><-7> +< bon reduction amazon ><-7> +< content comment name ><-7> +< to build ><-7> +< content prenom fille ><-7> +< content academie ><-7> +< durs carte graphique ><-7> +< mariage prix de ><-7> +< site pour enfants ><-7> +< arire ><-7> +< france cinema video ><-7> +< libraire roman ><-7> +< net les ><-7> +< afspraakjes ontmoeten ><-7> +< photographies expedition ><-7> +< maladies ><-7> +< analyzer ><-7> +< corse immobilier ><-7> +< les a seduits ><-7> +< in the digital ><-7> +< emploi name ><-7> +< universitaire ><-7> +< melodie melodies ><-7> +< author content goldenmarket ><-7> +< one fine yarn ><-7> +< cdrom driver ><-7> +< et hebergement ><-7> +< the low ><-7> +< equipment schutzhund training ><-7> +< nan ><-7> +< realmente ><-7> +< bamboo recycled one ><-7> +< siding pvc pipe ><-7> +< ska punk ><-7> +< 2001 e ouest ><-7> +< lecteur dvd ><-7> +< op heel veel ><-7> +< heutier moteur pas ><-7> +< wool natural fiber ><-7> +< interview film name ><-7> +< 98 detection alert ><-7> +< litteraire ><-7> +< xsession rlogin rexec ><-7> +< for accro ><-7> +< police schutzhund ><-7> +< chaplin ><-7> +< et ressources ><-7> +< grapefruit ><-7> +< ebusiness name description ><-7> +< argentic 24x36 naked ><-7> +< best teen ><-7> +< nfsite officiel de ><-7> +< hautes pyrenees ><-7> +< and community teen ><-7> +< un probleme de ><-7> +< polar education ><-7> +< singles import ><-7> +< hurlante hi tekk ><-7> +< gratuitement votre propre ><-7> +< roofing siding windows ><-7> +< andere vragen ><-7> +< calais name ><-7> +< bayrak ><-7> +< keywords content charmed ><-7> +< et corpulentes ><-7> +< content vergleichen ><-7> +< content silver dragon ><-7> +< postes a ><-7> +< casque accessoire ambulancier ><-7> +< politiques ><-7> +< point font ><-7> +< visitatori ><-7> +< freebsd ><-7> +< content programme ><-7> +< text content le ><-7> +< mandelieu mandelocien pegomas ><-7> +< recursos cgi cgis ><-7> +< content scambio banner ><-7> +< humour du web ><-7> +< keywords content startpagina ><-7> +< seduits ><-7> +< sexy chat babbel ><-7> +< rater name dc ><-7> +< et offrez vous ><-7> +< 1999 11 0800 ><-7> +< evolution permanente les ><-7> +< bayram ><-7> +< web based ><-7> +< 26e ><-7> +< loisirs animation club ><-7> +< beach linen ><-7> +< collant chemise ><-7> +< protection protection ><-7> +< panel de control ><-7> +< textes url revues ><-7> +< videos street dance ><-7> +< photo expo accro ><-7> +< at www homestead ><-7> +< kathar6 webdesign flash ><-7> +< grec latin ><-7> +< gallery oriental ><-7> +< barbot ><-7> +< permanentes des laboratoires ><-7> +< le avec 130 ><-7> +< pas a ><-7> +< description content concours ><-7> +< de seite gesperrt ><-7> +< duidelijke en ><-7> +< publisher content andre ><-7> +< ablague son cincroyable ><-7> +< femme cherche homme ><-7> +< content didier bernard ><-7> +< risques ><-7> +< keywords content traduction ><-7> +< etc toute l ><-7> +< cartoni animati inoltre ><-7> +< achat argent gagner ><-7> +< soigne son image ><-7> +< parfait ><-7> +< whazzup budweiser axe ><-7> +< aftercare and tattoo ><-7> +< gadolinium iode contraste ><-7> +< kodak heutier ><-7> +< migraine ><-7> +< kinderen achterhoek breda ><-7> +< location corse ><-7> +< dessinee et jeux ><-7> +< camarades retrouvailles ><-7> +< accrophoto com ><-7> +< de liens name ><-7> +< de savoir ><-7> +< vinyl windows building ><-7> +< chansons http ><-7> +< head and ><-7> +< shop galleries ><-7> +< webcams humour feminin ><-7> +< tracing bezoekcijfers webpagina ><-7> +< schutzhund dog ><-7> +< content ccd stellar ><-7> +< content advancestats free ><-7> +< billancourt boulogne ><-7> +< 02 name dc ><-7> +< bridge ><-7> +< babbel box ><-7> +< vogue en ><-7> +< content silicon ><-7> +< mobiles portable portables ><-7> +< congres ><-7> +< content angers mairie ><-7> +< cloutier ><-7> +< amateur spectroscopy name ><-7> +< irm mri prelevement ><-7> +< america server on ><-7> +< 2004 sur ><-7> +< gratuit 2003 horoscope ><-7> +< hard discount le ><-7> +< an astrologie ><-7> +< histoire lettres education ><-7> +< au name dc ><-7> +< sayfa ><-7> +< petite enfance top ><-7> +< content duydunuzmu milliyetcilik ><-7> +< soutien gorge soutiens ><-7> +< content charmed ><-7> +< agenda gratuit ><-7> +< content pero sebastien ><-7> +< content les pubs ><-7> +< maison canape ><-7> +< mp3 mpeg ><-7> +< jean pillou name ><-7> +< femmes name keywords ><-7> +< tailles femmes ><-7> +< reflexions ><-7> +< var ><-7> +< jeu radio ><-7> +< pages perso hebergement ><-7> +< barbara ravage hom ><-7> +< cannois ><-7> +< equipment police ><-7> +< fontes fonts sponsors ><-7> +< 2004 04 ><-7> +< en345 image ><-7> +< tf1 fr ><-7> +< keywords content franquin ><-7> +< 3dimensions ><-7> +< annuaire cartes ><-7> +< locales name ><-7> +< minette la ><-7> +< trellix_builder_ver content 1 ><-7> +< de paiement en ><-7> +< et plus encore ><-7> +< advancestats ><-7> +< for black ><-7> +< livre bandes dessinees ><-7> +< oriental watercolor ><-7> +< valeur republique republicain ><-7> +< choix des ><-7> +< nouveau parc walt ><-7> +< dragon designs ><-7> +< de bois ><-7> +< bouquins guide best ><-7> +< beepworld de ><-7> +< region de ><-7> +< accrophoto com r ><-7> +< windows manufacturer building ><-7> +< propre annuaire ><-7> +< soundcard ><-7> +< ligne name classification ><-7> +< url content u ><-7> +< humour ! ><-7> +< elageur anti chute ><-7> +< a voir! blagues ><-7> +< chinoise horoscope chinois ><-7> +< anti sexisme sexisme ><-7> +< fotos fotos ><-7> +< hommes enfant ><-7> +< url content e ><-7> +< pique ><-7> +< portable ordinateurs portables ><-7> +< delta plus ><-7> +< links youth ><-7> +< linux name ><-7> +< val ><-7> +< et debats ><-7> +< kissable hair ><-7> +< coloriage coloriages ><-7> +< about us ><-7> +< construction and ><-7> +< news sur ><-7> +< amina ><-7> +< slips sport ><-7> +< tailles fortes ><-7> +< content blague feinte ><-7> +< free anime ><-7> +< correspondance femme ><-7> +< girls female ><-7> +< review name ><-7> +< de la musique ><-7> +< senologie depistage ><-7> +< dragon gifts ><-7> +< bon reduction ><-7> +< drole droles rigoler ><-7> +< salam ><-7> +< danyboon net le ><-7> +< popping ><-7> +< drivers canon printer ><-7> +< pegomas la roquette ><-7> +< woorden ><-7> +< mural ><-7> +< con tarjeta de ><-7> +< bikini maillot ><-7> +< hundekennel hundeannoncer ><-7> +< jeux mangas etc ><-7> +< sven ><-7> +< online postcards ><-7> +< luminaires rideau rideaux ><-7> +< description content scambio ><-7> +< content mr wiggles ><-7> +< organizational name ><-7> +< cagiva ><-7> +< name in chinese ><-7> +< arriver ><-7> +< description content vente ><-7> +< 24 7 ><-7> +< duras angot ><-7> +< bernard cloutier ><-7> +< industrie du ><-7> +< site hebergement ><-7> +< petit rongeur ><-7> +< lawrence ><-7> +< copyright content olivier ><-7> +< la jolie ><-7> +< 2new ><-7> +< est ce ><-7> +< veste pantalon blouson ><-7> +< manufacturer insulation manufacturer ><-7> +< festival breton ><-7> +< dragon gifts silver ><-7> +< witherspoon ><-7> +< theoule theoulien ><-7> +< dos drivers tape ><-7> +< racehunde ><-7> +< selling ><-7> +< castellano el ><-7> +< bmx racing ><-7> +< ahmed mohamed dj ><-7> +< au juste ><-7> +< netstat nedstats ><-7> +< localyweb fete pays ><-7> +< owner content delire ><-7> +< servicios gratuitos ><-7> +< warhol ><-7> +< site free teen ><-7> +< printer drivers cdrom ><-7> +< lettres chercheur novel ><-7> +< rubriques encore http ><-7> +< index du super ><-7> +< board name dc ><-7> +< sonneries pour votre ><-7> +< baleares ><-7> +< seiko montres ><-7> +< sont l ><-7> +< journalistes de ><-7> +< de reflexion ><-7> +< sexualite des ><-7> +< islands ><-7> +< 2003 horoscope hebdomadaire ><-7> +< galeries des membres ><-7> +< avec des blagues ><-7> +< formation enseignement ><-7> +< conseils photo ><-7> +< puerto ><-7> +< grumly delires ><-7> +< bain jupes jupe ><-7> +< feng shui ><-7> +< hebdomadaire comics universe ><-7> +< tradition traditions cuisine ><-7> +< super 8 video ><-7> +< content literature name ><-7> +< 138 ><-7> +< chevaux chevaux poney ><-7> +< puerte ><-7> +< aux annuaires de ><-7> +< sons des ><-7> +< universe is ><-7> +< kheops ><-7> +< 130 ><-7> +< websurfing ><-7> +< name copyrigth ><-7> +< content theleme ><-7> +< de stands ><-7> +< statistieken website analyse ><-7> +< didll services gratuits ><-7> +< chers! name keywords ><-7> +< rajewicz ><-7> +< petit rongeur est ><-7> +< document name category ><-7> +< mobiles mobile telephone ><-7> +< labradors ><-7> +< sida name ><-7> +< di scambio ><-7> +< societe de ><-7> +< cabriolet ><-7> +< horoscope gratuit 2003 ><-7> +< libros gratis gratuitos ><-7> +< tv shows ><-7> +< de e ><-7> +< date modified content ><-7> +< la la livecam ><-7> +< dumb ><-7> +< content design by ><-7> +< hop timeline ><-7> +< movie gazette tim ><-7> +< content movie gazette ><-7> +< advert power ><-7> +< falaise ><-7> +< new construction and ><-7> +< chinese zodiac astrology ><-7> +< chaussure cuir ><-7> +< maling ><-7> +< ou montres classiques ><-7> +< content gavage ><-7> +< prism and ><-7> +< paris paris lyon ><-7> +< aumentare gratis ><-7> +< la jupe au ><-7> +< de classe copain ><-7> +< blagues pour ><-7> +< le caire ><-7> +< mougins ><-7> +< content kennel ><-7> +< goes ><-7> +< couteaux ><-7> +< reporting and page ><-7> +< waar u ><-7> +< fiches de ><-7> +< ligne du ><-7> +< galerie expositions conseils ><-7> +< for reporting and ><-7> +< edition 2 3 ><-7> +< of love ><-7> +< di cartoon ><-7> +< 04 name date ><-7> +< galleries gifts ><-7> +< premiers ><-7> +< lien bookmark signet ><-7> +< karite palmer s ><-7> +< 3suisses 3suisse catalogue ><-7> +< echange colloque ><-7> +< 0500 r n ><-7> +< promotions trucs ><-7> +< des centres ><-7> +< dear girl ><-7> +< programmation infos pratiques ><-7> +< camescopes camescope ><-7> +< themes eurodisney disneyland ><-7> +< nous etions 19 ><-7> +< le 30 ><-7> +< en ligne du ><-7> +< bretagne live ><-7> +< generation underground ><-7> +< web type content ><-7> +< randevu ><-7> +< equipment k9 ><-7> +< lesbians and ><-7> +< gratuit humor ><-7> +< view report surveillance ><-7> +< network alert network ><-7> +< hurlante ><-7> +< samurai deeper kyo ><-7> +< sessionwall 3 ><-7> +< screenshot ><-7> +< mariage photographe ><-7> +< truite ><-7> +< professionnel nf ><-7> +< travers l ><-7> +< aba ><-7> +< many other useful ><-7> +< amazones ><-7> +< identifie url ><-7> +< theleme theleme ><-7> +< an objective ><-7> +< realiseren interactieve ><-7> +< content autographseek ><-7> +< horoscope gratuit ><-7> +< zouk ><-7> +< author content andre ><-7> +< religieus ><-7> +< sites des services ><-7> +< culte cultuel politique ><-7> +< s5 cameras ><-7> +< labrador labradors retriever ><-7> +< description content hoeveel ><-7> +< epistemon gargantua ><-7> +< roofing ><-7> +< probeer ><-7> +< chambery ><-7> +< 3310 3410 ><-7> +< gallery personalized with ><-7> +< white terrier ><-7> +< stars and their ><-7> +< des en langue ><-7> +< roman essai critiques ><-7> +< fraunhofer spacechemistry stars ><-7> +< flori roberts organic ><-7> +< volume critique ><-7> +< musiques actuelles breton ><-7> +< bain balneaire pareo ><-7> +< affaires au juste ><-7> +< image veste ><-7> +< 28 feb 2004 ><-7> +< view report ><-7> +< coxinelle design ><-7> +< for moviegazette ><-7> +< gravhund dansk svensk ><-7> +< mannequin warren ><-7> +< paris charme ><-7> +< nord sud tiznit ><-7> +< vivez au rythme ><-7> +< musculation futon ><-7> +< inedites des ><-7> +< de minette ><-7> +< encore http equiv ><-7> +< great britain ><-7> +< fax photos ><-7> +< sm lesbisch blind ><-7> +< editors ><-7> +< fr photographe mariage ><-7> +< chercher preis billig ><-7> +< internet et ><-7> +< count counters ><-7> +< keywords content entertainment ><-7> +< delta plus norme ><-7> +< periodical ><-7> +< content yes http ><-7> +< prensa ><-7> +< loteries coupons ><-7> +< berlin name ><-7> +< la pub ><-7> +< offres speciales ><-7> +< maries ><-7> +< programmation liens ><-7> +< mode mp3 ><-7> +< gravhund gravhund ><-7> +< 2004 universite paris ><-7> +< copyright content franck ><-7> +< enfants enfant ><-7> +< gedifra ><-7> +< explications etapes name ><-7> +< teller ><-7> +< media tv ><-7> +< web designer dk ><-7> +< musica y ><-7> +< dog training equipment ><-7> +< rennes bretagne live ><-7> +< barber ><-7> +< exigence culture celine ><-7> +< author content interip ><-7> +< feminisme anti sexisme ><-7> +< promotion des ><-7> +< et sa region ><-7> +< life top ><-7> +< rigoler l ><-7> +< content 20040621 name ><-7> +< com password ><-7> +< gallery personalized ><-7> +< strategie jeux ><-7> +< servicios de ><-7> +< gravhund gravhund dansk ><-7> +< bracelets horloges ><-7> +< conference danse ><-7> +< de discusion debate ><-7> +< tellen ><-7> +< location appartement ><-7> +< gratis uw ><-7> +< for carrickfergus 107 ><-7> +< content cactus 011 ><-7> +< jon ><-7> +< news gossip ><-7> +< professional k9 ><-7> +< kontakt afspraakjes ><-7> +< hacks ><-7> +< framed ><-7> +< propria visibilita ><-7> +< goedkope hosting ><-7> +< 8859 1 je ><-7> +< boulogne http equiv ><-7> +< ascendant free ><-7> +< bonne histoire ><-7> +< auberges ><-7> +< storia ><-7> +< nageur brassiere bandeau ><-7> +< millions ><-7> +< photos cheval ><-7> +< title content ni ><-7> +< marque lingerie feminine ><-7> +< cannes cannois ><-7> +< livecam sur paris ><-7> +< nazaire saint ><-7> +< counter hit ><-7> +< noire maquillage pour ><-7> +< des photos inedites ><-7> +< gtst ><-7> +< saint nazaire saint ><-7> +< sonnerie sonneries sonerie ><-7> +< marie maroc okacha ><-7> +< and white photography ><-7> +< services http ><-7> +< cheval cheval chevaux ><-7> +< video mariage name ><-7> +< piece maillot ><-7> +< mobiliers ><-7> +< culottes string strings ><-7> +< forschung ><-7> +< belge be suisse ><-7> +< spectroscope webcam astronomy ><-7> +< dragon greeting and ><-7> +< metro chicago il ><-7> +< comique judith godreche ><-7> +< jobs meteo mode ><-7> +< d ecran wallpaper ><-7> +< engine rocket roket ><-7> +< domeinnaam registratie ><-7> +< avant camarades retrouvailles ><-7> +< video drivers cd ><-7> +< corporatename content toi ><-7> +< comique les ><-7> +< blagues images sons ><-7> +< the x ><-7> +< content katzensuchdienst ><-7> +< posting boards teen ><-7> +< tom wesselman ><-7> +< cette page vous ><-7> +< 1 arctura ><-7> +< tout sur l ><-7> +< de fille les ><-7> +< tracklist ><-7> +< novel texte ><-7> +< jumping ><-7> +< content art com ><-7> +< zambie zimbabwe safari ><-7> +< comparer et acheter ><-7> +< june ><-7> +< 06550 ><-7> +< drivers monitor ><-7> +< everyday ><-7> +< genealogie jobs meteo ><-7> +< teenager sites for ><-7> +< rencontre partenaire ><-7> +< 2004 rennes ><-7> +< futon lit et ><-7> +< barbra streisand ><-7> +< ics ><-7> +< fausse ><-7> +< plus qu un ><-7> +< underneath ><-7> +< wildlife photo ><-7> +< homme vacances rencontre ><-7> +< content emoi ><-7> +< patriotisme quartier ><-7> +< houellebecq psychanalyse ><-7> +< sulle vostre serie ><-7> +< clearday 011 ><-7> +< y canciones ><-7> +< we ve got ><-7> +< defrisage cosmetique ><-7> +< domeinen ><-7> +< telephone telephones telephone ><-7> +< nedstat nedstad netstat ><-7> +< 2003 veloxia ><-7> +< hop dance history ><-7> +< narbonne ><-7> +< bette ><-7> +< jeux video sur ><-7> +< greene ><-7> +< eleves trombinoscope ><-7> +< peinture de ><-7> +< content 48 ><-7> +< livres livres en ><-7> +< equipment schutzhund ><-7> +< en vogue en ><-7> +< double knitting ><-7> +< 5927 9074 dk ><-7> +< ammin ><-7> +< author content franck ><-7> +< de rajewicz official ><-7> +< dialogue encheres ><-7> +< virtual reality ><-7> +< kimagure ranma ken ><-7> +< monitor intrusion ><-7> +< film jeu radio ><-7> +< soaps ><-7> +< nouvelles genre ><-7> +< instructional how to ><-7> +< mp3 and ><-7> +< bench ><-7> +< manga cartoni animati ><-7> +< content universite paris ><-7> +< teentoday co uk ><-7> +< prints pandas ><-7> +< ripper ><-7> +< sellers ><-7> +< 2 5 mio ><-7> +< ressources gratuites ><-7> +< apache installation ><-7> +< dc last modified ><-7> +< content entrez ><-7> +< gazette com r ><-7> +< conditions de ><-7> +< content oriental ><-7> +< photos enigmes devinettes ><-7> +< camarades de classe ><-7> +< breton rennes bretagne ><-7> +< ecrivain polar education ><-7> +< magazine bande ><-7> +< wb ><-7> +< britney spears xxx ><-7> +< server on 2000 ><-7> +< sound driver sound ><-7> +< content television numerique ><-7> +< pero sebastien name ><-7> +< birkedal avl hundehvalpe ><-7> +< animaux blondes blonde ><-7> +< eenzaam adverteren webvertisement ><-7> +< auteur content ><-7> +< garde d enfant ><-7> +< cards fine arts ><-7> +< e cards electronic ><-7> +< movements ><-7> +< bande dessinnee bd ><-7> +< durs carte ><-7> +< liste name ><-7> +< views of ><-7> +< woord ><-7> +< content klodcabit name ><-7> +< directamente interesantes opciones ><-7> +< printer driver ><-7> +< histoire lettres ><-7> +< humour de ><-7> +< brothers ><-7> +< nature photographs ><-7> +< deze en ><-7> +< finecam s5 cameras ><-7> +< dushku ><-7> +< livres de ><-7> +< cuisine gastronomie ><-7> +< bayle ><-7> +< uw welke paginas ><-7> +< journalistes de tf1 ><-7> +< spectroscopy name ><-7> +< robin wright ><-7> +< vue les ><-7> +< dailmer ><-7> +< drasan ><-7> +< transmusicales festival ><-7> +< cavalieri ><-7> +< chinese calligraphy ><-7> +< have been ><-7> +< pareo ><-7> +< largo pebble beach ><-7> +< dc date creation ><-7> +< banniere active ><-7> +< babbelbox ><-7> +< linux xstart xsession ><-7> +< tribu ><-7> +< content 2pac ><-7> +< chinese japanese asian ><-7> +< caution sort son ><-7> +< leica ><-7> +< naakt bloot ><-7> +< de recherches permanentes ><-7> +< ordinateur ordinateurs ordinateur ><-7> +< liberte libre expression ><-7> +< tele tv ><-7> +< de partage ><-7> +< girl chats ><-7> +< web page building ><-7> +< bel conference ><-7> +< our simple web ><-7> +< aire libre ><-7> +< du webmaster ><-7> +< afro antillaise cheveux ><-7> +< offset ><-7> +< opinion echange respect ><-7> +< rencontres francophone femme ><-7> +< heutier ><-7> +< webvertisement commercieel realiseren ><-7> +< recherche sante ><-7> +< angot fable ><-7> +< gouda ><-7> +< construit ><-7> +< comte warren ><-7> +< subject content ccd ><-7> +< numeric argentic ><-7> +< horoscope fr ><-7> +< broadway ><-7> +< drivers dos drivers ><-7> +< paris name contactzipcode ><-7> +< cas ><-7> +< cavalier king ><-7> +< immobilier ancien ><-7> +< vmrl ><-7> +< boxing ><-7> +< calligraphy oriental ><-7> +< telephone email mail ><-7> +< fr content site ><-7> +< theme content blitz ><-7> +< analysis name description ><-7> +< nouvelles newsletter forum ><-7> +< immobilier corse ><-7> +< caves ><-7> +< du de travail ><-7> +< unobtrusive windows ><-7> +< 1999 11 ><-7> +< matchs ><-7> +< tattoo flash uk ><-7> +< ru unknown ><-7> +< spacechemistry stars and ><-7> +< portal portaal ><-7> +< planete diddl ><-7> +< fine arts oriental ><-7> +< photographes amateurs avertis ><-7> +< free javascript ><-7> +< adverteren webvertisement ><-7> +< hotbird ><-7> +< sock lace ><-7> +< name actinictitle ><-7> +< gratis nedstat basic ><-7> +< auto moto casting ><-7> +< siding windows ><-7> +< cannet cannettan mandelieu ><-7> +< gorge slip culotte ><-7> +< coins ><-7> +< de resort ><-7> +< spectrograph and ><-7> +< france fr ><-7> +< brick ><-7> +< note cards fine ><-7> +< and career ><-7> +< livecam sur ><-7> +< sonerie soneries ><-7> +< chemin ><-7> +< content warren ><-7> +< parlor ><-7> +< son dakika ><-7> +< roket 138 bourget ><-7> +< animated jpeg ><-7> +< zodiac asian asiatique ><-7> +< jeans jean ><-7> +< pantalon chaussures lingerie ><-7> +< graduate ><-7> +< sailor slayers kimagure ><-7> +< canape futon ><-7> +< windows vinyl siding ><-7> +< source content interip ><-7> +< drivers mouse ><-7> +< content andre fr ><-7> +< melangeur ><-7> +< leaders in the ><-7> +< france actualite ><-7> +< the beats hip ><-7> +< teen issues ><-7> +< objective prism ><-7> +< drivers monitor drivers ><-7> +< tres beau et ><-7> +< model car ><-7> +< all you ><-7> +< enfant parent ><-7> +< explorer vt200 vt220 ><-7> +< goldenmarket goldenmarket ><-7> +< la grossesse ><-7> +< pouvoir y arriver ><-7> +< besoins ><-7> +< rigole programme ><-7> +< a down ><-7> +< de nc blog ><-7> +< tu ordenador ><-7> +< content bill ryan ><-7> +< station for carrickfergus ><-7> +< arts name description ><-7> +< viamichelin propose ><-7> +< personal edition ><-7> +< !no ><-7> +< lien bookmark ><-7> +< ethnique cheveux ><-7> +< potatoes ><-7> +< configuration ><-7> +< mobiles portable ><-7> +< ordinateur portable ><-7> +< aspects ><-7> +< manufacturer insulation roofing ><-7> +< suivez l ><-7> +< robe de robes ><-7> +< name refresh ><-7> +< la technologie et ><-7> +< type content normal ><-7> +< opacite stellaire circonscrite ><-7> +< trial groupe humour ><-7> +< mercerized ><-7> +< contact kontakt afspraakjes ><-7> +< contre la ><-7> +< vente une ><-7> +< marques name keywords ><-7> +< bas prix ><-7> +< afspreken meisje jongen ><-7> +< name server content ><-7> +< content nicolas tacquet ><-7> +< zodiaque les compatibilites ><-7> +< pageviews tellen ><-7> +< nedstats nedstads netstats ><-7> +< television drole rigolo ><-7> +< fete pays casablanca ><-7> +< content steiff ><-7> +< 19 passionnes ><-7> +< graphism ><-7> +< jackson how ><-7> +< amoureux astrologie ><-7> +< calmer life soothing ><-7> +< games for ><-7> +< prints asian ><-7> +< sono ><-7> +< com market ><-7> +< peinture galerie ><-7> +< follow name datecreated ><-7> +< mcentire ><-7> +< itp turboprop ><-7> +< nuke 7 ><-7> +< knitting key largo ><-7> +< telephone portable sms ><-7> +< content american ><-7> +< prets bancaires com ><-7> +< root metisse afro ><-7> +< hundehvalpe hunde ><-7> +< century ><-7> +< combinaison securite chaussure ><-7> +< 06400 06110 ><-7> +< un rythme ><-7> +< de discussion d ><-7> +< sud tiznit ><-7> +< reflective grating ><-7> +< breton programmation infos ><-7> +< copyrigth content ><-7> +< flash uk ><-7> +< feminin femme ><-7> +< telephones mobiles ><-7> +< training equipment online ><-7> +< teens students webchat ><-7> +< litterature scolaire ><-7> +< brugge belgie ><-7> +< ahmed mohamed ><-7> +< personnalises astuces ><-7> +< recycled ><-7> +< word search ><-7> +< content dvdrama ><-7> +< le collectif automobile ><-7> +< site internet web ><-7> +< lits luminaire ><-7> +< comique gags ><-7> +< rent ><-7> +< content reynaud ><-7> +< cultuel politique technique ><-7> +< oyunlar ><-7> +< galerie infographie ><-7> +< m2 ><-7> +< encore! name ><-7> +< surprenant ><-7> +< onze producten! ><-7> +< echostar ><-7> +< jeunes portail ><-7> +< comique les meilleurs ><-7> +< bhumour guide ><-7> +< cloutier name ><-7> +< for numericable ><-7> +< art with name ><-7> +< terrier chihuahua hundehvalpe ><-7> +< michael jackson how ><-7> +< television numerique cable ><-7> +< bancaires com ><-7> +< astrologie horoscope ><-7> +< metissee black ><-7> +< talking ><-7> +< ne cherche ><-7> +< zexe ><-7> +< rights content lars ><-7> +< camescope numerique camescope ><-7> +< determiner ><-7> +< balneaire pareo robe ><-7> +< ying ><-7> +< chihuahua name description ><-7> +< rajewicz warren ><-7> +< securite chaussure cuir ><-7> +< beau mec warren ><-7> +< hom ><-7> +< formularios board remoto ><-7> +< wiggles site the ><-7> +< blinkies didll ><-7> +< fox noro ><-7> +< noro kureyon silk ><-7> +< keywords content webhosting ><-7> +< annonces vente achat ><-7> +< horoscopes chinese ><-7> +< beau gosse ><-7> +< et aux nouvelles ><-7> +< desert ><-7> +< all device ><-7> +< 8859 1 shoes ><-7> +< l3v ><-7> +< chiots ><-7> +< la route des ><-7> +< sympath recherche ><-7> +< mr wiggles best ><-7> +< pomeranian west ><-7> +< tattoo artist ><-7> +< unix sunos ><-7> +< et logos pour ><-7> +< maillots janine robin ><-7> +< modifier un ><-7> +< fittings ><-7> +< de leur ><-7> +< clips how ><-7> +< medecin ><-7> +< down top ><-7> +< alkol ><-7> +< 3suisses fr les ><-7> +< exposes ><-7> +< des prenoms de ><-7> +< hpux ><-7> +< supplies dragon ><-7> +< photography nature pictures ><-7> +< roles ><-7> +< content afils name ><-7> +< marque nfsite officiel ><-7> +< du sud namibie ><-7> +< building products for ><-7> +< emmanuel ><-7> +< farrow ><-7> +< eurodisney ><-7> +< content scambio ><-7> +< for accrophoto com ><-7> +< body image ><-7> +< plug ins ><-7> +< photo boulogne ><-7> +< meubles pour ><-7> +< de blague ><-7> +< rigolo fun ><-7> +< son pain ><-7> +< d humour de ><-7> +< retraite mec ><-7> +< server content ><-7> +< rigolottes ><-7> +< comparaison de ><-7> +< gallery dragon ><-7> +< archive printer ><-7> +< stellar spectroscopy ><-7> +< ecrivain roman essai ><-7> +< super super8 ><-7> +< chinese watercolor ink ><-7> +< netscape com ><-7> +< foros libros gratis ><-7> +< meisje jongen ><-7> +< een van ><-7> +< dragons gift shop ><-7> +< charmed alyssa milano ><-7> +< actrice france ><-7> +< collectivites ><-7> +< information network ><-7> +< logging productive ><-7> +< 2004 name keywords ><-7> +< web type ><-7> +< content games ><-7> +< le sexe de ><-7> +< tintinologie name expires ><-7> +< projecteur en telecinema ><-7> +< flash uk tribal ><-7> +< offres comparer ><-7> +< oriental dragon art ><-7> +< duras angot fable ><-7> +< personalname content pero ><-7> +< paginas bekijken ><-7> +< horoscope gratuit net ><-7> +< band album ><-7> +< fable ><-7> +< vente janine ><-7> +< date creation content ><-7> +< white terrier chihuahua ><-7> +< fn ><-7> +< marque simone perele ><-7> +< information pour ><-7> +< and objective prism ><-7> +< 5 flash ><-7> +< telephone portable telephones ><-7> +< simplement jeremy chatelain ><-7> +< resort paris ! ><-7> +< macrobiopsy galactographie ><-7> +< southern ><-7> +< point compte ><-7> +< danyboon danny ><-7> +< life soothing menthol ><-7> +< fg ><-7> +< francais voyages ><-7> +< basee ><-7> +< artist tattoo flash ><-7> +< pub publicites publicite ><-7> +< hot hackers ><-7> +< andie mcdowell ><-7> +< java html banner ><-7> +< creator content de ><-7> +< jeux de strategie ><-7> +< seite gesperrt ><-7> +< police schutzhund dog ><-7> +< het nedstat geeft ><-7> +< gratis handy ><-7> +< humour feminin ><-7> +< du grand ><-7> +< tableaux ><-7> +< eilanden zuid ><-7> +< d or d ><-7> +< traduction des paroles ><-7> +< televiseur ><-7> +< content labrador ><-7> +< mp3 karaoke ><-7> +< cable acces internet ><-7> +< alles over uw ><-7> +< mm ><-7> +< fete pays ><-7> +< roket 138 ><-7> +< natation mode ><-7> +< animaux blondes ><-7> +< mr wiggles site ><-7> +< dooyoo ><-7> +< depannage ><-7> +< presente des ><-7> +< k9 schutzhund ><-7> +< counter web ><-7> +< fnac fnac fnac ><-7> +< de versailles ><-7> +< shorty simone ><-7> +< silicon silicon ><-7> +< teenager sites ><-7> +< securite sont ><-7> +< social handicap prevention ><-7> +< printer drivers ><-7> +< largo pebble ><-7> +< preview review jeux ><-7> +< eenvoudig beheer website ><-7> +< mohamed dj fab ><-7> +< en langue des ><-7> +< conseils sur ><-7> +< ecriture alphabet ><-7> +< sexueel relaties ><-7> +< annonce recherche ><-7> +< sloane ><-7> +< numerique camescope appareil ><-7> +< lille nord pas ><-7> +< divertissement humoristique animaux ><-7> +< ouest com ><-7> +< chaise chaises ><-7> +< driver search ><-7> +< geeft op ><-7> +< concours promotion ><-7> +< timeline ><-7> +< annonce recherche amis ><-7> +< services http equiv ><-7> +< marocain maroc ><-7> +< a toute ><-7> +< content www artefact ><-7> +< rigolottes kiss cool ><-7> +< nouveaute ><-7> +< content presspublisher ><-7> +< circuiti di scambio ><-7> +< preparation ><-7> +< exposition virtuelle ><-7> +< propose a la ><-7> +< banner effectief ><-7> +< gamer ><-7> +< angers maire ><-7> +< content accro ><-7> +< immobilier paris ><-7> +< pays casablanca ><-7> +< fashion photographer ><-7> +< le plus complet ><-7> +< interpretes en ><-7> +< de rencontre draveil ><-7> +< chanteur name identifier ><-7> +< intranet protection protection ><-7> +< description content tattoos ><-7> +< zonhumour ><-7> +< mage ><-7> +< description content directory ><-7> +< fanartikel ><-7> +< tips top tips ><-7> +< like genuwine ><-7> +< blocking overhead ><-7> +< short url short ><-7> +< ainsi que toute ><-7> +< ruth ><-7> +< 85 ><-7> +< chatelain 6 ><-7> +< sante grossesse ><-7> +< violences sexuelles ><-7> +< equipment k9 training ><-7> +< name dc generator ><-7> +< metissee demande de ><-7> +< ragga ><-7> +< pageviews tellen gratis ><-7> +< per aumentare ><-7> +< belgique belge ><-7> +< content reviews ><-7> +< mensen bezoeken uw ><-7> +< preis billig marchand ><-7> +< accro photo le ><-7> +< gerard mahdessian name ><-7> +< for moviegazette co ><-7> +< site was created ><-7> +< gmt www ><-7> +< montres pour ><-7> +< ken censura censura ><-7> +< thermalisme piscine ile ><-7> +< your heroic ><-7> +< matelas name generator ><-7> +< content musique name ><-7> +< table tables chaise ><-7> +< author content thomas ><-7> +< description content methodos ><-7> +< network alert ><-7> +< bubble ><-7> +< rencontres moi ><-7> +< traduction parole ><-7> +< golf et village ><-7> +< dames kinderen achterhoek ><-7> +< 8 video video ><-7> +< francais voyages voyage ><-7> +< name dc audience ><-7> +< revues name ><-7> +< sexe de son ><-7> +< finecam digital digital ><-7> +< yarn name ><-7> +< gravhund dansk ><-7> +< blondes blonde histoires ><-7> +< cave ><-7> +< organizational name dc ><-7> +< femmes sport ><-7> +< online service name ><-7> +< pluie froid ecusson ><-7> +< robes maillot de ><-7> +< recursos cgi ><-7> +< securite les accessoires ><-7> +< 1 groupe ><-7> +< midi paroles ><-7> +< goldenmarket all ><-7> +< schutzhund german shepherd ><-7> +< liberte la cite ><-7> +< l3v finecam l4v ><-7> +< ganz ><-7> +< test page for ><-7> +< et le film ><-7> +< 19 mrwiggles ><-7> +< securite les ><-7> +< waters ><-7> +< roman louis ><-7> +< contact kontakt darkroom ><-7> +< mode nuisette ><-7> +< je m aime ><-7> +< ancien combattant ><-7> +< portables nokia ><-7> +< year nouvel ><-7> +< artefact ><-7> +< choix des prenoms ><-7> +< bacquet ><-7> +< dv ou ><-7> +< en ronde le ><-7> +< eclaircissant name description ><-7> +< septentrion name dc ><-7> +< literature name distribution ><-7> +< rlogin rexec xdm ><-7> +< la caution ><-7> +< teen opinions ><-7> +< 1252 castle fm ><-7> +< of three ><-7> +< parquets ><-7> +< model book ><-7> +< model masculin ><-7> +< prises de ><-7> +< hetero sm lesbisch ><-7> +< note di ><-7> +< buscador libros de ><-7> +< author content bill ><-7> +< drivers hp ><-7> +< access control network ><-7> +< copain camarade retrouver ><-7> +< bodybuilding male ><-7> +< gagner cadeaux ><-7> +< heide ><-7> +< riverain religion culte ><-7> +< warren de ><-7> +< _top esc weblog ><-7> +< nedstats ><-7> +< personalized dragon ><-7> +< 26 jean ><-7> +< chevreuse ><-7> +< across ><-7> +< and solar ><-7> +< grecque ><-7> +< content parents ><-7> +< com for ><-7> +< soneries ringtone ringtones ><-7> +< tunis ><-7> +< pluie ><-7> +< ses parcs ><-7> +< de partir ><-7> +< defense riverain ><-7> +< tentation ><-7> +< true for gazette ><-7> +< switzerland name keywords ><-7> +< driverguide com printer ><-7> +< del bayle name ><-7> +< hi tekk ><-7> +< aus einem ><-7> +< osmanli devlet ><-7> +< model homme ><-7> +< mobile telephones mobiles ><-7> +< de ch at ><-7> +< ans 26eme edition ><-7> +< delire le plus ><-7> +< dossiers sur ><-7> +< 1 ouestu ><-7> +< numericable ><-7> +< monde chat ><-7> +< explications des ><-7> +< visibilite pluie froid ><-7> +< spectroscopy with an ><-7> +< cheval chevaux photo ><-7> +< author content movie ><-7> +< la premiere fois ><-7> +< surfeur bad ><-7> +< avertis ou semi ><-7> +< live gratis dating ><-7> +< moteur pas ><-7> +< equitation cheval ><-7> +< demo demos ><-7> +< manga anime anime ><-7> +< paul name ><-7> +< la chanson ><-7> +< esperance ><-7> +< kreestal name ><-7> +< betisier jour ><-7> +< poetes ><-7> +< mobiles mobiles mobile ><-7> +< kyo ring ><-7> +< diet pills ><-7> +< a guide ><-7> +< le but de ><-7> +< dupont rigoler ><-7> +< tv magnetoscope jeu ><-7> +< filles prenoms en ><-7> +< chatte sournoise ><-7> +< sur les jeux ><-7> +< de bain lingerie ><-7> +< lycos fr ><-7> +< gorge soutiens ><-7> +< content musica ><-7> +< professionals name ><-7> +< permanente les tissus ><-7> +< est en evolution ><-7> +< del ingles ><-7> +< planning ><-7> +< en345 ><-7> +< sexage ><-7> +< website bezoekers informatie ><-7> +< author content one ><-7> +< revival ><-7> +< masculin warren de ><-7> +< la technologie ><-7> +< desorganisation ><-7> +< de cheval des ><-7> +< receive ><-7> +< ville angers histoire ><-7> +< and shoulders itchy ><-7> +< feinte ><-7> +< duration 0 1 ><-7> +< motel ><-7> +< street dance hip ><-7> +< keywords content sante ><-7> +< magasins hard ><-7> +< alternative content ><-7> +< pc telephone ><-7> +< kurt insan ><-7> +< bordeaux toulouse ><-7> +< line rapportages ><-7> +< video eumig ><-7> +< modellagentur ><-7> +< gratuites annonces ><-7> +< moins chers! name ><-7> +< source url content ><-7> +< visitez la galerie ><-7> +< beats ><-7> +< kiss cool ><-7> +< 06210 06370 06580 ><-7> +< politika siir ><-7> +< les plus droles ><-7> +< breakdance breakdance ><-7> +< drivers http equiv ><-7> +< webdesign flash 5 ><-7> +< bel conference danse ><-7> +< steady crew ><-7> +< passionnes de photo ><-7> +< amis souvenirs photo ><-7> +< seniors ><-7> +< gosse beau mec ><-7> +< advert power e ><-7> +< materials manufacturer name ><-7> +< comment name ><-7> +< consultez gratuitement ><-7> +< huur ><-7> +< pvc pipe ><-7> +< amazon gratuit comique ><-7> +< 11 0800 r ><-7> +< photo forum ><-7> +< jour horoscope ><-7> +< regrets ><-7> +< insan pkk ><-7> +< masculins name language ><-7> +< 5927 ><-7> +< makaveli the ><-7> +< of k9 ><-7> +< alessio ><-7> +< classement php ><-7> +< gebruik ><-7> +< a seduits ><-7> +< realiseren interactieve interactief ><-7> +< toegankelijk ><-7> +< plus images ><-7> +< divertente ><-7> +< warren fan ><-7> +< photographis ><-7> +< 100 prenoms ><-7> +< equestre equestres cheval ><-7> +< de prix achat ><-7> +< le film de ><-7> +< rater name keywords ><-7> +< valejo 011 default ><-7> +< bezoekers pageviews ><-7> +< baladeurs ><-7> +< artefact fr name ><-7> +< net artiste ><-7> +< dating afspreken ><-7> +< content the best ><-7> +< infos pratiques archives ><-7> +< m aime en ><-7> +< mylene farmer mylene ><-7> +< numerique camescope ><-7> +< content universite ><-7> +< bac granger liseurs ><-7> +< 20010325 name revisit ><-7> +< content musik ><-7> +< accueil loisirs animation ><-7> +< inoltre tutto ><-7> +< en fr tf1 ><-7> +< cannes name keywords ><-7> +< title content microsoft ><-7> +< broderie point de ><-7> +< tf1 et ><-7> +< numerosi visitatori realmente ><-7> +< typo ><-7> +< r server 3 ><-7> +< cartoon party ><-7> +< votre mariage prix ><-7> +< finecam kyocera finecam ><-7> +< tf1 en ><-7> +< content date dating ><-7> +< building materials manufacturer ><-7> +< galerie name keywords ><-7> +< katzensuchdienst ><-7> +< pm3 ><-7> +< du catalogue 3 ><-7> +< keywords content globetrotter ><-7> +< distributors ><-7> +< jeunes name robots ><-7> +< franquin etc de ><-7> +< silicon fr vivez ><-7> +< content labrador labradors ><-7> +< geo region ><-7> +< internet communicatie ><-7> +< division 1 ><-7> +< liga ><-7> +< macos ><-7> +< database vacaturebanken advertentierubrieken ><-7> +< chaises ><-7> +< partenaire francais ><-7> +< homo hetero live ><-7> +< code de la ><-7> +< la radio ><-7> +< copains d ><-7> +< loi de finances ><-7> +< dames kinderen ><-7> +< chretien ><-7> +< de kreestal name ><-7> +< bianchi ><-7> +< public http ><-7> +< envoyer des ><-7> +< circonscrite desorganisation ><-7> +< en livres livres ><-7> +< des paroles ><-7> +< hawaiian ><-7> +< mhp bayrak ><-7> +< guide best sellers ><-7> +< domeinaamen ><-7> +< de nc ><-7> +< sur paris des ><-7> +< associative 1901 ><-7> +< spirituality ><-7> +< et cassettes ><-7> +< designs tattoo ><-7> +< bikini maillot 1 ><-7> +< website stats website ><-7> +< training equipment schutzhund ><-7> +< content guilhot ><-7> +< du septentrion name ><-7> +< babe gallery ><-7> +< objectif film name ><-7> +< juvisy essonne ><-7> +< paroles chansons http ><-7> +< regionalisme tradition tourisme ><-7> +< choses a voir! ><-7> +< spiritualite ><-7> +< beaute les ><-7> +< livres en ><-7> +< snuffel rubrieken ><-7> +< retrouvailles recherche ><-7> +< grue web designer ><-7> +< hop hiphop ><-7> +< see the ><-7> +< com votre magasin ><-7> +< la bande dessinnee ><-7> +< antalya ><-7> +< fax photos fonds ><-7> +< boutonnat laurent ><-7> +< content 2 5 ><-7> +< and objective ><-7> +< art giant ><-7> +< scambio banner scambio ><-7> +< genre philosophie ><-7> +< content franck maquinay ><-7> +< birth ><-7> +< content micrologiciel by ><-7> +< chevaux name keywords ><-7> +< party anime manga ><-7> +< l info ><-7> +< exigence de l ><-7> +< sidney ><-7> +< pandas chicago artist ><-7> +< joueurs ><-7> +< realiseren ><-7> +< encore! name keywords ><-7> +< and tattoo history ><-7> +< tips history of ><-7> +< sortir a paris ><-7> +< comment modifier ><-7> +< content bodybuilding male ><-7> +< par correspondance dark ><-7> +< site en ><-7> +< turkiye turkey ><-7> +< an astrologie chinese ><-7> +< phreaking ><-7> +< le coin ><-7> +< randy ><-7> +< finecam l4v finecam ><-7> +< lapd ><-7> +< poesies conte ><-7> +< rando ><-7> +< en ligne dernieres ><-7> +< conseils et ><-7> +< skater ><-7> +< traceur ><-7> +< photo photographie galerie ><-7> +< delire droles rigolotes ><-7> +< tout seul le ><-7> +< gooi en vechtstreek ><-7> +< melodies mp3 mp3 ><-7> +< tori amos ><-7> +< musique sorties ><-7> +< asf avi ><-7> +< amateurs avertis ><-7> +< temps http equiv ><-7> +< traitant ><-7> +< marques name ><-7> +< beats hip hop ><-7> +< objective prism and ><-7> +< 3001 ><-7> +< url url ><-7> +< content papi ><-7> +< de bain jupes ><-7> +< content hoeveel ><-7> +< art art ><-7> +< s on line ><-7> +< aire ><-7> +< achats polices ><-7> +< all s a ><-7> +< location guadeloupe location ><-7> +< difficult to ><-7> +< rollin video rock ><-7> +< mannequin international top ><-7> +< osama bin laden ><-7> +< de chevaux name ><-7> +< the digital revolution ><-7> +< description content microsoft ><-7> +< registered ><-7> +< simone perele chantelle ><-7> +< i manga ossia ><-7> +< horoscope ascendant ><-7> +< paintings dragon ><-7> +< automobile des ><-7> +< dc author content ><-7> +< 1997 06 ><-7> +< de titi ><-7> +< history content ><-7> +< recherche rire ><-7> +< mec warren ><-7> +< moins cher avec ><-7> +< rom drivers driver ><-7> +< quartier defense riverain ><-7> +< nouvel an astrologie ><-7> +< dragon studio name ><-7> +< voiture d ><-7> +< hip hop resource ><-7> +< chunky worsted ><-7> +< services 100 humour ><-7> +< sante prevention ><-7> +< collectibles collectables ><-7> +< pour le fun ><-7> +< angers ville angers ><-7> +< libre 26 ans ><-7> +< la liste des ><-7> +< galerie expo ><-7> +< your name ><-7> +< plus qu ><-7> +< 2004 parc expo ><-7> +< classe copain camarade ><-7> +< content frederik ><-7> +< content dog training ><-7> +< de du name ><-7> +< drivers tape ><-7> +< reply content com ><-7> +< la caution sort ><-7> +< lampe ><-7> +< and many other ><-7> +< pkk apo asker ><-7> +< collectables silver ><-7> +< mpeg feinte ><-7> +< edition numero 26 ><-7> +< les accessoires de ><-7> +< 3310 3410 3330 ><-7> +< rencontrer l ><-7> +< adopter ><-7> +< flash html ><-7> +< 3d du ><-7> +< humour bhumour guide ><-7> +< conseils pour les ><-7> +< prix art ><-7> +< site rencontrer ><-7> +< lottery ><-7> +< ligne des 3 ><-7> +< interesantes ><-7> +< to the new ><-7> +< driver cdrom ><-7> +< pubblicita gratis ><-7> +< advertentierubrieken ><-7> +< les meilleurs blagues ><-7> +< mp3 album ><-7> +< traditions cuisine bijoux ><-7> +< title content sonneries ><-7> +< strumento ><-7> +< content informatique ><-7> +< mesures ><-7> +< billig marchand ><-7> +< domeinnaam server ><-7> +< pros name keywords ><-7> +< string bustier nageur ><-7> +< dragon chinese dragon ><-7> +< hvalpe hundekennel hundeannoncer ><-7> +< content tattoos designs ><-7> +< est l annuaire ><-7> +< presspublisher ><-7> +< piscine ile ><-7> +< edebiyat ><-7> +< anaconda ><-7> +< fabricants ><-7> +< waar je ><-7> +< chevaux poney poney ><-7> +< hop history ><-7> +< vacances bronzage ><-7> +< de la mer ><-7> +< aways free ><-7> +< brassiere bandeau ><-7> +< contributor corporatename ><-7> +< pieces triangle ><-7> +< maggie smith ><-7> +< film free ><-7> +< sa region ><-7> +< ammin youssouf kathar6 ><-7> +< montres bijoux ><-7> +< le magazine bande ><-7> +< journalier ><-7> +< downloads and ><-7> +< warren warren star ><-7> +< content valejo 011 ><-7> +< filtering ><-7> +< cite aire ><-7> +< un petit ><-7> +< animes gratuits ><-7> +< locations saisonnieres ><-7> +< oriental art supplies ><-7> +< microcalcification http ><-7> +< content set graphique ><-7> +< avec 130 ><-7> +< emoi com name ><-7> +< accro photo ><-7> +< sms and more ><-7> +< mauve de kreestal ><-7> +< plage bikini maillot ><-7> +< title content zonhumour ><-7> +< manga ossia i ><-7> +< forum femme ><-7> +< audiomobile ><-7> +< de photos d ><-7> +< dessinnee ><-7> +< ventilation composite decking ><-7> +< windows 1252 castle ><-7> +< horoscope mois horoscope ><-7> +< discussions name ><-7> +< remboursement ><-7> +< sex symbol ><-7> +< to find candy ><-7> +< new hampshire ><-7> +< painting sculpture ><-7> +< com the one ><-7> +< rum ><-7> +< haarlem leidse regio ><-7> +< radio webradio ><-7> +< cigars ><-7> +< hebergement pages ><-7> +< des villes ><-7> +< silence ><-7> +< zexe de ><-7> +< debit http equiv ><-7> +< chemise de nuit ><-7> +< ile vacances ><-7> +< sonneries sonerie ><-7> +< ama ><-7> +< babbel ><-7> +< designer dk worlds ><-7> +< adaptent aux nouvelles ><-7> +< particulieren kunnen ><-7> +< fifa ><-7> +< quotidien daily ><-7> +< free music downloads ><-7> +< mensuel horoscope ><-7> +< epic ><-7> +< subject content mariage ><-7> +< 1 powered ><-7> +< roofing vinyl siding ><-7> +< journey ><-7> +< realisation ><-7> +< favoriser ><-7> +< capirelax ><-7> +< felin feline ><-7> +< auger ><-7> +< twente utrecht ><-7> +< ce qui est ><-7> +< neuf et ><-7> +< image interview ><-7> +< retrouver un ><-7> +< de rajewicz de ><-7> +< amt ><-7> +< wesselman ><-7> +< ensemble kit webdesign ><-7> +< name country ><-7> +< sep ><-7> +< histoire inedite ><-7> +< black defrisage cosmetique ><-7> +< analysis network ><-7> +< propose a ><-7> +< la napoule ><-7> +< tiznit ><-7> +< de film jeu ><-7> +< hair free mini ><-7> +< amateur amateur ><-7> +< donegal chunky ><-7> +< montres appareils de ><-7> +< zambie zimbabwe ><-7> +< numero 26 jean ><-7> +< de l humanite ><-7> +< ossia i ><-7> +< saint etienne ><-7> +< fiatavio ><-7> +< milano shannen doherty ><-7> +< cd drivers scsi ><-7> +< killyan s ><-7> +< prets bancaires ><-7> +< euc jp ><-7> +< name vs_targetschema ><-7> +< and reflective grating ><-7> +< and tattoo ><-7> +< luminaire luminaires rideau ><-7> +< intranet intranet protection ><-7> +< spoiler ><-7> +< description content transformers ><-7> +< abirnet sessionwall ><-7> +< producten! ><-7> +< studios dragon chinese ><-7> +< taxis ><-7> +< le traitement ><-7> +< luik ><-7> +< groupes ubu ><-7> +< portables portable portables ><-7> +< vinyls ><-7> +< magazine de ><-7> +< essonne 91 fra1904 ><-7> +< rigolo rigoler ><-7> +< xdk ><-7> +< top model masculin ><-7> +< rigoler gratuit ><-7> +< histoire angers maire ><-7> +< graphique ensemble kit ><-7> +< cinema jeu video ><-7> +< content revues ><-7> +< meilleurs sites du ><-7> +< forever ><-7> +< skogkatt ><-7> +< humour feminin horoscope ><-7> +< name contactzipcode ><-7> +< felin ><-7> +< sex geen porno ><-7> +< r server ><-7> +< fabrication de ><-7> +< bigbrother ><-7> +< content achat ><-7> +< homesite ><-7> +< felix ><-7> +< catalogue du ><-7> +< xdm ><-7> +< unobtrusive ><-7> +< websitebezoek ><-7> +< tattoo history ><-7> +< statue ><-7> +< description content echange ><-7> +< budweiser axe name ><-7> +< dating sexy ><-7> +< c 2004 universite ><-7> +< cache pubs delire ><-7> +< feminine creation maillots ><-7> +< follow nedstat alles ><-7> +< portret ><-7> +< guilhot ><-7> +< life top tips ><-7> +< olivier name dc ><-7> +< le dans ><-7> +< watercolor ink ><-7> +< de produits de ><-7> +< source content de ><-7> +< mandelieu ><-7> +< message boards uk ><-7> +< auribeau d azur ><-7> +< itiraflar yazarlar bozkurt ><-7> +< 8859 1 fernando ><-7> +< content index du ><-7> +< sauvages ><-7> +< lesbiennes et des ><-7> +< lyrics name keywords ><-7> +< a themes ses ><-7> +< vrouw sexueel ><-7> +< bi ru unknown ><-7> +< regio regionaal ><-7> +< symbol masculin mannequin ><-7> +< stands ><-7> +< true for lacoccinelle ><-7> +< armand ><-7> +< un rythme hebdomadaire ><-7> +< assainissement ><-7> +< shampoo head shoulders ><-7> +< et fabricants et ><-7> +< quotidien gratuit ><-7> +< celebrites actrice france ><-7> +< la propria visibilita ><-7> +< oneself ><-7> +< monthly magazine ><-7> +< reflective ><-7> +< acne dermablend karite ><-7> +< ermann ><-7> +< content hoeveel mensen ><-7> +< crepus d ici ><-7> +< guide best ><-7> +< hoeveel mensen bezoeken ><-7> +< drives ><-7> +< fest ><-7> +< scalp scalp ><-7> +< pratiques programme tv ><-7> +< vous trouverez sur ><-7> +< per i ><-7> +< interip networks ><-7> +< aumentare ><-7> +< epouse marie maroc ><-7> +< mer natation mode ><-7> +< vacances bronzage bain ><-7> +< blitz ><-7> +< correspondance femme femmes ><-7> +< liseurs ><-7> +< sec ><-7> +< www artefact ><-7> +< for surf ><-7> +< diabete ><-7> +< 3d vmrl 3dimensions ><-7> +< lyrics new ><-7> +< het nedstat ><-7> +< be suisse ><-7> +< content frederik grue ><-7> +< lena ><-7> +< asphalte hurlante ><-7> +< 0 3suisses fr ><-7> +< x name identifier ><-7> +< noord noord ><-7> +< webtv ><-7> +< follow nedstat ><-7> +< dos drivers ><-7> +< pubdate content ><-7> +< axe name author ><-7> +< fabricant createur propose ><-7> +< 26e rencontres ><-7> +< ! name page ><-7> +< content lycos acheter ><-7> +< insan pkk apo ><-7> +< formes s adaptent ><-7> +< lejaby lise charmel ><-7> +< subject content microsoft ><-7> +< 1 webtropia ><-7> +< recycled one ><-7> +< fortes et corpulentes ><-7> +< windows drivers ><-7> +< teddie ><-7> +< orangina japp whassup ><-7> +< of fresh air ><-7> +< bei lycos ><-7> +< content fre name ><-7> +< actualisateur free ><-7> +< bike sport bike ><-7> +< la violence ><-7> +< professionnels name ><-7> +< chanson lyric ><-7> +< vrouwen meisjes ><-7> +< combattant bel conference ><-7> +< la legislation ><-7> +< chunky ><-7> +< mrwiggles ><-7> +< gazette ><-7> +< itchy itchy ><-7> +< en modellenbureau ><-7> +< di cartoon party ><-7> +< las directamente interesantes ><-7> +< macrobiopsie macrobiopsy galactographie ><-7> +< home lecteur dvd ><-7> +< modeshow ><-7> +< basis ><-7> +< 3330 name ><-7> +< powered by micrologiciel ><-7> +< enfants informatique ><-7> +< offres comparer et ><-7> +< content banque ><-7> +< homme top ><-7> +< marchant 2002 2004 ><-7> +< music name audience ><-7> +< merino mohair annabel ><-7> +< boutique collection maillot ><-7> +< content _top de ><-7> +< content rencontres moi ><-7> +< zuid limburg belgie ><-7> +< street bike ><-7> +< centaines de photographies ><-7> +< rennes site officiel ><-7> +< reynolds ><-7> +< remis jour ><-7> +< droits des femmes ><-7> +< smallville ><-7> +< cosmetique pour peau ><-7> +< art wholesale artwork ><-7> +< their spectra ><-7> +< balades en ><-7> +< geo region content ><-7> +< postcards postcards ><-7> +< mobiles prix promotions ><-7> +< orangina ><-7> +< normes ><-7> +< deportivos ><-7> +< date regio ><-7> +< body piercing piercing ><-7> +< editions du ><-7> +< rajewicz jet set ><-7> +< noire noire ><-7> +< et luminaires name ><-7> +< bernard cloutier name ><-7> +< free anime videos ><-7> +< blonde histoires ><-7> +< ville d ><-7> +< antillaise cheveux ><-7> +< de charmed ><-7> +< humour blague humours ><-7> +< webpagina s on ><-7> +< decking railing ><-7> +< your mind ><-7> +< axe name ><-7> +< contraste opacite stellaire ><-7> +< magique de ses ><-7> +< lo mejor ><-7> +< stages de ><-7> +< de libros ><-7> +< type content searchengine ><-7> +< sms chat ><-7> +< serie sailor slayers ><-7> +< lease domein ><-7> +< for accrophoto ><-7> +< forums et debats ><-7> +< x nanterre accueil ><-7> +< ami amis d ><-7> +< reserves 1999 ><-7> +< en ligne des ><-7> +< trans les ><-7> +< galleries gifts dragon ><-7> +< les chats ><-7> +< chanson lyric anglais ><-7> +< association des interpretes ><-7> +< bijoux costumes ><-7> +< 8859 1 coloriage ><-7> +< cool orangina ><-7> +< publisher content lycos ><-7> +< triangle bresilien ><-7> +< publisher 2000 page ><-7> +< keywords content sonnerie ><-7> +< content dies ><-7> +< manufacture ><-7> +< dragon paintign ><-7> +< site the beats ><-7> +< universitaire de ><-7> +< red hot ><-7> +< zodiac astrology dragons ><-7> +< online music ><-7> +< gezi ><-7> +< anime image ><-7> +< jpg gif delire ><-7> +< franchise franchise ><-7> +< france fr quebec ><-7> +< warrenderajewicz ><-7> +< bi homo ><-7> +< des paroles de ><-7> +< was created at ><-7> +< nazaire ><-7> +< loubet ><-7> +< cher avec le ><-7> +< dc rating ><-7> +< jamaican ><-7> +< link liste name ><-7> +< rajewicz sex ><-7> +< egalement des ><-7> +< studenten ><-7> +< son petit ><-7> +< videos humour sexy ><-7> +< rabade et chambres ><-7> +< videos des sketches ><-7> +< noire noire et ><-7> +< kennel birkedal all ><-7> +< de warren ><-7> +< for finding downloading ><-7> +< photo agency ><-7> +< n n ><-7> +< yoda name ><-7> +< hutchinson ><-7> +< traductions paroles ><-7> +< numeric argentic 24x36 ><-7> +< edition 2 ><-7> +< trinidad ><-7> +< de nuit porte ><-7> +< tracklist rap rap ><-7> +< tips calm ><-7> +< content methodos savoirs ><-7> +< robots in disguise ><-7> +< louer location ><-7> +< prevention solidarite ><-7> +< net vous trouverez ><-7> +< games flash game ><-7> +< a porter mode ><-7> +< schutzhund supply schutzhund ><-7> +< artist tattoo ><-7> +< annabel fox noro ><-7> +< de visita ><-7> +< gavage name language ><-7> +< horoscope chinois zodiaque ><-7> +< stats website stats ><-7> +< power e per ><-7> +< their spectra solar ><-7> +< aphorisme ><-7> +< flash et de ><-7> +< classification content http ><-7> +< fete des ><-7> +< orman ><-7> +< gb us ><-7> +< shopping chatroom ><-7> +< administration analysis network ><-7> +< garcon les en ><-7> +< dysneyland ><-7> +< james bond ><-7> +< art of ><-7> +< fine fabricant boutique ><-7> +< 2004 sur infobebes ><-7> +< personnalise horoscope fr ><-7> +< classement php reference ><-7> +< cocteau ><-7> +< designs licensed ><-7> +< femme magasin grandes ><-7> +< plus encore ><-7> +< prints pandas chicago ><-7> +< la livecam ><-7> +< bezoekers informatie ><-7> +< andre brunsperger name ><-7> +< apartment ><-7> +< italia name description ><-7> +< dragon greeting cards ><-7> +< 1250 http equiv ><-7> +< culotte culottes string ><-7> +< homepage organizational ><-7> +< content fnac ><-7> +< ergenekon ><-7> +< regia sock ><-7> +< revues name dc ><-7> +< diddl enigmes ><-7> +< jupes jupe jeans ><-7> +< jet set www ><-7> +< owns ><-7> +< photographis photographi boulogne ><-7> +< humanitaires ><-7> +< transmusicales festival musiques ><-7> +< finecam l4v ><-7> +< jefroux name ><-7> +< eleanor ><-7> +< content alessio ><-7> +< whassup ><-7> +< gratuit britney spears ><-7> +< eilat ><-7> +< talk message boards ><-7> +< imaging name description ><-7> +< sebastien name publisher ><-7> +< accreditation ><-7> +< vernissage ><-7> +< insulation manufacturer roofing ><-7> +< gifts dragon greeting ><-7> +< shannen doherty holly ><-7> +< reference top ><-7> +< vergleichen preis ><-7> +< content text homepage ><-7> +< marocain traditions ><-7> +< videos liens ><-7> +< japanese asian ><-7> +< content conseil ><-7> +< sexy divertissement humoristique ><-7> +< musique france ><-7> +< yoga ><-7> +< annoncer kennel ><-7> +< haut debit http ><-7> +< pubs tv ><-7> +< s4 fincam l3v ><-7> +< also available ><-7> +< dmc ><-7> +< fun pour ><-7> +< blonde histoires betisier ><-7> +< l ebusiness http ><-7> +< cherbourg ><-7> +< chemise de plage ><-7> +< 1 bi ><-7> +< aran donegal chunky ><-7> +< vogue en 2004 ><-7> +< jouez ><-7> +< home cinema jeu ><-7> +< tattooing tatoo tatu ><-7> +< ermann paris ><-7> +< armor ><-7> +< 0 name audience ><-7> +< ccd stellar ><-7> +< pink floyd ><-7> +< imaging name ><-7> +< copain camarade ><-7> +< drawings original ink ><-7> +< anti rigolo ><-7> +< actricesdefrance org ><-7> +< mec diaporama pps ><-7> +< image veste pantalon ><-7> +< samurai deeper ><-7> +< ssilicon silicon ><-7> +< de page ><-7> +< strumento ideale per ><-7> +< rencontrer l ame ><-7> +< content goldenmarket name ><-7> +< milliyetcilik itiraflar ><-7> +< les enfants ><-7> +< url content actricesdefrance ><-7> +< danyboon net ><-7> +< pei ><-7> +< dances ><-7> +< didll services ><-7> +< spip ><-7> +< d des ><-7> +< de sante publique ><-7> +< rigole ><-7> +< randonnee ><-7> +< character ><-7> +< enfance camarades de ><-7> +< dreamweaver photoshop ><-7> +< brunsperger ><-7> +< photos de cheval ><-7> +< cheveux frises ><-7> +< abdelilah ><-7> +< rock n ><-7> +< cd player ><-7> +< camarade ><-7> +< fetus ><-7> +< loi 1901 ><-7> +< et accessoires de ><-7> +< cosmetique pour ><-7> +< sakura ><-7> +< regia ><-7> +< site sur le ><-7> +< hommes femmes sport ><-7> +< pubs delire ><-7> +< transformers transformers ><-7> +< segara ><-7> +< internet les ><-7> +< chat babbel ><-7> +< mannequin paris ><-7> +< cliparts images ><-7> +< gratuite gratuites mobile ><-7> +< intranet protection ><-7> +< l 0 net ><-7> +< solar spectral plots ><-7> +< danyboon danny bon ><-7> +< ranma ken censura ><-7> +< francophone connaissance ><-7> +< spectroscopy with a ><-7> +< board remoto ><-7> +< triangle bresilien habit ><-7> +< et loir ><-7> +< motards ><-7> +< heberge par over ><-7> +< i webmaster ><-7> +< opleidingen ><-7> +< teen posting boards ><-7> +< portare ><-7> +< online gallery ><-7> +< cards electronic postcards ><-7> +< content about ><-7> +< videos filmati serie ><-7> +< rencontre ou des ><-7> +< equestre equestres ><-7> +< aventures et photos ><-7> +< actor movies ><-7> +< i cartoni ><-7> +< script php ><-7> +< generator content lodel ><-7> +< for a driverguide ><-7> +< sida vih ><-7> +< lesbian homosexual ><-7> +< de la lecture ><-7> +< graphique ensemble ><-7> +< ipr name dc ><-7> +< underground kathar6 webdesign ><-7> +< auto babes ><-7> +< caire ><-7> +< reglement ><-7> +< full movie ><-7> +< labels ><-7> +< cairn ><-7> +< victoria name ><-7> +< echange colloque ruban ><-7> +< process for finding ><-7> +< cards electronic ><-7> +< 2004 top 100 ><-7> +< the site includes ><-7> +< monde magique de ><-7> +< etang ><-7> +< noro ><-7> +< 3 cms ><-7> +< soldano ><-7> +< accro photo com ><-7> +< the scene ><-7> +< i france ><-7> +< photos a ><-7> +< content pablo ><-7> +< gmbh co ><-7> +< to advance ><-7> +< ou semi ><-7> +< galerie communautaire ><-7> +< images un ><-7> +< websurfing web ><-7> +< horoscope horoscope journalier ><-7> +< frederik grue ><-7> +< mcd i ><-7> +< description content exposition ><-7> +< new construction ><-7> +< drivers mouse drivers ><-7> +< portraits societe ><-7> +< limburg rivierenland ><-7> +< traditionnel ><-7> +< portfolio expose ><-7> +< hvalpe hundekennel ><-7> +< wiggles rock steady ><-7> +< dean ><-7> +< s adaptent aux ><-7> +< forschung technik ><-7> +< nokia gratuites sonnerie ><-7> +< cgi cgis ><-7> +< liberte libre ><-7> +< osman osmanli ><-7> +< photographie photographis ><-7> +< nageur ><-7> +< for rare ><-7> +< db dbz ><-7> +< sons videos ><-7> +< theleme net ><-7> +< montreal new york ><-7> +< 1 prets bancaires ><-7> +< mri prelevement ><-7> +< mariage photo mariage ><-7> +< ossia ><-7> +< vinyl windows vinyl ><-7> +< theories livres histoire ><-7> +< tradition tourisme education ><-7> +< service dog ><-7> +< nfsite ><-7> +< lunette ><-7> +< spannend eenzaam dating ><-7> +< osman ><-7> +< how to dance ><-7> +< pronostics ><-7> +< homme partenaire francais ><-7> +< boulogne photo ><-7> +< brandebourg fan ><-7> +< home lecteur ><-7> +< pas un ><-7> +< remoto buscador libros ><-7> +< e cards diddl ><-7> +< solaris hpux aix ><-7> +< 50 4933 1800 ><-7> +< org r nd ><-7> +< nedstat geeft op ><-7> +< homoparentalite ><-7> +< kennel birkedal 5927 ><-7> +< partiler milletvekilleri ><-7> +< anime cartoni ><-7> +< subject content intel ><-7> +< sexage dimorphisme ><-7> +< culottes string ><-7> +< des anges ><-7> +< rajewicz name keywords ><-7> +< tips top ><-7> +< site unique ><-7> +< paris10 ><-7> +< recherche amis love ><-7> +< content consultez gratuitement ><-7> +< drivers modem ><-7> +< movies movies ><-7> +< derniere minute ><-7> +< tellen gratis nedstat ><-7> +< scalp calm ><-7> +< dezelfde ><-7> +< bamboo recycled ><-7> +< reflective grating complete ><-7> +< fausse couche ><-7> +< humour !no title ><-7> +< hair free ><-7> +< typo 3 ><-7> +< features name ><-7> +< rajewicz comte warren ><-7> +< homme mannequin ><-7> +< driver archive ><-7> +< adapters ><-7> +< apprenez a ><-7> +< news! name ><-7> +< content suzanne ><-7> +< la serie ><-7> +< paris http ><-7> +< encre portail litteraire ><-7> +< needles bamboo recycled ><-7> +< rideau rideaux matelas ><-7> +< tim marchant name ><-7> +< meteo mode ><-7> +< dany boon ><-7> +< uk teenagers ><-7> +< ink dragon ><-7> +< content ca name ><-7> +< la region de ><-7> +< 0 trial la ><-7> +< cents fichiers ><-7> +< zodiac asian ><-7> +< keywords content foros ><-7> +< 06250 06550 ><-7> +< 2new page ><-7> +< is to ><-7> +< adapters windows drivers ><-7> +< galerie galerie ><-7> +< modem driver device ><-7> +< panda prints pandas ><-7> +< offers the best ><-7> +< dandruff dandruff protection ><-7> +< content gli ><-7> +< maths ><-7> +< bande univers bd ><-7> +< afro antillaise ><-7> +< feminins prenoms masculins ><-7> +< types the site ><-7> +< kent ><-7> +< l4v ><-7> +< movie gazette co ><-7> +< l emergence ><-7> +< description content foros ><-7> +< classement des ><-7> +< louxor ><-7> +< directamente interesantes ><-7> +< railing and ><-7> +< citroen ><-7> +< spectroscopy solar ><-7> +< dreamweaver photoshop name ><-7> +< seiko au ><-7> +< portail des associations ><-7> +< rigoler meilleur bonne ><-7> +< url content afrique ><-7> +< cuba ><-7> +< colin ><-7> +< porno free sex ><-7> +< la napoule napoulois ><-7> +< infos pratiques ><-7> +< contributor corporatename content ><-7> +< online magazine ><-7> +< disque dur disques ><-7> +< mae west ><-7> +< quartiers ><-7> +< asp name keywords ><-7> +< effectief chat ><-7> +< coccinelle net ><-7> +< security snoop logging ><-7> +< lodel ><-7> +< exposer http equiv ><-7> +< prix promotions ><-7> +< pros name dc ><-7> +< formatter content name ><-7> +< forum explications ><-7> +< sexisme sexisme ><-7> +< kathar6 webdesign freelance ><-7> +< of insulation ><-7> +< content photo galerie ><-7> +< de normandie et ><-7> +< device types ><-7> +< singles rare ><-7> +< jour les archives ><-7> +< passe en ><-7> +< description content determiner ><-7> +< silicon ><-7> +< true for accro ><-7> +< les a ><-7> +< bottle refresh ><-7> +< domestiques ><-7> +< affaires au ><-7> +< parc walt disney ><-7> +< decking railing and ><-7> +< humour sexy et ><-7> +< nokia 3210 3310 ><-7> +< 2003 one fine ><-7> +< soundcard drivers http ><-7> +< ottawa ><-7> +< fnac 24 heures ><-7> +< hundehvalpe racehunde cavalier ><-7> +< du football ><-7> +< a company ><-7> +< 19 mrwiggles biz ><-7> +< calais france ><-7> +< turquie istanbul ><-7> +< novita ><-7> +< com nc name ><-7> +< franchise name subject ><-7> +< pictures and name ><-7> +< maroc tradition ><-7> +< aus name keywords ><-7> +< arbeit ><-7> +< bayle name ><-7> +< gallery oriental dragons ><-7> +< chair ><-7> +< web des passionnes ><-7> +< produits de la ><-7> +< chanteur danyboon ><-7> +< placard ><-7> +< the harry ><-7> +< meilleur de ><-7> +< content vetement travail ><-7> +< hommes montres bijoux ><-7> +< of drivers for ><-7> +< name identifie ><-7> +< content building materials ><-7> +< montres bracelets ><-7> +< peau noire maquillage ><-7> +< tres sexy top ><-7> +< roofing vinyl ><-7> +< site for yourself ><-7> +< native american ><-7> +< rupert ><-7> +< actrice france cinema ><-7> +< ogcn ><-7> +< remoto buscador ><-7> +< de calais france ><-7> +< registratiedienst name ><-7> +< gainsbourg ><-7> +< michael dupont ><-7> +< jeux sur amazon ><-7> +< dance history ><-7> +< product and ><-7> +< nedstad netstat ><-7> +< songs mp3 ><-7> +< 1 piece maillot ><-7> +< lecture lire ><-7> +< djerba ><-7> +< actualisateur free gratuit ><-7> +< java scripts ><-7> +< dog equipment ><-7> +< gadolinium ><-7> +< en telecinema ><-7> +< sigle cartoons animation ><-7> +< chercheur novel texte ><-7> +< et textes url ><-7> +< internet ! name ><-7> +< jetable tyvek molinel ><-7> +< tous les domaines ><-7> +< ne cherche pas ><-7> +< youth kids ><-7> +< commercieel site ><-7> +< vlaanderen chat babbel ><-7> +< description content are ><-7> +< by step ><-7> +< alert view report ><-7> +< cinema video filmo ><-7> +< republicain cite citoyen ><-7> +< et acheter name ><-7> +< concours prix art ><-7> +< author content p ><-7> +< glisse ><-7> +< paris rencontre paris ><-7> +< out of ><-7> +< acceder aux ><-7> +< keywords content litterature ><-7> +< blouse tunique lunette ><-7> +< dot name ><-7> +< sous sous slip ><-7> +< club ancien combattant ><-7> +< author content e ><-7> +< and foundation materials ><-7> +< bouddhisme ><-7> +< copyright content nosland ><-7> +< zip animation ><-7> +< nature wallpapers ><-7> +< teenagers embarrassment nouveau ><-7> +< icone ><-7> +< vietnamien ><-7> +< capirelax vente par ><-7> +< 4933 1800 name ><-7> +< paris name dc ><-7> +< dating contact kontakt ><-7> +< barbara ravage ><-7> +< meilleur bonne ><-7> +< content expo ><-7> +< abuse intrusion ><-7> +< kureyon ><-7> +< copyright content kreestal ><-7> +< casque accessoire ><-7> +< 2004 infobebes ><-7> +< caldera ><-7> +< portfolio exposer numerique ><-7> +< brussel antwerpen gent ><-7> +< best sellers ><-7> +< nuage ><-7> +< pub pubs pub ><-7> +< abuse intrusion intranet ><-7> +< photo photography gallery ><-7> +< real audio ><-7> +< sartoux ><-7> +< 30 may 2005 ><-7> +< tourisme france name ><-7> +< ssilicon ><-7> +< livres histoire ><-7> +< bourse loteries ><-7> +< we ve ><-7> +< original ink ><-7> +< dog tracking equipment ><-7> +< sauce ><-7> +< sonneries gratuites ><-7> +< parton ><-7> +< musique midi paroles ><-7> +< de cheval ><-7> +< leasing ><-7> +< 2 roues ><-7> +< censura negli ><-7> +< index silicon ><-7> +< php reference top ><-7> +< 2003 01 04 ><-7> +< livres en anglais ><-7> +< vostre ><-7> +< plage chemise de ><-7> +< keywords content yarn ><-7> +< und kaufen bei ><-7> +< breakdance clips popping ><-7> +< femmes enceintes ><-7> +< au canape ><-7> +< gynecologie senologie ><-7> +< trouver des ><-7> +< fabrice ><-7> +< oriental chinese ><-7> +< cosmetics name keywords ><-7> +< accrophoto net r ><-7> +< site personnel qui ><-7> +< de sondages q ><-7> +< acces internet haut ><-7> +< expo photo ><-7> +< rigole programme exe ><-7> +< pros name ><-7> +< content 30days ><-7> +< speciales name ><-7> +< 2003 01 07 ><-7> +< gazette co ><-7> +< du nil ><-7> +< frises perruques postiches ><-7> +< bezoekcijfers webpagina s ><-7> +< ado jeunes jeune ><-7> +< postiches eclaircissant ><-7> +< grossesse name ><-7> +< licensed ><-7> +< dur disques durs ><-7> +< shorty simone perele ><-7> +< jean louis brossard ><-7> +< mariage photographe mariage ><-7> +< pascal name dc ><-7> +< divertissement humoristique ><-7> +< 8859 1 d ><-7> +< chansons http equiv ><-7> +< france name distribution ><-7> +< poplocking break ><-7> +< all name category ><-7> +< regionalisme ><-7> +< shoulders head and ><-7> +< fre name dc ><-7> +< image jpg gif ><-7> +< debate ><-7> +< tiznit mariage marocain ><-7> +< par les journalistes ><-7> +< telecinema ><-7> +< of music ><-7> +< sex symbol masculin ><-7> +< de sept ><-7> +< stats website site ><-7> +< piercing piercing cosmetics ><-7> +< content vincent ><-7> +< nuit soiree ><-7> +< marchander com le ><-7> +< protection protection network ><-7> +< blouson cotte combinaison ><-7> +< porte jartelle body ><-7> +< energie ><-7> +< umour comique ><-7> +< webagency lille nord ><-7> +< intellectuelle ><-7> +< programma verkoop ><-7> +< free redirection ><-7> +< technical support ><-7> +< gifts gift ><-7> +< libros gratis ><-7> +< annuaire evenements assistance ><-7> +< d angers ><-7> +< laboratoires et ><-7> +< content nedstat nedstad ><-7> +< duydunuzmu milliyetcilik ><-7> +< dc creator personalname ><-7> +< pub publicites ><-7> +< relatos de ><-7> +< abonnementen ><-7> +< de seite ><-7> +< portare al ><-7> +< lesbisch blind date ><-7> +< vinz ><-7> +< brunsperger name ><-7> +< debate name ><-7> +< mejor sistema de ><-7> +< canape futon futons ><-7> +< incarnes ethnique ><-7> +< telecinema name ><-7> +< content 2000 2002 ><-7> +< e in ><-7> +< 1 26e ><-7> +< uitgebreide ><-7> +< jeunes pour ><-7> +< men love ><-7> +< kathar6 webdesign ><-7> +< conte enfants informatique ><-7> +< mouloud ><-7> +< sont ici name ><-7> +< content interip networks ><-7> +< ecran wallpapers ><-7> +< a little ><-7> +< education formation ><-7> +< abirnet ><-7> +< gesperrt ><-7> +< vacances a ><-7> +< nickelback ><-7> +< moviegazette co ><-7> +< savoirs et ><-7> +< plus drole de ><-7> +< elus ><-7> +< opal iman flori ><-7> +< godreche achat ><-7> +< argent alladvantage ><-7> +< 800x600 1024x768 ><-7> +< nu objectif film ><-7> +< info sur ><-7> +< chaises tapis lit ><-7> +< _top de ><-7> +< en diverse ><-7> +< chihuahua hundeavl hunde ><-7> +< mouse driver scanner ><-7> +< content le premier ><-7> +< interactief ><-7> +< downloading and ><-7> +< jeux pc jeux ><-7> +< xdm web abirnet ><-7> +< el mundo ><-7> +< b2evolution 0 ><-7> +< drivers hp printer ><-7> +< chatte sournoise minette ><-7> +< meisjes jongens ><-7> +< portable telephones portables ><-7> +< balades en pays ><-7> +< formation enseignement environnement ><-7> +< dc source url ><-7> +< de las directamente ><-7> +< contributor corporatename address ><-7> +< sur 24 7 ><-7> +< classification content building ><-7> +< dansk svensk papillon ><-7> +< content q all ><-7> +< valejo 011 ><-7> +< simple aventure name ><-7> +< vostre serie preferite ><-7> +< pluie froid ><-7> +< 0 name ms ><-7> +< gallereis ><-7> +< musique midi ><-7> +< content photographe mariage ><-7> +< dc subject scheme ><-7> +< lampes ><-7> +< content numeriser ><-7> +< content appel a ><-7> +< dog tracking ><-7> +< description content traduction ><-7> +< description content about ><-7> +< bourget forum ><-7> +< painting oriental ><-7> +< anime anime cartoni ><-7> +< document name page ><-7> +< strings montres appareils ><-7> +< roots ><-7> +< a monthly ><-7> +< chatelain ><-7> +< rabade et ><-7> +< fonts sponsors ><-7> +< lightning ><-7> +< la mer ou ><-7> +< foros de libros ><-7> +< texture textures ><-7> +< le film ><-7> +< and there ><-7> +< content kreestal ><-7> +< galactographie mammotome ><-7> +< sexe sex rongeurs ><-7> +< exe zip animation ><-7> +< tone ring tones ><-7> +< dj fab mouloud ><-7> +< tattoo history content ><-7> +< bulky chunky ><-7> +< boulogne photos boulogne ><-7> +< que toute ><-7> +< des cartes ><-7> +< heel veel andere ><-7> +< dialogue encheres genealogie ><-7> +< hop timeline name ><-7> +< shoulders head ><-7> +< journal librairie libraire ><-7> +< overhead unobtrusive windows ><-7> +< radius 011 ><-7> +< educatives ><-7> +< image name keywords ><-7> +< images free anime ><-7> +< 100 des prenoms ><-7> +< 8859 1 katz ><-7> +< keywords content art ><-7> +< de rajewicz ><-7> +< calm calmer life ><-7> +< professional k9 schutzhund ><-7> +< en ronde ><-7> +< specific discussion ><-7> +< restauration elageur ><-7> +< par over blog ><-7> +< content eenvoudig ><-7> +< gardening ><-7> +< review jeux ><-7> +< mysterieuse ><-7> +< kit webdesign ><-7> +< la rencontre ><-7> +< araba ><-7> +< asian dragon ><-7> +< association loi ><-7> +< with photos ><-7> +< patients ><-7> +< ring tone ring ><-7> +< costa brava costa ><-7> +< content bill ><-7> +< catalogue poils ><-7> +< k9 police ><-7> +< elageur anti ><-7> +< pages perso shopping ><-7> +< la drogue ><-7> +< anglais americain musique ><-7> +< overlord44 ><-7> +< tattoo pictures tattoo ><-7> +< services pour ><-7> +< website stats ><-7> +< course de ><-7> +< jerusalem ><-7> +< rajewicz homme ><-7> +< e sur ><-7> +< layette ><-7> +< canzoni ><-7> +< pubs grumly ours ><-7> +< sondages q all ><-7> +< vz 1 lc ><-7> +< bekijken ze ><-7> +< lycos shopping http ><-7> +< free gratuit annuaire ><-7> +< decoration decoration ><-7> +< prevention solidarite sport ><-7> +< af cavalier ><-7> +< alyssa milano shannen ><-7> +< duidelijke en betrouwbare ><-7> +< voir! blagues ><-7> +< calculer ><-7> +< maxi cd singles ><-7> +< delires kiss ><-7> +< seul le sexe ><-7> +< en direct dialogue ><-7> +< houellebecq psychanalyse auteur ><-7> +< gratuit allopass ><-7> +< adverteren aanbod ><-7> +< chihuahua hundehvalpe hunde ><-7> +< dc audience ><-7> +< fashion men ><-7> +< motive ><-7> +< tester votre ><-7> +< vacances loisirs ><-7> +< submit gratis ><-7> +< a c 2002 ><-7> +< mp3 baladeurs ><-7> +< chandler ><-7> +< traditions cuisine marocaine ><-7> +< html name author ><-7> +< au pays ><-7> +< litterature francophone connaissance ><-7> +< dv ou comment ><-7> +< web content ><-7> +< stellar ><-7> +< laon ><-7> +< feng ><-7> +< hp printer ><-7> +< informatique home ><-7> +< content dandruff dandruff ><-7> +< dog training ><-7> +< envoyer des sms ><-7> +< melissa joan hart ><-7> +< super8 telecinema ><-7> +< pvc pipe ventilation ><-7> +< teens meet ><-7> +< reglementation ><-7> +< ailleurs diouda ><-7> +< cochon inde name ><-7> +< needles bamboo ><-7> +< sites francophone ><-7> +< convivialite culture ><-7> +< bronzage bain de ><-7> +< location de vacances ><-7> +< avenir ><-7> +< tunique lunette ><-7> +< paris x name ><-7> +< thebes ><-7> +< initiatives ><-7> +< marchand shop online ><-7> +< personalized with ><-7> +< normes de ><-7> +< grande taille ><-7> +< sondages q ><-7> +< web numerosi visitatori ><-7> +< de travail est ><-7> +< voyante auto moto ><-7> +< pubs pub pubs ><-7> +< grupo ><-7> +< en voie ><-7> +< analyse website ><-7> +< festival costumes forum ><-7> +< normal http ><-7> +< de leukste links ><-7> +< pebble beach linen ><-7> +< de rire en ><-7> +< paintign paintings dragon ><-7> +< lingerie janine ><-7> +< mougins mouginois ><-7> +< tf1 et de ><-7> +< blinkies tchat ><-7> +< creation maillots ><-7> +< astrology dragons gift ><-7> +< dany boon danyboon ><-7> +< default les ><-7> +< baroque ><-7> +< canon printer drivers ><-7> +< delire ablague ><-7> +< zodiac astrology ><-7> +< actuelles festival breton ><-7> +< ensemble kit ><-7> +< musique coccinelle net ><-7> +< live concerts groupes ><-7> +< goede ><-7> +< drivers a ><-7> +< ashcroft ><-7> +< de soutien ><-7> +< permanentes des ><-7> +< golive 4 http ><-7> +< images insolites blinkies ><-7> +< azur riviera paca ><-7> +< avl hundehvalpe ><-7> +< card drivers network ><-7> +< chinese calligraphy oriental ><-7> +< un internet ><-7> +< spirit of ><-7> +< musicales rencontres transmusicales ><-7> +< aventure name ><-7> +< hebergement gratuit hebergement ><-7> +< uni name author ><-7> +< de l ebusiness ><-7> +< tuning tunning ><-7> +< karamba! ><-7> +< screensaver wallpaper ><-7> +< lookup ><-7> +< vechtstreek gouda ><-7> +< sejours disneyland parc ><-7> +< reviews sites ><-7> +< content juergen ><-7> +< mouse drivers monitor ><-7> +< des sketches et ><-7> +< content ab ><-7> +< quebecois ><-7> +< les3epices ><-7> +< espace professionnelbienvenue ><-7> +< angers municipalite angers ><-7> +< get a breath ><-7> +< scouting ><-7> +< dreamweaver name ><-7> +< bureautique webcam ><-7> +< costumes explications ><-7> +< tattoo tattooing ><-7> +< foros de discusion ><-7> +< draveil juvisy ><-7> +< content foros libros ><-7> +< paris rencontres hommes ><-7> +< appareils de ><-7> +< by step process ><-7> +< images sons videos ><-7> +< pictures nature wallpapers ><-7> +< vacaturebanken advertentierubrieken ><-7> +< content les forums ><-7> +< teen links give ><-7> +< numerosi ><-7> +< fan club fan ><-7> +< billig marchand shop ><-7> +< magazines teen ><-7> +< pima ><-7> +< 0 1 http ><-7> +< uw welke ><-7> +< 2002 q all ><-7> +< gites ><-7> +< bandes dessinees bd ><-7> +< anes anes ><-7> +< ventilation building ><-7> +< website aanmelden ><-7> +< l 0 silver ><-7> +< 3 4 decembre ><-7> +< tips name ><-7> +< soigne son ><-7> +< liberte la ><-7> +< s official web ><-7> +< draco ><-7> +< astronomy ccd ><-7> +< toute l histoire ><-7> +< coutumes bijoux ><-7> +< gazette com ><-7> +< images bodyart body ><-7> +< db dbz dbgt ><-7> +< rongeur est souvent ><-7> +< sports voyages ><-7> +< gore cartes virtuelles ><-7> +< content randy lauderbaugh ><-7> +< rondes a porter ><-7> +< sud est ><-7> +< sevgi ><-7> +< dave ><-7> +< ramses ><-7> +< concrete ><-7> +< generator content blocco ><-7> +< realmente interessati ><-7> +< classe copain ><-7> +< julie london ><-7> +< 1 official ><-7> +< signet guide ><-7> +< turnis ><-7> +< 1 katz ><-7> +< tout seul ><-7> +< transarchives name ><-7> +< prenom filles ><-7> +< moins chers! ><-7> +< sports voyages warez ><-7> +< spectroscope ><-7> +< debat communication ><-7> +< gratis gratuitos melodysoft ><-7> +< au dv ou ><-7> +< ici ou ><-7> +< deeper ><-7> +< svensk papillon ><-7> +< email homepage ><-7> +< ergenekon mhp ><-7> +< schumann http equiv ><-7> +< au dv eumig ><-7> +< greeting card ><-7> +< pantalon chaussures ><-7> +< dedie aux jeunes ><-7> +< avukat ><-7> +< de voitures prises ><-7> +< siding vinyl ><-7> +< ordinateurs portables bureautique ><-7> +< fr photographe ><-7> +< editions du septentrion ><-7> +< litterature francophone ><-7> +< deeper kyo ><-7> +< klodcabit ><-7> +< un projecteur en ><-7> +< hannigan ><-7> +< vt220 tn3270 tn5250 ><-7> +< tattoo studio s ><-7> +< easily build a ><-7> +< chateaux ><-7> +< heures sur 24 ><-7> +< numerique appareil photo ><-7> +< milla ><-7> +< dragon paintign paintings ><-7> +< brunsperger name identifier ><-7> +< musical patrimoine ><-7> +< guide gratuit asp ><-7> +< divertissement loisirs ><-7> +< camescope numerique ><-7> +< telecinema super 8 ><-7> +< service webmaster ><-7> +< general name doc ><-7> +< library the ><-7> +< republicain cite ><-7> +< internet les nouveaux ><-7> +< celebrites actrice ><-7> +< contactzipcode ><-7> +< encryption ><-7> +< etait ><-7> +< mandelieu mandelocien ><-7> +< author content nicolas ><-7> +< watts ><-7> +< dance like usher ><-7> +< litteraire roman louis ><-7> +< qui presente des ><-7> +< sonneries gratuites pour ><-7> +< genealogie jobs ><-7> +< websiteonderhoud ><-7> +< inscrivez ><-7> +< content bernard cloutier ><-7> +< les grands ><-7> +< tour eiffel ><-7> +< publiceren ><-7> +< libre expression ><-7> +< de silence ><-7> +< 0 name originator ><-7> +< dance like ><-7> +< robots name keywords ><-7> +< vinz porsche ><-7> +< pour votre site ><-7> +< a des professionnels ><-7> +< watercolor paintings ink ><-7> +< stellar spectroscopy solar ><-7> +< goldenmarket ><-7> +< bosch drechtsteden drente ><-7> +< reviews of ><-7> +< par correspondance femme ><-7> +< et gore cartes ><-7> +< true for geocities ><-7> +< ata ><-7> +< contactzipcode content ><-7> +< best sellers journal ><-7> +< content valejo ><-7> +< paris tourisme ><-7> +< dvdrama ><-7> +< jeremy chatelain 6 ><-7> +< et l entreprise ><-7> +< zanger ><-7> +< moment de ><-7> +< des dossiers bande ><-7> +< solve problems ><-7> +< document simplement jeremy ><-7> +< bilim ><-7> +< ata osman ><-7> +< for movie gazette ><-7> +< body soutien gorge ><-7> +< voila fr ><-7> +< lang it ><-7> +< tunique lunette casque ><-7> +< certainteed insulation roofing ><-7> +< finance nature ><-7> +< interessati name ><-7> +< carrickfergus the ><-7> +< tn5250 hummingbird xdk ><-7> +< 5 name identifier ><-7> +< sites bouwen ><-7> +< theoulien siagne ><-7> +< shirt t ><-7> +< reese witherspoon ><-7> +< roues ><-7> +< mon 30 ><-7> +< fincam l3v ><-7> +< noord holland name ><-7> +< audio mp3 ><-7> +< windows 98 detection ><-7> +< archives des amis ><-7> +< keywords content prenom ><-7> +< playa del ><-7> +< creator content lars ><-7> +< club ancien ><-7> +< jardinier ><-7> +< pimboli ><-7> +< dc generator ><-7> +< bristow ><-7> +< equipment online ><-7> +< gay bi homo ><-7> +< bosch drechtsteden ><-7> +< 1 fr ><-7> +< spanish name copyright ><-7> +< catalogue vente par ><-7> +< ronde lille ><-7> +< equestres cheval poney ><-7> +< boogaloos http equiv ><-7> +< title content intel ><-7> +< content pascal name ><-7> +< dessin anime ><-7> +< espace professionnel ><-7> +< dbz ><-7> +< genie annuaire lien ><-7> +< trail enduro ><-7> +< spectroscope webcam ><-7> +< sri lanka ><-7> +< n 1 s ><-7> +< and more full ><-7> +< proprio sito ><-7> +< principales ><-7> +< wmv ><-7> +< sur marchander com ><-7> +< racisme ><-7> +< universite concours ><-7> +< du name author ><-7> +< fr vivez ><-7> +< la caution hip ><-7> +< auteur examen savoir ><-7> +< models male ><-7> +< art fnac com ><-7> +< exigence culture ><-7> +< ekonomi ><-7> +< find great ><-7> +< o hara ><-7> +< mis sur ><-7> +< bandes bande dessinees ><-7> +< michelle williams ><-7> +< la rabade ><-7> +< filmati recensioni ><-7> +< dany danyboon ><-7> +< et illustration ><-7> +< firewall security ><-7> +< pipe decking ><-7> +< psychanalyse auteur examen ><-7> +< author content marco ><-7> +< name web ><-7> +< keywords content lyrics ><-7> +< equipment working ><-7> +< dossiers du sport ><-7> +< viking ><-7> +< sebastien http equiv ><-7> +< boy good ><-7> +< de travail et ><-7> +< with photos text ><-7> +< lyric anglais ><-7> +< slayers kimagure ranma ><-7> +< temps http ><-7> +< database vacaturebanken ><-7> +< 1 werkdag ><-7> +< identifier content toi ><-7> +< astrology and horoscope ><-7> +< chat site free ><-7> +< blagues name keywords ><-7> +< suite a abus ><-7> +< amis love aimer ><-7> +< description content 1400 ><-7> +< content litterature francophone ><-7> +< the way ><-7> +< equipment schutzhund supply ><-7> +< yarn all ><-7> +< description content dog ><-7> +< dk name subject ><-7> +< lacoccinelle net r ><-7> +< content musik music ><-7> +< restauration elageur anti ><-7> +< classe et ><-7> +< examen savoir ><-7> +< officiels name keywords ><-7> +< plus encore! name ><-7> +< pays d opale ><-7> +< cuisine litterature scolaire ><-7> +< spectroscopy ><-7> +< meuble ><-7> +< traditions coutumes ><-7> +< danyboon net vous ><-7> +< content sports ><-7> +< xwindows telnet host ><-7> +< 107 2new page ><-7> +< sessionwall videoconfer ><-7> +< lies a ><-7> +< grating fraunhofer ><-7> +< celebrite star ><-7> +< d ailleurs diouda ><-7> +< domeinservice ><-7> +< dancehall ><-7> +< homme enfant sport ><-7> +< acne dermablend ><-7> +< citoyenne ><-7> +< esc weblog on ><-7> +< conte montaigne ><-7> +< metisse name ><-7> +< parcs de ><-7> +< bebe bebes ><-7> +< fraternite salon forum ><-7> +< graffiti graffiti alphabets ><-7> +< photos de warren ><-7> +< content revues org ><-7> +< website of warren ><-7> +< education nationale ><-7> +< waves ><-7> +< diamonds ><-7> +< defense riverain religion ><-7> +< musculation ordinateur ><-7> +< mahdessian ><-7> +< disques durs carte ><-7> +< xdk 3d server ><-7> +< forum tchat e ><-7> +< rajewicz mannequin ><-7> +< and home remodeling ><-7> +< decepticons ><-7> +< jeu video toute ><-7> +< incroyable umour ><-7> +< sonnet ><-7> +< sortir a ><-7> +< pomme ><-7> +< fashioned ><-7> +< theoule theoule ><-7> +< drivers a company ><-7> +< humoristique animaux blondes ><-7> +< charte citoyen fraternite ><-7> +< acheter vendre ><-7> +< website analyse website ><-7> +< 3330 ><-7> +< hot potatoes ><-7> +< international top ><-7> +< calligraphy ><-7> +< titan ><-7> +< little yoda ><-7> +< tattooing tatoo ><-7> +< auribeau d ><-7> +< surfeur bad boy ><-7> +< drawing drawings original ><-7> +< et d ailleurs ><-7> +< focus in ><-7> +< graphiques coxinelle ><-7> +< repair ><-7> +< art body modification ><-7> +< opengl ><-7> +< training equipment for ><-7> +< eclats ><-7> +< de correspondance ><-7> +< s adaptent ><-7> +< opal ><-7> +< website bezoekers ><-7> +< eumig kodack name ><-7> +< rigoler meilleur ><-7> +< remodeling name robots ><-7> +< content jean pillou ><-7> +< fontes fonts ><-7> +< ze het ><-7> +< content texte ><-7> +< la telephonie ><-7> +< !no title ><-7> +< sport bijoux bracelets ><-7> +< comuneris ><-7> +< fnac fnac ><-7> +< line of k9 ><-7> +< tele television drole ><-7> +< pour peau ><-7> +< retriever ><-7> +< page building ><-7> +< dv eumig kodack ><-7> +< content d ici ><-7> +< jean pillou ><-7> +< sports football ><-7> +< rajewicz fan ><-7> +< on est ><-7> +< loisirs dysneyland tourisme ><-7> +< protection dandruff ><-7> +< mhp bayrak mp3 ><-7> +< care beauty ><-7> +< retro elus ><-7> +< content photo expo ><-7> +< installing drivers a ><-7> +< libraire ><-7> +< movie trailers and ><-7> +< crigoler rigole ><-7> +< content html editor ><-7> +< copain d ><-7> +< feminine de marque ><-7> +< male femelle ><-7> +< protection network ><-7> +< content hip ><-7> +< bronzage bain ><-7> +< racing supercross ><-7> +< routeplanner ><-7> +< associative 1901 charte ><-7> +< com livres ><-7> +< certainteed ><-7> +< breakdance clips ><-7> +< name serveur content ><-7> +< yyyymmdd content 20010325 ><-7> +< familial de ><-7> +< drasan nitti name ><-7> +< explications etapes epouse ><-7> +< apple ><-7> +< content equipe ><-7> +< le point ><-7> +< nuit porte ><-7> +< girl magazines ><-7> +< visibilita in ><-7> +< fondecran ><-7> +< festival costumes ><-7> +< photo galerie gratuit ><-7> +< abonnement internet ><-7> +< ses parcs a ><-7> +< chantelle lejaby ><-7> +< natweb ><-7> +< nitti ><-7> +< ist das ><-7> +< polls teen ><-7> +< 30 may ><-7> +< anime image pictures ><-7> +< rest ><-7> +< disney bienvenu ><-7> +< server 3 0 ><-7> +< gedifra pattern fixation ><-7> +< marie maroc ><-7> +< website tracking ><-7> +< anciennes ><-7> +< disneyland paris ><-7> +< partenaire rencontrer ><-7> +< content editions ><-7> +< railing and fencing ><-7> +< gratuit plans ><-7> +< overhead unobtrusive ><-7> +< electronic card ><-7> +< content la lune ><-7> +< mpeg feinte image ><-7> +< net r nd ><-7> +< net r nb ><-7> +< greenpeace ecologie couples ><-7> +< cartoons animation ><-7> +< network filtering ><-7> +< bande dessinee et ><-7> +< duydunuzmu ><-7> +< vindbaar ><-7> +< for professional k9 ><-7> +< interessati name keywords ><-7> +< organic root metisse ><-7> +< on 1997 06 ><-7> +< steady crew popping ><-7> +< card drivers ><-7> +< animated jpeg mpeg ><-7> +< lecteurs dvd ><-7> +< personnalise image ><-7> +< art costumes ><-7> +< for carrickfergus ><-7> +< movements and ><-7> +< enfants informatique langues ><-7> +< letras de ><-7> +< de mettre ><-7> +< mpg mpeg feinte ><-7> +< trail ><-7> +< matiere de ><-7> +< polices fontes fonts ><-7> +< counters and ><-7> +< content mon 30 ><-7> +< visitez la ><-7> +< supporter ><-7> +< dalton ><-7> +< astrology and ><-7> +< jaguar ><-7> +< flori roberts ><-7> +< itchy scalp dry ><-7> +< review of the ><-7> +< drivers driver download ><-7> +< scsi adapters ><-7> +< robin boutique collection ><-7> +< filmati recensioni e ><-7> +< ouarzazate sahara ><-7> +< homme top model ><-7> +< antillaise cheveux crepus ><-7> +< spaniel labrador ><-7> +< plage thalassotherapie ><-7> +< embarrassment ><-7> +< tester votre un ><-7> +< perele chantelle lejaby ><-7> +< pubblicita ><-7> +< 8859 1 26e ><-7> +< services certification nf ><-7> +< top actualisateur ><-7> +< web pour rigoler ><-7> +< over uw websitebezoek ><-7> +< finecam s4 fincam ><-7> +< agutter ><-7> +< classification content petite ><-7> +< langages ><-7> +< 3dimensions monde chat ><-7> +< hit counter for ><-7> +< cd single ><-7> +< 8859 1 groupe ><-7> +< regio noord ><-7> +< singles rare collectable ><-7> +< grappen ><-7> +< anna karina ><-7> +< et hommes montres ><-7> +< lars schumann name ><-7> +< sponsors offres emploi ><-7> +< antwoorden probeer ><-7> +< wazzaa whazzup budweiser ><-7> +< photo pc ><-7> +< jupe au canape ><-7> +< netstat ><-7> +< sneakers footwear ><-7> +< wazzaa whazzup ><-7> +< pdf ><-7> +< yorum ><-7> +< play boy ><-7> +< jeunes mamans ><-7> +< 4933 1800 ><-7> +< simbel ><-7> +< film name keywords ><-7> +< note cards ><-7> +< sport velo ><-7> +< peace ><-7> +< amour astrologie horoscope ><-7> +< cavalier king charles ><-7> +< by sonia name ><-7> +< monroe marilyn ><-7> +< chat kids young ><-7> +< website tracking tracing ><-7> +< budweiser ><-7> +< a great ><-7> +< ceramics ><-7> +< thalasso ><-7> +< et liste de ><-7> +< short url ><-7> +< kids and ><-7> +< and news ><-7> +< brunsperger name copyright ><-7> +< url content danyboon ><-7> +< histoire angers ><-7> +< photographies personnelles ><-7> +< horoscope jour ><-7> +< railing ><-7> +< bungalows ><-7> +< supermodels fashion ><-7> +< dragon artist ><-7> +< photo com ><-7> +< bandes bande ><-7> +< keywords value ><-7> +< materials name keywords ><-7> +< content dauphins ><-7> +< driver sound card ><-7> +< la famille ><-7> +< leven ><-7> +< dvd logiciels ><-7> +< musica musica ><-7> +< sont l objet ><-7> +< saint jean de ><-7> +< prints and greeting ><-7> +< du delire avec ><-7> +< s capirelax ><-7> +< hair care beautiful ><-7> +< nr 1 ns ><-7> +< quartier defense ><-7> +< gallery galleries personalized ><-7> +< ze het nedstat ><-7> +< goldt ><-7> +< photography nature photographs ><-7> +< description content gli ><-7> +< lachaise ><-7> +< dvd lecteurs ><-7> +< mode boutiques ><-7> +< dramatiques ><-7> +< tele les plus ><-7> +< photography gallery expo ><-7> +< name place ><-7> +< content entrez dans ><-7> +< robe de plage ><-7> +< argent alladvantage gratuit ><-7> +< et vente name ><-7> +< nt name ><-7> +< chinois 2003 horoscope ><-7> +< fr content le ><-7> +< d name ><-7> +< l entreprise ><-7> +< porno tv ><-7> +< de la jupe ><-7> +< using our simple ><-7> +< 8859 1 histoire ><-7> +< generator content b2evolution ><-7> +< modem driver ><-7> +< canape en ><-7> +< drivers for ><-7> +< promotion promotions ><-7> +< french titre traductions ><-7> +< kennel birkedal avl ><-7> +< paris france name ><-7> +< de brandebourg fan ><-7> +< windows drivers dos ><-7> +< insolite recherche ><-7> +< lacoccinelle ><-7> +< year nouvel an ><-7> +< rire en tout ><-7> +< of rap hip ><-7> +< chinese astrology and ><-7> +< whassup wazzaa whazzup ><-7> +< 1 google ><-7> +< en ligne pour ><-7> +< horoscope ascendant free ><-7> +< over uw ><-7> +< simple web ><-7> +< balconnet string ><-7> +< serie preferite ><-7> +< drivers sound drivers ><-7> +< logo et ><-7> +< absorption ><-7> +< gerez gratuitement ><-7> +< jamais vu ><-7> +< rencontrer un homme ><-7> +< balises ><-7> +< pour les enfants ><-7> +< chat and community ><-7> +< dies ist die ><-7> +< resort paris ><-7> +< haitian art ><-7> +< jonathan ><-7> +< sport kultur ><-7> +< model book photos ><-7> +< fr horoscope ><-7> +< auteur examen ><-7> +< liefje ><-7> +< intrusion detection ><-7> +< yarn all rights ><-7> +< lnb ><-7> +< copain d avant ><-7> +< 3d server ><-7> +< suite a ><-7> +< nedstat nedstad ><-7> +< en anglais ><-7> +< popping locking ><-7> +< tourisme france ><-7> +< espace terre ><-7> +< milla jovovich ><-7> +< super super8 telecinema ><-7> +< set graphique ensemble ><-7> +< brossard beatrice ><-7> +< doit ><-7> +< blague humours blagues ><-7> +< japp whassup wazzaa ><-7> +< lingerie homme enfant ><-7> +< absorption lines ><-7> +< plant ><-7> +< beaute les a ><-7> +< spiele sport ><-7> +< 4933 ><-7> +< b2b ><-7> +< playa ><-7> +< publisher content webmaster ><-7> +< macrobiopsy galactographie mammotome ><-7> +< personnalise image veste ><-7> +< dv ><-7> +< cosmetics name ><-7> +< webagency lille ><-7> +< gratuit plans gratos ><-7> +< marc gavage ><-7> +< meilleur et ><-7> +< remote ><-7> +< natation mode nuisette ><-7> +< rideaux matelas ><-7> +< australian animals ><-7> +< files the ><-7> +< naked nude portrait ><-7> +< remoto ><-7> +< combinaison securite ><-7> +< web counter ><-7> +< kathar6 ><-7> +< photo com name ><-7> +< porno wel ><-7> +< fonts sponsors offres ><-7> +< piercing piercing ><-7> +< public health ><-7> +< osman osmanli devlet ><-7> +< image interview film ><-7> +< mp3 resimler ><-7> +< www artefact fr ><-7> +< lecture l exigence ><-7> +< tacquet name ><-7> +< free mini ><-7> +< heroic search ><-7> +< hit counter ><-7> +< string bustier ><-7> +< dating en ><-7> +< laverda ><-7> +< juste prix name ><-7> +< tools name ><-7> +< kinetic chronograph ><-7> +< mp3 name dc ><-7> +< content duydunuzmu ><-7> +< lecteurs ><-7> +< nfs x ><-7> +< edenpics ><-7> +< jokes fun gore ><-7> +< evangelion ><-7> +< jennifer lopez harry ><-7> +< sejours disneyland ><-7> +< d2 ><-7> +< reviews sites for ><-7> +< chatteries ><-7> +< portables portable ><-7> +< theoule ><-7> +< hummingbird ><-7> +< wallpaper 3d ><-7> +< 3410 3330 melodie ><-7> +< ecran fond ><-7> +< worsted ><-7> +< problems advice ><-7> +< pomeranian ><-7> +< chevaux photo photographie ><-7> +< des quizz pour ><-7> +< mp3 midi ><-7> +< vinyl siding manufacturer ><-7> +< amazon bienvenue ><-7> +< wet wet wet ><-7> +< de maillot ><-7> +< voyage martinique ><-7> +< poils incarnes ><-7> +< clearday ><-7> +< equipment working equipment ><-7> +< happy hardcore ><-7> +< labrador cairn terrier ><-7> +< grossesse name keywords ><-7> +< gratuit services ><-7> +< etc en ><-7> +< mon site rencontrer ><-7> +< plus encore! ><-7> +< roberts organic ><-7> +< celebrity gossip ><-7> +< web surfing ><-7> +< mio offres comparer ><-7> +< title content accro ><-7> +< etmek ><-7> +< humourdunet com ><-7> +< 911 ><-7> +< drivers soundcard drivers ><-7> +< sex rongeurs ><-7> +< description content document ><-7> +< exigence de ><-7> +< astroloji ><-7> +< panel de ><-7> +< sud namibie ><-7> +< hundeavl hunde hvalpe ><-7> +< cannes cannois le ><-7> +< lejaby lise ><-7> +< worsted double ><-7> +< travaux manuels ><-7> +< agenda gratuit loterie ><-7> +< personalname content guilhot ><-7> +< prism name description ><-7> +< to breakdance breakdance ><-7> +< exposition agenda gratuit ><-7> +< document planete ><-7> +< real a ><-7> +< les copains ><-7> +< de lci ><-7> +< anciens eleves ><-7> +< des anciens ><-7> +< peinture equestres ><-7> +< ligne dernieres nouvelles ><-7> +< 3d vmrl ><-7> +< heller ><-7> +< silverdragonstudio ><-7> +< description content intel ><-7> +< de classe ><-7> +< bei lycos shopping ><-7> +< marque lingerie ><-7> +< content scooter ><-7> +< 80 s ><-7> +< jupes jupe ><-7> +< gratuit 2003 ><-7> +< content viamichelin propose ><-7> +< fra1904 paris ><-7> +< etc de sept ><-7> +< troc name ><-7> +< meilleurs blagues name ><-7> +< chinese chinoise horoscope ><-7> +< biz hompepage ><-7> +< populaire ><-7> +< cash back ><-7> +< 365 ><-7> +< webcam astronomy ccd ><-7> +< ouarzazate sahara fes ><-7> +< all things ><-7> +< tekk ><-7> +< romancier nouvelles genre ><-7> +< brunsperger name author ><-7> +< voir! ><-7> +< short shorty simone ><-7> +< publicites publicite pubs ><-7> +< download free mp3 ><-7> +< pillou name ><-7> +< links name page ><-7> +< noindex nofollow name ><-7> +< marc gavage name ><-7> +< ville angers ><-7> +< la promotion de ><-7> +< content diouda ><-7> +< ravage hom ><-7> +< features name keywords ><-7> +< de sept cents ><-7> +< shit name ><-7> +< rapide ! ><-7> +< forest name ><-7> +< sortir sur ><-7> +< drivers etc ><-7> +< copyright content 1999 ><-7> +< dragonballz ><-7> +< keywords content cancer ><-7> +< droles rigolotes ><-7> +< brossard beatrice mace ><-7> +< faire de ><-7> +< equipements ><-7> +< degree ><-7> +< de sylvie ><-7> +< name translation ><-7> +< pour les amoureux ><-7> +< nouvelle panda ><-7> +< usher how to ><-7> +< siir aydin partiler ><-7> +< content appel ><-7> +< identifie url content ><-7> +< tim marchant 2002 ><-7> +< and mp3 ><-7> +< limburg belgie ><-7> +< imprimante ><-7> +< bracelets montres ><-7> +< content feminisme anti ><-7> +< comique insolite ><-7> +< angers maire angers ><-7> +< page count ><-7> +< chevaux photo ><-7> +< services 100 ><-7> +< fes nord ><-7> +< julie andrews ><-7> +< content marc gavage ><-7> +< manufacturer specific ><-7> +< gifts silver ><-7> +< little yoda name ><-7> +< content emoi com ><-7> +< fiber silk alpaca ><-7> +< silk alpaca ><-7> +< 0 9 0 ><-7> +< game flash games ><-7> +< links give ><-7> +< moreau ><-7> +< in chinese calligraphy ><-7> +< software hardware ><-7> +< 01 jan 1997 ><-7> +< d echange et ><-7> +< critiques et ><-7> +< ressources name ><-7> +< konya ><-7> +< amour annonces de ><-7> +< modelisme ><-7> +< festival de musiques ><-7> +< 1251 name robots ><-7> +< rexec ><-7> +< oriental dragons ><-7> +< dvd televiseur televiseurs ><-7> +< grumly delires kiss ><-7> +< care beautiful hair ><-7> +< com tous les ><-7> +< les informations ><-7> +< guia guias ><-7> +< 130 et ><-7> +< title content photographe ><-7> +< cuisine restauration ><-7> +< rexec xdm ><-7> +< hunde hvalpe hundekennel ><-7> +< insolites blinkies tchat ><-7> +< allez pouvoir ><-7> +< nature rencontre ><-7> +< telephonie sur ><-7> +< hundehvalpe racehunde ><-7> +< networks name dc ><-7> +< gratuit greenpeace ecologie ><-7> +< maladie ><-7> +< drivers etc driverguide ><-7> +< 06400 06110 06150 ><-7> +< magazine cosmetics ><-7> +< terrasse ><-7> +< content feminisme ><-7> +< tf1 en continue ><-7> +< dc format scheme ><-7> +< mun ><-7> +< mouginois ><-7> +< photo le ><-7> +< mp3 resimler pkk ><-7> +< piratage ><-7> +< silver dragon studio ><-7> +< amateurs avertis ou ><-7> +< content typo ><-7> +< judith godreche ><-7> +< prehistorique ><-7> +< cadeau cadeaux cadeau ><-7> +< protection firewall ><-7> +< recommander ><-7> +< goodies ><-7> +< de calais name ><-7> +< epistemon epistemon gargantua ><-7> +< room uk ><-7> +< linux xstart ><-7> +< caution hip ><-7> +< working equipment k9 ><-7> +< 3 suisses femme ><-7> +< makers ><-7> +< clips how to ><-7> +< tof ><-7> +< tn5250 hummingbird ><-7> +< tatto tattoo pictures ><-7> +< partenaire rencontrer un ><-7> +< portable sms ><-7> +< site sur l ><-7> +< logo design ><-7> +< document simplement ><-7> +< driver device driver ><-7> +< sexy top ><-7> +< disguise ><-7> +< anime e ><-7> +< drivers tape backup ><-7> +< signes name ><-7> +< de strategie jeux ><-7> +< vallee ><-7> +< to dance like ><-7> +< boards teen ><-7> +< rigolotes rigolottes kiss ><-7> +< corse location ><-7> +< description content silicon ><-7> +< visita ><-7> +< collection maillot de ><-7> +< frises ><-7> +< ontmoetingen spannend eenzaam ><-7> +< links youth kids ><-7> +< de plage chemise ><-7> +< homestead ><-7> +< animaux sauvages ><-7> +< scanner drivers ><-7> +< description content official ><-7> +< lejaby ><-7> +< et index ><-7> +< webmaster lo ><-7> +< piercing cosmetics name ><-7> +< photographe mariage name ><-7> +< index follow nedstat ><-7> +< norme ><-7> +< top model homme ><-7> +< content clearday ><-7> +< bernhard ><-7> +< formularios board ><-7> +< comme vous ><-7> +< networks name revisit ><-7> +< lucille ball ><-7> +< author content pero ><-7> +< eels ><-7> +< models supermodels fashion ><-7> +< norme cuisine restauration ><-7> +< cartoons animation sailor ><-7> +< mode femme mode ><-7> +< zimbabwe safari ><-7> +< avl af cavalier ><-7> +< villeurbanne ><-7> +< de balades ><-7> +< 100 prenoms filles ><-7> +< photographie exposer http ><-7> +< schutzhund training ><-7> +< pubs tv tele ><-7> +< et textes ><-7> +< and stats name ><-7> +< detachees ><-7> +< by sonia ><-7> +< mods ><-7> +< graf ><-7> +< sharing and many ><-7> +< suivre ><-7> +< polls teen polls ><-7> +< ecran wallpaper ><-7> +< gram ><-7> +< popping clips how ><-7> +< faery ><-7> +< jenny agutter ><-7> +< radio name description ><-7> +< motogp ><-7> +< les compatibilites ><-7> +< porter mode ><-7> +< generator content site ><-7> +< quebec ca ><-7> +< churchill ><-7> +< regionaal contact ><-7> +< en betrouwbare antwoorden ><-7> +< network administration ><-7> +< html l comment ><-7> +< and note ><-7> +< viscose needles ><-7> +< finecam finecam ><-7> +< traditions cuisine ><-7> +< oiseaux oiseau ><-7> +< history history ><-7> +< 51 cck mcd ><-7> +< boutons ><-7> +< mp3 dvd home ><-7> +< online on ><-7> +< drole et ><-7> +< discussion boards driver ><-7> +< ca belge ><-7> +< bienvenu e ><-7> +< digital digital photography ><-7> +< de 40 ans ><-7> +< tight scalp ><-7> +< super 8 au ><-7> +< 1 powered by ><-7> +< milano shannen ><-7> +< maillot 1 ><-7> +< discussion volume critique ><-7> +< nosland name author ><-7> +< roquette la ><-7> +< topfield ><-7> +< et chambres ><-7> +< fraunhofer spacechemistry ><-7> +< schauspieler ><-7> +< serie sailor ><-7> +< services name web ><-7> +< sound card drivers ><-7> +< photos text ><-7> +< mirren ><-7> +< mini bottle ><-7> +< ses son golf ><-7> +< blagues rire rires ><-7> +< de saint ><-7> +< affixe ><-7> +< equipment police dog ><-7> +< belles webcams ><-7> +< ecrivain polar ><-7> +< moto casting dialogue ><-7> +< and watercolor ><-7> +< haplosciences ><-7> +< provence alpes maritimes ><-7> +< per aumentare gratis ><-7> +< mun name ><-7> +< velo volley ><-7> +< de discusion ><-7> +< content dandruff ><-7> +< irdeto ><-7> +< serveur content ><-7> +< host explorer ><-7> +< drivers monitor driver ><-7> +< free sms and ><-7> +< is your ><-7> +< palestine ><-7> +< creator content interip ><-7> +< discos ><-7> +< top100 org ><-7> +< aloe ><-7> +< coloris ><-7> +< est ce qui ><-7> +< grating ><-7> +< photographi boulogne photo ><-7> +< frederik ><-7> +< des services pratiques ><-7> +< sebastien name ><-7> +< d information et ><-7> +< voyages name ><-7> +< top 100 prenoms ><-7> +< description content aanmelden ><-7> +< lo strumento ><-7> +< 1400 gifs animes ><-7> +< relaties vriendschap ><-7> +< voyages warez hacking ><-7> +< insight ><-7> +< boule et fils ><-7> +< theme content autographseek ><-7> +< soiree robe ><-7> +< porno password ><-7> +< tuesday ><-7> +< sito web ><-7> +< francophone femme ><-7> +< cd singles import ><-7> +< droles rigolotes rigolottes ><-7> +< interesantes opciones ><-7> +< adventure ><-7> +< voyages et ><-7> +< ringtones nokia gratuites ><-7> +< brava costa ><-7> +< boon ><-7> +< univers bd sont ><-7> +< dermablend karite palmer ><-7> +< jeunes name ><-7> +< webdesign sets graphiques ><-7> +< mogelijkheid ><-7> +< sleep ><-7> +< find candies ><-7> +< australe ><-7> +< conception de site ><-7> +< content startseite ><-7> +< eure et ><-7> +< ftp hosting ><-7> +< sessionwall sessionwall ><-7> +< jour france ><-7> +< com name webmaster ><-7> +< webpages free ><-7> +< safaris safaris brunsperger ><-7> +< content 20010325 ><-7> +< libraire roman ecrivain ><-7> +< hpux aix linux ><-7> +< robin marque ><-7> +< de bain maillot ><-7> +< content bricolage bricolage ><-7> +< dance videos instructional ><-7> +< walsh ><-7> +< enfants mode robe ><-7> +< camarades retrouvailles recherche ><-7> +< generator content association ><-7> +< opale name ><-7> +< 1 seiko montres ><-7> +< photos de classe ><-7> +< content franquin gaston ><-7> +< content nicolas ><-7> +< st john ><-7> +< anti rigolo rigoler ><-7> +< network adapters windows ><-7> +< la source ><-7> +< 24 7 jours ><-7> +< combattant ><-7> +< alpaca ><-7> +< chat engine rocket ><-7> +< name owns ><-7> +< nylon culotte ><-7> +< chaises tapis ><-7> +< site petites ><-7> +< content fnac fnac ><-7> +< voiture d occasion ><-7> +< contact kontakt ><-7> +< du football et ><-7> +< et une section ><-7> +< pagebuilder ><-7> +< trouverez toutes ><-7> +< fond fonds ><-7> +< culturelle ><-7> +< safaris safaris ><-7> +< camarade retrouver ><-7> +< system of ><-7> +< grating spectrograph ><-7> +< des services 100 ><-7> +< livewebcam ><-7> +< bureautique webcam webcams ><-7> +< bleu liberte ><-7> +< la lune ><-7> +< dandruff dandruff ><-7> +< filmati serie ><-7> +< gavage name revisit ><-7> +< astrologie horoscope horoscope ><-7> +< symbol aristocrate ><-7> +< stellaire ><-7> +< services utiles ><-7> +< philosophy ><-7> +< net top ><-7> +< content cannes ><-7> +< les meilleures webcams ><-7> +< video jeux video ><-7> +< wet wet ><-7> +< disney studios ><-7> +< follow name document ><-7> +< avon ><-7> +< paintings dragon gifts ><-7> +< ch http equiv ><-7> +< jour plus ><-7> +< pour se ><-7> +< mio offres ><-7> +< decouvrez son nouveau ><-7> +< advertisements ><-7> +< costumes cuisine mariage ><-7> +< antipode ><-7> +< bastia ><-7> +< coloris et les ><-7> +< andre fr name ><-7> +< d des quizz ><-7> +< formes s ><-7> +< librairie libraire roman ><-7> +< art de ><-7> +< description content dies ><-7> +< original ink and ><-7> +< anthony ><-7> +< virus antivirus ><-7> +< netcam netcams ><-7> +< killyan ><-7> +< 3suisse catalogue ><-7> +< content maillot de ><-7> +< rigolotes ><-7> +< son trafic ><-7> +< signet guide gratuit ><-7> +< angers municipalite ><-7> +< host explorer vt200 ><-7> +< lu name ><-7> +< woo takeshi ><-7> +< teen polls teen ><-7> +< lyric anglais americain ><-7> +< dessinnee bd ><-7> +< your home ><-7> +< river canyon ><-7> +< proposant des ><-7> +< os x ><-7> +< heliopolis ><-7> +< spectra ><-7> +< registratiedienst name description ><-7> +< en evolution ><-7> +< silicon silicon fr ><-7> +< maritimes 06 06400 ><-7> +< content lars ><-7> +< schutzhund german ><-7> +< perte ><-7> +< de rajewicz name ><-7> +< materials manufacturer of ><-7> +< sur infobebes com ><-7> +< teen girl magazines ><-7> +< ou semi pros ><-7> +< xstart xsession rlogin ><-7> +< au canape en ><-7> +< film reviews ><-7> +< le zodiaque ><-7> +< 06580 ><-7> +< website site traffic ><-7> +< scalp hair ><-7> +< franck maquinay name ><-7> +< d actualite ><-7> +< content uni name ><-7> +< gosier ><-7> +< drole de la ><-7> +< sehr ><-7> +< noire maquillage ><-7> +< 20040621 name ><-7> +< calligraphy oriental watercolor ><-7> +< s capirelax vente ><-7> +< sud tiznit mariage ><-7> +< magasins de ><-7> +< des ressources ><-7> +< magasin fnac ><-7> +< publisher 2000 la ><-7> +< simple aventure ><-7> +< handicap prevention solidarite ><-7> +< 1 *** ><-7> +< region regionalisme tradition ><-7> +< precoce ><-7> +< for silverdragonstudio ><-7> +< and greeting card ><-7> +< chateauroux ><-7> +< diouda ethnocosmetique ><-7> +< content 79 ><-7> +< genuwine ><-7> +< montpellier ><-7> +< dragon art gallery ><-7> +< angers mairie angers ><-7> +< veloxia network name ><-7> +< lycos acheter comparer ><-7> +< jewels ><-7> +< content chanteur danyboon ><-7> +< logo design chinese ><-7> +< fabricants et l ><-7> +< culotte balconnet string ><-7> +< on 2000 10 ><-7> +< hit counters website ><-7> +< lci les et ><-7> +< interessati ><-7> +< advice teen problems ><-7> +< dvd mangas ><-7> +< enseignement environnement patriotisme ><-7> +< online postcards postcards ><-7> +< sexisme forum ><-7> +< archive printer driver ><-7> +< kureyon silk ><-7> +< pamukkale ><-7> +< incarnes ><-7> +< 1 je m ><-7> +< downloading and installing ><-7> +< cards diddl ><-7> +< hara ><-7> +< 2000 references ><-7> +< homme partenaire ><-7> +< scanning network ><-7> +< fnac livres livre ><-7> +< shirts shirts ><-7> +< gratuits forum tchat ><-7> +< devlet ><-7> +< keywords content instructional ><-7> +< horoscope mois ><-7> +< news name language ><-7> +< net humourdunet com ><-7> +< healthy ><-7> +< fraunhofer ><-7> +< calm calmer ><-7> +< fun delire droles ><-7> +< le catalogue ><-7> +< normes de securite ><-7> +< sexisme forum femme ><-7> +< cuir en345 image ><-7> +< les anges ><-7> +< dbz dbgt ><-7> +< author content randy ><-7> +< cultuel ><-7> +< format scheme ><-7> +< evenements assistance forums ><-7> +< prints by ><-7> +< la chaine ><-7> +< voitures voiture ><-7> +< teen links youth ><-7> +< spears xxx ><-7> +< france name expires ><-7> +< aime en ronde ><-7> +< o m e ><-7> +< des rencontres en ><-7> +< horoscope quotidien gratuit ><-7> +< none name language ><-7> +< lacoccinelle net ><-7> +< s house ><-7> +< the x files ><-7> +< mes passions ><-7> +< sites du web ><-7> +< 011 name microsoft ><-7> +< middle ><-7> +< di cartoni ><-7> +< expo accro ><-7> +< enigmes devinettes ><-7> +< en castellano el ><-7> +< nc name keywords ><-7> +< photographes amateurs ><-7> +< 95 windows nt ><-7> +< internet domeinnaam ><-7> +< kid mohair ><-7> +< completo ><-7> +< gratuites mobile mobiles ><-7> +< of breakdance limpbizkit ><-7> +< over de ><-7> +< concours reunion ><-7> +< collecting ><-7> +< musicales transmusicales ><-7> +< abstract content tout ><-7> +< keywords content ssilicon ><-7> +< diouda le ><-7> +< quotidiennement ><-7> +< teen shopping chatroom ><-7> +< de chansons internationales ><-7> +< bourbon ><-7> +< conseils photo name ><-7> +< fincam l3v finecam ><-7> +< credit card ><-7> +< content radius 011 ><-7> +< photographi boulogne ><-7> +< device driver cd ><-7> +< classes par themes ><-7> +< journal librairie ><-7> +< online video ><-7> +< melodies mp3 ><-7> +< catalogue poils incarnes ><-7> +< comparer shopping trouver ><-7> +< pour acheter les ><-7> +< fan fiction ><-7> +< 1800 name generatorle ><-7> +< life counter ><-7> +< magasins hard discount ><-7> +< recherches permanentes des ><-7> +< mr wiggles ><-7> +< paris le ><-7> +< coloris et ><-7> +< 1 maillot ><-7> +< steady ><-7> +< coxinelle content ><-7> +< fil a ><-7> +< tattoo images bodyart ><-7> +< hummingbird xdk ><-7> +< company and ><-7> +< arire crigoler rigole ><-7> +< ethnocosmetique black ><-7> +< bijoux costumes cuisine ><-7> +< book photos ><-7> +< mode nuisette bas ><-7> +< 996 turbo ><-7> +< ragga dancehall ><-7> +< trouverez sur ce ><-7> +< mr wiggles rock ><-7> +< klikken ><-7> +< produkt dienstleistung forschung ><-7> +< galerie communautaire permanente ><-7> +< description content it ><-7> +< author content alessio ><-7> +< marketing marketing ><-7> +< file sharing and ><-7> +< prenoms filles en ><-7> +< theorie ><-7> +< be est ><-7> +< votre magasin ><-7> +< author content societe ><-7> +< mac os x ><-7> +< futons table tables ><-7> +< hukuk ><-7> +< old fashioned ><-7> +< bhumour ><-7> +< text and periodical ><-7> +< rencontres en region ><-7> +< personalized art with ><-7> +< content one fine ><-7> +< uw e ><-7> +< rehabilitation ><-7> +< la roquette la ><-7> +< epistemon ><-7> +< pieces triangle bresilien ><-7> +< club fan club ><-7> +< grating fraunhofer spacechemistry ><-7> +< kimagure ranma ><-7> +< pain pain ><-7> +< paroles de chansons ><-7> +< with a grating ><-7> +< kr welcome to ><-7> +< tellen gratis ><-7> +< en op ><-7> +< vt200 vt220 ><-7> +< mobiel ><-7> +< euc kr welcome ><-7> +< control network abuse ><-7> +< galleries personalized ><-7> +< images photos videos ><-7> +< bicycle racing supercross ><-7> +< insulation ><-7> +< sherlock holmes ><-7> +< chute haute visibilite ><-7> +< forum debat communication ><-7> +< dat ><-7> +< ambulancier jetable ><-7> +< dochter ><-7> +< i m a ><-7> +< astrologie chinese ><-7> +< reflexion jeux de ><-7> +< content l de ><-7> +< hit counter hit ><-7> +< gb2312 name generator ><-7> +< pkk name description ><-7> +< objet de recherches ><-7> +< humour !no ><-7> +< tous les photographes ><-7> +< signes name description ><-7> +< napoulois theoule theoule ><-7> +< hacking webcam webmaster ><-7> +< et ressources pour ><-7> +< digital camera ><-7> +< site non ><-7> +< content 3d vmrl ><-7> +< kyocera finecam ><-7> +< manufacturer name revisit ><-7> +< content fre ><-7> +< regio regionaal contact ><-7> +< content t shirts ><-7> +< histoire de la ><-7> +< l3v finecam ><-7> +< fraternite ><-7> +< sets graphiques coxinelle ><-7> +< marocain maroc tradition ><-7> +< sport et bien ><-7> +< propria visibilita in ><-7> +< for over ><-7> +< informatie website bezoekers ><-7> +< bourget forum snecma ><-7> +< van gogh ><-7> +< animation club ><-7> +< region regionalisme ><-7> +< robin marque de ><-7> +< meet talk message ><-7> +< electronic postcards ><-7> +< dragon art print ><-7> +< ns 1 vz ><-7> +< nedstad netstat nedstats ><-7> +< violation encryption ><-7> +< toddlers ><-7> +< de chansons ><-7> +< gratis scambio bottoni ><-7> +< warren de rajewicz ><-7> +< la lecture ><-7> +< ideale per ><-7> +< mail pop3 ><-7> +< de 500 ><-7> +< backup drivers ><-7> +< samurai ><-7> +< napoulois ><-7> +< zodiaque les ><-7> +< television video ><-7> +< pubs tele les ><-7> +< l4v finecam ><-7> +< magnetoscope jeu ><-7> +< scalp dry scalp ><-7> +< des laboratoires et ><-7> +< comparer et ><-7> +< content bricolage ><-7> +< assurance ><-7> +< music music ><-7> +< ventilation building products ><-7> +< rap rap generation ><-7> +< ordinateurs ordinateur ><-7> +< sur fnac ><-7> +< hop asphalte ><-7> +< jeux flash flash ><-7> +< music musik ><-7> +< webdesign sets ><-7> +< tailles femmes fortes ><-7> +< continue par ><-7> +< the beat ><-7> +< content sat 28 ><-7> +< napoulois theoule ><-7> +< auribeau ><-7> +< veut des ><-7> +< bosphore ><-7> +< blitz 011 default ><-7> +< 1 jan ><-7> +< rideau ><-7> +< banner scambio banner ><-7> +< genevieve ><-7> +< inde name description ><-7> +< carnets ><-7> +< homme mannequin international ><-7> +< createur propose a ><-7> +< partiler ><-7> +< telephones portables portable ><-7> +< with an ><-7> +< control liberty ><-7> +< equipment for ><-7> +< carnavals ><-7> +< hentai images free ><-7> +< chinois horoscope quotidien ><-7> +< sport decoration informatique ><-7> +< roman ecrivain ><-7> +< ordinateurs ordinateur portable ><-7> +< caisse ><-7> +< keywords content 3suisses ><-7> +< catalogue 3 ><-7> +< avant amis ><-7> +< telephone telephones ><-7> +< traduction parole chanson ><-7> +< statistieken website ><-7> +< 2003 gmt http ><-7> +< blocking overhead unobtrusive ><-7> +< devinettes blinkies ><-7> +< generator content typo ><-7> +< black metisse ><-7> +< look a like ><-7> +< feminine janine robin ><-7> +< of warren ><-7> +< yazarlar name ><-7> +< flash 5 flash ><-7> +< graffiti graffiti ><-7> +< ni putes ni ><-7> +< moto grand prix ><-7> +< les photographes ><-7> +< nikkfurie ahmed ><-7> +< 8859 1 *** ><-7> +< designs tattoo art ><-7> +< desorganisation microcalcification http ><-7> +< dk worlds ><-7> +< title content vergleichen ><-7> +< transarchives name description ><-7> +< breakdance limpbizkit ><-7> +< 11 name microsoft ><-7> +< content gesellschaft ><-7> +< romancier ><-7> +< verkoop cgi java ><-7> +< video driver ><-7> +< unique des photos ><-7> +< dashboard ><-7> +< mauve de ><-7> +< tn3270 ><-7> +< support information ><-7> +< p1 p2 ><-7> +< fr content jefroux ><-7> +< jetable tyvek ><-7> +< informatique name ><-7> +< usados en ><-7> +< forum femme femmes ><-7> +< porno wel erotiek ><-7> +< des membres ><-7> +< fichiers telephone email ><-7> +< content focus ><-7> +< futons table ><-7> +< veel meer ><-7> +< blouson cotte ><-7> +< leading digital cameras ><-7> +< annonces vente ><-7> +< fille les ><-7> +< forward ><-7> +< boy advance ><-7> +< expression webcam ><-7> +< driver search engine ><-7> +< mandelocien ><-7> +< b2evolution ><-7> +< gallery portfolio ><-7> +< jpeg mpeg webmaster ><-7> +< les bains ><-7> +< blog com nc ><-7> +< and watercolor painting ><-7> +< blondes brune homme ><-7> +< free mp3 downloads ><-7> +< domains ><-7> +< copyright content q ><-7> +< reality tv ><-7> +< mariees et ><-7> +< alphabets breakdance ><-7> +< php scripts ><-7> +< rire rires drole ><-7> +< for lacoccinelle net ><-7> +< geen porno wel ><-7> +< portable ordinateurs ><-7> +< eenzaam dating afspreken ><-7> +< miniclip ><-7> +< martinique concours ><-7> +< network blocking overhead ><-7> +< index silicon silicon ><-7> +< fifth ><-7> +< masculin mannequin warren ><-7> +< dirt jumping ><-7> +< content official ><-7> +< randy lauderbaugh ><-7> +< ligue1 ><-7> +< services certification ><-7> +< kissable ><-7> +< com consultez ><-7> +< univers bd ><-7> +< plaques ><-7> +< almond ><-7> +< content searchengine name ><-7> +< doherty holly marie ><-7> +< opinions girls ><-7> +< prisoner ><-7> +< statistieken ><-7> +< theleme theleme epistemon ><-7> +< jeux linge ><-7> +< edition name dc ><-7> +< noall name revisit ><-7> +< expo rennes ><-7> +< bijoux bracelets horloges ><-7> +< crafts ><-7> +< municipalite angers conseil ><-7> +< guadeloupe gosier ><-7> +< horoscope chinois horoscope ><-7> +< cameras finecam s3 ><-7> +< venez vous ><-7> +< jean denis baranger ><-7> +< boards javachat ><-7> +< websevers ><-7> +< home remodeling name ><-7> +< url content toi ><-7> +< pelle ><-7> +< pratiques tarifs accreditation ><-7> +< ink dragon paintign ><-7> +< image pictures free ><-7> +< tele les ><-7> +< retraite mec diaporama ><-7> +< compatibilites les horoscopes ><-7> +< sierra ><-7> +< musique name keywords ><-7> +< pebble beach ><-7> +< lesbisch blind ><-7> +< forum debat ><-7> +< drole rigolo fun ><-7> +< courrier ><-7> +< photographie name rating ><-7> +< manufacturer vinyl windows ><-7> +< kathryn ><-7> +< cgis formularios board ><-7> +< gratuit photographie exposer ><-7> +< equipment service ><-7> +< homme club de ><-7> +< marchant name copyright ><-7> +< pictures and custom ><-7> +< hermione ><-7> +< intrusion intranet intranet ><-7> +< discount hard discount ><-7> +< site voila fr ><-7> +< windows 95 windows ><-7> +< bad boy ><-7> +< determiner le ><-7> +< name in ><-7> +< makaveli the don ><-7> +< bd bd bouquin ><-7> +< west highland white ><-7> +< sonneries pour ><-7> +< bi homo hetero ><-7> +< costumes explications etapes ><-7> +< content tf1 fr ><-7> +< comique judith ><-7> +< 100 humour !no ><-7> +< vous aidera ><-7> +< teen horoscopes teen ><-7> +< liens forums ><-7> +< lingerie janine robin ><-7> +< keywords content vetement ><-7> +< registratiedienst name revisit ><-7> +< annonces auto ><-7> +< bruges ><-7> +< photographie photographies images ><-7> +< sur infobebes ><-7> +< cassettes de ><-7> +< simplement jeremy ><-7> +< creation et vente ><-7> +< portrait nu objectif ><-7> +< sage ><-7> +< beaucoup de choses ><-7> +< girls opinions ><-7> +< especially to ><-7> +< fnac livres ><-7> +< le programme ><-7> +< marocaine ><-7> +< artiste album french ><-7> +< holland noord noord ><-7> +< content galerie d ><-7> +< never name copyright ><-7> +< football et ><-7> +< masculin beau gosse ><-7> +< metallerie ><-7> +< invitation ><-7> +< digital digital ><-7> +< ranked ><-7> +< humanitaire aide ><-7> +< drechtsteden drente eindhoven ><-7> +< arctura kinetic ><-7> +< de risque ><-7> +< or your ><-7> +< voyages voyage martinique ><-7> +< hier gratis ><-7> +< yarn name copyright ><-7> +< kontor ><-7> +< canaries ><-7> +< dragons oriental ><-7> +< infobebes com consultez ><-7> +< gratuit comique judith ><-7> +< instituteurs ><-7> +< et corpulentes larges ><-7> +< cheval poney ><-7> +< photo net ><-7> +< drivers canon ><-7> +< by com for ><-7> +< language dear ><-7> +< gratuites mobile ><-7> +< roll rock n ><-7> +< offrez vous les ><-7> +< fra ><-7> +< trellix_builder_ver content ><-7> +< windows nt windows ><-7> +< modification body piercing ><-7> +< offres emploi themes ><-7> +< act ><-7> +< gamecube ><-7> +< chinois horoscope ><-7> +< mafia ><-7> +< pci ><-7> +< keywords content fantasy ><-7> +< et bien plus ><-7> +< no abc club ><-7> +< virtuele ><-7> +< programme exe ><-7> +< parisienne je ><-7> +< coats ><-7> +< dimorphisme ><-7> +< to find candies ><-7> +< automobiles annonces ><-7> +< collectables gallereis ><-7> +< noord noord limburg ><-7> +< de securite les ><-7> +< content toi emoi ><-7> +< fnac com livres ><-7> +< robin boutique ><-7> +< perruques postiches eclaircissant ><-7> +< et village ! ><-7> +< travaux de ><-7> +< pandas ><-7> +< concerts groupes ubu ><-7> +< slip culotte balconnet ><-7> +< noro kureyon ><-7> +< de bon genie ><-7> +< www homestead com ><-7> +< delire delire ablague ><-7> +< telecommunication ><-7> +< be est un ><-7> +< redirection service ><-7> +< mariage video mariage ><-7> +< de finances ><-7> +< 1 name organization ><-7> +< censura negli anime ><-7> +< trial http equiv ><-7> +< film name revisit ><-7> +< trend ><-7> +< content b2evolution 0 ><-7> +< fun gallery ><-7> +< mahdessian name ><-7> +< dragon designs licensed ><-7> +< irc community ><-7> +< de grossesse name ><-7> +< city of ><-7> +< and periodical resources ><-7> +< scanning network blocking ><-7> +< video filmo photo ><-7> +< 91 fra1904 paris ><-7> +< emission jeu ><-7> +< birkedal avl ><-7> +< minceur ><-7> +< gazette tim marchant ><-7> +< terrasses ><-7> +< site voila ><-7> +< chili peppers ><-7> +< amis de ><-7> +< 06210 06370 ><-7> +< pas rater name ><-7> +< content 3suisses 3suisse ><-7> +< freelance name ><-7> +< cameras market leading ><-7> +< mercerized rayon ><-7> +< content zouk ><-7> +< collectables gallereis limited ><-7> +< et des news ><-7> +< look a ><-7> +< noise ><-7> +< vinyl siding pvc ><-7> +< content _top esc ><-7> +< hit counters ><-7> +< album french titre ><-7> +< a like ><-7> +< siding windows pvc ><-7> +< todo el ><-7> +< sous sous ><-7> +< au pays de ><-7> +< juvisy ><-7> +< content set ><-7> +< libre 26 ><-7> +< lecteur dvd lecteurs ><-7> +< to content andre ><-7> +< mode pages perso ><-7> +< name identifie url ><-7> +< days name googlebot ><-7> +< circonscrite ><-7> +< abraham ><-7> +< fans d ><-7> +< le dans la ><-7> +< brandebourg fan club ><-7> +< modification body ><-7> +< frontiere ><-7> +< customized web ><-7> +< photo accro ><-7> +< news! ><-7> +< lingerie marque lingerie ><-7> +< kaufen bei lycos ><-7> +< permanentes ><-7> +< no encontrado ><-7> +< network monitor ><-7> +< marbre ><-7> +< monthly magazine dedicated ><-7> +< des sketches ><-7> +< discussions name author ><-7> +< cdrom drivers ><-7> +< pour devenir ><-7> +< fr content mariage ><-7> +< warrenderajewicz com mannequin ><-7> +< content gli anime ><-7> +< music software ><-7> +< avec 130 et ><-7> +< ofertas ><-7> +< rencontres trans musicales ><-7> +< agent ><-7> +< none default index ><-7> +< pierre de la ><-7> +< keywords content set ><-7> +< sur lequel ><-7> +< parc walt ><-7> +< bd le ><-7> +< afrique australe voyages ><-7> +< luminaires name ><-7> +< tarjeta ><-7> +< spaniel labrador cairn ><-7> +< videos instructional ><-7> +< tomorrow never ><-7> +< sites d humour ><-7> +< networks name abstract ><-7> +< lauderbaugh name date ><-7> +< et liste ><-7> +< beatrice mace programmation ><-7> +< juvisy essonne 91 ><-7> +< programmes de la ><-7> +< the web s ><-7> +< get up ><-7> +< informatie website ><-7> +< la ville de ><-7> +< delire avec ><-7> +< feminine creation ><-7> +< nouvelles genre philosophie ><-7> +< luminaires name keywords ><-7> +< des agences ><-7> +< photos text and ><-7> +< training schutzhund equipment ><-7> +< charset euc jp ><-7> +< galerie gratuit photographie ><-7> +< aire libre 26 ><-7> +< true for movie ><-7> +< php reference ><-7> +< on air ><-7> +< rondes a ><-7> +< ryan people in ><-7> +< fiatavio itp ><-7> +< maquinay name description ><-7> +< laurent boutonnat ><-7> +< days karamba! welcome ><-7> +< photographie exposer ><-7> +< ring tone ><-7> +< ligne des ><-7> +< tracing ><-7> +< x name publisher ><-7> +< 5 mio offres ><-7> +< sites hebergement de ><-7> +< 2004 top ><-7> +< discount du ><-7> +< humour de blague ><-7> +< yyyymmdd content name ><-7> +< you need to ><-7> +< une gamme de ><-7> +< aus name ><-7> +< content horoscope horoscope ><-7> +< dance instructional ><-7> +< cu ><-7> +< rire arire ><-7> +< a breath of ><-7> +< censura censure ><-7> +< chauffe eau ><-7> +< link pubblicita gratis ><-7> +< sebastien name date ><-7> +< uk teen shopping ><-7> +< copyright content tim ><-7> +< content self ><-7> +< education finance ><-7> +< la moto ><-7> +< la rabade et ><-7> +< rire du delire ><-7> +< helen mirren ><-7> +< norvege ><-7> +< metatags ><-7> +< travail personnalise ><-7> +< siamois ><-7> +< il http ><-7> +< video filmo ><-7> +< d infos ><-7> +< x windows ><-7> +< calvitie ><-7> +< blinkies ><-7> +< montres sport ><-7> +< 2 2004 parc ><-7> +< texte studies ><-7> +< gratos gratis ><-7> +< lexicon ><-7> +< milliyetcilik itiraflar yazarlar ><-7> +< correspondance dark and ><-7> +< adapters sound ><-7> +< tres beau ><-7> +< 06580 06590 ><-7> +< 300 http ><-7> +< portail litteraire ><-7> +< jukebox ><-7> +< uk teenagers teens ><-7> +< rap generation ><-7> +< monde name ><-7> +< server on ><-7> +< agents ><-7> +< for fnac on ><-7> +< email and ><-7> +< cuisine restauration elageur ><-7> +< url content gavage ><-7> +< du comique ><-7> +< mejor sistema ><-7> +< opciones panel ><-7> +< paris walt ><-7> +< dandruff protection ><-7> +< cherche homme ><-7> +< fuite ><-7> +< photographe mariage photo ><-7> +< zouk love ><-7> +< content gerard mahdessian ><-7> +< auto occasion ><-7> +< photographi ><-7> +< building materials ><-7> +< bamboo ><-7> +< locales name keywords ><-7> +< bayrak mp3 resimler ><-7> +< nouveaux albums des ><-7> +< of london ><-7> +< solve ><-7> +< aeronet ><-7> +< site web du ><-7> +< criteres de ><-7> +< photos enigmes ><-7> +< yarn knitting ><-7> +< vacances location ><-7> +< magazine de la ><-7> +< album french ><-7> +< tell ><-7> +< pc jeux ><-7> +< midler ><-7> +< marque de fabricant ><-7> +< balneotherapie ><-7> +< bouwen realiseren interactieve ><-7> +< ca 1 gen ><-7> +< veel andere ><-7> +< content after days ><-7> +< s most ><-7> +< topic content appel ><-7> +< embarrassment nouveau secret ><-7> +< napoule ><-7> +< name web type ><-7> +< de kreestal ><-7> +< gratuit britney ><-7> +< fixation cascade king ><-7> +< filles prenom ><-7> +< les rencontres trans ><-7> +< company and driver ><-7> +< bouwen realiseren ><-7> +< saint jean ><-7> +< papillon pomeranian ><-7> +< racehunde cavalier king ><-7> +< uk r ne ><-7> +< super8 telecinema super ><-7> +< st pierre ><-7> +< bouquet ><-7> +< gap ><-7> +< website analyse ><-7> +< boon danyboon danny ><-7> +< painting dragons ><-7> +< aussi et ><-7> +< inform ><-7> +< tradition traditions ><-7> +< branche produkt dienstleistung ><-7> +< l actualite du ><-7> +< if you are ><-7> +< unix sunos solaris ><-7> +< resurrection of ><-7> +< portables baladeur mp3 ><-7> +< de la chaine ><-7> +< programmation liens infos ><-7> +< joan hart ><-7> +< periodical resources ><-7> +< scalp hair shampoo ><-7> +< et gerez gratuitement ><-7> +< annuaires de bon ><-7> +< history content tattoos ><-7> +< s tattoo ><-7> +< watercolor painting ><-7> +< style theories livres ><-7> +< birkedal 5927 9074 ><-7> +< dc date modified ><-7> +< arbre ><-7> +< animation sailor slayers ><-7> +< cherche homme partenaire ><-7> +< youth kids music ><-7> +< webcams humour ><-7> +< with chinese calligraphy ><-7> +< bouquin bouquins ><-7> +< counters hit counter ><-7> +< intrusion detection privacy ><-7> +< chaussure cuir en345 ><-7> +< dragon studio ><-7> +< 1 union ><-7> +< drechtsteden ><-7> +< bd au ><-7> +< description content interip ><-7> +< content kreestal 2000 ><-7> +< kitchen ><-7> +< uploading and ><-7> +< astuces conseils ><-7> +< protection firewall security ><-7> +< modial ><-7> +< rush ><-7> +< anime cartoni animati ><-7> +< php cgi ><-7> +< cd singles rare ><-7> +< content tattoos tattoo ><-7> +< del bayle ><-7> +< silicon fr ><-7> +< welke paginas bekijken ><-7> +< carrickfergus the station ><-7> +< to you ><-7> +< evolution du ><-7> +< bijoux art costumes ><-7> +< spectra solar spectral ><-7> +< images peintures ><-7> +< accro photo est ><-7> +< top 50 des ><-7> +< manufacturer vinyl siding ><-7> +< goethe ><-7> +< du catalogue ><-7> +< content are you ><-7> +< genie annuaire ><-7> +< ado jeunes ><-7> +< marx ><-7> +< censura censura ><-7> +< photos boulogne ><-7> +< gin ><-7> +< sitepromotie ><-7> +< domeinnaam name ><-7> +< vs_targetschema ><-7> +< juifs ><-7> +< aanmelden bij ><-7> +< generator content spip ><-7> +< locataire ><-7> +< les3epices com ><-7> +< date revision content ><-7> +< beginner ><-7> +< et tous ><-7> +< societe de sondages ><-7> +< and name ><-7> +< tribal body piercing ><-7> +< scheme iso8601 ><-7> +< yes http equiv ><-7> +< how you ><-7> +< marocaine gastronomie ><-7> +< url htm ><-7> +< scambio link ><-7> +< zaire ><-7> +< spectrum ><-7> +< 50cm3 ><-7> +< baranger name ><-7> +< pierre et ><-7> +< boon moins ><-7> +< encore http ><-7> +< film asiatique ><-7> +< opal iman ><-7> +< trouve des ><-7> +< 2 star ><-7> +< antisemitisme ><-7> +< silk alpaca cotton ><-7> +< 1252 name identifier ><-7> +< mon 01 ><-7> +< k9 k9 ><-7> +< content enseignement ><-7> +< jeu video jeux ><-7> +< armada ><-7> +< content little yoda ><-7> +< walt disney bienvenu ><-7> +< nasa ><-7> +< message groups ><-7> +< t online ><-7> +< productive websurfing web ><-7> +< toutes les informations ><-7> +< prelevement gadolinium ><-7> +< mentale ><-7> +< karamba! welcome to ><-7> +< contemporains ><-7> +< studio s ><-7> +< bercy ><-7> +< tourisme office ><-7> +< for accrophoto net ><-7> +< bozkurt kurt ><-7> +< etapes name keywords ><-7> +< rongeur est ><-7> +< inbellen ><-7> +< tina turner ><-7> +< des centres de ><-7> +< manufacturer name ><-7> +< postcards online postcards ><-7> +< zimbabwe safari safari ><-7> +< et fabricants ><-7> +< beautiful hair ><-7> +< windows manufacturer ><-7> +< regionalisme tradition ><-7> +< es name classification ><-7> +< mijn ><-7> +< the market ><-7> +< content diouda ethnocosmetique ><-7> +< etions 19 ><-7> +< section speciale ><-7> +< gospel ><-7> +< season ><-7> +< donegal chunky modial ><-7> +< utrecht eilanden zuid ><-7> +< content guy ><-7> +< echange respect ><-7> +< of asia ><-7> +< content 1400 ><-7> +< emoi name dc ><-7> +< robe robes maillot ><-7> +< tnt ><-7> +< lingerie feminine janine ><-7> +< page name doc ><-7> +< senologie depistage screening ><-7> +< theories livres ><-7> +< de formation ><-7> +< discount le ><-7> +< dance like genuwine ><-7> +< annonces automobile ><-7> +< www warrenderajewicz ><-7> +< la jupe ><-7> +< man vrouw sexueel ><-7> +< content lyrics ><-7> +< plus droles ><-7> +< camera web ><-7> +< training equipment dog ><-7> +< vmrl 3dimensions ><-7> +< air name keywords ><-7> +< pas du super ><-7> +< s4 fincam ><-7> +< ivoire ><-7> +< link liste ><-7> +< ink painting logo ><-7> +< photo numerique telephone ><-7> +< vinyl windows ><-7> +< jour france fr ><-7> +< mariage name ><-7> +< aydin partiler milletvekilleri ><-7> +< your business ><-7> +< contenus de ><-7> +< decembre 2004 ><-7> +< ru e ><-7> +< technique recherche sante ><-7> +< gift shop collectibles ><-7> +< content male ><-7> +< ailleurs acne ><-7> +< date modified ><-7> +< advertentierubrieken vlaanderen luik ><-7> +< lotus virtual classroom ><-7> +< souvenirs photo ><-7> +< des blagues images ><-7> +< teen magazines ><-7> +< culturelles ><-7> +< do graffiti ><-7> +< schutzhund equipment ><-7> +< rock n roll ><-7> +< netstat nedstats nedstads ><-7> +< ebusiness http equiv ><-7> +< en vechtstreek ><-7> +< chauffages ><-7> +< content forums ><-7> +< tatoo tatu tatto ><-7> +< haute visibilite ><-7> +< om marseille ><-7> +< heberge ><-7> +< site de dany ><-7> +< cards et ><-7> +< e i manga ><-7> +< super 8 ><-7> +< refresh content 900 ><-7> +< cd drivers ><-7> +< edwards ><-7> +< guadeloupe guadeloupe ><-7> +< boutonnat laurent boutonnat ><-7> +< buffy charmed ><-7> +< tchat e ><-7> +< fr les boutiques ><-7> +< key largo pebble ><-7> +< snoop logging productive ><-7> +< sport ou montres ><-7> +< telecomunication ><-7> +< twente ><-7> +< rom drivers monitor ><-7> +< l orient ><-7> +< content nosland name ><-7> +< delire droles ><-7> +< un livre ><-7> +< illustrees ><-7> +< com disney ><-7> +< rater name identifier ><-7> +< eveil ><-7> +< manufacturer of insulation ><-7> +< livewebcams ><-7> +< 2003 one ><-7> +< horoscopes chinese astrology ><-7> +< blog com ><-7> +< mariage prix ><-7> +< calligraphy panda ><-7> +< d asie ><-7> +< breaking ><-7> +< alert network filtering ><-7> +< marocain ><-7> +< content afrique ><-7> +< keywords content fnac ><-7> +< tribune citoyenne ><-7> +< panoramiques ><-7> +< sympath recherche une ><-7> +< nicolas tacquet ><-7> +< and services ><-7> +< parlement ><-7> +< leading digital ><-7> +< monument ><-7> +< citoyenne retro ><-7> +< marchant ><-7> +< une galerie communautaire ><-7> +< decouvrez le ><-7> +< a monthly magazine ><-7> +< blocco ><-7> +< maquillage pour peau ><-7> +< afrique australe ><-7> +< subject content video ><-7> +< la chaine la ><-7> +< rires drole ><-7> +< musicales transmusicales trans ><-7> +< gouda groningen haarlem ><-7> +< en vechtstreek gouda ><-7> +< brooklyn ><-7> +< mouansois auribeau ><-7> +< decembre 2004 rennes ><-7> +< scambio banner ><-7> +< fr de la ><-7> +< librairie libraire ><-7> +< tarjeta de credito ><-7> +< will make ><-7> +< fable romancier nouvelles ><-7> +< manga cartoni ><-7> +< keywords content nedstat ><-7> +< drole de ><-7> +< mp3 baladeurs mp3 ><-7> +< poules ><-7> +< actuelles festival ><-7> +< ringard ><-7> +< en 2004 sur ><-7> +< 20040621 ><-7> +< meilleurs blagues ><-7> +< explications etapes ><-7> +< pub est ici ><-7> +< fond paysage ><-7> +< tables chaise ><-7> +< kinetic ><-7> +< report surveillance sessionwall ><-7> +< sur internet les ><-7> +< soeur ou faire ><-7> +< moviegazette co uk ><-7> +< driverguide com has ><-7> +< crepus d ><-7> +< annuaire top 50 ><-7> +< de garcon les ><-7> +< et gore ><-7> +< potter harry ><-7> +< name sur ><-7> +< immagini sigle cartoons ><-7> +< aix linux xstart ><-7> +< premiere fois ><-7> +< cartoon party anime ><-7> +< apo ><-7> +< paris mode ><-7> +< gewinnspiel ><-7> +< 1 piece ><-7> +< recherche une rencontre ><-7> +< free hit counters ><-7> +< echange et de ><-7> +< annonce location de ><-7> +< didier bernard ><-7> +< review name description ><-7> +< spectrum spectroscope ><-7> +< le guide de ><-7> +< putes ni soumises ><-7> +< ying yang ><-7> +< pagina design ><-7> +< subject content art ><-7> +< page annuaire top ><-7> +< keywords content date ><-7> +< mundial ><-7> +< horoscope amour astrologie ><-7> +< evolution permanente ><-7> +< ou comment ><-7> +< incroyable umour comique ><-7> +< newsletter forum http ><-7> +< to supercross bmx ><-7> +< hudba ><-7> +< humour bhumour ><-7> +< trombinoscope copain d ><-7> +< lan analyzer ><-7> +< wallpapers discussions name ><-7> +< rongeurs sexage ><-7> +< amoureux astrologie horoscope ><-7> +< convivialite culture culturel ><-7> +< freelance name author ><-7> +< grumly ours grumly ><-7> +< pantin ><-7> +< down top tips ><-7> +< bongenie bon ><-7> +< best breakdance videos ><-7> +< grue ><-7> +< d abord anciens ><-7> +< in real ><-7> +< turboprop turbo ><-7> +< ligne mode ><-7> +< snuffel ><-7> +< popping locking poplocking ><-7> +< et metissee demande ><-7> +< content accueil name ><-7> +< studies style ><-7> +< gift shop ><-7> +< screensaver wallpaper mobiles ><-7> +< metteurs en scene ><-7> +< until ><-7> +< assouan ><-7> +< le monde name ><-7> +< gifts silver dragon ><-7> +< revistas ><-7> +< michel barbot ><-7> +< network abuse ><-7> +< jules renard ><-7> +< l annuaire et ><-7> +< jura ><-7> +< guadeloupe martinique ><-7> +< photo com r ><-7> +< pas rater ><-7> +< rowling ><-7> +< chanvre ><-7> +< 06590 ><-7> +< logiciels consommables ><-7> +< il http equiv ><-7> +< quotidien gratuit horoscope ><-7> +< animati inoltre ><-7> +< 8859 1 nouvelle ><-7> +< vacature ><-7> +< 8 video ><-7> +< photo de classe ><-7> +< rencontre essonne nature ><-7> +< gravhund miniature gravhund ><-7> +< content fr french ><-7> +< histoire conte ><-7> +< jean christophe loubet ><-7> +< magazines teen magazines ><-7> +< head shoulders ><-7> +< animati immagini sigle ><-7> +< du cannabis ><-7> +< maillots de bain ><-7> +< tattoos tattoo tattooing ><-7> +< print gallery ><-7> +< de l orient ><-7> +< com le portail ><-7> +< beauty kissable ><-7> +< useful features ><-7> +< bouquin bouquins guide ><-7> +< life in ><-7> +< equestres equestre equestre ><-7> +< plus proche de ><-7> +< freeware free ><-7> +< y arriver ><-7> +< calming ><-7> +< www les3epices com ><-7> +< conseiller ><-7> +< index certainteed manufacturer ><-7> +< driver scanner ><-7> +< flash cartoon ><-7> +< de registratiedienst name ><-7> +< meilleur name ><-7> +< name coxinelle content ><-7> +< buddy ><-7> +< ecologique ><-7> +< birkedal 5927 ><-7> +< safaris brunsperger ><-7> +< de reduction ><-7> +< welkom op de ><-7> +< 26eme ><-7> +< name copyrigth content ><-7> +< epistemon gargantua rabelais ><-7> +< acheter comparer shopping ><-7> +< bmx bmx ><-7> +< babbel database vacaturebanken ><-7> +< acteurs de ><-7> +< musica gratis ><-7> +< takeshi ><-7> +< sleeve ><-7> +< labrador cairn ><-7> +< guide net ><-7> +< tattoo interviews tattoo ><-7> +< cuisine litterature ><-7> +< tone ><-7> +< themes screensaver wallpaper ><-7> +< anne laure ><-7> +< hip hop hiphop ><-7> +< movie times ><-7> +< labrador labradors ><-7> +< general name date ><-7> +< relatiebureau ><-7> +< mouansois auribeau d ><-7> +< ordinateur appareil ><-7> +< vente plage bikini ><-7> +< tips history ><-7> +< ronde le ><-7> +< rares ><-7> +< officiel du tres ><-7> +< image gant ><-7> +< carte graphique ><-7> +< portables nokia 3210 ><-7> +< fan club de ><-7> +< keywords content danse ><-7> +< author content reynaud ><-7> +< spectrograph and objective ><-7> +< page at ><-7> +< fm carrickfergus ><-7> +< portfolio expose numeric ><-7> +< photographie galerie ><-7> +< photos mariage video ><-7> +< content e sante ><-7> +< a pitre ><-7> +< content melodysoft com ><-7> +< de sondages ><-7> +< anket ><-7> +< driver scanner drivers ><-7> +< bmx name ><-7> +< ktm ><-7> +< for new construction ><-7> +< edition numero ><-7> +< hard rock ><-7> +< recherche une ><-7> +< bracelets montres sport ><-7> +< devinettes blinkies didll ><-7> +< shepherd training ><-7> +< visita foros ><-7> +< publisher content chanteur ><-7> +< s blog ><-7> +< of a down ><-7> +< evlilik ><-7> +< desciption content du ><-7> +< vente plage ><-7> +< cappadoce ><-7> +< avant apres ><-7> +< computer pc ><-7> +< to comics ><-7> +< montres bijoux montres ><-7> +< animation club ancien ><-7> +< noire et ><-7> +< many other ><-7> +< 1 webtropia com ><-7> +< d azur riviera ><-7> +< eco ><-7> +< cranks ><-7> +< poissons ><-7> +< woo ><-7> +< natweb 1 ><-7> +< coccinelle net artiste ><-7> +< dezelfde interesses ><-7> +< gryffindor ><-7> +< 06150 ><-7> +< castle fm ><-7> +< parc expo ><-7> +< marocain traditions coutumes ><-7> +< mannequin homme ><-7> +< searchengine name ><-7> +< electrique ><-7> +< ibm lotus virtual ><-7> +< homestead com you ><-7> +< et jeux sur ><-7> +< terrier chihuahua name ><-7> +< extranjeros ><-7> +< canape en passant ><-7> +< look alikes com ><-7> +< esc weblog ><-7> +< device types the ><-7> +< au rythme de ><-7> +< 3 0 3suisses ><-7> +< completes ><-7> +< comparaison de prix ><-7> +< natweb r ><-7> +< for all device ><-7> +< 2004 www ><-7> +< tim marchant ><-7> +< 2001 e ><-7> +< feminisme anti ><-7> +< japan japanese ><-7> +< testberichte ><-7> +< theme content valejo ><-7> +< through the ><-7> +< cache name resource ><-7> +< hayat ><-7> +< timeline name ><-7> +< photographe de mode ><-7> +< pour peau noire ><-7> +< tout genre ><-7> +< cyrillique ><-7> +< content astrologie astrology ><-7> +< or your business ><-7> +< drawing drawings ><-7> +< content eric name ><-7> +< photo name keywords ><-7> +< propre annuaire sur ><-7> +< astuces de maquillage ><-7> +< turbo nfs ><-7> +< pipe ventilation ><-7> +< music sports ><-7> +< portrait lens ><-7> +< absorption lines spectrum ><-7> +< particuliers et ><-7> +< crew and ><-7> +< essai critiques ><-7> +< description content tf1 ><-7> +< noord holland noord ><-7> +< fonds d de ><-7> +< schule ><-7> +< explorer vt200 ><-7> +< schumann name rating ><-7> +< roll rock ><-7> +< goldberg ><-7> +< market leading digital ><-7> +< to build a ><-7> +< alert network ><-7> +< informatique langues cuisine ><-7> +< 06550 06810 06210 ><-7> +< modem drivers ><-7> +< leuke ><-7> +< feminins prenoms ><-7> +< acquis ><-7> +< telecinema name keywords ><-7> +< modial novita gedifra ><-7> +< normandie normandy ><-7> +< surveillance sessionwall videoconfer ><-7> +< vt200 vt220 tn3270 ><-7> +< kurt ><-7> +< trainers ><-7> +< humours blagues rire ><-7> +< tapisseries ><-7> +< bozkurt ergenekon mhp ><-7> +< server solo ><-7> +< brunsperger afrique ><-7> +< highland white terrier ><-7> +< content micrologiciel ><-7> +< text homepage ><-7> +< charles spaniel labrador ><-7> +< gallery portfolio expose ><-7> +< ch uk be ><-7> +< dvd et cassettes ><-7> +< training schutzhund german ><-7> +< opinion echange ><-7> +< rete e portare ><-7> +< photos lyrics ><-7> +< diet and ><-7> +< solaar ><-7> +< mouse drivers ><-7> +< karnak ><-7> +< moquette ><-7> +< limited edition prints ><-7> +< 2new page 1 ><-7> +< hentai hentai images ><-7> +< url content fr ><-7> +< movies download ><-7> +< site consacre ><-7> +< telephones telephone ><-7> +< fr tf1 ><-7> +< bij ons ><-7> +< btp ><-7> +< des contenus de ><-7> +< photo accro photo ><-7> +< boards javachat irc ><-7> +< 5927 9074 ><-7> +< melodie melodies melodie ><-7> +< network name robots ><-7> +< chansons internationales en ><-7> +< conseils de ><-7> +< crochet wool natural ><-7> +< sonia name keywords ><-7> +< can easily build ><-7> +< document planete diddl ><-7> +< camescope ><-7> +< d enfance camarades ><-7> +< klodcabit name ><-7> +< lingerie fine fabricant ><-7> +< debat communication opinion ><-7> +< pour mobile ><-7> +< panoramic ><-7> +< officiels name ><-7> +< home remodeling ><-7> +< black defrisage ><-7> +< catalogue 3 suisses ><-7> +< fil a tricoter ><-7> +< haplosciences name ><-7> +< mode robe ><-7> +< quotidiennement votre ><-7> +< hpux aix ><-7> +< gratuite name dc ><-7> +< jeunes jeune ><-7> +< camescopes camescope numerique ><-7> +< clothes boys ><-7> +< emoi name ><-7> +< site includes an ><-7> +< com humour blague ><-7> +< nutrition psychologie ><-7> +< ras ><-7> +< musicales 26eme ><-7> +< deux pieces triangle ><-7> +< rat ><-7> +< 3suisses 3suisse ><-7> +< 95 windows ><-7> +< copains perdus de ><-7> +< anime e i ><-7> +< expo accro photo ><-7> +< prix de ><-7> +< acheter comparer ><-7> +< ed marques ><-7> +< finance nature histoire ><-7> +< 9074 dk ><-7> +< de classe copains ><-7> +< d opale ><-7> +< hurlante name ><-7> +< knitting key ><-7> +< keywords content bongenie ><-7> +< gathering ><-7> +< hundeavl ><-7> +< recovery ><-7> +< adaptent aux ><-7> +< sonnerie sonerie ><-7> +< monstre ><-7> +< top tips calm ><-7> +< trial http ><-7> +< nederland en ><-7> +< ontmoeten ><-7> +< hompepage ><-7> +< se sentir ><-7> +< de bain et ><-7> +< micrologiciel by comuneris ><-7> +< consommables et ><-7> +< mulhouse ><-7> +< enfance top 100 ><-7> +< avertis ><-7> +< du le ><-7> +< prix de lancement ><-7> +< astrology chinese chinoise ><-7> +< service dog equipment ><-7> +< o u ><-7> +< politique technique recherche ><-7> +< drie ><-7> +< tight scalp scalp ><-7> +< tutto sulla censura ><-7> +< 1400 gifs ><-7> +< o o ><-7> +< o n ><-7> +< de cannes et ><-7> +< wiggles rock ><-7> +< teenagers embarrassment ><-7> +< couple pour ><-7> +< vogue aran ><-7> +< o i ><-7> +< sur lequel on ><-7> +< garden stahl regia ><-7> +< pays casablanca marrakech ><-7> +< louis ferdinand ><-7> +< complete with photos ><-7> +< effectief chat babbel ><-7> +< bancaires ><-7> +< poils incarnes ethnique ><-7> +< dorothy ><-7> +< insulation roofing ><-7> +< compatibilites les ><-7> +< content aeronet ><-7> +< created at www ><-7> +< des bonnes affaires ><-7> +< asiatique new year ><-7> +< loterie gallerie portfolio ><-7> +< resim yazarlar name ><-7> +< net name category ><-7> +< loterie gallerie ><-7> +< costumes cuisine ><-7> +< centres de vacances ><-7> +< cuisine bijoux art ><-7> +< region annuaire ><-7> +< i webmaster lo ><-7> +< paintign ><-7> +< bookmark ><-7> +< computer software ><-7> +< subject content comment ><-7> +< gif delire ><-7> +< gallerie portfolio exposer ><-7> +< ebusiness name abstract ><-7> +< wholesale artwork personalized ><-7> +< aydin partiler ><-7> +< content beaucoup de ><-7> +< music hit ><-7> +< mutluluk ><-7> +< 1 fernando ><-7> +< galerie virtuelle ><-7> +< et bien rubriques ><-7> +< gratuitos melodysoft ><-7> +< albums des dossiers ><-7> +< keywords content automobile ><-7> +< rigolottes kiss ><-7> +< hommage franquin etc ><-7> +< mini bottle refresh ><-7> +< description content labrador ><-7> +< gabba ><-7> +< webchat message boards ><-7> +< textil ><-7> +< respect valeur ><-7> +< cordelia ><-7> +< academy star academy ><-7> +< traffic analysis ><-7> +< author content little ><-7> +< immagini sigle filmati ><-7> +< ch blondes brune ><-7> +< webmaster argent ><-7> +< soutiens gorges bas ><-7> +< 26 ans 26eme ><-7> +< applicaties ><-7> +< content ipr name ><-7> +< tracking tracing ><-7> +< phentermine ><-7> +< lazer ><-7> +< lotus virtual ><-7> +< content echange ><-7> +< acheter les ><-7> +< lines spectrum ><-7> +< my heart ><-7> +< terrorism ><-7> +< guitare guitar ><-7> +< animati giapponesi ><-7> +< live news ><-7> +< sketches et ><-7> +< les verts ><-7> +< galleries personalized dragon ><-7> +< pipe decking railing ><-7> +< traffic com ><-7> +< over blog ><-7> +< do graffiti graffiti ><-7> +< true for surf ><-7> +< videos filmati ><-7> +< nuisette bas ><-7> +< clase ><-7> +< shoes paradise ><-7> +< garonne ><-7> +< luik brussel antwerpen ><-7> +< et services certification ><-7> +< tv real ><-7> +< girls are ><-7> +< content pablo picasso ><-7> +< chat babbel box ><-7> +< modem drivers sound ><-7> +< fil tricoter ><-7> +< riverain religion ><-7> +< afils name ><-7> +< liseurs debat ><-7> +< de bureau ><-7> +< l espace professionnel ><-7> +< botswana zambie ><-7> +< albums des ><-7> +< jean christophe ><-7> +< osama bin ><-7> +< magazine dedicated ><-7> +< bryant ><-7> +< fucked up ><-7> +< d avant ><-7> +< content andre brunsperger ><-7> +< audiovisuel ><-7> +< essonne 91 ><-7> +< may 2005 ><-7> +< passant par ordinateur ><-7> +< 7 2 ><-7> +< subject content test ><-7> +< rigolotes rigolottes ><-7> +< lycos acheter ><-7> +< rapportages website bezoekers ><-7> +< movies streaming ><-7> +< a travers l ><-7> +< montauban ><-7> +< french francais ><-7> +< astrology dragons ><-7> +< edition prints asian ><-7> +< shepherd training name ><-7> +< een van onze ><-7> +< trombinoscope copain ><-7> +< feinte image jpg ><-7> +< in your mind ><-7> +< puma ><-7> +< ancien combattant bel ><-7> +< content all tattoos ><-7> +< logiciels petites ><-7> +< piston ><-7> +< downtown ><-7> +< visagie ><-7> +< bauer ><-7> +< www zexe de ><-7> +< supplies dragon gifts ><-7> +< lars schumann http ><-7> +< in disguise ><-7> +< 20010325 name ><-7> +< les chatteries ><-7> +< jezus ><-7> +< jeux jeu ><-7> +< resurrection of evil ><-7> +< portables baladeur ><-7> +< webcam webcams informatique ><-7> +< tilburg twente utrecht ><-7> +< play games ><-7> +< le concept ><-7> +< to know about ><-7> +< drivers mouse driver ><-7> +< chinois 2003 ><-7> +< pelotes ><-7> +< teentoday ><-7> +< chute haute ><-7> +< feinte video ><-7> +< solo gateway ><-7> +< equipe de ><-7> +< pebble ><-7> +< ille ><-7> +< box channel ><-7> +< l internet name ><-7> +< consommables ><-7> +< basic teller ><-7> +< natural fiber silk ><-7> +< gavage name distribution ><-7> +< on 2000 ><-7> +< eddie ><-7> +< critiques lecture ><-7> +< creation content 2003 ><-7> +< 01 04 name ><-7> +< 50 des sites ><-7> +< band website ><-7> +< schutzhund equipment schutzhund ><-7> +< festival international ><-7> +< crigoler ><-7> +< mohair ><-7> +< int ><-7> +< ins ><-7> +< numero 26 ><-7> +< marocaine gastronomie bijoux ><-7> +< de loisirs dysneyland ><-7> +< logiciels petites annonces ><-7> +< ! annuaire des ><-7> +< webcams du ><-7> +< kyocera cameras market ><-7> +< in our online ><-7> +< 06810 06210 ><-7> +< fuel ><-7> +< webmaster creation ><-7> +< argentique 24x36 portrait ><-7> +< keywords content duydunuzmu ><-7> +< images wallpapers ><-7> +< gratuit horoscope chinois ><-7> +< eindhoven flevoland friesland ><-7> +< adapters sound card ><-7> +< spirituel ><-7> +< photographe mariage photographe ><-7> +< organisaties ><-7> +< et tres sexy ><-7> +< anime anime ><-7> +< homepage name description ><-7> +< rennes rouen ><-7> +< protection network protection ><-7> +< lci ><-7> +< ringtone gratuite ><-7> +< photo est une ><-7> +< simple web page ><-7> +< a l autre ><-7> +< angers conseil mun ><-7> +< le site pour ><-7> +< description content entrez ><-7> +< l entre ><-7> +< jean chaussures ><-7> +< author content frederik ><-7> +< betrouwbare antwoorden ><-7> +< dailmer fiatavio itp ><-7> +< dansk svensk ><-7> +< specifications ><-7> +< travailleurs ><-7> +< metissee demande ><-7> +< programma verkoop chat ><-7> +< review jeux video ><-7> +< equestres cheval ><-7> +< kids young ><-7> +< content bmx bmx ><-7> +< 06210 ><-7> +< typo 3 3 ><-7> +< actresses actors ><-7> +< viscose ><-7> +< s not ><-7> +< denis baranger name ><-7> +< design chinese zodiac ><-7> +< transfert super ><-7> +< americains ><-7> +< vacaturebanken advertentierubrieken adverteren ><-7> +< cole luxury ><-7> +< cincroyable ><-7> +< 01 07 http ><-7> +< abecedaire ><-7> +< sonnerie sonerie ringtone ><-7> +< sud namibie botswana ><-7> +< chunky modial ><-7> +< maker ><-7> +< web cameras ><-7> +< rideau rideaux ><-7> +< montres bracelets montres ><-7> +< castellano el mejor ><-7> +< commercieel ><-7> +< teen horoscopes ><-7> +< complicated ><-7> +< coxinelle ><-7> +< nuisette bas collant ><-7> +< et de lci ><-7> +< expo exposition agenda ><-7> +< ame soeur ou ><-7> +< name name ><-7> +< objet de ><-7> +< winnie ><-7> +< future maman ><-7> +< k9 police schutzhund ><-7> +< cooper ><-7> +< filmographies ><-7> +< husqvarna ><-7> +< sistema de ><-7> +< mri prelevement gadolinium ><-7> +< guadeloupe guyane ><-7> +< author content angers ><-7> +< disques durs ><-7> +< 0 11 ><-7> +< wtc ><-7> +< ranma name ><-7> +< dragon chinese ><-7> +< cole luxury kid ><-7> +< jackson how to ><-7> +< pension ><-7> +< de maillot de ><-7> +< chevaux chevaux ><-7> +< poids ><-7> +< beau et tres ><-7> +< photos mariage ><-7> +< camarades de ><-7> +< 1 name expires ><-7> +< reklam ><-7> +< gmt bienvenue ><-7> +< content literature ><-7> +< kunt u uw ><-7> +< couples homme ><-7> +< count counters and ><-7> +< ordinateur appareil photo ><-7> +< gratuit asp ><-7> +< 300 http equiv ><-7> +< tf1 le site ><-7> +< rayon viscose ><-7> +< fries ><-7> +< opale ><-7> +< numericable fr r ><-7> +< saint nazaire ><-7> +< 0 name trellix_open_site_command ><-7> +< webmaster name author ><-7> +< productive ><-7> +< album warner tracklist ><-7> +< les3epices com name ><-7> +< texto textos ><-7> +< connaissance exigence ><-7> +< 2003 name author ><-7> +< fonds ecran fond ><-7> +< viamichelin ><-7> +< 06550 06810 ><-7> +< xsession rlogin ><-7> +< ni putes ><-7> +< femmes fortes et ><-7> +< interesantes opciones panel ><-7> +< les huiles ><-7> +< suisses femme ><-7> +< haarlem leidse ><-7> +< mode pages ><-7> +< piercing tribal tattoo ><-7> +< americain musique coccinelle ><-7> +< pareo robe de ><-7> +< psychologiques ><-7> +< webagency ><-7> +< entre deux ><-7> +< cs http equiv ><-7> +< equestres equestre ><-7> +< hundeannoncer annoncer kennel ><-7> +< appartement logement ><-7> +< dermablend karite ><-7> +< gallery expo ><-7> +< panda art ><-7> +< content blitz ><-7> +< de ch ><-7> +< culturels ><-7> +< sites bouwen realiseren ><-7> +< musicales 2 2004 ><-7> +< preferite di cartoni ><-7> +< monde magique ><-7> +< content autographseek 011 ><-7> +< metteurs en ><-7> +< gratuit gratis gratos ><-7> +< telephones portables nokia ><-7> +< need to know ><-7> +< caron ><-7> +< gratis nedstat ><-7> +< photo le web ><-7> +< locoshop ><-7> +< flash 6 ammin ><-7> +< femme femmes feminismes ><-7> +< flevoland friesland gooi ><-7> +< animes anime gif ><-7> +< garde d ><-7> +< dessinees bd ><-7> +< l ebusiness ><-7> +< name serveur ><-7> +< casablanca marrakech ><-7> +< internet computer ><-7> +< rivierenland tilburg twente ><-7> +< lapin cochon inde ><-7> +< includes an easy ><-7> +< content traduction ><-7> +< beaute black metisse ><-7> +< natweb r server ><-7> +< uk tribal body ><-7> +< iode contraste opacite ><-7> +< gratuites sonnerie ><-7> +< news on ><-7> +< numerique appareil ><-7> +< table tables ><-7> +< site dans ><-7> +< geldverdienen ><-7> +< manufacturer vinyl ><-7> +< boutique creation et ><-7> +< forum explications etapes ><-7> +< id content ><-7> +< drivers scsi ><-7> +< libros de visita ><-7> +< cd singles ><-7> +< nedstat geeft ><-7> +< 51 cck ><-7> +< keywords content internet ><-7> +< montres hommes femmes ><-7> +< chats chat ><-7> +< zodiaque zodiac asian ><-7> +< probeer een ><-7> +< methodos ><-7> +< author content blague ><-7> +< 24x36 portrait nu ><-7> +< author content okacha ><-7> +< debate name author ><-7> +< pays de titi ><-7> +< www homestead ><-7> +< tu ordenador en ><-7> +< boulogne http ><-7> +< grossesse grossesse ><-7> +< 1 nouvelle panda ><-7> +< kyocera finecam leaders ><-7> +< lsf langue ><-7> +< molinel delta ><-7> +< maire ><-7> +< fille les en ><-7> +< passionnes et ><-7> +< heel veel ><-7> +< veste pantalon ><-7> +< erwin ><-7> +< pointe ><-7> +< p2 p3 ><-7> +< plus courants ><-7> +< ontmoeten ontmoetingen ><-7> +< drivers cd rom ><-7> +< snuffel rubrieken gratis ><-7> +< content charset us ><-7> +< vie des ><-7> +< counter hit counters ><-7> +< bain et ><-7> +< ne pas rater ><-7> +< 1 pc ><-7> +< 2 2004 ><-7> +< antilles zouk ><-7> +< analysis network alert ><-7> +< le meilleur de ><-7> +< artist artists ><-7> +< paris http equiv ><-7> +< 01 04 ><-7> +< galeries des ><-7> +< rivierenland ><-7> +< drivers driver archive ><-7> +< animation humour ><-7> +< calf ><-7> +< tshirts ><-7> +< photos cheval chevaux ><-7> +< australe voyages ><-7> +< photos fonds ><-7> +< transmusicales ><-7> +< le collectif ><-7> +< rabade ><-7> +< enfance top ><-7> +< calm ><-7> +< tips calm calmer ><-7> +< url redirection ><-7> +< uw websitebezoek ><-7> +< veloxia network s ><-7> +< finecam digital ><-7> +< organic root ><-7> +< 75017 name ><-7> +< windows vinyl ><-7> +< maire angers ><-7> +< online dog ><-7> +< casting dialogue ><-7> +< guadeloupe location ><-7> +< palmer s capirelax ><-7> +< featuring the ><-7> +< toolkit ><-7> +< paulo ><-7> +< content pero ><-7> +< produits ed marques ><-7> +< kitano ><-7> +< warner tracklist rap ><-7> +< sexy top model ><-7> +< pegomas ><-7> +< arctura ><-7> +< content featuring ><-7> +< applicaties programma ><-7> +< follow lycos shopping ><-7> +< sexe des anges ><-7> +< rap generation underground ><-7> +< cleveland ><-7> +< histoires betisier ><-7> +< the band ><-7> +< 1 bi ru ><-7> +< conseil mun name ><-7> +< les dvd et ><-7> +< etui ><-7> +< determiner le sexe ><-7> +< visite de ><-7> +< beauty care ><-7> +< dvd pull pantalon ><-7> +< hundekennel hundeannoncer annoncer ><-7> +< content methodos ><-7> +< roquette la napoule ><-7> +< sex vrouwen ><-7> +< nc blog name ><-7> +< content test de ><-7> +< interactief toepassingen applicaties ><-7> +< ruban bleu ><-7> +< creez et gerez ><-7> +< racehunde cavalier ><-7> +< proust ><-7> +< month name robots ><-7> +< content transformers ><-7> +< delicat grace ><-7> +< gazette co uk ><-7> +< ordinateur portable ordinateurs ><-7> +< shopping sports voyages ><-7> +< for numericable fr ><-7> +< region content ><-7> +< slips sport sports ><-7> +< patriotisme ><-7> +< of david ><-7> +< nearly ><-7> +< chers! ><-7> +< emploi themes ><-7> +< atteinte ><-7> +< videoconfer ><-7> +< reply content ><-7> +< theoule theoule theoulien ><-7> +< content instructional ><-7> +< bb ><-7> +< author content murgo ><-7> +< scambio advert power ><-7> +< d occasion ou ><-7> +< movie gazette ><-7> +< certainteed building materials ><-7> +< aways free sms ><-7> +< watercolor ink painting ><-7> +< reserved name generator ><-7> +< spectroscopy with ><-7> +< classroom ><-7> +< copyright content http ><-7> +< video toute une ><-7> +< greeting card with ><-7> +< the don ><-7> +< hommes montres ><-7> +< schumann name dc ><-7> +< exposition calendar ><-7> +< bien rubriques ><-7> +< de brandebourg ><-7> +< musculation ordinateur ordinateurs ><-7> +< pillou name expires ><-7> +< gratuitas ><-7> +< highland white ><-7> +< sante publique ><-7> +< flea ><-7> +< true for numericable ><-7> +< fag ><-7> +< a pas du ><-7> +< web portal ><-7> +< tracking equipment dog ><-7> +< surf traffic com ><-7> +< custom designs ><-7> +< danyboon name ><-7> +< limpbizkit rollin video ><-7> +< gratuites sonnerie sonerie ><-7> +< zodiaque zodiac ><-7> +< sock ><-7> +< siding pvc ><-7> +< sur le rallye ><-7> +< 2pac makaveli ><-7> +< chaise ><-7> +< un hommage ><-7> +< content travel ><-7> +< king cole ><-7> +< disneyland parc a ><-7> +< dodge ><-7> +< sa region annuaire ><-7> +< 107 2new ><-7> +< content location ><-7> +< shoulders itchy ><-7> +< mariage marocain maroc ><-7> +< follow index certainteed ><-7> +< fr amazon bienvenue ><-7> +< tribune citoyenne retro ><-7> +< cannet cannettan ><-7> +< pipe ventilation composite ><-7> +< sebastien name dc ><-7> +< crew popping ><-7> +< werkstuk ><-7> +< lanka ><-7> +< du delire ><-7> +< bain lingerie feminine ><-7> +< gallery nature ><-7> +< care beauty kissable ><-7> +< could ><-7> +< france maghreb ><-7> +< ubu antipode liberte ><-7> +< content franquin ><-7> +< fab ><-7> +< mayo ><-7> +< lens film ><-7> +< ccd stellar and ><-7> +< your mind design ><-7> +< univers du comique ><-7> +< salli ><-7> +< societe jeux ><-7> +< content buffy ><-7> +< 2003 horoscope chinois ><-7> +< content une de ><-7> +< concours prix ><-7> +< humaines ><-7> +< castle fm carrickfergus ><-7> +< monitor drivers ><-7> +< durs ><-7> +< bain lingerie ><-7> +< canon printer ><-7> +< echange respect valeur ><-7> +< game online ><-7> +< noble sex ><-7> +< tapis lit ><-7> +< content toi ><-7> +< copyright content lars ><-7> +< personnalises astuces de ><-7> +< de photographies de ><-7> +< topic content gesellschaft ><-7> +< ce site unique ><-7> +< opacite stellaire ><-7> +< musique musical patrimoine ><-7> +< mace programmation ><-7> +< inscription guide ><-7> +< pegomas la ><-7> +< genre pour ><-7> +< friesland gooi en ><-7> +< 1 l 0 ><-7> +< antipode liberte ><-7> +< aprilia ><-7> +< sito web numerosi ><-7> +< villas ><-7> +< religion culte ><-7> +< traite ><-7> +< the station ><-7> +< nicaragua ><-7> +< 06370 06580 06590 ><-7> +< like michael jackson ><-7> +< jeu jeux gratuit ><-7> +< espace professionnelbienvenue dans ><-7> +< l entreprise soigne ><-7> +< analyse website tracking ><-7> +< url content rencontres ><-7> +< fencing and ><-7> +< wallon ><-7> +< chinois zodiaque zodiac ><-7> +< youssouf ><-7> +< le zodiaque les ><-7> +< bain maillot ><-7> +< montaigne ><-7> +< exercices de ><-7> +< schutzhund supply ><-7> +< gastronomie bijoux ><-7> +< games chat ><-7> +< chevaux name ><-7> +< name trellix_builder_ver content ><-7> +< calm down calming ><-7> +< casting dialogue encheres ><-7> +< spectrograph ><-7> +< novels ><-7> +< kurt insan pkk ><-7> +< education name ><-7> +< innovation seiko ><-7> +< bad boy good ><-7> +< prix promotions trucs ><-7> +< discusion debate ><-7> +< content zonhumour ><-7> +< brunsperger voyage ><-7> +< worlds dk ><-7> +< hoeveel ><-7> +< free sms ><-7> +< fresh air name ><-7> +< webcams informatique ><-7> +< association nationale de ><-7> +< gore comique gags ><-7> +< copyright content lycos ><-7> +< mariage video ><-7> +< chihuahua hundeavl ><-7> +< de voyages aventures ><-7> +< bracelets ><-7> +< solidarite sport velo ><-7> +< venise ><-7> +< chiennes de garde ><-7> +< common ><-7> +< 98 detection ><-7> +< de maupassant ><-7> +< horoscope by sonia ><-7> +< afils name robots ><-7> +< critiques lecture lire ><-7> +< en direct cam ><-7> +< citoyen ><-7> +< muziek film ><-7> +< dvd movies videos ><-7> +< kaufen einkaufen ><-7> +< quebec ca belge ><-7> +< bricoleurs ><-7> +< sport decoration ><-7> +< acheter les dvd ><-7> +< galerie expo exposition ><-7> +< nature rencontre paris ><-7> +< web counter free ><-7> +< milliyetcilik ><-7> +< portsmouth ><-7> +< sms and ><-7> +< with an objective ><-7> +< contraste ><-7> +< art contemporain ><-7> +< foro no ><-7> +< au dv ><-7> +< 4 decembre 2004 ><-7> +< police equipment k9 ><-7> +< radio name ><-7> +< literature name ><-7> +< traductions paroles chansons ><-7> +< pere lachaise ><-7> +< construction de ><-7> +< perso shopping sports ><-7> +< beagle gravhund miniature ><-7> +< ours grumly ><-7> +< fotomodel modelfotografie ><-7> +< 1997 gmt ><-7> +< genie creez ><-7> +< dvd televiseur ><-7> +< affiliation webmaster ><-7> +< aventure jeux ><-7> +< snecma ><-7> +< de la beaute ><-7> +< jartelle body soutien ><-7> +< content are ><-7> +< actualisateur ><-7> +< sulla censura negli ><-7> +< club de top ><-7> +< tribal body ><-7> +< copyright 2000 kennel ><-7> +< 0 net ><-7> +< a calmer life ><-7> +< mun name robots ><-7> +< search engine manufacturer ><-7> +< colloque ruban ><-7> +< magazin name ><-7> +< solaris hpux ><-7> +< hurricane ><-7> +< lu http equiv ><-7> +< gallery fantasy ><-7> +< a la gloire ><-7> +< the station for ><-7> +< virus protection ><-7> +< des news ainsi ><-7> +< name refresh content ><-7> +< content laurent name ><-7> +< blocco note di ><-7> +< asphalte hurlante hi ><-7> +< for geocities r ><-7> +< west highland ><-7> +< driver uploading and ><-7> +< gedicht ><-7> +< mouans sartoux ><-7> +< content sonneries gratuites ><-7> +< goldenmarket all rights ><-7> +< slip slips sport ><-7> +< granger liseurs ><-7> +< jupe au ><-7> +< dessinee bandes bande ><-7> +< jean chaussures lingerie ><-7> +< global name cache ><-7> +< telephone dvd ><-7> +< of darkness ><-7> +< musique coccinelle ><-7> +< d a ><-7> +< fr name contactcity ><-7> +< a new york ><-7> +< vendee ><-7> +< fr com ><-7> +< mon 01 jan ><-7> +< cinema home lecteur ><-7> +< publicite pubs tv ><-7> +< domeinnaam registeren ><-7> +< epinette ><-7> +< are you ><-7> +< content echange de ><-7> +< la bande univers ><-7> +< demoussage ><-7> +< sellers journal ><-7> +< drivers scsi adapters ><-7> +< xstart ><-7> +< analysis name ><-7> +< televiseurs tv magnetoscope ><-7> +< text charset windows ><-7> +< zonhumour com name ><-7> +< de recherche pour ><-7> +< belgie vlaanderen chat ><-7> +< crigoler rigole programme ><-7> +< 2004 parc ><-7> +< accueil loisirs ><-7> +< tabs ><-7> +< forum snecma dailmer ><-7> +< ve got ><-7> +< t online de ><-7> +< conte enfants ><-7> +< gedifra pattern ><-7> +< itiraflar yazarlar ><-7> +< de registratiedienst ><-7> +< u uw ><-7> +< calmer life top ><-7> +< hetero live ><-7> +< grumly peluche ><-7> +< paru ><-7> +< insulation manufacturer ><-7> +< community teen horoscopes ><-7> +< rajewicz official ><-7> +< tour guide ><-7> +< theoulien ><-7> +< judith godreche achat ><-7> +< link pubblicita ><-7> +< soneries ringtones nokia ><-7> +< mec diaporama ><-7> +< television drole ><-7> +< les tissus ><-7> +< description content fantasy ><-7> +< l4v finecam s5 ><-7> +< chars ><-7> +< oriental dragons chinese ><-7> +< review review ><-7> +< free animated jpeg ><-7> +< en region parisienne ><-7> +< page count counters ><-7> +< geen sex geen ><-7> +< web internet ><-7> +< cb 1 ><-7> +< recherche et ><-7> +< posters ><-7> +< subject content portail ><-7> +< sms fax ><-7> +< domain ><-7> +< official website ><-7> +< de sites gratuits ><-7> +< agenda ><-7> +< annuaire moteur recherche ><-7> +< et annuaire ><-7> +< domeinnaam ><-7> +< web links ><-7> +< loto ><-7> +< de recherche et ><-7> +< target content _top ><-7> +< window target ><-7> +< window target content ><-7> +< pays ><-7> +< l 0 ><-7> +< 1 lz ><-6> +< nt ><-6> +< r nz 1 ><-6> +< famille ><-6> +< nz 1 vz ><-6> +< source ><-6> +< toute ><-6> +< produits ><-6> +< fan site ><-6> +< cable ><-6> +< need ><-6> +< news name ><-6> +< 1 vk ><-6> +< report ><-6> +< l univers ><-6> +< 1 vk 1 ><-6> +< ip ><-6> +< vk 1 ><-6> +< co uk ><-6> +< cheveux ><-6> +< racing ><-6> +< repertoire ><-6> +< kinderen ><-6> +< lang en content ><-6> +< l annuaire ><-6> +< adsl ><-6> +< telephone portable ><-6> +< back ><-6> +< chambre ><-6> +< harry potter ><-6> +< echange de ><-6> +< around the ><-6> +< source for ><-6> +< nouveaux ><-6> +< photoshop ><-6> +< 05 ><-6> +< designs ><-6> +< lang en ><-6> +< medicale ><-6> +< 10 http equiv ><-6> +< hand ><-6> +< sur ce site ><-6> +< 2 weeks ><-6> +< jeans ><-6> +< more than ><-6> +< keywords name ><-6> +< vk ><-6> +< dr ><-6> +< content 2 weeks ><-6> +< suisses ><-6> +< postcards ><-6> +< jeux gratuits ><-6> +< demo ><-6> +< graphique ><-6> +< festivals ><-6> +< 10 http ><-6> +< content un site ><-6> +< animaux ><-6> +< no cache http ><-6> +< last ><-6> +< guide name ><-6> +< rechercher ><-6> +< fiction ><-6> +< tele ><-6> +< musik ><-6> +< lettre ><-6> +< description content un ><-6> +< dedicated ><-6> +< 0 l 0 ><-6> +< festival ><-6> +< logo ><-6> +< centre ><-6> +< commerce ><-6> +< test ><-6> +< l r ><-6> +< adresse ><-6> +< professionnels ><-6> +< classement ><-6> +< c 2002 by ><-6> +< car ><-6> +< bon ><-6> +< content english name ><-6> +< dc rights content ><-6> +< cache http equiv ><-6> +< cache http ><-6> +< telephonie ><-6> +< around ><-6> +< emploi telechargement ><-6> +< freeware shareware rencontres ><-6> +< mp3 photos gifs ><-6> +< webmasters freeware ><-6> +< musique webcam ><-6> +< general portail annuaire ><-6> +< et annuaire de ><-6> +< sites gratuits mp3 ><-6> +< sexe images jeux ><-6> +< emploi telechargement musique ><-6> +< construction ><-6> +< moteur recherche search ><-6> +< gratuits photos mp3 ><-6> +< portail annuaire moteur ><-6> +< cliparts sms fax ><-6> +< photos gifs sexe ><-6> +< email cliparts sms ><-6> +< sms webmasters freeware ><-6> +< telechargement musique webcam ><-6> +< mp3 photos ><-6> +< fax photo gratuits ><-6> +< musique webcam name ><-6> +< bons ><-6> +< rencontres email ><-6> +< general portail ><-6> +< shareware rencontres ><-6> +< cliparts sms ><-6> +< afrique ><-6> +< telechargement musique ><-6> +< securite ><-6> +< webmasters freeware shareware ><-6> +< cb 1 rsac ><-6> +< sms fax photo ><-6> +< air ><-6> +< guide name copyright ><-6> +< general name coverage ><-6> +< 1 month name ><-6> +< gratuits mp3 photos ><-6> +< photo gratuits photos ><-6> +< dog ><-6> +< gratuits mp3 ><-6> +< email cliparts ><-6> +< 30 name ><-6> +< interviews ><-6> +< rencontres email cliparts ><-6> +< content general portail ><-6> +< george ><-6> +< gifs sexe images ><-6> +< shareware rencontres email ><-6> +< training ><-6> +< worldwide name creation_date ><-6> +< gifs sexe ><-6> +< recherche et annuaire ><-6> +< parole ><-6> +< video emploi telechargement ><-6> +< photos gifs ><-6> +< content portail annuaire ><-6> +< sms webmasters ><-6> +< webcam name subject ><-6> +< exposition ><-6> +< counter ><-6> +< dec ><-6> +< 06 ><-6> +< site du ><-6> +< engine name robots ><-6> +< fax photo ><-6> +< engine name classification ><-6> +< jeux sms webmasters ><-6> +< internet name owner ><-6> +< jean ><-6> +< dc identifier content ><-6> +< tiger ><-6> +< demande de ><-6> +< kunnen ><-6> +< joe ><-6> +< console ><-6> +< qui est ><-6> +< fr copyright ><-6> +< 5 u name ><-6> +< keywords content moteur ><-6> +< motorcycle ><-6> +< op het internet ><-6> +< content name language ><-6> +< citation ><-6> +< pain name ><-6> +< resume ><-6> +< races ><-6> +< sejour ><-6> +< loss ><-6> +< french name robots ><-6> +< xbox ><-6> +< prestige ><-6> +< com live ><-6> +< site a ><-6> +< en name dc ><-6> +< mamans ><-6> +< cs ><-6> +< pub pubs ><-6> +< recherche name ><-6> +< dvd et ><-6> +< com de ><-6> +< tutorial ><-6> +< revision ddmmyyyy content ><-6> +< marrer ><-6> +< diet ><-6> +< 2 8 ><-6> +< content text name ><-6> +< revisit after name ><-6> +< hobbies ><-6> +< collection de ><-6> +< roger ><-6> +< last modified content ><-6> +< sms name ><-6> +< pack ><-6> +< contes ><-6> +< quartier ><-6> +< cheval chevaux ><-6> +< demos ><-6> +< against ><-6> +< mars ><-6> +< generaliste ><-6> +< content le portail ><-6> +< datecreated content ><-6> +< tous les sites ><-6> +< keywords content black ><-6> +< critique ><-6> +< systeme ><-6> +< experts ><-6> +< mary ><-6> +< summer ><-6> +< name webmaster ><-6> +< last modified ><-6> +< breath ><-6> +< philips ><-6> +< revisit content 14 ><-6> +< website of ><-6> +< classique ><-6> +< f1 ><-6> +< supercross ><-6> +< retro ><-6> +< tiscali ><-6> +< evil ><-6> +< video games ><-6> +< par les ><-6> +< your source for ><-6> +< content musique ><-6> +< docteur ><-6> +< build a ><-6> +< rental ><-6> +< content france france ><-6> +< browser ><-6> +< tanto ><-6> +< sexisme ><-6> +< content 3d ><-6> +< handel ><-6> +< prises ><-6> +< et aux ><-6> +< tourism ><-6> +< com on ><-6> +< ska ><-6> +< usher ><-6> +< lang de content ><-6> +< stand ><-6> +< livraison ><-6> +< de l association ><-6> +< nord pas ><-6> +< de site internet ><-6> +< objectif ><-6> +< geeft ><-6> +< arizona ><-6> +< count ><-6> +< control content public ><-6> +< en castellano ><-6> +< vb 1 vh ><-6> +< content info ><-6> +< notre dame ><-6> +< sujets ><-6> +< text name ><-6> +< dion ><-6> +< jacket ><-6> +< sont la ><-6> +< conventions ><-6> +< feel ><-6> +< orientales ><-6> +< fireworks ><-6> +< compilation ><-6> +< en tout ><-6> +< revision ddmmyyyy ><-6> +< cercle ><-6> +< triangle ><-6> +< classes ><-6> +< simulation ><-6> +< abus ><-6> +< datecreated ><-6> +< pmi ><-6> +< recette ><-6> +< dating contact ><-6> +< references ><-6> +< ideas ><-6> +< movie download ><-6> +< et au ><-6> +< annee ><-6> +< leaders ><-6> +< pays de ><-6> +< appareil ><-6> +< captain ><-6> +< nord pas de ><-6> +< droits name ><-6> +< real estate ><-6> +< ray ><-6> +< name datecreated content ><-6> +< contributor content ><-6> +< general name author ><-6> +< site de l ><-6> +< name datecreated ><-6> +< content herve ><-6> +< go ><-6> +< se marrer ><-6> +< shakur ><-6> +< camp ><-6> +< noms ><-6> +< tape ><-6> +< de las ><-6> +< content fireworks ><-6> +< magasins ><-6> +< content true http ><-6> +< million ><-6> +< regime ><-6> +< farmer ><-6> +< for girls ><-6> +< droits de ><-6> +< lines ><-6> +< s largest ><-6> +< inside ><-6> +< alert ><-6> +< development ><-6> +< doom ><-6> +< su ><-6> +< les meilleures ><-6> +< images gif ><-6> +< 7 0 ><-6> +< blendtrans duration 1 ><-6> +< des acteurs ><-6> +< polyphoniques ><-6> +< gb name generator ><-6> +< contemporain ><-6> +< vz 1 lb ><-6> +< user ><-6> +< diva ><-6> +< services gratuits ><-6> +< bietet ><-6> +< if you ><-6> +< true http ><-6> +< technologies ><-6> +< coiffure ><-6> +< tarot ><-6> +< photography digital ><-6> +< 0 name copyright ><-6> +< tupac ><-6> +< l ecriture ><-6> +< hebergement de ><-6> +< c 2005 ><-6> +< propose de ><-6> +< visage ><-6> +< politics ><-6> +< 44 ><-6> +< 48 ><-6> +< images free ><-6> +< fil ><-6> +< carnaval ><-6> +< culture name ><-6> +< vintage ><-6> +< jeremy ><-6> +< grec ><-6> +< apprentissage ><-6> +< bill clinton ><-6> +< content models ><-6> +< utf 8 content ><-6> +< downloading ><-6> +< violation ><-6> +< wc ><-6> +< cube ><-6> +< cinema cinema ><-6> +< permet de ><-6> +< file sharing ><-6> +< vente name ><-6> +< name webmaster content ><-6> +< a travers ><-6> +< partir ><-6> +< de recherche de ><-6> +< image name ><-6> +< same ><-6> +< visual page ><-6> +< d artistes ><-6> +< eau ><-6> +< heren ><-6> +< store name ><-6> +< home page name ><-6> +< banque ><-6> +< l art ><-6> +< after name ><-6> +< datecreated content name ><-6> +< author content eric ><-6> +< swish ><-6> +< encoder ><-6> +< mother ><-6> +< il y ><-6> +< dicton ><-6> +< a pain ><-6> +< courses ><-6> +< encre ><-6> +< gear ><-6> +< a la vente ><-6> +< webmaster content ><-6> +< easily ><-6> +< vacance ><-6> +< le jour ><-6> +< spirit ><-6> +< salle ><-6> +< i name author ><-6> +< gif gifs ><-6> +< operateur ><-6> +< eenvoudig ><-6> +< musicales ><-6> +< true http equiv ><-6> +< humour blagues ><-6> +< date revision ddmmyyyy ><-6> +< proposant ><-6> +< frames ><-6> +< in our ><-6> +< etablissement ><-6> +< simon ><-6> +< content gratis ><-6> +< startseite ><-6> +< katie ><-6> +< l actualite ><-6> +< keywords content moto ><-6> +< tree ><-6> +< lang de ><-6> +< etudiant ><-6> +< art name ><-6> +< subject content photo ><-6> +< costumes ><-6> +< royal ><-6> +< 04 name dc ><-6> +< il est ><-6> +< digital cameras ><-6> +< les et ><-6> +< brabant ><-6> +< guide de ><-6> +< 0 transition 23 ><-6> +< liberty ><-6> +< vol ><-6> +< family ><-6> +< et le ><-6> +< emploi ><-6> +< content 2 ><-6> +< dc identifier ><-6> +< name dc identifier ><-6> +< cinema ><-6> +< 8859 1 bienvenue ><-6> +< system ><-6> +< prevention ><-6> +< portail annuaire ><-6> +< copyright content c ><-6> +< banniere ><-6> +< ville ><-6> +< 10 days http ><-6> +< keywords content http ><-6> +< dc language ><-6> +< name dc language ><-6> +< dc title ><-6> +< name dc title ><-6> +< pub ><-6> +< content tout ><-6> +< content _top ><-6> +< _top ><-6> +< linux ><-6> +< acheter ><-6> +< freeware ><-6> +< hosting ><-6> +< news ><-6> +< 0 for ><8> +< 0 for windows ><8> +< cuir ><8> +< violence ><8> +< mpg ><8> +< rencontres ><8> +< asia ><8> +< aiguilles ><8> +< de rencontres ><8> +< rencontre rencontres ><8> +< anna ><8> +< content fri ><8> +< origines ><8> +< poils ><8> +< content 15 name ><8> +< homme hommes ><8> +< sex xxx ><8> +< murder ><8> +< ni ><8> +< le top ><8> +< amateur photos ><8> +< lover ><8> +< allopass ><8> +< annonces rencontre ><8> +< description content photos ><9> +< gros ><9> +< vz 0 ><9> +< video hard ><9> +< skirts ><9> +< annonces sexe ><9> +< pleasure ><9> +< keywords content charme ><9> +< bisexuelle ><9> +< audience content erwachsene ><9> +< thumbnail ><9> +< hardcore sex ><9> +< erwachsene name ><9> +< vieille ><9> +< sex nude ><9> +< webcam live ><9> +< celebritees ><9> +< avs ><9> +< pipi ><9> +< exotic ><9> +< gratuit x ><9> +< hard sexe ><9> +< histoires erotiques ><9> +< gratuit sex ><9> +< fetich ><9> +< danseuses ><9> +< hairy ><9> +< galerie galeries ><9> +< for free fr ><9> +< sexe amateur gratuit ><9> +< all name resource ><9> +< charme name ><9> +< videos video videos ><9> +< rendez vous ><9> +< hentai ><9> +< asian ><9> +< content photos ><9> +< sexual ><9> +< !!! ><9> +< !! ><9> +< plaatjes ><9> +< site perso ><9> +< de boulogne ><9> +< hard couples ><9> +< nude men ><9> +< travestis top ><9> +< public content sexe ><9> +< porte jarretelles ><9> +< fr name creation_date ><9> +< mail order ><9> +< fellation felation branle ><9> +< partouze name keywords ><9> +< asiatiques asia ><9> +< encule amateur ><9> +< p0rno reference sex ><9> +< keywords content rape ><9> +< ballet dancing ><9> +< travestis top sites ><9> +< free mov ><9> +< jeunes femmes ><9> +< liens voissa sexy ><9> +< sexy fonds ><9> +< rencontre hot ><9> +< sexe partouze amateur ><9> +< women and ><9> +< asiatiques blacks ><9> +< sexe partouze chatte ><9> +< porno sexy ><9> +< asiatique salope ><9> +< garter ><9> +< ttbm ><9> +< sex name robots ><9> +< asf ra wav ><9> +< chauds ><9> +< coquine nue ><9> +< sexe sexes gratuit ><9> +< fellation sodomie blonde ><9> +< model pre ><9> +< de jeune ><9> +< 1er site ><9> +< partouze name public ><9> +< x photo ><9> +< pornostars ><9> +< homo homos ><9> +< girls foto ><9> +< xxx asia ><9> +< likken ><9> +< hommes garcon ><9> +< anderson webcam ><9> +< rating content adulte ><9> +< keywords content couple ><9> +< woman cum ><9> +< amateurs femmes ><9> +< pics lesbiennes liens ><9> +< asiatique salope couple ><9> +< karembeu ><9> +< description content rencontre ><9> +< mater ><9> +< sexe gratuit pour ><9> +< rencontres amour pucelle ><9> +< lesbiennes lesbos ><9> +< mures fellations ><9> +< peter name description ><9> +< gagner de ><9> +< gratuit asiatique ><9> +< penis enlargement ><9> +< asf ra ><9> +< http equiv copyright ><9> +< gratixxx sexe voyeur ><9> +< models non ><9> +< free name description ><9> +< hardcore live ><9> +< ra wav gif ><9> +< wives ><9> +< description content escort ><9> +< video nue ><9> +< cam camera ><9> +< xx xxx asia ><9> +< qt ><9> +< liens voissa ><9> +< sodomie enculer ><9> +< tgp portail ><9> +< content mistress ><9> +< anal anus ><9> +< content name rating ><9> +< vice ><9> +< amour rencontres ><9> +< webcam videos porno ><9> +< jpg jpeg qt ><9> +< photo hard ><9> +< belles mec ><9> +< reference sex ><9> +< hotesses ><9> +< puceau ><9> +< stars nues photos ><9> +< felation branle ><9> +< pbd production ><9> +< anderson webcam x ><9> +< jeune jeunes homme ><9> +< tout le sexe ><9> +< baise hard ><9> +< lesbienne video image ><9> +< sex tgp thumb ><9> +< sexe voyeur voyeurs ><9> +< couple vibro charme ><9> +< femmes mures ><9> +< sexe a ><9> +< x rated ><9> +< pissing asiatique asiatiques ><9> +< gratuit fond d ><9> +< keywords content xxx ><9> +< tiener ><9> +< exhib exhibition ><9> +< hard name ><9> +< enjoying ><9> +< exhibition sexy encule ><9> +< cameras cachees ><9> +< adult site ><9> +< porno gratuit sexe ><9> +< mure mures fellations ><9> +< teens filles femme ><9> +< galeries de ><9> +< pictures sex ><9> +< content sexe partouze ><9> +< voyeur exhib ><9> +< travestie ><9> +< bite pipe ><9> +< exhibition sexy ><9> +< mature name distribution ><9> +< galerie jeune ><9> +< content striptease ><9> +< girls foto fotos ><9> +< celebrita ><9> +< melangistes ><9> +< partouze amateur ><9> +< reference sex tgp ><9> +< amateur black ><9> +< video image ><9> +< a pbd ><9> +< amatrice de ><9> +< hard couples rencontres ><9> +< gay godes ><9> +< couille exhibition ><9> +< pics free galerie ><9> +< paris toulouse rouen ><9> +< couple vibro ><9> +< porn xxx ><9> +< partouze gay ><9> +< a pbd production ><9> +< erotik name page ><9> +< voissa sexy galerie ><9> +< rencontres entre ><9> +< jpeg qt asf ><9> +< blow job ><9> +< cc ><9> +< p0rno gratixxx sexe ><9> +< exhib fantasm ><9> +< thumb cameras ><9> +< gratuit photos pornos ><9> +< rencontre site de ><9> +< epilee ><9> +< qt asf ><9> +< 1 adult ><9> +< brune couille exhibition ><9> +< 8859 9 http ><9> +< photographies x gratuites ><9> +< pamela anderson webcam ><9> +< partouze http ><9> +< nude celebrities ><9> +< insolite etrange ><9> +< pour adultes name ><9> +< jarretelles ><9> +< tgp thumb cameras ><9> +< fistfucking ><9> +< rencontres annonce ><9> +< fr content peter ><9> +< rape porn name ><9> +< xxx p0rno reference ><9> +< marc dorcel ><9> +< sodomie blonde lesbienne ><9> +< sms sex ><9> +< hard hardcore baise ><9> +< francais annuaire ><9> +< equiv copyright ><9> +< bordeaux strasbourg ><9> +< chatte sein bite ><9> +< partouze sexe partouze ><9> +< chinoises stars ><9> +< woman cum hot ><9> +< mpg avi ><9> +< photographies x ><9> +< sexcam ><9> +< rouquines ><9> +< rencontres live ><9> +< showers ><9> +< coquine nue asiatiques ><9> +< masturbate ><9> +< contributions ><9> +< webcam x partouze ><9> +< life style ><9> +< content amour ><9> +< clitoris asiatique salope ><9> +< vous paris toulouse ><9> +< beautiful girl girls ><9> +< sexe partouze femme ><9> +< nue asiatiques asia ><9> +< sm sado ><9> +< anal lesbiennes video ><9> +< x partouze gay ><9> +< homme couples penetration ><9> +< teenage beautiful girl ><9> +< partouze http equiv ><9> +< amateur clitoris asiatique ><9> +< sexe non ><9> +< photo hard photos ><9> +< pucelle puceau rdv ><9> +< content adultes name ><9> +< livesex ><9> +< videos porno hard ><9> +< site adulte ><9> +< garcons beau beaux ><9> +< lesbiennes gays ><9> +< cul bite couille ><9> +< fetiche ><9> +< rencontres couples ><9> +< rapes rape ><9> +< webcam cam ><9> +< sexy des ><9> +< erotiques erotique erotiques ><9> +< sein bite ><9> +< dating service ><9> +< rdv rendez ><9> +< photos fille teens ><9> +< pics lesbiennes ><9> +< erotiske ><9> +< hardcore baise ><9> +< etrange hard ><9> +< amateur http equiv ><9> +< index all http ><9> +< gay godes travestis ><9> +< complexe ><9> +< name language name ><9> +< noires noirs ><9> +< godes travestis top ><9> +< pic photo ><9> +< couples rencontres amour ><9> +< jeux et ><9> +< stars celebritees ><9> +< sans telechargement ><9> +< amour pucelle ><9> +< seins nus ><9> +< bustiers ><9> +< sodo fellation ><9> +< couille exhibition sexy ><9> +< fellations anal gay ><9> +< knickers ><9> +< image porno ><9> +< beaux belle belles ><9> +< xxx asia asian ><9> +< partouze name robots ><9> +< friendship ><9> +< tgp portail moteur ><9> +< videos x gratuites ><9> +< de sexe adulte ><9> +< xxx pics free ><9> +< rouen lille lyon ><9> +< sex x ><9> +< le top du ><9> +< sexe partouze http ><9> +< sites xxx p0rno ><9> +< nude sexe gratuit ><9> +< preteen models ><9> +< voissa sexy ><9> +< gay gays jeune ><9> +< wav gif free ><9> +< gratuit image ><9> +< lille lyon ><9> +< twink ><9> +< free galleries ><9> +< erotique erotiques erotique ><9> +< pics free pics ><9> +< femme russe ><9> +< rencontres rencontre annonces ><9> +< sein bite pipe ><9> +< cul chatte sein ><9> +< tgp thumb ><9> +< couples penetration ><9> +< 4 s 3 ><9> +< photos lesbiennes ><9> +< strasbourg perpignan ><9> +< mure mature ><9> +< content real ><9> +< com r ca ><9> +< brune couille ><9> +< fille teens filles ><9> +< lesbiennes liens ><9> +< insolite etrange hard ><9> +< charme cul annuaire ><9> +< nude woman ><9> +< equiv copyright content ><9> +< nues stars ><9> +< plassex ><9> +< p0rno gratixxx ><9> +< erotisme erotic ><9> +< gif free ><9> +< sex and ><9> +< sperme foutre ><9> +< le 1er ><9> +< annuaires recherche liste ><9> +< hard photos erotiques ><9> +< sex search ><9> +< femme fille ><9> +< nues xxx ><9> +< amateur http ><9> +< porno anal vagin ><9> +< sex rape ><9> +< erotique erotisme erotic ><9> +< jeunes jeunette ><9> +< haben ><9> +< erotic porn ><9> +< amatrices teens ><9> +< gratuit photos et ><9> +< content teens ><9> +< keywords content sexo ><9> +< sexe adulte amatrice ><9> +< gay amateur ><9> +< hetero homo ><9> +< world name ><9> +< lille lyon rennes ><9> +< gratuit sex gratuit ><9> +< teenage beautiful ><9> +< anal gay godes ><9> +< moteurs annuaire annuaires ><9> +< ophelie ><9> +< peter name generator ><9> +< godes travestis ><9> +< partouze amateur black ><9> +< asia chinoises stars ><9> +< partouze name ><9> +< gif free mov ><9> +< epile ><9> +< stellen ><9> +< le 1er site ><9> +< pic pics free ><9> +< nackte ><9> +< amateur clitoris ><9> +< encule amateur clitoris ><9> +< sexy galerie jeune ><9> +< content sex name ><9> +< adult movies ><9> +< noires asiatiques ><9> +< rouen lille ><9> +< belles mec mecs ><9> +< libertin libertinage ><9> +< toulouse rouen lille ><9> +< stars celebritees charme ><9> +< anale sex ><9> +< annuaire annuaires recherche ><9> +< sexy encule amateur ><9> +< top du ><9> +< bite pipe fellation ><9> +< secretaire ><9> +< chicks ><9> +< d ecran gratuit ><9> +< rencontres dialogue ><9> +< celebritees charme cul ><9> +< salope couple vibro ><9> +< top sites xxx ><9> +< lick ><9> +< asia chinoises ><9> +< porno hard hardcore ><9> +< de sex gratuit ><9> +< fille teens ><9> +< blonde lesbienne video ><9> +< mures fellations anal ><9> +< lingerie pamela anderson ><9> +< adulte amatrice ><9> +< garcon garcons beau ><9> +< content preteen model ><9> +< pour hommes et ><9> +< baise hard couples ><9> +< leche ><9> +< galleries name ><9> +< sexy encule ><9> +< femme homme couples ><9> +< pamela anderson video ><9> +< lyon rennes ><9> +< jpeg qt ><9> +< sexplaatjes ><9> +< rennes bordeaux strasbourg ><9> +< hommes garcon garcons ><9> +< woman girl ><9> +< partouze femme homme ><9> +< sexe sexe partouze ><9> +< beaux belle ><9> +< filles sexy ><9> +< nus nue ><9> +< can find ><9> +< homme hommes garcon ><9> +< sodo fellation felation ><9> +< asian teenage beautiful ><9> +< excite ><9> +< free pics lesbiennes ><9> +< cul annuaire photos ><9> +< jeunes homme ><9> +< vibro charme ><9> +< photos anal ><9> +< vraiment gratuit ><9> +< des milliers d ><9> +< ra wav ><9> +< live voyeur ><9> +< asiatiques asia chinoises ><9> +< garcons beau ><9> +< salope couple ><9> +< toulouse rouen ><9> +< femmes sexy ><9> +< rennes bordeaux ><9> +< diskret ><9> +< gays jeune jeunes ><9> +< resille ><9> +< femmes tgp portail ><9> +< sex picture free ><9> +< lyon rennes bordeaux ><9> +< video s ><9> +< photos nues ><9> +< photos video hard ><9> +< erotiques erotisme erotisme ><9> +< filles nues xxx ><9> +< erotisme erotisme porno ><9> +< jeunes homme hommes ><9> +< penetration anal sexe ><9> +< publisher content peter ><9> +< sexe sex sexe ><9> +< content preteen ><9> +< charme lingerie pamela ><9> +< free rape photos ><9> +< sodomie anal ><9> +< chatte sein ><9> +< filmy ><9> +< bondage fetish ><9> +< hardcore baise hard ><9> +< and fetish ><9> +< noires beurettes ><9> +< sex photos ><9> +< fotos de sexo ><9> +< vibro charme lingerie ><9> +< photos videos galeries ><9> +< anderson video ><9> +< charme cul ><9> +< celebritees charme ><9> +< fellations anal ><9> +< wav gif ><9> +< jeune coquine nue ><9> +< sexe france gratuit ><9> +< teens filles ><9> +< teen girl model ><9> +< non nude teen ><9> +< couples penetration anal ><9> +< video image porno ><9> +< pornographiques ><9> +< sex toy ><9> +< girl girls foto ><9> +< nue asiatiques ><9> +< clone cd ><9> +< video xxx ><9> +< rencontres live shows ><9> +< escort service ><9> +< videos galeries ><9> +< state content dynamic ><9> +< sm sado maso ><9> +< belle belles mec ><9> +< voyeurs voyeurisme bizarre ><9> +< ecran gratuit ><9> +< puceau rdv ><9> +< babe babes ><9> +< sexy galerie ><9> +< gay black film ><9> +< p0rno reference ><9> +< rencontre homme ><9> +< gifs gratuit ><9> +< clitoris asiatique ><9> +< videos pornos ><9> +< mpeg mp3 ><9> +< and sex ><9> +< et de filles ><9> +< pipe name ><9> +< rdv rendez vous ><9> +< vous paris ><9> +< ru http equiv ><9> +< sexe partouze name ><9> +< videos webcams live ><9> +< xxx p0rno ><9> +< voyeur exhib fantasm ><9> +< pucelle puceau ><9> +< homme couples ><9> +< anal asiatiques ><9> +< sexe partouze sexe ><9> +< partouze femme ><9> +< ma copine ><9> +< monika ><9> +< lesbiennes liens voissa ><9> +< annuaires recherche ><9> +< femmes russes ><9> +< chinoises stars celebritees ><9> +< lesbisk ><9> +< sub ><9> +< mini skirts ><9> +< diner ><9> +< puceau rdv rendez ><9> +< sexfilm ><9> +< gays jeune ><9> +< ru http ><9> +< lascar ><9> +< 8859 1 adult ><9> +< copyright content peter ><9> +< xxx videos ><9> +< partouze chatte gode ><9> +< tangas ><9> +< beau beaux belle ><9> +< perso de ><9> +< galerie jeune coquine ><9> +< amour pucelle puceau ><9> +< anal sexe partouze ><9> +< porno p0rno gratixxx ><9> +< partouze gay black ><9> +< your adult ><9> +< of naked ><9> +< image porno anal ><9> +< seeking ><9> +< x partouze ><9> +< description content sexy ><9> +< gratuit fond ><9> +< models non nude ><9> +< pics porn ><9> +< bordeaux strasbourg perpignan ><9> +< rendez vous paris ><9> +< qt asf ra ><9> +< sodomie blonde ><9> +< pbd ><9> +< videos xxx femmes ><9> +< rencontres gay ><9> +< nues nus ><9> +< jeune ><9> +< beur ><9> +< photos gratuites de ><9> +< 3 v ><9> +< s 3 ><9> +< s 3 v ><9> +< chinoises ><9> +< fantasmes ><9> +< content sexe sex ><9> +< photo gratuit ><9> +< nylon ><9> +< erotisch ><9> +< rencontre ><9> +< femme ><9> +< videos ><9> +< sein ><9> +< site gratuit ><9> +< sexy lingerie ><9> +< ca 1 rsac ><9> +< noires ><9> +< des rencontres ><9> +< peep ><9> +< modelle ><9> +< sexe gratuit sexe ><9> +< picture pictures ><9> +< lingerie name ><9> +< escort girl ><9> +< bikinis ><9> +< erotik sex ><9> +< anal sexe ><9> +< content rating ><9> +< content erwachsene ><9> +< content xxx ><9> +< xxx sexy ><9> +< live live ><9> +< brazil ><9> +< jeux sexy ><9> +< real life ><9> +< classification content adult ><9> +< content femme ><9> +< sex adult ><9> +< live photos ><9> +< after content 21 ><9> +< copyright content 2002 ><9> +< le sexe ><9> +< tres ><9> +< plaisir ><9> +< extreme ><9> +< homosexuel ><9> +< video videos ><9> +< laetitia ><9> +< nudes ><9> +< sesso ><9> +< spectacle ><9> +< putes ><9> +< romance ><9> +< gadgets ><9> +< sexe photo ><9> +< lb 1 lc ><9> +< date content fri ><9> +< pre ><9> +< eros ><9> +< xx ><9> +< lesbian ><9> +< 69 ><9> +< glamour ><9> +< galerie photos ><9> +< sex porno ><9> +< ladies ><9> +< strings ><9> +< cry ><9> +< content deutsch de ><9> +< x sexe ><9> +< kama ><9> +< clara ><9> +< rencontres rencontre ><9> +< rencontres amour ><9> +< porno video ><9> +< mas ><9> +< nude naked ><9> +< triolisme ><9> +< content charme ><9> +< photos et des ><9> +< videos amateur ><9> +< sex sex sex ><9> +< pantyhose ><9> +< gay name ><9> +< naturisme ><9> +< exhibitionnisme ><9> +< hottest ><9> +< photo de sexe ><9> +< lesbo ><9> +< collants ><9> +< cunni ><9> +< anal gay ><9> +< aiguilles petites ><9> +< annuaire photos de ><9> +< gode godes ><9> +< chatte gode annuaire ><9> +< hermaphrodites hermaphrodite ><9> +< cul site ><9> +< super galerie photos ><9> +< dorcel ><9> +< underwear lingerie ><9> +< direct sexshop ><9> +< sexy gratuit sexy ><9> +< putain chattes penis ><9> +< dynamic name ><9> +< videos hard hardcore ><9> +< listes site ><9> +< de v2 0 ><9> +< content dynamic name ><9> +< sex videos ><9> +< peepshow ><9> +< amateurs anal ><9> +< flirt ou sexy ><9> +< y videos ><9> +< page ! name ><9> +< ch en ><9> +< hustler ><9> +< transsexuel transsexuel transexuelle ><9> +< homme trans homme ><9> +< trans transsexuel transsexuel ><9> +< putain chattes ><9> +< sexeshop ><9> +< nues gratuit gratuite ><9> +< jolies teen teens ><9> +< bresilien bresilien ><9> +< lingeries ><9> +< gratuit gratuite gratuites ><9> +< mur mure mures ><9> +< designer content ><9> +< levrette fille ><9> +< erotisme porno p0rno ><9> +< adult search ><9> +< mega ><9> +< couples litterature erotiques ><9> +< url poptrace ><9> +< partouze black annuaire ><9> +< nus transsexuel nu ><9> +< charme piss ><9> +< sexes gratuit ><9> +< gratuit sans ><9> +< fouet ><9> +< pipe sodomie ><9> +< black partouze black ><9> +< fotos pic pics ><9> +< sex http ><9> +< jeune coquine ><9> +< galerie photos et ><9> +< black annuaire ><9> +< fesmmes bitte ><9> +< actrics ><9> +< teen sex ><9> +< xxx nues dialogues ><9> +< transexuels http equiv ><9> +< aiguilles petites annonces ><9> +< femme femmes tgp ><9> +< gay lesbiennes sodo ><9> +< lesbiennes sodo sodomie ><9> +< jolies teen ><9> +< sexshop boutiques ><9> +< sexe porno photos ><9> +< erotic photo ><9> +< cul photo ><9> +< travlo ><9> +< latines ><9> +< fesmmes ><9> +< hardcore gay ><9> +< origines bizarre transsex ><9> +< echangiste couples ><9> +< avec une super ><9> +< liste listes ><9> +< erotique hard ><9> +< transexuel transexuel ><9> +< francophone unique photos ><9> +< 1 made ><9> +< content adults ><9> +< recherche liste listes ><9> +< pics free rape ><9> +< schoolslet nl webmaster ><9> +< masochisme ><9> +< rencontre petites annonces ><9> +< homme trans ><9> +< black partouze ><9> +< fotos gratis ><9> +< nh 1 vz ><9> +< travlo travesti cul ><9> +< fist fuck ><9> +< ficken ><9> +< rose verge ><9> +< hermaphrodites hermaphrodite godemichets ><9> +< pt name ><9> +< transsexuelle transsexuel ><9> +< 2559148 ><9> +< sexe name robots ><9> +< rencontre petites ><9> +< beau beaux ><9> +< pulpeuse ><9> +< hermaphrodite godemichets ><9> +< transsexuel transsexuel ><9> +< bizarre mur mure ><9> +< nues video ><9> +< videos sexy ><9> +< jeunettes ><9> +< transsex boulogne bois ><9> +< acteurs actrics ><9> +< poptrace ><9> +< model teen ><9> +< webcams x ><9> +< sites erotique erotiques ><9> +< oh 1 va ><9> +< metamorphoser changement trans ><9> +< amateur porno ><9> +< xxx nues ><9> +< cuni ><9> +< de sexy ><9> +< gode annuaire ><9> +< content free rape ><9> +< lesbiennes lesbienne sodo ><9> +< lingerie and ><9> +< sites erotique ><9> +< seules ><9> +< poptrace 2559148 ><9> +< fesse fesses ><9> +< pipe fellation sodomie ><9> +< club rencontres ><9> +< girl model ><9> +< black sexe http ><9> +< le site 100 ><9> +< france suisse belgique ><9> +< unique photos ><9> +< transsexuel transexuelle ><9> +< hermaphrodite godemichets vibrateurs ><9> +< beauties ><9> +< photographies trans trans ><9> +< lesbienne hetero ><9> +< for sex ><9> +< fille femme homme ><9> +< de v2 ><9> +< asia asian teenage ><9> +< pute putain homme ><9> +< free rape porn ><9> +< acteurs actrics celebrites ><9> +< piss pissing asiatique ><9> +< enlargement ><9> +< toys adult ><9> +< sexshop boutiques flirt ><9> +< content jolie ><9> +< porno francophone unique ><9> +< hardcore charme piss ><9> +< x acteurs actrics ><9> +< transsexuel nu ><9> +< portails moteurs ><9> +< bresilien bresilienne trav ><9> +< avaler levrette fille ><9> +< ou sexy cd ><9> +< gode annuaire vibro ><9> +< cachees ><9> +< trans trans ><9> +< beau trans amateurs ><9> +< hidden ><9> +< naturistes ><9> +< content photos videos ><9> +< photos videos xxx ><9> +< sexy cd ><9> +< mes photos ><9> +< amoureuses ><9> +< photographies trans ><9> +< p0rno ><9> +< trav travlo ><9> +< keywords content sexy ><9> +< jeunes charme ><9> +< pissing asiatique ><9> +< une amatrice ><9> +< femme femmes nu ><9> +< changement trans ><9> +< transsexuel nu transformer ><9> +< busty ><9> +< partouz ><9> +< gummi ><9> +< 1 made in ><9> +< homme transsexuel homme ><9> +< vz 0 la ><9> +< webcam videos ><9> +< gratis sexo ><9> +< jarretelle ><9> +< fine hermaphrodites ><9> +< erotic erotique ><9> +< meilleures meilleurs ><9> +< actrics celebrites danseuses ><9> +< teens webcam ><9> +< direct sexshop boutiques ><9> +< trans nus ><9> +< plus beau ><9> +< boulogne bois de ><9> +< cochonnes femmes ><9> +< levrette fille femme ><9> +< dicks ><9> +< de geilste ><9> +< sexy cd dvd ><9> +< levrette femme homme ><9> +< xxx femmes ><9> +< une super ><9> +< des plus beau ><9> +< sex http equiv ><9> +< clito clitoris ><9> +< femme homme transformer ><9> +< photo gratuite ><9> +< sex name keywords ><9> +< gratuites sexy joli ><9> +< travesti cul ><9> +< sexe pornographie ><9> +< video videos hard ><9> +< homme metamorphoser ><9> +< womp ><9> +< couples litterature ><9> +< boutiques flirt ou ><9> +< vedettes ><9> +< de sexe name ><9> +< 100 transsexuelles ><9> +< 0 la 1 ><9> +< icraonline de ><9> +< bresilienne ><9> +< !!!! ><9> +< que du ><9> +< mur mure ><9> +< filles femme femmes ><9> +< transexuel bresilien bresilien ><9> +< photos et de ><9> +< crossdresser ><9> +< travlo travesti ><9> +< pee ><9> +< young girl ><9> +< nues et ><9> +< pictures free sex ><9> +< bite chatte ><9> +< name designer content ><9> +< nu transformer pute ><9> +< name designer ><9> +< non conformiste ><9> +< homme transsexuel ><9> +< god gode ><9> +< lingerie de ><9> +< annuaire vibro black ><9> +< jolie jolies teen ><9> +< femmes tgp ><9> +< asian teenage ><9> +< real rapes ><9> +< unique photos pornos ><9> +< content peter name ><9> +< content foto ><9> +< fine hermaphrodites hermaphrodite ><9> +< pornografia ><9> +< url poptrace 2559148 ><9> +< hot womp breast ><9> +< metamorphoser ><9> +< porte jarretelle ><9> +< sexe partouze ><9> +< droits reserves name ><9> +< gratixxx ><9> +< chatte gode ><9> +< bitte penis ><9> +< charme piss pissing ><9> +< sex hardcore ><9> +< nues dialogues en ><9> +< sainclair ><9> +< putain homme ><9> +< picture image ><9> +< moteur portails moteurs ><9> +< transexuel transexuel bresilien ><9> +< femme homme metamorphoser ><9> +< chate ><9> +< bresilien 100 hard ><9> +< cul annuaire ><9> +< homme fesmmes bitte ><9> +< bitte penis fetichisme ><9> +< travesti cul bite ><9> +< en direct sexshop ><9> +< content url poptrace ><9> +< boulogne bois ><9> +< anal lesbiennes ><9> +< adults only ><9> +< pute putain chattes ><9> +< porn name keywords ><9> +< voyeurisme bizarre ><9> +< liste listes site ><9> +< transexuels http ><9> +< avaler levrette femme ><9> +< gay black ><9> +< boutiques flirt ><9> +< photo video videos ><9> +< portail moteur portails ><9> +< sexy joli jolie ><9> +< sexy joli ><9> +< fr r na ><9> +< mecs x xx ><9> +< mure mures ><9> +< keywords content escort ><9> +< teens webcam webcams ><9> +< suce suck ><9> +< nude teen ><9> +< recherche liste ><9> +< moteur portails ><9> +< trans trans transsexuel ><9> +< sex shops ><9> +< annuaire black ><9> +< 100 hard avec ><9> +< pics rape ><9> +< search for ><9> +< vibro black partouze ><9> +< homme metamorphoser changement ><9> +< 100 transsexuelles bresilien ><9> +< putain homme homme ><9> +< talons aiguilles petites ><9> +< trans amateurs ><9> +< femmes nu ><9> +< violence photos ><9> +< 0906 ><9> +< teen teens webcam ><9> +< womp breast ><9> +< petites annonces sexe ><9> +< trans homme ><9> +< exibitionniste ><9> +< cum hot womp ><9> +< femmes nu nue ><9> +< lesbiennes video ><9> +< travestis transexuels http ><9> +< gratixxx sexe ><9> +< nude sex ><9> +< transsexuelle transsexuel transexuel ><9> +< sites de cul ><9> +< xxx video ><9> +< transsexuel transexuel transexuel ><9> +< index photographies trans ><9> +< adult name robots ><9> +< suisse belgique ><9> +< galleries femme femmes ><9> +< francophone unique ><9> +< blonde lesbienne ><9> +< free nude ><9> +< x videos ><9> +< france gratuit ><9> +< voyeurisme bizarre mur ><9> +< mastubation ><9> +< transsexuel transexuel ><9> +< live liveshow ><9> +< content annuaire de ><9> +< site 100 transsexuelles ><9> +< de filles nues ><9> +< hot womp ><9> +< bdsm echangiste couples ><9> +< transsexuel transexuelle transsexuelle ><9> +< hard hardcore charme ><9> +< webcam webcams live ><9> +< gratuit ! name ><9> +< fotos pic ><9> +< 8859 1 made ><9> +< peter name ><9> +< salope pute ><9> +< changement trans nus ><9> +< metamorphoser changement ><9> +< chattes penis fetichisme ><9> +< 100 hard ><9> +< nues dialogues ><9> +< peter name copyright ><9> +< gallerie galleries femme ><9> +< stripper ><9> +< sex tgp ><9> +< string tanga ><9> +< bresilien bresilienne ><9> +< nue nues gratuit ><9> +< annonce rencontre ><9> +< porno p0rno ><9> +< levrette femme ><9> +< super galerie ><9> +< bizarre transsex boulogne ><9> +< cash webmasterprogramma name ><9> +< transsexuelles bresilien 100 ><9> +< annie ><9> +< sodomie cochonne ><9> +< cyprine sperme ><9> +< actrics celebrites ><9> +< echangiste couples litterature ><9> +< bresilien 100 ><9> +< exib ><9> +< free galerie galeries ><9> +< trans nus transsexuel ><9> +< amateur videos ><9> +< homme transformer pute ><9> +< fantasm ><9> +< black annuaire black ><9> +< fesmmes bitte penis ><9> +< beau trans ><9> +< pornographie sexe ><9> +< de photos et ><9> +< bresilienne trav travlo ><9> +< trans amateurs name ><9> +< bizarre mur ><9> +< bizarre transsex ><9> +< transsexuel homme ><9> +< partouze black ><9> +< bresilien bresilien bresilienne ><9> +< site sites erotique ><9> +< plus beau trans ><9> +< webcams photos ><9> +< sadomasochistes ><9> +< gay lesbiennes lesbienne ><9> +< annonces sexe gratuit ><9> +< listes site sites ><9> +< pics of ><9> +< thumbs ><9> +< mecs x ><9> +< une super galerie ><9> +< transexuelle transsexuelle transsexuel ><9> +< transsex boulogne ><9> +< pour hommes ><9> +< portails moteurs annuaire ><9> +< sexe avec ><9> +< clit ><9> +< free rape porno ><9> +< gratuit gay ><9> +< trav travlo travesti ><9> +< sexe gratuit video ><9> +< annuaire black sexe ><9> +< mec mecs x ><9> +< illustrations erotisme clubs ><9> +< gratuites xxx nues ><9> +< moteurs annuaire ><9> +< cum hot ><9> +< transexuel bresilien ><9> +< gratuites xxx dialogues ><9> +< homme homme trans ><9> +< icraonline de v2 ><9> +< penis fetichisme echangisme ><9> +< webmasterprogramma name description ><9> +< et des plus ><9> +< oral rape ><9> +< nu transformer ><9> +< homme fesmmes ><9> +< de sexo gratis ><9> +< strippers ><9> +< chattes penis ><9> +< rape violence ><9> +< fessees ><9> +< nus transsexuel ><9> +< lesbiennes sodo ><9> +< content photos gratuites ><9> +< a poil voyeurs ><9> +< chaleur ><9> +< gratuite gratuites sexy ><9> +< comment icraonline de ><9> +< annuaire vibro ><9> +< lust ><9> +< brunes rousses ><9> +< bizarr ><9> +< shop sexe shop ><9> +< levre ><9> +< pussies ><9> +< content peter ><9> +< content amatrice ><9> +< sado mazo ><9> +< lingerie fine hermaphrodites ><9> +< webmasterprogramma name ><9> +< conformiste ><9> +< bresilienne trav ><9> +< transsexuel homme fesmmes ><9> +< foto fotos pic ><9> +< galleries femme ><9> +< video amateur name ><9> +< vibro black ><9> +< transsexuelles bresilien ><9> +< art nude ><9> +< trans homme transsexuel ><9> +< bottom ><9> +< flirt ou ><9> +< erotic stories ><9> +< nu ><9> +< couple ><9> +< 1 lb 1 ><9> +< lb 1 ><9> +< 1 lb ><9> +< keywords content gay ><9> +< modele ><9> +< free name ><9> +< orgasme ><9> +< girls ><9> +< celibataire ><9> +< du x ><9> +< scream ><9> +< soumise ><9> +< gay sex ><9> +< superbe ><9> +< bisexuel ><9> +< lb ><10> +< belles ><10> +< playmate ><10> +< euc kr name ><10> +< kr name ><10> +< chaud ><10> +< amateur sexe ><10> +< stockings ><10> +< melangisme ><10> +< hard porno ><10> +< lolitas ><10> +< stars du ><10> +< photo sexe ><10> +< sex photo ><10> +< females ><10> +< porno photos ><10> +< free pictures ><10> +< photos xxx ><10> +< sex seks ><10> +< sex picture ><10> +< gay ><10> +< dialogue ><10> +< beau ><10> +< adults ><10> +< soumission ><10> +< content gay ><10> +< og ><10> +< asiatique ><10> +< culotte ><10> +< cri ><10> +< transformer ><10> +< cedex ><10> +< derniers ><10> +< de sexe gratuit ><10> +< bras ><10> +< hetero ><10> +< trans ><10> +< belle ><10> +< blonde ><10> +< glan ><10> +< pornos index photographies ><10> +< gallery mrcash nl ><10> +< nl rampestamper nl ><10> +< videos agences ><10> +< geilste nl ><10> +< teens young ><10> +< partenariat pour ><10> +< porno amateur ><10> +< penis gallery ><10> +< lesbiennes couples ><10> +< nl likenslik ><10> +< liveshows cochones hot ><10> +< movies pd ><10> +< nl zuigenslet ><10> +< gratuit brunes love ><10> +< sexcash klikbonus ><10> +< superjong nl zuigenslet ><10> +< webcams lesbiennes couples ><10> +< ni 1 og ><10> +< litterature eros editeurs ><10> +< nl pijpmachine ><10> +< gratis videos ><10> +< et videos de ><10> +< content copyright mr ><10> +< pijpen tieten geile ><10> +< distribution content globaal ><10> +< pucelle ><10> +< vagin lecher ><10> +< sexshops ><10> +< blacks homo hetero ><10> +< anus putes pipes ><10> +< support content ><10> +< lingerie liveshows cochones ><10> +< xxx dialogues ><10> +< webmaster euroklik partnerclicks ><10> +< tienerteef pijpmachine rampestamper ><10> +< forum anus putes ><10> +< mpg jpg ><10> +< agences de voyage ><10> +< neukhoer nl ><10> +< photos femmes ><10> +< accessoires chat forum ><10> +< couples cul ><10> +< amateurs flirt hotgirls ><10> +< corsets ><10> +< superjong zuigenslet likenslik ><10> +< love live ><10> +< website site pagina ><10> +< content erotik sex ><10> +< pijpmachine ><10> +< bdsm amputees ><10> +< la 1 oh ><10> +< sensuelle lesbians chaude ><10> +< ni 1 va ><10> +< et de sexe ><10> +< liens sites pornos ><10> +< webmasters a la ><10> +< sexe adulte ><10> +< kiss encul ><10> +< homo hetero cunilingus ><10> +< transexuelle transsexuelle ><10> +< gay magazine homosexuel ><10> +< uniformes ><10> +< webmasterprogramma ><10> +< free rape pictures ><10> +< pijpen tieten ><10> +< rape woman ><10> +< nl retenlikkers ><10> +< naked penis gallery ><10> +< promotie herhaalbezoek ><10> +< likenslik schoolslet ><10> +< superjong nl ><10> +< vibromasseurs ><10> +< sexy gratuit ><10> +< videos webcam ><10> +< photos pornos index ><10> +< chat forum anus ><10> +< rampestamper ><10> +< sexy salopes boutiques ><10> +< nl neukhoer nl ><10> +< lesbosletjes retenlikkers ><10> +< content mr cash ><10> +< content porno sex ><10> +< danseuses escortes films ><10> +< asia asian ><10> +< mrcash nl name ><10> +< sexy charme ><10> +< lesbienne sodo ><10> +< site pagina ><10> +< pipes seins ><10> +< litterature eros ><10> +< reserves name ><10> +< jeunette ><10> +< nues travestis ><10> +< garcon garcons ><10> +< trans blacks ><10> +< tienersex hoeren ><10> +< partnerclicks vpscash sexybills ><10> +< cavello promotie ><10> +< show porno ><10> +< brunes love ><10> +< celebrites danseuses ><10> +< nl schoolslet nl ><10> +< fetichisme echangisme ><10> +< euroklik ><10> +< hot gays ><10> +< salons prives nues ><10> +< superjong zuigenslet ><10> +< hotgirls 69 ><10> +< mpg jpg jpeg ><10> +< porno sex beffen ><10> +< ws ><10> +< lingerie liveshows ><10> +< du porno ><10> +< mpeg fellation ><10> +< verge glan ><10> +< erotique illustrations erotisme ><10> +< trans blacks homo ><10> +< in nederland de ><10> +< zuigenslet likenslik schoolslet ><10> +< sex beffen ><10> +< 2 5 transition ><10> +< pijpmachine rampestamper superjong ><10> +< filles femme ><10> +< content volwassen name ><10> +< publisher content mrcash ><10> +< geld verdienen gratis ><10> +< retenlikkers nl ><10> +< couples associations ><10> +< videos blondes gratuit ><10> +< amatrices a poil ><10> +< forum anus ><10> +< cunilingus langue kiss ><10> +< asiatique asiatiques ><10> +< herhaalbezoek support ><10> +< mamadas ><10> +< nl superjong ><10> +< pd mpeg ><10> +< aphrodisiaques ><10> +< poils jambes avaler ><10> +< hoeren kutjes ><10> +< movies pd mpeg ><10> +< photos videos movies ><10> +< sexy hard ><10> +< echanger couples associations ><10> +< anaal seks sexpagina ><10> +< nederland de ><10> +< travestis transexuels ><10> +< godes accessoires chat ><10> +< shop sexe ><10> +< 0 la ><10> +< vpscash sexybills e ><10> +< encul sodomie ><10> +< nude sexe ><10> +< rencontres femmes ><10> +< tieten geile tienersex ><10> +< globaal name robots ><10> +< godes accessoires ><10> +< escortes films ><10> +< portail moteur ><10> +< mr cash name ><10> +< tienerteef pijpmachine ><10> +< masturberen sexy dildo ><10> +< faciale ><10> +< mrcash nl ><10> +< rencontre annonces ><10> +< sodomie chatte breast ><10> +< follow name googlebot ><10> +< content we ><10> +< meiden naked ><10> +< tienerteef ><10> +< neukhoer ><10> +< globaal ><10> +< gouines godes accessoires ><10> +< pijpmachine nl rampestamper ><10> +< cul photos videos ><10> +< 1 sexe gratuit ><10> +< blondes gratuit ><10> +< gif hard ><10> +< content banners ><10> +< vpscash ><10> +< schoolslet webmaster euroklik ><10> +< rampestamper superjong ><10> +< nude photo ><10> +< salopes boutiques ><10> +< tienersex hoeren kutjes ><10> +< softcore ><10> +< accessoires chat ><10> +< nederland de meest ><10> +< partouze poils jambes ><10> +< follow sur ><10> +< mpeg fellation sensual ><10> +< cavello ><10> +< avertis! ><10> +< banners holdtime aanmelden ><10> +< joli jolie jolies ><10> +< porn tieners ><10> +< sensuelle lesbians ><10> +< erotique illustrations ><10> +< gallery mr ><10> +< pornofotos meiden ><10> +< copyright mr ><10> +< pornofotos ><10> +< nl masturberen sexy ><10> +< pijpmachine rampestamper ><10> +< nichons nibard mpg ><10> +< queues ><10> +< mrcash ><10> +< sex sexe amateur ><10> +< seks sexpagina ><10> +< hetero cunilingus ><10> +< pipes seins nichons ><10> +< photos erotique ><10> +< gays amateurs flirt ><10> +< sexy dildo ><10> +< ass rape ><10> +< homosexuel litterature eros ><10> +< le paradis ><10> +< support content banners ><10> +< amputees bonnes ><10> +< photos amateurs amatrices ><10> +< putes pipes ><10> +< anal anale ><10> +< photos videos blondes ><10> +< video porno gratuite ><10> +< sex shop lingerie ><10> +< nl tienerteef ><10> +< echangiste echanger ><10> +< lesbiennes couples cul ><10> +< dagen name email ><10> +< anal sex ><10> +< sexy photos ><10> +< verdienen gratis ><10> +< cochones hot gays ><10> +< ejaculation moule ><10> +< eros editeurs livres ><10> +< retenlikkers neukhoer ><10> +< 2002 made ><10> +< poils jambes ><10> +< photos filles nues ><10> +< cash webmasterprogramma ><10> +< encul sodomie chatte ><10> +< euroklik partnerclicks ><10> +< blondes gratuit brunes ><10> +< kutjes hardcore erotiek ><10> +< content mrcash ><10> +< partouze poils ><10> +< klikbonus cavello ><10> +< content erotic ><10> +< site pagina gallery ><10> +< nieuw in nederland ><10> +< webmasters avertis! ><10> +< maso bdsm amputees ><10> +< partouze sexe ><10> +< anus picket ><10> +< echanger couples ><10> +< tieners pornofotos meiden ><10> +< clone ><10> +< escortes films de ><10> +< sexybills e sexcash ><10> +< magazine homosexuel litterature ><10> +< 01 france in ><10> +< transsex ><10> +< vagin lecher partouze ><10> +< index photographies ><10> +< glan sperme ><10> +< a la page ><10> +< cunilingus langue ><10> +< rape woman photos ><10> +< content adulte name ><10> +< femmes photos ><10> +< rousses bite trans ><10> +< chaude french gouines ><10> +< sexcash ><10> +< pornstars ><10> +< com partenariat pour ><10> +< tienerteef nl ><10> +< geilste nl retenlikkers ><10> +< associations lesbiennes ><10> +< nl rampestamper ><10> +< likenslik ><10> +< lesbosletjes retenlikkers neukhoer ><10> +< bdsm amputees bonnes ><10> +< euroklik partnerclicks vpscash ><10> +< partnerclicks vpscash ><10> +< orgasm ><10> +< porno x ><10> +< french gouines godes ><10> +< gallery mr cash ><10> +< encul ><10> +< sexybills e ><10> +< mec mecs ><10> +< chaude french ><10> +< voissa ><10> +< association gay magazine ><10> +< hardcore erotiek ><10> +< bizzare ><10> +< avaler femmes http ><10> +< flirt hotgirls 69 ><10> +< picket ><10> +< revenus liens sites ><10> +< klikbonus ><10> +< prives nues travestis ><10> +< pornofotos meiden naked ><10> +< fellation sensual ><10> +< porno cul ><10> +< voyage salons prives ><10> +< content banners holdtime ><10> +< hermaphrodite ><10> +< 2002 made in ><10> +< the hottest ><10> +< amateurs amatrices a ><10> +< neukhoer tienerteef pijpmachine ><10> +< meest geilste nl ><10> +< gratuit brunes ><10> +< couples associations lesbiennes ><10> +< hard soft foufoune ><10> +< fuck fucking ><10> +< bite trans ><10> +< pagina gallery ><10> +< anaal seks ><10> +< nibard mpg ><10> +< live salope ><10> +< penis gallery mrcash ><10> +< orgy ><10> +< naked penis ><10> +< amateur amatrice ><10> +< voyage salons ><10> +< 69 webcams ><10> +< zuigenslet nl likenslik ><10> +< globaal name ><10> +< lingerie pamela ><10> +< la page ! ><10> +< clitoris clito ><10> +< gif hard soft ><10> +< geile tienersex ><10> +< amputees bonnes adresses ><10> +< amateur porn tieners ><10> +< hard cul ><10> +< cul videos agences ><10> +< glan sperme mouille ><10> +< ejaculation moule vagin ><10> +< pd mpeg fellation ><10> +< sexy dildo lesbosletjes ><10> +< verdienen gratis website ><10> +< likenslik nl ><10> +< hardcore erotiek anaal ><10> +< foufoune rousses bite ><10> +< breast verge glan ><10> +< rampestamper superjong zuigenslet ><10> +< klikbonus cavello promotie ><10> +< tienerteef nl pijpmachine ><10> +< domination soumission ><10> +< girls and ><10> +< seks sexpagina plaatjes ><10> +< love live photos ><10> +< nl schoolslet ><10> +< holdtime aanmelden ><10> +< jpeg gif hard ><10> +< pour webmasters avertis! ><10> +< 23 name author ><10> +< sex sexy salopes ><10> +< fellation felation ><10> +< avaler femmes ><10> +< gratis website site ><10> +< xxx mp3 ><10> +< banners holdtime ><10> +< liveshows cochones ><10> +< superjong ><10> +< geile tienersex hoeren ><10> +< porn tieners pornofotos ><10> +< pornostar ><10> +< sex stories ><10> +< zuigenslet likenslik ><10> +< erotique erotiques erotisme ><10> +< partnerclicks ><10> +< nues travestis transexuels ><10> +< mr cash webmasterprogramma ><10> +< e sexcash ><10> +< sexkorea ><10> +< erotiques erotique ><10> +< kiss encul sodomie ><10> +< hard videos ><10> +< art erotique illustrations ><10> +< voyeurisme exhibition exhibitionniste ><10> +< cavello promotie herhaalbezoek ><10> +< la 1 na ><10> +< kutje ><10> +< sperme mouille ><10> +< e sexcash klikbonus ><10> +< mr cash ><10> +< content 31 dagen ><10> +< blacks homo ><10> +< beffen neuken ><10> +< nl pijpmachine nl ><10> +< videos movies pd ><10> +< sexybills ><10> +< eros editeurs ><10> +< partouze chatte ><10> +< amatrices a ><10> +< femdom ><10> +< blonde blondes ><10> +< borsten ><10> +< sperme mouille ejaculation ><10> +< breast verge ><10> +< nl zuigenslet nl ><10> +< nl webmaster ><10> +< aanmelden geld verdienen ><10> +< ! name dc ><10> +< lesbienne video ><10> +< dagen name ><10> +< lips ><10> +< herhaalbezoek support content ><10> +< gouines godes ><10> +< sexy salopes ><10> +< herhaalbezoek ><10> +< holdtime ><10> +< 1 vz 0 ><10> +< amputees ><10> +< fellation sensual sensuelle ><10> +< adulte sexe ><10> +< duration 2 5 ><10> +< adresses echangiste echanger ><10> +< chatte breast ><10> +< jambes avaler femmes ><10> +< seins nichons nibard ><10> +< gods ><10> +< index follow sur ><10> +< lecher partouze ><10> +< volwassen name ><10> +< porno gratuite ><10> +< celebrites danseuses escortes ><10> +< chatte breast verge ><10> +< mouille ejaculation ><10> +< shop lingerie ><10> +< content pour les ><10> +< nl masturberen ><10> +< exhibition exhibitionniste art ><10> +< tieten geile ><10> +< x amateur ><10> +< hot gays amateurs ><10> +< sluts ><10> +< zuigenslet nl ><10> +< erotic art ><10> +< email content nl ><10> +< content globaal ><10> +< verge glan sperme ><10> +< retenlikkers neukhoer tienerteef ><10> +< bonnes adresses echangiste ><10> +< tit ><10> +< photo photos fille ><10> +< lesbians chaude french ><10> +< tieners pornofotos ><10> +< webmaster euroklik ><10> +< most beautiful ><10> +< zuigenslet ><10> +< sexpagina plaatjes amateur ><10> +< flirt hotgirls ><10> +< soft foufoune ><10> +< lesbosletjes ><10> +< hard avec une ><10> +< copyright mr cash ><10> +< free rape videos ><10> +< content 2002 made ><10> +< woman photos ><10> +< hotgirls 69 webcams ><10> +< editeurs livres x ><10> +< nl tienerteef nl ><10> +< content mrcash nl ><10> +< photo sexy ><10> +< erotisme porno ><10> +< masturberen sexy ><10> +< adult webmaster ><10> +< erotiek anaal seks ><10> +< france in ><10> +< rating content volwassen ><10> +< cochones hot ><10> +< nasty ><10> +< gallery mrcash ><10> +< lecher partouze poils ><10> +< content globaal name ><10> +< hard sex ><10> +< associations lesbiennes association ><10> +< prives nues ><10> +< sexcash klikbonus cavello ><10> +< pornos index ><10> +< sex sexe sexes ><10> +< nues hard ><10> +< geisha ><10> +< gratuites sexy ><10> +< hetero cunilingus langue ><10> +< echangiste echanger couples ><10> +< sexkontakte ><10> +< brune brunes ><10> +< anal vagin ><10> +< dildo lesbosletjes ><10> +< volwassen ><10> +< ass ><10> +< free rape galleries ><10> +< sex beffen neuken ><10> +< de voyage salons ><10> +< volwassen name expires ><10> +< neukhoer tienerteef ><10> +< gratuits photographies xxx ><10> +< 5 transition 23 ><10> +< nibard mpg jpg ><10> +< dildo lesbosletjes retenlikkers ><10> +< mpeg mpg ><10> +< danseuses escortes ><10> +< holdtime aanmelden geld ><10> +< langue kiss encul ><10> +< likenslik schoolslet webmaster ><10> +< nl retenlikkers nl ><10> +< lesbians chaude ><10> +< photos videos x ><10> +< erotiek anaal ><10> +< soft foufoune rousses ><10> +< video sexe amateur ><10> +< schoolslet webmaster ><10> +< nl superjong nl ><10> +< gratuit liveshow ><10> +< com partenariat ><10> +< moule vagin ><10> +< amateurs flirt ><10> +< homosexuel litterature ><10> +< boutiques lingerie liveshows ><10> +< couples cul photos ><10> +< hoeren kutjes hardcore ><10> +< boutiques lingerie ><10> +< foufoune rousses ><10> +< penetration anal ><10> +< nl webmaster euroklik ><10> +< rampestamper nl ><10> +< 31 dagen name ><10> +< adult video ><10> +< piss pissing ><10> +< aanmelden geld ><10> +< bite trans blacks ><10> +< salopes boutiques lingerie ><10> +< amateur video ><10> +< les webmasters a ><10> +< pijpmachine nl ><10> +< nichons nibard ><10> +< neuken pijpen tieten ><10> +< bite couille ><10> +< neukhoer nl tienerteef ><10> +< magazine homosexuel ><10> +< lesbiennes association ><10> +< promotie herhaalbezoek support ><10> +< rampestamper nl superjong ><10> +< cyprine ><10> +< lesbienne sodo sodomie ><10> +< gays amateurs ><10> +< content volwassen ><10> +< de meest geilste ><10> +< sensual sensuelle lesbians ><10> +< videos blondes ><10> +< meest geilste ><10> +< schoolslet nl ><10> +< nl neukhoer ><10> +< retenlikkers nl neukhoer ><10> +< nederlands name distribution ><10> +< langue kiss ><10> +< putes pipes seins ><10> +< sensual sensuelle ><10> +< pic free ><10> +< mouille ejaculation moule ><10> +< cash name publisher ><10> +< videos agences de ><10> +< mrcash nl masturberen ><10> +< webcams lesbiennes ><10> +< meiden naked penis ><10> +< retenlikkers ><10> +< moule vagin lecher ><10> +< anus putes ><10> +< jambes avaler ><10> +< porn free ><10> +< free galerie ><10> +< brunes love live ><10> +< pagina gallery mr ><10> +< xxx dialogues en ><10> +< nl likenslik nl ><10> +< beffen neuken pijpen ><10> +< salope salopes ><10> +< plaatjes amateur porn ><10> +< film x ><10> +< rousses bite ><10> +< salons prives ><10> +< fetichisme echangisme fessee ><10> +< lesbiennes association gay ><10> +< ou sexy ><10> +< adresses echangiste ><10> +< illustrations erotisme ><10> +< de meest ><10> +< likenslik nl schoolslet ><10> +< french gouines ><10> +< shop lingerie fine ><10> +< erotisme erotisme ><10> +< vpscash sexybills ><10> +< partenariat pour webmasters ><10> +< schoolslet ><10> +< 31 dagen ><10> +< xxx sexe ><10> +< jolie jolies ><10> +< 69 webcams lesbiennes ><10> +< dick ><10> +< 4 http equiv ><10> +< 4 http ><10> +< 30 days http ><10> +< videos de sexe ><10> +< free adult ><10> +< movies name ><10> +< ejacs ><10> +< gratuit video ><10> +< site porno ><10> +< belle belles ><10> +< erwachsene ><10> +< teen teens ><10> +< laetitia casta ><10> +< sexe et ><10> +< homme femme ><10> +< trio ><10> +< young ><10> +< galleries ><10> +< ne 1 ><10> +< sex sex ><10> +< vibrateurs ><10> +< travesti ><10> +< bois de ><10> +< bresilien ><10> +< x ><10> +< suck ><10> +< jolie ><10> +< naked ><10> +< homo ><10> +< soft ><10> +< cash ><10> +< meiden ><10> +< sexe cul ><10> +< celebs ><10> +< girl ><10> +< porno sexe ><10> +< sexe xxx ><10> +< amateur gratuit ><10> +< nana ><10> +< soumis ><10> +< coquins ><10> +< pute putain ><10> +< rape porno ><10> +< amateur amateurs ><10> +< personals ><10> +< com sexe ><10> +< libertinage ><10> +< shemale ><10> +< keywords content porno ><10> +< tanga ><10> +< hotgirls ><10> +< description content nieuw ><10> +< sexegratuit ><10> +< nipple ><10> +< nu nue nues ><10> +< raped girls photos ><10> +< pik ><10> +< photo sex ><10> +< little girls ><10> +< porn movie ><10> +< country content fr ><10> +< editeurs ><10> +< caresse ><10> +< site de rencontres ><10> +< sexe sexe sexe ><10> +< nanas ><10> +< keywords content erotik ><10> +< toon ><10> +< d un couple ><10> +< sextoys ><10> +< exporter name dc ><10> +< content nieuw in ><10> +< ukraine ><10> +< editeurs livres ><10> +< 5 transition ><10> +< blonde brune rousse ><10> +< free sex pictures ><10> +< free rape sex ><10> +< lb 1 na ><10> +< fashion teen ><10> +< erotique erotiques ><10> +< content country ><10> +< content nieuw ><10> +< webmasters a ><10> +< sexpagina plaatjes ><10> +< kutjes hardcore ><10> +< violent rape ><10> +< violence pics ><10> +< sexe ! ><10> +< page ! ><10> +< ni 1 oh ><10> +< pinup ><10> +< pics name ><10> +< free xxx ><10> +< cash name ><10> +< dildos ><10> +< la lingerie ><10> +< amateur name keywords ><10> +< x gratuit ><10> +< porno hardcore ><10> +< gratuit videos ><10> +< nymphomane ><10> +< voyeur voyeurs ><10> +< 9 http equiv ><10> +< melangiste ><10> +< html exporter name ><10> +< jenna ><10> +< films x ><10> +< 9 http ><10> +< sexy photo ><10> +< submissive ><10> +< joli ><10> +< hard amateur ><10> +< nieuw in ><10> +< name content country ><10> +< videos webcams ><10> +< refresh content free ><10> +< sadisme ><10> +< all name generator ><10> +< lekker ><10> +< amateur photo ><10> +< hardcore charme ><10> +< rated ><10> +< name public content ><10> +< un couple libertin ><10> +< foto fotos ><10> +< defloration ><10> +< ne 1 nh ><10> +< exporter name ><10> +< dortoir ><10> +< sm bondage ><10> +< males ><10> +< content fotos ><10> +< trans transsexuel ><10> +< xxx pics ><10> +< raped ><10> +< blondes brunes ><10> +< blondes brunettes ><10> +< voyeur voyeurs voyeurisme ><10> +< playmates ><10> +< panty ><10> +< raped girls ><10> +< brune rousse ><10> +< soft hard ><10> +< joli jolie ><10> +< amateurs lesbiennes ><10> +< sodomie chatte ><10> +< fkk ><10> +< big tits ><10> +< cuir latex ><10> +< naughty ><10> +< name public ><10> +< videos sex shop ><10> +< photos filles ><10> +< lc 1 na ><10> +< femmes http equiv ><10> +< devoile ><10> +< dagen ><10> +< description content lingerie ><10> +< mignonnes ><10> +< nues gratuit ><10> +< porno gratuit photos ><10> +< ni 1 oz ><10> +< cash name keywords ><10> +< content sex shop ><10> +< x porno ><10> +< content free name ><10> +< petites annonces rencontre ><10> +< content country content ><10> +< sodomies ><10> +< sexe gratuit name ><10> +< femmes http ><10> +< filles ><10> +< photos gratuites ><10> +< charme ><10> +< content amateur ><10> +< pornographie ><10> +< slave ><10> +< nudite ><10> +< nu nue ><10> +< nd 1 ne ><10> +< asiatiques ><10> +< amateur de ><10> +< babes ><10> +< pornography ><10> +< casta ><10> +< lesbos ><10> +< videos et ><10> +< bra ><10> +< live sex ><10> +< sensual ><10> +< seins nichons ><10> +< dominatrice ><10> +< videos xxx ><10> +< fr r n ><10> +< hot ><10> +< videos de ><11> +< lingerie fine ><11> +< 1 ne 1 ><11> +< 1 ne ><11> +< lesbians ><11> +< rousse ><11> +< mecs ><11> +< adultes ><11> +< nd 1 ><11> +< teen ><11> +< nd ><11> +< beautiful girl ><11> +< free rape stories ><11> +< content sexo ><11> +< online dating ><11> +< site x ><11> +< sat 16 ><11> +< sexe name dc ><11> +< cochones ><11> +< escortes ><11> +< sex porn ><11> +< author content wicr ><11> +< sexy girls ><11> +< de sex ><11> +< bh ><11> +< gratis sex ><11> +< porno de ><11> +< couple libertin ><11> +< 16 mar ><11> +< sucking ><11> +< sexe francais ><11> +< topic content sexe ><11> +< author content sexe ><11> +< model models ><11> +< plaatjes amateur ><11> +< sex toys ><11> +< voyeurs voyeurisme ><11> +< femme sexy ><11> +< jpg jpeg gif ><11> +< masturberen ><11> +< rape real ><11> +< sexe voyeur ><11> +< anal rape pics ><11> +< true rape ><11> +< erotiques erotisme ><11> +< content wicr ><11> +< sat 16 mar ><11> +< pisse ><11> +< wicr name publisher ><11> +< couples rencontres ><11> +< nudist ><11> +< high heels ><11> +< perversion ><11> +< vicieux ><11> +< adriana ><11> +< video sex ><11> +< lul ><11> +< xxx x ><11> +< shemales ><11> +< content sat 16 ><11> +< copines ><11> +< scato ><11> +< wife ><11> +< adulte name ><11> +< neuken pijpen ><11> +< anal rape ><11> +< annuaire sites ><11> +< free gay ><11> +< publisher content wicr ><11> +< cumshot ><11> +< de cul videos ><11> +< godmichet ><11> +< wicr name distribution ><11> +< gay rape ><11> +< ejaculations ><11> +< russian rape ><11> +< rdv ><11> +< girls photos ><11> +< pipe fellation ><11> +< wicr ><11> +< 16 mar 2002 ><11> +< prives ><11> +< nibard ><11> +< wicr name ><11> +< content wicr name ><11> +< young teen ><11> +< free rape movies ><11> +< mazo ><11> +< fantasme ><11> +< forced ><11> +< swinger ><11> +< porno hard ><11> +< du cul ><11> +< gays lesbiennes ><11> +< drague ><11> +< sexe shop ><11> +< x xx ><11> +< vibrator ><11> +< non nude ><11> +< annuaire sexe ><11> +< x xx xxx ><11> +< jambes ><11> +< nudity ><11> +< gay gays ><11> +< erotisme erotique ><11> +< gay lesbiennes ><11> +< grosse ><11> +< femme homme ><11> +< content du ><11> +< breast ><11> +< oral ><11> +< lolita ><11> +< seks ><11> +< sexy ><11> +< string ><11> +< keywords content amateur ><11> +< et videos ><11> +< sexe sexe ><11> +< grosses ><11> +< adult sex ><11> +< content adult name ><11> +< sexe en ><11> +< topless ><11> +< verge ><11> +< photos x ><11> +< photo amateur ><11> +< 4 l 4 ><11> +< oh 1 ca ><11> +< swingers ><11> +< free porn ><11> +< de femmes ><11> +< for windows name ><11> +< du sexe ><11> +< na ><11> +< erotica ><11> +< sex name ><11> +< sex ><11> +< gratuit sexy ><11> +< transexuelles ><11> +< 2 1 0 ><11> +< fetichisme mangas echangisme ><11> +< sexpagina ><11> +< paradis ><11> +< amateur porn ><11> +< amateurs poil voyeurs ><11> +< webcames exhibitionniste art ><11> +< exhibition videos webcames ><11> +< x acteurs celebrites ><11> +< talons aiguilles liveshows ><11> +< pornos transsexuel bresilien ><11> +< flirt hermaphrodites ><11> +< acteurs celebrites films ><11> +< origines bizarre bois ><11> +< magazines sexshop ><11> +< webcames exhibitionniste ><11> +< sex magazines sexshop ><11> +< rencontres revues photos ><11> +< acteurs celebrites ><11> +< fist fucking ><11> +< revenus liens photographies ><11> +< boutiques xxx ><11> +< virginity ><11> +< ver 2 1 ><11> +< content adultes ><11> +< voluntary content rating ><11> +< nudism ><11> +< magazines sexshop lingerie ><11> +< teen teen ><11> +< litterature erotiques livres ><11> +< hermaphrodites godemichets vibrateurs ><11> +< pubis ><11> +< bdsm echangiste ><11> +< voyeurisme exhibition videos ><11> +< ca 1 la ><11> +< pics and ><11> +< voluntary ><11> +< boutiques xxx sexy ><11> +< r ca ><11> +< photos pornos transsexuel ><11> +< desnudas ><11> +< homos ><11> +< erotique erotisme clubs ><11> +< videos sex magazines ><11> +< site de rencontre ><11> +< sexy flirt ><11> +< pornos transsexuel ><11> +< partouse ><11> +< celebrites films ><11> +< dvd rencontres revues ><11> +< aiguilles liveshows ><11> +< moule ><11> +< amateurs poil ><11> +< sites xxx ><11> +< photos erotiques ><11> +< content erotik name ><11> +< transsexuel bresilien ><11> +< fetichisme mangas ><11> +< videos webcames ><11> +< liveshows sexe ><11> +< cul name copyright ><11> +< aiguilles liveshows sexe ><11> +< liveshows sexe gratuit ><11> +< xxx sexy flirt ><11> +< nues name ><11> +< fine boutiques ><11> +< teton ><11> +< bizarre bois ><11> +< exhibition videos ><11> +< content sexe sexe ><11> +< mangas echangisme fessee ><11> +< transsexuels ><11> +< alt ><11> +< r ca 1 ><11> +< voluntary content ><11> +< sex site ><11> +< name voluntary ><11> +< maso bdsm echangiste ><11> +< life rape ><11> +< litterature erotiques ><11> +< revues photos ><11> +< revues photos hard ><11> +< de cul name ><11> +< bresilien cul bite ><11> +< content sex sexe ><11> +< bresilien cul ><11> +< vrijen ><11> +< amateurs amatrices ><11> +< com sexe en ><11> +< bizarre bois de ><11> +< flirt hermaphrodites godemichets ><11> +< webcames ><11> +< jeune jeunes ><11> +< sexy flirt hermaphrodites ><11> +< leder ><11> +< gouines ><11> +< rasee ><11> +< liens sites ><11> +< lesbian rape ><11> +< jpeg gif ><11> +< 1 0 html ><11> +< content rating content ><11> +< rencontres revues ><11> +< femme nue ><11> +< cruel rape ><11> +< site de cul ><11> +< free gratis ><11> +< homme transformer ><11> +< erotiques livres ><11> +< liens photographies ><11> +< rapist ><11> +< lingerie fine boutiques ><11> +< erotiques livres x ><11> +< hermaphrodites godemichets ><11> +< photos amateurs poil ><11> +< site amateur ><11> +< penis fetichisme mangas ><11> +< celebrites films de ><11> +< liens photographies xxx ><11> +< real life rape ><11> +< hard photos ><11> +< sex magazines ><11> +< videos webcames exhibitionniste ><11> +< content couple ><11> +< cd dvd rencontres ><11> +< fine boutiques xxx ><11> +< name voluntary content ><11> +< charme lingerie ><11> +< transsexuel bresilien cul ><11> +< mangas echangisme ><11> +< art erotique erotisme ><11> +< dvd rencontres ><11> +< videos video ><11> +< pic ><11> +< photos videos ><11> +< lingerie ><11> +< photos et ><11> +< nf ><11> +< keywords content adult ><11> +< 4 v 4 ><11> +< charmes ><11> +< video sexe ><11> +< sexe hard ><11> +< jpg jpeg ><11> +< ressources webmasters ><11> +< revenus ><11> +< 100 sexe ><11> +< lesbienne ><11> +< photos et videos ><11> +< sex free ><11> +< bang ><11> +< 1 ni ><11> +< ni 1 ><11> +< 1 ni 1 ><11> +< strip tease ><11> +< upskirt ><11> +< vagina ><11> +< putain ><11> +< escorte ><11> +< rape stories ><11> +< association gay ><11> +< rape videos ><11> +< et sexe ><11> +< exibition ><11> +< rape free rape ><11> +< rape girls pics ><11> +< fisting ><11> +< chat live ><11> +< charme sexy ><11> +< content escort ><11> +< pornstar ><11> +< partouzes ><11> +< preteen model ><11> +< sexshop lingerie fine ><11> +< sexo gratis ><11> +< video x ><11> +< tienersex ><11> +< girls pics ><11> +< site gay ><11> +< matures ><11> +< beurettes ><11> +< brunettes ><11> +< xxx sex ><11> +< analsex ><11> +< 18 ans ><11> +< videos movies ><11> +< description content adult ><11> +< bites ><11> +< exhibition exhibitionniste ><11> +< de sexo ><11> +< echangisme echangiste ><11> +< branle ><11> +< lesbiennes lesbienne ><11> +< couples echangistes ><11> +< gang ><12> +< nude ><12> +< amateurs ><12> +< lingerie sexy ><12> +< videos porno ><12> +< porno sex ><12> +< adult name ><12> +< underwear ><12> +< voyeurisme exhibition ><12> +< plaisirs ><12> +< photos de sexe ><12> +< photos sexe ><12> +< violent ><12> +< a poil ><12> +< echangistes ><12> +< baiser ><12> +< xxx ><12> +< teens ><12> +< babe ><12> +< couple echangiste ><12> +< escorts ><12> +< xxx name ><12> +< penthouse ><12> +< threesome ><12> +< rating content adult ><12> +< description content rape ><12> +< real rape ><12> +< porn name ><12> +< francophone photos ><12> +< godemichet ><12> +< porn porno ><12> +< celebrites nues ><12> +< cumshots ><12> +< nackt ><12> +< cul photos ><12> +< chicas ><12> +< gratuits photographies ><12> +< uniform rape ><12> +< cunt ><12> +< libertines ><12> +< sperm ><12> +< fellation sodomie ><12> +< gratuit webcam ><12> +< transsexuelles ><12> +< gratuit photos videos ><12> +< pornos gratuits photographies ><12> +< clara morgane ><12> +< francophone photos pornos ><12> +< la 1 og ><12> +< hard video ><12> +< sensualite ><12> +< sex amateur ><12> +< rape girls ><12> +< porno francophone photos ><12> +< blowjobs ><12> +< amateur ><12> +< nc ><12> +< uniform ><12> +< porno name ><12> +< cruel ><12> +< boobs ><12> +< content porno ><12> +< oh 1 cz ><12> +< tease ><12> +< sexes ><12> +< couples ><12> +< fuck ><12> +< ng ><12> +< chaudes ><12> +< sensuelle ><12> +< dialogues en ><12> +< nue nues ><12> +< cul videos ><12> +< free fr r ><12> +< rape pictures ><12> +< teen models ><12> +< fetichiste ><12> +< interracial ><12> +< cul chatte ><12> +< erotik name ><12> +< description content sex ><12> +< gratuit porno gratuit ><12> +< violate ><12> +< sites x ><12> +< poitrines ><12> +< tetons ><12> +< suceuses ><12> +< jouissance ><12> +< rape name ><12> +< transformer pute ><12> +< porn sex ><12> +< fr name page ><12> +< sodomie race ><12> +< rape name keywords ><12> +< bisex ><12> +< rape gallery ><12> +< rencontres coquines ><12> +< live shows ><12> +< videos hard ><12> +< bite couilles gay ><12> +< photos rape ><12> +< beffen ><12> +< couilles gay lesbiennes ><12> +< never name language ><12> +< video amateur ><12> +< vibromasseur ><12> +< sodomie race origines ><12> +< sodo sodomie race ><12> +< explicit ><12> +< webcam x ><12> +< transformer pute putain ><12> +< subject content sexe ><12> +< vaginal ><12> +< nb ><12> +< adulte ><12> +< dialogues ><12> +< lesbiennes ><12> +< com r na ><12> +< keywords content rencontre ><12> +< nichon ><12> +< transsexuel ><12> +< blondes ><12> +< free sex ><12> +< pipes ><12> +< nus ><12> +< sexe ><12> +< gays ><12> +< heteros gays lesbiennes ><12> +< heteros gays ><12> +< 3 v 0 ><12> +< avec ses boutiques ><12> +< ses accessoires derniers ><12> +< un couple ><12> +< sexe http ><12> +< pour adultes ><12> +< blonde brune ><12> +< photos amateurs name ><12> +< true for free ><12> +< cul gratuit ><12> +< ses boutiques x ><12> +< trav ><12> +< sites pornos gratuits ><12> +< sa superbe ><12> +< flirt ses ><12> +< sexe en direct ><12> +< superbe galerie photos ><12> +< sexe heteros ><12> +< ou flirt ses ><12> +< hard hardcore ><12> +< et sa superbe ><12> +< sexe gratuit porno ><12> +< oh 1 vz ><12> +< bitte ><12> +< heels ><12> +< adultes name ><12> +< sexe http equiv ><12> +< sexshop lingerie ><12> +< ses accessoires ><12> +< 8859 1 sexe ><12> +< couilles gay ><12> +< cri et sa ><12> +< 1 sexe ><12> +< hard avec ses ><12> +< lesbiennes transexuels hard ><12> +< transexuels hard avec ><12> +< naturiste ><12> +< amateur sex ><12> +< sa superbe galerie ><12> +< sexe sexes ><12> +< 100 sexe heteros ><12> +< flirt ses accessoires ><12> +< sperma ><12> +< sexe heteros gays ><12> +< gays lesbiennes transexuels ><12> +< morgane ><12> +< maitresse ><12> +< thongs ><12> +< kut ><12> +< superbe galerie ><12> +< sodomiser ><12> +< ses boutiques ><12> +< sexe photos ><12> +< neuken ><12> +< poitrine ><12> +< gratuit sexe ><12> +< escort ><13> +< sexe sex ><13> +< dessous ><13> +< fucking ><13> +< chattes ><13> +< brunette ><13> +< anale ><13> +< panties ><13> +< uro ><13> +< girl girls ><13> +< ng 1 ><13> +< 1 0 for ><13> +< playboy ><13> +< 2002 gmt ><13> +< sexo ><13> +< transexuelle ><13> +< domina ><13> +< galerie photos amateurs ><13> +< sexe name keywords ><13> +< cul name ><13> +< culs ><13> +< facial ><13> +< piss ><13> +< young girls ><13> +< geilste ><13> +< double penetration ><13> +< sexe sex sexy ><13> +< pornos gratuits ><13> +< rape free ><13> +< rape movies ><13> +< x gratuites ><13> +< thong ><13> +< lesbiennes transexuels ><13> +< pretty ><13> +< latex ><13> +< tgp ><13> +< gratuit photo ><13> +< content rencontre ><13> +< free pics ><13> +< 1 og ><13> +< 1 og 1 ><13> +< og 1 ><13> +< tits ><13> +< se passe ><13> +< content amateur de ><13> +< transsexuelle ><13> +< la 1 oz ><13> +< outrageous ><13> +< gouine ><13> +< rape porn ><13> +< foufoune ><13> +< content rape ><13> +< rape photos ><13> +< avec ses ><13> +< rape galleries ><13> +< breasts ><13> +< mar 2002 ><13> +< gmt name description ><13> +< mar 2002 gmt ><13> +< cock ><13> +< videos photos ><13> +< seins ><13> +< sm ><13> +< rape ><13> +< topic content erotik ><13> +< de boulogne pipe ><13> +< boulogne pipe sucer ><13> +< poil voyeurs orgie ><13> +< poil voyeurs ><13> +< voyeurs orgie voyeurisme ><13> +< rape sex ><13> +< erotisme clubs videos ><13> +< orgie voyeurisme ><13> +< amateur name ><13> +< origines bizarre ><13> +< xxx gratuites xxx ><13> +< sexe porno francophone ><13> +< knife ><13> +< l 4 name ><13> +< erotisme clubs ><13> +< avaler levrette ><13> +< sadism ><13> +< cul bite couilles ><13> +< brutality ><13> +< race origines ><13> +< pd ><13> +< femmes nues ><13> +< stars nues ><13> +< pipe sucer avaler ><13> +< humilation ><13> +< 15 mar 2002 ><13> +< hoeren ><13> +< gratuit photos amateurs ><13> +< zoophilie ><13> +< race origines bizarre ><13> +< penis fetichisme ><13> +< boulogne pipe ><13> +< 15 mar ><13> +< slut ><13> +< voyeurs orgie ><13> +< photographies xxx gratuites ><13> +< libertins ><13> +< teen model ><13> +< orgie voyeurisme exhibition ><13> +< pre teen ><13> +< encule ><13> +< sucer avaler levrette ><13> +< pics free ><13> +< fri 15 mar ><13> +< 1 ng 1 ><13> +< exhibition ><13> +< 1 ng ><13> +< amateur de sexe ><13> +< chaude ><13> +< ici ! ><13> +< pornographique ><13> +< hard ><13> +< ni 1 vz ><13> +< fetish ><14> +< description content du ><14> +< nb 1 ><14> +< com 40232 49002 ><14> +< sucer avaler ><14> +< tieten ><14> +< irc sado ><14> +< fetisch ><14> +< liveshow ><14> +< livres x acteurs ><14> +< webmasters revenus ><14> +< ligne irc sado ><14> +< godemichets vibrateurs ><14> +< site 100 sexe ><14> +< exhibitionniste art ><14> +< clubs videos ><14> +< cedex 01 france ><14> +< irc sado maso ><14> +< derniers cri et ><14> +< cedex 01 ><14> +< webmasters revenus liens ><14> +< 01 france ><14> +< gratuites xxx ><14> +< bois de boulogne ><14> +< accessoires derniers cri ><14> +< echangisme fessee ><14> +< victim ><14> +< keywords content lingerie ><14> +< revenus liens ><14> +< hermaphrodites ><14> +< x acteurs ><14> +< godemichets vibrateurs ressources ><14> +< mouille ><14> +< sado maso bdsm ><14> +< fessee talons ><14> +< 49002 angers ><14> +< exhibitionniste art erotique ><14> +< transexuels hard ><14> +< com 40232 ><14> +< ligne irc ><14> +< echangisme fessee talons ><14> +< photographies xxx ><14> +< maso bdsm ><14> +< en ligne irc ><14> +< rape pics ><14> +< sexy ou flirt ><14> +< fri 15 ><14> +< derniers cri ><14> +< ressources webmasters revenus ><14> +< 40232 ><14> +< kidnapping ><14> +< boutiques x sexy ><14> +< cri et ><14> +< x sexy ou ><14> +< angers cedex 01 ><14> +< vibrateurs ressources webmasters ><14> +< vibrateurs ressources ><14> +< 49002 angers cedex ><14> +< accessoires derniers ><14> +< kinky ><14> +< angers cedex ><14> +< nues photos ><14> +< branler ><14> +< pipe sucer ><14> +< fessee talons aiguilles ><14> +< content adulte ><14> +< erotische ><14> +< 40232 49002 ><14> +< content site 100 ><14> +< ou flirt ><14> +< clubs videos sex ><14> +< 49002 ><14> +< 40232 49002 angers ><14> +< content fri 15 ><14> +< erotisme ><14> +< brune ><14> +< bite ><14> +< godes ><14> +< exhib ><14> +< la 1 lb ><14> +< bite couilles ><14> +< preteen ><14> +< kutjes ><14> +< cunnilingus ><14> +< boutiques x ><14> +< content lingerie ><14> +< porno francophone ><14> +< libertine ><14> +< sadomaso ><14> +< brutal ><14> +< sites pornos ><14> +< xxx gratuites ><14> +< content sexy ><14> +< foutre ><14> +< mistress ><14> +< livres x ><14> +< transexuel ><14> +< porno gratuit ><14> +< striptease ><14> +< blacks ><14> +< sexe webcam ><14> +< 1 nd ><14> +< 1 nd 1 ><14> +< sexe gratuit photos ><14> +< 4 v 0 ><14> +< bizarre ><14> +< dialogues en ligne ><14> +< mures ><14> +< description content sexe ><14> +< vicieuse ><14> +< cunilingus ><14> +< video porno ><14> +< jolies ><14> +< art erotique ><14> +< horny ><14> +< rape rape ><14> +< sexy ou ><14> +< gratuit porno ><14> +< pipe ><14> +< fesses ><14> +< coquines ><14> +< oh ><14> +< nb 1 nc ><14> +< erotic ><14> +< erotik ><14> +< fetichisme ><14> +< content web studio ><14> +< web studio version ><14> +< 2002 gmt name ><14> +< cum ><14> +< gratuit hard ><14> +< studio version 1 ><14> +< web studio ><14> +< studio version ><14> +< x sexy ><14> +< couille ><14> +< lecher ><14> +< maniac ><14> +< tieners ><14> +< hard soft ><14> +< sex pictures ><14> +< filles nues ><14> +< porno ><14> +< poil ><14> +< sex shop ><14> +< og 1 oh ><14> +< 1 nc 1 ><14> +< 1 nc ><14> +< sexe porno ><14> +< content adult ><14> +< 4 v ><14> +< s 4 v ><14> +< s 4 ><14> +< amateurs name keywords ><14> +< sodo sodomie ><14> +< cz 1 la ><14> +< suce ><14> +< mure ><14> +< vibro ><14> +< geil ><14> +< fellations ><14> +< sex sexy ><15> +< domination ><15> +< nc 1 ><15> +< nh ><15> +< pute ><15> +< godemichets ><15> +< heteros ><15> +< felation ><15> +< pijpen ><15> +< hard avec ><15> +< anaal ><15> +< branlette ><15> +< spanking ><15> +< nue ><15> +< content sexe porno ><15> +< amateurs name ><15> +< adultissime com ><15> +< content sexe gratuit ><15> +< adultissime ><15> +< pissing ><15> +< punishment ><15> +< rousses ><15> +< nichons ><15> +< 1 la ><15> +< gros seins ><15> +< 4 s 4 ><15> +< adult ><15> +< jouir ><15> +< talons ><15> +< 1 na 1 ><15> +< site 100 ><15> +< talons aiguilles ><15> +< 1 na ><15> +< chienne ><15> +< gratuit photos ><15> +< amatrice ><15> +< keywords content sex ><15> +< liveshows ><15> +< videos x ><15> +< ejac ><15> +< n 4 ><15> +< 4 s ><15> +< r n 4 ><15> +< n 4 s ><15> +< echangisme ><15> +< strip ><15> +< coquine ><15> +< oh 1 ><15> +< 1 oh ><15> +< 1 oh 1 ><15> +< content sex ><15> +< baise sperme ><15> +< bang porno ejaculation ><15> +< photos webcam rencontre ><15> +< rencontre salope chatte ><15> +< ejaculation femme cochonne ><15> +< videos sex gratuit ><15> +< fellation pipe pute ><15> +< webcam photos videos ><15> +< gratuit hard fellation ><15> +< nympho suceuse baise ><15> +< suceuse baise sperme ><15> +< amateur hard crade ><15> +< levrette ><15> +< sexe webcam photos ><15> +< rencontre se ><15> +< content mature name ><15> +< de sexe webcam ><15> +< anal rencontre salope ><15> +< cochonne sodomie chienne ><15> +< passe ici ><15> +< sodomie chienne nympho ><15> +< hard fellation pipe ><15> +< films de ><15> +< rencontre se passe ><15> +< hard crade videos ><15> +< fist gang ><15> +< pute anal ><15> +< porno ejaculation femme ><15> +< webcam rencontre se ><15> +< nympho suceuse ><15> +< webcam photos ><15> +< rencontre salope ><15> +< films de cul ><15> +< femme cochonne sodomie ><15> +< salope chatte ><15> +< du vrai ><15> +< passe ici ! ><15> +< sexe amateur hard ><15> +< cochonne sodomie ><15> +< pute anal rencontre ><15> +< porno ejaculation ><15> +< sex gratuit hard ><15> +< salope chatte fist ><15> +< ejaculation femme ><15> +< chatte fist gang ><15> +< cul bite ><15> +< gang bang porno ><15> +< content du vrai ><15> +< vrai sexe amateur ><15> +< chienne nympho suceuse ><15> +< crade videos photos ><15> +< pipe pute ><15> +< se passe ici ><15> +< du vrai sexe ><15> +< photos hard ><15> +< suceuse baise ><15> +< chatte fist ><15> +< chienne nympho ><15> +< vrai ><15> +< pipe pute anal ><15> +< fist gang bang ><15> +< photos videos sex ><15> +< bang porno ><15> +< hard fellation ><15> +< sodomie chienne ><15> +< vrai sexe ><15> +< crade videos ><15> +< nc 1 nd ><15> +< voyeur ><16> +< femme cochonne ><16> +< mature name ><16> +< x xxx ><16> +< anal rencontre ><16> +< hard crade ><16> +< ici ! name ><16> +< amateur hard ><16> +< gang bang ><16> +< sex gratuit ><16> +< hardcore ><16> +< keywords content sexe ><16> +< erotique erotisme ><16> +< coquin ><16> +< nympho ><16> +< l 4 http ><16> +< clito ><16> +< webcam rencontre ><16> +< gangbang ><16> +< cochonnes ><16> +< content erotik ><16> +< couilles ><16> +< r na ><16> +< r na 1 ><16> +< l 4 ><16> +< 0 l 4 ><16> +< pussy ><16> +< crade ><16> +< fessee ><16> +< geile ><16> +< videos photos webcam ><16> +< live show ><16> +< orgie ><16> +< exhibitionniste ><16> +< rating content mature ><16> +< avaler ><16> +< ng 1 nh ><16> +< mature ><16> +< fellation pipe ><16> +< queue ><16> +< brunes ><16> +< fesse ><16> +< blowjob ><16> +< amatrices ><16> +< penetration ><16> +< cochonne ><16> +< erotiques ><16> +< sexe amateur ><16> +< cul ><16> +< flirt ><16> +< travestis ><16> +< photos webcam ><16> +< sexe name ><16> +< content mature ><16> +< nh 1 ni ><16> +< de cul ><17> +< rapes ><17> +< erotique ><17> +< chatte ><17> +< enculer ><17> +< porn ><17> +< sado maso ><17> +< gode ><17> +< nh 1 ><17> +< 1 nh 1 ><17> +< 1 nh ><17> +< anus ><17> +< voyeurs ><17> +< photos amateurs ><17> +< masturbation ><17> +< photos pornos ><17> +< transexuels ><17> +< sodo ><17> +< maso ><17> +< bdsm ><17> +< content sexe ><17> +< fist ><17> +< voyeurisme ><17> +< anal ><17> +< bondage ><18> +< vz 1 la ><18> +< vagin ><18> +< suceuse ><18> +< free rape ><18> +< libertin ><18> +< photo video ><18> +< dildo ><18> +< na 1 nb ><18> +< nf 1 ng ><18> +< sexshop ><18> +< salopes ><18> +< ne 1 nf ><18> +< de sexe ><18> +< 1 nb ><18> +< penis ><18> +< 1 nb 1 ><18> +< na 1 ><18> +< 1 nf ><18> +< 1 nf 1 ><18> +< nf 1 ><18> +< videos sex ><18> +< partouze ><18> +< clitoris ><18> +< sucer ><19> +< ejaculation ><19> +< 1 la 1 ><19> +< sado ><19> +< nues ><19> +< la 1 ><19> +< sexe gratuit ><19> +< echangiste ><20> +< pornos ><20> +< sperme ><20> +< sodomie ><20> +< salope ><21> +< baise ><22> +< fellation ><23> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/news/weighted b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/news/weighted new file mode 100644 index 0000000000000000000000000000000000000000..8758b7142ce06dcca59602b8fb209e72197422c0 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/news/weighted @@ -0,0 +1,67 @@ +# +# Phraselists to block news websites +# Originally created by Fernand Jonker +# +# This list is seriously ALPHA - it blocks many pages, but may overblock. +# This list has NOT been tested in a production environment! +# If you use this list please send feedback to phrasemaster@dansguardian.org +# Waiting for input :-) +# + +#listcategory: "News" + +<cnn.com><100> +<local news><30> + +<business>,<art>,<local>,<weather>,<world>,<entertainment><50> +<world>,<business>,<sports>,<science><50> +<sci>,<tech><30> +<news>,<entertainment><20> +<top stories><50> +<in the news><50> +<news>,<front page><50> +<bbc news><50> +<Week at a Glance><50> +<week in pictures><50> +<top stories><50> +<in pictures><20> +<interactive>,<news><30> +<complete coverage>,<news><40> +<biography>,<news><20> +<columnists>,<news><20> +<classifieds>,<news><20> + +<newspaper online><40> +<news>,<report><20> +<news>,<solicitor><30> +<national news><50> +<news>,<article><30> +<news headlines><50> +<news>,<interview><50> +<news>,<lawyer><30> +<breaking headlines><30> +<breaking news><30> +<international news><20> +<latest news><50> +<sun newspaper><50> +<world news><20> + +<editor><30> +<world>,<headline><30> + +<business news><50> +<entertainment news><50> +<national news><50> + +<canadian press><30> +<reuters><30> +<Associated Press><30> +<United Press International><30> + +<times >,<news><50> +< post >,<news><50> +< telegraph >,<news><50> +< daily mail >,<news><50> +<tribune><50> +<herald><50> +<star>,<news><50> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/nudism/weighted b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/nudism/weighted new file mode 100644 index 0000000000000000000000000000000000000000..7a4ea496d75c8688421914d903768f1012db6f92 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/nudism/weighted @@ -0,0 +1,30 @@ +# +# Phraselists to block nudism/naturaism sites +# Created by Fernand Jonker +# + +#listcategory: "Nudism" + +<clothes-free><30> +<clothing optional><30> +< naturism ><30> +< naturist ><30> +<naturists and nudists><80> +<nekkid><20> +<nude beach ><30> +<nude beaches ><30> +<nude hik><30> +<nude recreation><30> +<nudism><30> +<nudism ring><40> +<nudist><30> +<nudists paradise><70> +<nudists-paradise><70> +< nudity><20> +<visual depiction>,<nude><50> +<visual depiction>,<nudist><50> + +#Site Names +<darebare><30> +<cybernude><30> +<holy nature><50> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/peer2peer/weighted b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/peer2peer/weighted new file mode 100644 index 0000000000000000000000000000000000000000..c29ced2bd616126893accc342e239570b36b936e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/peer2peer/weighted @@ -0,0 +1,53 @@ +# +# Phraselists to block Peer to Peer websites +# Originally Created by Fernand Jonker +# +# This list is seriously ALPHA - it blocks many pages, but may overblock. +# This list has NOT been tested in a production environment! +# If you use this list please send feedback to phrasemaster@dansguardian.org +# Waiting for input :-) +# + +#listcategory: "Peer-to-peer" + +#Applications +<applejuice><20> +< ares><20> +<areslite><20> +<azureus><20> +<bearshare><20> +<bitcomet><20> +<dshare><20> +< direct connect ><20> +<edonkey><20> +<emule><20> +<grobster><20> +<grokster><20> +<gnotella><20> +<gnucleus><20> +<imesh><20> +<kademlia><20> +<kazaaliteressurection><20> +<kazaa><20> +<kazaalite><20> +<klite><20> +<limewire><20> +<morpheus><20> +<mutella><20> +< phex><20> +<qtella><20> +<shareaza><20> +<soulseek><20> +<swapper><20> +<toad node><20> +<winmx><20> +<xolox><20> + +#Networks +<ed2k ><20> +<direct-connect><20> +< fasttrack ><20> +<gnutella ><20> +<kad ><20> +<opennap><20> +<overnet><20> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/personals/weighted b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/personals/weighted new file mode 100644 index 0000000000000000000000000000000000000000..8eb9916365bd8435a19fb2c87d799cd8ea9964d0 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/personals/weighted @@ -0,0 +1,56 @@ +#listcategory: "Personals" + +<adult personals><60> +<browse men><20> +<browse women><20> +<couples seeking couples><10> +<couples seeking men><10> +<couples seeking women><10> +<cupid report><30> +<cupid search><30> +<dating guide><10> +<dating service><30> +<dating site><30> +<discreet relationship><20> +<find your perfect match><20> +<find your perfect partner><20> +<for single men and women><20> +<friend finder><20> +<friendfinder><30> +<friendfinder handle><30> +<gay personals><30> +<i am a>,<man>,<woman>,<looking for a><60> +<ideal partner><10> +<largest dating site><30> +<largest singles site><50> +<lesbian personals><30> +<meeting men><10> +<meeting women><10> +<meet someone special><20> +<men seeking couples><10> +<men seeking men><10> +<men seeking women><10> +<online dating><30> +<personal ad><40> +<.personals><60> +<personals community><20> +<personals>,<dating>,<romance>,<marriage><30> +<personals>,<matchmaking><20> +<personals network><30> +<personals>,<success stories><30> +<personals>,<success story><30> +<personals>,<testimonial><30> +<photo personals><30> +<photo search>,<personals><30> +<search>,<dating>,<join>,<ideal partner><60> +<search for your ideal partner><50> +<search personals><30> +<seeking casual sex><30> +<seeking romance><10> +<singles online><30> +<singles site><30> +<swingers directory><50> +<women seeking couples><10> +<women seeking men><10> +<women seeking women><10> +<yahoo! personals><30> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/personals/weighted_portuguese b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/personals/weighted_portuguese new file mode 100644 index 0000000000000000000000000000000000000000..e2e52975ce01c90f8f27888b2269757aaa84d97d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/personals/weighted_portuguese @@ -0,0 +1,204 @@ +#listcategory: "Personals (Portuguese)" + +< páginas pessoais adultas><60> +< páginas pessoais de adultos><60> +< páginas pessoais para adultos><60> +< procurar mulheres><20> +< procurar homens><20> +< casal procura casal><10> +< casal procura homem><10> +< casal procura homens><10> +< casal procura mulher><10> +< cupido>,<agência><30> +< cupido>,< busca><30> +< cupido>,< procura><30> +< guia de encontro><10> +< guia para encontro><10> +< serviço de encontro><10> +< serviços de encontro><10> +< serviço para encontro><10> +< serviços para encontro><10> +< site para encontro><30> +< guia de namoro><10> +< guia para namoro><10> +< serviço de namoro><10> +< serviços de namoro><10> +< serviço para namoro><10> +< serviços para namoro><10> +< site para namoro><30> +< relação discreta><30> +< relacionamento discreto><20> +< encontrar o par perfeito><20> +< encontrar seu par perfeito><20> +< encontrar o seu par perfeito><20> +< encontrar o parceiro perfeito><20> +< encontrar seu parceiro perfeito><20> +< encontrar o seu parceiro perfeito><20> +< encontrar a parceira perfeita><20> +< encontrar sua parceira perfeita><20> +< encontrar a sua parceira perfeita><20> +< encontre o par perfeito><20> +< encontre seu par perfeito><20> +< encontre o seu par perfeito><20> +< encontre o parceiro perfeito><20> +< encontre seu parceiro perfeito><20> +< encontre o seu parceiro perfeito><20> +< encontre a parceira perfeita><20> +< encontre sua parceira perfeita><20> +< encontre a sua parceira perfeita><20> +< para homens e mulheres solteiras><20> +< para homens e mulheres solteiros><20> +< páginas pessoais gays><20> +< páginas pessoais de gays><20> +< páginas pessoais para gays><20> +< parceiro ideal><10> +< parceira ideal><10> +< maior site de encontro><30> +< maior site para encontro><30> +< maior site de solteir><30> +< melhor site de encontro><30> +< melhor site para encontro><30> +< melhor site de solteir><30> +< maior site de namoro><30> +< maior site para namoro><30> +< melhor site de namoro><30> +< melhor site para namoro><30> +< páginas pessoais lésbicas><20> +< páginas pessoais de lésbicas><20> +< páginas pessoais para lésbicas><20> +< encontrar alguém especial><20> +< encontrando alguém especial><20> +< encontre alguém especial><20> +< homem procura casal><10> +< homem procura homem><10> +< homem procura homens><10> +< homem procura mulher><10> +< namoro online><30> +< namoro on-line><30> +< namoro on line><30> +<.pessoais><60> +< pessoal>,< namoro>,< romance>,< casamento><30> +< pessoal>,< namoro>,< romance>,< casamento><30> +< pessoal>,< namoro>,< romance>,< matrimônio><30> +< pessoal>,< namoro>,< romance>,< matrimônio><30> +< pessoal>,< encontro>,< romance>,< casamento><30> +< pessoal>,< encontro>,< romance>,< casamento><30> +< pessoal>,< encontro>,< romance>,< matrimônio><30> +< pessoal>,< encontro>,< romance>,< matrimônio><30> +< pessoais>,< namoro>,< romance>,< casamento><30> +< pessoais>,< namoro>,< romance>,< casamento><30> +< pessoais>,< namoro>,< romance>,< matrimônio><30> +< pessoais>,< namoro>,< romance>,< matrimônio><30> +< pessoais>,< encontro>,< romance>,< casamento><30> +< pessoais>,< encontro>,< romance>,< casamento><30> +< pessoais>,< encontro>,< romance>,< matrimônio><30> +< pessoais>,< encontro>,< romance>,< matrimônio><30> +< busca>,<namoro>,<assinar>,<parceiro ideal><60> +< busca>,<namoro>,<assinar>,<parceira ideal><60> +< busca>,<namoro>,<assine>,<parceiro ideal><60> +< busca>,<namoro>,<assine>,<parceira ideal><60> +< procura>,<namoro>,<assinar>,<parceiro ideal><60> +< procura>,<namoro>,<assinar>,<parceira ideal><60> +< procura>,<namoro>,<assine>,<parceiro ideal><60> +< procura>,<namoro>,<assine>,<parceira ideal><60> +< encontra>,<namoro>,<assinar>,<parceiro ideal><60> +< encontra>,<namoro>,<assinar>,<parceira ideal><60> +< encontra>,<namoro>,<assine>,<parceiro ideal><60> +< encontra>,<namoro>,<assine>,<parceira ideal><60> +< busca>,<encontro>,<assinar>,<parceiro ideal><60> +< busca>,<encontro>,<assinar>,<parceira ideal><60> +< busca>,<encontro>,<assine>,<parceiro ideal><60> +< busca>,<encontro>,<assine>,<parceira ideal><60> +< procura>,<encontro>,<assinar>,<parceiro ideal><60> +< procura>,<encontro>,<assinar>,<parceira ideal><60> +< procura>,<encontro>,<assine>,<parceiro ideal><60> +< procura>,<encontro>,<assine>,<parceira ideal><60> +< encontra>,<encontro>,<assinar>,<parceiro ideal><60> +< encontra>,<encontro>,<assinar>,<parceira ideal><60> +< encontra>,<encontro>,<assine>,<parceiro ideal><60> +< encontra>,<encontro>,<assine>,<parceira ideal><60> +< busca>,<namoro>,<associar>,<parceiro ideal><60> +< busca>,<namoro>,<associar>,<parceira ideal><60> +< busca>,<namoro>,<associe>,<parceiro ideal><60> +< busca>,<namoro>,<associe>,<parceira ideal><60> +< procura>,<namoro>,<associar>,<parceiro ideal><60> +< procura>,<namoro>,<associar>,<parceira ideal><60> +< procura>,<namoro>,<associe>,<parceiro ideal><60> +< procura>,<namoro>,<associe>,<parceira ideal><60> +< encontra>,<namoro>,<associar>,<parceiro ideal><60> +< encontra>,<namoro>,<associar>,<parceira ideal><60> +< encontra>,<namoro>,<associe>,<parceiro ideal><60> +< encontra>,<namoro>,<associe>,<parceira ideal><60> +< busca>,<encontro>,<associar>,<parceiro ideal><60> +< busca>,<encontro>,<associar>,<parceira ideal><60> +< busca>,<encontro>,<associe>,<parceiro ideal><60> +< busca>,<encontro>,<associe>,<parceira ideal><60> +< procura>,<encontro>,<associar>,<parceiro ideal><60> +< procura>,<encontro>,<associar>,<parceira ideal><60> +< procura>,<encontro>,<associe>,<parceiro ideal><60> +< procura>,<encontro>,<associe>,<parceira ideal><60> +< encontra>,<encontro>,<associar>,<parceiro ideal><60> +< encontra>,<encontro>,<associar>,<parceira ideal><60> +< encontra>,<encontro>,<associe>,<parceiro ideal><60> +< encontra>,<encontro>,<associe>,<parceira ideal><60> +< buscar o par perfeito><20> +< buscar seu par perfeito><20> +< buscar o seu par perfeito><20> +< buscar o parceiro perfeito><20> +< buscar seu parceiro perfeito><20> +< buscar o seu parceiro perfeito><20> +< buscar a parceira perfeita><20> +< buscar sua parceira perfeita><20> +< buscar a sua parceira perfeita><20> +< busque o par perfeito><20> +< busque seu par perfeito><20> +< busque o seu par perfeito><20> +< busque o parceiro perfeito><20> +< busque seu parceiro perfeito><20> +< busque o seu parceiro perfeito><20> +< busque a parceira perfeita><20> +< busque sua parceira perfeita><20> +< busque a sua parceira perfeita><20> +< procurar o par perfeito><20> +< procurar seu par perfeito><20> +< procurar o seu par perfeito><20> +< procurar o parceiro perfeito><20> +< procurar seu parceiro perfeito><20> +< procurar o seu parceiro perfeito><20> +< procurar a parceira perfeita><20> +< procurar seu parceira perfeita><20> +< procurar a seu parceira perfeita><20> +< procure o par perfeito><20> +< procure seu par perfeito><20> +< procure o seu par perfeito><20> +< procure o parceiro perfeito><20> +< procure seu parceiro perfeito><20> +< procure o seu parceiro perfeito><20> +< procure a parceira perfeita><20> +< procure seu parceira perfeita><20> +< procure a seu parceira perfeita><20> +< procurando sexo casual><30> +< procurando romance><30> +< procurando um romance><30> +< procurando o romance><30> +< solteiro online><30> +< solteiro on-line><30> +< solteiro on line><30> +< solteiros online><30> +< solteiros on-line><30> +< solteiros on line><30> +< solteira online><30> +< solteira on-line><30> +< solteira on line><30> +< solteiras online><30> +< solteiras on-line><30> +< solteiras on line><30> +<site de solteir><30> +<site para solteir><30> +<sites de solteir><30> +<sites para solteir><30> +< mulher procura casal><10> +< mulher procura homem><10> +< mulher procura homens><10> +< mulher procura mulher><10> + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/pornography/banned b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/pornography/banned new file mode 100644 index 0000000000000000000000000000000000000000..39f24e8d55c5237120ef3969407b183c6b927f3a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/pornography/banned @@ -0,0 +1,6 @@ +#listcategory: "Pornography" + +<family filter is off>,<altavista>,<search> +<google>,<&safe=off> +<hl=en&safe=off&output=search> +<SafeSearch is OFF> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/pornography/banned_portuguese b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/pornography/banned_portuguese new file mode 100644 index 0000000000000000000000000000000000000000..f2413f2ce9799e2bd6b28a8fcf130a6e423f3803 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/pornography/banned_portuguese @@ -0,0 +1,517 @@ +# +# Brazillian Portuguese Porn Banned Phrases +# Originally created by Aecio F. Neto with additions from Allan Gomes +# + +#listcategory: "Pornography (Portuguese)" + +<conteúdo erótico>,<menor de idade>,<saia> +<conteudo erotico>,<menor de idade>,<saia> + +< clique aqui>,< entrar >,<maior de 18 anos> +< clique aqui>,< entrar >,<maior de idade> +< clique aqui>,< entrar >,<mais de 18 anos> + +< destinad>,< adult>,< exclusiv>,<maior de 18 anos> +< destinad>,< adult>,< exclusiv>,<maior de 21 anos> +< destinad>,< adult>,< exclusiv>,<maior de idade> +< destinad>,< adult>,< exclusiv>,<maiores de 18 anos> +< destinad>,< adult>,< exclusiv>,<maiores de 21 anos> +< destinad>,< adult>,< exclusiv>,<mais de 18 anos> +< destinad>,< adult>,< exclusiv>,<mais de 21 anos> +< destinad>,< adult>,< exclusiv>,<menor de 18 anos> +< destinad>,< adult>,< exclusiv>,<menor de 21 anos> +< destinad>,< adult>,< exclusiv>,<menor de idade> +< destinad>,< adult>,< exclusiv>,<menores de 18 anos> +< destinad>,< adult>,< exclusiv>,<menores de 21 anos> +< destinad>,< adult>,< exclusiv>,<menos de 18 anos> +< destinad>,< adult>,< exclusiv>,<menos de 21 anos> + +< destinad>,< adult>,<explícit>,<maior de 18 anos> +< destinad>,< adult>,<explícit>,<maior de 21 anos> +< destinad>,< adult>,<explícit>,<maior de idade> +< destinad>,< adult>,<explícit>,<maiores de 18 anos> +< destinad>,< adult>,<explícit>,<maiores de 21 anos> +< destinad>,< adult>,<explícit>,<mais de 18 anos> +< destinad>,< adult>,<explícit>,<mais de 21 anos> +< destinad>,< adult>,<explícit>,<menor de 18 anos> +< destinad>,< adult>,<explícit>,<menor de 21 anos> +< destinad>,< adult>,<explícit>,<menor de idade> +< destinad>,< adult>,<explícit>,<menores de 18 anos> +< destinad>,< adult>,<explícit>,<menores de 21 anos> +< destinad>,< adult>,<explícit>,<menos de 18 anos> +< destinad>,< adult>,<explícit>,<menos de 21 anos> + +< destinad>,< adult>,<sexo>,<maior de 18 anos> +< destinad>,< adult>,<sexo>,<maior de 21 anos> +< destinad>,< adult>,<sexo>,<maior de idade> +< destinad>,< adult>,<sexo>,<maiores de 18 anos> +< destinad>,< adult>,<sexo>,<maiores de 21 anos> +< destinad>,< adult>,<sexo>,<mais de 18 anos> +< destinad>,< adult>,<sexo>,<mais de 21 anos> +< destinad>,< adult>,<sexo>,<menor de 18 anos> +< destinad>,< adult>,<sexo>,<menor de 21 anos> +< destinad>,< adult>,<sexo>,<menor de idade> +< destinad>,< adult>,<sexo>,<menores de 18 anos> +< destinad>,< adult>,<sexo>,<menores de 21 anos> +< destinad>,< adult>,<sexo>,<menos de 18 anos> +< destinad>,< adult>,<sexo>,<menos de 21 anos> + +< destinad>,< adult>,<sexual >,<maior de 18 anos> +< destinad>,< adult>,<sexual >,<maior de 21 anos> +< destinad>,< adult>,<sexual >,<maior de idade> +< destinad>,< adult>,<sexual >,<maiores de 18 anos> +< destinad>,< adult>,<sexual >,<maiores de 21 anos> +< destinad>,< adult>,<sexual >,<mais de 18 anos> +< destinad>,< adult>,<sexual >,<mais de 21 anos> +< destinad>,< adult>,<sexual >,<menor de 18 anos> +< destinad>,< adult>,<sexual >,<menor de 21 anos> +< destinad>,< adult>,<sexual >,<menor de idade> +< destinad>,< adult>,<sexual >,<menores de 18 anos> +< destinad>,< adult>,<sexual >,<menores de 21 anos> +< destinad>,< adult>,<sexual >,<menos de 18 anos> +< destinad>,< adult>,<sexual >,<menos de 21 anos> + +< direcionad>,< adult>,< exclusiv>,<maior de 18 anos> +< direcionad>,< adult>,< exclusiv>,<maior de 21 anos> +< direcionad>,< adult>,< exclusiv>,<maior de idade> +< direcionad>,< adult>,< exclusiv>,<maiores de 18 anos> +< direcionad>,< adult>,< exclusiv>,<maiores de 21 anos> +< direcionad>,< adult>,< exclusiv>,<mais de 18 anos> +< direcionad>,< adult>,< exclusiv>,<mais de 21 anos> +< direcionad>,< adult>,< exclusiv>,<menor de 18 anos> +< direcionad>,< adult>,< exclusiv>,<menor de 21 anos> +< direcionad>,< adult>,< exclusiv>,<menor de idade> +< direcionad>,< adult>,< exclusiv>,<menores de 18 anos> +< direcionad>,< adult>,< exclusiv>,<menores de 21 anos> +< direcionad>,< adult>,< exclusiv>,<menos de 18 anos> +< direcionad>,< adult>,< exclusiv>,<menos de 21 anos> + +< direcionad>,< adult>,<explícit>,<maior de 18 anos> +< direcionad>,< adult>,<explícit>,<maior de 21 anos> +< direcionad>,< adult>,<explícit>,<maior de idade> +< direcionad>,< adult>,<explícit>,<maiores de 18 anos> +< direcionad>,< adult>,<explícit>,<maiores de 21 anos> +< direcionad>,< adult>,<explícit>,<mais de 18 anos> +< direcionad>,< adult>,<explícit>,<mais de 21 anos> +< direcionad>,< adult>,<explícit>,<menor de 18 anos> +< direcionad>,< adult>,<explícit>,<menor de 21 anos> +< direcionad>,< adult>,<explícit>,<menor de idade> +< direcionad>,< adult>,<explícit>,<menores de 18 anos> +< direcionad>,< adult>,<explícit>,<menores de 21 anos> +< direcionad>,< adult>,<explícit>,<menos de 18 anos> +< direcionad>,< adult>,<explícit>,<menos de 21 anos> + +< direcionad>,< adult>,<sexo>,<maior de 18 anos> +< direcionad>,< adult>,<sexo>,<maior de 21 anos> +< direcionad>,< adult>,<sexo>,<maior de idade> +< direcionad>,< adult>,<sexo>,<maiores de 18 anos> +< direcionad>,< adult>,<sexo>,<maiores de 21 anos> +< direcionad>,< adult>,<sexo>,<mais de 18 anos> +< direcionad>,< adult>,<sexo>,<mais de 21 anos> +< direcionad>,< adult>,<sexo>,<menor de 18 anos> +< direcionad>,< adult>,<sexo>,<menor de 21 anos> +< direcionad>,< adult>,<sexo>,<menor de idade> +< direcionad>,< adult>,<sexo>,<menores de 18 anos> +< direcionad>,< adult>,<sexo>,<menores de 21 anos> +< direcionad>,< adult>,<sexo>,<menos de 18 anos> +< direcionad>,< adult>,<sexo>,<menos de 21 anos> + +< direcionad>,< adult>,<sexual >,<maior de 18 anos> +< direcionad>,< adult>,<sexual >,<maior de 21 anos> +< direcionad>,< adult>,<sexual >,<maior de idade> +< direcionad>,< adult>,<sexual >,<maiores de 18 anos> +< direcionad>,< adult>,<sexual >,<maiores de 21 anos> +< direcionad>,< adult>,<sexual >,<mais de 18 anos> +< direcionad>,< adult>,<sexual >,<mais de 21 anos> +< direcionad>,< adult>,<sexual >,<menor de 18 anos> +< direcionad>,< adult>,<sexual >,<menor de 21 anos> +< direcionad>,< adult>,<sexual >,<menor de idade> +< direcionad>,< adult>,<sexual >,<menores de 18 anos> +< direcionad>,< adult>,<sexual >,<menores de 21 anos> +< direcionad>,< adult>,<sexual >,<menos de 18 anos> +< direcionad>,< adult>,<sexual >,<menos de 21 anos> + +< dirigid>,< adult>,< exclusiv>,<maior de 18 anos> +< dirigid>,< adult>,< exclusiv>,<maior de 21 anos> +< dirigid>,< adult>,< exclusiv>,<maior de idade> +< dirigid>,< adult>,< exclusiv>,<maiores de 18 anos> +< dirigid>,< adult>,< exclusiv>,<maiores de 21 anos> +< dirigid>,< adult>,< exclusiv>,<mais de 18 anos> +< dirigid>,< adult>,< exclusiv>,<mais de 21 anos> +< dirigid>,< adult>,< exclusiv>,<menor de 18 anos> +< dirigid>,< adult>,< exclusiv>,<menor de 21 anos> +< dirigid>,< adult>,< exclusiv>,<menor de idade> +< dirigid>,< adult>,< exclusiv>,<menores de 18 anos> +< dirigid>,< adult>,< exclusiv>,<menores de 21 anos> +< dirigid>,< adult>,< exclusiv>,<menos de 18 anos> +< dirigid>,< adult>,< exclusiv>,<menos de 21 anos> + +< dirigid>,< adult>,<explícit>,<maior de 18 anos> +< dirigid>,< adult>,<explícit>,<maior de 21 anos> +< dirigid>,< adult>,<explícit>,<maior de idade> +< dirigid>,< adult>,<explícit>,<maiores de 18 anos> +< dirigid>,< adult>,<explícit>,<maiores de 21 anos> +< dirigid>,< adult>,<explícit>,<mais de 18 anos> +< dirigid>,< adult>,<explícit>,<mais de 21 anos> +< dirigid>,< adult>,<explícit>,<menor de 18 anos> +< dirigid>,< adult>,<explícit>,<menor de 21 anos> +< dirigid>,< adult>,<explícit>,<menor de idade> +< dirigid>,< adult>,<explícit>,<menores de 18 anos> +< dirigid>,< adult>,<explícit>,<menores de 21 anos> +< dirigid>,< adult>,<explícit>,<menos de 18 anos> +< dirigid>,< adult>,<explícit>,<menos de 21 anos> + +< dirigid>,< adult>,<sexo>,<maior de 18 anos> +< dirigid>,< adult>,<sexo>,<maior de 21 anos> +< dirigid>,< adult>,<sexo>,<maior de idade> +< dirigid>,< adult>,<sexo>,<maiores de 18 anos> +< dirigid>,< adult>,<sexo>,<maiores de 21 anos> +< dirigid>,< adult>,<sexo>,<mais de 18 anos> +< dirigid>,< adult>,<sexo>,<mais de 21 anos> +< dirigid>,< adult>,<sexo>,<menor de 18 anos> +< dirigid>,< adult>,<sexo>,<menor de 21 anos> +< dirigid>,< adult>,<sexo>,<menor de idade> +< dirigid>,< adult>,<sexo>,<menores de 18 anos> +< dirigid>,< adult>,<sexo>,<menores de 21 anos> +< dirigid>,< adult>,<sexo>,<menos de 18 anos> +< dirigid>,< adult>,<sexo>,<menos de 21 anos> + +< dirigid>,< adult>,<sexual >,<maior de 18 anos> +< dirigid>,< adult>,<sexual >,<maior de 21 anos> +< dirigid>,< adult>,<sexual >,<maior de idade> +< dirigid>,< adult>,<sexual >,<maiores de 18 anos> +< dirigid>,< adult>,<sexual >,<maiores de 21 anos> +< dirigid>,< adult>,<sexual >,<mais de 18 anos> +< dirigid>,< adult>,<sexual >,<mais de 21 anos> +< dirigid>,< adult>,<sexual >,<menor de 18 anos> +< dirigid>,< adult>,<sexual >,<menor de 21 anos> +< dirigid>,< adult>,<sexual >,<menor de idade> +< dirigid>,< adult>,<sexual >,<menores de 18 anos> +< dirigid>,< adult>,<sexual >,<menores de 21 anos> +< dirigid>,< adult>,<sexual >,<menos de 18 anos> +< dirigid>,< adult>,<sexual >,<menos de 21 anos> + +< orientad>,< adult>,< exclusiv>,<maior de 18 anos> +< orientad>,< adult>,< exclusiv>,<maior de 21 anos> +< orientad>,< adult>,< exclusiv>,<maior de idade> +< orientad>,< adult>,< exclusiv>,<maiores de 18 anos> +< orientad>,< adult>,< exclusiv>,<maiores de 21 anos> +< orientad>,< adult>,< exclusiv>,<mais de 18 anos> +< orientad>,< adult>,< exclusiv>,<mais de 21 anos> +< orientad>,< adult>,< exclusiv>,<menor de 18 anos> +< orientad>,< adult>,< exclusiv>,<menor de 21 anos> +< orientad>,< adult>,< exclusiv>,<menor de idade> +< orientad>,< adult>,< exclusiv>,<menores de 18 anos> +< orientad>,< adult>,< exclusiv>,<menores de 21 anos> +< orientad>,< adult>,< exclusiv>,<menos de 18 anos> +< orientad>,< adult>,< exclusiv>,<menos de 21 anos> + +< orientad>,< adult>,<explícit>,<maior de 18 anos> +< orientad>,< adult>,<explícit>,<maior de 21 anos> +< orientad>,< adult>,<explícit>,<maior de idade> +< orientad>,< adult>,<explícit>,<maiores de 18 anos> +< orientad>,< adult>,<explícit>,<maiores de 21 anos> +< orientad>,< adult>,<explícit>,<mais de 18 anos> +< orientad>,< adult>,<explícit>,<mais de 21 anos> +< orientad>,< adult>,<explícit>,<menor de 18 anos> +< orientad>,< adult>,<explícit>,<menor de 21 anos> +< orientad>,< adult>,<explícit>,<menor de idade> +< orientad>,< adult>,<explícit>,<menores de 18 anos> +< orientad>,< adult>,<explícit>,<menores de 21 anos> +< orientad>,< adult>,<explícit>,<menos de 18 anos> +< orientad>,< adult>,<explícit>,<menos de 21 anos> + +< orientad>,< adult>,<sexo>,<maior de 18 anos> +< orientad>,< adult>,<sexo>,<maior de 21 anos> +< orientad>,< adult>,<sexo>,<maior de idade> +< orientad>,< adult>,<sexo>,<maiores de 18 anos> +< orientad>,< adult>,<sexo>,<maiores de 21 anos> +< orientad>,< adult>,<sexo>,<mais de 18 anos> +< orientad>,< adult>,<sexo>,<mais de 21 anos> +< orientad>,< adult>,<sexo>,<menor de 18 anos> +< orientad>,< adult>,<sexo>,<menor de 21 anos> +< orientad>,< adult>,<sexo>,<menor de idade> +< orientad>,< adult>,<sexo>,<menores de 18 anos> +< orientad>,< adult>,<sexo>,<menores de 21 anos> +< orientad>,< adult>,<sexo>,<menos de 18 anos> +< orientad>,< adult>,<sexo>,<menos de 21 anos> + +< orientad>,< adult>,<sexual >,<maior de 18 anos> +< orientad>,< adult>,<sexual >,<maior de 21 anos> +< orientad>,< adult>,<sexual >,<maior de idade> +< orientad>,< adult>,<sexual >,<maiores de 18 anos> +< orientad>,< adult>,<sexual >,<maiores de 21 anos> +< orientad>,< adult>,<sexual >,<mais de 18 anos> +< orientad>,< adult>,<sexual >,<mais de 21 anos> +< orientad>,< adult>,<sexual >,<menor de 18 anos> +< orientad>,< adult>,<sexual >,<menor de 21 anos> +< orientad>,< adult>,<sexual >,<menor de idade> +< orientad>,< adult>,<sexual >,<menores de 18 anos> +< orientad>,< adult>,<sexual >,<menores de 21 anos> +< orientad>,< adult>,<sexual >,<menos de 18 anos> +< orientad>,< adult>,<sexual >,<menos de 21 anos> + +< voltad>,< adult>,< exclusiv>,<maior de 18 anos> +< voltad>,< adult>,< exclusiv>,<maior de 21 anos> +< voltad>,< adult>,< exclusiv>,<maior de idade> +< voltad>,< adult>,< exclusiv>,<maiores de 18 anos> +< voltad>,< adult>,< exclusiv>,<maiores de 21 anos> +< voltad>,< adult>,< exclusiv>,<mais de 18 anos> +< voltad>,< adult>,< exclusiv>,<mais de 21 anos> +< voltad>,< adult>,< exclusiv>,<menor de 18 anos> +< voltad>,< adult>,< exclusiv>,<menor de 21 anos> +< voltad>,< adult>,< exclusiv>,<menor de idade> +< voltad>,< adult>,< exclusiv>,<menores de 18 anos> +< voltad>,< adult>,< exclusiv>,<menores de 21 anos> +< voltad>,< adult>,< exclusiv>,<menos de 18 anos> +< voltad>,< adult>,< exclusiv>,<menos de 21 anos> + +< voltad>,< adult>,<explícit>,<maior de 18 anos> +< voltad>,< adult>,<explícit>,<maior de 21 anos> +< voltad>,< adult>,<explícit>,<maior de idade> +< voltad>,< adult>,<explícit>,<maiores de 18 anos> +< voltad>,< adult>,<explícit>,<maiores de 21 anos> +< voltad>,< adult>,<explícit>,<mais de 18 anos> +< voltad>,< adult>,<explícit>,<mais de 21 anos> +< voltad>,< adult>,<explícit>,<menor de 18 anos> +< voltad>,< adult>,<explícit>,<menor de 21 anos> +< voltad>,< adult>,<explícit>,<menor de idade> +< voltad>,< adult>,<explícit>,<menores de 18 anos> +< voltad>,< adult>,<explícit>,<menores de 21 anos> +< voltad>,< adult>,<explícit>,<menos de 18 anos> +< voltad>,< adult>,<explícit>,<menos de 21 anos> + +< voltad>,< adult>,<sexo>,<maior de 18 anos> +< voltad>,< adult>,<sexo>,<maior de 21 anos> +< voltad>,< adult>,<sexo>,<maior de idade> +< voltad>,< adult>,<sexo>,<maiores de 18 anos> +< voltad>,< adult>,<sexo>,<maiores de 21 anos> +< voltad>,< adult>,<sexo>,<mais de 18 anos> +< voltad>,< adult>,<sexo>,<mais de 21 anos> +< voltad>,< adult>,<sexo>,<menor de 18 anos> +< voltad>,< adult>,<sexo>,<menor de 21 anos> +< voltad>,< adult>,<sexo>,<menor de idade> +< voltad>,< adult>,<sexo>,<menores de 18 anos> +< voltad>,< adult>,<sexo>,<menores de 21 anos> +< voltad>,< adult>,<sexo>,<menos de 18 anos> +< voltad>,< adult>,<sexo>,<menos de 21 anos> + +< voltad>,< adult>,<sexual >,<maior de 18 anos> +< voltad>,< adult>,<sexual >,<maior de 21 anos> +< voltad>,< adult>,<sexual >,<maior de idade> +< voltad>,< adult>,<sexual >,<maiores de 18 anos> +< voltad>,< adult>,<sexual >,<maiores de 21 anos> +< voltad>,< adult>,<sexual >,<mais de 18 anos> +< voltad>,< adult>,<sexual >,<mais de 21 anos> +< voltad>,< adult>,<sexual >,<menor de 18 anos> +< voltad>,< adult>,<sexual >,<menor de 21 anos> +< voltad>,< adult>,<sexual >,<menor de idade> +< voltad>,< adult>,<sexual >,<menores de 18 anos> +< voltad>,< adult>,<sexual >,<menores de 21 anos> +< voltad>,< adult>,<sexual >,<menos de 18 anos> +< voltad>,< adult>,<sexual >,<menos de 21 anos> + +< contém >,< fotos >,<erótic>,<18 anos ou mais> +< contém >,< fotos >,<erótic>,<18 anos ou menos> +< contém >,< fotos >,<erótic>,<21 anos ou mais> +< contém >,< fotos >,<erótic>,<21 anos ou menos> +< contém >,< fotos >,<erótic>,<maior de 18 anos> +< contém >,< fotos >,<erótic>,<maior de 21 anos> +< contém >,< fotos >,<erótic>,<maior de idade> +< contém >,< fotos >,<erótic>,<maiores de 18 anos> +< contém >,< fotos >,<erótic>,<maiores de 21 anos> +< contém >,< fotos >,<erótic>,<menor de 18 anos> +< contém >,< fotos >,<erótic>,<menor de 21 anos> +< contém >,< fotos >,<erótic>,<menor de idade> +< contém >,< fotos >,<erótic>,<menores de 18 anos> +< contém >,< fotos >,<erótic>,<menores de 21 anos> +< contém >,< fotos >,<erótic>,<menos de 18 anos> +< contém >,< fotos >,<erótic>,<menos de 21 anos> + +< contém >,< fotos >,< pornô>,<18 anos ou mais> +< contém >,< fotos >,< pornô>,<18 anos ou menos> +< contém >,< fotos >,< pornô>,<21 anos ou mais> +< contém >,< fotos >,< pornô>,<21 anos ou menos> +< contém >,< fotos >,< pornô>,<maior de 18 anos> +< contém >,< fotos >,< pornô>,<maior de 21 anos> +< contém >,< fotos >,< pornô>,<maior de idade> +< contém >,< fotos >,< pornô>,<maiores de 18 anos> +< contém >,< fotos >,< pornô>,<maiores de 21 anos> +< contém >,< fotos >,< pornô>,<menor de 18 anos> +< contém >,< fotos >,< pornô>,<menor de 21 anos> +< contém >,< fotos >,< pornô>,<menor de idade> +< contém >,< fotos >,< pornô>,<menores de 18 anos> +< contém >,< fotos >,< pornô>,<menores de 21 anos> +< contém >,< fotos >,< pornô>,<menos de 18 anos> +< contém >,< fotos >,< pornô>,<menos de 21 anos> + +< contém >,< fotos >,<pornográfic>,<18 anos ou mais> +< contém >,< fotos >,<pornográfic>,<18 anos ou menos> +< contém >,< fotos >,<pornográfic>,<21 anos ou mais> +< contém >,< fotos >,<pornográfic>,<21 anos ou menos> +< contém >,< fotos >,<pornográfic>,<maior de 18 anos> +< contém >,< fotos >,<pornográfic>,<maior de 21 anos> +< contém >,< fotos >,<pornográfic>,<maior de idade> +< contém >,< fotos >,<pornográfic>,<maiores de 18 anos> +< contém >,< fotos >,<pornográfic>,<maiores de 21 anos> +< contém >,< fotos >,<pornográfic>,<menor de 18 anos> +< contém >,< fotos >,<pornográfic>,<menor de 21 anos> +< contém >,< fotos >,<pornográfic>,<menor de idade> +< contém >,< fotos >,<pornográfic>,<menores de 18 anos> +< contém >,< fotos >,<pornográfic>,<menores de 21 anos> +< contém >,< fotos >,<pornográfic>,<menos de 18 anos> +< contém >,< fotos >,<pornográfic>,<menos de 21 anos> + +< contém >,< image>,<erótic>,<18 anos ou mais> +< contém >,< image>,<erótic>,<18 anos ou menos> +< contém >,< image>,<erótic>,<21 anos ou mais> +< contém >,< image>,<erótic>,<21 anos ou menos> +< contém >,< image>,<erótic>,<maior de 18 anos> +< contém >,< image>,<erótic>,<maior de 21 anos> +< contém >,< image>,<erótic>,<maior de idade> +< contém >,< image>,<erótic>,<maiores de 18 anos> +< contém >,< image>,<erótic>,<maiores de 21 anos> +< contém >,< image>,<erótic>,<menor de 18 anos> +< contém >,< image>,<erótic>,<menor de 21 anos> +< contém >,< image>,<erótic>,<menor de idade> +< contém >,< image>,<erótic>,<menores de 18 anos> +< contém >,< image>,<erótic>,<menores de 21 anos> +< contém >,< image>,<erótic>,<menos de 18 anos> +< contém >,< image>,<erótic>,<menos de 21 anos> + +< contém >,< image>,< pornô>,<18 anos ou mais> +< contém >,< image>,< pornô>,<18 anos ou menos> +< contém >,< image>,< pornô>,<21 anos ou mais> +< contém >,< image>,< pornô>,<21 anos ou menos> +< contém >,< image>,< pornô>,<maior de 18 anos> +< contém >,< image>,< pornô>,<maior de 21 anos> +< contém >,< image>,< pornô>,<maior de idade> +< contém >,< image>,< pornô>,<maiores de 18 anos> +< contém >,< image>,< pornô>,<maiores de 21 anos> +< contém >,< image>,< pornô>,<menor de 18 anos> +< contém >,< image>,< pornô>,<menor de 21 anos> +< contém >,< image>,< pornô>,<menor de idade> +< contém >,< image>,< pornô>,<menores de 18 anos> +< contém >,< image>,< pornô>,<menores de 21 anos> +< contém >,< image>,< pornô>,<menos de 18 anos> +< contém >,< image>,< pornô>,<menos de 21 anos> + +< contém >,< image>,<pornográfic>,<18 anos ou mais> +< contém >,< image>,<pornográfic>,<18 anos ou menos> +< contém >,< image>,<pornográfic>,<21 anos ou mais> +< contém >,< image>,<pornográfic>,<21 anos ou menos> +< contém >,< image>,<pornográfic>,<maior de 18 anos> +< contém >,< image>,<pornográfic>,<maior de 21 anos> +< contém >,< image>,<pornográfic>,<maior de idade> +< contém >,< image>,<pornográfic>,<maiores de 18 anos> +< contém >,< image>,<pornográfic>,<maiores de 21 anos> +< contém >,< image>,<pornográfic>,<menor de 18 anos> +< contém >,< image>,<pornográfic>,<menor de 21 anos> +< contém >,< image>,<pornográfic>,<menor de idade> +< contém >,< image>,<pornográfic>,<menores de 18 anos> +< contém >,< image>,<pornográfic>,<menores de 21 anos> +< contém >,< image>,<pornográfic>,<menos de 18 anos> +< contém >,< image>,<pornográfic>,<menos de 21 anos> + +< contém >,<material>,<adult>,<18 anos ou mais> +< contém >,<material>,<adult>,<18 anos ou menos> +< contém >,<material>,<adult>,<21 anos ou mais> +< contém >,<material>,<adult>,<21 anos ou menos> +< contém >,<material>,<adult>,<maior de 18 anos> +< contém >,<material>,<adult>,<maior de 21 anos> +< contém >,<material>,<adult>,<maior de idade> +< contém >,<material>,<adult>,<maiores de 18 anos> +< contém >,<material>,<adult>,<maiores de 21 anos> +< contém >,<material>,<adult>,<menor de 18 anos> +< contém >,<material>,<adult>,<menor de 21 anos> +< contém >,<material>,<adult>,<menor de idade> +< contém >,<material>,<adult>,<menores de 18 anos> +< contém >,<material>,<adult>,<menores de 21 anos> +< contém >,<material>,<adult>,<menos de 18 anos> +< contém >,<material>,<adult>,<menos de 21 anos> + +< contém >,<material>,<erótic>,<18 anos ou mais> +< contém >,<material>,<erótic>,<18 anos ou menos> +< contém >,<material>,<erótic>,<21 anos ou mais> +< contém >,<material>,<erótic>,<21 anos ou menos> +< contém >,<material>,<erótic>,<maior de 18 anos> +< contém >,<material>,<erótic>,<maior de 21 anos> +< contém >,<material>,<erótic>,<maior de idade> +< contém >,<material>,<erótic>,<maiores de 18 anos> +< contém >,<material>,<erótic>,<maiores de 21 anos> +< contém >,<material>,<erótic>,<menor de 18 anos> +< contém >,<material>,<erótic>,<menor de 21 anos> +< contém >,<material>,<erótic>,<menor de idade> +< contém >,<material>,<erótic>,<menores de 18 anos> +< contém >,<material>,<erótic>,<menores de 21 anos> +< contém >,<material>,<erótic>,<menos de 18 anos> +< contém >,<material>,<erótic>,<menos de 21 anos> + +< contém >,<material>,< pornô>,<18 anos ou mais> +< contém >,<material>,< pornô>,<18 anos ou menos> +< contém >,<material>,< pornô>,<21 anos ou mais> +< contém >,<material>,< pornô>,<21 anos ou menos> +< contém >,<material>,< pornô>,<maior de 18 anos> +< contém >,<material>,< pornô>,<maior de 21 anos> +< contém >,<material>,< pornô>,<maior de idade> +< contém >,<material>,< pornô>,<maiores de 18 anos> +< contém >,<material>,< pornô>,<maiores de 21 anos> +< contém >,<material>,< pornô>,<menor de 18 anos> +< contém >,<material>,< pornô>,<menor de 21 anos> +< contém >,<material>,< pornô>,<menor de idade> +< contém >,<material>,< pornô>,<menores de 18 anos> +< contém >,<material>,< pornô>,<menores de 21 anos> +< contém >,<material>,< pornô>,<menos de 18 anos> +< contém >,<material>,< pornô>,<menos de 21 anos> + +< contém >,<material>,<pornográfic>,<18 anos ou mais> +< contém >,<material>,<pornográfic>,<18 anos ou menos> +< contém >,<material>,<pornográfic>,<21 anos ou mais> +< contém >,<material>,<pornográfic>,<21 anos ou menos> +< contém >,<material>,<pornográfic>,<maior de 18 anos> +< contém >,<material>,<pornográfic>,<maior de 21 anos> +< contém >,<material>,<pornográfic>,<maior de idade> +< contém >,<material>,<pornográfic>,<maiores de 18 anos> +< contém >,<material>,<pornográfic>,<maiores de 21 anos> +< contém >,<material>,<pornográfic>,<menor de 18 anos> +< contém >,<material>,<pornográfic>,<menor de 21 anos> +< contém >,<material>,<pornográfic>,<menor de idade> +< contém >,<material>,<pornográfic>,<menores de 18 anos> +< contém >,<material>,<pornográfic>,<menores de 21 anos> +< contém >,<material>,<pornográfic>,<menos de 18 anos> +< contém >,<material>,<pornográfic>,<menos de 21 anos> + +<sexo explícito>,<18 anos ou mais> +<sexo explícito>,<18 anos ou menos> +<sexo explícito>,<21 anos ou mais> +<sexo explícito>,<21 anos ou menos> +<sexo explícito>,<maior de 18 anos> +<sexo explícito>,<maior de 21 anos> +<sexo explícito>,<maior de idade> +<sexo explícito>,<maiores de 18 anos> +<sexo explícito>,<maiores de 21 anos> +<sexo explícito>,<menor de 18 anos> +<sexo explícito>,<menor de 21 anos> +<sexo explícito>,<menor de idade> +<sexo explícito>,<menores de 18 anos> +<sexo explícito>,<menores de 21 anos> +<sexo explícito>,<menos de 18 anos> +<sexo explícito>,<menos de 21 anos> + +<sexual explícit>,<18 anos ou mais> +<sexual explícit>,<18 anos ou menos> +<sexual explícit>,<21 anos ou mais> +<sexual explícit>,<21 anos ou menos> +<sexual explícit>,<maior de 18 anos> +<sexual explícit>,<maior de 21 anos> +<sexual explícit>,<maior de idade> +<sexual explícit>,<maiores de 18 anos> +<sexual explícit>,<maiores de 21 anos> +<sexual explícit>,<menor de 18 anos> +<sexual explícit>,<menor de 21 anos> +<sexual explícit>,<menor de idade> +<sexual explícit>,<menores de 18 anos> +<sexual explícit>,<menores de 21 anos> +<sexual explícit>,<menos de 18 anos> +<sexual explícit>,<menos de 21 anos> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/pornography/weighted b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/pornography/weighted new file mode 100644 index 0000000000000000000000000000000000000000..9bd23d4da273eab7a9be7afbe41c03b146df9ac7 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/pornography/weighted @@ -0,0 +1,3857 @@ +# +# Pornography Weighted Phrases +#listcategory: "Pornography" +< adultos><40> +< anal >,< porn><70> +< anal >,< xxx><30> +< anal >,<fuck><70> +< anal >,<horny><70> +< anal ><20> +< bbw >,< horny ><40> +< bbw >,< porn><40> +< bbw >,< slut><40> +< bbw >,< twat ><40> +< bbw >,< xxx><40> +< bbw >,<fuck><40> +< bbw ><10> +< bbws><40> +< bdsm >,< xxx><40> +< bdsm ><10> +< beppin ><10> +< biguns ><20> +< boff ><5> +< boob><10> +< bra ><2> +< bras ><2> +< bugger ><5> +< butt ><10> +< churd ><10> +< clit >,< horny ><40> +< clit >,< porn><40> +< clit >,< slut><40> +< clit >,< twat ><40> +< clit >,< xxx ><40> +< clit >,<fuck><40> +< clit >,<pussy><40> +< clit >,<suck><40> +< clit ><40> +< clits >,< horny ><40> +< clits >,< porn><40> +< clits >,< slut><40> +< clits >,< twat ><40> +< clits >,< xxx ><40> +< clits >,<fuck><40> +< clits >,<pussy><40> +< clits >,<suck><40> +< clits ><20> +< clitty><30> +< cock ><10> +< cock sucker><20> +< cock>,< xxx><40> +< cockage><30> +< cocksucker><20> +< cum >,< slut><80> +< cum >,< xxx><50> +< cum >,<facial><50> +< cum >,<fuck><50> +< cum >,<her face><80> +< cum >,<her tit><80> +< cum >,<horny><50> +< cum >,<pussy><80> +< cum >,<their face><80> +< cum >,<their tit><80> +< cum ><20> +< cum filled><80> +< cum spread><80> +< cumming >,< slut><50> +< cumming >,< xxx><50> +< cumming >,<fuck><50> +< cumming >,<horny><50> +< cumming >,<pussy><50> +< cumming >,<swallow><50> +< cumming ><20> +< cums ><20> +< cumshot ><50> +< cumshot><80> +< cumshots ><50> +< cunt><10> +< dicks ><10> +< dildo >,< horny ><50> +< dildo >,< porn><80> +< dildo >,< slut><80> +< dildo >,< twat ><80> +< dildo >,< xxx ><80> +< dildo >,<fuck><80> +< dildo >,<pussy><80> +< dildo >,<sex><80> +< dildo >,<smut><80> +< dildo ><50> +< dildos ><40> +< do not enter>,<age>,<18><50> +< fellatio ><10> +< fist>,< anal ><30> +< fist>,< horny><30> +< fist>,< porn><30> +< fist>,< slut><30> +< fist>,< twat><30> +< fist>,< xxx><30> +< fist>,<cunt><30> +< fist>,<fuck><30> +< gay ><5> +< girl ><3> +< glamour model><30> +< glamour>,<studio><50> +< hardcore ><10> +< hardon><30> +< her clit><30> +< hooker ><10> +< hookers ><10> +< lesbian ><10> +< lesbiana ><30> +< lesbo ><30> +< milf ><80> +< model>,< portfolio><20> +< nasty ><10> +< negligee ><10> +< newd >,< horny ><30> +< newd >,< porn><30> +< newd >,< slut><30> +< newd >,< twat ><30> +< newd >,< xxx ><30> +< newd >,<fuck><30> +< newd >,<pussy><30> +< newd >,<sex><30> +< newd ><30> +< newds>,< horny ><30> +< newds>,< porn><30> +< newds>,< slut><30> +< newds>,< twat ><30> +< newds>,< xxx ><30> +< newds>,<fuck><30> +< newds>,<pussy><30> +< newds>,<sex><30> +< newds><30> +< newdz>,< horny ><30> +< newdz>,< porn><30> +< newdz>,< slut><30> +< newdz>,< twat ><30> +< newdz>,< xxx ><30> +< newdz>,<fuck><30> +< newdz>,<pussy><30> +< newdz>,<sex><30> +< newdz><30> +< nip>,< slip ><50> +< nude><10> +< nudes><10> +< nudes><30> +< nudie><10> +< nudity><20> +< nympho ><30> +< nymphos ><30> +< orgies ><30> +< orgy ><30> +< penis ><10> +< penthouse >,< pet><50> +< piss ><5> +< piss flaps ><50> +< porn>,<fuck><30> +< porn>,<horny><30> +< porn>,<twat><30> +< porn>,<xxx><30> +< porn><10> +< pretty >,< nude><50> +< putas><50> +< rape>,< horny ><30> +< rape>,< slut><20> +< rape>,< twat ><40> +< rape>,< xxx ><40> +< rape>,<fetish><40> +< rape>,<free pic><50> +< rape>,<fuck><20> +< rape>,<hardcore><20> +< rape><5> +< rapist>,< horny ><30> +< rapist>,< porn><30> +< rapist>,< slut><20> +< rapist>,< twat ><40> +< rapist>,< xxx ><40> +< rapist>,<fetish><40> +< rapist>,<fuck><20> +< rapist>,<hardcore><20> +< rated x ><20> +< ratedx ><20> +< raunchy ><10> +< reaming><50> +< rimjob ><80> +< rimmed ><20> +< rimming ><10> +< scat >,< horny ><80> +< scat >,< porn><80> +< scat >,< slut><80> +< scat >,< xxx ><80> +< scat >,<fetish><80> +< scat >,<fuck><80> +< scat >,<pussy><80> +< scat >,<shit><40> +< scat >,<smut><80> +< scat link><40> +< scat love><120> +< scat loving><120> +< scat picture><120> +< scat related><80> +< scat stories><80> +< scat story><80> +< scat video><80> +< see thru >,< bikini><50> +< see thru><10> +< semen><5> +< sex ><3> +< sex factory><80> +< sexo ><20> +< sheer >,< bikini><50> +< sheer ><10> +< shit ><5> +< slut>,< porn><40> +< slut>,< twat ><40> +< slut>,< xxx><40> +< slut>,<fetish><40> +< slut>,<horny><40> +< slut>,<pussy><40> +< slut>,<slave><40> +< slut><20> +< slutty ><10> +< smoo ><50> +< sodomy ><10> +< sperm ><10> +< stiffy ><20> +< swinger><10> +< swingers><10> +< teen >,<fuck><30> +< teen pussy><80> +< thong ><5> +< tit >,< porn><50> +< tit >,<fuck><50> +< tit ><5> +< titty><10> +< topless><20> +< tour >,< free >,<fetish><40> +< tour >,<free >,< fuck ><40> +< tour >,<free >,< horny ><40> +< tour >,<free >,< porn ><40> +< tour >,<free >,< slut ><40> +< tour >,<free >,< sluts ><40> +< tour >,<free >,< xxx ><40> +< tour >,<free>,< twat ><40> +< twat ><10> +< upskirt ><70> +< wank>,< horny ><30> +< wank>,< porn><30> +< wank>,< slut><30> +< wank>,< twat ><30> +< wank>,< xxx ><30> +< wank>,<fuck><30> +< wank><10> +< whore ><10> +< whores ><10> +< whoring ><10> +< xxx ><20> +< xxx>,< porn><20> +< xxx>,< sex ><10> +< xxx>,< smut><20> +< xxx>,<babe><20> +< xxx>,<fetish><20> +< xxx>,<fuck><20> +< xxx>,<horny><20> +< xxx>,<illegal><20> +< xxx>,<pussy><20> +< xxx>,<shave><20> +< xxx>,<slut><20> +< xxx>,<suck><20> +< xxxx ><40> +<" dong><50> +<10" cock><70> +<10"+ cock><70> +<100% banned><50> +<100% free porn><80> +<100% hardcore><50> +<100% illegal><70> +<100% porn><80> +<100% slut><60> +<100% softcore><50> +<100% whore><50> +<12" cock><70> +<12"+ cock><70> +<18 u.s.c. 2257 statement><80> +<18 u.s.c.>,<2257><50> +<18 usc>,<2257>,< compl><60> +<18 usc>,<2257><50> +<18 years of age><10> +<18 years old><10> +<18>,<u.s.c>,<2257>,< compl><80> +<18>,<united states code>,<2256><60> +<18>,<united states code>,<2257><60> +<2257 compl><50> +<2257>,<18>,<comply with><50> +<2257>,<custodian of records><100> +< 2257 >,<information><30> +< 2257 >,<notice><30> +< 2257 >,<statement><30> +<3 day trial membership><40> +<3 day>,<trial>,<credit card><50> +<9" cock><70> +<9"+ cock><70> +<aardvarking><20> +<absolutely anything goes><20> +<ac movie pass><100> +<access to all of the adult check><80> +<action slut><70> +<adult audiences only><50> +<adult broadcast><20> +<adult check® gold><80> +<adult check>,< id><80> +<adult check><40> +<adult content list><40> +<adult content><20> +<adult erotic><80> +<adult film star><80> +<adult flics><80> +<adult flix><80> +<adult friend finder><70> +<adult interactive><20> +<adult links><40> +<adult mag><40> +<adult material>,<extreme nature><70> +<adult material><20> +<adult movie station><40> +<adult movie><30> +<adult newsgroup><80> +<adult only site><50> +<adult oriented><30> +<adult paysite><80> +<adult playground><80> +<adult porn><80> +<adult related images><40> +<adult sex game><80> +<adult sex site><60> +<adult sex toy><80> +<adult show><10> +<adult site><30> +<adult sites against child pornography><60> +<adult strip show><80> +<adult supersite><50> +<adult upskirt><40> +<adult verification system><60> +<adult videochat><80> +<adult web site><50> +<adult webmaster><80> +<adult webring><80> +<adult website><50> +<adult xxx><80> +<adult>,<contains>,<nudity><30> +<adult>,<explicit>,<sex>,<offensive><30> +<adult>,<model>,<x rated><50> +<adult>,<topless>,<nude><60> +<adultcheck><80> +<adult-film star><80> +<adultfriendfinder.com><50> +<adultlink><20> +<adultoptin><80> +<adultpass><80> +<adultrevenueservice.com><100> +<adultrevenueservice><70> +<adults only please><60> +<adults only site><50> +<adults only><20> +<adult-videochat><80> +<adultweb><80> +<adv:adlt><50> +<adv:adult><50> +<after you cum><50> +<age verification><30> +<agree>,<disagree>,<years>,<sex>,<explicit><80> +<all asian porn><80> +<all black porn><80> +<all girl orgies><70> +<all girl orgy><70> +<all lubed up><40> +<all models are 18 years of age or older><80> +<all models are 21 years of age or older><80> +<all models are over 18 years><80> +<all models>,<18 years of age>,<photographs were taken><80> +<all models>,<at least 18><80> +<all models>,<at least 21><80> +<all models>,<over the age of 18><60> +<all models><10> +<all petite><5> +<all porn pass><20> +<als scan><80> +<als-scan><80> +<alt.binaries.pictures.><50> +<alt.sex.><70> +<amateur asian><40> +<amateur beaver><80> +<amateur ezine><20> +<amateur girl><40> +<amateur housewife><50> +<amateur housewives><50> +<amateur latina><60> +<amateur links><50> +<amateur pages free pics><100> +<amateur pages>,<free pic><80> +<amateur schoolgirl><40> +<amateur sex><80> +<amateur sucking><70> +<amateur teen girl><80> +<amateur university><30> +<amateur wife><80> +<amateur wives><80> +<amateur>,< porn><70> +<amateur>,< slut><70> +<amateur>,< tits><70> +<amateur>,< xxx><70> +<amateur>,<fuck><70> +<amateur><10> +<amateur-pages.com><80> +<amateurpages><80> +<amateurs preview><80> +<amazing sexual content><80> +<anal action><80> +<anal beads><30> +<anal debutants><40> +<anal ecstacy><60> +<anal ezine><20> +<anal fist><80> +<anal juice><60> +<anal love><50> +<anal lube><80> +<anal orgy><70> +<anal passion><70> +<anal pics><70> +<anal play><40> +<anal plug><50> +<anal ram><80> +<anal sex tour><80> +<anal slut><80> +<anal sweeties><80> +<anal sweety><80> +<anal teen><80> +<analingus><30> +<analsex.com><80> +<animal fuck><80> +<animal sex><60> +<animal>,<fuck>,<chicken><50> +<animal>,<fuck>,<dog><50> +<animal>,<fuck>,<horse><50> +<anime ezine><20> +<anime sex><80> +<applicant is 18 years><40> +<applicant is eighteen years><40> +<appreciate naked><50> +<appreciate nude><50> +<appreciate porn><50> +<april summers><70> +<are at least 18><20> +<are confirming that you are aged 18yrs and over><60> +<are naked><20> +<areolas><5> +<around your shaft><40> +<arousing you><30> +<arse bandit><20> +<arse humper><60> +<arse humping><60> +<arse open wide><80> +<arse pounding><80> +<arse ramming><80> +<arse tearing><70> +<arseficken><20> +<arseplay><20> +<arse-pounding><80> +<arses open wide><80> +<asexual><5> +<asia xxx><80> +<asian exxxtasy><70> +<asian ezine><20> +<asian hardcore><80> +<asian nude><50> +<asian pleasure><50> +<asian porn><80> +<asian pussies><70> +<asian pussy><80> +<asian sex><80> +<asian whore><50> +<asianerotica><80> +<ass cheeks><50> +<ass ezine><20> +<ass fucking><80> +<ass full of cum><80> +<ass full of jizz><80> +<ass humper><60> +<ass humping><60> +<ass master><50> +<ass open wide><80> +<ass pounding><80> +<ass rammed><80> +<ass ramming><80> +<ass tearing><70> +<asses open wide><80> +<assfuck><20> +<assfucking><80> +<ass-fucking><80> +<asshole and balls><80> +<asshole eaten out><80> +<asslick><20> +<ass-pounding><80> +<asspreading><60> +<ass-wrecking><60> +<at least 18 years of age><20> +<at least 18 years of age><70> +<at least 18 years old><20> +<audio xxx><80> +<aureole><5> +<autocunnilingus><80> +<autofellatio><80> +<automatically renew every 30 days><40> +<avs code><40> +<avs login><60> +<avsofchoice.com><80> +<awesome bisexual><70> +<awesome to fuck><80> +<axxxess><20> +<babe fucks><60> +<babes in porn><80> +<babes masturbating><60> +<babes><5> +<back door boy><80> +<backdoor beauties><80> +<backdoor beauty><80> +<backdoor betty><80> +<backdoor penetration><80> +<bad girls club><40> +<bald beaver><80> +<bald clam><80> +<bald pussies><80> +<bald pussy><80> +<bald smoo><30> +<ball busting><20> +<ball gag><20> +<ball juice><60> +<ball licking><80> +<ball sucking><80> +<balloon ezine><20> +<balls deep in her><60> +<balls in mouth><60> +<banging a girl><40> +<banned in the usa><30> +<banned incest><60> +<banned><5> +<barely legal babes><50> +<barely legal boys><40> +<barely legal>,< horny ><60> +<barely legal>,< porn><60> +<barely legal>,< slut><60> +<barely legal>,< twat ><60> +<barely legal>,< xxx ><60> +<barely legal>,<amateur><60> +<barely legal>,<fuck><60> +<barely legal>,<schoolgirl><60> +<barely legal>,<starlet><60> +<barely legal>,<suck><60> +<barely legal>,<teen><30> +<barely legal><40> +<barenaked><10> +<barnyard fuck><40> +<bathtime lesbo><80> +<bathtime lezbo><80> +<bazoombas><10> +<bbw ezine><20> +<bbw spreading><70> +<bdsm ezine><20> +<bdsm>,< horny ><40> +<bdsm>,< porn><40> +<bdsm>,< slut><40> +<bdsm>,<mistress><40> +<bear lovin><30> +<bears ezine><40> +<beastiality at its finest><80> +<beastiality girl><30> +<beastiality movie><30> +<beastiality site><70> +<beastiality toon><80> +<beastiality video><30> +<beastiality woman><30> +<beastiality>,< horny ><30> +<beastiality>,< porn><30> +<beastiality>,< slut><30> +<beastiality>,< twat ><30> +<beastiality>,< xxx ><30> +<beastiality>,<fetish><30> +<beastiality>,<fuck><30> +<beastiality>,<sex><30> +<beastiality><10> +<beat your meat><60> +<beating off><60> +<beating your meat><60> +<beautiful tits><80> +<beaver>,< fuck><40> +<beaver>,< porn><40> +<beaver>,< xxx><40> +<become a tit man><80> +<bent for a dick><70> +<best adult content><80> +<best adult site><80> +<best fuck><30> +<best hardcore><80> +<best homosexual><50> +<best lolita><70> +<best porn site award><80> +<best tits on the net><80> +<best xxx><80> +<bestiality><20> +<bg_backaround><80> +<bg_teendomain><80> +<bi girls><60> +<biatch>,< horny ><40> +<biatch>,< porn><40> +<biatch>,< slut><40> +<biatch>,< xxx ><40> +<biatch>,<fuck><40> +<biatch><20> +<big beautiful women><80> +<big black cock><80> +<big boob babes><80> +<big boy><10> +<big cock sex><50> +<big dick><60> +<big fat cock><70> +<big hard cock><80> +<big melons><20> +<big nipples><80> +<big penis><40> +<big round ass><60> +<big tit ezine><20> +<big tits><30> +<big titties><30> +<big wet cunt><70> +<biggest tits on the net><80> +<biggest tits on the web><80> +<biggest-boobed><80> +<bi-girls><60> +<bigteets.com><80> +<bikini fantasies><40> +<bikini><5> +<birching><10> +<bisexual fetish><40> +<bisexual><10> +<bitch><10> +<bitches eating pussy><80> +<bizzare fuck><60> +<bizzare sex><80> +<black cock><70> +<black desires><20> +<black ezine><20> +<black fucking><80> +<black hardcore><80> +<block access to this site by children><70> +<blonde ezine><20> +<blonde sandwich><50> +<blonde>,< porn><30> +<blonde>,< slut ><30> +<blonde>,< xxx ><40> +<blonde>,<fuck><10> +<blow a wad><60> +<blow his biscuit><80> +<blow his load><80> +<blow job><20> +<blow my biscuits><80> +<blow my load><80> +<blow their biscuit><80> +<blow their load><80> +<blow there biscuit><80> +<blow your biscuits><80> +<blow your load><80> +<blow your member away><80> +<blowjob babe><70> +<blowjob movie><60> +<blowjob><20> +<blows neighbor><40> +<blows neighbour><40> +<blue balls><20> +<blue movie><20> +<body slapping sex><70> +<bondage & bdsm><80> +<bondage action><60> +<bondage and bdsm><80> +<bondage central><60> +<bondage ezine><20> +<bondage>,< horny ><30> +<bondage>,< porn><30> +<bondage>,< slut><30> +<bondage>,< xxx ><50> +<bondage>,<fuck><30> +<bondage>,<sample>,< vid>,< pic>,< member><60> +<bondage><20> +<bone smoker><50> +<bone smoking><50> +<boning a chick><60> +<boobs><30> +<boost your sex life><20> +<booty college><30> +<bordello><10> +<boy for boy><10> +<boy toy live><20> +<boys fucking boys><80> +<bp_backaround><80> +<bp_gizmogizmo><80> +<breast><5> +<brianna banks><40> +<britney spears>,< cum ><30> +<britney spears>,< fuck ><30> +<britney spears>,<naked><30> +<britney spears>,<nude><30> +<britney spears>,<sucking><40> +<britney spears><10> +<brothel><10> +<brown shower><30> +<brunette ezine><20> +<brutal snuff><70> +<bucket loads of cum><80> +<buckets of cum><80> +<buggery><5> +<bukkake><80> +<bung hole><10> +<bunghole><10> +<burlesque><5> +<bust a nut><80> +<bust on her face><80> +<bustiere><5> +<busty lesbian><60> +<busty><10> +<butt fuck><80> +<butt necked><60> +<butt pirate><60> +<butt sex><80> +<buttfuck><80> +<butt-necked><60> +<buttock>,< porn><40> +<buttock>,< slut><40> +<buttock>,< xxx ><40> +<buttock>,<fuck><40> +<buttock><5> +<buttplug><20> +<buttsex><80> +<call girl><10> +<callgirl><10> +<cam girl>,< horny ><80> +<cam girl>,< porn><80> +<cam girl>,< slut><80> +<cam girl>,< xxx ><80> +<cam girl>,<fuck><80> +<cam girl><10> +<camel lips><80> +<camgirl>,< horny ><80> +<cam-girl>,< horny ><80> +<camgirl>,< porn><80> +<cam-girl>,< porn><80> +<camgirl>,< slut><80> +<cam-girl>,< slut><80> +<camgirl>,< xxx ><80> +<cam-girl>,< xxx ><80> +<camgirl>,<fuck><80> +<cam-girl>,<fuck><80> +<camgirl><10> +<cam-girl><10> +<camisole><5> +<candle in puss><30> +<candles in puss><30> +<candywhore><80> +<cartoon hardcore><80> +<cartoon orgy><40> +<cartoon sex><80> +<cartoon sluts><80> +<castrate><5> +<castration><5> +<casual encounter><10> +<casual sex><20> +<category: adult><30> +<cater to all fetishes><80> +<ccbill.com><50> +<ccbucks.com><80> +<celeb nude><50> +<celebrities in the nude><40> +<celebrities nude><80> +<celebrity gangbang><80> +<celebrity nude><80> +<celebrity sex><80> +<celebs nude><80> +<centerfold sex><80> +<centerfold>,< horny ><40> +<centerfold>,< porn><40> +<centerfold>,< slut><40> +<centerfold>,< teen>,<sex ><40> +<centerfold>,< twat ><40> +<centerfold>,< xxx ><40> +<centerfold>,<fuck><40> +<centerfold>,<pussy><40> +<centerfold><30> +<centrefold><30> +<centrefold>,< slut><40> +<cover girls><30> +<photoshoot>,< girls><10> +< lapdanc><50> +<photoshoot>,< nud><20> +<cervix><5> +<chancroid><10> +<chat with horny><80> +<chat with naked><80> +<chat with real girls><80> +<cheerlead>,< horny ><40> +<cheerlead>,< porn><40> +<cheerlead>,< slut><40> +<cheerlead>,< twat ><40> +<cheerlead>,< xxx ><40> +<cheerlead>,<fuck><40> +<cheerlead>,<pussies><50> +<cheerlead>,<pussy><40> +<cheerleader ezine><20> +<cheerleaders naked><80> +<chemise><10> +<cherrie popper><80> +<cherrie-popper><80> +<cherry popper><80> +<cherry-popper><80> +<chicano lesbian><80> +<chick is well hung><70> +<chicks with cocks><80> +<chicks with dicks><80> +<child porn><10> +<chippendales><5> +<chiquita><10> +<chix with dicks><80> +<chix with dix><80> +<chlamydia><10> +<chloe jones><50> +<chocking your chicken><50> +<chocolate booty><70> +<chubby slut><50> +<chunky cum><80> +<chunky jizz><80> +<circle jerk><10> +<classical bondage><60> +<clevland steamer><50> +<clit stimulation><70> +<clit stimulator><70> +<clitoral stimulation><70> +<clitoral stimulator><70> +<clitorilingus><20> +<clitoris><10> +<closeup anal><60> +<clothing optional><10> +<club cock><50> +<club seventeen><70> +<club tranny><80> +<cock and ball><40> +<cock buried><70> +<cock draining><70> +<cock eater><40> +<cock eating><40> +<cock explode><60> +<cock hungry><80> +<cock in every hole><80> +<cock in her ass><80> +<cock in her loose><80> +<cock in her pussy><80> +<cock in her><60> +<cock in his><60> +<cock in my><60> +<cock in their><60> +<cock in your ass><80> +<cock in your pussy><80> +<cock pump><30> +<cock ring><60> +<cock size><20> +<cock smoker><30> +<cock suck><30> +<cock sucking ebony><80> +<cock tease><30> +<cock thirsty><80> +<cock violate><70> +<cock worship><80> +<cock>,<uncut><50> +<cock>,<un-cut><50> +<cocks in every hole><80> +<cocksmoker><30> +<cock-smoker><30> +<cock-stuffing><50> +<cocksuck><30> +<cock-suck><30> +<coital therapy><50> +<coital><20> +<coitus><10> +<college fuck><50> +<college pussy><50> +<college whore><50> +<collegepussy.com><80> +<color climax><80> +<come fuck me><80> +<come on her tits><80> +<come on their tits><80> +<concubine><5> +<contain adult material><80> +<contain>,<photographs of sexual><80> +<contains adult content><60> +<contains adult material><80> +<contains content that is not suit><30> +<contains content which is not suit><30> +<contains explicit imagery><80> +<contains explicit sexual><80> +<contains frontal nudity><70> +<contains images of an adult nature><60> +<contains nude oriented adult material><80> +<contains partial frontal nudity><70> +<contains porn><80> +<contains pornographic material><80> +<contains sexually explicit material><80> +<contains sexually explicit><80> +<contains sexually oriented><50> +<contains>,<content of a sexual nature><60> +<content="adult"><50> +<content="porn"><80> +<content="pornography"><80> +<content="sex"><80> +<copulate><5> +<copulation><5> +<corn hole><40> +<cornhole><10> +<couple fucking><70> +<couples fuck><80> +<covered in cum><80> +<covered with cum><70> +<crave big cock><80> +<creamy xxx><70> +<crossdress><20> +<cum all over><80> +<cum burping><70> +<cum cheeks><80> +<cum coated><70> +<cum covered><30> +<cum crazy><80> +<cum diet><80> +<cum drench><50> +<cum drink><80> +<cum eat><80> +<cum facial><80> +<cum gargle><80> +<cum gargling><80> +<cum guzzling><70> +<cum in and watch><80> +<cum in her><80> +<cum in his><80> +<cum in my><80> +<cum in their><80> +<cum inside><80> +<cum load><80> +<cum now><50> +<cum on her><80> +<cum on his><80> +<cum on my><80> +<cum on their><80> +<cum party><60> +<cum pumping><80> +<cum see>,<webcam><60> +<cum shooter><80> +<cum shoots><80> +<cum shot><80> +<cum slurp><70> +<cum soak><80> +<cum spackled><70> +<cum stain><60> +<cum sucking><80> +<cum swallow><80> +<cum thirsty><80> +<cum>,<facial site><30> +<cum-covered><70> +<cumdrinking><80> +<cumiest><60> +<cumload><80> +<cumming all over><80> +<cumming by hand><70> +<cumming in her><80> +<cumming on her><80> +<cumming on their><80> +<cumming on there><80> +<cumshot ezine><20> +<cum-shot><80> +<cunilingus><20> +<cunnilingus><20> +<cunt drip><70> +<cunt leak><70> +<cunt lips><60> +<cunt open wide><80> +<cunt pump><60> +<cunt ripper><70> +<cunt ripping><70> +<cuntal><10> +<cuntlap><40> +<cuntlick><50> +<cuntlips><80> +<cunts drip><70> +<cunts leak><70> +<cunts open wide><80> +<cunts><10> +<cute tits><80> +<cyber patrol>,<surf watch>,<net nanny><50> +<cyberage platinum><80> +<cybererotica><80> +<cyberfold><10> +<cyberfuc><10> +<cyberphuck><10> +<cyberphuk><10> +<cyberphuq><10> +<cyberporn><10> +<cybersex superstar><80> +<cybersex><10> +<daddy cock><70> +<daily porn><80> +<dailyporn><60> +<daughter fucks><60> +<dd sized rack><50> +<dd sized tit><50> +<deemed pornographic><30> +<deep fucked><60> +<deep puss><50> +<deep throat>,< cock ><80> +<deep throat>,< cum ><80> +<deep throat>,< dick ><80> +<deep throat>,<sex><80> +<deep throat>,<slut><80> +<deep throat>,<sucking><80> +<deep throat>,<whore><80> +<deep throat><30> +<deeper penetration><70> +<deepthroat><30> +<delicious assholes><80> +<delicious clit><80> +<delicious cock><80> +<delicious cunt><80> +<delicious puss><80> +<demonseed><20> +<deprived little bitch><50> +<desire>,< twat ><30> +<desnudas><30> +<desnudus><30> +<dezire>,< horny ><30> +<dezire>,< porn><30> +<dezire>,< slut><30> +<dezire>,< twat ><30> +<dezire>,< xxx ><30> +<dezire>,<fuck><30> +<dialer sex><40> +<diaper loving><80> +<diaper-loving><80> +<dick in her><60> +<dick in his><60> +<dick in my><60> +<dick in their><60> +<dick>,<uncut><50> +<dick>,<un-cut><50> +<dicked in all holes><80> +<diet of cum><80> +<diet of jizz><80> +<dildo cam><80> +<dildo fuck><80> +<dildo loving><80> +<dildo maniac><80> +<dildo orgies><80> +<dildo orgy><80> +<dildo parties><80> +<dildo party><80> +<dildo><10> +<dildocam><80> +<dildofest><80> +<dildosex><50> +<dirtiest babes><40> +<dirtiest slut><80> +<dirty cheerleader><80> +<dirty gay><30> +<dirty panties><80> +<dirty pics><50> +<dirty sanchez><50> +<dirty slut><80> +<dirty stories><80> +<dirty whore><80> +<dirty xxx><80> +<disrobing area><60> +<do not enter if under 21 years of age><80> +<do not enter if you are a minor><60> +<do not enter if you are not at least 18><70> +<do not enter>,<under the age of 18><60> +<doctor love><10> +<dog fuck><80> +<dog sex><80> +<dogfucked><50> +<doggie jizz><80> +<doggie-jizz><80> +<doggiestyle><30> +<doggie-style><30> +<doggy jizz><80> +<doggy-jizz><80> +<doggystyle><30> +<doggy-style><30> +<domination>,<sex><40> +<domination><10> +<dominatrix><20> +<dong penetration><70> +<dorm cam><50> +<dose of cum><80> +<dose of jizz><80> +<double dildo><80> +<double ended dildo><80> +<double fist><80> +<double fucked><60> +<double headed dildo><80> +<double penetration><80> +<double-anal>,<double-vaginal><80> +<down on her knees><20> +<down on his knees><20> +<down on your knees><20> +<download evidence eliminator><50> +<download internet eraser><50> +<downloadable porn><60> +<dr love><10> +<dr. love><10> +<dreamed of sucking><30> +<drenched in cum><50> +<drink cum><80> +<drink jizz><80> +<drinking cum><70> +<drinking jizz><70> +<dripping black pussy><80> +<dripping cum><80> +<dripping jizz><80> +<dripping pink pussy><80> +<dripping pussy><80> +<drunk bitches fuck><60> +<drunk virgin><30> +<dry fuck her><60> +<dwarf>,< horny ><30> +<dwarf>,< porn ><30> +<dwarf>,< slut><30> +<dwarf>,< xxx ><30> +<dwarf>,<fuck><30> +<easybucks.com><80> +<eat carpet><50> +<eat cum><60> +<eat cunt><70> +<eat her arse><40> +<eat her ass><40> +<eat her out><50> +<eat her pussy><80> +<eat his arse><40> +<eat his ass><40> +<eat my arse><40> +<eat my ass><40> +<eat my own cum><70> +<eat my pussy><80> +<eat pussy><80> +<eat snatch><70> +<eat their arse><40> +<eat their ass><40> +<eat twat><50> +<eat your own cum><70> +<eating pussy><60> +<ebony blowjob><70> +<ebony ezine><20> +<ebony on ivory><40> +<ejaculate><10> +<ejaculation><10> +<elder erotica><50> +<elephant cock><30> +<email erotica><80> +<engaging in sexual acts><80> +<enjoy cock><70> +<enjoying cock><70> +<enlarge your penis><70> +<enough cum ><60> +<enter for free porn><80> +<enter your adult check password><80> +<enter your agecheck><80> +<enter your cyberage id><80> +<enter>,<exit>,<years>,<sex>,<explicit><80> +<erectile dysfunction><30> +<erection ring><40> +<erotic asphyxiation><80> +<erotic audio stories><80> +<erotic chat><40> +<erotic club><50> +<erotic email><30> +<erotic enema><70> +<erotic events><60> +<erotic fantasies><70> +<erotic fantasy><70> +<erotic fetish><80> +<erotic gallery><80> +<erotic massage><50> +<erotic nature><30> +<erotic outdoors><50> +<erotic personals><80> +<erotic sex stories><80> +<erotic sex story><80> +<erotic stories><80> +<erotic story><80> +<erotic talk><50> +<erotic teen><70> +<erotic toys><80> +<erotic>,< porn><30> +<erotic>,< twat><30> +<erotic>,< xxx><30> +<erotic>,<fuck><30> +<erotic>,<photo><50> +<erotic>,<picture><50> +<erotic><10> +<erotica guide><70> +<erotica><60> +<escort agency><20> +<escort directory><40> +<escort service><20> +<escorts directory><40> +<eu amateurs><30> +<eunuch><5> +<euroteen><30> +<excessive facials><50> +<exclusive hardcore><80> +<exclusive lolita><80> +<exclusive members area>,<adult><60> +<exclusive model>,<nude><80> +<exclusive nude photo><80> +<excrete><5> +<excretion><5> +<excretory><5> +<exhibition ezine><20> +<exhibitionism><10> +<exhibitionist><10> +<expecting sex><20> +<explicit anal><80> +<explicit images of nude adults><50> +<explicit lesbian><80> +<explicit nude shows><80> +<explicit pics><80> +<explode your load><80> +<exploited>,<teen><30> +<exploited><10> +<explosive shit><20> +<expose to minors><30> +<exposed peehole><70> +<extra adult site><80> +<extreme adult content><80> +<extreme anal><80> +<extreme bdsm><70> +<extreme bondage><70> +<extreme erotica><80> +<extreme fetish><60> +<extreme fucking><80> +<extreme hardcore><80> +<extreme penetration><50> +<extreme porn><80> +<extreme rape><30> +<extreme sex><80> +<extreme sexual content><80> +<extreme sodomy><30> +<extreme xxx><80> +<extremely hardcore><40> +<ezlolita><90> +<face drenched><60> +<faces drenched><60> +<facial cum><80> +<facial feast><50> +<facial masters><50> +<facial sex><80> +<facial>,< cum ><50> +<facial>,< horny ><80> +<facial>,< slut><80> +<facial>,< twat ><80> +<facial>,< xxx ><80> +<facial>,<free>,<preview><50> +<facial>,<fuck><80> +<fanstasyfest><30> +<fantastic facial><20> +<fantasy fest><30> +<fantasy toons><30> +<fantasy xxx><80> +<fat bitch sex><50> +<fat cock><40> +<fat fantasies><70> +<fat horny mama><80> +<fat horny woman><80> +<fat horny women><80> +<fat porn><80> +<fat titties><40> +<fat whore><80> +<fathole><40> +<feel his cock><70> +<feel my cock><70> +<felatio><30> +<felching><30> +<fem domination><40> +<female domination><70> +<female fisting><80> +<femdom><10> +<femme fatal><20> +<fetish desires><50> +<fetish ezine><20> +<fetish gallery><40> +<fetish image><30> +<fetish wear><30> +<fetish>,< anal ><30> +<fetish>,< porn><30> +<fetish>,< slut><30> +<fetish>,< xxx><30> +<fetish>,<bondage><50> +<fetish>,<fuck><30> +<fhm><10> +<fill their>,<with cum><80> +<filthy sex><80> +<filthy slut><80> +<filthy turd><40> +<find such material personally offensive><30> +<fine booty><40> +<finest xxx><50> +<finger fuck><80> +<finger in her cunt><70> +<finger in her puss><70> +<finger myself><70> +<finger up her anus><80> +<finger up her cunt><70> +<finger up her puss><70> +<finger up his anus><80> +<finger>,< twat ><20> +<finger>,<cunt><30> +<finger>,<pussy><20> +<finger>,<slut><20> +<fingerfuck><40> +<finger-fuck><80> +<fingering girls><70> +<fingering women><70> +<fingering><30> +<fingers in her cunt><70> +<fingers in her puss><70> +<fingers up her cunt><70> +<fingers up her puss><70> +<fist fuck><80> +<fisted her><50> +<fisted his><50> +<fisted><20> +<fistfuck><70> +<fisting fantas><70> +<fisting gallery><80> +<fisting movie><80> +<fisting photo><80> +<fisting pics><80> +<fisting sex><80> +<fisting video><80> +<fisting><20> +<fists in her ass><70> +<fists in his ass><90> +<fitness>,< model><50> +<flab fucking><80> +<flab-fucking><80> +<flash in public><30> +<flashed in public><30> +<flashing amateurs><50> +<food porn><50> +<foot fetish ezine><20> +<foot fucker><80> +<for adults aged 18 and over><60> +<for discerning adults><70> +<for the discerning adult><70> +<forbidden rape><40> +<forced fuck><80> +<forced teen><30> +<forced to fuck><80> +<forced to suck cock><80> +<forced to suck his><80> +<forced-sex><50> +<foreplay><10> +<foreskin><10> +<fornicate><20> +<fornication><20> +<four cocks in two holes><60> +<free amateur pics><80> +<free amateur><30> +<free anal><30> +<free anime><30> +<free asian><30> +<free ass><30> +<free avs><60> +<free balloon><30> +<free bbw><30> +<free bdsm><30> +<free big tit><30> +<free black><30> +<free blonde><30> +<free blowjob><60> +<free bondage><30> +<free brunette><30> +<free cheerleader><30> +<free cumshot><30> +<free dirty pics><80> +<free dirty picture><80> +<free dirty pix><80> +<free ebony><30> +<free exhibition><30> +<free fetish><30> +<free foot fetish><30> +<free gay><30> +<free hardcore><80> +<free indian><30> +<free interracial><30> +<free latina><30> +<free lesbian><30> +<free live fucking><80> +<free lolita><60> +<free mature><30> +<free panty><30> +<free pantyhose><30> +<free password><10> +<free pic>,<amateur>,<sex><80> +<free pic>,<naughty nurse><80> +<free pic>,<nude beaches><80> +<free pic>,<turned on><80> +<free porn><80> +<free rape><30> +<free russian><30> +<free schoolgirl><30> +<free sex ><80> +<free sex pic><80> +<free sex stories><80> +<free sex!><80> +<free shemale><30> +<free smoking><30> +<free smut><80> +<free softcore><70> +<free stocking><30> +<free stories><30> +<free teen hotties><80> +<free teen><30> +<free tiny tits><30> +<free tour>,<camera><10> +<free tour>,<girls><30> +<free tour>,<sex><20> +<free tour><10> +<free transsexual><30> +<free uncensored><50> +<free upskirt><30> +<free voyeur><30> +<free x-rated><80> +<free xxx><80> +<freeporn><80> +<freesex><80> +<frenum><5> +<fresh young teen><30> +<friendly erotica><80> +<fuck & suck><80> +<fuck a dog><70> +<fuck a horse><80> +<fuck and suck><80> +<fuck animal><80> +<fuck away><30> +<fuck circus><50> +<fuck club><60> +<fuck cunt><80> +<fuck display><60> +<fuck dogs><80> +<fuck fest><80> +<fuck flix><80> +<fuck for the first time><40> +<fuck her dad><80> +<fuck her loose><70> +<fuck her uncle><80> +<fuck in the dark><80> +<fuck little girl><80> +<fuck my little><80> +<fuck my loose><80> +<fuck my pussy><80> +<fuck my wet><80> +<fuck pic><60> +<fuck pussy><80> +<fuck series><80> +<fuck site><80> +<fuck sluts><70> +<fuck toy><50> +<fuck twat><70> +<fuck young boys><80> +<fuck young girls><80> +<fuck your mom><80> +<fuck your mum><80> +<fuck your neighbor><40> +<fuck>,< porn><20> +<fuck>,< twat><20> +<fuck>,< xxx><20> +<fuck>,<horny><20> +<fuck>,<slut><20> +<fuck><30> +<fuckable><60> +<fucked by a><50> +<fucked by everyone><40> +<fucked hard><40> +<fucked in an alley><70> +<fucked in ass><80> +<fucked in every hole><80> +<fucked slut><50> +<fucked so hard><60> +<fucked some><30> +<fucked them><30> +<fucked toon><80> +<fucked with utensils><70> +<fuckfest><80> +<fucking and sucking><80> +<fucking black ass><70> +<fucking black pussy><70> +<fucking fat><50> +<fucking for the first time><40> +<fucking girls><30> +<fucking horny><80> +<fucking horse><80> +<fucking like animals><60> +<fucking little girl><80> +<fucking me><50> +<fucking my pussy><80> +<fucking pink pussy><70> +<fucking slut><50> +<fucking their brains out><80> +<fucking tits><80> +<fucking virgins><80> +<fucking young girl><80> +<fucks neighbor><40> +<fucks neighbour><40> +<fucks some><30> +<fucksite><80> +<fuck-site><80> +<fucktoy><50> +<fuck-toy><50> +<fuckwad><20> +<full fist in cunt><80> +<full fist in puss><80> +<full fist in twat><80> +<full frontal><20> +<full length porn><80> +<full nude><50> +<full of cum><70> +<full of jizz><80> +<fun with feces><60> +<funbags><20> +<gain free access>,< porn><60> +<gang bang>,< porn><40> +<gang bang>,< slut><40> +<gang bang>,< twat ><40> +<gang bang>,< xxx ><40> +<gang bang>,<free preview><40> +<gang bang>,<free tour><40> +<gang bang>,<fuck><40> +<gang bang>,<pussies><40> +<gang bang>,<pussy><40> +<gang bang>,<sex><40> +<gang bang><30> +<gangbang girl><40> +<gangbang model><40> +<gangbang whore><40> +<gangbang>,< porn><40> +<gangbang>,< slut><40> +<gangbang>,< twat ><40> +<gangbang>,< xxx ><40> +<gangbang>,<free preview><40> +<gangbang>,<free tour><40> +<gangbang>,<fuck><40> +<gangbang>,<pussies><40> +<gangbang>,<pussy><40> +<gangbang>,<sex><40> +<gangbang><30> +<gangraped><40> +<garter belt><5> +<gay anal hardcore><80> +<gay big cock><50> +<gay ebony><60> +<gay ezine><20> +<gay hardcore><80> +<gay movies><50> +<gay porn><80> +<gay sex pic><80> +<gay sex stories><80> +<gay sex><30> +<gay swinger><80> +<gay threesome><80> +<gayclub><70> +<genital><5> +<gerbling><20> +<get a bigger penis><80> +<get fucked for the first time><80> +<get instant access><10> +<get into adult paysites for free><80> +<get wild><10> +<get your ass pass><70> +<gets nailed><20> +<getting a hand job><60> +<getting fisted><80> +<getting fucked><50> +<getting gangbanged><80> +<getting rimmed><80> +<getting your rocks off><30> +<giant cock><80> +<giant tits><80> +<girl getting fucked><80> +<girl on girl action><80> +<girl orgies><80> +<girl orgy><80> +<girl porn><50> +<girl>,< fucking girls><80> +<girl>,<babe>,<topless><40> +<girl>,<drinking cum><80> +<girl>,<getting fucked><80> +<girl-girl action><80> +<girls perform><30> +<girls suck cock><60> +<give some skank><30> +<giving blowjobs><80> +<giving head><20> +<golden shower><80> +<golden trickle><40> +<goldenshower><80> +<golden-shower><80> +<gonhorrea><10> +<gooey cum><70> +<gooey jizz><70> +<grab her tits><50> +<grannies fucking><80> +<grannies n fatties><90> +<granny banging><80> +<granny fuck><80> +<granny grab ><80> +<granny grabbing><80> +<granny pussy><60> +<granny sex><80> +<granny xxx><80> +<grannys pussy><60> +<graphic sexual><30> +<graphic visual depictions><50> +<great assholes><80> +<great clits><80> +<great cocks><80> +<greek style><30> +<group fuck><80> +<group masturbation><70> +<group sex><80> +<groupfuck><80> +<groupsex gallery><80> +<groupsex><80> +<grow your penis><60> +<g-spot play><70> +<g-spot stimulation><70> +<g-spot stimulator><70> +<g-spot vibe><60> +<g-spot vibrator><60> +<guyberfold><10> +<gynaecology><5> +<gynecological><5> +<gynecology><5> +<gyno cam><50> +<gyno girl><80> +<hairy bear>,<big>,<men><80> +<hairy bear>,<gay><80> +<hairy goblet><50> +<hairy puss><80> +<hairy pussy><60> +<hairy tacho><60> +<hand job><30> +<hand to gland combat><60> +<handballing><20> +<hand-job><30> +<hanky panky><20> +<hankypanky><20> +<hanky-panky><20> +<hard assfuck><70> +<hard core><10> +<hard fucking><80> +<hard interracial><50> +<hard nipples><20> +<hardcore adult><50> +<hardcore animation><80> +<hardcore bdsm><70> +<hardcore bondage><70> +<hardcore celeb><80> +<hardcore couple><80> +<hardcore cum><70> +<hardcore enthusiast><60> +<hardcore explicit><80> +<hardcore ezine><20> +<hardcore fucking><70> +<hardcore gay><80> +<hardcore girls><80> +<hardcore hoe><60> +<hardcore image series><50> +<hardcore mega site><80> +<hardcore milf><80> +<hardcore movie><60> +<hardcore online><80> +<hardcore pic><80> +<hardcore pics in your email><80> +<hardcore pictorials><70> +<hardcore pix><80> +<hardcore porn><80> +<hardcore pussy><80> +<hardcore sex><80> +<hardcore shit><40> +<hardcore>,<slut><80> +<hardcore streaming video><80> +<hardcore suck><80> +<hardcore tour><80> +<hardcore tramps><80> +<hardcore uncensored><80> +<hardcore video series><50> +<hardcore whore><80> +<hardcore xxx><80> +<hardcore>,<fuck><10> +<hard-on><10> +<having sex on camera><80> +<having sex on tape><80> +<having sex on video><80> +<head job>,< slut><80> +<head job>,< twat ><80> +<head job>,< xxx ><80> +<head job>,<centerfold><80> +<head job>,<cock><80> +<head job>,<dick><80> +<head job>,<pussy><80> +<head job>,<suck><80> +<head job><40> +<headjob>,< slut><80> +<head-job>,< slut><80> +<headjob>,< twat ><80> +<head-job>,< twat ><80> +<headjob>,<centerfold><80> +<head-job>,<centerfold><80> +<headjob>,<cock><80> +<head-job>,<cock><80> +<headjob>,<dick><80> +<head-job>,<dick><80> +<headjob>,<pussy><80> +<head-job>,<pussy><80> +<headjob>,<suck><80> +<head-job>,<suck><80> +<headjob>,<xxx><80> +<head-job>,<xxx><80> +<head-job><40> +<heavy hotties><70> +<help us keep minors out><50> +<hentai action><50> +<hentai erotica><80> +<hentai playground><80> +<hentai porn><80> +<hentai sex><80> +<hentai studios><70> +<hentai><30> +<her fat ass><30> +<hermaphrodite><20> +<herpes simplex><5> +<herpes><5> +<heterosexual><10> +<hidden camera><10> +<high quality adult><60> +<high quality porn><80> +<highly offensive adult><60> +<high-quality porn><80> +<hirsute honeys><60> +<home porn movies><70> +<homoerotic><20> +<homosexual><5> +<hooker>,< horny ><30> +<hooker>,< slut><30> +<hooker>,< xxx ><30> +<hooker>,<fuck><30> +<hornee><10> +<horney><10> +<horniest bitch><80> +<horniest><10> +<horny 4 cock><80> +<horny 4 puss><80> +<horny amateur><80> +<horny and curious><80> +<horny and lookin><80> +<horny biatch><80> +<horny bisexual><80> +<horny bi-sexual><80> +<horny bitch><80> +<horny black><70> +<horny blonde><80> +<horny brunette><80> +<horny cheer><80> +<horny cock><80> +<horny college><60> +<horny couple><60> +<horny for cock><80> +<horny for puss><80> +<horny fun><40> +<horny girl><80> +<horny grannies><80> +<horny granny><80> +<horny hardcore><80> +<horny homemaker><70> +<horny homemakers><60> +<horny housewife><70> +<horny housewives><70> +<horny lesbian><80> +<horny little girl><80> +<horny little slut><80> +<horny lolita><80> +<horny members><80> +<horny older><50> +<horny puss><80> +<horny redhead><80> +<horny rob><80> +<horny school><80> +<horny slut><70> +<horny teen><60> +<horny whore><80> +<horny woman><80> +<horny women><80> +<horny><50> +<hornyrob><80> +<horse cum><80> +<horse fuck><80> +<horse jizz><80> +<horse sex><80> +<hot & horny><80> +<hot 3-way><60> +<hot adult action><80> +<hot adult pic><80> +<hot amateur><40> +<hot and horny><80> +<hot and sticky>,<cum><60> +<hot and sticky>,<jizz><60> +<hot babes being tied up><70> +<hot babes pissing><70> +<hot blowjob><60> +<hot cum><80> +<hot dick><50> +<hot fuck><80> +<hot gays><80> +<hot house wifes><70> +<hot house wives><70> +<hot jizz><80> +<hot lesbian><80> +<hot lesbo><80> +<hot load><10> +<hot masturbation><60> +<hot men strip><80> +<hot model><50> +<hot nasty bitch><80> +<hot nurse><30> +<hot pornstar><70> +<hot pussy><80> +<hot>,< slut><80> +<hot steamy sex><50> +<hot teen bitch><80> +<hot teen sex><80> +<hot teen><30> +<hot tits><80> +<hot toon action><80> +<hot wet action><80> +<hot women strip><80> +<hot xxx><80> +<hot young virgins><80> +<hotel slut><80> +<hotsex><10> +<hottest adult site><60> +<hottest babes><30> +<hottest girls><20> +<hottest hardcore><80> +<hottest lesbian><80> +<hottest lesbo><80> +<hottest pics><50> +<hottest porn star><80> +<hottest pornstar><80> +<hottest stripclubs><80> +<hottest><5> +<hottie><30> +< hottie>,< girl><50> +<huge breasts><80> +<huge cock><50> +<huge cumshot><70> +<huge dick><80> +<huge hooters><80> +<huge jugs><80> +<huge knockers><80> +<huge natural tits><80> +<huge tits><80> +<hung like a horse><60> +<husband cock><60> +<hustler mag><40> +<hymen><5> +<i accept full respnsibility for my actions><20> +<i agree and want to proceed><30> +<i am an adult><50> +<i am at least 18 years of age><80> +<i am at least 21 years of age><80> +<i am naked><40> +<i am not a law enforcement officer><50> +<i am not prohibited>,<view sexually explicit><50> +<i am of legal age><20> +<i am under age and want to exit now><100> +<i understand if i misrepresent my age><20> +<i undertake that i am over 21><80> +<i want to be raped><50> +<if i misrepresent my age><20> +<if you are a parent and you want to block this site><80> +<if you are not an adult><40> +<if you want pussy><70> +<if you want to block this site><80> +<if you>,<looking for porn>,<credit card><80> +<illegal pic><50> +<illegal to view>,<in your community><70> +<images>,<sexually explicit><50> +<impotence><10> +<impotent><10> +<in compliance with u.s.c><80> +<in compliance with usc><80> +<in her hot hole><90> +<in her hot pussy><90> +<in her pussy><90> +<in her tight little ass><90> +<in her wet hole><90> +<in her wet pussy><90> +<in his tight little ass><90> +<in my hot hole><90> +<in my hot pussy><90> +<in my pussy><90> +<in my wet hole><90> +<in my wet pussy><90> +<in need of sex><70> +<in the nude><20> +<in their hot hole><80> +<in their hot pussy><80> +<in their pussy><80> +<in their tight little ass><80> +<in their wet hole><80> +<in their wet pussy><80> +<incest love><40> +<incest rape<50> +<incest stories><40> +<incest story><40> +<incest video><40> +<incest>,< galler><40> +<incest>,< horny ><40> +<incest>,< porn><40> +<incest>,< slut><40> +<incest>,< twat ><40> +<incest>,< xxx ><40> +<incest>,<fetish><40> +<incest>,<fuck><40> +<incest><10> +<inch cock><50> +<inch dong><60> +<indian ezine><20> +<indian slut><80> +<inner thigh><10> +<innocent lolita><60> +<insane orgy><50> +<instant access>,<cock>,<suck><40> +<instant access>,<credit card>,< porn><80> +<instant access>,<credit card>,<sex><80> +<instant access>,<fetish><40> +<instant access>,<fuck><40> +<instant access>,<horny><40> +<instant access>,<porn><40> +<instant access>,<pussy><40> +<instant access>,<slut><40> +<instant access>,<twat><40> +<instant access>,<xxx><40> +<instant access><10> +<intended for adult><40> +<intended for consenting adults>,<18 years><40> +<intended for consenting adults><50> +<intended for mature adults><60> +<intended solely for adults><70> +<intense bondage><60> +<interacial threesome><70> +<interactive erotic><70> +<interactive orgies><80> +<interactive orgy><80> +<interactive sex shows><80> +<interactive xxx><80> +<intercourse><5> +<interracial ezine><20> +<interracial fuck><50> +<interracial hardcore><70> +<interracial><10> +<is a fucking><80> +<is an adult oriented site><80> +<is an adult-oriented site><60> +<is not suitable for minors>,<naked><80> +<is not suitable for minors>,<nude><80> +<is not suitable for minors>,<porn><80> +<is not suitable for minors>,<sex><80> +<jack off while you wait><70> +<jack off><30> +<jack-off machine><70> +<jelly vibe><50> +<jelly vibrator><50> +<jenna jameson><80> +<jerk ball licking><80> +<jerk ball><30> +<jerking rod><60> +<jilling off><60> +<jism><30> +<jizm><30> +<jizz all over><80> +<jizz angel><50> +<jizz burping><70> +<jizz coated><70> +<jizz diet><80> +<jizz facial><80> +<jizz guzzling><70> +<jizz in her><70> +<jizz in his><70> +<jizz in the><70> +<jizz in their><70> +<jizz junkies><80> +<jizz junky><80> +<jizz load><80> +<jizz loving><70> +<jizz party><60> +<jizz shoots><80> +<jizz slut><70> +<jizz suck><80> +<jizz swallow><80> +<jizz thirsty><80> +<jizz><20> +<jizzloving><70> +<join now><10> +<juicing a woody><70> +<juicy cunt><80> +<juicy funbags><60> +<juicy pussies><80> +<juicy pussy><80> +<juicy twat><80> +<just legal starlet><80> +<just turned 18><20> +<kama sutra><20> +<kamasutra><20> +<kara's adult playground><80> +<kara's amateurs><80> +<kara's sex><80> +<karups><80> +<karup's><80> +<kiddie porn><20> +<king of pussy><60> +<kinky slut><80> +<kinky whore><80> +<kinky xxx><80> +<klixxx.com><80> +<knocked up slut><80> +<labia><5> +<lactat>,< horny ><30> +<lactat>,< porn><30> +<lactat>,< slut><30> +<lactat>,< xxx ><30> +<lactat>,<cunt><30> +<lactat>,<fuck><30> +<lactate><5> +<lactating pussy><80> +<lactating vagina><80> +<lactating><10> +<ladies with dicks><70> +<largest xxx><80> +<latex slut><70> +<latex teens><30> +<latex whore><70> +<latex>,<bondage><50> +<latex>,<fetish><50> +<latina ezine><20> +<latina fetish><40> +<latina porn><60> +<latino lesbian><80> +<leaking smoo><30> +<leather thong><50> +<legal teen girls><40> +<legal teen video><80> +<legal teen><30> +<legally allowed to access>,<naked><50> +<lesbian action><80> +<lesbian bordello><80> +<lesbian cowgirls><70> +<lesbian dildo><80> +<lesbian double><80> +<lesbian ezine<20> +<lesbian fantasies><70> +<lesbian fantasy><70> +<lesbian gallery><60> +<lesbian haven><40> +<lesbian love><10> +<lesbian nurse><70> +<lesbian photo><60> +<lesbian porn><80> +<lesbian pussy><60> +<lesbian site><30> +<lesbian strap><80> +<lesbian teens><80> +<lesbian three><80> +<lesbians lick><70> +<lesbians masturbating><80> +<lesbo series><80> +<lewd photo><50> +<lewd pic><50> +<lezbo series><80> +<lick carpet><50> +<lick clit><60> +<lick cum><60> +<lick hard cock><80> +<lick her ass><80> +<lick her cunt><80> +<lick her pussy><80> +<lick her skanky><80> +<lick her slit><80> +<lick her slot><80> +<lick his arse><70> +<lick his ass><70> +<lick his cock><70> +<lick his cum><70> +<lick his dick><70> +<lick jizz><80> +<lick the jizz><80> +<licked>,<sucked>,<wank><60> +<lickin lovers><60> +<licking black cunt><80> +<licking her pussy><80> +<licking pussy><80> +<licking whore><70> +<lifestyle without clothes><20> +<like to suck><20> +<lingerie>,<amateur><50> +<lingerie><5> +<lips around huge cock><80> +<little girl sex><50> +<little lolita><80> +<little puss><40> +<little slut><80> +<little teen babe><20> +<little teen babes><30> +<little tits><80> +<little whore><40> +<little-puss><70> +<live anal><40> +<live and uncensored><40> +<live and un-censored><40> +<live fuck shows><80> +<live fucking><80> +<live lesbian><80> +<live naked><50> +<live orgies><70> +<live orgy><70> +<live penetration><80> +<live pussy action><80> +<live sex chat><80> +<live sex room><70> +<live sex show><80> +<live sex><40> +<live strip><60> +<live teen sex><80> +<live xxx cams><80> +<live xxx><70> +<livehardcore.com><80> +<livesex><80> +<livesex4less><80> +<lluvia dorada><30> +<load of cream><20> +<load of cum><80> +<load of jizz><80> +<load shot>,<face><40> +<lolita art><70> +<lolita bitch><30> +<lolita facial><60> +<lolita free><70> +<lolita gratis><70> +<lolita project><50> +<lolita sex><80> +<lolita site><60> +<lolita studio><70> +<lolita video><20> +<lolita world><70> +<lolita>,< horny ><40> +<lolita>,< porn><40> +<lolita>,< slut><40> +<lolita>,< xxx ><50> +<lolita>,<forbidden><60> +<lolita>,<fuck><40> +<lolita><20> +<lolitas art><70> +<lolitas free><70> +<lolitas gratis><70> +<lolitas sex><70> +<lolitas site><80> +<lolitas world><70> +<lolitasex><80> +<loping your mule><60> +<love cuffs><30> +<love doll><40> +<love to fuck><80> +<love to have cock><60> +<love to have your cock><60> +<love tool><30> +<loves being fucked><80> +<loves cock in her ass><80> +<loves cock in her pussy><80> +<loves cock in her twat><80> +<loves to fuck><80> +<luscious rack><50> +<luscious tit><80> +<male fucking><80> +<man cream><50> +<man seeking><10> +<mancheck>,<gay><80> +<manual sex><40> +<massive breasts><80> +<massive hooters><80> +<massive jugs><80> +<massive mammories><60> +<massive tits><80> +<masterbate><10> +<masterbating><10> +<masturbat>,< porn><40> +<masturbat>,< slut><40> +<masturbat>,< twat ><40> +<masturbat>,< xxx ><50> +<masturbat>,<fuck><20> +<masturbat>,<join>,<member><40> +<masturbat>,<pussies><30> +<masturbat>,<pussy><30> +<masturbate men><50> +<masturbate with a><60> +<masturbate women><50> +<masturbating and cumming><70> +<masturbating mom><70> +<masturbating with a><60> +<masturbation galler><80> +<masturbation movie><80> +<masturbation online><80> +<masturbation pics><80> +<masturbation picture><80> +<masturbation technique><60> +<masturbation video><80> +<matchmaker><10> +<matchmaking><10> +<material intended for adult><60> +<mature babes fuck><70> +<mature babes having sex><70> +<mature ezine><20> +<mature fucking><80> +<mature pussy><70> +<mature sluts><80> +<mature tits><60> +<mature whore><70> +<matures in action><50> +<maximumcash.com><80> +<meat curtains><30> +<meet and fuck><40> +<mega fuck site><80> +<mega porn><80> +<megaporn><80> +<megasex><80> +<member section><30> +<members entrance><20> +<members only><5> +<membership will automatically renew><20> +<men enlarge your penis><80> +<men fucking men><80> +<men masturbate><50> +<men seeking><10> +<menstruate on his semen><70> +<menstruate on there semen><70> +<menstruate on your semen><70> +<messy blowjob><70> +<messy cum shot><70> +<messy cumshot><70> +<messy cum-shot><70> +<messy handjob><70> +<mff action><70> +<mff orgy><70> +<midget fantas><80> +<midget fuck><80> +<midget lust><80> +<midget porn><80> +<midget sex><80> +<midget>,< horny ><40> +<midget>,< porn><20> +<midget>,< slut><40> +<midget>,< xxx ><40> +<milf hunt><50> +<milf search><50> +<milf site><50> +<milk your dick><70> +<milking the bull><70> +<milking the mouse><60> +<millions of nude pics><80> +<mistress><10> +<mmf action><70> +<mmf dick slapping><80> +<mmf orgy><70> +<model galler><40> +<model>,<fetish><50> +<models were over 18 at the time><50> +<models were over the age of 18><60> +<models>,<appearing>,<18 or older><80> +<moist panties><80> +<mom fucking><70> +<mom we fuck><60> +<moms you want to fuck><80> +<monkey spank><50> +<monster cocks><80> +<monster hooters><80> +<most erotic><40> +<most explicit teen><80> +<mosteroticteen><80> +<mother fucker><30> +<motherfuck><10> +<mother-fucker><30> +<mothers you want to fuck><80> +<mouthful of cum><70> +<mouthful of jizz><70> +<movies from paysites><40> +<muff dive><30> +<muff diving><30> +<muff sniff><30> +<muffdive><30> +<multiple cocks><40> +<mums you want to fuck><80> +<munch pussy><80> +<must be over 18 to enter><70> +<must not be viewed by minors><50> +<muthafuck><10> +<mutual masturbation><70> +<my nude shots><60> +<nail a fat chick><70> +<nail a fat slut><70> +<nail a fat whore><70> +<nail a fat woman><70> +<naked amateur><80> +<naked and nasty><80> +<naked celeb><80> +<naked chick><80> +<naked on cam><50> +<naked on my cam><50> +<naked on their cam><50> +<naked online><70> +<naked young kiddy><80> +<naked young>,<pic><30> +<naked young><30> +<naked>,< horny ><30> +<naked>,< twat ><30> +<naked>,< xxx ><40> +<naked>,<fuck><30> +<naked><10> +<nakled and spread><50> +<nastiest and youngest><80> +<nastiest sex><40> +<nastiest>,<naughtiest>,<hottest><50> +<nasty hentai><70> +<nasty interracial><50> +<nasty shots><30> +<nasty whore><40> +<nasty xxx><60> +<naughty amateur><80> +<naughty neighbor><30> +<naughty nurse><40> +<naughty stories><40> +<naughty story><40> +<naughty>,< horny ><40> +<naughty>,< slut><40> +<naughty>,< xxx ><50> +<naughty>,<fuck><30> +<naughty><10> +<necrophelia><40> +<needing spanking><50> +<needs a cock><50> +<needs cock><50> +<needs some cock><50> +<needs to fuck><60> +<netnanny>,<cyberpatrol>,<surfwatch>,<safesurf>,<cybersitter><60> +<netnanny>,<cyberpatrol>,<surfwatch><30> +<never been fucked><70> +<new erotica><80> +<new girls added><30> +<new hardcore><40> +<new lolita><60> +<new porn><80> +<new xxx><50> +<newcummer><10> +<nice firm hooters><70> +<nice looking slut><30> +<nipple clamp><40> +<nipple erection><80> +<nipple><10> +<no avs!><40> +<no credit card needed><30> +<no credit card required><30> +<no credit card>,< porn><80> +<no minors allowed><30> +<no minors are allowed><30> +<non stop fornication><80> +<nonstop fornication><80> +<non-stop fornication><80> +<not intended to be viewed by minors><40> +<not of legal age>,<sexual material offends><70> +<not offended by sexually explicit material><80> +<not show this material to minors><60> +<not suitable for all ages><30> +<not suitable for minors><30> +<nubile beauties><40> +<nubile tighties><70> +<nude adults engaged in sex><50> +<nude amateur><60> +<nude beach><30> +<nude beautiful><30> +<nude beauty><30> +<nude bodybuilder><70> +<nude celebrit><80> +<nude celebs><80> +<nude for you><50> +<nude girl><40> +<nude image><50> +<nude in public><40> +<nude lolita><80> +<nude male celeb><80> +<nude model><20> +<nude mom><80> +<nude pictures and videos><80> +<nude pornstar><50> +<nude sex show><80> +<nude webcam><70> +<nudes in all flavors><80> +<nudists paradise><70> +<nudists-paradise><70> +<nudity and sexual activity><50> +<nudity does not offend me><80> +<nugget sex award><80> +<nut buster><80> +<nymphet>,<illegal><80> +<nymphet>,<lolita><70> +<nymphet>,<model><60> +<nymphet>,<paysite><80> +<nymphet>,<photo><60> +<nymphet>,<young><40> +<nymphet><20> +<nympho fuck><80> +<nympho girl><80> +<nympho slut><80> +<nympho suck><80> +<nympho teen><80> +<nympho whore><80> +<nympho women><80> +<nymphomaniac fuck><80> +<nymphomaniac girl><80> +<nymphomaniac slut><80> +<nymphomaniac suck><80> +<nymphomaniac teen><80> +<nymphomaniac whore><80> +<nymphomaniac women><80> +<nymphomaniac><20> +<object to viewing sexually explicit><50> +<offended by sexual material><50> +<offensive adult material><60> +<offensive gay><30> +<official nude><50> +<old and horny><80> +<old biddies spreading their legs><80> +<old biddies>,<xxx><40> +<old n horny><80> +<old sluts><50> +<on film fucking><80> +<on the end of your knob><70> +<on your knob><40> +<one cock is not enough><80> +<one hand typer><20> +<one hand typing><20> +<one-night stand><10> +<online pleasure><40> +<online sex><80> +<online teen sex><70> +<only adults 18+ and over may enter><80> +<only be accessed by legal adults><60> +<open pussies><70> +<open pussy><70> +<oral frenzy><50> +<oral lover><50> +<oral sex><25> +<orgasm balls><80> +<orgasm>,< cum><30> +<orgasm>,< horny ><30> +<orgasm>,< porn><30> +<orgasm>,< slut><30> +<orgasm>,< twat ><30> +<orgasm>,< xxx ><30> +<orgasm>,<fuck><30> +<orgasm>,<pussy><30> +<orgasm><5> +<orgasmic lust><80> +<orgazm><5> +<orgies>,< horny ><30> +<orgies>,< porn><30> +<orgies>,< slut><30> +<orgies>,< teen><30> +<orgies>,< xxx ><30> +<orgy machine><80> +<orgy slut><80> +<orgy>,< horny ><40> +<orgy>,< porn><40> +<orgy>,< slut><40> +<orgy>,< teen><30> +<orgy>,< xxx ><30> +<orgy>,<fuck><40> +<outragerous sexual acts><80> +<outside orgy><70> +<overflowing tits><80> +<p0rn0><60> +<p0rno><60> +<pamela sex video><80> +<panties>,< horny ><30> +<panties>,< porn><40> +<panties>,< slut><30> +<panties>,< xxx ><40> +<panties>,<fuck><20> +<panties><20> +<panty ezine><20> +<panty fetish><50> +<panty sniff><50> +<panty>,< horny ><30> +<panty>,< porn><40> +<panty>,< slut><30> +<panty>,< xxx ><40> +<panty>,<fuck><30> +<pantyhose ezine><20> +<pantyhose fetish><50> +<participating verified website><50> +<party doll><40> +<party slut><30> +<pay for porn><50> +<pay site for free><50> +<paysite for free><50> +<pay-site for free><50> +<paysite pass>,<free><70> +<paysite pass><30> +<pay-site><30> +<paysites for free><60> +<pearl necklace>,<cum><70> +<pearl necklace>,<jizz><70> +<pearl necklace><10> +<pearly bird><40> +<pedophile><10> +<pedophilia><10> +<pee cam><80> +<pee sex><80> +<pee spurt><50> +<pee stories><40> +<pee story><40> +<peeing and shitting><60> +<peesex><80> +<pee-sex><80> +<penetrated teen><60> +<penetration shots><80> +<penetration>,< horny ><40> +<penetration>,< porn><40> +<penetration>,< slut><40> +<penetration>,< twat ><40> +<penetration>,< xxx ><40> +<penetration>,<fuck><40> +<penetration>,<pussy>,<sex><20> +<penetration><10> +<penile pleasure><60> +<penile><10> +<penis enlarger><50> +<penis suck><80> +<perfect cock><60> +<perfect cunt><60> +<perfect pussies><60> +<perfect pussy><60> +<perfect slut><60> +<perfect tits and ass><80> +<perfect vagina><60> +<perform for you><30> +<performing sexually explicit><80> +<permit any minor to see this material><50> +<permit any minor to see this site><50> +<permit any minor to see this web><50> +<perversion><10> +<perversity><10> +<pervert><10> +<petite latina><40> +<petite slut><80> +<petite teen><30> +<petite virgin><50> +<petite>,< horny ><40> +<petite>,< porn><40> +<petite>,< slut><40> +<petite>,< twat ><40> +<petite>,< xxx ><30> +<petite>,<fuck><40> +<petite>,<illegal><30> +<phallic><5> +<phallus><5> +<phone sex><80> +<phonesex><80> +<photos of young girls><50> +<phuck>,< horny ><30> +<phuck>,< porn><30> +<phuck>,< slut><30> +<phuck>,< twat ><30> +<phuck>,< xxx ><30> +<phuck>,<pussy><30> +<phuck>,<sex><30> +<phuck><10> +<pick up sluts><40> +<pics and movies><60> +<pics of young girls><50> +<pierced nipple><20> +<pierced pussy><50> +<pimp daddy><40> +<pink 4 free><80> +<pink bit>,< horny ><80> +<pink bit>,< porn><80> +<pink bit>,< slut><80> +<pink bit>,< twat ><80> +<pink bit>,< xxx ><80> +<pink bit>,<fuck><80> +<pink bit>,<pussy><80> +<pink bit>,<sex><80> +<pink bit><20> +<pink chocolate><20> +<pink>,<lips><50> +<pink4free><80> +<pinkbit>,< horny ><80> +<pinkbit>,< porn><80> +<pinkbit>,< slut><80> +<pinkbit>,< twat ><80> +<pinkbit>,< xxx ><80> +<pinkbit>,<fuck><80> +<pinkbit>,<pussy><80> +<pinkbit>,<sex><80> +<pinkbit><20> +<pinup starlets><50> +<piss pics><80> +<piss play><50> +<piss slit><60> +<planet cum><50> +<planet cunt><80> +<plastic cock><60> +<plastic dick><60> +<play with my pussy><70> +<play with your cock><50> +<play with your penis><50> +<play with yourself><60> +<playboy><50> +<played with herself><40> +<playing with dildo><80> +<playing with your cock><50> +<playing with your penis><50> +<playing with yourself><60> +<playmate><50> +<please click enter only if you are over the age of 18><80> +<pleasure balls><60> +<plug every orifice><70> +<plump babe><40> +<plumper puss><50> +<polish your knob><70> +<polishing your knob><70> +<poo sex><80> +<poontang><10> +<poop>,< xxx ><80> +<poosex><80> +<pork flute><70> +<pork her><20> +<pork him><20> +<porn ezine><20> +<porn industry><50> +<porn membership><80> +<porn pass><60> +<porn pics><80> +<porn pictures><80> +<porn pix>,<gallery><40> +<porn pix><60> +<porn pussy><70> +<porn show><50> +<porn star>,< horny ><80> +<porn star>,< hot ><80> +<porn star>,< slut><80> +<porn star>,< twat ><80> +<porn star>,< wet ><80> +<porn star>,<fetish><80> +<porn star>,<fuck><80> +<porn star>,<pussies><80> +<porn star>,<pussy><80> +<porn star><40> +<porn starlets><80> +<porn try out><80> +<porn tryout><80> +<porn wannabe><50> +<porn0><60> +<pornhole><5> +<pornholio><10> +<pornmegabucks><80> +<porno ezine><20> +<porno membership><80> +<porno pass><60> +<porno><20> +<pornographic><20> +<porno-pass><60> +<pornostar><20> +<porn-pass><60> +<pornshop><10> +<pornstar ezine><20> +<pornstar lust><50> +<pornstar passion><50> +<pornstar>,< horny ><80> +<pornstar>,< hot ><80> +<pornstar>,< slut><80> +<pornstar>,< twat ><80> +<pornstar>,< wet ><80> +<pornstar>,<fetish><80> +<pornstar>,<fuck><80> +<pornstar>,<pics><80> +<pornstar>,<pictures><80> +<pornstar>,<pussies><80> +<pornstar>,<pussy><80> +<pornstars juggs><70> +<porntrack.com><80> +<portfolio>,<fetish><50> +<portfolio>,<glamour><50> +<posing nude><50> +<possess adult material><80> +<possess or view sexually explicit><50> +<pounding your pud><40> +<pr0n><30> +<precum><20> +<pre-cum><20> +<pregnant & horny><80> +<pregnant and horny><80> +<pregnant hardcore><80> +<pregnant sex><30> +<pregnant slut><60> +<premium adult site><80> +<premium hardcore><80> +<premium porn><50> +<preteen >,< anal ><40> +<pre-teen >,< anal ><40> +<preteen >,< horny ><60> +<pre-teen >,< horny ><60> +<preteen >,< porn><60> +<pre-teen >,< porn><60> +<preteen >,< slut><60> +<pre-teen >,< slut><60> +<preteen >,< twat ><60> +<pre-teen >,< twat ><60> +<preteen >,< xxx ><60> +<pre-teen >,< xxx ><60> +<pre-teen >,<bald><40> +<preteen >,<bald><50> +<preteen >,<cherries><60> +<pre-teen >,<cherries><60> +<preteen >,<fetish><60> +<pre-teen >,<fetish><60> +<preteen >,<fuck><60> +<pre-teen >,<fuck><60> +<preteen >,<pussy><60> +<pre-teen >,<pussy><60> +<pre-teen >,<video><60> +<preteen erotica><80> +<preteen flesh><70> +<preteen galler><80> +<pre-teen galler><80> +<preteen lolita><80> +<pre-teen lolita><80> +<pre-teen pics><80> +<preteen pics><80> +<preteen>,<kiddy>,<lolita><80> +<preteen>,<kiddy>,<sex>,<underage><100> +<preteen>,<kiddy>,<slut><80> +<preteen><20> +<pre-teen><20> +<preteen-erotica><80> +<preteenflower><80> +<prick juice><70> +<prick tease><30> +<procreate><5> +<procreation><5> +<prophylactic><5> +<prostitute><10> +<prostitution><10> +<protect your children>,<pornography>,<netnanny>,<surfwatch><40> +<pubescent female form><60> +<public flashings><80> +<public nude><80> +<public nudity><80> +<public sex><80> +<public shitting><30> +<public slut><80> +<puffy nipples><80> +<pulling your johnson><30> +<pulling your pud><40> +<pump her arse><80> +<pump her ass><80> +<pump her pussy><80> +<pump his arse><80> +<pump his ass><80> +<pump my arse><80> +<pump my ass><80> +<pump my pussy><80> +<pump your bone><70> +<pumped thoroughly><40> +<pure hardcore><80> +<pure porn><80> +<pussies crammed full><80> +<pussies get drilled><80> +<pussies get fuck><80> +<pussies get wet><80> +<pussies leak><80> +<pussies ooze><80> +<pussies open wide><80> +<pussies>,< slut><30> +<pussies>,< twat ><40> +<pussies>,< xxx><20> +<pussies>,<horny><30> +<pussies>,<penetrat><40> +<pussies><10> +<pussy cam><80> +<pussy crammed full><80> +<pussy cramming><80> +<pussy drip><50> +<pussy eater><80> +<pussy eating><80> +<pussy filling><60> +<pussy get drilled><80> +<pussy get fuck><80> +<pussy get wet><80> +<pussy juice><80> +<pussy leak><80> +<pussy lick><80> +<pussy lips><80> +<pussy ooze><80> +<pussy open wide><80> +<pussy pics><80> +<pussy pictures><80> +<pussy pleaser><30> +<pussy pounding><80> +<pussy quota><50> +<pussy raider><80> +<pussy raiding><80> +<pussy splitting cocks><80> +<pussy squirt><80> +<pussy stretching><60> +<pussy stuffing><60> +<pussy tease><50> +<pussy>,< slut><30> +<pussy>,< twat ><40> +<pussy>,< xxx><20> +<pussy>,<horny><30> +<pussy>,<penetrat><40> +<pussy><10> +<pussycam><80> +<pussy-cam><80> +<pussy-pounding><80> +<pussy-stretching><60> +<quality adult sites><80> +<quality porn><40> +<quality sex shops><80> +<queens of porn><50> +<rape collection><50> +<rape comix><80> +<rape fantasies><80> +<rape fantasy><80> +<rape galleries><60> +<rape gallery><60> +<rape in comic><40> +<rape lover><60> +<rape loving><60> +<rape mpeg><70> +<rape oriented><60> +<rape pictures><40> +<rape pix><70> +<rape schoolgirls><50> +<rape series><40> +<rape sets><40> +<rape site><60> +<rape toon><50> +<rape video><60> +<raped by you><50> +<raped schoolgirls><50> +<raped teens><30> +<rapelove><60> +<rape-oriented><60> +<rated xxx><30> +<ratedxxx><30> +<raunchy amateur><40> +<raw nude teens><80> +<raw sex videos><50> +<raw sex><50> +<ready to fuck><80> +<real anal><70> +<real gangbang><40> +<real life roots><70> +<real lolita><70> +<real porn star><80> +<real pornstar><80> +<real private teen><60> +<real teen pic><80> +<real teen sex><80> +<realdoll><70> +<realistic cock><30> +<rectum><5> +<redhead rape><30> +<redhead sluts><80> +<restrict access to this site>,<parent><30> +<ripe tits><60> +<rock hard and ready to><80> +<rock hard cock><80> +<rock hard nipple><80> +<rock solid ass ><80> +<rock solid asses><80> +<rogering><40> +<root sluts><70> +<rooting><10> +<rub your stiffy><60> +<rubber cock><60> +<rubber dick><60> +<rubbing her><20> +<rubbing him><20> +<rubbing his><20> +<rubbing the wad><40> +<rugmunch><50> +<russian ezine><20> +<russian hooker><20> +<russian lolita><70> +<russian rape><40> +<russian slut><40> +<sadomasochism><30> +<saigon sluts><60> +<satisfy your fetish><80> +<scantily><10> +<scat ><30> +<scat fantas><40> +<scat fun><50> +<scat mpeg><70> +<scat play><40> +<scat playground><70> +<school girl>,< horny ><40> +<school girl>,< porn><40> +<school girl>,< slut><40> +<school girl>,< twat ><40> +<school girl>,< xxx ><40> +<school girl>,<fetish><40> +<school girl>,<fuck><40> +<school girl><5> +<schoolgirl ezine><20> +<schoolgirl sex><40> +<schoolgirl>,< horny ><40> +<schoolgirl>,< porn><40> +<schoolgirl>,< slut><40> +<schoolgirl>,< twat ><40> +<schoolgirl>,< xxx ><40> +<schoolgirl>,<fetish><40> +<schoolgirl>,<fuck><40> +<schoolgirl><5> +<school-girl><5> +<schoolgirls free><40> +<screw sluts><70> +<screwing some chick><60> +<screwing some slut><60> +<screwing some whore><60> +<secret fetish><40> +<section 2257><30> +<see a bbw><40> +<see their pussies><80> +<see us take our clothes off><80> +<self-stimulation><30> +<semen action><60> +<series photos><20> +<series pics><30> +<sex act><10> +<sex bizarre><30> +<sex bulletin board><70> +<sex cam><80> +<sex chat line><80> +<sex chat><40> +<sex club><40> +<sex dialer><40> +<sex ezine><20> +<sex farm><50> +<sex fest><80> +<sex illustrated><80> +<sex in the shower><50> +<sex link><40> +<sex maniac><30> +<sex mpeg><70> +<sex on the beach><50> +<sex on the><40> +<sex orgies><80> +<sex orgy><80> +<sex party><80> +<sex pics><50> +<sex pictures><50> +<sex ring><40> +<sex scene><40> +<sex shop><80> +<sex show><30> +<sex site><20> +<sex slave><30> +<sex stars><80> +<sex starved wife><80> +<sex starved wives><80> +<sex stories><80> +<sex story><80> +<sex tour><40> +<sex tourism><30> +<sex toys><30> +<sex vacation><60> +<sex video feed><80> +<sex video tapes><80> +<sex video><30> +<sex whore><80> +<sex with no strings><50> +<sexcam><50> +<sexcheck><80> +<sexfeed><80> +<sexfest><80> +<sex-hungry girl><80> +<sex-hungry slut><80> +<sex-hungry woman><80> +<sex-hungry women><80> +<sexiest><5> +<sexkey id><50> +<sexkey><80> +<sexmall><80> +<sexologist><5> +<sexology><5> +<sexplore><10> +<sexshop><80> +<sexswap2000.com><80> +<sextoy>,< horny ><40> +<sextoy>,< porn><40> +<sextoy>,< slut><40> +<sextoy>,< twat ><40> +<sextoy>,< xxx ><40> +<sextoy>,<fetish><40> +<sextoy>,<fuck><40> +<sextoy>,<pussy><40> +<sextoy><20> +<sextracker><80> +<sexual activity><10> +<sexual and young><40> +<sexual content warning><50> +<sexual content><20> +<sexual entertainment><50> +<sexual exploitation><20> +<sexual friend><20> +<sexual maneuver><50> +<sexuality><5> +<sexually explicit conduct><60> +<sexually explicit language><60> +<sexually explicit material>,< 18><80> +<sexually explicit materials please leave now><80> +<sexually explicit stories><60> +<sexually oriented><10> +<sexually wild><40> +<sexually><5> +<sexxx><60> +<sexxxhosting><80> +<sexy ass milf><80> +<sexy ass><10> +<sexy nudes><80> +<sexy slut><40> +<sexy><5> +<shalong><10> +<sharing cock><70> +<sharing dick><70> +<shaved beaver><80> +<shaved clam><80> +<shaved cunt><80> +<shaved lolita><80> +<shaved pussies><80> +<shaved pussy><80> +<shaved smoo><60> +<shaved snatch><80> +<shaven beaver><80> +<shaven clam><80> +<shaven cunt><80> +<shaven haven><80> +<shaven lolita><80> +<shaven pussies><80> +<shaven pussy><80> +<she is a bbw><40> +<she likes anal><50> +<she loves anal><50> +<she needs dick><60> +<shemale ezine><20> +<shemale lounge><70> +<shemale sex><70> +<shemale><20> +<shemalelive><80> +<shit covered ass><70> +<shit eat><80> +<shit mustache><50> +<shit on her face><80> +<shit on his face><80> +<shit on my face><80> +<shit on their face><80> +<shit on there face><80> +<shitfuck><30> +<shitsex><80> +<shlong><10> +<shocking cock><40> +<shocking pictures><30> +<shocking sex><60> +<shocking video><30> +<shoot cum ><60> +<shoot your load><60> +<shooting off><30> +<should not be accessed by anyone who is younger than 18><80> +<shove both fists><50> +<show pussy><50> +<showercam><30> +<showered in cum><80> +<showered in piss><80> +<showered in shit><80> +<showing off my body><50> +<showing pussy><70> +<sick fuck><80> +<sickest sex video><80> +<signup for adult check><80> +<silvercash.com><80> +<sin city><20> +<sinful hardcore><70> +<sinful xxx><80> +<singles club><30> +<site designed and intended solely for adults><80> +<skanky ass><80> +<skanky pussy><80> +<skanky whore><80> +<skimpy thong><50> +<skinflute><70> +<slapping the monkey><50> +<slapping the salami><70> +<slid his dick><40> +<slid my dick><40> +<slide their cock><80> +<slide your cock><80> +<sloppy anal><60> +<sloppy fuck><60> +<slurp cum><70> +<slurp down cum><70> +<slurp down semen><70> +<slurp semen><70> +<slurping cum><70> +<slut getting fucked><80> +<slut housewife><50> +<slut housewives><50> +<slut looking hot><70> +<slut movie><60> +<slut nympho><70> +<slut series><50> +<slut showing her><80> +<slut showing><70> +<slut spreading><80> +<slut sucking><80> +<slut wanting><60> +<slut wife><80> +<slut wives><80> +<slutfest><40> +<slutiest model><80> +<slutiest wife><80> +<slutiest wives><80> +<slutpuppy><30> +<sluts everywhere><50> +<sluts getting fucked><80> +<sluts live><60> +<sluts on a farm><70> +<sluts on the net><80> +<sluts showing their><80> +<sluts.com><80> +<sluttiest><60> +<slutty girls><80> +<slutty house wife><80> +<slutty house wives><80> +<slutty models><80> +<slutty naked><80> +<slutty nympho><70> +<slutty teen><70> +<slutty wife><80> +<slutty wives><80> +<slutty><20> +<smacking off><50> +<smear cum><80> +<smear precum><80> +<smear pre-cum><80> +<smear shit><30> +<smeared cum><80> +<smeared precum><80> +<smeared pre-cum><80> +<smell pussy><80> +<smell the panties><80> +<smell the pussy><80> +<smell their panties><80> +<smelly pussy><80> +<smoking ezine><20> +<smoo juice><70> +<smooth shaven>,<beaver><80> +<smooth shaven>,<cunt><80> +<smooth shaven>,<puss><80> +<smooth shaven>,<snatch><80> +<smooth shaven>,<vagina><80> +<smut erotica><80> +<smut server><70> +<smutbucks.com><80> +<snatch >,< horny ><50> +<snatch >,< porn><50> +<snatch >,< xxx ><50> +<snatch >,<fuck><30> +<snatch >,<pussy><30> +<snatch ><10> +<sniff panties><70> +<sniff panty><70> +<snizzpod><60> +<snuff ><30> +<soaked by huge cocks><80> +<soaked panties><80> +<soaking panties><80> +<soaking wet puss><80> +<sodomize><10> +<soft porn><30> +<soft pussies><50> +<soft pussy><50> +<softcore ass><70> +<softcore gallery><30> +<softcore images><50> +<softcore xxx><80> +<softest pussies><50> +<softest pussy hair><80> +<softest pussy><50> +<soggy sao><30> +<soldier of cock><80> +<some cock><20> +<sore cock><30> +<sorority cunt><80> +<sorority pussy><80> +<sorority slut><80> +<spanking desires><80> +<spanking the monkey><50> +<spanking the stick><50> +<spattered with cum><80> +<sperm angel><50> +<sperm build-up><20> +<sperm burping><70> +<sperm guzzling><70> +<sperm slut><70> +<sperm>,< cum ><40> +<sperm>,< horny ><30> +<sperm>,< xxx ><40> +<sperm>,<blow>,<load><30> +<sperm>,<fuck><30> +<sperm>,<pussy><30> +<sperming the worm><70> +<sphincter fog><20> +<spill cum><70> +<spill jizz><70> +<spinchter><10> +<splattered with cum><80> +<spray cum><80> +<spray jizz><80> +<spray your load><80> +<spread my big ass><70> +<spring break nudity><80> +<spunk drinker><80> +<spunk drinking><80> +<spunk gargler><80> +<spunk gargling><80> +<spunk on her face><80> +<spunk on his face><80> +<spunk on their face><80> +<spunk swallow><80> +<spunking in a><60> +<spunking on a><60> +<spy cam><20> +<spy on young women><80> +<squirt jizz><80> +<squirt>,< horny ><30> +<squirt>,< porn><30> +<squirt>,< slut><30> +<squirt>,< twat ><30> +<squirt>,< xxx ><30> +<squirt>,<fuck><30> +<squirting pics><50> +<squirting pictures><50> +<squirting show><60> +<squirting video><50> +<starlet><10> +<starving for cum><80> +<starving for jizz><80> +<sticky facial><50> +<stiff cock><30> +<stimulate your pussy><60> +<stocking ezine><20> +<stories ezine><20> +<strange sex>,<pic><80> +<strange sex><20> +<strangling the goose><50> +<strap on dildo><50> +<strap on penis><50> +<strap on><10> +<strap-on dildo><50> +<strapon penetration><70> +<strap-on penetration><70> +<strap-on penis><50> +<strap-on><10> +<streaming porn><60> +<streaming sex vid><80> +<stretched cunt><80> +<strictly panties><50> +<strip club party><70> +<strip poker><5> +<strip to naked><40> +<stripper sluts><80> +< stripper ><10> +< strippers ><30> +<stripping live><80> +<stripping sluts><80> +<strips panties><70> +<stroking your cock><60> +<stroking your meat><60> +<strut for cock><50> +<stuck in all holes><40> +<stud fucking><80> +<suck and fuck><50> +<suck cock><80> +<suck cocks dry><50> +<suck her tit><60> +<suck my cock><80> +<suck my tits><80> +<suck on her cock><80> +<suck on her tits><80> +<suck on it slut><70> +<suck twat><60> +<suck your balls><80> +<sucking black cock><80> +<sucking chrome><60> +<sucking cock><80> +<sucking the chrome><60> +<sucking two cocks><80> +<sucking you off><70> +<suckoff arena><70> +<sucks the jizz><60> +<sucks you off><40> +<super fucking fat><80> +<swallow cum><80> +<swallow jizz><80> +<swallow your load><80> +<swedish sex ton><80> +<sweet ass><30> +<sweet fucking><70> +<sweet love seed><50> +<sweet puss><80> +<swinger central><80> +<swinger parties><50> +<swinger party><50> +<swingers parties><50> +<swingers party><50> +<swingers personals><80> +<swollen cock><70> +<syphyllis><5> +<taboo fantas><50> +<taboo free><30> +<taboo sex><30> +<take it in every hole><80> +<take it in the ass><80> +<take it like a bitch><80> +<take multiple cocks><80> +<takes cock><50> +<takes dick><50> +<takes your dick><40> +<taste black cock><70> +<tasty ass><60> +<teen >,<cherry><60> +<teen anal><50> +<teen ass><70> +<teen blowjob><50> +<teen bondage><80> +<teen cum><80> +<teen cunt><80> +<teen ezine><20> +<teen fuck><60> +<teen girls sucking><80> +<teen hardcore><80> +<teen masturbating><50> +<teen porn><80> +<teen related porn><70> +<teen sex videos><70> +<teen sex><30> +<teen slumber party><20> +<teen slut><60> +<teen spreads><40> +<teen>,< horny ><20> +<teen>,< porn><30> +<teen>,< twat ><40> +<teenage slut><50> +<teencum><80> +<teenmodel><50> +<teens first time><30> +<testicle><10> +<that love big cock><80> +<that love cock><80> +<that love to fuck><80> +<the material on this server is adult oriented><80> +<the material on this site is adult oriented><80> +<the sex mall><80> +<these web pages are not intended to be viewed by minors><80> +<they are horny><50> +<thick cock><70> +<this adult site><80> +<this following pages contain adult material><80> +<this is an adult site><80> +<this is an adult website><80> +<this site contains adult material><80> +<this site is for adults over 18><80> +<this site is intended for adults><70> +<this site is not suitable for minors><80> +<this site provides access to images of nude><80> +<this website contains>,<adult material><80> +<three day trial membership><40> +<threesome><20> +<threeway sex><70> +<throbbing rod><50> +<thumbnailed erotic><80> +<thumbnailed porn><80> +<thumbnailed xxx><80> +<tickle your dick><60> +<tickling your dick><60> +<tied and fucked><70> +<tight anal><50> +<tight and juicy><50> +<tight arse><20> +<tight ass><20> +<tight asshole><80> +<tight cunt><70> +<tight little puss><80> +<tight pussies><80> +<tight pussy><80> +<tight young girl><80> +<till your balls are dry><80> +<till your balls go dry><80> +<time of the photographs are of age 18><50> +<tiny little girl><30> +<tiny tits ezine><20> +<tiny tits><70> +<tit fuck><80> +<tit lover><40> +<tit photos><40> +<tit sex><80> +<tit sucker><40> +<tit sucking><40> +<title 18>,<2256><60> +<title 18>,<2257><60> +<tittie fuck><80> +<titties><10> +<titty fuck><80> +<to prevent minors from accessing><30> +<toilet cam><80> +<toilet humiliation><60> +<toilet sex><80> +<toiletcam><80> +<toilet-cam><80> +<toiletsex><80> +<toilet-sex><80> +<tommy fuck pamela><80> +<tommy lee sex><80> +<tommy lee video><80> +<tongue bath><70> +<toon erotica><80> +<toon xxx><80> +<top adult site><50> +<top heavy babe><60> +<topless photo><80> +<topless pics><80> +<topless>,< horny ><40> +<topless>,< porn><40> +<topless>,< slut><40> +<topless>,< twat ><50> +<topless>,< xxx ><40> +<topless>,<amateur><50> +<topless>,<fuck><40> +<topless>,<nude>,<glamour><60> +<topless>,<teen><50> +<toplist><10> +<torture sex><60> +<tortured pussies><50> +<totally nude><60> +<totally tits><30> +<toys & vibrators><80> +<toys and vibrators><80> +<trannies with cocks><80> +<tranny fuck><70> +<tranny heaven><60> +<tranny sex><60> +<tranny tits><80> +<transexual encounter><60> +<transgender><20> +<transsexual ezine><20> +<transsexual><20> +<transvestite><20> +<trial membership>,<porn><50> +<triple penetration><80> +<true celeb><20> +<try something kinky><40> +<turd eating><80> +<turd munching><80> +<twat eater><80> +<twat eating><80> +<twat fucking><80> +<twat licking><80> +<twat loving><80> +<twat pounder><80> +<twat pounding><80> +<twat sucking><80> +<two cocks inside><60> +<two cocks><30> +<ugly fat women><40> +<ultimate porn><80> +<uncensored adult><60> +<uncensored extreme><50> +<uncensored hardcore><80> +<uncensored hentai><80> +<uncensored movies><60> +<uncensored photo><60> +<uncensored porn><80> +<uncensored rape><70> +<uncensored sluts><80> +<uncensored toons><80> +<uncensored xxx><80> +<uncensored><30> +<uncircumcised><10> +<uncut><10> +<un-cut><10> +<under>,<18>,<leave now><50> +<under>,<age>,<exit now>,<adult><70> +<underage lolita><80> +<underage>,< horny ><40> +<underage>,< porn><40> +<underage>,< slut><40> +<underage>,< twat ><40> +<underage>,< xxx ><40> +<underage>,<fuck><40> +<underage><10> +<underground archive><30> +<underground rape><50> +<unfaithful.com><80> +<unique nude><70> +<unlimited free 3 day trial><20> +<unseen teen><40> +<until your balls are dry><80> +<until your balls go dry><80> +<until your balls hurt><80> +<up her ass><40> +<up skirt teens><80> +<up their asses><80> +<up your arse><30> +<up your ass><30> +<upskirt ezine><20> +<upskirt photo><80> +<upskirt shot><80> +<urophile><10> +<usc>,<2257>,<statement><100> +<usc2257><60> +<use a dildo><60> +<use a vibrator><60> +<using a dildo><60> +<using a vibrator><60> +<vagina><5> +<vainy dick><70> +<valid credit card to confirm age><50> +<validate>,<age via credit card><40> +<valuesex><70> +<venereal><5> +<verified avs><70> +<verified id><30> +<verified! avs><60> +<verify that you are an adult><50> +<vibrator action><80> +<vibrator>,<butterfly><50> +<view adult material>,<in your community><50> +<vintage porn><60> +<virgin dyke><80> +<virgin pussy><80> +<virgin schoolgirl><20> +<virgin sluts><80> +<virgin spy cam><80> +<virgin>,< slut><40> +<virgin>,< twat><40> +<virgin>,<fuck><40> +<virgin>,<xxx><20> +<virginity cam><60> +<virgins><20> +<visual depiction>,<nude><50> +<visual depiction>,<nudist><50> +<visual depiction>,<porn><70> +<voyeur cam><80> +<voyeur dorm><80> +<voyeur ezine><20> +<voyeur><5> +<voyeurcam><80> +<voyuer dorm><80> +<vulgar><3> +<vulva><5> +<wad of cum><80> +<wad of jizz><80> +<wads of cum><80> +<wads of jizz><80> +<wank all over><60> +<wank off><20> +<wank on><40> +<wank with><30> +<wanker><10> +<wanking><20> +<wanna fuck><60> +<want a big penis><70> +<want more nude pics><80> +<want to fuck><80> +<warm cum ><80> +<warm jizz><80> +<warning! you must be over 18 to proceed><150> +<warning>,<adults only><80> +<watch her pussy><80> +<watch her strip><40> +<watch horny><80> +<watch me strip><40> +<watch our girls><30> +<watch sluts><80> +<watch slutty><80> +<watch teen virgins><80> +<watch them get fucked><80> +<watch them strip><40> +<watch young girls get><80> +<we strongly support parental controls><40> +<web cam>,< horny ><30> +<web cam>,< porn><30> +<web cam>,< slut><30> +<web cam>,< twat ><30> +<web cam>,< xxx ><30> +<web cam>,<fuck><30> +<webcam>,< girl><30> +<web-cam>,< girl><30> +<webcam>,< horny ><30> +<web-cam>,< horny ><30> +<webcam>,< porn><30> +<web-cam>,< porn><30> +<webcam>,< slut><30> +<web-cam>,< slut><30> +<webcam>,< twat ><30> +<web-cam>,< twat ><30> +<webcam>,< xxx ><30> +<web-cam>,< xxx ><30> +<webcam>,<fuck><30> +<web-cam>,<fuck><30> +<webmasters click here to protect your site><40> +<weird links><10> +<welcome to playboy><80> +<well hung black><70> +<were at least 18 years of age at the time of photography><80> +<were over the age of 18 years at the time they were filmed><80> +<were over the age of 18 years at the time they were photo><80> +<were over the age of 18 years at the time they were photographed><80> +<were over the age of 21 years at the time they were filmed><80> +<were over the age of 21 years at the time they were photographed><80> +<wet and horny><70> +<wet facial><70> +<wet n wild><50> +<wet panties><50> +<wet panty><50> +<wet pussies><40> +<wet pussy><40> +<wet slut><60> +<wet spot><20> +<wet tshirt><20> +<wet t-shirt><20> +<wet young teen><60> +<wetdream><5> +<wetpussy.com><80> +<wetpussy><50> +<wh0re>,< horny ><30> +<wh0re>,< porn><30> +<wh0re>,< twat ><30> +<wh0re>,< xxx ><30> +<wh0re>,<fetish><30> +<wh0re>,<fuck><30> +<wh0re>,<pussy><30> +<wh0re><30> +<whack off><60> +<whacking off><60> +<what my cock looks like><80> +<whipping your turkey><50> +<whips and chains><30> +<white cock><70> +<white girl black guy><50> +<whore cam><80> +<whore doing anything><80> +<whore doing everything><80> +<whore drilled><80> +<whore>,< horny ><30> +<whore>,< porn><30> +<whore>,< twat ><30> +<whore>,< xxx ><30> +<whore>,<fetish><30> +<whore>,<fuck><30> +<whore>,<pussy><30> +<whorehouse><20> +<whores doing anything><80> +<whores doing everything><80> +<wife sucking cock><80> +<wild and erotic><60> +<wild fuck action><80> +<wild sex><30> +<wildest xxx><80> +<will fuck for you><80> +<will not allow minors><30> +<with dildo><30> +<with hard cocks><80> +<wives get naked><80> +<woman peeing><50> +<woman seeking><10> +<women fucking women><80> +<women masturbate><50> +<women peeing><50> +<women seeking><10> +<women shitting><50> +<women sucking and fucking><80> +<worst fuck><30> +<x rated><20> +<xbanner.it><130> +<x-entertainment><40> +<x-rated game><30> +<x-rated live><30> +<x-rated show><30> +<x-rated video><50> +<x-rated>,< horny ><30> +<x-rated>,< slut><30> +<x-rated>,< xxx ><30> +<x-rated>,<anal><30> +<x-rated>,<banned><30> +<x-rated>,<fetish><30> +<x-rated>,<free><30> +<x-rated>,<fuck><30> +<x-rated>,<galler><30> +<x-rated>,<illegal><30> +<x-rated>,<loose><30> +<x-rated>,<movie><30> +<x-rated>,<preview><30> +<x-rated>,<pussies><30> +<x-rated>,<pussy><30> +<x-rated>,<sex><10> +<x-rated>,<shave><20> +<x-rated>,<teen><30> +<x-rated>,<tour><30> +<x-rated>,<twat><30> +<x-rated>,<video><30> +<xrated><20> +<x-rated><20> +<xxx action><80> +<xxx anime><80> +<xxx asian><80> +<xxx celeb><80> +<xxx comic><80> +<xxx content><80> +<xxx couples><80> +<xxx download><80> +<xxx dvd><50> +<xxx entertainment><80> +<xxx ezine><20> +<xxx fetish><80> +<xxx fuck><80> +<xxx geek><50> +<xxx girl><80> +<xxx hardcore><80> +<xxx latina><80> +<xxx live><80> +<xxx magna><80> +<xxx model><80> +<xxx movie><80> +<xxx mpeg><70> +<xxx older women><60> +<xxx password><80> +<xxx paysite><80> +<xxx photo galler><80> +<xxx pics><50> +<xxx pleasure><80> +<xxx porn><80> +<xxx product><80> +<xxx rated><80> +<xxx sex><80> +<xxx site><80> +<xxx slut><80> +<xxx stories><80> +<xxx teen><80> +<xxx theater><80> +<xxx toons><80> +<xxx tranny><80> +<xxx transexual><80> +<xxx try out><80> +<xxx tryout><80> +<xxx video clip><80> +<xxx video><50> +<xxx wrestling><80> +<xxxadult><50> +<xxxcounter><80> +<xxxrated><50> +<xxx-rated><80> +<yeast>,< cunt><70> +<you are about to enter a site that contains adult material><80> +<you are over the age of 18><40> +<you are of legal age><40> +<you certify that you are over 18><60> +<you certify that you are over 21><60> +<you have to be at least 18 years to look><80> +<you must be 18 to enter><50> +<you must be of legal age to continue><70> +<you must be over 21><70> +<you must be>,<18 or older>,<to continue><50> +<you must be>,<at least 18><50> +<you must currently be over the age of eighteen><60> +<young and tight><60> +<young flesh><30> +<young horny><70> +<young lesbian lovers><80> +<young lolita>,<sexual><50> +<young lolita><50> +<young nasty teen><80> +<young nude><40> +<young nympho><80> +<young slut><80> +<young>,<dumb>,<full of cum><80> +<youngest and nastiest><80> +<youngest fuckers><80> +<youngest legal teens><80> +<youngest lolita><80> +<youngest teens on the web><80> +<youngest><5> +<your cock><30> +<your doodle><30> +<your man seed><50> +<zoo beastiality><80> +<zoo fuck><80> +<zoo love><30> +<zoo movie><40> +<zoo passion><50> +<zoo sex><80> +<zoo xxx><80> +< join>,< members>,< preview>,< friend><40> +<member>,< galler><40> +<young model><40> +<teen model><50> +<real breast><50> +<sexy ladies><20> +<sexy lady><20> +<maxim girl><70> +< model>,<lingerie><50> +< model>,<female><20> +<hot stars><20> + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/pornography/weighted_chinese b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/pornography/weighted_chinese new file mode 100644 index 0000000000000000000000000000000000000000..99efdaa70947af53b6f6f6799c4c3e58d0c22298 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/pornography/weighted_chinese @@ -0,0 +1,18 @@ +# +# Originally Created by Fernand Jonker +# Sponsored by Eric Duveau +# + +#noconvert +#listcategory: "Pornography (Chinese)" + +<乳房的><30> #breast +<性感女神><30> #sexy goddess +<性感女><30> #sexy female +<性感><30> #sexy +<全裸写真><30> #nude pictures +<美女明星><30>3 #beauty star +<ç¦æ¢æ€§äº¤å›¾ç‰‡><100> #explicit photos +<å¿«æ„Ÿ><40> #hedonic +<情色><40> #erotica +<金å‘美女><50>#blond beauty diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/pornography/weighted_danish b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/pornography/weighted_danish new file mode 100644 index 0000000000000000000000000000000000000000..81868355ebb4a291cdc9828812bd9f381cfde176 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/pornography/weighted_danish @@ -0,0 +1,56 @@ +# +# Taken from translations done by Charlie Grosvenor +# + +#listcategory: "Pornography (Danish)" + +<møgsæk><80> #slut +<møgluder><80> #slut +< luder><40> #slut +<fede luder><80> #slut +<bøsserøv><40> #faggot +<fede bøsserøv><80> #faggot +<bøssesvin><40> #faggot +<fede bøssesvin><80> #faggot +<sexkilling><75> #hooker ad keywords +<smatso><40> #bitch +<røvhul><40> #asshole +< kusse><60> #cunt/pussy +< fisse><60> #cunt/pussy +<kneppe><60> #fuck +< pik ><10> #dick/cock +< patter ><20> #tits +< lort><20> #shit +<seksuel><15> #sexual +<erotisk><15> #erotic +<sensuel><15> #sensual +<escortbureau>,<luksuspiger><50> #hooker/massage girl bureau +<alder>,<højde>,<vægt>,<brystmål><75> #hooker ad keywords +<slank>,<velskabt>,<blid><75> #hooker ad keywords +<blid>,<intim>,<sex><75> #hooker ad keywords +<tilbyder gensidig><75> #hooker ad keywords +<ungpige>,<fræk>,<smuk><75> #hooker ad keywords +<stram>,<røv>,<bryster><75> #hooker ad keywords +<stram>,<numse>,<bryster><75> #hooker ad keywords +<æbleformede bryster><75> #hooker ad keywords +<struttende bryster><75> #hooker ad keywords +<ungpigebryster><75> #hooker ad keywords +<faste bryster><75> #hooker ad keywords +<fyldig>,<spændstig><75> #hooker ad keywords +<nystartet>,<bryster><75> #hooker ad keywords +<nystartet>,<ungpige><75> #hooker ad keywords +<nystartet>,<lækker><50> #hooker ad keywords +<nystartet>,<smuk><50> #hooker ad keywords +<fyldig barm><50> #hooker ad keywords +<rund bagdel><50> #hooker ad keywords +<fræk>,<killing><50> #hooker ad keywords +<fræk>,<vildkat><50> #hooker ad keywords +<pariserrøv><50> #hooker ad keywords +<parisernumse><50> #hooker ad keywords +<fitnessnumse><50> #hooker ad keywords +<fitness-numse><50> #hooker ad keywords +<fræk>,<fantasi><25> #hooker ad keywords +<superfræk>,<pige><25> #hooker ad keywords +<super fræk>,<pige><25> #hooker ad keywords +<langben>,<solbrun><25> #hooker ad keywords +<krop>,<solbrun><25> #hooker ad keywords diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/pornography/weighted_dutch b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/pornography/weighted_dutch new file mode 100644 index 0000000000000000000000000000000000000000..b1d35390b6e0facb4506ce4ab134a302359cac1f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/pornography/weighted_dutch @@ -0,0 +1,38 @@ +# +# Originally Created By Fernand Jonker +# + +#listcategory: "Pornography (Dutch)" + +<neuk mij><80> +<neuk me><80> +<zaad>,<slikken><30> +<sletje><30> +<naakt><30> +<bloot><20> +< neuken ><50> +< pik ><5> +< hoer ><25> +< eikel ><5> +< seks ><5> +<soloseks><10> +<masturbatie><20> +<erotische><20> +<hete sex><50> +<hete seks><50> +<tieners><10> +<klaarkomende tieners><20> +<tienersexfilms><20> +<18 jarige sletjes><20> +<geile teen><20> +<geilestudentjes><20> +<hete hoeren><20> +<tiener hoertje><20> +<verse kutje><20> +<vuistneuken><20> +<pornofilm><20> +<lekker pijpen><20> +<geile orgies><20> +<snoeiharde actie><20> +<harige kutje><20> +<kale kutje><20> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/pornography/weighted_french b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/pornography/weighted_french new file mode 100644 index 0000000000000000000000000000000000000000..28f0310ca0c6da8932c6d3259b704709b536e4f0 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/pornography/weighted_french @@ -0,0 +1,133 @@ +# +# Original data Cedric Foll +# Data mined by Daniel Barron +# + +#listcategory: "Pornography (French)" + +< pornographique ><20> +< des mineurs ><15> +< Je certifie ><10> +< amateurs ><10> +< sodomie ><20> +< un mineur ><10> +#< femme ><5> +#< filles ><5> +#< femmes ><5> +< de poursuivre ><10> +< majeur et ><10> +< img sexe ><10> +< titre personnel ><10> +< vigueur ><10> +< seins ><10> +< pornographie ><20> +< action judiciaire ><10> +< sperme ><10> +< lingerie ><10> +< contient des ><10> +< public majeur ><10> +< Sexe ><10> +< réservé ><10> +< ci-dessus ><10> +< censure ><10> +< accéder ><10> +< adultes ><10> +< l'honneur ><10> +< du caractère ><10> +< permettant ><10> +< penetration ><10> +< m'autorisent ><10> +< sur honneur ><10> +< m'interdit ><10> +< choquantes ><10> +< lesbiennes ><15> +< des textes ><10> +< contenu des ><10> +< erotique ><10> +< fellation ><15> +< rencontre ><10> +< consulter ><10> +< charme ><10> +< responsabilité si ><10> +< partouze ><10> +< fellation ><10> +< rencontre ><10> +< Mesurez ><10> +< choqué ><10> +< a xiti ><10> +< érotique ><10> +< de censure ><10> +< caractère pornographique ><10> +< manière ><10> +< lesbienne ><10> +< sexualité ><10> +< censure divulgation ><10> +< lu attentivement ><10> +< erotisme ><10> +< rencontres ><10> +< lesbiennes ><15> +< transmettre ><15> +< transmettre de ><10> +< vagin ><10> +< quelque manière ><10> +< de sexe ><10> +< voyeur ><10> +< galerie ><10> +< mineur assumer ><15> +< j'accède ><10> +< sexe gratuit ><10> +< privée ><10> +< erotiques ><10> +< erotisme ><10> +< de sexualité ><10> +< lesbienne ><10> +< fellations ><10> +< éditrice ><10> +< echangisme ><10> +< pornographiques ><10> +< homosexuel ><15> +< permettant empécher ><10> +< sodomies ><15> +< echangisme ><10> +< defloration ><10> +< travestis ><10> +< pour adultes ><10> +< photo sexe ><15> +< sexe photo ><15> +< meta amatrice ><10> +< jouir ><5> +< travesti ><15> +< fetichisme ><15> +< érotiques ><10> +< caractere pornographique ><10> +< cochonne ><10> +< transexuels ><10> +< transsexuel ><10> +< aux mineurs ><10> +< aucun organisme ><15> +< analeclate ><10> +< asiatrique ><10> +< mineur accede ><10> +< caractère érotique ><10> +< annuaire sexe ><10> +< érotisme ><10> +< bisexuel ><10> +< godemichets ><10> +< vibro ><10> +< personnes mineures ><10> +< videos gratuites ><10> +< photos classees ><10> +< photos femmes ><10> +< photos pornos ><15> +< nudité ><10> +< Sexe gratuit ><15> +< Transexuels ><10> +< photo gratuite ><10> +< organisme Etat ><10> +< sadomaso ><15> +< pénétration ><10> +< hermaphrodites ><10> +<est un site réservé aux adultes><80> +<caractère érotique><80> +< nu ><10> +< nue ><20> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/pornography/weighted_german b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/pornography/weighted_german new file mode 100644 index 0000000000000000000000000000000000000000..e56c145b82fca5f01c55af234f29ebdb9da1be40 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/pornography/weighted_german @@ -0,0 +1,99 @@ +# +# Contributed by Thomas Jarosch <thomas.jarosch@intra2net.de> + +#listcategory: "Pornography (German)" + +<24 stunden live><20> +<abspritzen><20> +<anal massaker><80> +<analsex><80> +<analtherapie><20> +< arsch><20> +<bumsen><30> +<busen><20> +<devot ><20> +<dildo><50> +<dreilochstute><80> +<durchgefickt><40> +<durchgevögelt><40> +<durchvögeln><40> +<erotik><60> +<erotikseite><60> +<erotikshop><60> +<fick><30> +<ficken><30> +<flittchen><40> +<fotze><40> +<gefickt><40> +<geile dinger><10> +<geile sahne><20> +<geiles girl><20> +<geile stellungen><20> +<geile titten><40> +<geilste stellungen><20> +<gruppensex><40> +<gummimuschi><80> +<hemmungen><10> +<hemmungslos><10> +<hinterlader><40> +<hobbynutte><80> +< hure ><10> +<jungfrau><10> +<kaviar><10> +<kitzler><20> +<lesben><40> +<lesbenspiele><80> +<liebessaft><20> +<liveshow><10> +<lolita><20> +<luder><40> +<lutschen><10> +<möpse><10> +<möse><40> +<muschi><40> +<muschi lecken><80> +<nackte haut><10> +<naturgeil><20> +<natursekt><80> +<nutte><40> +<ohne>,<scham><40> +<one-night-stand><20> +<porno><20> +<redaktionell geprüft><10> +<schlampe><20> +<schulmädchenreport><40> +<schwanzfrauen><80> +<schwanzlutscher><80> +<schwuchtel><20> +<schwul><5> +<seitensprung><10> +<sex-date><60> +<sex-gier><40> +<sexshop><80> +<sex-shop><80> +<sextreff><80> +<strichbiene><40> +<swinger><20> +<tabulos><40> +<tabulosen><40> +<tabus><40> +<titten><40> +<transe><40> +<transvestit><40> +<verdorben><40> +<versaute luder><80> +<versauten luder><80> +<vibrator><20> +<von hinten nehmen><40> +<von hinten nimmst><40> +<votze><40> +<warmer bruder><20> +< wichse ><40> +<wichsen><40> +<wichser><40> +<willig><10> +<willige teens><60> +<zeigegeil><20> +<fotomodell><40> +<dessous><10> + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/pornography/weighted_italian b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/pornography/weighted_italian new file mode 100644 index 0000000000000000000000000000000000000000..c0886f94f7b3fa873da051fbe6d3cddb6a3edb69 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/pornography/weighted_italian @@ -0,0 +1,337 @@ +# + +#listcategory: "Pornography (Italian)" + +# parole +< arrapa><100> +< sborra><170> +< pompin><170> +< ditalin><170> +< sperma><10> +< fetic><40> +< culo><20> +< inculat><170> +< lesbic><20> +< capezzol><20> +< vergin><20> +< lucirosse><20> +< vietatissim><20> +< proibitissim><20> +< vibrator><50> +< sesso ><10> +< erotic><20> +< guardon><20> +< chiapp><10> +< tette><30> +< cazzo ><40> +< cazzi ><40> +< cazzon><40> +< troia ><50> +< troie><50> +< fica ><80> +< figa ><80> +< fiche ><80> +< fighe ><80> +< strafighe ><80> +< strafiga ><80> +< fichetta ><40> +< fregna ><80> +< fregne ><80> +< porca ><10> +< porcate ><20> +< anale ><10> +< anali ><40> +< incest><20> +< masturba><30> +< oscen><5> +< pedofil><40> +< spogliarell><10> +< orgia><20> +< succhiacazz><170> +< minchia ><30> +< trombare ><40> +< scopare ><40> +< scopata ><100> +< troiona ><100> +< troione ><100> +< porcona ><100> +< porcone ><100> +< puttanona ><100> +< puttanone ><100> +< puttanaccia ><100> +< maialaccia ><100> +< maialacce ><100> +< perversion><20> +< pervertit><20> + +# parole non offensive ma legate a porn site +< ragazza ><5> +< ragazze ><5> +< donna ><5> +< donne ><5> +< studentesse><5> +< soggetti ><5> +< maturo ><5> +< pubblico ><5> +< maggiorenn><5> +< minorenn><5> +< visione ><5> +< sconsigliata ><5> +< sensibil><5> +< offensivo ><5> +< erotic><10> +< materiale ><5> +<attenzione><5> +< severamente ><5> +< proibito ><10> +< penetrare ><10> +< penetra ><10> +< voglios><10> +< materiale ><5> +< contenuto ><5> +< riprese><5> +< rapporto><5> +< rapporti><5> +< coppie><5> +< ninfoman><30> +< accompagnatric><10> +< prestazion><5> +< trasgression><10> +< case chiuse><10> +< bordell><10> +< appuntament><5> +< in posa><10> +< in calore><40> +< pecorina><30> +< bocchin ><20> + +# porn site: parole con aggettivo +<sesso orale><170> +<sesso di gruppo><170> +<sesso spinto><170> +<sesso anale><170> +<sesso e basta><170> +<sesso puro><170> +<puro sesso><170> +<scene di sesso><70> +<culo aperto><170> +<culi aperti><170> +<culo sfondato><170> +<culi sfondati><170> +<culo rotto><170> +<culi rotti><170> +<rapporto anale><170> +<rapporti anali><170> +<orgasmo anale><170> +<orge anali><170> +<giocattoli anali><170> +<penetrazioni anali><170> +<penetrazione anale><170> +<filmati porno gratis><70> +<filmati hard gratis><70> +<filmati hardcore gratis><70> +<mega pompa><170> +<mega pompe><170> +<incontri extramatrimoniali ><50> +<incontri erotici><40> +<esibizionismo amatoriale><50> +<donne troie><170> +<mogli troie><170> +<ragazze troie><170> +<ragazza troia><170> +<femmina troia><170> +<femmine troie><170> +<donne sexi><30> +<donne vogliose><80> +<sito del sesso><70> +<sito hard><80> +<siti hard><80> +<circuito erotico><60> +<ragazze porche><170> +<donne porche><170> +<femmine porche><170> +<porno casalinghe><170> +<solo per adulti><10> +<sito per adulti><60> +<web site per adulti><60> + +# porn site: frasi tipiche +< di cazzo><150> +< di cazzi><150> +<divieto di accesso per minori><70> +<divieto di accesso per minorenni><70> +<devi essere maggiorenne><70> +<non devi essere minorenne><70> +<non devi essere un minorenne><70> +<solo se hai più di ><70> +<solo se hai piu' di ><70> +<solo se sei maggiorenne ><70> +<solo se dichiari di essere maggiorenne><70> +<solo se dichiari di essere non essere minorenne><70> +<solo se dichiari di essere non essere un minorenne><70> +< destinat>,<pubblico maggiorenne><70> +< destinat>,<pubblico maturo><70> +< dichiari >,< di non sentirti offeso><70> +< dichiari >,< di non ritenerti offeso><70> +< salvaguarda>,< bambini>,< software ><20> +< salvaguarda>,< minori>,< software ><20> +< proteggere>,< bambini>,< software ><20> +< proteggere>,< minori>,< software ><20> +< tutela>,< bambini>,< software ><20> +< tutela>,< minori>,< software ><20> +<visione sconsigliata >,< impressionabili>,< soggetti ><70> +<visione sconsigliata >,< impressionabili>,< persone > <70> +<visione sconsigliata >,< sensibili>,< soggetti ><70> +<visione sconsigliata >,< sensibili>,< persone ><70> +< sconsiglia la visione >,< impressionabili>,< soggetti ><70> +< sconsiglia la visione >,< impressionabili>,< persone ><70> +< sconsiglia la visione >,< sensibili>,< soggetti ><70> +< sconsiglia la visione >,< sensibili>,< persone ><70> +< consentita >,< solo se hai compiuto il >,< anno ><70> +<contiene >,< esplicit>,< porno><170> +<contiene >,< esplicit>,< hard><170> +<contiene >,< esplicit>,< sessuale ><170> +<contiene >,< a sfondo >,< sessuale ><170> +<contiene >,< a sfondo >,< porno><170> +< adult>, < esplicit>,< offensiv><170> +< offes>,< visione >, < materiale >,< hard><170> +< offes>,< visione >, < materiale >,< porn><170> +< vietato >,< minori di ><40> +<solo per adulti >,<attenzione ><100> +<solo per adulti >,< avviso ><100> +<solo per adulti >,<avvisiamo ><100> +<solo per adulti >,< avvisa ><100> +<solo per adulti >,<si avvisa ><100> +<solo per adulti >,<informiamo ><100> +<solo per adulti >,< informa ><100> +<solo per adulti >,<si informa ><100> +<per soli adulti >,<attenzione ><100> +<per soli adulti >,<avviso ><100> +<per soli adulti >,<avvisiamo ><100> +<per soli adulti >,< avvisa ><100> +<per soli adulti >,<si avvisa ><100> +<per soli adulti >,<informiamo ><100> +<per soli adulti >,< informa ><100> +<per soli adulti >,<si informa ><100> +<per soli adulti >,<riservato ><100> +<sito per adulti >,<attenzione ><100> +<sito per adulti >,<avviso ><100> +<sito per adulti >,<avvisiamo ><100> +<sito per adulti >,< avvisa ><100> +<sito per adulti >,<si avvisa ><100> +<sito per adulti >,<informiamo ><100> +<sito per adulti >,< informa ><100> +<sito per adulti >,<si informa ><100> +<sito per soli adulti >,<attenzione ><100> +<sito per soli adulti >,<avviso ><100> +<sito per soli adulti >,<avvisiamo ><100> +<sito per soli adulti >,< avvisa ><100> +<sito per soli adulti >,<si avvisa ><100> +<sito per soli adulti >,<informiamo ><100> +<sito per soli adulti >,< informa ><100> +<sito per soli adulti >,<si informa ><100> +< offendere >,< sensibilità><40> +< offendere >,< sensibilita'><40> +< offende >,< sensibilità><40> +< offende >,< sensibilita'><40> +<verifica >,< maggiore >,< età><100> +<verifica >,< maggiore >,< eta'><100> +< essere maggiorenne>,< entrare><100> +< essere maggiorenne>,< visitare ><100> +< essere maggiorenne>,< visionare ><100> +< essere maggiorenne>,< accedere><100> +< essere maggiorenne>,< dichiaro ><170> +< essere maggiorenne>,< dichiari ><170> +< essere maggiorenne>,< accerti ><100> +< essere maggiorenne>,< certifichi ><100> +< non essere minorenne>,< dichiaro ><170> +< non essere minorenne>,< dichiari ><170> +< non essere un minorenne>,< dichiaro ><170> +< non essere un minorenne>,< dichiari ><170> +< non essere un minorenne>,< accerti ><100> +< non essere un minorenne>,< certifichi ><100> +<accesso >,< proibito >,< minori><100> +<accesso >,< proibito >,< minore età><100> +<accesso >,< proibito >,< minore eta'><100> +<accesso >,< proibito >,< minorenni><100> +< uscire>,< non sei maggiorenne ><170> +< non entrare>,< minorenne ><170> +< tutti >,< modelli >,< maggiore >,< età><170> +< tutti >,< modelli >,< maggiore >,< eta'><170> +< tutti >,< modelli >,< sono maggiorenni><170> +< tutte >,< modelle >,< maggiore >,< età><170> +< tutte >,< modelle >,< maggiore >,< eta'><170> +< tutte >,< modelle >,< sono maggiorenni><170> +< uscire immediatamente >,< invitato ><100> +< uscire immediatamente >,< invitiamo ><100> +< consigliata ad un pubblico maggiorenne >,<visione ><100> +< consigliata ad un pubblico maturo >,<visione ><100> +< consigliata ad un pubblico adulto >,<visione ><100> +< orientato >,< pubblico maturo><40> +< orientato >,< pubblico maggiorenne><40> +<accesso assolutamente anonim><40> +<assolutamente anonim><20> +<100% >,< anonim><40> +<senza nessun riferimento><20> +< sesso esplicito >,<scene ><170> +< sesso esplicito >,<materiale ><170> +< sesso esplicito >,<foto ><170> +< sesso esplicito >,<filmati ><170> +< sesso estremo >,<scene ><170> +< sesso estremo >,<materiale ><170> +< sesso estremo >,<foto ><170> +< sesso estremo >,<filmati ><170> +< hardcore estremo>,<scene><170> +< hardcore estremo>,<materiale><170> +< hardcore estremo>,<foto ><170> +< hardcore estremo>,<filmati ><170> +< hardcore estremo>,<film ><170> +< hardcore estremo>,<video ><170> +< video >,< porno>,< amatorial><170> +< video >,< hard>,< amatorial><170> +< trovare >,< film>,< porno>,< dove ><170> +< trovare >,< film>,< hard>,< dove ><170> +< trovare >,< video >,< porno>,< dove ><170> +< trovare >,< video >,< hard>,< dove ><170> +< nude dal vivo><70> +<penetrare in italiano><170> +<penetrare in inglese><170> +<penetrate in italiano><170> +<penetrate in inglese><170> +<penetra in italiano><170> +<penetra in inglese><170> +<adult check id><170> +<software di collegamento><60> +<programma di collegamento><60> +<software per il collegamento><60> +<programma per il collegamento><60> +<software per collegarsi><60> +<programma per collegarsi><60> +<legg>,< attentamente>,< le condizioni><20> +<scaric>,< il programma><10> +<scaric>,< il software><10> +<segui>,<le istruzioni><10> +<accett>,<le condizioni><10> +<accett>,< i termini><10> +<ingresso immediato><20> +<senza carta di credito><40> +<nessuna carta di credito><40> +<non mostrare>,<minor><40> +<pedofil>,<sito><100> +<pedofil>,<materiale><100> +<pedofil>,<contro><40> +<sezione>,<dedicata>,<sesso><100> + +# sexy sites +<senza censura><10> +<senza alcuna censura><30> +< spogliarsi><10> +< pronta a spogliarsi><50> +< pronte a spogliarsi><50> +< pronta a obbedire><50> +< pronte a obbedire><50> +< pronta a soddisfare><50> +< pronte a soddisfare><50> +< lei obbedisce><20> +< soddisfare ogni tuo ><50> + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/pornography/weighted_japanese b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/pornography/weighted_japanese new file mode 100644 index 0000000000000000000000000000000000000000..24d12c789778e73d0501f46ad574b6c0f321c254 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/pornography/weighted_japanese @@ -0,0 +1,265 @@ +# +# Phraselists to block japanese pornographic and explicit sites. +# Originally Created by Fernand Jonker +# Sponsored by Eric Duveau +# +# Some words and meanings from +# http://en.wikipedia.org/wiki/List_of_Japanese_sex_terms +# http://en.wikipedia.org/wiki/Pornography_in_Japan +# +# Note that all phrases are in UFT-8, EUC-JP and SHIFT_JIS character sets. + +#noconvert +#listcategory: "Pornography (Japanese)" + + +#Block Un-filtered character sets +<x-sjis><250> #New character set - not used much +<ISO-2022-JP><250> #Used primarily for email +<CP932><250> #Unknown + +####################################### +#Shift_JIS +####################################### + +<Shift_JIS><1> #CharSet Identifier for Troubleshooting + +<—><50> #little woman (girl) +<—><10> #woman +<”ü><5> #beauty +<—‡><10> #nude +<—‡‘Ì><20> #nude +<g‘Ì><10> #body +<‹¹><10> breast +<™X•s‹X><50> #children not allowed +<ŽÊ^WE‰æW><50> #fetish photos + +<21ΈÈã><100> #21 or older +<18ΈÈã><100> #18 or older +<18ΈÈã><200> +<ƒIƒiƒj[><100> #masturbation +<“û><20> #milk - semen +<”N—î”FØ><50> #age verification +<ƒAƒ_ƒ‹ƒg><50> #adult + +<ƒ|ƒ‹ƒmƒOƒ‰ƒtƒB[><100> #porn + +<‚¨‚Á‚Ï‚¢><50> #breasts +<ƒI[ƒ‰ƒ‹ƒZƒbƒNƒX><50> #oral sex +<ƒpƒCƒYƒŠ><50> #mammary intercourse +<ŠÆŽo–…><50> #Pole Sisters; Two or more women that have had sex with the same man. +<«Œð><50> #intercourse +<¸Žq><20> #sperm +<«—~><40> #sexual desire +<ƒZƒbƒNƒX><50> #sex +<’ª‚«><50> #female ejaculation +<K><20> #buttocks +<ˆ—><30> #virgin +<ƒVƒ‡ƒ^ƒRƒ“><100> # fetish for underage boys +<••½><50> #perverted, lecherous. +<‚â‚é><5> #to have sex +<ƒU[ƒƒ“><40> #The Japanese pronounciation of the German word "Samen" (semen). +<’sŠ¿><50> #pervert/molestor +<ƒ`ƒJƒ“><50> #pervert/molestor +<‚¿‚©‚ñ><50> #pervert/molestor +<”›‚è><50> #bondage + +<ˆ¤‰t><50> # love juice; male and/or female sexual secretions +<ŒŠŒZ’í><50> #hole brothers, Two or more men that have had sex with the same woman. + +<‘Å‚ÁŠ|‚¯><50> #Bukakke +<ƒƒbƒJƒP><50> #Bukakke +<ƒoƒbƒN‚Å><50> #Doggy Style +<”„t•w><50> #Prostitute +<”ü”N><50> # beautiful boy +<”ü—><50> #describes any pretty girl +<‚Ú‚Ú><50> # the vulva or vagina +<“ûéf><50> # nipple +<ƒGƒbƒ`><40> # perverted +<ƒGƒbƒ`‚È><40> # perverted + +<ƒtƒ@ƒbƒN><100> #fuck +<ƒtƒFƒ‰><100> #fellatio +<ƒtƒFƒ‰ƒ`ƒI><100> #fellatio + +<ƒnƒƒ‹><50> #to have sex + +<bŠ><100> #beastiality + +<•Ï‘Ô><50> #hentai - used for explicit/perverted material in Japan +<ƒGƒƒAƒjƒ><50> #erotica anime +<¬”N><50> #adult +<18‹Ö><100> #prohibited to those under 18 +<¬l–Ÿ‰æ><100> #adults only +<ƒGƒ><50> #erotic/porn +<ƒƒŠƒRƒ“><50> #lolicon / lolita + +<ŒŠ><10> #ass +<‹“û><50> #big chest/breasts + +<’†o‚µ><60> #internal male ejaculation +<ƒIƒiƒj[><100> #masturbation + +####################################### +#UTF-8 +####################################### + +<UTF-8><1> #CharSet Identifier for Troubleshooting + +<少女><50> #little woman (girl) +<女><10> #woman +<美><5> #beauty +<裸><10> #nude +<裸体><20> #nude +<身体><10> #body +<胸><10> breast +<å°‘å„¿ä¸å®œ><50> #children not allowed +<写真集・画集><50> #fetish photos + +<21æ³ä»¥ä¸Š><100> #21 or older +<18æ³ä»¥ä¸Š><100> #18 or older +<オナニー><100> #masturbation +<ä¹³><20> #milk - semen +<å¹´é½¢èªè¨¼><50> #age verification +<アダルト><50> #adult + +<ãƒãƒ«ãƒŽã‚°ãƒ©ãƒ•ã‚£ãƒ¼><50> #porn + +<ãŠã£ã±ã„><50> #breasts +<オーラルセックス><50> #oral sex +<パイズリ><50> #mammary intercourse +<竿姉妹><50> #Pole Sisters; Two or more women that have had sex with the same man. +<性交><50> #intercourse +<ç²¾å><20> #sperm +<性欲><40> #sexual desire +<セックス><50> #sex +<æ½®å¹ã><50> #female ejaculation +<å°»><20> #buttocks +<処女><30> #virgin +<ショタコン><100> # fetish for underage boys +<助平><50> #perverted, lecherous. +<ã‚„ã‚‹><5> #to have sex +<ザーメン><40> #The Japanese pronounciation of the German word "Samen" (semen). +<ç—´æ¼¢><50> #pervert/molestor +<ãƒã‚«ãƒ³><50> #pervert/molestor +<ã¡ã‹ã‚“><50> #pervert/molestor +<縛り><50> #bondage + +<愛液><50> # love juice; male and/or female sexual secretions +<穴兄弟><50> #hole brothers, Two or more men that have had sex with the same woman. + +<打ã£æŽ›ã‘><50> #Bukakke +<ãƒãƒƒã‚«ã‚±><50> #Bukakke +<ãƒãƒƒã‚¯ã§><50> #Doggy Style +<売春婦><50> #Prostitute +<美少年><50> # beautiful boy +<美少女><50> #describes any pretty girl +<ã¼ã¼><50> # the vulva or vagina +<ä¹³é¦><50> # nipple +<エッãƒ><40> # perverted +<エッãƒãª><40> # perverted + +<ファック><100> #fuck +<フェラ><100> #fellatio +<フェラãƒã‚ª><100> #fellatio + +<ãƒãƒ¡ãƒ«><50> #to have sex + +<ç£å§¦><100> #beastiality + +<変態><50> #hentai - used for explicit/perverted material in Japan +<エãƒã‚¢ãƒ‹ãƒ¡><50> #erotica anime +<æˆå¹´><50> #adult +<18ç¦><100> #prohibited to those under 18 +<æˆäººæ¼«ç”»><100> #adults only +<エãƒ><50> #erotic/porn +<ãƒãƒªã‚³ãƒ³><50> #lolicon / lolita + +<ç©´><10> #ass +<巨乳><50> #big chest/breasts + +<ä¸å‡ºã—><60> #internal male ejaculation +<オナニー><100> #masturbation + +####################################### +#EUC-JP +####################################### + +<EUC-JP><1> #CharSet Identifier for Troubleshooting + +<¾¯½÷><50> #little woman (girl) +<½÷><10> #woman +<¥ª¥Ê¥Ë¡¼><250> #masturbation +<¥ª¥Ê¥><250> #masturbation +<Èþ><5> #beauty +<Íç><10> #nude +<ÍçÂÎ><20> #nude +<¿ÈÂÎ><10> #body +<¶»><10> breast +<¾¯Ñ¹ÉÔµ¹><50> #children not allowed +<¼Ì¿¿½¸¡¦²è½¸><50> #fetish photos + +<21ºÐ°Ê¾å><100> #21 or older +<18ºÐ°Ê¾å><100> #18 or older + +<Æý><20> #milk - semen +<ǯÎðǧ¾Ú><50> #age verification +<¥¢¥À¥ë¥È><50> #adult + +<¥Ý¥ë¥Î¥°¥é¥Õ¥£¡¼><100> #porn + +<¤ª¤Ã¤Ñ¤¤><50> #breasts +<¥ª¡¼¥é¥ë¥»¥Ã¥¯¥¹><50> #oral sex +<¥Ñ¥¤¥º¥ê><50> #mammary intercourse +<´È»ÐËå><50> #Pole Sisters; Two or more women that have had sex with the same man. +<À¸ò><50> #intercourse +<Àº»Ò><20> #sperm +<ÀÍß><40> #sexual desire +<¥»¥Ã¥¯¥¹><50> #sex +<Ĭ¿á¤><50> #female ejaculation +<¿¬><20> #buttocks +<½è½÷><30> #virgin +<¥·¥ç¥¿¥³¥ó><100> # fetish for underage boys +<½õÊ¿><50> #perverted, lecherous. +<¤ä¤ë><5> #to have sex +<¥¶¡¼¥á¥ó><40> #The Japanese pronounciation of the German word "Samen" (semen). +<ÃÔ´Á><50> #pervert/molestor +<¥Á¥«¥ó><50> #pervert/molestor +<¤Á¤«¤ó><50> #pervert/molestor +<Çû¤ê><50> #bondage + +<°¦±Õ><50> # love juice; male and/or female sexual secretions +<·ê·»Äï><50> #hole brothers, Two or more men that have had sex with the same woman. + +<ÂǤóݤ±><50> #Bukake +<¥í¥Ã¥«¥±><50> #Bukake +<¥Ð¥Ã¥¯¤Ç><50> #Doggy Style +<Çä½ÕÉØ><50> #Prostitute +<Èþ¾¯Ç¯><50> # beautiful boy +<Èþ¾¯½÷><50> #describes any pretty girl +<¤Ü¤Ü><50> # the vulva or vagina +<ÆýñÇ><50> # nipple +<¥¨¥Ã¥Á><40> # perverted +<¥¨¥Ã¥Á¤Ê><40> # perverted + +<¥Õ¥¡¥Ã¥¯><100> #fuck +<¥Õ¥§¥é><100> #fellatio +<¥Õ¥§¥é¥Á¥ª><100> #fellatio + +<¥Ï¥á¥ë><50> #to have sex + +<½Ã´¯><100> #beastiality + +<ÊÑÂÖ><50> #hentai - used for explicit/perverted material in Japan +<¥¨¥í¥¢¥Ë¥á><50> #erotica anime +<À®Ç¯><50> #adult +<18¶Ø><100> #prohibited to those under 18 +<À®¿ÍÌ¡²è><100> #adults only +<¥¨¥í><50> #erotic/porn +<¥í¥ê¥³¥ó><50> #lolicon / lolita + +<·ê><10> #ass +<µðÆý><50> #big chest/breasts + +<Ãæ½Ð¤·><60> #internal male ejaculation +<¥ª¥Ê¥Ë¡¼><100> #masturbation diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/pornography/weighted_malay b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/pornography/weighted_malay new file mode 100644 index 0000000000000000000000000000000000000000..a67c90eeccdff482baec678f37e5ae42247e85f0 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/pornography/weighted_malay @@ -0,0 +1,60 @@ +# +# Created by Sazarul Izam <izam@oscc.org.my> +# Sorted by words +# +#listcategory: "Pornography (Malay)" + +<18 tahun><10> +<18 tahun>,<dewasa>,<ghairah><120> +<batang><10> +<batang>,<konek><120> +<batang>,<kote><120> +<bogel><60> +<bogel>,<artis><80> +<buah dada><80> +<burit><50> +<burit>,<rogol><120> +<celaka><40> +<cipap><100> +<dayung><10> +<dayung>,<ghairah>,<puas><120> +<dubur><40> +<faraj><10> +<faraj>,<konek><120> +<fark><80> +<ghairah><10> +<ghairah>,<rangsang><50> +<kimak><80> +<kiwak><80> +<konek><80> +<konek>,<cipap><150> +<kote><80> +<kote>,<cipap><150> +<lancau><80> +<lanciao><80> +<lancap><80> +<lubang><10> +<main>,<batang>,<ghairah><120> +<nonok><80> +<ponggong><80> +<puki><80> +<pukimak><80> +<punggung><10> +<punggung>,<kote>,<konek><120> +<ramas><10> +<ramas>,<buah dada><100> +<ramas>,<tetek><120> +<ramas>,<ghairah><80> +<rangsang><10> +<rogol><10> +<sial><50> +<telanjang><80> +<telur><10> +<testis><10> +<tetek><10> +<tetek>,<puki><120> +<tutuh><80> +<zakar><20> +<zakar>,<zina><60> +<zakar>,<puas>,<sedap><120> +<zina><10> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/pornography/weighted_norgwegian b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/pornography/weighted_norgwegian new file mode 100644 index 0000000000000000000000000000000000000000..21b6a8e3c6771c3cfa7bec2ffaa85335f58e2c93 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/pornography/weighted_norgwegian @@ -0,0 +1,11 @@ +# +# Taken from translations done by Charlie Grosvenor +# + +#listcategory: "Pornography (Norwegian)" + +<naken><30> #nude +<blottet><30> #nude +<nakenmodell><30> #nudemodel + + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/pornography/weighted_portuguese b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/pornography/weighted_portuguese new file mode 100644 index 0000000000000000000000000000000000000000..f86f72217ec4558bd856277f4264fb0214fee16e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/pornography/weighted_portuguese @@ -0,0 +1,701 @@ +# +# Originally created by Aecio F. Neto with additions from Allan Gomes +# + +#listcategory: "Pornography (Portuguese)" + + +########## +# Palavras diretamente relacionadas a sexo +########## +< anal ><10> +< bacanal><20> +< bisexual><20> +< bissexual><20> +< bordel><20> +< bosta><20> +< buceta><20> +< bucetud><20> +< bunda><20> +< cacete><20> +< cagão><20> +< cagad><20> +< cagando ><20> +< cagar><20> +< calcinha><5> +< caralh><20> +< clitóris><10> +< cú ><20> +< dominatrix><20> +< ejaculad><20> +< ejaculando ><20> +< ejacular><20> +< ejaculação><20> +< erótica><20> +< esperma><20> +< estuprad><10> +< estuprando><10> +< estuprar><10> +< estupro><10> +< felação><10> +< fetiche><20> +#< filho da puta ><80> +< foda><20> +< fodendo ><20> +< foder><20> +< fodid><20> +< fodinh><20> +< gay ><10> +< gozo><20> +< hentai><10> +< hermafrodita><10> +< homosexual><10> +< homossexual><10> +< lésbica><20> +< lesbica><20> +< masturbação><10> +< merda><20> +< metendo ><20> +< metid><20> +< mijão><20> +< mijad><20> +< mijando ><20> +< mijar><20> +< ninfeta><10> +< ninfomaníac><10> +< nudismo><10> +< orgia><10> +< pedofilia><10> +< peituda><20> +< pelada><10> +< pelado><10> +< peladinh><10> +< penetrad><20> +< penetrar><20> +< penetraçães><20> +< penetração><20> +< pintud><20> +< pornografia><10> +< pornográfic><10> +< porra ><20> +< punheta><20> +< punheteir><20> +< puta ><10> +< putaria><20> +< putinh><20> +< sacanagem><10> +< sado masoquismo><10> +< sado mazoquismo><10> +< sado-maso><10> +< sado-masoquismo><10> +< sado-mazo><10> +< sado-mazoquismo><10> +< sadomasoquismo><10> +< sadomazoquismo><10> +< sex shop><10> +< suruba><10> +< tesão><20> +< tesud><20> +< teta><10> +< transexual><10> +< transsexual><10> +< traveco><20> +< travesti><20> +< trepad><20> +< trepand><20> +< trepar><20> +< vagina><10> +< vibrador><20> +< virgem><10> +< virgens><10> +< voyeur><10> + +########## +# Gírias relacionadas a sexo +########## +< bolagato><30> +< bola-gato><30> +< bola gato><30> +< boquete><30> +< chupeta><5> +< chupeteir><10> +< bronha><20> +< chana><30> +< chavasca><30> +< gulosa><10> +< lacraia><20> +< lesbo><30> +< lezbo><30> +< lolita><30> +< pombaloca><30> +< pombalouca><30> +< popozão><30> +< rabo><10> +< rabão><15> +< swingue ><50> +< teens><10> +< traseiro><10> +< turbinada><10> +< xana><30> +< xoxota><30> +< xavasca><30> + +########## +# Palavras com sentido pejorativo +########## +< arregaçad><20> +< arreganhad><20> +< depilad><20> +< galinha><10> +< molhad><20> +< molhadinh><20> +< oral><20> +< raspad><20> +< raspadinh><20> +< regaçad><20> +< reganhad><20> +< vagabunda><20> +< vadia><10> +< vadio><10> + +########## +# Palavras comumente utilizadas em sites +########## +< maior de idade><5> +< menor de idade><5> +< acompanhantes><5> +< adulto><5> +< adulta><5> +< álbum><5> +< amadoras><5> +<amadora>,<foto><50> +#< animal ><5> #Fernand overblocking +< asiática><10> +< associe-se agora><10> +< bestialidade><10> +< bizarr><10> +< casal ><5> +<caseira>,<foto><50> +< celebridade><5> +< deliciosa><10> +< deusa><10> +< estudant><5> +<exibicionista><40> +< gatinh><5> +< gatissím><5> +< grátis><5> +< grávid><5> +< grupal><10> +< japones><5> +< japonês><5> +< loira><5> +< modelo><5> +< morena><5> +< mulatas><5> +< proibid><5> +< universitári><5> + +########### +# Frases e expressões +########### +< 100% ilegal><70> +< 100% porn><80> +< 100% porn>,<grátis><80> +< 100% proibido><50> +< 100% puta><50> +< acesso automático>,< liberad>,<cartão de crédito><80> +< acesso completo>,< conteúdo adulto>,<cartão de crédito><80> +< acesso completo>,< liberad>,<cartão de crédito><80> +< acesso instantâneo>,<liberado>,<cartão de crédito><80> +<adult>,< erótic><80> +< agência>,<acompanhante><20> +< amador ><10> +< amadora asiática><40> +< amadora chupando><70> +< amadoras asiáticas><40> +< amadoras chupando><70> +< amadoras grátis><30> +< amador chupando><70> +< amadores chupando><70> +< amador>,< estudante ><40> +< amador>,< foda ><70> +< amador>,< metida ><70> +< amador>,< peito><70> +< amador>,< penetração><20> +< amador>,< porn><70> +< amador>,< seio><70> +< amador>,< teta><70> +< amador>,< transa ><70> +< amador>,< universidade><40> +< amador>,< universitária><40> +<amador>,< xxx><70> +< anal ><20> +< anal >,< foda ><60> +< anal >,< porn><60> +< anal >,< tesão><60> +< anal >,< xxx><60> +< animais,< foda >,< burro><50> +< animais,< foda >,< cachorr><50> +< animais,< foda >,< cadela><50> +< animais,< foda >,< cavalo><50> +< animais,< foda >,<galinha><50> +< animais,< foda >,< jumento><50> +< animais,< sexo >,< burro><50> +< animais,< sexo >,< cachorr><50> +< animais,< sexo >,< cadela><50> +< animais,< sexo >,< cavalo><50> +< animais,< sexo >,<galinha><50> +< animais,< sexo >,< jumento><50> +< animal>,< foda >,< burro><50> +< animal>,< foda >,< cachorr><50> +< animal>,< foda >,< cadela><50> +< animal>,< foda >,< cavalo><50> +< animal>,< foda >,<galinha><50> +< animal>,< foda >,< jumento><50> +< animal>,< sexo >,< burro><50> +< animal>,< sexo >,< cachorr><50> +< animal>,< sexo >,< cadela><50> +< animal>,< sexo >,< cavalo><50> +< animal>,< sexo >,<galinha><50> +< animal>,< sexo >,< jumento><50> +< área exclusiva para membros>,<adult><60> +< asiática amadora><40> +< asiática deliciosa ><60> +< asiáticaerotica><80> +< asiática gostosa ><60> +< asiática maravilhosa ><60> +< asiática nua ><60> +< asiática pelada ><60> +< asiáticas amadoras><40> +< asiáticas deliciosas ><60> +< asiática sensual ><60> +< asiáticaserotica><80> +< asiáticas gostosas ><60> +< asiáticas maravilhosas ><60> +< asiáticas nuas ><60> +< asiáticas peladas ><60> +< asiáticas sensuais ><60> +< assexual ><5> +< atividade sexual><10> +< atores pornô>,< fetiche><80> +< atores pornô>,< fotos ><80> +< atores pornô>,< imagem><80> +< atores pornô>,< imagens><80> +< ator pornô><20> +< ator pornô>,< fetiche><80> +< ator pornô>,< fotos ><80> +< ator pornô>,< imagem><80> +< ator pornô>,< imagens><80> +< atrizes pornô>,< fetiche><80> +< atrizes pornô>,< fotos ><80> +< atrizes pornô>,< imagem><80> +< atrizes pornô>,< imagens><80> +< atriz pornô><20> +< atriz pornô>,< fetiche><80> +< atriz pornô>,< fotos ><80> +< atriz pornô>,< imagem><80> +< atriz pornô>,< imagens><80> +<aumente seu pênis><70> +< auto felação ><80> +< autofelação ><80> +< brinquedinho>,<adult>,< sex><80> +< brinquedo >,<adult>,< sex><80> +< bunda arreganhad><150> +< bunda>,<cheia>,<porra><80> +< bunda deliciosa ><60> +< bunda gostosa ><60> +< bunda>,<lotada>,<porra><80> +< bunda maravilhosa ><60> +< bunda reganhad><150> +< bundas arreganhad><150> +< bundas deliciosas ><60> +< bunda sensual ><60> +< bundas gostosas ><60> +< bundas maravilhosas ><60> +< bundas reganhad><150> +< bundas sensuais ><60> +< cacete em seu><60> +< cacete em sua><60> +< cacete grosso><60> +< cacete na sua><60> +< cacete no seu><60> +< cacetes grosso><60> +< caralho em seu><60> +< caralho em sua><60> +< caralho grosso><60> +< caralho na sua><60> +< caralho no seu><60> +< caralhos grosso><60> +< casais fazendo sexo ><60> +< casais transando ><60> +< casal fazendo sexo ><60> +< casal transando ><60> +< celebridades nuas ><40> +< celebridades peladas ><40> +< chat erótico ><70> +<classisex><100> +< clube erótico><50> +< clube gay><70> +< comendo >,< buceta><40> +< comendo >,< bunda ><40> +< comendo >,< cu ><40> +< comendo >,< cú ><40> +< comendo >,< rabo ><40> +< comendo >,< traseiro ><40> +< comendo >,< xoxota><40> +< comer >,< buceta><40> +< comer >,< bunda ><40> +< comer >,< cu ><40> +< comer >,< cú ><40> +< comer >,< rabo ><40> +< comer >,< traseiro ><40> +< comer >,< xoxota><40> +< concord>,<não concord>,< idade>,< sex>,<explicít><80> +<content="adulto"><50> +<content="pornô"><80> +<content="pornográfico"><80> +<content="sexo"><80> +<content="sexual"><80> +< conteúdo >,< exclusiv>,< adult><50> +< conteúdo >,< incrivel>,< adult><50> +< conteúdo >,< incrível>,< adult><50> +< conteúdos >,< exclusiv>,< adult><50> +< conteúdos >,< incrivel>,< adult><50> +< conteúdos >,< incrível>,< adult><50> +< conteúdo somente para adult><50> +< conteúdos >,<somente >,< adult><50> +< conteúdos somente para adult><50> +< cu arreganhad><150> +< cu>,<cheio>,<porra><80> +< cu>,<lotado>,<porra><80> +< cu reganhad><150> +< cyber erótica><80> +< cybererótica><80> +<cyber pornô><20> +<cyberpornô><20> +<cyber pornográfico><20> +<cyberpornográfico><20> +<cyber sexo><20> +<cybersexo><20> +< deliciosa asiática ><60> +< deliciosa bunda ><60> +< deliciosa loira ><60> +< deliciosa morena ><60> +< deliciosa mulata ><60> +< deliciosas asiáticas ><60> +< deliciosas bundas ><60> +< deliciosas loiras ><60> +< deliciosas morenas ><60> +< deliciosas mulatas ><60> +< depois de >,< gozar><50> +< descascado a banana><40> +< descascando a banana><40> +< descascar a banana><40> +<dreamcam><50> +< dupla penetração><80> +< email erótico><30> +<entrar>,<sair>,<anos>,< sex>,<explícit><80> +<entrar>,<sair>,<idade>,< sex>,<explícit><80> +<entre>,<sair>,<anos>,< sex>,<explícit><80> +<entre>,<sair>,<idade>,< sex>,<explícit><80> +< erótic>,< porn><30> +< esposa amadora><50> +< esposas amadoras><50> +< estão nuas ><20> +< estão nus ><20> +< estão pelad ><20> +< fantasia erótica ><70> +< fantasias eróticas ><70> +< fetiche>,< anal ><30> +< fetiche erótico><80> +< fetiche>,<foda><30> +< fetiche>,< porn><30> +< fetiche>,< xxx><30> +< filme adult><30> +< filme de sexo><30> +< film>,< pornô ><50> +< film>,< porno ><50> +< film>,<sacanagem><50> +< filme gay><50> +< filme para maior><30> +< filmes de sexo><30> +< filmes gays><50> +< foda anal ><80> +< foda com animais><80> +< fodendo >,< buceta><40> +< fodendo >,< bunda ><40> +< fodendo >,< cu ><40> +< fodendo >,< cú ><40> +< fodendo >,< rabo ><40> +< fodendo >,< traseiro ><40> +< fodendo >,< xoxota><40> +< foder >,< buceta><40> +< foder >,< bunda ><40> +< foder >,< cu ><40> +< foder >,< cú ><40> +< foder >,< rabo ><40> +< foder >,< traseiro ><40> +< foder >,< xoxota><40> +< foto>,<adolescente>,<transando><80> +< foto>,<adolescente>,<trepando><80> +< foto>,< brinqued>,<sexo><80> +< foto>,<swingue><100> +< fotos amadoras grátis><80> +< fotos >,< sensuais ><30> +< galeria erótica><80> +< garganta profunda ><30> +< garganta profunda >,< chup><80> +< garganta profunda >,< puta><30> +< garganta profunda >,< sex><80> +< gay fazendo sexo ><60> +< gays fazendo sexo ><60> +< gays transando ><60> +< gay transando ><60> +< gostosa asiática ><60> +< gostosa bunda ><60> +< gostosa loira ><60> +< gostosa morena ><60> +< gostosa mulata ><60> +< gostosas asiáticas ><60> +< gostosas bundas ><60> +< gostosas loiras ><60> +< gostosas morenas ><60> +< gostosas mulatas ><60> +< grátis imagem>,<amador>,<sex><80> +< grátis imagens>,<amador>,<sex><80> +< guia erótico ><70> +< homem fazendo sexo ><60> +< homem nu><20> +< homem pelado><20> +< homem transando ><60> +< homens fazendo sexo ><60> +< homens nus><60> +< homens pelados><60> +< homens transando ><60> +< imagem gay><80> +< imagens gay><80> +< imagens para adult><40> +< indústria pornô><50> +< indústria pornográfica><50> +< jogo com sexo >,< adult><80> +< jogo de sexo >,< adult><80> +< latina amadora><50> +< latinas amadoras><50> +<links amadores><50> +< loira deliciosa ><60> +< loira>,< foda><10> +< loira gostosa ><60> +< loira maravilhosa ><60> +< loira nua ><60> +< loira pelada ><60> +< loira>,< porn><30> +< loiras deliciosas ><60> +< loira sensual ><60> +< loiras gostosas ><60> +< loiras maravilhosas ><60> +< loiras nuas ><60> +< loiras peladas ><60> +< loiras sensuais ><60> +< loira>,< xxx><40> +< maravilhosa asiática ><60> +< maravilhosa bunda ><60> +< maravilhosa loira ><60> +< maravilhosa morena ><60> +< maravilhosa mulata ><60> +< maravilhosas asiáticas ><60> +< maravilhosas bundas ><60> +< maravilhosas loiras ><60> +< maravilhosas morenas ><60> +< maravilhosas mulatas ><60> +< massagem erótica><50> +< material adult><20> +< material adult>,<explícit><70> +< melhor conteúdo adulto ><80> +< melhor conteúdo gay><80> +< melhor conteúdo para adulto><80> +< melhor conteúdo pornô ><80> +< melhor conteúdo pornográfico ><80> +< melhor conteúdo público adulto ><80> +< melhor site adulto ><80> +< melhor site gay><80> +< melhor site para adulto><80> +< melhor site pornô ><80> +< melhor site pornográfico ><80> +< melhor site público adulto ><80> +< melhor website adulto ><80> +< melhor website gay><80> +< melhor website para adulto><80> +< melhor website pornô ><80> +< melhor website pornográfico ><80> +< melhor website público adulto ><80> +<menor>,<18 anos><80> +<maior>,<18 anos><80> +< metendo >,< buceta><40> +< metendo >,< bunda ><40> +< metendo >,< cu ><40> +< metendo >,< cú ><40> +< metendo >,< rabo ><40> +< metendo >,< traseiro ><40> +< metendo >,< xoxota><40> +< meter >,< buceta><40> +< meter >,< bunda ><40> +< meter >,< cu ><40> +< meter >,< cú ><40> +< meter >,< rabo ><40> +< meter >,< traseiro ><40> +< meter >,< xoxota><40> +< morena deliciosa ><60> +< morena gostosa ><60> +< morena maravilhosa ><60> +< morena nua ><60> +< morena pelada ><60> +< morenas deliciosas ><60> +< morena sensual ><60> +< morenas gostosas ><60> +< morenas maravilhosas ><60> +< morenas nuas ><60> +< morenas peladas ><60> +< morenas sensuais ><60> +< mulata deliciosa ><60> +< mulata gostosa ><60> +< mulata maravilhosa ><60> +< mulata nua ><60> +< mulata pelada ><60> +< mulatas deliciosas ><60> +< mulata sensual ><60> +< mulatas gostosas ><60> +< mulatas maravilhosas ><60> +< mulatas nuas ><60> +< mulatas peladas ><60> +< mulatas sensuais ><60> +<mulher>,<gostosa><50> +< mulheres fazendo sexo ><60> +< mulheres nuas><20> +< mulheres nuas ><40> +< mulheres peladas ><40> +< mulheres transando ><60> +< mulher fazendo sexo ><60> +< mulher nua><20> +< mulher pelada ><20> +< mulher transando ><60> +< orgia anal ><70> +<páginas amadoras><80> +<páginas amadoras>,<fotos grátis><80> +<páginas com amadoras><80> +<páginas de amadoras><80> +< paixão anal ><70> +< pau grande><60> +< pau imenso><60> +< pau grosso><60> +< pau cumprido><60> +< pau longo><60> +< pau em seu><60> +< pau em sua><60> +< pau grosso><60> +< pau na sua><60> +< pau no seu><60> +< paus grosso><60> +< penetração anal ><80> +< pinto em seu><60> +< pinto em sua><60> +< pinto grosso><60> +< pinto na sua><60> +< pinto no seu><60> +< pintos grosso><60> +< popozão arreganhad><150> +< popozão>,<cheio>,<porra><80> +< popozão>,<lotado>,<porra><80> +< popozão reganhad><150> +< porno adult><80> +< pornô adult><80> +< pornô gay><80> +< pornografia adult><80> +< pornográfica gay><80> +< pornográfica grátis><80> +< pornográfico gay><80> +< pornográfico grátis><80> +< pornô grátis><80> +< proibid><5> +< público adulto>,< só ><50> +< público adulto>,< somente><50> +< puta asiática ><60> +< puta loira ><60> +< puta morena ><60> +< puta mulata ><60> +< putas asiáticas ><60> +< putas loiras ><60> +< putas morenas ><60> +< putas mulatas ><60> +< renovação automática >,<30 dias><40> +< revista masculina><40> +< revista pornográfica><40> +< revista pornô><40> +< senhas grátis><10> +< serviço>,<acompanhante><20> +< sexo amador ><80> +< sexo anal ><80> +< sexo anal explícito><80> +< sexo animal ><60> +< sexo bizarro ><80> +< sexo com animais ><80> +< sexo gay ><30> +<sexo oral><25> +< show com sexo ><30> +< show de sexo ><30> +< show de strip>,<adult><80> +< show para adult><10> +< show para público adulto><10> +< show pornô><50> +< show pornográfico><50> +< shows pornô><50> +< shows pornográficos><50> +<site adult><30> +<site adulto pago><80> +<site com sexo>,< adult><60> +<site de sexo>,< adult><60> +<sites adult><30> +<sites adultos >,<contra pornografia infantil><60> +<sites adultos contra pornografia infantil><60> +<sites adultos pagos><80> +<sites com sexo>,< adult><60> +<sites de sexo>,< adult><60> +<site somente para adult><50> +<sites somente para adult><50> +< socado bronha><80> +< socado punheta><80> +< socado uma bronha><80> +< socado uma punheta><80> +< socando bronha ><80> +< socando punheta ><80> +< socando uma bronha ><80> +< socando uma punheta ><80> +< socar bronha ><80> +< socar punheta ><80> +< socar uma bronha><80> +< socar uma punheta><80> +< somente para adultos><20> +< somente para adultos>,< por favor ><60> +< só para adultos ><20> +< só para adultos >,< por favor ><60> +< supersite adulto ><50> +< tenha acesso instantâneo><10> +< tenha um pênis maior><80> +< tenha um pinto maior><80> +< tocado bronha><80> +< tocado punheta><80> +< tocado uma bronha><80> +< tocado uma punheta><80> +< tocando bronha ><80> +< tocando punheta ><80> +< tocando uma bronha ><80> +< tocando uma punheta ><80> +< tocar bronha ><80> +< tocar punheta ><80> +< tocar uma bronha><80> +< tocar uma punheta><80> +< traseiro arreganhad><150> +< traseiro>,<cheio>,<porra><80> +< traseiro>,<lotado>,<porra><80> +< traseiro reganhad><150> +<troca de casais><50> +< videochat>,< adult><80> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/pornography/weighted_russian b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/pornography/weighted_russian new file mode 100644 index 0000000000000000000000000000000000000000..781bf0c87a8c6578a5631888cc44161f78f0b8de --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/pornography/weighted_russian @@ -0,0 +1,60 @@ +# +# Originally Created By Fernand Jonker +# +# Russian-English bad words dictionary - http://0.viv.ru/cont/dict_mat/1.html + +#noconvert +#listcategory: "Pornography (Russian)" + +<ïðîñòèòóòêè><50> #prostitutes +<ôîòî><5> #photo +<áþñò><40> #bust +<àíàë><40> #anal +<àíàëüíûé><40> #anal +<àíàëüíûé ñåêñ><50> #anal sex +<aíàëüíûé ñåêñ><120> #anal sex (first 'a' is latin) +<îðàëüíûé ñåêñ><50> #oral sex +<oðàëüíûé ñåêñ><120> #oral sex (first 'o' is latin) +<ñåêñà><40> #sex +<ñåêñ><40> #sex +<ñåêñ ÷àò><50> #sex chat +<cåêñ ÷àò><120> #sex chat (first 'c' is latin) +<ñåêñ ôîðóì><50> #sex forum +<cåêñ ôîðóì><120> #sex forum (first 'c' is latin) +<äîñóãà><5> #leisure +<èíòèì óñëóãè><40> #intimate service +<ìîëîäûå><2> #teen +<ïîæèëûå><2> #mature +<ëåñáè><40> #lesbi +<ëåñáèÿíêè><40> #lesbian +<èçâðàùåíèÿ><40> #bizarre +<àçèàòêè><20> #asian +<âñå êàòåãîðèè><5> #all categories +<áäñì><40> # bdsm +<áåðåìåííûå><10> #pregnant +<áîëüøèå ñèñüêè><40> #large breasts +<ãåíèòàëèè><40> #genitalia +<ãåíåòàëèè><40> #genitalia +<ãðóïïîâóõà><40> #groupsex +<æåíñêàÿ êîí÷èíà><40> #woman cum +<çíàìåíèòîñòè><5> #celebrity +<çðåëûå æåíùèíû><40> #mature women +<ëàòèíàñ><40> #latinas +<ëþáèòåëè><5> #amateurs +<íà ïóáëèêå><5> #in public +<íåãðû><5> #blacks +<ïèñàþùèå><40> #pissing +<ïîçèðóþùèå><10> #posing +<ïîðíî><40> #porno +<ïîðíî çâåçäû><40> #porn stars +<ðèñóíêè><4> #pictures +<ñàìîòûê><40> #masturbate +<ñêðûòîé êàìåðîé><40> #hidden camera +<ñïåðìà íà ëèöå><60> #sperm on face +<ñòðàïîí><40> #strapon +<òèíû><40> #slime +<òîëñòóøêè><40> #fat +<ôåòèø><40> #fetish +<áåñïëàòíîå ïîðíî è ýðîòèêà><40> #free porno and erotics +<ñàìûå ëó÷øèå ïîðíî ãàëåðåè îòîáðàííûå â ðó÷íóþ><40> #the porno gallery +<øëþõè ìîñêâû><40> #whores of Moscow diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/pornography/weighted_spanish b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/pornography/weighted_spanish new file mode 100644 index 0000000000000000000000000000000000000000..5b1a1c7e81e8eab5f6f30d068f74d7685ac88574 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/pornography/weighted_spanish @@ -0,0 +1,66 @@ +# +# Originally Created By Fernand Jonker +# I highly recommend that you also enable the Portuguese list. +# +# Looking for volunteer contributor ..... please contact phrasemaster@dansguardian.org +# +# Test Sites +# http://www.galeriasprivadas.com/ +# http://www.bancodeputas.com/ +# http://pornografia.vayateens.com/ +# http://www.ibericas.es/enindex.php + +#listcategory: "Pornography (Spanish)" + +< sexo ><40> #sex +< tetas ><50> #tits +<aberraciones><30> #aberrations +<asiaticas><20> #asians +<bellezas><20> #beauties +<borrachas><20> #drunks +<camaras ocultas><40> #hidden cameras +<casadas><10> #married +<chicas meando><50> #girls peeing +<chicas>,<sexo><50> #girl, sex +<clítoris><30> #clitoris +<colegialas><20> #college girls +<desnudos><50> #nude +<diosas del sexo><40> #sex goddesses +<lesbianas><10> #lesbians +<famosas desnudas><50> #famous nudes +<famosas><30> #famous women +<felación><50> #felatio +<felaciones><50> #falatio +<fotos de chic><20> #photos of girls +<galería amateur><50> #amateur galery +<galeria gratis><40> #free gallery +<galerías anales><30> #anal galleries +<gordas><20> #fat people +<infieles><20> #unfaithful +<insestos><20> #incest +<jovencita><20> #young girl +<jovencitas desnudas><50> #young nude girl +<jovenes desnudas><50> #naked young people +<juegos de sexo><40> #sex games +<maduras><20> #mature +<mamadas><30> #sucked +<masturbación><50> #masturbation +<meadas><10> #pissed +<modelo><10> #model +<orgasmo><40> #orgasm +<orgias><50> #orgies +<penetraciones><20> #penetration +<porno gratis><40> #free porn +<pornografía><40> #pornography +<rubias><30> #blondes +<sado maso><50> #sadomasochism +<sexo casero><50> #home sex +<sexo fuerte><70> #hardcore sex +<sexo gratis><40> #free sex +<sexo oral><50> #oral sex +<teens latinas><30> #teen latinas +<trio>,<prono><60> #threesome +<vibrador><50> #vibrator +<videos>,<gratis><30> #free videos +<virgenes gratis><50> #free virgins +<virgenes><20> #virgins diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/proxies/weighted b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/proxies/weighted new file mode 100644 index 0000000000000000000000000000000000000000..a0d01e177fff53800b97a826152d534a4fd28272 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/proxies/weighted @@ -0,0 +1,67 @@ +# +# Phraselists to block web-based proxy services like phproxy and cgiproxy and to block lists of proxies. +# Originally Created by Fernand Jonker +# + +#listcategory: "Proxies" + +#PHProxy or Poxy +<phproxy>,<post><150> +<phproxy><100> +<include form>,<remove scripts>,<accept cookies>,<show images>,<show referer><100> + +#CGIPROXY +<start browsing through this cgi-based proxy by entering a url below><200> +<remove ads><20> +<hide referrer information><30> +<show url entry form><30> +<remove all cookies><30> +<recommended for anonymity><60> +<remove all scripts><20> +<dmirror><30> +<cgi>,<prox>,<nph><30> +<nph-proxy><100> +<nph-pro><50> +<cgiproxy><50> +<location via proxy><100> + +#CECID +<cecid><100> +<censorship circumvention device><100> +<remove banned words completely><30> +<filter banned words><30> +<please enter url to access><100> + +#Arbitroweb +<arbitroweb><100> +<Popular Places>,<arbitroweb><150> + +#General Proxy Lists +< anonymous >,< transparent >,< prox><50> +<keep your identity hidden><50> +<anonymous>,<proxy><50> +<anonymous>,<surfing><50> +<anonymous>,<internet><50> +<high anonymity><30> +< anonymity>,<proxy><70> +< proxy><5> +< proxies><30> +<public prox><30> +<proxy list><20> + +#DansGuardian Bypass +<hacking dansguardian><50> +<hacking dans guardian><50> +<hack dansguardian><50> +<bypassing dansguardian><50> +<bypassing dans guardian><50> +<bypass dansguardian><50> +<bypass web filter><30> + +#Proxy and Filter bypass +<bypass>,<proxy><75> +<bypass>,<website blocking><75> +<bypass>,<website filter><75> +<bypass>,<web filter><75> +<bypass>,<content filter><75> +<bypass>,<internet filter><75> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/sport/weighted b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/sport/weighted new file mode 100644 index 0000000000000000000000000000000000000000..b7593bbc8c4529b506ab8c2f4bedd7ab55d3fc4c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/sport/weighted @@ -0,0 +1,60 @@ +# +# Phraselists to block sports sites +# Originally created by Fernand Jonker +# +# This list is seriously ALPHA - it blocks many pages, but may overblock. +# This list has NOT been tested in a production environment! +# If you use this list please send feedback to phrasemaster@dansguardian.org +# Waiting for input :-) +# + +#listcategory: "Sport" + +<sportsillustrated><100> +< si.com ><100> +< espn><100> + +#sports +<basketball><10> +<football><10> +<soccer><10> +<volleyball><10> +<badminton><10> +<hockey><10> +<lacrosse><10> +<curling><10> +<polo><10> +<fox hunting><10> +<rugby><10> +<golf><10> +<baseball><10> +<boxing><10> +<wrestling><10> +<horse racing><10> +<racing><10> +<tennis><10> +<racquetball><10> +<cricket><10> +<snooker><10> +<cycling><10> +<motorsport><10> +<athletics><10> + +#sports news words +<sports scores><50> +<scores>,<stats>,<sport><50> +<sports><10> +<sports teams><30> +<nfl><10> +<nba><10> +<ncaa><10> +<nhl><10> +<players association><30> +<trading deadline><10> + +#olympics +<olympic games><100> +<olympic><10> + + + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/violence/weighted b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/violence/weighted new file mode 100644 index 0000000000000000000000000000000000000000..08dd06b957c448aad88ed4d65320aa9583904440 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/violence/weighted @@ -0,0 +1,26 @@ +#listcategory: "Violence" + +< bloodbath ><15> +< blutbad ><35> +< carnage ><15> +< catfight ><15> +< catfights ><15> +< cockfight ><30> +< cockfighting ><20> +< cockfights ><30> +< gemordet ><15> +< killed ><15> +< killer ><15> +< killing ><15> +< massacre ><15> +< massacrer ><25> +< murder ><35> +< murdered ><15> +< rape ><25> +< retaliation ><15> +< revanche ><15> +< slaughter ><25> +< slaughtered ><25> +< steit ><15> +< torture ><25> +< tortured ><25> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/violence/weighted_portuguese b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/violence/weighted_portuguese new file mode 100644 index 0000000000000000000000000000000000000000..3a61922fc1fc41fbc7032c5c9080d20cec90c2cc --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/violence/weighted_portuguese @@ -0,0 +1,21 @@ +# +# Contributed by Allan Gomes +# + +#listcategory: "Violence (Portuguese)" + +< banho de sangue><15> +< víscera><15> +< tripa ><15> +< tripas ><15> +< assassinad><5> +< assassin><5> +< assassinato><5> +< massacre ><15> +< estupro><25> +< retaliação><15> +< revanche ><5> +< estripador><25> +< estripad><25> +< tortura><25> + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/warezhacking/weighted b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/warezhacking/weighted new file mode 100644 index 0000000000000000000000000000000000000000..a5334133222337704e071f9ee2e3765a774385c8 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/warezhacking/weighted @@ -0,0 +1,25 @@ +#listcategory: "Warez" + +<cracking><10> +<got warez?><50> +<hacking><10> +<serials 2000><30> +<warez><10> +<warez>,<appz><10> +<warez>,<crack><10> +<warez>,<download><20> +<warez>,<free><10> +<warez>,<ftp><10> +<warez>,<gamez><10> +<warez>,<hacks><20> +<warez>,<hackz><20> +<warez>,<illegal><10> +<warez king><30> +<warez monkey><10> +<warez>,<patch><10> +<warez>,<pirate><10> +<warez>,<serial>,<generator><20> +<warez>,<serial number><10> +<warez>,<serials><10> +<warez>,<serialz><10> +<warez>,<underground><10> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/weapons/weighted b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/weapons/weighted new file mode 100644 index 0000000000000000000000000000000000000000..f94f9d045f304e5d81ace351187fbeb419be3120 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/weapons/weighted @@ -0,0 +1,132 @@ +#listcategory: "Weapons" + +< 22lr ><10> +< 357mag ><10> +< 38spl ><10> +< 45acp ><10> +< advocate ><10> +< advocates ><10> +< ak 47 ><15> +< ak47 ><15> +< ammo ><10> +< ammunition ><10> +< ar15 ><10> +< armalite ><10> +< armory ><10> +< artillery ><10> +< beltfed ><10> +< belt fed ><15> +< benelli ><10> +< black powder ><10> +< blackpowder ><10> +< blueing ><10> +< bluing ><10> +< bolt action ><10> +<bomb building><70> +< bren ten ><10> +< bullet ><15> +< bullets ><15> +< caliber ><10> +< calibers ><10> +< carbine ><10> +< centerfire ><10> +< checkering ><10> +< control ><10> +< cruise missile ><10> +< cruise missiles ><10> +< diskettbomb ><70> +< firearm ><10> +< firearms ><10> +< firing pin ><10> +< flintlock ><10> +< flintlocks ><10> +< garotte ><10> +< garrote ><15> +< glock ><10> +< gun ><15> +<gun making><70> +< gun powder ><10> +< gunpowder ><10> +< gun range ><15> +< gunrange ><15> +< guns ><15> +< gunshop ><15> +< gunsmith ><15> +< gunsmithing ><15> +< handgun ><10> +< handguns ><10> +< handloading ><10> +< heckler kock ><10> +< kahr ><10> +< knife ><15> +< knives ><15> +< m16 ><10> +< mac10 ><10> +< machine gun ><10> +< machinegun ><10> +< machineguns ><10> +< machine guns ><15> +< marksmanship ><10> +< mauser ><10> +< mossberg ><10> +< muzzleloader ><10> +< muzzleloading ><10> +< nra ><10> +< ordnance ><10> +< parkerize ><10> +< parkerizing ><10> +< pistol ><10> +< pistols ><10> +< pistolsmith ><15> +< radarjamming ><70> +< recoil buffer ><10> +< recoil buffers ><10> +< revolver ><10> +< revolvers ><10> +< rifle ><10> +< rifles ><10> +< rifling ><10> +< rimfire ><10> +< ruger ><10> +< saiga ><10> +< schrotflinte ><10> +< semiauto ><10> +< semi automatic ><10> +< semiautomatic ><10> +< shooters ><10> +< shooting ><15> +< shootist ><10> +< shotgun ><10> +< shotguns ><10> +< shuriken ><10> +< sidearm ><10> +< sidearms ><10> +< sigarms ><10> +< smith wesson ><15> +< sniper ><10> +< sniping ><10> +< speedloader ><10> +< steyr ><10> +< sub machinegun ><15> +< submachinegun ><15> +< sub machineguns ><15> +< submachineguns ><15> +< sword ><10> +< swords ><10> +< tactical ><10> +< tec9 ><10> +< terroristhandbook ><70> +< terrorists handbook ><50> +< uzi ><10> +< wadcutter ><10> +< walther ><10> +< weapon ><15> +< weapons ><15> +< winchester ><10> +< fertilizer bomb ><15> +< triiodide ><15> +< solidox ><15> +< thermite ><15> +< molitoff cocktail ><25> +< molitov cocktail ><25> +< molotov cocktail ><25> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/weapons/weighted_portuguese b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/weapons/weighted_portuguese new file mode 100644 index 0000000000000000000000000000000000000000..a2466b8c3492c6fcc9d8979ee2666c876382efe0 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/weapons/weighted_portuguese @@ -0,0 +1,51 @@ +# +# Contributed by Allan Gomes +# + +#listcategory: "Weapons (Portuguese)" + +< alcance da arma ><15> +< alcance das arma ><15> +< ar15 ><10> +< ar-15 ><10> +< arma de tiro><10> +< arma portátil ><10> +< arma semiautomática ><10> +< arma semi automática ><10> +< arma semi-automática ><10> +< armamento ><10> +< armas ><10> +< armas portáteis><10> +< artilharia ><10> +< atirador><10> +< bombardeio><5> +< calibre 22 ><10> +< calibre 38 ><10> +< calibre 45 ><10> +< canivete><15> +< carabina><10> +< coquetel molitoff><25> +< coquetel molitov><25> +< coquetel molotov><25> +< magnum 357 ><10> +< míssel cruzado><10> +< mísseis cruzados><10> +< munição ><10> +< gatilho ><10> +< garrucha ><10> +< loja de arma ><15> +< loja de armas><15> +< m16 ><10> +< pistola><10> +< pólvora ><10> +< revólver><10> +< rifle><10> +< pistola semiautomática ><10> +< pistola semi automática ><10> +< pistola semi-automática ><10> +< submetralhadora><15> +< sub metralhadora><15> +< sub-metralhadora><15> +< tátic><10> +< tec9 ><10> +< uzi ><10> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/webmail/weighted b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/webmail/weighted new file mode 100644 index 0000000000000000000000000000000000000000..d9bbe3ddd952f547260b343ee5a5fbf1d55083f7 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/lists/phraselists/webmail/weighted @@ -0,0 +1,46 @@ +# +# Contributed by Fernand Jonker +# + +#listcategory: "Webmail" + +#General webmail +< inbox >,< outbox >,< sent ><100> +<compose>,< inbox >,< subject >,< date ><30> +< webmail ><30> +< drafts >,< spam >,< trash ><40> +< date>,< from >,< subject >,< size >,<delete><100> +< delete >,<empty trash>,< search ><100> +<inbox><20> +<mailbox><20> +<free email><20> +<free webmail><20> + +#Stalker Communigate +<communigate>,<mailbox>,<compose><150> +<from>,<subject>,<received>,<mailbox><150> +<forward>,<delete>,<copy>,<move>,<mail><150> +<stalker>,<mailbox>,<compose><150> + +#Squirrelmail +<by the squirrelmail development team><100> +<folders>,<inbox>,<sent>,<trash>,<check mail><100> +<compose>,<addresses>,<folders>,<options>,<search>,<help><100> + +#Hotmail +<today>,<mail>,<calendar>,<contacts>,<hotmail><100> +<new message>,<new appointment>,<new contact>,<hotmail><100> +<from my contacts>,<junk e-mail folder>,<hotmail><50> + +#GMail +< gmail ><20> +<Sign in to Gmail><75> +<Search, don't sort><20> +<Welcome to Gmail><40> +<for you to use Gmail><30> + +#Horde +<welcome to imp><30> +<internet messaging program><20> + + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/local_templates/bannedsitelist b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/local_templates/bannedsitelist new file mode 100644 index 0000000000000000000000000000000000000000..d5b9c4acd3389f7a7b3ea68a14b37e9b16d1892e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/local_templates/bannedsitelist @@ -0,0 +1,37 @@ +#.Include</var/lib/blacklists/eole/agressif/domains> +#.Include</var/lib/blacklists/eole/astrology/domains> +#.Include</var/lib/blacklists/eole/audio-video/domains> +#.Include</var/lib/blacklists/eole/bank/domains> +#.Include</var/lib/blacklists/eole/blog/domains> +#.Include</var/lib/blacklists/eole/celebrity/domains> +#.Include</var/lib/blacklists/eole/chat/domains> +#.Include</var/lib/blacklists/eole/dangerous_material/domains> +#.Include</var/lib/blacklists/eole/dating/domains> +#.Include</var/lib/blacklists/eole/drogue/domains> +#.Include</var/lib/blacklists/eole/filehosting/domains> +#.Include</var/lib/blacklists/eole/financial/domains> +#.Include</var/lib/blacklists/eole/forums/domains> +#.Include</var/lib/blacklists/eole/gambling/domains> +#.Include</var/lib/blacklists/eole/games/domains> +#.Include</var/lib/blacklists/eole/hacking/domains> +#.Include</var/lib/blacklists/eole/lingerie/urls> +#.Include</var/lib/blacklists/eole/malware/domains> +#.Include</var/lib/blacklists/eole/manga/domains> +#.Include</var/lib/blacklists/eole/marketingware/domains> +#.Include</var/lib/blacklists/eole/mixed_adult/domains> +#.Include</var/lib/blacklists/eole/mobile-phone/domains> +#.Include</var/lib/blacklists/eole/phishing/domains> +#.Include</var/lib/blacklists/eole/publicite/domains> +#.Include</var/lib/blacklists/eole/radio/domains> +#.Include</var/lib/blacklists/eole/reaffected/domains> +#.Include</var/lib/blacklists/eole/remote-control/domains> +#.Include</var/lib/blacklists/eole/sect/domains> +#.Include</var/lib/blacklists/eole/shopping/domains> +#.Include</var/lib/blacklists/eole/social_networks/domains> +#.Include</var/lib/blacklists/eole/sports/domains> +#.Include</var/lib/blacklists/eole/strict_redirector/domains> +#.Include</var/lib/blacklists/eole/strong_redirector/domains> +#.Include</var/lib/blacklists/eole/translation/domains> +#.Include</var/lib/blacklists/eole/tricheur/domains> +#.Include</var/lib/blacklists/eole/warez/domains> +#.Include</var/lib/blacklists/eole/webmail/domains> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/local_templates/bannedurllist b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/local_templates/bannedurllist new file mode 100644 index 0000000000000000000000000000000000000000..1ece2acfdfadf6a967ebe919a01688cf84c09335 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/local_templates/bannedurllist @@ -0,0 +1,37 @@ +#.Include</var/lib/blacklists/eole/agressif/urls> +#.Include</var/lib/blacklists/eole/astrology/urls> +#.Include</var/lib/blacklists/eole/audio-video/urls> +#.Include</var/lib/blacklists/eole/bank/urls> +#.Include</var/lib/blacklists/eole/blog/urls> +#.Include</var/lib/blacklists/eole/celebrity/urls> +#.Include</var/lib/blacklists/eole/chat/urls> +#.Include</var/lib/blacklists/eole/dangerous_material/urls> +#.Include</var/lib/blacklists/eole/dating/urls> +#.Include</var/lib/blacklists/eole/drogue/urls> +#.Include</var/lib/blacklists/eole/filehosting/urls> +#.Include</var/lib/blacklists/eole/financial/urls> +#.Include</var/lib/blacklists/eole/forums/urls> +#.Include</var/lib/blacklists/eole/gambling/urls> +#.Include</var/lib/blacklists/eole/games/urls> +#.Include</var/lib/blacklists/eole/hacking/urls> +#.Include</var/lib/blacklists/eole/lingerie/urls> +#.Include</var/lib/blacklists/eole/malware/urls> +#.Include</var/lib/blacklists/eole/manga/urls> +#.Include</var/lib/blacklists/eole/marketingware/urls> +#.Include</var/lib/blacklists/eole/mixed_adult/urls> +#.Include</var/lib/blacklists/eole/mobile-phone/urls> +#.Include</var/lib/blacklists/eole/phishing/urls> +#.Include</var/lib/blacklists/eole/publicite/urls> +#.Include</var/lib/blacklists/eole/radio/urls> +#.Include</var/lib/blacklists/eole/reaffected/urls> +#.Include</var/lib/blacklists/eole/remote-control/urls> +#.Include</var/lib/blacklists/eole/sect/urls> +#.Include</var/lib/blacklists/eole/shopping/urls> +#.Include</var/lib/blacklists/eole/social_networks/urls> +#.Include</var/lib/blacklists/eole/sports/urls> +#.Include</var/lib/blacklists/eole/strict_redirector/urls> +#.Include</var/lib/blacklists/eole/strong_redirector/urls> +#.Include</var/lib/blacklists/eole/translation/urls> +#.Include</var/lib/blacklists/eole/tricheur/urls> +#.Include</var/lib/blacklists/eole/warez/urls> +#.Include</var/lib/blacklists/eole/webmail/urls> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/anonregexplist b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/anonregexplist new file mode 100644 index 0000000000000000000000000000000000000000..c04b384cded123c67595421a08a774805bd5577c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/anonregexplist @@ -0,0 +1,10 @@ +#URL prefixs based on Regular Expressions +# +#When matched the remainder of the URL (after the prefic match) is re-submitted for URL check. +# +# Forces URL checks on Google image thumbnails +(^|[\?+=&/])(images\.google.*/images\?q=tbn:[^:]*:) +# And on image click-thru page +(^|[\?+=&/])(images\.google.*/imgres\?imgurl=) +# Forces URL checks on Google cached results +(^|[\?+=&/])(www\.google.*/search\?q=cache:[^:]*:) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/bannedextensionlist b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/bannedextensionlist new file mode 100644 index 0000000000000000000000000000000000000000..2179fc0b469e7991c8e46279878f7f8b9bffce69 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/bannedextensionlist @@ -0,0 +1,7 @@ +#Banned extension list + +# File extensions with executable code + +# The following file extensions can contain executable code. +# This means they can potentially carry a virus to infect your computer. +.Include</var/lib/blacklists/dansguardian$z/f$s/extensions> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/bannedmimetypelist b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/bannedmimetypelist new file mode 100644 index 0000000000000000000000000000000000000000..186ab6501ff6af1f005b5a433ba0f896833f2f75 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/bannedmimetypelist @@ -0,0 +1,2 @@ +# banned MIME types +.Include</var/lib/blacklists/dansguardian$z/f$s/types_mime> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/bannedphraselist b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/bannedphraselist new file mode 100644 index 0000000000000000000000000000000000000000..e450a5d429b123bf149c13a02ab12a8d33cdab39 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/bannedphraselist @@ -0,0 +1,36 @@ +# BANNEDPHRASELIST - INSTRUCTIONS FOR USE +# +# To block any page with the word "sex". +# < sex > +# +# To block any page with words that contain the string "sex". (ie. sexual) +# <sex> +# +# To block any page with the string "sex magazine". +# <sex magazine> +# +# To block any page containing the words/strings "sex" and "fetish". +# <sex>,<fetish> +# +# < test> will match any word with the string 'test' at the beginning +# <test > will match any word with the string 'test' at the end +# <test> will match any word with the string 'test' at any point in the word +# < test > will match only the word 'test' +# <this is a test phrase> will match that exact phrase +# <test>,<secondtest> will match if both words are found in the page +# A combination of the above can also be used eg < test>,<secondtest> +# +# +# Extra phrase-list files to include +# .Include</etc/guardian/testphrase> +# +# +# All phrases need to be within < and > to work, othewise they will be +# ignored. + +# MORE EXAMPLE LISTS CAN BE DOWNLOADED FROM DANSGUARDIAN.ORG + +# Phrase Exceptions are no longer listed in this file, they are now +# listed in the exceptionphraselist file. +# + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/bannedregexpheaderlist b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/bannedregexpheaderlist new file mode 100644 index 0000000000000000000000000000000000000000..ac2a8ebe49f9538f3b7f26b13bca94b5a4e7e8de --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/bannedregexpheaderlist @@ -0,0 +1,9 @@ +#Banned outgoing HTTP headers based on regular expressions +# +# E.g. 'User-Agent: .*MSIE' would block several versions of Internet Explorer +# (assuming the user-agent is not being spoofed by the client) +# +# Headers are matched line-by-line, not as a single block. + +#listcategory: "Banned Regular Expression HTTP Headers" + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/bannedregexpurllist b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/bannedregexpurllist new file mode 100644 index 0000000000000000000000000000000000000000..1086cda19441a3e82e594fdc83544be1e0d44853 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/bannedregexpurllist @@ -0,0 +1,40 @@ +#Banned URLs based on Regular Expressions +# +# E.g. 'sex' would block sex.com and middlesex.com etc + +#Banned URLs based on Regular Expressions +# +#These have been taken from www.squidguard.org +#(adultsight|adultsite|adultsonly|adultweb|blowjob|bondage|centerfold|cumshot|cyberlust|cybercore|hardcore|incest|masturbat|obscene|pedophil|pedofil|playmate|pornstar|sexdream|showgirl|softcore|striptease) +#(^|[-\?+=&/_])(big|cyber|hard|huge|mega|small|soft|super|tiny)?(anal|babe|bharath|boob|breast|busen|busty|clit|cum|cunt|dick|fetish|fuck|hooter|lez|lust|naked|nude|oral|orgy|porn|porno|pupper|pussy|rotten|sex|shit|smutpump|teen|topp?les|xxx)s?([-\?+=&/_]|$) +#(^|[\?+=&/])(girls|babes)([\?+=&/]|$) + +# The following two lines may work better than the above - Philip Pearce 9/11/2004 +#(^|[-\?+=&/_])(big|cyber|hard|huge|mega|small|soft|super|tiny|bare|naked|nude|anal|oral|topp?les|sex){1,}.*(anal|babe|bharath|boob|breast|busen|busty|clit|cum|cunt|dick|fetish|fuck|girl|hooter|lez|lust|naked|nude|oral|orgy|penis|porn|porno|pupper|pussy|rotten|sex|shit|smutpump|teen|topp?les|xxx)s?([-\?+=&/_]|$) +#(^|[-\?+=&/_])(anal|babe|bharath|boob|breast|busen|busty|clit|cum|cunt|dick|fetish|fuck|girl|hooter|lez|lust|naked|nude|oral|orgy|penis|porn|porno|pupper|pussy|rotten|sex|shit|smutpump|teen|topp?les|xxx){1,}.*(big|cyber|hard|huge|mega|small|soft|super|tiny|bare|naked|nude|anal|oral|topp?les|sex){1,}([-\?+=&/_]|$) + +#Block Naturism and Nudist sites +#(naturism|naturist|nude|nudist|nudism|nekkid|nakt|naakt) + +#Use this to block web counters: +#(adlog.php|cnt.cgi|count.cgi|count.dat|count.jsp|count.pl|count.php|counter.cgi|counter.js|counter.pl|countlink.cgi|fpcount.exe|logitpro.cgi|rcounter.dll|track.pl|w_counter.js) +#Contributed by proxy@barendse.to + +#Block unfiltered options on various search engines +#(^|[\?+=&/])(.*\.google\..*/.*\?.*safe=off)([\?+=&/]|$) +#(^|[\?+=&/])(.*\.alltheweb.com/customize\?.*copt_offensive=off)([\?+=&/]|$) + +#Block images on altavista, alltheweb, yahoo etc - as they are anonomised +#(yahoo.com\/image\/) +#(yimg.com\/image\/) +#(altavista.com\/image\/) +#(altavista.com\/video\/) + +#Block Cgiproxy, Poxy, PHProxy and other Web proxies +(cecid.php|nph-proxy|nph-pro|dmirror|cgiproxy) + +#Block websites containing proxies +(anonymizer|proxify|megaproxy) + +#AGRESSIVE blocking of all URLs containing proxy - WARNING - this may overblock!! +#(proxy) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/bannedsitelist b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/bannedsitelist new file mode 100644 index 0000000000000000000000000000000000000000..dc27ce9bddd96903495bea587547c878b138c735 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/bannedsitelist @@ -0,0 +1,59 @@ +#domains in banned list +#Don't bother with the www. or the http:// + +#The bannedurllist is for blocking PART of a site +#The bannedsitelist is for blocking ALL of a site + +#As of DansGuardian 2.7.3 you can now include +#.tld so for example you can match .gov for example + +#The 'grey' lists override the 'banned' lists. +#The 'exception' lists override the 'banned' lists also. +#The difference is that the 'exception' lists completely switch +#off *all* other filtering for the match. 'grey' lists only +#stop the URL filtering and allow the normal filtering to work. + +#An example of grey list use is when in Blanket Block (whitelist) +#mode and you want to allow some sites but still filter as normal +#on their content + +#Another example of grey list use is when you ban a site but want +#to allow part of it. + +#To include additional files in this list use this example: +#.Include</etc/guardian/anotherbannedurllist> + +#You can have multiple .Includes. + +#List other sites to block: + + + + +#Blanket Block. To block all sites except those in the +#exceptionsitelist and greysitelist files remove +#the # from the next line to leave only a '**': +#** + +#Blanket IP Block. To block all sites specified only as an IP +#remove the # from the next line to leave only a '*ip': +#*ip + + + +#Remove the # from the following and edit as needed to use a stock +#squidGuard/urlblacklist blacklists collection. +# You will need to edit to add and remove categories you want + +# filtres obligatoires +.Include</var/lib/blacklists/db/adult/domains> +.Include</var/lib/blacklists/db/redirector/domains> + +# filtres optionnels +.Include</var/lib/blacklists/dansguardian$z/f$s/bannedsitelist> + +# ajouts locaux +.Include</var/lib/blacklists/dansguardian$z/f$s/domains> + +# ajouts academiques +.Include</var/lib/blacklists/dansguardian$z/common/domains_acad> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/bannedsitelist_liste_blanche b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/bannedsitelist_liste_blanche new file mode 100644 index 0000000000000000000000000000000000000000..9af4232b2aed417c4ef0918f368b3380c339f7b1 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/bannedsitelist_liste_blanche @@ -0,0 +1,74 @@ +#domains in banned list +#Don't bother with the www. or the http:// + +#The bannedurllist is for blocking PART of a site +#The bannedsitelist is for blocking ALL of a site + +#As of DansGuardian 2.7.3 you can now include +#.tld so for example you can match .gov for example + +#The 'grey' lists override the 'banned' lists. +#The 'exception' lists override the 'banned' lists also. +#The difference is that the 'exception' lists completely switch +#off *all* other filtering for the match. 'grey' lists only +#stop the URL filtering and allow the normal filtering to work. + +#An example of grey list use is when in Blanket Block (whitelist) +#mode and you want to allow some sites but still filter as normal +#on their content + +#Another example of grey list use is when you ban a site but want +#to allow part of it. + +#To include additional files in this list use this example: +#.Include</etc/guardian/anotherbannedurllist> + +#You can have multiple .Includes. + +#List other sites to block: + + + + +#Blanket Block. To block all sites except those in the +#exceptionsitelist and greysitelist files remove +#the # from the next line to leave only a '**': +# Fonctionnement LISTE BLANCHE +** + +#Blanket IP Block. To block all sites specified only as an IP +#remove the # from the next line to leave only a '*ip': +#*ip + + + +#Remove the # from the following and edit as needed to use a stock +#squidGuard/urlblacklist blacklists collection. +# You will need to edit to add and remove categories you want + +# filtres obligatoires +#.Include</var/lib/blacklists/db/adult/domains> +#.Include</var/lib/blacklists/db/redirector/domains> +# +## filtres optionnels +#.Include</var/lib/blacklists/db/agressif/domains> +#.Include</var/lib/blacklists/db/audio-video/domains> +#.Include</var/lib/blacklists/db/drogue/domains> +#.Include</var/lib/blacklists/db/forums/domains> +#.Include</var/lib/blacklists/db/gambling/domains> +#.Include</var/lib/blacklists/db/games/domains> +#.Include</var/lib/blacklists/db/hacking/domains> +#.Include</var/lib/blacklists/db/mobile-phone/domains> +#.Include</var/lib/blacklists/db/phishing/domains> +#.Include</var/lib/blacklists/db/publicite/domains> +#.Include</var/lib/blacklists/db/radio/domains> +#.Include</var/lib/blacklists/db/tricheur/domains> +#.Include</var/lib/blacklists/db/warez/domains> +#.Include</var/lib/blacklists/db/webmail/domains> +#.Include</var/lib/blacklists/db/strict_redirector/domains> +#.Include</var/lib/blacklists/db/strong_redirector/domains> +#.Include</var/lib/blacklists/db/mixed_adult/domains> +# +## ajouts locaux +#.Include</var/lib/blacklists/local/domains> + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/bannedsitelistwithbypass b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/bannedsitelistwithbypass new file mode 100644 index 0000000000000000000000000000000000000000..c19545097e1ed7aae1262e3108cdc25aaaa011f6 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/bannedsitelistwithbypass @@ -0,0 +1,11 @@ +#domains in banned list for BYPASS (and only for BYPASS !) +#Use bannesitelist to block unwanted websites +#Don't bother with the www. or the http:// +#You can include +#.tld so for example you can match .gov for example + +#To include additional files in this list use this example: +#.Include</etc/e2guardian/anotherbannedurllist> + +#You can have multiple .Includes. + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/bannedurllist b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/bannedurllist new file mode 100644 index 0000000000000000000000000000000000000000..04e15c73b4f212ea7a19bbba508bc6a125ea5f92 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/bannedurllist @@ -0,0 +1,44 @@ +#URLs in banned list +#Don't bother with the http:// or the www + +#The bannedurllist is for blocking PART of a site +#The bannedsitelist is for blocking ALL of a site + +#The 'grey' lists override the 'banned' lists. +#The 'exception' lists override the 'banned' lists also. +#The difference is that the 'exception' lists completely switch +#off *all* other filtering for the match. 'grey' lists only +#stop the URL filtering and allow the normal filtering to work. + +#An example of grey list use is when in Blanket Block (whitelist) +#mode and you want to allow some sites but still filter as normal +#on their content + +#Another example of grey list use is when you ban a site but want +#to allow part of it. + +#To include additional files in this list use this example: +#.Include</etc/guardian/anotherbannedurllist> + +#You can have multiple .Includes. + +#List other URLs to block: + + + +#Remove the # from the following and edit as needed to use a stock +#squidGuard blacklists collection. +# You will need to edit to add and remove categories you want + +# filtres obligatoires +.Include</var/lib/blacklists/db/adult/urls> +.Include</var/lib/blacklists/db/redirector/urls> + +# filtres optionnels +.Include</var/lib/blacklists/dansguardian$z/f$s/bannedurllist> + +# ajouts locaux +.Include</var/lib/blacklists/dansguardian$z/f$s/domains> + +# ajouts academiques +.Include</var/lib/blacklists/dansguardian$z/common/urls_acad> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/banneduserlist b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/banneduserlist new file mode 100644 index 0000000000000000000000000000000000000000..4a2d4fc7795b159b687ad67861923596cb881abd --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/banneduserlist @@ -0,0 +1,5 @@ +#Users names, who, if basic +#proxy authentication is +#enabled, will automatically +#be denied web access +#.Include</usr/share/squidGuard-1.2.0/db/local/users> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/contentregexplist b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/contentregexplist new file mode 100644 index 0000000000000000000000000000000000000000..18effe630c6f02cf57f92557c0c5167fae7fd2cf --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/contentregexplist @@ -0,0 +1,17 @@ +#Content modifying Regular Expressions +# +# The format is: "extended regular expression"->"replacement straight string" +# E.g. "shit"->"censored" would replace all occurances of shit in any case. +# Far more complicated matches are possible. See other sources for examples +# of extended regular expressions. + +# These are just some examples. If you write any, for example, to +# remove popups etc, please send them to author at dansguardian.org. + +#"<script language.*open\(.*script>"->"<!-- its gone -->" +#"fuck|cunt|shit"->"**censored**" + +#remove popups by AFN 2004/2/28 +#"<html>"->"<script language='javascript'>fwo=window.open;function NO(url,nam,atr){return(this.window);}window.open=NO;</script><html>" +#"=[ ]*?window\.open[ ]*?\("->"=fwo(" +#"<html>"->"<script language='javascript'>function NO(url,nam,atr){return(this.window);}window.open=NO;</script><html>" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/empty b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/empty new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/exceptionextensionlist b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/exceptionextensionlist new file mode 100644 index 0000000000000000000000000000000000000000..19172c20353d4bb1275e93bd50c24cac9cf09ffa --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/exceptionextensionlist @@ -0,0 +1,49 @@ +# Exception file extension list +# Use as a filter group's "exceptionextensionlist", +# to override a blanket download block. +# (blockdownloads = on) +# +# DOES NOT override content/virus scanning or site/URL bans. +# +# Default list: +# Unblock web pages & graphics + +# Text/web document types + +#.css +#.html +#.shtml +#.htm +#.stm +#.asp +#.php +#.txt +#.rtx +#.xml +#.xsl +#.cgi +#.pl +# +## Image types +# +#.bmp +#.cod +#.gif +#.ief +#.jpe +#.jpeg +#.jpg +#.jfif +#.tif +#.tiff +#.ras +#.cmx +#.ico +#.pnm +#.pbm +#.pgm +#.ppm +#.rgb +#.xbm +#.xpm +#.xwd diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/exceptionfilesitelist b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/exceptionfilesitelist new file mode 100644 index 0000000000000000000000000000000000000000..e297d501e2c1a2ef1d006665918c929f71d1b336 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/exceptionfilesitelist @@ -0,0 +1,44 @@ +# Exception file site list +# Use this list to define sites from which files can be downloaded, +# overriding a blanket download block (blockdownloads = on) or the +# banned MIME type and extension lists (blockdownloads = off). +# +# DOES NOT override content/virus scanning or site/URL bans. + +# Don't bother with the www. or +# the http:// +# +# These are specifically domains and are not URLs. +# For example 'foo.bar/porn/' is no good, you need +# to just have 'foo.bar'. +# +# You can also match IPs here too. +# +# As of DansGuardian 2.7.3 you can now include +# .tld so for example you can match .gov for example + + +# Time limiting syntax: +# #time: <start hour> <start minute> <end hour> <end minute> <days> +# Example: +##time: 9 0 17 0 01234 +# Remove the first # from the line above to enable this list only from +# 9am to 5pm, Monday to Friday. + +dansguardian.org +canonical.com +ubuntu.com +c.microsoft.com +crl.microsoft.com +database.clamav.net +download.microsoft.com +genuine.microsoft.com +mpa.one.microsoft.com +ntservicepack.microsoft.com +pool.ntp.org +services.openoffice.org +update.microsoft.com +windowsupdate.com +windowsupdate.microsoft.com +wustat.windows.com +.Include</var/lib/blacklists/white/academies> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/exceptionfileurllist b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/exceptionfileurllist new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/exceptionmimetypelist b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/exceptionmimetypelist new file mode 100644 index 0000000000000000000000000000000000000000..255f620130bc080c9b4c3ed6ee0e207cd5ed735b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/exceptionmimetypelist @@ -0,0 +1,40 @@ +# Exception MIME type list +# Use as a filter group's "exceptionmimetypelist", +# to override a blanket download block. +# (blockdownloads = on) +# +# DOES NOT override content/virus scanning or site/URL bans. +# +# Default list: +# Unblock web pages & graphics + +# Text/web document types + +#text/plain +#text/html +#text/css +#text/xml +#text/xsl +#text/richtext +# +## Image types +# +#image/bmp +#image/cis-cod +#image/gif +#image/ief +#image/jpeg +#image/pipeg +#image/png +#image/tiff +#image/x-cmu-raster +#image/x-cmx +#image/x-icon +#image/x-portable-anymap +#image/x-portable-bitmap +#image/x-portable-graymap +#image/x-portable-pixmap +#image/x-rgb +#image/x-xbitmap +#image/x-xpixmap +#image/x-xwindowdump diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/exceptionphraselist b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/exceptionphraselist new file mode 100644 index 0000000000000000000000000000000000000000..261dcd7fb97235c1e63e4426b4f605fdef3359ea --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/exceptionphraselist @@ -0,0 +1,18 @@ +# EXCEPTIONPHRASELIST - INSTRUCTIONS FOR USE +# +# If any of the phrases listed below appear in a web page +# then it will bypass the filtering and be allowed through +# eg +# < medical > +# +# +# Combinations +# Unblock the page if the following phrases are found on the same page. +# Each line is a new combination. +# eg +#<education>,<biology>,<medical> +# +# See the bannedphraselist for more examples. + +.Include</etc/guardian/guardian$z/listsf1/phraselists/goodphrases/exception> +#.Include</etc/guardian/lists/phraselists/goodphrases/exception_email> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/exceptionregexpurllist b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/exceptionregexpurllist new file mode 100644 index 0000000000000000000000000000000000000000..2a18354f79112917cff6757e193c30e5a7be8cd9 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/exceptionregexpurllist @@ -0,0 +1,18 @@ +#URL Regular Expression exceptions (with option to append to URL) +# +# The format is: "extended regular expression"+="straight string to append to url" +# E.g. "\.google\.co\.uk/search\?"+="&safe=active" would append "&safe=active" +# to all urls that contain google.co.uk/search? +# +# A blank append string will make a matched url an exception. +#E.g. To allow all mail sites +# "//mail\..*"+="" + +# Far more complicated matches are possible. See other sources for examples +# of extended regular expressions. + +# Force all google searches to very safe mode +"\.google\..*q="+="&safe=vss" + +# Force all google searches to safe mode +#"\.google\..*q="+="&safe=active" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/exceptionsitelist b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/exceptionsitelist new file mode 100644 index 0000000000000000000000000000000000000000..db95499202c8ddc7e7be2ddf813acb96ee0e12c7 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/exceptionsitelist @@ -0,0 +1,32 @@ +#Sites in exception list +#Don't bother with the www. or +#the http:// +# +#These are specifically domains and are not URLs. +#For example 'foo.bar/porn/' is no good, you need +#to just have 'foo.bar'. +# +#You can also match IPs here too. +# +#As of DansGuardian 2.7.3 you can now include +#.tld so for example you can match .gov for example + + +dansguardian.org +canonical.com +ubuntu.com +c.microsoft.com +crl.microsoft.com +database.clamav.net +download.microsoft.com +genuine.microsoft.com +mpa.one.microsoft.com +ntservicepack.microsoft.com +pool.ntp.org +services.openoffice.org +update.microsoft.com +windowsupdate.com +windowsupdate.microsoft.com +wustat.windows.com +.Include</var/lib/blacklists/white/academies> +.Include</var/lib/blacklists/dansguardian$z/f$s/whites> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/exceptionsitelist_liste_blanche b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/exceptionsitelist_liste_blanche new file mode 100644 index 0000000000000000000000000000000000000000..7e0928b892472a1622051e13d19b40fc65565432 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/exceptionsitelist_liste_blanche @@ -0,0 +1,2 @@ +# mode liste blanche +.Include</var/lib/blacklists/dansguardian$z/f4/exceptionsitelist> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/exceptionurllist b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/exceptionurllist new file mode 100644 index 0000000000000000000000000000000000000000..67c0c93398c463e343b5544ce328f1a349c65e9c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/exceptionurllist @@ -0,0 +1,16 @@ +#URLs in exception list +#Don't bother with the www. or +#the http:// +# +#These are parts of sites that filtering should +#be switched off for. +# +#These should not be domains, i.e. entire sites, +#they should be a domain with a path. +# +#For example 'foo.bar' is no good, you need +#to just have 'foo.bar/porn/'. +# +#Another example: +#generallybadsite.tld/partthatsok/ +.Include</var/lib/blacklists/dansguardian$z/f$s/whites> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/exceptionuserlist b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/exceptionuserlist new file mode 100644 index 0000000000000000000000000000000000000000..f09d8ccc922023bbbde50a11aeaccc12767ba609 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/exceptionuserlist @@ -0,0 +1,5 @@ +#Users names, who, if basic +#proxy authentication is +#enabled, will automatically +#not be filtered + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/greyregexpurllist b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/greyregexpurllist new file mode 100644 index 0000000000000000000000000000000000000000..26f6be376954e2d1629a8c2a67324738e45268a0 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/greyregexpurllist @@ -0,0 +1,18 @@ +#URL Regular Expression greylist (with option to append to URL) +# +# The format is: "extended regular expression"+="straight string to append to url" +# E.g. "\.google\.co\.uk/search\?"+="&safe=active" would append "&safe=active" +# to all urls that contain google.co.uk/search? +# +# A blank append string will make a matched url a grey url +#E.g. To allow all mail sites +# "//mail\..*"+="" + +# Far more complicated matches are possible. See other sources for examples +# of extended regular expressions. + +# Force all google searches to very safe mode +#"\.google\..*q="+="&safe=vss" + +# Force all google searches to safe mode +#"\.google\..*q="+="&safe=active" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/greysitelist b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/greysitelist new file mode 100644 index 0000000000000000000000000000000000000000..669663c86c43b04307cd89ef4258a0fdb1da44fa --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/greysitelist @@ -0,0 +1,30 @@ +#domains in grey list +#Don't bother with the www. or the http:// + +#The 'grey' lists override the 'banned' lists. +#The 'exception' lists override the 'banned' lists also. +#The difference is that the 'exception' lists completely switch +#off *all* other filtering for the match. 'grey' lists only +#stop the URL filtering and allow the normal filtering to work. + +#An example of grey list use is when in Blanket Block (whitelist) +#mode and you want to allow some sites but still filter as normal +#on their content + +#Another example of grey list use is when you ban a site but want +#to allow part of it. + +#The greyurllist is for partly unblocking PART of a site +#The greysitelist is for partly unblocking ALL of a site + +#As of DansGuardian 2.7.3 you can now include +#.tld so for example you can match .gov for example + +#To include additional files in this list use this example: +#.Include</etc/guardian/anotherurllist> + +#You can have multiple .Includes. + +#List other sites to block: + +#www.bbc.co.uk diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/greysitelist_liste_blanche b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/greysitelist_liste_blanche new file mode 100644 index 0000000000000000000000000000000000000000..7978d402b8f169122700a5ba5ba41aaf08fc1d98 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/greysitelist_liste_blanche @@ -0,0 +1,2 @@ +# mode liste blanche +.Include</var/lib/blacklists/dansguardian$z/f4/site_liste_blanche> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/greyurllist b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/greyurllist new file mode 100644 index 0000000000000000000000000000000000000000..4f6b3a4b7d08b563236e94fef767d9f3c2fed43f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/greyurllist @@ -0,0 +1,27 @@ +#URLs in grey list +#Don't bother with the http:// or the www + +#The greyurllist is for partly unblocking PART of a site +#The greysitelist is for partly unblocking ALL of a site + +#The 'grey' lists override the 'banned' lists. +#The 'exception' lists override the 'banned' lists also. +#The difference is that the 'exception' lists completely switch +#off *all* other filtering for the match. 'grey' lists only +#stop the URL filtering and allow the normal filtering to work. + +#An example of grey list use is when in Blanket Block (whitelist) +#mode and you want to allow some sites but still filter as normal +#on their content + +#Another example of grey list use is when you ban a site but want +#to allow part of it. + +#To include additional files in this list use this example: +#.Include</etc/guardian/anotherurllist> + +#You can have multiple .Includes. + +#List other URLs to block: + +#members.home.net/nice diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/headerregexplist b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/headerregexplist new file mode 100644 index 0000000000000000000000000000000000000000..a8ecd6a19b722a2600edee83ce2e53c9dd8ff9c1 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/headerregexplist @@ -0,0 +1,11 @@ +# Outgoing HTTP header modifying Regular Expressions +# +# The format is: "extended regular expression"->"replacement straight string" +# E.g. "shit"->"censored" would replace all occurances of shit in any case. +# Far more complicated matches are possible. See other sources for examples +# of extended regular expressions. +# +# Headers are run through replacements line-by-line, not as a single block. +# SafeSearch Youtube http://dev-eole.ac-dijon.fr/issues/7256#note-4 +"cookie:(.*)PREF=[^&]*?\;"->"Cookie:$1" +"cookie:(.*)$"->"Cookie:$1; PREF=f2=8000000;" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/localbannedsitelist b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/localbannedsitelist new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/localbannedsslsitelist b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/localbannedsslsitelist new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/localbannedurllist b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/localbannedurllist new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/localexceptionsitelist b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/localexceptionsitelist new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/localexceptionurllist b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/localexceptionurllist new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/localgreysitelist b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/localgreysitelist new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/localgreysslsitelist b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/localgreysslsitelist new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/localgreyurllist b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/localgreyurllist new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/pics b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/pics new file mode 100644 index 0000000000000000000000000000000000000000..e1024c0a8729db7f2747728760610367b5d72f5a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/pics @@ -0,0 +1,117 @@ +# A more detailed discussion of the options in this file +# can be found in the Detailed Installation Guide on +# the DansGuardian web site. + +# The default settings below are aimed at early teens. +# You may wish to reduce or increase this. + +# ICRA is a new version of RSAC +# 0 = none 1 = some +ICRAchat = 0 +ICRAmoderatedchat = 1 +ICRAlanguagesexual = 0 +ICRAlanguageprofanity = 0 +ICRAlanguagemildexpletives = 1 +ICRAnuditygraphic = 0 +ICRAnuditymalegraphic = 0 +ICRAnudityfemalegraphic = 0 +ICRAnuditytopless = 0 +ICRAnuditybottoms = 0 +ICRAnuditysexualacts = 0 +ICRAnudityobscuredsexualacts = 0 +ICRAnuditysexualtouching = 0 +ICRAnuditykissing = 0 +ICRAnudityartistic = 1 +ICRAnudityeducational = 1 +ICRAnuditymedical = 1 +ICRAdrugstobacco = 0 +ICRAdrugsalcohol = 0 +ICRAdrugsuse = 0 +ICRAgambling = 0 +ICRAweaponuse = 0 +ICRAintolerance = 0 +ICRAbadexample = 0 +ICRApgmaterial = 0 +ICRAviolencerape = 0 +ICRAviolencetohumans = 0 +ICRAviolencetoanimals = 0 +ICRAviolencetofantasy = 0 +ICRAviolencekillinghumans = 0 +ICRAviolencekillinganimals = 0 +ICRAviolencekillingfantasy = 0 +ICRAviolenceinjuryhumans = 0 +ICRAviolenceinjuryanimals = 0 +ICRAviolenceinjuryfantasy = 0 +ICRAviolenceartisitic = 0 +ICRAviolenceeducational = 0 +ICRAviolencemedical = 0 +ICRAviolencesports = 0 +ICRAviolenceobjects = 0 + +# RSAC +# 0 = none 2 = default 4 = wanton and gratuitous +RSACviolence = 2 +RSACsex = 2 +RSACnudity = 2 +RSAClanguage = 2 + + +# evaluWEB +# 0 = U 1 = PG 2 = 18 +evaluWEBrating = 1 + + +# CyberNOT +# 0 = none 8 = lots +CyberNOTsex = 3 +CyberNOTother = 3 + + +# SafeSurf +# 0 = full filtering 9 = wanton and gratuitous +SafeSurfprofanity = 3 +SafeSurfheterosexualthemes = 3 +SafeSurfhomosexualthemes = 3 +SafeSurfnudity = 3 +SafeSurfviolence = 3 +SafeSurfsexviolenceandprofanity = 3 +SafeSurfintolerance = 3 +SafeSurfdruguse = 3 +SafeSurfotheradultthemes = 3 +SafeSurfgambling = 3 +# 1 = All ages 3 = early teens 9 = explicitly for adults +SafeSurfagerange = 3 + + +# Weburbia +# 0 = U 1 = PG 2 = 18 +Weburbiarating = 1 + + +#Vancouver Webpages - low is good high is bad +Vancouvermulticulturalism = 0 # -3 to 2 +Vancouvereducationalcontent = 0 # -3 to 1 +Vancouverenvironmentalawareness = 0 # -3 to 1 +Vancouvertolerance = 0 # -2 to 4 +Vancouverviolence = 0 # 0 to 5 +Vancouversex = 0 # 0 to 7 +Vancouverprofanity = 0 # 0 to 4 +Vancouversafety = 0 # -2 to 2 +Vancouvercanadiancontent = 0 # -2 to 0 +Vancouvercommercialcontent = 0 # 0 to 3 +Vancouvergambling = 0 # -1 to 3 + + +# Korean PICS services +# Thanks to Richard Lee for outlining tag formats + +# ICEC - service.icec.or.kr +ICECrating = 0 # 0 to 1 + +# SafeNet - www.safenet.ne.kr +SafeNetnudity = 1 # 0 to 4 +SafeNetsex = 1 # 0 to 4 +SafeNetviolence = 1 # 0 to 4 +SafeNetlanguage = 1 # 0 to 4 +SafeNetgambling = 0 # 0 to 1 +SafeNetalcoholtobacco = 0 # 0 to 1 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/pics.empty b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/pics.empty new file mode 100644 index 0000000000000000000000000000000000000000..944378ab9321fc89847fb5ce5b63018b6f45eafc --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/pics.empty @@ -0,0 +1,106 @@ +# Enable PICS filtering +# on | off and all other PICS settings are ignored +enablePICS = off + +# A more detailed discussion of the options in this file +# can be found in the Detailed Installation Guide on +# the DansGuardian web site. + +# The default settings below are aimed at early teens. +# You may wish to reduce or increase this. + +# ICRA is a new version of RSAC +# 0 = none 1 = some +ICRAchat = 1 +ICRAmoderatedchat = 1 +ICRAlanguagesexual = 0 +ICRAlanguageprofanity = 0 +ICRAlanguagemildexpletives = 1 +ICRAnuditygraphic = 0 +ICRAnuditymalegraphic = 0 +ICRAnudityfemalegraphic = 0 +ICRAnuditytopless = 0 +ICRAnuditybottoms = 0 +ICRAnuditysexualacts = 0 +ICRAnudityobscuredsexualacts = 0 +ICRAnuditysexualtouching = 0 +ICRAnuditykissing = 0 +ICRAnudityartistic = 1 +ICRAnudityeducational = 1 +ICRAnuditymedical = 1 +ICRAdrugstobacco = 0 +ICRAdrugsalcohol = 0 +ICRAdrugsuse = 0 +ICRAgambling = 0 +ICRAweaponuse = 0 +ICRAintolerance = 0 +ICRAbadexample = 0 +ICRApgmaterial = 0 +ICRAviolencerape = 0 +ICRAviolencetohumans = 0 +ICRAviolencetoanimals = 0 +ICRAviolencetofantasy = 0 +ICRAviolencekillinghumans = 0 +ICRAviolencekillinganimals = 0 +ICRAviolencekillingfantasy = 0 +ICRAviolenceinjuryhumans = 0 +ICRAviolenceinjuryanimals = 0 +ICRAviolenceinjuryfantasy = 0 +ICRAviolenceartisitic = 0 +ICRAviolenceeducational = 0 +ICRAviolencemedical = 0 +ICRAviolencesports = 0 +ICRAviolenceobjects = 0 + +# RSAC +# 0 = none 2 = default 4 = wanton and gratuitous +RSACviolence = 2 +RSACsex = 2 +RSACnudity = 2 +RSAClanguage = 2 + + +# evaluWEB +# 0 = U 1 = PG 2 = 18 +evaluWEBrating = 1 + + +# CyberNOT +# 0 = none 8 = lots +CyberNOTsex = 3 +CyberNOTother = 3 + + +# SafeSurf +# 0 = full filtering 9 = wanton and gratuitous +SafeSurfprofanity = 3 +SafeSurfheterosexualthemes = 3 +SafeSurfhomosexualthemes = 3 +SafeSurfnudity = 3 +SafeSurfviolence = 3 +SafeSurfsexviolenceandprofanity = 3 +SafeSurfintolerance = 3 +SafeSurfdruguse = 3 +SafeSurfotheradultthemes = 3 +SafeSurfgambling = 3 +# 1 = All ages 3 = early teens 9 = explicitly for adults +SafeSurfagerange = 3 + + +# Weburbia +# 0 = U 1 = PG 2 = 18 +Weburbiarating = 1 + + +#Vancouver Webpages - low is good high is bad +Vancouvermulticulturalism = 0 # -3 to 2 +Vancouvereducationalcontent = 0 # -3 to 1 +Vancouverenvironmentalawareness = 0 # -3 to 1 +Vancouvertolerance = 0 # -2 to 4 +Vancouverviolence = 0 # 0 to 5 +Vancouversex = 0 # 0 to 7 +Vancouverprofanity = 0 # 0 to 4 +Vancouversafety = 0 # -2 to 2 +Vancouvercanadiancontent = 0 # -2 to 0 +Vancouvercommercialcontent = 0 # 0 to 3 +Vancouvergambling = 0 # -1 to 3 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/sslsiteregexplist b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/sslsiteregexplist new file mode 100644 index 0000000000000000000000000000000000000000..5944735edd3d66be7e4a6e412a3d8b6ebf4edc00 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/sslsiteregexplist @@ -0,0 +1,19 @@ +#SSL site modifying Regular Expressions +# +# The format is: "extended regular expression"->"replacement straight string" +# E.g. "shit"->"censored" would replace all occurances of shit in any case. +# Far more complicated matches are possible. See other sources for examples +# of extended regular expressions. +# +# Users are pointed at the replaced site transparently. +# This is used to 'cname' ssl sites and avoids having to adjust DNS +# and allows option of switching off/on depending on filter group. + +# Enforce restricted mode in YouTube +# +#"(^https://www.youtube.com)"->"https://restrict.youtube.com" +#"(^https://m.youtube.com)"->"https://restrict.youtube.com" +#"(^https://youtubei.googleapis.com)"->"https://restrict.youtube.com" +#"(^https://youtube.googleapis.com)"->"https://restrict.youtube.com" +#"(^https://www.youtube-nocookie.com)"->"https://restrict.youtube.com" +# diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/urlregexplist b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/urlregexplist new file mode 100644 index 0000000000000000000000000000000000000000..149d7eb59f9c7a59e7b35cbf79073f4ee0f31bd9 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/urlregexplist @@ -0,0 +1,84 @@ +#URL modifying Regular Expressions +# +# The format is: "extended regular expression"->"replacement straight string" +# E.g. "shit"->"censored" would replace all occurances of shit in any case. +# Far more complicated matches are possible. See other sources for examples +# of extended regular expressions. +# +# Users are pointed at the replaced URL transparently. +# Manipulates the URL to automatically switch on safe searching in Google, +# Singingfish, Ilse, KEL, Lycos, Alltheweb, Yahoo, Hotbot, Wisenut, +# Metacrawler. +# Redirection des recherches HTTPS vers le filtrage safesearch de Google # +"(^https://[0-9a-z]+\.google\.[a-z]+[-/%.0-9a-z]*)"->"https://forcesafesearch.google.com" + +# Singingfish - remove 'ff=...' and add 'ff=1' +"(^http://search\.singingfish\.com/[-/%.0-9a-z]*\?)(.*)(&?)(ff=[^&]*)"->"\1\2\3" + +"(^http://search\.singingfish\.com/[-/%.0-9a-z]*\?)"->"\1ff=1&" + +# AOL Video +"(^http://video\.aol\.com/[-/%.0-9a-z]*\?)(.*)(&?)(ff=[^&]*)"->"\1\2\3" + +"(^http://video\.aol\.com/[-/%.0-9a-z_-]*\?)"->"\1ff=1&" +"(^http://video\.aol\.com/[-/%.0-9a-z_-]*)"->"\1ff=1&" +"(^http://aolvideo\.searchvideo\.aol\.com/[-/%.0-9a-z_-]*\?)"->"\1ff=1&" + +# Ilse - remove 'family=...' and add 'family=yes' +#"(^http://www\.ilse\.nl/searchresults\.dbl\?)(.*)(&?)(family=[^&]*)"->"\1\2\3" +#"(^http://www\.ilse\.nl/searchresults\.dbl\?)"->"\1family=yes&" + +# KEL - remove 'Realm%3AErotiek=...' +"(^http://www\.kel\.nl/search/search.cgi\?)(.*)(&?)(Realm%3AErotiek=[^&]*)"->"\1\2\3" + +# Lycos.com - family filter only available in advanced mode. +# Remove 'adv=...' and 'adf=...' and add 'adv=1&adf=on' +"(^http://[^/]*search[^/]*\.lycos\.com/[-/%.0-9a-z]*\?)(.*)(&?)(adv=[^&]*)"->"\1\2\3" +"(^http://[^/]*search[^/]*\.lycos\.com/[-/%.0-9a-z]*\?)(.*)(&?)(xadult\.)(.*)(xadult\.)"->"\1\2\3\5" +"(^http://[^/]*search[^/]*\.lycos\.com/[-/%.0-9a-z]*\?)"->"\1adv=1&adf=on&" +# Lycos Fr +"(^http://[^/]*vachercher[^/]*\.lycos\.fr/[-/%.0-9a-z]*\?)(.*)(&?)(adv=[^&]*)"->"\1\2\3" +"(^http://[^/]*vachercher[^/]*\.lycos\.fr/[-/%.0-9a-z]*\?)(.*)(&?)(family=[^&]*)"->"\1\2\3" +"(^http://[^/]*vachercher[^/]*\.lycos\.fr/[-/%.0-9a-z]*\?)(.*)(&?)(xadult\.)(.*)(xadult\.)"->"\1\2\3\5" +"(^http://[^/]*vachercher[^/]*\.lycos\.fr/[-/%.0-9a-z]*\?)"->"\1adv=1&adf=on&&family=on&" + +# Lycos.nl - remove 'family=...' and add 'family=on' +"(^http://zoek\.lycos\.nl/[-/%.0-9a-z]*\?)(.*)(&?)(family=[^&]*)"->"\1\2\3" +"(^http://zoek\.lycos\.nl/[-/%.0-9a-z]*\?)"->"\1family=on&" + +# Alltheweb - change the customize url so that 'offensive' cannot be turned off +"(^http://www\.alltheweb\.com/customize\?)(.*)(&?)(copt_offensive=[^&]*)"->"\1\2\3copt_offensive=on" + +# Yahoo - remove 'vm=...' and add 'vm=r' +"(^http://[-/%.0-9a-z]+\.yahoo\.[a-z]+[-/%.0-9a-z]*/search\?)(.*)(&?)(vm=[^&]*)"->"\1\2\3" +"(^http://[-/%.0-9a-z]+\.yahoo\.[a-z]+[-/%.0-9a-z]*/search\?)"->"\1vm=r&" + +# Hotbot - remove 'adf=...' and add 'adf=on' +"(^http://[0-9a-z]+\.hotbot\.[a-z]+/[-/%.0-9a-z]*\?)(.*)(&?)(adf=[^&]*)"->"\1\2\3" +"(^http://[0-9a-z]+\.hotbot\.[a-z]+/[-/%.0-9a-z]*\?)"->"\1adf=on&" + +# Wisenut - change the customize url so that 'wisepatrol' cannot be turned off +"(^http://www\.wisenut\.com/preferences/savePreferences\.[^?]*\?)(.*)(&?)(wisepatrol=[^&]*)"->"\1\2\3wisepatrol=1" + +# Metacrawler - remove 'familyfilter=...' and add 'familyfilter=1' +"(^http://www\.metacrawler\.com/info\.metac/search/[-/%.0-9a-z]*\?)(.*)(&?)(familyfilter=[^&]*)"->"\1\2\3" +"(^http://www\.metacrawler\.com/info\.metac/search/[-/%.0-9a-z]*\?)"->"\1familyfilter=1&" + +# Ms Bing +# remove &ADLT= +"(^http://[0-9a-z]+\.bing\.[a-z]+[-/%.0-9a-z]*/search\?)(.*)(&?)(adlt=[^&]*)"->"\1\2\3" +## ... and add '&adlt=strict' +"(^http://[0-9a-z]+\.bing\.[a-z]+[-/%.0-9a-z]*/search\?.*)"->"\1&adlt=strict" +## httpS +"(^https://www\.bing\.com)"->"https://strict.bing.com" + +# Youtube +"(^https://www\.youtube\.com*)"->"https://restrictmoderate.youtube.com" +"(^https://m\.youtube\.com*)"->"https://restrictmoderate.youtube.com" +"(^https://youtube\.googleapis\.com*)"->"https://restrictmoderate.youtube.com" +"(^https://youtubei\.googleapis\.com*)"->"https://restrictmoderate.youtube.com" +"(^https://www\.youtube-nocookie\.com*)"->"https://restrictmoderate.youtube.com" + +# Qwant +"(^http[s]://[0-9a-z.]*api\.qwant\.[a-z]+[-/%.0-9a-z]*)"->"https://safeapi.qwant.com" + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/weightedphraselist b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/weightedphraselist new file mode 100644 index 0000000000000000000000000000000000000000..a8cf6160ba757fddfda0bc0526153dd1f5dba5e9 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/weightedphraselist @@ -0,0 +1,108 @@ +# dansguardian/dansguardian$z weightedphraselist INSTRUCTIONS FOR USE +# +# Examples: +# +# <slut><10> +# - Adds 10 to the count against the string 'slut'. ie. sluts, slut!, abslutxyz. +# +# < slut ><10> +# - Adds 10 to the count against the word 'slut'. ie. Sally is a slut that smells. +# +# <slut>,<horny><50> +# - Adds 50 to the count when the strings 'slut' and 'horny' are found on the same page. +# +# <breast>,<medical><-30> +# - Subtracts 30 from the count when 'breast' and 'medical' are on the one page. +# +# <education><-25> +# - Subtracts 25 from the count when 'education' is on the page. +# +# See the bannedphraselist for more examples. +# +# Extra weighted-list files to include +# .Include</etc/guardian/guardian$z/lists/phraselists/weightedphraselist.topic> +# +# Help by contributing customised lists and/or new keyword lists. +# Email: pornmastergeneral@dansguardian/dansguardian$z.org or phrasemaster@dansguardian/dansguardian$z.org +# +# NOTE: New lists are commented out as ALPHA or BETA depending on how much the +# lists have been tested. +# ALPHA - Brand new and/or incomplete - little testing has been done +# BETA - Relatively new - tested in several locations +# + +#listcategory: "Weighted Phrases" + +#Good Phrases (to allow medical, education, news and other good sites) +.Include</etc/guardian/guardian$z/listsf1/phraselists/goodphrases/weighted_general> +.Include</etc/guardian/guardian$z/listsf1/phraselists/goodphrases/weighted_news> +.Include</etc/guardian/guardian$z/listsf1/phraselists/goodphrases/weighted_general_danish> +.Include</etc/guardian/guardian$z/listsf1/phraselists/goodphrases/weighted_general_dutch> +.Include</etc/guardian/guardian$z/listsf1/phraselists/goodphrases/weighted_general_malay> +.Include</etc/guardian/guardian$z/listsf1/phraselists/goodphrases/weighted_general_portuguese> + +#Pornography +.Include</etc/guardian/guardian$z/listsf1/phraselists/pornography/weighted> +.Include</etc/guardian/guardian$z/listsf1/phraselists/pornography/weighted_chinese> #ALPHA# +.Include</etc/guardian/guardian$z/listsf1/phraselists/pornography/weighted_danish> #ALPHA# +.Include</etc/guardian/guardian$z/listsf1/phraselists/pornography/weighted_dutch> #BETA# +.Include</etc/guardian/guardian$z/listsf1/phraselists/pornography/weighted_french> +.Include</etc/guardian/guardian$z/listsf1/phraselists/pornography/weighted_german> +.Include</etc/guardian/guardian$z/listsf1/phraselists/pornography/weighted_italian> +.Include</etc/guardian/guardian$z/listsf1/phraselists/pornography/weighted_japanese> #ALPHA# +.Include</etc/guardian/guardian$z/listsf1/phraselists/pornography/weighted_malay> #BETA# +.Include</etc/guardian/guardian$z/listsf1/phraselists/pornography/weighted_portuguese> +.Include</etc/guardian/guardian$z/listsf1/phraselists/pornography/weighted_spanish> #ALPHA# +.Include</etc/guardian/guardian$z/listsf1/phraselists/pornography/weighted_russian> #BETA# +.Include</etc/guardian/guardian$z/listsf1/phraselists/nudism/weighted> + +#Bad Words - swearing +.Include</etc/guardian/guardian$z/listsf1/phraselists/badwords/weighted_dutch> +.Include</etc/guardian/guardian$z/listsf1/phraselists/badwords/weighted_french> +.Include</etc/guardian/guardian$z/listsf1/phraselists/badwords/weighted_german> #ALPHA# +.Include</etc/guardian/guardian$z/listsf1/phraselists/badwords/weighted_portuguese> #ALPHA# +.Include</etc/guardian/guardian$z/listsf1/phraselists/badwords/weighted_spanish> #ALPHA# + +#Drugs +#.Include</etc/guardian/guardian$z/listf1s/phraselists/drugadvocacy/weighted> +#.Include</etc/guardian/guardian$z/listf1s/phraselists/illegaldrugs/weighted> +#.Include</etc/guardian/guardian$z/listf1s/phraselists/illegaldrugs/weighted_portuguese> +#.Include</etc/guardian/guardian$z/listf1s/phraselists/legaldrugs/weighted> + +#Violence and intolerance +#.Include</etc/guardian/guardian$z/listf1s/phraselists/intolerance/weighted> +#.Include</etc/guardian/guardian$z/listf1s/phraselists/intolerance/weighted_portuguese> +#.Include</etc/guardian/guardian$z/listf1s/phraselists/gore/weighted> +#.Include</etc/guardian/guardian$z/listf1s/phraselists/gore/weighted_portuguese> +#.Include</etc/guardian/guardian$z/listf1s/phraselists/violence/weighted> +#.Include</etc/guardian/guardian$z/listf1s/phraselists/violence/weighted_portuguese> +#.Include</etc/guardian/guardian$z/listf1s/phraselists/weapons/weighted> +#.Include</etc/guardian/guardian$z/listf1s/phraselists/weapons/weighted_portuguese> + +#Chat +#.Include</etc/guardian/guardian$z/listf1s/phraselists/chat/weighted> +#.Include</etc/guardian/guardian$z/listf1s/phraselists/chat/weighted_italian> + +#Webmail +#.Include</etc/guardian/guardian$z/listf1s/phraselists/webmail/weighted> +#Note that if you enable the webmail weighted lf1ist you should also disable +#the "exception_email" list in the exceptionphrf1aselist file. + +#Forums +#.Include</etc/guardian/guardian$z/listf1s/phraselists/forums/weighted> #BETA# + +#Gambling +#.Include</etc/guardian/guardian$z/listf1s/phraselists/gambling/weighted> +#.Include</etc/guardian/guardian$z/listf1s/phraselists/gambling/weighted_portuguese> + +#Productivity +#.Include</etc/guardian/guardian$z/listf1s/phraselists/games/weighted> #ALPHA# +#.Include</etc/guardian/guardian$z/listf1s/phraselists/news/weighted> #ALPHA# +#.Include</etc/guardian/guardian$z/listf1s/phraselists/personals/weighted> +#.Include</etc/guardian/guardian$z/listf1s/phraselists/personals/weighted_portuguese> +#.Include</etc/guardian/guardian$z/listf1s/phraselists/sport/weighted> #ALPHA# + +#System Management and Security +.Include</etc/guardian/guardian$z/listsf1/phraselists/malware/weighted> #BETA# +.Include</etc/guardian/guardian$z/listsf1/phraselists/proxies/weighted> +.Include</etc/guardian/guardian$z/listsf1/phraselists/warezhacking/weighted> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/weightedphraselist.meta b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/weightedphraselist.meta new file mode 100644 index 0000000000000000000000000000000000000000..45a69bd8e7f352bac69e8514693123f6b3bcd9d0 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/templates/weightedphraselist.meta @@ -0,0 +1,46 @@ +# DANSGUARDIAN weightedphraselist INSTRUCTIONS FOR USE +# +# Examples: +# +# <slut><10> +# - Adds 10 to the count against the string 'slut'. ie. sluts, slut!, abslutxyz. +# +# < slut ><10> +# - Adds 10 to the count against the word 'slut'. ie. Sally is a slut that smells. +# +# <slut>,<horny><50> +# - Adds 50 to the count when the strings 'slut' and 'horny' are found on the same page. +# +# <breast>,<medical><-30> +# - Subtracts 30 from the count when 'breast' and 'medical' are on the one page. +# +# <education><-25> +# - Subtracts 25 from the count when 'education' is on the page. +# +# See the bannedphraselist for more examples. +# +# Extra weighted-list files to include +# .Include</etc/guardian/weightedphraselist.topic> +# +# Help by contributing customised lists and/or new keyword lists. +# Email: pornmastergeneral@dansguardian.org +# + +#.Include</etc/guardian/phraselists/chat/weighted> +#.Include</etc/guardian/phraselists/drugadvocacy/weighted> +#.Include</etc/guardian/phraselists/dutchbadwords/weighted> +#.Include</etc/guardian/phraselists/frenchbadwords/weighted> +#.Include</etc/guardian/phraselists/frenchpornography/weighted> +#.Include</etc/guardian/phraselists/gambling/weighted> +#.Include</etc/guardian/phraselists/germanpornography/weighted> +#.Include</etc/guardian/phraselists/goodphrases/weighted> +#.Include</etc/guardian/phraselists/gore/weighted> +#.Include</etc/guardian/phraselists/illegaldrugs/weighted> +#.Include</etc/guardian/phraselists/intolerance/weighted> +#.Include</etc/guardian/phraselists/legaldrugs/weighted> +#.Include</etc/guardian/phraselists/personals/weighted> +#.Include</etc/guardian/phraselists/pornography/weighted> +#.Include</etc/guardian/phraselists/violence/weighted> +#.Include</etc/guardian/phraselists/warezhacking/weighted> +#.Include</etc/guardian/phraselists/weapons/weighted> +.Include</var/lib/blacklists/meta/weighted> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/whitelist_templates/bannedsitelist b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/whitelist_templates/bannedsitelist new file mode 100644 index 0000000000000000000000000000000000000000..654c7144d32e884cd6e0e47785aa6c17743fefb0 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/whitelist_templates/bannedsitelist @@ -0,0 +1,59 @@ +#Liste blanche: aucun sites interdits +# +#domains in banned list +#Don't bother with the www. or the http:// + +#The bannedurllist is for blocking PART of a site +#The bannedsitelist is for blocking ALL of a site + +#As of DansGuardian 2.7.3 you can now include +#.tld so for example you can match .gov for example + +#The 'grey' lists override the 'banned' lists. +#The 'exception' lists override the 'banned' lists also. +#The difference is that the 'exception' lists completely switch +#off *all* other filtering for the match. 'grey' lists only +#stop the URL filtering and allow the normal filtering to work. + +#An example of grey list use is when in Blanket Block (whitelist) +#mode and you want to allow some sites but still filter as normal +#on their content + +#Another example of grey list use is when you ban a site but want +#to allow part of it. + +#To include additional files in this list use this example: +#.Include</etc/e2guardian/anotherbannedurllist> + +#You can have multiple .Includes. + +#List other sites to block: + + + + +#Blanket Block. To block all sites except those in the +#exceptionsitelist and greysitelist files remove +#the # from the next line to leave only a '**': +#** + +#Blanket IP Block. To block all sites specified only as an IP +#remove the # from the next line to leave only a '*ip': +#*ip + + + +#Remove the # from the following and edit as needed to use a stock +#squidGuard/urlblacklist blacklists collection. +# You will need to edit to add and remove categories you want + +# filtres obligatoires +.Include</var/lib/blacklists/db/adult/domains> +.Include</var/lib/blacklists/db/redirector/domains> +# +## filtres optionnels +#.Include</var/lib/blacklists/dansguardian$z/f$s/bannedsitelist> +# +## ajouts locaux +#.Include</var/lib/blacklists/dansguardian$z/f$s/domains> + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/whitelist_templates/bannedurllist b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/whitelist_templates/bannedurllist new file mode 100644 index 0000000000000000000000000000000000000000..94c766d1414e473e205d07bc564f9aab486585be --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/whitelist_templates/bannedurllist @@ -0,0 +1,38 @@ +#URLs in banned list +#Don't bother with the http:// or the www + +#The bannedurllist is for blocking PART of a site +#The bannedsitelist is for blocking ALL of a site + +#The 'grey' lists override the 'banned' lists. +#The 'exception' lists override the 'banned' lists also. +#The difference is that the 'exception' lists completely switch +#off *all* other filtering for the match. 'grey' lists only +#stop the URL filtering and allow the normal filtering to work. + +#An example of grey list use is when in Blanket Block (whitelist) +#mode and you want to allow some sites but still filter as normal +#on their content + +#Another example of grey list use is when you ban a site but want +#to allow part of it. + +#To include additional files in this list use this example: +#.Include</etc/e2guardian/anotherbannedurllist> + +#You can have multiple .Includes. + +#List other URLs to block: + + + +#Remove the # from the following and edit as needed to use a stock +#squidGuard blacklists collection. +# You will need to edit to add and remove categories you want + +# filtres obligatoires +.Include</var/lib/blacklists/db/adult/urls> +.Include</var/lib/blacklists/db/redirector/urls> + +# filtres optionnels +#.Include</var/lib/blacklists/dansguardian$z/f$s/bannedurllist> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/whitelist_templates/exceptionsitelist b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/whitelist_templates/exceptionsitelist new file mode 100644 index 0000000000000000000000000000000000000000..86b7d84482f6a6a075cd8edf88b5418e59d8fda3 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/whitelist_templates/exceptionsitelist @@ -0,0 +1,32 @@ +#Sites in exception list +#Don't bother with the www. or +#the http:// +# +#These are specifically domains and are not URLs. +#For example 'foo.bar/porn/' is no good, you need +#to just have 'foo.bar'. +# +#You can also match IPs here too. +# +#As of DansGuardian 2.7.3 you can now include +#.tld so for example you can match .gov for example + + +dansguardian.org +canonical.com +ubuntu.com +c.microsoft.com +crl.microsoft.com +database.clamav.net +download.microsoft.com +genuine.microsoft.com +mpa.one.microsoft.com +ntservicepack.microsoft.com +pool.ntp.org +services.openoffice.org +update.microsoft.com +windowsupdate.com +windowsupdate.microsoft.com +wustat.windows.com +.Include</var/lib/blacklists/white/academies> +.Include</var/lib/blacklists/dansguardian$z/f$s/exceptionsitelist> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/whitelist_templates/exceptionurllist b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/whitelist_templates/exceptionurllist new file mode 100644 index 0000000000000000000000000000000000000000..a23975aec9be18730ae104b55ee6288f0cf1c569 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/whitelist_templates/exceptionurllist @@ -0,0 +1,19 @@ +# +# +#URLs in exception list +#Don't bother with the www. or +#the http:// +# +#These are parts of sites that filtering should +#be switched off for. +# +#These should not be domains, i.e. entire sites, +#they should be a domain with a path. +# +#For example 'foo.bar' is no good, you need +#to just have 'foo.bar/porn/'. +# +#Another example: +#generallybadsite.tld/partthatsok/ + +.Include</var/lib/blacklists/dansguardian$z/f$s/exceptionurllist> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/whitelist_templates/greysitelist b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/whitelist_templates/greysitelist new file mode 100644 index 0000000000000000000000000000000000000000..d4ce7c3ce0d25f600b6ca09415a4396bec062404 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/whitelist_templates/greysitelist @@ -0,0 +1,34 @@ +#domains in grey list +#Don't bother with the www. or the http:// + +#The 'grey' lists override the 'banned' lists. +#The 'exception' lists override the 'banned' lists also. +#The difference is that the 'exception' lists completely switch +#off *all* other filtering for the match. 'grey' lists only +#stop the URL filtering and allow the normal filtering to work. + +#An example of grey list use is when in Blanket Block (whitelist) +#mode and you want to allow some sites but still filter as normal +#on their content + +#Another example of grey list use is when you ban a site but want +#to allow part of it. + +#The greyurllist is for partly unblocking PART of a site +#The greysitelist is for partly unblocking ALL of a site + +#As of DansGuardian 2.7.3 you can now include +#.tld so for example you can match .gov for example + +#To include additional files in this list use this example: +#.Include</etc/e2guardian/anotherurllist> + +#You can have multiple .Includes. + +#List other sites to block: + +#www.bbc.co.uk +# +# site de la liste blanche +# +.Include</var/lib/blacklists/dansguardian$z/f$s/site_liste_blanche> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/whitelist_templates/greyurllist b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/whitelist_templates/greyurllist new file mode 100644 index 0000000000000000000000000000000000000000..27eed5587df0984faf34268c3989bb82c17c49d6 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/dansguardian/whitelist_templates/greyurllist @@ -0,0 +1,31 @@ +#URLs in grey list +#Don't bother with the http:// or the www + +#The greyurllist is for partly unblocking PART of a site +#The greysitelist is for partly unblocking ALL of a site + +#The 'grey' lists override the 'banned' lists. +#The 'exception' lists override the 'banned' lists also. +#The difference is that the 'exception' lists completely switch +#off *all* other filtering for the match. 'grey' lists only +#stop the URL filtering and allow the normal filtering to work. + +#An example of grey list use is when in Blanket Block (whitelist) +#mode and you want to allow some sites but still filter as normal +#on their content + +#Another example of grey list use is when you ban a site but want +#to allow part of it. + +#To include additional files in this list use this example: +#.Include</etc/e2guardian/anotherurllist> + +#You can have multiple .Includes. + +#List other URLs to block: + +#members.home.net/nice +# +# urls de la liste blanche +# +.Include</var/lib/blacklists/dansguardian$z/f$s/url_liste_blanche> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/diagnose/151-proxy b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/diagnose/151-proxy new file mode 100644 index 0000000000000000000000000000000000000000..d2d7ccdcebc799faf69bb073323694a4d2a88161 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/diagnose/151-proxy @@ -0,0 +1,138 @@ +#!/bin/bash +. /usr/lib/eole/diagnose.sh + +EchoGras "*** Services Proxy" +# FIXME: squid tourne en 127.0.0.1 +#TestService "proxy" $container_ip_proxy:8080 +TestPid "Service proxy" squid + +TYPE_AUTH=$(CreoleGet type_squid_auth aucun) +if [ "$TYPE_AUTH" == 'NTLM/KERBEROS' -o "$TYPE_AUTH" == 'NTLM/SMB' ];then + printf ". %${len_pf}s => " "enregistrement $TYPE_AUTH" + MSG=$(CreoleRun "/usr/bin/wbinfo -t 2>&1" proxy) + if [ $? -eq 0 ];then + EchoVert "Ok" + else + echo $MSG | grep -q "WBC_ERR_WINBIND_NOT_AVAILABLE" + if [ $? -eq 0 ];then + EchoOrange "Non effectué" + else + EchoRouge "Erreur" + fi + fi +fi + +DAEMON="e2guardian" + +TestProxy() { + COMMENT=$1 + IP=$2 + len=$((len_pf-7)) + PROXY2PORT=$(CreoleGet proxy2_port '') + if [[ -n ${PROXY2PORT} ]] + then + printf ". %${len_pf}s => " "Nb de proxy [${COMMENT}]" + EchoGras "2" + fi + # Utilise le serveur de mise à jour car exclut de l'authentification du proxy (voir #10130) + for dnsname in $(CreoleGet serveur_maj); do + printf ". %${len_pf}s => " "web via proxy 1" + CreoleRun "http_proxy=http://$IP:3128/ wget -q -t2 --connect-timeout=3 --read-timeout=3 --spider http://$dnsname/eole" proxy + RET=$? + if [ $RET -eq 0 ]; then + EchoVert "Ok" + break + else + EchoRouge "Erreur" + fi + done + if [[ -n ${PROXY2PORT} ]] + then + for dnsname in $(CreoleGet serveur_maj); do + printf ". %${len_pf}s => " "web via proxy 2" + CreoleRun "http_proxy=http://$IP:${PROXY2PORT}/ wget -q -t2 --connect-timeout=3 --read-timeout=3 --spider http://$dnsname/eole" proxy + RET=$? + if [ $RET -eq 0 ]; then + EchoVert "Ok" + break + else + EchoRouge "Erreur" + fi + done + fi +} + +FLTACTIF=$(CreoleGet activer_filtrage_proxy non ) +nombre_interfaces=$(CreoleGet nombre_interfaces) +container_ip_proxy=$(CreoleGet container_ip_proxy) +container_actif=$(CreoleGet mode_conteneur_actif) +instance_1_activate=0 +instance_2_activate=0 +instance_3_activate=0 + +if [ $nombre_interfaces -eq 1 ];then + if [ "$container_actif" = "oui" ];then + ## mode conteneur ## + TestProxy $(CreoleGet nom_machine) $(CreoleGet adresse_ip_eth0_proxy_link) + else + ## mode non conteneur ## + TestProxy $(CreoleGet nom_machine) $(CreoleGet adresse_ip_eth0) + fi + if [ "$container_actif" = "oui" ];then + ## mode conteneur ## + IP=$(CreoleGet adresse_ip_eth0_proxy_link) + else + ## mode non conteneur ## + IP=$(CreoleGet adresse_ip_eth0) + fi + if [[ ${FLTACTIF} == "oui" ]] + then + if [ "$(CreoleGet dansguardian_eth0)" = "1" ]; then + instance_1_activate=$IP + elif [ "$(CreoleGet dansguardian_eth0)" = "2" ]; then + instance_2_activate=$IP + fi + fi +else + for numint in `seq 1 $[nombre_interfaces-1]`; do + if [ "$container_actif" = "oui" ];then + ## mode conteneur ## + IP=$(CreoleGet adresse_ip_eth${numint}_proxy_link) + else + ## mode non conteneur ## + IP=$(CreoleGet adresse_ip_eth$numint) + fi + if [[ ${FLTACTIF} == "oui" ]] + then + if [ "$(CreoleGet dansguardian_eth$numint)" = "1" ]; then + instance_1_activate=$IP + elif [ "$(CreoleGet dansguardian_eth$numint)" = "2" ]; then + instance_2_activate=$IP + fi + fi + nom_zone_eth=$(CreoleGet nom_zone_eth$numint) + TestProxy "$(CreoleGet nom_machine_eth$numint)" $IP + if [ "$container_actif" = "non" ];then + if [ "$(CreoleGet alias_eth$numint)" = "oui" ]; then + numalias=0 + for ip in $(CreoleGet alias_ip_eth$numint); do + numalias=$((numalias+1)) + int="$(CreoleGet nom_zone_eth$numint):$numalias" + TestProxy "$int" $ip + done + fi + if [ "$(CreoleGet vlan_eth$numint)" = "oui" ]; then + VLAN_ID=($(CreoleGet vlan_id_eth${numint})) + VLAN_IP=($(CreoleGet vlan_ip_eth${numint})) + NB_VLAN=${#VLAN_ID[*]} + for ((id=0; id < $NB_VLAN; id+=1)) + do + int="$nom_zone_eth.${VLAN_ID[id]}" + TestProxy "$int" "${VLAN_IP[id]}" + done + fi + fi + done +fi + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/sbin/Maj-blacklist.sh b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/sbin/Maj-blacklist.sh new file mode 100644 index 0000000000000000000000000000000000000000..5ba4c3428d1000ef5472360f0e8d2be6d428de16 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/sbin/Maj-blacklist.sh @@ -0,0 +1,151 @@ +#!/bin/bash + +if [ $(CreoleGet activer_filtrage_proxy) = "non" ];then + echo "Le filtrage n'est pas activé sur le proxy" + exit 0 +fi + +. /usr/lib/eole/diagnose.sh + +FatalError() { + # alerte Zéphir + . /usr/lib/eole/zephir.sh + Zephir "ERR" "$1" "Maj-blacklist" 2>&1 | tee -a $F_LOG + # erreur en 1ère position pour vue EAD + sed -i 1i"Erreur : $1" $F_LOG + exit 1 +} + +container_path_proxy=$(CreoleGet container_path_proxy) +url_maj_blacklist=$(CreoleGet url_maj_blacklist) + +# lieu de stockage des bases +SHORT_META_PATH="/var/lib/blacklists/meta/" +META_PATH="$container_path_proxy$SHORT_META_PATH" +SHORT_DB_PATH="/var/lib/blacklists" +DB_PATH="$container_path_proxy$SHORT_DB_PATH" +# fichier de log spécifique +F_LOG="/var/lib/eole/reports/maj-blacklist.txt" + +echo -n "Mise à jour le " > $F_LOG +date '+%d.%m.%Y à %H:%M :' >> $F_LOG + +ServBlacklist=`echo "$url_maj_blacklist" |awk -F "/" '{print $3}'` + +TestWeb "Test de $url_maj_blacklist" "$url_maj_blacklist" 2>&1 +if [ $? -ne 0 ];then + FatalError "Impossible d'accéder au site de mise à jour : $ServBlacklist" +fi + +## on se pose dans /tmp ## +mkdir -p $DB_PATH/tmp +cd $DB_PATH/tmp +WGET_OPTIONS="--timestamping" + +echo "Téléchargement des bases" + +res=`wget $WGET_OPTIONS $url_maj_blacklist/blacklists.tar.gz 2>&1` +if [ $? -ne 0 ];then + FatalError "Le fichier blacklists.tar.gz n'a pas été trouvé !" +fi +echo "$res" | grep -q -E "non récupéré|not retrieving" +if [ $? -eq 0 ];then + blacklists="0" +else + blacklists="1" +fi + +## Fichier weighted ## +res=`wget $WGET_OPTIONS $url_maj_blacklist/weighted 2>&1` +if [ $? -ne 0 ];then + FatalError "Le fichier weighted n'a pas été trouvé !" +fi +echo "$res" | grep -q -E "non récupéré|not retrieving" +if [ $? -eq 0 ];then + weighted="0" +else + weighted="1" +fi + +## Base blacklists (si nécessaire) ## +if [ "$blacklists" == "1" ];then + echo "Intégration des bases" + tar -xzf blacklists.tar.gz + if [ $? -ne 0 ];then + FatalError "L'archive blacklists.tar.gz n'a pas pu être décompressée !" + fi + + ## Filtres obligatoires (dans db) ## + for base in "adult" "redirector" + do + [ ! -d $DB_PATH/db/$base ] && mkdir -p $DB_PATH/db/$base + for file in "$DB_PATH/tmp/blacklists/$base/domains" "$DB_PATH/tmp/blacklists/$base/urls" + do + if [ -f $file ];then + count=`wc -l $file | awk -F " " '{print $1}'` + if [ ! "$count" -eq "0" ];then + cp $file $DB_PATH/db/$base + else + echo 'le fichier' $file 'est vide !' + fi + fi + done + done + #CreoleRun "chown -R proxy.proxy $SHORT_DB_PATH/db/" proxy + + ## Filtres optionnels (dans eole) ## + for base in `cut -d '#' -f1 /usr/share/ead2/backend/config/filtres-opt` + do + [ ! -d $DB_PATH/eole/$base ] && mkdir -p $DB_PATH/eole/$base + [ ! -e $DB_PATH/eole/$base/domains ] && touch $DB_PATH/eole/$base/domains + [ ! -e $DB_PATH/eole/$base/urls ] && touch $DB_PATH/eole/$base/urls + + for file in "$DB_PATH/tmp/blacklists/$base/domains" "$DB_PATH/tmp/blacklists/$base/urls" + do + if [ -f $file ];then + count=`wc -l $file | awk -F " " '{print $1}'` + if [ ! "$count" -eq "0" ];then + cp $file $DB_PATH/eole/$base + else + echo 'le fichier' $file 'est vide !' + fi + fi + done + done + #CreoleRun "chown -R proxy.proxy $SHORT_DB_PATH/eole/" proxy + +else + echo "Rien à faire pour blacklists.tar.gz" +fi + +## Fichier weighted (si nécessaire) ## +if [ $weighted == "1" ] +then + echo "Copie du fichier weighted" + cp -f $DB_PATH/tmp/weighted $META_PATH +else + echo "Rien à faire pour le fichier weighted" +fi + + +# formatage de la date du fichier pour EAD +bdate=`ls -l --time-style="+%d.%m.%Y %H:%M" blacklists.tar.gz` +echo -n "- bases du " >> $F_LOG +echo -n `echo -n $bdate | awk -F' ' '{print $6} {print $7}'` >> $F_LOG +echo >> $F_LOG +wdate=`ls -l --time-style="+%d.%m.%Y %H:%M" weighted` +echo -n "- fichier weighted du " >> $F_LOG +echo -n `echo -n $bdate | awk -F' ' '{print $6} {print $7}'` >> $F_LOG +echo >> $F_LOG + +## Suppression des fichiers +# on laisse le tar.gz pour utiliser l'option --timestamping de wget +rm -rf $DB_PATH/tmp/adult +rm -rf $DB_PATH/tmp/blacklists +#rm -f $DB_PATH/tmp/blacklists.tar.gz +#rm -f $DB_PATH/tmp/weighted + +# redémarrage si au moins une modification +if [ "$blacklists" == "1" -o $weighted == "1" ];then + CreoleService eole-guardian restart +fi diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/sbin/enregistrement_domaine.sh b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/sbin/enregistrement_domaine.sh new file mode 100644 index 0000000000000000000000000000000000000000..8859a97043f764244b1c814f377dc036fe6962ba --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/sbin/enregistrement_domaine.sh @@ -0,0 +1,87 @@ +#!/bin/bash +################################################# +# enregistrement_domaine.sh +################################################# +. /usr/lib/eole/ihm.sh + +TYPE_AUTH=$(CreoleGet type_squid_auth aucun) + +integration=1 +restart_smb() { +CreoleService winbind stop -c proxy +CreoleService smbd restart -c proxy +CreoleService nmbd restart -c proxy +CreoleService winbind start -c proxy +} + +if [ "$TYPE_AUTH" != 'NTLM/KERBEROS' -a "$TYPE_AUTH" != 'NTLM/SMB' ]; then + EchoRouge "L'authentification du proxy n'est pas de type NTLM" + exit 1 +fi + +if [ "$TYPE_AUTH" == 'NTLM/KERBEROS' ];then + nom_domaine=$(CreoleGet nom_domaine_windows) +else + nom_domaine=$(CreoleGet nom_domaine_smb) +fi + + +CreoleRun "/usr/bin/wbinfo -t" proxy &>/dev/null +if [ $? -eq 0 ];then + echo "Le serveur est déjà intégré à un domaine." + CreoleRun "/usr/bin/wbinfo -t -D $nom_domaine" proxy + QUESTION="Relancer l'intégration ?" + Question_ouinon "$QUESTION" True non warn + [ $? -ne 0 ] && exit 0 +fi + +#redemarrage de samba +echo "*** Redémarrage des services pour l'enregistrement au domaine ***" +restart_smb + +echo +echo "Entrer le nom de l'administrateur du contrôleur de domaine :" +read user_admin +echo "Entrer le mot de passe de l'administrateur du contrôleur de domaine :" +read -s mdp_admin + +if [ $TYPE_AUTH = 'NTLM/KERBEROS' ]; then + ip_serveur_krb=$(CreoleGet ip_serveur_krb) + nom_serveur_krb=$(CreoleGet nom_serveur_krb) + nom_domaine_krb=$(CreoleGet nom_domaine_krb) + #inscription de la station dans un domaine + CreoleRun "/usr/bin/net ads join -I $ip_serveur_krb -U $user_admin%'${mdp_admin}' -S $nom_serveur_krb.$nom_domaine_krb" proxy + if [ "$?" == "0" ]; then + integration=0 + fi + echo + +elif [ "$TYPE_AUTH" = 'NTLM/SMB' ]; then + ip_serveur_smb=$(CreoleGet ip_serveur_smb) + nom_serveur_smb=$(CreoleGet nom_serveur_smb) + #inscription de la station dans un domaine + CreoleRun "/usr/bin/net rpc join -I $ip_serveur_smb -U $user_admin%'${mdp_admin}' -S $nom_serveur_smb" proxy + if [ "$?" == "0" ]; then + integration=0 + fi + echo +fi + +#redemarrage de samba +echo "*** Redémarrage des services pour confirmer l'enregistrement au domaine ***" +restart_smb + +#test de l'intégration +if [ "$integration" == "0" ]; then + CreoleRun "/usr/bin/wbinfo -t -D $nom_domaine" proxy + if [ $? -eq 1 ]; then + EchoRouge "L'intégration au domaine $nom_domaine a échoué" + exit 1 + else + EchoVert "L'intégration au domaine $nom_domaine a réussi" + fi +else + EchoRouge "L'intégration au domaine $nom_domaine a échoué" +fi + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/sbin/squid_logrotate.sh b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/sbin/squid_logrotate.sh new file mode 100644 index 0000000000000000000000000000000000000000..e2aacc68996dcdafb47332fab69d4e073eaba351 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/sbin/squid_logrotate.sh @@ -0,0 +1,2 @@ +#!/bin/bash +CreoleRun "/usr/sbin/squid -k rotate" proxy diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/sbin/squid_parselogs.sh b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/sbin/squid_parselogs.sh new file mode 100644 index 0000000000000000000000000000000000000000..7ccc2a74949cbe4b81740f8c4eb9a90177574bfc --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/sbin/squid_parselogs.sh @@ -0,0 +1,76 @@ +#!/bin/bash + +# Génération des statistiques de navigation d'une date +# Par défaut, génération des statistisques du jour +# Paramètres optionnels : +# date sour la forme AAAAMMDD : 20160229 pour le 29 février 2016 +# --yesterday : statistiques de la veille +# -h ou --help : affiche l'aide +# exemples : +# * squid_parselogs.sh : génération des statistiques de la veille si 'lightsquid_auto'='oui' +# * squid_parselogs.sh --yesterday : statistiques de la veille +# * squid_parselogs.sh 20160101 : génération des statistiques du 1er janvier 2016 + +DATE="" +# parse arguments +for ARG in $@; do + # Date forcée + [[ "${ARG}" =~ ^20[0-9]{2}[0-1][0-9][0-3][0-9]$ ]] && DATE="${ARG}" + # Date de la veille + [[ "${ARG}" = "--yesterday" ]] && DATE=$(date -d "now 1 days ago" +%Y%m%d) + # Affichage de l'aide + if [[ "${ARG}" = "-h" ]] || [[ "${ARG}" = "--help" ]]; then + echo """Génération des statistiques de navigation d'une date + Par défaut, génération des statistisques du jour + Paramètres optionnels : + date sour la forme AAAAMMDD : 20160229 pour le 29 février 2016 + --yesterday : statistiques de la veille + -h ou --help : affiche l'aide + exemples : + * squid_parselogs.sh : génération des statistiques de la veille + * squid_parselogs.sh 20160101 : génération des statistiques du 1er janvier 2016""" + exit 0 + fi +done + +TMP_SQUID_LOG="/var/tmp/squid.log" + +# Les journaux de connexions sur 1 jour sont dans 2 fichiers car logrotate à 6h25 +if [[ "$DATE" = "" ]];then + # Pas de paramètre, on prend les traces de navigation du jour + DATE=$(date +%Y%m%d) + SECOND_LOG_FILE="" +else + # date forcée ou paramètre --yesterday + SECOND_LOG_FILE_CMD="date -d \"$DATE 1 days\" +%Y%m%d" + SECOND_LOG_FILE="-$(eval $SECOND_LOG_FILE_CMD)" +fi +# Paramètre ou non, le premier fichier est celui du jour de $DATE +FIRST_LOG_FILE="-${DATE}" + +# Seul l'utilisateur générant les statistiques à accès au fichier temporaire +touch ${TMP_SQUID_LOG} && chmod 400 ${TMP_SQUID_LOG} + +# Prise en compte de la première partie des journaux +[ -f /var/log/rsyslog/local/squid/squid1.info.log${FIRST_LOG_FILE}.lzma ] && \ + lzma -d -c /var/log/rsyslog/local/squid/squid1.info.log${FIRST_LOG_FILE}.lzma >> ${TMP_SQUID_LOG} +[ -f /var/log/rsyslog/local/squid/squid2.info.log${FIRST_LOG_FILE}.lzma ] && \ + lzma -d -c /var/log/rsyslog/local/squid/squid2.info.log${FIRST_LOG_FILE}.lzma >> ${TMP_SQUID_LOG} + +# Prise en compte de la seconde partie des journaux +[ -f /var/log/rsyslog/local/squid/squid1.info.log${SECOND_LOG_FILE} ] && \ + cat /var/log/rsyslog/local/squid/squid1.info.log${SECOND_LOG_FILE} >> ${TMP_SQUID_LOG} +[ -f /var/log/rsyslog/local/squid/squid2.info.log${SECOND_LOG_FILE} ] && \ + cat /var/log/rsyslog/local/squid/squid2.info.log${SECOND_LOG_FILE} >> ${TMP_SQUID_LOG} + +# Idem précédent, au cas où le fichier soit déjà compressé : +# nécessaire quand on force la DATE, le fichier est déjà compressé. +[ -f /var/log/rsyslog/local/squid/squid1.info.log${SECOND_LOG_FILE}.lzma ] && \ + lzma -d -c /var/log/rsyslog/local/squid/squid1.info.log${SECOND_LOG_FILE}.lzma >> ${TMP_SQUID_LOG} +[ -f /var/log/rsyslog/local/squid/squid2.info.log${SECOND_LOG_FILE}.lzma ] && \ + lzma -d -c /var/log/rsyslog/local/squid/squid2.info.log${SECOND_LOG_FILE}.lzma >> ${TMP_SQUID_LOG} + +# Génération des statistiques +[ -x /usr/share/lightsquid/lightparser.pl ] && \ + /usr/share/lightsquid/lightparser.pl ${DATE} +rm -rf ${TMP_SQUID_LOG} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/schedule/scripts/majblacklist b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/schedule/scripts/majblacklist new file mode 100644 index 0000000000000000000000000000000000000000..ffb39529b31dc0e74ede19fcb8c628f134b4fb52 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/schedule/scripts/majblacklist @@ -0,0 +1,5 @@ +#!/bin/bash + +DESC="Mise à jour des bases de filtrage du proxy" + +/usr/share/eole/sbin/Maj-blacklist.sh diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/schedule/scripts/purgecache b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/schedule/scripts/purgecache new file mode 100644 index 0000000000000000000000000000000000000000..52021abd6574396e70aedf39c5572f18ba0aa465 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/eole/schedule/scripts/purgecache @@ -0,0 +1,22 @@ +#!/bin/bash + +DESC="Purge du cache eole-guardian" + +proxy=$(CreoleGet activer_filtrage_proxy) +cacheAge=1 + +if [[ ${proxy} = 'oui' ]] +then + path_proxy=$(CreoleGet container_path_proxy) + set -e + for instance in 0 1 2 + do + active=$(CreoleGet dans_instance_$((instance+1))_active non) + if [[ ${active} = 'oui' ]] + then + cache=$(CreoleGet dans_cachedir$((instance+1))) + find ${path_proxy}${cache} -type f -mtime +${cacheAge} -exec rm {} \; + fi + done + set +e +fi diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/zephir/monitor/configs/dansguardian.agent b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/zephir/monitor/configs/dansguardian.agent new file mode 100644 index 0000000000000000000000000000000000000000..abc82c965cceb3437ca0cf2bd950ad2e38df7479 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/zephir/monitor/configs/dansguardian.agent @@ -0,0 +1,47 @@ +# -*- coding: UTF-8 -*- + +from zephir.monitor.agents.dansguardian import Dansguardian +from zephir.monitor.agentmanager.config import ACTIVER_FILTRAGE_PROXY + +period = 120 + +if ACTIVER_FILTRAGE_PROXY: + dansguardian = Dansguardian( + "dans-stats", period=period, + description = """Instances e2guardian""", + section = """Utilisation""", + datasources = [ + {'name': "1", 'min_bound': 0, 'max_bound': 100}, + {'name': "2", 'min_bound': 0, 'max_bound': 100} + ], + archives = [{'rows':120, 'steps':1}, + {'rows':24*4, 'steps':900/period}, + {'rows':24*7, 'steps':3600/period} + ], + graphs = [ + { 'pngname': "dans-hour.png", + 'vnamedefs': {"1": ("1", 'AVERAGE'), "2": ("2", 'AVERAGE')}, + 'options': ["-u100", "-l0", '-s end-2hour', '-v %', '-t Taux d\'utilisation des processus e2guardian sur 2 heures', + 'LINE2:1#FF0000:Instance 1', + 'LINE2:2#0000FF:Instance 2' + ]}, + { 'pngname': "dans-day.png", + 'vnamedefs': {"1": ("1", 'AVERAGE'), "2": ("2", 'AVERAGE')}, + 'options': ["-u100", "-l0", '-s end-1day', '-v %', '-t Taux d\'utilisation des processus e2guardian sur 24 heures', + 'LINE2:1#FF0000:Instance 1', + 'LINE2:2#0000FF:Instance 2' + ]}, + { 'pngname': "dans-week.png", + 'vnamedefs': {"1": ("1", 'AVERAGE'), "2": ("2", 'AVERAGE')}, + 'options': ["-u100", "-l0", '-s end-7day', '-v %', '-t Taux d\'utilisation des processus e2guardian sur 7 jours', + 'LINE2:1#FF0000:Instance 1', + 'LINE2:2#0000FF:Instance 2' + ]}, + ], + requires = ['dansguardian']) + +# liste des agents qui seront chargés + AGENTS = [dansguardian] +else: + AGENTS = [] + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/zephir/monitor/configs/services/22_squid.srv b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/zephir/monitor/configs/services/22_squid.srv new file mode 100644 index 0000000000000000000000000000000000000000..78e788f5def8e3ad83ba4688bf4c160a05e8afac --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/zephir/monitor/configs/services/22_squid.srv @@ -0,0 +1,19 @@ +# -*- coding: UTF-8 -*- +""" +Surveillance du service Squid (première instance) +""" +from zephir.monitor.agents.services import TCPServices +from zephir.monitor.agentmanager.config import ACTIVER_FILTRAGE_PROXY, \ + CONTAINER_IP_PROXY + +if ACTIVER_FILTRAGE_PROXY: + squid_port = '8080' +else: + squid_port = '3128' + +desc = "Proxy et cache web (Squid)" +AGENTS.append(TCPServices('squid', {'localhost:%s' % squid_port : desc}, + period=115, + container_ip=CONTAINER_IP_PROXY, + description=desc)) + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/zephir/monitor/configs/services/22_squid2.srv b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/zephir/monitor/configs/services/22_squid2.srv new file mode 100644 index 0000000000000000000000000000000000000000..3f82b990cd03dc8c01709c56d98a3dc7497a9920 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/zephir/monitor/configs/services/22_squid2.srv @@ -0,0 +1,24 @@ +# -*- coding: UTF-8 -*- +""" +Surveillance du service Squid (deuxième instance) +""" +from zephir.monitor.agentmanager.config import ACTIVER_FILTRAGE_PROXY, \ + ACTIVER_SQUID2, \ + PROXY2_PORT, \ + CONTAINER_IP_PROXY, \ + ACTIVER_SQUID_AUTH + + +if ACTIVER_SQUID_AUTH: + if ACTIVER_SQUID2: + if ACTIVER_FILTRAGE_PROXY: + squid2_port = '8081' + else: + squid2_port = PROXY2_PORT + desc = 'Proxy et cache web (Squid instance 2)' + from zephir.monitor.agents.services import TCPServices + AGENTS.append(TCPServices('squid2', {'localhost:%s' % squid2_port:desc}, + period=115, + container_ip=CONTAINER_IP_PROXY, + description=desc)) + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/zephir/monitor/configs/services/23_dans1.srv b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/zephir/monitor/configs/services/23_dans1.srv new file mode 100644 index 0000000000000000000000000000000000000000..2d2e7f4c9427cc59c6b8bba3dbc78777eca2c7ae --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/zephir/monitor/configs/services/23_dans1.srv @@ -0,0 +1,31 @@ +# -*- coding: UTF-8 -*- +""" +Surveillance du service Dansguardian +""" +from zephir.monitor.agentmanager.config import ACTIVER_FILTRAGE_PROXY, \ + CONTAINER_IP_PROXY, \ + DANSGUARDIAN_ETH, \ + ADRESSE_IP_SERVICE_PROXY, \ + NOM_MACHINE_ETH, \ + NOMBRE_INTERFACES + +INSTANCE=1 + +if ACTIVER_FILTRAGE_PROXY: + instance_activate = False + prct_name = 'e2guardian' + for idx, dansguardian_eth in enumerate(DANSGUARDIAN_ETH): + if int(dansguardian_eth) == INSTANCE: + instance_activate = True + test = '%s:3128' % ADRESSE_IP_SERVICE_PROXY[idx] + if NOMBRE_INTERFACES == 0: + desc1 = 'Filtrage web' + desc2 = 'eth0' + else: + desc1 = 'Filtrage web sur %s' % NOM_MACHINE_ETH[idx] + desc2 = 'eth' + str(idx + 1) + break + if instance_activate: + from zephir.monitor.agents.services import TCPServices + AGENTS.append(TCPServices('dans%s' % INSTANCE, {test:desc1}, period=115, container_ip=CONTAINER_IP_PROXY, + description="Etat du service {0} sur {1}".format(prct_name, desc2))) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/zephir/monitor/configs/services/23_dans2.srv b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/zephir/monitor/configs/services/23_dans2.srv new file mode 100644 index 0000000000000000000000000000000000000000..0b9a16f1c66b753cbfea3de602a90bd8f9f7c469 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/zephir/monitor/configs/services/23_dans2.srv @@ -0,0 +1,31 @@ +# -*- coding: UTF-8 -*- +""" +Surveillance du service Dansguardian +""" +from zephir.monitor.agentmanager.config import ACTIVER_FILTRAGE_PROXY, \ + CONTAINER_IP_PROXY, \ + DANSGUARDIAN_ETH, \ + ADRESSE_IP_SERVICE_PROXY, \ + NOM_MACHINE_ETH, \ + NOMBRE_INTERFACES + +INSTANCE=2 + +if ACTIVER_FILTRAGE_PROXY: + instance_activate = False + prct_name = 'e2guardian' + for idx, dansguardian_eth in enumerate(DANSGUARDIAN_ETH): + if int(dansguardian_eth) == INSTANCE: + instance_activate = True + test = '%s:3128' % ADRESSE_IP_SERVICE_PROXY[idx] + if NOMBRE_INTERFACES == 0: + desc1 = 'Filtrage web' + desc2 = 'eth0' + else: + desc1 = 'Filtrage web sur %s' % NOM_MACHINE_ETH[idx] + desc2 = 'eth' + str(idx + 1) + break + if instance_activate: + from zephir.monitor.agents.services import TCPServices + AGENTS.append(TCPServices('dans%s' % INSTANCE, {test:desc1}, period=115, container_ip=CONTAINER_IP_PROXY, + description="Etat du service {0} sur {1}".format(prct_name, desc2))) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/zephir/monitor/configs/services/23_dans3.srv b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/zephir/monitor/configs/services/23_dans3.srv new file mode 100644 index 0000000000000000000000000000000000000000..e2cec9870e5f1f5575b4e584b91bd52b9c573ecf --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/zephir/monitor/configs/services/23_dans3.srv @@ -0,0 +1,17 @@ +# -*- coding: UTF-8 -*- +""" +Surveillance du service Dansguardian (instance 3) +""" +from zephir.monitor.agentmanager.config import ACTIVER_SQUID2, CONTAINER_IP_PROXY, \ + ADRESSE_IP_SERVICE_PROXY, DANSGUARDIAN_PORT3, NOM_MACHINE_PROXY, \ + INTERFACE_PROXY, ACTIVER_FILTRAGE_PROXY + + +if ACTIVER_SQUID2 and ACTIVER_FILTRAGE_PROXY: + prct_name = 'e2guardian' + test = '%s:%s' % (ADRESSE_IP_SERVICE_PROXY[0], DANSGUARDIAN_PORT3) + desc1 = 'Filtrage web (instance 3) sur %s' % NOM_MACHINE_PROXY + desc2 = 'eth' + INTERFACE_PROXY + from zephir.monitor.agents.services import TCPServices + AGENTS.append(TCPServices('dans3', {test:desc1}, period=115, container_ip=CONTAINER_IP_PROXY, + description="Etat du service {0} (instance 3) sur {1}".format(prct_name, desc2))) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/zephir/monitor/configs/squid.agent b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/zephir/monitor/configs/squid.agent new file mode 100644 index 0000000000000000000000000000000000000000..e78d5893a097093070793513d51313d3ae2d6bbe --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/zephir/monitor/configs/squid.agent @@ -0,0 +1,63 @@ +# -*- coding: UTF-8 -*- +""" +Exemple de fichier de config d'agent. + +Importer le(s) module(s) d'implémentatoin des agents utilisés, puis +créer un dico {nom: agent} dans la variable globale AGENTS. Chaque +agent est créé en appelant son constructeur python et en passant les +paramètres utiles. +""" + +from zephir.monitor.agents.squid import Squid + +# éventuellement un peu de code pour décider des paramètres +# dynamiquement... +period = 120 + +datasources = [{'name': "inko", 'min_bound': 0, 'ds_type': 'COUNTER'}, + {'name': "outko", 'min_bound': 0, 'ds_type': 'COUNTER'}, + {'name': "server", 'min_bound': 0}, + {'name': "client", 'min_bound': 0}, + {'name': "hitsratio", 'min_bound': 0, 'max_bound': 100}, + {'name': "bytesratio", 'min_bound': 0, 'max_bound': 100} + ] +archives = [{'rows':60, 'steps':1}, + {'rows':24*4, 'steps':900/period}, + {'rows':24*7, 'steps':3600/period} + ] +graphs = [{ 'pngname': "http.png", + 'vnamedefs': {"entree": ("inko", 'AVERAGE'), + "sortie": ("outko", 'AVERAGE'), + }, + 'options': ["-l0", '-v koctets/s', '-t Entrees/Sorties HTTP', + 'AREA:sortie#0000FF:Sortie', + 'LINE2:entree#00FF00:Entree' + ]}, + { 'pngname': "ratio.png", + 'vnamedefs': {"hits": ("hitsratio", 'AVERAGE'), + "bytes": ("bytesratio", 'AVERAGE'), + }, + 'options': ["-u100", "-l0", '-v %', '-t Taux de reussite du cache', + 'AREA:hits#FF0000:Hit ratio', + 'LINE2:bytes#0000FF:Byte ratio' + ]}, + { 'pngname': "request.png", + 'vnamedefs': {"server": ("server", 'AVERAGE'), + "client": ("client", 'AVERAGE'), + }, + 'options': ["-l0", '-v req/s', '-t Requetes', + 'AREA:client#0000FF:Clients (demandes)', + 'LINE2:server#FF0000:Serveurs (reponses hors cache)' + ]}, + ] + +squid = Squid( + "squid-stats", period=period, + description = """Statistiques Squid""", + section = """Utilisation""", + datasources = datasources, + archives = archives, + graphs = graphs, + requires = ['squid']) +# liste des agents qui seront chargés +AGENTS = [squid] diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/zephir/monitor/configs/squid2.agent b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/zephir/monitor/configs/squid2.agent new file mode 100644 index 0000000000000000000000000000000000000000..869b5c2f34bab29d4d18feadec2f2b8061d6aa34 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/files/usr/share/zephir/monitor/configs/squid2.agent @@ -0,0 +1,70 @@ +# -*- coding: UTF-8 -*- +""" +Exemple de fichier de config d'agent. + +Importer le(s) module(s) d'implémentatoin des agents utilisés, puis +créer un dico {nom: agent} dans la variable globale AGENTS. Chaque +agent est créé en appelant son constructeur python et en passant les +paramètres utiles. +""" + +from zephir.monitor.agents.squid import Squid +from zephir.monitor.agentmanager.config import ACTIVER_SQUID2 + +# éventuellement un peu de code pour décider des paramètres +# dynamiquement... +period = 120 + +if ACTIVER_SQUID2: + + datasources = [{'name': "inko", 'min_bound': 0, 'ds_type': 'COUNTER'}, + {'name': "outko", 'min_bound': 0, 'ds_type': 'COUNTER'}, + {'name': "server", 'min_bound': 0}, + {'name': "client", 'min_bound': 0}, + {'name': "hitsratio", 'min_bound': 0, 'max_bound': 100}, + {'name': "bytesratio", 'min_bound': 0, 'max_bound': 100} + ] + archives = [{'rows':60, 'steps':1}, + {'rows':24*4, 'steps':900/period}, + {'rows':24*7, 'steps':3600/period} + ] + graphs = [{ 'pngname': "http.png", + 'vnamedefs': {"entree": ("inko", 'AVERAGE'), + "sortie": ("outko", 'AVERAGE'), + }, + 'options': ["-l0", '-v koctets/s', '-t Entrees/Sorties HTTP', + 'AREA:sortie#0000FF:Sortie', + 'LINE2:entree#00FF00:Entree' + ]}, + { 'pngname': "ratio.png", + 'vnamedefs': {"hits": ("hitsratio", 'AVERAGE'), + "bytes": ("bytesratio", 'AVERAGE'), + }, + 'options': ["-u100", "-l0", '-v %', '-t Taux de reussite du cache', + 'AREA:hits#FF0000:Hit ratio', + 'LINE2:bytes#0000FF:Byte ratio' + ]}, + { 'pngname': "request.png", + 'vnamedefs': {"server": ("server", 'AVERAGE'), + "client": ("client", 'AVERAGE'), + }, + 'options': ["-l0", '-v req/s', '-t Requetes', + 'AREA:client#0000FF:Clients (demandes)', + 'LINE2:server#FF0000:Serveurs (reponses hors cache)' + ]}, + ] + + squid = Squid( + "squid2-stats", period=period, + snmp_port = '3402', + description = """Statistiques Squid2""", + section = """Utilisation""", + datasources = datasources, + archives = archives, + graphs = graphs, + requires = ['squid']) + # liste des agents qui seront chargés + AGENTS = [squid] + +else: + AGENTS = [] diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/postservices/00-proxy b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/postservices/00-proxy new file mode 100644 index 0000000000000000000000000000000000000000..78e2ba0fd93ac45ce27c7a9a688de518cd898ea2 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/postservices/00-proxy @@ -0,0 +1,21 @@ +#!/bin/bash +if [ "$1" = "instance" ];then + . /usr/lib/eole/ihm.sh + #enregistrement au domaine dans le cas du NTLM + if [[ "$(CreoleGet type_squid_auth aucun)" =~ 'NTLM' ]]; then + Question_ouinon "Voulez-vous (ré)intégrer le serveur au domaine maintenant ?" "True" "oui" + if [ $? -eq 0 ];then + /usr/share/eole/sbin/enregistrement_domaine.sh + [ $? -ne 0 ] && exit 1 + fi + fi + echo + if [ $(CreoleGet activer_filtrage_proxy) = 'oui' ];then + Question_ouinon "Voulez-vous mettre à jour les bases de filtrage maintenant ?" 'True' "oui" + if [ $? -eq 0 ];then + /usr/share/eole/sbin/Maj-blacklist.sh + fi + echo + fi +fi +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/posttemplates/00-guardian b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/posttemplates/00-guardian new file mode 100644 index 0000000000000000000000000000000000000000..1535a7c3993d350d68da9428b47410c42d6c4e40 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/posttemplates/00-guardian @@ -0,0 +1,77 @@ +#!/bin/bash + +container_path_proxy=$(CreoleGet container_path_proxy) +activer_filtrage_proxy=$(CreoleGet activer_filtrage_proxy) +proxyuser="proxy" +proxygroup="proxy" + +rm -f /etc/logrotate.d/e2guardian + +## DANSGUARDIAN ## +if [ $activer_filtrage_proxy = 'oui' ];then + set -e + + danspath="/usr/share/eole/dansguardian" + # mise à niveau de la configuration + for zone in 0 1 2 + do + if [ "$(CreoleGet dans_instance_$((zone+1))_active)" = "oui" ]; then + rm -f /etc/amon_ifaces.dat + DANS_ETC="$container_path_proxy/etc/guardian/guardian$zone" + DANS_BLACK="$container_path_proxy/var/lib/blacklists/dansguardian$zone" + for dir in downloadmanagers authplugins lists + do + cp -a "$danspath/$dir" "$DANS_ETC/" + done + mkdir -p "$DANS_BLACK/common" + for filename in spusers users hosts filtergroupslist urls ipgroupslist domains_acad urls_acad + do + touch $DANS_BLACK/common/$filename + done + for pol in 1 3 4 5 6 7 8 + do + mkdir -p $DANS_BLACK/f$pol + for filename in whites domains types_mime extensions + do + touch $DANS_BLACK/f$pol/$filename + done + # + mkdir -p "$DANS_ETC/listsf$pol" + cp -a "$danspath/templates/"* "$DANS_ETC/listsf$pol" + [ "$pol" = "4" ] && cp -f "$danspath/whitelist_templates/"* "$DANS_ETC/listsf$pol" + [ "$pol" = "3" ] && cp -f "$danspath/interdit_templates/"* "$DANS_ETC/listsf$pol" + to_sed=$(find $DANS_ETC/listsf$pol/ -type 'f') + sed -e "s/\$s/$pol/g" -e "s/\$z/$zone/g" -i $to_sed + cp -a "$danspath/lists/"* "$DANS_ETC/listsf$pol" + done + #whitelist and other + for pol in 1 3 5 6 7 8 + do + for filename in bannedsitelist bannedurllist + do + mkdir -p $DANS_BLACK/f$pol + [ ! -f "$DANS_BLACK/f$pol/$filename" ] && cp -f "$danspath/local_templates/$filename" "$DANS_BLACK/f$pol/$filename" + done + done + #add only for whitelist + pol=4 + for filename in site_liste_blanche url_liste_blanche exceptionsitelist exceptionurllist + do + touch $DANS_BLACK/f$pol/$filename + done + + #répertoire de cache (#14035) + for rep in $(CreoleGet dans_cachedir$((zone+1))) + do + if [[ ! -d ${container_path_proxy}/${rep} ]] + then + mkdir -p ${container_path_proxy}/${rep} + CreoleRun "chown -R ${proxyuser}:${proxygroup} ${rep}" proxy + fi + done + fi + done + $danspath/init_dans.py + set +e +fi +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/posttemplates/00-squid b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/posttemplates/00-squid new file mode 100644 index 0000000000000000000000000000000000000000..451fa10580015a92530bf52d18be501683f5542e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/posttemplates/00-squid @@ -0,0 +1,18 @@ +#!/bin/bash + +container_path_proxy=$(CreoleGet container_path_proxy) +activer_filtrage_proxy=$(CreoleGet activer_filtrage_proxy) + +# Répertoires de cache pour les 2 instances de squid (#6864, #16749) +for cache_dir in $(CreoleGet cache_dir) $(CreoleGet cache_dir_2 '');do + if [ ! -d $container_path_proxy$cache_dir ];then + mkdir -p $container_path_proxy$cache_dir + CreoleRun "chown proxy.proxy $cache_dir" proxy + fi +done + +# Peuplement des répertoires de cache +CreoleRun "squid -f /etc/squid/squid.conf -z 2>/dev/null" proxy +CreoleRun "squid -f /etc/squid/squid2.conf -z 2>/dev/null" proxy + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/pretemplates/00-proxy b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/pretemplates/00-proxy new file mode 100644 index 0000000000000000000000000000000000000000..cc326dae108ed44c04858c82ccad699107d99889 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/pretemplates/00-proxy @@ -0,0 +1,72 @@ +#!/bin/bash + +container_path_proxy=$(CreoleGet container_path_proxy) +mode_conteneur_actif=$(CreoleGet mode_conteneur_actif) +activer_filtrage_proxy=$(CreoleGet activer_filtrage_proxy) +squid_nopeerproxy_url_regex=$(CreoleGet squid_nopeerproxy_url_regex) +SQUID_PATH="$container_path_proxy/etc/squid" + +## SQUID ## +touch "$SQUID_PATH/domaines_noauth_user" +touch "$SQUID_PATH/domaines_nocache_user" +touch "$SQUID_PATH/src_noauth_user" +touch "$SQUID_PATH/src_nocache_user" +touch "$SQUID_PATH/domaines_noauth_acad" +touch "$SQUID_PATH/domaines_nocache_acad" +touch "$SQUID_PATH/src_noauth_acad" +touch "$SQUID_PATH/src_nocache_acad" +touch "$SQUID_PATH/users" +touch "$SQUID_PATH/domaines_nopeerproxy_regex" +if [ ! -f "$SQUID_PATH/src_noauth" ];then + echo "127.0.0.1" > "$SQUID_PATH/src_noauth" +fi +if [ ! -f "$SQUID_PATH/src_nocache" ];then + echo "127.0.0.1" > "$SQUID_PATH/src_nocache" +fi +if [ ! -f "$SQUID_PATH/domaines_nopeerproxy" ];then + echo "127.0.0.1" > "$SQUID_PATH/domaines_nopeerproxy" +fi + +# correction des droits sur winbindd_privileged (#13740) +mkdir -p "$container_path_proxy/var/lib/samba/winbindd_privileged" +chmod 0750 "$container_path_proxy/var/lib/samba/winbindd_privileged" +CreoleRun "chgrp proxy /var/lib/samba/winbindd_privileged" proxy + +LOG_SQUID=/var/log/squid + +if [ "$mode_conteneur_actif" = "oui" ]; then + #remonter des logs en mode conteneur + if [ ! -L $LOG_SQUID ]; then + rm -rf $LOG_SQUID + ln -s $container_path_proxy$LOG_SQUID $LOG_SQUID + fi +fi + + +## GUARDIAN ## +if [ $activer_filtrage_proxy = 'oui' ]; then + set -e + # /!\ ne pas supprimer /etc/guardian/languages /!\ + rm -rf "$container_path_proxy/etc/guardian/guardian"* + rm -rf "$container_path_proxy/etc/guardian/authplugins" + rm -rf "$container_path_proxy/etc/guardian/contentscanners" + rm -rf "$container_path_proxy/etc/guardian/downloadmanagers" + rm -rf "$container_path_proxy/etc/guardian/lists" +fi + +## LIGHTSQUID ## +# mise à disposition de lightsquid +if ! [ -d /var/www/html ];then + mkdir -p /var/www/html +fi +ln -nsf /usr/share/lightsquid /var/www/html/ + +# déplacement des statistiques dans /var/log +OLD_REPORTS="/var/www/html/lightsquid/report" +NEW_REPORTS="/var/log/lightsquid/reports" +[ ! -d "$NEW_REPORTS" ] && mkdir -p "$NEW_REPORTS" +if [ -d "${OLD_REPORTS}" ] +then + rsync -r ${OLD_REPORTS}/ ${NEW_REPORTS} + rm -rf "$OLD_REPORTS" +fi diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/pretemplates/00-upgrade-eth b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/pretemplates/00-upgrade-eth new file mode 100644 index 0000000000000000000000000000000000000000..ba0e659d7ba06522e1a5a1fce5f05d7be12b1dca --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/pretemplates/00-upgrade-eth @@ -0,0 +1,35 @@ +#!/bin/bash + +# Correction des fichiers de règles +# contenant des anciens noms d'interface + +# ne rien faire si les noms d'interface n'ont pas changé +[ $(CreoleGet nom_zone_eth0) = 'eth0' ] && exit 0 + +RULES_PATH=/usr/share/ead2/backend/tmp +RULES_FILES="dest_interdites horaire_ip ipset_group poste_all" + +GenExp() +{ + # Génération des expressions rationnelles pour le sed + nombre_interfaces=$(CreoleGet nombre_interfaces) + for INT in `seq 1 $[nombre_interfaces-1]`; do + EXP="${EXP}s/#eth$INT$/#$(CreoleGet nom_zone_eth$INT)/g;" + done +} + +for ZONE in 0 1 2; do + for FILE in $RULES_FILES;do + FNAME="$RULES_PATH/$FILE$ZONE.txt" + if [ -f $FNAME ];then + grep -q "#eth[0-4]$" $FNAME + if [ $? -eq 0 ];then + echo "* mise à jour du fichier $FNAME" + [ -z $EXP ] && GenExp + sed -i.bak "${EXP}" $FNAME + fi + fi + done +done + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..9e3aaf029ae5835effd4f326a51b6c36ec90178f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/service.yml @@ -0,0 +1,711 @@ +format: '0.1' +name: eole-proxy +version: |- + 2.7.1-1 +description: |- + Templates et dictionnaires pour le Proxy + Services proxy et filtrage web basés sur Squid et DansGuardian + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: + - eole-cntlm + - eole-wpad +packages: + - eole-amon-backend + - lightsquid + - snmp + - xz-utils +dictionaries: + - 22_logs_proxy.xml + - 23_proxy.xml + - 24_proxy_parent.xml +extra_dictionaries: + schedule: + - 01_majblacklist.xml + - 02_purgecache.xml +templates: + - 01inc-squid.conf + - 01squid.conf + - 02inc-squid.conf + - 02squid.conf + - amon.cfg + - common-squid1.conf + - common-squid2.conf + - domaines_noauth + - domaines_nocache + - guardian-bannediplist + - guardian-clamdscan-filtre1.conf + - guardian-clamdscan-filtre2.conf + - guardian-clamdscan-filtre3.conf + - guardian-clamdscan.conf + - guardian-exceptioniplist + - guardian-fancy-filtre1.conf + - guardian-fancy-filtre2.conf + - guardian-fancy-filtre3.conf + - guardian-fancy.conf + - guardian-filtergroupslist + - guardian-filtergroupslist-filtre1 + - guardian-filtergroupslist-filtre2 + - guardian-filtergroupslist-filtre3 + - guardian-filtre1.conf + - guardian-filtre2.conf + - guardian-filtre3.conf + - guardian-ip-filtre1.conf + - guardian-ip-filtre2.conf + - guardian-ip-filtre3.conf + - guardian-ip.conf + - guardian-template-liste_blanche.html + - guardian-template-moderateur.html + - guardian-template-nginx.html + - guardian-template-utilisateur_interdits.html + - guardian-template.html + - guardian.conf + - guardian.logrotate + - guardian1.conf + - guardian2.conf + - guardian3.conf + - guardianf.conf + - guardianf1-filtre1.conf + - guardianf1-filtre2.conf + - guardianf1-filtre3.conf + - guardianf1.conf + - guardianf2-filtre1.conf + - guardianf2-filtre2.conf + - guardianf2-filtre3.conf + - guardianf2.conf + - guardianf3-filtre1.conf + - guardianf3-filtre2.conf + - guardianf3-filtre3.conf + - guardianf3.conf + - guardianf4-filtre1.conf + - guardianf4-filtre2.conf + - guardianf4-filtre3.conf + - guardianf4.conf + - guardianf5-filtre1.conf + - guardianf5-filtre2.conf + - guardianf5-filtre3.conf + - guardianf5.conf + - guardianf6-filtre1.conf + - guardianf6-filtre2.conf + - guardianf6-filtre3.conf + - guardianf6.conf + - guardianf7-filtre1.conf + - guardianf7-filtre2.conf + - guardianf7-filtre3.conf + - guardianf7.conf + - guardianf8-filtre1.conf + - guardianf8-filtre2.conf + - guardianf8-filtre3.conf + - guardianf8.conf + - guardianfX.conf + - krb5.conf + - lightsquid.cfg + - lmhosts + - nsswitch-proxy_auth.conf + - perm_proxy.ini + - rsyslog_aggregation_dansguardian.conf + - rsyslog_aggregation_squid.conf + - rsyslog_traps_dansguardian.conf + - rsyslog_traps_squid.conf + - smb-proxy_auth.conf + - squid.logrotate + - squid.pam + - winbind.logrotate +creole_funcs: [] +preservices: [] +postservices: + - 00-proxy +pretemplates: + - 00-proxy + - 00-upgrade-eth +posttemplates: + - 00-guardian + - 00-squid +files: + /etc/bareos/bareosfichiers.d/proxy.conf: + owner: root + group: root + mode: '0644' + /usr/share/ead2/backend/config/actions/actions_proxy.cfg: + owner: root + group: root + mode: '0644' + /usr/share/ead2/backend/config/filtres-opt: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/authplugins/ident.conf: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/authplugins/proxy-basic.conf: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/authplugins/proxy-ntlm.conf: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/contentscanners/clamdscan.conf: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/downloadmanagers/default.conf: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/init_dans.py: + owner: root + group: root + mode: '0755' + /usr/share/eole/dansguardian/interdit_templates/bannedsitelist: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/authplugins/ipgroups: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/blacklists/ads/domains: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/blacklists/ads/domains.processed: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/blacklists/ads/urls: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/contentscanners/exceptionvirusextensionlist: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/contentscanners/exceptionvirusmimetypelist: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/contentscanners/exceptionvirussitelist: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/contentscanners/exceptionvirusurllist: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/downloadmanagers/managedextensionlist: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/downloadmanagers/managedmimetypelist: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/badwords/weighted_dutch: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/badwords/weighted_french: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/badwords/weighted_german: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/badwords/weighted_portuguese: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/badwords/weighted_spanish: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/chat/weighted: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/chat/weighted_italian: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/drugadvocacy/weighted: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/gambling/banned: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/gambling/banned_portuguese: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/gambling/weighted: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/gambling/weighted_portuguese: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/games/weighted: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/goodphrases/exception: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/goodphrases/exception_email: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/goodphrases/weighted_general: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/goodphrases/weighted_general_danish: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/goodphrases/weighted_general_dutch: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/goodphrases/weighted_general_malay: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/goodphrases/weighted_general_portuguese: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/goodphrases/weighted_news: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/googlesearches/banned: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/gore/weighted: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/gore/weighted_portuguese: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/illegaldrugs/banned: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/illegaldrugs/weighted: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/illegaldrugs/weighted_portuguese: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/intolerance/banned_portuguese: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/intolerance/weighted: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/intolerance/weighted_portuguese: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/legaldrugs/weighted: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/malware/weighted: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/meta/weighted: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/news/weighted: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/nudism/weighted: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/peer2peer/weighted: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/personals/weighted: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/personals/weighted_portuguese: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/pornography/banned: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/pornography/banned_portuguese: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/pornography/weighted: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/pornography/weighted_chinese: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/pornography/weighted_danish: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/pornography/weighted_dutch: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/pornography/weighted_french: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/pornography/weighted_german: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/pornography/weighted_italian: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/pornography/weighted_japanese: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/pornography/weighted_malay: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/pornography/weighted_norgwegian: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/pornography/weighted_portuguese: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/pornography/weighted_russian: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/pornography/weighted_spanish: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/proxies/weighted: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/sport/weighted: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/violence/weighted: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/violence/weighted_portuguese: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/warezhacking/weighted: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/weapons/weighted: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/weapons/weighted_portuguese: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/lists/phraselists/webmail/weighted: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/local_templates/bannedsitelist: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/local_templates/bannedurllist: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/templates/anonregexplist: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/templates/bannedextensionlist: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/templates/bannedmimetypelist: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/templates/bannedphraselist: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/templates/bannedregexpheaderlist: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/templates/bannedregexpurllist: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/templates/bannedsitelist: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/templates/bannedsitelist_liste_blanche: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/templates/bannedsitelistwithbypass: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/templates/bannedurllist: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/templates/banneduserlist: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/templates/contentregexplist: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/templates/empty: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/templates/exceptionextensionlist: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/templates/exceptionfilesitelist: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/templates/exceptionfileurllist: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/templates/exceptionmimetypelist: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/templates/exceptionphraselist: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/templates/exceptionregexpurllist: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/templates/exceptionsitelist: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/templates/exceptionsitelist_liste_blanche: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/templates/exceptionurllist: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/templates/exceptionuserlist: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/templates/greyregexpurllist: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/templates/greysitelist: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/templates/greysitelist_liste_blanche: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/templates/greyurllist: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/templates/headerregexplist: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/templates/localbannedsitelist: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/templates/localbannedsslsitelist: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/templates/localbannedurllist: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/templates/localexceptionsitelist: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/templates/localexceptionurllist: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/templates/localgreysitelist: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/templates/localgreysslsitelist: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/templates/localgreyurllist: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/templates/pics: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/templates/pics.empty: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/templates/sslsiteregexplist: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/templates/urlregexplist: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/templates/weightedphraselist: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/templates/weightedphraselist.meta: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/whitelist_templates/bannedsitelist: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/whitelist_templates/bannedurllist: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/whitelist_templates/exceptionsitelist: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/whitelist_templates/exceptionurllist: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/whitelist_templates/greysitelist: + owner: root + group: root + mode: '0644' + /usr/share/eole/dansguardian/whitelist_templates/greyurllist: + owner: root + group: root + mode: '0644' + /usr/share/eole/diagnose/151-proxy: + owner: root + group: root + mode: '0755' + /usr/share/eole/sbin/Maj-blacklist.sh: + owner: root + group: root + mode: '0755' + /usr/share/eole/sbin/enregistrement_domaine.sh: + owner: root + group: root + mode: '0755' + /usr/share/eole/sbin/squid_logrotate.sh: + owner: root + group: root + mode: '0755' + /usr/share/eole/sbin/squid_parselogs.sh: + owner: root + group: root + mode: '0755' + /usr/share/eole/schedule/scripts/majblacklist: + owner: root + group: root + mode: '0755' + /usr/share/eole/schedule/scripts/purgecache: + owner: root + group: root + mode: '0755' + /usr/share/zephir/monitor/configs/dansguardian.agent: + owner: root + group: root + mode: '0644' + /usr/share/zephir/monitor/configs/services/22_squid.srv: + owner: root + group: root + mode: '0644' + /usr/share/zephir/monitor/configs/services/22_squid2.srv: + owner: root + group: root + mode: '0644' + /usr/share/zephir/monitor/configs/services/23_dans1.srv: + owner: root + group: root + mode: '0644' + /usr/share/zephir/monitor/configs/services/23_dans2.srv: + owner: root + group: root + mode: '0644' + /usr/share/zephir/monitor/configs/services/23_dans3.srv: + owner: root + group: root + mode: '0644' + /usr/share/zephir/monitor/configs/squid.agent: + owner: root + group: root + mode: '0644' + /usr/share/zephir/monitor/configs/squid2.agent: + owner: root + group: root + mode: '0644' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/01inc-squid.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/01inc-squid.conf new file mode 100644 index 0000000000000000000000000000000000000000..7198075c3511bbdf2fb26b2796966a852e1d60d1 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/01inc-squid.conf @@ -0,0 +1,53 @@ +%def activer_auth(%%interface, %%squid_auth_eth, %%nom_machine_eth, %%vlan_eth, %%alias_eth) + %if (%%activer_squid_auth == 'oui' and %%squid_auth_eth == 'non') or (%%activer_squid_auth == 'non') +http_access allow %%nom_machine_eth + %if %%vlan_eth == "oui" + %for %%vlans_iter in %%getVar('vlan_id_eth' + %%interface) +http_access allow vlan_eth%%{interface}_%%{vlans_iter} + %end for + %end if + %if %%alias_eth == "oui" + %for %%idx, %%val in %%enumerate(%%getVar('alias_ip_eth'+%%interface)) +http_access allow eth%%{interface}alias%%idx + %end for + %end if + %end if +%end def + +## pas d'authentification pour les interfaces +%if %%nombre_interfaces == '1' +%%activer_auth('0', 'oui', %%nom_machine, %%vlan_eth0, %%alias_eth0) +%end if + +%if %%nombre_interfaces >= "2" + %if not %%is_defined('squid_auth_eth1') + %set %%squid_auth_eth1 = 'non' + %end if +%%activer_auth('1', %%squid_auth_eth1, %%nom_machine_eth1, %%vlan_eth1, %%alias_eth1) +%end if + +%if %%nombre_interfaces >= "3" + %if not %%is_defined('squid_auth_eth2') + %set %%squid_auth_eth2 = 'non' + %end if +%%activer_auth('2', %%squid_auth_eth2, %%nom_machine_eth2, %%vlan_eth2, %%alias_eth2) +%end if + +%if %%nombre_interfaces >= "4" + %if not %%is_defined('squid_auth_eth3') + %set %%squid_auth_eth3 = 'non' + %end if +%%activer_auth('3', %%squid_auth_eth3, %%nom_machine_eth3, %%vlan_eth3, %%alias_eth3) +%end if + +%if %%nombre_interfaces == "5" + %if not %%is_defined('squid_auth_eth4') + %set %%squid_auth_eth4 = 'non' + %end if +%%activer_auth('4', %%squid_auth_eth4, %%nom_machine_eth4, %%vlan_eth4, %%alias_eth4) +%end if + +## authentification +%if %%activer_squid_auth == 'oui' +http_access allow password +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/01squid.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/01squid.conf new file mode 100644 index 0000000000000000000000000000000000000000..59fb96a145eaf51d7983c40e21b40d4eb4786ad5 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/01squid.conf @@ -0,0 +1,1014 @@ +# WELCOME TO SQUID 3.1.4 +# ---------------------------- +# +# This is the default Squid configuration file. You may wish +# to look at the Squid home page (http://www.squid-cache.org/) +# for the FAQ and other documentation. +# +# The default Squid config file shows what the defaults for +# various options happen to be. If you don't need to change the +# default, you shouldn't uncomment the line. Doing so may cause +# run-time problems. In some cases "none" refers to no default +# setting at all, while in other cases it refers to a valid +# option - the comments for that keyword indicate if this is the +# case. +# + +# Configuration options can be included using the "include" directive. +# Include takes a list of files to include. Quoting and wildcards is +# supported. +# +# For example, +# +# include /path/to/included/file/squid.acl.config +# +# Includes can be nested up to a hard-coded depth of 16 levels. +# This arbitrary restriction is to prevent recursive include references +# from causing Squid entering an infinite loop whilst trying to load +# configuration files. + +# OPTIONS FOR AUTHENTICATION +# ----------------------------------------------------------------------------- + +# TAG: auth_param +# This is used to define parameters for the various authentication +# schemes supported by Squid. +# +# format: auth_param scheme parameter [setting] +# +# The order in which authentication schemes are presented to the client is +# dependent on the order the scheme first appears in config file. IE +# has a bug (it's not RFC 2617 compliant) in that it will use the basic +# scheme if basic is the first entry presented, even if more secure +# schemes are presented. For now use the order in the recommended +# settings section below. If other browsers have difficulties (don't +# recognize the schemes offered even if you are using basic) either +# put basic first, or disable the other schemes (by commenting out their +# program entry). +# +# Once an authentication scheme is fully configured, it can only be +# shutdown by shutting squid down and restarting. Changes can be made on +# the fly and activated with a reconfigure. I.E. You can change to a +# different helper, but not unconfigure the helper completely. +# +# Please note that while this directive defines how Squid processes +# authentication it does not automatically activate authentication. +# To use authentication you must in addition make use of ACLs based +# on login name in http_access (proxy_auth, proxy_auth_regex or +# external with %LOGIN used in the format tag). The browser will be +# challenged for authentication on the first such acl encountered +# in http_access processing and will also be re-challenged for new +# login credentials if the request is being denied by a proxy_auth +# type acl. +# +# WARNING: authentication can't be used in a transparently intercepting +# proxy as the client then thinks it is talking to an origin server and +# not the proxy. This is a limitation of bending the TCP/IP protocol to +# transparently intercepting port 80, not a limitation in Squid. +# Ports flagged 'transparent', 'intercept', or 'tproxy' have +# authentication disabled. +# +# === Parameters for the basic scheme follow. === +# +# "program" cmdline +# Specify the command for the external authenticator. Such a program +# reads a line containing "username password" and replies "OK" or +# "ERR" in an endless loop. "ERR" responses may optionally be followed +# by a error description available as %m in the returned error page. +# If you use an authenticator, make sure you have 1 acl of type +# proxy_auth. +# +# By default, the basic authentication scheme is not used unless a +# program is specified. +# +# If you want to use the traditional NCSA proxy authentication, set +# this line to something like +# +# auth_param basic program /usr/lib/squid/ncsa_auth /usr/etc/passwd +# +# "utf8" on|off +# HTTP uses iso-latin-1 as characterset, while some authentication +# backends such as LDAP expects UTF-8. If this is set to on Squid will +# translate the HTTP iso-latin-1 charset to UTF-8 before sending the +# username & password to the helper. +# +# "children" numberofchildren +# The number of authenticator processes to spawn. If you start too few +# Squid will have to wait for them to process a backlog of credential +# verifications, slowing it down. When password verifications are +# done via a (slow) network you are likely to need lots of +# authenticator processes. +# auth_param basic children 5 +# +# "concurrency" concurrency +# The number of concurrent requests the helper can process. +# The default of 0 is used for helpers who only supports +# one request at a time. Setting this changes the protocol used to +# include a channel number first on the request/response line, allowing +# multiple requests to be sent to the same helper in parallell without +# wating for the response. +# Must not be set unless it's known the helper supports this. +# auth_param basic concurrency 0 +# +# "realm" realmstring +# Specifies the realm name which is to be reported to the +# client for the basic proxy authentication scheme (part of +# the text the user will see when prompted their username and +# password). There is no default. +# auth_param basic realm Squid proxy-caching web server +# +# "credentialsttl" timetolive +# Specifies how long squid assumes an externally validated +# username:password pair is valid for - in other words how +# often the helper program is called for that user. Set this +# low to force revalidation with short lived passwords. Note +# setting this high does not impact your susceptibility +# to replay attacks unless you are using an one-time password +# system (such as SecureID). If you are using such a system, +# you will be vulnerable to replay attacks unless you also +# use the max_user_ip ACL in an http_access rule. +# +# "casesensitive" on|off +# Specifies if usernames are case sensitive. Most user databases are +# case insensitive allowing the same username to be spelled using both +# lower and upper case letters, but some are case sensitive. This +# makes a big difference for user_max_ip ACL processing and similar. +# auth_param basic casesensitive off +# +# === Parameters for the digest scheme follow === +# +# "program" cmdline +# Specify the command for the external authenticator. Such +# a program reads a line containing "username":"realm" and +# replies with the appropriate H(A1) value hex encoded or +# ERR if the user (or his H(A1) hash) does not exists. +# See rfc 2616 for the definition of H(A1). +# "ERR" responses may optionally be followed by a error description +# available as %m in the returned error page. +# +# By default, the digest authentication scheme is not used unless a +# program is specified. +# +# If you want to use a digest authenticator, set this line to +# something like +# +# auth_param digest program /usr/lib/squid/digest_pw_auth /usr/etc/digpass +# +# "utf8" on|off +# HTTP uses iso-latin-1 as characterset, while some authentication +# backends such as LDAP expects UTF-8. If this is set to on Squid will +# translate the HTTP iso-latin-1 charset to UTF-8 before sending the +# username & password to the helper. +# +# "children" numberofchildren +# The number of authenticator processes to spawn (no default). +# If you start too few Squid will have to wait for them to +# process a backlog of H(A1) calculations, slowing it down. +# When the H(A1) calculations are done via a (slow) network +# you are likely to need lots of authenticator processes. +# auth_param digest children 5 +# +# "realm" realmstring +# Specifies the realm name which is to be reported to the +# client for the digest proxy authentication scheme (part of +# the text the user will see when prompted their username and +# password). There is no default. +# auth_param digest realm Squid proxy-caching web server +# +# "nonce_garbage_interval" timeinterval +# Specifies the interval that nonces that have been issued +# to client_agent's are checked for validity. +# +# "nonce_max_duration" timeinterval +# Specifies the maximum length of time a given nonce will be +# valid for. +# +# "nonce_max_count" number +# Specifies the maximum number of times a given nonce can be +# used. +# +# "nonce_strictness" on|off +# Determines if squid requires strict increment-by-1 behavior +# for nonce counts, or just incrementing (off - for use when +# useragents generate nonce counts that occasionally miss 1 +# (ie, 1,2,4,6)). Default off. +# +# "check_nonce_count" on|off +# This directive if set to off can disable the nonce count check +# completely to work around buggy digest qop implementations in +# certain mainstream browser versions. Default on to check the +# nonce count to protect from authentication replay attacks. +# +# "post_workaround" on|off +# This is a workaround to certain buggy browsers who sends +# an incorrect request digest in POST requests when reusing +# the same nonce as acquired earlier on a GET request. +# +# === NTLM scheme options follow === +# +# "program" cmdline +# Specify the command for the external NTLM authenticator. +# Such a program reads exchanged NTLMSSP packets with +# the browser via Squid until authentication is completed. +# If you use an NTLM authenticator, make sure you have 1 acl +# of type proxy_auth. By default, the NTLM authenticator_program +# is not used. +# +# auth_param ntlm program /usr/lib/squid/ntlm_auth +# +# "children" numberofchildren +# The number of authenticator processes to spawn (no default). +# If you start too few Squid will have to wait for them to +# process a backlog of credential verifications, slowing it +# down. When credential verifications are done via a (slow) +# network you are likely to need lots of authenticator +# processes. +# +# auth_param ntlm children 5 +# +# "keep_alive" on|off +# If you experience problems with PUT/POST requests when using the +# Negotiate authentication scheme then you can try setting this to +# off. This will cause Squid to forcibly close the connection on +# the initial requests where the browser asks which schemes are +# supported by the proxy. +# +# auth_param ntlm keep_alive on +# +# === Options for configuring the NEGOTIATE auth-scheme follow === +# +# "program" cmdline +# Specify the command for the external Negotiate authenticator. +# This protocol is used in Microsoft Active-Directory enabled setups with +# the Microsoft Internet Explorer or Mozilla Firefox browsers. +# Its main purpose is to exchange credentials with the Squid proxy +# using the Kerberos mechanisms. +# If you use a Negotiate authenticator, make sure you have at least +# one acl of type proxy_auth active. By default, the negotiate +# authenticator_program is not used. +# The only supported program for this role is the ntlm_auth +# program distributed as part of Samba, version 4 or later. +# +# auth_param negotiate program /usr/lib/squid/ntlm_auth --helper-protocol=gss-spnego +# +# "children" numberofchildren +# The number of authenticator processes to spawn (no default). +# If you start too few Squid will have to wait for them to +# process a backlog of credential verifications, slowing it +# down. When crendential verifications are done via a (slow) +# network you are likely to need lots of authenticator +# processes. +# auth_param negotiate children 5 +# +# "keep_alive" on|off +# If you experience problems with PUT/POST requests when using the +# Negotiate authentication scheme then you can try setting this to +# off. This will cause Squid to forcibly close the connection on +# the initial requests where the browser asks which schemes are +# supported by the proxy. +# +# auth_param negotiate keep_alive on +# +# +# Examples: +# +##Recommended minimum configuration per scheme: +##auth_param negotiate program <uncomment and complete this line to activate> +##auth_param negotiate children 5 +##auth_param negotiate keep_alive on +## +##auth_param ntlm program <uncomment and complete this line to activate> +##auth_param ntlm children 5 +##auth_param ntlm keep_alive on +## +##auth_param digest program <uncomment and complete this line> +##auth_param digest children 5 +##auth_param digest realm Squid proxy-caching web server +##auth_param digest nonce_garbage_interval 5 minutes +##auth_param digest nonce_max_duration 30 minutes +##auth_param digest nonce_max_count 50 +## +##auth_param basic program <uncomment and complete this line> +##auth_param basic children 5 +##auth_param basic realm Squid proxy-caching web server +##auth_param basic credentialsttl 2 hours +#Default: +# none +%if %%activer_squid_auth == 'oui' + +%if %%type_squid_auth == 'Fichier local' +## mode fichier ## +auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/users +%end if + +%if %%type_squid_auth == 'Ldap' +## mode LDAP ## +auth_param basic program /usr/lib/squid/basic_ldap_auth -v 3 -b %%proxy_ldap_base_dn -f (&(uid=%s)) %slurp + %if %%is_empty(%%ip_serveur_ldap2) +ldap://%%ip_serveur_ldap1 + %else +ldap://%%ip_serveur_ldap1 ldap://%%ip_serveur_ldap2 + %end if +## +%end if + +%if %%type_squid_auth == 'Ldap (Active Directory)' +#auth_param basic program /usr/lib/squid/ldap_auth -v 3 dc=%%ldapad_base_dn -D cn=%%ldapad_user,cn=users,dc=%%ldapad_base_dn -w %%ldapad_passwd -f (&(sAMAccountName=%)) ldap://%%ip_serveur_ldapad +%set %%dc_base="dc="+",dc=".join(%%ldapad_base_dn.split('.')) + +auth_param basic program /usr/lib/squid/basic_ldap_auth -R -b "%%dc_base" -D "cn=%%ldapad_user,cn=users,%%dc_base" -w %%ldapad_passwd -f sAMAccountName=%s -h %%ip_serveur_ldapad +%end if + +%if %%type_squid_auth == 'NTLM/SMB' +## mode NTLM/SMB ## +auth_param ntlm program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp +auth_param ntlm children %%number_of_ntlm_children +## +%end if + +%if %%type_squid_auth == 'NTLM/KERBEROS' +auth_param ntlm program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp +auth_param ntlm children %%number_of_ntlm_children +#auth_param ntlm max_challenge_reuses 0 +#auth_param ntlm max_challenge_lifetime 2 minutes + +auth_param basic program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-basic +%end if + +auth_param basic children %%number_of_basic_children +%if %%type_squid_auth == 'NTLM/KERBEROS' +auth_param basic realm %%upper(%%nom_domaine_krb) +%else +auth_param basic realm Squid proxy-caching web server +%end if +auth_param basic credentialsttl 2 hours +auth_param basic casesensitive off + +%end if + + + +# TAG: authenticate_cache_garbage_interval +# The time period between garbage collection across the username cache. +# This is a tradeoff between memory utilization (long intervals - say +# 2 days) and CPU (short intervals - say 1 minute). Only change if you +# have good reason to. +#Default: +# authenticate_cache_garbage_interval 1 hour + +# TAG: authenticate_ttl +# The time a user & their credentials stay in the logged in +# user cache since their last request. When the garbage +# interval passes, all user credentials that have passed their +# TTL are removed from memory. +#Default: +# authenticate_ttl 1 hour + +# TAG: authenticate_ip_ttl +# If you use proxy authentication and the 'max_user_ip' ACL, +# this directive controls how long Squid remembers the IP +# addresses associated with each user. Use a small value +# (e.g., 60 seconds) if your users might change addresses +# quickly, as is the case with dialups. You might be safe +# using a larger value (e.g., 2 hours) in a corporate LAN +# environment with relatively static address assignments. +#Default: +# authenticate_ip_ttl 0 seconds + +# ACCESS CONTROLS +# ----------------------------------------------------------------------------- + +# TAG: external_acl_type +# This option defines external acl classes using a helper program +# to look up the status +# +# external_acl_type name [options] FORMAT.. /path/to/helper [helper arguments..] +# +# Options: +# +# ttl=n TTL in seconds for cached results (defaults to 3600 +# for 1 hour) +# negative_ttl=n +# TTL for cached negative lookups (default same +# as ttl) +# children=n Number of acl helper processes spawn to service +# external acl lookups of this type. (default 5) +# concurrency=n concurrency level per process. Only used with helpers +# capable of processing more than one query at a time. +# cache=n result cache size, 0 is unbounded (default) +# grace=n Percentage remaining of TTL where a refresh of a +# cached entry should be initiated without needing to +# wait for a new reply. (default 0 for no grace period) +# protocol=2.5 Compatibility mode for Squid-2.5 external acl helpers +# ipv4 / ipv6 IP-mode used to communicate to this helper. +# For compatability with older configurations and helpers +# the default is 'ipv4'. +# +# FORMAT specifications +# +# %LOGIN Authenticated user login name +# %EXT_USER Username from external acl +# %IDENT Ident user name +# %SRC Client IP +# %SRCPORT Client source port +# %URI Requested URI +# %DST Requested host +# %PROTO Requested protocol +# %PORT Requested port +# %PATH Requested URL path +# %METHOD Request method +# %MYADDR Squid interface address +# %MYPORT Squid http_port number +# %PATH Requested URL-path (including query-string if any) +# %USER_CERT SSL User certificate in PEM format +# %USER_CERTCHAIN SSL User certificate chain in PEM format +# %USER_CERT_xx SSL User certificate subject attribute xx +# %USER_CA_xx SSL User certificate issuer attribute xx +# +# %>{Header} HTTP request header "Header" +# %>{Hdr:member} +# HTTP request header "Hdr" list member "member" +# %>{Hdr:;member} +# HTTP request header list member using ; as +# list separator. ; can be any non-alphanumeric +# character. +# +# %<{Header} HTTP reply header "Header" +# %<{Hdr:member} +# HTTP reply header "Hdr" list member "member" +# %<{Hdr:;member} +# HTTP reply header list member using ; as +# list separator. ; can be any non-alphanumeric +# character. +# +# In addition to the above, any string specified in the referencing +# acl will also be included in the helper request line, after the +# specified formats (see the "acl external" directive) +# +# The helper receives lines per the above format specification, +# and returns lines starting with OK or ERR indicating the validity +# of the request and optionally followed by additional keywords with +# more details. +# +# General result syntax: +# +# OK/ERR keyword=value ... +# +# Defined keywords: +# +# user= The users name (login) +# password= The users password (for login= cache_peer option) +# message= Message describing the reason. Available as %o +# in error pages +# tag= Apply a tag to a request (for both ERR and OK results) +# Only sets a tag, does not alter existing tags. +# log= String to be logged in access.log. Available as +# %ea in logformat specifications +# +# If protocol=3.0 (the default) then URL escaping is used to protect +# each value in both requests and responses. +# +# If using protocol=2.5 then all values need to be enclosed in quotes +# if they may contain whitespace, or the whitespace escaped using \. +# And quotes or \ characters within the keyword value must be \ escaped. +# +# When using the concurrency= option the protocol is changed by +# introducing a query channel tag infront of the request/response. +# The query channel tag is a number between 0 and concurrency-1. +#Default: +# none + +# TAG: acl +# Defining an Access List +# +# Every access list definition must begin with an aclname and acltype, +# followed by either type-specific arguments or a quoted filename that +# they are read from. +# +# acl aclname acltype argument ... +# acl aclname acltype "file" ... +# +# When using "file", the file should contain one item per line. +# +# By default, regular expressions are CASE-SENSITIVE. To make +# them case-insensitive, use the -i option. +# +# Some acl types require suspending the current request in order +# to access some external data source. +# Those which do are marked with the tag [slow], those which +# don't are marked as [fast]. +# See http://wiki.squid-cache.org/SquidFaq/SquidAcl +# for further information +# +# ***** ACL TYPES AVAILABLE ***** +# +# acl aclname src ip-address/netmask ... # clients IP address [fast] +# acl aclname src addr1-addr2/netmask ... # range of addresses [fast] +# acl aclname dst ip-address/netmask ... # URL host's IP address [slow] +# acl aclname myip ip-address/netmask ... # local socket IP address [fast] +# +# acl aclname arp mac-address ... (xx:xx:xx:xx:xx:xx notation) +# # The arp ACL requires the special configure option --enable-arp-acl. +# # Furthermore, the ARP ACL code is not portable to all operating systems. +# # It works on Linux, Solaris, Windows, FreeBSD, and some +# # other *BSD variants. +# # [fast] +# # +# # NOTE: Squid can only determine the MAC address for clients that are on +# # the same subnet. If the client is on a different subnet, +# # then Squid cannot find out its MAC address. +# +# acl aclname srcdomain .foo.com ... +# # reverse lookup, from client IP [slow] +# acl aclname dstdomain .foo.com ... +# # Destination server from URL [fast] +# acl aclname srcdom_regex [-i] \.foo\.com ... +# # regex matching client name [slow] +# acl aclname dstdom_regex [-i] \.foo\.com ... +# # regex matching server [fast] +# # +# # For dstdomain and dstdom_regex a reverse lookup is tried if a IP +# # based URL is used and no match is found. The name "none" is used +# # if the reverse lookup fails. +# +# acl aclname src_as number ... +# acl aclname dst_as number ... +# # [fast] +# # Except for access control, AS numbers can be used for +# # routing of requests to specific caches. Here's an +# # example for routing all requests for AS#1241 and only +# # those to mycache.mydomain.net: +# # acl asexample dst_as 1241 +# # cache_peer_access mycache.mydomain.net allow asexample +# # cache_peer_access mycache_mydomain.net deny all +# +# acl aclname peername myPeer ... +# # [fast] +# # match against a named cache_peer entry +# # set unique name= on cache_peer lines for reliable use. +# +# acl aclname time [day-abbrevs] [h1:m1-h2:m2] +# # [fast] +# # day-abbrevs: +# # S - Sunday +# # M - Monday +# # T - Tuesday +# # W - Wednesday +# # H - Thursday +# # F - Friday +# # A - Saturday +# # h1:m1 must be less than h2:m2 +# +# acl aclname url_regex [-i] ^http:// ... +# # regex matching on whole URL [fast] +# acl aclname urlpath_regex [-i] \.gif$ ... +# # regex matching on URL path [fast] +# +# acl aclname port 80 70 21 0-1024... # destination TCP port [fast] +# # ranges are alloed +# acl aclname myport 3128 ... # local socket TCP port [fast] +# acl aclname myportname 3128 ... # http(s)_port name [fast] +# +# acl aclname proto HTTP FTP ... # request protocol [fast] +# +# acl aclname method GET POST ... # HTTP request method [fast] +# +# acl aclname http_status 200 301 500- 400-403 ... +# # status code in reply [fast] +# +# acl aclname browser [-i] regexp ... +# # pattern match on User-Agent header (see also req_header below) [fast] +# +# acl aclname referer_regex [-i] regexp ... +# # pattern match on Referer header [fast] +# # Referer is highly unreliable, so use with care +# +# acl aclname ident username ... +# acl aclname ident_regex [-i] pattern ... +# # string match on ident output [slow] +# # use REQUIRED to accept any non-null ident. +# +# acl aclname proxy_auth [-i] username ... +# acl aclname proxy_auth_regex [-i] pattern ... +# # perform http authentication challenge to the client and match against +# # supplied credentials [slow] +# # +# # takes a list of allowed usernames. +# # use REQUIRED to accept any valid username. +# # +# # Will use proxy authentication in forward-proxy scenarios, and plain +# # http authenticaiton in reverse-proxy scenarios +# # +# # NOTE: when a Proxy-Authentication header is sent but it is not +# # needed during ACL checking the username is NOT logged +# # in access.log. +# # +# # NOTE: proxy_auth requires a EXTERNAL authentication program +# # to check username/password combinations (see +# # auth_param directive). +# # +# # NOTE: proxy_auth can't be used in a transparent/intercepting proxy +# # as the browser needs to be configured for using a proxy in order +# # to respond to proxy authentication. +# +# acl aclname snmp_community string ... +# # A community string to limit access to your SNMP Agent [fast] +# # Example: +# # +# # acl snmppublic snmp_community public +# +# acl aclname maxconn number +# # This will be matched when the client's IP address has +# # more than <number> HTTP connections established. [fast] +# +# acl aclname max_user_ip [-s] number +# # This will be matched when the user attempts to log in from more +# # than <number> different ip addresses. The authenticate_ip_ttl +# # parameter controls the timeout on the ip entries. [fast] +# # If -s is specified the limit is strict, denying browsing +# # from any further IP addresses until the ttl has expired. Without +# # -s Squid will just annoy the user by "randomly" denying requests. +# # (the counter is reset each time the limit is reached and a +# # request is denied) +# # NOTE: in acceleration mode or where there is mesh of child proxies, +# # clients may appear to come from multiple addresses if they are +# # going through proxy farms, so a limit of 1 may cause user problems. +# +# acl aclname req_mime_type [-i] mime-type ... +# # regex match against the mime type of the request generated +# # by the client. Can be used to detect file upload or some +# # types HTTP tunneling requests [fast] +# # NOTE: This does NOT match the reply. You cannot use this +# # to match the returned file type. +# +# acl aclname req_header header-name [-i] any\.regex\.here +# # regex match against any of the known request headers. May be +# # thought of as a superset of "browser", "referer" and "mime-type" +# # ACL [fast] +# +# acl aclname rep_mime_type [-i] mime-type ... +# # regex match against the mime type of the reply received by +# # squid. Can be used to detect file download or some +# # types HTTP tunneling requests. [fast] +# # NOTE: This has no effect in http_access rules. It only has +# # effect in rules that affect the reply data stream such as +# # http_reply_access. +# +# acl aclname rep_header header-name [-i] any\.regex\.here +# # regex match against any of the known reply headers. May be +# # thought of as a superset of "browser", "referer" and "mime-type" +# # ACLs [fast] +# +# acl aclname external class_name [arguments...] +# # external ACL lookup via a helper class defined by the +# # external_acl_type directive [slow] +# +# acl aclname user_cert attribute values... +# # match against attributes in a user SSL certificate +# # attribute is one of DN/C/O/CN/L/ST [fast] +# +# acl aclname ca_cert attribute values... +# # match against attributes a users issuing CA SSL certificate +# # attribute is one of DN/C/O/CN/L/ST [fast] +# +# acl aclname ext_user username ... +# acl aclname ext_user_regex [-i] pattern ... +# # string match on username returned by external acl helper [slow] +# # use REQUIRED to accept any non-null user name. +# +# acl aclname tag tagvalue ... +# # string match on tag returned by external acl helper [slow] +# +# Examples: +# acl macaddress arp 09:00:2b:23:45:67 +# acl myexample dst_as 1241 +# acl password proxy_auth REQUIRED +# acl fileupload req_mime_type -i ^multipart/form-data$ +# acl javascript rep_mime_type -i ^application/x-javascript$ +# +#Default: +# acl all src all +# +# +# Recommended minimum configuration: +# +#acl manager proto cache_object +#acl localhost src 127.0.0.1/32 +#acl localhost src ::1/128 +#acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 +#acl to_localhost dst ::1/128 + +# Example rule allowing access from your local networks. +# Adapt to list your (internal) IP networks from where browsing +# should be allowed +#acl localnet src 10.0.0.0/8 # RFC1918 possible internal network +#acl localnet src 172.16.0.0/12 # RFC1918 possible internal network +#acl localnet src 192.168.0.0/16 # RFC1918 possible internal network +#acl localnet src fc00::/7 # RFC 4193 local private network range +#acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines + +#acl SSL_ports port 443 +#acl Safe_ports port 80 # http +#acl Safe_ports port 21 # ftp +#acl Safe_ports port 443 # https +#acl Safe_ports port 70 # gopher +#acl Safe_ports port 210 # wais +#acl Safe_ports port 1025-65535 # unregistered ports +#acl Safe_ports port 280 # http-mgmt +#acl Safe_ports port 488 # gss-http +#acl Safe_ports port 591 # filemaker +#acl Safe_ports port 777 # multiling http +#acl CONNECT method CONNECT +#----------------------------------------------------------- +##EOLE +acl snmppublic snmp_community public +#ref #5715 +%if %%activer_squid_auth == 'oui' +acl password proxy_auth REQUIRED +%end if + +# TAG: snmp_port +# The port number where Squid listens for SNMP requests. To enable +# SNMP support set this to a suitable port number. Port number +# 3401 is often used for the Squid SNMP agent. By default it's +# set to "0" (disabled) +# +# Example: +# snmp_port 3401 +#Default: +# snmp_port 0 +snmp_port 3401 + +# NETWORK OPTIONS +# ----------------------------------------------------------------------------- + +# TAG: http_port +# Usage: port [options] +# hostname:port [options] +# 1.2.3.4:port [options] +# +# The socket addresses where Squid will listen for HTTP client +# requests. You may specify multiple socket addresses. +# There are three forms: port alone, hostname with port, and +# IP address with port. If you specify a hostname or IP +# address, Squid binds the socket to that specific +# address. This replaces the old 'tcp_incoming_address' +# option. Most likely, you do not need to bind to a specific +# address, so you can use the port number alone. +# +# If you are running Squid in accelerator mode, you +# probably want to listen on port 80 also, or instead. +# +# The -a command line option may be used to specify additional +# port(s) where Squid listens for proxy request. Such ports will +# be plain proxy ports with no options. +# +# You may specify multiple socket addresses on multiple lines. +# +# Options: +# +# intercept Support for IP-Layer interception of +# outgoing requests without browser settings. +# NP: disables authentication and IPv6 on the port. +# +# tproxy Support Linux TPROXY for spoofing outgoing +# connections using the client IP address. +# NP: disables authentication and maybe IPv6 on the port. +# +# accel Accelerator mode. Also needs at least one of +# vhost / vport / defaultsite. +# +# allow-direct Allow direct forwarding in accelerator mode. Normally +# accelerated requests are denied direct forwarding as if +# never_direct was used. +# +# defaultsite=domainname +# What to use for the Host: header if it is not present +# in a request. Determines what site (not origin server) +# accelerators should consider the default. +# Implies accel. +# +# vhost Accelerator mode using Host header for virtual +# domain support. Implies accel. +# +# vport Accelerator with IP based virtual host support. +# Implies accel. +# +# vport=NN As above, but uses specified port number rather +# than the http_port number. Implies accel. +# +# protocol= Protocol to reconstruct accelerated requests with. +# Defaults to http. +# +# ignore-cc Ignore request Cache-Control headers. +# +# Warning: This option violates HTTP specifications if +# used in non-accelerator setups. +# +# connection-auth[=on|off] +# use connection-auth=off to tell Squid to prevent +# forwarding Microsoft connection oriented authentication +# (NTLM, Negotiate and Kerberos) +# +# disable-pmtu-discovery= +# Control Path-MTU discovery usage: +# off lets OS decide on what to do (default). +# transparent disable PMTU discovery when transparent +# support is enabled. +# always disable always PMTU discovery. +# +# In many setups of transparently intercepting proxies +# Path-MTU discovery can not work on traffic towards the +# clients. This is the case when the intercepting device +# does not fully track connections and fails to forward +# ICMP must fragment messages to the cache server. If you +# have such setup and experience that certain clients +# sporadically hang or never complete requests set +# disable-pmtu-discovery option to 'transparent'. +# +# sslBump Intercept each CONNECT request matching ssl_bump ACL, +# establish secure connection with the client and with +# the server, decrypt HTTP messages as they pass through +# Squid, and treat them as unencrypted HTTP messages, +# becoming the man-in-the-middle. +# +# When this option is enabled, additional options become +# available to specify SSL-related properties of the +# client-side connection: cert, key, version, cipher, +# options, clientca, cafile, capath, crlfile, dhparams, +# sslflags, and sslcontext. See the https_port directive +# for more information on these options. +# +# The ssl_bump option is required to fully enable +# the SslBump feature. +# +# name= Specifies a internal name for the port. Defaults to +# the port specification (port or addr:port) +# +# tcpkeepalive[=idle,interval,timeout] +# Enable TCP keepalive probes of idle connections +# idle is the initial time before TCP starts probing +# the connection, interval how often to probe, and +# timeout the time before giving up. +# +# If you run Squid on a dual-homed machine with an internal +# and an external interface we recommend you to specify the +# internal address:port in http_port. This way Squid will only be +# visible on the internal address. +# +# + +# Squid normally listens to port 3128 +#http_port 3128 +%if %%activer_filtrage_proxy == 'oui' +http_port 127.0.0.1:8080 +%else +http_port 3128 +%end if + +# TAG: cache_dir +# Usage: +# +# cache_dir Type Directory-Name Fs-specific-data [options] +# +# You can specify multiple cache_dir lines to spread the +# cache among different disk partitions. +# +# Type specifies the kind of storage system to use. Only "ufs" +# is built by default. To enable any of the other storage systems +# see the --enable-storeio configure option. +# +# 'Directory' is a top-level directory where cache swap +# files will be stored. If you want to use an entire disk +# for caching, this can be the mount-point directory. +# The directory must exist and be writable by the Squid +# process. Squid will NOT create this directory for you. +# +# The ufs store type: +# +# "ufs" is the old well-known Squid storage format that has always +# been there. +# +# cache_dir ufs Directory-Name Mbytes L1 L2 [options] +# +# 'Mbytes' is the amount of disk space (MB) to use under this +# directory. The default is 100 MB. Change this to suit your +# configuration. Do NOT put the size of your disk drive here. +# Instead, if you want Squid to use the entire disk drive, +# subtract 20% and use that value. +# +# 'Level-1' is the number of first-level subdirectories which +# will be created under the 'Directory'. The default is 16. +# +# 'Level-2' is the number of second-level subdirectories which +# will be created under each first-level directory. The default +# is 256. +# +# The aufs store type: +# +# "aufs" uses the same storage format as "ufs", utilizing +# POSIX-threads to avoid blocking the main Squid process on +# disk-I/O. This was formerly known in Squid as async-io. +# +# cache_dir aufs Directory-Name Mbytes L1 L2 [options] +# +# see argument descriptions under ufs above +# +# The diskd store type: +# +# "diskd" uses the same storage format as "ufs", utilizing a +# separate process to avoid blocking the main Squid process on +# disk-I/O. +# +# cache_dir diskd Directory-Name Mbytes L1 L2 [options] [Q1=n] [Q2=n] +# +# see argument descriptions under ufs above +# +# Q1 specifies the number of unacknowledged I/O requests when Squid +# stops opening new files. If this many messages are in the queues, +# Squid won't open new files. Default is 64 +# +# Q2 specifies the number of unacknowledged messages when Squid +# starts blocking. If this many messages are in the queues, +# Squid blocks until it receives some replies. Default is 72 +# +# When Q1 < Q2 (the default), the cache directory is optimized +# for lower response time at the expense of a decrease in hit +# ratio. If Q1 > Q2, the cache directory is optimized for +# higher hit ratio at the expense of an increase in response +# time. +# +# The coss store type: +# +# NP: COSS filesystem in Squid-3 has been deemed too unstable for +# production use and has thus been removed from this release. +# We hope that it can be made usable again soon. +# +# block-size=n defines the "block size" for COSS cache_dir's. +# Squid uses file numbers as block numbers. Since file numbers +# are limited to 24 bits, the block size determines the maximum +# size of the COSS partition. The default is 512 bytes, which +# leads to a maximum cache_dir size of 512<<24, or 8 GB. Note +# you should not change the coss block size after Squid +# has written some objects to the cache_dir. +# +# The coss file store has changed from 2.5. Now it uses a file +# called 'stripe' in the directory names in the config - and +# this will be created by squid -z. +# +# Common options: +# +# no-store, no new objects should be stored to this cache_dir +# +# max-size=n, refers to the max object size this storedir supports. +# It is used to initially choose the storedir to dump the object. +# Note: To make optimal use of the max-size limits you should order +# the cache_dir lines with the smallest max-size value first and the +# ones with no max-size specification last. +# +# Note for coss, max-size must be less than COSS_MEMBUF_SZ, +# which can be changed with the --with-coss-membuf-size=N configure +# option. +# + +# Uncomment and adjust the following to add a disk cache directory. +#cache_dir ufs /var/spool/squid 100 16 256 +##EOLE +#cache_dir ufs /var/spool/squid 1000 16 256 +%for %%cache_param in %%cache_dir +cache_dir %%cache_param.cache_dir_type %%cache_param %%cache_param.cache_dir_disk_space %%cache_param.cache_dir_firstLevel %%cache_param.cache_dir_secondLevel +%end for + +# TAG: access_log +# These files log client request activities. Has a line every HTTP or +# ICP request. The format is: +# access_log <filepath> [<logformat name> [acl acl ...]] +# access_log none [acl acl ...]] +# +# Will log to the specified file using the specified format (which +# must be defined in a logformat directive) those entries which match +# ALL the acl's specified (which must be defined in acl clauses). +# If no acl is specified, all requests will be logged to this file. +# +# To disable logging of a request use the filepath "none", in which case +# a logformat name should not be specified. +# +# To log the request via syslog specify a filepath of "syslog": +# +# access_log syslog[:facility.priority] [format [acl1 [acl2 ....]]] +# where facility could be any of: +# authpriv, daemon, local0 .. local7 or user. +# +# And priority could be any of: +# err, warning, notice, info, debug. +# +# Default: +# access_log /var/log/squid/access.log squid +#Default: +# access_log /var/log/squid/access.log squid +##EOLE +access_log syslog:LOG_LOCAL1|LOG_INFO squid +pid_filename /var/run/squid.pid +include /etc/squid/common-squid1.conf +include /etc/squid/01inc-squid.conf +include /etc/squid/common-squid2.conf diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/02inc-squid.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/02inc-squid.conf new file mode 100644 index 0000000000000000000000000000000000000000..3909656510240acc48b1b4e96c8c732b819f21b9 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/02inc-squid.conf @@ -0,0 +1,2 @@ +## authentification +http_access allow password diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/02squid.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/02squid.conf new file mode 100644 index 0000000000000000000000000000000000000000..1d7a6afe6ce4f1364ba8c4731b7513e17a4d0c41 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/02squid.conf @@ -0,0 +1,985 @@ +# WELCOME TO SQUID 3.1.4 +# ---------------------------- +# +# This is the default Squid configuration file. You may wish +# to look at the Squid home page (http://www.squid-cache.org/) +# for the FAQ and other documentation. +# +# The default Squid config file shows what the defaults for +# various options happen to be. If you don't need to change the +# default, you shouldn't uncomment the line. Doing so may cause +# run-time problems. In some cases "none" refers to no default +# setting at all, while in other cases it refers to a valid +# option - the comments for that keyword indicate if this is the +# case. +# + +# Configuration options can be included using the "include" directive. +# Include takes a list of files to include. Quoting and wildcards is +# supported. +# +# For example, +# +# include /path/to/included/file/squid.acl.config +# +# Includes can be nested up to a hard-coded depth of 16 levels. +# This arbitrary restriction is to prevent recursive include references +# from causing Squid entering an infinite loop whilst trying to load +# configuration files. + +# OPTIONS FOR AUTHENTICATION +# ----------------------------------------------------------------------------- + +# TAG: auth_param +# This is used to define parameters for the various authentication +# schemes supported by Squid. +# +# format: auth_param scheme parameter [setting] +# +# The order in which authentication schemes are presented to the client is +# dependent on the order the scheme first appears in config file. IE +# has a bug (it's not RFC 2617 compliant) in that it will use the basic +# scheme if basic is the first entry presented, even if more secure +# schemes are presented. For now use the order in the recommended +# settings section below. If other browsers have difficulties (don't +# recognize the schemes offered even if you are using basic) either +# put basic first, or disable the other schemes (by commenting out their +# program entry). +# +# Once an authentication scheme is fully configured, it can only be +# shutdown by shutting squid down and restarting. Changes can be made on +# the fly and activated with a reconfigure. I.E. You can change to a +# different helper, but not unconfigure the helper completely. +# +# Please note that while this directive defines how Squid processes +# authentication it does not automatically activate authentication. +# To use authentication you must in addition make use of ACLs based +# on login name in http_access (proxy_auth, proxy_auth_regex or +# external with %LOGIN used in the format tag). The browser will be +# challenged for authentication on the first such acl encountered +# in http_access processing and will also be re-challenged for new +# login credentials if the request is being denied by a proxy_auth +# type acl. +# +# WARNING: authentication can't be used in a transparently intercepting +# proxy as the client then thinks it is talking to an origin server and +# not the proxy. This is a limitation of bending the TCP/IP protocol to +# transparently intercepting port 80, not a limitation in Squid. +# Ports flagged 'transparent', 'intercept', or 'tproxy' have +# authentication disabled. +# +# === Parameters for the basic scheme follow. === +# +# "program" cmdline +# Specify the command for the external authenticator. Such a program +# reads a line containing "username password" and replies "OK" or +# "ERR" in an endless loop. "ERR" responses may optionally be followed +# by a error description available as %m in the returned error page. +# If you use an authenticator, make sure you have 1 acl of type +# proxy_auth. +# +# By default, the basic authentication scheme is not used unless a +# program is specified. +# +# If you want to use the traditional NCSA proxy authentication, set +# this line to something like +# +# auth_param basic program /usr/lib/squid/ncsa_auth /usr/etc/passwd +# +# "utf8" on|off +# HTTP uses iso-latin-1 as characterset, while some authentication +# backends such as LDAP expects UTF-8. If this is set to on Squid will +# translate the HTTP iso-latin-1 charset to UTF-8 before sending the +# username & password to the helper. +# +# "children" numberofchildren +# The number of authenticator processes to spawn. If you start too few +# Squid will have to wait for them to process a backlog of credential +# verifications, slowing it down. When password verifications are +# done via a (slow) network you are likely to need lots of +# authenticator processes. +# auth_param basic children 5 +# +# "concurrency" concurrency +# The number of concurrent requests the helper can process. +# The default of 0 is used for helpers who only supports +# one request at a time. Setting this changes the protocol used to +# include a channel number first on the request/response line, allowing +# multiple requests to be sent to the same helper in parallell without +# wating for the response. +# Must not be set unless it's known the helper supports this. +# auth_param basic concurrency 0 +# +# "realm" realmstring +# Specifies the realm name which is to be reported to the +# client for the basic proxy authentication scheme (part of +# the text the user will see when prompted their username and +# password). There is no default. +# auth_param basic realm Squid proxy-caching web server +# +# "credentialsttl" timetolive +# Specifies how long squid assumes an externally validated +# username:password pair is valid for - in other words how +# often the helper program is called for that user. Set this +# low to force revalidation with short lived passwords. Note +# setting this high does not impact your susceptibility +# to replay attacks unless you are using an one-time password +# system (such as SecureID). If you are using such a system, +# you will be vulnerable to replay attacks unless you also +# use the max_user_ip ACL in an http_access rule. +# +# "casesensitive" on|off +# Specifies if usernames are case sensitive. Most user databases are +# case insensitive allowing the same username to be spelled using both +# lower and upper case letters, but some are case sensitive. This +# makes a big difference for user_max_ip ACL processing and similar. +# auth_param basic casesensitive off +# +# === Parameters for the digest scheme follow === +# +# "program" cmdline +# Specify the command for the external authenticator. Such +# a program reads a line containing "username":"realm" and +# replies with the appropriate H(A1) value hex encoded or +# ERR if the user (or his H(A1) hash) does not exists. +# See rfc 2616 for the definition of H(A1). +# "ERR" responses may optionally be followed by a error description +# available as %m in the returned error page. +# +# By default, the digest authentication scheme is not used unless a +# program is specified. +# +# If you want to use a digest authenticator, set this line to +# something like +# +# auth_param digest program /usr/lib/squid/digest_pw_auth /usr/etc/digpass +# +# "utf8" on|off +# HTTP uses iso-latin-1 as characterset, while some authentication +# backends such as LDAP expects UTF-8. If this is set to on Squid will +# translate the HTTP iso-latin-1 charset to UTF-8 before sending the +# username & password to the helper. +# +# "children" numberofchildren +# The number of authenticator processes to spawn (no default). +# If you start too few Squid will have to wait for them to +# process a backlog of H(A1) calculations, slowing it down. +# When the H(A1) calculations are done via a (slow) network +# you are likely to need lots of authenticator processes. +# auth_param digest children 5 +# +# "realm" realmstring +# Specifies the realm name which is to be reported to the +# client for the digest proxy authentication scheme (part of +# the text the user will see when prompted their username and +# password). There is no default. +# auth_param digest realm Squid proxy-caching web server +# +# "nonce_garbage_interval" timeinterval +# Specifies the interval that nonces that have been issued +# to client_agent's are checked for validity. +# +# "nonce_max_duration" timeinterval +# Specifies the maximum length of time a given nonce will be +# valid for. +# +# "nonce_max_count" number +# Specifies the maximum number of times a given nonce can be +# used. +# +# "nonce_strictness" on|off +# Determines if squid requires strict increment-by-1 behavior +# for nonce counts, or just incrementing (off - for use when +# useragents generate nonce counts that occasionally miss 1 +# (ie, 1,2,4,6)). Default off. +# +# "check_nonce_count" on|off +# This directive if set to off can disable the nonce count check +# completely to work around buggy digest qop implementations in +# certain mainstream browser versions. Default on to check the +# nonce count to protect from authentication replay attacks. +# +# "post_workaround" on|off +# This is a workaround to certain buggy browsers who sends +# an incorrect request digest in POST requests when reusing +# the same nonce as acquired earlier on a GET request. +# +# === NTLM scheme options follow === +# +# "program" cmdline +# Specify the command for the external NTLM authenticator. +# Such a program reads exchanged NTLMSSP packets with +# the browser via Squid until authentication is completed. +# If you use an NTLM authenticator, make sure you have 1 acl +# of type proxy_auth. By default, the NTLM authenticator_program +# is not used. +# +# auth_param ntlm program /usr/lib/squid/ntlm_auth +# +# "children" numberofchildren +# The number of authenticator processes to spawn (no default). +# If you start too few Squid will have to wait for them to +# process a backlog of credential verifications, slowing it +# down. When credential verifications are done via a (slow) +# network you are likely to need lots of authenticator +# processes. +# +# auth_param ntlm children 5 +# +# "keep_alive" on|off +# If you experience problems with PUT/POST requests when using the +# Negotiate authentication scheme then you can try setting this to +# off. This will cause Squid to forcibly close the connection on +# the initial requests where the browser asks which schemes are +# supported by the proxy. +# +# auth_param ntlm keep_alive on +# +# === Options for configuring the NEGOTIATE auth-scheme follow === +# +# "program" cmdline +# Specify the command for the external Negotiate authenticator. +# This protocol is used in Microsoft Active-Directory enabled setups with +# the Microsoft Internet Explorer or Mozilla Firefox browsers. +# Its main purpose is to exchange credentials with the Squid proxy +# using the Kerberos mechanisms. +# If you use a Negotiate authenticator, make sure you have at least +# one acl of type proxy_auth active. By default, the negotiate +# authenticator_program is not used. +# The only supported program for this role is the ntlm_auth +# program distributed as part of Samba, version 4 or later. +# +# auth_param negotiate program /usr/lib/squid/ntlm_auth --helper-protocol=gss-spnego +# +# "children" numberofchildren +# The number of authenticator processes to spawn (no default). +# If you start too few Squid will have to wait for them to +# process a backlog of credential verifications, slowing it +# down. When crendential verifications are done via a (slow) +# network you are likely to need lots of authenticator +# processes. +# auth_param negotiate children 5 +# +# "keep_alive" on|off +# If you experience problems with PUT/POST requests when using the +# Negotiate authentication scheme then you can try setting this to +# off. This will cause Squid to forcibly close the connection on +# the initial requests where the browser asks which schemes are +# supported by the proxy. +# +# auth_param negotiate keep_alive on +# +# +# Examples: +# +##Recommended minimum configuration per scheme: +##auth_param negotiate program <uncomment and complete this line to activate> +##auth_param negotiate children 5 +##auth_param negotiate keep_alive on +## +##auth_param ntlm program <uncomment and complete this line to activate> +##auth_param ntlm children 5 +##auth_param ntlm keep_alive on +## +##auth_param digest program <uncomment and complete this line> +##auth_param digest children 5 +##auth_param digest realm Squid proxy-caching web server +##auth_param digest nonce_garbage_interval 5 minutes +##auth_param digest nonce_max_duration 30 minutes +##auth_param digest nonce_max_count 50 +## +##auth_param basic program <uncomment and complete this line> +##auth_param basic children 5 +##auth_param basic realm Squid proxy-caching web server +##auth_param basic credentialsttl 2 hours +#Default: +# none +%if %%activer_squid_auth == 'oui' + +%if %%type_squid_auth_2 == 'Ldap' +## mode LDAP ## +auth_param basic program /usr/lib/squid/basic_ldap_auth -v 3 -b %%proxy_ldap_base_dn_2 -f (&(uid=%s)) %slurp + %if %%is_empty(%%ip_serveur_ldap2_2) +ldap://%%ip_serveur_ldap1_2 + %else +ldap://%%ip_serveur_ldap1_2 ldap://%%ip_serveur_ldap2_2 + %end if +## +%end if + +%if %%type_squid_auth_2 == 'Ldap (Active Directory)' +%set %%dc_base="dc="+",dc=".join(%%ldapad_base_dn_2.split('.')) + +auth_param basic program /usr/lib/squid/basic_ldap_auth -R -b "%%dc_base" -D "cn=%%ldapad_user_2,cn=users,%%dc_base" -w %%ldapad_passwd_2 -f sAMAccountName=%s -h %%ip_serveur_ldapad_2 +%end if + +auth_param basic children %%number_of_basic_children +auth_param basic realm Squid proxy-caching web server +auth_param basic credentialsttl 2 hours +auth_param basic casesensitive off + +%end if + +# TAG: authenticate_cache_garbage_interval +# The time period between garbage collection across the username cache. +# This is a tradeoff between memory utilization (long intervals - say +# 2 days) and CPU (short intervals - say 1 minute). Only change if you +# have good reason to. +#Default: +# authenticate_cache_garbage_interval 1 hour + +# TAG: authenticate_ttl +# The time a user & their credentials stay in the logged in +# user cache since their last request. When the garbage +# interval passes, all user credentials that have passed their +# TTL are removed from memory. +#Default: +# authenticate_ttl 1 hour + +# TAG: authenticate_ip_ttl +# If you use proxy authentication and the 'max_user_ip' ACL, +# this directive controls how long Squid remembers the IP +# addresses associated with each user. Use a small value +# (e.g., 60 seconds) if your users might change addresses +# quickly, as is the case with dialups. You might be safe +# using a larger value (e.g., 2 hours) in a corporate LAN +# environment with relatively static address assignments. +#Default: +# authenticate_ip_ttl 0 seconds + +# ACCESS CONTROLS +# ----------------------------------------------------------------------------- + +# TAG: external_acl_type +# This option defines external acl classes using a helper program +# to look up the status +# +# external_acl_type name [options] FORMAT.. /path/to/helper [helper arguments..] +# +# Options: +# +# ttl=n TTL in seconds for cached results (defaults to 3600 +# for 1 hour) +# negative_ttl=n +# TTL for cached negative lookups (default same +# as ttl) +# children=n Number of acl helper processes spawn to service +# external acl lookups of this type. (default 5) +# concurrency=n concurrency level per process. Only used with helpers +# capable of processing more than one query at a time. +# cache=n result cache size, 0 is unbounded (default) +# grace=n Percentage remaining of TTL where a refresh of a +# cached entry should be initiated without needing to +# wait for a new reply. (default 0 for no grace period) +# protocol=2.5 Compatibility mode for Squid-2.5 external acl helpers +# ipv4 / ipv6 IP-mode used to communicate to this helper. +# For compatability with older configurations and helpers +# the default is 'ipv4'. +# +# FORMAT specifications +# +# %LOGIN Authenticated user login name +# %EXT_USER Username from external acl +# %IDENT Ident user name +# %SRC Client IP +# %SRCPORT Client source port +# %URI Requested URI +# %DST Requested host +# %PROTO Requested protocol +# %PORT Requested port +# %PATH Requested URL path +# %METHOD Request method +# %MYADDR Squid interface address +# %MYPORT Squid http_port number +# %PATH Requested URL-path (including query-string if any) +# %USER_CERT SSL User certificate in PEM format +# %USER_CERTCHAIN SSL User certificate chain in PEM format +# %USER_CERT_xx SSL User certificate subject attribute xx +# %USER_CA_xx SSL User certificate issuer attribute xx +# +# %>{Header} HTTP request header "Header" +# %>{Hdr:member} +# HTTP request header "Hdr" list member "member" +# %>{Hdr:;member} +# HTTP request header list member using ; as +# list separator. ; can be any non-alphanumeric +# character. +# +# %<{Header} HTTP reply header "Header" +# %<{Hdr:member} +# HTTP reply header "Hdr" list member "member" +# %<{Hdr:;member} +# HTTP reply header list member using ; as +# list separator. ; can be any non-alphanumeric +# character. +# +# In addition to the above, any string specified in the referencing +# acl will also be included in the helper request line, after the +# specified formats (see the "acl external" directive) +# +# The helper receives lines per the above format specification, +# and returns lines starting with OK or ERR indicating the validity +# of the request and optionally followed by additional keywords with +# more details. +# +# General result syntax: +# +# OK/ERR keyword=value ... +# +# Defined keywords: +# +# user= The users name (login) +# password= The users password (for login= cache_peer option) +# message= Message describing the reason. Available as %o +# in error pages +# tag= Apply a tag to a request (for both ERR and OK results) +# Only sets a tag, does not alter existing tags. +# log= String to be logged in access.log. Available as +# %ea in logformat specifications +# +# If protocol=3.0 (the default) then URL escaping is used to protect +# each value in both requests and responses. +# +# If using protocol=2.5 then all values need to be enclosed in quotes +# if they may contain whitespace, or the whitespace escaped using \. +# And quotes or \ characters within the keyword value must be \ escaped. +# +# When using the concurrency= option the protocol is changed by +# introducing a query channel tag infront of the request/response. +# The query channel tag is a number between 0 and concurrency-1. +#Default: +# none + +# TAG: acl +# Defining an Access List +# +# Every access list definition must begin with an aclname and acltype, +# followed by either type-specific arguments or a quoted filename that +# they are read from. +# +# acl aclname acltype argument ... +# acl aclname acltype "file" ... +# +# When using "file", the file should contain one item per line. +# +# By default, regular expressions are CASE-SENSITIVE. To make +# them case-insensitive, use the -i option. +# +# Some acl types require suspending the current request in order +# to access some external data source. +# Those which do are marked with the tag [slow], those which +# don't are marked as [fast]. +# See http://wiki.squid-cache.org/SquidFaq/SquidAcl +# for further information +# +# ***** ACL TYPES AVAILABLE ***** +# +# acl aclname src ip-address/netmask ... # clients IP address [fast] +# acl aclname src addr1-addr2/netmask ... # range of addresses [fast] +# acl aclname dst ip-address/netmask ... # URL host's IP address [slow] +# acl aclname myip ip-address/netmask ... # local socket IP address [fast] +# +# acl aclname arp mac-address ... (xx:xx:xx:xx:xx:xx notation) +# # The arp ACL requires the special configure option --enable-arp-acl. +# # Furthermore, the ARP ACL code is not portable to all operating systems. +# # It works on Linux, Solaris, Windows, FreeBSD, and some +# # other *BSD variants. +# # [fast] +# # +# # NOTE: Squid can only determine the MAC address for clients that are on +# # the same subnet. If the client is on a different subnet, +# # then Squid cannot find out its MAC address. +# +# acl aclname srcdomain .foo.com ... +# # reverse lookup, from client IP [slow] +# acl aclname dstdomain .foo.com ... +# # Destination server from URL [fast] +# acl aclname srcdom_regex [-i] \.foo\.com ... +# # regex matching client name [slow] +# acl aclname dstdom_regex [-i] \.foo\.com ... +# # regex matching server [fast] +# # +# # For dstdomain and dstdom_regex a reverse lookup is tried if a IP +# # based URL is used and no match is found. The name "none" is used +# # if the reverse lookup fails. +# +# acl aclname src_as number ... +# acl aclname dst_as number ... +# # [fast] +# # Except for access control, AS numbers can be used for +# # routing of requests to specific caches. Here's an +# # example for routing all requests for AS#1241 and only +# # those to mycache.mydomain.net: +# # acl asexample dst_as 1241 +# # cache_peer_access mycache.mydomain.net allow asexample +# # cache_peer_access mycache_mydomain.net deny all +# +# acl aclname peername myPeer ... +# # [fast] +# # match against a named cache_peer entry +# # set unique name= on cache_peer lines for reliable use. +# +# acl aclname time [day-abbrevs] [h1:m1-h2:m2] +# # [fast] +# # day-abbrevs: +# # S - Sunday +# # M - Monday +# # T - Tuesday +# # W - Wednesday +# # H - Thursday +# # F - Friday +# # A - Saturday +# # h1:m1 must be less than h2:m2 +# +# acl aclname url_regex [-i] ^http:// ... +# # regex matching on whole URL [fast] +# acl aclname urlpath_regex [-i] \.gif$ ... +# # regex matching on URL path [fast] +# +# acl aclname port 80 70 21 0-1024... # destination TCP port [fast] +# # ranges are alloed +# acl aclname myport 3128 ... # local socket TCP port [fast] +# acl aclname myportname 3128 ... # http(s)_port name [fast] +# +# acl aclname proto HTTP FTP ... # request protocol [fast] +# +# acl aclname method GET POST ... # HTTP request method [fast] +# +# acl aclname http_status 200 301 500- 400-403 ... +# # status code in reply [fast] +# +# acl aclname browser [-i] regexp ... +# # pattern match on User-Agent header (see also req_header below) [fast] +# +# acl aclname referer_regex [-i] regexp ... +# # pattern match on Referer header [fast] +# # Referer is highly unreliable, so use with care +# +# acl aclname ident username ... +# acl aclname ident_regex [-i] pattern ... +# # string match on ident output [slow] +# # use REQUIRED to accept any non-null ident. +# +# acl aclname proxy_auth [-i] username ... +# acl aclname proxy_auth_regex [-i] pattern ... +# # perform http authentication challenge to the client and match against +# # supplied credentials [slow] +# # +# # takes a list of allowed usernames. +# # use REQUIRED to accept any valid username. +# # +# # Will use proxy authentication in forward-proxy scenarios, and plain +# # http authenticaiton in reverse-proxy scenarios +# # +# # NOTE: when a Proxy-Authentication header is sent but it is not +# # needed during ACL checking the username is NOT logged +# # in access.log. +# # +# # NOTE: proxy_auth requires a EXTERNAL authentication program +# # to check username/password combinations (see +# # auth_param directive). +# # +# # NOTE: proxy_auth can't be used in a transparent/intercepting proxy +# # as the browser needs to be configured for using a proxy in order +# # to respond to proxy authentication. +# +# acl aclname snmp_community string ... +# # A community string to limit access to your SNMP Agent [fast] +# # Example: +# # +# # acl snmppublic snmp_community public +# +# acl aclname maxconn number +# # This will be matched when the client's IP address has +# # more than <number> HTTP connections established. [fast] +# +# acl aclname max_user_ip [-s] number +# # This will be matched when the user attempts to log in from more +# # than <number> different ip addresses. The authenticate_ip_ttl +# # parameter controls the timeout on the ip entries. [fast] +# # If -s is specified the limit is strict, denying browsing +# # from any further IP addresses until the ttl has expired. Without +# # -s Squid will just annoy the user by "randomly" denying requests. +# # (the counter is reset each time the limit is reached and a +# # request is denied) +# # NOTE: in acceleration mode or where there is mesh of child proxies, +# # clients may appear to come from multiple addresses if they are +# # going through proxy farms, so a limit of 1 may cause user problems. +# +# acl aclname req_mime_type [-i] mime-type ... +# # regex match against the mime type of the request generated +# # by the client. Can be used to detect file upload or some +# # types HTTP tunneling requests [fast] +# # NOTE: This does NOT match the reply. You cannot use this +# # to match the returned file type. +# +# acl aclname req_header header-name [-i] any\.regex\.here +# # regex match against any of the known request headers. May be +# # thought of as a superset of "browser", "referer" and "mime-type" +# # ACL [fast] +# +# acl aclname rep_mime_type [-i] mime-type ... +# # regex match against the mime type of the reply received by +# # squid. Can be used to detect file download or some +# # types HTTP tunneling requests. [fast] +# # NOTE: This has no effect in http_access rules. It only has +# # effect in rules that affect the reply data stream such as +# # http_reply_access. +# +# acl aclname rep_header header-name [-i] any\.regex\.here +# # regex match against any of the known reply headers. May be +# # thought of as a superset of "browser", "referer" and "mime-type" +# # ACLs [fast] +# +# acl aclname external class_name [arguments...] +# # external ACL lookup via a helper class defined by the +# # external_acl_type directive [slow] +# +# acl aclname user_cert attribute values... +# # match against attributes in a user SSL certificate +# # attribute is one of DN/C/O/CN/L/ST [fast] +# +# acl aclname ca_cert attribute values... +# # match against attributes a users issuing CA SSL certificate +# # attribute is one of DN/C/O/CN/L/ST [fast] +# +# acl aclname ext_user username ... +# acl aclname ext_user_regex [-i] pattern ... +# # string match on username returned by external acl helper [slow] +# # use REQUIRED to accept any non-null user name. +# +# acl aclname tag tagvalue ... +# # string match on tag returned by external acl helper [slow] +# +# Examples: +# acl macaddress arp 09:00:2b:23:45:67 +# acl myexample dst_as 1241 +# acl password proxy_auth REQUIRED +# acl fileupload req_mime_type -i ^multipart/form-data$ +# acl javascript rep_mime_type -i ^application/x-javascript$ +# +#Default: +# acl all src all +# +# +# Recommended minimum configuration: +# +#acl manager proto cache_object +#acl localhost src 127.0.0.1/32 +#acl localhost src ::1/128 +#acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 +#acl to_localhost dst ::1/128 + +# Example rule allowing access from your local networks. +# Adapt to list your (internal) IP networks from where browsing +# should be allowed +#acl localnet src 10.0.0.0/8 # RFC1918 possible internal network +#acl localnet src 172.16.0.0/12 # RFC1918 possible internal network +#acl localnet src 192.168.0.0/16 # RFC1918 possible internal network +#acl localnet src fc00::/7 # RFC 4193 local private network range +#acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines + +#acl SSL_ports port 443 +#acl Safe_ports port 80 # http +#acl Safe_ports port 21 # ftp +#acl Safe_ports port 443 # https +#acl Safe_ports port 70 # gopher +#acl Safe_ports port 210 # wais +#acl Safe_ports port 1025-65535 # unregistered ports +#acl Safe_ports port 280 # http-mgmt +#acl Safe_ports port 488 # gss-http +#acl Safe_ports port 591 # filemaker +#acl Safe_ports port 777 # multiling http +#acl CONNECT method CONNECT +#----------------------------------------------------------- +##EOLE +acl snmppublic snmp_community public +%if %%activer_squid_auth == 'oui' +acl password proxy_auth REQUIRED +%end if + +# TAG: snmp_port +# The port number where Squid listens for SNMP requests. To enable +# SNMP support set this to a suitable port number. Port number +# 3401 is often used for the Squid SNMP agent. By default it's +# set to "0" (disabled) +# +# Example: +# snmp_port 3401 +#Default: +# snmp_port 0 +snmp_port 3402 + +# NETWORK OPTIONS +# ----------------------------------------------------------------------------- + +# TAG: http_port +# Usage: port [options] +# hostname:port [options] +# 1.2.3.4:port [options] +# +# The socket addresses where Squid will listen for HTTP client +# requests. You may specify multiple socket addresses. +# There are three forms: port alone, hostname with port, and +# IP address with port. If you specify a hostname or IP +# address, Squid binds the socket to that specific +# address. This replaces the old 'tcp_incoming_address' +# option. Most likely, you do not need to bind to a specific +# address, so you can use the port number alone. +# +# If you are running Squid in accelerator mode, you +# probably want to listen on port 80 also, or instead. +# +# The -a command line option may be used to specify additional +# port(s) where Squid listens for proxy request. Such ports will +# be plain proxy ports with no options. +# +# You may specify multiple socket addresses on multiple lines. +# +# Options: +# +# intercept Support for IP-Layer interception of +# outgoing requests without browser settings. +# NP: disables authentication and IPv6 on the port. +# +# tproxy Support Linux TPROXY for spoofing outgoing +# connections using the client IP address. +# NP: disables authentication and maybe IPv6 on the port. +# +# accel Accelerator mode. Also needs at least one of +# vhost / vport / defaultsite. +# +# allow-direct Allow direct forwarding in accelerator mode. Normally +# accelerated requests are denied direct forwarding as if +# never_direct was used. +# +# defaultsite=domainname +# What to use for the Host: header if it is not present +# in a request. Determines what site (not origin server) +# accelerators should consider the default. +# Implies accel. +# +# vhost Accelerator mode using Host header for virtual +# domain support. Implies accel. +# +# vport Accelerator with IP based virtual host support. +# Implies accel. +# +# vport=NN As above, but uses specified port number rather +# than the http_port number. Implies accel. +# +# protocol= Protocol to reconstruct accelerated requests with. +# Defaults to http. +# +# ignore-cc Ignore request Cache-Control headers. +# +# Warning: This option violates HTTP specifications if +# used in non-accelerator setups. +# +# connection-auth[=on|off] +# use connection-auth=off to tell Squid to prevent +# forwarding Microsoft connection oriented authentication +# (NTLM, Negotiate and Kerberos) +# +# disable-pmtu-discovery= +# Control Path-MTU discovery usage: +# off lets OS decide on what to do (default). +# transparent disable PMTU discovery when transparent +# support is enabled. +# always disable always PMTU discovery. +# +# In many setups of transparently intercepting proxies +# Path-MTU discovery can not work on traffic towards the +# clients. This is the case when the intercepting device +# does not fully track connections and fails to forward +# ICMP must fragment messages to the cache server. If you +# have such setup and experience that certain clients +# sporadically hang or never complete requests set +# disable-pmtu-discovery option to 'transparent'. +# +# sslBump Intercept each CONNECT request matching ssl_bump ACL, +# establish secure connection with the client and with +# the server, decrypt HTTP messages as they pass through +# Squid, and treat them as unencrypted HTTP messages, +# becoming the man-in-the-middle. +# +# When this option is enabled, additional options become +# available to specify SSL-related properties of the +# client-side connection: cert, key, version, cipher, +# options, clientca, cafile, capath, crlfile, dhparams, +# sslflags, and sslcontext. See the https_port directive +# for more information on these options. +# +# The ssl_bump option is required to fully enable +# the SslBump feature. +# +# name= Specifies a internal name for the port. Defaults to +# the port specification (port or addr:port) +# +# tcpkeepalive[=idle,interval,timeout] +# Enable TCP keepalive probes of idle connections +# idle is the initial time before TCP starts probing +# the connection, interval how often to probe, and +# timeout the time before giving up. +# +# If you run Squid on a dual-homed machine with an internal +# and an external interface we recommend you to specify the +# internal address:port in http_port. This way Squid will only be +# visible on the internal address. +# +# + +# Squid normally listens to port 3128 +#http_port 3128 +%if %%activer_filtrage_proxy == 'oui' +http_port 127.0.0.1:8081 +%else +http_port %%proxy2_port +%end if + +# TAG: cache_dir +# Usage: +# +# cache_dir Type Directory-Name Fs-specific-data [options] +# +# You can specify multiple cache_dir lines to spread the +# cache among different disk partitions. +# +# Type specifies the kind of storage system to use. Only "ufs" +# is built by default. To enable any of the other storage systems +# see the --enable-storeio configure option. +# +# 'Directory' is a top-level directory where cache swap +# files will be stored. If you want to use an entire disk +# for caching, this can be the mount-point directory. +# The directory must exist and be writable by the Squid +# process. Squid will NOT create this directory for you. +# +# The ufs store type: +# +# "ufs" is the old well-known Squid storage format that has always +# been there. +# +# cache_dir ufs Directory-Name Mbytes L1 L2 [options] +# +# 'Mbytes' is the amount of disk space (MB) to use under this +# directory. The default is 100 MB. Change this to suit your +# configuration. Do NOT put the size of your disk drive here. +# Instead, if you want Squid to use the entire disk drive, +# subtract 20% and use that value. +# +# 'Level-1' is the number of first-level subdirectories which +# will be created under the 'Directory'. The default is 16. +# +# 'Level-2' is the number of second-level subdirectories which +# will be created under each first-level directory. The default +# is 256. +# +# The aufs store type: +# +# "aufs" uses the same storage format as "ufs", utilizing +# POSIX-threads to avoid blocking the main Squid process on +# disk-I/O. This was formerly known in Squid as async-io. +# +# cache_dir aufs Directory-Name Mbytes L1 L2 [options] +# +# see argument descriptions under ufs above +# +# The diskd store type: +# +# "diskd" uses the same storage format as "ufs", utilizing a +# separate process to avoid blocking the main Squid process on +# disk-I/O. +# +# cache_dir diskd Directory-Name Mbytes L1 L2 [options] [Q1=n] [Q2=n] +# +# see argument descriptions under ufs above +# +# Q1 specifies the number of unacknowledged I/O requests when Squid +# stops opening new files. If this many messages are in the queues, +# Squid won't open new files. Default is 64 +# +# Q2 specifies the number of unacknowledged messages when Squid +# starts blocking. If this many messages are in the queues, +# Squid blocks until it receives some replies. Default is 72 +# +# When Q1 < Q2 (the default), the cache directory is optimized +# for lower response time at the expense of a decrease in hit +# ratio. If Q1 > Q2, the cache directory is optimized for +# higher hit ratio at the expense of an increase in response +# time. +# +# The coss store type: +# +# NP: COSS filesystem in Squid-3 has been deemed too unstable for +# production use and has thus been removed from this release. +# We hope that it can be made usable again soon. +# +# block-size=n defines the "block size" for COSS cache_dir's. +# Squid uses file numbers as block numbers. Since file numbers +# are limited to 24 bits, the block size determines the maximum +# size of the COSS partition. The default is 512 bytes, which +# leads to a maximum cache_dir size of 512<<24, or 8 GB. Note +# you should not change the coss block size after Squid +# has written some objects to the cache_dir. +# +# The coss file store has changed from 2.5. Now it uses a file +# called 'stripe' in the directory names in the config - and +# this will be created by squid -z. +# +# Common options: +# +# no-store, no new objects should be stored to this cache_dir +# +# max-size=n, refers to the max object size this storedir supports. +# It is used to initially choose the storedir to dump the object. +# Note: To make optimal use of the max-size limits you should order +# the cache_dir lines with the smallest max-size value first and the +# ones with no max-size specification last. +# +# Note for coss, max-size must be less than COSS_MEMBUF_SZ, +# which can be changed with the --with-coss-membuf-size=N configure +# option. +# + +# Uncomment and adjust the following to add a disk cache directory. +#cache_dir ufs /var/spool/squid 100 16 256 +##EOLE +#cache_dir ufs /var/spool/squid 1000 16 256 +%for %%cache_param in %%cache_dir_2 +cache_dir %%cache_param.cache_dir_type_2 %%cache_param %%cache_param.cache_dir_disk_space_2 %%cache_param.cache_dir_firstLevel_2 %%cache_param.cache_dir_secondLevel_2 +%end for + +# TAG: access_log +# These files log client request activities. Has a line every HTTP or +# ICP request. The format is: +# access_log <filepath> [<logformat name> [acl acl ...]] +# access_log none [acl acl ...]] +# +# Will log to the specified file using the specified format (which +# must be defined in a logformat directive) those entries which match +# ALL the acl's specified (which must be defined in acl clauses). +# If no acl is specified, all requests will be logged to this file. +# +# To disable logging of a request use the filepath "none", in which case +# a logformat name should not be specified. +# +# To log the request via syslog specify a filepath of "syslog": +# +# access_log syslog[:facility.priority] [format [acl1 [acl2 ....]]] +# where facility could be any of: +# authpriv, daemon, local0 .. local7 or user. +# +# And priority could be any of: +# err, warning, notice, info, debug. +# +# Default: +# access_log /var/log/squid/access.log squid +#Default: +# access_log /var/log/squid/access.log squid +##EOLE +access_log syslog:LOG_LOCAL2|LOG_INFO squid +pid_filename /var/run/squid3-2.pid +include /etc/squid/common-squid1.conf +include /etc/squid/02inc-squid.conf +include /etc/squid/common-squid2.conf diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/amon.cfg b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/amon.cfg new file mode 100644 index 0000000000000000000000000000000000000000..68fca85791ae834a68d8f7e00dfec283bc4ba43e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/amon.cfg @@ -0,0 +1,70 @@ +[eole] +mode_conteneur_actif = %slurp +%if %%mode_conteneur_actif == 'oui' +yes +%else +no +%end if +interface_gw = %%interface_gw +container_path_proxy = %%container_path_proxy +nombre_interfaces = %%nombre_interfaces +time_zone = %%time_zone +%for %%int_num in %%range(%%int(%%nombre_interfaces)) +%if %%mode_conteneur_actif == 'oui' +ip_eth%%int_num = %%getVar('adresse_ip_eth' + %%str(%%int_num) + '_proxy_link', '') +network_eth%%int_num = %%getVar('adresse_network_eth' + %%str(%%int_num) + '_proxy_link', '') +netmask_eth%%int_num = %%getVar('adresse_mask_eth' + %%str(%%int_num) + '_proxy_link', '') +%else +ip_eth%%int_num = %%getVar('adresse_ip_eth' + %%str(%%int_num)) +network_eth%%int_num = %%getVar('adresse_network_eth' + %%str(%%int_num)) +netmask_eth%%int_num = %%getVar('adresse_netmask_eth' + %%str(%%int_num)) +%end if +nom_machine_eth%%int_num = %%getVar('nom_machine_eth' + %%str(%%int_num), %%nom_machine) +nom_carte_eth%%int_num = %%getVar('nom_carte_eth' + %%str(%%int_num), '') +nom_zone_eth%%int_num = %%getVar('nom_zone_eth' + %%str(%%int_num), '') +vlan_ip_eth%%int_num%slurp +%if %%mode_conteneur_actif == 'non' and %%getVar('vlan_eth' + %%str(int_num)) == 'oui' + =%slurp +%for %%vlan in %%getVar('vlan_id_eth' + %%str(int_num)) + %%getattr(%%vlan, 'vlan_ip_eth' + %%str(int_num))%slurp +%end for +%end if + +alias_ip_eth%%int_num%slurp +%if %%mode_conteneur_actif == 'non' and %%getVar('alias_eth' + %%str(int_num)) == 'oui' + =%slurp +%for %%alias in %%getVar('alias_ip_eth' + %%str(int_num)) + %%alias%slurp +%end for +%end if + +%end for + +[proxy] +dans_num_opt_filters = %%getVar('dans_num_opt_filters', 3) +num_dansguardian_instance = %%getVar('num_dansguardian_instance', 2) +activer_squid_auth = %slurp +%if %%getVar('activer_squid_auth', 'non') == 'oui' +yes +%else +no +%end if +activer_cntlm = %slurp +%if %%getVar('activer_cntlm', 'non') == 'oui' +yes +cntlm_port = %%cntlm_port +%else +no +%end if +activer_squid2 = %slurp +%if %%getVar('activer_squid2', 'non') == 'oui' +yes +proxy2_port = %%proxy2_port +%else +no +%end if +%for %%int_num in %%range(%%int(%%nombre_interfaces)) +activer_proxy_eth%%int_num = %%getVar('activer_proxy_eth' + %%str(%%int_num), 'oui') +squid_auth_eth%%int_num = %%getVar('squid_auth_eth' + %%str(%%int_num), 'oui') +dansguardian_eth%%int_num = %%getVar('dansguardian_eth' + %%str(%%int_num), 1) +%end for diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/common-squid1.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/common-squid1.conf new file mode 100644 index 0000000000000000000000000000000000000000..ab9c1e2361b9d49f5bbbaf1ec4775b33386eeba4 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/common-squid1.conf @@ -0,0 +1,789 @@ +####################################### +##Librairie de fonctions +####ACL### + +%def set_acl_interfaces(%%interface, %%nom_machine_eth, %%adresse_network_eth, %%adresse_netmask_eth, %%adresse_ip_eth, %%vlan_eth, %%adresse_ip_link) +# definition des acls pour l'interface %%interface +acl to_localhost dst %%adresse_ip_link/32 +acl from_localhost src %%adresse_ip_link/32 +#empêche le fonctionnement de cntlm (#10130) +#acl srcnoauth src %%adresse_ip_eth/32 +acl %%nom_machine_eth src %%adresse_network_eth/%%calc_classe(%%adresse_netmask_eth) + %if %%is_defined('route_adresse') + %for %%i_route_adresse in %%route_adresse + %if %%i_route_adresse.route_int == %%interface +acl %%nom_machine_eth src %%i_route_adresse/%%calc_classe(%%i_route_adresse.route_netmask) + %end if + %end for + %end if + %if %%is_defined('sites_dist_ip') + %for %%lans in %%sites_dist_ip +acl %%nom_machine_eth src %%lans/%%calc_classe(%%lans.sites_dist_netmask) + %end for + %end if + +acl localhosteth%%{interface} dst %%adresse_ip_eth/32 +acl reseaueth%%{interface} dst %%adresse_network_eth/%%calc_classe(%%adresse_netmask_eth) + %if %%is_defined('route_adresse') + %for %%i_route_adresse in %%route_adresse + %if %%i_route_adresse.route_int == %%interface +acl reseaueth%%{interface} dst %%i_route_adresse/%%calc_classe(%%i_route_adresse.route_netmask) + %end if + %end for + %end if + %if %%is_defined('sites_dist_ip') + %for %%lans in %%sites_dist_ip +acl reseaueth%%{interface} dst %%lans/%%calc_classe(%%lans.sites_dist_netmask) + %end for + %end if + %if %%vlan_eth == "oui" + %for %%vlans_iter in %%getVar('vlan_id_eth'+%%interface) + %set %%network_key = "vlan_network_eth" + %%interface + %set %%netmask_key = "vlan_netmask_eth" + %%interface + %set %%ip_key = "vlan_ip_eth" + %%interface + %set %%ip_vlan = %%getattr(%%vlans_iter, %%ip_key) +acl to_localhost dst %%ip_vlan/32 +#empêche le fonctionnement de cntlm (#10130) +#acl srcnoauth src %%ip_vlan/32 +acl vlan_eth%%{interface}_%%vlans_iter src %%getattr(%%vlans_iter, %%network_key)/%%calc_classe(%%getattr(vlans_iter, %%netmask_key)) +%if %%is_defined('route_adresse') +%for %%route_iter in %%route_adresse + %if %%route_iter.route_int == %%interface and %%route_iter.route_vlan_id == %%vlans_iter +acl vlan_eth%%{interface}_%%vlans_iter src %%route_iter/%%calc_classe(route_iter.route_netmask) + %end if +%end for +%end if +acl reseaueth%%{interface}_%%vlans_iter dst %%getattr(%%vlans_iter, %%network_key)/%%calc_classe(%%getattr(%%vlans_iter, %%netmask_key)) +acl localhosteth%%{interface}_%%vlans_iter dst %%ip_vlan/32 + %end for + %end if +%end def + +%def set_acl_ead(%%interface, %%admin_eth) + %if %%admin_eth == "oui" +#acl admin ead pour l'interface %%interface + %for %%idx, %%res_ssh in %%enumerate(%%getVar('ip_admin_eth'+%%interface)) + %if %%res_ssh == '0.0.0.0' +acl eth%%{interface}admin%%idx src all + %else + %set %%netmask_key = "netmask_admin_eth"+%%interface +acl eth%%{interface}admin%%idx src %%res_ssh/%%calc_classe(%%getattr(%%res_ssh, %%netmask_key)) + %end if + %end for + %end if +%end def + +%def set_acl_alias(%%interface, %%alias_eth) + %if %%alias_eth == "oui" +#acl alias IP pour l'interface %%interface + %for %%idx, %%res_alias in %%enumerate(%%getVar('alias_ip_eth'+%%interface)) + %set %%network_val = %%getattr(%%res_alias, "alias_network_eth"+%%interface) + %set %%netmask_val = %%getattr(%%res_alias, "alias_netmask_eth"+%%interface) +acl to_localhost dst %%res_alias/32 +#empêche le fonctionnement de cntlm (#10130) +#acl srcnoauth src %%res_alias/32 +acl eth%%{interface}alias%%idx src %%network_val/%%calc_classe(%%netmask_val) + %end for + %end if +%end def + +###REGLES ### +%def set_eth_ead(%%interface, %%admin_eth, %%vlan_eth) +## Gestion des autorisations de connexion a l'ead de l'amon pour chaque interface + %if %%admin_eth =="non" +http_access deny Reserved localhosteth%%{interface} + %if %%vlan_eth == "oui" + %for %%vlans_iter in %%getVar('vlan_id_eth'+%%interface) +http_access deny Reserved localhosteth%%{interface}_%%vlans_iter + %end for + %end if + %elif %%admin_eth =="oui" + %set %%res_ssh = '' + %for %%idx, %%res_sshx in %%enumerate(%%getVar('ip_admin_eth'+%%interface)) + %set %%res_ssh += ' !eth' + %%interface + 'admin' + str(%%idx) + %end for +http_access deny Reserved localhosteth%%{interface} %%res_ssh + %if %%vlan_eth == "oui" + %for %%vlans_iter in %%getVar('vlan_id_eth'+%%interface) + %set %%res_ssh = '' + %for %%idx, %%res_sshx in %%enumerate(%%getVar('ip_admin_eth'+%%interface)) + %set %%res_ssh += ' !eth' + %%interface + 'admin' + str(%%idx) + %end for +http_access deny Reserved localhosteth%%{interface}_%%vlans_iter %%res_ssh + %end for + %end if + %end if +%end def + +# NETWORK OPTIONS +# ----------------------------------------------------------------------------- + +# TAG: https_port +# Note: This option is only available if Squid is rebuilt with the +# --enable-ssl option +# +# Usage: [ip:]port cert=certificate.pem [key=key.pem] [options...] +# +# The socket address where Squid will listen for HTTPS client +# requests. +# +# This is really only useful for situations where you are running +# squid in accelerator mode and you want to do the SSL work at the +# accelerator level. +# +# You may specify multiple socket addresses on multiple lines, +# each with their own SSL certificate and/or options. +# +# Options: +# +# accel Accelerator mode. Also needs at least one of +# defaultsite or vhost. +# +# defaultsite= The name of the https site presented on +# this port. Implies accel. +# +# vhost Accelerator mode using Host header for virtual +# domain support. Requires a wildcard certificate +# or other certificate valid for more than one domain. +# Implies accel. +# +# protocol= Protocol to reconstruct accelerated requests with. +# Defaults to https. +# +# cert= Path to SSL certificate (PEM format). +# +# key= Path to SSL private key file (PEM format) +# if not specified, the certificate file is +# assumed to be a combined certificate and +# key file. +# +# version= The version of SSL/TLS supported +# 1 automatic (default) +# 2 SSLv2 only +# 3 SSLv3 only +# 4 TLSv1 only +# +# cipher= Colon separated list of supported ciphers. +# +# options= Various SSL engine options. The most important +# being: +# NO_SSLv2 Disallow the use of SSLv2 +# NO_SSLv3 Disallow the use of SSLv3 +# NO_TLSv1 Disallow the use of TLSv1 +# SINGLE_DH_USE Always create a new key when using +# temporary/ephemeral DH key exchanges +# See src/ssl_support.c or OpenSSL SSL_CTX_set_options +# documentation for a complete list of options. +# +# clientca= File containing the list of CAs to use when +# requesting a client certificate. +# +# cafile= File containing additional CA certificates to +# use when verifying client certificates. If unset +# clientca will be used. +# +# capath= Directory containing additional CA certificates +# and CRL lists to use when verifying client certificates. +# +# crlfile= File of additional CRL lists to use when verifying +# the client certificate, in addition to CRLs stored in +# the capath. Implies VERIFY_CRL flag below. +# +# dhparams= File containing DH parameters for temporary/ephemeral +# DH key exchanges. +# +# sslflags= Various flags modifying the use of SSL: +# DELAYED_AUTH +# Don't request client certificates +# immediately, but wait until acl processing +# requires a certificate (not yet implemented). +# NO_DEFAULT_CA +# Don't use the default CA lists built in +# to OpenSSL. +# NO_SESSION_REUSE +# Don't allow for session reuse. Each connection +# will result in a new SSL session. +# VERIFY_CRL +# Verify CRL lists when accepting client +# certificates. +# VERIFY_CRL_ALL +# Verify CRL lists for all certificates in the +# client certificate chain. +# +# sslcontext= SSL session ID context identifier. +# +# vport Accelerator with IP based virtual host support. +# +# vport=NN As above, but uses specified port number rather +# than the https_port number. Implies accel. +# +# name= Specifies a internal name for the port. Defaults to +# the port specification (port or addr:port) +# +#Default: +# none +%if not %%is_empty(%%https_port) +https_port %%https_port transparent +%end if + +# TAG: tcp_outgoing_tos +# Allows you to select a TOS/Diffserv value to mark outgoing +# connections with, based on the username or source address +# making the request. +# +# tcp_outgoing_tos ds-field [!]aclname ... +# +# Example where normal_service_net uses the TOS value 0x00 +# and good_service_net uses 0x20 +# +# acl normal_service_net src 10.0.0.0/255.255.255.0 +# acl good_service_net src 10.0.1.0/255.255.255.0 +# tcp_outgoing_tos 0x00 normal_service_net +# tcp_outgoing_tos 0x20 good_service_net +# +# TOS/DSCP values really only have local significance - so you should +# know what you're specifying. For more information, see RFC2474, +# RFC2475, and RFC3260. +# +# The TOS/DSCP byte must be exactly that - a octet value 0 - 255, or +# "default" to use whatever default your host has. Note that in +# practice often only values 0 - 63 is usable as the two highest bits +# have been redefined for use by ECN (RFC3168). +# +# Processing proceeds in the order specified, and stops at first fully +# matching line. +# +# Note: The use of this directive using client dependent ACLs is +# incompatible with the use of server side persistent connections. To +# ensure correct results it is best to set server_persisten_connections +# to off when using this directive in such configurations. +#Default: +# none + +# TAG: clientside_tos +# Allows you to select a TOS/Diffserv value to mark client-side +# connections with, based on the username or source address +# making the request. +#Default: +# none + +# TAG: qos_flows +# Note: This option is only available if Squid is rebuilt with the +# --enable-zph-qos option +# +# Allows you to select a TOS/DSCP value to mark outgoing +# connections with, based on where the reply was sourced. +# +# TOS values really only have local significance - so you should +# know what you're specifying. For more information, see RFC2474, +# RFC2475, and RFC3260. +# +# The TOS/DSCP byte must be exactly that - octet value 0x00-0xFF. +# Note that in practice often only values up to 0x3F are usable +# as the two highest bits have been redefined for use by ECN +# (RFC3168). +# +# This setting is configured by setting the source TOS values: +# +# local-hit=0xFF Value to mark local cache hits. +# +# sibling-hit=0xFF Value to mark hits from sibling peers. +# +# parent-hit=0xFF Value to mark hits from parent peers. +# +# +# NOTE: 'miss' preserve feature is only possible on Linux at this time. +# +# For the following to work correctly, you will need to patch your +# linux kernel with the TOS preserving ZPH patch. +# The kernel patch can be downloaded from http://zph.bratcheda.org +# +# disable-preserve-miss +# If set, any HTTP response towards clients will +# have the TOS value of the response comming from the +# remote server masked with the value of miss-mask. +# +# miss-mask=0xFF +# Allows you to mask certain bits in the TOS received from the +# remote server, before copying the value to the TOS sent +# towards clients. +# Default: 0xFF (TOS from server is not changed). +# +#Default: +# none + +# TAG: tcp_outgoing_address +# Allows you to map requests to different outgoing IP addresses +# based on the username or source address of the user making +# the request. +# +# tcp_outgoing_address ipaddr [[!]aclname] ... +# +# Example where requests from 10.0.0.0/24 will be forwarded +# with source address 10.1.0.1, 10.0.2.0/24 forwarded with +# source address 10.1.0.2 and the rest will be forwarded with +# source address 10.1.0.3. +# +# acl normal_service_net src 10.0.0.0/24 +# acl good_service_net src 10.0.2.0/24 +# tcp_outgoing_address 10.1.0.1 normal_service_net +# tcp_outgoing_address 10.1.0.2 good_service_net +# tcp_outgoing_address 10.1.0.3 +# +# Processing proceeds in the order specified, and stops at first fully +# matching line. +# +# Note: The use of this directive using client dependent ACLs is +# incompatible with the use of server side persistent connections. To +# ensure correct results it is best to set server_persistent_connections +# to off when using this directive in such configurations. +# +# +# IPv6 Magic: +# +# Squid is built with a capability of bridging the IPv4 and IPv6 +# internets. +# tcp_outgoing_address as exampled above breaks this bridging by forcing +# all outbound traffic through a certain IPv4 which may be on the wrong +# side of the IPv4/IPv6 boundary. +# +# To operate with tcp_outgoing_address and keep the bridging benefits +# an additional ACL needs to be used which ensures the IPv6-bound traffic +# is never forced or permitted out the IPv4 interface. +# +# acl to_ipv6 dst ipv6 +# tcp_outgoing_address 2002::c001 good_service_net to_ipv6 +# tcp_outgoing_address 10.1.0.2 good_service_net !to_ipv6 +# +# tcp_outgoing_address 2002::beef normal_service_net to_ipv6 +# tcp_outgoing_address 10.1.0.1 normal_service_net !to_ipv6 +# +# tcp_outgoing_address 2002::1 to_ipv6 +# tcp_outgoing_address 10.1.0.3 !to_ipv6 +# +# WARNING: +# 'dst ipv6' bases its selection assuming DIRECT access. +# If peers are used the peername ACL are needed to select outgoing +# address which can link to the peer. +# +# 'dst ipv6' is a slow ACL. It will only work here if 'dst' is used +# previously in the http_access rules to locate the destination IP. +# Some more magic may be needed for that: +# http_access allow to_ipv6 !all +# (meaning, allow if to IPv6 but not from anywhere ;) +# +#Default: +# none +#tcp_outgoing_address + +#Evite les warnings de l'ipv6 +#acl all src all +acl manager proto cache_object +acl PURGE method purge +acl localdest dst 127.0.0.1/32 +#ATTENTION a reporter dans 00_proxy.fw +acl SSL_ports port 443 563 631 4000-5000 6080 8062 8070 8090 8443 8753 7070 +%for %%ssl_iter in %%ssl_ports +acl SSL_ports port %%ssl_iter +%end for +#ATTENTION a reporter dans 00_proxy.fw +acl Safe_ports port 80 21 443 563 70 210 631 1025-65535 +acl Safe_ports port 280 +acl Safe_ports port 488 +acl Safe_ports port 591 +acl Safe_ports port 777 +%for %%safe_iter in %%safe_ports +acl Safe_ports port %%safe_iter +%end for +acl Reserved port 4200 +acl CONNECT method CONNECT +#windows update +##Déporté dans acl noauth ... +#acl winupdate dstdomain .windowsupdate.microsoft.com +#acl winupdate dstdomain .update.microsoft.com +#acl winupdate dstdomain .c.microsoft.com +#acl winupdate dstdomain .windowsupdate.com +# +#MAJ Eole +# déplacé dans les templates domaines_noauth et domaines_nocache +#domaines accessibles sans authentification +acl noauth dstdomain "/etc/squid/domaines_noauth" +acl noauth dstdomain "/etc/squid/domaines_noauth_user" +acl noauth dstdomain "/etc/squid/domaines_noauth_acad" +#domaines pas caches +acl nocache dstdomain "/etc/squid/domaines_nocache" +acl nocache dstdomain "/etc/squid/domaines_nocache_user" +acl nocache dstdomain "/etc/squid/domaines_nocache_acad" +# sources à ne pas authentifier +acl srcnoauth src "/etc/squid/src_noauth" +acl srcnoauth src "/etc/squid/src_noauth_user" +acl srcnoauth src "/etc/squid/src_noauth_acad" +# source sans cache +acl srcnocache src "/etc/squid/src_nocache" +acl srcnocache src "/etc/squid/src_nocache_user" +acl srcnocache src "/etc/squid/src_nocache_acad" +#domaines auquels on peut accéder directement (pas passer par un proxy père) +acl nopeerproxy dstdomain "/etc/squid/domaines_nopeerproxy" +%if %%is_defined('wan_route_adresse') +acl nopeerproxip dst "/etc/squid/domaines_nopeerproxy_ip" +%end if + +%if %%squid_nopeerproxy_url_regex == 'oui' +acl nopeerproxy url_regex "/etc/squid/domaines_nopeerproxy_regex" +%end if +## +%if %%activer_cache_pere_zone == 'oui' + %set %%list_nom_zone_dns_cache = [] + %for %%idx, %%zones_iter in %%enumerate(%%nom_cache_pere_zone) + %if %%zones_iter.nom_zone_dns_cache not in %%list_nom_zone_dns_cache + %if %%zones_iter.type_nom_zone_dns_cache == 'DNS' +acl intradom%%idx dstdomain %%zones_iter.nom_zone_dns_cache + %else +acl intradom%%idx dstdomain "%%zones_iter.nom_zone_dns_cache" + %end if + %%list_nom_zone_dns_cache.append(%%zones_iter.nom_zone_dns_cache) + %end if + %end for +%end if +##Rvp +%if %%getVar('acces_proxy_zone_rvp', 'non') == 'oui' + %for %%idx, %%net_iter in %%enumerate(%%adresse_network_zone_rvp) +acl rvpdom%%idx dst %%net_iter/%%calc_classe(%%net_iter.adresse_netmask_zone_rvp) + %end for +%end if +## + +## déf des acls pour eth0 +%if %%mode_conteneur_actif == 'oui' and %%nombre_interfaces == "1" + %set %%adresse_ip = %%adresse_ip_eth0_proxy_link +%else + %set %%adresse_ip = %%adresse_ip_eth0 +%end if +%%set_acl_interfaces('0', %%nom_machine, %%adresse_network_eth0, %%adresse_netmask_eth0, %%adresse_ip_eth0, %%vlan_eth0, %%adresse_ip) + +%if %%is_defined('proxy_eth0_ip') and not %%is_empty(%%proxy_eth0_ip) +# Adresse IP ou réseau supplémentaire autorisé à se connecter sur le proxy + %for %%proxy_eth0 in %%proxy_eth0_ip +acl %%nom_machine src %%proxy_eth0/%%calc_classe(%%proxy_eth0.proxy_eth0_netmask) +acl reseaueth0 dst %%proxy_eth0/%%calc_classe(%%proxy_eth0.proxy_eth0_netmask) + %end for +%end if + +%%set_acl_ead('0', %%getVar('admin_eth0', 'non')) +%%set_acl_alias('0', %%alias_eth0) + +%if %%nombre_interfaces >= "2" +## déf des acls pour eth1 + %if %%mode_conteneur_actif == 'non' + %set %%adresse_ip = %%adresse_ip_eth1 + %else + %set %%adresse_ip = %%adresse_ip_eth1_proxy_link + %end if +%%set_acl_interfaces('1', %%nom_machine_eth1, %%adresse_network_eth1, %%adresse_netmask_eth1, %%adresse_ip_eth1, %%vlan_eth1, %%adresse_ip) +%%set_acl_ead('1', %%admin_eth1) +%%set_acl_alias('1', %%alias_eth1) +%end if + +%if %%nombre_interfaces >= "3" +## déf des acls pour eth2 + %if %%mode_conteneur_actif == 'non' + %set %%adresse_ip = %%adresse_ip_eth2 + %else + %set %%adresse_ip = %%adresse_ip_eth2_proxy_link + %end if +%%set_acl_interfaces('2', %%nom_machine_eth2, %%adresse_network_eth2, %%adresse_netmask_eth2, %%adresse_ip_eth2, %%vlan_eth2, %%adresse_ip) +%%set_acl_ead('2', %%admin_eth2) +%%set_acl_alias('2', %%alias_eth2) +%end if + +%if %%nombre_interfaces >= "4" +## déf des acls pour eth3 +%%set_acl_interfaces('3', %%nom_machine_eth3, %%adresse_network_eth3, %%adresse_netmask_eth3, %%adresse_ip_eth3, %%vlan_eth3, %%adresse_ip_eth3) +%%set_acl_ead('3', %%admin_eth3) +%%set_acl_alias('3', %%alias_eth3) +%end if + +%if %%nombre_interfaces == "5" +## déf des acls pour eth4 +%%set_acl_interfaces('4', %%nom_machine_eth4, %%adresse_network_eth4, %%adresse_netmask_eth4, %%adresse_ip_eth4, %%vlan_eth4, %%adresse_ip_eth4) +%%set_acl_ead('4', %%admin_eth4) +%%set_acl_alias('4', %%alias_eth4) +%end if + +acl proxy_port port 3128 +%if %%is_defined('proxy2_port') +acl proxy_port port %%proxy2_port +%end if +http_access allow manager localhost +http_access deny manager +# On interdit de boucler sur lui-même +http_access deny to_localhost proxy_port + +acl localdom dstdomain .%%nom_domaine_local +# acl for request coming from root container (used for snmp querying) +acl lxcroot src %%adresse_ip_br0/32 + +%if %%activer_proxy_sibling == 'oui' +#sibling + %set %%squid_sibling = '' + %for %%proxy_sibling in %%proxy_sibling_ip + %set %%squid_sibling += ' ' + str(%%proxy_sibling) + '/32' + %end for +acl src_sibling src %%squid_sibling +%end if +# TAG: follow_x_forwarded_for +# Allowing or Denying the X-Forwarded-For header to be followed to +# find the original source of a request. +# +# Requests may pass through a chain of several other proxies +# before reaching us. The X-Forwarded-For header will contain a +# comma-separated list of the IP addresses in the chain, with the +# rightmost address being the most recent. +# +# If a request reaches us from a source that is allowed by this +# configuration item, then we consult the X-Forwarded-For header +# to see where that host received the request from. If the +# X-Forwarded-For header contains multiple addresses, we continue +# backtracking until we reach an address for which we are not allowed +# to follow the X-Forwarded-For header, or until we reach the first +# address in the list. For the purpose of ACL used in the +# follow_x_forwarded_for directive the src ACL type always matches +# the address we are testing and srcdomain matches its rDNS. +# +# The end result of this process is an IP address that we will +# refer to as the indirect client address. This address may +# be treated as the client address for access control, ICAP, delay +# pools and logging, depending on the acl_uses_indirect_client, +# icap_uses_indirect_client, delay_pool_uses_indirect_client and +# log_uses_indirect_client options. +# +# This clause only supports fast acl types. +# See http://wiki.squid-cache.org/SquidFaq/SquidAcl for details. +# +# SECURITY CONSIDERATIONS: +# +# Any host for which we follow the X-Forwarded-For header +# can place incorrect information in the header, and Squid +# will use the incorrect information as if it were the +# source address of the request. This may enable remote +# hosts to bypass any access control restrictions that are +# based on the client's source addresses. +# +# For example: +# +# acl localhost src 127.0.0.1 +# acl my_other_proxy srcdomain .proxy.example.com +# follow_x_forwarded_for allow localhost +# follow_x_forwarded_for allow my_other_proxy +#Default: +# follow_x_forwarded_for deny all +##EOLE +# DansGuardian +follow_x_forwarded_for allow localhost +follow_x_forwarded_for allow from_localhost + +# TAG: acl_uses_indirect_client on|off +# Controls whether the indirect client address +# (see follow_x_forwarded_for) is used instead of the +# direct client address in acl matching. +#Default: +# acl_uses_indirect_client on +##EOLE +acl_uses_indirect_client on + +# TAG: delay_pool_uses_indirect_client on|off +# Controls whether the indirect client address +# (see follow_x_forwarded_for) is used instead of the +# direct client address in delay pools. +#Default: +# delay_pool_uses_indirect_client on +##EOLE +delay_pool_uses_indirect_client on + +# TAG: log_uses_indirect_client on|off +# Controls whether the indirect client address +# (see follow_x_forwarded_for) is used instead of the +# direct client address in the access log. +#Default: +# log_uses_indirect_client on +##EOLE +log_uses_indirect_client on + +# TAG: http_access +# Allowing or Denying access based on defined access lists +# +# Access to the HTTP port: +# http_access allow|deny [!]aclname ... +# +# NOTE on default values: +# +# If there are no "access" lines present, the default is to deny +# the request. +# +# If none of the "access" lines cause a match, the default is the +# opposite of the last line in the list. If the last line was +# deny, the default is allow. Conversely, if the last line +# is allow, the default will be deny. For these reasons, it is a +# good idea to have an "deny all" entry at the end of your access +# lists to avoid potential confusion. +# +# This clause supports both fast and slow acl types. +# See http://wiki.squid-cache.org/SquidFaq/SquidAcl for details. +# +#Default: +# http_access deny all +# + +# +# Recommended minimum Access Permission configuration: +# +# Only allow cachemgr access from localhost +# only allow purge from localhost +http_access allow purge localhost +http_access deny purge +# Deny requests to unknown ports +http_access deny !Safe_ports +# Deny CONNECT to other than SSL ports +http_access deny CONNECT !SSL_ports + +# We strongly recommend the following be uncommented to protect innocent +# web applications running on the proxy server who think the only +# one who can access services on "localhost" is a local user +#http_access deny to_localhost + +# +# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS +# + +# Example rule allowing access from your local networks. +# Adapt localnet in the ACL section to list your (internal) IP networks +# from where browsing should be allowed +#http_access allow localnet +http_access allow localhost + +## connexion à l'ead de l'amon pour les interfaces (a cette hauteur #2729) +%%set_eth_ead('0', %%getVar('admin_eth0', 'non'), %%vlan_eth0) + +%if %%nombre_interfaces >= "2" +%%set_eth_ead('1', %%admin_eth1, %%vlan_eth1) +%end if + +%if %%nombre_interfaces >= "3" +%%set_eth_ead('2', %%admin_eth2, %%vlan_eth2) +%end if + +%if %%nombre_interfaces >= "4" +%%set_eth_ead('3', %%admin_eth3, %%vlan_eth3) +%end if + +%if %%nombre_interfaces == "5" +%%set_eth_ead('4', %%admin_eth4, %%vlan_eth4) +%end if + +# Autoriser reseau eth0 uniquement pour les stations de ce reseau +%if %%nombre_interfaces == '1' + %if %%vlan_eth0 == "oui" + %set %%http_vlans = '' + %for %%vlans_0 in %%vlan_id_eth0 + %set %%http_vlans += ' !vlan_eth0_' + str(%%vlans_0) + %end for +http_access deny reseaueth0 !%%nom_machine %%http_vlans + %else +http_access deny reseaueth0 !%%nom_machine + %end if +# Intradom + %if %%activer_cache_pere_zone == 'oui' + %for %%idx, %%zones_iter in %%enumerate(%%nom_cache_pere_zone) + %if %%getattr(%%zones_iter, 'autoriser_proxy_autres', 'oui') == 'non' + %set %%http_vlans = '' + %if %%vlan_eth0 == "oui" + %for %%vlans_0 in %%vlan_id_eth0 + %set %%http_vlans += ' !vlan_eth0_' + str(%%vlans_0) + %end for + %end if +http_access deny intradom%%idx !%%nom_machine %%http_vlans + %end if + %end for + %end if +%end if + +# Autoriser reseau eth1 uniquement pour les stations de ce reseau +%if %%nombre_interfaces >= "2" + %set %%http_vlans = '' + %if %%vlan_eth1 == "oui" + %for %%vlans_1 in %%vlan_id_eth1 + %set %%http_vlans += ' !vlan_eth1_' + str(%%vlans_1) + %end for + %end if +http_access deny reseaueth1 !%%nom_machine_eth1 %%http_vlans +# Intradom + %if %%activer_cache_pere_zone == 'oui' + %for %%idx, %%zones_iter in %%enumerate(%%nom_cache_pere_zone) + %if %%getattr(%%zones_iter, 'autoriser_proxy_autres', 'oui') == 'non' + %set %%http_vlans = '' + %if %%vlan_eth1 == "oui" + %for %%vlans_1 in %%vlan_id_eth1 + %set %%http_vlans += ' !vlan_eth1_' + str(%%vlans_1) + %end for + %end if +http_access deny intradom%%idx !%%nom_machine_eth1 %%http_vlans + %end if + %end for + %end if +%end if + +## connexion aux reseaux internes +%if %%nombre_interfaces >= "3" +http_access allow reseaueth2 +%if %%vlan_eth2 == "oui" +%for %%vlans2 in %%vlan_id_eth2 +http_access allow reseaueth2_%%vlans2 +%end for +%end if +%end if +%if %%nombre_interfaces >= "4" +http_access allow reseaueth3 +%if %%vlan_eth3 == "oui" +%for %%vlans3 in %%vlan_id_eth3 +http_access allow reseaueth3_%%vlans3 +%end for +%end if +%end if +%if %%nombre_interfaces >= "5" +http_access allow reseaueth4 +%if %%vlan_eth4 == "oui" +%for %%vlans4 in %%vlan_id_eth4 +http_access allow reseaueth4_%%vlans4 +%end for +%end if +%end if +%if %%is_defined('nom_dmz') +http_access allow reseaudmz +%end if + +#rvp +%if %%getVar('acces_proxy_zone_rvp', 'non') == 'oui' + %for %%idx, %%net_iter in %%enumerate(%%adresse_network_zone_rvp) + %if %%net_iter.autoriser_rvp_autres == 'oui' +http_access allow rvpdom%%idx + %end if + %end for + %for %%idx, %%net_iter in %%enumerate(%%adresse_network_zone_rvp) + %if %%net_iter.autoriser_rvp_autres == 'non' + %if %%vlan_eth1 == "oui" +http_access allow rvpdom%%idx %%nom_machine_eth1 + %for %%idx2, %%vlans_1 in %%enumerate(%%vlan_id_eth1) +http_access allow rvpdom%%idx vlan_eth1_%%vlans_1 + %end for +http_access deny rvpdom%%idx all + %else +http_access deny rvpdom%%idx !%%nom_machine_eth1 + %end if + %end if + %end for +%end if + +#domaines accessibles sans auth +http_access allow noauth +http_access allow srcnoauth + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/common-squid2.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/common-squid2.conf new file mode 100644 index 0000000000000000000000000000000000000000..66a72408ee75690dcb390884f2caf05fe1ffe075 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/common-squid2.conf @@ -0,0 +1,4449 @@ +# And finally deny all other access to this proxy +http_access deny all + +# TAG: adapted_http_access +# Allowing or Denying access based on defined access lists +# +# Essentially identical to http_access, but runs after redirectors +# and ICAP/eCAP adaptation. Allowing access control based on their +# output. +# +# If not set then only http_access is used. +#Default: +# none + +# TAG: http_reply_access +# Allow replies to client requests. This is complementary to http_access. +# +# http_reply_access allow|deny [!] aclname ... +# +# NOTE: if there are no access lines present, the default is to allow +# all replies +# +# If none of the access lines cause a match the opposite of the +# last line will apply. Thus it is good practice to end the rules +# with an "allow all" or "deny all" entry. +# +# This clause supports both fast and slow acl types. +# See http://wiki.squid-cache.org/SquidFaq/SquidAcl for details. +#Default: +# none +##EOLE +http_reply_access allow all + +# TAG: icp_access +# Allowing or Denying access to the ICP port based on defined +# access lists +# +# icp_access allow|deny [!]aclname ... +# +# See http_access for details +# +# This clause only supports fast acl types. +# See http://wiki.squid-cache.org/SquidFaq/SquidAcl for details. +# +## Allow ICP queries from local networks only +##icp_access allow localnet +##icp_access deny all +#Default: +%if %%activer_proxy_sibling == 'oui' +icp_access allow src_sibling +%end if +icp_access deny all + +# TAG: htcp_access +# Allowing or Denying access to the HTCP port based on defined +# access lists +# +# htcp_access allow|deny [!]aclname ... +# +# See http_access for details +# +# NOTE: The default if no htcp_access lines are present is to +# deny all traffic. This default may cause problems with peers +# using the htcp or htcp-oldsquid options. +# +# This clause only supports fast acl types. +# See http://wiki.squid-cache.org/SquidFaq/SquidAcl for details. +# +## Allow HTCP queries from local networks only +##htcp_access allow localnet +##htcp_access deny all +#Default: +htcp_access deny all + +# TAG: htcp_clr_access +# Allowing or Denying access to purge content using HTCP based +# on defined access lists +# +# htcp_clr_access allow|deny [!]aclname ... +# +# See http_access for details +# +# This clause only supports fast acl types. +# See http://wiki.squid-cache.org/SquidFaq/SquidAcl for details. +# +## Allow HTCP CLR requests from trusted peers +#acl htcp_clr_peer src 172.16.1.2 +#htcp_clr_access allow htcp_clr_peer +#Default: +# htcp_clr_access deny all + +# TAG: miss_access +# Use to force your neighbors to use you as a sibling instead of +# a parent. For example: +# +# acl localclients src 172.16.0.0/16 +# miss_access allow localclients +# miss_access deny !localclients +# +# This means only your local clients are allowed to fetch +# MISSES and all other clients can only fetch HITS. +# +# By default, allow all clients who passed the http_access rules +# to fetch MISSES from us. +# +# This clause only supports fast acl types. +# See http://wiki.squid-cache.org/SquidFaq/SquidAcl for details. +#Default: +# miss_access allow all + +# TAG: ident_lookup_access +# A list of ACL elements which, if matched, cause an ident +# (RFC 931) lookup to be performed for this request. For +# example, you might choose to always perform ident lookups +# for your main multi-user Unix boxes, but not for your Macs +# and PCs. By default, ident lookups are not performed for +# any requests. +# +# To enable ident lookups for specific client addresses, you +# can follow this example: +# +# acl ident_aware_hosts src 198.168.1.0/24 +# ident_lookup_access allow ident_aware_hosts +# ident_lookup_access deny all +# +# Only src type ACL checks are fully supported. A srcdomain +# ACL might work at times, but it will not always provide +# the correct result. +# +# This clause only supports fast acl types. +# See http://wiki.squid-cache.org/SquidFaq/SquidAcl for details. +#Default: +ident_lookup_access deny all +# TAG: reply_body_max_size size [acl acl...] +# This option specifies the maximum size of a reply body. It can be +# used to prevent users from downloading very large files, such as +# MP3's and movies. When the reply headers are received, the +# reply_body_max_size lines are processed, and the first line where +# all (if any) listed ACLs are true is used as the maximum body size +# for this reply. +# +# This size is checked twice. First when we get the reply headers, +# we check the content-length value. If the content length value exists +# and is larger than the allowed size, the request is denied and the +# user receives an error message that says "the request or reply +# is too large." If there is no content-length, and the reply +# size exceeds this limit, the client's connection is just closed +# and they will receive a partial reply. +# +# WARNING: downstream caches probably can not detect a partial reply +# if there is no content-length header, so they will cache +# partial responses and give them out as hits. You should NOT +# use this option if you have downstream caches. +# +# WARNING: A maximum size smaller than the size of squid's error messages +# will cause an infinite loop and crash squid. Ensure that the smallest +# non-zero value you use is greater that the maximum header size plus +# the size of your largest error page. +# +# If you set this parameter none (the default), there will be +# no limit imposed. +# +# Configuration Format is: +# reply_body_max_size SIZE UNITS [acl ...] +# ie. +# reply_body_max_size 10 MB +# +#Default: +# none + + +# SSL OPTIONS +# ----------------------------------------------------------------------------- + +# TAG: ssl_unclean_shutdown +# Note: This option is only available if Squid is rebuilt with the +# --enable-ssl option +# +# Some browsers (especially MSIE) bugs out on SSL shutdown +# messages. +#Default: +# ssl_unclean_shutdown off + +# TAG: ssl_engine +# Note: This option is only available if Squid is rebuilt with the +# --enable-ssl option +# +# The OpenSSL engine to use. You will need to set this if you +# would like to use hardware SSL acceleration for example. +#Default: +# none + +# TAG: sslproxy_client_certificate +# Note: This option is only available if Squid is rebuilt with the +# --enable-ssl option +# +# Client SSL Certificate to use when proxying https:// URLs +#Default: +# none + +# TAG: sslproxy_client_key +# Note: This option is only available if Squid is rebuilt with the +# --enable-ssl option +# +# Client SSL Key to use when proxying https:// URLs +#Default: +# none + +# TAG: sslproxy_version +# Note: This option is only available if Squid is rebuilt with the +# --enable-ssl option +# +# SSL version level to use when proxying https:// URLs +#Default: +# sslproxy_version 1 + +# TAG: sslproxy_options +# Note: This option is only available if Squid is rebuilt with the +# --enable-ssl option +# +# SSL engine options to use when proxying https:// URLs +# +# The most important being: +# +# NO_SSLv2 Disallow the use of SSLv2 +# NO_SSLv3 Disallow the use of SSLv3 +# NO_TLSv1 Disallow the use of TLSv1 +# SINGLE_DH_USE +# Always create a new key when using +# temporary/ephemeral DH key exchanges +# +# These options vary depending on your SSL engine. +# See the OpenSSL SSL_CTX_set_options documentation for a +# complete list of possible options. +#Default: +# none + +# TAG: sslproxy_cipher +# Note: This option is only available if Squid is rebuilt with the +# --enable-ssl option +# +# SSL cipher list to use when proxying https:// URLs +# +# Colon separated list of supported ciphers. +#Default: +# none + +# TAG: sslproxy_cafile +# Note: This option is only available if Squid is rebuilt with the +# --enable-ssl option +# +# file containing CA certificates to use when verifying server +# certificates while proxying https:// URLs +#Default: +# none + +# TAG: sslproxy_capath +# Note: This option is only available if Squid is rebuilt with the +# --enable-ssl option +# +# directory containing CA certificates to use when verifying +# server certificates while proxying https:// URLs +#Default: +# none + +# TAG: ssl_bump +# Note: This option is only available if Squid is rebuilt with the +# --enable-ssl option +# +# This ACL controls which CONNECT requests to an http_port +# marked with an sslBump flag are actually "bumped". Please +# see the sslBump flag of an http_port option for more details +# about decoding proxied SSL connections. +# +# By default, no requests are bumped. +# +# See also: http_port sslBump +# +# This clause only supports fast acl types. +# See http://wiki.squid-cache.org/SquidFaq/SquidAcl for details. +# +# +# # Example: Bump all requests except those originating from localhost and +# # those going to webax.com or example.com sites. +# +# acl localhost src 127.0.0.1/32 +# acl broken_sites dstdomain .webax.com +# acl broken_sites dstdomain .example.com +# ssl_bump deny localhost +# ssl_bump deny broken_sites +# ssl_bump allow all +#Default: +# none + +# TAG: sslproxy_flags +# Note: This option is only available if Squid is rebuilt with the +# --enable-ssl option +# +# Various flags modifying the use of SSL while proxying https:// URLs: +# DONT_VERIFY_PEER Accept certificates that fail verification. +# For refined control, see sslproxy_cert_error. +# NO_DEFAULT_CA Don't use the default CA list built in +# to OpenSSL. +#Default: +# none + +# TAG: sslproxy_cert_error +# Note: This option is only available if Squid is rebuilt with the +# --enable-ssl option +# +# Use this ACL to bypass server certificate validation errors. +# +# For example, the following lines will bypass all validation errors +# when talking to servers located at 172.16.0.0/16. All other +# validation errors will result in ERR_SECURE_CONNECT_FAIL error. +# +# acl BrokenServersAtTrustedIP dst 172.16.0.0/16 +# sslproxy_cert_error allow BrokenServersAtTrustedIP +# sslproxy_cert_error deny all +# +# This clause only supports fast acl types. +# See http://wiki.squid-cache.org/SquidFaq/SquidAcl for details. +# Using slow acl types may result in server crashes +# +# Without this option, all server certificate validation errors +# terminate the transaction. Bypassing validation errors is dangerous +# because an error usually implies that the server cannot be trusted and +# the connection may be insecure. +# +# See also: sslproxy_flags and DONT_VERIFY_PEER. +# +# Default setting: sslproxy_cert_error deny all +#Default: +# none + +# TAG: sslpassword_program +# Note: This option is only available if Squid is rebuilt with the +# --enable-ssl option +# +# Specify a program used for entering SSL key passphrases +# when using encrypted SSL certificate keys. If not specified +# keys must either be unencrypted, or Squid started with the -N +# option to allow it to query interactively for the passphrase. +#Default: +# none + +# OPTIONS WHICH AFFECT THE NEIGHBOR SELECTION ALGORITHM +# ----------------------------------------------------------------------------- + +# TAG: cache_peer +# To specify other caches in a hierarchy, use the format: +# +# cache_peer hostname type http-port icp-port [options] +# +# For example, +# +# # proxy icp +# # hostname type port port options +# # -------------------- -------- ----- ----- ----------- +# cache_peer parent.foo.net parent 3128 3130 default +# cache_peer sib1.foo.net sibling 3128 3130 proxy-only +# cache_peer sib2.foo.net sibling 3128 3130 proxy-only +# cache_peer example.com parent 80 0 no-query default +# cache_peer cdn.example.com sibling 3128 0 +# +# type: either 'parent', 'sibling', or 'multicast'. +# +# proxy-port: The port number where the peer accept HTTP requests. +# For other Squid proxies this is usually 3128 +# For web servers this is usually 80 +# +# icp-port: Used for querying neighbor caches about objects. +# Set to 0 if the peer does not support ICP or HTCP. +# See ICP and HTCP options below for additional details. +# +# +# ==== ICP OPTIONS ==== +# +# You MUST also set icp_port and icp_access explicitly when using these options. +# The defaults will prevent peer traffic using ICP. +# +# +# no-query Disable ICP queries to this neighbor. +# +# multicast-responder +# Indicates the named peer is a member of a multicast group. +# ICP queries will not be sent directly to the peer, but ICP +# replies will be accepted from it. +# +# closest-only Indicates that, for ICP_OP_MISS replies, we'll only forward +# CLOSEST_PARENT_MISSes and never FIRST_PARENT_MISSes. +# +# background-ping +# To only send ICP queries to this neighbor infrequently. +# This is used to keep the neighbor round trip time updated +# and is usually used in conjunction with weighted-round-robin. +# +# +# ==== HTCP OPTIONS ==== +# +# You MUST also set htcp_port and htcp_access explicitly when using these options. +# The defaults will prevent peer traffic using HTCP. +# +# +# htcp Send HTCP, instead of ICP, queries to the neighbor. +# You probably also want to set the "icp-port" to 4827 +# instead of 3130. +# +# htcp-oldsquid Send HTCP to old Squid versions. +# +# htcp-no-clr Send HTCP to the neighbor but without +# sending any CLR requests. This cannot be used with +# htcp-only-clr. +# +# htcp-only-clr Send HTCP to the neighbor but ONLY CLR requests. +# This cannot be used with htcp-no-clr. +# +# htcp-no-purge-clr +# Send HTCP to the neighbor including CLRs but only when +# they do not result from PURGE requests. +# +# htcp-forward-clr +# Forward any HTCP CLR requests this proxy receives to the peer. +# +# +# ==== PEER SELECTION METHODS ==== +# +# The default peer selection method is ICP, with the first responding peer +# being used as source. These options can be used for better load balancing. +# +# +# default This is a parent cache which can be used as a "last-resort" +# if a peer cannot be located by any of the peer-selection methods. +# If specified more than once, only the first is used. +# +# round-robin Load-Balance parents which should be used in a round-robin +# fashion in the absence of any ICP queries. +# weight=N can be used to add bias. +# +# weighted-round-robin +# Load-Balance parents which should be used in a round-robin +# fashion with the frequency of each parent being based on the +# round trip time. Closer parents are used more often. +# Usually used for background-ping parents. +# weight=N can be used to add bias. +# +# carp Load-Balance parents which should be used as a CARP array. +# The requests will be distributed among the parents based on the +# CARP load balancing hash function based on their weight. +# +# userhash Load-balance parents based on the client proxy_auth or ident username. +# +# sourcehash Load-balance parents based on the client source IP. +# +# multicast-siblings +# To be used only for cache peers of type "multicast". +# ALL members of this multicast group have "sibling" +# relationship with it, not "parent". This is to a mulicast +# group when the requested object would be fetched only from +# a "parent" cache, anyway. It's useful, e.g., when +# configuring a pool of redundant Squid proxies, being +# members of the same multicast group. +# +# +# ==== PEER SELECTION OPTIONS ==== +# +# weight=N use to affect the selection of a peer during any weighted +# peer-selection mechanisms. +# The weight must be an integer; default is 1, +# larger weights are favored more. +# This option does not affect parent selection if a peering +# protocol is not in use. +# +# basetime=N Specify a base amount to be subtracted from round trip +# times of parents. +# It is subtracted before division by weight in calculating +# which parent to fectch from. If the rtt is less than the +# base time the rtt is set to a minimal value. +# +# ttl=N Specify a IP multicast TTL to use when sending an ICP +# queries to this address. +# Only useful when sending to a multicast group. +# Because we don't accept ICP replies from random +# hosts, you must configure other group members as +# peers with the 'multicast-responder' option. +# +# no-delay To prevent access to this neighbor from influencing the +# delay pools. +# +# digest-url=URL Tell Squid to fetch the cache digest (if digests are +# enabled) for this host from the specified URL rather +# than the Squid default location. +# +# +# ==== ACCELERATOR / REVERSE-PROXY OPTIONS ==== +# +# originserver Causes this parent to be contacted as an origin server. +# Meant to be used in accelerator setups when the peer +# is a web server. +# +# forceddomain=name +# Set the Host header of requests forwarded to this peer. +# Useful in accelerator setups where the server (peer) +# expects a certain domain name but clients may request +# others. ie example.com or www.example.com +# +# no-digest Disable request of cache digests. +# +# no-netdb-exchange +# Disables requesting ICMP RTT database (NetDB). +# +# +# ==== AUTHENTICATION OPTIONS ==== +# +# login=user:password +# If this is a personal/workgroup proxy and your parent +# requires proxy authentication. +# +# Note: The string can include URL escapes (i.e. %20 for +# spaces). This also means % must be written as %%. +# +# login=PROXYPASS +# Send login details received from client to this peer. +# Authentication is not required, nor changed. +# +# Note: This will pass any form of authentication but +# only Basic auth will work through a proxy unless the +# connection-auth options are also used. +# +# login=PASS Send login details received from client to this peer. +# Authentication is not required by this option. +# If there are no client-provided authentication headers +# to pass on, but username and password are available +# from either proxy login or an external ACL user= and +# password= result tags they may be sent instead. +# +# Note: To combine this with proxy_auth both proxies must +# share the same user database as HTTP only allows for +# a single login (one for proxy, one for origin server). +# Also be warned this will expose your users proxy +# password to the peer. USE WITH CAUTION +# +# login=*:password +# Send the username to the upstream cache, but with a +# fixed password. This is meant to be used when the peer +# is in another administrative domain, but it is still +# needed to identify each user. +# The star can optionally be followed by some extra +# information which is added to the username. This can +# be used to identify this proxy to the peer, similar to +# the login=username:password option above. +# +# connection-auth=on|off +# Tell Squid that this peer does or not support Microsoft +# connection oriented authentication, and any such +# challenges received from there should be ignored. +# Default is auto to automatically determine the status +# of the peer. +# +# +# ==== SSL / HTTPS / TLS OPTIONS ==== +# +# ssl Encrypt connections to this peer with SSL/TLS. +# +# sslcert=/path/to/ssl/certificate +# A client SSL certificate to use when connecting to +# this peer. +# +# sslkey=/path/to/ssl/key +# The private SSL key corresponding to sslcert above. +# If 'sslkey' is not specified 'sslcert' is assumed to +# reference a combined file containing both the +# certificate and the key. +# +# sslversion=1|2|3|4 +# The SSL version to use when connecting to this peer +# 1 = automatic (default) +# 2 = SSL v2 only +# 3 = SSL v3 only +# 4 = TLS v1 only +# +# sslcipher=... The list of valid SSL ciphers to use when connecting +# to this peer. +# +# ssloptions=... Specify various SSL engine options: +# NO_SSLv2 Disallow the use of SSLv2 +# NO_SSLv3 Disallow the use of SSLv3 +# NO_TLSv1 Disallow the use of TLSv1 +# See src/ssl_support.c or the OpenSSL documentation for +# a more complete list. +# +# sslcafile=... A file containing additional CA certificates to use +# when verifying the peer certificate. +# +# sslcapath=... A directory containing additional CA certificates to +# use when verifying the peer certificate. +# +# sslcrlfile=... A certificate revocation list file to use when +# verifying the peer certificate. +# +# sslflags=... Specify various flags modifying the SSL implementation: +# +# DONT_VERIFY_PEER +# Accept certificates even if they fail to +# verify. +# NO_DEFAULT_CA +# Don't use the default CA list built in +# to OpenSSL. +# DONT_VERIFY_DOMAIN +# Don't verify the peer certificate +# matches the server name +# +# ssldomain= The peer name as advertised in it's certificate. +# Used for verifying the correctness of the received peer +# certificate. If not specified the peer hostname will be +# used. +# +# front-end-https +# Enable the "Front-End-Https: On" header needed when +# using Squid as a SSL frontend in front of Microsoft OWA. +# See MS KB document Q307347 for details on this header. +# If set to auto the header will only be added if the +# request is forwarded as a https:// URL. +# +# +# ==== GENERAL OPTIONS ==== +# +# connect-timeout=N +# A peer-specific connect timeout. +# Also see the peer_connect_timeout directive. +# +# connect-fail-limit=N +# How many times connecting to a peer must fail before +# it is marked as down. Default is 10. +# +# allow-miss Disable Squid's use of only-if-cached when forwarding +# requests to siblings. This is primarily useful when +# icp_hit_stale is used by the sibling. To extensive use +# of this option may result in forwarding loops, and you +# should avoid having two-way peerings with this option. +# For example to deny peer usage on requests from peer +# by denying cache_peer_access if the source is a peer. +# +# max-conn=N Limit the amount of connections Squid may open to this +# peer. see also +# +# name=xxx Unique name for the peer. +# Required if you have multiple peers on the same host +# but different ports. +# This name can be used in cache_peer_access and similar +# directives to dentify the peer. +# Can be used by outgoing access controls through the +# peername ACL type. +# +# no-tproxy Do not use the client-spoof TPROXY support when forwarding +# requests to this peer. Use normal address selection instead. +# +# proxy-only objects fetched from the peer will not be stored locally. +# +#Default: +# none +%if %%activer_cache_pere_zone == 'oui' +# EOLE +# construit un dictionnaire "dict_nom_zone_dns_cache" avec comme clef les valeurs +# des variables "nom_zone_dns_cache" et comme valeur le nom de l'ACL de la zone +# si un "nom_zone_dns_cache" est déjà dans "dict_nom_zone_dns_cache", considère +# que l'ACL est dupliqué, donc utilise le nom de l'ACL déjà créé et le place +# dans le dictionnaire "dict_duplicate_acl" +# donc si "nom_zone_dns_cache" est une clef "dict_duplicate_acl" l'ACL est +# dupliqué et il faut utiliser un seul nom d'ACL + %set %%dict_nom_zone_dns_cache = {} + %set %%dict_duplicate_acl = {} + %for %%idx, %%zones_iter in %%enumerate(%%nom_cache_pere_zone) + %if %%zones_iter.nom_zone_dns_cache not in %%dict_nom_zone_dns_cache + %set %%dict_nom_zone_dns_cache[%%zones_iter.nom_zone_dns_cache] = "intradom" + str(%%idx) + %else + %set %%dict_duplicate_acl[%%zones_iter.nom_zone_dns_cache] = %%dict_nom_zone_dns_cache[%%zones_iter.nom_zone_dns_cache] + %end if + %end for + %for %%cache_iter in %%purge_list(%%nom_cache_pere_zone) + %if %%cache_iter.nom_zone_dns_cache in %%dict_duplicate_acl +cache_peer %%cache_iter parent %%cache_iter.port_cache_pere_zone %%cache_iter.port_icp_cache_pere_zone %%cache_iter.options_cache_pere_zone round-robin + %else +cache_peer %%cache_iter parent %%cache_iter.port_cache_pere_zone %%cache_iter.port_icp_cache_pere_zone %%cache_iter.options_cache_pere_zone + %end if + %end for +%end if + +%if %%activer_cache_pere == 'oui' + %if %%len(%%nom_cache_pere) == 1 + %for %%nom_cache in %%nom_cache_pere + %if %%activer_cache_pere_zone == 'oui' +cache_peer %%nom_cache parent %%nom_cache.port_cache_pere %%nom_cache.port_icp_cache_pere %%nom_cache.options_cache_pere default + %else +cache_peer %%nom_cache parent %%nom_cache.port_cache_pere %%nom_cache.port_icp_cache_pere %%nom_cache.options_cache_pere + %end if + %end for + %else + %for %%nom_cache in %%nom_cache_pere +cache_peer %%nom_cache parent %%nom_cache.port_cache_pere %%nom_cache.port_icp_cache_pere %%nom_cache.options_cache_pere round-robin + %end for + %end if +%end if + +%if %%activer_proxy_sibling == 'oui' + %for %%proxy_sibling in %%proxy_sibling_ip +cache_peer %%proxy_sibling sibling %%proxy_sibling.proxy_sibling_port %%icp_port proxy-only + %end for +%end if +# TAG: cache_peer_domain +# Use to limit the domains for which a neighbor cache will be +# queried. Usage: +# +# cache_peer_domain cache-host domain [domain ...] +# cache_peer_domain cache-host !domain +# +# For example, specifying +# +# cache_peer_domain parent.foo.net .edu +# +# has the effect such that UDP query packets are sent to +# 'bigserver' only when the requested object exists on a +# server in the .edu domain. Prefixing the domainname +# with '!' means the cache will be queried for objects +# NOT in that domain. +# +# NOTE: * Any number of domains may be given for a cache-host, +# either on the same or separate lines. +# * When multiple domains are given for a particular +# cache-host, the first matched domain is applied. +# * Cache hosts with no domain restrictions are queried +# for all requests. +# * There are no defaults. +# * There is also a 'cache_peer_access' tag in the ACL +# section. +#Default: +# none +##EOLE +# Amon derriere un routeur sur reseau acad +%if %%activer_cache_pere == 'oui' + %for %%nom_cache in %%nom_cache_pere +cache_peer_domain %%nom_cache !%%nom_domaine_local + %end for +%end if + +%set %%dict_denied_cache_peer = {} + +# Amon + VPN +%if %%activer_cache_pere_zone == 'oui' + %for %%idx, %%cache_iter in %%enumerate(%%nom_cache_pere_zone) + %if %%cache_iter.type_nom_zone_dns_cache == 'DNS' +cache_peer_domain %%cache_iter %%cache_iter.nom_zone_dns_cache + %else + %if %%cache_iter.nom_zone_dns_cache in %%dict_duplicate_acl + %set %%dict_denied_cache_peer[%%str(cache_iter)] = %%dict_duplicate_acl[%%cache_iter.nom_zone_dns_cache] + %else + %set %%dict_denied_cache_peer[%%str(cache_iter)] = "intradom" + %%str(%%idx) + %end if + %end if + %end for +%end if + +# TAG: cache_peer_access +# Similar to 'cache_peer_domain' but provides more flexibility by +# using ACL elements. +# +# cache_peer_access cache-host allow|deny [!]aclname ... +# +# The syntax is identical to 'http_access' and the other lists of +# ACL elements. See the comments for 'http_access' below, or +# the Squid FAQ (http://wiki.squid-cache.org/SquidFaq/SquidAcl). +#Default: +# none +##EOLE +%if %%activer_cache_pere_zone == 'oui' + %for %%cache_iter in %%nom_cache_pere_zone + %if %%getattr(%%cache_iter, 'autoriser_proxy_autres', 'oui') == 'non' +cache_peer_access %%cache_iter allow %%nom_machine_eth1 + %if %%vlan_eth1 == "oui" + %for %%vlans_1 in %%vlan_id_eth1 +cache_peer_access %%cache_iter allow vlan_eth1_%%vlans_1 + %end for + %end if +cache_peer_access %%cache_iter allow localhost +cache_peer_access %%cache_iter deny all + %else + %set %%allowed = %%dict_denied_cache_peer.get(%%str(%%cache_iter)) + %if %%allowed is not None +cache_peer_access %%cache_iter allow %%allowed +cache_peer_access %%cache_iter deny all + %else +cache_peer_access %%cache_iter allow all + %end if + %end if + %end for +%end if + +%if %%activer_cache_pere == 'oui' + %for %%nom_cache in %%nom_cache_pere + %for %%denied in %%purge_list(%%dict_denied_cache_peer.values()) +cache_peer_access %%nom_cache deny %%denied + %end for +cache_peer_access %%nom_cache allow all + %end for +%end if +# TAG: neighbor_type_domain +# usage: neighbor_type_domain neighbor parent|sibling domain domain ... +# +# Modifying the neighbor type for specific domains is now +# possible. You can treat some domains differently than the the +# default neighbor type specified on the 'cache_peer' line. +# Normally it should only be necessary to list domains which +# should be treated differently because the default neighbor type +# applies for hostnames which do not match domains listed here. +# +#EXAMPLE: +# cache_peer cache.foo.org parent 3128 3130 +# neighbor_type_domain cache.foo.org sibling .com .net +# neighbor_type_domain cache.foo.org sibling .au .de +#Default: +# none + +# TAG: dead_peer_timeout (seconds) +# This controls how long Squid waits to declare a peer cache +# as "dead." If there are no ICP replies received in this +# amount of time, Squid will declare the peer dead and not +# expect to receive any further ICP replies. However, it +# continues to send ICP queries, and will mark the peer as +# alive upon receipt of the first subsequent ICP reply. +# +# This timeout also affects when Squid expects to receive ICP +# replies from peers. If more than 'dead_peer' seconds have +# passed since the last ICP reply was received, Squid will not +# expect to receive an ICP reply on the next query. Thus, if +# your time between requests is greater than this timeout, you +# will see a lot of requests sent DIRECT to origin servers +# instead of to your parents. +#Default: +# dead_peer_timeout 10 seconds +dead_peer_timeout %%dead_peer_timeout seconds + +# TAG: forward_max_tries +# Controls how many different forward paths Squid will try +# before giving up. See also forward_timeout. +#Default: +# forward_max_tries 10 +forward_max_tries %%forward_max_tries + + +# MEMORY CACHE OPTIONS +# ----------------------------------------------------------------------------- + +# TAG: cache_mem (bytes) +# NOTE: THIS PARAMETER DOES NOT SPECIFY THE MAXIMUM PROCESS SIZE. +# IT ONLY PLACES A LIMIT ON HOW MUCH ADDITIONAL MEMORY SQUID WILL +# USE AS A MEMORY CACHE OF OBJECTS. SQUID USES MEMORY FOR OTHER +# THINGS AS WELL. SEE THE SQUID FAQ SECTION 8 FOR DETAILS. +# +# 'cache_mem' specifies the ideal amount of memory to be used +# for: +# * In-Transit objects +# * Hot Objects +# * Negative-Cached objects +# +# Data for these objects are stored in 4 KB blocks. This +# parameter specifies the ideal upper limit on the total size of +# 4 KB blocks allocated. In-Transit objects take the highest +# priority. +# +# In-transit objects have priority over the others. When +# additional space is needed for incoming data, negative-cached +# and hot objects will be released. In other words, the +# negative-cached and hot objects will fill up any unused space +# not needed for in-transit objects. +# +# If circumstances require, this limit will be exceeded. +# Specifically, if your incoming request rate requires more than +# 'cache_mem' of memory to hold in-transit objects, Squid will +# exceed this limit to satisfy the new requests. When the load +# decreases, blocks will be freed until the high-water mark is +# reached. Thereafter, blocks will be used to store hot +# objects. +#Default: +# cache_mem 256 MB +cache_mem %%cache_mem MB + +# TAG: maximum_object_size_in_memory (bytes) +# Objects greater than this size will not be attempted to kept in +# the memory cache. This should be set high enough to keep objects +# accessed frequently in memory to improve performance whilst low +# enough to keep larger objects from hoarding cache_mem. +#Default: +# maximum_object_size_in_memory 512 KB +maximum_object_size_in_memory %%maximum_object_size_in_memory KB + +# TAG: memory_replacement_policy +# The memory replacement policy parameter determines which +# objects are purged from memory when memory space is needed. +# +# See cache_replacement_policy for details. +#Default: +# memory_replacement_policy lru +memory_replacement_policy %%memory_replacement_policy + + +# DISK CACHE OPTIONS +# ----------------------------------------------------------------------------- + +# TAG: cache_replacement_policy +# The cache replacement policy parameter determines which +# objects are evicted (replaced) when disk space is needed. +# +# lru : Squid's original list based LRU policy +# heap GDSF : Greedy-Dual Size Frequency +# heap LFUDA: Least Frequently Used with Dynamic Aging +# heap LRU : LRU policy implemented using a heap +# +# Applies to any cache_dir lines listed below this. +# +# The LRU policies keeps recently referenced objects. +# +# The heap GDSF policy optimizes object hit rate by keeping smaller +# popular objects in cache so it has a better chance of getting a +# hit. It achieves a lower byte hit rate than LFUDA though since +# it evicts larger (possibly popular) objects. +# +# The heap LFUDA policy keeps popular objects in cache regardless of +# their size and thus optimizes byte hit rate at the expense of +# hit rate since one large, popular object will prevent many +# smaller, slightly less popular objects from being cached. +# +# Both policies utilize a dynamic aging mechanism that prevents +# cache pollution that can otherwise occur with frequency-based +# replacement policies. +# +# NOTE: if using the LFUDA replacement policy you should increase +# the value of maximum_object_size above its default of 4096 KB to +# to maximize the potential byte hit rate improvement of LFUDA. +# +# For more information about the GDSF and LFUDA cache replacement +# policies see http://www.hpl.hp.com/techreports/1999/HPL-1999-69.html +# and http://fog.hpl.external.hp.com/techreports/98/HPL-98-173.html. +#Default: +# cache_replacement_policy lru +cache_replacement_policy %%cache_replacement_policy + + +# TAG: store_dir_select_algorithm +# Set this to 'round-robin' as an alternative. +#Default: +# store_dir_select_algorithm least-load + +# TAG: max_open_disk_fds +# To avoid having disk as the I/O bottleneck Squid can optionally +# bypass the on-disk cache if more than this amount of disk file +# descriptors are open. +# +# A value of 0 indicates no limit. +#Default: +# max_open_disk_fds 0 + + +# TAG: cache_swap_low (percent, 0-100) +# TAG: cache_swap_high (percent, 0-100) +# +# The low- and high-water marks for cache object replacement. +# Replacement begins when the swap (disk) usage is above the +# low-water mark and attempts to maintain utilization near the +# low-water mark. As swap utilization gets close to high-water +# mark object eviction becomes more aggressive. If utilization is +# close to the low-water mark less replacement is done each time. +# +# Defaults are 90% and 95%. If you have a large cache, 5% could be +# hundreds of MB. If this is the case you may wish to set these +# numbers closer together. +#Default: +# cache_swap_low 90 +# cache_swap_high 95 +cache_swap_low %%cache_swap_low +cache_swap_high %%cache_swap_high + +# TAG: minimum_object_size (bytes) +# Objects smaller than this size will NOT be saved on disk. The +# value is specified in bytes, and the default is 0 KB, which +# means all responses can be stored. +#Default: +# minimum_object_size 0 MB +minimum_object_size %%minimum_object_size KB + +# TAG: maximum_object_size (bytes) +# Set the default value for max-size parameter on any cache_dir. +# The value is specified in bytes, and the default is 4 MB. +# +# If you wish to get a high BYTES hit ratio, you should probably +# increase this (one 32 MB object hit counts for 3200 10KB +# hits). +# +# If you wish to increase hit ratio more than you want to +# save bandwidth you should leave this low. +# +# NOTE: if using the LFUDA replacement policy you should increase +# this value to maximize the byte hit rate improvement of LFUDA! +# See cache_replacement_policy for a discussion of this policy. +#Default: +# maximum_object_size 4 MB (=4096 KB) +maximum_object_size %%maximum_object_size KB + + +# LOGFILE OPTIONS +# ----------------------------------------------------------------------------- + +# TAG: logformat +# Usage: +# +# logformat <name> <format specification> +# +# Defines an access log format. +# +# The <format specification> is a string with embedded % format codes +# +# % format codes all follow the same basic structure where all but +# the formatcode is optional. Output strings are automatically escaped +# as required according to their context and the output format +# modifiers are usually not needed, but can be specified if an explicit +# output format is desired. +# +# % ["|[|'|#] [-] [[0]width] [{argument}] formatcode +# +# " output in quoted string format +# [ output in squid text log format as used by log_mime_hdrs +# # output in URL quoted format +# ' output as-is +# +# - left aligned +# width field width. If starting with 0 the +# output is zero padded +# {arg} argument such as header name etc +# +# Format codes: +# +# % a literal % character +# >a Client source IP address +# >A Client FQDN +# >p Client source port +# <A Server IP address or peer name +# la Local IP address (http_port) +# lp Local port number (http_port) +# ts Seconds since epoch +# tu subsecond time (milliseconds) +# tl Local time. Optional strftime format argument +# default %d/%b/%Y:%H:%M:%S %z +# tg GMT time. Optional strftime format argument +# default %d/%b/%Y:%H:%M:%S %z +# tr Response time (milliseconds) +# dt Total time spent making DNS lookups (milliseconds) +# +# HTTP cache related format codes: +# +# [http::]>h Original request header. Optional header name argument +# on the format header[:[separator]element] +# [http::]>ha The HTTP request headers after adaptation and redirection. +# Optional header name argument as for >h +# [http::]<h Reply header. Optional header name argument +# as for >h +# [http::]un User name +# [http::]ul User name from authentication +# [http::]ui User name from ident +# [http::]us User name from SSL +# [http::]ue User name from external acl helper +# [http::]>Hs HTTP status code sent to the client +# [http::]<Hs HTTP status code received from the next hop +# [http::]Ss Squid request status (TCP_MISS etc) +# [http::]Sh Squid hierarchy status (DEFAULT_PARENT etc) +# [http::]mt MIME content type +# [http::]rm Request method (GET/POST etc) +# [http::]ru Request URL +# [http::]rp Request URL-Path excluding hostname +# [http::]rv Request protocol version +# [http::]et Tag returned by external acl +# [http::]ea Log string returned by external acl +# [http::]<st Sent reply size including HTTP headers +# [http::]>st Received request size including HTTP headers. In the +# case of chunked requests the chunked encoding metadata +# are not included +# [http::]>sh Received HTTP request headers size +# [http::]<sh Sent HTTP reply headers size +# [http::]st Request+Reply size including HTTP headers +# [http::]<sH Reply high offset sent +# [http::]<sS Upstream object size +# [http::]<pt Peer response time in milliseconds. The timer starts +# when the last request byte is sent to the next hop +# and stops when the last response byte is received. +# [http::]<tt Total server-side time in milliseconds. The timer +# starts with the first connect request (or write I/O) +# sent to the first selected peer. The timer stops +# with the last I/O with the last peer. +# +# If ICAP is enabled, the following two codes become available (as +# well as ICAP log codes documented with the icap_log option): +# +# icap::tt Total ICAP processing time for the HTTP +# transaction. The timer ticks when ICAP +# ACLs are checked and when ICAP +# transaction is in progress. +# +# icap::<last_h The header of the last ICAP response +# related to the HTTP transaction. Like +# <h, accepts an optional header name +# argument. Will not change semantics +# when multiple ICAP transactions per HTTP +# transaction are supported. +# +# If adaptation is enabled the following two codes become available: +# +# adapt::sum_trs Summed adaptation transaction response +# times recorded as a comma-separated list in +# the order of transaction start time. Each time +# value is recorded as an integer number, +# representing response time of one or more +# adaptation (ICAP or eCAP) transaction in +# milliseconds. When a failed transaction is +# being retried or repeated, its time is not +# logged individually but added to the +# replacement (next) transaction. See also: +# adapt::all_trs. +# +# adapt::all_trs All adaptation transaction response times. +# Same as adaptation_strs but response times of +# individual transactions are never added +# together. Instead, all transaction response +# times are recorded individually. +# +# You can prefix adapt::*_trs format codes with adaptation +# service name in curly braces to record response time(s) specific +# to that service. For example: %{my_service}adapt::sum_trs +# +# The default formats available (which do not need re-defining) are: +# +#logformat squid %ts.%03tu %6tr %>a %Ss/%03>Hs %<st %rm %ru %un %Sh/%<A %mt +#logformat squidmime %ts.%03tu %6tr %>a %Ss/%03>Hs %<st %rm %ru %un %Sh/%<A %mt [%>h] [%<h] +#logformat common %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %>Hs %<st %Ss:%Sh +#logformat combined %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %>Hs %<st "%{Referer}>h" "%{User-Agent}>h" %Ss:%Sh +#Default: +# none + +# TAG: icap_log +# ICAP log files record ICAP transaction summaries, one line per +# transaction. +# +# The icap_log option format is: +# icap_log <filepath> [<logformat name> [acl acl ...]] +# icap_log none [acl acl ...]] +# +# Please see access_log option documentation for details. The two +# kinds of logs share the overall configuration approach and many +# features. +# +# ICAP processing of a single HTTP message or transaction may +# require multiple ICAP transactions. In such cases, multiple +# ICAP transaction log lines will correspond to a single access +# log line. +# +# ICAP log uses logformat codes that make sense for an ICAP +# transaction. Header-related codes are applied to the HTTP header +# embedded in an ICAP server response, with the following caveats: +# For REQMOD, there is no HTTP response header unless the ICAP +# server performed request satisfaction. For RESPMOD, the HTTP +# request header is the header sent to the ICAP server. For +# OPTIONS, there are no HTTP headers. +# +# The following format codes are also available for ICAP logs: +# +# icap::<A ICAP server IP address. Similar to <A. +# +# icap::<service_name ICAP service name from the icap_service +# option in Squid configuration file. +# +# icap::ru ICAP Request-URI. Similar to ru. +# +# icap::rm ICAP request method (REQMOD, RESPMOD, or +# OPTIONS). Similar to existing rm. +# +# icap::>st Bytes sent to the ICAP server (TCP payload +# only; i.e., what Squid writes to the socket). +# +# icap::<st Bytes received from the ICAP server (TCP +# payload only; i.e., what Squid reads from +# the socket). +# +# icap::tr Transaction response time (in +# milliseconds). The timer starts when +# the ICAP transaction is created and +# stops when the transaction is completed. +# Similar to tr. +# +# icap::tio Transaction I/O time (in milliseconds). The +# timer starts when the first ICAP request +# byte is scheduled for sending. The timers +# stops when the last byte of the ICAP response +# is received. +# +# icap::to Transaction outcome: ICAP_ERR* for all +# transaction errors, ICAP_OPT for OPTION +# transactions, ICAP_ECHO for 204 +# responses, ICAP_MOD for message +# modification, and ICAP_SAT for request +# satisfaction. Similar to Ss. +# +# icap::Hs ICAP response status code. Similar to Hs. +# +# icap::>h ICAP request header(s). Similar to >h. +# +# icap::<h ICAP response header(s). Similar to <h. +# +# The default ICAP log format, which can be used without an explicit +# definition, is called icap_squid: +# +#logformat icap_squid %ts.%03tu %6icap::tr %>a %icap::to/%03icap::Hs %icap::<size %icap::rm %icap::ru% %un -/%icap::<A - +# +# See also: logformat, log_icap, and %icap::<last_h +#Default: +# none + +# TAG: log_access allow|deny acl acl... +# This options allows you to control which requests gets logged +# to access.log (see access_log directive). Requests denied for +# logging will also not be accounted for in performance counters. +# +# This clause only supports fast acl types. +# See http://wiki.squid-cache.org/SquidFaq/SquidAcl for details. +#Default: +# none + +# TAG: log_icap +# This options allows you to control which requests get logged +# to icap.log. See the icap_log directive for ICAP log details. +#Default: +# none + +# TAG: cache_store_log +# Logs the activities of the storage manager. Shows which +# objects are ejected from the cache, and which objects are +# saved and for how long. To disable, enter "none" or remove the line. +# There are not really utilities to analyze this data, so you can safely +# disable it. +# +# Example: +# cache_store_log /var/log/squid/store.log +#Default: +# none +##EOLE +cache_store_log none + +# TAG: cache_swap_state +# Location for the cache "swap.state" file. This index file holds +# the metadata of objects saved on disk. It is used to rebuild +# the cache during startup. Normally this file resides in each +# 'cache_dir' directory, but you may specify an alternate +# pathname here. Note you must give a full filename, not just +# a directory. Since this is the index for the whole object +# list you CANNOT periodically rotate it! +# +# If %s can be used in the file name it will be replaced with a +# a representation of the cache_dir name where each / is replaced +# with '.'. This is needed to allow adding/removing cache_dir +# lines when cache_swap_log is being used. +# +# If have more than one 'cache_dir', and %s is not used in the name +# these swap logs will have names such as: +# +# cache_swap_log.00 +# cache_swap_log.01 +# cache_swap_log.02 +# +# The numbered extension (which is added automatically) +# corresponds to the order of the 'cache_dir' lines in this +# configuration file. If you change the order of the 'cache_dir' +# lines in this file, these index files will NOT correspond to +# the correct 'cache_dir' entry (unless you manually rename +# them). We recommend you do NOT use this option. It is +# better to keep these index files in each 'cache_dir' directory. +#Default: +# none + +# TAG: logfile_rotate +# Specifies the number of logfile rotations to make when you +# type 'squid -k rotate'. The default is 10, which will rotate +# with extensions 0 through 9. Setting logfile_rotate to 0 will +# disable the file name rotation, but the logfiles are still closed +# and re-opened. This will enable you to rename the logfiles +# yourself just before sending the rotate signal. +# +# Note, the 'squid -k rotate' command normally sends a USR1 +# signal to the running squid process. In certain situations +# (e.g. on Linux with Async I/O), USR1 is used for other +# purposes, so -k rotate uses another signal. It is best to get +# in the habit of using 'squid -k rotate' instead of 'kill -USR1 +# <pid>'. +# +# Note, from Squid-3.1 this option has no effect on the cache.log, +# that log can be rotated separately by using debug_options +# +# Note2, for Debian/Linux the default of logfile_rotate is +# zero, since it includes external logfile-rotation methods. +#Default: +# logfile_rotate 0 + +# TAG: mime_table +# Pathname to Squid's MIME table. You shouldn't need to change +# this, but the default file contains examples and formatting +# information if you do. +#Default: +# mime_table /usr/share/squid/mime.conf + +# TAG: log_mime_hdrs on|off +# The Cache can record both the request and the response MIME +# headers for each HTTP transaction. The headers are encoded +# safely and will appear as two bracketed fields at the end of +# the access log (for either the native or httpd-emulated log +# formats). To enable this logging set log_mime_hdrs to 'on'. +#Default: +# log_mime_hdrs off +log_mime_hdrs %%log_mime_hdrs + +# TAG: useragent_log +# Note: This option is only available if Squid is rebuilt with the +# --enable-useragent-log option +# +# Squid will write the User-Agent field from HTTP requests +# to the filename specified here. By default useragent_log +# is disabled. +#Default: +# none + +# TAG: referer_log +# Note: This option is only available if Squid is rebuilt with the +# --enable-referer-log option +# +# Squid will write the Referer field from HTTP requests to the +# filename specified here. By default referer_log is disabled. +# Note that "referer" is actually a misspelling of "referrer" +# however the misspelt version has been accepted into the HTTP RFCs +# and we accept both. +#Default: +# none + +# TAG: client_netmask +# A netmask for client addresses in logfiles and cachemgr output. +# Change this to protect the privacy of your cache clients. +# A netmask of 255.255.255.0 will log all IP's in that range with +# the last digit set to '0'. +#Default: +# client_netmask no_addr +client_netmask %%client_netmask + +# TAG: forward_log +# Note: This option is only available if Squid is rebuilt with the +# -DWIP_FWD_LOG define +# +# Logs the server-side requests. +# +# This is currently work in progress. +#Default: +# none + +# TAG: strip_query_terms +# By default, Squid strips query terms from requested URLs before +# logging. This protects your user's privacy. +#Default: +# strip_query_terms on +strip_query_terms %%strip_query_terms + +# TAG: buffered_logs on|off +# cache.log log file is written with stdio functions, and as such +# it can be buffered or unbuffered. By default it will be unbuffered. +# Buffering it can speed up the writing slightly (though you are +# unlikely to need to worry unless you run with tons of debugging +# enabled in which case performance will suffer badly anyway..). +#Default: +# buffered_logs off + +# TAG: netdb_filename +# Note: This option is only available if Squid is rebuilt with the +# --enable-icmp option +# +# A filename where Squid stores it's netdb state between restarts. +# To disable, enter "none". +#Default: +# netdb_filename /var/log/squid/netdb.state + +# OPTIONS FOR TROUBLESHOOTING +# ----------------------------------------------------------------------------- + +# TAG: cache_log +# Cache logging file. This is where general information about +# your cache's behavior goes. You can increase the amount of data +# logged to this file and how often its rotated with "debug_options" +#Default: +# cache_log /var/log/squid/cache.log +#cache_log /var/log/squid/cache.log + + +# TAG: debug_options +# Logging options are set as section,level where each source file +# is assigned a unique section. Lower levels result in less +# output, Full debugging (level 9) can result in a very large +# log file, so be careful. +# +# The magic word "ALL" sets debugging levels for all sections. +# We recommend normally running with "ALL,1". +# +# The rotate=N option can be used to keep more or less of these logs +# than would otherwise be kept by logfile_rotate. +# For most uses a single log should be enough to monitor current +# events affecting Squid. +#Default: +# debug_options ALL,1 + +# TAG: coredump_dir +# By default Squid leaves core files in the directory from where +# it was started. If you set 'coredump_dir' to a directory +# that exists, Squid will chdir() to that directory at startup +# and coredump files will be left there. +# +#Default: +# coredump_dir none +# + +# Leave coredumps in the first cache dir +coredump_dir /var/spool/squid + +# OPTIONS FOR FTP GATEWAYING +# ----------------------------------------------------------------------------- + +# TAG: ftp_user +# If you want the anonymous login password to be more informative +# (and enable the use of picky ftp servers), set this to something +# reasonable for your domain, like wwwuser@somewhere.net +# +# The reason why this is domainless by default is the +# request can be made on the behalf of a user in any domain, +# depending on how the cache is used. +# Some ftp server also validate the email address is valid +# (for example perl.com). +#Default: +# ftp_user Squid@ +## EOLE +ftp_user %%ftp_user@%%nom_academie.%%suffixe_domaine_academique + +# TAG: ftp_list_width +# Sets the width of ftp listings. This should be set to fit in +# the width of a standard browser. Setting this too small +# can cut off long filenames when browsing ftp sites. +#Default: +# ftp_list_width 32 + +# TAG: ftp_passive +# If your firewall does not allow Squid to use passive +# connections, turn off this option. +# +# Use of ftp_epsv_all option requires this to be ON. +#Default: +# ftp_passive on +ftp_passive %%ftp_passive + +# TAG: ftp_epsv_all +# FTP Protocol extensions permit the use of a special "EPSV ALL" command. +# +# NATs may be able to put the connection on a "fast path" through the +# translator, as the EPRT command will never be used and therefore, +# translation of the data portion of the segments will never be needed. +# +# When a client only expects to do two-way FTP transfers this may be +# useful. +# If squid finds that it must do a three-way FTP transfer after issuing +# an EPSV ALL command, the FTP session will fail. +# +# If you have any doubts about this option do not use it. +# Squid will nicely attempt all other connection methods. +# +# Requires ftp_passive to be ON (default) for any effect. +#Default: +# ftp_epsv_all off + +# TAG: ftp_epsv +# FTP Protocol extensions permit the use of a special "EPSV" command. +# +# NATs may be able to put the connection on a "fast path" through the +# translator using EPSV, as the EPRT command will never be used +# and therefore, translation of the data portion of the segments +# will never be needed. +# +# Turning this OFF will prevent EPSV being attempted. +# WARNING: Doing so will convert Squid back to the old behavior with all +# the related problems with external NAT devices/layers. +# +# Requires ftp_passive to be ON (default) for any effect. +#Default: +# ftp_epsv on + +# TAG: ftp_sanitycheck +# For security and data integrity reasons Squid by default performs +# sanity checks of the addresses of FTP data connections ensure the +# data connection is to the requested server. If you need to allow +# FTP connections to servers using another IP address for the data +# connection turn this off. +#Default: +# ftp_sanitycheck on +ftp_sanitycheck %%ftp_sanitycheck + +# TAG: ftp_telnet_protocol +# The FTP protocol is officially defined to use the telnet protocol +# as transport channel for the control connection. However, many +# implementations are broken and does not respect this aspect of +# the FTP protocol. +# +# If you have trouble accessing files with ASCII code 255 in the +# path or similar problems involving this ASCII code you can +# try setting this directive to off. If that helps, report to the +# operator of the FTP server in question that their FTP server +# is broken and does not follow the FTP standard. +#Default: +# ftp_telnet_protocol on +ftp_telnet_protocol %%ftp_telnet_protocol + +# OPTIONS FOR EXTERNAL SUPPORT PROGRAMS +# ----------------------------------------------------------------------------- + +# TAG: diskd_program +# Specify the location of the diskd executable. +# Note this is only useful if you have compiled in +# diskd as one of the store io modules. +#Default: +# diskd_program /usr/lib/squid/diskd + +# TAG: unlinkd_program +# Specify the location of the executable for file deletion process. +#Default: +# unlinkd_program /usr/lib/squid/unlinkd + +# TAG: pinger_program +# Note: This option is only available if Squid is rebuilt with the +# --enable-icmp option +# +# Specify the location of the executable for the pinger process. +#Default: +# pinger_program /usr/lib/squid/pinger + +# TAG: pinger_enable +# Note: This option is only available if Squid is rebuilt with the +# --enable-icmp option +# +# Control whether the pinger is active at run-time. +# Enables turning ICMP pinger on and off with a simple +# squid -k reconfigure. +#Default: +# pinger_enable off + +# OPTIONS FOR URL REWRITING +# ----------------------------------------------------------------------------- + +# TAG: url_rewrite_program +# Specify the location of the executable for the URL rewriter. +# Since they can perform almost any function there isn't one included. +# +# For each requested URL rewriter will receive on line with the format +# +# URL <SP> client_ip "/" fqdn <SP> user <SP> method [<SP> kvpairs]<NL> +# +# In the future, the rewriter interface will be extended with +# key=value pairs ("kvpairs" shown above). Rewriter programs +# should be prepared to receive and possibly ignore additional +# whitespace-separated tokens on each input line. +# +# And the rewriter may return a rewritten URL. The other components of +# the request line does not need to be returned (ignored if they are). +# +# The rewriter can also indicate that a client-side redirect should +# be performed to the new URL. This is done by prefixing the returned +# URL with "301:" (moved permanently) or 302: (moved temporarily). +# +# By default, a URL rewriter is not used. +#Default: +# none + +# TAG: url_rewrite_children +# The number of redirector processes to spawn. If you start +# too few Squid will have to wait for them to process a backlog of +# URLs, slowing it down. If you start too many they will use RAM +# and other system resources. +#Default: +# url_rewrite_children 5 + +# TAG: url_rewrite_concurrency +# The number of requests each redirector helper can handle in +# parallel. Defaults to 0 which indicates the redirector +# is a old-style single threaded redirector. +# +# When this directive is set to a value >= 1 then the protocol +# used to communicate with the helper is modified to include +# a request ID in front of the request/response. The request +# ID from the request must be echoed back with the response +# to that request. +#Default: +# url_rewrite_concurrency 0 + +# TAG: url_rewrite_host_header +# By default Squid rewrites any Host: header in redirected +# requests. If you are running an accelerator this may +# not be a wanted effect of a redirector. +# +# WARNING: Entries are cached on the result of the URL rewriting +# process, so be careful if you have domain-virtual hosts. +#Default: +# url_rewrite_host_header on + +# TAG: url_rewrite_access +# If defined, this access list specifies which requests are +# sent to the redirector processes. By default all requests +# are sent. +# +# This clause supports both fast and slow acl types. +# See http://wiki.squid-cache.org/SquidFaq/SquidAcl for details. +#Default: +# none + +# TAG: url_rewrite_bypass +# When this is 'on', a request will not go through the +# redirector if all redirectors are busy. If this is 'off' +# and the redirector queue grows too large, Squid will exit +# with a FATAL error and ask you to increase the number of +# redirectors. You should only enable this if the redirectors +# are not critical to your caching system. If you use +# redirectors for access control, and you enable this option, +# users may have access to pages they should not +# be allowed to request. +#Default: +# url_rewrite_bypass off + +# OPTIONS FOR TUNING THE CACHE +# ----------------------------------------------------------------------------- + +# TAG: cache +# A list of ACL elements which, if matched and denied, cause the request to +# not be satisfied from the cache and the reply to not be cached. +# In other words, use this to force certain objects to never be cached. +# +# You must use the words 'allow' or 'deny' to indicate whether items +# matching the ACL should be allowed or denied into the cache. +# +# Default is to allow all to be cached. +# +# This clause supports both fast and slow acl types. +# See http://wiki.squid-cache.org/SquidFaq/SquidAcl for details. +#Default: +# none +#pas de cache pour urlpath_regex cgi-bin \? +## pas de cache pour reseau eth1 +%if %%nombre_interfaces >= "2" +cache deny reseaueth1 +%end if +## pas de cache pour le VPN +%if %%activer_cache_pere_zone == 'oui' + %for %%idx, %%zones_iter in %%enumerate(%%nom_cache_pere_zone) + %if %%zones_iter.nom_zone_dns_cache not in %%dict_duplicate_acl + %set %%acl_name = "intradom" + %%str(%%idx) + %else + %set %%acl_name = %%dict_duplicate_acl[%%zones_iter.nom_zone_dns_cache] + %end if +cache deny %%acl_name + %end for +%end if + +#Rvp +%if %%getVar('acces_proxy_zone_rvp', 'non') == 'oui' + %for %%idx, %%net_iter in %%enumerate(%%adresse_network_zone_rvp) +cache deny rvpdom%%idx + %end for +%end if +#Domaines a ne pas cacher +cache deny nocache +cache deny srcnocache + +# TAG: refresh_pattern +# usage: refresh_pattern [-i] regex min percent max [options] +# +# By default, regular expressions are CASE-SENSITIVE. To make +# them case-insensitive, use the -i option. +# +# 'Min' is the time (in minutes) an object without an explicit +# expiry time should be considered fresh. The recommended +# value is 0, any higher values may cause dynamic applications +# to be erroneously cached unless the application designer +# has taken the appropriate actions. +# +# 'Percent' is a percentage of the objects age (time since last +# modification age) an object without explicit expiry time +# will be considered fresh. +# +# 'Max' is an upper limit on how long objects without an explicit +# expiry time will be considered fresh. +# +# options: override-expire +# override-lastmod +# reload-into-ims +# ignore-reload +# ignore-no-cache +# ignore-no-store +# ignore-must-revalidate +# ignore-private +# ignore-auth +# refresh-ims +# +# override-expire enforces min age even if the server +# sent an explicit expiry time (e.g., with the +# Expires: header or Cache-Control: max-age). Doing this +# VIOLATES the HTTP standard. Enabling this feature +# could make you liable for problems which it causes. +# +# Note: override-expire does not enforce staleness - it only extends +# freshness / min. If the server returns a Expires time which +# is longer than your max time, Squid will still consider +# the object fresh for that period of time. +# +# override-lastmod enforces min age even on objects +# that were modified recently. +# +# reload-into-ims changes client no-cache or ``reload'' +# to If-Modified-Since requests. Doing this VIOLATES the +# HTTP standard. Enabling this feature could make you +# liable for problems which it causes. +# +# ignore-reload ignores a client no-cache or ``reload'' +# header. Doing this VIOLATES the HTTP standard. Enabling +# this feature could make you liable for problems which +# it causes. +# +# ignore-no-cache ignores any ``Pragma: no-cache'' and +# ``Cache-control: no-cache'' headers received from a server. +# The HTTP RFC never allows the use of this (Pragma) header +# from a server, only a client, though plenty of servers +# send it anyway. +# +# ignore-no-store ignores any ``Cache-control: no-store'' +# headers received from a server. Doing this VIOLATES +# the HTTP standard. Enabling this feature could make you +# liable for problems which it causes. +# +# ignore-must-revalidate ignores any ``Cache-Control: must-revalidate`` +# headers received from a server. Doing this VIOLATES +# the HTTP standard. Enabling this feature could make you +# liable for problems which it causes. +# +# ignore-private ignores any ``Cache-control: private'' +# headers received from a server. Doing this VIOLATES +# the HTTP standard. Enabling this feature could make you +# liable for problems which it causes. +# +# ignore-auth caches responses to requests with authorization, +# as if the originserver had sent ``Cache-control: public'' +# in the response header. Doing this VIOLATES the HTTP standard. +# Enabling this feature could make you liable for problems which +# it causes. +# +# refresh-ims causes squid to contact the origin server +# when a client issues an If-Modified-Since request. This +# ensures that the client will receive an updated version +# if one is available. +# +# Basically a cached object is: +# +# FRESH if expires < now, else STALE +# STALE if age > max +# FRESH if lm-factor < percent, else STALE +# FRESH if age < min +# else STALE +# +# The refresh_pattern lines are checked in the order listed here. +# The first entry which matches is used. If none of the entries +# match the default will be used. +# +# Note, you must uncomment all the default lines if you want +# to change one. The default setting is only active if none is +# used. +# +# + +# Add any of your own refresh_pattern entries above these. +refresh_pattern ^ftp: 1440 20% 10080 +refresh_pattern ^gopher: 1440 0% 1440 +refresh_pattern -i (/cgi-bin/|\?) 0 0% 0 +%if %%activer_proxy_refresh_pattern == 'oui' +%for regexp in %%proxy_refresh_pattern_regexp +refresh_pattern %slurp +%if %%regexp.proxy_refresh_pattern_case_sensitive == 'non' +-i %slurp +%end if +%%regexp %%regexp.proxy_refresh_pattern_min %%regexp.proxy_refresh_pattern_pourcent% %%regexp.proxy_refresh_pattern_max %%regexp.proxy_refresh_pattern_options +%end for +%end if +refresh_pattern . 0 20% 4320 + +# TAG: quick_abort_min (KB) +# TAG: quick_abort_max (KB) +# TAG: quick_abort_pct (percent) +# The cache by default continues downloading aborted requests +# which are almost completed (less than 16 KB remaining). This +# may be undesirable on slow (e.g. SLIP) links and/or very busy +# caches. Impatient users may tie up file descriptors and +# bandwidth by repeatedly requesting and immediately aborting +# downloads. +# +# When the user aborts a request, Squid will check the +# quick_abort values to the amount of data transfered until +# then. +# +# If the transfer has less than 'quick_abort_min' KB remaining, +# it will finish the retrieval. +# +# If the transfer has more than 'quick_abort_max' KB remaining, +# it will abort the retrieval. +# +# If more than 'quick_abort_pct' of the transfer has completed, +# it will finish the retrieval. +# +# If you do not want any retrieval to continue after the client +# has aborted, set both 'quick_abort_min' and 'quick_abort_max' +# to '0 KB'. +# +# If you want retrievals to always continue if they are being +# cached set 'quick_abort_min' to '-1 KB'. +#Default: +# quick_abort_min 16 KB +# quick_abort_max 16 KB +# quick_abort_pct 95 +quick_abort_min %%quick_abort_min KB +quick_abort_max %%quick_abort_max KB +quick_abort_pct %%quick_abort_pct + +# TAG: read_ahead_gap buffer-size +# The amount of data the cache will buffer ahead of what has been +# sent to the client when retrieving an object from another server. +#Default: +# read_ahead_gap 16 KB +read_ahead_gap %%read_ahead_gap KB + +# TAG: negative_ttl time-units +# Set the Default Time-to-Live (TTL) for failed requests. +# Certain types of failures (such as "connection refused" and +# "404 Not Found") are able to be negatively-cached for a short time. +# Modern web servers should provide Expires: header, however if they +# do not this can provide a minimum TTL. +# The default is not to cache errors with unknown expiry details. +# +# Note that this is different from negative caching of DNS lookups. +# +# WARNING: Doing this VIOLATES the HTTP standard. Enabling +# this feature could make you liable for problems which it +# causes. +#Default: +# negative_ttl 0 seconds +negative_ttl %%negative_ttl minutes + +# TAG: positive_dns_ttl time-units +# Upper limit on how long Squid will cache positive DNS responses. +# Default is 6 hours (360 minutes). This directive must be set +# larger than negative_dns_ttl. +#Default: +# positive_dns_ttl 6 hours +positive_dns_ttl %%positive_dns_ttl hours + +# TAG: negative_dns_ttl time-units +# Time-to-Live (TTL) for negative caching of failed DNS lookups. +# This also sets the lower cache limit on positive lookups. +# Minimum value is 1 second, and it is not recommendable to go +# much below 10 seconds. +#Default: +# negative_dns_ttl 1 minutes +negative_dns_ttl %%negative_dns_ttl minutes + +# TAG: range_offset_limit (bytes) +# Sets a upper limit on how far into the the file a Range request +# may be to cause Squid to prefetch the whole file. If beyond this +# limit Squid forwards the Range request as it is and the result +# is NOT cached. +# +# This is to stop a far ahead range request (lets say start at 17MB) +# from making Squid fetch the whole object up to that point before +# sending anything to the client. +# +# A value of 0 causes Squid to never fetch more than the +# client requested. (default) +# +# A value of -1 causes Squid to always fetch the object from the +# beginning so it may cache the result. (2.0 style) +# +# NP: Using -1 here will override any quick_abort settings that may +# otherwise apply to the range request. The range request will +# be fully fetched from start to finish regardless of the client +# actions. This affects bandwidth usage. +#Default: +# range_offset_limit 0 KB +#range_offset_limit %%range_offset_limit KB #FIXME 2.5 : #10729 + +# TAG: minimum_expiry_time (seconds) +# The minimum caching time according to (Expires - Date) +# Headers Squid honors if the object can't be revalidated +# defaults to 60 seconds. In reverse proxy environments it +# might be desirable to honor shorter object lifetimes. It +# is most likely better to make your server return a +# meaningful Last-Modified header however. In ESI environments +# where page fragments often have short lifetimes, this will +# often be best set to 0. +#Default: +# minimum_expiry_time 60 seconds + +# TAG: store_avg_object_size (kbytes) +# Average object size, used to estimate number of objects your +# cache can hold. The default is 13 KB. +#Default: +# store_avg_object_size 13 KB + +# TAG: store_objects_per_bucket +# Target number of objects per bucket in the store hash table. +# Lowering this value increases the total number of buckets and +# also the storage maintenance rate. The default is 20. +#Default: +# store_objects_per_bucket 20 + +# HTTP OPTIONS +# ----------------------------------------------------------------------------- + +# TAG: request_header_max_size (KB) +# This specifies the maximum size for HTTP headers in a request. +# Request headers are usually relatively small (about 512 bytes). +# Placing a limit on the request header size will catch certain +# bugs (for example with persistent connections) and possibly +# buffer-overflow or denial-of-service attacks. +#Default: +# request_header_max_size 64 KB +request_header_max_size %%request_header_max_size KB + +# TAG: reply_header_max_size (KB) +# This specifies the maximum size for HTTP headers in a reply. +# Reply headers are usually relatively small (about 512 bytes). +# Placing a limit on the reply header size will catch certain +# bugs (for example with persistent connections) and possibly +# buffer-overflow or denial-of-service attacks. +#Default: +# reply_header_max_size 64 KB + +# TAG: request_body_max_size (bytes) +# This specifies the maximum size for an HTTP request body. +# In other words, the maximum size of a PUT/POST request. +# A user who attempts to send a request with a body larger +# than this limit receives an "Invalid Request" error message. +# If you set this parameter to a zero (the default), there will +# be no limit imposed. +#Default: +# request_body_max_size 0 KB +##EOLE +#request_body_max_size 10 MB +request_body_max_size %%request_body_max_size MB + +# TAG: chunked_request_body_max_size (bytes) +# A broken or confused HTTP/1.1 client may send a chunked HTTP +# request to Squid. Squid does not have full support for that +# feature yet. To cope with such requests, Squid buffers the +# entire request and then dechunks request body to create a +# plain HTTP/1.0 request with a known content length. The plain +# request is then used by the rest of Squid code as usual. +# +# The option value specifies the maximum size of the buffer used +# to hold the request before the conversion. If the chunked +# request size exceeds the specified limit, the conversion +# fails, and the client receives an "unsupported request" error, +# as if dechunking was disabled. +# +# Dechunking is enabled by default. To disable conversion of +# chunked requests, set the maximum to zero. +# +# Request dechunking feature and this option in particular are a +# temporary hack. When chunking requests and responses are fully +# supported, there will be no need to buffer a chunked request. +#Default: +# chunked_request_body_max_size 64 KB + +# TAG: broken_posts +# A list of ACL elements which, if matched, causes Squid to send +# an extra CRLF pair after the body of a PUT/POST request. +# +# Some HTTP servers has broken implementations of PUT/POST, +# and rely on an extra CRLF pair sent by some WWW clients. +# +# Quote from RFC2616 section 4.1 on this matter: +# +# Note: certain buggy HTTP/1.0 client implementations generate an +# extra CRLF's after a POST request. To restate what is explicitly +# forbidden by the BNF, an HTTP/1.1 client must not preface or follow +# a request with an extra CRLF. +# +# This clause only supports fast acl types. +# See http://wiki.squid-cache.org/SquidFaq/SquidAcl for details. +# +#Example: +# acl buggy_server url_regex ^http://.... +# broken_posts allow buggy_server +#Default: +# none + +# TAG: icap_uses_indirect_client on|off +# Controls whether the indirect client address +# (see follow_x_forwarded_for) instead of the +# direct client address is passed to an ICAP +# server as "X-Client-IP". +#Default: +# icap_uses_indirect_client on + +# TAG: via on|off +# If set (default), Squid will include a Via header in requests and +# replies as required by RFC2616. +#Default: +via off + +# TAG: ie_refresh on|off +# Microsoft Internet Explorer up until version 5.5 Service +# Pack 1 has an issue with transparent proxies, wherein it +# is impossible to force a refresh. Turning this on provides +# a partial fix to the problem, by causing all IMS-REFRESH +# requests from older IE versions to check the origin server +# for fresh content. This reduces hit ratio by some amount +# (~10% in my experience), but allows users to actually get +# fresh content when they want it. Note because Squid +# cannot tell if the user is using 5.5 or 5.5SP1, the behavior +# of 5.5 is unchanged from old versions of Squid (i.e. a +# forced refresh is impossible). Newer versions of IE will, +# hopefully, continue to have the new behavior and will be +# handled based on that assumption. This option defaults to +# the old Squid behavior, which is better for hit ratios but +# worse for clients using IE, if they need to be able to +# force fresh content. +#Default: +# ie_refresh off + +# TAG: vary_ignore_expire on|off +# Many HTTP servers supporting Vary gives such objects +# immediate expiry time with no cache-control header +# when requested by a HTTP/1.0 client. This option +# enables Squid to ignore such expiry times until +# HTTP/1.1 is fully implemented. +# +# WARNING: If turned on this may eventually cause some +# varying objects not intended for caching to get cached. +#Default: +# vary_ignore_expire off + +# TAG: request_entities +# Squid defaults to deny GET and HEAD requests with request entities, +# as the meaning of such requests are undefined in the HTTP standard +# even if not explicitly forbidden. +# +# Set this directive to on if you have clients which insists +# on sending request entities in GET or HEAD requests. But be warned +# that there is server software (both proxies and web servers) which +# can fail to properly process this kind of request which may make you +# vulnerable to cache pollution attacks if enabled. +#Default: +# request_entities off + +# TAG: request_header_access +# Usage: request_header_access header_name allow|deny [!]aclname ... +# +# WARNING: Doing this VIOLATES the HTTP standard. Enabling +# this feature could make you liable for problems which it +# causes. +# +# This option replaces the old 'anonymize_headers' and the +# older 'http_anonymizer' option with something that is much +# more configurable. This new method creates a list of ACLs +# for each header, allowing you very fine-tuned header +# mangling. +# +# This option only applies to request headers, i.e., from the +# client to the server. +# +# You can only specify known headers for the header name. +# Other headers are reclassified as 'Other'. You can also +# refer to all the headers with 'All'. +# +# For example, to achieve the same behavior as the old +# 'http_anonymizer standard' option, you should use: +# +# request_header_access From deny all +# request_header_access Referer deny all +# request_header_access Server deny all +# request_header_access User-Agent deny all +# request_header_access WWW-Authenticate deny all +# request_header_access Link deny all +# +# Or, to reproduce the old 'http_anonymizer paranoid' feature +# you should use: +# +# request_header_access Allow allow all +# request_header_access Authorization allow all +# request_header_access WWW-Authenticate allow all +# request_header_access Proxy-Authorization allow all +# request_header_access Proxy-Authenticate allow all +# request_header_access Cache-Control allow all +# request_header_access Content-Encoding allow all +# request_header_access Content-Length allow all +# request_header_access Content-Type allow all +# request_header_access Date allow all +# request_header_access Expires allow all +# request_header_access Host allow all +# request_header_access If-Modified-Since allow all +# request_header_access Last-Modified allow all +# request_header_access Location allow all +# request_header_access Pragma allow all +# request_header_access Accept allow all +# request_header_access Accept-Charset allow all +# request_header_access Accept-Encoding allow all +# request_header_access Accept-Language allow all +# request_header_access Content-Language allow all +# request_header_access Mime-Version allow all +# request_header_access Retry-After allow all +# request_header_access Title allow all +# request_header_access Connection allow all +# request_header_access Proxy-Connection allow all +# request_header_access All deny all +# +# although many of those are HTTP reply headers, and so should be +# controlled with the reply_header_access directive. +# +# By default, all headers are allowed (no anonymizing is +# performed). +#Default: +# none + +# TAG: reply_header_access +# Usage: reply_header_access header_name allow|deny [!]aclname ... +# +# WARNING: Doing this VIOLATES the HTTP standard. Enabling +# this feature could make you liable for problems which it +# causes. +# +# This option only applies to reply headers, i.e., from the +# server to the client. +# +# This is the same as request_header_access, but in the other +# direction. +# +# This option replaces the old 'anonymize_headers' and the +# older 'http_anonymizer' option with something that is much +# more configurable. This new method creates a list of ACLs +# for each header, allowing you very fine-tuned header +# mangling. +# +# You can only specify known headers for the header name. +# Other headers are reclassified as 'Other'. You can also +# refer to all the headers with 'All'. +# +# For example, to achieve the same behavior as the old +# 'http_anonymizer standard' option, you should use: +# +# reply_header_access From deny all +# reply_header_access Referer deny all +# reply_header_access Server deny all +# reply_header_access User-Agent deny all +# reply_header_access WWW-Authenticate deny all +# reply_header_access Link deny all +# +# Or, to reproduce the old 'http_anonymizer paranoid' feature +# you should use: +# +# reply_header_access Allow allow all +# reply_header_access Authorization allow all +# reply_header_access WWW-Authenticate allow all +# reply_header_access Proxy-Authorization allow all +# reply_header_access Proxy-Authenticate allow all +# reply_header_access Cache-Control allow all +# reply_header_access Content-Encoding allow all +# reply_header_access Content-Length allow all +# reply_header_access Content-Type allow all +# reply_header_access Date allow all +# reply_header_access Expires allow all +# reply_header_access Host allow all +# reply_header_access If-Modified-Since allow all +# reply_header_access Last-Modified allow all +# reply_header_access Location allow all +# reply_header_access Pragma allow all +# reply_header_access Accept allow all +# reply_header_access Accept-Charset allow all +# reply_header_access Accept-Encoding allow all +# reply_header_access Accept-Language allow all +# reply_header_access Content-Language allow all +# reply_header_access Mime-Version allow all +# reply_header_access Retry-After allow all +# reply_header_access Title allow all +# reply_header_access Connection allow all +# reply_header_access Proxy-Connection allow all +# reply_header_access All deny all +# +# although the HTTP request headers won't be usefully controlled +# by this directive -- see request_header_access for details. +# +# By default, all headers are allowed (no anonymizing is +# performed). +#Default: +# none + +# TAG: header_replace +# Usage: header_replace header_name message +# Example: header_replace User-Agent Nutscrape/1.0 (CP/M; 8-bit) +# +# This option allows you to change the contents of headers +# denied with header_access above, by replacing them with +# some fixed string. This replaces the old fake_user_agent +# option. +# +# This only applies to request headers, not reply headers. +# +# By default, headers are removed if denied. +#Default: +# none + +# TAG: relaxed_header_parser on|off|warn +# In the default "on" setting Squid accepts certain forms +# of non-compliant HTTP messages where it is unambiguous +# what the sending application intended even if the message +# is not correctly formatted. The messages is then normalized +# to the correct form when forwarded by Squid. +# +# If set to "warn" then a warning will be emitted in cache.log +# each time such HTTP error is encountered. +# +# If set to "off" then such HTTP errors will cause the request +# or response to be rejected. +#Default: +# relaxed_header_parser on + +# TIMEOUTS +# ----------------------------------------------------------------------------- + +# TAG: forward_timeout time-units +# This parameter specifies how long Squid should at most attempt in +# finding a forwarding path for the request before giving up. +#Default: +# forward_timeout 4 minutes +forward_timeout %%forward_timeout seconds + +# TAG: connect_timeout time-units +# This parameter specifies how long to wait for the TCP connect to +# the requested server or peer to complete before Squid should +# attempt to find another path where to forward the request. +#Default: +# connect_timeout 1 minute +connect_timeout %%connect_timeout seconds + +# TAG: peer_connect_timeout time-units +# This parameter specifies how long to wait for a pending TCP +# connection to a peer cache. The default is 30 seconds. You +# may also set different timeout values for individual neighbors +# with the 'connect-timeout' option on a 'cache_peer' line. +#Default: +# peer_connect_timeout 30 seconds +peer_connect_timeout %%peer_connect_timeout seconds + +# TAG: read_timeout time-units +# The read_timeout is applied on server-side connections. After +# each successful read(), the timeout will be extended by this +# amount. If no data is read again after this amount of time, +# the request is aborted and logged with ERR_READ_TIMEOUT. The +# default is 15 minutes. +#Default: +# read_timeout 15 minutes +read_timeout %%read_timeout seconds + +# TAG: request_timeout +# How long to wait for an HTTP request after initial +# connection establishment. +#Default: +# request_timeout 5 minutes +request_timeout %%request_timeout seconds + +# TAG: persistent_request_timeout +# How long to wait for the next HTTP request on a persistent +# connection after the previous request completes. +#Default: +# persistent_request_timeout 2 minutes +persistent_request_timeout %%persistent_request_timeout seconds + +# TAG: client_lifetime time-units +# The maximum amount of time a client (browser) is allowed to +# remain connected to the cache process. This protects the Cache +# from having a lot of sockets (and hence file descriptors) tied up +# in a CLOSE_WAIT state from remote clients that go away without +# properly shutting down (either because of a network failure or +# because of a poor client implementation). The default is one +# day, 1440 minutes. +# +# NOTE: The default value is intended to be much larger than any +# client would ever need to be connected to your cache. You +# should probably change client_lifetime only as a last resort. +# If you seem to have many client connections tying up +# filedescriptors, we recommend first tuning the read_timeout, +# request_timeout, persistent_request_timeout and quick_abort values. +#Default: +# client_lifetime 1 day +#EOLE +#client_lifetime 120 minutes +client_lifetime %%client_lifetime minutes + +# TAG: half_closed_clients +# Some clients may shutdown the sending side of their TCP +# connections, while leaving their receiving sides open. Sometimes, +# Squid can not tell the difference between a half-closed and a +# fully-closed TCP connection. +# +# By default, Squid will immediately close client connections when +# read(2) returns "no more data to read." +# +# Change this option to 'on' and Squid will keep open connections +# until a read(2) or write(2) on the socket returns an error. +# This may show some benefits for reverse proxies. But if not +# it is recommended to leave OFF. +#Default: +# half_closed_clients off +half_closed_clients %%half_closed_clients + +# TAG: pconn_timeout +# Timeout for idle persistent connections to servers and other +# proxies. +#Default: +# pconn_timeout 1 minute +pconn_timeout %%pconn_timeout seconds + +# TAG: ident_timeout +# Maximum time to wait for IDENT lookups to complete. +# +# If this is too high, and you enabled IDENT lookups from untrusted +# users, you might be susceptible to denial-of-service by having +# many ident requests going at once. +#Default: +# ident_timeout 10 seconds +ident_timeout %%ident_timeout seconds + +# TAG: shutdown_lifetime time-units +# When SIGTERM or SIGHUP is received, the cache is put into +# "shutdown pending" mode until all active sockets are closed. +# This value is the lifetime to set for all open descriptors +# during shutdown mode. Any active clients after this many +# seconds will receive a 'timeout' message. +#Default: +# shutdown_lifetime 30 seconds +shutdown_lifetime %%shutdown_lifetime seconds + +# ADMINISTRATIVE PARAMETERS +# ----------------------------------------------------------------------------- + +# TAG: cache_mgr +# Email-address of local cache manager who will receive +# mail if the cache dies. The default is "webmaster." +#Default: +# cache_mgr webmaster + +# TAG: mail_from +# From: email-address for mail sent when the cache dies. +# The default is to use 'appname@unique_hostname'. +# Default appname value is "squid", can be changed into +# src/globals.h before building squid. +#Default: +# none + +# TAG: mail_program +# Email program used to send mail if the cache dies. +# The default is "mail". The specified program must comply +# with the standard Unix mail syntax: +# mail-program recipient < mailfile +# +# Optional command line options can be specified. +#Default: +# mail_program mail + +# TAG: cache_effective_user +# If you start Squid as root, it will change its effective/real +# UID/GID to the user specified below. The default is to change +# to UID of proxy. +# see also; cache_effective_group +#Default: +cache_effective_user proxy + +# TAG: cache_effective_group +# Squid sets the GID to the effective user's default group ID +# (taken from the password file) and supplementary group list +# from the groups membership. +# +# If you want Squid to run with a specific GID regardless of +# the group memberships of the effective user then set this +# to the group (or GID) you want Squid to run as. When set +# all other group privileges of the effective user are ignored +# and only this GID is effective. If Squid is not started as +# root the user starting Squid MUST be member of the specified +# group. +# +# This option is not recommended by the Squid Team. +# Our preference is for administrators to configure a secure +# user account for squid with UID/GID matching system policies. +#Default: +# none +##EOLE +cache_effective_group proxy + +# TAG: httpd_suppress_version_string on|off +# Suppress Squid version string info in HTTP headers and HTML error pages. +#Default: +# httpd_suppress_version_string off + +# TAG: visible_hostname +# If you want to present a special hostname in error messages, etc, +# define this. Otherwise, the return value of gethostname() +# will be used. If you have multiple caches in a cluster and +# get errors about IP-forwarding you must set them to have individual +# names with this setting. +#Default: +# visible_hostname localhost + +# TAG: unique_hostname +# If you want to have multiple machines with the same +# 'visible_hostname' you must give each machine a different +# 'unique_hostname' so forwarding loops can be detected. +#Default: +# none + +# TAG: hostname_aliases +# A list of other DNS names your cache has. +#Default: +# none + +# TAG: umask +# Minimum umask which should be enforced while the proxy +# is running, in addition to the umask set at startup. +# +# For a traditional octal representation of umasks, start +# your value with 0. +#Default: +# umask 027 + +# OPTIONS FOR THE CACHE REGISTRATION SERVICE +# ----------------------------------------------------------------------------- +# +# This section contains parameters for the (optional) cache +# announcement service. This service is provided to help +# cache administrators locate one another in order to join or +# create cache hierarchies. +# +# An 'announcement' message is sent (via UDP) to the registration +# service by Squid. By default, the announcement message is NOT +# SENT unless you enable it with 'announce_period' below. +# +# The announcement message includes your hostname, plus the +# following information from this configuration file: +# +# http_port +# icp_port +# cache_mgr +# +# All current information is processed regularly and made +# available on the Web at http://www.ircache.net/Cache/Tracker/. + +# TAG: announce_period +# This is how frequently to send cache announcements. The +# default is `0' which disables sending the announcement +# messages. +# +# To enable announcing your cache, just set an announce period. +# +# Example: +# announce_period 1 day +#Default: +# announce_period 0 + +# TAG: announce_host +# TAG: announce_file +# TAG: announce_port +# announce_host and announce_port set the hostname and port +# number where the registration message will be sent. +# +# Hostname will default to 'tracker.ircache.net' and port will +# default default to 3131. If the 'filename' argument is given, +# the contents of that file will be included in the announce +# message. +#Default: +# announce_host tracker.ircache.net +# announce_port 3131 + +# HTTPD-ACCELERATOR OPTIONS +# ----------------------------------------------------------------------------- + +# TAG: httpd_accel_surrogate_id +# Surrogates (http://www.esi.org/architecture_spec_1.0.html) +# need an identification token to allow control targeting. Because +# a farm of surrogates may all perform the same tasks, they may share +# an identification token. +#Default: +# httpd_accel_surrogate_id unset-id + +# TAG: http_accel_surrogate_remote on|off +# Remote surrogates (such as those in a CDN) honour Surrogate-Control: no-store-remote. +# Set this to on to have squid behave as a remote surrogate. +#Default: +# http_accel_surrogate_remote off + +# TAG: esi_parser libxml2|expat|custom +# ESI markup is not strictly XML compatible. The custom ESI parser +# will give higher performance, but cannot handle non ASCII character encodings. +#Default: +# esi_parser custom + +# DELAY POOL PARAMETERS +# ----------------------------------------------------------------------------- + +# TAG: delay_pools +# This represents the number of delay pools to be used. For example, +# if you have one class 2 delay pool and one class 3 delays pool, you +# have a total of 2 delay pools. +#Default: +# delay_pools 0 + +# TAG: delay_class +# This defines the class of each delay pool. There must be exactly one +# delay_class line for each delay pool. For example, to define two +# delay pools, one of class 2 and one of class 3, the settings above +# and here would be: +# +# Example: +# delay_pools 4 # 4 delay pools +# delay_class 1 2 # pool 1 is a class 2 pool +# delay_class 2 3 # pool 2 is a class 3 pool +# delay_class 3 4 # pool 3 is a class 4 pool +# delay_class 4 5 # pool 4 is a class 5 pool +# +# The delay pool classes are: +# +# class 1 Everything is limited by a single aggregate +# bucket. +# +# class 2 Everything is limited by a single aggregate +# bucket as well as an "individual" bucket chosen +# from bits 25 through 32 of the IPv4 address. +# +# class 3 Everything is limited by a single aggregate +# bucket as well as a "network" bucket chosen +# from bits 17 through 24 of the IP address and a +# "individual" bucket chosen from bits 17 through +# 32 of the IPv4 address. +# +# class 4 Everything in a class 3 delay pool, with an +# additional limit on a per user basis. This +# only takes effect if the username is established +# in advance - by forcing authentication in your +# http_access rules. +# +# class 5 Requests are grouped according their tag (see +# external_acl's tag= reply). +# +# NOTE: If an IP address is a.b.c.d +# -> bits 25 through 32 are "d" +# -> bits 17 through 24 are "c" +# -> bits 17 through 32 are "c * 256 + d" +# +# NOTE-2: Due to the use of bitmasks in class 2,3,4 pools they only apply to +# IPv4 traffic. Class 1 and 5 pools may be used with IPv6 traffic. +#Default: +# none + +# TAG: delay_access +# This is used to determine which delay pool a request falls into. +# +# delay_access is sorted per pool and the matching starts with pool 1, +# then pool 2, ..., and finally pool N. The first delay pool where the +# request is allowed is selected for the request. If it does not allow +# the request to any pool then the request is not delayed (default). +# +# For example, if you want some_big_clients in delay +# pool 1 and lotsa_little_clients in delay pool 2: +# +#Example: +# delay_access 1 allow some_big_clients +# delay_access 1 deny all +# delay_access 2 allow lotsa_little_clients +# delay_access 2 deny all +# delay_access 3 allow authenticated_clients +#Default: +# none + +# TAG: delay_parameters +# This defines the parameters for a delay pool. Each delay pool has +# a number of "buckets" associated with it, as explained in the +# description of delay_class. For a class 1 delay pool, the syntax is: +# +#delay_parameters pool aggregate +# +# For a class 2 delay pool: +# +#delay_parameters pool aggregate individual +# +# For a class 3 delay pool: +# +#delay_parameters pool aggregate network individual +# +# For a class 4 delay pool: +# +#delay_parameters pool aggregate network individual user +# +# For a class 5 delay pool: +# +#delay_parameters pool tag +# +# The variables here are: +# +# pool a pool number - ie, a number between 1 and the +# number specified in delay_pools as used in +# delay_class lines. +# +# aggregate the "delay parameters" for the aggregate bucket +# (class 1, 2, 3). +# +# individual the "delay parameters" for the individual +# buckets (class 2, 3). +# +# network the "delay parameters" for the network buckets +# (class 3). +# +# user the delay parameters for the user buckets +# (class 4). +# +# tag the delay parameters for the tag buckets +# (class 5). +# +# A pair of delay parameters is written restore/maximum, where restore is +# the number of bytes (not bits - modem and network speeds are usually +# quoted in bits) per second placed into the bucket, and maximum is the +# maximum number of bytes which can be in the bucket at any time. +# +# For example, if delay pool number 1 is a class 2 delay pool as in the +# above example, and is being used to strictly limit each host to 64kbps +# (plus overheads), with no overall limit, the line is: +# +#delay_parameters 1 -1/-1 8000/8000 +# +# Note that the figure -1 is used to represent "unlimited". +# +# And, if delay pool number 2 is a class 3 delay pool as in the above +# example, and you want to limit it to a total of 256kbps (strict limit) +# with each 8-bit network permitted 64kbps (strict limit) and each +# individual host permitted 4800bps with a bucket maximum size of 64kb +# to permit a decent web page to be downloaded at a decent speed +# (if the network is not being limited due to overuse) but slow down +# large downloads more significantly: +# +#delay_parameters 2 32000/32000 8000/8000 600/8000 +# +# There must be one delay_parameters line for each delay pool. +# +# Finally, for a class 4 delay pool as in the example - each user will +# be limited to 128Kb no matter how many workstations they are logged into.: +# +#delay_parameters 4 32000/32000 8000/8000 600/64000 16000/16000 +#Default: +# none + +# TAG: delay_initial_bucket_level (percent, 0-100) +# The initial bucket percentage is used to determine how much is put +# in each bucket when squid starts, is reconfigured, or first notices +# a host accessing it (in class 2 and class 3, individual hosts and +# networks only have buckets associated with them once they have been +# "seen" by squid). +#Default: +# delay_initial_bucket_level 50 + +# WCCPv1 AND WCCPv2 CONFIGURATION OPTIONS +# ----------------------------------------------------------------------------- + +# TAG: wccp_router +# Use this option to define your WCCP ``home'' router for +# Squid. +# +# wccp_router supports a single WCCP(v1) router +# +# wccp2_router supports multiple WCCPv2 routers +# +# only one of the two may be used at the same time and defines +# which version of WCCP to use. +#Default: +# wccp_router any_addr + +# TAG: wccp2_router +# Use this option to define your WCCP ``home'' router for +# Squid. +# +# wccp_router supports a single WCCP(v1) router +# +# wccp2_router supports multiple WCCPv2 routers +# +# only one of the two may be used at the same time and defines +# which version of WCCP to use. +#Default: +# none + +# TAG: wccp_version +# This directive is only relevant if you need to set up WCCP(v1) +# to some very old and end-of-life Cisco routers. In all other +# setups it must be left unset or at the default setting. +# It defines an internal version in the WCCP(v1) protocol, +# with version 4 being the officially documented protocol. +# +# According to some users, Cisco IOS 11.2 and earlier only +# support WCCP version 3. If you're using that or an earlier +# version of IOS, you may need to change this value to 3, otherwise +# do not specify this parameter. +#Default: +# wccp_version 4 + +# TAG: wccp2_rebuild_wait +# If this is enabled Squid will wait for the cache dir rebuild to finish +# before sending the first wccp2 HereIAm packet +#Default: +# wccp2_rebuild_wait on + +# TAG: wccp2_forwarding_method +# WCCP2 allows the setting of forwarding methods between the +# router/switch and the cache. Valid values are as follows: +# +# gre - GRE encapsulation (forward the packet in a GRE/WCCP tunnel) +# l2 - L2 redirect (forward the packet using Layer 2/MAC rewriting) +# +# Currently (as of IOS 12.4) cisco routers only support GRE. +# Cisco switches only support the L2 redirect assignment method. +#Default: +# wccp2_forwarding_method gre + +# TAG: wccp2_return_method +# WCCP2 allows the setting of return methods between the +# router/switch and the cache for packets that the cache +# decides not to handle. Valid values are as follows: +# +# gre - GRE encapsulation (forward the packet in a GRE/WCCP tunnel) +# l2 - L2 redirect (forward the packet using Layer 2/MAC rewriting) +# +# Currently (as of IOS 12.4) cisco routers only support GRE. +# Cisco switches only support the L2 redirect assignment. +# +# If the "ip wccp redirect exclude in" command has been +# enabled on the cache interface, then it is still safe for +# the proxy server to use a l2 redirect method even if this +# option is set to GRE. +#Default: +# wccp2_return_method gre + +# TAG: wccp2_assignment_method +# WCCP2 allows the setting of methods to assign the WCCP hash +# Valid values are as follows: +# +# hash - Hash assignment +# mask - Mask assignment +# +# As a general rule, cisco routers support the hash assignment method +# and cisco switches support the mask assignment method. +#Default: +# wccp2_assignment_method hash + +# TAG: wccp2_service +# WCCP2 allows for multiple traffic services. There are two +# types: "standard" and "dynamic". The standard type defines +# one service id - http (id 0). The dynamic service ids can be from +# 51 to 255 inclusive. In order to use a dynamic service id +# one must define the type of traffic to be redirected; this is done +# using the wccp2_service_info option. +# +# The "standard" type does not require a wccp2_service_info option, +# just specifying the service id will suffice. +# +# MD5 service authentication can be enabled by adding +# "password=<password>" to the end of this service declaration. +# +# Examples: +# +# wccp2_service standard 0 # for the 'web-cache' standard service +# wccp2_service dynamic 80 # a dynamic service type which will be +# # fleshed out with subsequent options. +# wccp2_service standard 0 password=foo +#Default: +# wccp2_service standard 0 + +# TAG: wccp2_service_info +# Dynamic WCCPv2 services require further information to define the +# traffic you wish to have diverted. +# +# The format is: +# +# wccp2_service_info <id> protocol=<protocol> flags=<flag>,<flag>.. +# priority=<priority> ports=<port>,<port>.. +# +# The relevant WCCPv2 flags: +# + src_ip_hash, dst_ip_hash +# + source_port_hash, dst_port_hash +# + src_ip_alt_hash, dst_ip_alt_hash +# + src_port_alt_hash, dst_port_alt_hash +# + ports_source +# +# The port list can be one to eight entries. +# +# Example: +# +# wccp2_service_info 80 protocol=tcp flags=src_ip_hash,ports_source +# priority=240 ports=80 +# +# Note: the service id must have been defined by a previous +# 'wccp2_service dynamic <id>' entry. +#Default: +# none + +# TAG: wccp2_weight +# Each cache server gets assigned a set of the destination +# hash proportional to their weight. +#Default: +# wccp2_weight 10000 + +# TAG: wccp_address +# TAG: wccp2_address +# Use this option if you require WCCP to use a specific +# interface address. +# +# The default behavior is to not bind to any specific address. +#Default: +# wccp_address 0.0.0.0 +# wccp2_address 0.0.0.0 + +# PERSISTENT CONNECTION HANDLING +# ----------------------------------------------------------------------------- +# +# Also see "pconn_timeout" in the TIMEOUTS section + +# TAG: client_persistent_connections +# TAG: server_persistent_connections +# Persistent connection support for clients and servers. By +# default, Squid uses persistent connections (when allowed) +# with its clients and servers. You can use these options to +# disable persistent connections with clients and/or servers. +#Default: +# client_persistent_connections on +# server_persistent_connections on + +# TAG: persistent_connection_after_error +# With this directive the use of persistent connections after +# HTTP errors can be disabled. Useful if you have clients +# who fail to handle errors on persistent connections proper. +#Default: +# persistent_connection_after_error off + +# TAG: detect_broken_pconn +# Some servers have been found to incorrectly signal the use +# of HTTP/1.0 persistent connections even on replies not +# compatible, causing significant delays. This server problem +# has mostly been seen on redirects. +# +# By enabling this directive Squid attempts to detect such +# broken replies and automatically assume the reply is finished +# after 10 seconds timeout. +#Default: +# detect_broken_pconn off + +# CACHE DIGEST OPTIONS +# ----------------------------------------------------------------------------- + +# TAG: digest_generation +# This controls whether the server will generate a Cache Digest +# of its contents. By default, Cache Digest generation is +# enabled if Squid is compiled with --enable-cache-digests defined. +#Default: +# digest_generation on + +# TAG: digest_bits_per_entry +# This is the number of bits of the server's Cache Digest which +# will be associated with the Digest entry for a given HTTP +# Method and URL (public key) combination. The default is 5. +#Default: +# digest_bits_per_entry 5 + +# TAG: digest_rebuild_period (seconds) +# This is the wait time between Cache Digest rebuilds. +#Default: +# digest_rebuild_period 1 hour + +# TAG: digest_rewrite_period (seconds) +# This is the wait time between Cache Digest writes to +# disk. +#Default: +# digest_rewrite_period 1 hour + +# TAG: digest_swapout_chunk_size (bytes) +# This is the number of bytes of the Cache Digest to write to +# disk at a time. It defaults to 4096 bytes (4KB), the Squid +# default swap page. +#Default: +# digest_swapout_chunk_size 4096 bytes + +# TAG: digest_rebuild_chunk_percentage (percent, 0-100) +# This is the percentage of the Cache Digest to be scanned at a +# time. By default it is set to 10% of the Cache Digest. +#Default: +# digest_rebuild_chunk_percentage 10 + +# SNMP OPTIONS +# ----------------------------------------------------------------------------- + +# TAG: snmp_access +# Allowing or denying access to the SNMP port. +# +# All access to the agent is denied by default. +# usage: +# +# snmp_access allow|deny [!]aclname ... +# +# This clause only supports fast acl types. +# See http://wiki.squid-cache.org/SquidFaq/SquidAcl for details. +#Example: +# snmp_access allow snmppublic localhost +# snmp_access deny all +#Default: +# snmp_access deny all +##EOLE +snmp_access allow snmppublic lxcroot +snmp_access allow snmppublic localhost +snmp_access deny all + +# TAG: snmp_incoming_address +# TAG: snmp_outgoing_address +# Just like 'udp_incoming_address', but for the SNMP port. +# +# snmp_incoming_address is used for the SNMP socket receiving +# messages from SNMP agents. +# snmp_outgoing_address is used for SNMP packets returned to SNMP +# agents. +# +# The default snmp_incoming_address is to listen on all +# available network interfaces. +# +# If snmp_outgoing_address is not set it will use the same socket +# as snmp_incoming_address. Only change this if you want to have +# SNMP replies sent using another address than where this Squid +# listens for SNMP queries. +# +# NOTE, snmp_incoming_address and snmp_outgoing_address can not have +# the same value since they both use port 3401. +#Default: +# snmp_incoming_address any_addr +# snmp_outgoing_address no_addr +##EOLE +snmp_incoming_address %%container_ip_proxy +#snmp_outgoing_address 255.255.255.255 + +# ICP OPTIONS +# ----------------------------------------------------------------------------- + +# TAG: icp_port +# The port number where Squid sends and receives ICP queries to +# and from neighbor caches. The standard UDP port for ICP is 3130. +# Default is disabled (0). +# +# Example: +# icp_port 3130 +#Default: +# icp_port 0 +icp_port %%icp_port + +# TAG: htcp_port +# The port number where Squid sends and receives HTCP queries to +# and from neighbor caches. To turn it on you want to set it to +# 4827. By default it is set to "0" (disabled). +# +# Example: +# htcp_port 4827 +#Default: +# htcp_port 0 +htcp_port %%htcp_port + +# TAG: log_icp_queries on|off +# If set, ICP queries are logged to access.log. You may wish +# do disable this if your ICP load is VERY high to speed things +# up or to simplify log analysis. +#Default: +# log_icp_queries on + +# TAG: udp_incoming_address +# udp_incoming_address is used for UDP packets received from other +# caches. +# +# The default behavior is to not bind to any specific address. +# +# Only change this if you want to have all UDP queries received on +# a specific interface/address. +# +# NOTE: udp_incoming_address is used by the ICP, HTCP, and DNS +# modules. Altering it will affect all of them in the same manner. +# +# see also; udp_outgoing_address +# +# NOTE, udp_incoming_address and udp_outgoing_address can not +# have the same value since they both use the same port. +#Default: +# udp_incoming_address any_addr +#udp_incoming_address + +# TAG: udp_outgoing_address +# udp_outgoing_address is used for UDP packets sent out to other +# caches. +# +# The default behavior is to not bind to any specific address. +# +# Instead it will use the same socket as udp_incoming_address. +# Only change this if you want to have UDP queries sent using another +# address than where this Squid listens for UDP queries from other +# caches. +# +# NOTE: udp_outgoing_address is used by the ICP, HTCP, and DNS +# modules. Altering it will affect all of them in the same manner. +# +# see also; udp_incoming_address +# +# NOTE, udp_incoming_address and udp_outgoing_address can not +# have the same value since they both use the same port. +#Default: +# udp_outgoing_address no_addr +#udp_outgoing_address + +# TAG: icp_hit_stale on|off +# If you want to return ICP_HIT for stale cache objects, set this +# option to 'on'. If you have sibling relationships with caches +# in other administrative domains, this should be 'off'. If you only +# have sibling relationships with caches under your control, +# it is probably okay to set this to 'on'. +# If set to 'on', your siblings should use the option "allow-miss" +# on their cache_peer lines for connecting to you. +#Default: +# icp_hit_stale off + +# TAG: minimum_direct_hops +# If using the ICMP pinging stuff, do direct fetches for sites +# which are no more than this many hops away. +#Default: +# minimum_direct_hops 4 + +# TAG: minimum_direct_rtt +# If using the ICMP pinging stuff, do direct fetches for sites +# which are no more than this many rtt milliseconds away. +#Default: +# minimum_direct_rtt 400 + +# TAG: netdb_low +# TAG: netdb_high +# The low and high water marks for the ICMP measurement +# database. These are counts, not percents. The defaults are +# 900 and 1000. When the high water mark is reached, database +# entries will be deleted until the low mark is reached. +#Default: +# netdb_low 900 +# netdb_high 1000 + +# TAG: netdb_ping_period +# The minimum period for measuring a site. There will be at +# least this much delay between successive pings to the same +# network. The default is five minutes. +#Default: +# netdb_ping_period 5 minutes + +# TAG: query_icmp on|off +# If you want to ask your peers to include ICMP data in their ICP +# replies, enable this option. +# +# If your peer has configured Squid (during compilation) with +# '--enable-icmp' that peer will send ICMP pings to origin server +# sites of the URLs it receives. If you enable this option the +# ICP replies from that peer will include the ICMP data (if available). +# Then, when choosing a parent cache, Squid will choose the parent with +# the minimal RTT to the origin server. When this happens, the +# hierarchy field of the access.log will be +# "CLOSEST_PARENT_MISS". This option is off by default. +#Default: +# query_icmp off + +# TAG: test_reachability on|off +# When this is 'on', ICP MISS replies will be ICP_MISS_NOFETCH +# instead of ICP_MISS if the target host is NOT in the ICMP +# database, or has a zero RTT. +#Default: +# test_reachability off + +# TAG: icp_query_timeout (msec) +# Normally Squid will automatically determine an optimal ICP +# query timeout value based on the round-trip-time of recent ICP +# queries. If you want to override the value determined by +# Squid, set this 'icp_query_timeout' to a non-zero value. This +# value is specified in MILLISECONDS, so, to use a 2-second +# timeout (the old default), you would write: +# +# icp_query_timeout 2000 +#Default: +# icp_query_timeout 0 +icp_query_timeout %%icp_query_timeout + +# TAG: maximum_icp_query_timeout (msec) +# Normally the ICP query timeout is determined dynamically. But +# sometimes it can lead to very large values (say 5 seconds). +# Use this option to put an upper limit on the dynamic timeout +# value. Do NOT use this option to always use a fixed (instead +# of a dynamic) timeout value. To set a fixed timeout see the +# 'icp_query_timeout' directive. +#Default: +# maximum_icp_query_timeout 2000 +maximum_icp_query_timeout %%maximum_icp_query_timeout + +# TAG: minimum_icp_query_timeout (msec) +# Normally the ICP query timeout is determined dynamically. But +# sometimes it can lead to very small timeouts, even lower than +# the normal latency variance on your link due to traffic. +# Use this option to put an lower limit on the dynamic timeout +# value. Do NOT use this option to always use a fixed (instead +# of a dynamic) timeout value. To set a fixed timeout see the +# 'icp_query_timeout' directive. +#Default: +# minimum_icp_query_timeout 5 + +# TAG: background_ping_rate time-units +# Controls how often the ICP pings are sent to siblings that +# have background-ping set. +#Default: +# background_ping_rate 10 seconds + +# MULTICAST ICP OPTIONS +# ----------------------------------------------------------------------------- + +# TAG: mcast_groups +# This tag specifies a list of multicast groups which your server +# should join to receive multicasted ICP queries. +# +# NOTE! Be very careful what you put here! Be sure you +# understand the difference between an ICP _query_ and an ICP +# _reply_. This option is to be set only if you want to RECEIVE +# multicast queries. Do NOT set this option to SEND multicast +# ICP (use cache_peer for that). ICP replies are always sent via +# unicast, so this option does not affect whether or not you will +# receive replies from multicast group members. +# +# You must be very careful to NOT use a multicast address which +# is already in use by another group of caches. +# +# If you are unsure about multicast, please read the Multicast +# chapter in the Squid FAQ (http://www.squid-cache.org/FAQ/). +# +# Usage: mcast_groups 239.128.16.128 224.0.1.20 +# +# By default, Squid doesn't listen on any multicast groups. +#Default: +# none +%if %%mcast_groups != '' +mcast_groups %%mcast_groups +%end if + +# TAG: mcast_miss_addr +# Note: This option is only available if Squid is rebuilt with the +# -DMULTICAST_MISS_STREAM define +# +# If you enable this option, every "cache miss" URL will +# be sent out on the specified multicast address. +# +# Do not enable this option unless you are are absolutely +# certain you understand what you are doing. +#Default: +# mcast_miss_addr no_addr + +# TAG: mcast_miss_ttl +# Note: This option is only available if Squid is rebuilt with the +# -DMULTICAST_MISS_STREAM define +# +# This is the time-to-live value for packets multicasted +# when multicasting off cache miss URLs is enabled. By +# default this is set to 'site scope', i.e. 16. +#Default: +# mcast_miss_ttl 16 + +# TAG: mcast_miss_port +# Note: This option is only available if Squid is rebuilt with the +# -DMULTICAST_MISS_STREAM define +# +# This is the port number to be used in conjunction with +# 'mcast_miss_addr'. +#Default: +# mcast_miss_port 3135 + +# TAG: mcast_miss_encode_key +# Note: This option is only available if Squid is rebuilt with the +# -DMULTICAST_MISS_STREAM define +# +# The URLs that are sent in the multicast miss stream are +# encrypted. This is the encryption key. +#Default: +# mcast_miss_encode_key XXXXXXXXXXXXXXXX + +# TAG: mcast_icp_query_timeout (msec) +# For multicast peers, Squid regularly sends out ICP "probes" to +# count how many other peers are listening on the given multicast +# address. This value specifies how long Squid should wait to +# count all the replies. The default is 2000 msec, or 2 +# seconds. +#Default: +# mcast_icp_query_timeout 2000 +mcast_icp_query_timeout %%mcast_icp_query_timeout + +# INTERNAL ICON OPTIONS +# ----------------------------------------------------------------------------- + +# TAG: icon_directory +# Where the icons are stored. These are normally kept in +# /usr/share/squid/icons +#Default: +# icon_directory /usr/share/squid/icons + +# TAG: global_internal_static +# This directive controls is Squid should intercept all requests for +# /squid-internal-static/ no matter which host the URL is requesting +# (default on setting), or if nothing special should be done for +# such URLs (off setting). The purpose of this directive is to make +# icons etc work better in complex cache hierarchies where it may +# not always be possible for all corners in the cache mesh to reach +# the server generating a directory listing. +#Default: +# global_internal_static on + +# TAG: short_icon_urls +# If this is enabled Squid will use short URLs for icons. +# If disabled it will revert to the old behavior of including +# it's own name and port in the URL. +# +# If you run a complex cache hierarchy with a mix of Squid and +# other proxies you may need to disable this directive. +#Default: +# short_icon_urls on + +# ERROR PAGE OPTIONS +# ----------------------------------------------------------------------------- + +# TAG: error_directory +# If you wish to create your own versions of the default +# error files to customize them to suit your company copy +# the error/template files to another directory and point +# this tag at them. +# +# WARNING: This option will disable multi-language support +# on error pages if used. +# +# The squid developers are interested in making squid available in +# a wide variety of languages. If you are making translations for a +# language that Squid does not currently provide please consider +# contributing your translation back to the project. +# http://wiki.squid-cache.org/Translations +# +# The squid developers working on translations are happy to supply drop-in +# translated error files in exchange for any new language contributions. +#Default: +# none + +# TAG: error_default_language +# Set the default language which squid will send error pages in +# if no existing translation matches the clients language +# preferences. +# +# If unset (default) generic English will be used. +# +# The squid developers are interested in making squid available in +# a wide variety of languages. If you are interested in making +# translations for any language see the squid wiki for details. +# http://wiki.squid-cache.org/Translations +#Default: +# none + +# TAG: error_log_languages +# Log to cache.log what languages users are attempting to +# auto-negotiate for translations. +# +# Successful negotiations are not logged. Only failures +# have meaning to indicate that Squid may need an upgrade +# of its error page translations. +#Default: +# error_log_languages on + +# TAG: err_page_stylesheet +# CSS Stylesheet to pattern the display of Squid default error pages. +# +# For information on CSS see http://www.w3.org/Style/CSS/ +#Default: +# err_page_stylesheet /etc/squid/errorpage.css + +# TAG: err_html_text +# HTML text to include in error messages. Make this a "mailto" +# URL to your admin address, or maybe just a link to your +# organizations Web page. +# +# To include this in your error messages, you must rewrite +# the error template files (found in the "errors" directory). +# Wherever you want the 'err_html_text' line to appear, +# insert a %L tag in the error template file. +#Default: +# none + +# TAG: email_err_data on|off +# If enabled, information about the occurred error will be +# included in the mailto links of the ERR pages (if %W is set) +# so that the email body contains the data. +# Syntax is <A HREF="mailto:%w%W">%w</A> +#Default: +# email_err_data on + +# TAG: deny_info +# Usage: deny_info err_page_name acl +# or deny_info http://... acl +# or deny_info TCP_RESET acl +# +# This can be used to return a ERR_ page for requests which +# do not pass the 'http_access' rules. Squid remembers the last +# acl it evaluated in http_access, and if a 'deny_info' line exists +# for that ACL Squid returns a corresponding error page. +# +# The acl is typically the last acl on the http_access deny line which +# denied access. The exceptions to this rule are: +# - When Squid needs to request authentication credentials. It's then +# the first authentication related acl encountered +# - When none of the http_access lines matches. It's then the last +# acl processed on the last http_access line. +# +# NP: If providing your own custom error pages with error_directory +# you may also specify them by your custom file name: +# Example: deny_info ERR_CUSTOM_ACCESS_DENIED bad_guys +# +# Alternatively you can specify an error URL. The browsers will +# get redirected (302) to the specified URL. %s in the redirection +# URL will be replaced by the requested URL. +# +# Alternatively you can tell Squid to reset the TCP connection +# by specifying TCP_RESET. +#Default: +# none + +# OPTIONS INFLUENCING REQUEST FORWARDING +# ----------------------------------------------------------------------------- + +# TAG: nonhierarchical_direct +# By default, Squid will send any non-hierarchical requests +# (matching hierarchy_stoplist or not cacheable request type) direct +# to origin servers. +# +# If you set this to off, Squid will prefer to send these +# requests to parents. +# +# Note that in most configurations, by turning this off you will only +# add latency to these request without any improvement in global hit +# ratio. +# +# If you are inside an firewall see never_direct instead of +# this directive. +#Default: +# nonhierarchical_direct on + +# TAG: prefer_direct +# Normally Squid tries to use parents for most requests. If you for some +# reason like it to first try going direct and only use a parent if +# going direct fails set this to on. +# +# By combining nonhierarchical_direct off and prefer_direct on you +# can set up Squid to use a parent as a backup path if going direct +# fails. +# +# Note: If you want Squid to use parents for all requests see +# the never_direct directive. prefer_direct only modifies how Squid +# acts on cacheable requests. +#Default: +# prefer_direct off + +# TAG: always_direct +# Usage: always_direct allow|deny [!]aclname ... +# +# Here you can use ACL elements to specify requests which should +# ALWAYS be forwarded by Squid to the origin servers without using +# any peers. For example, to always directly forward requests for +# local servers ignoring any parents or siblings you may have use +# something like: +# +# acl local-servers dstdomain my.domain.net +# always_direct allow local-servers +# +# To always forward FTP requests directly, use +# +# acl FTP proto FTP +# always_direct allow FTP +# +# NOTE: There is a similar, but opposite option named +# 'never_direct'. You need to be aware that "always_direct deny +# foo" is NOT the same thing as "never_direct allow foo". You +# may need to use a deny rule to exclude a more-specific case of +# some other rule. Example: +# +# acl local-external dstdomain external.foo.net +# acl local-servers dstdomain .foo.net +# always_direct deny local-external +# always_direct allow local-servers +# +# NOTE: If your goal is to make the client forward the request +# directly to the origin server bypassing Squid then this needs +# to be done in the client configuration. Squid configuration +# can only tell Squid how Squid should fetch the object. +# +# NOTE: This directive is not related to caching. The replies +# is cached as usual even if you use always_direct. To not cache +# the replies see the 'cache' directive. +# +# This clause supports both fast and slow acl types. +# See http://wiki.squid-cache.org/SquidFaq/SquidAcl for details. +#Default: +# none + +# TAG: never_direct +# Usage: never_direct allow|deny [!]aclname ... +# +# never_direct is the opposite of always_direct. Please read +# the description for always_direct if you have not already. +# +# With 'never_direct' you can use ACL elements to specify +# requests which should NEVER be forwarded directly to origin +# servers. For example, to force the use of a proxy for all +# requests, except those in your local domain use something like: +# +# acl local-servers dstdomain .foo.net +# never_direct deny local-servers +# never_direct allow all +# +# or if Squid is inside a firewall and there are local intranet +# servers inside the firewall use something like: +# +# acl local-intranet dstdomain .foo.net +# acl local-external dstdomain external.foo.net +# always_direct deny local-external +# always_direct allow local-intranet +# never_direct allow all +# +# This clause supports both fast and slow acl types. +# See http://wiki.squid-cache.org/SquidFaq/SquidAcl for details. +#Default: +# none +always_direct allow localdom +%if %%activer_cache_pere == 'oui' +always_direct allow localdest + %if %%getVar('acces_proxy_zone_rvp', 'non') == 'oui' + %if %%proxy_pere_rvp == 'non' + %for %%idx, %%net_iter in %%enumerate(%%adresse_network_zone_rvp) +always_direct allow rvpdom%%idx + %end for + %end if + %end if +always_direct allow nopeerproxy +%if %%is_defined('wan_route_adresse') +always_direct allow nopeerproxip +%end if +never_direct allow all +%end if +## +%if %%activer_cache_pere_zone == 'oui' + %for %%idx, %%zones_iter in %%enumerate(%%nom_cache_pere_zone) + %if %%zones_iter.nom_zone_dns_cache not in %%dict_duplicate_acl + %set %%acl_name = "intradom" + %%str(%%idx) + %else + %set %%acl_name = %%dict_duplicate_acl[%%zones_iter.nom_zone_dns_cache] + %end if + %if %%getattr(%%zones_iter, 'autoriser_proxy_autres', 'oui') == 'non' +never_direct allow %%acl_name %%nom_machine_eth1 + %if %%vlan_eth1 == "oui" + %for %%idx2, %%vlans_1 in %%enumerate(%%vlan_id_eth1) +never_direct allow intradom%%idx2 vlan_eth1_%%vlans_1 + %end for + %end if + %else +never_direct allow %%acl_name + %end if + %end for +%end if + + +# ADVANCED NETWORKING OPTIONS +# ----------------------------------------------------------------------------- + +# TAG: incoming_icp_average +# TAG: incoming_http_average +# TAG: incoming_dns_average +# TAG: min_icp_poll_cnt +# TAG: min_dns_poll_cnt +# TAG: min_http_poll_cnt +# Heavy voodoo here. I can't even believe you are reading this. +# Are you crazy? Don't even think about adjusting these unless +# you understand the algorithms in comm_select.c first! +#Default: +# incoming_icp_average 6 +# incoming_http_average 4 +# incoming_dns_average 4 +# min_icp_poll_cnt 8 +# min_dns_poll_cnt 8 +# min_http_poll_cnt 8 + +# TAG: accept_filter +# FreeBSD: +# +# The name of an accept(2) filter to install on Squid's +# listen socket(s). This feature is perhaps specific to +# FreeBSD and requires support in the kernel. +# +# The 'httpready' filter delays delivering new connections +# to Squid until a full HTTP request has been received. +# See the accf_http(9) man page for details. +# +# The 'dataready' filter delays delivering new connections +# to Squid until there is some data to process. +# See the accf_dataready(9) man page for details. +# +# Linux: +# +# The 'data' filter delays delivering of new connections +# to Squid until there is some data to process by TCP_ACCEPT_DEFER. +# You may optionally specify a number of seconds to wait by +# 'data=N' where N is the number of seconds. Defaults to 30 +# if not specified. See the tcp(7) man page for details. +#EXAMPLE: +## FreeBSD +#accept_filter httpready +## Linux +#accept_filter data +#Default: +# none + +# TAG: client_ip_max_connections +# Set an absolute limit on the number of connections a single +# client IP can use. Any more than this and Squid will begin to drop +# new connections from the client until it closes some links. +# +# Note that this is a global limit. It affects all HTTP, HTCP, Gopher and FTP +# connections from the client. For finer control use the ACL access controls. +# +# Requires client_db to be enabled (the default). +# +# WARNING: This may noticably slow down traffic received via external proxies +# or NAT devices and cause them to rebound error messages back to their clients. +#Default: +# client_ip_max_connections -1 + +# TAG: tcp_recv_bufsize (bytes) +# Size of receive buffer to set for TCP sockets. Probably just +# as easy to change your kernel's default. Set to zero to use +# the default buffer size. +#Default: +# tcp_recv_bufsize 0 bytes + +# ICAP OPTIONS +# ----------------------------------------------------------------------------- + +# TAG: icap_enable on|off +# If you want to enable the ICAP module support, set this to on. +#Default: +# icap_enable off + +# TAG: icap_connect_timeout +# This parameter specifies how long to wait for the TCP connect to +# the requested ICAP server to complete before giving up and either +# terminating the HTTP transaction or bypassing the failure. +# +# The default for optional services is peer_connect_timeout. +# The default for essential services is connect_timeout. +# If this option is explicitly set, its value applies to all services. +#Default: +# none + +# TAG: icap_io_timeout time-units +# This parameter specifies how long to wait for an I/O activity on +# an established, active ICAP connection before giving up and +# either terminating the HTTP transaction or bypassing the +# failure. +# +# The default is read_timeout. +#Default: +# none + +# TAG: icap_service_failure_limit +# The limit specifies the number of failures that Squid tolerates +# when establishing a new TCP connection with an ICAP service. If +# the number of failures exceeds the limit, the ICAP service is +# not used for new ICAP requests until it is time to refresh its +# OPTIONS. The per-service failure counter is reset to zero each +# time Squid fetches new service OPTIONS. +# +# A negative value disables the limit. Without the limit, an ICAP +# service will not be considered down due to connectivity failures +# between ICAP OPTIONS requests. +#Default: +# icap_service_failure_limit 10 + +# TAG: icap_service_revival_delay +# The delay specifies the number of seconds to wait after an ICAP +# OPTIONS request failure before requesting the options again. The +# failed ICAP service is considered "down" until fresh OPTIONS are +# fetched. +# +# The actual delay cannot be smaller than the hardcoded minimum +# delay of 30 seconds. +#Default: +# icap_service_revival_delay 180 + +# TAG: icap_preview_enable on|off +# The ICAP Preview feature allows the ICAP server to handle the +# HTTP message by looking only at the beginning of the message body +# or even without receiving the body at all. In some environments, +# previews greatly speedup ICAP processing. +# +# During an ICAP OPTIONS transaction, the server may tell Squid what +# HTTP messages should be previewed and how big the preview should be. +# Squid will not use Preview if the server did not request one. +# +# To disable ICAP Preview for all ICAP services, regardless of +# individual ICAP server OPTIONS responses, set this option to "off". +#Example: +#icap_preview_enable off +#Default: +# icap_preview_enable on + +# TAG: icap_preview_size +# The default size of preview data to be sent to the ICAP server. +# -1 means no preview. This value might be overwritten on a per server +# basis by OPTIONS requests. +#Default: +# icap_preview_size -1 + +# TAG: icap_default_options_ttl +# The default TTL value for ICAP OPTIONS responses that don't have +# an Options-TTL header. +#Default: +# icap_default_options_ttl 60 + +# TAG: icap_persistent_connections on|off +# Whether or not Squid should use persistent connections to +# an ICAP server. +#Default: +# icap_persistent_connections on + +# TAG: icap_send_client_ip on|off +# This adds the header "X-Client-IP" to ICAP requests. +#Default: +# icap_send_client_ip off + +# TAG: icap_send_client_username on|off +# This sends authenticated HTTP client username (if available) to +# the ICAP service. The username value is encoded based on the +# icap_client_username_encode option and is sent using the header +# specified by the icap_client_username_header option. +#Default: +# icap_send_client_username off + +# TAG: icap_client_username_header +# ICAP request header name to use for send_client_username. +#Default: +# icap_client_username_header X-Client-Username + +# TAG: icap_client_username_encode on|off +# Whether to base64 encode the authenticated client username. +#Default: +# icap_client_username_encode off + +# TAG: icap_service +# Defines a single ICAP service using the following format: +# +# icap_service service_name vectoring_point [options] service_url +# +# service_name: ID +# an opaque identifier which must be unique in squid.conf +# +# vectoring_point: reqmod_precache|reqmod_postcache|respmod_precache|respmod_postcache +# This specifies at which point of transaction processing the +# ICAP service should be activated. *_postcache vectoring points +# are not yet supported. +# +# service_url: icap://servername:port/servicepath +# ICAP server and service location. +# +# ICAP does not allow a single service to handle both REQMOD and RESPMOD +# transactions. Squid does not enforce that requirement. You can specify +# services with the same service_url and different vectoring_points. You +# can even specify multiple identical services as long as their +# service_names differ. +# +# +# Service options are separated by white space. ICAP services support +# the following name=value options: +# +# bypass=on|off|1|0 +# If set to 'on' or '1', the ICAP service is treated as +# optional. If the service cannot be reached or malfunctions, +# Squid will try to ignore any errors and process the message as +# if the service was not enabled. No all ICAP errors can be +# bypassed. If set to 0, the ICAP service is treated as +# essential and all ICAP errors will result in an error page +# returned to the HTTP client. +# +# Bypass is off by default: services are treated as essential. +# +# routing=on|off|1|0 +# If set to 'on' or '1', the ICAP service is allowed to +# dynamically change the current message adaptation plan by +# returning a chain of services to be used next. The services +# are specified using the X-Next-Services ICAP response header +# value, formatted as a comma-separated list of service names. +# Each named service should be configured in squid.conf and +# should have the same method and vectoring point as the current +# ICAP transaction. Services violating these rules are ignored. +# An empty X-Next-Services value results in an empty plan which +# ends the current adaptation. +# +# Routing is not allowed by default: the ICAP X-Next-Services +# response header is ignored. +# +# Older icap_service format without optional named parameters is +# deprecated but supported for backward compatibility. +# +#Example: +#icap_service svcBlocker reqmod_precache bypass=0 icap://icap1.mydomain.net:1344/reqmod +#icap_service svcLogger reqmod_precache routing=on icap://icap2.mydomain.net:1344/respmod +#Default: +# none + +# TAG: icap_class +# This deprecated option was documented to define an ICAP service +# chain, even though it actually defined a set of similar, redundant +# services, and the chains were not supported. +# +# To define a set of redundant services, please use the +# adaptation_service_set directive. For service chains, use +# adaptation_service_chain. +#Default: +# none + +# TAG: icap_access +# This option is deprecated. Please use adaptation_access, which +# has the same ICAP functionality, but comes with better +# documentation, and eCAP support. +#Default: +# none + +# eCAP OPTIONS +# ----------------------------------------------------------------------------- + +# TAG: ecap_enable on|off +# Note: This option is only available if Squid is rebuilt with the +# --enable-ecap option +# +# Controls whether eCAP support is enabled. +#Default: +# ecap_enable off + +# TAG: ecap_service +# Note: This option is only available if Squid is rebuilt with the +# --enable-ecap option +# +# Defines a single eCAP service +# +# ecap_service servicename vectoring_point bypass service_url +# +# vectoring_point = reqmod_precache|reqmod_postcache|respmod_precache|respmod_postcache +# This specifies at which point of transaction processing the +# eCAP service should be activated. *_postcache vectoring points +# are not yet supported. +# bypass = 1|0 +# If set to 1, the eCAP service is treated as optional. If the +# service cannot be reached or malfunctions, Squid will try to +# ignore any errors and process the message as if the service +# was not enabled. No all eCAP errors can be bypassed. +# If set to 0, the eCAP service is treated as essential and all +# eCAP errors will result in an error page returned to the +# HTTP client. +# service_url = ecap://vendor/service_name?custom&cgi=style¶meters=optional +# +#Example: +#ecap_service service_1 reqmod_precache 0 ecap://filters-R-us/leakDetector?on_error=block +#ecap_service service_2 respmod_precache 1 icap://filters-R-us/virusFilter?config=/etc/vf.cfg +#Default: +# none + +# TAG: loadable_modules +# Instructs Squid to load the specified dynamic module(s) or activate +# preloaded module(s). +#Example: +#loadable_modules /usr/lib/MinimalAdapter.so +#Default: +# none + +# MESSAGE ADAPTATION OPTIONS +# ----------------------------------------------------------------------------- + +# TAG: adaptation_service_set +# +# Configures an ordered set of similar, redundant services. This is +# useful when hot standby or backup adaptation servers are available. +# +# adaptation_service_set set_name service_name1 service_name2 ... +# +# The named services are used in the set declaration order. The first +# applicable adaptation service from the set is used first. The next +# applicable service is tried if and only if the transaction with the +# previous service fails and the message waiting to be adapted is still +# intact. +# +# When adaptation starts, broken services are ignored as if they were +# not a part of the set. A broken service is a down optional service. +# +# The services in a set must be attached to the same vectoring point +# (e.g., pre-cache) and use the same adaptation method (e.g., REQMOD). +# +# If all services in a set are optional then adaptation failures are +# bypassable. If all services in the set are essential, then a +# transaction failure with one service may still be retried using +# another service from the set, but when all services fail, the master +# transaction fails as well. +# +# A set may contain a mix of optional and essential services, but that +# is likely to lead to surprising results because broken services become +# ignored (see above), making previously bypassable failures fatal. +# Technically, it is the bypassability of the last failed service that +# matters. +# +# See also: adaptation_access adaptation_service_chain +# +#Example: +#adaptation_service_set svcBlocker urlFilterPrimary urlFilterBackup +#adaptation service_set svcLogger loggerLocal loggerRemote +#Default: +# none + +# TAG: adaptation_service_chain +# +# Configures a list of complementary services that will be applied +# one-by-one, forming an adaptation chain or pipeline. This is useful +# when Squid must perform different adaptations on the same message. +# +# adaptation_service_chain chain_name service_name1 svc_name2 ... +# +# The named services are used in the chain declaration order. The first +# applicable adaptation service from the chain is used first. The next +# applicable service is applied to the successful adaptation results of +# the previous service in the chain. +# +# When adaptation starts, broken services are ignored as if they were +# not a part of the chain. A broken service is a down optional service. +# +# Request satisfaction terminates the adaptation chain because Squid +# does not currently allow declaration of RESPMOD services at the +# "reqmod_precache" vectoring point (see icap_service or ecap_service). +# +# The services in a chain must be attached to the same vectoring point +# (e.g., pre-cache) and use the same adaptation method (e.g., REQMOD). +# +# A chain may contain a mix of optional and essential services. If an +# essential adaptation fails (or the failure cannot be bypassed for +# other reasons), the master transaction fails. Otherwise, the failure +# is bypassed as if the failed adaptation service was not in the chain. +# +# See also: adaptation_access adaptation_service_set +# +#Example: +#adaptation_service_chain svcRequest requestLogger urlFilter leakDetector +#Default: +# none + +# TAG: adaptation_access +# Sends an HTTP transaction to an ICAP or eCAP adaptation service. +# +# adaptation_access service_name allow|deny [!]aclname... +# adaptation_access set_name allow|deny [!]aclname... +# +# At each supported vectoring point, the adaptation_access +# statements are processed in the order they appear in this +# configuration file. Statements pointing to the following services +# are ignored (i.e., skipped without checking their ACL): +# +# - services serving different vectoring points +# - "broken-but-bypassable" services +# - "up" services configured to ignore such transactions +# (e.g., based on the ICAP Transfer-Ignore header). +# +# When a set_name is used, all services in the set are checked +# using the same rules, to find the first applicable one. See +# adaptation_service_set for details. +# +# If an access list is checked and there is a match, the +# processing stops: For an "allow" rule, the corresponding +# adaptation service is used for the transaction. For a "deny" +# rule, no adaptation service is activated. +# +# It is currently not possible to apply more than one adaptation +# service at the same vectoring point to the same HTTP transaction. +# +# See also: icap_service and ecap_service +# +#Example: +#adaptation_access service_1 allow all +#Default: +# none + +# TAG: adaptation_service_iteration_limit +# Limits the number of iterations allowed when applying adaptation +# services to a message. If your longest adaptation set or chain +# may have more than 16 services, increase the limit beyond its +# default value of 16. If detecting infinite iteration loops sooner +# is critical, make the iteration limit match the actual number +# of services in your longest adaptation set or chain. +# +# Infinite adaptation loops are most likely with routing services. +# +# See also: icap_service routing=1 +#Default: +# adaptation_service_iteration_limit 16 + +# TAG: adaptation_masterx_shared_names +# For each master transaction (i.e., the HTTP request and response +# sequence, including all related ICAP and eCAP exchanges), Squid +# maintains a table of metadata. The table entries are (name, value) +# pairs shared among eCAP and ICAP exchanges. The table is destroyed +# with the master transaction. +# +# This option specifies the table entry names that Squid must accept +# from and forward to the adaptation transactions. +# +# An ICAP REQMOD or RESPMOD transaction may set an entry in the +# shared table by returning an ICAP header field with a name +# specified in adaptation_masterx_shared_names. Squid will store +# and forward that ICAP header field to subsequent ICAP +# transactions within the same master transaction scope. +# +# Only one shared entry name is supported at this time. +# +#Example: +## share authentication information among ICAP services +#adaptation_masterx_shared_names X-Subscriber-ID +#Default: +# none + +# TAG: icap_retry +# This ACL determines which retriable ICAP transactions are +# retried. Transactions that received a complete ICAP response +# and did not have to consume or produce HTTP bodies to receive +# that response are usually retriable. +# +# icap_retry allow|deny [!]aclname ... +# +# Squid automatically retries some ICAP I/O timeouts and errors +# due to persistent connection race conditions. +# +# See also: icap_retry_limit +#Default: +# icap_retry deny all + +# TAG: icap_retry_limit +# Limits the number of retries allowed. When set to zero (default), +# no retries are allowed. +# +# Communication errors due to persistent connection race +# conditions are unavoidable, automatically retried, and do not +# count against this limit. +# +# See also: icap_retry +#Default: +# icap_retry_limit 0 + +# DNS OPTIONS +# ----------------------------------------------------------------------------- + +# TAG: check_hostnames +# For security and stability reasons Squid can check +# hostnames for Internet standard RFC compliance. If you want +# Squid to perform these checks turn this directive on. +#Default: +# check_hostnames off +check_hostnames %%check_hostname + +# TAG: allow_underscore +# Underscore characters is not strictly allowed in Internet hostnames +# but nevertheless used by many sites. Set this to off if you want +# Squid to be strict about the standard. +# This check is performed only when check_hostnames is set to on. +#Default: +# allow_underscore on +allow_underscore %%allow_underscore + +# TAG: cache_dns_program +# Note: This option is only available if Squid is rebuilt with the +# --disable-internal-dns option +# +# Specify the location of the executable for dnslookup process. +#Default: +# cache_dns_program /usr/lib/squid/dnsserver + +# TAG: dns_children +# Note: This option is only available if Squid is rebuilt with the +# --disable-internal-dns option +# +# The number of processes spawn to service DNS name lookups. +# For heavily loaded caches on large servers, you should +# probably increase this value to at least 10. The maximum +# is 32. The default is 5. +# +# You must have at least one dnsserver process. +#Default: +# dns_children 5 + +# TAG: dns_retransmit_interval +# Initial retransmit interval for DNS queries. The interval is +# doubled each time all configured DNS servers have been tried. +# +#Default: +# dns_retransmit_interval 5 seconds + +# TAG: dns_timeout +# DNS Query timeout. If no response is received to a DNS query +# within this time all DNS servers for the queried domain +# are assumed to be unavailable. +#Default: +# dns_timeout 2 minutes + +# TAG: dns_defnames on|off +# Normally the RES_DEFNAMES resolver option is disabled +# (see res_init(3)). This prevents caches in a hierarchy +# from interpreting single-component hostnames locally. To allow +# Squid to handle single-component names, enable this option. +#Default: +# dns_defnames off +dns_defnames %%dns_defnames + +# TAG: dns_nameservers +# Use this if you want to specify a list of DNS name servers +# (IP addresses) to use instead of those given in your +# /etc/resolv.conf file. +# On Windows platforms, if no value is specified here or in +# the /etc/resolv.conf file, the list of DNS name servers are +# taken from the Windows registry, both static and dynamic DHCP +# configurations are supported. +# +# Example: dns_nameservers 10.0.0.1 192.172.0.4 +#Default: +# none +%if not %%is_empty(%%dns_nameservers) +dns_nameservers %%custom_join(%%dns_nameservers) +%end if +# TAG: hosts_file +# Location of the host-local IP name-address associations +# database. Most Operating Systems have such a file on different +# default locations: +# - Un*X & Linux: /etc/hosts +# - Windows NT/2000: %SystemRoot%\system32\drivers\etc\hosts +# (%SystemRoot% value install default is c:\winnt) +# - Windows XP/2003: %SystemRoot%\system32\drivers\etc\hosts +# (%SystemRoot% value install default is c:\windows) +# - Windows 9x/Me: %windir%\hosts +# (%windir% value is usually c:\windows) +# - Cygwin: /etc/hosts +# +# The file contains newline-separated definitions, in the +# form ip_address_in_dotted_form name [name ...] names are +# whitespace-separated. Lines beginning with an hash (#) +# character are comments. +# +# The file is checked at startup and upon configuration. +# If set to 'none', it won't be checked. +# If append_domain is used, that domain will be added to +# domain-local (i.e. not containing any dot character) host +# definitions. +#Default: +# hosts_file /etc/hosts +hosts_file %%hosts_file + +# TAG: append_domain +# Appends local domain name to hostnames without any dots in +# them. append_domain must begin with a period. +# +# Be warned there are now Internet names with no dots in +# them using only top-domain names, so setting this may +# cause some Internet sites to become unavailable. +# +#Example: +# append_domain .yourdomain.com +#Default: +# none + +# TAG: ignore_unknown_nameservers +# By default Squid checks that DNS responses are received +# from the same IP addresses they are sent to. If they +# don't match, Squid ignores the response and writes a warning +# message to cache.log. You can allow responses from unknown +# nameservers by setting this option to 'off'. +#Default: +# ignore_unknown_nameservers on + +# TAG: dns_v4_first +# With the IPv6 Internet being as fast or faster than IPv4 Internet +# for most networks Squid prefers to contact websites over IPv6. +# +# This option reverses the order of preference to make Squid contact +# dual-stack websites over IPv4 first. Squid will still perform both +# IPv6 and IPv4 DNS lookups before connecting. +# +# WARNING: +# This option will restrict the situations under which IPv6 +# connectivity is used (and tested), potentially hiding network +# problems which would otherwise be detected and warned about. +#Default: +# dns_v4_first off +dns_v4_first on + +# TAG: dns_v4_fallback +# Standard practice with DNS is to lookup either A or AAAA records +# and use the results if it succeeds. Only looking up the other if +# the first attempt fails or otherwise produces no results. +# +# That policy however will cause squid to produce error pages for some +# servers that advertise AAAA but are unreachable over IPv6. +# +# If this is ON squid will always lookup both AAAA and A, using both. +# If this is OFF squid will lookup AAAA and only try A if none found. +# +# WARNING: There are some possibly unwanted side-effects with this on: +# *) Doubles the load placed by squid on the DNS network. +# *) May negatively impact connection delay times. +#Default: +# dns_v4_fallback on + +# TAG: ipcache_size (number of entries) +# TAG: ipcache_low (percent) +# TAG: ipcache_high (percent) +# The size, low-, and high-water marks for the IP cache. +#Default: +# ipcache_size 1024 +# ipcache_low 90 +# ipcache_high 95 +ipcache_size %%ipcache_size +ipcache_low %%ipcache_low +ipcache_high %%ipcache_high + +# TAG: fqdncache_size (number of entries) +# Maximum number of FQDN cache entries. +#Default: +# fqdncache_size 1024 +fqdncache_size %%fqdncache_size + +# MISCELLANEOUS +# ----------------------------------------------------------------------------- + +# TAG: memory_pools on|off +# If set, Squid will keep pools of allocated (but unused) memory +# available for future use. If memory is a premium on your +# system and you believe your malloc library outperforms Squid +# routines, disable this. +#Default: +# memory_pools on + +# TAG: memory_pools_limit (bytes) +# Used only with memory_pools on: +# memory_pools_limit 50 MB +# +# If set to a non-zero value, Squid will keep at most the specified +# limit of allocated (but unused) memory in memory pools. All free() +# requests that exceed this limit will be handled by your malloc +# library. Squid does not pre-allocate any memory, just safe-keeps +# objects that otherwise would be free()d. Thus, it is safe to set +# memory_pools_limit to a reasonably high value even if your +# configuration will use less memory. +# +# If set to none, Squid will keep all memory it can. That is, there +# will be no limit on the total amount of memory used for safe-keeping. +# +# To disable memory allocation optimization, do not set +# memory_pools_limit to 0. Set memory_pools to "off" instead. +# +# An overhead for maintaining memory pools is not taken into account +# when the limit is checked. This overhead is close to four bytes per +# object kept. However, pools may actually _save_ memory because of +# reduced memory thrashing in your malloc library. +#Default: +# memory_pools_limit 5 MB + +# TAG: forwarded_for on|off|transparent|truncate|delete +# If set to "on", Squid will append your client's IP address +# in the HTTP requests it forwards. By default it looks like: +# +# X-Forwarded-For: 192.1.2.3 +# +# If set to "off", it will appear as +# +# X-Forwarded-For: unknown +# +# If set to "transparent", Squid will not alter the +# X-Forwarded-For header in any way. +# +# If set to "delete", Squid will delete the entire +# X-Forwarded-For header. +# +# If set to "truncate", Squid will remove all existing +# X-Forwarded-For entries, and place itself as the sole entry. +#Default: +# forwarded_for on +%if %%activer_filtrage_proxy == 'oui' +# X-Forwarded-For is already set by *guardian +forwarded_for transparent +%end if + +# TAG: cachemgr_passwd +# Specify passwords for cachemgr operations. +# +# Usage: cachemgr_passwd password action action ... +# +# Some valid actions are (see cache manager menu for a full list): +# 5min +# 60min +# asndb +# authenticator +# cbdata +# client_list +# comm_incoming +# config * +# counters +# delay +# digest_stats +# dns +# events +# filedescriptors +# fqdncache +# histograms +# http_headers +# info +# io +# ipcache +# mem +# menu +# netdb +# non_peers +# objects +# offline_toggle * +# pconn +# peer_select +# reconfigure * +# redirector +# refresh +# server_list +# shutdown * +# store_digest +# storedir +# utilization +# via_headers +# vm_objects +# +# * Indicates actions which will not be performed without a +# valid password, others can be performed if not listed here. +# +# To disable an action, set the password to "disable". +# To allow performing an action without a password, set the +# password to "none". +# +# Use the keyword "all" to set the same password for all actions. +# +#Example: +# cachemgr_passwd secret shutdown +# cachemgr_passwd lesssssssecret info stats/objects +# cachemgr_passwd disable all +#Default: +# none + +# TAG: client_db on|off +# If you want to disable collecting per-client statistics, +# turn off client_db here. +#Default: +# client_db on + +# TAG: refresh_all_ims on|off +# When you enable this option, squid will always check +# the origin server for an update when a client sends an +# If-Modified-Since request. Many browsers use IMS +# requests when the user requests a reload, and this +# ensures those clients receive the latest version. +# +# By default (off), squid may return a Not Modified response +# based on the age of the cached version. +#Default: +# refresh_all_ims off + +# TAG: reload_into_ims on|off +# When you enable this option, client no-cache or ``reload'' +# requests will be changed to If-Modified-Since requests. +# Doing this VIOLATES the HTTP standard. Enabling this +# feature could make you liable for problems which it +# causes. +# +# see also refresh_pattern for a more selective approach. +#Default: +# reload_into_ims off + +# TAG: maximum_single_addr_tries +# This sets the maximum number of connection attempts for a +# host that only has one address (for multiple-address hosts, +# each address is tried once). +# +# The default value is one attempt, the (not recommended) +# maximum is 255 tries. A warning message will be generated +# if it is set to a value greater than ten. +# +# Note: This is in addition to the request re-forwarding which +# takes place if Squid fails to get a satisfying response. +#Default: +# maximum_single_addr_tries 1 + +# TAG: retry_on_error +# If set to on Squid will automatically retry requests when +# receiving an error response. This is mainly useful if you +# are in a complex cache hierarchy to work around access +# control errors. +#Default: +# retry_on_error off + +# TAG: as_whois_server +# WHOIS server to query for AS numbers. NOTE: AS numbers are +# queried only when Squid starts up, not for every request. +#Default: +# as_whois_server whois.ra.net +# as_whois_server whois.ra.net + +# TAG: offline_mode +# Enable this option and Squid will never try to validate cached +# objects. +#Default: +# offline_mode off + +# TAG: uri_whitespace +# What to do with requests that have whitespace characters in the +# URI. Options: +# +# strip: The whitespace characters are stripped out of the URL. +# This is the behavior recommended by RFC2396. +# deny: The request is denied. The user receives an "Invalid +# Request" message. +# allow: The request is allowed and the URI is not changed. The +# whitespace characters remain in the URI. Note the +# whitespace is passed to redirector processes if they +# are in use. +# encode: The request is allowed and the whitespace characters are +# encoded according to RFC1738. This could be considered +# a violation of the HTTP/1.1 +# RFC because proxies are not allowed to rewrite URI's. +# chop: The request is allowed and the URI is chopped at the +# first whitespace. This might also be considered a +# violation. +#Default: +# uri_whitespace strip + +# TAG: chroot +# Specifies a directory where Squid should do a chroot() while +# initializing. This also causes Squid to fully drop root +# privileges after initializing. This means, for example, if you +# use a HTTP port less than 1024 and try to reconfigure, you may +# get an error saying that Squid can not open the port. +#Default: +# none + +# TAG: balance_on_multiple_ip +# Modern IP resolvers in squid sort lookup results by preferred access. +# By default squid will use these IP in order and only rotates to +# the next listed when the most preffered fails. +# +# Some load balancing servers based on round robin DNS have been +# found not to preserve user session state across requests +# to different IP addresses. +# +# Enabling this directive Squid rotates IP's per request. +#Default: +# balance_on_multiple_ip off + +# TAG: pipeline_prefetch +# To boost the performance of pipelined requests to closer +# match that of a non-proxied environment Squid can try to fetch +# up to two requests in parallel from a pipeline. +# +# Defaults to off for bandwidth management and access logging +# reasons. +#Default: +# pipeline_prefetch off + +# TAG: high_response_time_warning (msec) +# If the one-minute median response time exceeds this value, +# Squid prints a WARNING with debug level 0 to get the +# administrators attention. The value is in milliseconds. +#Default: +# high_response_time_warning 0 + +# TAG: high_page_fault_warning +# If the one-minute average page fault rate exceeds this +# value, Squid prints a WARNING with debug level 0 to get +# the administrators attention. The value is in page faults +# per second. +#Default: +# high_page_fault_warning 0 + +# TAG: high_memory_warning +# If the memory usage (as determined by mallinfo) exceeds +# this amount, Squid prints a WARNING with debug level 0 to get +# the administrators attention. +#Default: +# high_memory_warning 0 KB + +# TAG: sleep_after_fork (microseconds) +# When this is set to a non-zero value, the main Squid process +# sleeps the specified number of microseconds after a fork() +# system call. This sleep may help the situation where your +# system reports fork() failures due to lack of (virtual) +# memory. Note, however, if you have a lot of child +# processes, these sleep delays will add up and your +# Squid will not service requests for some amount of time +# until all the child processes have been started. +# On Windows value less then 1000 (1 milliseconds) are +# rounded to 1000. +#Default: +# sleep_after_fork 0 + +# TAG: windows_ipaddrchangemonitor on|off +# On Windows Squid by default will monitor IP address changes and will +# reconfigure itself after any detected event. This is very useful for +# proxies connected to internet with dial-up interfaces. +# In some cases (a Proxy server acting as VPN gateway is one) it could be +# desiderable to disable this behaviour setting this to 'off'. +# Note: after changing this, Squid service must be restarted. +#Default: +# windows_ipaddrchangemonitor on + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/domaines_noauth b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/domaines_noauth new file mode 100644 index 0000000000000000000000000000000000000000..049f495dedf93722704ed59b120ee3bcfe145b02 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/domaines_noauth @@ -0,0 +1,9 @@ +%set %%domains=%%list(%%set(%%proxy_noauth_auto) | %%set(%%proxy_noauth)) +%%domains.sort()%slurp +%for %%domain in %%domains + %if not %%domain.startswith('.') and ".{}".format(%%domain) in %%domains +#%%domain is already included in .%%domain + %else +%%domain + %end if +%end for diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/domaines_nocache b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/domaines_nocache new file mode 100644 index 0000000000000000000000000000000000000000..423b4d442471c70e53f89047041f62be97f8dd87 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/domaines_nocache @@ -0,0 +1,20 @@ +%set %%domains=%%set() +%for %%serveur_maj_iter in %%serveur_maj +%%domains.add(%%serveur_maj_iter)%slurp +%end for +%for %%serveur_maj_iter in %%ubuntu_update_mirrors +%%domains.add(%%serveur_maj_iter)%slurp +%end for +%%domains.add('eole.ac-dijon.fr')%slurp +%%domains.add('eoleng.ac-dijon.fr')%slurp +%%domains.add('bp-eole.ac-dijon.fr')%slurp +%%domains.add('test-eole.ac-dijon.fr')%slurp +%%domains.add('test-eoleng.ac-dijon.fr')%slurp +%%domains.add('ftp.crihan.fr')%slurp +%%domains.add('archive.canonical.com')%slurp +%%domains.add('archive.ubuntu.com')%slurp +%set %%domains=%%list(domains) +%%domains.sort()%slurp +%for %%domain in %%domains +.%%domain +%end for diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-bannediplist b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-bannediplist new file mode 100644 index 0000000000000000000000000000000000000000..cbad8381a22985f86d1d51eb95b06c0c28c20541 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-bannediplist @@ -0,0 +1,12 @@ +#IP addresses of client machines to +#disallow web access to +# +#Only put IP addresses here, +#not host names +# +#This is not the IP of web servers +#you want to filter. + +#192.168.0.1 +#192.168.0.2 +#192.168.42.2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-clamdscan-filtre1.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-clamdscan-filtre1.conf new file mode 100644 index 0000000000000000000000000000000000000000..cc1a4a23c8c69e9e77a0bb579ae622e9527bdbcd --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-clamdscan-filtre1.conf @@ -0,0 +1,2 @@ +%set global %%numzone = 0 +%include "/var/lib/creole/guardian-clamdscan.conf" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-clamdscan-filtre2.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-clamdscan-filtre2.conf new file mode 100644 index 0000000000000000000000000000000000000000..8ab7b522aef26c51d558cb4c52d6727dc1c59996 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-clamdscan-filtre2.conf @@ -0,0 +1,2 @@ +%set global %%numzone = 1 +%include "/var/lib/creole/guardian-clamdscan.conf" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-clamdscan-filtre3.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-clamdscan-filtre3.conf new file mode 100644 index 0000000000000000000000000000000000000000..2707572ad3a8dfaeca30cd78e22b29ec2bff8130 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-clamdscan-filtre3.conf @@ -0,0 +1,2 @@ +%set global %%numzone = 2 +%include "/var/lib/creole/guardian-clamdscan.conf" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-clamdscan.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-clamdscan.conf new file mode 100644 index 0000000000000000000000000000000000000000..028cef0bd85d93d5e4602c6c4f6180729248c188 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-clamdscan.conf @@ -0,0 +1,18 @@ +plugname = 'clamdscan' + +# edit this to match the location of your ClamD UNIX domain socket +#clamdudsfile = '/var/run/clamav/clamd.sock' +clamdudsfile = '/var/run/clamav/clamd.ctl' + +# If this string is set, the text it contains shall be removed from the +# beginning of filenames when passing them to ClamD. +# Use it to - for example - support a ClamD running inside a chroot jail: +# if DG's filecachedir is set to "/var/clamdchroot/downloads/" and pathprefix +# is set to "/var/clamdchroot", then file names given to ClamD will be of the +# form "/downloads/tf*" instead of "/var/clamdchroot/downloads/tf*". +#pathprefix = '/var/clamdchroot' + +exceptionvirusmimetypelist = '/etc/guardian/guardian%%numzone/lists/contentscanners/exceptionvirusmimetypelist' +exceptionvirusextensionlist = '/etc/guardian/guardian%%numzone/lists/contentscanners/exceptionvirusextensionlist' +exceptionvirussitelist = '/etc/guardian/guardian%%numzone/lists/contentscanners/exceptionvirussitelist' +exceptionvirusurllist = '/etc/guardian/guardian%%numzone/lists/contentscanners/exceptionvirusurllist' diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-exceptioniplist b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-exceptioniplist new file mode 100644 index 0000000000000000000000000000000000000000..69f793542b1eb94744495dcc3a1ea901105bf074 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-exceptioniplist @@ -0,0 +1,20 @@ +#IP addresses of computers to not filter +#and just pass requests straight through to +# +#These would be servers which +#need unfiltered access for +#updates. Also administrator +#workstations which need to +#download programs and check +#out blocked sites should be +#put here. +# +#Only put IP addresses here, +#not host names +# +#This is not the IP of web servers +#you don't want to filter. + +#192.168.0.1 +#192.168.0.2 +#192.168.42.2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-fancy-filtre1.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-fancy-filtre1.conf new file mode 100644 index 0000000000000000000000000000000000000000..b70f6c8ccfe08b274de53cbc09f10483173a91a1 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-fancy-filtre1.conf @@ -0,0 +1,2 @@ +%set global %%numzone = 0 +%include "/var/lib/creole/guardian-fancy.conf" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-fancy-filtre2.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-fancy-filtre2.conf new file mode 100644 index 0000000000000000000000000000000000000000..49a6d4e8ea4ddf3bc37faf9a2c0f3a32b917a5e0 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-fancy-filtre2.conf @@ -0,0 +1,2 @@ +%set global %%numzone = 1 +%include "/var/lib/creole/guardian-fancy.conf" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-fancy-filtre3.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-fancy-filtre3.conf new file mode 100644 index 0000000000000000000000000000000000000000..93b8fa4788d92ac948f10ad17b430119d3f4d372 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-fancy-filtre3.conf @@ -0,0 +1,2 @@ +%set global %%numzone = 2 +%include "/var/lib/creole/guardian-fancy.conf" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-fancy.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-fancy.conf new file mode 100644 index 0000000000000000000000000000000000000000..557be120b01e4938e72da46e2f8b5a5d5f6800e4 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-fancy.conf @@ -0,0 +1,42 @@ +# The 'fancy' download manager. +# This outputs a Javascript progress bar to the browser when a file is taking +# a long time to download, and hence is unsuitable for browsers without +# javascript support; also you may wish to enable it only for types/extensions +# that are usually downloaded individually, rather than embedded in a web page, +# such as executables and archives. + +# Which plugin should be loaded? +plugname = 'fancy' + +# Regular expression for matching user agents +# When not defined, matches all agents. +# +# 'mozilla' also matches firefox, IE, etc. +useragentregexp = 'mozilla' + +# Lists of mime types and extensions to manage +# When not defined, matches everything. +# These can be enabled separately; when both enabled, +# a request may match either list. +#managedmimetypelist = '/etc/guardian/lists/downloadmanagers/managedmimetypelist' +managedextensionlist = '/etc/guardian/guardian%%numzone/listsf1/downloadmanagers/managedextensionlist' + +# HTML/JavaScript Template +# The contents of this file determine what is presented to the user during +# and after downloading/scanning. It is essentially an HTML file, but must +# define certain JavaScript functions - called at various stages during +# the process - allowing the page to be modified to reflect current progress. +# This option generates a path of the form <languagedir>/<language>/<template> +template = 'fancydmtemplate.html' + +# Maximum download size +# When a file with unknown content length gets handled by the fancy DM, +# something must be done in the case that the file is found to be too large +# to scan (i.e. larger than maxcontentfilecachescansize). +# As of 2.9.7.0, a warning will be issued to the user that the fancy DM may +# not be able to cache the entire file, and the file will continue to be +# downloaded to disk (but not scanned) until it reaches this size, at which +# point the user will simply have to re-download the file (the URL won't be +# scanned again). +# The size is in kibibytes (i.e. 10240 = 10Mb) +maxdownloadsize = 80000 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-filtergroupslist b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-filtergroupslist new file mode 100644 index 0000000000000000000000000000000000000000..ae030a48bf45671cc6b76599cd024a786c7860b0 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-filtergroupslist @@ -0,0 +1,11 @@ +# Filter Groups List file for DansGuardian +# +# Format is <user>=filter<1-99> where 1-99 are the groups +# +# Eg: +# daniel=filter2 +# +# This file is only of use if you have more than 1 filter group +# + +.Include</var/lib/blacklists/dansguardian%%numzone/common/filtergroupslist> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-filtergroupslist-filtre1 b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-filtergroupslist-filtre1 new file mode 100644 index 0000000000000000000000000000000000000000..a8a6b520136fb68824dadad346095fb461ad38df --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-filtergroupslist-filtre1 @@ -0,0 +1,2 @@ +%set global %%numzone = 0 +%include "/var/lib/creole/guardian-filtergroupslist" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-filtergroupslist-filtre2 b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-filtergroupslist-filtre2 new file mode 100644 index 0000000000000000000000000000000000000000..286229282337f229b21eb7cec14cc4bedaf262ca --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-filtergroupslist-filtre2 @@ -0,0 +1,2 @@ +%set global %%numzone = 1 +%include "/var/lib/creole/guardian-filtergroupslist" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-filtergroupslist-filtre3 b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-filtergroupslist-filtre3 new file mode 100644 index 0000000000000000000000000000000000000000..ca63fad4a25589cb120571712427456c6c8ad685 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-filtergroupslist-filtre3 @@ -0,0 +1,2 @@ +%set global %%numzone = 2 +%include "/var/lib/creole/guardian-filtergroupslist" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-filtre1.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-filtre1.conf new file mode 100644 index 0000000000000000000000000000000000000000..6a68e1951d0ee418a0ba1f461e464e01be525bf6 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-filtre1.conf @@ -0,0 +1,2 @@ +%set global %%dansguardian_instance = '1' +%include "/var/lib/creole/guardian.conf" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-filtre2.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-filtre2.conf new file mode 100644 index 0000000000000000000000000000000000000000..f464cf2f41d6d66a04a2995fd97a353f0ec7b06a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-filtre2.conf @@ -0,0 +1,2 @@ +%set global %%dansguardian_instance = '2' +%include "/var/lib/creole/guardian.conf" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-filtre3.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-filtre3.conf new file mode 100644 index 0000000000000000000000000000000000000000..1bce31e7884789fa09eceee331375036f85da629 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-filtre3.conf @@ -0,0 +1,2 @@ +%set global %%dansguardian_instance = '3' +%include "/var/lib/creole/guardian.conf" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-ip-filtre1.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-ip-filtre1.conf new file mode 100644 index 0000000000000000000000000000000000000000..4045f8b6e92db7d07be147b83e989be2b718d035 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-ip-filtre1.conf @@ -0,0 +1,2 @@ +%set global %%numzone = "0" +%include "/var/lib/creole/guardian-ip.conf" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-ip-filtre2.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-ip-filtre2.conf new file mode 100644 index 0000000000000000000000000000000000000000..5fe428c78adeec0e51fa01be40638142349d3d64 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-ip-filtre2.conf @@ -0,0 +1,2 @@ +%set global %%numzone = "1" +%include "/var/lib/creole/guardian-ip.conf" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-ip-filtre3.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-ip-filtre3.conf new file mode 100644 index 0000000000000000000000000000000000000000..8b1c2703557671c4ab220cddd750208aebd98fc1 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-ip-filtre3.conf @@ -0,0 +1,2 @@ +%set global %%numzone = "2" +%include "/var/lib/creole/guardian-ip.conf" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-ip.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-ip.conf new file mode 100644 index 0000000000000000000000000000000000000000..8587deea85f2cab503786bd542682977df11b335 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-ip.conf @@ -0,0 +1,11 @@ +# IP-based auth plugin +# +# Maps client IPs to filter groups. +# If "usexforwardedfor" is enabled, grabs the IP from the X-Forwarded-For +# header, if available. + +plugname = 'ip' + +# ipgroups file +# List file assigning IP addresses, subnets and ranges to filter groups +ipgroups = '/var/lib/blacklists/dansguardian%%numzone/common/ipgroupslist' diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-template-liste_blanche.html b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-template-liste_blanche.html new file mode 100644 index 0000000000000000000000000000000000000000..b74e4bdf8da7da99bf9f01db3214febff54fa0e5 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-template-liste_blanche.html @@ -0,0 +1,57 @@ +<HTML> +<HEAD> + <meta charset="UTF-8"> + <TITLE>EOLE Guardian - Mode liste blanche</TITLE> +</HEAD> +<style type="text/css"> + h1, h2, h3 { + font-family: "fantasy"; + } + table{ + border: 1px solid black; + -webkit-border-top-right-radius: 20px; + -webkit-border-bottom-left-radius: 20px; + -moz-border-radius-topright: 20px; + -moz-border-radius-bottomleft: 20px; + border-top-right-radius: 20px; + border-bottom-left-radius: 20px; + font-family: "fantasy"; + border-color: #98bf21; + } +</style> + +<BODY BGCOLOR="FFFFF2"> +<CENTER> + <H2>ACCÈS INTERDIT</H2> + <H3 style="background-color:#fff;"> + <br> + MODE LISTE BLANCHE + <br> + <br> + </H3> + <br> + <table width="650" border=1> + <tr><td ALIGN=CENTER> + <br> + Utilisateur : <strong>-USER-</strong><br> + IP Machine : <strong>-IP-</strong><br> + <br> + L'adresse : + <br> + <strong>-URL-</strong> + <br> + n'a pas été ajouté dans la liste des sites autorisés + <br> + <br> + </td></tr> + </table> + <P><br> + <table width="650" border=1 bgcolor="#C3C3C3"> + <tr> + <td ALIGN=CENTER><H4>Toutes vos demandes sont enregistrées. Des filtres sont appliqués.</H4> + </tr> + </table> + <P><font size=-3>Powered by <a href="http://e2guardian.org" target="_blank"><font color="#0000ee">E2guardian</font></A></font> +</center> +</BODY> +</HTML> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-template-moderateur.html b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-template-moderateur.html new file mode 100644 index 0000000000000000000000000000000000000000..117a5dc8b0402fda17ca768376eb835def60ef44 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-template-moderateur.html @@ -0,0 +1,62 @@ +<HTML> +<HEAD> + <meta charset="UTF-8"> + <TITLE>EOLE Guardian - Modérateur</TITLE> +</HEAD> +<style type="text/css"> + h1, h2, h3 { + font-family: "fantasy"; + } + table{ + border: 1px solid black; + -webkit-border-top-right-radius: 20px; + -webkit-border-bottom-left-radius: 20px; + -moz-border-radius-topright: 20px; + -moz-border-radius-bottomleft: 20px; + border-top-right-radius: 20px; + border-bottom-left-radius: 20px; + font-family: "fantasy"; + border-color: #98bf21; + } +</style> +<BODY BGCOLOR="FFFFF2"> +<CENTER> + <H2>ACCES LIMITÉ</H2> + <H3 style="background-color:#66FF66;"> + <br> + MODÉRATEUR + <br> + <br> + </H3> + <br> + <table width="650"> + <tr><td ALIGN=CENTER> + <br> + Utilisateur : <strong>-USER-</strong><br> + IP Machine : <strong>-IP-</strong><br> + <br> + Adresse refusée : + <br> + <strong>-URL-</strong> + <br> + Raison : + <br> + <strong><font color="#ff0000">-REASONGIVEN-</font></strong> + <br> + <br> + Consulter le site + <br> + <A HREF='-BYPASS-'>-BYPASS-</A> + <br> + </td></tr> + </table> + <P><br> + <table width="650" bgcolor="#C3C3C3"> + <tr> + <td ALIGN=CENTER><H4>Toutes vos demandes sont enregistrées. Des filtres sont appliqués.</H4> + </tr> + </table> + <P><font size=-3>Powered by <a href="http://e2guardian.org" target="_blank"><font color="#0000ee">E2guardian</font></A></font> +</center> +</BODY> +</HTML> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-template-nginx.html b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-template-nginx.html new file mode 100644 index 0000000000000000000000000000000000000000..ce4f57a72e9d2cc9fe039cd17fcbbcb30a274bc5 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-template-nginx.html @@ -0,0 +1,53 @@ +<HTML> +<HEAD> + <meta charset="UTF-8"> + <TITLE>EOLE Guardian - Accès Interdit</TITLE> +</HEAD> +<style type="text/css"> + h1, h2, h3 { + font-family: "fantasy"; + } + table{ + border: 1px solid black; + -webkit-border-top-right-radius: 20px; + -webkit-border-bottom-left-radius: 20px; + -moz-border-radius-topright: 20px; + -moz-border-radius-bottomleft: 20px; + border-top-right-radius: 20px; + border-bottom-left-radius: 20px; + font-family: "fantasy"; + border-color: #98bf21; + } +</style> + +<BODY BGCOLOR="FFFFF2"> +<CENTER> + <H2>ACCÈS INTERDIT</H2> + <br> + <table width="650" border=1> + <tr><td ALIGN=CENTER> + <br> + Adresse refusée + <br> + </td></tr> + </table> + <P><br> + <table width="650" border=1 bgcolor="#C3C3C3"> + <tr> + <td ALIGN=CENTER><H4>Toutes vos demandes sont enregistrées. Des filtres sont appliqués.</H4> +Vous avez fait une tentative d'accès à un site Web qui ne présente aucun intérêt pour des besoins d'information pédagogique ou technique correspondant à votre classe d'utilisation. + </tr> + </table> + <P>Pour toute réclamation, adressez un message à : + <A HREF='mailto:%%proxy_cachemaster?subject=[plainte%20dansguardian]%20%slurp +établissement%20:%20%%{libelle_etab}%20rne=%%{numero_etab}&body%slurp +=Message%20envoyé%20depuis%20la%20page%20de%20sites%20interdits%slurp +%20%0AMail%20envoyé%20par%20:%20-USER-%20%0AIp%20de%20la%20machine%20:%20-IP-%0A%slurp +Raison%20invoquée%20:%20-REASONGIVEN-%0AUrl%20visitée%20:%20"-URL-"%0A'> +<font color="#0000ee">%%proxy_cachemaster</font></A> + + <P> </P> + <P><font size=-3>Powered by <a href="http://e2guardian.org" target="_blank"><font color="#0000ee">E2guardian</font></A></font> +</center> +</BODY> +</HTML> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-template-utilisateur_interdits.html b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-template-utilisateur_interdits.html new file mode 100644 index 0000000000000000000000000000000000000000..f78fb32ad8c993bc4ca16d0777ca004b48d185f2 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-template-utilisateur_interdits.html @@ -0,0 +1,56 @@ +<HTML> +<HEAD> + <meta charset="UTF-8"> + <TITLE>EOLE Guardian - Accès Interdit</TITLE> +</HEAD> + +<style type="text/css"> + h1, h2, h3 { + font-family: "fantasy"; + } + table{ + border: 1px solid black; + -webkit-border-top-right-radius: 20px; + -webkit-border-bottom-left-radius: 20px; + -moz-border-radius-topright: 20px; + -moz-border-radius-bottomleft: 20px; + border-top-right-radius: 20px; + border-bottom-left-radius: 20px; + font-family: "fantasy"; + border-color: #98bf21; + } +</style> + +<BODY BGCOLOR="FFFFF2"> +<CENTER> + <H2>ACCÈS INTERDIT</H2> + <H3 style="background-color:#ff0000;"> + <br> + UTILISATEUR INTERDIT + <br> + <br> + </H3> + <br> + <table width="650"> + <tr><td ALIGN=CENTER> + <br> + Utilisateur : <strong>-USER-</strong><br> + IP Machine : <strong>-IP-</strong><br> + <br> + Raison : + <br> + <strong><font color="#ff0000">-REASONGIVEN-</font></strong> + <br> + <br> + </td></tr> + </table> + <P><br> + <table width="650" bgcolor="#C3C3C3"> + <tr> + <td ALIGN=CENTER><H4>Toutes vos demandes sont enregistrées. Des filtres sont appliqués.</H4> + </tr> + </table> + <P><font size=-3>Powered by <a href="http://e2guardian.org" target="_blank"><font color="#0000ee">E2guardian</font></A></font> +</center> +</BODY> +</HTML> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-template.html b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-template.html new file mode 100644 index 0000000000000000000000000000000000000000..64c9d4bf4206dcf22a3d307481729f9ee65c93f4 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian-template.html @@ -0,0 +1,62 @@ +<HTML> +<HEAD> + <meta charset="UTF-8"> + <TITLE>EOLE Guardian - Accès Interdit</TITLE> +</HEAD> +<style type="text/css"> + h1, h2, h3 { + font-family: "fantasy"; + } + table{ + border: 1px solid black; + -webkit-border-top-right-radius: 20px; + -webkit-border-bottom-left-radius: 20px; + -moz-border-radius-topright: 20px; + -moz-border-radius-bottomleft: 20px; + border-top-right-radius: 20px; + border-bottom-left-radius: 20px; + font-family: "fantasy"; + border-color: #98bf21; + } +</style> +<BODY BGCOLOR="FFFFF2"> +<CENTER> + <H2>ACCÈS INTERDIT</H2> + <br> + <table width="650"> + <tr><td ALIGN=CENTER> + <br> + Utilisateur : <strong>-USER-</strong><br> + IP Machine : <strong>-IP-</strong><br> + <br> + Adresse refusée : + <br> + <strong>-URL-</strong> + <br> + Raison : + <br> + <strong><font color="#ff0000">-REASONGIVEN-</font></strong> + <br> + <br> + </td></tr> + </table> + <P><br> + <table width="650" bgcolor="#C3C3C3"> + <tr> + <td ALIGN=CENTER><H4>Toutes vos demandes sont enregistrées. Des filtres sont appliqués.</H4> +Vous avez fait une tentative d'accès à un site Web qui ne présente aucun intérêt pour des besoins d'information pédagogique ou technique correspondant à votre classe d'utilisation. + </tr> + </table> + <P>Pour toute réclamation, adressez un message à : + <A HREF='mailto:%%proxy_cachemaster?subject=[plainte%20e2guardian]%20%slurp +établissement%20:%20%%{libelle_etab}%20rne=%%{numero_etab}&body%slurp +=Message%20envoyé%20depuis%20la%20page%20de%20sites%20interdits%slurp +%20%0AMail%20envoyé%20par%20:%20-USER-%20%0AIp%20de%20la%20machine%20:%20-IP-%0A%slurp +Raison%20invoquée%20:%20-REASONGIVEN-%0AUrl%20visitée%20:%20"-URL-"%0A'> +<font color="#0000ee">%%proxy_cachemaster</font></A> + + <P> </P> + <P><font size=-3>Powered by <a href="http://e2guardian.org" target="_blank"><font color="#0000ee">E2guardian</font></A></font> +</center> +</BODY> +</HTML> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian.conf new file mode 100644 index 0000000000000000000000000000000000000000..e4b6b896c15ee186dc58def7c1214fb087c3aa4b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian.conf @@ -0,0 +1,721 @@ +%if %%dansguardian_instance == '1' or %%dansguardian_instance == '2' +%set %%filterport = '3128' +%set %%proxyport = '8080' +%set %%forceactiveproxy = 'non' +%elif %%dansguardian_instance == '3' +%set %%filterport = str(%%dansguardian_port3) +%set %%proxyport = '8081' +%set %%forceactiveproxy = 'oui' +%end if +%set %%num_zone = str(int(%%dansguardian_instance) - 1) +# e2guardian config file for version @PACKAGE_VERSION@ + +# NOTE This file is only read at start-up +# +# but the lists defined in this file are re-read on reload or gentle restart +# as is any rooms directory files. + +# Language dir where languages are stored for internationalisation. +# The HTML template within this dir is only used when reportinglevel +# is set to 3. When used, e2guardian will display the HTML file instead of +# using the perl cgi script. This option is faster, cleaner +# and easier to customise the access denied page. +# The language file is used no matter what setting however. +# +reportinglevel = 3 +languagedir = '/usr/share/e2guardian/languages' + +# language to use from languagedir. +language = 'french' + +# Logging Settings +# +# 0 = none 1 = just denied 2 = all text based 3 = all requests +loglevel = 3 + +# Log Exception Hits +# Log if an exception (user, ip, URL, phrase) is matched and so +# the page gets let through. Can be useful for diagnosing +# why a site gets through the filter. +# 0 = never log exceptions +# 1 = log exceptions, but do not explicitly mark them as such +# 2 = always log & mark exceptions (default) +logexceptionhits = 2 + +# Log File Format +# 1 = Dansguardian format (space delimited) +# 2 = CSV-style format +# 3 = Squid Log File Format +# 4 = Tab delimited +# 5 = Protex format +# Protex format - Tab delimited, squid style format with extra fields +# for filter block/result codes, reasons, filter group, and system name +# used in arrays so that combined logs show originating server. +# 6 = Protex format with server field blanked +# 7 = Squid Log File Format Secure extension (SF Actions, use comercial report tools (ex: McAfee Webreport)) +logfileformat = 2 + +# Log a specific value from header +# low case only +# only used with logs: 1,5 and 6 +# logheadervalue = 'proxy-authorization:' + +# truncate large items in log lines +# allowable values 10 to 32000 +# default 2000 +# unlimited not longer allowed - 0 will now set default of 2000 +# maxlogitemlength = 2000 + +# anonymize logs (blank out usernames & IPs) +# anonymizelogs = off + +# Syslog logging +# +# Use syslog for access logging instead of logging to the file +# at the defined or built-in "loglocation" +logsyslog = on + +# Suffix to append to program name when logging through syslog +# Default is the e2Guardian instance number +namesuffix = %%num_zone + +# Log file location +# +# Defines the log directory and filename. +# loglocation = '@DGLOGLOCATION@/access.log' + +# Dymamic statistics log file location +# +# Defines the dstats file directory and filename. +# Once every 'dstatinterval' seconds, stats on number of threads in use, +# Q sizes and other useful information is written to this file. +# Format is similar to sar. See notes/dstats_format for more details. +# Default is not to write stats. +# dstatlocation = '@DGLOGLOCATION@/dstats.log' + +# Interval in seconds between stats output +# Default 300 (= 5 mins) +# Minimum 10 +# Maximum 3600 (= 1 hour) +# dstatinterval = 300 # = 5 minutes + +# Statistics log file location +# +# Defines the stat file directory and filename. +# Only used in conjunction with maxips > 0 +# Once every 3 minutes, the current number of IPs in the cache, and the most +# that have been in the cache since the daemon was started, are written to this +# file. IPs persist in the cache for 7 days. +# Time format is epoch GMT+0 by default | statshumanreadable change to local zone +# statlocation = '@DGLOGLOCATION@/stats' **NOT YET IMPLEMENTED +# statshumanreadable = off + +# Network Settings +# +# the IP that e2guardian listens on. If left blank e2guardian will +# listen on all IPs. That would include all NICs, loopback, modem, etc. +# Normally you would have your firewall protecting this, but if you want +# you can limit it to a certain IP. To bind to multiple interfaces, +# specify each IP on an individual filterip line. +# If mapportstoips is 'on' you can have the same IP twice so long as +# it has a different port. +%set %%squid_auth = 'non' +%set %%nbports = 0 +%if %%nombre_interfaces == '1' + %set %%proxy_ifaces = [0] +%else + %set %%proxy_ifaces = %%range(1, %%int(%%nombre_interfaces)) +%end if +%set filterips = [] +%for %%num_int in %%proxy_ifaces + %set %%for_this_instance = 'non' + %if %%forceactiveproxy == 'oui' or %%getVar('dansguardian_eth' + %%str(%%num_int)) == %%dansguardian_instance + %set %%for_this_instance = 'oui' + %end if + %if %%getVar("activer_proxy_eth" + %%str(%%num_int), "oui") == 'oui' and %%for_this_instance == 'oui' + %if %%activer_squid_auth == 'oui' and %%getVar('squid_auth_eth' + %%dansguardian_instance, 'oui') + %set %%squid_auth = 'oui' + %end if + %if %%mode_conteneur_actif == 'non': +%%filterips.append(%%getVar("adresse_ip_eth" + %%str(num_int))) +%set %%nbports += 1 + %if %%getVar('vlan_eth' + %%str(num_int)) == 'oui' + %for %%filter in %%getVar('vlan_id_eth' + %%str(num_int)) +%%filterips.append(%%getattr(%%filter, 'vlan_ip_eth' + %%str(num_int))) +%set %%nbports += 1 + %end for + %end if + %if %%getVar('alias_eth' + %%str(num_int)) == 'oui' + %for %%filter in %%getVar('alias_ip_eth' + %%str(num_int)) +%%filterips.append(%%filter) +%set %%nbports += 1 + %end for + %end if + %else +%%filterips.append(%%getVar("adresse_ip_eth" + %%str(num_int) + "_proxy_link")) +%set %%nbports += 1 +#pas de vlan/alias en mode conteneur + %end if + %end if +%end for + +%for %%filterip in %%filterips +filterip = %%filterip +%end for + +%for %%num_int in %%range(%%nbports) +filterports = %%filterport +%end for + + +# Map ports to IPs +# If enabled map filterports to filterip - number of filterports must then be same as +# number of filterip +# If disabled will listen on all filterports on all filterips. +# on (default) | off +# mapportstoips = off + +# the ip of the proxy (default is the loopback - i.e. this server) +proxyip = 127.0.0.1 + +# the port e2guardian connects to proxy on +proxyport = %%proxyport + +# Proxy timeout +# Set tcp timeout between the Proxy and e2guardian +# This is a connection timeout +# If proxy is remote you may need to increase this to 10 or more. +# Min 5 - Max 100 +proxytimeout = %%docbodytimeout + +# Proxy failure log interval +# The interval between log status entries when proxy is not responding +# minimum is proxytimeout - maximum 3600 (= 1 hour) +# default = 600 (= 10 mins) +# proxyfailureloginterval = 600 **NOT YET IMPLEMENTED + +# Proxy header exchange +# Set timeout between the Proxy and e2guardian +# Min 20 - Max 300 +# If this is higher than proxies timeout user will get proxy Gateway error page +# If lower e2guardian Gateway error page +proxyexchange = %%docheadertimeout + +# Pconn timeout +# how long a persistent connection will wait for other requests +# squid apparently defaults to 1 minute (persistent_request_timeout), +# so wait slightly less than this to avoid duff pconns. +# Min 5 - Max 300 +pcontimeout = %%headertimeout + +# Whether to retrieve the original destination IP in transparent proxy +# setups and check it against the domain pulled from the HTTP headers. +# +# Be aware that when visiting sites which use a certain type of round-robin +# DNS for load balancing, DG may mark requests as invalid unless DG gets +# exactly the same answers to its DNS requests as clients. The chances of +# this happening can be increased if all clients and servers on the same LAN +# make use of a local, caching DNS server instead of using upstream DNS +# directly. +# +# See http://www.kb.cert.org/vuls/id/435052 +# on (default) | off +@ORIGIPSUPPORT@originalip = off + +# Banned image replacement +# Images that are banned due to domain/url/etc reasons including those +# in the adverts blacklists can be replaced by an image. This will, +# for example, hide images from advert sites and remove broken image +# icons from banned domains. +# on (default) | off +usecustombannedimage = on +custombannedimagefile = '/usr/share/e2guardian/transparent1x1.gif' + +# Banned flash replacement +usecustombannedflash = on +custombannedflashfile = '/usr/share/e2guardian/blockedflash.swf' + +# Filter groups options +# filtergroups sets the number of filter groups. A filter group is a set of content +# filtering options you can apply to a group of users. The value must be 1 or more. +# e2guardian will automatically look for e2guardianfN.conf where N is the filter +# group. To assign users to groups use the filtergroupslist option. All users default +# to filter group 1. You must have some sort of authentication to be able to map users +# to a group. The more filter groups the more copies of the lists will be in RAM so +# use as few as possible. +%if %%is_defined('dans_num_opt_filters') +%set %%num_filters=int(%%dans_num_opt_filters) + 4 +filtergroups = %%num_filters +%else +filtergroups = 7 +%end if +filtergroupslist = '/etc/guardian/guardian%%num_zone/common/filtergroupslist' + +# If on it a user without group is considered like unauthenfied +# E2guardian tries the next plugin +# If off the user is connected with group1 +# Defaults to off +# authrequiresuserandgroup = off + +# Authentication files location +bannediplist = '/etc/guardian/guardian%%num_zone/common/bannediplist' +exceptioniplist = '/etc/guardian/guardian%%num_zone/common/exceptioniplist' + +# Per-Room definition directory +# A directory containing text files containing the room's name followed by IPs or ranges +# and optionaly site and url lists +# Think of it as bannediplist and/or exceptions on crack +# perroomdirectory = '/etc/guardian/guardian%%num_zone/common/lists/rooms/' + +# Show weighted phrases found +# If enabled then the phrases found that made up the total which excedes +# the naughtyness limit will be logged and, if the reporting level is +# high enough, reported. on | off +showweightedfound = on + +# Weighted phrase mode +# There are 3 possible modes of operation: +# 0 = off = do not use the weighted phrase feature. +# 1 = on, normal = normal weighted phrase operation. +# 2 = on, singular = each weighted phrase found only counts once on a page. +# +# IMPORTANT: Note that setting this to "0" turns off all features which +# extract phrases from page content, including banned & exception +# phrases (not just weighted), search term filtering, and scanning for +# links to banned URLs. +# +weightedphrasemode = 2 + +# Positive (clean) result caching for URLs +# Caches good pages so they don't need to be scanned again. +# It also works with AV plugins. +# 0 = off (recommended for ISPs with users with disimilar browsing) +# 1000 = recommended for most users +# 5000 = suggested max upper limit +# If you're using an AV plugin then use at least 5000. +# urlcachenumber = 1000 **NOT YET IMPLEMENTED + +# +# Age before they are stale and should be ignored in seconds +# 0 = never +# 900 = recommended = 15 mins +# urlcacheage = 900 **NOT YET IMPLEMENTED + +# Cache for content (AV) scan results as 'clean' +# By default, to save CPU, files scanned and found to be +# clean are inserted into the clean cache and NOT scanned +# again for a while. If you don't like this then choose +# to disable it. +# on = cache results; do not re-scan +# off = do not cache; always re-scan +# (on|off) default = on. +# scancleancache = on **NOT YET IMPLEMENTED + +# Smart, Raw and Meta/Title phrase content filtering options +# Smart is where the multiple spaces and HTML are removed before phrase filtering +# Raw is where the raw HTML including meta tags are phrase filtered +# Meta/Title is where only meta and title tags are phrase filtered (v. quick) +# CPU usage can be effectively halved by using setting 0 or 1 compared to 2 +# 0 = raw only +# 1 = smart only +# 2 = both of the above (default) +# 3 = meta/title +phrasefiltermode = 2 + +# Lower casing options +# When a document is scanned the uppercase letters are converted to lower case +# in order to compare them with the phrases. However this can break Big5 and +# other 16-bit texts. If needed preserve the case. As of version 2.7.0 accented +# characters are supported. +# 0 = force lower case (default) +# 1 = do not change case +# 2 = scan first in lower case, then in original case +preservecase = 0 + +# Note: +# If phrasefiltermode and preserve case are both 2, this equates to 4 phrase +# filtering passes. If you have a large enough userbase for this to be a +# worry, and need to filter pages in exotic character encodings, it may be +# better to run two instances on separate servers: one with preservecase 1 +# (and possibly forcequicksearch 1) and non ASCII/UTF-8 phrase lists, and one +# with preservecase 0 and ASCII/UTF-8 lists. + +# Hex decoding options +# When a document is scanned it can optionally convert %XX to chars. +# If you find documents are getting past the phrase filtering due to encoding +# then enable. However this can break Big5 and other 16-bit texts. +# off = disabled (default) +# on = enabled +hexdecodecontent = off + +# Force Quick Search rather than DFA search algorithm +# The current DFA implementation is not totally 16-bit character compatible +# but is used by default as it handles large phrase lists much faster. +# If you wish to use a large number of 16-bit character phrases then +# enable this option. +# off (default) | on (Big5 compatible) +forcequicksearch = off + +# Reverse lookups for banned site and URLs. +# If set to on, e2guardian will look up the forward DNS for an IP URL +# address and search for both in the banned site and URL lists. This would +# prevent a user from simply entering the IP for a banned address. +# It will reduce searching speed somewhat so unless you have a local caching +# DNS server, leave it off and use the Blanket IP Block option in the +# bannedsitelist file instead. +reverseaddresslookups = off + +# Reverse lookups for banned and exception IP lists. +# If set to on, e2guardian will look up the forward DNS for the IP +# of the connecting computer. This means you can put in hostnames in +# the exceptioniplist and bannediplist. +# If a client computer is matched against an IP given in the lists, then the +# IP will be recorded in any log entries; if forward DNS is successful and a +# match occurs against a hostname, the hostname will be logged instead. +# It will reduce searching speed somewhat so unless you have a local DNS server, +# leave it off. +reverseclientiplookups = off + +# Perform reverse lookups on client IPs for successful requests. +# If set to on, e2guardian will look up the forward DNS for the IP +# of the connecting computer, and log host names (where available) rather than +# IPs against requests. +# This is not dependent on reverseclientiplookups being enabled; however, if it +# is, enabling this option does not incur any additional forward DNS requests. +logclienthostnames = off + +# Max content filter size +# Sometimes web servers label binary files as text which can be very +# large which causes a huge drain on memory and cpu resources. +# To counter this, you can limit the size of the document to be +# filtered and get it to just pass it straight through. +# This setting also applies to content regular expression modification. +# The value must not be higher than maxcontentramcachescansize +# The size is in Kibibytes - eg 2048 = 2Mb +# use 0 to set it to maxcontentramcachescansize +maxcontentfiltersize = 256 + +# Max content ram cache scan size +# This is only used if you use a content scanner plugin such as AV +# This is the max size of file that DG will download and cache +# in RAM. After this limit is reached it will cache to disk +# This value must be less than or equal to maxcontentfilecachescansize. +# The size is in Kibibytes - eg 10240 = 10Mb +# use 0 to set it to maxcontentfilecachescansize +# This option may be ignored by the configured download manager. +maxcontentramcachescansize = %%getVar('dans_maxramsize' + %%dansguardian_instance) + +# Max content file cache scan size +# This is only used if you use a content scanner plugin such as AV +# This is the max size file that DG will download +# so that it can be scanned or virus checked. +# This value must be greater or equal to maxcontentramcachescansize. +# The size is in Kibibytes - eg 10240 = 10Mb +maxcontentfilecachescansize = %%getVar('dans_maxfilesize' + %%dansguardian_instance) + +# File cache dir +# Where DG will download files to be scanned if too large for the +# RAM cache. +filecachedir = %%getVar('dans_cachedir' + %%dansguardian_instance) + +# Delete file cache after user completes download +# When a file gets save to temp it stays there until it is deleted. +# You can choose to have the file deleted when the user makes a sucessful +# download. This will mean if they click on the link to download from +# the temp store a second time it will give a 404 error. +# You should configure something to delete old files in temp to stop it filling up. +# on|off (defaults to on) +deletedownloadedtempfiles = on + +# Initial Trickle delay +# This is the number of seconds a browser connection is left waiting +# before first being sent *something* to keep it alive. The +# *something* depends on the download manager chosen. +# Do not choose a value too low or normal web pages will be affected. +# A value between 20 and 110 would be sensible +# This may be ignored by the configured download manager. +initialtrickledelay = 20 + +# Trickle delay +# This is the number of seconds a browser connection is left waiting +# before being sent more *something* to keep it alive. The +# *something* depends on the download manager chosen. +# This may be ignored by the configured download manager. +trickledelay = 10 + +# Download Managers +# These handle downloads of files to be filtered and scanned. +# They differ in the method they deal with large downloads. +# Files usually need to be downloaded 100% before they can be +# filtered and scanned before being sent on to the browser. +# Normally the browser can just wait, but with content scanning, +# for example to AV, the browser may timeout or the user may get +# confused so the download manager has to do some sort of +# 'keep alive'. +# +# There are various methods possible but not all are included. +# The author does not have the time to write them all so I have +# included a plugin system. Also, not all methods work with all +# browsers and clients. Specifically some fancy methods don't +# work with software that downloads updates. To solve this, +# each plugin can support a regular expression for matching +# the client's user-agent string, and lists of the mime types +# and extensions it should manage. +# +# Note that these are the matching methods provided by the base plugin +# code, and individual plugins may override or add to them. +# See the individual plugin conf files for supported options. +# +# The plugins are matched in the order you specify and the last +# one is forced to match as the default, regardless of user agent +# and other matching mechanisms. +# +downloadmanager = '/etc/guardian/guardian%%num_zone/common/fancy.conf' +# @TRICKLESUPPORT@downloadmanager = '/etc/guardian/guardian%%num_zone/common/downloadmanagers/trickle.conf' +downloadmanager = '/etc/guardian/guardian%%num_zone/downloadmanagers/default.conf' + +# Content Scanners (Also known as AV scanners) +# These are plugins that scan the content of all files your browser fetches +# for example to AV scan. The options are limitless. Eventually all of +# e2guardian will be plugin based. You can have more than one content +# scanner. The plugins are run in the order you specify. +# This is one of the few places you can have multiple options of the same name. +# +# Some of the scanner(s) require 3rd party software and libraries eg clamav. +# See the individual plugin conf file for more options (if any). +# +# @CLAMDSUPPORT@contentscanner = '/etc/guardian/guardian%%num_zone/common/contentscanners/clamdscan.conf' +# @AVASTDSUPPORT@contentscanner = '/etc/guardian/guardian%%num_zone/common/contentscanners/avastdscan.conf' +# @KAVDSUPPORT@contentscanner = '/etc/guardian/guardian%%num_zone/common/contentscanners/kavdscan.conf' +# @ICAPSUPPORT@contentscanner = '/etc/guardian/guardian%%num_zone/common/contentscanners/icapscan.conf' +# @COMMANDLINESUPPORT@contentscanner = '/etc/guardian/guardian%%num_zone/common/contentscanners/commandlinescan.conf' + +%if %%getVar('dansguardian_clam', 'non') == 'oui' +contentscanner = '/etc/guardian/guardian%%num_zone/contentscanners/clamdscan.conf' +%end if + +# Content scanner timeout +# Some of the content scanners support using a timeout value to stop +# processing (eg AV scanning) the file if it takes too long. +# If supported this will be used. +# The default of 60 seconds is probably reasonable. +contentscannertimeout = 60 + +# Content scan exceptions +# If 'on' exception sites, urls, users etc will be scanned +# This is probably not desirable behavour as exceptions are +# supposed to be trusted and will increase load. +# Correct use of grey lists are a better idea. +# (on|off) default = off +contentscanexceptions = off + +# Auth plugins +# These replace the usernameidmethod* options in previous versions. They +# handle the extraction of client usernames from various sources, such as +# Proxy-Authorisation headers and ident servers, enabling requests to be +# handled according to the settings of the user's filter group. +# Multiple plugins can be specified, and will be used per port in the order +# filterports are listed. +# +# If you do not use multiple filter groups, you need not specify this option. +# +# authplugin = '/etc/guardian/guardian%%num_zone/common/authplugins/proxy-basic.conf' +# authplugin = '/etc/guardian/guardian%%num_zone/common/authplugins/proxy-digest.conf' +# @NTLMSUPPORT@authplugin = '/etc/guardian/guardian%%num_zone/common/authplugins/proxy-ntlm.conf' +# authplugin = '/etc/guardian/guardian%%num_zone/common/authplugins/ident.conf' +# authplugin = '/etc/guardian/guardian%%num_zone/common/authplugins/ip.conf' +# authplugin = '/etc/guardian/guardian%%num_zone/common/proxy-header.conf' +%if %%squid_auth == 'non' +authplugin = '/etc/guardian/guardian%%num_zone/common/ip.conf' +%else +authplugin = '/etc/guardian/guardian%%num_zone/authplugins/proxy-ntlm.conf' +authplugin = '/etc/guardian/guardian%%num_zone/authplugins/proxy-basic.conf' +authplugin = '/etc/guardian/guardian%%num_zone/common/ip.conf' +%end if + +# Map auth to ports +# If enabled map auth plugins to ips/ports - number of authplugins must then be same as +# number of ports +# If disabled scan authplugins on all ports - number of authplugins can then be different +# to number of ports +# on (default) | off +mapauthtoports = off + +# Re-check replaced URLs +# As a matter of course, URLs undergo regular expression search/replace (urlregexplist) +# *after* checking the exception site/URL/regexpURL lists, but *before* checking against +# the banned site/URL lists, allowing certain requests that would be matched against the +# latter in their original state to effectively be converted into grey requests. +# With this option enabled, the exception site/URL/regexpURL lists are also re-checked +# after replacement, making it possible for URL replacement to trigger exceptions based +# on them. +# Defaults to off. +recheckreplacedurls = off + +# Misc settings + +# if on it adds an X-Forwarded-For: <clientip> to the HTTP request +# header. This may help solve some problem sites that need to know the +# source ip. on | off +forwardedfor = on + +# if on it uses the X-Forwarded-For: <clientip> to determine the client +# IP. This is for when you have squid between the clients and e2guardian. +# Warning - headers are easily spoofed. on | off + +usexforwardedfor = on + +%for %%filterip in %%filterips +xforwardedforfilterip = %%filterip +%end for +# as mentioned above, the headers can be easily spoofed in order to fake the +# request origin by setting the X-Forwarded-For header. If you have the +# "usexforwardedfor" option enabled, you may want to specify the IPs from which +# this kind of header is allowed, such as another upstream proxy server for +# instance If you want authorize multiple IPs, specify each one on an individual +# xforwardedforfilterip line. +# xforwardedforfilterip = + +# if on it logs some debug info regarding accept()ing and failed connections +# which +# can usually be ignored. These are logged by syslog. It is safe to leave +# it on or off +logconnectionhandlingerrors = on + +# sets the number of worker threads to use - NEW for v4.0 +# +# note this replaces all min/max etc children settings in previous versions +# +# This figure is the maximum number of concurrent connections. +# If more connections are made, connections will queue until a worker thread is free. +# On large site you might want to try 5000 (max value 20000) +httpworkers = %%getVar('guardian_httpworkers' + %%dansguardian_instance) + +# Sets the maximum number client IP addresses allowed to connect at once. +# Use this to set a hard limit on the number of users allowed to concurrently +# browse the web. Set to 0 for no limit, and to disable the IP cache process. +maxips = 0 **NOT YET IMPLEMENTED + +# Process options +# (Change these only if you really know what you are doing). +# These options allow you to run multiple instances of e2guardian on a single machine. +# Remember to edit the log file path above also if that is your intention. + +# PID filename +# +# Defines process id directory and filename. +# pidfilename = '@DGPIDDIR@/e2guardian.pid' +pidfilename = '/var/run/guardian%%{num_zone}.pid' + +# Disable daemoning +# If enabled the process will not fork into the background. +# It is not usually advantageous to do this. +# on|off (defaults to off) +nodaemon = off + +# Disable logging process +# on|off (defaults to off) +nologger = off + +# Enable logging of "ADs" category blocks +# on|off (defaults to off) +logadblocks = off + +# Enable logging of client User-Agent +# Some browsers will cause a *lot* of extra information on each line! +# on|off (defaults to off) +loguseragent = off + +# Daemon run as user and group +# This is the user that e2guardian runs as. Normally the user/group nobody. +# Uncomment to use. Defaults to the user set at compile time. +# Temp files created during virus scanning are given owner and group read +# permissions; to use content scanners based on external processes, such as +# clamdscan, the two processes must run with either the same group or user ID. +daemonuser = 'proxy' +daemongroup = 'proxy' + +# Soft restart +# When on this disables the forced killing off all processes in the process group. +# This is not to be confused with the -g run time option - they are not related. +# on|off (defaults to off) +softrestart = off + +# Mail program +# Path (sendmail-compatible) email program, with options. +# Not used if usesmtp is disabled (filtergroup specific). +# @EMAILSUPPORT@mailer = '/usr/sbin/sendmail -t' # NOT YET IMPLIMENTED + +# Enable SSL support - NEW for v4.0 +# This must be present to enable MITM and/or Cert checking +# default is off +enablessl = off + +# SSL certificate checking path +# Path to CA certificates used to validate the certificates of https sites. +# if left blank openssl default ca certificate bundle will be used +# Leave as default unless you want to load non-default cert bundle +# sslcertificatepath = '' + +# SSL man in the middle +# CA certificate path +# Path to the CA certificate to use as a signing certificate for +# generated certificates. +# default is blank - required if ssl_mitm is enabled. +# cacertificatepath = '/etc/e2guardian/certs/ca.pem' + +# CA private key path +# path to the private key that matches the public key in the CA certificate. +# default is blank - required if ssl_mitm is enabled. +# caprivatekeypath = '/etc/e2guardian/certs/ca.key' + +# Cert private key path +# The public / private key pair used by all generated certificates +# default is blank - required if ssl_mitm is enabled. +# certprivatekeypath = '/etc/e2guardian/certs/cert.key' + +# Generated cert path +# The location where generated certificates will be saved for future use. +# (must be writable by the dg user) +# default is blank - required if ssl_mitm is enabled. +# generatedcertpath = '/etc/e2guardian/certs/generatedcerts/' + +# Warning: if you change the cert start/end time from default on a running +# system you will need to clear the generated certificate +# store and also may get problems on running client browsers + +# Generated cert start time (in unix time) - optional +# defaults to 1417872951 = 6th Dec 2014 +# generatedcertstart = 1417872951 + +# Generated cert end time (in unix time) - optional +# defaults to generatedcertstart + 10 years +# genratedcertend = +# generatedcertstart = + +# monitor helper path +# If defined this script/binary will be called with start or stop appended as follows:- +# Note change in V4!!! - No longer detects cache failure +# At start after e2guardian has started listener and worker threads with +# ' start' appended +# When e2guardian is stopping with ' stop' appended +# monitorhelper = '/usr/local/bin/mymonitor' + +# monitor flag prefix path +# If defined path will be used to generate flag files as follows:- +# +# At start after e2guardian has started listener and worker threads with +# 'running' appended +# When e2guardian is stopping with 'paused' appended +# Note change in V4!!! - No longer detects cache failure +# monitorflagprefix = '/home/e2g/run/e2g_flag_' + +# http header checking setings +# +# Limit number of http header lines in a request/response +# (to guard against attacks) +# Minimum 10 max 2000 +# default 40 +# maxheaderlines = 40 + + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian.logrotate b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian.logrotate new file mode 100644 index 0000000000000000000000000000000000000000..e24a90e7166b00543e08ff119b4a22c19752d729 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian.logrotate @@ -0,0 +1,33 @@ +missingok + +/var/log/rsyslog/local/e2guardian/*.log { + rotate 365 + daily + compress + delaycompress + sharedscripts + ifempty + size 0 + copytruncate + postrotate + /etc/init.d/rsyslog rotate > /dev/null + endscript +} + +%if %%is_defined('activer_log_distant') + %if %%activer_log_distant == 'oui' and %%activer_reception_logs == 'oui' +/var/log/rsyslog/remote/e2guardian/*.log { + rotate 365 + daily + compress + delaycompress + sharedscripts + ifempty + size 0 + copytruncate + postrotate + /etc/init.d/rsyslog rotate > /dev/null + endscript +} + %end if +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian1.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian1.conf new file mode 100644 index 0000000000000000000000000000000000000000..59640542d15955705bcd3b4fd599c314bf58fa45 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian1.conf @@ -0,0 +1,5 @@ +%set global %%dansguardian_instance = "1" +%set global %%filterport = '3128' +%set global %%proxyport = '8080' +%set global %%forceactiveproxy = 'non' +%include "/var/lib/eole/dansguardian.conf" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian2.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian2.conf new file mode 100644 index 0000000000000000000000000000000000000000..9a3ec2132dceb936e04e2f81cb33be6eb089bdf0 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian2.conf @@ -0,0 +1,5 @@ +%set global %%dansguardian_instance = "2" +%set global %%filterport = '3128' +%set global %%proxyport = '8080' +%set global %%forceactiveproxy = 'non' +%include "/var/lib/eole/dansguardian.conf" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian3.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian3.conf new file mode 100644 index 0000000000000000000000000000000000000000..360bdfd4e2fda3176d57836bf5caf11b96555a21 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardian3.conf @@ -0,0 +1,5 @@ +%set global %%dansguardian_instance = "3" +%set global %%filterport = %%dansguardian_port3 +%set global %%proxyport = '8081' +%set global %%forceactiveproxy = 'oui' +%include "/var/lib/eole/dansguardian.conf" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf.conf new file mode 100644 index 0000000000000000000000000000000000000000..f54b2a9299694fac9de96e6a6ab82185c46430d7 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf.conf @@ -0,0 +1,323 @@ +# e2guardian filter group config file for version 4.1.2 + +# Maximum upload size for the "policy" +maxuploadsize = -1 + +# Filter group name +# Used to fill in the -FILTERGROUP- placeholder in the HTML template file, and to +# name the group in the access logs +# Defaults to empty string +groupname = %%groupname + +# Content filtering files location +%if %%contentfiltering == 'oui' +bannedphraselist = '/etc/guardian/guardian%%nomzone/listsf%%listsf/bannedphraselist' +weightedphraselist = '/etc/guardian/guardian%%nomzone/listsf%%listsf/weightedphraselist.meta' +exceptionphraselist = '/etc/guardian/guardian%%nomzone/listsf%%listsf/exceptionphraselist' + +bannedsitelist = '/etc/guardian/guardian%%nomzone/listsf%%listsf/bannedsitelist%%add_list' +bannedsslsitelist = '/etc/guardian/guardian%%nomzone/listsf%%listsf/bannedsitelist%%add_list' +greysitelist = '/etc/guardian/guardian%%nomzone/listsf%%listsf/greysitelist%%add_list' +greysslsitelist = '/etc/guardian/guardian%%nomzone/listsf%%listsf/greysitelist%%add_list' +exceptionsitelist = '/etc/guardian/guardian%%nomzone/listsf%%listsf/exceptionsitelist%%add_list' + +bannedurllist = '/etc/guardian/guardian%%nomzone/listsf%%listsf/bannedurllist' +greyurllist = '/etc/guardian/guardian%%nomzone/listsf%%listsf/greyurllist' +exceptionurllist = '/etc/guardian/guardian%%nomzone/listsf%%listsf/exceptionurllist' + +exceptionregexpurllist = '/etc/guardian/guardian%%nomzone/listsf%%listsf/exceptionregexpurllist' +bannedregexpurllist = '/etc/guardian/guardian%%nomzone/listsf%%listsf/bannedregexpurllist' + +bannedsitelistwithbypass = '/etc/guardian/guardian%%nomzone/listsf%%listsf/bannedsitelistwithbypass' + +picsfile = '/etc/guardian/guardian%%nomzone/listsf%%listsf/pics.empty' + +contentregexplist = '/etc/guardian/guardian%%nomzone/listsf%%listsf/contentregexplist' + +urlregexplist = '/etc/guardian/guardian%%nomzone/listsf%%listsf/urlregexplist' + +sslsiteregexplist = '/etc/guardian/guardian%%nomzone/listsf%%listsf/sslsiteregexplist' +%end if + +# Filetype filtering +# +# Blanket download blocking +# If enabled, all files will be blocked, unless they match the +# exceptionextensionlist or exceptionmimetypelist. +# These lists do not override virus scanning. +# Exception lists defined above override all types of filtering, including +# the blanket download block. +# Defaults to disabled. +# (on | off) +# +blockdownloads = off +%if %%contentfiltering == 'oui' +exceptionextensionlist = '/etc/guardian/guardian%%nomzone/listsf%%listsf/exceptionextensionlist' +exceptionmimetypelist = '/etc/guardian/guardian%%nomzone/listsf%%listsf/exceptionmimetypelist' +%end if + +# Use the following lists to block specific kinds of file downloads. +# The two exception lists above can be used to override these. +# +%if %%contentfiltering == 'oui' +bannedextensionlist = '/etc/guardian/guardian%%nomzone/listsf%%listsf/bannedextensionlist' +bannedmimetypelist = '/etc/guardian/guardian%%nomzone/listsf%%listsf/bannedmimetypelist' +%end if +# +# In either file filtering mode, the following list can be used to override +# MIME type & extension blocks for particular domains & URLs (trusted download sites). +# +%if %%contentfiltering == 'oui' +exceptionfilesitelist = '/etc/guardian/guardian%%nomzone/listsf%%listsf/exceptionfilesitelist' +exceptionfileurllist = '/etc/guardian/guardian%%nomzone/listsf%%listsf/exceptionfileurllist' +%end if + +# Categorise without blocking: +# Supply categorised lists here and the category string shall be logged against +# matching requests, but matching these lists does not perform any filtering +# action. +#logsitelist = '/etc/guardian/lists/logsitelist' +#logurllist = '/etc/guardian/lists/logurllist' +#logregexpurllist = '/etc/guardian/lists/logregexpurllist' + +# Outgoing HTTP header rules: +# Optional lists for blocking based on, and modification of, outgoing HTTP +# request headers. Format for headerregexplist is one modification rule per +# line, similar to content/URL modifications. Format for +# bannedregexpheaderlist is one regular expression per line, with matching +# headers causing a request to be blocked. +# Headers are matched/replaced on a line-by-line basis, not as a contiguous +# block. +# Use for example, to remove cookies or prevent certain user-agents. +%if %%contentfiltering == 'oui' +bannedregexpheaderlist = '/etc/guardian/guardian%%nomzone/listsf%%listsf/bannedregexpheaderlist' +headerregexplist = '/etc/guardian/guardian%%nomzone/listsf%%listsf/headerregexplist' +%end if + +%if %%contentfiltering == 'oui' +localexceptionurllist = '/etc/guardian/guardian%%nomzone/listsf%%listsf/localexceptionurllist' +localexceptionsitelist = '/etc/guardian/guardian%%nomzone/listsf%%listsf/localexceptionsitelist' +localbannedsitelist = '/etc/guardian/guardian%%nomzone/listsf%%listsf/localbannedsitelist' +localbannedurllist = '/etc/guardian/guardian%%nomzone/listsf%%listsf/localbannedurllist' +localgreysitelist = '/etc/guardian/guardian%%nomzone/listsf%%listsf/localgreysitelist' +localgreyurllist = '/etc/guardian/guardian%%nomzone/listsf%%listsf/localgreyurllist' +localbannedsslsitelist = '/etc/guardian/guardian%%nomzone/listsf%%listsf/localbannedsslsitelist' +localgreysslsitelist = '/etc/guardian/guardian%%nomzone/listsf%%listsf/localgreysslsitelist' +%end if + +# Naughtyness limit +# This the limit over which the page will be blocked. Each weighted phrase is given +# a value either positive or negative and the values added up. Phrases to do with +# good subjects will have negative values, and bad subjects will have positive +# values. See the weightedphraselist file for examples. +# As a guide: +# 50 is for young children, 100 for old children, 160 for young adults. +%set %%instance = %%nomzone + 1 +naughtynesslimit = %%getVar('naughtynesslimit' + %%str(%%instance)) + +# Category display threshold +# This option only applies to pages blocked by weighted phrase filtering. +# Defines the minimum score that must be accumulated within a particular +# category in order for it to show up on the block pages' category list. +# All categories under which the page scores positively will be logged; those +# that were not displayed to the user appear in brackets. +# +# -1 = display only the highest scoring category +# 0 = display all categories (default) +# > 0 = minimum score for a category to be displayed +categorydisplaythreshold = 0 + +# Embedded URL weighting +# When set to something greater than zero, this option causes URLs embedded within a +# page's HTML (from links, image tags, etc.) to be extracted and checked against the +# bannedsitelist and bannedurllist. Each link to a banned page causes the amount set +# here to be added to the page's weighting. +# The behaviour of this option with regards to multiple occurrences of a site/URL is +# affected by the weightedphrasemode setting. +# +# NB: Currently, this feature uses regular expressions that require the PCRE library. +# As such, it is only available if you compiled DansGuardian with '--enable-pcre=yes'. +# You can check compile-time options by running 'dansguardian -v'. +# +# Set to 0 to disable. +# Defaults to 0. +# WARNING: This option is highly CPU intensive! +embeddedurlweight = 0 + +# Enable PICS rating support +# +# Defaults to disabled +# (on | off) +enablepics = on + +# Temporary Denied Page Bypass +# This provides a link on the denied page to bypass the ban for a few minutes. To be +# secure it uses a random hashed secret generated at daemon startup. You define the +# number of seconds the bypass will function for before the deny will appear again. +# To allow the link on the denied page to appear you will need to edit the template.html +# or dansguardian.pl file for your language. +# 300 = enable for 5 minutes +# 0 = disable ( defaults to 0 ) +# -1 = enable but you require a separate program/CGI to generate a valid link +bypass = %%bypass + +# Temporary Denied Page Bypass Secret Key +# Rather than generating a random key you can specify one. It must be more than 8 chars. +# '' = generate a random one (recommended and default) +# 'Mary had a little lamb.' = an example +# '76b42abc1cd0fdcaf6e943dcbc93b826' = an example +bypasskey = '' + +# Infection/Scan Error Bypass +# Similar to the 'bypass' setting, but specifically for bypassing files scanned and found +# to be infected, or files that trigger scanner errors - for example, archive types with +# recognised but unsupported compression schemes, or corrupt archives. +# The option specifies the number of seconds for which the bypass link will be valid. +# 300 = enable for 5 minutes +# 0 = disable (default) +# -1 = enable, but require a separate program/CGI to generate a valid link +infectionbypass = 0 + +# Infection/Scan Error Bypass Secret Key +# Same as the 'bypasskey' option, but used for infection bypass mode. +infectionbypasskey = '' + +# Infection/Scan Error Bypass on Scan Errors Only +# Enable this option to allow infectionbypass links only when virus scanning fails, +# not when a file is found to contain a virus. +# on = enable (default and highly recommended) +# off = disable +infectionbypasserrorsonly = on + +# Disable content scanning +# If you enable this option you will disable content scanning for this group. +# Content scanning primarily is AV scanning (if enabled) but could include +# other types. +# (on|off) default = off. +disablecontentscan = off + +# Enable Deep URL Analysis +# When enabled, DG looks for URLs within URLs, checking against the bannedsitelist and +# bannedurllist. This can be used, for example, to block images originating from banned +# sites from appearing in Google Images search results, as the original URLs are +# embedded in the thumbnail GET requests. +# (on|off) default = off +deepurlanalysis = on + +# reportinglevel +# +# -1 = log, but do not block - Stealth mode +# 0 = just say 'Access Denied' +# 1 = report why but not what denied phrase +# 2 = report fully +# 3 = use HTML template file (accessdeniedaddress ignored) - recommended +# +# If defined, this overrides the global setting in dansguardian.conf for +# members of this filter group. +# +reportinglevel = 3 + +# accessdeniedaddress is the address of your web server to which the cgi +# dansguardian reporting script was copied. Only used in reporting levels +# 1 and 2. +# +# This webserver must be either: +# 1. Non-proxied. Either a machine on the local network, or listed as an +# exception in your browser's proxy configuration. +# 2. Added to the exceptionsitelist. Option 1 is preferable; this option is +# only for users using both transparent proxying and a non-local server +# to host this script. +# +# If defined, this overrides the global setting in dansguardian.conf for +# members of this filter group. +# +#accessdeniedaddress = 'http://YOURSERVER.YOURDOMAIN/cgi-bin/dansguardian.pl' +%if %%getVar('activer_revprox', 'non') == 'oui' + %if ( %%revprox_activate_http == 'oui' and not %%is_empty(%%revprox_domainname)) or %%getVar('revprox_auto_config_local_web', 'non') == 'oui' +sslaccessdeniedaddress = 'http://%%adresse_ip_eth0/guardian.html + %end if +%end if + +# HTML Template override +# If defined, this specifies a custom HTML template file for members of this +# filter group, overriding the global setting in dansguardian.conf. This is +# only used in reporting level 3. +# +# The default template file path is <languagedir>/<language>/template.html +# e.g. /usr/share/dansguardian/languages/ukenglish/template.html when using 'ukenglish' +# language. +# +# This option generates a file path of the form: +# <languagedir>/<language>/<htmltemplate> +# e.g. /usr/share/dansguardian/languages/ukenglish/custom.html +# +#htmltemplate = 'custom.html' +%if %%htmltemplate != 'non' +htmltemplate = '%%htmltemplate' +%end if + +# Email reporting - original patch by J. Gauthier + +# Use SMTP +# If on, will enable system wide events to be reported by email. +# need to configure mail program (see 'mailer' in global config) +# and email recipients +# default usesmtp = off +#!! Not compiled !!usesmtp = off + +# mailfrom +# who the email would come from +# example: mailfrom = 'dansguardian@mycompany.com' +#!! Not compiled !!mailfrom = '' + +# avadmin +# who the virus emails go to (if notify av is on) +# example: avadmin = 'admin@mycompany.com' +#!! Not compiled !!avadmin = '' + +# contentdmin +# who the content emails go to (when thresholds are exceeded) +# and contentnotify is on +# example: contentadmin = 'admin@mycompany.com' +#!! Not compiled !!contentadmin = '' + +# avsubject +# Subject of the email sent when a virus is caught. +# only applicable if notifyav is on +# default avsubject = 'dansguardian virus block' +#!! Not compiled !!avsubject = 'dansguardian virus block' + +# content +# Subject of the email sent when violation thresholds are exceeded +# default contentsubject = 'dansguardian violation' +#!! Not compiled !!contentsubject = 'dansguardian violation' + +# notifyAV +# This will send a notification, if usesmtp/notifyav is on, any time an +# infection is found. +# Important: If this option is off, viruses will still be recorded like a +# content infraction. +#!! Not compiled !!notifyav = off + +# notifycontent +# This will send a notification, if usesmtp is on, based on thresholds +# below +#!! Not compiled !!notifycontent = off + +# thresholdbyuser +# results are only predictable with user authenticated configs +# if enabled the violation/threshold count is kept track of by the user +#!! Not compiled !!thresholdbyuser = off + +#violations +# number of violations before notification +# setting to 0 will never trigger a notification +#!! Not compiled !!violations = 0 + +#threshold +# this is in seconds. If 'violations' occur in 'threshold' seconds, then +# a notification is made. +# if this is set to 0, then whenever the set number of violations are made a +# notifaction will be sent. +#!! Not compiled !!threshold = 0 + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf1-filtre1.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf1-filtre1.conf new file mode 100644 index 0000000000000000000000000000000000000000..9462fc7f7e6f68e0d6063dddbe1bfa7c3c54b7b5 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf1-filtre1.conf @@ -0,0 +1,2 @@ +%set global %%nomzone = 0 +%include "/var/lib/creole/guardianf1.conf" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf1-filtre2.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf1-filtre2.conf new file mode 100644 index 0000000000000000000000000000000000000000..0de55c91244151932f5f8c81082e5d7601c19e46 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf1-filtre2.conf @@ -0,0 +1,2 @@ +%set global %%nomzone = 1 +%include "/var/lib/creole/guardianf1.conf" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf1-filtre3.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf1-filtre3.conf new file mode 100644 index 0000000000000000000000000000000000000000..f1730596c80f6cfe10d6cb697d7a70284c8332c6 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf1-filtre3.conf @@ -0,0 +1,2 @@ +%set global %%nomzone = 2 +%include "/var/lib/creole/guardianf1.conf" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf1.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf1.conf new file mode 100644 index 0000000000000000000000000000000000000000..54e7730ae8486be444fb1a33ea1ea7fd28ed7803 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf1.conf @@ -0,0 +1,3 @@ +%set global %%listsf = '1' +%set global %%groupname = 'politiquedefaut' +%include "/var/lib/creole/guardianfX.conf" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf2-filtre1.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf2-filtre1.conf new file mode 100644 index 0000000000000000000000000000000000000000..d73a781222c36100cea6b4e7a09b8c040e1e3eb2 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf2-filtre1.conf @@ -0,0 +1,2 @@ +%set global %%nomzone = 0 +%include "/var/lib/creole/guardianf2.conf" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf2-filtre2.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf2-filtre2.conf new file mode 100644 index 0000000000000000000000000000000000000000..6c6e7cf465d82ad810050582a3311190f121c733 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf2-filtre2.conf @@ -0,0 +1,2 @@ +%set global %%nomzone = 1 +%include "/var/lib/creole/guardianf2.conf" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf2-filtre3.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf2-filtre3.conf new file mode 100644 index 0000000000000000000000000000000000000000..3b7511802f2b9e5d59e4367d16d20f341145bf21 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf2-filtre3.conf @@ -0,0 +1,2 @@ +%set global %%nomzone = 2 +%include "/var/lib/creole/guardianf2.conf" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf2.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf2.conf new file mode 100644 index 0000000000000000000000000000000000000000..2d575b91f9ab382182f053f4f770b08e9da0bf85 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf2.conf @@ -0,0 +1,9 @@ +# GROUPE 2 : Utilisateurs spéciaux (moderateurs) +%set global %%groupmode = '1' +%set global %%groupname = 'groupmoderateurs' +%set global %%contentfiltering = 'oui' +%set global %%bypass = '30' +%set global %%htmltemplate = 'template-moderateur.html' +%set global %%listsf = '1' +%set global %%add_list = '' +%include "/var/lib/creole/guardianf.conf" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf3-filtre1.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf3-filtre1.conf new file mode 100644 index 0000000000000000000000000000000000000000..0f3a8e6604f74229a8e12b614a412678cdfe8a69 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf3-filtre1.conf @@ -0,0 +1,2 @@ +%set global %%nomzone = 0 +%include "/var/lib/creole/guardianf3.conf" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf3-filtre2.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf3-filtre2.conf new file mode 100644 index 0000000000000000000000000000000000000000..0b414af3037eb5af3c8bda46f14fdde0b1bc2b6a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf3-filtre2.conf @@ -0,0 +1,2 @@ +%set global %%nomzone = 1 +%include "/var/lib/creole/guardianf3.conf" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf3-filtre3.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf3-filtre3.conf new file mode 100644 index 0000000000000000000000000000000000000000..d92e5fcd754c118a8cf8c7efed8040a280f337f8 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf3-filtre3.conf @@ -0,0 +1,2 @@ +%set global %%nomzone = 2 +%include "/var/lib/creole/guardianf3.conf" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf3.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf3.conf new file mode 100644 index 0000000000000000000000000000000000000000..cced30ca79f4e42a323f22bc43df8a103e8147cb --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf3.conf @@ -0,0 +1,9 @@ +# GROUPE 3 : Utilisateurs Interdits +%set global %%groupmode = '0' +%set global %%groupname = 'groupinterdits' +%set global %%contentfiltering = 'oui' +%set global %%bypass = '0' +%set global %%htmltemplate = 'template-utilisateur_interdits.html' +%set global %%add_list = '' +%set global %%listsf = '3' +%include "/var/lib/creole/guardianf.conf" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf4-filtre1.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf4-filtre1.conf new file mode 100644 index 0000000000000000000000000000000000000000..12167037c4165b064edf37c1b21d9a8b091a0877 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf4-filtre1.conf @@ -0,0 +1,2 @@ +%set global %%nomzone = 0 +%include "/var/lib/creole/guardianf4.conf" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf4-filtre2.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf4-filtre2.conf new file mode 100644 index 0000000000000000000000000000000000000000..7021d185112e8dfd160e1d7246a32d1fdf5fad4f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf4-filtre2.conf @@ -0,0 +1,2 @@ +%set global %%nomzone = 1 +%include "/var/lib/creole/guardianf4.conf" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf4-filtre3.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf4-filtre3.conf new file mode 100644 index 0000000000000000000000000000000000000000..816f4162334b09a52b040cb9ee9c6e9835953e47 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf4-filtre3.conf @@ -0,0 +1,2 @@ +%set global %%nomzone = 2 +%include "/var/lib/creole/guardianf4.conf" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf4.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf4.conf new file mode 100644 index 0000000000000000000000000000000000000000..c0ac32dc06a4cab15e221c852a7a1811b05b34d8 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf4.conf @@ -0,0 +1,9 @@ +# GROUPE 4 : Utilisateurs mode Liste Blanche +%set global %%groupmode = '1' +%set global %%groupname = 'grouplisteblanche' +%set global %%contentfiltering = 'oui' +%set global %%bypass = '0' +%set global %%htmltemplate = 'template-liste_blanche.html' +%set global %%listsf = '4' +%set global %%add_list = '_liste_blanche' +%include "/var/lib/creole/guardianf.conf" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf5-filtre1.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf5-filtre1.conf new file mode 100644 index 0000000000000000000000000000000000000000..70f155b13914508e38a83639866a665815aee227 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf5-filtre1.conf @@ -0,0 +1,2 @@ +%set global %%nomzone = 0 +%include "/var/lib/creole/guardianf5.conf" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf5-filtre2.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf5-filtre2.conf new file mode 100644 index 0000000000000000000000000000000000000000..037ea8d21e2983ecbdd016599223cbd180263e9e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf5-filtre2.conf @@ -0,0 +1,2 @@ +%set global %%nomzone = 1 +%include "/var/lib/creole/guardianf5.conf" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf5-filtre3.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf5-filtre3.conf new file mode 100644 index 0000000000000000000000000000000000000000..e3de2ac102db0b77e5170b3769160e9a266f8d73 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf5-filtre3.conf @@ -0,0 +1,2 @@ +%set global %%nomzone = 2 +%include "/var/lib/creole/guardianf5.conf" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf5.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf5.conf new file mode 100644 index 0000000000000000000000000000000000000000..eccfeb8651670662474d647e5a6fbbc28b370c79 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf5.conf @@ -0,0 +1,3 @@ +%set global %%listsf = '5' +%set global %%groupname = 'politique1' +%include "/var/lib/creole/guardianfX.conf" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf6-filtre1.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf6-filtre1.conf new file mode 100644 index 0000000000000000000000000000000000000000..fb533bbb9382d6cf5292c769a8bede05ccb01655 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf6-filtre1.conf @@ -0,0 +1,2 @@ +%set global %%nomzone = 0 +%include "/var/lib/creole/guardianf6.conf" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf6-filtre2.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf6-filtre2.conf new file mode 100644 index 0000000000000000000000000000000000000000..70d4a257d53a0ff00fffd079a1351323052f8396 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf6-filtre2.conf @@ -0,0 +1,2 @@ +%set global %%nomzone = 1 +%include "/var/lib/creole/guardianf6.conf" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf6-filtre3.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf6-filtre3.conf new file mode 100644 index 0000000000000000000000000000000000000000..d208a559b7569b038b3e7749d20d061a1278746f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf6-filtre3.conf @@ -0,0 +1,2 @@ +%set global %%nomzone = 2 +%include "/var/lib/creole/guardianf6.conf" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf6.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf6.conf new file mode 100644 index 0000000000000000000000000000000000000000..9b71af05c816bd3c5724bb4b4dded4494cbe84df --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf6.conf @@ -0,0 +1,3 @@ +%set global %%listsf = '6' +%set global %%groupname = 'politique2' +%include "/var/lib/creole/guardianfX.conf" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf7-filtre1.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf7-filtre1.conf new file mode 100644 index 0000000000000000000000000000000000000000..3977c58226796d75a620ac68f84ea2db6bf98bcd --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf7-filtre1.conf @@ -0,0 +1,2 @@ +%set global %%nomzone = 0 +%include "/var/lib/creole/guardianf7.conf" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf7-filtre2.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf7-filtre2.conf new file mode 100644 index 0000000000000000000000000000000000000000..45bce405c21a9fecac0bc54b4b58de3dc4b41f61 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf7-filtre2.conf @@ -0,0 +1,2 @@ +%set global %%nomzone = 1 +%include "/var/lib/creole/guardianf7.conf" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf7-filtre3.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf7-filtre3.conf new file mode 100644 index 0000000000000000000000000000000000000000..f2d3327b61126b8b8d1e0169b75ebb60d74b08b8 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf7-filtre3.conf @@ -0,0 +1,2 @@ +%set global %%nomzone = 2 +%include "/var/lib/creole/guardianf7.conf" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf7.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf7.conf new file mode 100644 index 0000000000000000000000000000000000000000..e5da3db7e7869301d8fed2dc01ef271b64a9b63f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf7.conf @@ -0,0 +1,3 @@ +%set global %%listsf = '7' +%set global %%groupname = 'politique3' +%include "/var/lib/creole/guardianfX.conf" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf8-filtre1.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf8-filtre1.conf new file mode 100644 index 0000000000000000000000000000000000000000..71417721953844f4caa68c3b6c3a75f5d212fa12 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf8-filtre1.conf @@ -0,0 +1,2 @@ +%set global %%nomzone = 0 +%include "/var/lib/creole/guardianf8.conf" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf8-filtre2.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf8-filtre2.conf new file mode 100644 index 0000000000000000000000000000000000000000..549b24be3d5105917193019182c0fcb2922a0b9a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf8-filtre2.conf @@ -0,0 +1,2 @@ +%set global %%nomzone = 1 +%include "/var/lib/creole/guardianf8.conf" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf8-filtre3.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf8-filtre3.conf new file mode 100644 index 0000000000000000000000000000000000000000..b50b9673b8b3c39bab7318ae2ad71b82ddb32732 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf8-filtre3.conf @@ -0,0 +1,2 @@ +%set global %%nomzone = 2 +%include "/var/lib/creole/guardianf8.conf" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf8.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf8.conf new file mode 100644 index 0000000000000000000000000000000000000000..1da52c39b2f49cdde10d32667526f88efab4f504 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianf8.conf @@ -0,0 +1,3 @@ +%set global %%listsf = '8' +%set global %%groupname = 'politique4' +%include "/var/lib/creole/guardianfX.conf" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianfX.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianfX.conf new file mode 100644 index 0000000000000000000000000000000000000000..3d7b3337d860313b02900368f0bf93441eb86a44 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/guardianfX.conf @@ -0,0 +1,6 @@ +%set global %%groupmode = "1" +%set global %%contentfiltering = 'oui' +%set global %%bypass = '0' +%set global %%htmltemplate = 'non' +%set global %%add_list = '' +%include "/var/lib/creole/guardianf.conf" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/krb5.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/krb5.conf new file mode 100644 index 0000000000000000000000000000000000000000..c0110fec1e7fccf6e22f81bb5ef9dabbd14cb1eb --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/krb5.conf @@ -0,0 +1,4 @@ +[libdefaults] + default_realm = %%nom_domaine_krb.upper() + dns_lookup_realm = true + dns_lookup_kdc = true diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/lightsquid.cfg b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/lightsquid.cfg new file mode 100644 index 0000000000000000000000000000000000000000..0b1b76f8486e3a14ec0273aaad5cb0693368f085 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/lightsquid.cfg @@ -0,0 +1,181 @@ +%set %%anonuser = {'aucune':'', 'par IP':'-', 'anonyme':'anonyme'} +#!/usr/bin/perl +# +# LightSquid Project (c) 2004-2008 Sergey Erokhin aka ESL +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# detail see in gnugpl.txt + +# -------------------- GLOBAL VARIABLES --------------------------- + +#path to additional `cfg` files +$cfgpath ="/var/www/html/lightsquid"; +#path to `tpl` folder +$tplpath ="/var/www/html/lightsquid/tpl"; +#path to `lang` folder +$langpath ="/var/www/html/lightsquid/lang"; +#path to `report` folder +$reportpath ="/var/log/lightsquid/reports/"; +#path to access.log +$logpath ="/var/tmp"; +# name of the squid log file +$logfilename ="squid.log"; +#path to `ip2name` folder +$ip2namepath ="/var/www/html/lightsquid/ip2name"; + +#path to `lockfile` ;-) +$lockpath =$reportpath; + +#if lockfile older $maxlocktime second, remove old lock file. +$maxlocktime = 30*60; + +#if 1 - lightparser generate some statistic +$debug = 0; +#if 1 - lightparser generate skip details, 2 ..., 3 ..., .... +$debug2 = 0; + +# -------------------- LightParser VARIABLES --------------------------- +#squid log type +#if native squid format (default squid, see in doc) - must be 0 +#if EmulateHttpdLog ON - set 1 +#digit - for speed optimization +#try it set to 1 if parser generate warning +# +#see also month2dec below !!!! +# +$squidlogtype = 0; + +#if you want skip some sites from stat, example our local www server +#WARNING !!!, don't leave this variable empty !!! +#example, if you want skip LOCAL site, put it here +#WARNING2 +#use '' instead of "" !!!!!!!!!!! + +#$skipurl = 'zdd\.com|192\.168\.1\.|cnn\.com'; +$skipurl = 'zzz\.zzz'; + +#define sobroutine file for convertion from IP into name +#if you want skip some ip from log - return "SKIP THIS IP" ;-) +#detail see in ip2name folder, + +$ip2name="simple"; + +#use for convert from Text to Dec convertion if EmualteHttpdLog format !!!! +#fix it if need +%month2dec = ( Jan => 1, Feb => 2, Mar => 3, Apr => 4, May => 5,Jun => 6, + Jul => 7, Aug => 8, Sep => 9, Oct => 10, Nov => 11,Dec => 12); + +#if you want anonymous log (without user names) +$anonuser = '%%anonuser[%%lightsquid_anon_mode]'; + +# -------------------- Common (Parser & Web) VARIABLES ---------------------- +#create & use time report statistic (logsize = logsize*2) ;-)) +$timereport = 1; + +# -------------------- WEB VARIABLES ---------------------------------------- + +#language +#see `lang` folder (avaible: bg,eng,fr,hu,it,pt_br,ru,sp) +$lang ="fr"; + +#html template name +#see template folder `tpl/$templatename/` +$templatename ="base"; +#$templatename ="ric"; +#$templatename ="base.css"; + +#define type of decimal output +#fine 123456789 -> 123,456,789 +#class 123456789 -> 117.7 G +$DecOutType="class"; + +# define delimiter for thousands (in `fine` mode) +# = " " -> 12 345 678 +# = "," -> 12,345,678 +# = "" -> 12345678 +$decdelimiter = " "; + +#if you dont need Group mode, do =0 +$showgrouplink = 1; + +#if not zero, groups look like "01. Group1", if zero - "Group1" +$showgroupid = 1; + +#if you dont need oversize report , do =0 +$showoversizelink = 1; + +#show how many data user send to internet +$showputpost = 0; +#if putpost higer this variable (in percent), highlight it +$putpostwarninglevel =15; + +#use or not .realname files +#.realname contain pair userid -> Full User Name +$userealname = 1; + +#if url size exceed $bigfilelimit - add this file into report +$bigfilelimit = 2*1024*1024; + +#user maximum size per day limit (oversize) +$perusertrafficlimit = 10*1024*1024; + +# weekend display mode +# both - select sunday & monday +# monday - only monday +$weekendmode="both"; + +#how many site show in TopSites report +$topsiteslimit = 500; + +#how many site show in user time report +$usertimelimit = 200; + + +#if you want user traffic GRAPHIC report, set it in 1 +#WARNING !!!, need libgd, GD.PM & other external modules !!! +#please run check-setup.pl for check library !!!! +$graphreport = 1; + +#higest value on graph report +# for user month report (0.05*(...) = 50mb) +$graphmaxuser=0.05*(1024*1024*1024); +# for all user month report (1.05*(...) = 1 Gb) +$graphmaxall =0.80*(1024*1024*1024); + +#color scheme for GRAPHICs, avaible "orange","blue","green","yellow","brown","red" +$barcolor="orange"; + + +#-------------------------------------------------------------------------- Group support +# + +sub CreateGroupFile($) { + my $path=shift; + + open Fi,"<$cfgpath/group.cfg"; + open Fo,">$path/.group"; + while (<Fi>) { + print Fo $_; + } + close Fo; + close Fi; +} + +#-------------------------------------------------------------------------- RealName support +# + +sub CreateRealnameFile($) { + my $path=shift; + + open Fi,"<$cfgpath/realname.cfg"; + open Fo,">$path/.realname"; + while (<Fi>) { + print Fo $_; + } + close Fo; + close Fi; +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/lmhosts b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/lmhosts new file mode 100644 index 0000000000000000000000000000000000000000..7245d22a86e8ad940490745bc319a6f6e156457d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/lmhosts @@ -0,0 +1,28 @@ +# +# Sample Samba lmhosts file. +# + +127.0.0.1 LOCALHOST +%if %%nombre_interfaces >= "2" +%if %%adresse_ip_eth0 != "" +%%adresse_ip_eth0 AMON +%end if +%end if +%if %%nombre_interfaces >= "3" +%if %%adresse_ip_eth1 != "" +%%adresse_ip_eth1 AMON +%end if +%end if +%if %%nombre_interfaces >= "4" +%if %%adresse_ip_eth2 != "" +%%adresse_ip_eth2 AMON +%end if +%end if +%if %%nombre_interfaces >= "5" +%if %%adresse_ip_eth3 != "" +%%adresse_ip_eth3 AMON +%end if +%end if +%if %%ip_serveur_krb != "" +%%ip_serveur_krb %%upper(%%nom_serveur_krb) +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/nsswitch-proxy_auth.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/nsswitch-proxy_auth.conf new file mode 100644 index 0000000000000000000000000000000000000000..88b1365eb3cb01c6bc25609e49c07f5a990e0ee1 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/nsswitch-proxy_auth.conf @@ -0,0 +1,22 @@ +# /etc/nsswitch.conf +# +# configuration spécifique au proxy authentifié + +passwd: compat +group: compat +shadow: compat +gshadow: files + +hosts: files dns %slurp +%if %%getVar('type_squid_auth', '') == 'NTLM/SMB' +wins +%end if + +networks: files + +protocols: db files +services: db files +ethers: db files +rpc: db files + +netgroup: nis diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/perm_proxy.ini b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/perm_proxy.ini new file mode 100644 index 0000000000000000000000000000000000000000..1cb366cf4eea34bf95c428d2e554477a31541f3b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/perm_proxy.ini @@ -0,0 +1,77 @@ +[roles] +admin=Administrateur +admin_pedago=Administrateur du reseau peda +admin_amon=Administrateur de l'Amon + +[permissions] +#general +rapport_blacklist=admin,admin_amon +signalement=admin,admin_pedago +squid_sitelist=admin +squid_srclist=admin +lightsquid=admin + +%if %%activer_filtrage_proxy == 'oui' + %if %%dans_instance_1_active == 'oui' +#admin +groupe_machine_admin=admin,admin_amon +groupe_machine_create_admin=admin,admin_amon +groupe_machine_horaire_admin=admin,admin_amon +opt_filters_admin=admin +filtrage_admin=admin +sites_interdits_admin=admin +sites_autorises_admin=admin +extensions_admin=admin +mime_admin=admin +user_admin=admin +navigation_whitesitelist_admin=admin +navigation_poste_admin=admin +navigation_destination_admin=admin + %if %%dansguardian_ead_log != 'non' +navigation_visit_admin=admin + %end if + %end if + + %if %%dans_instance_2_active == 'oui' +#pedago +groupe_machine_pedago=admin,admin_pedago +groupe_machine_create_pedago=admin,admin_pedago +groupe_machine_horaire_pedago=admin,admin_pedago +opt_filters_pedago=admin,admin_pedago +filtrage_pedago=admin,admin_pedago +sites_interdits_pedago=admin,admin_pedago +sites_autorises_pedago=admin,admin_pedago +extensions_pedago=admin,admin_pedago +mime_pedago=admin,admin_pedago +user_pedago=admin,admin_pedago +navigation_whitesitelist_pedago=admin,admin_pedago +navigation_poste_pedago=admin,admin_pedago +navigation_destination_pedago=admin,admin_pedago + %if %%dansguardian_ead_log == 'oui' +navigation_visit_pedago=admin,admin_pedago + %else if %%dansguardian_ead_log != 'non' +navigation_visit_pedago=admin + %end if + %end if + + %if %%dans_instance_3_active == 'oui' +#filtre web3 +#groupe_machine_web3=admin,admin_amon +#groupe_machine_create_web3=admin,admin_amon +#groupe_machine_horaire_web3=admin,admin_amon +opt_filters_web3=admin +filtrage_web3=admin +sites_interdits_web3=admin +sites_autorises_web3=admin +extensions_web3=admin +mime_web3=admin +user_web3=admin +navigation_whitesitelist_web3=admin +#navigation_poste_web3=admin +#navigation_destination_web3=admin + %if %%dansguardian_ead_log != 'non' +navigation_visit_web3=admin + %end if + %end if + +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/rsyslog_aggregation_dansguardian.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/rsyslog_aggregation_dansguardian.conf new file mode 100644 index 0000000000000000000000000000000000000000..a453fe782dd9afe5b3b6905a4b67a2942a02b6b0 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/rsyslog_aggregation_dansguardian.conf @@ -0,0 +1,26 @@ +%if %%activer_log_distant == 'oui' and %%activer_envoi_logs == 'oui' and %%envoyer_tous_logs == 'non' and %%envoyer_logs_dansguardian == 'oui' + +$WorkDirectory /var/log/rsyslog/queues +$ActionQueueType LinkedList + %if %%activate_dansguardian_realtime == 'non' and %%dansguardian_heure_debut != '' and %%dansguardian_heure_fin != '' +$ActionQueueSize 10000 +$ActionQueueDequeueTimeBegin %%dansguardian_heure_debut +$ActionQueueDequeueTimeEnd %%dansguardian_heure_fin + %end if +$ActionQueueFileName e2guardian +$ActionQueueSaveOnShutdown on + + %if %%rsyslog_envoi_tls == 'oui' +$ActionSendStreamDriverAuthMode x509/name +$IncludeConfig /etc/rsyslog.d/outgoing_peers/*.peers +$ActionSendStreamDriverMode 1 +:programname, contains, "e2guardian" @@%%adresse_ip_serveur_logs:10514 + %else +:programname, contains, "e2guardian" :omrelp:%%adresse_ip_serveur_logs:20514 + + %end if + +%else +# L'envoi des journaux de e2guardian n'est pas configuré de manière spécifique. +%end if + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/rsyslog_aggregation_squid.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/rsyslog_aggregation_squid.conf new file mode 100644 index 0000000000000000000000000000000000000000..73704ae2f2376a1bb27bc849ba16fb785604af7a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/rsyslog_aggregation_squid.conf @@ -0,0 +1,26 @@ +%if %%activer_log_distant == 'oui' and %%activer_envoi_logs == 'oui' and %%envoyer_tous_logs == 'non' and %%envoyer_logs_squid == 'oui' + +$WorkDirectory /var/log/rsyslog/queues +$ActionQueueType LinkedList + %if %%activate_squid_realtime == 'non' and %%squid_heure_debut != '' and %%squid_heure_fin != '' +$ActionQueueSize 10000 +$ActionQueueDequeueTimeBegin %%squid_heure_debut +$ActionQueueDequeueTimeEnd %%squid_heure_fin + %end if +$ActionQueueFileName squid +$ActionQueueSaveOnShutdown on + + %if %%rsyslog_envoi_tls == 'oui' +$ActionSendStreamDriverAuthMode x509/name +$IncludeConfig /etc/rsyslog.d/outgoing_peers/*.peers +$ActionSendStreamDriverMode 1 +:programname, contains, "squid" @@%%adresse_ip_serveur_logs:10514 + %else +:programname, contains, "squid" :omrelp:%%adresse_ip_serveur_logs:20514 + + %end if + +%else +# L'envoi des journaux de squid n'est pas configuré de manière spécifique. +%end if + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/rsyslog_traps_dansguardian.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/rsyslog_traps_dansguardian.conf new file mode 100644 index 0000000000000000000000000000000000000000..ecae64bde36715cc5910ae433432c539f130f9d2 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/rsyslog_traps_dansguardian.conf @@ -0,0 +1,23 @@ +# Templates for local and remote logging +$template DynLocalGuardian, "/var/log/rsyslog/local/e2guardian/%programname%.%syslogseverity-text%.log" +$template DynRemoteGuardian, "/var/log/rsyslog/remote/%fromhost%/e2guardian/%programname%.%syslogseverity-text%.log" + +%if %%activer_log_distant == 'oui' and %%activer_reception_logs == 'non' +# all messages go in local branch +:programname, startswith, "e2guardian" ?DynLocalGuardian +& ~ +%else +# all messages from localhost go in local branch +if $programname startswith 'e2guardian' and $fromhost-ip startswith '127' then ?DynLocalGuardian +& ~ +%if %%mode_conteneur_actif == 'oui' +# all messages from containers go in local branch +if $programname startswith 'e2guardian' and $fromhost-ip startswith '%%adresse_ip_br0[:-2]' then ?DynLocalGuardian +& ~ +if $programname startswith 'e2guardian' and $fromhost startswith '%%adresse_ip_br0[:-2]' then ?DynLocalGuardian +& ~ +%end if +# all remaining messages go in remote branch +:programname, startswith, "e2guardian" ?DynRemoteGuardian +& ~ +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/rsyslog_traps_squid.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/rsyslog_traps_squid.conf new file mode 100644 index 0000000000000000000000000000000000000000..8d2f39b5d9c0c955f6d5c99723a88c2d723c5bd5 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/rsyslog_traps_squid.conf @@ -0,0 +1,23 @@ +# Templates for local and remote logging +$template DynLocalSquid, "/var/log/rsyslog/local/squid/squid%syslogfacility-text:6:$:%.%syslogseverity-text%.log" +$template DynRemoteSquid, "/var/log/rsyslog/remote/%fromhost%/squid/squid%syslogfacility:6:$:%.%syslogseverity-text%.log" + +%if %%activer_log_distant == 'oui' and %%activer_reception_logs == 'non' +# all messages go in local branch +:programname, contains, "squid" ?DynLocalSquid +& ~ +%else +# all messages from localhost go in local branch +if $programname contains 'squid' and $fromhost-ip startswith '127' then ?DynLocalSquid +& ~ +%if %%mode_conteneur_actif == 'oui' +# all messages from containers go in local branch +if $programname contains 'squid' and $fromhost-ip startswith '%%adresse_ip_br0[:-2]' then ?DynLocalSquid +& ~ +if $programname contains 'squid' and $fromhost startswith '%%adresse_ip_br0[:-2]' then ?DynLocalSquid +& ~ +%end if +# all remaining messages go in remote branch +:programname, contains, "squid" ?DynRemoteSquid +& ~ +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/smb-proxy_auth.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/smb-proxy_auth.conf new file mode 100644 index 0000000000000000000000000000000000000000..50e7be207aefc18d720173ca70bf13b47928d017 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/smb-proxy_auth.conf @@ -0,0 +1,37 @@ +[global] +# oblige samba d’encrypter les échanges avec mot de passe crypté + encrypt passwords = true +# Nom NetBios de la machine serveur squid + netbios name = %%nom_machine + server string = %h server (Samba %v) +# Amon n'a pas vocation à être contrôleur principal d'un domaine + local master = no + domain master = no + preferred master = no + os level = 0 +# La plage uid/ gid pour le mappage des comptes windows + winbind uid = 10000-20000 + winbind gid = 10000-20000 + winbind use default domain = yes + +%if %%type_squid_auth == 'NTLM/SMB' + workgroup = %%upper(%%nom_domaine_smb) + wins server = 10.1.3.5 + password server = scribe + security = domain + +%else if %%type_squid_auth == 'NTLM/KERBEROS' +# Le groupe de travail + workgroup = %%upper(%%nom_domaine_windows) + # Le nom de domaine AD + realm = %%upper(%%nom_domaine_krb) +# Le niveau de sécurité pour l’accès à l’Active Directory + security = ADS + #winbind separator = \ +# Directives qui permettent d’énumérer les comptes avec la commande wbinfo + winbind enum users = yes + winbind enum groups = yes + allow trusted domains = yes + # Le serveur sur lequel le domaine est hébergé + password server = %%lower(%%nom_serveur_krb+"."+%%nom_domaine_krb) +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/squid.logrotate b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/squid.logrotate new file mode 100644 index 0000000000000000000000000000000000000000..0ddbc710aeafd5fd51b75dcd53f49915cbaf6a62 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/squid.logrotate @@ -0,0 +1,33 @@ +/var/log/rsyslog/local/squid/squid[0-9].info.log { + daily + rotate 366 + compress + compresscmd /usr/bin/lzma + compressoptions -4 + compressext .lzma + dateext + notifempty + missingok + postrotate + service rsyslog rotate > /dev/null + %if %%getVar('lightsquid_auto', 'non') == 'oui' + /usr/share/eole/sbin/squid_parselogs.sh --yesterday + %end if + %if %%is_defined('lightsquid_auto') + find /var/log/lightsquid/reports/ -mindepth 1 -type d -mtime +366 -prune -exec rm -rf '{}' \; + %end if + endscript +} + +/var/log/rsyslog/local/squid/squid[0-9].[!i]*.log + { + weekly + rotate 10 + compress + notifempty + missingok + postrotate + /usr/share/eole/sbin/squid_logrotate.sh + endscript +} + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/squid.pam b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/squid.pam new file mode 100644 index 0000000000000000000000000000000000000000..eb6a9135c4d5e655b5c5414ef77d354626e54938 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/squid.pam @@ -0,0 +1,6 @@ +#%PAM-1.0 +auth sufficient pam_ldap.so +auth sufficient pam_smb_auth.so nolocal +#account sufficient pam_ldap.so +account sufficient pam_permit.so + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/winbind.logrotate b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/winbind.logrotate new file mode 100644 index 0000000000000000000000000000000000000000..745ce1d5c1b0203f424fcbbbeda663b329f2fb7c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-proxy/templates/winbind.logrotate @@ -0,0 +1,16 @@ +/var/log/samba/log.winbindd* /var/log/samba/log.wb* { + weekly + missingok + rotate 7 + postrotate +%if %%getVar('activer_squid_auth', 'non') == 'oui' + %if %%getVar('type_squid_auth') in ['NTLM/KERBEROS', 'NTLM/SMB'] + ! /usr/bin/wbinfo -t > /dev/null 2>&1 || [ ! -f /var/run/samba/winbindd.pid ] || kill -HUP `cat /var/run/samba/winbindd.pid` + %else + [ ! -f /var/run/samba/winbindd.pid ] || kill -HUP `cat /var/run/samba/winbindd.pid` + %end if +%end if + endscript + compress + notifempty +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-radius/dictionaries/00_eole-radius_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-radius/dictionaries/00_eole-radius_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..fd66da0703f4c941882a70bbdb714a7d7948c5b4 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-radius/dictionaries/00_eole-radius_packages.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>eole-radius-pkg</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-radius/dictionaries/26_freeradius.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-radius/dictionaries/26_freeradius.xml new file mode 100644 index 0000000000000000000000000000000000000000..5930067e0e2863b38bac55adba0a7b029f5a9b59 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-radius/dictionaries/26_freeradius.xml @@ -0,0 +1,113 @@ +<?xml version='1.0' encoding='utf-8'?> + +<creole> + <files> + <service servicelist='freeradius'>freeradius</service> + <file name='/etc/logrotate.d/freeradius' source='freeradius.logrotate'/> + <file filelist='freeradius' mode='640' owner='freerad' group='freerad' name='/etc/freeradius/3.0/radiusd.conf'/> + <file filelist='freeradius' mode='640' owner='freerad' group='freerad' name='/etc/freeradius/3.0/clients.conf' source='freerad-clients.conf'/> + <file filelist='freeradius' mode='640' owner='freerad' group='freerad' name='/etc/freeradius/3.0/mods-available/eap' source='freerad-eap'/> + <file filelist='freeradius' mode='640' owner='freerad' group='freerad' name='/etc/freeradius/3.0/mods-available/ldap' source='freerad-ldap'/> + <file filelist='freeradius' mode='640' owner='freerad' group='freerad' name='/etc/freeradius/3.0/mods-available/mschap' source='freerad-mschap'/> + <file filelist='freeradius' mode='640' owner='freerad' group='freerad' name='/etc/freeradius/3.0/mods-config/files/authorize' source='freerad-authorize'/> + <file filelist='freeradius' mode='640' owner='freerad' group='freerad' name='/etc/freeradius/3.0/mods-config/preprocess/huntgroups' source='freerad-huntgroups'/> + <file filelist='freeradius' mode='640' owner='freerad' group='freerad' name='/etc/freeradius/3.0/sites-available/default' source='freerad-default'/> + <file filelist='freeradius' mode='640' owner='freerad' group='freerad' name='/etc/freeradius/3.0/sites-available/inner-tunnel' source='freerad-inner-tunnel'/> + </files> + <variables> + <family name='authentification'> + <variable name='activer_freeradius' type='oui/non' description='Activer le service FreeRADIUS'> + <value>non</value> + </variable> + </family> + <family name='freeradius' icon='bullseye'> + <variable name='activer_proxy_radius' type='oui/non' description="Activer le proxy radius"> + <value>non</value> + </variable> + <variable name='ttls_copy_request_to_tunnel' type='oui/non' mode='expert' description="Copier les attributs dans la requête d'authentification du tunnel pour le protocole TTLS"> + <value>oui</value> + </variable> + <variable name='ttls_use_tunneled_reply' type='oui/non' mode='expert' description="Répondre dans la requête de tunnel pour le protocole TTLS"> + <value>oui</value> + </variable> + <variable name='freerad_mode' type='string' description="Mode d'utilisation de FreeRADIUS" mandatory='True'> + <value>802.1x</value> + </variable> + <variable name='freerad_listen_int' type='string' description="Numéro de l'interface sur laquelle FreeRADIUS écoutera" mandatory='True' /> + <variable name='freerad_listen_addr' type='ip' description='Adresse IP sur laquelle FreeRADIUS écoutera' mandatory='True' /> + <variable name='freerad_nas_ip' type='ip' description="Adresse IP du serveur d'accès (NAS)" multi='True' mandatory='True'/> + <variable name='freerad_nas_cidr_netmask' type='number' description="Masque de sous réseau (notation CIDR) du serveur d'accès (NAS)" mandatory='True'/> + <variable name='freerad_nas_name' type='string' description="Nom court du serveur d'accès (NAS)" mandatory='True'/> + <variable name='freerad_nas_passwd' type='password' description="Secret partagé avec le serveur d'accès (NAS)" mandatory='True'/> + <variable name='freerad_nas_type' type='string' description="Type du serveur d'accès (NAS)" mandatory='True'> + <value>other</value> + </variable> + <variable name='freerad_ldap_ip' type='ip' description='Adresse IP du serveur LDAP permettant de récupérer les comptes utilisateurs' mandatory='True'/> + <variable name='freerad_ldap_base_dn' type='string' description="Suffixe racine de l'annuaire LDAP (base DN)" mandatory='True'> + <value>o=gouv,c=fr</value> + </variable> + <variable name='freerad_cle_ldap_scribe' type='password' description="Clé d'accès reader à la base LDAP sur Scribe (/root/.reader)" mandatory='True'/> + <variable name='freerad_ldap_group' type='unix_user' description="Groupe d'utilisateurs à récupérer dans l'annuaire LDAP" multi='True' mandatory='True'/> + <variable name='freerad_group_vlan' type='number' description="Numéro de VLAN à attribuer à ce groupe" mandatory='True'/> + </family> + <separators> + <separator name='freerad_nas_ip'>Configuration des NAS</separator> + <separator name='freerad_ldap_ip'>Configuration LDAP</separator> + <separator name='freerad_ldap_group'>Configuration des groupes et des VLAN</separator> + </separators> + </variables> + <constraints> + <condition name='disabled_if_in' source='activer_freeradius'> + <param>non</param> + <target type='family'>freeradius</target> + <target type='filelist'>freeradius</target> + <target type='servicelist'>freeradius</target> + </condition> + <condition name='disabled_if_in' source='freerad_mode'> + <param>802.1x</param> + <target type='variable'>freerad_cle_ldap_scribe</target> + <target type='variable'>freerad_listen_addr</target> + <target type='variable'>freerad_nas_cidr_netmask</target> + </condition> + <condition name='disabled_if_in' source='freerad_mode'> + <param>accounting</param> + <target type='variable'>freerad_listen_int</target> + <target type='variable'>freerad_ldap_group</target> + <target type='variable'>freerad_group_vlan</target> + </condition> + + <check name="valid_enum" target='freerad_mode'> + <param>['802.1x','accounting']</param> + </check> + <check name='valid_enum' target="freerad_listen_int"> + <param>['0', '1', '2', '3', '4']</param> + </check> + <check name="valid_enum" target='freerad_nas_type'> + <param>['cisco','computone','livingston','max40xx','multitech','netserver','pathras','patton','portslave','tc','usrhiper','other']</param> + </check> + <check name="valid_enum" target='freerad_ldap_group'> + <param>['eleves','professeurs']</param> + <param name="checkval">False</param> + </check> + <!-- **** Groupes **** --> + <group master='freerad_nas_ip'> + <slave>freerad_nas_cidr_netmask</slave> + <slave>freerad_nas_passwd</slave> + <slave>freerad_nas_name</slave> + <slave>freerad_nas_type</slave> + </group> + <group master='freerad_ldap_group'> + <slave>freerad_group_vlan</slave> + </group> + </constraints> + <help> + <family name='freeradius'>Paramétrage de l'authentification RADIUS</family> + <variable name='activer_freeradius'>RADIUS (Remote Authentication Dial-In User Service) est un protocole client-serveur permettant de centraliser des données d'authentification</variable> + <variable name='activer_proxy_radius'>Permet de transmettre les requêtes du client à d'autres serveurs RADIUS</variable> + <variable name='freerad_mode'>802.1x : mode filaire +accounting : mode wifi</variable> + <variable name='freerad_nas_cidr_netmask'>Masque au format CIDR (255.255.255.0 -> 24)</variable> + </help> +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-radius/files/usr/share/eole/diagnose/151-radius b/seed/release/eole-2.7/2.7.1/applicationservice/eole-radius/files/usr/share/eole/diagnose/151-radius new file mode 100644 index 0000000000000000000000000000000000000000..524f15708b4d99b905fb2d3c6cdc17f9b22275d4 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-radius/files/usr/share/eole/diagnose/151-radius @@ -0,0 +1,8 @@ +#!/bin/bash +if [ "$(CreoleGet activer_freeradius)" == "oui" ] ; then +. /usr/lib/eole/diagnose.sh +EchoGras "*** Service radius" +TestPid "radius" freeradius +echo +fi +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-radius/files/usr/share/zephir/monitor/configs/services/23_freeradius.srv b/seed/release/eole-2.7/2.7.1/applicationservice/eole-radius/files/usr/share/zephir/monitor/configs/services/23_freeradius.srv new file mode 100644 index 0000000000000000000000000000000000000000..e8694f68242349eab011636a27b52363f937b45a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-radius/files/usr/share/zephir/monitor/configs/services/23_freeradius.srv @@ -0,0 +1,12 @@ +# -*- coding: UTF-8 -*- +""" +Surveillance du service Squid +""" + +from zephir.monitor.agentmanager.config import ACTIVER_RADIUS + +if ACTIVER_RADIUS: + from zephir.monitor.agents.services import PIDService + data = {'freeradius' : "Authentification RADIUS"} + AGENTS.append(PIDService('freeradius', data, period=115, + description="Etat du service d'authentification réseau FreeRADIUS")) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-radius/posttemplates/00-freeradius b/seed/release/eole-2.7/2.7.1/applicationservice/eole-radius/posttemplates/00-freeradius new file mode 100644 index 0000000000000000000000000000000000000000..a3edb97caec1b1c0cab5848133639d4a90307fc9 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-radius/posttemplates/00-freeradius @@ -0,0 +1,31 @@ +#!/bin/bash + +################ +## freeradius ## +################ + +if [ "$(CreoleGet activer_freeradius)" = "oui" ] +then + . /usr/lib/eole/utils.sh + + # Install ssl files + user="freerad" + group="freerad" + freeradius_conf_dir="/etc/freeradius/3.0" + InstallSSLFiles freeradius $user $group ${freeradius_conf_dir}/ssl root + if [ ! -f ${freeradius_conf_dir}/ssl/certs/dh ] + then + openssl dhparam -out ${freeradius_conf_dir}/ssl/certs/dh 2048 + fi + + # Enable ldap module + cd /etc/freeradius/3.0/mods-enabled + ldap_mod_name="ldap" + if [ ! -L ${ldap_mod_name} ] + then + ln -s ../mods-available/${ldap_mod_name} + chown -h ${user}:${group} ${ldap_mod_name} + fi +fi + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-radius/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-radius/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..308e3080911c23168deb173b41798233243be08d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-radius/service.yml @@ -0,0 +1,43 @@ +format: '0.1' +name: eole-radius +version: |- + 2.7.0-3 +description: |- + Templates et dictionnaires pour Radius EOLE + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: + - eole-server +packages: + - eole-radius-pkg +dictionaries: + - 26_freeradius.xml +extra_dictionaries: {} +templates: + - freerad-authorize + - freerad-clients.conf + - freerad-default + - freerad-eap + - freerad-huntgroups + - freerad-inner-tunnel + - freerad-ldap + - freerad-mschap + - freeradius.logrotate + - radiusd.conf +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: + - 00-freeradius +files: + /usr/share/eole/diagnose/151-radius: + owner: root + group: root + mode: '0755' + /usr/share/zephir/monitor/configs/services/23_freeradius.srv: + owner: root + group: root + mode: '0644' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-radius/templates/freerad-authorize b/seed/release/eole-2.7/2.7.1/applicationservice/eole-radius/templates/freerad-authorize new file mode 100644 index 0000000000000000000000000000000000000000..fdebbbc3a3ea4ee804ab42afd2e228c8bbbfc279 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-radius/templates/freerad-authorize @@ -0,0 +1,218 @@ +# +# Please read the documentation file ../doc/processing_users_file, +# or 'man 5 users' (after installing the server) for more information. +# +# This file contains authentication security and configuration +# information for each user. Accounting requests are NOT processed +# through this file. Instead, see 'acct_users', in this directory. +# +# The first field is the user's name and can be up to +# 253 characters in length. This is followed (on the same line) with +# the list of authentication requirements for that user. This can +# include password, comm server name, comm server port number, protocol +# type (perhaps set by the "hints" file), and huntgroup name (set by +# the "huntgroups" file). +# +# If you are not sure why a particular reply is being sent by the +# server, then run the server in debugging mode (radiusd -X), and +# you will see which entries in this file are matched. +# +# When an authentication request is received from the comm server, +# these values are tested. Only the first match is used unless the +# "Fall-Through" variable is set to "Yes". +# +# A special user named "DEFAULT" matches on all usernames. +# You can have several DEFAULT entries. All entries are processed +# in the order they appear in this file. The first entry that +# matches the login-request will stop processing unless you use +# the Fall-Through variable. +# +# If you use the database support to turn this file into a .db or .dbm +# file, the DEFAULT entries _have_ to be at the end of this file and +# you can't have multiple entries for one username. +# +# Indented (with the tab character) lines following the first +# line indicate the configuration values to be passed back to +# the comm server to allow the initiation of a user session. +# This can include things like the PPP configuration values +# or the host to log the user onto. +# +# You can include another `users' file with `$INCLUDE users.other' +# + +# +# For a list of RADIUS attributes, and links to their definitions, +# see: +# +# http://www.freeradius.org/rfc/attributes.html +# + +# +# Deny access for a specific user. Note that this entry MUST +# be before any other 'Auth-Type' attribute which results in the user +# being authenticated. +# +# Note that there is NO 'Fall-Through' attribute, so the user will not +# be given any additional resources. +# +#lameuser Auth-Type := Reject +# Reply-Message = "Your account has been disabled." + +# +# Deny access for a group of users. +# +# Note that there is NO 'Fall-Through' attribute, so the user will not +# be given any additional resources. +# +#DEFAULT Group == "disabled", Auth-Type := Reject +# Reply-Message = "Your account has been disabled." +# + +# +# This is a complete entry for "steve". Note that there is no Fall-Through +# entry so that no DEFAULT entry will be used, and the user will NOT +# get any attributes in addition to the ones listed here. +# +#steve Cleartext-Password := "testing" +# Service-Type = Framed-User, +# Framed-Protocol = PPP, +# Framed-IP-Address = 172.16.3.33, +# Framed-IP-Netmask = 255.255.255.0, +# Framed-Routing = Broadcast-Listen, +# Framed-Filter-Id = "std.ppp", +# Framed-MTU = 1500, +# Framed-Compression = Van-Jacobsen-TCP-IP + +# +# This is an entry for a user with a space in their name. +# Note the double quotes surrounding the name. +# +#"John Doe" Cleartext-Password := "hello" +# Reply-Message = "Hello, %{User-Name}" + +# +# Dial user back and telnet to the default host for that port +# +#Deg Cleartext-Password := "ge55ged" +# Service-Type = Callback-Login-User, +# Login-IP-Host = 0.0.0.0, +# Callback-Number = "9,5551212", +# Login-Service = Telnet, +# Login-TCP-Port = Telnet + +# +# Another complete entry. After the user "dialbk" has logged in, the +# connection will be broken and the user will be dialed back after which +# he will get a connection to the host "timeshare1". +# +#dialbk Cleartext-Password := "callme" +# Service-Type = Callback-Login-User, +# Login-IP-Host = timeshare1, +# Login-Service = PortMaster, +# Callback-Number = "9,1-800-555-1212" + +# +# user "swilson" will only get a static IP number if he logs in with +# a framed protocol on a terminal server in Alphen (see the huntgroups file). +# +# Note that by setting "Fall-Through", other attributes will be added from +# the following DEFAULT entries +# +#swilson Service-Type == Framed-User, Huntgroup-Name == "alphen" +# Framed-IP-Address = 192.168.1.65, +# Fall-Through = Yes + +# +# If the user logs in as 'username.shell', then authenticate them +# using the default method, give them shell access, and stop processing +# the rest of the file. +# +#DEFAULT Suffix == ".shell" +# Service-Type = Login-User, +# Login-Service = Telnet, +# Login-IP-Host = your.shell.machine + + +# +# The rest of this file contains the several DEFAULT entries. +# DEFAULT entries match with all login names. +# Note that DEFAULT entries can also Fall-Through (see first entry). +# A name-value pair from a DEFAULT entry will _NEVER_ override +# an already existing name-value pair. +# + +# +# Set up different IP address pools for the terminal servers. +# Note that the "+" behind the IP address means that this is the "base" +# IP address. The Port-Id (S0, S1 etc) will be added to it. +# +#DEFAULT Service-Type == Framed-User, Huntgroup-Name == "alphen" +# Framed-IP-Address = 192.168.1.32+, +# Fall-Through = Yes + +#DEFAULT Service-Type == Framed-User, Huntgroup-Name == "delft" +# Framed-IP-Address = 192.168.2.32+, +# Fall-Through = Yes + +# +# Sample defaults for all framed connections. +# +#DEFAULT Service-Type == Framed-User +# Framed-IP-Address = 255.255.255.254, +# Framed-MTU = 576, +# Service-Type = Framed-User, +# Fall-Through = Yes + +# +# Default for PPP: dynamic IP address, PPP mode, VJ-compression. +# NOTE: we do not use Hint = "PPP", since PPP might also be auto-detected +# by the terminal server in which case there may not be a "P" suffix. +# The terminal server sends "Framed-Protocol = PPP" for auto PPP. +# +%if %%freerad_mode == '802.1x' +#DEFAULT Framed-Protocol == PPP +# Framed-Protocol = PPP, +# Framed-Compression = Van-Jacobson-TCP-IP +%elif %%freerad_mode == 'accounting' +DEFAULT Framed-Protocol == PPP + Framed-Protocol = PPP, + Framed-Compression = Van-Jacobson-TCP-IP +%end if + +# +# Default for CSLIP: dynamic IP address, SLIP mode, VJ-compression. +# +#DEFAULT Hint == "CSLIP" +# Framed-Protocol = SLIP, +# Framed-Compression = Van-Jacobson-TCP-IP + +# +# Default for SLIP: dynamic IP address, SLIP mode. +# +#DEFAULT Hint == "SLIP" +# Framed-Protocol = SLIP + +# +# Last default: rlogin to our main server. +# +#DEFAULT +# Service-Type = Login-User, +# Login-Service = Rlogin, +# Login-IP-Host = shellbox.ispdomain.com + +# # +# # Last default: shell on the local terminal server. +# # +# DEFAULT +# Service-Type = Administrative-User + +%if %%freerad_mode == '802.1x' +%for %%groupes_ldap in %%freerad_ldap_group +DEFAULT Ldap-Group == "%%groupes_ldap" + Tunnel-Type = VLAN, + Tunnel-Medium-Type = IEEE-802, + Tunnel-Private-Group-ID = %%groupes_ldap.freerad_group_vlan + +%end for +%end if +# On no match, the user is denied access. diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-radius/templates/freerad-clients.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-radius/templates/freerad-clients.conf new file mode 100644 index 0000000000000000000000000000000000000000..0038d68931d1eac560fab742b175a07081cf1a3c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-radius/templates/freerad-clients.conf @@ -0,0 +1,286 @@ +# -*- text -*- +## +## clients.conf -- client configuration directives +## +## $Id: 76b300d3c55f1c5c052289b76bf28ac3a370bbb2 $ + +####################################################################### +# +# Define RADIUS clients (usually a NAS, Access Point, etc.). + +# +# Defines a RADIUS client. +# +# '127.0.0.1' is another name for 'localhost'. It is enabled by default, +# to allow testing of the server after an initial installation. If you +# are not going to be permitting RADIUS queries from localhost, we suggest +# that you delete, or comment out, this entry. +# +# + +# +# Each client has a "short name" that is used to distinguish it from +# other clients. +# +# In version 1.x, the string after the word "client" was the IP +# address of the client. In 2.0, the IP address is configured via +# the "ipaddr" or "ipv6addr" fields. For compatibility, the 1.x +# format is still accepted. +# +client localhost { + # Only *one* of ipaddr, ipv4addr, ipv6addr may be specified for + # a client. + # + # ipaddr will accept IPv4 or IPv6 addresses with optional CIDR + # notation '/<mask>' to specify ranges. + # + # ipaddr will accept domain names e.g. example.org resolving + # them via DNS. + # + # If both A and AAAA records are found, A records will be + # used in preference to AAAA. + ipaddr = 127.0.0.1 + + # Same as ipaddr but allows v4 addresses only. Requires A + # record for domain names. +# ipv4addr = * # any. 127.0.0.1 == localhost + + # Same as ipaddr but allows v6 addresses only. Requires AAAA + # record for domain names. +# ipv6addr = :: # any. ::1 == localhost + + # + # A note on DNS: We STRONGLY recommend using IP addresses + # rather than host names. Using host names means that the + # server will do DNS lookups when it starts, making it + # dependent on DNS. i.e. If anything goes wrong with DNS, + # the server won't start! + # + # The server also looks up the IP address from DNS once, and + # only once, when it starts. If the DNS record is later + # updated, the server WILL NOT see that update. + # + + # + # The transport protocol. + # + # If unspecified, defaults to "udp", which is the traditional + # RADIUS transport. It may also be "tcp", in which case the + # server will accept connections from this client ONLY over TCP. + # + proto = * + + # + # The shared secret use to "encrypt" and "sign" packets between + # the NAS and FreeRADIUS. You MUST change this secret from the + # default, otherwise it's not a secret any more! + # + # The secret can be any string, up to 8k characters in length. + # + # Control codes can be entered vi octal encoding, + # e.g. "\101\102" == "AB" + # Quotation marks can be entered by escaping them, + # e.g. "foo\"bar" + # + # A note on security: The security of the RADIUS protocol + # depends COMPLETELY on this secret! We recommend using a + # shared secret that is composed of: + # + # upper case letters + # lower case letters + # numbers + # + # And is at LEAST 8 characters long, preferably 16 characters in + # length. The secret MUST be random, and should not be words, + # phrase, or anything else that is recognisable. + # + # The default secret below is only for testing, and should + # not be used in any real environment. + # + secret = testing123 + + # + # Old-style clients do not send a Message-Authenticator + # in an Access-Request. RFC 5080 suggests that all clients + # SHOULD include it in an Access-Request. The configuration + # item below allows the server to require it. If a client + # is required to include a Message-Authenticator and it does + # not, then the packet will be silently discarded. + # + # allowed values: yes, no + require_message_authenticator = no + + # + # The short name is used as an alias for the fully qualified + # domain name, or the IP address. + # + # It is accepted for compatibility with 1.x, but it is no + # longer necessary in >= 2.0 + # +# shortname = localhost + + # + # the following three fields are optional, but may be used by + # checkrad.pl for simultaneous use checks + # + + # + # The nas_type tells 'checkrad.pl' which NAS-specific method to + # use to query the NAS for simultaneous use. + # + # Permitted NAS types are: + # + # cisco + # computone + # livingston + # juniper + # max40xx + # multitech + # netserver + # pathras + # patton + # portslave + # tc + # usrhiper + # other # for all other types + + # + nas_type = other # localhost isn't usually a NAS... + + # + # The following two configurations are for future use. + # The 'naspasswd' file is currently used to store the NAS + # login name and password, which is used by checkrad.pl + # when querying the NAS for simultaneous use. + # +# login = !root +# password = someadminpas + + # + # As of 2.0, clients can also be tied to a virtual server. + # This is done by setting the "virtual_server" configuration + # item, as in the example below. + # +# virtual_server = home1 + + # + # A pointer to the "home_server_pool" OR a "home_server" + # section that contains the CoA configuration for this + # client. For an example of a coa home server or pool, + # see raddb/sites-available/originate-coa +# coa_server = coa + + # + # Response window for proxied packets. If non-zero, + # then the lower of (home, client) response_window + # will be used. + # + # i.e. it can be used to lower the response_window + # packets from one client to a home server. It cannot + # be used to raise the response_window. + # +# response_window = 10.0 + + # + # Connection limiting for clients using "proto = tcp". + # + # This section is ignored for clients sending UDP traffic + # + limit { + # + # Limit the number of simultaneous TCP connections from a client + # + # The default is 16. + # Setting this to 0 means "no limit" + max_connections = 16 + + # The per-socket "max_requests" option does not exist. + + # + # The lifetime, in seconds, of a TCP connection. After + # this lifetime, the connection will be closed. + # + # Setting this to 0 means "forever". + lifetime = 0 + + # + # The idle timeout, in seconds, of a TCP connection. + # If no packets have been received over the connection for + # this time, the connection will be closed. + # + # Setting this to 0 means "no timeout". + # + # We STRONGLY RECOMMEND that you set an idle timeout. + # + idle_timeout = 30 + } +} + +# IPv6 Client +#client localhost_ipv6 { +# ipv6addr = ::1 +# secret = testing123 +#} + +# All IPv6 Site-local clients +#client sitelocal_ipv6 { +# ipv6addr = fe80::/16 +# secret = testing123 +#} + +#client example.org { +# ipaddr = radius.example.org +# secret = testing123 +#} + +# +# You can now specify one secret for a network of clients. +# When a client request comes in, the BEST match is chosen. +# i.e. The entry from the smallest possible network. +# +#client private-network-1 { +# ipaddr = 192.0.2.0/24 +# secret = testing123-1 +#} + +#client private-network-2 { +# ipaddr = 198.51.100.0/24 +# secret = testing123-2 +#} +%if %%freerad_mode == '802.1x' + %for %%nas_ip in %%freerad_nas_ip +client %%nas_ip { + ipaddr = %%nas_ip + secret = %%nas_ip.freerad_nas_passwd + shortname = %%nas_ip.freerad_nas_name + nastype = %%nas_ip.freerad_nas_type +} + %end for +%elif %%freerad_mode == 'accounting' + %for %%nas_ip in %%freerad_nas_ip +client %%nas_ip/%%nas_ip.freerad_nas_cidr_netmask { + ipaddr = %%nas_ip + secret = %%nas_ip.freerad_nas_passwd + shortname = %%nas_ip.freerad_nas_name + #nastype = %%nas_ip.freerad_nas_type +} + %end for +%end if +####################################################################### +# +# Per-socket client lists. The configuration entries are exactly +# the same as above, but they are nested inside of a section. +# +# You can have as many per-socket client lists as you have "listen" +# sections, or you can re-use a list among multiple "listen" sections. +# +# Un-comment this section, and edit a "listen" section to add: +# "clients = per_socket_clients". That IP address/port combination +# will then accept ONLY the clients listed in this section. +# +#clients per_socket_clients { +# client socket_client { +# ipaddr = 192.0.2.4 +# secret = testing123 +# } +#} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-radius/templates/freerad-default b/seed/release/eole-2.7/2.7.1/applicationservice/eole-radius/templates/freerad-default new file mode 100644 index 0000000000000000000000000000000000000000..b71e73b445b2f11f499c8b5019dd51c3080d845d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-radius/templates/freerad-default @@ -0,0 +1,937 @@ +###################################################################### +# +# As of 2.0.0, FreeRADIUS supports virtual hosts using the +# "server" section, and configuration directives. +# +# Virtual hosts should be put into the "sites-available" +# directory. Soft links should be created in the "sites-enabled" +# directory to these files. This is done in a normal installation. +# +# If you are using 802.1X (EAP) authentication, please see also +# the "inner-tunnel" virtual server. You will likely have to edit +# that, too, for authentication to work. +# +# $Id: 3616050e7625eb6b5e2ba44782fcb737b2ae6136 $ +# +###################################################################### +# +# Read "man radiusd" before editing this file. See the section +# titled DEBUGGING. It outlines a method where you can quickly +# obtain the configuration you want, without running into +# trouble. See also "man unlang", which documents the format +# of this file. +# +# This configuration is designed to work in the widest possible +# set of circumstances, with the widest possible number of +# authentication methods. This means that in general, you should +# need to make very few changes to this file. +# +# The best way to configure the server for your local system +# is to CAREFULLY edit this file. Most attempts to make large +# edits to this file will BREAK THE SERVER. Any edits should +# be small, and tested by running the server with "radiusd -X". +# Once the edits have been verified to work, save a copy of these +# configuration files somewhere. (e.g. as a "tar" file). Then, +# make more edits, and test, as above. +# +# There are many "commented out" references to modules such +# as ldap, sql, etc. These references serve as place-holders. +# If you need the functionality of that module, then configure +# it in radiusd.conf, and un-comment the references to it in +# this file. In most cases, those small changes will result +# in the server being able to connect to the DB, and to +# authenticate users. +# +###################################################################### + +server default { +# +# If you want the server to listen on additional addresses, or on +# additional ports, you can use multiple "listen" sections. +# +# Each section make the server listen for only one type of packet, +# therefore authentication and accounting have to be configured in +# different sections. +# +# The server ignore all "listen" section if you are using '-i' and '-p' +# on the command line. +# +listen { + # Type of packets to listen for. + # Allowed values are: + # auth listen for authentication packets + # acct listen for accounting packets + # proxy IP to use for sending proxied packets + # detail Read from the detail file. For examples, see + # raddb/sites-available/copy-acct-to-home-server + # status listen for Status-Server packets. For examples, + # see raddb/sites-available/status + # coa listen for CoA-Request and Disconnect-Request + # packets. For examples, see the file + # raddb/sites-available/coa + # + type = auth + + # Note: "type = proxy" lets you control the source IP used for + # proxying packets, with some limitations: + # + # * A proxy listener CANNOT be used in a virtual server section. + # * You should probably set "port = 0". + # * Any "clients" configuration will be ignored. + # + # See also proxy.conf, and the "src_ipaddr" configuration entry + # in the sample "home_server" section. When you specify the + # source IP address for packets sent to a home server, the + # proxy listeners are automatically created. + + # ipaddr/ipv4addr/ipv6addr - IP address on which to listen. + # If multiple ones are listed, only the first one will + # be used, and the others will be ignored. + # + # The configuration options accept the following syntax: + # + # ipv4addr - IPv4 address (e.g.192.0.2.3) + # - wildcard (i.e. *) + # - hostname (radius.example.com) + # Only the A record for the host name is used. + # If there is no A record, an error is returned, + # and the server fails to start. + # + # ipv6addr - IPv6 address (e.g. 2001:db8::1) + # - wildcard (i.e. *) + # - hostname (radius.example.com) + # Only the AAAA record for the host name is used. + # If there is no AAAA record, an error is returned, + # and the server fails to start. + # + # ipaddr - IPv4 address as above + # - IPv6 address as above + # - wildcard (i.e. *), which means IPv4 wildcard. + # - hostname + # If there is only one A or AAAA record returned + # for the host name, it is used. + # If multiple A or AAAA records are returned + # for the host name, only the first one is used. + # If both A and AAAA records are returned + # for the host name, only the A record is used. + # + # ipv4addr = * + # ipv6addr = * + ipaddr = * + + # Port on which to listen. + # Allowed values are: + # integer port number (1812) + # 0 means "use /etc/services for the proper port" + port = 0 + + # Some systems support binding to an interface, in addition + # to the IP address. This feature isn't strictly necessary, + # but for sites with many IP addresses on one interface, + # it's useful to say "listen on all addresses for eth0". + # + # If your system does not support this feature, you will + # get an error if you try to use it. + # +# interface = eth0 + + # Per-socket lists of clients. This is a very useful feature. + # + # The name here is a reference to a section elsewhere in + # radiusd.conf, or clients.conf. Having the name as + # a reference allows multiple sockets to use the same + # set of clients. + # + # If this configuration is used, then the global list of clients + # is IGNORED for this "listen" section. Take care configuring + # this feature, to ensure you don't accidentally disable a + # client you need. + # + # See clients.conf for the configuration of "per_socket_clients". + # +# clients = per_socket_clients + + # + # Connection limiting for sockets with "proto = tcp". + # + # This section is ignored for other kinds of sockets. + # + limit { + # + # Limit the number of simultaneous TCP connections to the socket + # + # The default is 16. + # Setting this to 0 means "no limit" + max_connections = 16 + + # The per-socket "max_requests" option does not exist. + + # + # The lifetime, in seconds, of a TCP connection. After + # this lifetime, the connection will be closed. + # + # Setting this to 0 means "forever". + lifetime = 0 + + # + # The idle timeout, in seconds, of a TCP connection. + # If no packets have been received over the connection for + # this time, the connection will be closed. + # + # Setting this to 0 means "no timeout". + # + # We STRONGLY RECOMMEND that you set an idle timeout. + # + idle_timeout = 30 + } +} + +# +# This second "listen" section is for listening on the accounting +# port, too. +# +listen { + ipaddr = * +# ipv6addr = :: + port = 0 + type = acct +# interface = eth0 +# clients = per_socket_clients + + limit { + # The number of packets received can be rate limited via the + # "max_pps" configuration item. When it is set, the server + # tracks the total number of packets received in the previous + # second. If the count is greater than "max_pps", then the + # new packet is silently discarded. This helps the server + # deal with overload situations. + # + # The packets/s counter is tracked in a sliding window. This + # means that the pps calculation is done for the second + # before the current packet was received. NOT for the current + # wall-clock second, and NOT for the previous wall-clock second. + # + # Useful values are 0 (no limit), or 100 to 10000. + # Values lower than 100 will likely cause the server to ignore + # normal traffic. Few systems are capable of handling more than + # 10K packets/s. + # + # It is most useful for accounting systems. Set it to 50 # more than the normal accounting load, and you can be sure that + # the server will never get overloaded + # +# max_pps = 0 + + # Only for "proto = tcp". These are ignored for "udp" sockets. + # +# idle_timeout = 0 +# lifetime = 0 +# max_connections = 0 + } +} + +# IPv6 versions of the above - read their full config to understand options +listen { + type = auth + ipv6addr = :: # any. ::1 == localhost + port = 0 +# interface = eth0 +# clients = per_socket_clients + limit { + max_connections = 16 + lifetime = 0 + idle_timeout = 30 + } +} + +listen { + ipv6addr = :: + port = 0 + type = acct +# interface = eth0 +# clients = per_socket_clients + + limit { +# max_pps = 0 +# idle_timeout = 0 +# lifetime = 0 +# max_connections = 0 + } +} + +# Authorization. First preprocess (hints and huntgroups files), +# then realms, and finally look in the "users" file. +# +# Any changes made here should also be made to the "inner-tunnel" +# virtual server. +# +# The order of the realm modules will determine the order that +# we try to find a matching realm. +# +# Make *sure* that 'preprocess' comes before any realm if you +# need to setup hints for the remote radius server +authorize { + # + # Take a User-Name, and perform some checks on it, for spaces and other + # invalid characters. If the User-Name appears invalid, reject the + # request. + # + # See policy.d/filter for the definition of the filter_username policy. + # + filter_username + + # + # Some broken equipment sends passwords with embedded zeros. + # i.e. the debug output will show + # + # User-Password = "password\000\000" + # + # This policy will fix it to just be "password". + # +# filter_password + + # + # The preprocess module takes care of sanitizing some bizarre + # attributes in the request, and turning them into attributes + # which are more standard. + # + # It takes care of processing the 'raddb/mods-config/preprocess/hints' + # and the 'raddb/mods-config/preprocess/huntgroups' files. + preprocess + + # If you intend to use CUI and you require that the Operator-Name + # be set for CUI generation and you want to generate CUI also + # for your local clients then uncomment the operator-name + # below and set the operator-name for your clients in clients.conf +# operator-name + + # + # If you want to generate CUI for some clients that do not + # send proper CUI requests, then uncomment the + # cui below and set "add_cui = yes" for these clients in clients.conf +# cui + + # + # If you want to have a log of authentication requests, + # un-comment the following line. +# auth_log + + # + # The chap module will set 'Auth-Type := CHAP' if we are + # handling a CHAP request and Auth-Type has not already been set + chap + + # + # If the users are logging in with an MS-CHAP-Challenge + # attribute for authentication, the mschap module will find + # the MS-CHAP-Challenge attribute, and add 'Auth-Type := MS-CHAP' + # to the request, which will cause the server to then use + # the mschap module for authentication. + mschap + + # + # If you have a Cisco SIP server authenticating against + # FreeRADIUS, uncomment the following line, and the 'digest' + # line in the 'authenticate' section. + digest + + # + # The WiMAX specification says that the Calling-Station-Id + # is 6 octets of the MAC. This definition conflicts with + # RFC 3580, and all common RADIUS practices. Un-commenting + # the "wimax" module here means that it will fix the + # Calling-Station-Id attribute to the normal format as + # specified in RFC 3580 Section 3.21 +# wimax + + # + # Look for IPASS style 'realm/', and if not found, look for + # '@realm', and decide whether or not to proxy, based on + # that. +# IPASS + + # + # If you are using multiple kinds of realms, you probably + # want to set "ignore_null = yes" for all of them. + # Otherwise, when the first style of realm doesn't match, + # the other styles won't be checked. + # + suffix +# ntdomain + + # + # This module takes care of EAP-MD5, EAP-TLS, and EAP-LEAP + # authentication. + # + # It also sets the EAP-Type attribute in the request + # attribute list to the EAP type from the packet. + # + # The EAP module returns "ok" or "updated" if it is not yet ready + # to authenticate the user. The configuration below checks for + # "ok", and stops processing the "authorize" section if so. + # + # Any LDAP and/or SQL servers will not be queried for the + # initial set of packets that go back and forth to set up + # TTLS or PEAP. + # + # The "updated" check is commented out for compatibility with + # previous versions of this configuration, but you may wish to + # uncomment it as well; this will further reduce the number of + # LDAP and/or SQL queries for TTLS or PEAP. + # + eap { + ok = return +# updated = return + } + + # + # Pull crypt'd passwords from /etc/passwd or /etc/shadow, + # using the system API's to get the password. If you want + # to read /etc/passwd or /etc/shadow directly, see the + # mods-available/passwd module. + # +# unix + + # + # Read the 'users' file. In v3, this is located in + # raddb/mods-config/files/authorize + files + + # + # Look in an SQL database. The schema of the database + # is meant to mirror the "users" file. + # + # See "Authorization Queries" in mods-available/sql + -sql + + # + # If you are using /etc/smbpasswd, and are also doing + # mschap authentication, the un-comment this line, and + # configure the 'smbpasswd' module. +# smbpasswd + + # + # The ldap module reads passwords from the LDAP database. + -ldap + + # + # Enforce daily limits on time spent logged in. +# daily + + # + expiration + logintime + + # + # If no other module has claimed responsibility for + # authentication, then try to use PAP. This allows the + # other modules listed above to add a "known good" password + # to the request, and to do nothing else. The PAP module + # will then see that password, and use it to do PAP + # authentication. + # + # This module should be listed last, so that the other modules + # get a chance to set Auth-Type for themselves. + # + pap + + # + # If "status_server = yes", then Status-Server messages are passed + # through the following section, and ONLY the following section. + # This permits you to do DB queries, for example. If the modules + # listed here return "fail", then NO response is sent. + # +# Autz-Type Status-Server { +# +# } +} + + +# Authentication. +# +# +# This section lists which modules are available for authentication. +# Note that it does NOT mean 'try each module in order'. It means +# that a module from the 'authorize' section adds a configuration +# attribute 'Auth-Type := FOO'. That authentication type is then +# used to pick the appropriate module from the list below. +# + +# In general, you SHOULD NOT set the Auth-Type attribute. The server +# will figure it out on its own, and will do the right thing. The +# most common side effect of erroneously setting the Auth-Type +# attribute is that one authentication method will work, but the +# others will not. +# +# The common reasons to set the Auth-Type attribute by hand +# is to either forcibly reject the user (Auth-Type := Reject), +# or to or forcibly accept the user (Auth-Type := Accept). +# +# Note that Auth-Type := Accept will NOT work with EAP. +# +# Please do not put "unlang" configurations into the "authenticate" +# section. Put them in the "post-auth" section instead. That's what +# the post-auth section is for. +# +authenticate { + # + # PAP authentication, when a back-end database listed + # in the 'authorize' section supplies a password. The + # password can be clear-text, or encrypted. + Auth-Type PAP { + pap + } + + # + # Most people want CHAP authentication + # A back-end database listed in the 'authorize' section + # MUST supply a CLEAR TEXT password. Encrypted passwords + # won't work. + Auth-Type CHAP { + chap + } + + # + # MSCHAP authentication. + Auth-Type MS-CHAP { + mschap + } + + # + # For old names, too. + # + mschap + + # + # If you have a Cisco SIP server authenticating against + # FreeRADIUS, uncomment the following line, and the 'digest' + # line in the 'authorize' section. + digest + + # + # Pluggable Authentication Modules. +# pam + + # Uncomment it if you want to use ldap for authentication + # + # Note that this means "check plain-text password against + # the ldap database", which means that EAP won't work, + # as it does not supply a plain-text password. + # + # We do NOT recommend using this. LDAP servers are databases. + # They are NOT authentication servers. FreeRADIUS is an + # authentication server, and knows what to do with authentication. + # LDAP servers do not. + # +# Auth-Type LDAP { +# ldap +# } + + # + # Allow EAP authentication. + eap + + # + # The older configurations sent a number of attributes in + # Access-Challenge packets, which wasn't strictly correct. + # If you want to filter out these attributes, uncomment + # the following lines. + # +# Auth-Type eap { +# eap { +# handled = 1 +# } +# if (handled && (Response-Packet-Type == Access-Challenge)) { +# attr_filter.access_challenge.post-auth +# handled # override the "updated" code from attr_filter +# } +# } +} + + +# +# Pre-accounting. Decide which accounting type to use. +# +preacct { + preprocess + + # + # Merge Acct-[Input|Output]-Gigawords and Acct-[Input-Output]-Octets + # into a single 64bit counter Acct-[Input|Output]-Octets64. + # +# acct_counters64 + + # + # Session start times are *implied* in RADIUS. + # The NAS never sends a "start time". Instead, it sends + # a start packet, *possibly* with an Acct-Delay-Time. + # The server is supposed to conclude that the start time + # was "Acct-Delay-Time" seconds in the past. + # + # The code below creates an explicit start time, which can + # then be used in other modules. It will be *mostly* correct. + # Any errors are due to the 1-second resolution of RADIUS, + # and the possibility that the time on the NAS may be off. + # + # The start time is: NOW - delay - session_length + # + +# update request { +# &FreeRADIUS-Acct-Session-Start-Time = "%{expr: %l - %{%{Acct-Session-Time}:-0} - %{%{Acct-Delay-Time}:-0}}" +# } + + + # + # Ensure that we have a semi-unique identifier for every + # request, and many NAS boxes are broken. + acct_unique + + # + # Look for IPASS-style 'realm/', and if not found, look for + # '@realm', and decide whether or not to proxy, based on + # that. + # + # Accounting requests are generally proxied to the same + # home server as authentication requests. +# IPASS + suffix +# ntdomain + + # + # Read the 'acct_users' file + files +} + +# +# Accounting. Log the accounting data. +# +accounting { + # Update accounting packet by adding the CUI attribute + # recorded from the corresponding Access-Accept + # use it only if your NAS boxes do not support CUI themselves +# cui + # + # Create a 'detail'ed log of the packets. + # Note that accounting requests which are proxied + # are also logged in the detail file. + detail +# daily + + # Update the wtmp file + # + # If you don't use "radlast", you can delete this line. + unix + + # + # For Simultaneous-Use tracking. + # + # Due to packet losses in the network, the data here + # may be incorrect. There is little we can do about it. +# radutmp +# sradutmp + + # Return an address to the IP Pool when we see a stop record. +# main_pool + + # + # Log traffic to an SQL database. + # + # See "Accounting queries" in mods-available/sql + -sql + + # + # If you receive stop packets with zero session length, + # they will NOT be logged in the database. The SQL module + # will print a message (only in debugging mode), and will + # return "noop". + # + # You can ignore these packets by uncommenting the following + # three lines. Otherwise, the server will not respond to the + # accounting request, and the NAS will retransmit. + # +# if (noop) { +# ok +# } + + # Cisco VoIP specific bulk accounting +# pgsql-voip + + # For Exec-Program and Exec-Program-Wait + exec + + # Filter attributes from the accounting response. + attr_filter.accounting_response + + # + # See "Autz-Type Status-Server" for how this works. + # +# Acct-Type Status-Server { +# +# } +} + + +# Session database, used for checking Simultaneous-Use. Either the radutmp +# or rlm_sql module can handle this. +# The rlm_sql module is *much* faster +session { +# radutmp + + # + # See "Simultaneous Use Checking Queries" in mods-available/sql +# sql +} + + +# Post-Authentication +# Once we KNOW that the user has been authenticated, there are +# additional steps we can take. +post-auth { + # + # If you need to have a State attribute, you can + # add it here. e.g. for later CoA-Request with + # State, and Service-Type = Authorize-Only. + # +# if (!&reply:State) { +# update reply { +# State := "0x%{randstr:16h}" +# } +# } + + # + # For EAP-TTLS and PEAP, add the cached attributes to the reply. + # The "session-state" attributes are automatically cached when + # an Access-Challenge is sent, and automatically retrieved + # when an Access-Request is received. + # + # The session-state attributes are automatically deleted after + # an Access-Reject or Access-Accept is sent. + # + update { + &reply: += &session-state: + } + + # Get an address from the IP Pool. +# main_pool + + + # Create the CUI value and add the attribute to Access-Accept. + # Uncomment the line below if *returning* the CUI. +# cui + + # + # If you want to have a log of authentication replies, + # un-comment the following line, and enable the + # 'detail reply_log' module. +# reply_log + + # + # After authenticating the user, do another SQL query. + # + # See "Authentication Logging Queries" in mods-available/sql + -sql + + # + # Un-comment the following if you want to modify the user's object + # in LDAP after a successful login. + # +# ldap + + # For Exec-Program and Exec-Program-Wait + exec + + # + # Calculate the various WiMAX keys. In order for this to work, + # you will need to define the WiMAX NAI, usually via + # + # update request { + # WiMAX-MN-NAI = "%{User-Name}" + # } + # + # If you want various keys to be calculated, you will need to + # update the reply with "template" values. The module will see + # this, and replace the template values with the correct ones + # taken from the cryptographic calculations. e.g. + # + # update reply { + # WiMAX-FA-RK-Key = 0x00 + # WiMAX-MSK = "%{EAP-MSK}" + # } + # + # You may want to delete the MS-MPPE-*-Keys from the reply, + # as some WiMAX clients behave badly when those attributes + # are included. See "raddb/modules/wimax", configuration + # entry "delete_mppe_keys" for more information. + # +# wimax + + + # If there is a client certificate (EAP-TLS, sometimes PEAP + # and TTLS), then some attributes are filled out after the + # certificate verification has been performed. These fields + # MAY be available during the authentication, or they may be + # available only in the "post-auth" section. + # + # The first set of attributes contains information about the + # issuing certificate which is being used. The second + # contains information about the client certificate (if + # available). +# +# update reply { +# Reply-Message += "%{TLS-Cert-Serial}" +# Reply-Message += "%{TLS-Cert-Expiration}" +# Reply-Message += "%{TLS-Cert-Subject}" +# Reply-Message += "%{TLS-Cert-Issuer}" +# Reply-Message += "%{TLS-Cert-Common-Name}" +# Reply-Message += "%{TLS-Cert-Subject-Alt-Name-Email}" +# +# Reply-Message += "%{TLS-Client-Cert-Serial}" +# Reply-Message += "%{TLS-Client-Cert-Expiration}" +# Reply-Message += "%{TLS-Client-Cert-Subject}" +# Reply-Message += "%{TLS-Client-Cert-Issuer}" +# Reply-Message += "%{TLS-Client-Cert-Common-Name}" +# Reply-Message += "%{TLS-Client-Cert-Subject-Alt-Name-Email}" +# } + + # Insert class attribute (with unique value) into response, + # aids matching auth and acct records, and protects against duplicate + # Acct-Session-Id. Note: Only works if the NAS has implemented + # RFC 2865 behaviour for the class attribute, AND if the NAS + # supports long Class attributes. Many older or cheap NASes + # only support 16-octet Class attributes. +# insert_acct_class + + # MacSEC requires the use of EAP-Key-Name. However, we don't + # want to send it for all EAP sessions. Therefore, the EAP + # modules put required data into the EAP-Session-Id attribute. + # This attribute is never put into a request or reply packet. + # + # Uncomment the next few lines to copy the required data into + # the EAP-Key-Name attribute +# if (&reply:EAP-Session-Id) { +# update reply { +# EAP-Key-Name := &reply:EAP-Session-Id +# } +# } + + # Remove reply message if the response contains an EAP-Message + remove_reply_message_if_eap + + # + # Access-Reject packets are sent through the REJECT sub-section of the + # post-auth section. + # + # Add the ldap module name (or instance) if you have set + # 'edir_account_policy_check = yes' in the ldap module configuration + # + # The "session-state" attributes are not available here. + # + Post-Auth-Type REJECT { + # log failed authentications in SQL, too. + -sql + attr_filter.access_reject + + # Insert EAP-Failure message if the request was + # rejected by policy instead of because of an + # authentication failure + eap + + # Remove reply message if the response contains an EAP-Message + remove_reply_message_if_eap + } + + # + # Filter access challenges. + # + Post-Auth-Type Challenge { +# remove_reply_message_if_eap +# attr_filter.access_challenge.post-auth + } + +} + +# +# When the server decides to proxy a request to a home server, +# the proxied request is first passed through the pre-proxy +# stage. This stage can re-write the request, or decide to +# cancel the proxy. +# +# Only a few modules currently have this method. +# +pre-proxy { + # Before proxing the request add an Operator-Name attribute identifying + # if the operator-name is found for this client. + # No need to uncomment this if you have already enabled this in + # the authorize section. +# operator-name + + # The client requests the CUI by sending a CUI attribute + # containing one zero byte. + # Uncomment the line below if *requesting* the CUI. +# cui + + # Uncomment the following line if you want to change attributes + # as defined in the preproxy_users file. +# files + + # Uncomment the following line if you want to filter requests + # sent to remote servers based on the rules defined in the + # 'attrs.pre-proxy' file. +# attr_filter.pre-proxy + + # If you want to have a log of packets proxied to a home + # server, un-comment the following line, and the + # 'detail pre_proxy_log' section, above. +# pre_proxy_log +} + +# +# When the server receives a reply to a request it proxied +# to a home server, the request may be massaged here, in the +# post-proxy stage. +# +post-proxy { + + # If you want to have a log of replies from a home server, + # un-comment the following line, and the 'detail post_proxy_log' + # section, above. +# post_proxy_log + + # Uncomment the following line if you want to filter replies from + # remote proxies based on the rules defined in the 'attrs' file. +# attr_filter.post-proxy + + # + # If you are proxying LEAP, you MUST configure the EAP + # module, and you MUST list it here, in the post-proxy + # stage. + # + # You MUST also use the 'nostrip' option in the 'realm' + # configuration. Otherwise, the User-Name attribute + # in the proxied request will not match the user name + # hidden inside of the EAP packet, and the end server will + # reject the EAP request. + # + eap + + # + # If the server tries to proxy a request and fails, then the + # request is processed through the modules in this section. + # + # The main use of this section is to permit robust proxying + # of accounting packets. The server can be configured to + # proxy accounting packets as part of normal processing. + # Then, if the home server goes down, accounting packets can + # be logged to a local "detail" file, for processing with + # radrelay. When the home server comes back up, radrelay + # will read the detail file, and send the packets to the + # home server. + # + # With this configuration, the server always responds to + # Accounting-Requests from the NAS, but only writes + # accounting packets to disk if the home server is down. + # +# Post-Proxy-Type Fail-Accounting { +# detail +# } +} +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-radius/templates/freerad-eap b/seed/release/eole-2.7/2.7.1/applicationservice/eole-radius/templates/freerad-eap new file mode 100644 index 0000000000000000000000000000000000000000..972e6340c42ac4d88c29767dda9091d209b4d27c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-radius/templates/freerad-eap @@ -0,0 +1,938 @@ +# -*- text -*- +## +## eap.conf -- Configuration for EAP types (PEAP, TTLS, etc.) +## +## $Id: f67cbdbff9b6560cec9f68da1adb82b59723d2ef $ + +####################################################################### +# +# Whatever you do, do NOT set 'Auth-Type := EAP'. The server +# is smart enough to figure this out on its own. The most +# common side effect of setting 'Auth-Type := EAP' is that the +# users then cannot use ANY other authentication method. +# +eap { + # Invoke the default supported EAP type when + # EAP-Identity response is received. + # + # The incoming EAP messages DO NOT specify which EAP + # type they will be using, so it MUST be set here. + # + # For now, only one default EAP type may be used at a time. + # + # If the EAP-Type attribute is set by another module, + # then that EAP type takes precedence over the + # default type configured here. + # + default_eap_type = md5 + + # A list is maintained to correlate EAP-Response + # packets with EAP-Request packets. After a + # configurable length of time, entries in the list + # expire, and are deleted. + # + timer_expire = 60 + + # There are many EAP types, but the server has support + # for only a limited subset. If the server receives + # a request for an EAP type it does not support, then + # it normally rejects the request. By setting this + # configuration to "yes", you can tell the server to + # instead keep processing the request. Another module + # MUST then be configured to proxy the request to + # another RADIUS server which supports that EAP type. + # + # If another module is NOT configured to handle the + # request, then the request will still end up being + # rejected. + ignore_unknown_eap_types = no + + # Cisco AP1230B firmware 12.2(13)JA1 has a bug. When given + # a User-Name attribute in an Access-Accept, it copies one + # more byte than it should. + # + # We can work around it by configurably adding an extra + # zero byte. + cisco_accounting_username_bug = no + + # + # Help prevent DoS attacks by limiting the number of + # sessions that the server is tracking. For simplicity, + # this is taken from the "max_requests" directive in + # radiusd.conf. + max_sessions = ${max_requests} + + # Supported EAP-types + + # + # We do NOT recommend using EAP-MD5 authentication + # for wireless connections. It is insecure, and does + # not provide for dynamic WEP keys. + # + md5 { + } + + # + # EAP-pwd -- secure password-based authentication + # +# pwd { +# group = 19 + + # +# server_id = theserver@example.com + + # This has the same meaning as for TLS. +# fragment_size = 1020 + + # The virtual server which determines the + # "known good" password for the user. + # Note that unlike TLS, only the "authorize" + # section is processed. EAP-PWD requests can be + # distinguished by having a User-Name, but + # no User-Password, CHAP-Password, EAP-Message, etc. +# virtual_server = "inner-tunnel" +# } + + # Cisco LEAP + # + # We do not recommend using LEAP in new deployments. See: + # http://www.securiteam.com/tools/5TP012ACKE.html + # + # Cisco LEAP uses the MS-CHAP algorithm (but not + # the MS-CHAP attributes) to perform it's authentication. + # + # As a result, LEAP *requires* access to the plain-text + # User-Password, or the NT-Password attributes. + # 'System' authentication is impossible with LEAP. + # + leap { + } + + # Generic Token Card. + # + # Currently, this is only permitted inside of EAP-TTLS, + # or EAP-PEAP. The module "challenges" the user with + # text, and the response from the user is taken to be + # the User-Password. + # + # Proxying the tunneled EAP-GTC session is a bad idea, + # the users password will go over the wire in plain-text, + # for anyone to see. + # + gtc { + # The default challenge, which many clients + # ignore.. + #challenge = "Password: " + + # The plain-text response which comes back + # is put into a User-Password attribute, + # and passed to another module for + # authentication. This allows the EAP-GTC + # response to be checked against plain-text, + # or crypt'd passwords. + # + # If you say "Local" instead of "PAP", then + # the module will look for a User-Password + # configured for the request, and do the + # authentication itself. + # + auth_type = PAP + } + + ## Common TLS configuration for TLS-based EAP types + # + # See raddb/certs/README for additional comments + # on certificates. + # + # If OpenSSL was not found at the time the server was + # built, the "tls", "ttls", and "peap" sections will + # be ignored. + # + # If you do not currently have certificates signed by + # a trusted CA you may use the 'snakeoil' certificates. + # Included with the server in raddb/certs. + # + # If these certificates have not been auto-generated: + # cd raddb/certs + # make + # + # These test certificates SHOULD NOT be used in a normal + # deployment. They are created only to make it easier + # to install the server, and to perform some simple + # tests with EAP-TLS, TTLS, or PEAP. + # + # See also: + # + # http://www.dslreports.com/forum/remark,9286052~mode=flat + # + # Note that you should NOT use a globally known CA here! + # e.g. using a Verisign cert as a "known CA" means that + # ANYONE who has a certificate signed by them can + # authenticate via EAP-TLS! This is likely not what you want. + tls-config tls-common { + #private_key_password = whatever + #private_key_file = /etc/ssl/private/ssl-cert-snakeoil.key + private_key_file = ${keydir}/${name}.key + + # If Private key & Certificate are located in + # the same file, then private_key_file & + # certificate_file must contain the same file + # name. + # + # If ca_file (below) is not used, then the + # certificate_file below MUST include not + # only the server certificate, but ALSO all + # of the CA certificates used to sign the + # server certificate. + #certificate_file = /etc/ssl/certs/ssl-cert-snakeoil.pem + certificate_file = ${certdir}/${name}.crt + + # Trusted Root CA list + # + # ALL of the CA's in this list will be trusted + # to issue client certificates for authentication. + # + # In general, you should use self-signed + # certificates for 802.1x (EAP) authentication. + # In that case, this CA file should contain + # *one* CA certificate. + # + #ca_file = /etc/ssl/certs/ca-certificates.crt + ca_file = ${cadir}/ca.crt + + # OpenSSL will automatically create certificate chains, + # unless we tell it to not do that. The problem is that + # it sometimes gets the chains right from a certificate + # signature view, but wrong from the clients view. + # + # When setting "auto_chain = no", the server certificate + # file MUST include the full certificate chain. + # auto_chain = yes + + # + # If OpenSSL supports TLS-PSK, then we can use + # a PSK identity and (hex) password. When the + # following two configuration items are specified, + # then certificate-based configuration items are + # not allowed. e.g.: + # + # private_key_password + # private_key_file + # certificate_file + # ca_file + # ca_path + # + # For now, the identity is fixed, and must be the + # same on the client. The passphrase must be a hex + # value, and can be up to 256 hex digits. + # + # Future versions of the server may be able to + # look up the shared key (hexphrase) based on the + # identity. + # + # psk_identity = "test" + # psk_hexphrase = "036363823" + + # + # For DH cipher suites to work, you have to + # run OpenSSL to create the DH file first: + # + # openssl dhparam -out certs/dh 2048 + # + dh_file = ${certdir}/dh + + # + # If your system doesn't have /dev/urandom, + # you will need to create this file, and + # periodically change its contents. + # + # For security reasons, FreeRADIUS doesn't + # write to files in its configuration + # directory. + # + random_file = /dev/urandom + + # + # This can never exceed the size of a RADIUS + # packet (4096 bytes), and is preferably half + # that, to accommodate other attributes in + # RADIUS packet. On most APs the MAX packet + # length is configured between 1500 - 1600 + # In these cases, fragment size should be + # 1024 or less. + # + # fragment_size = 1024 + + # include_length is a flag which is + # by default set to yes If set to + # yes, Total Length of the message is + # included in EVERY packet we send. + # If set to no, Total Length of the + # message is included ONLY in the + # First packet of a fragment series. + # + # include_length = yes + + + # Check the Certificate Revocation List + # + # 1) Copy CA certificates and CRLs to same directory. + # 2) Execute 'c_rehash <CA certs&CRLs Directory>'. + # 'c_rehash' is OpenSSL's command. + # 3) uncomment the lines below. + # 5) Restart radiusd + # check_crl = yes + + # Check if intermediate CAs have been revoked. + # check_all_crl = yes + + ca_path = ${cadir} + + # Accept an expired Certificate Revocation List + # +# allow_expired_crl = no + + # + # If check_cert_issuer is set, the value will + # be checked against the DN of the issuer in + # the client certificate. If the values do not + # match, the certificate verification will fail, + # rejecting the user. + # + # This check can be done more generally by checking + # the value of the TLS-Client-Cert-Issuer attribute. + # This check can be done via any mechanism you + # choose. + # + # check_cert_issuer = "/C=GB/ST=Berkshire/L=Newbury/O=My Company Ltd" + + # + # If check_cert_cn is set, the value will + # be xlat'ed and checked against the CN + # in the client certificate. If the values + # do not match, the certificate verification + # will fail rejecting the user. + # + # This check is done only if the previous + # "check_cert_issuer" is not set, or if + # the check succeeds. + # + # In 2.1.10 and later, this check can be done + # more generally by checking the value of the + # TLS-Client-Cert-CN attribute. This check + # can be done via any mechanism you choose. + # + # check_cert_cn = %{User-Name} + # + # Set this option to specify the allowed + # TLS cipher suites. The format is listed + # in "man 1 ciphers". + # + # For EAP-FAST, use "ALL:!EXPORT:!eNULL:!SSLv2" + # + cipher_list = "DEFAULT" + + # If enabled, OpenSSL will use server cipher list + # (possibly defined by cipher_list option above) + # for choosing right cipher suite rather than + # using client-specified list which is OpenSSl default + # behavior. Having it set to yes is a current best practice + # for TLS + cipher_server_preference = no + + # + # You can selectively disable TLS versions for + # compatability with old client devices. + # + # If your system has OpenSSL 1.1.0 or greater, do NOT + # use these. Instead, set tls_min_version and + # tls_max_version. + # +# disable_tlsv1_2 = no +# disable_tlsv1_1 = no +# disable_tlsv1 = no + + # + # Set min / max TLS version. Mainly for Debian + # "trusty", which disables older versions of TLS, and + # requires the application to manually enable them. + # + # If you are running Debian trusty, you should set + # these options, otherwise older clients will not be + # able to connect. + # + # Allowed values are "1.0", "1.1", and "1.2". + # + # The values must be in quotes. + # +# tls_min_version = "1.0" +# tls_max_version = "1.2" + + + # + # Elliptical cryptography configuration + # + # Only for OpenSSL >= 0.9.8.f + # + ecdh_curve = "prime256v1" + + # + # Session resumption / fast reauthentication + # cache. + # + # The cache contains the following information: + # + # session Id - unique identifier, managed by SSL + # User-Name - from the Access-Accept + # Stripped-User-Name - from the Access-Request + # Cached-Session-Policy - from the Access-Accept + # + # The "Cached-Session-Policy" is the name of a + # policy which should be applied to the cached + # session. This policy can be used to assign + # VLANs, IP addresses, etc. It serves as a useful + # way to re-apply the policy from the original + # Access-Accept to the subsequent Access-Accept + # for the cached session. + # + # On session resumption, these attributes are + # copied from the cache, and placed into the + # reply list. + # + # You probably also want "use_tunneled_reply = yes" + # when using fast session resumption. + # + cache { + # + # Enable it. The default is "no". Deleting the entire "cache" + # subsection also disables caching. + # + # As of version 3.0.14, the session cache requires the use + # of the "name" and "persist_dir" configuration items, below. + # + # The internal OpenSSL session cache has been permanently + # disabled. + # + # You can disallow resumption for a particular user by adding the + # following attribute to the control item list: + # + # Allow-Session-Resumption = No + # + # If "enable = no" below, you CANNOT enable resumption for just one + # user by setting the above attribute to "yes". + # + enable = no + + # + # Lifetime of the cached entries, in hours. The sessions will be + # deleted/invalidated after this time. + # + lifetime = 24 # hours + + # + # Internal "name" of the session cache. Used to + # distinguish which TLS context sessions belong to. + # + # The server will generate a random value if unset. + # This will change across server restart so you MUST + # set the "name" if you want to persist sessions (see + # below). + # + #name = "EAP module" + + # + # Simple directory-based storage of sessions. + # Two files per session will be written, the SSL + # state and the cached VPs. This will persist session + # across server restarts. + # + # The default directory is ${logdir}, for historical + # reasons. You should ${db_dir} instead. And check + # the value of db_dir in the main radiusd.conf file. + # It should not point to ${raddb} + # + # The server will need write perms, and the directory + # should be secured from anyone else. You might want + # a script to remove old files from here periodically: + # + # find ${logdir}/tlscache -mtime +2 -exec rm -f {} \; + # + # This feature REQUIRES "name" option be set above. + # + #persist_dir = "${logdir}/tlscache" + } + + # + # As of version 2.1.10, client certificates can be + # validated via an external command. This allows + # dynamic CRLs or OCSP to be used. + # + # This configuration is commented out in the + # default configuration. Uncomment it, and configure + # the correct paths below to enable it. + # + # If OCSP checking is enabled, and the OCSP checks fail, + # the verify section is not run. + # + # If OCSP checking is disabled, the verify section is + # run on successful certificate validation. + # + verify { + # If the OCSP checks succeed, the verify section + # is run to allow additional checks. + # + # If you want to skip verify on OCSP success, + # uncomment this configuration item, and set it + # to "yes". + # skip_if_ocsp_ok = no + + # A temporary directory where the client + # certificates are stored. This directory + # MUST be owned by the UID of the server, + # and MUST not be accessible by any other + # users. When the server starts, it will do + # "chmod go-rwx" on the directory, for + # security reasons. The directory MUST + # exist when the server starts. + # + # You should also delete all of the files + # in the directory when the server starts. + # tmpdir = /tmp/radiusd + + # The command used to verify the client cert. + # We recommend using the OpenSSL command-line + # tool. + # + # The ${..ca_path} text is a reference to + # the ca_path variable defined above. + # + # The %{TLS-Client-Cert-Filename} is the name + # of the temporary file containing the cert + # in PEM format. This file is automatically + # deleted by the server when the command + # returns. + # client = "/path/to/openssl verify -CApath ${..ca_path} %{TLS-Client-Cert-Filename}" + } + + # + # OCSP Configuration + # Certificates can be verified against an OCSP + # Responder. This makes it possible to immediately + # revoke certificates without the distribution of + # new Certificate Revocation Lists (CRLs). + # + ocsp { + # + # Enable it. The default is "no". + # Deleting the entire "ocsp" subsection + # also disables ocsp checking + # + enable = no + + # + # The OCSP Responder URL can be automatically + # extracted from the certificate in question. + # To override the OCSP Responder URL set + # "override_cert_url = yes". + # + override_cert_url = yes + + # + # If the OCSP Responder address is not extracted from + # the certificate, the URL can be defined here. + # + url = "http://127.0.0.1/ocsp/" + + # + # If the OCSP Responder can not cope with nonce + # in the request, then it can be disabled here. + # + # For security reasons, disabling this option + # is not recommended as nonce protects against + # replay attacks. + # + # Note that Microsoft AD Certificate Services OCSP + # Responder does not enable nonce by default. It is + # more secure to enable nonce on the responder than + # to disable it in the query here. + # See http://technet.microsoft.com/en-us/library/cc770413%28WS.10%29.aspx + # + # use_nonce = yes + + # + # Number of seconds before giving up waiting + # for OCSP response. 0 uses system default. + # + # timeout = 0 + + # + # Normally an error in querying the OCSP + # responder (no response from server, server did + # not understand the request, etc) will result in + # a validation failure. + # + # To treat these errors as 'soft' failures and + # still accept the certificate, enable this + # option. + # + # Warning: this may enable clients with revoked + # certificates to connect if the OCSP responder + # is not available. Use with caution. + # + # softfail = no + } + } + + ## EAP-TLS + # + # As of Version 3.0, the TLS configuration for TLS-based + # EAP types is above in the "tls-config" section. + # + tls { + # Point to the common TLS configuration + tls = tls-common + + # + # As part of checking a client certificate, the EAP-TLS + # sets some attributes such as TLS-Client-Cert-CN. This + # virtual server has access to these attributes, and can + # be used to accept or reject the request. + # + # virtual_server = check-eap-tls + } + + + ## EAP-TTLS + # + # The TTLS module implements the EAP-TTLS protocol, + # which can be described as EAP inside of Diameter, + # inside of TLS, inside of EAP, inside of RADIUS... + # + # Surprisingly, it works quite well. + # + ttls { + # Which tls-config section the TLS negotiation parameters + # are in - see EAP-TLS above for an explanation. + # + # In the case that an old configuration from FreeRADIUS + # v2.x is being used, all the options of the tls-config + # section may also appear instead in the 'tls' section + # above. If that is done, the tls= option here (and in + # tls above) MUST be commented out. + # + tls = tls-common + + # The tunneled EAP session needs a default EAP type + # which is separate from the one for the non-tunneled + # EAP module. Inside of the TTLS tunnel, we recommend + # using EAP-MD5. If the request does not contain an + # EAP conversation, then this configuration entry is + # ignored. + # + #default_eap_type = md5 + default_eap_type = mschapv2 + + # The tunneled authentication request does not usually + # contain useful attributes like 'Calling-Station-Id', + # etc. These attributes are outside of the tunnel, + # and normally unavailable to the tunneled + # authentication request. + # + # By setting this configuration entry to 'yes', + # any attribute which is NOT in the tunneled + # authentication request, but which IS available + # outside of the tunnel, is copied to the tunneled + # request. + # + # allowed values: {no, yes} + # + %if %%ttls_copy_request_to_tunnel == 'non' + copy_request_to_tunnel = no + %else + copy_request_to_tunnel = yes + %end if + + # + # As of version 3.0.5, this configuration item + # is deprecated. Instead, you should use + # + # update outer.session-state { + # ... + # + # } + # + # This will cache attributes for the final Access-Accept. + # + # The reply attributes sent to the NAS are usually + # based on the name of the user 'outside' of the + # tunnel (usually 'anonymous'). If you want to send + # the reply attributes based on the user name inside + # of the tunnel, then set this configuration entry to + # 'yes', and the reply to the NAS will be taken from + # the reply to the tunneled request. + # + # allowed values: {no, yes} + # + %if %%ttls_use_tunneled_reply == 'non' + use_tunneled_reply = no + %else + use_tunneled_reply = yes + %end if + + # + # The inner tunneled request can be sent + # through a virtual server constructed + # specifically for this purpose. + # + # If this entry is commented out, the inner + # tunneled request will be sent through + # the virtual server that processed the + # outer requests. + # + virtual_server = "inner-tunnel" + + # This has the same meaning, and overwrites, the + # same field in the "tls" configuration, above. + # The default value here is "yes". + # + # include_length = yes + + # + # Unlike EAP-TLS, EAP-TTLS does not require a client + # certificate. However, you can require one by setting the + # following option. You can also override this option by + # setting + # + # EAP-TLS-Require-Client-Cert = Yes + # + # in the control items for a request. + # + # Note that the majority of supplicants do not support using a + # client certificate with EAP-TTLS, so this option is unlikely + # to be usable for most people. + # + # require_client_cert = yes + } + + + ## EAP-PEAP + # + + ################################################## + # + # !!!!! WARNINGS for Windows compatibility !!!!! + # + ################################################## + # + # If you see the server send an Access-Challenge, + # and the client never sends another Access-Request, + # then + # + # STOP! + # + # The server certificate has to have special OID's + # in it, or else the Microsoft clients will silently + # fail. See the "scripts/xpextensions" file for + # details, and the following page: + # + # http://support.microsoft.com/kb/814394/en-us + # + # For additional Windows XP SP2 issues, see: + # + # http://support.microsoft.com/kb/885453/en-us + # + # + # If is still doesn't work, and you're using Samba, + # you may be encountering a Samba bug. See: + # + # https://bugzilla.samba.org/show_bug.cgi?id=6563 + # + # Note that we do not necessarily agree with their + # explanation... but the fix does appear to work. + # + ################################################## + + # + # The tunneled EAP session needs a default EAP type + # which is separate from the one for the non-tunneled + # EAP module. Inside of the TLS/PEAP tunnel, we + # recommend using EAP-MS-CHAPv2. + # + peap { + # Which tls-config section the TLS negotiation parameters + # are in - see EAP-TLS above for an explanation. + # + # In the case that an old configuration from FreeRADIUS + # v2.x is being used, all the options of the tls-config + # section may also appear instead in the 'tls' section + # above. If that is done, the tls= option here (and in + # tls above) MUST be commented out. + # + tls = tls-common + + # The tunneled EAP session needs a default + # EAP type which is separate from the one for + # the non-tunneled EAP module. Inside of the + # PEAP tunnel, we recommend using MS-CHAPv2, + # as that is the default type supported by + # Windows clients. + # + default_eap_type = mschapv2 + + # The PEAP module also has these configuration + # items, which are the same as for TTLS. + # + copy_request_to_tunnel = no + + # + # As of version 3.0.5, this configuration item + # is deprecated. Instead, you should use + # + # update outer.session-state { + # ... + # + # } + # + # This will cache attributes for the final Access-Accept. + # + use_tunneled_reply = no + + # When the tunneled session is proxied, the + # home server may not understand EAP-MSCHAP-V2. + # Set this entry to "no" to proxy the tunneled + # EAP-MSCHAP-V2 as normal MSCHAPv2. + # + # proxy_tunneled_request_as_eap = yes + + # + # The inner tunneled request can be sent + # through a virtual server constructed + # specifically for this purpose. + # + # If this entry is commented out, the inner + # tunneled request will be sent through + # the virtual server that processed the + # outer requests. + # + virtual_server = "inner-tunnel" + + # This option enables support for MS-SoH + # see doc/SoH.txt for more info. + # It is disabled by default. + # + # soh = yes + + # + # The SoH reply will be turned into a request which + # can be sent to a specific virtual server: + # + # soh_virtual_server = "soh-server" + + # + # Unlike EAP-TLS, PEAP does not require a client certificate. + # However, you can require one by setting the following + # option. You can also override this option by setting + # + # EAP-TLS-Require-Client-Cert = Yes + # + # in the control items for a request. + # + # Note that the majority of supplicants do not support using a + # client certificate with PEAP, so this option is unlikely to + # be usable for most people. + # + # require_client_cert = yes + } + + # + # This takes no configuration. + # + # Note that it is the EAP MS-CHAPv2 sub-module, not + # the main 'mschap' module. + # + # Note also that in order for this sub-module to work, + # the main 'mschap' module MUST ALSO be configured. + # + # This module is the *Microsoft* implementation of MS-CHAPv2 + # in EAP. There is another (incompatible) implementation + # of MS-CHAPv2 in EAP by Cisco, which FreeRADIUS does not + # currently support. + # + mschapv2 { + # Prior to version 2.1.11, the module never + # sent the MS-CHAP-Error message to the + # client. This worked, but it had issues + # when the cached password was wrong. The + # server *should* send "E=691 R=0" to the + # client, which tells it to prompt the user + # for a new password. + # + # The default is to behave as in 2.1.10 and + # earlier, which is known to work. If you + # set "send_error = yes", then the error + # message will be sent back to the client. + # This *may* help some clients work better, + # but *may* also cause other clients to stop + # working. + # +# send_error = no + + # Server identifier to send back in the challenge. + # This should generally be the host name of the + # RADIUS server. Or, some information to uniquely + # identify it. +# identity = "FreeRADIUS" + } + + ## EAP-FAST + # + # The FAST module implements the EAP-FAST protocol + # +# fast { + # Point to the common TLS configuration + # +# tls = tls-common + + # + # If 'cipher_list' is set here, it will over-ride the + # 'cipher_list' configuration from the 'tls-common' + # configuration. The EAP-FAST module has it's own + # over-ride for 'cipher_list' because the + # specifications mandata a different set of ciphers + # than are used by the other EAP methods. + # + # cipher_list though must include "ADH" for anonymous provisioning. + # This is not as straight forward as appending "ADH" alongside + # "DEFAULT" as "DEFAULT" contains "!aNULL" so instead it is + # recommended "ALL:!EXPORT:!eNULL:!SSLv2" is used + # + # Note - for OpenSSL 1.1.0 and above you may need + # to add ":@SECLEVEL=0" + # +# cipher_list = "ALL:!EXPORT:!eNULL:!SSLv2" + + # PAC lifetime in seconds (default: seven days) + # +# pac_lifetime = 604800 + + # Authority ID of the server + # + # if you are running a cluster of RADIUS servers, you should make + # the value chosen here (and for "pac_opaque_key") the same on all + # your RADIUS servers. This value should be unique to your + # installation. We suggest using a domain name. + # +# authority_identity = "1234" + + # PAC Opaque encryption key (must be exactly 32 bytes in size) + # + # This value MUST be secret, and MUST be generated using + # a secure method, such as via 'openssl rand -hex 32' + # +# pac_opaque_key = "0123456789abcdef0123456789ABCDEF" + + # Same as for TTLS, PEAP, etc. + # +# virtual_server = inner-tunnel +# } +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-radius/templates/freerad-huntgroups b/seed/release/eole-2.7/2.7.1/applicationservice/eole-radius/templates/freerad-huntgroups new file mode 100644 index 0000000000000000000000000000000000000000..ef55a1be2bd200db7cdfb37d4ef74ea47ec34677 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-radius/templates/freerad-huntgroups @@ -0,0 +1,45 @@ +# +# huntgroups This file defines the `huntgroups' that you have. A +# huntgroup is defined by specifying the IP address of +# the NAS and possibly a port. +# +# Matching is done while RADIUS scans the user file; if it +# includes the selection criteria "Huntgroup-Name == XXX" +# the huntgroup is looked up in this file to see if it +# matches. There can be multiple definitions of the same +# huntgroup; the first one that matches will be used. +# +# This file can also be used to define restricted access +# to certain huntgroups. The second and following lines +# define the access restrictions (based on username and +# UNIX usergroup) for the huntgroup. +# + +# +# Our POP in Alphen a/d Rijn has 3 terminal servers. Create a Huntgroup-Name +# called Alphen that matches on all three terminal servers. +# +#alphen NAS-IP-Address == 192.0.2.5 +#alphen NAS-IP-Address == 192.0.2.6 +#alphen NAS-IP-Address == 192.0.2.7 + +# +# The POP in Delft consists of only one terminal server. +# +#delft NAS-IP-Address == 198.51.100.5 + +# +# Port 0 on the first terminal server in Alphen are connected to +# a huntgroup that is for business users only. Note that only one +# of the username or groupname has to match to get access (OR/OR). +# +# Note that this huntgroup is a subset of the "alphen" huntgroup. +# +#business NAS-IP-Address == 198.51.100.5, NAS-Port-Id == 0 +# User-Name == rogerl, +# User-Name == henks, +# Group == business, +# Group == staff +%for %%nas_ip in %%freerad_nas_ip +CommutEtab NAS-IP-Address == %%nas_ip +%end for diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-radius/templates/freerad-inner-tunnel b/seed/release/eole-2.7/2.7.1/applicationservice/eole-radius/templates/freerad-inner-tunnel new file mode 100644 index 0000000000000000000000000000000000000000..10f056ed3a914c03fcc11d7327efe19d4d38898d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-radius/templates/freerad-inner-tunnel @@ -0,0 +1,438 @@ +# -*- text -*- +###################################################################### +# +# This is a virtual server that handles *only* inner tunnel +# requests for EAP-TTLS and PEAP types. +# +# $Id: 70b1d8da255a740d2d1b59808393722766dc6a60 $ +# +###################################################################### + +server inner-tunnel { + +# +# This next section is here to allow testing of the "inner-tunnel" +# authentication methods, independently from the "default" server. +# It is listening on "localhost", so that it can only be used from +# the same machine. +# +# $ radtest USER PASSWORD 127.0.0.1:18120 0 testing123 +# +# If it works, you have configured the inner tunnel correctly. To check +# if PEAP will work, use: +# +# $ radtest -t mschap USER PASSWORD 127.0.0.1:18120 0 testing123 +# +# If that works, PEAP should work. If that command doesn't work, then +# +# FIX THE INNER TUNNEL CONFIGURATION SO THAT IT WORKS. +# +# Do NOT do any PEAP tests. It won't help. Instead, concentrate +# on fixing the inner tunnel configuration. DO NOTHING ELSE. +# +#listen { +# ipaddr = 127.0.0.1 +# port = 18120 +# type = auth +#} + + +# Authorization. First preprocess (hints and huntgroups files), +# then realms, and finally look in the "users" file. +# +# The order of the realm modules will determine the order that +# we try to find a matching realm. +# +# Make *sure* that 'preprocess' comes before any realm if you +# need to setup hints for the remote radius server +authorize { + # + # Take a User-Name, and perform some checks on it, for spaces and other + # invalid characters. If the User-Name appears invalid, reject the + # request. + # + # See policy.d/filter for the definition of the filter_username policy. + # + filter_username + + # + # Do checks on outer / inner User-Name, so that users + # can't spoof us by using incompatible identities + # +# filter_inner_identity + + # + # The chap module will set 'Auth-Type := CHAP' if we are + # handling a CHAP request and Auth-Type has not already been set + chap + + # + # If the users are logging in with an MS-CHAP-Challenge + # attribute for authentication, the mschap module will find + # the MS-CHAP-Challenge attribute, and add 'Auth-Type := MS-CHAP' + # to the request, which will cause the server to then use + # the mschap module for authentication. + mschap + + # + # Pull crypt'd passwords from /etc/passwd or /etc/shadow, + # using the system API's to get the password. If you want + # to read /etc/passwd or /etc/shadow directly, see the + # passwd module, above. + # +# unix + + # + # Look for IPASS style 'realm/', and if not found, look for + # '@realm', and decide whether or not to proxy, based on + # that. +# IPASS + + # + # If you are using multiple kinds of realms, you probably + # want to set "ignore_null = yes" for all of them. + # Otherwise, when the first style of realm doesn't match, + # the other styles won't be checked. + # + # Note that proxying the inner tunnel authentication means + # that the user MAY use one identity in the outer session + # (e.g. "anonymous", and a different one here + # (e.g. "user@example.com"). The inner session will then be + # proxied elsewhere for authentication. If you are not + # careful, this means that the user can cause you to forward + # the authentication to another RADIUS server, and have the + # accounting logs *not* sent to the other server. This makes + # it difficult to bill people for their network activity. + # + suffix +# ntdomain + + # + # The "suffix" module takes care of stripping the domain + # (e.g. "@example.com") from the User-Name attribute, and the + # next few lines ensure that the request is not proxied. + # + # If you want the inner tunnel request to be proxied, delete + # the next few lines. + # + update control { + &Proxy-To-Realm := LOCAL + } + + # + # This module takes care of EAP-MSCHAPv2 authentication. + # + # It also sets the EAP-Type attribute in the request + # attribute list to the EAP type from the packet. + # + # The example below uses module failover to avoid querying all + # of the following modules if the EAP module returns "ok". + # Therefore, your LDAP and/or SQL servers will not be queried + # for the many packets that go back and forth to set up TTLS + # or PEAP. The load on those servers will therefore be reduced. + # + eap { + ok = return + } + + # + # Read the 'users' file + #files + + # + # Look in an SQL database. The schema of the database + # is meant to mirror the "users" file. + # + # See "Authorization Queries" in sql.conf + #-sql + + # + # If you are using /etc/smbpasswd, and are also doing + # mschap authentication, the un-comment this line, and + # enable the "smbpasswd" module. +# smbpasswd + + # + # The ldap module reads passwords from the LDAP database. + ldap + + # + # Enforce daily limits on time spent logged in. +# daily + + expiration + logintime + + # + # If no other module has claimed responsibility for + # authentication, then try to use PAP. This allows the + # other modules listed above to add a "known good" password + # to the request, and to do nothing else. The PAP module + # will then see that password, and use it to do PAP + # authentication. + # + # This module should be listed last, so that the other modules + # get a chance to set Auth-Type for themselves. + # + #pap +} + + +# Authentication. +# +# +# This section lists which modules are available for authentication. +# Note that it does NOT mean 'try each module in order'. It means +# that a module from the 'authorize' section adds a configuration +# attribute 'Auth-Type := FOO'. That authentication type is then +# used to pick the appropriate module from the list below. +# + +# In general, you SHOULD NOT set the Auth-Type attribute. The server +# will figure it out on its own, and will do the right thing. The +# most common side effect of erroneously setting the Auth-Type +# attribute is that one authentication method will work, but the +# others will not. +# +# The common reasons to set the Auth-Type attribute by hand +# is to either forcibly reject the user, or forcibly accept him. +# +authenticate { + # + # PAP authentication, when a back-end database listed + # in the 'authorize' section supplies a password. The + # password can be clear-text, or encrypted. + Auth-Type PAP { + pap + } + + # + # Most people want CHAP authentication + # A back-end database listed in the 'authorize' section + # MUST supply a CLEAR TEXT password. Encrypted passwords + # won't work. + Auth-Type CHAP { + chap + } + + # + # MSCHAP authentication. + Auth-Type MS-CHAP { + mschap + } + + # + # For old names, too. + # + mschap + + # + # Pluggable Authentication Modules. +# pam + + # Uncomment it if you want to use ldap for authentication + # + # Note that this means "check plain-text password against + # the ldap database", which means that EAP won't work, + # as it does not supply a plain-text password. + # + # We do NOT recommend using this. LDAP servers are databases. + # They are NOT authentication servers. FreeRADIUS is an + # authentication server, and knows what to do with authentication. + # LDAP servers do not. + # + Auth-Type LDAP { + ldap + } + + # + # Allow EAP authentication. + Auth-Type EAP { + eap + } + + eap +} + +###################################################################### +# +# There are no accounting requests inside of EAP-TTLS or PEAP +# tunnels. +# +###################################################################### + + +# Session database, used for checking Simultaneous-Use. Either the radutmp +# or rlm_sql module can handle this. +# The rlm_sql module is *much* faster +session { + radutmp + + # + # See "Simultaneous Use Checking Queries" in sql.conf +# sql +} + + +# Post-Authentication +# Once we KNOW that the user has been authenticated, there are +# additional steps we can take. +# +# Note that the last packet of the inner-tunnel authentication +# MAY NOT BE the last packet of the outer session. So updating +# the outer reply MIGHT work, and sometimes MIGHT NOT. The +# exact functionality depends on both the inner and outer +# authentication methods. +# +# If you need to send a reply attribute in the outer session, +# the ONLY safe way is to set "use_tunneled_reply = yes", and +# then update the inner-tunnel reply. +post-auth { + # If you want privacy to remain, see the + # Chargeable-User-Identity attribute from RFC 4372. + # If you want to use it just uncomment the line below. +# cui-inner + + # + # If you want to have a log of authentication replies, + # un-comment the following line, and enable the + # 'detail reply_log' module. +# reply_log + + # + # After authenticating the user, do another SQL query. + # + # See "Authentication Logging Queries" in sql.conf +# -sql + + # + # Un-comment the following if you have set + # 'edir_account_policy_check = yes' in the ldap module sub-section of + # the 'modules' section. + # +# ldap + + + # + # Un-comment the following if you want to generate Moonshot (ABFAB) TargetedIds + # + # IMPORTANT: This requires the UUID package to be installed, and a targeted_id_salt + # to be configured. + # + # This functionality also supports SQL backing. To use this functionality, enable + # and configure the moonshot-targeted-ids SQL module in the mods-enabled directory. + # Then remove the comments from the appropriate lines in each of the below + # policies in the policy.d/moonshot-targeted-ids file. + # +# moonshot_host_tid +# moonshot_realm_tid +# moonshot_coi_tid + + # + # Instead of "use_tunneled_reply", change this "if (0)" to an + # "if (1)". + # + if (0) { + # + # These attributes are for the inner-tunnel only, + # and MUST NOT be copied to the outer reply. + # + update reply { + User-Name !* ANY + Message-Authenticator !* ANY + EAP-Message !* ANY + Proxy-State !* ANY + MS-MPPE-Encryption-Types !* ANY + MS-MPPE-Encryption-Policy !* ANY + MS-MPPE-Send-Key !* ANY + MS-MPPE-Recv-Key !* ANY + } + + # + # Copy the inner reply attributes to the outer + # session-state list. The post-auth policy will take + # care of copying the outer session-state list to the + # outer reply. + # + update { + &outer.session-state: += &reply: + } + } + + # + # Access-Reject packets are sent through the REJECT sub-section of the + # post-auth section. + # + # Add the ldap module name (or instance) if you have set + # 'edir_account_policy_check = yes' in the ldap module configuration + # + Post-Auth-Type REJECT { + # log failed authentications in SQL, too. + #-sql + ldap + attr_filter.access_reject + + # + # Let the outer session know which module failed, and why. + # + update outer.session-state { + &Module-Failure-Message := &request:Module-Failure-Message + } + } +} + +# +# When the server decides to proxy a request to a home server, +# the proxied request is first passed through the pre-proxy +# stage. This stage can re-write the request, or decide to +# cancel the proxy. +# +# Only a few modules currently have this method. +# +pre-proxy { + # Uncomment the following line if you want to change attributes + # as defined in the preproxy_users file. +# files + + # Uncomment the following line if you want to filter requests + # sent to remote servers based on the rules defined in the + # 'attrs.pre-proxy' file. +# attr_filter.pre-proxy + + # If you want to have a log of packets proxied to a home + # server, un-comment the following line, and the + # 'detail pre_proxy_log' section, above. +# pre_proxy_log +} + +# +# When the server receives a reply to a request it proxied +# to a home server, the request may be massaged here, in the +# post-proxy stage. +# +post-proxy { + + # If you want to have a log of replies from a home server, + # un-comment the following line, and the 'detail post_proxy_log' + # section, above. +# post_proxy_log + + # Uncomment the following line if you want to filter replies from + # remote proxies based on the rules defined in the 'attrs' file. +# attr_filter.post-proxy + + # + # If you are proxying LEAP, you MUST configure the EAP + # module, and you MUST list it here, in the post-proxy + # stage. + # + # You MUST also use the 'nostrip' option in the 'realm' + # configuration. Otherwise, the User-Name attribute + # in the proxied request will not match the user name + # hidden inside of the EAP packet, and the end server will + # reject the EAP request. + # + eap +} + +} # inner-tunnel server block diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-radius/templates/freerad-ldap b/seed/release/eole-2.7/2.7.1/applicationservice/eole-radius/templates/freerad-ldap new file mode 100644 index 0000000000000000000000000000000000000000..ccd3005227090f237c4f9a241cef0ba7f628e6fe --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-radius/templates/freerad-ldap @@ -0,0 +1,591 @@ +# -*- text -*- +# +# $Id: 4b7e4585c029b8617aa7b9169a42bf50a5ec4938 $ + +# +# Lightweight Directory Access Protocol (LDAP) +# +ldap { + # Note that this needs to match the name(s) in the LDAP server + # certificate, if you're using ldaps. See OpenLDAP documentation + # for the behavioral semantics of specifying more than one host. + # + # Depending on the libldap in use, server may be an LDAP URI. + # In the case of OpenLDAP this allows additional the following + # additional schemes: + # - ldaps:// (LDAP over SSL) + # - ldapi:// (LDAP over Unix socket) + # - ldapc:// (Connectionless LDAP) + server = "%%freerad_ldap_ip" +# server = 'ldap.rrdns.example.org' +# server = 'ldap.rrdns.example.org' + + # Port to connect on, defaults to 389, will be ignored for LDAP URIs. +# port = 389 + + # Administrator account for searching and possibly modifying. + # If using SASL + KRB5 these should be commented out. +%if %%freerad_mode == '802.1x' +# identity = 'cn=admin,dc=example,dc=org' +# password = mypass +%elif %%freerad_mode == 'accounting' + identity = "cn=reader,%%freerad_ldap_base_dn" + password = %%freerad_cle_ldap_scribe +%end if + + # Unless overridden in another section, the dn from which all + # searches will start from. + #base_dn = 'dc=example,dc=org' + base_dn = "%%freerad_ldap_base_dn" + #filter = "(uid=%{mschap:User-Name})" + + # + # SASL parameters to use for admin binds + # + # When we're prompted by the SASL library, these control + # the responses given, as well as the identity and password + # directives above. + # + # If any directive is commented out, a NULL response will be + # provided to cyrus-sasl. + # + # Unfortunately the only way to control Keberos here is through + # environmental variables, as cyrus-sasl provides no API to + # set the krb5 config directly. + # + # Full documentation for MIT krb5 can be found here: + # + # http://web.mit.edu/kerberos/krb5-devel/doc/admin/env_variables.html + # + # At a minimum you probably want to set KRB5_CLIENT_KTNAME. + # + sasl { + # SASL mechanism +# mech = 'PLAIN' + + # SASL authorisation identity to proxy. +# proxy = 'autz_id' + + # SASL realm. Used for kerberos. +# realm = 'example.org' + } + + # + # Generic valuepair attribute + # + + # If set, this will attribute will be retrieved in addition to any + # mapped attributes. + # + # Values should be in the format: + # <radius attr> <op> <value> + # + # Where: + # <radius attr>: Is the attribute you wish to create + # with any valid list and request qualifiers. + # <op>: Is any assignment operator (=, :=, +=, -=). + # <value>: Is the value to parse into the new valuepair. + # If the value is wrapped in double quotes it + # will be xlat expanded. +# valuepair_attribute = 'radiusAttribute' + + # + # Mapping of LDAP directory attributes to RADIUS dictionary attributes. + # + + # WARNING: Although this format is almost identical to the unlang + # update section format, it does *NOT* mean that you can use other + # unlang constructs in module configuration files. + # + # Configuration items are in the format: + # <radius attr> <op> <ldap attr> + # + # Where: + # <radius attr>: Is the destination RADIUS attribute + # with any valid list and request qualifiers. + # <op>: Is any assignment attribute (=, :=, +=, -=). + # <ldap attr>: Is the attribute associated with user or + # profile objects in the LDAP directory. + # If the attribute name is wrapped in double + # quotes it will be xlat expanded. + # + # Request and list qualifiers may also be placed after the 'update' + # section name to set defaults destination requests/lists + # for unqualified RADIUS attributes. + # + # Note: LDAP attribute names should be single quoted unless you want + # the name value to be derived from an xlat expansion, or an + # attribute ref. + update { + control:Password-With-Header += 'userPassword' +# control:NT-Password := 'ntPassword' +# reply:Reply-Message := 'radiusReplyMessage' +# reply:Tunnel-Type := 'radiusTunnelType' +# reply:Tunnel-Medium-Type := 'radiusTunnelMediumType' +# reply:Tunnel-Private-Group-ID := 'radiusTunnelPrivategroupId' + + # Where only a list is specified as the RADIUS attribute, + # the value of the LDAP attribute is parsed as a valuepair + # in the same format as the 'valuepair_attribute' (above). + control: += 'radiusControlAttribute' + request: += 'radiusRequestAttribute' + reply: += 'radiusReplyAttribute' + } + + # Set to yes if you have eDirectory and want to use the universal + # password mechanism. +# edir = no + + # Set to yes if you want to bind as the user after retrieving the + # Cleartext-Password. This will consume the login grace, and + # verify user authorization. +# edir_autz = no + + # Note: set_auth_type was removed in v3.x.x + # Equivalent functionality can be achieved by adding the following + # stanza to the authorize {} section of your virtual server. + # + # ldap + # if ((ok || updated) && User-Password) { + # update { + # control:Auth-Type := ldap + # } + # } + + # + # User object identification. + # + user { + # Where to start searching in the tree for users + base_dn = "%%freerad_ldap_base_dn" + + # Filter for user objects, should be specific enough + # to identify a single user object. + # + # For Active Directory, you should use + # "samaccountname=" instead of "uid=" + # + #filter = "(uid=%{%{Stripped-User-Name}:-%{User-Name}})" + filter = "(uid=%{mschap:User-Name})" + + # SASL parameters to use for user binds + # + # When we're prompted by the SASL library, these control + # the responses given. + # + # Any of the config items below may be an attribute ref + # or and expansion, so different SASL mechs, proxy IDs + # and realms may be used for different users. + sasl { + # SASL mechanism +# mech = 'PLAIN' + + # SASL authorisation identity to proxy. +# proxy = &User-Name + + # SASL realm. Used for kerberos. +# realm = 'example.org' + } + + # Search scope, may be 'base', 'one', sub' or 'children' +# scope = 'sub' + + # Server side result sorting + # + # A list of space delimited attributes to order the result + # set by, if the filter matches multiple objects. + # Only the first result in the set will be processed. + # + # If the attribute name is prefixed with a hyphen '-' the + # sorting order will be reversed for that attribute. + # + # If sort_by is set, and the server does not support sorting + # the search will fail. +# sort_by = '-uid' + + # If this is undefined, anyone is authorised. + # If it is defined, the contents of this attribute + # determine whether or not the user is authorised +# access_attribute = 'dialupAccess' + + # Control whether the presence of 'access_attribute' + # allows access, or denys access. + # + # If 'yes', and the access_attribute is present, or + # 'no' and the access_attribute is absent then access + # will be allowed. + # + # If 'yes', and the access_attribute is absent, or + # 'no' and the access_attribute is present, then + # access will not be allowed. + # + # If the value of the access_attribute is 'false', it + # will negate the result. + # + # e.g. + # access_positive = yes + # access_attribute = userAccessAllowed + # + # With an LDAP object containing: + # userAccessAllowed: false + # + # Will result in the user being locked out. +# access_positive = yes + } + + # + # User membership checking. + # + group { + # Where to start searching in the tree for groups + base_dn = "%%freerad_ldap_base_dn" + + # Filter for group objects, should match all available + # group objects a user might be a member of. + #filter = '(objectClass=posixGroup)' + filter = '(&(objectClass=posixGroup)(memberUid=%{mschap:User-Name}))' + + # Search scope, may be 'base', 'one', sub' or 'children' +# scope = 'sub' + + # Attribute that uniquely identifies a group. + # Is used when converting group DNs to group + # names. +# name_attribute = cn + + # Filter to find group objects a user is a member of. + # That is, group objects with attributes that + # identify members (the inverse of membership_attribute). +# membership_filter = "(|(member=%{control:Ldap-UserDn})(memberUid=%{%{Stripped-User-Name}:-%{User-Name}}))" + + # The attribute in user objects which contain the names + # or DNs of groups a user is a member of. + # + # Unless a conversion between group name and group DN is + # needed, there's no requirement for the group objects + # referenced to actually exist. + #membership_attribute = 'memberOf' + membership_attribute = radiusGroupName + + # If cacheable_name or cacheable_dn are enabled, + # all group information for the user will be + # retrieved from the directory and written to LDAP-Group + # attributes appropriate for the instance of rlm_ldap. + # + # For group comparisons these attributes will be checked + # instead of querying the LDAP directory directly. + # + # This feature is intended to be used with rlm_cache. + # + # If you wish to use this feature, you should enable + # the type that matches the format of your check items + # i.e. if your groups are specified as DNs then enable + # cacheable_dn else enable cacheable_name. +# cacheable_name = 'no' +# cacheable_dn = 'no' + + # Override the normal cache attribute (<inst>-LDAP-Group or + # LDAP-Group if using the default instance) and create a + # custom attribute. This can help if multiple module instances + # are used in fail-over. +# cache_attribute = 'LDAP-Cached-Membership' + } + + # + # User profiles. RADIUS profile objects contain sets of attributes + # to insert into the request. These attributes are mapped using + # the same mapping scheme applied to user objects (the update section above). + # + profile { + # Filter for RADIUS profile objects +# filter = '(objectclass=radiusprofile)' + + # The default profile. This may be a DN or an attribute + # reference. + # To get old v2.2.x style behaviour, or to use the + # &User-Profile attribute to specify the default profile, + # set this to &control:User-Profile. +# default = 'cn=radprofile,dc=example,dc=org' + + # The LDAP attribute containing profile DNs to apply + # in addition to the default profile above. These are + # retrieved from the user object, at the same time as the + # attributes from the update section, are are applied + # if authorization is successful. +# attribute = 'radiusProfileDn' + } + + # + # Bulk load clients from the directory + # + client { + # Where to start searching in the tree for clients + base_dn = "%%freerad_ldap_base_dn" + + # + # Filter to match client objects + # + filter = '(objectClass=radiusClient)' + + # Search scope, may be 'base', 'one', 'sub' or 'children' +# scope = 'sub' + + # + # Sets default values (not obtained from LDAP) for new client entries + # + template { +# login = 'test' +# password = 'test' +# proto = tcp +# require_message_authenticator = yes + + # Uncomment to add a home_server with the same + # attributes as the client. +# coa_server { +# response_window = 2.0 +# } + } + + # + # Client attribute mappings are in the format: + # <client attribute> = <ldap attribute> + # + # The following attributes are required: + # * ipaddr | ipv4addr | ipv6addr - Client IP Address. + # * secret - RADIUS shared secret. + # + # All other attributes usually supported in a client + # definition are also supported here. + # + # Schemas are available in doc/schemas/ldap for openldap and eDirectory + # + attribute { + ipaddr = 'radiusClientIdentifier' + secret = 'radiusClientSecret' +# shortname = 'radiusClientShortname' +# nas_type = 'radiusClientType' +# virtual_server = 'radiusClientVirtualServer' +# require_message_authenticator = 'radiusClientRequireMa' + } + } + + # Load clients on startup +# read_clients = no + + # + # Modify user object on receiving Accounting-Request + # + + # Useful for recording things like the last time the user logged + # in, or the Acct-Session-ID for CoA/DM. + # + # LDAP modification items are in the format: + # <ldap attr> <op> <value> + # + # Where: + # <ldap attr>: The LDAP attribute to add modify or delete. + # <op>: One of the assignment operators: + # (:=, +=, -=, ++). + # Note: '=' is *not* supported. + # <value>: The value to add modify or delete. + # + # WARNING: If using the ':=' operator with a multi-valued LDAP + # attribute, all instances of the attribute will be removed and + # replaced with a single attribute. + accounting { + reference = "%{tolower:type.%{Acct-Status-Type}}" + + type { + start { + update { + description := "Online at %S" + } + } + + interim-update { + update { + description := "Last seen at %S" + } + } + + stop { + update { + description := "Offline at %S" + } + } + } + } + + # + # Post-Auth can modify LDAP objects too + # + post-auth { + update { + description := "Authenticated at %S" + } + } + + # + # LDAP connection-specific options. + # + # These options set timeouts, keep-alives, etc. for the connections. + # + options { + # Control under which situations aliases are followed. + # May be one of 'never', 'searching', 'finding' or 'always' + # default: libldap's default which is usually 'never'. + # + # LDAP_OPT_DEREF is set to this value. +# dereference = 'always' + + # + # The following two configuration items control whether the + # server follows references returned by LDAP directory. + # They are mostly for Active Directory compatibility. + # If you set these to 'no', then searches will likely return + # 'operations error', instead of a useful result. + # + chase_referrals = yes + rebind = yes + + # Seconds to wait for LDAP query to finish. default: 20 + res_timeout = 10 + + # Seconds LDAP server has to process the query (server-side + # time limit). default: 20 + # + # LDAP_OPT_TIMELIMIT is set to this value. + srv_timelimit = 3 + + # Seconds to wait for response of the server. (network + # failures) default: 10 + # + # LDAP_OPT_NETWORK_TIMEOUT is set to this value. + net_timeout = 1 + + # LDAP_OPT_X_KEEPALIVE_IDLE + idle = 60 + + # LDAP_OPT_X_KEEPALIVE_PROBES + probes = 3 + + # LDAP_OPT_X_KEEPALIVE_INTERVAL + interval = 3 + + # ldap_debug: debug flag for LDAP SDK + # (see OpenLDAP documentation). Set this to enable + # huge amounts of LDAP debugging on the screen. + # You should only use this if you are an LDAP expert. + # + # default: 0x0000 (no debugging messages) + # Example:(LDAP_DEBUG_FILTER+LDAP_DEBUG_CONNS) + ldap_debug = 0x0028 + } + + # + # This subsection configures the tls related items + # that control how FreeRADIUS connects to an LDAP + # server. It contains all of the 'tls_*' configuration + # entries used in older versions of FreeRADIUS. Those + # configuration entries can still be used, but we recommend + # using these. + # + tls { + # Set this to 'yes' to use TLS encrypted connections + # to the LDAP database by using the StartTLS extended + # operation. + # + # The StartTLS operation is supposed to be + # used with normal ldap connections instead of + # using ldaps (port 636) connections +# start_tls = yes + +# ca_file = ${certdir}/cacert.pem + +# ca_path = ${certdir} +# certificate_file = /path/to/radius.crt +# private_key_file = /path/to/radius.key +# random_file = /dev/urandom + + # Certificate Verification requirements. Can be: + # 'never' (do not even bother trying) + # 'allow' (try, but don't fail if the certificate + # cannot be verified) + # 'demand' (fail if the certificate does not verify) + # 'hard' (similar to 'demand' but fails if TLS + # cannot negotiate) + # + # The default is libldap's default, which varies based + # on the contents of ldap.conf. + +# require_cert = 'demand' + } + + # As of version 3.0, the 'pool' section has replaced the + # following configuration items: + # + # ldap_connections_number + + # The connection pool is new for 3.0, and will be used in many + # modules, for all kinds of connection-related activity. + # + # When the server is not threaded, the connection pool + # limits are ignored, and only one connection is used. + pool { + # Connections to create during module instantiation. + # If the server cannot create specified number of + # connections during instantiation it will exit. + # Set to 0 to allow the server to start without the + # directory being available. + start = ${thread[pool].start_servers} + + # Minimum number of connections to keep open + min = ${thread[pool].min_spare_servers} + + # Maximum number of connections + # + # If these connections are all in use and a new one + # is requested, the request will NOT get a connection. + # + # Setting 'max' to LESS than the number of threads means + # that some threads may starve, and you will see errors + # like 'No connections available and at max connection limit' + # + # Setting 'max' to MORE than the number of threads means + # that there are more connections than necessary. + max = ${thread[pool].max_servers} + + # Spare connections to be left idle + # + # NOTE: Idle connections WILL be closed if "idle_timeout" + # is set. This should be less than or equal to "max" above. + spare = ${thread[pool].max_spare_servers} + + # Number of uses before the connection is closed + # + # 0 means "infinite" + uses = 0 + + # The number of seconds to wait after the server tries + # to open a connection, and fails. During this time, + # no new connections will be opened. + retry_delay = 30 + + # The lifetime (in seconds) of the connection + lifetime = 0 + + # Idle timeout (in seconds). A connection which is + # unused for this length of time will be closed. + idle_timeout = 60 + + # NOTE: All configuration settings are enforced. If a + # connection is closed because of 'idle_timeout', + # 'uses', or 'lifetime', then the total number of + # connections MAY fall below 'min'. When that + # happens, it will open a new connection. It will + # also log a WARNING message. + # + # The solution is to either lower the 'min' connections, + # or increase lifetime/idle_timeout. + } +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-radius/templates/freerad-mschap b/seed/release/eole-2.7/2.7.1/applicationservice/eole-radius/templates/freerad-mschap new file mode 100644 index 0000000000000000000000000000000000000000..175f67d1f9e52ec86b611717582059f2a5488aa7 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-radius/templates/freerad-mschap @@ -0,0 +1,206 @@ +# -*- text -*- +# +# $Id: 18f600589b67177679b9521feb65b7fbb0200ac2 $ + +# Microsoft CHAP authentication +# +# This module supports MS-CHAP and MS-CHAPv2 authentication. +# It also enforces the SMB-Account-Ctrl attribute. +# +mschap { + # + # If you are using /etc/smbpasswd, see the 'passwd' + # module for an example of how to use /etc/smbpasswd + + # if use_mppe is not set to no mschap will + # add MS-CHAP-MPPE-Keys for MS-CHAPv1 and + # MS-MPPE-Recv-Key/MS-MPPE-Send-Key for MS-CHAPv2 + # +# use_mppe = no + + # if mppe is enabled require_encryption makes + # encryption moderate + # +# require_encryption = yes + + # require_strong always requires 128 bit key + # encryption + # +# require_strong = yes + + # Windows sends us a username in the form of + # DOMAIN\user, but sends the challenge response + # based on only the user portion. This hack + # corrects for that incorrect behavior. + # + with_ntdomain_hack = yes + + # The module can perform authentication itself, OR + # use a Windows Domain Controller. This configuration + # directive tells the module to call the ntlm_auth + # program, which will do the authentication, and return + # the NT-Key. Note that you MUST have "winbindd" and + # "nmbd" running on the local machine for ntlm_auth + # to work. See the ntlm_auth program documentation + # for details. + # + # If ntlm_auth is configured below, then the mschap + # module will call ntlm_auth for every MS-CHAP + # authentication request. If there is a cleartext + # or NT hashed password available, you can set + # "MS-CHAP-Use-NTLM-Auth := No" in the control items, + # and the mschap module will do the authentication itself, + # without calling ntlm_auth. + # + # Be VERY careful when editing the following line! + # + # You can also try setting the user name as: + # + # ... --username=%{mschap:User-Name} ... + # + # In that case, the mschap module will look at the User-Name + # attribute, and do prefix/suffix checks in order to obtain + # the "best" user name for the request. + # +# ntlm_auth = "/path/to/ntlm_auth --request-nt-key --username=%{%{Stripped-User-Name}:-%{%{User-Name}:-None}} --challenge=%{%{mschap:Challenge}:-00} --nt-response=%{%{mschap:NT-Response}:-00}" + + # The default is to wait 10 seconds for ntlm_auth to + # complete. This is a long time, and if it's taking that + # long then you likely have other problems in your domain. + # The length of time can be decreased with the following + # option, which can save clients waiting if your ntlm_auth + # usually finishes quicker. Range 1 to 10 seconds. + # +# ntlm_auth_timeout = 10 + + # An alternative to using ntlm_auth is to connect to the + # winbind daemon directly for authentication. This option + # is likely to be faster and may be useful on busy systems, + # but is less well tested. + # + # Using this option requires libwbclient from Samba 4.2.1 + # or later to be installed. Make sure that ntlm_auth above is + # commented out. + # +# winbind_username = "%{mschap:User-Name}" +# winbind_domain = "%{mschap:NT-Domain}" + + # When using single sign-on with a winbind connection and the + # client uses a different casing for the username than the + # casing is according to the backend, reauth may fail because + # of some Windows internals. This switch tries to find the + # user in the correct casing in the backend, and retry + # authentication with that username. + # +# winbind_retry_with_normalised_username = no + + # + # Information for the winbind connection pool. The configuration + # items below are the same for all modules which use the new + # connection pool. + # + pool { + # Connections to create during module instantiation. + # If the server cannot create specified number of + # connections during instantiation it will exit. + # Set to 0 to allow the server to start without the + # winbind daemon being available. + start = ${thread[pool].start_servers} + + # Minimum number of connections to keep open + min = ${thread[pool].min_spare_servers} + + # Maximum number of connections + # + # If these connections are all in use and a new one + # is requested, the request will NOT get a connection. + # + # Setting 'max' to LESS than the number of threads means + # that some threads may starve, and you will see errors + # like 'No connections available and at max connection limit' + # + # Setting 'max' to MORE than the number of threads means + # that there are more connections than necessary. + max = ${thread[pool].max_servers} + + # Spare connections to be left idle + # + # NOTE: Idle connections WILL be closed if "idle_timeout" + # is set. This should be less than or equal to "max" above. + spare = ${thread[pool].max_spare_servers} + + # Number of uses before the connection is closed + # + # 0 means "infinite" + uses = 0 + + # The number of seconds to wait after the server tries + # to open a connection, and fails. During this time, + # no new connections will be opened. + retry_delay = 30 + + # The lifetime (in seconds) of the connection + # + # NOTE: A setting of 0 means infinite (no limit). + lifetime = 86400 + + # The pool is checked for free connections every + # "cleanup_interval". If there are free connections, + # then one of them is closed. + cleanup_interval = 300 + + # The idle timeout (in seconds). A connection which is + # unused for this length of time will be closed. + # + # NOTE: A setting of 0 means infinite (no timeout). + idle_timeout = 600 + + # NOTE: All configuration settings are enforced. If a + # connection is closed because of "idle_timeout", + # "uses", or "lifetime", then the total number of + # connections MAY fall below "min". When that + # happens, it will open a new connection. It will + # also log a WARNING message. + # + # The solution is to either lower the "min" connections, + # or increase lifetime/idle_timeout. + } + + passchange { + # This support MS-CHAPv2 (not v1) password change + # requests. See doc/mschap.rst for more IMPORTANT + # information. + # + # Samba/ntlm_auth - if you are using ntlm_auth to + # validate passwords, you will need to use ntlm_auth + # to change passwords. Uncomment the three lines + # below, and change the path to ntlm_auth. + # +# ntlm_auth = "/usr/bin/ntlm_auth --helper-protocol=ntlm-change-password-1" +# ntlm_auth_username = "username: %{mschap:User-Name}" +# ntlm_auth_domain = "nt-domain: %{mschap:NT-Domain}" + + # To implement a local password change, you need to + # supply a string which is then expanded, so that the + # password can be placed somewhere. e.g. passed to a + # script (exec), or written to SQL (UPDATE/INSERT). + # We give both examples here, but only one will be + # used. + # +# local_cpw = "%{exec:/path/to/script %{mschap:User-Name} %{MS-CHAP-New-Cleartext-Password}}" + # +# local_cpw = "%{sql:UPDATE radcheck set value='%{MS-CHAP-New-NT-Password}' where username='%{SQL-User-Name}' and attribute='NT-Password'}" + } + + # For Apple Server, when running on the same machine as + # Open Directory. It has no effect on other systems. + # +# use_open_directory = yes + + # On failure, set (or not) the MS-CHAP error code saying + # "retries allowed". +# allow_retry = yes + + # An optional retry message. +# retry_msg = "Re-enter (or reset) the password" +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-radius/templates/freeradius.logrotate b/seed/release/eole-2.7/2.7.1/applicationservice/eole-radius/templates/freeradius.logrotate new file mode 100644 index 0000000000000000000000000000000000000000..e0ea401520f9210ff3f853fe1b7753237349f679 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-radius/templates/freeradius.logrotate @@ -0,0 +1,11 @@ +/var/log/freeradius/*.log /var/log/rsyslog/local/freeradius/*.log { + weekly + rotate 52 + compress + delaycompress + notifempty + missingok + postrotate + [ ! -f /var/run/freeradius/freeradius.pid ] || service freeradius reload > /dev/null + endscript +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-radius/templates/radiusd.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-radius/templates/radiusd.conf new file mode 100644 index 0000000000000000000000000000000000000000..b83e2cf896a7d5af266b217cac1516adb5ad0908 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-radius/templates/radiusd.conf @@ -0,0 +1,784 @@ +# -*- text -*- +## +## radiusd.conf -- FreeRADIUS server configuration file - 3.0.16 +## +## http://www.freeradius.org/ +## $Id: 59e59f3ac443e75663333a5b7732664b67c5567d $ +## + +###################################################################### +# +# Read "man radiusd" before editing this file. See the section +# titled DEBUGGING. It outlines a method where you can quickly +# obtain the configuration you want, without running into +# trouble. +# +# Run the server in debugging mode, and READ the output. +# +# $ radiusd -X +# +# We cannot emphasize this point strongly enough. The vast +# majority of problems can be solved by carefully reading the +# debugging output, which includes warnings about common issues, +# and suggestions for how they may be fixed. +# +# There may be a lot of output, but look carefully for words like: +# "warning", "error", "reject", or "failure". The messages there +# will usually be enough to guide you to a solution. +# +# If you are going to ask a question on the mailing list, then +# explain what you are trying to do, and include the output from +# debugging mode (radiusd -X). Failure to do so means that all +# of the responses to your question will be people telling you +# to "post the output of radiusd -X". + +###################################################################### +# +# The location of other config files and logfiles are declared +# in this file. +# +# Also general configuration for modules can be done in this +# file, it is exported through the API to modules that ask for +# it. +# +# See "man radiusd.conf" for documentation on the format of this +# file. Note that the individual configuration items are NOT +# documented in that "man" page. They are only documented here, +# in the comments. +# +# The "unlang" policy language can be used to create complex +# if / else policies. See "man unlang" for details. +# + +prefix = /usr +exec_prefix = /usr +sysconfdir = /etc +localstatedir = /var +sbindir = ${exec_prefix}/sbin +logdir = /var/log/freeradius +raddbdir = /etc/freeradius/3.0 +radacctdir = ${logdir}/radacct + +# +# name of the running server. See also the "-n" command-line option. +name = freeradius + +# Location of config and logfiles. +confdir = ${raddbdir} +modconfdir = ${confdir}/mods-config +ssldir = ${confdir}/ssl +certdir = ${ssldir}/certs +keydir = ${ssldir}/private +cadir = ${sysconfdir}/ssl/certs +run_dir = ${localstatedir}/run/${name} + +# Should likely be ${localstatedir}/lib/radiusd +db_dir = ${raddbdir} + +# +# libdir: Where to find the rlm_* modules. +# +# This should be automatically set at configuration time. +# +# If the server builds and installs, but fails at execution time +# with an 'undefined symbol' error, then you can use the libdir +# directive to work around the problem. +# +# The cause is usually that a library has been installed on your +# system in a place where the dynamic linker CANNOT find it. When +# executing as root (or another user), your personal environment MAY +# be set up to allow the dynamic linker to find the library. When +# executing as a daemon, FreeRADIUS MAY NOT have the same +# personalized configuration. +# +# To work around the problem, find out which library contains that symbol, +# and add the directory containing that library to the end of 'libdir', +# with a colon separating the directory names. NO spaces are allowed. +# +# e.g. libdir = /usr/local/lib:/opt/package/lib +# +# You can also try setting the LD_LIBRARY_PATH environment variable +# in a script which starts the server. +# +# If that does not work, then you can re-configure and re-build the +# server to NOT use shared libraries, via: +# +# ./configure --disable-shared +# make +# make install +# +libdir = /usr/lib/freeradius + +# pidfile: Where to place the PID of the RADIUS server. +# +# The server may be signalled while it's running by using this +# file. +# +# This file is written when ONLY running in daemon mode. +# +# e.g.: kill -HUP `cat /var/run/radiusd/radiusd.pid` +# +pidfile = ${run_dir}/${name}.pid + +# +# correct_escapes: use correct backslash escaping +# +# Prior to version 3.0.5, the handling of backslashes was a little +# awkward, i.e. "wrong". In some cases, to get one backslash into +# a regex, you had to put 4 in the config files. +# +# Version 3.0.5 fixes that. However, for backwards compatibility, +# the new method of escaping is DISABLED BY DEFAULT. This means +# that upgrading to 3.0.5 won't break your configuration. +# +# If you don't have double backslashes (i.e. \\) in your configuration, +# this won't matter to you. If you do have them, fix that to use only +# one backslash, and then set "correct_escapes = true". +# +# You can check for this by doing: +# +# $ grep '\\\\' $(find raddb -type f -print) +# +correct_escapes = true + +# panic_action: Command to execute if the server dies unexpectedly. +# +# FOR PRODUCTION SYSTEMS, ACTIONS SHOULD ALWAYS EXIT. +# AN INTERACTIVE ACTION MEANS THE SERVER IS NOT RESPONDING TO REQUESTS. +# AN INTERACTICE ACTION MEANS THE SERVER WILL NOT RESTART. +# +# THE SERVER MUST NOT BE ALLOWED EXECUTE UNTRUSTED PANIC ACTION CODE +# PATTACH CAN BE USED AS AN ATTACK VECTOR. +# +# The panic action is a command which will be executed if the server +# receives a fatal, non user generated signal, i.e. SIGSEGV, SIGBUS, +# SIGABRT or SIGFPE. +# +# This can be used to start an interactive debugging session so +# that information regarding the current state of the server can +# be acquired. +# +# The following string substitutions are available: +# - %e The currently executing program e.g. /sbin/radiusd +# - %p The PID of the currently executing program e.g. 12345 +# +# Standard ${} substitutions are also allowed. +# +# An example panic action for opening an interactive session in GDB would be: +# +#panic_action = "gdb %e %p" +# +# Again, don't use that on a production system. +# +# An example panic action for opening an automated session in GDB would be: +# +#panic_action = "gdb -silent -x ${raddbdir}/panic.gdb %e %p 2>&1 | tee ${logdir}/gdb-${name}-%p.log" +# +# That command can be used on a production system. +# + +# max_request_time: The maximum time (in seconds) to handle a request. +# +# Requests which take more time than this to process may be killed, and +# a REJECT message is returned. +# +# WARNING: If you notice that requests take a long time to be handled, +# then this MAY INDICATE a bug in the server, in one of the modules +# used to handle a request, OR in your local configuration. +# +# This problem is most often seen when using an SQL database. If it takes +# more than a second or two to receive an answer from the SQL database, +# then it probably means that you haven't indexed the database. See your +# SQL server documentation for more information. +# +# Useful range of values: 5 to 120 +# +max_request_time = 30 + +# cleanup_delay: The time to wait (in seconds) before cleaning up +# a reply which was sent to the NAS. +# +# The RADIUS request is normally cached internally for a short period +# of time, after the reply is sent to the NAS. The reply packet may be +# lost in the network, and the NAS will not see it. The NAS will then +# re-send the request, and the server will respond quickly with the +# cached reply. +# +# If this value is set too low, then duplicate requests from the NAS +# MAY NOT be detected, and will instead be handled as separate requests. +# +# If this value is set too high, then the server will cache too many +# requests, and some new requests may get blocked. (See 'max_requests'.) +# +# Useful range of values: 2 to 10 +# +cleanup_delay = 5 + +# max_requests: The maximum number of requests which the server keeps +# track of. This should be 256 multiplied by the number of clients. +# e.g. With 4 clients, this number should be 1024. +# +# If this number is too low, then when the server becomes busy, +# it will not respond to any new requests, until the 'cleanup_delay' +# time has passed, and it has removed the old requests. +# +# If this number is set too high, then the server will use a bit more +# memory for no real benefit. +# +# If you aren't sure what it should be set to, it's better to set it +# too high than too low. Setting it to 1000 per client is probably +# the highest it should be. +# +# Useful range of values: 256 to infinity +# +max_requests = 16384 + +# hostname_lookups: Log the names of clients or just their IP addresses +# e.g., www.freeradius.org (on) or 206.47.27.232 (off). +# +# The default is 'off' because it would be overall better for the net +# if people had to knowingly turn this feature on, since enabling it +# means that each client request will result in AT LEAST one lookup +# request to the nameserver. Enabling hostname_lookups will also +# mean that your server may stop randomly for 30 seconds from time +# to time, if the DNS requests take too long. +# +# Turning hostname lookups off also means that the server won't block +# for 30 seconds, if it sees an IP address which has no name associated +# with it. +# +# allowed values: {no, yes} +# +hostname_lookups = no + +# +# Logging section. The various "log_*" configuration items +# will eventually be moved here. +# +log { + # + # Destination for log messages. This can be one of: + # + # files - log to "file", as defined below. + # syslog - to syslog (see also the "syslog_facility", below. + # stdout - standard output + # stderr - standard error. + # + # The command-line option "-X" over-rides this option, and forces + # logging to go to stdout. + # + destination = syslog + + # + # Highlight important messages sent to stderr and stdout. + # + # Option will be ignored (disabled) if output if TERM is not + # an xterm or output is not to a TTY. + # + colourise = yes + + # + # The logging messages for the server are appended to the + # tail of this file if destination == "files" + # + # If the server is running in debugging mode, this file is + # NOT used. + # + file = ${logdir}/radius.log + + # + # Which syslog facility to use, if ${destination} == "syslog" + # + # The exact values permitted here are OS-dependent. You probably + # don't want to change this. + # + syslog_facility = daemon + + # Log the full User-Name attribute, as it was found in the request. + # + # allowed values: {no, yes} + # + stripped_names = no + + # Log authentication requests to the log file. + # + # allowed values: {no, yes} + # + auth = yes + + # Log passwords with the authentication requests. + # auth_badpass - logs password if it's rejected + # auth_goodpass - logs password if it's correct + # + # allowed values: {no, yes} + # + auth_badpass = no + auth_goodpass = no + + # Log additional text at the end of the "Login OK" messages. + # for these to work, the "auth" and "auth_goodpass" or "auth_badpass" + # configurations above have to be set to "yes". + # + # The strings below are dynamically expanded, which means that + # you can put anything you want in them. However, note that + # this expansion can be slow, and can negatively impact server + # performance. + # +# msg_goodpass = "" +# msg_badpass = "" + + # The message when the user exceeds the Simultaneous-Use limit. + # + msg_denied = "You are already logged in - access denied" +} + +# The program to execute to do concurrency checks. +checkrad = ${sbindir}/checkrad + +# SECURITY CONFIGURATION +# +# There may be multiple methods of attacking on the server. This +# section holds the configuration items which minimize the impact +# of those attacks +# +security { + # chroot: directory where the server does "chroot". + # + # The chroot is done very early in the process of starting + # the server. After the chroot has been performed it + # switches to the "user" listed below (which MUST be + # specified). If "group" is specified, it switches to that + # group, too. Any other groups listed for the specified + # "user" in "/etc/group" are also added as part of this + # process. + # + # The current working directory (chdir / cd) is left + # *outside* of the chroot until all of the modules have been + # initialized. This allows the "raddb" directory to be left + # outside of the chroot. Once the modules have been + # initialized, it does a "chdir" to ${logdir}. This means + # that it should be impossible to break out of the chroot. + # + # If you are worried about security issues related to this + # use of chdir, then simply ensure that the "raddb" directory + # is inside of the chroot, end be sure to do "cd raddb" + # BEFORE starting the server. + # + # If the server is statically linked, then the only files + # that have to exist in the chroot are ${run_dir} and + # ${logdir}. If you do the "cd raddb" as discussed above, + # then the "raddb" directory has to be inside of the chroot + # directory, too. + # +# chroot = /path/to/chroot/directory + + # user/group: The name (or #number) of the user/group to run radiusd as. + # + # If these are commented out, the server will run as the + # user/group that started it. In order to change to a + # different user/group, you MUST be root ( or have root + # privileges ) to start the server. + # + # We STRONGLY recommend that you run the server with as few + # permissions as possible. That is, if you're not using + # shadow passwords, the user and group items below should be + # set to radius'. + # + # NOTE that some kernels refuse to setgid(group) when the + # value of (unsigned)group is above 60000; don't use group + # "nobody" on these systems! + # + # On systems with shadow passwords, you might have to set + # 'group = shadow' for the server to be able to read the + # shadow password file. If you can authenticate users while + # in debug mode, but not in daemon mode, it may be that the + # debugging mode server is running as a user that can read + # the shadow info, and the user listed below can not. + # + # The server will also try to use "initgroups" to read + # /etc/groups. It will join all groups where "user" is a + # member. This can allow for some finer-grained access + # controls. + # + user = freerad + group = freerad + + # Core dumps are a bad thing. This should only be set to + # 'yes' if you're debugging a problem with the server. + # + # allowed values: {no, yes} + # + allow_core_dumps = no + + # + # max_attributes: The maximum number of attributes + # permitted in a RADIUS packet. Packets which have MORE + # than this number of attributes in them will be dropped. + # + # If this number is set too low, then no RADIUS packets + # will be accepted. + # + # If this number is set too high, then an attacker may be + # able to send a small number of packets which will cause + # the server to use all available memory on the machine. + # + # Setting this number to 0 means "allow any number of attributes" + max_attributes = 200 + + # + # reject_delay: When sending an Access-Reject, it can be + # delayed for a few seconds. This may help slow down a DoS + # attack. It also helps to slow down people trying to brute-force + # crack a users password. + # + # Setting this number to 0 means "send rejects immediately" + # + # If this number is set higher than 'cleanup_delay', then the + # rejects will be sent at 'cleanup_delay' time, when the request + # is deleted from the internal cache of requests. + # + # As of Version 3.0.5, "reject_delay" has sub-second resolution. + # e.g. "reject_delay = 1.4" seconds is possible. + # + # Useful ranges: 1 to 5 + reject_delay = 1 + + # + # status_server: Whether or not the server will respond + # to Status-Server requests. + # + # When sent a Status-Server message, the server responds with + # an Access-Accept or Accounting-Response packet. + # + # This is mainly useful for administrators who want to "ping" + # the server, without adding test users, or creating fake + # accounting packets. + # + # It's also useful when a NAS marks a RADIUS server "dead". + # The NAS can periodically "ping" the server with a Status-Server + # packet. If the server responds, it must be alive, and the + # NAS can start using it for real requests. + # + # See also raddb/sites-available/status + # + status_server = yes + + +} + +# PROXY CONFIGURATION +# +# proxy_requests: Turns proxying of RADIUS requests on or off. +# +# The server has proxying turned on by default. If your system is NOT +# set up to proxy requests to another server, then you can turn proxying +# off here. This will save a small amount of resources on the server. +# +# If you have proxying turned off, and your configuration files say +# to proxy a request, then an error message will be logged. +# +# To disable proxying, change the "yes" to "no", and comment the +# $INCLUDE line. +# +# allowed values: {no, yes} +# +#proxy_requests = yes +%if %%activer_proxy_radius == 'oui' +proxy_requests = yes +$INCLUDE proxy.conf +%else +proxy_requests = no +#$INCLUDE proxy.conf +%end if + + +# CLIENTS CONFIGURATION +# +# Client configuration is defined in "clients.conf". +# + +# The 'clients.conf' file contains all of the information from the old +# 'clients' and 'naslist' configuration files. We recommend that you +# do NOT use 'client's or 'naslist', although they are still +# supported. +# +# Anything listed in 'clients.conf' will take precedence over the +# information from the old-style configuration files. +# +$INCLUDE clients.conf + + +# THREAD POOL CONFIGURATION +# +# The thread pool is a long-lived group of threads which +# take turns (round-robin) handling any incoming requests. +# +# You probably want to have a few spare threads around, +# so that high-load situations can be handled immediately. If you +# don't have any spare threads, then the request handling will +# be delayed while a new thread is created, and added to the pool. +# +# You probably don't want too many spare threads around, +# otherwise they'll be sitting there taking up resources, and +# not doing anything productive. +# +# The numbers given below should be adequate for most situations. +# +thread pool { + # Number of servers to start initially --- should be a reasonable + # ballpark figure. + start_servers = 5 + + # Limit on the total number of servers running. + # + # If this limit is ever reached, clients will be LOCKED OUT, so it + # should NOT BE SET TOO LOW. It is intended mainly as a brake to + # keep a runaway server from taking the system with it as it spirals + # down... + # + # You may find that the server is regularly reaching the + # 'max_servers' number of threads, and that increasing + # 'max_servers' doesn't seem to make much difference. + # + # If this is the case, then the problem is MOST LIKELY that + # your back-end databases are taking too long to respond, and + # are preventing the server from responding in a timely manner. + # + # The solution is NOT do keep increasing the 'max_servers' + # value, but instead to fix the underlying cause of the + # problem: slow database, or 'hostname_lookups=yes'. + # + # For more information, see 'max_request_time', above. + # + max_servers = 32 + + # Server-pool size regulation. Rather than making you guess + # how many servers you need, FreeRADIUS dynamically adapts to + # the load it sees, that is, it tries to maintain enough + # servers to handle the current load, plus a few spare + # servers to handle transient load spikes. + # + # It does this by periodically checking how many servers are + # waiting for a request. If there are fewer than + # min_spare_servers, it creates a new spare. If there are + # more than max_spare_servers, some of the spares die off. + # The default values are probably OK for most sites. + # + min_spare_servers = 3 + max_spare_servers = 10 + + # When the server receives a packet, it places it onto an + # internal queue, where the worker threads (configured above) + # pick it up for processing. The maximum size of that queue + # is given here. + # + # When the queue is full, any new packets will be silently + # discarded. + # + # The most common cause of the queue being full is that the + # server is dependent on a slow database, and it has received + # a large "spike" of traffic. When that happens, there is + # very little you can do other than make sure the server + # receives less traffic, or make sure that the database can + # handle the load. + # +# max_queue_size = 65536 + + # Clean up old threads periodically. For no reason other than + # it might be useful. + # + # '0' is a special value meaning 'infinity', or 'the servers never + # exit' + max_requests_per_server = 0 + + # Automatically limit the number of accounting requests. + # This configuration item tracks how many requests per second + # the server can handle. It does this by tracking the + # packets/s received by the server for processing, and + # comparing that to the packets/s handled by the child + # threads. + # + + # If the received PPS is larger than the processed PPS, *and* + # the queue is more than half full, then new accounting + # requests are probabilistically discarded. This lowers the + # number of packets that the server needs to process. Over + # time, the server will "catch up" with the traffic. + # + # Throwing away accounting packets is usually safe and low + # impact. The NAS will retransmit them in a few seconds, or + # even a few minutes. Vendors should read RFC 5080 Section 2.2.1 + # to see how accounting packets should be retransmitted. Using + # any other method is likely to cause network meltdowns. + # + auto_limit_acct = no +} + +###################################################################### +# +# SNMP notifications. Uncomment the following line to enable +# snmptraps. Note that you MUST also configure the full path +# to the "snmptrap" command in the "trigger.conf" file. +# +#$INCLUDE trigger.conf + +# MODULE CONFIGURATION +# +# The names and configuration of each module is located in this section. +# +# After the modules are defined here, they may be referred to by name, +# in other sections of this configuration file. +# +modules { + # + # Each module has a configuration as follows: + # + # name [ instance ] { + # config_item = value + # ... + # } + # + # The 'name' is used to load the 'rlm_name' library + # which implements the functionality of the module. + # + # The 'instance' is optional. To have two different instances + # of a module, it first must be referred to by 'name'. + # The different copies of the module are then created by + # inventing two 'instance' names, e.g. 'instance1' and 'instance2' + # + # The instance names can then be used in later configuration + # INSTEAD of the original 'name'. See the 'radutmp' configuration + # for an example. + # + + # + # As of 3.0, modules are in mods-enabled/. Files matching + # the regex /[a-zA-Z0-9_.]+/ are loaded. The modules are + # initialized ONLY if they are referenced in a processing + # section, such as authorize, authenticate, accounting, + # pre/post-proxy, etc. + # + $INCLUDE mods-enabled/ +} + +# Instantiation +# +# This section orders the loading of the modules. Modules +# listed here will get loaded BEFORE the later sections like +# authorize, authenticate, etc. get examined. +# +# This section is not strictly needed. When a section like +# authorize refers to a module, it's automatically loaded and +# initialized. However, some modules may not be listed in any +# of the following sections, so they can be listed here. +# +# Also, listing modules here ensures that you have control over +# the order in which they are initialized. If one module needs +# something defined by another module, you can list them in order +# here, and ensure that the configuration will be OK. +# +# After the modules listed here have been loaded, all of the modules +# in the "mods-enabled" directory will be loaded. Loading the +# "mods-enabled" directory means that unlike Version 2, you usually +# don't need to list modules here. +# +instantiate { + # + # We list the counter module here so that it registers + # the check_name attribute before any module which sets + # it +# daily + + # subsections here can be thought of as "virtual" modules. + # + # e.g. If you have two redundant SQL servers, and you want to + # use them in the authorize and accounting sections, you could + # place a "redundant" block in each section, containing the + # exact same text. Or, you could uncomment the following + # lines, and list "redundant_sql" in the authorize and + # accounting sections. + # + # The "virtual" module defined here can also be used with + # dynamic expansions, under a few conditions: + # + # * The section is "redundant", or "load-balance", or + # "redundant-load-balance" + # * The section contains modules ONLY, and no sub-sections + # * all modules in the section are using the same rlm_ + # driver, e.g. They are all sql, or all ldap, etc. + # + # When those conditions are satisfied, the server will + # automatically register a dynamic expansion, using the + # name of the "virtual" module. In the example below, + # it will be "redundant_sql". You can then use this expansion + # just like any other: + # + # update reply { + # Filter-Id := "%{redundant_sql: ... }" + # } + # + # In this example, the expansion is done via module "sql1", + # and if that expansion fails, using module "sql2". + # + # For best results, configure the "pool" subsection of the + # module so that "retry_delay" is non-zero. That will allow + # the redundant block to quickly ignore all "down" SQL + # databases. If instead we have "retry_delay = 0", then + # every time the redundant block is used, the server will try + # to open a connection to every "down" database, causing + # problems. + # + #redundant redundant_sql { + # sql1 + # sql2 + #} +} + +###################################################################### +# +# Policies are virtual modules, similar to those defined in the +# "instantiate" section above. +# +# Defining a policy in one of the policy.d files means that it can be +# referenced in multiple places as a *name*, rather than as a series of +# conditions to match, and actions to take. +# +# Policies are something like subroutines in a normal language, but +# they cannot be called recursively. They MUST be defined in order. +# If policy A calls policy B, then B MUST be defined before A. +# +###################################################################### +policy { + $INCLUDE policy.d/ +} + +###################################################################### +# +# Load virtual servers. +# +# This next $INCLUDE line loads files in the directory that +# match the regular expression: /[a-zA-Z0-9_.]+/ +# +# It allows you to define new virtual servers simply by placing +# a file into the raddb/sites-enabled/ directory. +# +$INCLUDE sites-enabled/ + +###################################################################### +# +# All of the other configuration sections like "authorize {}", +# "authenticate {}", "accounting {}", have been moved to the +# the file: +# +# raddb/sites-available/default +# +# This is the "default" virtual server that has the same +# configuration as in version 1.0.x and 1.1.x. The default +# installation enables this virtual server. You should +# edit it to create policies for your local site. +# +# For more documentation on virtual servers, see: +# +# raddb/sites-available/README +# +###################################################################### diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-reverseproxy/dictionaries/00_eole-reverseproxy_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-reverseproxy/dictionaries/00_eole-reverseproxy_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..0a9eb6f87694ff4cc1036615424630290bf351e3 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-reverseproxy/dictionaries/00_eole-reverseproxy_packages.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>eole-reverseproxy-pkg</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-reverseproxy/dictionaries/25_nginx.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-reverseproxy/dictionaries/25_nginx.xml new file mode 100644 index 0000000000000000000000000000000000000000..742d40aaee0d7373ebe1ed05a2f54470f94d15a5 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-reverseproxy/dictionaries/25_nginx.xml @@ -0,0 +1,314 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + <files> + <!-- le service nginx est déclaré dans 28_eoleflask.xml --> + <service_access service='nginx'> + <port service_accesslist="nginx">80</port> + <port service_accesslist="nginx">443</port> + <port service_accesslist="revsso">8443</port> + </service_access> + <file name='/etc/nginx/sites-enabled/default' source='nginx.default' rm="True"/> + <file name='/etc/nginx/eole_proxy_params' source='nginx.proxy-params'/> + <file name='/usr/share/nginx/html/nginx.html'/> + <file name='/var/www/index.html' source='nginx.no_proxy.html' mkdir='True'/> + <file name='/etc/logrotate.d/nginx' source='nginx.logrotate'/> + <file name='/etc/systemd/system/nginx.service.d/override.conf' source='nginx.override' mkdir='True'/> + <!--<file name="/etc/nginx/sites-enabled/access_proxy"/>--> + </files> + + <variables> + + <family name='services'> + <!-- Nginx fait serveur HTTP même si la fonctionnalité reverse proxy est désactivée --> + <variable name='test_activer_nginx_web' type='oui/non' description="Vérifier s’il est possible d’activer la publication d’applications web par Nginx" /> + + <variable name='test_hide_nginx_family' type='oui/non' description="Vérifier s’il faut cacher la famille Nginx" /> + + <variable name='activer_nginx_web' type='oui/non' description='Activer la publication d’applications web par Nginx'> + <value>oui</value> + </variable> + + <variable name='activer_revprox' type='oui/non' description='Activer le reverse proxy Nginx'> + <value>non</value> + </variable> + + <variable name='activer_apache' type='oui/non' exists='False' hidden='True'> + <value>non</value> + </variable> + + <variable name='activer_sso' type='string' exists='False' hidden='True'> + <value>non</value> + </variable> + </family> + + <family name='Nginx' icon='nginx'> + + <variable name='test_nginx_open_port' type="oui/non" description="Ouvrir les ports Nginx" /> + + <variable name='revprox_default' type="domain_strict" description="Nom de domaine par défaut" /> + + <variable name='nginx_degrade_http' type='oui/non' description='Dégrader la sécurité en HTTP' mode='expert'> + <value>non</value> + </variable> + + <variable name='revprox_hash_bucket_size' type='string' description="Longueur maximum pour un nom de domaine" mode="expert"> + <value>128</value> + </variable> + + <variable name='php_post_max_size' type='number' description="Taille maximale des données reçues par la méthode POST (en Mo)" exists="False" mode='expert'> + <value>32</value> + </variable> + </family> + + <family name='Applications web Nginx' icon='nginx' /> + + <family name='Reverse proxy' icon='nginx'> + <variable name='revprox_sso' type='domain' description="Nom de domaine du serveur SSO" /> + <variable name='revprox_eop' type='domain' description="Nom de domaine du serveur EOP" /> + <variable name='activer_revprox_ead' type='oui/non' description="Activer la redirection de l'EAD Scribe"> + <value>non</value> + </variable> + <variable name='revprox_ead' type='ip' description="IP du Scribe pour la redirection EAD" mandatory="True"/> + <variable name='revprox_ead_port' type='port' description="Port de l'EAD sur le Scribe" mandatory="True"> + <value>4203</value> + </variable> + <variable name='revprox_auto_config_local_web' type='oui/non' description='Activer la configuration automatique pour les applications locales'> + <value>non</value> + </variable> + <variable name='revprox_activate_http' type='oui/non' description='Activer le reverse proxy Nginx pour http/https'> + <value>non</value> + </variable> + + <variable name='revprox_domainname' type='domain' description="Nom de domaine ou IP à rediriger" multi='True' mandatory='True'/> + <variable name='revprox_domain_wildcard' type='oui/non' description="Activer la redirection pour tous les sous-domaines"> + <value>non</value> + </variable> + <variable name='revprox_le_cert' type='oui/non' description="Demander un certificat à Let's Encrypt pour ce domaine ?"> + <value>oui</value> + </variable> + <variable name='revprox_rep' type='string' description="Répertoire ou nom de la page à rediriger"> + <value>/</value> + </variable> + <variable name='revprox_http' type='string' description="Reverse proxy HTTP"> + <value>redirige vers https</value> + </variable> + <variable name='revprox_https' type='oui/non' description="Reverse proxy HTTPS"> + <value>oui</value> + </variable> + <variable name='revprox_url' type='web_address' description="IP ou domaine de destination (avec http:// ou https://) ou URI complète" mandatory='True'/> + + <variable name="activer_revprox_rewrite" type="oui/non" description="Activer la réécriture d'URL" mode="expert"> + <value>non</value> + </variable> + <variable name="revprox_rewrite_domaine" type="domain" description="Nom de domaine concerné par la réécriture" mode="expert" multi="True" mandatory='True'/> + <variable name="revprox_rewrite_proto" type="string" description="Protocole" mode="expert"> + <value>http/https</value> + </variable> + <variable name='revprox_rewrite_location' type='string' description="Répertoire de la réécriture" mode="expert" mandatory='True'/> + <variable name="revprox_rewrite_regex" type="string" description="Regex de la réécriture" mode="expert" mandatory='True'/> + <variable name="revprox_rewrite_replacement" type="string" description="La valeur de remplacement" mode="expert" mandatory='True'/> + <variable name='revprox_redirection_http' type='oui/non' description='Activer la redirection des domaines'> + <value>non</value> + </variable> + <variable name='revprox_redirection' type='domain' description="Nom de domaine à rediriger" multi='True' mandatory='True'> + <value></value> + </variable> + <variable name='revprox_redirection_rep' type='string' description="Nom du répertoire du domaine à rediriger" mandatory='True'> + <value>/</value> + </variable> + <variable name='revprox_redirection_destination' type='web_address' description="Nom de domaine de destination" mandatory='True'> + <value></value> + </variable> + </family> + <family name='applications web' hidden='True'> + <!-- creer si n'existe pas et cache--> + <variable name='activer_web_behind_revproxy' type='oui/non' exists='False' hidden='True'> + <value>non</value> + </variable> + <variable name='web_behind_revproxy_ip' type='ip' exists='False' hidden='True'/> + </family> + + <separators> + <separator name='revprox_sso' never_hidden='True'>Redirection de services particuliers</separator> + <separator name='revprox_activate_http'>Redirection HTTP et HTTPS</separator> + </separators> + + </variables> + + <constraints> + + <!-- Publish web application with Nginx --> + <auto name='calc_multi_condition' target='test_activer_nginx_web'> + <param>['non', 'oui']</param> + <param type='eole' name='condition_1'>mode_conteneur_actif</param> + <param type='eole' name='condition_2'>activer_apache</param> + <param name='match'>non</param> + <param name='mismatch'>oui</param> + </auto> + + <auto name='calc_multi_condition' target='test_hide_nginx_family'> + <param>non</param> + <param type='eole' name='condition_1' hidden='False'>activer_nginx_web</param> + <param type='eole' name='condition_2'>activer_revprox</param> + <param name='match'>oui</param> + <param name='mismatch'>non</param> + </auto> + + <fill name='calc_val' target='activer_nginx_web'> + <param type='eole' name='valeur'>test_activer_nginx_web</param> + </fill> + + <condition name='frozen_if_in' source='test_activer_nginx_web'> + <param>non</param> + <target type='variable'>activer_nginx_web</target> + </condition> + + <condition name='disabled_if_in' source='test_hide_nginx_family'> + <param>oui</param> + <target type='family'>Nginx</target> + </condition> + + <auto name='calc_multi_condition' target='test_nginx_open_port'> + <param>oui</param> + <param name="operator">OR</param> + <param type='eole' name="condition_1" hidden='False'>revprox_activate_http</param> + <param type='eole' name="condition_2" hidden='False'>revprox_auto_config_local_web</param> + <param type='eole' name="condition_3" hidden='False'>activer_nginx_web</param> + <param name='match'>oui</param> + <param name='mismatch'>non</param> + </auto> + + <condition name='disabled_if_in' source='test_nginx_open_port'> + <param>non</param> + <target type='service_accesslist'>nginx</target> + </condition> + + <!-- **** Listes deroulantes **** --> + <check name='valid_enum' target='revprox_http'> + <param>['oui','non', 'redirige vers https']</param> + </check> + <check name='valid_enum' target='revprox_rewrite_proto'> + <param>['http/https','http', 'https']</param> + </check> + <check name='valid_enum' target='revprox_hash_bucket_size'> + <param>['128', '64', '32']</param> + </check> + <!-- **** Conditions **** --> + <condition name='disabled_if_in' source='activer_revprox'> + <param>non</param> + <target type='family'>Reverse proxy</target> + <target type='filelist'>revprox</target> + </condition> + <condition name='disabled_if_in' source='activer_revprox'> + <param>oui</param> + <target type='filelist'>ead3_nginx</target> + </condition> + <condition name='disabled_if_in' source='activer_sso'> + <param>local</param> + <target type='variable'>revprox_sso</target> + </condition> + <condition name='disabled_if_in' source='activer_apache'> + <param>non</param> + <target type='variable'>revprox_auto_config_local_web</target> + </condition> + <condition name='disabled_if_in' source='mode_conteneur_actif'> + <param>non</param> + <target type='variable'>revprox_auto_config_local_web</target> + </condition> + <condition name='disabled_if_in' source='activer_revprox_rewrite'> + <param>non</param> + <target type='variable'>revprox_rewrite_proto</target> + <target type='variable'>revprox_rewrite_domaine</target> + <target type='variable'>revprox_rewrite_location</target> + <target type='variable'>revprox_rewrite_regex</target> + <target type='variable'>revprox_rewrite_replacement</target> + </condition> + <condition name='disabled_if_in' source='activer_revprox_ead'> + <param>non</param> + <target type='variable'>revprox_ead</target> + <target type='variable'>revprox_ead_port</target> + </condition> + <group master='revprox_domainname'> + <slave>revprox_domain_wildcard</slave> + <slave>revprox_rep</slave> + <slave>revprox_le_cert</slave> + <slave>revprox_http</slave> + <slave>revprox_https</slave> + <slave>revprox_url</slave> + </group> + <group master='revprox_rewrite_domaine'> + <slave>revprox_rewrite_proto</slave> + <slave>revprox_rewrite_location</slave> + <slave>revprox_rewrite_regex</slave> + <slave>revprox_rewrite_replacement</slave> + </group> + <condition name='disabled_if_in' source='cert_type'> + <param>autosigné</param> + <target type='variable'>revprox_le_cert</target> + </condition> + <condition name='disabled_if_in' source='cert_type'> + <param>manuel</param> + <target type='variable'>revprox_le_cert</target> + </condition> + <condition name='disabled_if_in' source='revprox_domain_wildcard'> + <param>oui</param> + <target type='variable'>revprox_le_cert</target> + </condition> + <condition name='disabled_if_in' source='revprox_activate_http'> + <param>non</param> + <target type='variable'>revprox_domainname</target> + <target type='variable'>revprox_domain_wildcard</target> + <target type='variable'>revprox_le_cert</target> + <target type='variable'>revprox_rep</target> + <target type='variable'>revprox_http</target> + <target type='variable'>revprox_https</target> + <target type='variable'>revprox_url</target> + </condition> + <condition name='disabled_if_in' source='revprox_sso'> + <param></param> + <target type='service_accesslist'>revsso</target> + </condition> + <condition name='disabled_if_in' source='activer_web_behind_revproxy'> + <param>non</param> + <target type='variable'>web_behind_revproxy_ip</target> + </condition> + <fill name='calc_val' target='revprox_ead'> + <param type='eole' name='valeur' optional='True' hidden='False'>ip_serveur_scribe_dmz</param> + </fill> + <group master='revprox_redirection'> + <slave>revprox_redirection_rep</slave> + <slave>revprox_redirection_destination</slave> + </group> + <condition name='disabled_if_in' source='revprox_redirection_http'> + <param>non</param> + <target type='variable'>revprox_redirection</target> + <target type='variable'>revprox_redirection_rep</target> + <target type='variable'>revprox_redirection_destination</target> + </condition> + + </constraints> + <!--************************************************************************************************* --> + <help> + <family name='Nginx'>Paramétrage global de Nginx</family> + <family name='Applications web Nginx'>Paramétrage des applications web publiées par Nginx</family> + <variable name='test_activer_nginx_web'>Vérifie que le mode conteneur est actif ou qu’apache est désactivé.</variable> + <variable name='test_hide_nginx_family'>Vérifie que la publication d’application web par Nginx et le reverse proxy sont désactivés.</variable> + <variable name='test_nginx_open_port'>Vérifie que la publication d’application web par Nginx ou le reverse proxy HTTP ou la configuration automatique des applications locales est actif.</variable> + <variable name='activer_nginx_web'>Publier les applications web par Nginx</variable> + <variable name='revprox_default'>Si un client accède au serveur avec un nom de domaine non déclaré, le flux est redirigé vers ce domaine</variable> + <variable name='nginx_degrade_http'>Désactiver l’utilisation du HTTPS. Certaines applications comme gen_config sont désactivées dans ce cas.</variable> + <family name='Reverse proxy'>Paramètrage du proxy inverse</family> + <variable name='revprox_sso'>Pour rediriger vers le SSO de la machine "domainelocal", taper "domainelocal"</variable> + <variable name='revprox_eop'>Pour rediriger vers EOP de la machine "domainelocal", taper "domainelocal"</variable> + <variable name='revprox_auto_config_local_web'>Configure automatiquement le reverse proxy afin de faire pointer web_url sur le conteneur web</variable> + <variable name='revprox_domainname'>Exemple : pour rediriger "http://domaine/" saisir "domaine"</variable> + <variable name='revprox_domain_wildcard'>Exemple pour "domaine" : tous les sous-domaines de "domaine" seront redirigés</variable> + <variable name='revprox_le_cert'>Demander un certificat SSL au serveur ACME (Let's Encrypt) pour ce domaine</variable> + <variable name='revprox_rep'>URL relative (sans le nom de domaine) redirigée pour l'adresse définie dans la variable ci-dessus (exemple "/mail")</variable> + <variable name='revprox_url'>Nom de domaine ou IP de destination, par exemple "http://domainelocal" ou URI, par exemple "http://domainelocal/dir/"</variable> + <variable name='activer_revprox'>Le Reverse Proxy permet de relayer des accès extérieurs vers des serveurs situés derrière le pare-feu</variable> + </help> +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-reverseproxy/files/usr/share/eole/diagnose/70-nginx b/seed/release/eole-2.7/2.7.1/applicationservice/eole-reverseproxy/files/usr/share/eole/diagnose/70-nginx new file mode 100644 index 0000000000000000000000000000000000000000..7df583d042b13971e9c8f81a7635587e8df50b29 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-reverseproxy/files/usr/share/eole/diagnose/70-nginx @@ -0,0 +1,15 @@ +#!/bin/bash + +if [ $(CreoleGet activer_revprox) = "oui" ];then + . /usr/lib/eole/diagnose.sh + EchoGras "*** Reverse Proxy" + if [ "$(CreoleGet revprox_auto_config_local_web 2>/dev/null)" = "oui" -o \ + $(CreoleGet revprox_activate_http) = "oui" ];then + TestHTTPPage "nginx" "http://localhost/50x.html" + else + NoConfig "nginx" + fi + echo +fi + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-reverseproxy/pretemplates/00-reverseproxy b/seed/release/eole-2.7/2.7.1/applicationservice/eole-reverseproxy/pretemplates/00-reverseproxy new file mode 100644 index 0000000000000000000000000000000000000000..ad61487b1a456b05c574307485bfe43cc7b01131 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-reverseproxy/pretemplates/00-reverseproxy @@ -0,0 +1,10 @@ +#!/bin/bash +DEFAULT="/etc/nginx/sites-enabled/default" +# suppression du lien symbolique nginx +if [ -L $DEFAULT ];then + rm -f $DEFAULT +fi + +rm -f /var/www/wpad.dat + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-reverseproxy/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-reverseproxy/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..afe0af4745394006186f59ab51c1befedeb068f2 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-reverseproxy/service.yml @@ -0,0 +1,36 @@ +format: '0.1' +name: eole-reverseproxy +version: |- + 2.7.1-1 +description: |- + Templates et dictionnaires pour le service reverseproxy + Configuration du serveur web et reverseproxy nginX + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: [] +packages: + - eole-reverseproxy-pkg +dictionaries: + - 25_nginx.xml +extra_dictionaries: {} +templates: + - nginx.default + - nginx.html + - nginx.logrotate + - nginx.no_proxy.html + - nginx.override + - nginx.proxy-params +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: + - 00-reverseproxy +posttemplates: [] +files: + /usr/share/eole/diagnose/70-nginx: + owner: root + group: root + mode: '0755' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-reverseproxy/templates/nginx.default b/seed/release/eole-2.7/2.7.1/applicationservice/eole-reverseproxy/templates/nginx.default new file mode 100644 index 0000000000000000000000000000000000000000..2044098d98e281821d8ade02016dc96ec152351e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-reverseproxy/templates/nginx.default @@ -0,0 +1,404 @@ +%if not %%is_defined('php_post_max_size') + %set %%php_post_max_size = 32 +%end if +client_max_body_size %%{php_post_max_size}M; +client_body_buffer_size 128k; + +%if %%getVar('activer_web_behind_revproxy', 'non') == 'oui' +# Define globally trusted reverse proxy +set_real_ip_from %%web_behind_revproxy_ip; +%end if + +# Always trust ourself +%for %%interface in %%range(%%int(%%nombre_interfaces)) + %if %%getVar('adresse_ip_eth{0}'.format(%%interface), None) is not None +set_real_ip_from %%getVar('adresse_ip_eth{0}'.format(%%interface)); + %end if +%end for +set_real_ip_from 127.0.0.1; + + +# We use X-Forwarded-For header +real_ip_header X-Forwarded-For; + +# The original client address that matches one of the trusted +# addresses is replaced by the last non-trusted address sent in the +# request header field +real_ip_recursive on; + +%if %%activer_revprox == 'oui' or %%getVar('activer_nginx_web', 'non') == 'oui' +server_names_hash_bucket_size %%{revprox_hash_bucket_size}; +proxy_buffer_size 16k; +proxy_buffers 6 32k; +proxy_busy_buffers_size 32k; +large_client_header_buffers 8 8k; + %if %%activer_revprox == 'oui' + %if %%revprox_redirection_http == 'oui' +proxy_ssl_session_reuse off; + %end if + %end if + + %if %%getVar('activer_nginx_web', 'non') == 'oui' +# Definition of upstream servers +include upstream.d/*.conf; + %end if + + %if not %%is_empty(%%revprox_default) +server { + listen 80; + server_name _ default; + access_log /var/log/nginx/access.log; + rewrite ^(.*) http://%%revprox_default$1; + break; +} +server { + listen 443; + ssl on; + ssl_certificate %%server_cert; + ssl_certificate_key %%server_key; + ssl_client_certificate /etc/ssl/certs/ca.crt; + access_log /var/log/nginx/revprox.revprox_http.access-ssl.log; + server_name _ default; + rewrite ^(.*) https://%%revprox_default$1; + break; +} + %end if +%end if + +%set %%dom_dict={} +%if %%getVar('activer_nginx_web', 'non') == 'oui' + %set %%nginx_local_web_domains = [] + %silent %%nginx_local_web_domains.append(%%nom_domaine_machine) + %silent %%dom_dict.setdefault(%%nom_domaine_machine, []) + µµµµµµµµµµ AmonEcole define web_url + %if %%is_defined('web_url') + %silent %%nginx_local_web_domains.append(%%web_url) + %silent %%dom_dict.setdefault(%%web_url, []) + %end if + µµµµµµµµµµ Amon use %%revprox_default + %if not %%is_empty(%%revprox_default) + %silent %%nginx_local_web_domains.append(%%revprox_default) + %silent %%dom_dict.setdefault(%%revprox_default, []) + %end if +%end if + +%set %%letsencrypt=[] + +%if %%activer_revprox == 'oui' + %if %%revprox_activate_http == 'oui' + %for %%location_iter in %%revprox_domainname + %if %%location_iter.revprox_domain_wildcard == 'oui' + %set %%wildcard = "*." + %else + %set %%wildcard = "" + %end if + %silent %%dom_dict.setdefault(%%wildcard + %%str(%%location_iter), []).append((%%location_iter.revprox_domain_wildcard, %%location_iter.revprox_rep, %%location_iter.revprox_http, %%location_iter.revprox_https, %%location_iter.revprox_url, '')) + %if %%cert_type == 'letsencrypt' and %%location_iter.revprox_domain_wildcard == 'non' and %%location_iter.revprox_le_cert == 'oui' + %silent %%letsencrypt.append(%%location_iter) + %end if + %end for + %end if % if %%revprox_activate_http == 'oui' + + %if %%getVar('revprox_auto_config_local_web', 'non') == 'oui' + %silent %%dom_dict.setdefault(%%web_url, []).append(('non', '/', 'redirige vers https', 'oui', 'https://'+%%container_ip_web, '')) + %end if + + %if %%revprox_redirection_http == 'oui' + %for %%location_iter in %%revprox_redirection + %silent %%dom_dict.setdefault(%%str(%%location_iter), []).append(('non', %%location_iter.revprox_redirection_rep, 'redirige', 'redirige', '', %%location_iter.revprox_redirection_destination)) + %end for + %end if + + %set %%rewrite_dict={} + %if %%activer_revprox_rewrite == 'oui' + %for %%rewrite_domain in %%revprox_rewrite_domaine + %silent %%rewrite_dict.setdefault(%%str(%%rewrite_domain), []).append((%%rewrite_domain.revprox_rewrite_location, %%rewrite_domain.revprox_rewrite_proto, %%rewrite_domain.revprox_rewrite_regex, %%rewrite_domain.revprox_rewrite_replacement)) + %end for + %end if +%end if + +%for %%revprox_iter in %%dom_dict.keys() +# Configuration HTTP %%revprox_iter +server { + listen 80; + server_name %%revprox_iter; + access_log /var/log/nginx/access.log; + error_page 403 404 502 503 504 /nginx.html; + %if %%getVar('activer_filtrage_proxy', 'non') == 'oui' + + location = /guardian.html{ + root /usr/share/nginx/html; + } + %end if + %if %%revprox_iter == %%adresse_ip_eth0 + + location /wpad.dat{ + rewrite ^(.*) http://wpad$1 permanent; + } + %end if + + location = /nginx.html{ + root /usr/share/nginx/html; + } + + %if %%getVar('nginx_degrade_http', 'non') == 'oui' and %%revprox_iter in %%nginx_local_web_domains + include web.d/*.conf; + + %end if + + %if %%getVar('activer_nginx_web', 'non') == 'oui' and %%revprox_iter in %%nginx_local_web_domains + include http.d/*.conf; + + %end if + + %for %%wildcard_iter, %%rep_iter, %%http_iter, %%https_iter, %%url_iter, %%redirection in %%dom_dict[%%revprox_iter] + %if %%http_iter == 'non' + %continue + %end if + %if %%rep_iter != "" + %set %%rep_location = %%rep_iter + %else + %set %%rep_location = '/' + %end if + %if %%redirection == "" + %set %%redirection = "https://$host" + %end if + location %%rep_location { + %if %%http_iter in ['redirige vers https', 'redirige'] + %if %%wildcard_iter == 'oui' + if ($host ~* "%%revprox_iter[1:]" ) { + %else + if ($host = "%%revprox_iter" ) { + %end if + %if %%rep_location != '/' and %%http_iter == 'redirige' + rewrite ^%%{rep_location}(.*) %%redirection/$1 permanent; + %else + rewrite ^(.*) %%redirection$1 permanent; + %end if + break; + } + %elif %%http_iter == 'oui' + %if %%url_iter != '' + proxy_pass %%url_iter; + %else + proxy_pass http://%%location_iter; + %end if % if %%url_iter != '' + include eole_proxy_params; + set $dest $http_destination; + #2132 + %for %%rewrite_location, %%rewrite_proto, %%rewrite_regexp, %%rewrite_replacement in %%rewrite_dict.get(%%revprox_iter, []) + %if %%rewrite_proto != "https" and %%rewrite_location == %%rep_location + rewrite %%rewrite_regexp %%rewrite_replacement break; + %end if + %end for + %end if % if %%http_iter == 'redirige vers https' + index 50x.html; + root /usr/share/nginx/html; + } + %end for +} +%end for + +%for %%revprox_iter in %%dom_dict.keys() +# Configuration HTTPS %%revprox_iter +server { + listen 443; + ssl on; + %if %%revprox_iter in %%letsencrypt + ssl_certificate %%le_config_dir/live/%%revprox_iter/cert.pem; + ssl_certificate_key %%le_config_dir/live/%%revprox_iter/privkey.pem; + %else + ssl_certificate %%server_cert; + ssl_certificate_key %%server_key; + %end if + ssl_client_certificate /etc/ssl/certs/ca.crt; + access_log /var/log/nginx/revprox.revprox_http.access-ssl.log; + server_name %%revprox_iter; + error_page 403 404 502 503 504 /nginx.html; + %if %%getVar('activer_filtrage_proxy', 'non') == 'oui' + location = /guardian.html{ + root /usr/share/nginx/html; + } + %end if + location = /nginx.html{ + root /usr/share/nginx/html; + } + + %if %%getVar('activer_nginx_web', 'non') == 'oui' and %%revprox_iter in %%nginx_local_web_domains + include web.d/*.conf; + + %end if + %if %%is_defined('activer_jappix') and %%activer_jappix == 'oui' + location /http-bind { + proxy_pass http://%%container_ip_jabber:5280/http-bind/; + proxy_method POST; + proxy_buffering off; + tcp_nodelay on; + } + location /jappix { + proxy_pass https://%%container_ip_web; + include eole_proxy_params; + set $dest $http_destination; + proxy_method POST; + proxy_buffering off; + tcp_nodelay on; + } + + %end if + %for %%wildcard, %%rep_iter, %%http_iter, %%https_iter, %%url_iter, %%redirection in %%dom_dict[%%revprox_iter] + %if not %%http_iter == 'redirige vers https' and %%https_iter == 'non' + %continue + %end if + %if %%rep_iter != "" + %set %%rep_location = %%rep_iter + %else + %set %%rep_location = '/' + %end if + location %%rep_location { + %if %%http_iter == 'redirige' + %if %%wildcard_iter == 'oui' + if ($host ~* "%%revprox_iter[1:]" ) { + %else + if ($host = "%%revprox_iter" ) { + %end if + %if %%rep_location != '/' + rewrite ^%%{rep_location}(.*) %%redirection/$1 permanent; + %else + rewrite ^(.*) %%redirection$1 permanent; + %end if + break; + } + %else + %if %%url_iter != '' + proxy_pass %%url_iter; + %else + proxy_pass http://%%location_iter; + %end if % if %%url_iter != '' + include eole_proxy_params; + set $dest $http_destination; + #2132 + %for %%rewrite_location, %%rewrite_proto, %%rewrite_regexp, %%rewrite_replacement in %%rewrite_dict.get(%%revprox_iter, []) + %if %%rewrite_proto != "http" and %%rewrite_location == %%rep_location + rewrite %%rewrite_regexp %%rewrite_replacement break; + %end if + %end for + %end if + index 50x.html; + root /usr/share/nginx/html; + } + %end for % for %%rep_iter, %%http_iter, %%https_iter, %%url_iter in %%dom_dict[%%revprox_iter] +} +%end for % for %%revprox_iter in %%dom_dict.keys() + +%if %%activer_revprox == 'oui' + %if %%getVar('activer_sso', 'local') != 'local' and not %%is_empty(%%revprox_sso) +# Redirection SSO +server { + listen 8443; + ssl on; + ssl_certificate %%server_cert; + ssl_certificate_key %%server_key; + ssl_client_certificate /etc/ssl/certs/ca.crt; + access_log /var/log/nginx/localhost.access-sso.log; + error_page 403 404 502 503 504 /nginx.html; + location = /nginx.html{ + root /usr/share/nginx/html; + } + location / { + proxy_pass https://%%revprox_sso:8443/; + include eole_proxy_params; + set $dest $http_destination; + } +} + %end if % if %%activer_sso != 'local' and not %%is_empty(%%revprox_sso) + + %if %%activer_revprox_ead == 'oui' +## Redirection de l'ead d'un scribe sur le port 4203 +server { + listen %%revprox_ead_port; + ssl on; + ssl_certificate %%server_cert; + ssl_certificate_key %%server_key; + ssl_client_certificate /etc/ssl/certs/ca.crt; + access_log /var/log/nginx/localhost.access-eadscribe.log; + error_page 403 404 502 503 504 /nginx.html; + location = /nginx.html{ + root /usr/share/nginx/html; + } + location / { + proxy_pass https://%%revprox_ead:4200/; + include eole_proxy_params; + set $dest $http_destination; + } +} + %end if + + %if not %%is_empty(%%revprox_eop) +#EOP +server { + listen 6080; + ssl on; + ssl_certificate %%server_cert; + ssl_certificate_key %%server_key; + ssl_client_certificate /etc/ssl/certs/ca.crt; + access_log /var/log/nginx/eop.log; + error_page 403 404 502 503 504 /nginx.html; + location = /nginx.html{ + root /usr/share/nginx/html; + } + location / { + proxy_pass http://%%revprox_eop:6080; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_read_timeout 86400; + } +} + %end if +%end if %commentaire %if %%activer_revprox == 'oui' + +%if %%is_defined('container_ip_proxy') +# erreur pour le proxy +server { + listen 0.0.0.0:81; + listen 0.0.0.0:82 default ssl; + root /var/www/; + ssl_certificate %%server_cert; + ssl_certificate_key %%server_key; + ssl_client_certificate /etc/ssl/certs/ca.crt; + + # Define personalize 403 page + error_page 403 @403; + + # Return 403 error by default + return 403; + + location @403 { + rewrite ^(.*)$ /index.html break; + } +} + %if %%getVar('activer_filtrage_proxy', 'non') == 'oui' +# navigation interdite +server { + listen 0.0.0.0:83; + root /usr/share/nginx/html; + error_page 403 @403; + return 403; + location @403 { + rewrite ^(.*)$ /guardian.html break; + } +} +server { + listen 0.0.0.0:84 default ssl; + ssl_certificate %%server_cert; + ssl_certificate_key %%server_key; + ssl_client_certificate /etc/ssl/certs/ca.crt; + root /usr/share/nginx/html; + error_page 403 @403; + return 403; + location @403 { + rewrite ^(.*)$ /guardian.html break; + } +} + %end if +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-reverseproxy/templates/nginx.html b/seed/release/eole-2.7/2.7.1/applicationservice/eole-reverseproxy/templates/nginx.html new file mode 100644 index 0000000000000000000000000000000000000000..e7127ab371b2c3c7a3f257749ba3a5d6fead682a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-reverseproxy/templates/nginx.html @@ -0,0 +1,22 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<html> + <META http-equiv="Content-Type" content="text/html; charset=utf-8;"> + <head> +<title>Page indisponible</title> +<style> + .main{ + background:#FFFFCC; + text-align:center; + } +.message{ +top:25%; +text-align:center; +} +</style> + </head> + <body class='main'> + <h1 style='text-align:center;'>%%libelle_etab</h1> + <hr/> + <div class="message">La page que vous avez demandée est indisponible</div> + </body> +</html> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-reverseproxy/templates/nginx.logrotate b/seed/release/eole-2.7/2.7.1/applicationservice/eole-reverseproxy/templates/nginx.logrotate new file mode 100644 index 0000000000000000000000000000000000000000..ebf05ae8d138aa891c2041a1b47ddc8dde68be66 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-reverseproxy/templates/nginx.logrotate @@ -0,0 +1,13 @@ +/var/log/nginx/*.log { + daily + missingok + rotate 366 + compress + delaycompress + notifempty + create 640 root adm + sharedscripts + postrotate + [ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid` + endscript +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-reverseproxy/templates/nginx.no_proxy.html b/seed/release/eole-2.7/2.7.1/applicationservice/eole-reverseproxy/templates/nginx.no_proxy.html new file mode 100644 index 0000000000000000000000000000000000000000..d0c4fd142bc8c434672cba9c686c7e2c207287e0 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-reverseproxy/templates/nginx.no_proxy.html @@ -0,0 +1,22 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<html> + <META http-equiv="Content-Type" content="text/html; charset=utf-8;"> + <head> +<title>Veuillez configurer le proxy</title> +<style> + .main{ + background:#FFFFCC; + text-align:center; + } +.message{ +top:25%; +text-align:center; +} +</style> + </head> + <body class='main'> + <h1 style='text-align:center;'>%%libelle_etab</h1> + <hr/> + <div class="message">Si vous accedez à cette page, c'est que vous n'avez pas configuré le proxy dans votre navigateur. Veuillez contacter votre administrateur.</div> + </body> +</html> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-reverseproxy/templates/nginx.override b/seed/release/eole-2.7/2.7.1/applicationservice/eole-reverseproxy/templates/nginx.override new file mode 100644 index 0000000000000000000000000000000000000000..3f49ca8945fe571227cbff7f5327179c965b6413 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-reverseproxy/templates/nginx.override @@ -0,0 +1,4 @@ +[Unit] +After=bind9.service +Wants=bind9.service + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-reverseproxy/templates/nginx.proxy-params b/seed/release/eole-2.7/2.7.1/applicationservice/eole-reverseproxy/templates/nginx.proxy-params new file mode 100644 index 0000000000000000000000000000000000000000..19275de4832ccdd90aeb5bebae08be8b04b57f70 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-reverseproxy/templates/nginx.proxy-params @@ -0,0 +1,8 @@ +proxy_set_header Host $http_host; +proxy_set_header X-Real-IP $remote_addr; +proxy_set_header X-Forwarded-Host $host; +proxy_set_header X-Forwarded-Port $server_port; +proxy_set_header X-Forwarded-Server $host; +proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; +proxy_set_header X-Forwarded-Proto $scheme; +proxy_set_header Destination $dest; diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-saltstack/dictionaries/00_eole-saltstack_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-saltstack/dictionaries/00_eole-saltstack_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..4247350b709e11a8812f693f1da0a3283503f304 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-saltstack/dictionaries/00_eole-saltstack_packages.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>eole-common</package> + <package>salt-api</package> + <package>salt-master</package> + <package>salt-minion</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-saltstack/dictionaries/20_saltstack.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-saltstack/dictionaries/20_saltstack.xml new file mode 100644 index 0000000000000000000000000000000000000000..a018043a7f4e7784bcb40d830cd15863640b8642 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-saltstack/dictionaries/20_saltstack.xml @@ -0,0 +1,50 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + <file filelist="saltstack" name="/etc/salt/minion"/> + <file filelist="saltstack" name="/etc/salt/minion.d/smtp.conf" source="minion.smtp.conf"/> + <file filelist="saltstack" name="/etc/salt/master"/> + <file filelist="saltstack" name="/etc/salt/master.d/cherry.conf"/> + <file filelist="saltstack" name="/etc/salt/master.d/ext_auth.conf"/> + <file filelist="saltstack" name='/etc/systemd/system/salt-master.service.d/override.conf' source='salt-master.override.conf' mkdir='True'/> + <service servicelist="saltstack">salt-api</service> + <service servicelist="saltstack">salt-master</service> + <service servicelist="saltstack">salt-minion</service> + </files> + + <variables> + <family name="services"> + <variable name="activer_saltstack" type="oui/non" description="Activer SaltStack"> + <value>oui</value> + </variable> + </family> + <family name="saltstack" icon="cloud" mode="expert"> + <!-- FIXME domain_strict --> + <variable name="minion_domain_name" description="Nom de domaine du minion" type="string"> + <value>local</value> + </variable> + <variable name="salt_api_port" description="Port d'accès à l'API SaltStack" type="port"> + <value>8880</value> + </variable> + </family> + </variables> + + <constraints> + <condition name='disabled_if_in' source='activer_saltstack'> + <param>non</param> + <target type='servicelist'>saltstack</target> + <target type='filelist'>saltstack</target> + <target type='family'>saltstack</target> + </condition> + </constraints> + + <help> + <family name="saltstack">Personnalisation de la configuration SaltStack</family> + <variable name="activer_saltstack">SaltStack est un logiciel de gestion de configuration écrit en Python</variable> + <variable name="minion_domain_name">La machine cliente SaltStack est appelé « minion »</variable> + </help> + +</creole> + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-saltstack/files/usr/lib/python3/dist-packages/eole_salt_netapi-2.7.0.egg-info b/seed/release/eole-2.7/2.7.1/applicationservice/eole-saltstack/files/usr/lib/python3/dist-packages/eole_salt_netapi-2.7.0.egg-info new file mode 100644 index 0000000000000000000000000000000000000000..fcdcf7777f9164b2fd5140eece2b7a83f0e8c51d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-saltstack/files/usr/lib/python3/dist-packages/eole_salt_netapi-2.7.0.egg-info @@ -0,0 +1,10 @@ +Metadata-Version: 1.0 +Name: eole_salt_netapi +Version: 2.7.0 +Summary: EOLE API module for Saltstack based on rest_tornado +Home-page: http://www.eole.orion.education.fr +Author: eole +Author-email: eole@ac-dijon.fr +License: UNKNOWN +Description: UNKNOWN +Platform: UNKNOWN diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-saltstack/files/usr/lib/python3/dist-packages/salt/netapi/rest_eole/__init__.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-saltstack/files/usr/lib/python3/dist-packages/salt/netapi/rest_eole/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..7a4dfe8d11619e1f161dbcf63a670dc6b3fe3132 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-saltstack/files/usr/lib/python3/dist-packages/salt/netapi/rest_eole/__init__.py @@ -0,0 +1,136 @@ +# encoding: utf-8 + +# Import python libs +from __future__ import absolute_import, print_function +import hashlib +import logging +import os + +# Import salt libs +import salt.auth +from salt.utils.versions import StrictVersion as _StrictVersion + +__virtualname__ = os.path.abspath(__file__).rsplit(os.sep)[-2] or 'rest_tornado' + +logger = logging.getLogger(__virtualname__) + +# we require at least 4.0, as that includes all the Future's stuff we use +min_tornado_version = '4.0' +has_tornado = False +try: + import tornado + if _StrictVersion(tornado.version) >= _StrictVersion(min_tornado_version): + has_tornado = True + else: + logger.error('rest_tornado requires at least tornado {0}'.format(min_tornado_version)) +except (ImportError, TypeError) as err: + has_tornado = False + logger.error('ImportError! {0}'.format(str(err))) + + +def __virtual__(): + mod_opts = __opts__.get(__virtualname__, {}) + + if has_tornado and 'port' in mod_opts: + return __virtualname__ + + return False + + +def get_application(opts): + try: + from . import saltnado + except ImportError as err: + logger.error('ImportError! {0}'.format(str(err))) + return None + + mod_opts = opts.get(__virtualname__, {}) + + paths = [ + (r"/", saltnado.SaltAPIHandler), + (r"/login", saltnado.SaltAuthHandler), + (r"/validate_token", saltnado.SaltValidateTokenHandler), + (r"/logout", saltnado.SaltLogoutHandler), + (r"/minions/(.*)", saltnado.MinionSaltAPIHandler), + (r"/minions", saltnado.MinionSaltAPIHandler), + (r"/jobs/(.*)", saltnado.JobsSaltAPIHandler), + (r"/jobs", saltnado.JobsSaltAPIHandler), + (r"/run", saltnado.RunSaltAPIHandler), + (r"/events", saltnado.EventsSaltAPIHandler), + (r"/hook(/.*)?", saltnado.WebhookSaltAPIHandler), + ] + + # if you have enabled websockets, add them! + if mod_opts.get('websockets', False): + from . import saltnado_websockets + + token_pattern = r"([0-9A-Fa-f]{{{0}}})".format(len(getattr(hashlib, opts.get('hash_type', 'md5'))().hexdigest())) + all_events_pattern = r"/all_events/{0}".format(token_pattern) + formatted_events_pattern = r"/formatted_events/{0}".format(token_pattern) + logger.debug("All events URL pattern is {0}".format(all_events_pattern)) + paths += [ + # Matches /all_events/[0-9A-Fa-f]{n} + # Where n is the length of hexdigest + # for the current hashing algorithm. + # This algorithm is specified in the + # salt master config file. + (all_events_pattern, saltnado_websockets.AllEventsHandler), + (formatted_events_pattern, saltnado_websockets.FormattedEventsHandler), + ] + + application = tornado.web.Application(paths, debug=mod_opts.get('debug', False)) + + application.opts = opts + application.mod_opts = mod_opts + application.auth = salt.auth.LoadAuth(opts) + application.resolver = salt.auth.Resolver(opts) + return application + + +def start(): + ''' + Start the saltnado! + ''' + mod_opts = __opts__.get(__virtualname__, {}) + + if 'num_processes' not in mod_opts: + mod_opts['num_processes'] = 1 + + if mod_opts['num_processes'] > 1 and mod_opts.get('debug', False) is True: + raise Exception(( + 'Tornado\'s debug implementation is not compatible with multiprocess. ' + 'Either disable debug, or set num_processes to 1.' + )) + + # the kwargs for the HTTPServer + kwargs = {} + if not mod_opts.get('disable_ssl', False): + if 'ssl_crt' not in mod_opts: + logger.error("Not starting '%s'. Options 'ssl_crt' and " + "'ssl_key' are required if SSL is not disabled.", + __name__) + + return None + # cert is required, key may be optional + # https://docs.python.org/2/library/ssl.html#ssl.wrap_socket + ssl_opts = {'certfile': mod_opts['ssl_crt']} + if mod_opts.get('ssl_key', False): + ssl_opts.update({'keyfile': mod_opts['ssl_key']}) + kwargs['ssl_options'] = ssl_opts + + import tornado.httpserver + http_server = tornado.httpserver.HTTPServer(get_application(__opts__), **kwargs) + try: + http_server.bind(mod_opts['port'], + address=mod_opts.get('address'), + backlog=mod_opts.get('backlog', 128), + ) + http_server.start(mod_opts['num_processes']) + except: + logger.error('Rest_tornado unable to bind to port {0}'.format(mod_opts['port']), exc_info=True) + raise SystemExit(1) + + try: + tornado.ioloop.IOLoop.instance().start() + except KeyboardInterrupt: + raise SystemExit(0) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-saltstack/files/usr/lib/python3/dist-packages/salt/netapi/rest_eole/event_processor.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-saltstack/files/usr/lib/python3/dist-packages/salt/netapi/rest_eole/event_processor.py new file mode 100644 index 0000000000000000000000000000000000000000..b8e947a591247aca068d7c5773f367b85a8d5eb8 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-saltstack/files/usr/lib/python3/dist-packages/salt/netapi/rest_eole/event_processor.py @@ -0,0 +1,233 @@ +# encoding: utf-8 +from __future__ import absolute_import +import json +import logging +import threading +import salt.ext.six as six + +import salt.netapi + +logger = logging.getLogger(__name__) + + +class SaltInfo(object): + ''' + Class to handle processing and publishing of "real time" Salt upates. + ''' + + def __init__(self, handler): + ''' + handler is expected to be the server side end of a websocket + connection. + ''' + self.handler = handler + + # These represent a "real time" view into Salt's jobs. + self.jobs = {} + + # This represents a "real time" view of minions connected to + # Salt. + self.minions = {} + + def publish_minions(self): + ''' + Publishes minions as a list of dicts. + ''' + logger.debug('in publish minions') + minions = {} + + logger.debug('starting loop') + for minion, minion_info in six.iteritems(self.minions): + logger.debug(minion) + # logger.debug(minion_info) + curr_minion = {} + curr_minion.update(minion_info) + curr_minion.update({'id': minion}) + minions[minion] = curr_minion + logger.debug('ended loop') + ret = {'minions': minions} + self.handler.write_message(u'{0}\n\n'.format(json.dumps(ret))) + + def publish(self, key, data): + ''' + Publishes the data to the event stream. + ''' + publish_data = {key: data} + pub = u'{0}\n\n'.format(json.dumps(publish_data)) + self.handler.write_message(pub) + + def process_minion_update(self, event_data): + ''' + Associate grains data with a minion and publish minion update + ''' + tag = event_data['tag'] + event_info = event_data['data'] + + _, _, _, _, mid = tag.split('/') + + if not self.minions.get(mid, None): + self.minions[mid] = {} + + minion = self.minions[mid] + + minion.update({'grains': event_info['return']}) + logger.debug("In process minion grains update with minions={0}".format(self.minions)) + self.publish_minions() + + def process_ret_job_event(self, event_data): + ''' + Process a /ret event returned by Salt for a particular minion. + These events contain the returned results from a particular execution. + ''' + tag = event_data['tag'] + event_info = event_data['data'] + + _, _, jid, _, mid = tag.split('/') + job = self.jobs.setdefault(jid, {}) + + minion = job.setdefault('minions', {}).setdefault(mid, {}) + minion.update({'return': event_info['return']}) + minion.update({'retcode': event_info['retcode']}) + minion.update({'success': event_info['success']}) + + job_complete = all([minion['success'] for mid, minion + in six.iteritems(job['minions'])]) + + if job_complete: + job['state'] = 'complete' + + self.publish('jobs', self.jobs) + + def process_new_job_event(self, event_data): + ''' + Creates a new job with properties from the event data + like jid, function, args, timestamp. + + Also sets the initial state to started. + + Minions that are participating in this job are also noted. + + ''' + job = None + tag = event_data['tag'] + event_info = event_data['data'] + minions = {} + for mid in event_info['minions']: + minions[mid] = {'success': False} + + job = { + 'jid': event_info['jid'], + 'start_time': event_info['_stamp'], + 'minions': minions, # is a dictionary keyed by mids + 'fun': event_info['fun'], + 'tgt': event_info['tgt'], + 'tgt_type': event_info['tgt_type'], + 'state': 'running', + } + self.jobs[event_info['jid']] = job + self.publish('jobs', self.jobs) + + def process_key_event(self, event_data): + ''' + Tag: salt/key + Data: + {'_stamp': '2014-05-20T22:45:04.345583', + 'act': 'delete', + 'id': 'compute.home', + 'result': True} + ''' + + tag = event_data['tag'] + event_info = event_data['data'] + + if event_info['act'] == 'delete': + self.minions.pop(event_info['id'], None) + elif event_info['act'] == 'accept': + self.minions.setdefault(event_info['id'], {}) + + self.publish_minions() + + def process_presence_events(self, salt_data, token, opts): + ''' + Check if any minions have connected or dropped. + Send a message to the client if they have. + ''' + logger.debug('In presence') + changed = False + + # check if any connections were dropped + if set(salt_data['data'].get('lost', [])): + dropped_minions = set(salt_data['data'].get('lost', [])) + else: + dropped_minions = set(self.minions) - set(salt_data['data'].get('present', [])) + + for minion in dropped_minions: + changed = True + logger.debug('Popping {0}'.format(minion)) + self.minions.pop(minion, None) + + # check if any new connections were made + if set(salt_data['data'].get('new', [])): + logger.debug('got new minions') + new_minions = set(salt_data['data'].get('new', [])) + changed = True + elif set(salt_data['data'].get('present', [])) - set(self.minions): + logger.debug('detected new minions') + new_minions = set(salt_data['data'].get('present', [])) - set(self.minions) + changed = True + else: + new_minions = [] + + tgt = ','.join(new_minions) + for mid in new_minions: + logger.debug('Adding minion') + self.minions[mid] = {} + + if tgt: + changed = True + client = salt.netapi.NetapiClient(opts) + client.run( + { + 'fun': 'grains.items', + 'tgt': tgt, + 'expr_type': 'list', + 'mode': 'client', + 'client': 'local', + 'async': 'local_async', + 'token': token, + }) + + if changed: + self.publish_minions() + + def process(self, salt_data, token, opts): + ''' + Process events and publish data + ''' + logger.debug('In process {0}'.format(threading.current_thread())) + logger.debug(salt_data['tag']) + logger.debug(salt_data) + + parts = salt_data['tag'].split('/') + if len(parts) < 2: + return + + # TBD: Simplify these conditional expressions + if parts[1] == 'job': + logger.debug('In job part 1') + if parts[3] == 'new': + logger.debug('In new job') + self.process_new_job_event(salt_data) + # if salt_data['data']['fun'] == 'grains.items': + # self.minions = {} + elif parts[3] == 'ret': + logger.debug('In ret') + self.process_ret_job_event(salt_data) + if salt_data['data']['fun'] == 'grains.items': + self.process_minion_update(salt_data) + elif parts[1] == 'key': + logger.debug('In key') + self.process_key_event(salt_data) + elif parts[1] == 'presence': + self.process_presence_events(salt_data, token, opts) + # logger.debug('In presence') diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-saltstack/files/usr/lib/python3/dist-packages/salt/netapi/rest_eole/saltnado.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-saltstack/files/usr/lib/python3/dist-packages/salt/netapi/rest_eole/saltnado.py new file mode 100644 index 0000000000000000000000000000000000000000..4c766b5e15e46b55a6e266ac04fbe95cfa6af021 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-saltstack/files/usr/lib/python3/dist-packages/salt/netapi/rest_eole/saltnado.py @@ -0,0 +1,1727 @@ +# encoding: utf-8 +from __future__ import absolute_import, print_function + +''' +A non-blocking REST API for Salt +================================ + +.. py:currentmodule:: salt.netapi.rest_tornado.saltnado + +:depends: - tornado Python module + +:configuration: All authentication is done through Salt's :ref:`external auth + <acl-eauth>` system which requires additional configuration not described + here. + + +In order to run rest_tornado with the salt-master +add the following to the Salt master config file. + +.. code-block:: yaml + + rest_tornado: + # can be any port + port: 8000 + # address to bind to (defaults to 0.0.0.0) + address: 0.0.0.0 + # socket backlog + backlog: 128 + ssl_crt: /etc/pki/api/certs/server.crt + # no need to specify ssl_key if cert and key + # are in one single file + ssl_key: /etc/pki/api/certs/server.key + debug: False + disable_ssl: False + webhook_disable_auth: False + cors_origin: null + +.. _rest_tornado-auth: + +Authentication +-------------- + +Authentication is performed by passing a session token with each request. +Tokens are generated via the :py:class:`SaltAuthHandler` URL. + +The token may be sent in one of two ways: + +* Include a custom header named :mailheader:`X-Auth-Token`. +* Sent via a cookie. This option is a convenience for HTTP clients that + automatically handle cookie support (such as browsers). + +.. seealso:: You can bypass the session handling via the :py:class:`RunSaltAPIHandler` URL. + +CORS +---- + +rest_tornado supports Cross-site HTTP requests out of the box. It is by default +deactivated and controlled by the `cors_origin` config key. + +You can allow all origins by settings `cors_origin` to `*`. + +You can allow only one origin with this configuration: + +.. code-block:: yaml + + rest_tornado: + cors_origin: http://salt.yourcompany.com + +You can also be more specific and select only a few allowed origins by using +a list. For example: + +.. code-block:: yaml + + rest_tornado: + cors_origin: + - http://salt.yourcompany.com + - http://salt-preprod.yourcampany.com + +The format for origin are full URL, with both scheme and port if not standard. + +In this case, rest_tornado will check if the Origin header is in the allowed +list if it's the case allow the origin. Else it will returns nothing, +effectively preventing the origin to make request. + +For reference, CORS is a mechanism used by browser to allow (or disallow) +requests made from browser from a different origin than salt-api. It's +complementary to Authentication and mandatory only if you plan to use +a salt client developed as a Javascript browser application. + +Usage +----- + +Commands are sent to a running Salt master via this module by sending HTTP +requests to the URLs detailed below. + +.. admonition:: Content negotiation + + This REST interface is flexible in what data formats it will accept as well + as what formats it will return (e.g., JSON, YAML, x-www-form-urlencoded). + + * Specify the format of data in the request body by including the + :mailheader:`Content-Type` header. + * Specify the desired data format for the response body with the + :mailheader:`Accept` header. + +Data sent in :http:method:`post` and :http:method:`put` requests must be in +the format of a list of lowstate dictionaries. This allows multiple commands to +be executed in a single HTTP request. + +.. glossary:: + + lowstate + A dictionary containing various keys that instruct Salt which command + to run, where that command lives, any parameters for that command, any + authentication credentials, what returner to use, etc. + + Salt uses the lowstate data format internally in many places to pass + command data between functions. Salt also uses lowstate for the + :ref:`LocalClient() <python-api>` Python API interface. + +The following example (in JSON format) causes Salt to execute two commands:: + + [{ + "client": "local", + "tgt": "*", + "fun": "test.fib", + "arg": ["10"] + }, + { + "client": "runner", + "fun": "jobs.lookup_jid", + "jid": "20130603122505459265" + }] + +Multiple commands in a Salt API request will be executed in serial and makes +no gaurantees that all commands will run. Meaning that if test.fib (from the +example above) had an exception, the API would still execute "jobs.lookup_jid". + +Responses to these lowstates are an in-order list of dicts containing the +return data, a yaml response could look like:: + + - ms-1: true + ms-2: true + - ms-1: foo + ms-2: bar + +In the event of an exception while executing a command the return for that lowstate +will be a string, for example if no minions matched the first lowstate we would get +a return like:: + + - No minions matched the target. No command was sent, no jid was assigned. + - ms-1: true + ms-2: true + +.. admonition:: x-www-form-urlencoded + + Sending JSON or YAML in the request body is simple and most flexible, + however sending data in urlencoded format is also supported with the + caveats below. It is the default format for HTML forms, many JavaScript + libraries, and the :command:`curl` command. + + For example, the equivalent to running ``salt '*' test.ping`` is sending + ``fun=test.ping&arg&client=local&tgt=*`` in the HTTP request body. + + Caveats: + + * Only a single command may be sent per HTTP request. + * Repeating the ``arg`` parameter multiple times will cause those + parameters to be combined into a single list. + + Note, some popular frameworks and languages (notably jQuery, PHP, and + Ruby on Rails) will automatically append empty brackets onto repeated + parameters. E.g., ``arg=one``, ``arg=two`` will be sent as ``arg[]=one``, + ``arg[]=two``. This is not supported; send JSON or YAML instead. + + +.. |req_token| replace:: a session token from :py:class:`~SaltAuthHandler`. +.. |req_accept| replace:: the desired response format. +.. |req_ct| replace:: the format of the request body. + +.. |res_ct| replace:: the format of the response body; depends on the + :mailheader:`Accept` request header. + +.. |200| replace:: success +.. |400| replace:: bad request +.. |401| replace:: authentication required +.. |406| replace:: requested Content-Type not available +.. |500| replace:: internal server error +''' # pylint: disable=W0105 +# pylint: disable=W0232 + +# Import Python libs +from os import unlink +from os.path import join, isfile +import time +import fnmatch +import logging +from copy import copy +from collections import defaultdict + +# pylint: disable=import-error +import cgi +import yaml +import tornado.escape +import tornado.httpserver +import tornado.ioloop +import tornado.web +import tornado.gen +from tornado.concurrent import Future +from zmq.eventloop import ioloop +import salt.ext.six as six +# pylint: enable=import-error + +# instantiate the zmq IOLoop (specialized poller) +ioloop.install() + +# salt imports +import salt.netapi +import salt.utils +import salt.utils.event +from salt.utils.event import tagify +import salt.client +import salt.runner +import salt.auth +from salt.exceptions import EauthAuthenticationError + +json = salt.utils.import_json() +logger = logging.getLogger() + +# The clients rest_cherrypi supports. We want to mimic the interface, but not +# necessarily use the same API under the hood +# # all of these require coordinating minion stuff +# - "local" (done) +# - "local_async" (done) + +# # master side +# - "runner" (done) +# - "wheel" (need async api...) + + +class SaltClientsMixIn(object): + ''' + MixIn class to container all of the salt clients that the API needs + ''' + # TODO: load this proactively, instead of waiting for a request + __saltclients = None + + @property + def saltclients(self): + if SaltClientsMixIn.__saltclients is None: + local_client = salt.client.get_local_client(mopts=self.application.opts) + # TODO: refreshing clients using cachedict + SaltClientsMixIn.__saltclients = { + 'local': local_client.run_job_async, + # not the actual client we'll use.. but its what we'll use to get args + 'local_async': local_client.run_job_async, + 'runner': salt.runner.RunnerClient(opts=self.application.opts).cmd_async, + 'runner_async': None, # empty, since we use the same client as `runner` + } + return SaltClientsMixIn.__saltclients + + +AUTH_TOKEN_HEADER = 'X-Auth-Token' +AUTH_COOKIE_NAME = 'session_id' + + +class TimeoutException(Exception): + pass + + +class Any(Future): + ''' + Future that wraps other futures to "block" until one is done + ''' + def __init__(self, futures): # pylint: disable=E1002 + super(Any, self).__init__() + for future in futures: + future.add_done_callback(self.done_callback) + + def done_callback(self, future): + # Any is completed once one is done, we don't set for the rest + if not self.done(): + self.set_result(future) + + +class EventListener(object): + ''' + Class responsible for listening to the salt master event bus and updating + futures. This is the core of what makes this async, this allows us to do + non-blocking work in the main processes and "wait" for an event to happen + ''' + + def __init__(self, mod_opts, opts): + self.mod_opts = mod_opts + self.opts = opts + self.event = salt.utils.event.get_event( + 'master', + opts['sock_dir'], + opts['transport'], + opts=opts, + listen=True, + io_loop=tornado.ioloop.IOLoop.current() + ) + + # tag -> list of futures + self.tag_map = defaultdict(list) + + # request_obj -> list of (tag, future) + self.request_map = defaultdict(list) + + # map of future -> timeout_callback + self.timeout_map = {} + + self.event.set_event_handler(self._handle_event_socket_recv) + + def clean_timeout_futures(self, request): + ''' + Remove all futures that were waiting for request `request` since it is done waiting + ''' + if request not in self.request_map: + return + for tag, future in self.request_map[request]: + # timeout the future + self._timeout_future(tag, future) + # remove the timeout + if future in self.timeout_map: + tornado.ioloop.IOLoop.current().remove_timeout(self.timeout_map[future]) + del self.timeout_map[future] + + del self.request_map[request] + + def get_event(self, + request, + tag='', + callback=None, + timeout=None + ): + ''' + Get an event (async of course) return a future that will get it later + ''' + # if the request finished, no reason to allow event fetching, since we + # can't send back to the client + if request._finished: + future = Future() + future.set_exception(TimeoutException()) + return future + + future = Future() + if callback is not None: + def handle_future(future): + tornado.ioloop.IOLoop.current().add_callback(callback, future) + future.add_done_callback(handle_future) + # add this tag and future to the callbacks + self.tag_map[tag].append(future) + self.request_map[request].append((tag, future)) + + if timeout: + timeout_future = tornado.ioloop.IOLoop.current().call_later(timeout, self._timeout_future, tag, future) + self.timeout_map[future] = timeout_future + + return future + + def _timeout_future(self, tag, future): + ''' + Timeout a specific future + ''' + if tag not in self.tag_map: + return + if not future.done(): + future.set_exception(TimeoutException()) + self.tag_map[tag].remove(future) + if len(self.tag_map[tag]) == 0: + del self.tag_map[tag] + + def _handle_event_socket_recv(self, raw): + ''' + Callback for events on the event sub socket + ''' + mtag, data = self.event.unpack(raw, self.event.serial) + # see if we have any futures that need this info: + for tag_prefix, futures in six.iteritems(self.tag_map): + if mtag.startswith(tag_prefix): + for future in futures: + if future.done(): + continue + future.set_result({'data': data, 'tag': mtag}) + self.tag_map[tag_prefix].remove(future) + if future in self.timeout_map: + tornado.ioloop.IOLoop.current().remove_timeout(self.timeout_map[future]) + del self.timeout_map[future] + + +class BaseSaltAPIHandler(tornado.web.RequestHandler, SaltClientsMixIn): # pylint: disable=W0223 + ct_out_map = ( + ('application/json', json.dumps), + ('application/x-yaml', yaml.safe_dump), + ) + + def _verify_client(self, low): + ''' + Verify that the client is in fact one we have + ''' + if 'client' not in low or low.get('client') not in self.saltclients: + self.set_status(400) + self.write("400 Invalid Client: Client not found in salt clients") + self.finish() + return False + return True + + def initialize(self): + ''' + Initialize the handler before requests are called + ''' + if not hasattr(self.application, 'event_listener'): + logger.critical('init a listener') + self.application.event_listener = EventListener( + self.application.mod_opts, + self.application.opts, + ) + + @property + def token(self): + ''' + The token used for the request + ''' + # find the token (cookie or headers) + if AUTH_TOKEN_HEADER in self.request.headers: + return self.request.headers[AUTH_TOKEN_HEADER] + else: + return self.get_cookie(AUTH_COOKIE_NAME) + + def _verify_auth(self): + ''' + Boolean whether the request is auth'd + ''' + + return self.token and bool(self.application.auth.get_tok(self.token)) + + def prepare(self): + ''' + Run before get/posts etc. Pre-flight checks: + - verify that we can speak back to them (compatible accept header) + ''' + # Find an acceptable content-type + accept_header = self.request.headers.get('Accept', '*/*') + # Ignore any parameter, including q (quality) one + parsed_accept_header = [cgi.parse_header(h)[0] for h in accept_header.split(',')] + + def find_acceptable_content_type(parsed_accept_header): + for media_range in parsed_accept_header: + for content_type, dumper in self.ct_out_map: + if fnmatch.fnmatch(content_type, media_range): + return content_type, dumper + return None, None + + content_type, dumper = find_acceptable_content_type(parsed_accept_header) + + # better return message? + if not content_type: + self.send_error(406) + + self.content_type = content_type + self.dumper = dumper + + # do the common parts + self.start = time.time() + self.connected = True + + self.lowstate = self._get_lowstate() + + def timeout_futures(self): + ''' + timeout a session + ''' + # TODO: set a header or something??? so we know it was a timeout + self.application.event_listener.clean_timeout_futures(self) + + def on_finish(self): + ''' + When the job has been done, lets cleanup + ''' + # timeout all the futures + self.timeout_futures() + + def on_connection_close(self): + ''' + If the client disconnects, lets close out + ''' + self.finish() + + def serialize(self, data): + ''' + Serlialize the output based on the Accept header + ''' + self.set_header('Content-Type', self.content_type) + + return self.dumper(data) + + def _form_loader(self, _): + ''' + function to get the data from the urlencoded forms + ignore the data passed in and just get the args from wherever they are + ''' + data = {} + for key in self.request.arguments: + val = self.get_arguments(key) + if len(val) == 1: + data[key] = val[0] + else: + data[key] = val + return data + + def deserialize(self, data): + ''' + Deserialize the data based on request content type headers + ''' + ct_in_map = { + 'application/x-www-form-urlencoded': self._form_loader, + 'application/json': json.loads, + 'application/x-yaml': yaml.safe_load, + 'text/yaml': yaml.safe_load, + # because people are terrible and don't mean what they say + 'text/plain': json.loads + } + + try: + # Use cgi.parse_header to correctly separate parameters from value + value, parameters = cgi.parse_header(self.request.headers['Content-Type']) + return ct_in_map[value](tornado.escape.native_str(data)) + except KeyError: + self.send_error(406) + except ValueError: + self.send_error(400) + + def _get_lowstate(self): + ''' + Format the incoming data into a lowstate object + ''' + if not self.request.body: + return + data = self.deserialize(self.request.body) + self.request_payload = copy(data) + + if data and 'arg' in data and not isinstance(data['arg'], list): + data['arg'] = [data['arg']] + + if not isinstance(data, list): + lowstate = [data] + else: + lowstate = data + + return lowstate + + def set_default_headers(self): + ''' + Set default CORS headers + ''' + mod_opts = self.application.mod_opts + + if mod_opts.get('cors_origin'): + origin = self.request.headers.get('Origin') + + allowed_origin = _check_cors_origin(origin, mod_opts['cors_origin']) + + if allowed_origin: + self.set_header("Access-Control-Allow-Origin", allowed_origin) + + def options(self, *args, **kwargs): + ''' + Return CORS headers for preflight requests + ''' + # Allow X-Auth-Token in requests + request_headers = self.request.headers.get('Access-Control-Request-Headers') + allowed_headers = request_headers.split(',') + + # Filter allowed header here if needed. + + # Allow request headers + self.set_header('Access-Control-Allow-Headers', ','.join(allowed_headers)) + + # Allow X-Auth-Token in responses + self.set_header('Access-Control-Expose-Headers', 'X-Auth-Token') + + # Allow all methods + self.set_header('Access-Control-Allow-Methods', 'OPTIONS, GET, POST') + + self.set_status(204) + self.finish() + + +class SaltAuthHandler(BaseSaltAPIHandler): # pylint: disable=W0223 + ''' + Handler for login requests + ''' + def get(self): + ''' + All logins are done over post, this is a parked enpoint + + .. http:get:: /login + + :status 401: |401| + :status 406: |406| + + **Example request:** + + .. code-block:: bash + + curl -i localhost:8000/login + + .. code-block:: http + + GET /login HTTP/1.1 + Host: localhost:8000 + Accept: application/json + + **Example response:** + + .. code-block:: http + + HTTP/1.1 401 Unauthorized + Content-Type: application/json + Content-Length: 58 + + {"status": "401 Unauthorized", "return": "Please log in"} + ''' + self.set_status(401) + self.set_header('WWW-Authenticate', 'Session') + + ret = {'status': '401 Unauthorized', + 'return': 'Please log in'} + + self.write(self.serialize(ret)) + + # TODO: make async? Underlying library isn't... and we ARE making disk calls :( + def post(self): + ''' + :ref:`Authenticate <rest_tornado-auth>` against Salt's eauth system + + .. http:post:: /login + + :reqheader X-Auth-Token: |req_token| + :reqheader Accept: |req_accept| + :reqheader Content-Type: |req_ct| + + :form eauth: the eauth backend configured for the user + :form username: username + :form password: password + + :status 200: |200| + :status 400: |400| + :status 401: |401| + :status 406: |406| + :status 500: |500| + + **Example request:** + + .. code-block:: bash + + curl -si localhost:8000/login \\ + -H "Accept: application/json" \\ + -d username='saltuser' \\ + -d password='saltpass' \\ + -d eauth='pam' + + .. code-block:: http + + POST / HTTP/1.1 + Host: localhost:8000 + Content-Length: 42 + Content-Type: application/x-www-form-urlencoded + Accept: application/json + + username=saltuser&password=saltpass&eauth=pam + + **Example response:** + + .. code-block:: http + + HTTP/1.1 200 OK + Content-Type: application/json + Content-Length: 206 + X-Auth-Token: 6d1b722e + Set-Cookie: session_id=6d1b722e; expires=Sat, 17 Nov 2012 03:23:52 GMT; Path=/ + + {"return": { + "token": "6d1b722e", + "start": 1363805943.776223, + "expire": 1363849143.776224, + "user": "saltuser", + "eauth": "pam", + "perms": [ + "grains.*", + "status.*", + "sys.*", + "test.*" + ] + }} + ''' + try: + if not isinstance(self.request_payload, dict): + self.send_error(400) + return + + creds = {'username': self.request_payload['username'], + 'password': self.request_payload['password'], + 'eauth': self.request_payload['eauth'], + } + # if any of the args are missing, its a bad request + except KeyError: + self.send_error(400) + return + + token = self.application.resolver.mk_token(creds) + if not token: + logger.debug("Authentication failure or no permissions.") + self.send_error(401) + return + + # copied from cherrypy + token_id = token['token'] + token_timeout = (token['expire'] - token['start']) / 60 + token_user = token['name'] + + # Grab eauth config for the current backend for the current user + try: + eauth = self.application.opts.get('external_auth', {}).get(token['eauth'], {}) + # Get sum of '*' perms, user-specific perms, and group-specific perms + perms = eauth.get(token['name'], []) + perms.extend(eauth.get('*', [])) + + if 'groups' in token and token['groups']: + logger.debug("Getting permissions from Groups ({})".format(token['groups'])) + user_groups = set(token['groups']) + eauth_groups = set([i.rstrip('%') for i in eauth.keys() if i.endswith('%')]) + + for group in user_groups & eauth_groups: + perms.extend(eauth['{0}%'.format(group)]) + + if not perms: + logger.debug("Eauth permission list not found.") + self.send_error(401) + return + + if 'token' not in token: + # TODO: nicer error message + # 'Could not authenticate using provided credentials') + logger.debug("Eauth token id not found.") + self.send_error(401) + # return since we don't want to execute any more + return + + except (AttributeError, IndexError): + logger.debug("Configuration for external_auth malformed for " + "eauth '{0}', and user '{1}'." + .format(token.get('eauth'), token.get('name')), exc_info=True) + # TODO better error -- 'Configuration for external_auth could not be read.' + self.send_error(500) + return + + ret = {'return': [{ + 'token': token['token'], + 'expire': token['expire'], + 'start': token['start'], + 'user': token['name'], + 'eauth': token['eauth'], + 'perms': perms, + }]} + + self.write(self.serialize(ret)) + + +class SaltValidateTokenHandler(BaseSaltAPIHandler): # pylint: disable=W0223 + ''' + Handler for logout requests + ''' + + def post(self): + ''' + Checks token in /var/cache/salt/master/tokens + ''' + if not self._verify_auth(): + self.send_error(401) + return + + +class SaltLogoutHandler(BaseSaltAPIHandler): # pylint: disable=W0223 + ''' + Handler for logout requests + ''' + + def post(self): + ''' + Deletes token in /var/cache/salt/master/tokens + ''' + try: + token_dir = self.application.opts.get('token_dir') + token = self.request.headers.get('X-Auth-Token', "") + + if token and isfile(join(token_dir, token)): + unlink(join(token_dir, token)) + except KeyError: + self.send_error(500) + return + + +class SaltAPIHandler(BaseSaltAPIHandler, SaltClientsMixIn): # pylint: disable=W0223 + ''' + Main API handler for base "/" + ''' + def get(self): + ''' + An enpoint to determine salt-api capabilities + + .. http:get:: / + + :reqheader Accept: |req_accept| + + :status 200: |200| + :status 401: |401| + :status 406: |406| + + **Example request:** + + .. code-block:: bash + + curl -i localhost:8000 + + .. code-block:: http + + GET / HTTP/1.1 + Host: localhost:8000 + Accept: application/json + + **Example response:** + + .. code-block:: http + + HTTP/1.1 200 OK + Content-Type: application/json + Content-Legnth: 83 + + {"clients": ["local", "local_async", "runner", "runner_async"], "return": "Welcome"} + ''' + ret = {"clients": list(self.saltclients.keys()), + "return": "Welcome"} + self.write(self.serialize(ret)) + + @tornado.web.asynchronous + def post(self): + ''' + Send one or more Salt commands (lowstates) in the request body + + .. http:post:: / + + :reqheader X-Auth-Token: |req_token| + :reqheader Accept: |req_accept| + :reqheader Content-Type: |req_ct| + + :resheader Content-Type: |res_ct| + + :status 200: |200| + :status 401: |401| + :status 406: |406| + + :term:`lowstate` data describing Salt commands must be sent in the + request body. + + **Example request:** + + .. code-block:: bash + + curl -si https://localhost:8000 \\ + -H "Accept: application/x-yaml" \\ + -H "X-Auth-Token: d40d1e1e" \\ + -d client=local \\ + -d tgt='*' \\ + -d fun='test.ping' \\ + -d arg + + .. code-block:: http + + POST / HTTP/1.1 + Host: localhost:8000 + Accept: application/x-yaml + X-Auth-Token: d40d1e1e + Content-Length: 36 + Content-Type: application/x-www-form-urlencoded + + fun=test.ping&arg&client=local&tgt=* + + **Example response:** + Responses are an in-order list of the lowstate's return data. In the + event of an exception running a command the return will be a string + instead of a mapping. + + .. code-block:: http + + HTTP/1.1 200 OK + Content-Length: 200 + Allow: GET, HEAD, POST + Content-Type: application/x-yaml + + return: + - ms-0: true + ms-1: true + ms-2: true + ms-3: true + ms-4: true + + .. admonition:: multiple commands + Note that if multiple :term:`lowstate` structures are sent, the Salt + API will execute them in serial, and will not stop execution upon failure + of a previous job. If you need to have commands executed in order and + stop on failure please use compount-command-execution. + + ''' + # if you aren't authenticated, redirect to login + if not self._verify_auth(): + self.redirect('/login') + return + + self.disbatch() + + @tornado.gen.coroutine + def disbatch(self): + ''' + Disbatch all lowstates to the appropriate clients + ''' + ret = [] + + # check clients before going, we want to throw 400 if one is bad + try: + for low in self.lowstate: + if not self._verify_client(low): + return + + # Make sure we have 'token' or 'username'/'password' in each low chunk. + # Salt will verify the credentials are correct. + if self.token is not None and 'token' not in low: + low['token'] = self.token + + if not (('token' in low) + or ('username' in low and 'password' in low and 'eauth' in low)): + ret.append('Failed to authenticate') + break + + # disbatch to the correct handler + try: + chunk_ret = yield getattr(self, '_disbatch_{0}'.format(low['client']))(low) + ret.append(chunk_ret) + except EauthAuthenticationError as exc: + ret.append('Failed to authenticate') + break + except Exception as ex: + ret.append('Unexpected exception while handling request: {0}'.format(ex)) + logger.error('Unexpected exception while handling request:', exc_info=True) + except Exception as ex: + ret.append('Error while parsing request (malformed arguments): {0}'.format(ex)) + logger.error('Error while parsing request (malformed arguments):', exc_info=True) + + self.write(self.serialize({'return': ret})) + self.finish() + + @tornado.gen.coroutine + def _disbatch_local(self, chunk): + ''' + Dispatch local client commands + ''' + chunk_ret = {} + + f_call = self._format_call_run_job_async(chunk) + # fire a job off + try: + pub_data = yield self.saltclients['local'](*f_call.get('args', ()), **f_call.get('kwargs', {})) + except EauthAuthenticationError: + raise tornado.gen.Return('Not authorized to run this job') + + # if the job didn't publish, lets not wait around for nothing + # TODO: set header?? + if 'jid' not in pub_data: + raise tornado.gen.Return('No minions matched the target. No command was sent, no jid was assigned.') + + # seed minions_remaining with the pub_data + minions_remaining = pub_data['minions'] + + syndic_min_wait = None + if self.application.opts['order_masters']: + syndic_min_wait = tornado.gen.sleep(self.application.opts['syndic_wait']) + + job_not_running = self.job_not_running(pub_data['jid'], + chunk['tgt'], + f_call['kwargs']['tgt_type'], + minions_remaining=minions_remaining + ) + + # if we have a min_wait, do that + if syndic_min_wait is not None: + yield syndic_min_wait + # we are completed when either all minions return or the job isn't running anywhere + chunk_ret = yield self.all_returns(pub_data['jid'], + finish_futures=[job_not_running], + minions_remaining=minions_remaining, + ) + + raise tornado.gen.Return(chunk_ret) + + @tornado.gen.coroutine + def all_returns(self, + jid, + finish_futures=None, + minions_remaining=None, + ): + ''' + Return a future which will complete once all returns are completed + (according to minions_remaining), or one of the passed in "finish_futures" completes + ''' + if finish_futures is None: + finish_futures = [] + if minions_remaining is None: + minions_remaining = [] + + ret_tag = tagify([jid, 'ret'], 'job') + chunk_ret = {} + while True: + ret_event = self.application.event_listener.get_event(self, + tag=ret_tag, + ) + f = yield Any([ret_event] + finish_futures) + if f in finish_futures: + raise tornado.gen.Return(chunk_ret) + event = f.result() + chunk_ret[event['data']['id']] = event['data']['return'] + # its possible to get a return that wasn't in the minion_remaining list + try: + minions_remaining.remove(event['data']['id']) + except ValueError: + pass + if len(minions_remaining) == 0: + raise tornado.gen.Return(chunk_ret) + + @tornado.gen.coroutine + def job_not_running(self, + jid, + tgt, + tgt_type, + minions_remaining=None, + ): + ''' + Return a future which will complete once jid (passed in) is no longer + running on tgt + ''' + if minions_remaining is None: + minions_remaining = [] + + ping_pub_data = yield self.saltclients['local'](tgt, + 'saltutil.find_job', + [jid], + tgt_type=tgt_type) + ping_tag = tagify([ping_pub_data['jid'], 'ret'], 'job') + + minion_running = False + while True: + try: + event = yield self.application.event_listener.get_event(self, + tag=ping_tag, + timeout=self.application.opts['gather_job_timeout'], + ) + except TimeoutException: + if not minion_running: + raise tornado.gen.Return(True) + else: + ping_pub_data = yield self.saltclients['local'](tgt, + 'saltutil.find_job', + [jid], + tgt_type=tgt_type) + ping_tag = tagify([ping_pub_data['jid'], 'ret'], 'job') + minion_running = False + continue + # Minions can return, we want to see if the job is running... + if event['data'].get('return', {}) == {}: + continue + minion_running = True + id_ = event['data']['id'] + if id_ not in minions_remaining: + minions_remaining.append(event['data']['id']) + + @tornado.gen.coroutine + def _disbatch_local_async(self, chunk): + ''' + Disbatch local client_async commands + ''' + f_call = self._format_call_run_job_async(chunk) + # fire a job off + pub_data = yield self.saltclients['local_async'](*f_call.get('args', ()), **f_call.get('kwargs', {})) + + raise tornado.gen.Return(pub_data) + + @tornado.gen.coroutine + def _disbatch_runner(self, chunk): + ''' + Disbatch runner client commands + ''' + pub_data = self.saltclients['runner'](chunk) + tag = pub_data['tag'] + '/ret' + try: + event = yield self.application.event_listener.get_event(self, tag=tag) + + # only return the return data + raise tornado.gen.Return(event['data']['return']) + except TimeoutException: + raise tornado.gen.Return('Timeout waiting for runner to execute') + + @tornado.gen.coroutine + def _disbatch_runner_async(self, chunk): + ''' + Disbatch runner client_async commands + ''' + pub_data = self.saltclients['runner'](chunk) + raise tornado.gen.Return(pub_data) + + # salt.utils.format_call doesn't work for functions having the annotation tornado.gen.coroutine + def _format_call_run_job_async(self, chunk): + f_call = salt.utils.format_call(salt.client.LocalClient.run_job, chunk, is_class_method=True) + f_call.get('kwargs', {})['io_loop'] = tornado.ioloop.IOLoop.current() + return f_call + + +class MinionSaltAPIHandler(SaltAPIHandler): # pylint: disable=W0223 + ''' + A convenience endpoint for minion related functions + ''' + @tornado.web.asynchronous + def get(self, mid=None): # pylint: disable=W0221 + ''' + A convenience URL for getting lists of minions or getting minion + details + + .. http:get:: /minions/(mid) + + :reqheader X-Auth-Token: |req_token| + :reqheader Accept: |req_accept| + + :status 200: |200| + :status 401: |401| + :status 406: |406| + + **Example request:** + + .. code-block:: bash + + curl -i localhost:8000/minions/ms-3 + + .. code-block:: http + + GET /minions/ms-3 HTTP/1.1 + Host: localhost:8000 + Accept: application/x-yaml + + **Example response:** + + .. code-block:: http + + HTTP/1.1 200 OK + Content-Length: 129005 + Content-Type: application/x-yaml + + return: + - ms-3: + grains.items: + ... + ''' + # if you aren't authenticated, redirect to login + if not self._verify_auth(): + self.redirect('/login') + return + + self.lowstate = [{ + 'client': 'local', + 'tgt': mid or '*', + 'fun': 'grains.items', + }] + self.disbatch() + + @tornado.web.asynchronous + def post(self): + ''' + Start an execution command and immediately return the job id + + .. http:post:: /minions + + :reqheader X-Auth-Token: |req_token| + :reqheader Accept: |req_accept| + :reqheader Content-Type: |req_ct| + + :resheader Content-Type: |res_ct| + + :status 200: |200| + :status 401: |401| + :status 406: |406| + + :term:`lowstate` data describing Salt commands must be sent in the + request body. The ``client`` option will be set to + :py:meth:`~salt.client.LocalClient.local_async`. + + **Example request:** + + .. code-block:: bash + + curl -sSi localhost:8000/minions \\ + -H "Accept: application/x-yaml" \\ + -d tgt='*' \\ + -d fun='status.diskusage' + + .. code-block:: http + + POST /minions HTTP/1.1 + Host: localhost:8000 + Accept: application/x-yaml + Content-Length: 26 + Content-Type: application/x-www-form-urlencoded + + tgt=*&fun=status.diskusage + + **Example response:** + + .. code-block:: http + + HTTP/1.1 202 Accepted + Content-Length: 86 + Content-Type: application/x-yaml + + return: + - jid: '20130603122505459265' + minions: [ms-4, ms-3, ms-2, ms-1, ms-0] + ''' + # if you aren't authenticated, redirect to login + if not self._verify_auth(): + self.redirect('/login') + return + + # verify that all lowstates are the correct client type + for low in self.lowstate: + # if you didn't specify, its fine + if 'client' not in low: + low['client'] = 'local_async' + continue + # if you specified something else, we don't do that + if low.get('client') != 'local_async': + self.set_status(400) + self.write('We don\'t serve your kind here') + self.finish() + return + + self.disbatch() + + +class JobsSaltAPIHandler(SaltAPIHandler): # pylint: disable=W0223 + ''' + A convenience endpoint for job cache data + ''' + @tornado.web.asynchronous + def get(self, jid=None): # pylint: disable=W0221 + ''' + A convenience URL for getting lists of previously run jobs or getting + the return from a single job + + .. http:get:: /jobs/(jid) + + List jobs or show a single job from the job cache. + + :status 200: |200| + :status 401: |401| + :status 406: |406| + + **Example request:** + + .. code-block:: bash + + curl -i localhost:8000/jobs + + .. code-block:: http + + GET /jobs HTTP/1.1 + Host: localhost:8000 + Accept: application/x-yaml + + **Example response:** + + .. code-block:: http + + HTTP/1.1 200 OK + Content-Length: 165 + Content-Type: application/x-yaml + + return: + - '20121130104633606931': + Arguments: + - '3' + Function: test.fib + Start Time: 2012, Nov 30 10:46:33.606931 + Target: jerry + Target-type: glob + + **Example request:** + + .. code-block:: bash + + curl -i localhost:8000/jobs/20121130104633606931 + + .. code-block:: http + + GET /jobs/20121130104633606931 HTTP/1.1 + Host: localhost:8000 + Accept: application/x-yaml + + **Example response:** + + .. code-block:: http + + HTTP/1.1 200 OK + Content-Length: 73 + Content-Type: application/x-yaml + + info: + - Arguments: + - '3' + Function: test.fib + Minions: + - jerry + Start Time: 2012, Nov 30 10:46:33.606931 + Target: '*' + Target-type: glob + User: saltdev + jid: '20121130104633606931' + return: + - jerry: + - - 0 + - 1 + - 1 + - 2 + - 6.9141387939453125e-06 + ''' + # if you aren't authenticated, redirect to login + if not self._verify_auth(): + self.redirect('/login') + return + + if jid: + self.lowstate = [{ + 'fun': 'jobs.list_job', + 'jid': jid, + 'client': 'runner', + }] + else: + self.lowstate = [{ + 'fun': 'jobs.list_jobs', + 'client': 'runner', + }] + + self.disbatch() + + +class RunSaltAPIHandler(SaltAPIHandler): # pylint: disable=W0223 + ''' + Endpoint to run commands without normal session handling + ''' + @tornado.web.asynchronous + def post(self): + ''' + Run commands bypassing the :ref:`normal session handling + <rest_cherrypy-auth>` + + .. http:post:: /run + + This entry point is primarily for "one-off" commands. Each request + must pass full Salt authentication credentials. Otherwise this URL + is identical to the :py:meth:`root URL (/) <LowDataAdapter.POST>`. + + :term:`lowstate` data describing Salt commands must be sent in the + request body. + + :status 200: |200| + :status 401: |401| + :status 406: |406| + + **Example request:** + + .. code-block:: bash + + curl -sS localhost:8000/run \\ + -H 'Accept: application/x-yaml' \\ + -d client='local' \\ + -d tgt='*' \\ + -d fun='test.ping' \\ + -d username='saltdev' \\ + -d password='saltdev' \\ + -d eauth='pam' + + .. code-block:: http + + POST /run HTTP/1.1 + Host: localhost:8000 + Accept: application/x-yaml + Content-Length: 75 + Content-Type: application/x-www-form-urlencoded + + client=local&tgt=*&fun=test.ping&username=saltdev&password=saltdev&eauth=pam + + **Example response:** + + .. code-block:: http + + HTTP/1.1 200 OK + Content-Length: 73 + Content-Type: application/x-yaml + + return: + - ms-0: true + ms-1: true + ms-2: true + ms-3: true + ms-4: true + ''' + self.disbatch() + + +class EventsSaltAPIHandler(SaltAPIHandler): # pylint: disable=W0223 + ''' + Expose the Salt event bus + + The event bus on the Salt master exposes a large variety of things, notably + when executions are started on the master and also when minions ultimately + return their results. This URL provides a real-time window into a running + Salt infrastructure. + + .. seealso:: :ref:`events` + ''' + @tornado.gen.coroutine + def get(self): + r''' + An HTTP stream of the Salt master event bus + + This stream is formatted per the Server Sent Events (SSE) spec. Each + event is formatted as JSON. + + .. http:get:: /events + + :status 200: |200| + :status 401: |401| + :status 406: |406| + + **Example request:** + + .. code-block:: bash + + curl -NsS localhost:8000/events + + .. code-block:: http + + GET /events HTTP/1.1 + Host: localhost:8000 + + **Example response:** + + .. code-block:: http + + HTTP/1.1 200 OK + Connection: keep-alive + Cache-Control: no-cache + Content-Type: text/event-stream;charset=utf-8 + + retry: 400 + data: {'tag': '', 'data': {'minions': ['ms-4', 'ms-3', 'ms-2', 'ms-1', 'ms-0']}} + + data: {'tag': '20130802115730568475', 'data': {'jid': '20130802115730568475', 'return': True, 'retcode': 0, 'success': True, 'cmd': '_return', 'fun': 'test.ping', 'id': 'ms-1'}} + + The event stream can be easily consumed via JavaScript: + + .. code-block:: javascript + + # Note, you must be authenticated! + var source = new EventSource('/events'); + source.onopen = function() { console.debug('opening') }; + source.onerror = function(e) { console.debug('error!', e) }; + source.onmessage = function(e) { console.debug(e.data) }; + + Or using CORS: + + .. code-block:: javascript + + var source = new EventSource('/events', {withCredentials: true}); + + Some browser clients lack CORS support for the ``EventSource()`` API. Such + clients may instead pass the :mailheader:`X-Auth-Token` value as an URL + parameter: + + .. code-block:: bash + + curl -NsS localhost:8000/events/6d1b722e + + It is also possible to consume the stream via the shell. + + Records are separated by blank lines; the ``data:`` and ``tag:`` + prefixes will need to be removed manually before attempting to + unserialize the JSON. + + curl's ``-N`` flag turns off input buffering which is required to + process the stream incrementally. + + Here is a basic example of printing each event as it comes in: + + .. code-block:: bash + + curl -NsS localhost:8000/events |\ + while IFS= read -r line ; do + echo $line + done + + Here is an example of using awk to filter events based on tag: + + .. code-block:: bash + + curl -NsS localhost:8000/events |\ + awk ' + BEGIN { RS=""; FS="\\n" } + $1 ~ /^tag: salt\/job\/[0-9]+\/new$/ { print $0 } + ' + tag: salt/job/20140112010149808995/new + data: {"tag": "salt/job/20140112010149808995/new", "data": {"tgt_type": "glob", "jid": "20140112010149808995", "tgt": "jerry", "_stamp": "2014-01-12_01:01:49.809617", "user": "shouse", "arg": [], "fun": "test.ping", "minions": ["jerry"]}} + tag: 20140112010149808995 + data: {"tag": "20140112010149808995", "data": {"fun_args": [], "jid": "20140112010149808995", "return": true, "retcode": 0, "success": true, "cmd": "_return", "_stamp": "2014-01-12_01:01:49.819316", "fun": "test.ping", "id": "jerry"}} + ''' + # if you aren't authenticated, redirect to login + if not self._verify_auth(): + self.redirect('/login') + return + # set the streaming headers + self.set_header('Content-Type', 'text/event-stream') + self.set_header('Cache-Control', 'no-cache') + self.set_header('Connection', 'keep-alive') + + self.write(u'retry: {0}\n'.format(400)) + self.flush() + + while True: + try: + event = yield self.application.event_listener.get_event(self) + self.write(u'tag: {0}\n'.format(event.get('tag', ''))) + self.write(u'data: {0}\n\n'.format(json.dumps(event))) + self.flush() + except TimeoutException: + break + + +class WebhookSaltAPIHandler(SaltAPIHandler): # pylint: disable=W0223 + ''' + A generic web hook entry point that fires an event on Salt's event bus + + External services can POST data to this URL to trigger an event in Salt. + For example, Amazon SNS, Jenkins-CI or Travis-CI, or GitHub web hooks. + + .. note:: Be mindful of security + + Salt's Reactor can run any code. A Reactor SLS that responds to a hook + event is responsible for validating that the event came from a trusted + source and contains valid data. + + **This is a generic interface and securing it is up to you!** + + This URL requires authentication however not all external services can + be configured to authenticate. For this reason authentication can be + selectively disabled for this URL. Follow best practices -- always use + SSL, pass a secret key, configure the firewall to only allow traffic + from a known source, etc. + + The event data is taken from the request body. The + :mailheader:`Content-Type` header is respected for the payload. + + The event tag is prefixed with ``salt/netapi/hook`` and the URL path is + appended to the end. For example, a ``POST`` request sent to + ``/hook/mycompany/myapp/mydata`` will produce a Salt event with the tag + ``salt/netapi/hook/mycompany/myapp/mydata``. + + The following is an example ``.travis.yml`` file to send notifications to + Salt of successful test runs: + + .. code-block:: yaml + + language: python + script: python -m unittest tests + after_success: + - 'curl -sS http://saltapi-url.example.com:8000/hook/travis/build/success -d branch="${TRAVIS_BRANCH}" -d commit="${TRAVIS_COMMIT}"' + + .. seealso:: :ref:`events`, :ref:`reactor` + ''' + def post(self, tag_suffix=None): # pylint: disable=W0221 + ''' + Fire an event in Salt with a custom event tag and data + + .. http:post:: /hook + + :status 200: |200| + :status 401: |401| + :status 406: |406| + :status 413: request body is too large + + **Example request:** + + .. code-block:: bash + + curl -sS localhost:8000/hook -d foo='Foo!' -d bar='Bar!' + + .. code-block:: http + + POST /hook HTTP/1.1 + Host: localhost:8000 + Content-Length: 16 + Content-Type: application/x-www-form-urlencoded + + foo=Foo&bar=Bar! + + **Example response**: + + .. code-block:: http + + HTTP/1.1 200 OK + Content-Length: 14 + Content-Type: application/json + + {"success": true} + + As a practical example, an internal continuous-integration build + server could send an HTTP POST request to the URL + ``http://localhost:8000/hook/mycompany/build/success`` which contains + the result of a build and the SHA of the version that was built as + JSON. That would then produce the following event in Salt that could be + used to kick off a deployment via Salt's Reactor:: + + Event fired at Fri Feb 14 17:40:11 2014 + ************************* + Tag: salt/netapi/hook/mycompany/build/success + Data: + {'_stamp': '2014-02-14_17:40:11.440996', + 'headers': { + 'X-My-Secret-Key': 'F0fAgoQjIT@W', + 'Content-Length': '37', + 'Content-Type': 'application/json', + 'Host': 'localhost:8000', + 'Remote-Addr': '127.0.0.1'}, + 'post': {'revision': 'aa22a3c4b2e7', 'result': True}} + + Salt's Reactor could listen for the event: + + .. code-block:: yaml + + reactor: + - 'salt/netapi/hook/mycompany/build/*': + - /srv/reactor/react_ci_builds.sls + + And finally deploy the new build: + + .. code-block:: yaml + + {% set secret_key = data.get('headers', {}).get('X-My-Secret-Key') %} + {% set build = data.get('post', {}) %} + + {% if secret_key == 'F0fAgoQjIT@W' and build.result == True %} + deploy_my_app: + cmd.state.sls: + - tgt: 'application*' + - arg: + - myapp.deploy + - kwarg: + pillar: + revision: {{ revision }} + {% endif %} + ''' + disable_auth = self.application.mod_opts.get('webhook_disable_auth') + if not disable_auth and not self._verify_auth(): + self.redirect('/login') + return + + # if you have the tag, prefix + tag = 'salt/netapi/hook' + if tag_suffix: + tag += tag_suffix + + # TODO: consolidate?? + self.event = salt.utils.event.get_event( + 'master', + self.application.opts['sock_dir'], + self.application.opts['transport'], + opts=self.application.opts, + listen=False) + + arguments = {} + for argname in self.request.query_arguments: + value = self.get_arguments(argname) + if len(value) == 1: + value = value[0] + arguments[argname] = value + ret = self.event.fire_event({ + 'post': self.request_payload, + 'get': arguments, + # In Tornado >= v4.0.3, the headers come + # back as an HTTPHeaders instance, which + # is a dictionary. We must cast this as + # a dictionary in order for msgpack to + # serialize it. + 'headers': dict(self.request.headers), + }, tag) + + self.write(self.serialize({'success': ret})) + + +def _check_cors_origin(origin, allowed_origins): + """ + Check if an origin match cors allowed origins + """ + if isinstance(allowed_origins, list): + if origin in allowed_origins: + return origin + elif allowed_origins == '*': + return allowed_origins + elif allowed_origins == origin: + # Cors origin is either * or specific origin + return allowed_origins diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-saltstack/files/usr/lib/python3/dist-packages/salt/netapi/rest_eole/saltnado_websockets.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-saltstack/files/usr/lib/python3/dist-packages/salt/netapi/rest_eole/saltnado_websockets.py new file mode 100644 index 0000000000000000000000000000000000000000..33c37f1872881989793d903ad83c24b1cf85ce78 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-saltstack/files/usr/lib/python3/dist-packages/salt/netapi/rest_eole/saltnado_websockets.py @@ -0,0 +1,428 @@ +# encoding: utf-8 +''' +A Websockets add-on to saltnado +=============================== + +.. py:currentmodule:: salt.netapi.rest_tornado.saltnado + +:depends: - tornado Python module + +In order to enable saltnado_websockets you must add websockets: True to your +saltnado config block. + +.. code-block:: yaml + + rest_tornado: + # can be any port + port: 8000 + ssl_crt: /etc/pki/api/certs/server.crt + # no need to specify ssl_key if cert and key + # are in one single file + ssl_key: /etc/pki/api/certs/server.key + debug: False + disable_ssl: False + websockets: True + +All Events +---------- + +Exposes ``all`` "real-time" events from Salt's event bus on a websocket connection. +It should be noted that "Real-time" here means these events are made available +to the server as soon as any salt related action (changes to minions, new jobs etc) happens. +Clients are however assumed to be able to tolerate any network transport related latencies. +Functionality provided by this endpoint is similar to the ``/events`` end point. + +The event bus on the Salt master exposes a large variety of things, notably +when executions are started on the master and also when minions ultimately +return their results. This URL provides a real-time window into a running +Salt infrastructure. Uses websocket as the transport mechanism. + +Exposes GET method to return websocket connections. +All requests should include an auth token. +A way to obtain obtain authentication tokens is shown below. + +.. code-block:: bash + + % curl -si localhost:8000/login \\ + -H "Accept: application/json" \\ + -d username='salt' \\ + -d password='salt' \\ + -d eauth='pam' + +Which results in the response + +.. code-block:: json + + { + "return": [{ + "perms": [".*", "@runner", "@wheel"], + "start": 1400556492.277421, + "token": "d0ce6c1a37e99dcc0374392f272fe19c0090cca7", + "expire": 1400599692.277422, + "user": "salt", + "eauth": "pam" + }] + } + +In this example the ``token`` returned is ``d0ce6c1a37e99dcc0374392f272fe19c0090cca7`` and can be included +in subsequent websocket requests (as part of the URL). + +The event stream can be easily consumed via JavaScript: + +.. code-block:: javascript + + // Note, you must be authenticated! + + // Get the Websocket connection to Salt + var source = new Websocket('wss://localhost:8000/all_events/d0ce6c1a37e99dcc0374392f272fe19c0090cca7'); + + // Get Salt's "real time" event stream. + source.onopen = function() { source.send('websocket client ready'); }; + + // Other handlers + source.onerror = function(e) { console.debug('error!', e); }; + + // e.data represents Salt's "real time" event data as serialized JSON. + source.onmessage = function(e) { console.debug(e.data); }; + + // Terminates websocket connection and Salt's "real time" event stream on the server. + source.close(); + +Or via Python, using the Python module +`websocket-client <https://pypi.python.org/pypi/websocket-client/>`_ for example. +Or the tornado +`client <https://tornado.readthedocs.io/en/latest/websocket.html#client-side-support>`_. + +.. code-block:: python + + # Note, you must be authenticated! + + from websocket import create_connection + + # Get the Websocket connection to Salt + ws = create_connection('wss://localhost:8000/all_events/d0ce6c1a37e99dcc0374392f272fe19c0090cca7') + + # Get Salt's "real time" event stream. + ws.send('websocket client ready') + + + # Simple listener to print results of Salt's "real time" event stream. + # Look at https://pypi.python.org/pypi/websocket-client/ for more examples. + while listening_to_events: + print ws.recv() # Salt's "real time" event data as serialized JSON. + + # Terminates websocket connection and Salt's "real time" event stream on the server. + ws.close() + + # Please refer to https://github.com/liris/websocket-client/issues/81 when using a self signed cert + +Above examples show how to establish a websocket connection to Salt and activating +real time updates from Salt's event stream by signaling ``websocket client ready``. + + +Formatted Events +----------------- + +Exposes ``formatted`` "real-time" events from Salt's event bus on a websocket connection. +It should be noted that "Real-time" here means these events are made available +to the server as soon as any salt related action (changes to minions, new jobs etc) happens. +Clients are however assumed to be able to tolerate any network transport related latencies. +Functionality provided by this endpoint is similar to the ``/events`` end point. + +The event bus on the Salt master exposes a large variety of things, notably +when executions are started on the master and also when minions ultimately +return their results. This URL provides a real-time window into a running +Salt infrastructure. Uses websocket as the transport mechanism. + +Formatted events parses the raw "real time" event stream and maintains +a current view of the following: + +- minions +- jobs + +A change to the minions (such as addition, removal of keys or connection drops) +or jobs is processed and clients are updated. +Since we use salt's presence events to track minions, +please enable ``presence_events`` +and set a small value for the ``loop_interval`` +in the salt master config file. + +Exposes GET method to return websocket connections. +All requests should include an auth token. +A way to obtain obtain authentication tokens is shown below. + +.. code-block:: bash + + % curl -si localhost:8000/login \\ + -H "Accept: application/json" \\ + -d username='salt' \\ + -d password='salt' \\ + -d eauth='pam' + +Which results in the response + +.. code-block:: json + + { + "return": [{ + "perms": [".*", "@runner", "@wheel"], + "start": 1400556492.277421, + "token": "d0ce6c1a37e99dcc0374392f272fe19c0090cca7", + "expire": 1400599692.277422, + "user": "salt", + "eauth": "pam" + }] + } + +In this example the ``token`` returned is ``d0ce6c1a37e99dcc0374392f272fe19c0090cca7`` and can be included +in subsequent websocket requests (as part of the URL). + +The event stream can be easily consumed via JavaScript: + +.. code-block:: javascript + + // Note, you must be authenticated! + + // Get the Websocket connection to Salt + var source = new Websocket('wss://localhost:8000/formatted_events/d0ce6c1a37e99dcc0374392f272fe19c0090cca7'); + + // Get Salt's "real time" event stream. + source.onopen = function() { source.send('websocket client ready'); }; + + // Other handlers + source.onerror = function(e) { console.debug('error!', e); }; + + // e.data represents Salt's "real time" event data as serialized JSON. + source.onmessage = function(e) { console.debug(e.data); }; + + // Terminates websocket connection and Salt's "real time" event stream on the server. + source.close(); + +Or via Python, using the Python module +`websocket-client <https://pypi.python.org/pypi/websocket-client/>`_ for example. +Or the tornado +`client <https://tornado.readthedocs.io/en/latest/websocket.html#client-side-support>`_. + +.. code-block:: python + + # Note, you must be authenticated! + + from websocket import create_connection + + # Get the Websocket connection to Salt + ws = create_connection('wss://localhost:8000/formatted_events/d0ce6c1a37e99dcc0374392f272fe19c0090cca7') + + # Get Salt's "real time" event stream. + ws.send('websocket client ready') + + + # Simple listener to print results of Salt's "real time" event stream. + # Look at https://pypi.python.org/pypi/websocket-client/ for more examples. + while listening_to_events: + print ws.recv() # Salt's "real time" event data as serialized JSON. + + # Terminates websocket connection and Salt's "real time" event stream on the server. + ws.close() + + # Please refer to https://github.com/liris/websocket-client/issues/81 when using a self signed cert + +Above examples show how to establish a websocket connection to Salt and activating +real time updates from Salt's event stream by signaling ``websocket client ready``. + +Example responses +----------------- + +``Minion information`` is a dictionary keyed by each connected minion's ``id`` (``mid``), +grains information for each minion is also included. + +Minion information is sent in response to the following minion events: + +- connection drops + - requires running ``manage.present`` periodically every ``loop_interval`` seconds +- minion addition +- minon removal + +.. code-block:: python + + # Not all grains are shown + data: { + "minions": { + "minion1": { + "id": "minion1", + "grains": { + "kernel": "Darwin", + "domain": "local", + "zmqversion": "4.0.3", + "kernelrelease": "13.2.0" + } + } + } + } + +``Job information`` is also tracked and delivered. + +Job information is also a dictionary +in which each job's information is keyed by salt's ``jid``. + +.. code-block:: python + + data: { + "jobs": { + "20140609153646699137": { + "tgt_type": "glob", + "jid": "20140609153646699137", + "tgt": "*", + "start_time": "2014-06-09T15:36:46.700315", + "state": "complete", + "fun": "test.ping", + "minions": { + "minion1": { + "return": true, + "retcode": 0, + "success": true + } + } + } + } + } + +Setup +===== +''' +from __future__ import absolute_import + +import tornado.websocket +from . import event_processor +from .saltnado import _check_cors_origin + +import tornado.gen + +import salt.utils +import salt.netapi + +json = salt.utils.import_json() + +import logging +logger = logging.getLogger() + + +class AllEventsHandler(tornado.websocket.WebSocketHandler): # pylint: disable=W0223,W0232 + ''' + Server side websocket handler. + ''' + + # pylint: disable=W0221 + def get(self, token): + ''' + Check the token, returns a 401 if the token is invalid. + Else open the websocket connection + ''' + logger.debug('In the websocket get method') + + self.token = token + # close the connection, if not authenticated + if not self.application.auth.get_tok(token): + logger.debug('Refusing websocket connection, bad token!') + self.send_error(401) + return + super(AllEventsHandler, self).get(token) + + def open(self, token): # pylint: disable=W0221 + ''' + Return a websocket connection to Salt + representing Salt's "real time" event stream. + ''' + self.connected = False + + @tornado.gen.coroutine + def on_message(self, message): + """Listens for a "websocket client ready" message. + Once that message is received an asynchronous job + is stated that yields messages to the client. + These messages make up salt's + "real time" event stream. + """ + logger.debug('Got websocket message {0}'.format(message)) + if message == 'websocket client ready': + if self.connected: + # TBD: Add ability to run commands in this branch + logger.debug('Websocket already connected, returning') + return + + self.connected = True + + while True: + try: + event = yield self.application.event_listener.get_event(self) + self.write_message(json.dumps(event)) + except Exception as err: + logger.info('Error! Ending server side websocket connection. Reason = {0}'.format(str(err))) + break + + self.close() + else: + # TBD: Add logic to run salt commands here + pass + + def on_close(self, *args, **kwargs): + '''Cleanup. + + ''' + logger.debug('In the websocket close method') + self.close() + + def check_origin(self, origin): + """ + If cors is enabled, check that the origin is allowed + """ + + mod_opts = self.application.mod_opts + + if mod_opts.get('cors_origin'): + return bool(_check_cors_origin(origin, mod_opts['cors_origin'])) + else: + return super(AllEventsHandler, self).check_origin(origin) + + +class FormattedEventsHandler(AllEventsHandler): # pylint: disable=W0223,W0232 + + @tornado.gen.coroutine + def on_message(self, message): + """Listens for a "websocket client ready" message. + Once that message is received an asynchronous job + is stated that yields messages to the client. + These messages make up salt's + "real time" event stream. + """ + logger.debug('Got websocket message {0}'.format(message)) + if message == 'websocket client ready': + if self.connected: + # TBD: Add ability to run commands in this branch + logger.debug('Websocket already connected, returning') + return + + self.connected = True + + evt_processor = event_processor.SaltInfo(self) + client = salt.netapi.NetapiClient(self.application.opts) + client.run({ + 'fun': 'grains.items', + 'tgt': '*', + 'token': self.token, + 'mode': 'client', + 'async': 'local_async', + 'client': 'local' + }) + while True: + try: + event = yield self.application.event_listener.get_event(self) + evt_processor.process(event, self.token, self.application.opts) + # self.write_message(u'data: {0}\n\n'.format(json.dumps(event))) + except Exception as err: + logger.debug('Error! Ending server side websocket connection. Reason = {0}'.format(str(err))) + break + + self.close() + else: + # TBD: Add logic to run salt commands here + pass diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-saltstack/files/usr/share/eole/sbin/dumpconfig.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-saltstack/files/usr/share/eole/sbin/dumpconfig.py new file mode 100644 index 0000000000000000000000000000000000000000..4a591d922f54d381fc2c1e0ed07d331aad8b49d0 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-saltstack/files/usr/share/eole/sbin/dumpconfig.py @@ -0,0 +1,6 @@ +#!/usr/bin/python + +from creole.client import CreoleClient +from json import dumps + +print dumps(CreoleClient().get('/')) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-saltstack/posttemplates/00-saltstack b/seed/release/eole-2.7/2.7.1/applicationservice/eole-saltstack/posttemplates/00-saltstack new file mode 100644 index 0000000000000000000000000000000000000000..2635fef224aaaf29085f9123fcc19d4d832bc04a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-saltstack/posttemplates/00-saltstack @@ -0,0 +1,32 @@ +#!/bin/bash + +[ $(CreoleGet activer_saltstack) != 'oui' ] && exit 0 + +name=local +cert=$(CreoleGet minion_domain_name) +etcdir=/etc/salt/pki +etcdirminion=$etcdir/minion +ori=$etcdirminion/minion.pub +# certificates are in '/var/lib/salt/pki' dir #23763 +vardir=/var/lib/salt/pki +dst_minion=$vardir/minion +dst=$vardir/master/minions/$cert +pre=$vardir/master/minions_pre/$cert + +# salt-master is running as 'salt' user ##23763 +if [ ! -d $etcdirminion ]; then + mkdir -p $etcdirminion +fi +chown -R salt:salt $etcdirminion + +if [ ! -f $ori ]; then + salt-key --gen-keys=minion --gen-keys-dir=$etcdirminion + cp $etcdirminion/* $dst_minion/ +fi + +if [ ! -f $dst ]; then + cp -a $ori $dst + rm -f $pre +fi + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-saltstack/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-saltstack/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..f94aebc4d6842fd2a531c060eeb8e2f64cc5c346 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-saltstack/service.yml @@ -0,0 +1,58 @@ +format: '0.1' +name: eole-saltstack +version: |- + 2.7.0-7 +description: |- + saltstack's EOLE configuration and integration + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: [] +packages: + - eole-common + - salt-api + - salt-master + - salt-minion +dictionaries: + - 20_saltstack.xml +extra_dictionaries: {} +templates: + - cherry.conf + - ext_auth.conf + - master + - minion + - minion.smtp.conf + - salt-master.override.conf +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: + - 00-saltstack +files: + /usr/lib/python3/dist-packages/eole_salt_netapi-2.7.0.egg-info: + owner: root + group: root + mode: '0644' + /usr/lib/python3/dist-packages/salt/netapi/rest_eole/__init__.py: + owner: root + group: root + mode: '0644' + /usr/lib/python3/dist-packages/salt/netapi/rest_eole/event_processor.py: + owner: root + group: root + mode: '0644' + /usr/lib/python3/dist-packages/salt/netapi/rest_eole/saltnado.py: + owner: root + group: root + mode: '0644' + /usr/lib/python3/dist-packages/salt/netapi/rest_eole/saltnado_websockets.py: + owner: root + group: root + mode: '0644' + /usr/share/eole/sbin/dumpconfig.py: + owner: root + group: root + mode: '0755' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-saltstack/templates/cherry.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-saltstack/templates/cherry.conf new file mode 100644 index 0000000000000000000000000000000000000000..6aeb7b4c544c0b055b90a63d57a59e772b3a4b5f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-saltstack/templates/cherry.conf @@ -0,0 +1,7 @@ +rest_eole: + host: 0.0.0.0 + port: %%salt_api_port + disable_ssl: true + cors_origin: "*" + websockets: true + debug: true diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-saltstack/templates/ext_auth.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-saltstack/templates/ext_auth.conf new file mode 100644 index 0000000000000000000000000000000000000000..9cadb35c14caa0e6932ccb027753de31b3b4ad90 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-saltstack/templates/ext_auth.conf @@ -0,0 +1,67 @@ +%set %%DEFAULT_ROLE = {u'ead_admin': [{'name': 'adm', 'type': 'group'}]} +%set %%DEFAULT_PROFILE = [u'ead_admin'] +µµµµµµµµµµ %%dico looks like {action_name: {'profile': [profiles], 'activate': True, 'ewtapp': [ewtapps]}}, where profiles is a list +µµµµµµµµµµ for example {u'shutdown': [u'admin_ead']} +%set %%dico = {} +%set %%action_names = {} +%for %%path, %%value in %%creole_client.get('/actions', {}).items() + %set %%splitted_path = %%path.split('.') + %if %%len(%%splitted_path) == 2 + %continue + %else + µµµµµµµµµµ set name to <family>.<varname> (same name if several families) + %set %%name = '.'.join(%%splitted_path[0:2]) + %set %%type_ = %%splitted_path[2] + %end if + %silent %%dico.setdefault(%%name, {'profile': [], 'activate': False, 'ewtapp': []}) + %if %%type_ in ['profile', 'activate', 'ewtapp', 'saltaction'] + %silent %%dico[%%name][%%type_] = %%value + %end if + %if type_ == 'name' + %set %%action_names[%%name] = %%value + %end if +%end for +%if %%dico != {} +µµµµµµµµµµ %%users' dict looks like {user/group: actions}, where actions is a list +µµµµµµµµµµ for example {'adm%': [u'shutdown']} + %set %%users = {} + %set %%custom_actions = {} + %for %%action, %%action_infos in %%dico.items() + %if %%action_infos['activate'] + %set %%action_profiles = %%action_infos['profile'] + %if %%action_profiles == [] + %set %%action_profiles = %%DEFAULT_PROFILE + %end if + %for %%action_profile in %%action_profiles + %set %%roles = %%DEFAULT_ROLE[%%action_profile] + %for %%role in %%roles + %set %%user = %%role['name'] + %if %%role['type'] == 'group' + %set %%user += '%' + %end if + %silent %%users.setdefault(%%user, []).append(%%action) + %if 'saltaction' in %%action_infos + %for %%saltaction in %%action_infos['saltaction'] + %silent %%custom_actions.setdefault(%%user, []).append(%%saltaction) + %end for + %end if + %end for + %end for + %end if + %end for +external_auth: + pam: + %for %%user, %%actions in %%users.items() + %%user: + %for %%action in %%actions + %for %%ewtapp in %%dico[%%action]['ewtapp'] + - %%ewtapp.%%{action_names[%%action]}_.* + %end for + %end for + %if %%user in %%custom_actions + %for %%action in %%custom_actions[%%user] + - %%action + %end for + %end if + %end for +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-saltstack/templates/master b/seed/release/eole-2.7/2.7.1/applicationservice/eole-saltstack/templates/master new file mode 100644 index 0000000000000000000000000000000000000000..d81ac182d28b0454187e86167594400791e8707a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-saltstack/templates/master @@ -0,0 +1,1011 @@ +##### Primary configuration settings ##### +########################################## +# This configuration file is used to manage the behavior of the Salt Master. +# Values that are commented out but have an empty line after the comment are +# defaults that do not need to be set in the config. If there is no blank line +# after the comment then the value is presented as an example and is not the +# default. + +# Per default, the master will automatically include all config files +# from master.d/*.conf (master.d is a directory in the same directory +# as the main master config file). +#default_include: master.d/*.conf + +# The address of the interface to bind to: +#interface: 0.0.0.0 + +# Whether the master should listen for IPv6 connections. If this is set to True, +# the interface option must be adjusted, too. (For example: "interface: '::'") +#ipv6: False + +# The tcp port used by the publisher: +#publish_port: 4505 + +# The user under which the salt master will run. Salt will update all +# permissions to allow the specified user to run the master. The exception is +# the job cache, which must be deleted if this user is changed. If the +# modified files cause conflicts, set verify_env to False. +user: root + +# The port used by the communication interface. The ret (return) port is the +# interface used for the file server, authentication, job returns, etc. +#ret_port: 4506 + +# Specify the location of the daemon process ID file: +#pidfile: /var/run/salt-master.pid + +# The root directory prepended to these options: pki_dir, cachedir, +# sock_dir, log_file, autosign_file, autoreject_file, extension_modules, +# key_logfile, pidfile: +#root_dir: / + +# The path to the master's configuration file. +#conf_file: /etc/salt/master + +# Directory used to store public key data: +#pki_dir: /etc/salt/pki/master + +# Directory to store job and cache data: +# This directory may contain sensitive data and should be protected accordingly. +# +#cachedir: /var/cache/salt/master + +# Directory for custom modules. This directory can contain subdirectories for +# each of Salt's module types such as "runners", "output", "wheel", "modules", +# "states", "returners", etc. +#extension_modules: <no default> + +# Directory for custom modules. This directory can contain subdirectories for +# each of Salt's module types such as "runners", "output", "wheel", "modules", +# "states", "returners", etc. +# Like 'extension_modules' but can take an array of paths +#module_dirs: <no default> +# - /var/cache/salt/minion/extmods + +# Verify and set permissions on configuration directories at startup: +#verify_env: True + +# Set the number of hours to keep old job information in the job cache: +#keep_jobs: 24 + +# The number of seconds to wait when the client is requesting information +# about running jobs. +#gather_job_timeout: 10 + +# Set the default timeout for the salt command and api. The default is 5 +# seconds. +#timeout: 5 + +# The loop_interval option controls the seconds for the master's maintenance +# process check cycle. This process updates file server backends, cleans the +# job cache and executes the scheduler. +#loop_interval: 60 + +# Set the default outputter used by the salt command. The default is "nested". +#output: nested + +# Set the default output file used by the salt command. Default is to output +# to the CLI and not to a file. Functions the same way as the "--out-file" +# CLI option, only sets this to a single file for all salt commands. +#output_file: None + +# Return minions that timeout when running commands like test.ping +#show_timeout: True + +# By default, output is colored. To disable colored output, set the color value +# to False. +#color: True + +# Do not strip off the colored output from nested results and state outputs +# (true by default). +# strip_colors: False + +# To display a summary of the number of minions targeted, the number of +# minions returned, and the number of minions that did not return, set the +# cli_summary value to True. (False by default.) +# +#cli_summary: False + +# Set the directory used to hold unix sockets: +#sock_dir: /var/run/salt/master + +# The master can take a while to start up when lspci and/or dmidecode is used +# to populate the grains for the master. Enable if you want to see GPU hardware +# data for your master. +# enable_gpu_grains: False + +# The master maintains a job cache. While this is a great addition, it can be +# a burden on the master for larger deployments (over 5000 minions). +# Disabling the job cache will make previously executed jobs unavailable to +# the jobs system and is not generally recommended. +#job_cache: True + +# Cache minion grains and pillar data in the cachedir. +#minion_data_cache: True + +# Store all returns in the given returner. +# Setting this option requires that any returner-specific configuration also +# be set. See various returners in salt/returners for details on required +# configuration values. (See also, event_return_queue below.) +# +#event_return: mysql + +# On busy systems, enabling event_returns can cause a considerable load on +# the storage system for returners. Events can be queued on the master and +# stored in a batched fashion using a single transaction for multiple events. +# By default, events are not queued. +#event_return_queue: 0 + +# Only return events matching tags in a whitelist, +# event_return_whitelist: +# - salt/master/a_tag +# - salt/master/another_tag + +# Store all event returns _except_ the tags in a blacklist. +# event_return_blacklist: +# - salt/master/not_this_tag +# - salt/master/or_this_one + +# Passing very large events can cause the minion to consume large amounts of +# memory. This value tunes the maximum size of a message allowed onto the +# master event bus. The value is expressed in bytes. +#max_event_size: 1048576 + +# By default, the master AES key rotates every 24 hours. The next command +# following a key rotation will trigger a key refresh from the minion which may +# result in minions which do not respond to the first command after a key refresh. +# +# To tell the master to ping all minions immediately after an AES key refresh, set +# ping_on_rotate to True. This should mitigate the issue where a minion does not +# appear to initially respond after a key is rotated. +# +# Note that ping_on_rotate may cause high load on the master immediately after +# the key rotation event as minions reconnect. Consider this carefully if this +# salt master is managing a large number of minions. +# +# If disabled, it is recommended to handle this event by listening for the +# 'aes_key_rotate' event with the 'key' tag and acting appropriately. +# ping_on_rotate: False + +# By default, the master deletes its cache of minion data when the key for that +# minion is removed. To preserve the cache after key deletion, set +# 'preserve_minion_cache' to True. +# +# WARNING: This may have security implications if compromised minions auth with +# a previous deleted minion ID. +#preserve_minion_cache: False + +# If max_minions is used in large installations, the master might experience +# high-load situations because of having to check the number of connected +# minions for every authentication. This cache provides the minion-ids of +# all connected minions to all MWorker-processes and greatly improves the +# performance of max_minions. +# con_cache: False + +# The master can include configuration from other files. To enable this, +# pass a list of paths to this option. The paths can be either relative or +# absolute; if relative, they are considered to be relative to the directory +# the main master configuration file lives in (this file). Paths can make use +# of shell-style globbing. If no files are matched by a path passed to this +# option, then the master will log a warning message. +# +# Include a config file from some other path: +# include: /etc/salt/extra_config +# +# Include config from several files and directories: +# include: +# - /etc/salt/extra_config + + +##### Large-scale tuning settings ##### +########################################## +# Max open files +# +# Each minion connecting to the master uses AT LEAST one file descriptor, the +# master subscription connection. If enough minions connect you might start +# seeing on the console (and then salt-master crashes): +# Too many open files (tcp_listener.cpp:335) +# Aborted (core dumped) +# +# By default this value will be the one of `ulimit -Hn`, ie, the hard limit for +# max open files. +# +# If you wish to set a different value than the default one, uncomment and +# configure this setting. Remember that this value CANNOT be higher than the +# hard limit. Raising the hard limit depends on your OS and/or distribution, +# a good way to find the limit is to search the internet. For example: +# raise max open files hard limit debian +# +#max_open_files: 100000 + +# The number of worker threads to start. These threads are used to manage +# return calls made from minions to the master. If the master seems to be +# running slowly, increase the number of threads. This setting can not be +# set lower than 3. +#worker_threads: 5 + +# Set the ZeroMQ high water marks +# http://api.zeromq.org/3-2:zmq-setsockopt + +# The publisher interface ZeroMQPubServerChannel +#pub_hwm: 1000 + +# These two ZMQ HWM settings, salt_event_pub_hwm and event_publisher_pub_hwm +# are significant for masters with thousands of minions. When these are +# insufficiently high it will manifest in random responses missing in the CLI +# and even missing from the job cache. Masters that have fast CPUs and many +# cores with appropriate worker_threads will not need these set as high. + +# On deployment with 8,000 minions, 2.4GHz CPUs, 24 cores, 32GiB memory has +# these settings: +# +# salt_event_pub_hwm: 128000 +# event_publisher_pub_hwm: 64000 + +# ZMQ high-water-mark for SaltEvent pub socket +#salt_event_pub_hwm: 20000 + +# ZMQ high-water-mark for EventPublisher pub socket +#event_publisher_pub_hwm: 10000 + +# The master may allocate memory per-event and not +# reclaim it. +# To set a high-water mark for memory allocation, use +# ipc_write_buffer to set a high-water mark for message +# buffering. +# Value: In bytes. Set to 'dynamic' to have Salt select +# a value for you. Default is disabled. +# ipc_write_buffer: 'dynamic' + + +##### Security settings ##### +########################################## +# Enable "open mode", this mode still maintains encryption, but turns off +# authentication, this is only intended for highly secure environments or for +# the situation where your keys end up in a bad state. If you run in open mode +# you do so at your own risk! +#open_mode: False + +# Enable auto_accept, this setting will automatically accept all incoming +# public keys from the minions. Note that this is insecure. +#auto_accept: False + +# Time in minutes that a incoming public key with a matching name found in +# pki_dir/minion_autosign/keyid is automatically accepted. Expired autosign keys +# are removed when the master checks the minion_autosign directory. +# 0 equals no timeout +# autosign_timeout: 120 + +# If the autosign_file is specified, incoming keys specified in the +# autosign_file will be automatically accepted. This is insecure. Regular +# expressions as well as globing lines are supported. +#autosign_file: /etc/salt/autosign.conf + +# Works like autosign_file, but instead allows you to specify minion IDs for +# which keys will automatically be rejected. Will override both membership in +# the autosign_file and the auto_accept setting. +#autoreject_file: /etc/salt/autoreject.conf + +# Enable permissive access to the salt keys. This allows you to run the +# master or minion as root, but have a non-root group be given access to +# your pki_dir. To make the access explicit, root must belong to the group +# you've given access to. This is potentially quite insecure. If an autosign_file +# is specified, enabling permissive_pki_access will allow group access to that +# specific file. +#permissive_pki_access: False + +# Allow users on the master access to execute specific commands on minions. +# This setting should be treated with care since it opens up execution +# capabilities to non root users. By default this capability is completely +# disabled. +#pulisher_acl: +# larry: +# - test.ping +# - network.* +# +# Blacklist any of the following users or modules +# +# This example would blacklist all non sudo users, including root from +# running any commands. It would also blacklist any use of the "cmd" +# module. This is completely disabled by default. +# +# +# Check the list of configured users in client ACL against users on the +# system and throw errors if they do not exist. +#client_acl_verify: True +# +#publisher_acl_blacklist: +# users: +# - root +# - '^(?!sudo_).*$' # all non sudo users +# modules: +# - cmd +# +# WARNING: client_acl and client_acl_blacklist options are deprecated and will +# be removed in the future releases. Use publisher_acl and +# publisher_acl_blacklist instead. + +# Enforce publisher_acl & publisher_acl_blacklist when users have sudo +# access to the salt command. +# +#sudo_acl: False + +# The external auth system uses the Salt auth modules to authenticate and +# validate users to access areas of the Salt system. +#external_auth: +# pam: +# fred: +# - test.* +# +# Time (in seconds) for a newly generated token to live. Default: 12 hours +#token_expire: 43200 + +# Allow minions to push files to the master. This is disabled by default, for +# security purposes. +#file_recv: False + +# Set a hard-limit on the size of the files that can be pushed to the master. +# It will be interpreted as megabytes. Default: 100 +#file_recv_max_size: 100 + +# Signature verification on messages published from the master. +# This causes the master to cryptographically sign all messages published to its event +# bus, and minions then verify that signature before acting on the message. +# +# This is False by default. +# +# Note that to facilitate interoperability with masters and minions that are different +# versions, if sign_pub_messages is True but a message is received by a minion with +# no signature, it will still be accepted, and a warning message will be logged. +# Conversely, if sign_pub_messages is False, but a minion receives a signed +# message it will be accepted, the signature will not be checked, and a warning message +# will be logged. This behavior went away in Salt 2014.1.0 and these two situations +# will cause minion to throw an exception and drop the message. +# sign_pub_messages: False + +##### Salt-SSH Configuration ##### +########################################## + +# Pass in an alternative location for the salt-ssh roster file +#roster_file: /etc/salt/roster + +# Pass in minion option overrides that will be inserted into the SHIM for +# salt-ssh calls. The local minion config is not used for salt-ssh. Can be +# overridden on a per-minion basis in the roster (`minion_opts`) +#ssh_minion_opts: +# gpg_keydir: /root/gpg + +##### Master Module Management ##### +########################################## +# Manage how master side modules are loaded. + +# Add any additional locations to look for master runners: +#runner_dirs: [] + +# Enable Cython for master side modules: +#cython_enable: False + + +##### State System settings ##### +########################################## +# The state system uses a "top" file to tell the minions what environment to +# use and what modules to use. The state_top file is defined relative to the +# root of the base environment as defined in "File Server settings" below. +#state_top: top.sls + +# The master_tops option replaces the external_nodes option by creating +# a plugable system for the generation of external top data. The external_nodes +# option is deprecated by the master_tops option. +# +# To gain the capabilities of the classic external_nodes system, use the +# following configuration: +# master_tops: +# ext_nodes: <Shell command which returns yaml> +# +#master_tops: {} + +# The external_nodes option allows Salt to gather data that would normally be +# placed in a top file. The external_nodes option is the executable that will +# return the ENC data. Remember that Salt will look for external nodes AND top +# files and combine the results if both are enabled! +#external_nodes: None + +# The renderer to use on the minions to render the state data +#renderer: yaml_jinja + +# The Jinja renderer can strip extra carriage returns and whitespace +# See http://jinja.pocoo.org/docs/api/#high-level-api +# +# If this is set to True the first newline after a Jinja block is removed +# (block, not variable tag!). Defaults to False, corresponds to the Jinja +# environment init variable "trim_blocks". +#jinja_trim_blocks: False +# +# If this is set to True leading spaces and tabs are stripped from the start +# of a line to a block. Defaults to False, corresponds to the Jinja +# environment init variable "lstrip_blocks". +#jinja_lstrip_blocks: False + +# The failhard option tells the minions to stop immediately after the first +# failure detected in the state execution, defaults to False +#failhard: False + +# The state_verbose and state_output settings can be used to change the way +# state system data is printed to the display. By default all data is printed. +# The state_verbose setting can be set to True or False, when set to False +# all data that has a result of True and no changes will be suppressed. +#state_verbose: True + +# The state_output setting changes if the output is the full multi line +# output for each changed state if set to 'full', but if set to 'terse' +# the output will be shortened to a single line. If set to 'mixed', the output +# will be terse unless a state failed, in which case that output will be full. +# If set to 'changes', the output will be full unless the state didn't change. +#state_output: full + +# Automatically aggregate all states that have support for mod_aggregate by +# setting to 'True'. Or pass a list of state module names to automatically +# aggregate just those types. +# +# state_aggregate: +# - pkg +# +#state_aggregate: False + +# Send progress events as each function in a state run completes execution +# by setting to 'True'. Progress events are in the format +# 'salt/job/<JID>/prog/<MID>/<RUN NUM>'. +#state_events: False + +##### File Server settings ##### +########################################## +# Salt runs a lightweight file server written in zeromq to deliver files to +# minions. This file server is built into the master daemon and does not +# require a dedicated port. + +# The file server works on environments passed to the master, each environment +# can have multiple root directories, the subdirectories in the multiple file +# roots cannot match, otherwise the downloaded files will not be able to be +# reliably ensured. A base environment is required to house the top file. +# Example: +# file_roots: +# base: +# - /srv/salt/ +# dev: +# - /srv/salt/dev/services +# - /srv/salt/dev/states +# prod: +# - /srv/salt/prod/services +# - /srv/salt/prod/states +# +#file_roots: +# base: +# - /srv/salt +# +file_roots: + base: + - /srv/salt/ +%set %%ewtapps = %%list() +%for %%path, %%value in %%creole_client.get('/actions').items() + %if %%path.endswith('.ewtapp'): + %for %%val in %%value + %if %%val not in %%ewtapps + %silent %%ewtapps.append(%%str(%%val)) + %%val: + - /srv/salt/%%val + %end if + %end for + %end if +%end for + +# When using multiple environments, each with their own top file, the +# default behaviour is an unordered merge. To prevent top files from +# being merged together and instead to only use the top file from the +# requested environment, set this value to 'same'. +top_file_merging_strategy: merge + +# To specify the order in which environments are merged, set the ordering +# in the env_order option. Given a conflict, the last matching value will +# win. +%set %%ewtapps = ['base'] + %%ewtapps +env_order: %%ewtapps + +# If top_file_merging_strategy is set to 'same' and an environment does not +# contain a top file, the top file in the environment specified by default_top +# will be used instead. +default_top: base + +# The hash_type is the hash to use when discovering the hash of a file on +# the master server. The default is md5 but sha1, sha224, sha256, sha384 +# and sha512 are also supported. +# +# WARNING: While md5 is supported, do not use it due to the high chance +# of possible collisions and thus security breach. +# +# Prior to changing this value, the master should be stopped and all Salt +# caches should be cleared. +hash_type: sha256 + +# The buffer size in the file server can be adjusted here: +#file_buffer_size: 1048576 + +# A regular expression (or a list of expressions) that will be matched +# against the file path before syncing the modules and states to the minions. +# This includes files affected by the file.recurse state. +# For example, if you manage your custom modules and states in subversion +# and don't want all the '.svn' folders and content synced to your minions, +# you could set this to '/\.svn($|/)'. By default nothing is ignored. +#file_ignore_regex: +# - '/\.svn($|/)' +# - '/\.git($|/)' + +# A file glob (or list of file globs) that will be matched against the file +# path before syncing the modules and states to the minions. This is similar +# to file_ignore_regex above, but works on globs instead of regex. By default +# nothing is ignored. +# file_ignore_glob: +# - '*.pyc' +# - '*/somefolder/*.bak' +# - '*.swp' + +# File Server Backend +# +# Salt supports a modular fileserver backend system, this system allows +# the salt master to link directly to third party systems to gather and +# manage the files available to minions. Multiple backends can be +# configured and will be searched for the requested file in the order in which +# they are defined here. The default setting only enables the standard backend +# "roots" which uses the "file_roots" option. +#fileserver_backend: +# - roots +# +# To use multiple backends list them in the order they are searched: +#fileserver_backend: +# - git +# - roots +# +# Uncomment the line below if you do not want the file_server to follow +# symlinks when walking the filesystem tree. This is set to True +# by default. Currently this only applies to the default roots +# fileserver_backend. +#fileserver_followsymlinks: False +# +# Uncomment the line below if you do not want symlinks to be +# treated as the files they are pointing to. By default this is set to +# False. By uncommenting the line below, any detected symlink while listing +# files on the Master will not be returned to the Minion. +#fileserver_ignoresymlinks: True +# +# By default, the Salt fileserver recurses fully into all defined environments +# to attempt to find files. To limit this behavior so that the fileserver only +# traverses directories with SLS files and special Salt directories like _modules, +# enable the option below. This might be useful for installations where a file root +# has a very large number of files and performance is impacted. Default is False. +# fileserver_limit_traversal: False +# +# The fileserver can fire events off every time the fileserver is updated, +# these are disabled by default, but can be easily turned on by setting this +# flag to True +#fileserver_events: False + +# Git File Server Backend Configuration +# +# Optional parameter used to specify the provider to be used for gitfs. Must +# be one of the following: pygit2, gitpython, or dulwich. If unset, then each +# will be tried in that same order, and the first one with a compatible +# version installed will be the provider that is used. +#gitfs_provider: pygit2 + +# Along with gitfs_password, is used to authenticate to HTTPS remotes. +# gitfs_user: '' + +# Along with gitfs_user, is used to authenticate to HTTPS remotes. +# This parameter is not required if the repository does not use authentication. +#gitfs_password: '' + +# By default, Salt will not authenticate to an HTTP (non-HTTPS) remote. +# This parameter enables authentication over HTTP. Enable this at your own risk. +#gitfs_insecure_auth: False + +# Along with gitfs_privkey (and optionally gitfs_passphrase), is used to +# authenticate to SSH remotes. This parameter (or its per-remote counterpart) +# is required for SSH remotes. +#gitfs_pubkey: '' + +# Along with gitfs_pubkey (and optionally gitfs_passphrase), is used to +# authenticate to SSH remotes. This parameter (or its per-remote counterpart) +# is required for SSH remotes. +#gitfs_privkey: '' + +# This parameter is optional, required only when the SSH key being used to +# authenticate is protected by a passphrase. +#gitfs_passphrase: '' + +# When using the git fileserver backend at least one git remote needs to be +# defined. The user running the salt master will need read access to the repo. +# +# The repos will be searched in order to find the file requested by a client +# and the first repo to have the file will return it. +# When using the git backend branches and tags are translated into salt +# environments. +# Note: file:// repos will be treated as a remote, so refs you want used must +# exist in that repo as *local* refs. +#gitfs_remotes: +# - git://github.com/saltstack/salt-states.git +# - file:///var/git/saltmaster +# +# The gitfs_ssl_verify option specifies whether to ignore ssl certificate +# errors when contacting the gitfs backend. You might want to set this to +# false if you're using a git backend that uses a self-signed certificate but +# keep in mind that setting this flag to anything other than the default of True +# is a security concern, you may want to try using the ssh transport. +#gitfs_ssl_verify: True +# +# The gitfs_root option gives the ability to serve files from a subdirectory +# within the repository. The path is defined relative to the root of the +# repository and defaults to the repository root. +#gitfs_root: somefolder/otherfolder +# +# +##### Pillar settings ##### +########################################## +# Salt Pillars allow for the building of global data that can be made selectively +# available to different minions based on minion grain filtering. The Salt +# Pillar is laid out in the same fashion as the file server, with environments, +# a top file and sls files. However, pillar data does not need to be in the +# highstate format, and is generally just key/value pairs. +#pillar_roots: +# base: +# - /srv/pillar +# +ext_pillar: + - cmd_json: /usr/share/eole/sbin/dumpconfig.py + +# The ext_pillar_first option allows for external pillar sources to populate +# before file system pillar. This allows for targeting file system pillar from +# ext_pillar. +#ext_pillar_first: False + +# The pillar_gitfs_ssl_verify option specifies whether to ignore ssl certificate +# errors when contacting the pillar gitfs backend. You might want to set this to +# false if you're using a git backend that uses a self-signed certificate but +# keep in mind that setting this flag to anything other than the default of True +# is a security concern, you may want to try using the ssh transport. +#pillar_gitfs_ssl_verify: True + +# The pillar_opts option adds the master configuration file data to a dict in +# the pillar called "master". This is used to set simple configurations in the +# master config file that can then be used on minions. +#pillar_opts: False + +# The pillar_safe_render_error option prevents the master from passing pillar +# render errors to the minion. This is set on by default because the error could +# contain templating data which would give that minion information it shouldn't +# have, like a password! When set true the error message will only show: +# Rendering SLS 'my.sls' failed. Please see master log for details. +#pillar_safe_render_error: True + +# The pillar_source_merging_strategy option allows you to configure merging strategy +# between different sources. It accepts four values: recurse, aggregate, overwrite, +# or smart. Recurse will merge recursively mapping of data. Aggregate instructs +# aggregation of elements between sources that use the #!yamlex renderer. Overwrite +# will verwrite elements according the order in which they are processed. This is +# behavior of the 2014.1 branch and earlier. Smart guesses the best strategy based +# on the "renderer" setting and is the default value. +#pillar_source_merging_strategy: smart + +# Recursively merge lists by aggregating them instead of replacing them. +#pillar_merge_lists: False + +# Git External Pillar (git_pillar) Configuration Options +# +# Specify the provider to be used for git_pillar. Must be either pygit2 or +# gitpython. If unset, then both will be tried in that same order, and the +# first one with a compatible version installed will be the provider that +# is used. +#git_pillar_provider: pygit2 + +# If the desired branch matches this value, and the environment is omitted +# from the git_pillar configuration, then the environment for that git_pillar +# remote will be base. +#git_pillar_base: master + +# If the branch is omitted from a git_pillar remote, then this branch will +# be used instead +#git_pillar_branch: master + +# Environment to use for git_pillar remotes. This is normally derived from +# the branch/tag (or from a per-remote env parameter), but if set this will +# override the process of deriving the env from the branch/tag name. +#git_pillar_env: '' + +# Path relative to the root of the repository where the git_pillar top file +# and SLS files are located. +#git_pillar_root: '' + +# Specifies whether or not to ignore SSL certificate errors when contacting +# the remote repository. +#git_pillar_ssl_verify: False + +# When set to False, if there is an update/checkout lock for a git_pillar +# remote and the pid written to it is not running on the master, the lock +# file will be automatically cleared and a new lock will be obtained. +#git_pillar_global_lock: True + +# Git External Pillar Authentication Options +# +# Along with git_pillar_password, is used to authenticate to HTTPS remotes. +#git_pillar_user: '' + +# Along with git_pillar_user, is used to authenticate to HTTPS remotes. +# This parameter is not required if the repository does not use authentication. +#git_pillar_password: '' + +# By default, Salt will not authenticate to an HTTP (non-HTTPS) remote. +# This parameter enables authentication over HTTP. +#git_pillar_insecure_auth: False + +# Along with git_pillar_privkey (and optionally git_pillar_passphrase), +# is used to authenticate to SSH remotes. +#git_pillar_pubkey: '' + +# Along with git_pillar_pubkey (and optionally git_pillar_passphrase), +# is used to authenticate to SSH remotes. +#git_pillar_privkey: '' + +# This parameter is optional, required only when the SSH key being used +# to authenticate is protected by a passphrase. +#git_pillar_passphrase: '' + +# A master can cache pillars locally to bypass the expense of having to render them +# for each minion on every request. This feature should only be enabled in cases +# where pillar rendering time is known to be unsatisfactory and any attendant security +# concerns about storing pillars in a master cache have been addressed. +# +# When enabling this feature, be certain to read through the additional ``pillar_cache_*`` +# configuration options to fully understand the tunable parameters and their implications. +# +# Note: setting ``pillar_cache: True`` has no effect on targeting Minions with Pillars. +# See https://docs.saltstack.com/en/latest/topics/targeting/pillar.html +#pillar_cache: False + +# If and only if a master has set ``pillar_cache: True``, the cache TTL controls the amount +# of time, in seconds, before the cache is considered invalid by a master and a fresh +# pillar is recompiled and stored. +#pillar_cache_ttl: 3600 + +# If an only if a master has set ``pillar_cache: True``, one of several storage providers +# can be utilized: +# +# disk: The default storage backend. This caches rendered pillars to the master cache. +# Rendered pillars are serialized and deserialized as ``msgpack`` structures for +# speed. Note that pillars are stored UNENCRYPTED. Ensure that the master cache +# has permissions set appropriately (sane defaults are provided). +# +# memory: [EXPERIMENTAL] An optional backend for pillar caches which uses a pure-Python +# in-memory data structure for maximal performance. There are several caveats, +# however. First, because each master worker contains its own in-memory cache, +# there is no guarantee of cache consistency between minion requests. This +# works best in situations where the pillar rarely if ever changes. Secondly, +# and perhaps more importantly, this means that unencrypted pillars will +# be accessible to any process which can examine the memory of the ``salt-master``! +# This may represent a substantial security risk. +# +#pillar_cache_backend: disk + + +##### Syndic settings ##### +########################################## +# The Salt syndic is used to pass commands through a master from a higher +# master. Using the syndic is simple. If this is a master that will have +# syndic servers(s) below it, then set the "order_masters" setting to True. +# +# If this is a master that will be running a syndic daemon for passthrough, then +# the "syndic_master" setting needs to be set to the location of the master server +# to receive commands from. + +# Set the order_masters setting to True if this master will command lower +# masters' syndic interfaces. +#order_masters: False + +# If this master will be running a salt syndic daemon, syndic_master tells +# this master where to receive commands from. +#syndic_master: masterofmaster + +# This is the 'ret_port' of the MasterOfMaster: +#syndic_master_port: 4506 + +# PID file of the syndic daemon: +#syndic_pidfile: /var/run/salt-syndic.pid + +# LOG file of the syndic daemon: +#syndic_log_file: syndic.log + +# The behaviour of the multi-syndic when connection to a master of masters failed. +# Can specify ``random`` (default) or ``ordered``. If set to ``random``, masters +# will be iterated in random order. If ``ordered`` is specified, the configured +# order will be used. +#syndic_failover: random + + +##### Peer Publish settings ##### +########################################## +# Salt minions can send commands to other minions, but only if the minion is +# allowed to. By default "Peer Publication" is disabled, and when enabled it +# is enabled for specific minions and specific commands. This allows secure +# compartmentalization of commands based on individual minions. + +# The configuration uses regular expressions to match minions and then a list +# of regular expressions to match functions. The following will allow the +# minion authenticated as foo.example.com to execute functions from the test +# and pkg modules. +#peer: +# foo.example.com: +# - test.* +# - pkg.* +# +# This will allow all minions to execute all commands: +#peer: +# .*: +# - .* +# +# This is not recommended, since it would allow anyone who gets root on any +# single minion to instantly have root on all of the minions! + +# Minions can also be allowed to execute runners from the salt master. +# Since executing a runner from the minion could be considered a security risk, +# it needs to be enabled. This setting functions just like the peer setting +# except that it opens up runners instead of module functions. +# +# All peer runner support is turned off by default and must be enabled before +# using. This will enable all peer runners for all minions: +#peer_run: +# .*: +# - .* +# +# To enable just the manage.up runner for the minion foo.example.com: +#peer_run: +# foo.example.com: +# - manage.up +# +# +##### Mine settings ##### +##################################### +# Restrict mine.get access from minions. By default any minion has a full access +# to get all mine data from master cache. In acl definion below, only pcre matches +# are allowed. +# mine_get: +# .*: +# - .* +# +# The example below enables minion foo.example.com to get 'network.interfaces' mine +# data only, minions web* to get all network.* and disk.* mine data and all other +# minions won't get any mine data. +# mine_get: +# foo.example.com: +# - network.interfaces +# web.*: +# - network.* +# - disk.* + + +##### Logging settings ##### +########################################## +# The location of the master log file +# The master log can be sent to a regular file, local path name, or network +# location. Remote logging works best when configured to use rsyslogd(8) (e.g.: +# ``file:///dev/log``), with rsyslogd(8) configured for network logging. The URI +# format is: <file|udp|tcp>://<host|socketpath>:<port-if-required>/<log-facility> +#log_file: /var/log/salt/master +#log_file: file:///dev/log +#log_file: udp://loghost:10514 + +#log_file: /var/log/salt/master +#key_logfile: /var/log/salt/key + +# The level of messages to send to the console. +# One of 'garbage', 'trace', 'debug', info', 'warning', 'error', 'critical'. +# +# The following log levels are considered INSECURE and may log sensitive data: +# ['garbage', 'trace', 'debug'] +# +#log_level: warning + +# The level of messages to send to the log file. +# One of 'garbage', 'trace', 'debug', info', 'warning', 'error', 'critical'. +# If using 'log_granular_levels' this must be set to the highest desired level. +#log_level_logfile: warning + +# The date and time format used in log messages. Allowed date/time formatting +# can be seen here: http://docs.python.org/library/time.html#time.strftime +#log_datefmt: '%H:%M:%S' +#log_datefmt_logfile: '%Y-%m-%d %H:%M:%S' + +# The format of the console logging messages. Allowed formatting options can +# be seen here: http://docs.python.org/library/logging.html#logrecord-attributes +# +# Console log colors are specified by these additional formatters: +# +# %(colorlevel)s +# %(colorname)s +# %(colorprocess)s +# %(colormsg)s +# +# Since it is desirable to include the surrounding brackets, '[' and ']', in +# the coloring of the messages, these color formatters also include padding as +# well. Color LogRecord attributes are only available for console logging. +# +#log_fmt_console: '%(colorlevel)s %(colormsg)s' +#log_fmt_console: '[%(levelname)-8s] %(message)s' +# +#log_fmt_logfile: '%(asctime)s,%(msecs)03.0f [%(name)-17s][%(levelname)-8s] %(message)s' + +# This can be used to control logging levels more specificically. This +# example sets the main salt library at the 'warning' level, but sets +# 'salt.modules' to log at the 'debug' level: +# log_granular_levels: +# 'salt': 'warning' +# 'salt.modules': 'debug' +# +#log_granular_levels: {} + + +##### Node Groups ###### +########################################## +# Node groups allow for logical groupings of minion nodes. A group consists of +# a group name and a compound target. Nodgroups can reference other nodegroups +# with 'N@' classifier. Ensure that you do not have circular references. +# +#nodegroups: +# group1: 'L@foo.domain.com,bar.domain.com,baz.domain.com or bl*.domain.com' +# group2: 'G@os:Debian and foo.domain.com' +# group3: 'G@os:Debian and N@group1' +# group4: +# - 'G@foo:bar' +# - 'or' +# - 'G@foo:baz' + + +##### Range Cluster settings ##### +########################################## +# The range server (and optional port) that serves your cluster information +# https://github.com/ytoolshed/range/wiki/%22yamlfile%22-module-file-spec +# +#range_server: range:80 + + +##### Windows Software Repo settings ##### +########################################### +# Location of the repo on the master: +#winrepo_dir_ng: '/srv/salt/win/repo-ng' +# +# List of git repositories to include with the local repo: +#winrepo_remotes_ng: +# - 'https://github.com/saltstack/salt-winrepo-ng.git' + + +##### Windows Software Repo settings - Pre 2015.8 ##### +######################################################## +# Legacy repo settings for pre-2015.8 Windows minions. +# +# Location of the repo on the master: +#winrepo_dir: '/srv/salt/win/repo' +# +# Location of the master's repo cache file: +#winrepo_mastercachefile: '/srv/salt/win/repo/winrepo.p' +# +# List of git repositories to include with the local repo: +#winrepo_remotes: +# - 'https://github.com/saltstack/salt-winrepo.git' + + +##### Returner settings ###### +############################################ +# Which returner(s) will be used for minion's result: +#return: mysql + + +###### Miscellaneous settings ###### +############################################ +# Default match type for filtering events tags: startswith, endswith, find, regex, fnmatch +#event_match_type: startswith diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-saltstack/templates/minion b/seed/release/eole-2.7/2.7.1/applicationservice/eole-saltstack/templates/minion new file mode 100644 index 0000000000000000000000000000000000000000..eb9b8b3886945213dfdc607a1bcb49e5c855ab4f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-saltstack/templates/minion @@ -0,0 +1,772 @@ +##### Primary configuration settings ##### +########################################## +# This configuration file is used to manage the behavior of the Salt Minion. +# With the exception of the location of the Salt Master Server, values that are +# commented out but have an empty line after the comment are defaults that need +# not be set in the config. If there is no blank line after the comment, the +# value is presented as an example and is not the default. + +# Per default the minion will automatically include all config files +# from minion.d/*.conf (minion.d is a directory in the same directory +# as the main minion config file). +#default_include: minion.d/*.conf + +# Set the location of the salt master server. If the master server cannot be +# resolved, then the minion will fail to start. +master: 127.0.0.1 + +# Set http proxy information for the minion when doing requests +#proxy_host: +#proxy_port: +#proxy_username: +#proxy_password: + +# If multiple masters are specified in the 'master' setting, the default behavior +# is to always try to connect to them in the order they are listed. If random_master is +# set to True, the order will be randomized instead. This can be helpful in distributing +# the load of many minions executing salt-call requests, for example, from a cron job. +# If only one master is listed, this setting is ignored and a warning will be logged. +# NOTE: If master_type is set to failover, use master_shuffle instead. +#random_master: False + +# Use if master_type is set to failover. +#master_shuffle: False + +# Minions can connect to multiple masters simultaneously (all masters +# are "hot"), or can be configured to failover if a master becomes +# unavailable. Multiple hot masters are configured by setting this +# value to "str". Failover masters can be requested by setting +# to "failover". MAKE SURE TO SET master_alive_interval if you are +# using failover. +# master_type: str + +# Poll interval in seconds for checking if the master is still there. Only +# respected if master_type above is "failover". To disable the interval entirely, +# set the value to -1. (This may be necessary on machines which have high numbers +# of TCP connections, such as load balancers.) +# master_alive_interval: 30 + +# If the minion is in multi-master mode and the master_type configuration option +# is set to "failover", this setting can be set to "True" to force the minion +# to fail back to the first master in the list if the first master is back online. +#master_failback: False + +# If the minion is in multi-master mode, the "master_type" configuration is set to +# "failover", and the "master_failback" option is enabled, the master failback +# interval can be set to ping the top master with this interval, in seconds. +#master_failback_interval: 0 + +# Set whether the minion should connect to the master via IPv6: +#ipv6: False + +# Set the number of seconds to wait before attempting to resolve +# the master hostname if name resolution fails. Defaults to 30 seconds. +# Set to zero if the minion should shutdown and not retry. +# retry_dns: 30 + +# Set the port used by the master reply and authentication server. +#master_port: 4506 + +# The user to run salt. +#user: root + +# The user to run salt remote execution commands as via sudo. If this option is +# enabled then sudo will be used to change the active user executing the remote +# command. If enabled the user will need to be allowed access via the sudoers +# file for the user that the salt minion is configured to run as. The most +# common option would be to use the root user. If this option is set the user +# option should also be set to a non-root user. If migrating from a root minion +# to a non root minion the minion cache should be cleared and the minion pki +# directory will need to be changed to the ownership of the new user. +#sudo_user: root + +# Specify the location of the daemon process ID file. +#pidfile: /var/run/salt-minion.pid + +# The root directory prepended to these options: pki_dir, cachedir, log_file, +# sock_dir, pidfile. +#root_dir: / + +# The path to the minion's configuration file. +#conf_file: /etc/salt/minion + +# The directory to store the pki information in +#pki_dir: /etc/salt/pki/minion + +# Explicitly declare the id for this minion to use, if left commented the id +# will be the hostname as returned by the python call: socket.getfqdn() +# Since salt uses detached ids it is possible to run multiple minions on the +# same machine but with different ids, this can be useful for salt compute +# clusters. +id: '%%minion_domain_name' + +# Cache the minion id to a file when the minion's id is not statically defined +# in the minion config. Defaults to "True". This setting prevents potential +# problems when automatic minion id resolution changes, which can cause the +# minion to lose connection with the master. To turn off minion id caching, +# set this config to ``False``. +#minion_id_caching: True + +# Append a domain to a hostname in the event that it does not exist. This is +# useful for systems where socket.getfqdn() does not actually result in a +# FQDN (for instance, Solaris). +#append_domain: + +# Custom static grains for this minion can be specified here and used in SLS +# files just like all other grains. This example sets 4 custom grains, with +# the 'roles' grain having two values that can be matched against. +#grains: +# roles: +# - webserver +# - memcache +# deployment: datacenter4 +# cabinet: 13 +# cab_u: 14-15 +# +# Where cache data goes. +# This data may contain sensitive data and should be protected accordingly. +#cachedir: /var/cache/salt/minion + +# Append minion_id to these directories. Helps with +# multiple proxies and minions running on the same machine. +# Allowed elements in the list: pki_dir, cachedir, extension_modules +# Normally not needed unless running several proxies and/or minions on the same machine +# Defaults to ['cachedir'] for proxies, [] (empty list) for regular minions +#append_minionid_config_dirs: + +# Verify and set permissions on configuration directories at startup. +#verify_env: True + +# The minion can locally cache the return data from jobs sent to it, this +# can be a good way to keep track of jobs the minion has executed +# (on the minion side). By default this feature is disabled, to enable, set +# cache_jobs to True. +#cache_jobs: False + +# Set the directory used to hold unix sockets. +#sock_dir: /var/run/salt/minion + +# Set the default outputter used by the salt-call command. The default is +# "nested". +#output: nested +# +# By default output is colored. To disable colored output, set the color value +# to False. +#color: True + +# Do not strip off the colored output from nested results and state outputs +# (true by default). +# strip_colors: False + +# Backup files that are replaced by file.managed and file.recurse under +# 'cachedir'/file_backups relative to their original location and appended +# with a timestamp. The only valid setting is "minion". Disabled by default. +# +# Alternatively this can be specified for each file in state files: +# /etc/ssh/sshd_config: +# file.managed: +# - source: salt://ssh/sshd_config +# - backup: minion +# +#backup_mode: minion + +# When waiting for a master to accept the minion's public key, salt will +# continuously attempt to reconnect until successful. This is the time, in +# seconds, between those reconnection attempts. +#acceptance_wait_time: 10 + +# If this is nonzero, the time between reconnection attempts will increase by +# acceptance_wait_time seconds per iteration, up to this maximum. If this is +# set to zero, the time between reconnection attempts will stay constant. +#acceptance_wait_time_max: 0 + +# If the master rejects the minion's public key, retry instead of exiting. +# Rejected keys will be handled the same as waiting on acceptance. +#rejected_retry: False + +# When the master key changes, the minion will try to re-auth itself to receive +# the new master key. In larger environments this can cause a SYN flood on the +# master because all minions try to re-auth immediately. To prevent this and +# have a minion wait for a random amount of time, use this optional parameter. +# The wait-time will be a random number of seconds between 0 and the defined value. +#random_reauth_delay: 60 + +# When waiting for a master to accept the minion's public key, salt will +# continuously attempt to reconnect until successful. This is the timeout value, +# in seconds, for each individual attempt. After this timeout expires, the minion +# will wait for acceptance_wait_time seconds before trying again. Unless your master +# is under unusually heavy load, this should be left at the default. +#auth_timeout: 60 + +# Number of consecutive SaltReqTimeoutError that are acceptable when trying to +# authenticate. +#auth_tries: 7 + +# The number of attempts to connect to a master before giving up. +# Set this to -1 for unlimited attempts. This allows for a master to have +# downtime and the minion to reconnect to it later when it comes back up. +# In 'failover' mode, it is the number of attempts for each set of masters. +# In this mode, it will cycle through the list of masters for each attempt. +# +# This is different than auth_tries because auth_tries attempts to +# retry auth attempts with a single master. auth_tries is under the +# assumption that you can connect to the master but not gain +# authorization from it. master_tries will still cycle through all +# the masters in a given try, so it is appropriate if you expect +# occasional downtime from the master(s). +#master_tries: 1 + +# If authentication fails due to SaltReqTimeoutError during a ping_interval, +# cause sub minion process to restart. +#auth_safemode: False + +# Ping Master to ensure connection is alive (minutes). +#ping_interval: 0 + +# To auto recover minions if master changes IP address (DDNS) +# auth_tries: 10 +# auth_safemode: False +# ping_interval: 90 +# +# Minions won't know master is missing until a ping fails. After the ping fail, +# the minion will attempt authentication and likely fails out and cause a restart. +# When the minion restarts it will resolve the masters IP and attempt to reconnect. + +# If you don't have any problems with syn-floods, don't bother with the +# three recon_* settings described below, just leave the defaults! +# +# The ZeroMQ pull-socket that binds to the masters publishing interface tries +# to reconnect immediately, if the socket is disconnected (for example if +# the master processes are restarted). In large setups this will have all +# minions reconnect immediately which might flood the master (the ZeroMQ-default +# is usually a 100ms delay). To prevent this, these three recon_* settings +# can be used. +# recon_default: the interval in milliseconds that the socket should wait before +# trying to reconnect to the master (1000ms = 1 second) +# +# recon_max: the maximum time a socket should wait. each interval the time to wait +# is calculated by doubling the previous time. if recon_max is reached, +# it starts again at recon_default. Short example: +# +# reconnect 1: the socket will wait 'recon_default' milliseconds +# reconnect 2: 'recon_default' * 2 +# reconnect 3: ('recon_default' * 2) * 2 +# reconnect 4: value from previous interval * 2 +# reconnect 5: value from previous interval * 2 +# reconnect x: if value >= recon_max, it starts again with recon_default +# +# recon_randomize: generate a random wait time on minion start. The wait time will +# be a random value between recon_default and recon_default + +# recon_max. Having all minions reconnect with the same recon_default +# and recon_max value kind of defeats the purpose of being able to +# change these settings. If all minions have the same values and your +# setup is quite large (several thousand minions), they will still +# flood the master. The desired behavior is to have timeframe within +# all minions try to reconnect. +# +# Example on how to use these settings. The goal: have all minions reconnect within a +# 60 second timeframe on a disconnect. +# recon_default: 1000 +# recon_max: 59000 +# recon_randomize: True +# +# Each minion will have a randomized reconnect value between 'recon_default' +# and 'recon_default + recon_max', which in this example means between 1000ms +# 60000ms (or between 1 and 60 seconds). The generated random-value will be +# doubled after each attempt to reconnect. Lets say the generated random +# value is 11 seconds (or 11000ms). +# reconnect 1: wait 11 seconds +# reconnect 2: wait 22 seconds +# reconnect 3: wait 33 seconds +# reconnect 4: wait 44 seconds +# reconnect 5: wait 55 seconds +# reconnect 6: wait time is bigger than 60 seconds (recon_default + recon_max) +# reconnect 7: wait 11 seconds +# reconnect 8: wait 22 seconds +# reconnect 9: wait 33 seconds +# reconnect x: etc. +# +# In a setup with ~6000 thousand hosts these settings would average the reconnects +# to about 100 per second and all hosts would be reconnected within 60 seconds. +# recon_default: 100 +# recon_max: 5000 +# recon_randomize: False +# +# +# The loop_interval sets how long in seconds the minion will wait between +# evaluating the scheduler and running cleanup tasks. This defaults to a +# sane 60 seconds, but if the minion scheduler needs to be evaluated more +# often lower this value +#loop_interval: 60 + +# The grains can be merged, instead of overridden, using this option. +# This allows custom grains to defined different subvalues of a dictionary +# grain. By default this feature is disabled, to enable set grains_deep_merge +# to ``True``. +#grains_deep_merge: False + +# The grains_refresh_every setting allows for a minion to periodically check +# its grains to see if they have changed and, if so, to inform the master +# of the new grains. This operation is moderately expensive, therefore +# care should be taken not to set this value too low. +# +# Note: This value is expressed in __minutes__! +# +# A value of 10 minutes is a reasonable default. +# +# If the value is set to zero, this check is disabled. +#grains_refresh_every: 1 + +# Cache grains on the minion. Default is False. +#grains_cache: False + +# Cache rendered pillar data on the minion. Default is False. +# This may cause 'cachedir'/pillar to contain sensitive data that should be +# protected accordingly. +#minion_pillar_cache: False + +# Grains cache expiration, in seconds. If the cache file is older than this +# number of seconds then the grains cache will be dumped and fully re-populated +# with fresh data. Defaults to 5 minutes. Will have no effect if 'grains_cache' +# is not enabled. +# grains_cache_expiration: 300 + +# Determines whether or not the salt minion should run scheduled mine updates. +# Defaults to "True". Set to "False" to disable the scheduled mine updates +# (this essentially just does not add the mine update function to the minion's +# scheduler). +#mine_enabled: True + +# Determines whether or not scheduled mine updates should be accompanied by a job +# return for the job cache. Defaults to "False". Set to "True" to include job +# returns in the job cache for mine updates. +#mine_return_job: False + +# Example functions that can be run via the mine facility +# NO mine functions are established by default. +# Note these can be defined in the minion's pillar as well. +#mine_functions: +# test.ping: [] +# network.ip_addrs: +# interface: eth0 +# cidr: '10.0.0.0/8' + +# Windows platforms lack posix IPC and must rely on slower TCP based inter- +# process communications. Set ipc_mode to 'tcp' on such systems +#ipc_mode: ipc + +# Overwrite the default tcp ports used by the minion when in tcp mode +#tcp_pub_port: 4510 +#tcp_pull_port: 4511 + +# Passing very large events can cause the minion to consume large amounts of +# memory. This value tunes the maximum size of a message allowed onto the +# minion event bus. The value is expressed in bytes. +#max_event_size: 1048576 + +# To detect failed master(s) and fire events on connect/disconnect, set +# master_alive_interval to the number of seconds to poll the masters for +# connection events. +# +#master_alive_interval: 30 + +# The minion can include configuration from other files. To enable this, +# pass a list of paths to this option. The paths can be either relative or +# absolute; if relative, they are considered to be relative to the directory +# the main minion configuration file lives in (this file). Paths can make use +# of shell-style globbing. If no files are matched by a path passed to this +# option then the minion will log a warning message. +# +# Include a config file from some other path: +# include: /etc/salt/extra_config +# +# Include config from several files and directories: +#include: +# - /etc/salt/extra_config +# - /etc/roles/webserver + +# The syndic minion can verify that it is talking to the correct master via the +# key fingerprint of the higher-level master with the "syndic_finger" config. +#syndic_finger: '' +# +# +# +##### Minion module management ##### +########################################## +# Disable specific modules. This allows the admin to limit the level of +# access the master has to the minion. +#disable_modules: [cmd,test] +#disable_returners: [] +# +# Modules can be loaded from arbitrary paths. This enables the easy deployment +# of third party modules. Modules for returners and minions can be loaded. +# Specify a list of extra directories to search for minion modules and +# returners. These paths must be fully qualified! +#module_dirs: [] +#returner_dirs: [] +#states_dirs: [] +#render_dirs: [] +#utils_dirs: [] +# +# A module provider can be statically overwritten or extended for the minion +# via the providers option, in this case the default module will be +# overwritten by the specified module. In this example the pkg module will +# be provided by the yumpkg5 module instead of the system default. +#providers: +# pkg: yumpkg5 +# +# Enable Cython modules searching and loading. (Default: False) +#cython_enable: False +# +# Specify a max size (in bytes) for modules on import. This feature is currently +# only supported on *nix operating systems and requires psutil. +# modules_max_memory: -1 + + +##### State Management Settings ##### +########################################### +# The state management system executes all of the state templates on the minion +# to enable more granular control of system state management. The type of +# template and serialization used for state management needs to be configured +# on the minion, the default renderer is yaml_jinja. This is a yaml file +# rendered from a jinja template, the available options are: +# yaml_jinja +# yaml_mako +# yaml_wempy +# json_jinja +# json_mako +# json_wempy +# +#renderer: yaml_jinja +# +# The failhard option tells the minions to stop immediately after the first +# failure detected in the state execution. Defaults to False. +#failhard: False +# +# Reload the modules prior to a highstate run. +#autoload_dynamic_modules: True +# +# clean_dynamic_modules keeps the dynamic modules on the minion in sync with +# the dynamic modules on the master, this means that if a dynamic module is +# not on the master it will be deleted from the minion. By default, this is +# enabled and can be disabled by changing this value to False. +#clean_dynamic_modules: True +# +# Normally, the minion is not isolated to any single environment on the master +# when running states, but the environment can be isolated on the minion side +# by statically setting it. Remember that the recommended way to manage +# environments is to isolate via the top file. +#environment: None +# +# Isolates the pillar environment on the minion side. This functions the same +# as the environment setting, but for pillar instead of states. +#pillarenv: None +# +# If using the local file directory, then the state top file name needs to be +# defined, by default this is top.sls. +#state_top: top.sls +# +# Run states when the minion daemon starts. To enable, set startup_states to: +# 'highstate' -- Execute state.highstate +# 'sls' -- Read in the sls_list option and execute the named sls files +# 'top' -- Read top_file option and execute based on that file on the Master +#startup_states: '' +# +# List of states to run when the minion starts up if startup_states is 'sls': +#sls_list: +# - edit.vim +# - hyper +# +# Top file to execute if startup_states is 'top': +#top_file: '' + +# Automatically aggregate all states that have support for mod_aggregate by +# setting to True. Or pass a list of state module names to automatically +# aggregate just those types. +# +# state_aggregate: +# - pkg +# +#state_aggregate: False + +##### File Directory Settings ##### +########################################## +# The Salt Minion can redirect all file server operations to a local directory, +# this allows for the same state tree that is on the master to be used if +# copied completely onto the minion. This is a literal copy of the settings on +# the master but used to reference a local directory on the minion. + +# Set the file client. The client defaults to looking on the master server for +# files, but can be directed to look at the local file directory setting +# defined below by setting it to "local". Setting a local file_client runs the +# minion in masterless mode. +# file_client: local +file_client: remote + +# The file directory works on environments passed to the minion, each environment +# can have multiple root directories, the subdirectories in the multiple file +# roots cannot match, otherwise the downloaded files will not be able to be +# reliably ensured. A base environment is required to house the top file. +# Example: +# file_roots: +# base: +# - /srv/salt/ +# dev: +# - /srv/salt/dev/services +# - /srv/salt/dev/states +# prod: +# - /srv/salt/prod/services +# - /srv/salt/prod/states +# +#file_roots: +# base: +# - /srv/salt + +# Uncomment the line below if you do not want the file_server to follow +# symlinks when walking the filesystem tree. This is set to True +# by default. Currently this only applies to the default roots +# fileserver_backend. +#fileserver_followsymlinks: False +# +# Uncomment the line below if you do not want symlinks to be +# treated as the files they are pointing to. By default this is set to +# False. By uncommenting the line below, any detected symlink while listing +# files on the Master will not be returned to the Minion. +#fileserver_ignoresymlinks: True +# +# By default, the Salt fileserver recurses fully into all defined environments +# to attempt to find files. To limit this behavior so that the fileserver only +# traverses directories with SLS files and special Salt directories like _modules, +# enable the option below. This might be useful for installations where a file root +# has a very large number of files and performance is negatively impacted. Default +# is False. +#fileserver_limit_traversal: False + +# The hash_type is the hash to use when discovering the hash of a file in +# the local fileserver. The default is sha256, sha224, sha384 and sha512 are also supported. +# +# WARNING: While md5 and sha1 are also supported, do not use it due to the high chance +# of possible collisions and thus security breach. +# +# Warning: Prior to changing this value, the minion should be stopped and all +# Salt caches should be cleared. +hash_type: sha256 + +# The Salt pillar is searched for locally if file_client is set to local. If +# this is the case, and pillar data is defined, then the pillar_roots need to +# also be configured on the minion: +#pillar_roots: +# base: +# - /srv/pillar + +# Set a hard-limit on the size of the files that can be pushed to the master. +# It will be interpreted as megabytes. Default: 100 +#file_recv_max_size: 100 +# +# +###### Security settings ##### +########################################### +# Enable "open mode", this mode still maintains encryption, but turns off +# authentication, this is only intended for highly secure environments or for +# the situation where your keys end up in a bad state. If you run in open mode +# you do so at your own risk! +#open_mode: False + +# Enable permissive access to the salt keys. This allows you to run the +# master or minion as root, but have a non-root group be given access to +# your pki_dir. To make the access explicit, root must belong to the group +# you've given access to. This is potentially quite insecure. +#permissive_pki_access: False + +# The state_verbose and state_output settings can be used to change the way +# state system data is printed to the display. By default all data is printed. +# The state_verbose setting can be set to True or False, when set to False +# all data that has a result of True and no changes will be suppressed. +#state_verbose: True + +# The state_output setting changes if the output is the full multi line +# output for each changed state if set to 'full', but if set to 'terse' +# the output will be shortened to a single line. +#state_output: full + +# The state_output_diff setting changes whether or not the output from +# successful states is returned. Useful when even the terse output of these +# states is cluttering the logs. Set it to True to ignore them. +#state_output_diff: False + +# The state_output_profile setting changes whether profile information +# will be shown for each state run. +#state_output_profile: True + +# Fingerprint of the master public key to validate the identity of your Salt master +# before the initial key exchange. The master fingerprint can be found by running +# "salt-key -F master" on the Salt master. +#master_finger: '' + + +###### Thread settings ##### +########################################### +# Disable multiprocessing support, by default when a minion receives a +# publication a new process is spawned and the command is executed therein. +#multiprocessing: True + + +##### Logging settings ##### +########################################## +# The location of the minion log file +# The minion log can be sent to a regular file, local path name, or network +# location. Remote logging works best when configured to use rsyslogd(8) (e.g.: +# ``file:///dev/log``), with rsyslogd(8) configured for network logging. The URI +# format is: <file|udp|tcp>://<host|socketpath>:<port-if-required>/<log-facility> +#log_file: /var/log/salt/minion +#log_file: file:///dev/log +#log_file: udp://loghost:10514 +# +#log_file: /var/log/salt/minion +#key_logfile: /var/log/salt/key + +# The level of messages to send to the console. +# One of 'garbage', 'trace', 'debug', info', 'warning', 'error', 'critical'. +# +# The following log levels are considered INSECURE and may log sensitive data: +# ['garbage', 'trace', 'debug'] +# +# Default: 'warning' +#log_level: warning + +# The level of messages to send to the log file. +# One of 'garbage', 'trace', 'debug', info', 'warning', 'error', 'critical'. +# If using 'log_granular_levels' this must be set to the highest desired level. +# Default: 'warning' +#log_level_logfile: + +# The date and time format used in log messages. Allowed date/time formatting +# can be seen here: http://docs.python.org/library/time.html#time.strftime +#log_datefmt: '%H:%M:%S' +#log_datefmt_logfile: '%Y-%m-%d %H:%M:%S' + +# The format of the console logging messages. Allowed formatting options can +# be seen here: http://docs.python.org/library/logging.html#logrecord-attributes +# +# Console log colors are specified by these additional formatters: +# +# %(colorlevel)s +# %(colorname)s +# %(colorprocess)s +# %(colormsg)s +# +# Since it is desirable to include the surrounding brackets, '[' and ']', in +# the coloring of the messages, these color formatters also include padding as +# well. Color LogRecord attributes are only available for console logging. +# +#log_fmt_console: '%(colorlevel)s %(colormsg)s' +#log_fmt_console: '[%(levelname)-8s] %(message)s' +# +#log_fmt_logfile: '%(asctime)s,%(msecs)03.0f [%(name)-17s][%(levelname)-8s] %(message)s' + +# This can be used to control logging levels more specificically. This +# example sets the main salt library at the 'warning' level, but sets +# 'salt.modules' to log at the 'debug' level: +# log_granular_levels: +# 'salt': 'warning' +# 'salt.modules': 'debug' +# +#log_granular_levels: {} + +# To diagnose issues with minions disconnecting or missing returns, ZeroMQ +# supports the use of monitor sockets to log connection events. This +# feature requires ZeroMQ 4.0 or higher. +# +# To enable ZeroMQ monitor sockets, set 'zmq_monitor' to 'True' and log at a +# debug level or higher. +# +# A sample log event is as follows: +# +# [DEBUG ] ZeroMQ event: {'endpoint': 'tcp://127.0.0.1:4505', 'event': 512, +# 'value': 27, 'description': 'EVENT_DISCONNECTED'} +# +# All events logged will include the string 'ZeroMQ event'. A connection event +# should be logged as the minion starts up and initially connects to the +# master. If not, check for debug log level and that the necessary version of +# ZeroMQ is installed. +# +#zmq_monitor: False + +###### Module configuration ##### +########################################### +# Salt allows for modules to be passed arbitrary configuration data, any data +# passed here in valid yaml format will be passed on to the salt minion modules +# for use. It is STRONGLY recommended that a naming convention be used in which +# the module name is followed by a . and then the value. Also, all top level +# data must be applied via the yaml dict construct, some examples: +# +# You can specify that all modules should run in test mode: +#test: True +# +# A simple value for the test module: +#test.foo: foo +# +# A list for the test module: +#test.bar: [baz,quo] +# +# A dict for the test module: +#test.baz: {spam: sausage, cheese: bread} +# +# +###### Update settings ###### +########################################### +# Using the features in Esky, a salt minion can both run as a frozen app and +# be updated on the fly. These options control how the update process +# (saltutil.update()) behaves. +# +# The url for finding and downloading updates. Disabled by default. +#update_url: False +# +# The list of services to restart after a successful update. Empty by default. +#update_restart_services: [] + + +###### Keepalive settings ###### +############################################ +# ZeroMQ now includes support for configuring SO_KEEPALIVE if supported by +# the OS. If connections between the minion and the master pass through +# a state tracking device such as a firewall or VPN gateway, there is +# the risk that it could tear down the connection the master and minion +# without informing either party that their connection has been taken away. +# Enabling TCP Keepalives prevents this from happening. + +# Overall state of TCP Keepalives, enable (1 or True), disable (0 or False) +# or leave to the OS defaults (-1), on Linux, typically disabled. Default True, enabled. +#tcp_keepalive: True + +# How long before the first keepalive should be sent in seconds. Default 300 +# to send the first keepalive after 5 minutes, OS default (-1) is typically 7200 seconds +# on Linux see /proc/sys/net/ipv4/tcp_keepalive_time. +#tcp_keepalive_idle: 300 + +# How many lost probes are needed to consider the connection lost. Default -1 +# to use OS defaults, typically 9 on Linux, see /proc/sys/net/ipv4/tcp_keepalive_probes. +#tcp_keepalive_cnt: -1 + +# How often, in seconds, to send keepalives after the first one. Default -1 to +# use OS defaults, typically 75 seconds on Linux, see +# /proc/sys/net/ipv4/tcp_keepalive_intvl. +#tcp_keepalive_intvl: -1 + + +###### Windows Software settings ###### +############################################ +# Location of the repository cache file on the master: +#win_repo_cachefile: 'salt://win/repo/winrepo.p' + + +###### Returner settings ###### +############################################ +# Which returner(s) will be used for minion's result: +#return: mysql + + +###### Miscellaneous settings ###### +############################################ +# Default match type for filtering events tags: startswith, endswith, find, regex, fnmatch +#event_match_type: startswith diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-saltstack/templates/minion.smtp.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-saltstack/templates/minion.smtp.conf new file mode 100644 index 0000000000000000000000000000000000000000..f346f4528b908b420b088d8a3df0c24fb20d0228 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-saltstack/templates/minion.smtp.conf @@ -0,0 +1,6 @@ +smtp_eole: + smtp.server: localhost + smtp.tls: false +%if not %%is_empty(%%system_mail_from) + smtp.sender: %%system_mail_from +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-saltstack/templates/salt-master.override.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-saltstack/templates/salt-master.override.conf new file mode 100644 index 0000000000000000000000000000000000000000..d1b8401ffd83948e09ce68b97c1279f17fe6c11f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-saltstack/templates/salt-master.override.conf @@ -0,0 +1,3 @@ +[Service] +User=root +Group=root diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/dictionaries/00_eole-scribe_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/dictionaries/00_eole-scribe_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..bd306e3358b4af6e285e068bed3a92d4bcd96136 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/dictionaries/00_eole-scribe_packages.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>eole-zarafa</package> + <package>eole-scribe-backend</package> + <package>eole-scribe-scripts</package> + <package>eole-scribe-web</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/dictionaries/30_scribe.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/dictionaries/30_scribe.xml new file mode 100644 index 0000000000000000000000000000000000000000..e9642526bcc2b3037bdf7bed45a105286753e2fb --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/dictionaries/30_scribe.xml @@ -0,0 +1,149 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + <file name='/etc/eole/ldapconf.conf'/> + <file name='/etc/apparmor.d/tunables/home.d/homescribe'/> + </files> + <containers> + <container name='annuaire'> + <file name='/var/lib/eole/02_scribe.ldif' mkdir='True'/> + </container> + <container name='fichier'> + <file name='/etc/eole/ldapconf.conf'/> + <package>eole-scribe-backend</package> + </container> + </containers> + + <variables> + + <family name='general'> + <variable name='eole_module' redefine='True' > + <value>scribe</value> + </variable> + <variable name='nombre_interfaces' redefine='True' mode='expert'/> + </family> + + <family name='Interface-0'> + <variable name='eth0_method' redefine='True' hidden='True'> + <value>statique</value> + </variable> + </family> + + <family name='services'> + <variable name='activer_mysql' redefine='True' hidden='True'/> + <!-- service eole-sso local activé par défaut --> + <variable name='activer_sso' redefine='True'> + <value>local</value> + </variable> + </family> + + <family name='système'> + + <!-- We need to recalculate the variables --> + <variable name='eole_lv_names' redefine='True' remove_check='True' /> + <variable name='eole_lv_standard_extends' redefine='True' remove_check='True' /> + + </family> + + <family name='messagerie'> + <variable name='exim_smarthost' redefine='True' hidden='True'> + <value>oui</value> + </variable> + + <variable name='exim_ldap_delivery' redefine='True' hidden='True' remove_condition='True'> + <value>oui</value> + </variable> + + <variable name='activer_courier_imap_sso' redefine='True' mode='expert'/> + <variable name='adresse_imap_sso' redefine='True' mode='expert'/> + </family> + + <family name='clamav'> + <variable name='exim_clamav' redefine='True'> + <value>oui</value> + </variable> + </family> + + <family name="samba"> + <variable name='ead_support_multietab' redefine='True' hidden='False'/> + </family> + + <family name='proftpd'> + <variable name='ftp_perso_ele' type='oui/non' description="Activer l'accès aux dossiers personnels des élèves pour les professeurs"> + <value>non</value> + </variable> + </family> + + <family name='ead-web' mode='expert'> + <variable name='activer_ead_reverseproxy' redefine='True'> + <value>oui</value> + </variable> + </family> + + <family name='ent' mode='expert' icon='reorder'> + <variable name='synchro_aaf' type='string' description='Mode de synchronisation AAF'> + <value>manuel</value> + </variable> + <variable name='synchro_aaf_sendmail' type='oui/non' description="Envoi d'un courrier électronique en cas d'erreur"> + <value>non</value> + </variable> + <variable name='synchro_aaf_mail' type='mail' description="Adresse(s) électronique(s) à utiliser" multi='True' mandatory='True'/> + </family> + + <separators> + </separators> + + </variables> + + <constraints> + + <check name='valid_enum' target='synchro_aaf'> + <param>['automatique','manuel']</param> + </check> + <check name='valid_enum' target='activer_recuperation_courriel'> + <param>['non', 'local']</param> + </check> + <fill name='concat' target='system_mail_to'> + <param>admin@</param> + <param type='eole'>domaine_messagerie_etab</param> + </fill> + <condition name='disabled_if_in' source='synchro_aaf_sendmail'> + <param>non</param> + <target type='variable'>synchro_aaf_mail</target> + </condition> + <fill name='calc_multi_val' target='synchro_aaf_mail'> + <param type='eole'>system_mail_to</param> + </fill> + + <!-- Default AmonEcole* logical volumes --> + <auto name='calc_multi_val' target='eole_lv_names'> + <param>root</param> + <param>tmp</param> + <param>var</param> + <param>var+lib</param> + <param>var+log</param> + <param>home</param> + </auto> + + <!-- Default AmonEcole* logical volumes extension: 100% /home --> + <auto name='calc_multi_val' target='eole_lv_standard_extends'> + <param type='number'>0</param> + <param type='number'>0</param> + <param type='number'>0</param> + <param type='number'>0</param> + <param type='number'>0</param> + <param type='number'>100</param> + </auto> + + </constraints> + + <help> + <variable name='synchro_aaf'>Le module Zéphir permet de synchroniser les comptes depuis l'Annuaire Académique Fédérateur</variable> + <variable name='synchro_aaf_sendmail'>Active l'envoi d'un courrier électronique en cas d'erreur lors de l'import AAF automatisé</variable> + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/dictionaries/40_scribe_conteneurs.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/dictionaries/40_scribe_conteneurs.xml new file mode 100644 index 0000000000000000000000000000000000000000..bc9afc125289afc6e5deff750a78983be22d711e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/dictionaries/40_scribe_conteneurs.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + <containers> + <container name="bdd" id="50"/> + <container name="reseau" id="51"/> + <container name="partage" id="52"/> + <container name="mysql" group="bdd"/> + <container name="annuaire" group="bdd"/> + <container name="web" group="reseau"/> + <container name="mail" group="reseau"/> + <container name="fichier" group="partage"/> + <container name="ftp" group="partage"/> + <container name="dhcp" group="partage"/> + </containers> + <variables/> + + <constraints/> + + <help/> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/files/etc/bareos/bareosfichiers.d/scribe.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/files/etc/bareos/bareosfichiers.d/scribe.conf new file mode 100644 index 0000000000000000000000000000000000000000..d7e6868150edbcfc087a186187bfcdfddc7aa886 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/files/etc/bareos/bareosfichiers.d/scribe.conf @@ -0,0 +1,12 @@ +Include { + Options { + aclsupport = no + @/etc/bareos/include-options.conf + wildfile = "*.pref" + } + Options { + Exclude = yes + RegexFile = ".*" + } + File = /usr/share/ead2/backend/tmp/importation/ +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/files/usr/share/ead2/backend/config/actions/actions_scribe.cfg b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/files/usr/share/ead2/backend/config/actions/actions_scribe.cfg new file mode 100644 index 0000000000000000000000000000000000000000..2c83547bc8177dcbc2dd7d25cf613104dd6e850a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/files/usr/share/ead2/backend/config/actions/actions_scribe.cfg @@ -0,0 +1,26 @@ +scribe/usercreate +scribe/userlisting +scribe/usertable +scribe/usermodify +scribe/userpwd +scribe/userpurge +scribe/userdelete +scribe/groupcreate +scribe/grouplisting +scribe/groupmodify +scribe/groupdelete +scribe/grouped_edition +scribe/share +scribe/station +scribe/importation +scribe/importation_preferences +scribe/importation_sconet +scribe/importation_aaf +scribe/importation_be1d +scribe/importation_csv +scribe/importation_csv2 +scribe/synchro_aaf +scribe/connexion +scribe/devoir +scribe/prof +scribe/vnc diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/files/usr/share/ead2/backend/config/perms/perm_scribe.ini b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/files/usr/share/ead2/backend/config/perms/perm_scribe.ini new file mode 100644 index 0000000000000000000000000000000000000000..f64ff573e8cd6c9f2c27e5372e3c174a0bf8d5df --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/files/usr/share/ead2/backend/config/perms/perm_scribe.ini @@ -0,0 +1,72 @@ +[roles] +admin=Administrateur +eleve=Eleve +prof=Professeur +prof_admin=Administrateur de classe +administratif_scribe=Administratif dans Scribe +admin_scribe=Administrateur du Scribe + +[permissions] +scribe_user_create=admin,admin_scribe +scribe_user_list=admin,admin_scribe +scribe_user_table=admin,admin_scribe,prof_admin +scribe_user_modify=admin,admin_scribe,prof_admin +scribe_user_delete=admin,admin_scribe,prof_admin +scribe_user_modpassword=admin,admin_scribe,prof_admin +scribe_user_password=admin,admin_scribe,prof,prof_admin,administratif_scribe +scribe_user_purge=admin,admin_scribe +scribe_group_create=admin,admin_scribe +scribe_group_list=admin,admin_scribe +scribe_group_modify=admin,admin_scribe +scribe_group_delete=admin,admin_scribe +scribe_grouped_edition=admin,admin_scribe,prof_admin +scribe_share=admin,admin_scribe +scribe_station=admin,admin_scribe +scribe_extraction=admin,admin_scribe +scribe_extraction_preferences=admin,admin_scribe +scribe_extraction_sconet=admin,admin_scribe +scribe_extraction_aaf=admin,admin_scribe +scribe_extraction_be1d=admin,admin_scribe +scribe_extraction_csv2=admin,admin_scribe +scribe_synchro_aaf=admin,admin_scribe +scribe_connexion_index=admin,admin_scribe +scribe_connexion_machine=admin,admin_scribe +scribe_connexion_quota=admin,admin_scribe +scribe_connexion_history=admin,admin_scribe +scribe_devoir_distribuer=admin,admin_scribe,prof,prof_admin +scribe_devoir_ramasser=admin,admin_scribe,prof,prof_admin +scribe_devoir_rendre=admin,admin_scribe,prof,prof_admin +scribe_devoir_supprimer=admin,admin_scribe,prof,prof_admin +scribe_sympa=admin,admin_scribe +scribe_prof_preference=prof,prof_admin,administratif_scribe +scribe_prof_mod_mail=prof,prof_admin,administratif_scribe +scribe_prof_mod_groupe=prof,prof_admin,administratif_scribe +scribe_prof_user=prof_admin +scribe_prof_user_create=prof_admin +scribe_prof_user_modify=prof_admin +scribe_prof_group=prof_admin +scribe_prof_group_create=prof_admin +scribe_vnc=admin,admin_scribe +rapport_extraction=admin,admin_scribe +# surchage des droits posés par eole-fichier +printers=admin,admin_scribe,prof,prof_admin,administratif_scribe +## actions generiques +help=admin_scribe,administratif_scribe +update_ead=admin_scribe,administratif_scribe +# autre action commune aux differents modules +journal=admin_scribe,administratif_scribe +main_status=admin_scribe,administratif_scribe +server-configure=admin_scribe +server-reboot=admin_scribe +server-stop=admin_scribe +lshw=admin_scribe +maj=admin_scribe +daemon=admin_scribe +asimple_services=admin_scribe +esimple_services_editor=admin_scribe +role_editor=admin_scribe +role_manager=admin_scribe +role_association=admin_scribe +bande_passante=admin_scribe +rapport_maj=admin_scribe +cmd_console=admin_scribe diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/files/usr/share/ead2/backend/config/roles/roles_scribe.ini b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/files/usr/share/ead2/backend/config/roles/roles_scribe.ini new file mode 100644 index 0000000000000000000000000000000000000000..35e97a2c66c747575030a376b486bec69f657522 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/files/usr/share/ead2/backend/config/roles/roles_scribe.ini @@ -0,0 +1,7 @@ +[user_groups] +administratifs=administratif_scribe + +[typeadmin] +0=prof +2=prof_admin + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/files/usr/share/eole/config/grp_eole/DomainAdmins.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/files/usr/share/eole/config/grp_eole/DomainAdmins.xml new file mode 100644 index 0000000000000000000000000000000000000000..a84fd97ec1f2e21837e0449adb4328d2d17c13e9 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/files/usr/share/eole/config/grp_eole/DomainAdmins.xml @@ -0,0 +1,306 @@ +<?xml version="1.0"?> +<ESU> + <Serie>GU</Serie> + <Version>v4RC42</Version> + <Regles> + <Chemin nom="INI://%appdata%\Mozilla\Firefox\profiles.ini?section=Profile0"> + <Variable nom="Name" OS="254" type="STRING">Defaut</Variable> + <Variable nom="Path" OS="254" type="STRING">Profiles/Defaut</Variable> + <Variable nom="IsRelative" OS="254" type="BOOLEAN">1</Variable> + </Chemin> + <Chemin nom="JS://%appdata%\Mozilla\Firefox\Profiles\Defaut\user.js"> + <Variable nom="browser.startup.homepage" OS="254" type="STRING">http://eole.orion.education.fr/</Variable> + <Variable nom="browser.download.dir" OS="254" type="STRING">%PERSONAL%</Variable> + <Variable nom="browser.download.folderList" OS="254" type="DWORD">2</Variable> +%if %%getVar('esu_proxy_default', 'non') == 'oui' + <Variable nom="network.proxy.type" OS="254" type="DWORD">1</Variable> + <Variable nom="network.proxy.http" OS="254" type="STRING">%ESU_PROXY_HOST%</Variable> + <Variable nom="network.proxy.http_port" OS="254" type="DWORD">%ESU_PROXY_PORT%</Variable> + <Variable nom="network.proxy.no_proxies_on" OS="254" type="STRING">%ESU_PROXY_BYPASS%</Variable> + <Variable nom="network.proxy.share_proxy_settings" OS="254" type="BOOLEAN">true</Variable> +%end if + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\SOFTWARE\INL\NuWINc"> + <Variable nom="OnQuitButton" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="UseSystray" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="SystrayMenuHidden" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="HideOptions" OS="254" type="DWORD">SUPPR</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders"> + <Variable nom="Personal" OS="254" type="STRING">U:\</Variable> + <Variable nom="My Pictures" OS="254" type="STRING">U:\Mes Images</Variable> + <Variable nom="Templates" OS="254" type="STRING">U:\Modèles</Variable> + <Variable nom="Favorites" OS="254" type="STRING">U:\config_eole\Favoris\</Variable> + <Variable nom="AppData" OS="254" type="STRING">U:\config_eole\Application Data\</Variable> + <Variable nom="History" OS="254" type="STRING">U:\config_eole\Local Settings\Historique\</Variable> + <Variable nom="Cookies" OS="254" type="STRING">U:\config_eole\Cookies\</Variable> + <Variable nom="Desktop" OS="254" type="STRING">R:\grp_eole\DomainAdmins\Bureau</Variable> + <Variable nom="Start Menu" OS="254" type="STRING">R:\grp_eole\DomainAdmins\Menu Démarrer</Variable> + <Variable nom="Startup" OS="254" type="STRING">R:\grp_eole\DomainAdmins\Menu Démarrer\Programmes\Démarrage</Variable> + <Variable nom="Programs" OS="254" type="STRING">R:\grp_eole\DomainAdmins\Menu Démarrer\Programmes</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\System"> + <Variable nom="ExcludeProfileDirs" OS="14" type="STRING">Mes Documents;Favoris;Bureau;Menu démarrer;Application Data;cookies;modèles</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\NetCache"> + <Variable nom="NoConfigCache" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="NoCacheViewer" OS="14" type="DWORD">1</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System"> + <Variable nom="DisableRegistryTools" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoDispCPL" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoDispBackgroundPage" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoDispScrSavPage" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NovisualStyleChoice" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="NoSizeChoice" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="NoColorChoice" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="SetVisualStyle" OS="6" type="STRING">%windir%\resources\themes\luna\luna.msstyles</Variable> + <Variable nom="NoDevMgrPage" OS="224" type="DWORD">SUPPR</Variable> + <Variable nom="NoConfigPage" OS="224" type="DWORD">SUPPR</Variable> + <Variable nom="NoFileSysPage" OS="224" type="DWORD">SUPPR</Variable> + <Variable nom="NoVirtMemPage" OS="224" type="DWORD">SUPPR</Variable> + <Variable nom="DisableTaskMgr" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="DisableLockWorkstation" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoSecCPL" OS="254" type="DWORD">SUPPR</Variable> <Variable nom="DisableChangePassword" OS="30" type="DWORD">SUPPR</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\software\microsoft\windows\currentversion\policies\explorer"> + <Variable nom="NoWelcomeScreen" OS="30" type="DWORD">SUPPR</Variable> + <Variable nom="NoDeletePrinter" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoAddPrinter" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoControlPanel" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="NoThemesTab" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="NoTrayContextMenu" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="LockTaskBar" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="notrayitemsdisplay" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="NoToolbarsOnTaskbar" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="noautotraynotify" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="HideClock" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="NoComputersNearMe" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="NoHardwareTab" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="NoDfsTab" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="NoSecurityTab" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="NoFileMenu" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoViewContextMenu" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoChangeAnimation" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="noshellsearchbutton" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="LinkResolveIgnoreLinkInfo" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoInstrumentation" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="NoNetConnectDisconnect" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="ClassicShell" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoDesktop" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="nomovingBands" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoDesktopCleanupWizard" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="NoSaveSettings" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoPropertiesMyComputer" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="NoManageMyComputerVerb" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="NoNetHood" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoRecentDocsNethood" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="NoInternetIcon" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoPropertiesMyDocuments" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="DisablePersonalDirChange" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="NoPropertiesRecycleBin" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="NoActiveDesktop" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoActiveDesktopChanges" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="nochangestartmenu" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoWindowsUpdate" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="nosmballoontip" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="nocommongroups" OS="30" type="DWORD">SUPPR</Variable> + <Variable nom="nostartmenusubfolders" OS="30" type="DWORD">SUPPR</Variable> + <Variable nom="nofavoritesmenu" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="norecentdocsmenu" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="nofind" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="norun" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="nosmhelp" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="nonetworkconnections" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="ForceStartMenuLogoff" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="NoSetActiveDesktop" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoSetFolders" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoFolderOptions" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="nosettaskbar" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="clearrecentdocsonexit" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="norecentdocshistory" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="nosimplestartmenu" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="nosmmydocs" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="nostartmenumymusic" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="nosmmypictures" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="nostartmenunetworkplaces" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="NoStartMenuPinnedList" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="NoStartMenuMfuProgramsList" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="NoStartMenuMorePrograms" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="NoUsernameInStartMenu" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="IntelliMenus" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="NoFileUrl" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="btnencoding" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="btnpaste" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="btncopy" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="btncut" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="btndiscussions" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="btnedit" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="btnprint" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="btnsize" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="btnmailnews" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="btntools" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="btnfullscreen" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="btnfolders" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="btnmedia" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="btnhistory" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="btnfavorites" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="btnsearch" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="btnhome" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="btnrefresh" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="btnstop" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="btnforward" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="btnback" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="SpecifyDefaultButtons" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoToolbarCustomize" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoBandCustomize" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoAutoUpdate" OS="254" type="DWORD">SUPPR</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\software\microsoft\windows\currentversion\policies\activedesktop"> + <Variable nom="NoDispAppearancePage" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoDispSettingsPage" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoHtmlWallpaper" OS="14" type="DWORD">SUPPR</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\software\policies\microsoft\windows\control panel\desktop"> + <Variable nom="screensaveactive" OS="254" type="DWORD">SUPPR</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\software\policies\microsoft\windows nt\printers\wizard"> + <Variable nom="Downlevel Browse" OS="14" type="DWORD">1</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\SOFTWARE\CRDP Bretagne\ESU"> + <Variable nom="LImprimantes" OS="30" type="STRING">SUPPR</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\software\CRDP Bretagne\esu\"> + <Variable nom="SetDefautPrinter" OS="30" type="DWORD">SUPPR</Variable> + <Variable nom="DelNotInList" OS="30" type="DWORD">SUPPR</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Network"> + <Variable nom="NoNetSetup" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoPrintSharingControl" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoFileSharingControl" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoRecycleFiles" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="ConfirmFileDelete" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="NoEntireNetwork" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="NoCdBurning" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="NoSharedDocuments" OS="6" type="DWORD">SUPPR</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Control Panel\Keyboard"> + <Variable nom="InitialKeyboardIndicators" OS="254" type="STRING">2</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\WinOldApp"> + <Variable nom="NoRealMode" OS="224" type="DWORD">SUPPR</Variable> + <Variable nom="disabled" OS="224" type="DWORD">SUPPR</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced"> + <Variable nom="Hidden" OS="254" type="DWORD">1</Variable> + <Variable nom="HideFileExt" OS="254" type="DWORD">0</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\software\microsoft\windows\currentversion\policies\nonenum"> + <Variable nom="{20D04FE0-3AEA-1069-A2D8-08002B30309D}" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="{450D8FBA-AD25-11D0-98A8-0800361B1103}" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="{645FF040-5081-101B-9F08-00AA002F954E}" OS="14" type="DWORD">SUPPR</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace\{2227A280-3AEA-1069-A2DE-08002B30309D}"> + <Variable nom="Info" OS="254" type="STRING">SUPPRALL</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings"> +%if %%getVar('esu_proxy_default', 'non') == 'oui' + <Variable nom="ProxyEnable" OS="254" type="DWORD">1</Variable> + <Variable nom="ProxyServer" OS="254" type="STRING">%ESU_PROXY_HOST%:%ESU_PROXY_PORT%</Variable> + <Variable nom="ProxyOverride" OS="254" type="STRING">%ESU_PROXY_BYPASS%</Variable> +%else + <Variable nom="ProxyEnable" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="ProxyServer" OS="254" type="STRING">IGNORE</Variable> + <Variable nom="ProxyOverride" OS="254" type="STRING">IGNORE</Variable> +%end if + <Variable nom="AutoConfigURL" OS="254" type="STRING">SUPPR</Variable> + <Variable nom="DisableCachingOfSSLPages" OS="254" type="DWORD">0</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Control Panel"> +%if %%getVar('esu_proxy_default', 'non') == 'oui' + <Variable nom="Proxy" OS="254" type="DWORD">1</Variable> +%else + <Variable nom="Proxy" OS="254" type="DWORD">SUPPR</Variable> +%end if + <Variable nom="SecurityTab" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="ContentTab" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="ConnectionsTab" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="ProgramsTab" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="AdvancedTab" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="HomePage" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="Cache" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="History" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="Colors" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="links" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="Fonts" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="Languages" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="Accessibility" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="Ratings" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="Certificates" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="Profiles" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="Wallet" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="Connection Wizard" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="Connection Settings" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="CalendarContact" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="CheckIfDefault" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="Advanced" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="Autoconfig" OS="254" type="DWORD">SUPPR</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Restrictions"> + <Variable nom="NoBrowserOptions" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="RestGoMenu" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoPrinting" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoSelectDownloadDir" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoBrowserSaveAs" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoFileOpen" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoViewSource" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoTheaterMode" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoFavorites" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoHelpMenu" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoHelpItemTipOfTheDay" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoHelpItemNetscapeHelp" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoHelpItemSendFeedback" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoBrowserContextMenu" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoBrowserBars" OS="254" type="DWORD">SUPPR</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\software\microsoft\Internet Explorer\Main"> + <Variable nom="Start Page" OS="254" type="STRING">IGNORE</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\software\policies\microsoft\windows\currentversion\identities"> + <Variable nom="locked down" OS="254" type="DWORD">SUPPR</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\software\policies\microsoft\windows\currentversion\internet settings"> + <Variable nom="Messaging" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="ResetWebSettings" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="FormSuggest" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="FormSuggest Passwords" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="CheckIfDefault" OS="254" type="DWORD">SUPPR</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Microsoft\Ftp"> + <Variable nom="Use PASV" OS="254" type="STRING">no</Variable> + <Variable nom="Use Web Based FTP" OS="254" type="STRING">no</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Cache"> + <Variable nom="Persistent" OS="254" type="DWORD">1</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Infodelivery\Restrictions"> + <Variable nom="NoChannelUI" OS="254" type="DWORD">SUPPR</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer"> + <Variable nom="Download Directory" OS="254" type="STRING"></Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\software\microsoft\outlook express"> + <Variable nom="BlockExeAttachments" OS="254" type="DWORD">0</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Toolbars\Restrictions"> + <Variable nom="NoLinksBar" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoAddressBar" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoToolBar" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoToolbarOptions" OS="254" type="DWORD">SUPPR</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\software\microsoft\windows\currentversion\policies\explorer\restrictcpl"> + <Variable nom="ForceClassicControlPanel" OS="6" type="DWORD">1</Variable> + </Chemin> + </Regles> + <numeroSerie>1VWOf1RKj5ZbNC6ubyu5z+ThDgc=</numeroSerie> +</ESU> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/files/usr/share/eole/config/grp_eole/_ListeUtilisateurs.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/files/usr/share/eole/config/grp_eole/_ListeUtilisateurs.xml new file mode 100644 index 0000000000000000000000000000000000000000..f2d13d9314ae92dd322cbedc9ac0ba81bb5626ad --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/files/usr/share/eole/config/grp_eole/_ListeUtilisateurs.xml @@ -0,0 +1,3 @@ +<?xml version="1.0" encoding="ISO-8859-1"?> +<ESU_ListeUtilisateurs> + <GU nom="DomainAdmins" type="G"/><GU nom="eleves" type="G"/><GU nom="professeurs" type="G"/><numeroSerie>anRb/4xiJl1zick2qsRhHMn1PEk=</numeroSerie><GU nom="administratifs" type="G"/></ESU_ListeUtilisateurs> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/files/usr/share/eole/config/grp_eole/_Machine.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/files/usr/share/eole/config/grp_eole/_Machine.xml new file mode 100644 index 0000000000000000000000000000000000000000..ad55d8f7d49f6707ff416e74a8f6bbc5fe06a783 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/files/usr/share/eole/config/grp_eole/_Machine.xml @@ -0,0 +1,61 @@ +<?xml version="1.0"?> +<ESU> + <Serie>GU</Serie> + <Version>v4RC42</Version> + <Regles> + <Chemin nom="REG://HKEY_LOCAL_MACHINE\Software\CRDP Bretagne\ESU"> + <Variable nom="CleanRegistry" OS="254" type="DWORD">1</Variable> + <Variable nom="DisconnectBadUsers" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="ModeDebug" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="ShowUsername" OS="254" type="DWORD">1</Variable> + </Chemin> + <Chemin nom="REG://HKEY_LOCAL_MACHINE\Network\Logon"> + <Variable nom="MustBeValidated" OS="224" type="DWORD">1</Variable> + <Variable nom="DontShowLastUser" OS="224" type="DWORD">1</Variable> + <Variable nom="UserProfiles" OS="224" type="DWORD">0</Variable> + </Chemin> + <Chemin nom="REG://HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\Network"> + <Variable nom="DisablePwdCaching" OS="224" type="DWORD">1</Variable> + </Chemin> + <Chemin nom="REG://HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"> + <Variable nom="DontDisplayLastUserName" OS="16" type="DWORD">1</Variable> + </Chemin> + <Chemin nom="REG://HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System"> + <Variable nom="DontDisplayLastUserName" OS="14" type="DWORD">1</Variable> + <Variable nom="ShutdownWithoutLogon" OS="254" type="DWORD">1</Variable> + <Variable nom="DisableCAD" OS="254" type="DWORD">1</Variable> + </Chemin> + <Chemin nom="REG://HKEY_LOCAL_MACHINE\SOFTWARE\INL\NuWINc"> + <Variable nom="Disabled" OS="254" type="DWORD">1</Variable> + </Chemin> + <Chemin nom="REG://HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\System"> + <Variable nom="DeleteRoamingCache" OS="30" type="DWORD">1</Variable> + </Chemin> + <Chemin nom="PRIVILEGE"> + <Variable nom="SeSystemtimePrivilege" OS="30" type="STRING">SUPPR</Variable> + </Chemin> + <Chemin nom="REG://HKEY_LOCAL_MACHINE\software\microsoft\windows\currentversion\policies\explorer"> + <Variable nom="NoWelcomeScreen" OS="254" type="DWORD">SUPPR</Variable> + </Chemin> + <Chemin nom="REG://HKEY_USERS\.DEFAULT\Control Panel\Keyboard\"> + <Variable nom="InitialKeyboardIndicators" OS="254" type="STRING">2</Variable> + </Chemin> + <Chemin nom="REG://HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders"> + <Variable nom="Common Desktop" OS="254" type="STRING">R:\grp_eole\_Machine\Bureau</Variable> + <Variable nom="Common Startup" OS="254" type="STRING">R:\grp_eole\_Machine\Menu Démarrer\Programmes\Démarrage</Variable> + <Variable nom="Common Programs" OS="254" type="STRING">R:\grp_eole\_Machine\Menu Démarrer\Programmes\</Variable> + <Variable nom="Common Start Menu" OS="254" type="STRING">R:\grp_eole\_Machine\Menu Démarrer\</Variable> + <Variable nom="Common AppData" OS="224" type="STRING">R:\grp_eole\_Machine\Application Data</Variable> + </Chemin> + <Chemin nom="REG://HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\NetCache"> + <Variable nom="Enabled" OS="14" type="DWORD">0</Variable> + </Chemin> + <Chemin nom="REG://HKEY_LOCAL_MACHINE\Software\CRDP Bretagne\ESU\"> + <Variable nom="TimeServer" OS="254" type="STRING">%%getVar('adresse_ip_'+str(%%fichier_link_interface))</Variable> + </Chemin> + <Chemin nom="REG://HKEY_LOCAL_MACHINE\Software\Eole\Scribe"> + <Variable nom="log_level" OS="254" type="STRING">info</Variable> + </Chemin> + </Regles> + <numeroSerie>AnKCDi3Ew/X5qDgh3f1sbIbISdY=</numeroSerie> +</ESU> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/files/usr/share/eole/config/grp_eole/administratifs.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/files/usr/share/eole/config/grp_eole/administratifs.xml new file mode 100644 index 0000000000000000000000000000000000000000..dd521c2e19352c45e7fe74de8d50c0b3de70b9bf --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/files/usr/share/eole/config/grp_eole/administratifs.xml @@ -0,0 +1,202 @@ +<?xml version="1.0"?> +<ESU> + <Serie>GU</Serie> + <Version>v4RC42</Version> + <Regles> + <Chemin nom="INI://%appdata%\Mozilla\Firefox\profiles.ini?section=Profile0"> + <Variable nom="Name" OS="254" type="STRING">Defaut</Variable> + <Variable nom="Path" OS="254" type="STRING">Profiles/Defaut</Variable> + <Variable nom="IsRelative" OS="254" type="BOOLEAN">1</Variable> + </Chemin> + <Chemin nom="JS://%appdata%\Mozilla\Firefox\Profiles\Defaut\user.js"> + <Variable nom="browser.startup.homepage" OS="254" type="STRING">http://eole.orion.education.fr/</Variable> + <Variable nom="browser.download.dir" OS="254" type="STRING">%PERSONAL%</Variable> + <Variable nom="browser.download.folderList" OS="254" type="DWORD">2</Variable> +%if %%getVar('esu_proxy_default', 'non') == 'oui' + <Variable nom="network.proxy.type" OS="254" type="DWORD">1</Variable> + <Variable nom="network.proxy.http" OS="254" type="STRING">%ESU_PROXY_HOST%</Variable> + <Variable nom="network.proxy.http_port" OS="254" type="DWORD">%ESU_PROXY_PORT%</Variable> + <Variable nom="network.proxy.no_proxies_on" OS="254" type="STRING">%ESU_PROXY_BYPASS%</Variable> + <Variable nom="network.proxy.share_proxy_settings" OS="254" type="BOOLEAN">true</Variable> +%end if + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\SOFTWARE\INL\NuWINc"> + <Variable nom="OnQuitButton" OS="254" type="DWORD">2</Variable> + <Variable nom="UseSystray" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="SystrayMenuHidden" OS="254" type="DWORD">1</Variable> + <Variable nom="HideOptions" OS="254" type="DWORD">1</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders"> + <Variable nom="Desktop" OS="254" type="STRING">R:\grp_eole\administratifs\Bureau</Variable> + <Variable nom="Start Menu" OS="254" type="STRING">R:\grp_eole\administratifs\Menu Démarrer</Variable> + <Variable nom="Startup" OS="254" type="STRING">R:\grp_eole\administratifs\Menu Démarrer\Programmes\Démarrage</Variable> + <Variable nom="Programs" OS="254" type="STRING">R:\grp_eole\administratifs\Menu Démarrer\Programmes</Variable> + <Variable nom="Personal" OS="254" type="STRING">U:\</Variable> + <Variable nom="My Pictures" OS="254" type="STRING">U:\Mes Images</Variable> + <Variable nom="Templates" OS="254" type="STRING">U:\Modèles</Variable> + <Variable nom="Favorites" OS="254" type="STRING">U:\config_eole\Favoris</Variable> + <Variable nom="AppData" OS="254" type="STRING">U:\config_eole\Application Data\</Variable> + <Variable nom="History" OS="254" type="STRING">U:\config_eole\Local Settings\Historique\</Variable> + <Variable nom="Cookies" OS="254" type="STRING">U:\config_eole\Cookies\</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\System"> + <Variable nom="ExcludeProfileDirs" OS="14" type="STRING">Mes Documents;Favoris;Bureau;Menu démarrer;Application Data;cookies;modèles</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\software\microsoft\windows\currentversion\policies\explorer"> + <Variable nom="NoControlPanel" OS="14" type="DWORD">1</Variable> + <Variable nom="NoAutoUpdate" OS="254" type="DWORD">1</Variable> + <Variable nom="notrayitemsdisplay" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="NoToolbarsOnTaskbar" OS="254" type="DWORD">1</Variable> + <Variable nom="LinkResolveIgnoreLinkInfo" OS="254" type="DWORD">1</Variable> + <Variable nom="NoNetConnectDisconnect" OS="254" type="DWORD">1</Variable> + <Variable nom="NoChangeAnimation" OS="14" type="DWORD">1</Variable> + <Variable nom="NoHardwareTab" OS="14" type="DWORD">1</Variable> + <Variable nom="NoDfsTab" OS="14" type="DWORD">1</Variable> + <Variable nom="NoSecurityTab" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="NoDesktopCleanupWizard" OS="6" type="DWORD">1</Variable> + <Variable nom="NoSaveSettings" OS="254" type="DWORD">1</Variable> + <Variable nom="NoPropertiesMyComputer" OS="14" type="DWORD">1</Variable> + <Variable nom="NoManageMyComputerVerb" OS="14" type="DWORD">1</Variable> + <Variable nom="NoRecentDocsNethood" OS="14" type="DWORD">1</Variable> + <Variable nom="DisablePersonalDirChange" OS="14" type="DWORD">1</Variable> + <Variable nom="NoPropertiesMyDocuments" OS="14" type="DWORD">1</Variable> + <Variable nom="nochangestartmenu" OS="254" type="DWORD">1</Variable> + <Variable nom="NoWindowsUpdate" OS="254" type="DWORD">1</Variable> + <Variable nom="nocommongroups" OS="30" type="DWORD">SUPPR</Variable> + <Variable nom="nonetworkconnections" OS="254" type="DWORD">1</Variable> + <Variable nom="ForceStartMenuLogoff" OS="14" type="DWORD">1</Variable> + <Variable nom="nosmballoontip" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="nostartmenusubfolders" OS="30" type="DWORD">SUPPR</Variable> + <Variable nom="nofavoritesmenu" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="norecentdocsmenu" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="nofind" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="norun" OS="254" type="DWORD">1</Variable> + <Variable nom="nosmhelp" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="clearrecentdocsonexit" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="norecentdocshistory" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="nosimplestartmenu" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="nosmmydocs" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="nostartmenumymusic" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="nosmmypictures" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="nostartmenunetworkplaces" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="NoStartMenuPinnedList" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="NoStartMenuMfuProgramsList" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="NoStartMenuMorePrograms" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="NoUsernameInStartMenu" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="IntelliMenus" OS="6" type="DWORD">1</Variable> + <Variable nom="NoSetFolders" OS="254" type="DWORD">1</Variable> + <Variable nom="NoDesktop" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="nomovingBands" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoNetHood" OS="254" type="DWORD">1</Variable> + <Variable nom="NoInternetIcon" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoPropertiesRecycleBin" OS="14" type="DWORD">1</Variable> + <Variable nom="NoActiveDesktop" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoActiveDesktopChanges" OS="14" type="DWORD">1</Variable> + <Variable nom="NoInstrumentation" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="ClassicShell" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoFileMenu" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoViewContextMenu" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="noshellsearchbutton" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="NoComputersNearMe" OS="14" type="DWORD">1</Variable> + <Variable nom="NoTrayContextMenu" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="LockTaskBar" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="noautotraynotify" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="HideClock" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="NoWelcomeScreen" OS="30" type="DWORD">1</Variable> + <Variable nom="NoSetActiveDesktop" OS="254" type="DWORD">1</Variable> + <Variable nom="NoFolderOptions" OS="254" type="DWORD">1</Variable> + <Variable nom="nosettaskbar" OS="254" type="DWORD">1</Variable> + <Variable nom="NoDeletePrinter" OS="254" type="DWORD">1</Variable> + <Variable nom="NoAddPrinter" OS="254" type="DWORD">1</Variable> + <Variable nom="NoThemesTab" OS="6" type="DWORD">1</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Control Panel\Keyboard"> + <Variable nom="InitialKeyboardIndicators" OS="254" type="STRING">2</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System"> + <Variable nom="NoDispCPL" OS="254" type="DWORD">1</Variable> + <Variable nom="NoDevMgrPage" OS="224" type="DWORD">1</Variable> + <Variable nom="NoConfigPage" OS="224" type="DWORD">1</Variable> + <Variable nom="NoFileSysPage" OS="224" type="DWORD">1</Variable> + <Variable nom="NoVirtMemPage" OS="224" type="DWORD">1</Variable> + <Variable nom="DisableRegistryTools" OS="254" type="DWORD">1</Variable> + <Variable nom="DisableTaskMgr" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="DisableLockWorkstation" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoDispBackgroundPage" OS="254" type="DWORD">1</Variable> + <Variable nom="NoDispScrSavPage" OS="254" type="DWORD">1</Variable> + <Variable nom="NovisualStyleChoice" OS="6" type="DWORD">1</Variable> + <Variable nom="NoSizeChoice" OS="6" type="DWORD">1</Variable> + <Variable nom="NoColorChoice" OS="6" type="DWORD">1</Variable> + <Variable nom="SetVisualStyle" OS="6" type="STRING">%windir%\resources\themes\luna\luna.msstyles</Variable> + <Variable nom="NoSecCPL" OS="254" type="DWORD">1</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Network"> + <Variable nom="NoNetSetup" OS="254" type="DWORD">1</Variable> + <Variable nom="NoPrintSharingControl" OS="254" type="DWORD">1</Variable> + <Variable nom="NoFileSharingControl" OS="254" type="DWORD">1</Variable> + <Variable nom="NoSharedDocuments" OS="6" type="DWORD">1</Variable> + <Variable nom="NoCdBurning" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="NoEntireNetwork" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="NoRecycleFiles" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="ConfirmFileDelete" OS="6" type="DWORD">1</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\NetCache"> + <Variable nom="NoConfigCache" OS="6" type="DWORD">1</Variable> + <Variable nom="NoCacheViewer" OS="14" type="DWORD">1</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced"> + <Variable nom="Hidden" OS="254" type="DWORD">0</Variable> + <Variable nom="HideFileExt" OS="254" type="DWORD">1</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\software\microsoft\windows\currentversion\policies\nonenum"> + <Variable nom="{20D04FE0-3AEA-1069-A2D8-08002B30309D}" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="{450D8FBA-AD25-11D0-98A8-0800361B1103}" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="{645FF040-5081-101B-9F08-00AA002F954E}" OS="14" type="DWORD">SUPPR</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace\{2227A280-3AEA-1069-A2DE-08002B30309D}"> + <Variable nom="Info" OS="254" type="STRING">SUPPRALL</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings"> +%if %%getVar('esu_proxy_default', 'non') == 'oui' + <Variable nom="ProxyEnable" OS="254" type="DWORD">1</Variable> + <Variable nom="ProxyServer" OS="254" type="STRING">%ESU_PROXY_HOST%:%ESU_PROXY_PORT%</Variable> + <Variable nom="ProxyOverride" OS="254" type="STRING">%ESU_PROXY_BYPASS%</Variable> +%else + <Variable nom="ProxyEnable" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="ProxyServer" OS="254" type="STRING">IGNORE</Variable> + <Variable nom="ProxyOverride" OS="254" type="STRING">IGNORE</Variable> +%end if + <Variable nom="AutoConfigURL" OS="254" type="STRING">SUPPR</Variable> + <Variable nom="DisableCachingOfSSLPages" OS="254" type="DWORD">0</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Control Panel"> +%if %%getVar('esu_proxy_default', 'non') == 'oui' + <Variable nom="Proxy" OS="254" type="DWORD">1</Variable> +%else + <Variable nom="Proxy" OS="254" type="DWORD">SUPPR</Variable> +%end if + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\software\microsoft\windows\currentversion\policies\activedesktop"> + <Variable nom="NoHtmlWallpaper" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="NoDispAppearancePage" OS="254" type="DWORD">1</Variable> + <Variable nom="NoDispSettingsPage" OS="254" type="DWORD">1</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\WinOldApp"> + <Variable nom="NoRealMode" OS="224" type="DWORD">SUPPR</Variable> + <Variable nom="disabled" OS="224" type="DWORD">SUPPR</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\software\microsoft\windows\currentversion\policies\explorer\restrictcpl"> + <Variable nom="ForceClassicControlPanel" OS="6" type="DWORD">SUPPR</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\software\policies\microsoft\windows nt\printers\wizard"> + <Variable nom="Downlevel Browse" OS="14" type="DWORD">0</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\software\policies\microsoft\windows\control panel\desktop"> + <Variable nom="screensaveactive" OS="254" type="DWORD">1</Variable> + </Chemin> <Chemin nom="REG://HKEY_CURRENT_USER\Control Panel\Desktop"> + <Variable nom="Wallpaper" OS="254" type="STRING">SUPPR</Variable> + <Variable nom="TileWallpaper" OS="254" type="STRING">1</Variable> + </Chemin> + </Regles> + <numeroSerie>nl+fmvOAcMt7GkYLuOZLoJfbnaA=</numeroSerie> +</ESU> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/files/usr/share/eole/config/grp_eole/eleves.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/files/usr/share/eole/config/grp_eole/eleves.xml new file mode 100644 index 0000000000000000000000000000000000000000..52e0550e98b93f9d4ca882a60322576c266e8d16 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/files/usr/share/eole/config/grp_eole/eleves.xml @@ -0,0 +1,210 @@ +<?xml version="1.0"?> +<ESU> + <Serie>GU</Serie> + <Version>v4RC42</Version> + <Regles> + <Chemin nom="INI://%appdata%\Mozilla\Firefox\profiles.ini?section=Profile0"> + <Variable nom="Name" OS="254" type="STRING">Defaut</Variable> + <Variable nom="Path" OS="254" type="STRING">Profiles/Defaut</Variable> + <Variable nom="IsRelative" OS="254" type="BOOLEAN">1</Variable> + </Chemin> + <Chemin nom="JS://%appdata%\Mozilla\Firefox\Profiles\Defaut\user.js"> + <Variable nom="browser.startup.homepage" OS="254" type="STRING">http://eole.orion.education.fr/</Variable> + <Variable nom="browser.download.dir" OS="254" type="STRING">%PERSONAL%</Variable> + <Variable nom="browser.download.folderList" OS="254" type="DWORD">2</Variable> +%if %%getVar('esu_proxy_default', 'non') == 'oui' + <Variable nom="network.proxy.type" OS="254" type="DWORD">1</Variable> + <Variable nom="network.proxy.http" OS="254" type="STRING">%ESU_PROXY_HOST%</Variable> + <Variable nom="network.proxy.http_port" OS="254" type="DWORD">%ESU_PROXY_PORT%</Variable> + <Variable nom="network.proxy.no_proxies_on" OS="254" type="STRING">%ESU_PROXY_BYPASS%</Variable> + <Variable nom="network.proxy.share_proxy_settings" OS="254" type="BOOLEAN">true</Variable> +%end if + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\SOFTWARE\INL\NuWINc"> + <Variable nom="OnQuitButton" OS="254" type="DWORD">2</Variable> + <Variable nom="UseSystray" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="SystrayMenuHidden" OS="254" type="DWORD">1</Variable> + <Variable nom="HideOptions" OS="254" type="DWORD">1</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders"> + <Variable nom="Desktop" OS="254" type="STRING">R:\grp_eole\eleves\Bureau</Variable> + <Variable nom="Start Menu" OS="254" type="STRING">R:\grp_eole\eleves\Menu Démarrer</Variable> + <Variable nom="Startup" OS="254" type="STRING">R:\grp_eole\eleves\Menu Démarrer\Programmes\Démarrage</Variable> + <Variable nom="Programs" OS="254" type="STRING">R:\grp_eole\eleves\Menu Démarrer\Programmes</Variable> + <Variable nom="Personal" OS="254" type="STRING">U:\</Variable> + <Variable nom="My Pictures" OS="254" type="STRING">U:\Mes Images</Variable> + <Variable nom="Templates" OS="254" type="STRING">U:\Modèles</Variable> + <Variable nom="Favorites" OS="254" type="STRING">U:\config_eole\Favoris</Variable> + <Variable nom="AppData" OS="254" type="STRING">U:\config_eole\Application Data\</Variable> + <Variable nom="History" OS="254" type="STRING">U:\config_eole\Local Settings\Historique\</Variable> + <Variable nom="Cookies" OS="254" type="STRING">U:\config_eole\Cookies\</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\System"> + <Variable nom="ExcludeProfileDirs" OS="14" type="STRING">Mes Documents;Favoris;Bureau;Menu démarrer;Application Data;cookies;modèles</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\software\microsoft\windows\currentversion\policies\explorer"> + <Variable nom="NoControlPanel" OS="14" type="DWORD">1</Variable> + <Variable nom="NoDeletePrinter" OS="254" type="DWORD">1</Variable> + <Variable nom="NoTrayContextMenu" OS="254" type="DWORD">1</Variable> + <Variable nom="LockTaskBar" OS="254" type="DWORD">1</Variable> + <Variable nom="notrayitemsdisplay" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="NoToolbarsOnTaskbar" OS="254" type="DWORD">1</Variable> + <Variable nom="noautotraynotify" OS="6" type="DWORD">1</Variable> + <Variable nom="NoDriveAutoRun" OS="254" type="DWORD">0</Variable> + <Variable nom="NoDrives" OS="254" type="DWORD">131076</Variable> + <Variable nom="LinkResolveIgnoreLinkInfo" OS="254" type="DWORD">1</Variable> + <Variable nom="NoNetConnectDisconnect" OS="254" type="DWORD">1</Variable> + <Variable nom="NoFileMenu" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoViewContextMenu" OS="254" type="DWORD">1</Variable> + <Variable nom="NoChangeAnimation" OS="14" type="DWORD">1</Variable> + <Variable nom="noshellsearchbutton" OS="14" type="DWORD">1</Variable> + <Variable nom="NoHardwareTab" OS="14" type="DWORD">1</Variable> + <Variable nom="NoDfsTab" OS="14" type="DWORD">1</Variable> + <Variable nom="NoSecurityTab" OS="14" type="DWORD">1</Variable> + <Variable nom="NoComputersNearMe" OS="14" type="DWORD">1</Variable> + <Variable nom="NoDesktopCleanupWizard" OS="6" type="DWORD">1</Variable> + <Variable nom="NoSaveSettings" OS="254" type="DWORD">1</Variable> + <Variable nom="NoPropertiesMyComputer" OS="14" type="DWORD">1</Variable> + <Variable nom="NoManageMyComputerVerb" OS="14" type="DWORD">1</Variable> + <Variable nom="NoNetHood" OS="254" type="DWORD">1</Variable> + <Variable nom="NoRecentDocsNethood" OS="14" type="DWORD">1</Variable> + <Variable nom="NoPropertiesMyDocuments" OS="14" type="DWORD">1</Variable> + <Variable nom="DisablePersonalDirChange" OS="14" type="DWORD">1</Variable> + <Variable nom="NoPropertiesRecycleBin" OS="14" type="DWORD">1</Variable> + <Variable nom="nochangestartmenu" OS="254" type="DWORD">1</Variable> + <Variable nom="NoWindowsUpdate" OS="254" type="DWORD">1</Variable> + <Variable nom="nocommongroups" OS="30" type="DWORD">SUPPR</Variable> + <Variable nom="nostartmenusubfolders" OS="30" type="DWORD">1</Variable> + <Variable nom="nofind" OS="254" type="DWORD">1</Variable> + <Variable nom="nosmhelp" OS="14" type="DWORD">1</Variable> + <Variable nom="nonetworkconnections" OS="254" type="DWORD">1</Variable> + <Variable nom="ForceStartMenuLogoff" OS="14" type="DWORD">1</Variable> + <Variable nom="NoSetActiveDesktop" OS="254" type="DWORD">1</Variable> + <Variable nom="NoSetFolders" OS="254" type="DWORD">1</Variable> + <Variable nom="NoFolderOptions" OS="254" type="DWORD">1</Variable> + <Variable nom="nosettaskbar" OS="254" type="DWORD">1</Variable> + <Variable nom="IntelliMenus" OS="6" type="DWORD">1</Variable> + <Variable nom="NoAutoUpdate" OS="254" type="DWORD">1</Variable> + <Variable nom="NoThemesTab" OS="6" type="DWORD">1</Variable> + <Variable nom="NoAddPrinter" OS="254" type="DWORD">1</Variable> + <Variable nom="NoInstrumentation" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="ClassicShell" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoDesktop" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="nomovingBands" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoInternetIcon" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoActiveDesktop" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoActiveDesktopChanges" OS="14" type="DWORD">1</Variable> + <Variable nom="nosmballoontip" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="nofavoritesmenu" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="norecentdocsmenu" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="clearrecentdocsonexit" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="norecentdocshistory" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="nosimplestartmenu" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="nosmmydocs" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="nostartmenumymusic" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="nosmmypictures" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="nostartmenunetworkplaces" OS="6" type="DWORD">1</Variable> + <Variable nom="NoStartMenuPinnedList" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="NoStartMenuMfuProgramsList" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="NoStartMenuMorePrograms" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="NoUsernameInStartMenu" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="norun" OS="254" type="DWORD">1</Variable> + <Variable nom="NoWelcomeScreen" OS="30" type="DWORD">1</Variable> + <Variable nom="HideClock" OS="6" type="DWORD">SUPPR</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Network"> + <Variable nom="NoNetSetup" OS="254" type="DWORD">1</Variable> + <Variable nom="NoPrintSharingControl" OS="254" type="DWORD">1</Variable> + <Variable nom="NoFileSharingControl" OS="254" type="DWORD">1</Variable> + <Variable nom="NoSharedDocuments" OS="6" type="DWORD">1</Variable> + <Variable nom="NoEntireNetwork" OS="14" type="DWORD">1</Variable> + <Variable nom="NoCdBurning" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="NoRecycleFiles" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="ConfirmFileDelete" OS="6" type="DWORD">1</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System"> + <Variable nom="NoDevMgrPage" OS="224" type="DWORD">1</Variable> + <Variable nom="NoConfigPage" OS="224" type="DWORD">1</Variable> + <Variable nom="NoFileSysPage" OS="224" type="DWORD">1</Variable> + <Variable nom="NoVirtMemPage" OS="224" type="DWORD">1</Variable> + <Variable nom="DisableTaskMgr" OS="254" type="DWORD">1</Variable> + <Variable nom="NovisualStyleChoice" OS="6" type="DWORD">1</Variable> + <Variable nom="NoSizeChoice" OS="6" type="DWORD">1</Variable> + <Variable nom="NoColorChoice" OS="6" type="DWORD">1</Variable> + <Variable nom="SetVisualStyle" OS="6" type="STRING">%windir%\resources\themes\luna\luna.msstyles</Variable> + <Variable nom="NoDispCPL" OS="254" type="DWORD">1</Variable> + <Variable nom="NoDispBackgroundPage" OS="254" type="DWORD">1</Variable> + <Variable nom="NoDispScrSavPage" OS="254" type="DWORD">1</Variable> + <Variable nom="NoSecCPL" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="DisableLockWorkstation" OS="254" type="DWORD">1</Variable> + <Variable nom="DisableRegistryTools" OS="254" type="DWORD">1</Variable> <Variable nom="DisableChangePassword" OS="30" type="DWORD">SUPPR</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\NetCache"> + <Variable nom="NoConfigCache" OS="6" type="DWORD">1</Variable> + <Variable nom="NoCacheViewer" OS="14" type="DWORD">1</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\WinOldApp"> + <Variable nom="NoRealMode" OS="224" type="DWORD">1</Variable> + <Variable nom="disabled" OS="224" type="DWORD">1</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced"> + <Variable nom="Hidden" OS="254" type="DWORD">0</Variable> + <Variable nom="HideFileExt" OS="254" type="DWORD">1</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Control Panel\Keyboard"> + <Variable nom="InitialKeyboardIndicators" OS="254" type="STRING">2</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\software\microsoft\windows\currentversion\policies\explorer\restrictcpl"> + <Variable nom="ForceClassicControlPanel" OS="6" type="DWORD">SUPPR</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\software\policies\microsoft\windows nt\printers\wizard"> + <Variable nom="Downlevel Browse" OS="14" type="DWORD">0</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\SOFTWARE\CRDP Bretagne\ESU"> + <Variable nom="LImprimantes" OS="30" type="STRING">SUPPR</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\software\CRDP Bretagne\esu\"> + <Variable nom="SetDefautPrinter" OS="30" type="DWORD">1</Variable> + <Variable nom="DelNotInList" OS="30" type="DWORD">1</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\software\microsoft\windows\currentversion\policies\activedesktop"> + <Variable nom="NoDispAppearancePage" OS="254" type="DWORD">1</Variable> + <Variable nom="NoDispSettingsPage" OS="254" type="DWORD">1</Variable> + <Variable nom="NoHtmlWallpaper" OS="14" type="DWORD">SUPPR</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\software\policies\microsoft\windows\control panel\desktop"> + <Variable nom="screensaveactive" OS="254" type="DWORD">1</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\software\microsoft\windows\currentversion\policies\nonenum"> + <Variable nom="{20D04FE0-3AEA-1069-A2D8-08002B30309D}" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="{450D8FBA-AD25-11D0-98A8-0800361B1103}" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="{645FF040-5081-101B-9F08-00AA002F954E}" OS="14" type="DWORD">SUPPR</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace\{2227A280-3AEA-1069-A2DE-08002B30309D}"> + <Variable nom="Info" OS="254" type="STRING">SUPPRALL</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings"> +%if %%getVar('esu_proxy_default', 'non') == 'oui' + <Variable nom="ProxyEnable" OS="254" type="DWORD">1</Variable> + <Variable nom="ProxyServer" OS="254" type="STRING">%ESU_PROXY_HOST%:%ESU_PROXY_PORT%</Variable> + <Variable nom="ProxyOverride" OS="254" type="STRING">%ESU_PROXY_BYPASS%</Variable> +%else + <Variable nom="ProxyEnable" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="ProxyServer" OS="254" type="STRING">IGNORE</Variable> + <Variable nom="ProxyOverride" OS="254" type="STRING">IGNORE</Variable> +%end if + <Variable nom="AutoConfigURL" OS="254" type="STRING">SUPPR</Variable> + <Variable nom="DisableCachingOfSSLPages" OS="254" type="DWORD">0</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Control Panel\Desktop"> +%if %%getVar('esu_proxy_default', 'non') == 'oui' + <Variable nom="Proxy" OS="254" type="DWORD">1</Variable> +%else + <Variable nom="Proxy" OS="254" type="DWORD">SUPPR</Variable> +%end if + <Variable nom="Wallpaper" OS="254" type="STRING">SUPPR</Variable> + <Variable nom="TileWallpaper" OS="254" type="STRING">1</Variable> + </Chemin> + </Regles> + <numeroSerie>eWK6xHimwhIic6VY/jiUXpQZN9A=</numeroSerie> +</ESU> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/files/usr/share/eole/config/grp_eole/professeurs.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/files/usr/share/eole/config/grp_eole/professeurs.xml new file mode 100644 index 0000000000000000000000000000000000000000..e550c704e9d4922a00bbcf6b6d87974cfd0d168c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/files/usr/share/eole/config/grp_eole/professeurs.xml @@ -0,0 +1,202 @@ +<?xml version="1.0"?> +<ESU> + <Serie>GU</Serie> + <Version>v4RC42</Version> + <Regles> + <Chemin nom="INI://%appdata%\Mozilla\Firefox\profiles.ini?section=Profile0"> + <Variable nom="Name" OS="254" type="STRING">Defaut</Variable> + <Variable nom="Path" OS="254" type="STRING">Profiles/Defaut</Variable> + <Variable nom="IsRelative" OS="254" type="BOOLEAN">1</Variable> + </Chemin> + <Chemin nom="JS://%appdata%\Mozilla\Firefox\Profiles\Defaut\user.js"> + <Variable nom="browser.startup.homepage" OS="254" type="STRING">http://eole.orion.education.fr/</Variable> + <Variable nom="browser.download.dir" OS="254" type="STRING">%PERSONAL%</Variable> + <Variable nom="browser.download.folderList" OS="254" type="DWORD">2</Variable> +%if %%getVar('esu_proxy_default', 'non') == 'oui' + <Variable nom="network.proxy.type" OS="254" type="DWORD">1</Variable> + <Variable nom="network.proxy.http" OS="254" type="STRING">%ESU_PROXY_HOST%</Variable> + <Variable nom="network.proxy.http_port" OS="254" type="DWORD">%ESU_PROXY_PORT%</Variable> + <Variable nom="network.proxy.no_proxies_on" OS="254" type="STRING">%ESU_PROXY_BYPASS%</Variable> + <Variable nom="network.proxy.share_proxy_settings" OS="254" type="BOOLEAN">true</Variable> +%end if + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\SOFTWARE\INL\NuWINc"> + <Variable nom="OnQuitButton" OS="254" type="DWORD">2</Variable> + <Variable nom="UseSystray" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="SystrayMenuHidden" OS="254" type="DWORD">1</Variable> + <Variable nom="HideOptions" OS="254" type="DWORD">1</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders"> + <Variable nom="Desktop" OS="254" type="STRING">R:\grp_eole\professeurs\Bureau</Variable> + <Variable nom="Start Menu" OS="254" type="STRING">R:\grp_eole\professeurs\Menu Démarrer</Variable> + <Variable nom="Startup" OS="254" type="STRING">R:\grp_eole\professeurs\Menu Démarrer\Programmes\Démarrage</Variable> + <Variable nom="Programs" OS="254" type="STRING">R:\grp_eole\professeurs\Menu Démarrer\Programmes</Variable> + <Variable nom="Personal" OS="254" type="STRING">U:\</Variable> + <Variable nom="My Pictures" OS="254" type="STRING">U:\Mes Images</Variable> + <Variable nom="Templates" OS="254" type="STRING">U:\Modèles</Variable> + <Variable nom="Favorites" OS="254" type="STRING">U:\config_eole\Favoris</Variable> + <Variable nom="AppData" OS="254" type="STRING">U:\config_eole\Application Data\</Variable> + <Variable nom="History" OS="254" type="STRING">U:\config_eole\Local Settings\Historique\</Variable> + <Variable nom="Cookies" OS="254" type="STRING">U:\config_eole\Cookies\</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\System"> + <Variable nom="ExcludeProfileDirs" OS="14" type="STRING">Mes Documents;Favoris;Bureau;Menu démarrer;Application Data;cookies;modèles</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\software\microsoft\windows\currentversion\policies\explorer"> + <Variable nom="NoControlPanel" OS="14" type="DWORD">1</Variable> + <Variable nom="NoAutoUpdate" OS="254" type="DWORD">1</Variable> + <Variable nom="notrayitemsdisplay" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="NoToolbarsOnTaskbar" OS="254" type="DWORD">1</Variable> + <Variable nom="LinkResolveIgnoreLinkInfo" OS="254" type="DWORD">1</Variable> + <Variable nom="NoNetConnectDisconnect" OS="254" type="DWORD">1</Variable> + <Variable nom="NoChangeAnimation" OS="14" type="DWORD">1</Variable> + <Variable nom="NoHardwareTab" OS="14" type="DWORD">1</Variable> + <Variable nom="NoDfsTab" OS="14" type="DWORD">1</Variable> + <Variable nom="NoSecurityTab" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="NoDesktopCleanupWizard" OS="6" type="DWORD">1</Variable> + <Variable nom="NoSaveSettings" OS="254" type="DWORD">1</Variable> + <Variable nom="NoPropertiesMyComputer" OS="14" type="DWORD">1</Variable> + <Variable nom="NoManageMyComputerVerb" OS="14" type="DWORD">1</Variable> + <Variable nom="NoRecentDocsNethood" OS="14" type="DWORD">1</Variable> + <Variable nom="DisablePersonalDirChange" OS="14" type="DWORD">1</Variable> + <Variable nom="NoPropertiesMyDocuments" OS="14" type="DWORD">1</Variable> + <Variable nom="nochangestartmenu" OS="254" type="DWORD">1</Variable> + <Variable nom="NoWindowsUpdate" OS="254" type="DWORD">1</Variable> + <Variable nom="nocommongroups" OS="30" type="DWORD">SUPPR</Variable> + <Variable nom="nonetworkconnections" OS="254" type="DWORD">1</Variable> + <Variable nom="ForceStartMenuLogoff" OS="14" type="DWORD">1</Variable> + <Variable nom="nosmballoontip" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="nostartmenusubfolders" OS="30" type="DWORD">SUPPR</Variable> + <Variable nom="nofavoritesmenu" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="norecentdocsmenu" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="nofind" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="norun" OS="254" type="DWORD">1</Variable> + <Variable nom="nosmhelp" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="clearrecentdocsonexit" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="norecentdocshistory" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="nosimplestartmenu" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="nosmmydocs" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="nostartmenumymusic" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="nosmmypictures" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="nostartmenunetworkplaces" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="NoStartMenuPinnedList" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="NoStartMenuMfuProgramsList" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="NoStartMenuMorePrograms" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="NoUsernameInStartMenu" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="IntelliMenus" OS="6" type="DWORD">1</Variable> + <Variable nom="NoSetFolders" OS="254" type="DWORD">1</Variable> + <Variable nom="NoDesktop" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="nomovingBands" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoNetHood" OS="254" type="DWORD">1</Variable> + <Variable nom="NoInternetIcon" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoPropertiesRecycleBin" OS="14" type="DWORD">1</Variable> + <Variable nom="NoActiveDesktop" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoActiveDesktopChanges" OS="14" type="DWORD">1</Variable> + <Variable nom="NoInstrumentation" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="ClassicShell" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoFileMenu" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoViewContextMenu" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="noshellsearchbutton" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="NoComputersNearMe" OS="14" type="DWORD">1</Variable> + <Variable nom="NoTrayContextMenu" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="LockTaskBar" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="noautotraynotify" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="HideClock" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="NoWelcomeScreen" OS="30" type="DWORD">1</Variable> + <Variable nom="NoSetActiveDesktop" OS="254" type="DWORD">1</Variable> + <Variable nom="NoFolderOptions" OS="254" type="DWORD">1</Variable> + <Variable nom="nosettaskbar" OS="254" type="DWORD">1</Variable> + <Variable nom="NoDeletePrinter" OS="254" type="DWORD">1</Variable> + <Variable nom="NoAddPrinter" OS="254" type="DWORD">1</Variable> + <Variable nom="NoThemesTab" OS="6" type="DWORD">1</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Control Panel\Keyboard"> + <Variable nom="InitialKeyboardIndicators" OS="254" type="STRING">2</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System"> + <Variable nom="NoDispCPL" OS="254" type="DWORD">1</Variable> + <Variable nom="NoDevMgrPage" OS="224" type="DWORD">1</Variable> + <Variable nom="NoConfigPage" OS="224" type="DWORD">1</Variable> + <Variable nom="NoFileSysPage" OS="224" type="DWORD">1</Variable> + <Variable nom="NoVirtMemPage" OS="224" type="DWORD">1</Variable> + <Variable nom="DisableRegistryTools" OS="254" type="DWORD">1</Variable> + <Variable nom="DisableTaskMgr" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="DisableLockWorkstation" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="NoDispBackgroundPage" OS="254" type="DWORD">1</Variable> + <Variable nom="NoDispScrSavPage" OS="254" type="DWORD">1</Variable> + <Variable nom="NovisualStyleChoice" OS="6" type="DWORD">1</Variable> + <Variable nom="NoSizeChoice" OS="6" type="DWORD">1</Variable> + <Variable nom="NoColorChoice" OS="6" type="DWORD">1</Variable> + <Variable nom="SetVisualStyle" OS="6" type="STRING">%windir%\resources\themes\luna\luna.msstyles</Variable> + <Variable nom="NoSecCPL" OS="254" type="DWORD">1</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Network"> + <Variable nom="NoNetSetup" OS="254" type="DWORD">1</Variable> + <Variable nom="NoPrintSharingControl" OS="254" type="DWORD">1</Variable> + <Variable nom="NoFileSharingControl" OS="254" type="DWORD">1</Variable> + <Variable nom="NoSharedDocuments" OS="6" type="DWORD">1</Variable> + <Variable nom="NoCdBurning" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="NoEntireNetwork" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="NoRecycleFiles" OS="6" type="DWORD">SUPPR</Variable> + <Variable nom="ConfirmFileDelete" OS="6" type="DWORD">1</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\NetCache"> + <Variable nom="NoConfigCache" OS="6" type="DWORD">1</Variable> + <Variable nom="NoCacheViewer" OS="14" type="DWORD">1</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced"> + <Variable nom="Hidden" OS="254" type="DWORD">0</Variable> + <Variable nom="HideFileExt" OS="254" type="DWORD">1</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\software\microsoft\windows\currentversion\policies\nonenum"> + <Variable nom="{20D04FE0-3AEA-1069-A2D8-08002B30309D}" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="{450D8FBA-AD25-11D0-98A8-0800361B1103}" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="{645FF040-5081-101B-9F08-00AA002F954E}" OS="14" type="DWORD">SUPPR</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace\{2227A280-3AEA-1069-A2DE-08002B30309D}"> + <Variable nom="Info" OS="254" type="STRING">SUPPRALL</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings"> +%if %%getVar('esu_proxy_default', 'non') == 'oui' + <Variable nom="ProxyEnable" OS="254" type="DWORD">1</Variable> + <Variable nom="ProxyServer" OS="254" type="STRING">%ESU_PROXY_HOST%:%ESU_PROXY_PORT%</Variable> + <Variable nom="ProxyOverride" OS="254" type="STRING">%ESU_PROXY_BYPASS%</Variable> +%else + <Variable nom="ProxyEnable" OS="254" type="DWORD">SUPPR</Variable> + <Variable nom="ProxyServer" OS="254" type="STRING">IGNORE</Variable> + <Variable nom="ProxyOverride" OS="254" type="STRING">IGNORE</Variable> +%end if + <Variable nom="AutoConfigURL" OS="254" type="STRING">SUPPR</Variable> + <Variable nom="DisableCachingOfSSLPages" OS="254" type="DWORD">0</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Control Panel"> +%if %%getVar('esu_proxy_default', 'non') == 'oui' + <Variable nom="Proxy" OS="254" type="DWORD">1</Variable> +%else + <Variable nom="Proxy" OS="254" type="DWORD">SUPPR</Variable> +%end if + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\software\microsoft\windows\currentversion\policies\activedesktop"> + <Variable nom="NoHtmlWallpaper" OS="14" type="DWORD">SUPPR</Variable> + <Variable nom="NoDispAppearancePage" OS="254" type="DWORD">1</Variable> + <Variable nom="NoDispSettingsPage" OS="254" type="DWORD">1</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\WinOldApp"> + <Variable nom="NoRealMode" OS="224" type="DWORD">SUPPR</Variable> + <Variable nom="disabled" OS="224" type="DWORD">SUPPR</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\software\microsoft\windows\currentversion\policies\explorer\restrictcpl"> + <Variable nom="ForceClassicControlPanel" OS="6" type="DWORD">SUPPR</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\software\policies\microsoft\windows nt\printers\wizard"> + <Variable nom="Downlevel Browse" OS="14" type="DWORD">0</Variable> + </Chemin> + <Chemin nom="REG://HKEY_CURRENT_USER\software\policies\microsoft\windows\control panel\desktop"> + <Variable nom="screensaveactive" OS="254" type="DWORD">1</Variable> + </Chemin> <Chemin nom="REG://HKEY_CURRENT_USER\Control Panel\Desktop"> + <Variable nom="Wallpaper" OS="254" type="STRING">SUPPR</Variable> + <Variable nom="TileWallpaper" OS="254" type="STRING">1</Variable> + </Chemin> + </Regles> + <numeroSerie>nl+fmvOAcMt7GkYLuOZLoJfbnaA=</numeroSerie> +</ESU> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/files/usr/share/zephir/monitor/configs/aaf.agent b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/files/usr/share/zephir/monitor/configs/aaf.agent new file mode 100644 index 0000000000000000000000000000000000000000..2b870bc13601f08732e7c4cbccc305406add8462 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/files/usr/share/zephir/monitor/configs/aaf.agent @@ -0,0 +1,16 @@ +# -*- coding: UTF-8 -*- +""" +Etat de la synchronisation AAF +""" + +if os.path.isfile('/usr/bin/synchro_aaf'): + from zephir.monitor.agents.aaf import AAF + aaf = AAF("aaf", + period = 1800, + description = """Synchronisation des fichiers AAF""", + section="""Utilisation""", + ) + AGENTS = [aaf] +else: + AGENTS = [] + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/files/usr/share/zephir/monitor/configs/ldapscribe.agent b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/files/usr/share/zephir/monitor/configs/ldapscribe.agent new file mode 100644 index 0000000000000000000000000000000000000000..28e2dd64ca4c73d9ee1b246169054f5adad0fed8 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/files/usr/share/zephir/monitor/configs/ldapscribe.agent @@ -0,0 +1,19 @@ +# -*- coding: UTF-8 -*- +""" +Contenu de l'annuaire LDAP de Scribe +""" + +from zephir.monitor.agents.ldapscribe import LdapScribe + +# période de 3 minute -> 180 +period = 180 + +annu = LdapScribe('annuaire', + description = """Contenu de l'annuaire""", + period = period, + requires = ['ldap'], + section="""Utilisation""", + ) + +# liste des agents qui seront chargés +AGENTS = [annu] diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/posttemplates/05-scribe b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/posttemplates/05-scribe new file mode 100644 index 0000000000000000000000000000000000000000..84e03d4a4a15119a559640f5c1121b0ce0bac18d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/posttemplates/05-scribe @@ -0,0 +1,102 @@ +#!/bin/bash + +# Normalement /home est monté sur le maître +NETLOGON="/home/netlogon" +HOMEADMIN="/home/a/admin/perso" +WORKGROUPS="/home/workgroups" +CLASSES="/home/classes" +OPTIONS="/home/options" +RECYCLAGE="/home/recyclage" +COMMUN="$WORKGROUPS/commun" +PROF="$WORKGROUPS/professeurs" +DEVOIR="$WORKGROUPS/devoirs" +PROFESSEURS=10001 +ELEVES=10002 +ADMINIS=10000 +option=$1 + +adresse_ip_eth0=$(CreoleGet adresse_ip_eth0) +container_path_fichier=$(CreoleGet container_path_fichier) + +# partage commun +# /!\ commun/logiciels est créé par controle-vnc-applis /!\ +if [ ! -d $COMMUN/travail ];then + /bin/mkdir -p $COMMUN/travail + /bin/mkdir -p $COMMUN/logiciels + chmod -R 700 $COMMUN + setfacl -Rm g:${PROFESSEURS}:r-x $COMMUN + setfacl -Rm g:${ELEVES}:r-x $COMMUN + setfacl -Rm g:${ADMINIS}:r-x $COMMUN + setfacl -Rm g:${PROFESSEURS}:rwx $COMMUN/travail + setfacl -Rm g:${ADMINIS}:rwx $COMMUN/travail + getfacl --access --absolute-names $COMMUN | setfacl -d -RM - $COMMUN + getfacl --access --absolute-names $COMMUN/travail | setfacl -d -RM - $COMMUN/travail +fi + +# partage professeurs +# /!\ professeurs/gestion-postes est créé par controle-vnc-applis /!\ +if [ "$option" = 'instance' ];then + /bin/mkdir -p $PROF + chmod -R 700 $PROF + setfacl -Rm g:${PROFESSEURS}:r-x $PROF + getfacl --access --absolute-names $PROF | setfacl -d -RM - $PROF +fi +if [ ! -f $PROF/Administration.url ];then + /bin/mkdir -p $PROF + echo "[InternetShortcut]\nURL=https://${adresse_ip_eth0}:4200/" > $PROF/Administration.url +fi +# Forcer les ACLs pour gestion-postes +if [ -f /home/workgroups/professeurs/gestion-postes/gestion-postes.exe ];then + chown -R root:root /home/workgroups/professeurs/gestion-postes/ + chmod -R 700 /home/workgroups/professeurs/gestion-postes/ + setfacl -Rbk /home/workgroups/professeurs/gestion-postes/ + setfacl -Rm g:professeurs:r-x /home/workgroups/professeurs/gestion-postes/ + setfacl -Rdm g:professeurs:r-x /home/workgroups/professeurs/gestion-postes/ +fi + +# partage devoirs +/bin/mkdir -p $DEVOIR +chmod -R 700 $DEVOIR +setfacl -Rbk $DEVOIR +setfacl -Rm g:${PROFESSEURS}:rwx $DEVOIR +setfacl -Rm g:${ELEVES}:r-x $DEVOIR +getfacl --access --absolute-names $DEVOIR | setfacl -d -RM - $DEVOIR + +# répertoires spéciaux (pour liens symboliques) +/bin/mkdir -p $OPTIONS +/bin/mkdir -p $CLASSES +/bin/mkdir -p $RECYCLAGE +chmod 755 $CLASSES +chmod 755 $OPTIONS +chmod 700 $RECYCLAGE + +# 2 profils sur Scribe +/bin/mkdir -p $NETLOGON/profil2 +/bin/mkdir -p $NETLOGON/profil2.V2 + +# création d'un lien vers la documentation (FIXME 2.3) +#[ ! -f "$HOMEADMIN/Documentation Scribe.url" ] && echo "[InternetShortcut] +#URL=http://${adresse_ip_eth0}/doc-scribe/" > "$HOMEADMIN/Documentation Scribe.url" + +# création d'un lien vers l'EAD dans le rep perso d'admin +[ ! -f $HOMEADMIN/Administration.url ] && echo "[InternetShortcut] +URL=https://${adresse_ip_eth0}:4200/" > $HOMEADMIN/Administration.url + +# liens symboliques vers les outils +ln -nsf /home/esu $HOMEADMIN/esu +ln -nsf /home/client_scribe/client $HOMEADMIN/client +ln -nsf $RECYCLAGE $HOMEADMIN/recyclage + +# Ajout des ACL manquantes pour ESU (#5703) +setfacl -Rm u:admin:rwx /home/esu/Base/grp_eole +setfacl -dRm u:admin:rwx /home/esu/Base/grp_eole +setfacl -Rm u:admin:rwx /home/esu/Console/Modeles +setfacl -dRm u:admin:rwx /home/esu/Console/Modeles + +# configuration du mode de controle VNC +CONF_VNC=/var/lib/eole/config/controlevnc.conf +FULL_VNC=$container_path_fichier$CONF_VNC +[ ! -f $FULL_VNC ] && echo -n simple > $FULL_VNC +[ ! -f $CONF_VNC ] && ln -s $FULL_VNC $CONF_VNC + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..8163305ae755958406437ce87c167e366e98db12 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/service.yml @@ -0,0 +1,103 @@ +format: '0.1' +name: eole-scribe +version: |- + 2.7.1-3 +description: |- + configuration du module EOLE : Scribe + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: + - eole-annuaire + - eole-antivirus + - eole-bareos-mysql + - eole-controle-vnc + - or: + - eole-courier + - eole-cups + - eole-dhcp + - eole-eoe + - eole-eop + - eole-esu + - eole-exim + - eole-exim-auth + - eole-mysql + - eole-proftpd + - eole-spamassassin + - eole-sso + - eole-sympa + - eole-web + - eole-fichier-primaire + - eole-scribehorus + - scribe-ad + - eole-server +packages: + - or: + - eole-zarafa + - eole-scribe-backend + - eole-scribe-scripts + - eole-scribe-web +dictionaries: + - 30_scribe.xml + - 40_scribe_conteneurs.xml +extra_dictionaries: {} +templates: + - 02_scribe.ldif + - homescribe + - ldapconf.conf +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: + - 05-scribe +files: + /etc/bareos/bareosfichiers.d/scribe.conf: + owner: root + group: root + mode: '0644' + /usr/share/ead2/backend/config/actions/actions_scribe.cfg: + owner: root + group: root + mode: '0644' + /usr/share/ead2/backend/config/perms/perm_scribe.ini: + owner: root + group: root + mode: '0644' + /usr/share/ead2/backend/config/roles/roles_scribe.ini: + owner: root + group: root + mode: '0644' + /usr/share/eole/config/grp_eole/DomainAdmins.xml: + owner: root + group: root + mode: '0644' + /usr/share/eole/config/grp_eole/_ListeUtilisateurs.xml: + owner: root + group: root + mode: '0644' + /usr/share/eole/config/grp_eole/_Machine.xml: + owner: root + group: root + mode: '0644' + /usr/share/eole/config/grp_eole/administratifs.xml: + owner: root + group: root + mode: '0644' + /usr/share/eole/config/grp_eole/eleves.xml: + owner: root + group: root + mode: '0644' + /usr/share/eole/config/grp_eole/professeurs.xml: + owner: root + group: root + mode: '0644' + /usr/share/zephir/monitor/configs/aaf.agent: + owner: root + group: root + mode: '0644' + /usr/share/zephir/monitor/configs/ldapscribe.agent: + owner: root + group: root + mode: '0644' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/templates/02_scribe.ldif b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/templates/02_scribe.ldif new file mode 100644 index 0000000000000000000000000000000000000000..09d0068a60ed76c66e4cd4e3bb4b86734f304f88 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/templates/02_scribe.ldif @@ -0,0 +1,93 @@ +#conf-scribe + +# groupe ppal de tous les profs +dn: cn=professeurs,ou=local,ou=groupes,ou=%%numero_etab,ou=%%nom_academie,ou=education,o=gouv,c=fr +objectClass: posixGroup +objectClass: sambaGroupMapping +objectClass: eolegroupe +objectClass: ENTGroupe +cn: professeurs +gidNumber: 10001 +description: Professeurs +%if %%is_defined('domaine_messagerie_etab') and %%domaine_messagerie_etab != '' +mail: professeurs@i-%%domaine_messagerie_etab +%end if +sambaSID: [sambasid]-21003 +sambaGroupType: 2 +type: Base +displayName: professeurs +LastUpdate: 20100101 + +# groupe ppal de tous les élèves +dn: cn=eleves,ou=local,ou=groupes,ou=%%numero_etab,ou=%%nom_academie,ou=education,o=gouv,c=fr +objectClass: posixGroup +objectClass: sambaGroupMapping +objectClass: eolegroupe +objectClass: ENTGroupe +cn: eleves +gidNumber: 10002 +description: Eleves +%if %%is_defined('domaine_messagerie_etab') and %%domaine_messagerie_etab != '' +mail: eleves@i-%%domaine_messagerie_etab +%end if +sambaSID: [sambasid]-21005 +sambaGroupType: 2 +type: Base +displayName: eleves +LastUpdate: 20100101 + +# groupe ppal de tous les administratifs +dn: cn=administratifs,ou=local,ou=groupes,ou=%%numero_etab,ou=%%nom_academie,ou=education,o=gouv,c=fr +objectClass: posixGroup +objectClass: sambaGroupMapping +objectClass: eolegroupe +objectClass: ENTGroupe +cn: administratifs +gidNumber: 10000 +description: Administratifs +%if %%is_defined('domaine_messagerie_etab') and %%domaine_messagerie_etab != '' +mail: administratifs@i-%%domaine_messagerie_etab +%end if +sambaSID: [sambasid]-21001 +sambaGroupType: 2 +type: Base +displayName: administratifs +LastUpdate: 20100101 + +# partage professeurs +dn: cn=smb://%%smb_netbios_name/professeurs,ou=local,ou=partages,ou=%%numero_etab,ou=%%nom_academie,ou=education,o=gouv,c=fr +objectClass: sambaFileShare +cn: smb://%%smb_netbios_name/professeurs +sambaShareName: professeurs +description: professeurs +%echo "sambaShareURI: \\\\" +%%smb_netbios_name\professeurs +sambaShareGroup: professeurs +sambaFilePath: /home/workgroups/professeurs +sambaShareDrive: P: +sambaShareModel: professeurs + +# partage commun +dn: cn=smb://%%smb_netbios_name/commun,ou=local,ou=partages,ou=%%numero_etab,ou=%%nom_academie,ou=education,o=gouv,c=fr +objectClass: sambaFileShare +cn: smb://%%smb_netbios_name/commun +sambaShareName: commun +description: commun +%echo "sambaShareURI: \\\\" +%%smb_netbios_name\commun +sambaShareGroup: DomainUsers +sambaFilePath: /home/workgroups/commun +sambaShareDrive: T: +sambaShareModel: commun + +# partage devoirs +dn: cn=smb://%%smb_netbios_name/devoirs,ou=local,ou=partages,ou=%%numero_etab,ou=%%nom_academie,ou=education,o=gouv,c=fr +objectClass: sambaFileShare +cn: smb://%%smb_netbios_name/devoirs +sambaShareName: devoirs +description: devoirs +%echo "sambaShareURI: \\\\" +%%smb_netbios_name\devoirs +sambaShareGroup: DomainAdmins +sambaFilePath: /home/workgroups/devoirs +sambaShareModel: devoirs diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/templates/homescribe b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/templates/homescribe new file mode 100644 index 0000000000000000000000000000000000000000..1b7321ac39f616c124bb41a091f35c58ab8da5ba --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/templates/homescribe @@ -0,0 +1 @@ +@{HOME}+=@{HOMEDIRS}/*/*/ @{HOMEDIRS}/*/*/perso/ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/templates/ldapconf.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/templates/ldapconf.conf new file mode 100644 index 0000000000000000000000000000000000000000..5189633a294be3a8ab9be71b6f297273de661c8e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribe/templates/ldapconf.conf @@ -0,0 +1,12 @@ +container_path_fichier=%%container_path_fichier +container_path_mail=%%container_path_mail +numero_etab=%%numero_etab +nom_academie=%%nom_academie +domaine_messagerie_etab=%%domaine_messagerie_etab +smb_netbios_name=%%smb_netbios_name +home_path=%%home_path +activer_groupware=%%getVar('activer_groupware','non') +ead_support_multietab=%%getVar('ead_support_multietab', 'non') +activer_ad=%%getVar('activer_ad', 'non') +smb_min_password_class=%%smb_min_password_class +smb_min_password_length=%%smb_min_password_length diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribehorus/dictionaries/29_scribehorus.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribehorus/dictionaries/29_scribehorus.xml new file mode 100644 index 0000000000000000000000000000000000000000..6aeee90f52633778b3c905f06ff31d6207020467 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribehorus/dictionaries/29_scribehorus.xml @@ -0,0 +1,52 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files/> + + <containers> + <container name='fichier'> + <!-- eoleldap.conf is provided by eole-client-annuaire --> + <file name='/etc/eole/eoleldap.conf' mkdir='True'/> + </container> + <container name='ftp'> + <file filelist='proftpd' name='/etc/proftpd/conf.d/scribehorus' source='proftpd_scribehorus'/> + </container> + <container name="annuaire"> + <file name='/var/lib/eole/01_fichier.ldif' mkdir='True'/> + </container> + </containers> + + <variables> + <family name='proftpd'> + <variable name='ftp_pam_ldap' redefine='True' hidden='True'/> + </family> + <family name='samba'> + <!-- MEDDE specific variables --> + <variable name='activer_winbind' redefine='True' hidden='True' /> + <variable name='smb_ldap_machine_suffix' redefine='True' hidden='True' /> + <variable name='smb_ldap_group_suffix' redefine='True' hidden='True' /> + <variable name='smb_ldap_replication_sleep' redefine='True' hidden='True' /> + <variable name='smb_ldap_page_size' redefine='True' hidden='True' /> + <variable name='smb_ldap_suffix' redefine='True' hidden='True' /> + <variable name='smb_ldap_admin_dn' redefine='True' hidden='True' /> + <variable name='smb_logon_home' redefine='True' hidden='True' /> + <variable name='smb_logon_script' redefine='True' hidden='True' /> + <variable name='smb_name_resolve_order' redefine='True' hidden='True' /> + <variable name='smb_domain_master' redefine='True' hidden='True' /> + <variable name='smb_printers_drivers_path' redefine='True' hidden='True' /> + <variable name='smb_control_print_access_with_acl' redefine='True' hidden='True' /> + <variable name='smb_nt_acl_support' redefine='True' hidden='True' /> + </family> + </variables> + + <constraints> + </constraints> + + <help> + <variable name='smb_netbios_name'>Nom DNS du contrôleur de domaine. En mode conteneur, il doit être différent de celui du serveur Linux EOLE.</variable> + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribehorus/files/usr/share/eole/annuaire/password_files/fichier.ini b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribehorus/files/usr/share/eole/annuaire/password_files/fichier.ini new file mode 100644 index 0000000000000000000000000000000000000000..ac2ae92642f825a048f2b14d1e482c7e22800f74 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribehorus/files/usr/share/eole/annuaire/password_files/fichier.ini @@ -0,0 +1,17 @@ +# fichiers nécessitant mot de passe ldap +# pour les services fichier + +[smbldap_bind.conf] +container='fichier' +path="/etc/smbldap-tools/" +string='masterPw="','slavePw="' +rights='root:root' +mode='0600' + +[eoleldap.conf] +container='fichier' +path='/etc/eole' +string='ldap_passwd = "' +rights='root:root' +mode='0600' + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribehorus/files/usr/share/eole/sbin/special_shares.sh b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribehorus/files/usr/share/eole/sbin/special_shares.sh new file mode 100644 index 0000000000000000000000000000000000000000..3f139eadc066b99d2b95b5b624a377efb37a9ec8 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribehorus/files/usr/share/eole/sbin/special_shares.sh @@ -0,0 +1,43 @@ +#!/bin/bash + +# Génération des fichiers scripts d'ouverture de session pour les lecteurs réseaux + +. /usr/lib/eole/eolead.sh +if [ -f /usr/share/eole/backend/creation-prof.py ] +then + # Ajout des lecteurs réservés sur Scribe + SMB_NETBIOS_NAME=$(CreoleGet smb_netbios_name) + AD_DOMAIN=$(CreoleGet ad_domain) + ALL_OS_SCRIPT_FILE="$CONTAINER_ROOTFS/home/sysvol/${AD_DOMAIN}/scripts/os/Vista.txt" + grep -q "lecteur,R:,\\\\\\\\${SMB_NETBIOS_NAME}\\\\icones\\$" $ALL_OS_SCRIPT_FILE > /dev/null 2>&1 + [ $? -ne 0 ] && echo "lecteur,R:,\\\\${SMB_NETBIOS_NAME}\\icones$" >> $ALL_OS_SCRIPT_FILE + + grep -q "lecteur,S:,\\\\\\\\${SMB_NETBIOS_NAME}\\\\groupes" $ALL_OS_SCRIPT_FILE > /dev/null 2>&1 + [ $? -ne 0 ] && echo "lecteur,S:,\\\\${SMB_NETBIOS_NAME}\\groupes" >> $ALL_OS_SCRIPT_FILE + + grep -q "lecteur,T:,\\\\\\\\${SMB_NETBIOS_NAME}\\\\commun" $ALL_OS_SCRIPT_FILE > /dev/null 2>&1 + [ $? -ne 0 ] && echo "lecteur,T:,\\\\${SMB_NETBIOS_NAME}\\commun" >> $ALL_OS_SCRIPT_FILE + + PROF_GROUP_SCRIPT_FILE="$CONTAINER_ROOTFS/home/sysvol/${AD_DOMAIN}/scripts/groups/professeurs.txt" + grep -q "lecteur,P:,\\\\\\\\${SMB_NETBIOS_NAME}\\\\professeurs" $PROF_GROUP_SCRIPT_FILE > /dev/null 2<&1 + [ $? -ne 0 ] && echo "lecteur,P:,\\\\${SMB_NETBIOS_NAME}\\professeurs" >> $PROF_GROUP_SCRIPT_FILE +else + # Ajout des lecteurs réservés sur Horus + for grp in "minedu" "applidos";do + # Add logon scripts for drives mapping on HorusAD + . /usr/lib/eole/eolead.sh + SMB_NETBIOS_NAME=$(CreoleGet smb_netbios_name) + AD_DOMAIN=$(CreoleGet ad_domain) + if [ "${grp}" == "applidos" ] + then + LECTEUR="F:" + else + LECTEUR="X:" + fi + SCRIPT_FILE="$CONTAINER_ROOTFS/home/sysvol/${AD_DOMAIN}/scripts/groups/${grp}.txt" + grep -q "lecteur,${LECTEUR},\\\\\\\\${SMB_NETBIOS_NAME}\\\\${grp}" $SCRIPT_FILE > /dev/null 2>&1 + [ $? -ne 0 ] && echo "lecteur,${LECTEUR},\\\\${SMB_NETBIOS_NAME}\\${grp}" >> $SCRIPT_FILE + done +fi + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribehorus/files/usr/share/eole/sbin/synchro_file.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribehorus/files/usr/share/eole/sbin/synchro_file.py new file mode 100644 index 0000000000000000000000000000000000000000..076ca34c5dec2b55d844d3bac614b4e63c1315dd --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribehorus/files/usr/share/eole/sbin/synchro_file.py @@ -0,0 +1,26 @@ +#! /usr/bin/env python +# -*- coding: utf-8 -*- +########################################################################### +# +# Eole NG - 2010 +# Copyright Pole de Competence Eole (Ministere Education - Academie Dijon) +# Licence CeCill http://www.cecill.info/licences/Licence_CeCILL_V2-fr.html +# eole@ac-dijon.fr +# +########################################################################### +""" +Génération des partages et du fichier smb.conf à partir de l'annuaire +""" +import sys +try: + # Scribe + from scribe.eoleshare import Share + share = Share() +except ImportError: + # Horus + from horus import backend as share + +if 'norestart' in sys.argv: + share.synchronize(False) +else: + share.synchronize(True) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribehorus/posttemplates/01-sid b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribehorus/posttemplates/01-sid new file mode 100644 index 0000000000000000000000000000000000000000..02a86dcee382fa849fa2b7dc3f83683c0ca51f6b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribehorus/posttemplates/01-sid @@ -0,0 +1,24 @@ +#!/bin/bash + +container_path_fichier=$(CreoleGet container_path_fichier) +container_path_annuaire=$(CreoleGet container_path_annuaire) + +SID_FILE="/var/lib/eole/config/sid.sav" + +if [ ! -f "${SID_FILE}" ] +then + . /usr/lib/eole/ihm.sh + EchoRouge "Impossible de récupérer le SID du domaine !" + exit 1 +fi +EOLE_SID_EOLE=$(cat "${SID_FILE}") +CreoleRun "net setlocalsid $EOLE_SID_EOLE" fichier + +# remplacement du template "[sambasid]" +# export to use $ENV in perl +export EOLE_SID_EOLE +for LDIF in `ls $container_path_annuaire/var/lib/eole/*.ldif`;do + perl -i -pe's@\[sambasid\]@$ENV{EOLE_SID_EOLE}@'g $LDIF +done +perl -i -pe's@\[sambasid\]@$ENV{EOLE_SID_EOLE}@'g $container_path_fichier/etc/smbldap-tools/smbldap.conf + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribehorus/posttemplates/04-fichier b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribehorus/posttemplates/04-fichier new file mode 100644 index 0000000000000000000000000000000000000000..5ba1bf0999cc2fc014a7ff15a6cdd49008e1d456 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribehorus/posttemplates/04-fichier @@ -0,0 +1,80 @@ +#!/bin/bash + +option=$1 +container_path_fichier=$(CreoleGet container_path_fichier) + +CHROOT='' +[ -n "$container_path_fichier" ] && CHROOT="chroot $container_path_fichier" + +$CHROOT id admin &>/dev/null +if [ $? -ne 0 ] +then + # rechargement de la configuration nscd (#5279 & #5206) + CreoleService -c fichier nscd restart + # pré-activation du shell (#4231) + if [ -n "$(CreoleGet interface_client_ltsp 2>/dev/null)" -o "$(CreoleGet activer_nfs 2>/dev/null)" = "oui" ];then + shell="-s" + else + shell="" + fi + # ajout utilisateur admin + if [ -f /usr/share/eole/backend/creation-prof.py ];then + # SCRIBE + /usr/share/eole/backend/creation-prof.py -u admin -m admin -p admin -f admin -M 'internet' -z 1 -q 0 -x 1 $shell + [ $? -ne 0 ] && [ "$(CreoleGet activer_ad non])" != 'oui' ] && exit 1 + else + # HORUS + python -c "from horus import backend; backend.add_user('admin', 'DomainUsers', ['DomainAdmins', 'PrintOperators'], shell='$shell')" + if [ -L /data ];then + python -c """from horus.backend import add_group, add_share +add_group('applidos') +add_group('minedu') +add_share('applidos', 'applidos', filepath='/data/applidos', sticky=True, sync=False, drive='F:') +add_share('minedu', 'minedu', filepath='/data/minedu', sticky=True, sync=False, drive='X:', model='minedu') +""" + fi + fi + if [ "$option" = "instance" ]; then + echo "" + echo "#######################################################" + echo "# Changement du mot de passe de l'utilisateur \"admin\" #" + echo "#######################################################" + res=1 + i=0 + while [ "$res" -ne 0 ] + do + i=$((i+1)) + [ $i = 10 ] && echo "erreur au changement de mot de passe de admin" && exit 1 + $CHROOT /usr/sbin/smbldap-passwd admin + res=$? + done + else + # le mot de passe doit être changé à la prochaine connexion + $CHROOT /usr/bin/net sam set pwdmustchangenow admin yes &>/dev/null + tput setaf 3; echo -n "L'utilisateur " + tput smso; echo -n admin; tput rmso + tput setaf 3; echo -n " a été re-créé avec le mot de passe " + tput setaf 8; echo "admin" + tput setaf 3; echo "Le système demandera son changement à la prochaine ouverture de session" + tput sgr0 + fi +fi + +echo -e "\n## Génération de la configuration Samba ##" +/usr/share/eole/sbin/synchro_file.py norestart + +# Application des acls sur minedu & applidos si nécessaire (#7576 #5279) +for grp in "minedu" "applidos";do + dir=/data/$grp + if [ -d $dir ];then + getfacl $dir 2>/dev/null | grep -v "^#" | grep -q $grp + if [ $? -ne 0 ];then + echo "Correction des ACL sur $dir" + chgrp $grp $dir + setfacl -PRm g:$grp:rwx $dir + setfacl -dPRm g:$grp:rwx $dir + fi + fi +done + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribehorus/preservices/00-save-sid b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribehorus/preservices/00-save-sid new file mode 100644 index 0000000000000000000000000000000000000000..b08a5ab279750d4c4a3af719f922d405857af8c2 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribehorus/preservices/00-save-sid @@ -0,0 +1,23 @@ +#!/bin/bash + +#Sauvegarde du SID au premier démarrage + +. /usr/lib/eole/ihm.sh + +SID_SAVE_FILE=/var/lib/eole/config/sid.sav + +if [ ! -f "${SID_SAVE_FILE}" ] +then + EOLE_SID=$(CreoleRun 'net getlocalsid' fichier 2>/dev/null| awk '{print $6}') + + if [ -n "${EOLE_SID}" ] + then + echo "Sauvegarde du SID ${EOLE_SID}" + echo "${EOLE_SID}" > "${SID_SAVE_FILE}" + else + EchoRouge "Impossible de récupérer le SID" + exit 1 + fi +else + echo "Utilisation du SID sauvegardé dans ${SID_SAVE_FILE}" +fi diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribehorus/pretemplates/00-scribehorus b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribehorus/pretemplates/00-scribehorus new file mode 100644 index 0000000000000000000000000000000000000000..c1df4cd50cdf52529efad76256b1651dd8e7ea03 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribehorus/pretemplates/00-scribehorus @@ -0,0 +1,24 @@ +#!/bin/bash + +# Création des répertoires communs +# aux serveur de fichier Scribe et Horus + +HOMEDIR=$(CreoleGet home_path) +WORKGROUPS="$HOMEDIR/workgroups" +NETLOGON="$HOMEDIR/netlogon" +ICONES="$NETLOGON/icones" +SCRIPTS="$NETLOGON/scripts" + +#répertoires de base +mkdir -p $WORKGROUPS +mkdir -p $ICONES +mkdir -p $NETLOGON/profil +mkdir -p $NETLOGON/profil.V2 + +#répertoires des scripts perso +for dir in "users" "groups" "machines" "os/Win2K" "os/WinXP" "os/Samba" "os/Vista" +do + /bin/mkdir -p $SCRIPTS/$dir +done +chmod a+rx $WORKGROUPS +chmod 755 $ICONES diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribehorus/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribehorus/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..c26aabf1834b3699bdde3e2d4e3da64a5cc8995d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribehorus/service.yml @@ -0,0 +1,43 @@ +format: '0.1' +name: eole-scribehorus +version: |- + 2.7.1-3 +description: |- + Configuration commune pour les modules Scribe et Horus + Dictionnaires, templates et scripts communs + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: [] +packages: [] +dictionaries: + - 29_scribehorus.xml +extra_dictionaries: {} +templates: + - 01_fichier.ldif + - proftpd_scribehorus + - smb-include_shares.conf +creole_funcs: [] +preservices: + - 00-save-sid +postservices: [] +pretemplates: + - 00-scribehorus +posttemplates: + - 01-sid + - 04-fichier +files: + /usr/share/eole/annuaire/password_files/fichier.ini: + owner: root + group: root + mode: '0644' + /usr/share/eole/sbin/special_shares.sh: + owner: root + group: root + mode: '0755' + /usr/share/eole/sbin/synchro_file.py: + owner: root + group: root + mode: '0755' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribehorus/templates/01_fichier.ldif b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribehorus/templates/01_fichier.ldif new file mode 100644 index 0000000000000000000000000000000000000000..8fcd3d5bb51661b72c4e97d09fea0116003c93ad --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribehorus/templates/01_fichier.ldif @@ -0,0 +1,178 @@ +#Attention, changement de la variable [sambasid] depuis posttemplate/01-fichier +dn: ou=education,%%ldap_base_dn +objectClass: organizationalUnit +ou: education +description: Education Nationale + +dn: ou=%%nom_academie,ou=education,%%ldap_base_dn +objectClass: organizationalUnit +ou: %%nom_academie + +dn: ou=%%numero_etab,ou=%%nom_academie,ou=education,%%ldap_base_dn +objectClass: organizationalUnit +ou: %%numero_etab + +# utilisateurs +dn: ou=utilisateurs,ou=%%numero_etab,ou=%%nom_academie,ou=education,o=gouv,c=fr +objectClass: organizationalUnit +ou: utilisateurs + +dn: ou=personnels,ou=utilisateurs,ou=%%numero_etab,ou=%%nom_academie,ou=education,o=gouv,c=fr +objectClass: organizationalUnit +ou: personnels + +dn: ou=local,ou=personnels,ou=utilisateurs,ou=%%numero_etab,ou=%%nom_academie,ou=education,o=gouv,c=fr +objectClass: organizationalUnit +ou: local + +dn: ou=distant,ou=personnels,ou=utilisateurs,ou=%%numero_etab,ou=%%nom_academie,ou=education,o=gouv,c=fr +objectClass: organizationalUnit +ou: distant + +dn: ou=eleves,ou=utilisateurs,ou=%%numero_etab,ou=%%nom_academie,ou=education,o=gouv,c=fr +objectClass: organizationalUnit +ou: eleves + +dn: ou=local,ou=eleves,ou=utilisateurs,ou=%%numero_etab,ou=%%nom_academie,ou=education,o=gouv,c=fr +objectClass: organizationalUnit +ou: local + +dn: ou=distant,ou=eleves,ou=utilisateurs,ou=%%numero_etab,ou=%%nom_academie,ou=education,o=gouv,c=fr +objectClass: organizationalUnit +ou: distant + +dn: ou=autres,ou=utilisateurs,ou=%%numero_etab,ou=%%nom_academie,ou=education,o=gouv,c=fr +objectClass: organizationalUnit +ou: autres + +dn: ou=local,ou=autres,ou=utilisateurs,ou=%%numero_etab,ou=%%nom_academie,ou=education,o=gouv,c=fr +objectClass: organizationalUnit +ou: local + +dn: ou=responsables,ou=utilisateurs,ou=%%numero_etab,ou=%%nom_academie,ou=education,o=gouv,c=fr +objectClass: organizationalUnit +ou: responsables + +dn: ou=local,ou=responsables,ou=utilisateurs,ou=%%numero_etab,ou=%%nom_academie,ou=education,o=gouv,c=fr +objectClass: organizationalUnit +ou: local + +# groupes +dn: ou=groupes,ou=%%numero_etab,ou=%%nom_academie,ou=education,o=gouv,c=fr +objectClass: organizationalUnit +ou: groupes + +dn: ou=local,ou=groupes,ou=%%numero_etab,ou=%%nom_academie,ou=education,o=gouv,c=fr +objectClass: organizationalUnit +ou: local + +dn: ou=distant,ou=groupes,ou=%%numero_etab,ou=%%nom_academie,ou=education,o=gouv,c=fr +objectClass: organizationalUnit +ou: distant + +# partages +dn: ou=partages,ou=%%numero_etab,ou=%%nom_academie,ou=education,o=gouv,c=fr +objectClass: organizationalUnit +ou: partages + +dn: ou=local,ou=partages,ou=%%numero_etab,ou=%%nom_academie,ou=education,o=gouv,c=fr +objectClass: organizationalUnit +ou: local + +dn: ou=distant,ou=partages,ou=%%numero_etab,ou=%%nom_academie,ou=education,o=gouv,c=fr +objectClass: organizationalUnit +ou: distant + +# ordinateurs +dn: ou=ressources,ou=%%numero_etab,ou=%%nom_academie,ou=education,o=gouv,c=fr +objectClass: organizationalUnit +ou: ressources + +dn: ou=ordinateurs,ou=ressources,ou=%%numero_etab,ou=%%nom_academie,ou=education,o=gouv,c=fr +objectClass: organizationalUnit +ou: ordinateurs + +################################### +# definition du domaine Samba +################################### +dn: sambaDomainName=%%smb_workgroup,o=gouv,c=fr +objectClass: sambaDomain +objectClass: sambaUnixIdPool +sambaDomainName: %%smb_workgroup +sambaSID: [sambasid] +gidNumber: 10003 +uidNumber: 10004 + +################################### +# definition des groupes speciaux +################################### + +# admininistrateurs des stations +dn: cn=DomainAdmins,ou=local,ou=groupes,ou=%%numero_etab,ou=%%nom_academie,ou=education,o=gouv,c=fr +objectClass: posixGroup +objectClass: sambaGroupMapping +cn: DomainAdmins +gidNumber: 512 +description: Administrateurs des stations +sambaSID: [sambasid]-512 +sambaGroupType: 2 + +# utilisateurs du domaine +dn: cn=DomainUsers,ou=local,ou=groupes,ou=%%numero_etab,ou=%%nom_academie,ou=education,o=gouv,c=fr +objectClass: posixGroup +objectClass: sambaGroupMapping +cn: DomainUsers +gidNumber: 513 +description: Utilisateurs du domaine +sambaSID: [sambasid]-513 +sambaGroupType: 2 + +# comptes machine du domaine +dn: cn=DomainComputers,ou=local,ou=groupes,ou=%%numero_etab,ou=%%nom_academie,ou=education,o=gouv,c=fr +objectClass: posixGroup +objectClass: sambaGroupMapping +cn: DomainComputers +gidNumber: 515 +description: ordinateurs du domaine +sambaSID: [sambasid]-515 +sambaGroupType: 2 + +# administrateurs des imprimantes (builtin) +dn: cn=PrintOperators,ou=local,ou=groupes,ou=%%numero_etab,ou=%%nom_academie,ou=education,o=gouv,c=fr +objectClass: posixGroup +objectClass: sambaGroupMapping +cn: PrintOperators +gidNumber: 550 +description: Administrateurs des imprimantes +sambaSID: S-1-5-32-550 +sambaGroupType: 5 + +################################### +# definition des partages spéciaux +################################### + +# partage icones$ +dn: cn=smb://%%smb_netbios_name/icones$,ou=local,ou=partages,ou=%%numero_etab,ou=%%nom_academie,ou=education,o=gouv,c=fr +objectClass: sambaFileShare +cn: smb://%%smb_netbios_name/icones$ +sambaShareName: icones$ +description: icones$ +%echo "sambaShareURI: \\\\" +%%smb_netbios_name\icones$ +sambaShareGroup: DomainUsers +sambaFilePath: /home/netlogon/icones +sambaShareDrive: R: +sambaShareModel: icones$ + +# partage groupes +dn: cn=smb://%%smb_netbios_name/groupes,ou=local,ou=partages,ou=%%numero_etab,ou=%%nom_academie,ou=education,o=gouv,c=fr +objectClass: sambaFileShare +cn: smb://%%smb_netbios_name/groupes +sambaShareName: groupes +description: groupes +%echo "sambaShareURI: \\\\" +%%smb_netbios_name\groupes +sambaShareGroup: DomainUsers +sambaFilePath: /home/workgroups/groupes +sambaShareDrive: S: +sambaShareModel: groupes diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribehorus/templates/proftpd_scribehorus b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribehorus/templates/proftpd_scribehorus new file mode 100644 index 0000000000000000000000000000000000000000..9d0dc866d100a70064e66012be89ace273275679 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribehorus/templates/proftpd_scribehorus @@ -0,0 +1,29 @@ +# Définition des accès FTP +# pour les modules Scribe et Horus +%if %%getVar('ftp_perso_ele', 'non') == 'oui' +<Directory /home/*/*> + <Limit ALL> + Order Allow,Deny + Allow ALL + </Limit> +</Directory> +%else +<Directory ~/.ftp> + <Limit ALL> + Order Allow,Deny + Allow ALL + </Limit> +</Directory> +<Directory ~/perso> + <Limit ALL> + Order Allow,Deny + Allow ALL + </Limit> +</Directory> +<Directory /home/workgroups> + <Limit ALL> + Order Allow,Deny + Allow ALL + </Limit> +</Directory> +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribehorus/templates/smb-include_shares.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribehorus/templates/smb-include_shares.conf new file mode 100644 index 0000000000000000000000000000000000000000..0690b066ccde5c3a7250e25658aee166a87cb27e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-scribehorus/templates/smb-include_shares.conf @@ -0,0 +1,60 @@ +[homes] + comment = Home Directories + read only = no + browseable = no + invalid users = nobody guest + inherit permissions = yes + inherit acls = yes + create mask = 0664 + directory mask = 0775 + valid users = %U + write list = %U + csc policy = disable + hide files = /desktop.ini/config_eole/ +%if %%getVar('smb_dos_attributes', 'no') == 'yes' + # Support des Attributs DOS pour les partages perso + store dos attributes = yes + map archive = yes + map hidden = yes + map readonly = yes + map system = yes +%end if + +[perso] + path = %H/perso + comment = disque personnel pour 98 et 95 + read only = no + browseable = no + invalid users = nobody guest + inherit permissions = yes + inherit acls = yes + create mask = 0664 + directory mask = 0775 + valid users = %U + write list = %U + hide files = /desktop.ini/config_eole/ + +[netlogon] + comment = Network Logon Service + path = /home/netlogon + browseable = no + read only = yes + valid users = %U + write list = %U + create mask = 0644 + directory mask = 0755 +%if %%activer_esu == 'oui' and %%is_defined('horus_frontend') + root preexec = python /usr/share/eole/client/dyn-logon-clieole.py --user="%U" --os="%a" --machine="%m" --ip="%I" --pid="%d" +%else + root preexec = python /usr/share/eole/fichier/dyn-logon.py --user="%U" --os="%a" --machine="%m" --ip="%I" --pid="%d" +%end if + +%if %%activer_esu == 'oui' +[esu] + comment = Esu + path = /home/esu + browseable = no + read only = no + create mask = 0644 + directory mask = 0755 +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/creole_funcs/get_etc_hosts.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/creole_funcs/get_etc_hosts.py new file mode 100644 index 0000000000000000000000000000000000000000..b103c2e9143054bdb8c43ce331e234d73ece9446 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/creole_funcs/get_etc_hosts.py @@ -0,0 +1,130 @@ +# -*- coding: utf-8 -*- + +"""Helper for /etc/hosts in LXC containers +""" + +from sys import stderr + +def _gen_crossed_hosts(fqdns, ips): + """Associate each data:`ip` to each data:`fqdn`. + + :param fqdns: FQDNS of hosts + :type fqdns: `list` of `str` + :param ips: IPs of hosts + :type ips: `list` of `str` + :return: structured view of /etc/hosts entries + :rtype: `list` of `dict` + + """ + hosts = [] + for ip in ips: + if ip is None: + continue + + for fqdn in fqdns: + if fqdn is None: + continue + + short_name = '' + if '.' in fqdn: + short_name = fqdn.split('.')[0] + + hosts.append({u'hostname': short_name, + u'fqdn': fqdn, + u'ip': ip}) + + return hosts + + +def _gen_hosts(fqdns, ips): + """Associate one :data:`ip` per :data:`fqdn`. + + :param fqdns: FQDNS of hosts + :type fqdns: `list` of `str` + :param ips: IPs of hosts + :type ips: `list` of `str` + :return: structured view of /etc/hosts entries + :rtype: `list` of `dict` + + """ + hosts = [] + for idx, fqdn in enumerate(fqdns): + short_name = '' + + if '.' in fqdn: + short_name = fqdn.split('.')[0] + + hosts.append({u'fqdn': fqdn, + u'hostname': short_name, + u'ip':ips[idx]}) + + return hosts + + +def get_etc_hosts(container, local_domain): + """Get /etc/hosts informations. + + :param container: container informations + :type container: `dict` + :param local_domain: local domain name + :type local_domain: `str` + :return: hosts descriptions + :rtype: `list` of `dict` + + """ + hosts = [] + # Name for all interfaces IPs + ifs = [] + for interface in container[u'interfaces']: + if interface.get(u'ip', None) is None: + continue + ifs.append({u'hostname': container[u'name'], + u'fqdn': u'{0}.{1}'.format(container[u'name'], + local_domain), + u'ip': interface[u'ip']}) + + if len(ifs) > 0: + ifs[0].update({u'comment': u'# Container interface'}) + + hosts.extend(ifs) + + for host in container[u'hosts']: + host_list = [] + if not host.get(u'activate', False): + continue + + fqdns = host.get(u'name', None) + ips = host.get(u'ip', None) + + if fqdns is None or ips is None: + continue + + # Make sure to have lists + if not isinstance(fqdns, list): + fqdns = [fqdns] + + if not isinstance(ips, list): + ips = [ips] + + if host.get(u'crossed', True): + host_list = _gen_crossed_hosts(fqdns, ips) + else: + if len(fqdns) != len(ips): + msg = u"Warning: use crossed associtation: host name list length missmatch IP list length in container {0}:\n" + stderr.write(msg.format(host[u'container'])) + stderr.write("Host names: {0}\n".format(fqdns)) + stderr.write("Host IPs: {0}\n".format(ips)) + host_list = _gen_crossed_hosts(fqdns, ips) + else: + host_list = _gen_hosts(fqdns, ips) + + if len(host_list) > 0 and host.get(u'comment', None) is not None: + # Add the comment after an empty line + host_list[0].update({u'comment': u'\n# {0}'.format(host[u'comment'])}) + elif len(host_list) > 0: + # Separate blocs with one empty line + host_list[0].update({u'comment': u''}) + + hosts.extend(host_list) + + return hosts diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/creole_funcs/master_network_interfaces.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/creole_funcs/master_network_interfaces.py new file mode 100644 index 0000000000000000000000000000000000000000..ed391fde15d6181c72299acdd354edfacfc8d2a3 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/creole_funcs/master_network_interfaces.py @@ -0,0 +1,292 @@ +# -*- coding: utf-8 -*- + +"""Helper for /etc/network/interfaces on the master +""" + +def _gen_mtu_option(name, interface, ctx): + """Generate the MTU option depending on the method + + Only the ``static`` interface method accept the ``mtu`` option, + other method requires a ``pre-up`` command. + + :param name: name of the interface + :type name: `str` + :param interface: interface description + :type interface: `dict` + + """ + mtu = ctx.getVar(u'valeur_mtu_{0}'.format(name), None) + if mtu is not None: + if interface[u'method'] == 'statique': + interface[u'mtu'] = mtu + else: + interface['options'].append('pre-up ip link set $IFACE mtu {0}'.format(mtu)) + + return interface + + +def _gen_bonding_option(name, interface, ctx): + """Generate the bonding options depending on the bonding activation and the mode + + :param name: name of the interface + :type name: `str` + :param interface: interface description + :type interface: `dict` + + """ + if interface[u'activer_bonding'] == 'oui': + bonding_mode = ctx.getVar(u'bonding_mode_{0}'.format(name)) + interface[u'bonding_mode'] = bonding_mode + interface[u'bonding_ifs'] = ctx.getVar(u'nom_carte_{0}'.format(name)) + if bonding_mode == 'active-backup': + slaves_list = 'none' + interface[u'bond_primary'] = interface[u'bonding_ifs'][0] + else: + slaves_list = ' '.join(interface[u'bonding_ifs']) + interface[u'bond_primary'] = ' '.join(interface[u'bonding_ifs']) + interface['options'].append('bond-slaves ' + slaves_list) + interface['options'].append('bond-mode ' + interface[u'bonding_mode']) + interface['options'].append('bond-miimon ' + str(ctx.getVar(u'bonding_miimon_{0}'.format(name)))) + interface['options'].append('bond-downdelay ' + str(ctx.getVar(u'bonding_downdelay_{0}'.format(name)))) + interface['options'].append('bond-updelay ' + str(ctx.getVar(u'bonding_updelay_{0}'.format(name)))) + + return interface + + +def _gen_unmanage_interface(name, method, ctx, force_proxyarp=False): + """Generate unmanage ethernet interfaces + + :param name: name of the interface + :type name: `str` + :param method: configuration method like `statique` or `dhcp` + :type method: `str` + :param ctx: cheetah template context + :type ctx: + :param force_proxyarp: to force proxy_arp to this interface + :type: `bool` + :return: interface description + :rtype: `dict` + + """ + nom_zone = ctx.getVar(u'nom_zone_{0}'.format(name)) + interface = {u'name': nom_zone, + u'proto': u'inet', + u'method': method, + u'activer_bonding': ctx.getVar(u'activer_bonding_{0}'.format(name), None), + u'options': []} + + interface = _gen_mtu_option(name, interface, ctx) + interface = _gen_bonding_option(name, interface, ctx) + + interface['options'].append('pre-up ip link set $IFACE up') + interface['options'].append('post-down ip link set $IFACE down') + + link_speed = ctx.getVar(u'debit_carte_{0}'.format(name), None) + if link_speed: + interface['options'].append('pre-up ethtool -s {0} {1}'.format(nom_zone, link_speed)) + if force_proxyarp: + interface['options'].append('up /sbin/sysctl -w net.ipv4.conf.{0}.proxy_arp=1'.format(nom_zone)) + + return interface + + +def _gen_physical_interface(name, method, ctx): + """Generate physical ethernet interfaces + + :param name: name of the interface + :type name: `str` + :param method: configuration method like `statique` or `dhcp` + :type method: `str` + :param ctx: cheetah template context + :type ctx: + :return: interface description + :rtype: `dict` + + """ + nom_zone = ctx.getVar(u'nom_zone_{0}'.format(name)) + interface = {u'name': nom_zone, + u'proto': u'inet', + u'method': method, + u'ip': ctx.getVar(u'adresse_ip_{0}'.format(name), None), + u'mask': ctx.getVar(u'adresse_netmask_{0}'.format(name), None), + u'bcast': ctx.getVar(u'adresse_broadcast_{0}'.format(name), None), + u'network': ctx.getVar(u'adresse_network_{0}'.format(name), None), + u'activer_bonding': ctx.getVar(u'activer_bonding_{0}'.format(name), None), + u'options': []} + + if method == 'manual': + interface['options'].append('pre-up ip link set $IFACE up') + interface['options'].append('post-down ip link set $IFACE down') + + interface = _gen_mtu_option(name, interface, ctx) + interface = _gen_bonding_option(name, interface, ctx) + + if ctx.getVar(u'interface_gw', None) == nom_zone: + interface.update({u'gw': ctx.getVar('adresse_ip_gw', None)}) + + link_speed = ctx.getVar(u'debit_carte_{0}'.format(name), None) + if link_speed: + interface['options'].append('pre-up ethtool -s {0} {1}'.format(nom_zone, link_speed)) + + return interface + + +def _gen_pppoe_interface(): + """Generate the dsl-provider pppoe interface + + :return: interface description + :rtype: `dict` + + """ + interface = {u'name': 'dsl-provider', + u'proto': u'inet', + u'method': 'ppp', + u'options': ['provider dsl-provider']} + + return interface + + +def _gen_bridge_interface(name, method, ctx): + """Generate a bridge interface + + :param name: name of the physical interface part of the bridge + :type name: `str` + :param method: configuration method like `statique` or `dhcp` + :type method: `str` + :param ctx: cheetah template context + :type ctx: + :return: interface description + :rtype: `dict` + + """ + nom_carte = ctx.getVar(u'nom_carte_{0}'.format(name)) + nom_zone = ctx.getVar(u'nom_zone_{0}'.format(name)) + bridge_options = ['bridge_ports {0}'.format(nom_carte), + 'bridge_fd 2', + 'bridge_hello 2', + 'bridge_maxage 12', + 'bridge_stp off'] + + interface = {u'name': nom_zone, + u'proto': u'inet', + u'method': method, + u'ip': ctx.getVar(u'adresse_ip_{0}'.format(name), None), + u'mask': ctx.getVar(u'adresse_netmask_{0}'.format(name), None), + u'bcast': ctx.getVar(u'adresse_broadcast_{0}'.format(name), None), + u'network': ctx.getVar(u'adresse_network_{0}'.format(name), None), + u'options': bridge_options} + + interface = _gen_mtu_option(name, interface, ctx) + + return interface + + +def _gen_alias_interfaces(name, ctx): + """Generate an alias interface + + :param name: name of the interface + :type name: `str` + :param ctx: cheetah template context + :type ctx: + :return: interface description + :rtype: `dict` + + """ + interfaces = [] + nom_zone = ctx.getVar(u'nom_zone_{0}'.format(name)) + master_name = u'alias_ip_{0}'.format(name) + aliases = ctx.getVar(master_name) + idx = 1 + for alias in aliases: + interface = {u'name': u'{0}:{1}'.format(nom_zone, idx), + u'proto': u'inet', + u'method': u'statique', + u'ip': str(alias), + u'mask': getattr(alias, u'alias_netmask_{0}'.format(name)), + u'bcast': getattr(alias, u'alias_broadcast_{0}'.format(name)), + u'network': getattr(alias, u'alias_network_{0}'.format(name)), + u'gw': getattr(alias, u'alias_gw_{0}'.format(name), None), + u'activer_bonding': u'non', + u'options': []} + + interfaces.append(interface) + idx += 1 + + return interfaces + +def _gen_vlan_interfaces(name, ctx): + """Generate VLAN interface + + :param name: name of the interface + :type name: `str` + :param ctx: cheetah template context + :type ctx: + :return: interface description + :rtype: `dict` + + """ + interfaces = [] + nom_zone = ctx.getVar(u'nom_zone_{0}'.format(name)) + master_name = u'vlan_id_{0}'.format(name) + vlans = ctx.getVar(master_name) + for vlan in vlans: + interface = {u'name': u'{0}.{1}'.format(nom_zone, vlan), + u'proto': u'inet', + u'method': u'statique', + u'ip': getattr(vlan, u'vlan_ip_{0}'.format(name)), + u'mask': getattr(vlan, u'vlan_netmask_{0}'.format(name)), + u'bcast': getattr(vlan, u'vlan_broadcast_{0}'.format(name)), + u'network': getattr(vlan, u'vlan_network_{0}'.format(name)), + u'gw': getattr(vlan, u'vlan_gw_{0}'.format(name), None), + u'activer_bonding': u'non', + u'options': ['vlan_raw_device {0}'.format(nom_zone)]} + + interfaces.append(interface) + + return interfaces + + +def get_master_interfaces(ctx): + """Get interfaces for master + + :param ctx: cheetah template context + :type ctx: + :return: interface descriptions + :rtype: `list` of `dict` + + """ + interfaces = [] + n_interfaces = int(ctx.getVar(u'nombre_interfaces')) + for idx in range(0, n_interfaces): + interface_name = u'eth{0}'.format(idx) + # Non regular attribut name + interface_method = ctx.getVar(u'{0}_method'.format(interface_name), u'manuel') + if ctx.getVar('zone_is_bridge_{0}'.format(interface_name), 'non') == 'oui': + #if interface is in a bridge + interfaces.append(_gen_unmanage_interface(interface_name, + 'manual', + ctx, True)) + interfaces.append(_gen_bridge_interface(interface_name, + interface_method, + ctx)) + elif interface_method == u'manuel': + interfaces.append(_gen_unmanage_interface(interface_name, + 'manual', + ctx)) + elif interface_method == u'pppoe': + interfaces.append(_gen_unmanage_interface(interface_name, + 'manual', + ctx)) + interfaces.append(_gen_pppoe_interface()) + else: + interfaces.append(_gen_physical_interface(interface_name, + interface_method, + ctx)) + if ctx.getVar(u'alias_{0}'.format(interface_name), u'non') == u'oui': + interfaces.extend(_gen_alias_interfaces(interface_name, ctx)) + if ctx.getVar(u'vlan_{0}'.format(interface_name), u'non') == u'oui': + interfaces.extend(_gen_vlan_interfaces(interface_name, ctx)) + + # Restart rsyslog on last interface + interfaces[-1]['options'].append('up service rsyslog restart') + return interfaces diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/creole_funcs/partitioning_utils.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/creole_funcs/partitioning_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..7fdcf9c6aff7d409a110518fbe7dec2fda207c79 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/creole_funcs/partitioning_utils.py @@ -0,0 +1,125 @@ +# -*- coding: utf-8 -*- + +"""Fonctions relatives à l’ajustement du partitionnement au moment de l’instance +""" +from warnings import warn_explicit +from tiramisu.error import ValueWarning + + +def calc_free_PE(mode_zephir='non'): + if mode_zephir == 'non': + from pyeole.process import system_out + try: + cmd = ['vgs', '-o', 'vg_free_count', '--noheadings'] + _, vg_free_pe, _ = system_out(cmd) + return int(vg_free_pe) + except (OSError, ValueError): + return 0 + else: + return 0 + + +def check_free_space(value, values): + if None not in values: + if sum(values) > 100: + raise ValueError(u'Percentage sum exceeds 100: {}'.format(sum(values))) + + +def is_lv_name(data, mode_zephir='non'): + if mode_zephir == 'non': + from pyeole.process import system_out + cmd = ['lvs', '-o', 'lv_name', '--noheadings'] + _, lv_names, _ = system_out(cmd) + lv_names = lv_names.split() + if data not in lv_names: + raise ValueError(u'Les lv dispos sont: {}'.format(', '.join(lv_names))) + else: + warn_explicit(ValueWarning(u'Impossible de vérifier l’existence du volume logique en mode Zéphir', None), + ValueWarning, + 'is_lv_name', + 0) + + +def is_fs_type(data, mode_zephir='non'): + if mode_zephir == 'non': + import re + from pyeole.process import system_out + mkfs_cmds = re.compile(r'mkfs\.(.*)') + cmd = ['ls', '/sbin/'] + _, cmds, _ = system_out(cmd) + fs_types = mkfs_cmds.findall(cmds) + if data not in fs_types: + raise ValueError(u'Les fs supportés sont : {}'.format(', '.join(fs_types))) + else: + warn_explicit(ValueWarning(u'Impossible de vérifier si le système de fichiers est supporté en mode Zéphir', None), + ValueWarning, + 'is_fs_type', + 0) + + +def enable_lv_creation(mode_zephir='non'): + if mode_zephir == 'non': + import os + minimum_PE = 100 + free_PE = calc_free_PE() + is_instanciated = os.path.isfile('/etc/eole/.instance') + if free_PE < minimum_PE or is_instanciated: + return u'non' + elif free_PE > minimum_PE and not is_instanciated: + return u'oui' + else: + warn_explicit(ValueWarning(u'Impossible de vérifier l’existence du volume logique en mode Zéphir', None), + ValueWarning, + 'enable_lv_creation', + 0) + return u'oui' + +def get_lv_names(mode_zephir='non'): + """List all logical volume names + + Exclude swap since `lvextend` can not handle it. + + Do not execute on Zéphir. + + :param mode_zephir `oui/non`: check if we are on Zéphir + :return: the list of logical volume names + + """ + if mode_zephir == 'oui': + warn_explicit(ValueWarning(u'Impossible de vérifier l’existence du volume logique en mode Zéphir', None), + ValueWarning, + 'get_lv_name', + 0) + + from pyeole.process import system_out + from sys import version_info + + stdout = '' + try: + cmd = ['lvs', '-o', 'name', '--noheading', '--sort', 'lv_minor'] + _, stdout, _ = system_out(cmd) + except OSError: + return u'0' + + if version_info[0] < 3: + stdout = stdout.decode('utf-8') + lv_names = stdout.split() + return [ name for name in lv_names if not name.startswith('swap') ] + + +def check_partitioning_auto_extend(created_lv_names=None, expected_lv_names=None, mode_zephir='non'): + """Check if we can make the EOLE automatic standard extention + + We check if the list of the actual logical volumes match the expected one. + + :param created_lv_names `str`: list of logical volume names created on disk + :param expected_lv_names `str`: list of logical volume names expected for automatic extension + :return: `oui` if we can automatically extend the logical volumes, `non` otherwise + + """ + if created_lv_names is None or expected_lv_names is None: + return 'non' + elif created_lv_names == expected_lv_names: + return 'oui' + else: + return 'non' diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/dictionaries/00_common.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/dictionaries/00_common.xml new file mode 100644 index 0000000000000000000000000000000000000000..a1221f0ecdafa2aee8625476d3401775cb56877d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/dictionaries/00_common.xml @@ -0,0 +1,307 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + <service>netplan-apply</service> + <service>networkd-dispatcher</service> + <service>systemd-networkd</service> + <service>cron</service> + <service servicelist='systemd-resolved'>systemd-resolved</service> + <service servicelist='rngd'>rng-tools</service> + <file name='/etc/eole/release'/> + <!-- Lock file, must not be removed --> + <file name='/etc/eole/.VirtDisabled.lock' rm='False' source='container.lockfile' filelist='container_disabled' /> + <file name='/etc/timezone'/> + <file name='/etc/netplan/00-eole.yaml'/> + <file name='/etc/systemd/resolved.conf'/> + <file name='/etc/resolv.conf' filelist='resolvconf'/> + <file name='/etc/hostname'/> + <file name='/etc/hosts'/> + <file name='/etc/sysctl.conf'/> + <file name='/etc/sudoers' mode="0440"/> + <file name='/etc/vim/vimrc'/> + <file name='/etc/profile.d/eolerc.sh' mode='0755'/> + <file name='/etc/ssh/sshd_config'/> + <file name='/etc/ssh/ssh_config'/> + <file name='/etc/pam.d/common-password'/> + <file name='/etc/DIR_COLORS'/> + <file name='/etc/pythonrc'/> + <file name='/etc/apt/apt.conf.d/02eoleproxy'/> + <file filelist='rngd' name='/etc/default/rng-tools'/> + <file name='/etc/issue'/> + <file name='/etc/update-motd.d/00-header' mode='0755'/> + <file name='/etc/update-motd.d/10-help-text' mode='0755'/> + <file name='/etc/network/if-up.d/openssh-server' mode='0755'/> + <file name='/etc/sysctl.d/10-console-messages.conf'/> + <file name='/etc/cron.d/schedule' source='cron-schedule' filelist='cronschedule' rm="True"/> + <file name='/etc/logrotate.d/00-eole-options' source='logrotate_global_options'/> + <file name='/etc/eole/server.cfg'/> + <!-- fix 8001 (voir pour mettre dans un autre dico --> + <file name='/var/lib/eole/config/zstats.cfg'/> + + <!-- Workaround https://dev-eole.ac-dijon.fr/issues/21207 --> + <file name='/usr/sbin/policy-rc.d' mode='0755' /> + </files> + + <containers> + <all> + <file name='/etc/update-motd.d/00-header' mode='0755'/> + <file name='/etc/update-motd.d/10-help-text' mode='0755'/> + <file name='/etc/apt/apt.conf.d/02eoleproxy' instance_mode='when_container' /> + + <!-- Workaround https://dev-eole.ac-dijon.fr/issues/21207 --> + <file name='/usr/sbin/policy-rc.d' mode='0755' instance_mode='when_container' /> + </all> + </containers> + + <variables> + <family name='général' icon='wrench'> + <variable name='eole_module' type='string' description="Nom du module EOLE" hidden="True"> + <value>eolebase</value> + </variable> + <variable name='ubuntu_version' type='string' description="Nom de version de la distribution Ubuntu" hidden="True" /> + <variable name='eole_version' type='string' description="Numéro de version majeure du module EOLE" hidden="True" /> + <variable name='eole_release' type='string' description="Numéro de version fonctionnelle du module EOLE" hidden="True" /> + <variable name='mode_conteneur_actif' type='oui/non' description="Le serveur est en mode conteneur" hidden="True"> + <value>non</value> + </variable> + <variable name='module_instancie' type='oui/non' description="Le serveur a été instancié" /> + <variable name='numero_etab' type='string' description="Identifiant de l'établissement (exemple UAI)" auto_freeze='True' mandatory='True'/> + <variable name='libelle_etab' type='string' description="Nom de l'établissement" mandatory='True'/> + <variable name='nom_machine' type='hostname_strict' description='Nom de la machine' mandatory='True' mode='basic'/> + <variable name='nom_domaine_local' type='domain' description='Nom DNS du réseau local' mandatory='True' mode='basic'/> + <variable name='nom_domaine_machine' type='domain_strict' description="Nom DNS associé à l'interface 0" /> + <variable name='nom_academie' type='hostname_strict' description='Nom de domaine académique (ex : ac-dijon)' mandatory='True'/> + <variable name='suffixe_domaine_academique' type='hostname_strict' description='Suffixe du nom de domaine académique' mandatory='True' mode='basic'> + <value>fr</value> + </variable> + <variable name='nombre_interfaces' type='string' description="Nombre d'interfaces à activer"/> + <variable name='activer_proxy_client' type='oui/non' description="Utiliser un serveur mandataire (proxy) pour accéder à Internet" mode='basic'> + <value>non</value> + </variable> + <variable name='proxy_client_adresse' type='domain' description='Nom ou adresse IP du serveur proxy' mandatory='True'/> + <variable name='proxy_client_port' type='port' description='Port du serveur proxy' mandatory='True' mode='basic'> + <value>3128</value> + </variable> + <variable name='adresse_ip_dns' type='ip' description='Adresse IP du serveur DNS' multi='True' mode='basic'/> + <variable name='adresse_ip_dns_du_dhcp' type='ip' description='Adresse IP du serveur DNS fourni par un serveur DHCP' multi='True' /> + <variable name='test_adresse_ip_dns' type='oui/non' description='Vérifie si des adresses IP DNS sont déclarées.' /> + <variable name='test_activer_resolvconf_template' type='oui/non' description='Vérifie s’il faut activer la templatisation du fichier /etc/resolv.conf' /> + <variable name='time_zone' type='string' description="Fuseau horaire du serveur" mode='basic'> + <value>Europe/Paris</value> + </variable> + </family> + + <!-- déclaration pour fixer l'ordre d'affichage --> + <family name='services' icon='cogs'/> + <family name='firewall' icon='fire'/> + + <family name='système' mode='expert' icon='desktop'> + <variable name='activer_bash_completion' type='oui/non' description="Activer l'auto-complétion étendue sur la console (touche TAB)"> + <value>oui</value> + </variable> + <variable name='bash_tmout' type='number' description="Temps d'inactivité avant déconnexion bash (0 pour désactiver)"> + <value>900</value> + </variable> + <variable name='activer_ctrl_alt_suppr' type='oui/non' description="Activer le reboot sur ctrl-alt-suppr"> + <value>oui</value> + </variable> + <variable name='vim_background' type='string' description="Nuance du fond d'écran dans Vim"> + <value>dark</value> + </variable> + <variable name='vm_swappiness' type='number' description="Poids relatif de l'utilisation de la swap par rapport à la mémoire vive"> + <value>60</value> + </variable> + <variable name='activer_rngd' type='oui/non' description="Activer le service de génération de nombres aléatoires rng-tools"> + <value>non</value> + </variable> + <variable name='check_passwd' type='oui/non' description="Vérifier la complexité des mots de passe"> + <value>oui</value> + </variable> + <variable name='check_passwd_min_len_one_type' type='number' description="Taille minimum du mot de passe utilisant une seule classe de caractères"> + <value>0</value> + </variable> + <variable name='check_passwd_min_len_two_type' type='number' description="Taille minimum du mot de passe utilisant deux classes de caractères"> + <value>9</value> + </variable> + <variable name='check_passwd_min_len_three_type' type='number' description="Taille minimum du mot de passe utilisant trois classes de caractères"> + <value>8</value> + </variable> + <variable name='check_passwd_min_len_four_type' type='number' description="Taille minimum du mot de passe utilisant quatre classes de caractères"> + <value>8</value> + </variable> + <variable name='check_passwd_max' type='number' description="Taille maximale du mot de passe "> + <value>40</value> + </variable> + <variable name="cdrom_devices" type="string" multi="True" description="Liste des lecteurs de CDROM présent sur le serveur"/> + <variable name="cdrom_minor" type="number" description="Minor du device CDROM présent sur le serveur"/> + <variable name="cdrom_major" type="number" description="Major du device CDROM présent sur le serveur"/> + </family> + + <family name='sshd' mode='expert' icon='shell'> + <variable name='ssh_permit_root' type='oui/non' description="Autoriser les connexions SSH pour l'utilisateur root" > + <value>oui</value> + </variable> + <variable name='ssh_allow_passwd' type='oui/non' description="Autoriser les connexions SSH par mot de passe (si non clef RSA obligatoire)" > + <value>oui</value> + </variable> + <variable name='ssh_allow_groups' type='unix_user' description="Autoriser les connexions SSH pour les groupes" multi='True' /> + <variable name='ssh_maxstartups' type='string' description="Critères à appliquer pour le blocage des tentatives de connexions par force brute"> + <value>5:30:10</value> + </variable> + </family> + + <separators> + <!-- général --> + <separator name='numero_etab'>Établissement</separator> + <separator name='nom_machine'>Nom DNS du serveur</separator> + <separator name='nom_academie'>Paramètres réseau globaux</separator> + <!-- sshd --> + <separator name='ssh_permit_root'>Configuration SSH</separator> + <!-- systeme --> + <separator name='activer_bash_completion'>Console</separator> + <separator name='vm_swappiness'>Optimisations système</separator> + <separator name='check_passwd'>Validation des mots de passe des utilisateurs système (root, eole, ...)</separator> + </separators> + + </variables> + + <constraints> + <auto name='concat' target='nom_domaine_machine'> + <param type='eole'>nom_machine</param> + <param>.</param> + <param type='eole'>nom_domaine_local</param> + </auto> + <auto name='get_version' target='ubuntu_version'> + <param>UBUNTU_VERSION</param> + </auto> + <auto name='get_version' target='eole_version'> + <param>EOLE_VERSION</param> + </auto> + <auto name='get_version' target='eole_release'> + <param>EOLE_RELEASE</param> + </auto> + <auto name='list_cdrom_devices' target='cdrom_devices'> + <param type='eole' optional='True'>mode_zephir</param> + </auto> + <auto name='cdrom_minormajor' target='cdrom_minor'> + <param>minor</param> + <param type='eole'>cdrom_devices</param> + </auto> + <auto name='cdrom_minormajor' target='cdrom_major'> + <param>major</param> + <param type='eole'>cdrom_devices</param> + </auto> + <group master="cdrom_devices"> + <slave>cdrom_minor</slave> + <slave>cdrom_major</slave> + </group> + <condition name='disabled_if_in' source='activer_proxy_client'> + <param>non</param> + <target type='variable'>proxy_client_adresse</target> + <target type='variable'>proxy_client_port</target> + </condition> + + <fill name='calc_val' target='nom_machine'> + <param type='eole' name='valeur'>eole_module</param> + </fill> + + <auto name='is_instanciate' target='module_instancie'> + </auto> + + <condition name='disabled_if_in' source='mode_conteneur_actif'> + <param>oui</param> + <target type='filelist'>container_disabled</target> + </condition> + <check name="valid_enum" target="nombre_interfaces"> + <param>['1','2','3','4','5']</param> + </check> + <check name="valid_enum" target="vim_background"> + <param>['dark','light']</param> + </check> + + <check name="valid_enum" target="time_zone"> + <param>["Africa/Asmara", "Africa/Cairo", "Africa/Tripoli", "America/Adak", "America/Anchorage", "America/Argentina/Buenos_Aires", "America/Argentina/Catamarca", "America/Argentina/Cordoba", "America/Argentina/Jujuy", "America/Argentina/Mendoza", "America/Cayenne", "America/Chicago", "America/Denver", "America/Detroit", "America/Edmonton", "America/Guadeloupe", "America/Halifax", "America/Havana", "America/Indianapolis", "America/Jamaica", "America/Los_Angeles", "America/Manaus", "America/Martinique", "America/Mazatlan", "America/Mexico_City", "America/Miquelon", "America/New_York", "America/Noronha", "America/Phoenix", "America/Regina", "America/Rio_Branco", "America/Santiago", "America/Sao_Paulo", "America/St_Johns", "America/Tijuana", "America/Toronto", "America/Vancouver", "America/Whitehorse", "America/Winnipeg", "Antarctica/McMurdo", "Asia/Ashgabat", "Asia/Chongqing", "Asia/Dhaka", "Asia/Ho_Chi_Minh", "Asia/Hong_Kong", "Asia/Kathmandu", "Asia/Kolkata", "Asia/Macau", "Asia/Riyadh", "Asia/Seoul", "Asia/Shanghai", "Asia/Singapore", "Asia/Taipei", "Asia/Tehran", "Asia/Tel_Aviv", "Asia/Thimphu", "Asia/Tokyo", "Asia/Ulaanbaatar", "Atlantic/Faroe", "Atlantic/Reykjavik", "Australia/Adelaide", "Australia/Brisbane", "Australia/Darwin", "Australia/Hobart", "Australia/Lord_Howe", "Australia/Melbourne", "Australia/Perth", "Australia/Sydney", "Europe/Dublin", "Europe/Helsinki", "Europe/Istanbul", "Europe/Lisbon", "Europe/London", "Europe/Moscow", "Europe/Paris", "Europe/Warsaw", "Indian/Mayotte", "Indian/Reunion", "Pacific/Auckland", "Pacific/Chatham", "Pacific/Easter", "Pacific/Gambier", "Pacific/Honolulu", "Pacific/Kwajalein", "Pacific/Noumea", "Pacific/Marquesas", "Pacific/Pago_Pago", "Pacific/Tahiti", "Pacific/Wallis"]</param> + <!--Pacific : Apia, Auckland, Chatham, Chuuk, Easter, Efate, Enderbury, Fakaofo, Fiji, Funafuti, Galapagos, Gambier, Guadalcanal, Guam, Honolulu, Johnston, Kiritimati, Kosrae, Kwajalein, Majuro, Marquesas, Midway, Nauru, Niue, Norfolk, Pago_Pago, Palau, Pitcairn, Pohnpei, Ponape, Port_Moresby, Rarotonga, Saipan, Samoa, Tahiti, Tarawa, Tongatapu, Truk, Wake, Yap + Liste complete : /var/lib/dpkg/info/tzdata.templates et /var/lib/dpkg/info/tzdata.config--> + <param name="checkval">False</param> + </check> + + <check name='valid_entier' target='vm_swappiness'> + <param name="mini">0</param> + <param name="maxi">100</param> + </check> + + <condition name='disabled_if_in' source='activer_rngd'> + <param>non</param> + <target type='servicelist'>rngd</target> + <target type='filelist'>rngd</target> + </condition> + + <condition name='disabled_if_in' source='check_passwd'> + <param>non</param> + <target type='variable'>check_passwd_min_len_one_type</target> + <target type='variable'>check_passwd_min_len_two_type</target> + <target type='variable'>check_passwd_min_len_three_type</target> + <target type='variable'>check_passwd_min_len_four_type</target> + <target type='variable'>check_passwd_max</target> + </condition> + + + <auto name='auto_dns' target='adresse_ip_dns_du_dhcp'> + <param type='eole' name='container_ip_dns' optional='True'>container_ip_dns</param> + <param type='eole' name='nom_zone_eth0' optional='True'>nom_zone_eth0</param> + </auto> + + <auto name='list_len_gt' target='test_adresse_ip_dns'> + <param type='eole' name='param'>adresse_ip_dns</param> + <param name='max_len'>0</param> + <param name='match'>oui</param> + <param name='mismatch'>non</param> + </auto> + + <auto name='calc_multi_condition' target='test_activer_resolvconf_template'> + <param>oui</param> + <param name="operator">OR</param> + <param name='condition_1' type='eole'>test_adresse_ip_dns</param> + <param name='condition_2' type='eole' optional='True'>activer_bind</param> + <param name='match'>oui</param> + <param name='mismatch'>non</param> + </auto> + + <condition name='disabled_if_in' source='test_activer_resolvconf_template'> + <param>non</param> + <target type='filelist'>resolvconf</target> + </condition> + + + </constraints> + + <help> + <family name='général'>Paramètres de base du serveur</family> + <variable name='adresse_ip_dns'>Adresse IP du serveur de nom primaire, en général celui de votre fournisseur Internet</variable> + <variable name='nom_machine'>Nom de la machine (exemple : eolebase)</variable> + <variable name='activer_proxy_client'>Le module EOLE doit utiliser un serveur mandataire (proxy) pour accéder à Internet</variable> + <variable name='proxy_client_adresse'>Adresse IP ou nom de domaine du serveur proxy à utiliser par le module EOLE</variable> + <variable name='proxy_client_port'>Port du serveur proxy à utiliser par le module EOLE</variable> + <variable name='nom_domaine_local'>Nom de domaine privé du réseau local</variable> + <family name='services'>Paramètres des services fournis par le serveur</family> + <family name='firewall'>Configuration du pare-feu</family> + <!-- systeme --> + <family name='système'>Configuration système avancée</family> + <variable name='bash_tmout'>Durée en secondes</variable> + <variable name='vim_background'>Indication de la valeur de la couleur d’arrière-plan de l’éditeur Vim pour améliorer la lisibilité de la coloration syntaxique (dark et light pour une coloration adaptée à un arrière-plan sombre et clair respectivement)</variable> + <variable name='vm_swappiness'>Le swappiness est un paramètre du noyau Linux permettant de définir avec quelle sensibilité il va écrire dans le swap si la quantité de RAM à utiliser devient trop importante</variable> + <variable name='activer_rngd'>Le démon rngd agit comme une passerelle entre un vrai générateur de nombres aléatoires, matériel (TRNG), tel que ceux que l'on peut trouver dans les puces Intel/AMD/VIA et le pseudo-générateur de nombres aléatoires du noyau (PRNG)</variable> + <variable name='check_passwd_min_len_one_type'>Taille minimum du mot de passe compris seulement dans une classe, 0 pour interdire (les classes de caractères sont : chiffres, lettres minuscules, lettres majuscules, et autres caractères)</variable> + <variable name='check_passwd_min_len_two_type'>Taille minimum du mot de passe compris seulement dans deux classes, 0 pour interdire (les classes de caractères sont : chiffres, lettres minuscules, lettres majuscules, et autres caractères)</variable> + <variable name='check_passwd_min_len_three_type'>Taille minimum du mot de passe compris seulement dans trois classes, 0 pour interdire (les classes de caractères sont : chiffres, lettres minuscules, lettres majuscules, et autres caractères)</variable> + <variable name='check_passwd_min_len_four_type'>Taille minimum du mot de passe compris seulement dans quatre classes, 0 pour interdire (les classes de caractères sont : chiffres, lettres minuscules, lettres majuscules, et autres caractères)</variable> + <family name='sshd'>Configuration des connexions SSH</family> + <variable name='ssh_maxstartups'>La première valeur est le nombre de tentatives de connexions échouées tolérées. La dernière valeur est le nombre de connexions échouées maximales. La deuxième valeur fixe le pourcentage de refus aléatoire une fois le nombre de connexions tolérées atteint. Ce pourcentage de refus augmente à chaque échec supplémentaire jusqu'à ce que le nombre de connexions maximales soit atteint.</variable> + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/dictionaries/00_eole-server_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/dictionaries/00_eole-server_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..1e1c5dcf74265ed441c4626851a7ecf4dde28f50 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/dictionaries/00_eole-server_packages.xml @@ -0,0 +1,60 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>acpid</package> + <package>apparmor</package> + <package>apt-show-versions</package> + <package>at</package> + <package>console-data</package> + <package>convmv</package> + <package>elinks</package> + <package>fping</package> + <package>gnutls-bin</package> + <package>gpm</package> + <package>htop</package> + <package>language-pack-fr</package> + <package>language-pack-gnome-fr</package> + <package>libpam-passwdqc</package> + <package>manpages-fr</package> + <package>memtest86+</package> + <package>net-tools</package> + <package>ntp</package> + <package>ntpdate</package> + <package>ntpstat</package> + <package>numlockx</package> + <package>pwgen</package> + <package>rng-tools</package> + <package>screen</package> + <package>tcptraceroute</package> + <package>tofrodos</package> + <package>traceroute</package> + <package>tree</package> + <package>unzip</package> + <package>update-manager-core</package> + <package>vlan</package> + <package>vnstat</package> + <package>vnstati</package> + <package>w3m</package> + <package>zephir-backend</package> + <package>zip</package> + <package>creole</package> + <package>plymouth-theme-eole-logo</package> + <package>plymouth-theme-eole-text</package> + <package>eole-common-pkg</package> + <package>eole-debsums-zephir-agent</package> + <package>eole-ead</package> + <package>eole-mail</package> + <package>eole-genconfig-client</package> + <package>ubuntu-minimal</package> + <package>ubuntu-standard</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/dictionaries/00_ntp.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/dictionaries/00_ntp.xml new file mode 100644 index 0000000000000000000000000000000000000000..f184f517a920d16b35f314a6ded499487a4fb20c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/dictionaries/00_ntp.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + <service>ntp</service> + <service_access service='ntp'> + <port protocol='udp'>123</port> + <tcpwrapper>ntpd</tcpwrapper> + </service_access> + <file name='/etc/ntp.conf'/> + <file name='/etc/default/ntpdate'/> + <file name='/etc/apparmor.d/local/usr.sbin.ntpd' source="ntpd.apparmor.conf"/> + <file name='/etc/network/if-up.d/ntpdate' source="ntpdate.if-up" mode="755"/> + </files> + <variables> + <family name='général'> + <variable name='serveur_ntp' type='domain' description='Adresse du serveur NTP' multi='True' mandatory='True'> + <value>0.fr.pool.ntp.org</value> + <value>1.fr.pool.ntp.org</value> + <value>2.fr.pool.ntp.org</value> + <value>3.fr.pool.ntp.org</value> + </variable> + </family> + </variables> + <constraints /> + <help> + <variable name='serveur_ntp'>Nom ou adresse IP du serveur de temps</variable> + </help> +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/dictionaries/00_partitioning.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/dictionaries/00_partitioning.xml new file mode 100644 index 0000000000000000000000000000000000000000..99288ff701955e838c1863b609165868c35f2f9a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/dictionaries/00_partitioning.xml @@ -0,0 +1,144 @@ +<?xml version="1.0" encoding="utf-8"?> +<creole> + <files> + + </files> + <containers> + </containers> + <variables> + <family name='système'> + <variable name='partitioning_free_PE' type='number' description='Nombre de blocs disponibles pour une nouvelle partition' mode='expert' hidden='True'/> + <variable name='allow_manual_partitioning' type='oui/non' description='Permettre le partitionnement manuel' mode='expert' hidden='True'/> + + <variable name='test_extend_standard_partitioning' type='oui/non' description="Tester s'il faut étendre automatiquement le partitionnement EOLE" mode='expert' hidden='True' /> + + <variable name='use_eole_standard_volume_extension' type='oui/non' description="Utiliser le modèle d’extension standard EOLE" mode='expert' /> + <variable name='eole_lv_names' type='string' description='Liste des noms de volume logique du partitionnement EOLE standard' multi='True' mode='expert' hidden='True' /> + <variable name='eole_lv_standard_extends' type='number' description='Liste des pourcentages d’espace libre à attribuer aux volumes logiques' multi='True' mode='expert' hidden='True' /> + <variable name='eole_created_lv_names' type='string' description='Liste des noms de volume logique actuellement créés sur le module' multi='True' mode='expert' hidden='True' /> + + <variable name='partitioning_create_lv' type='oui/non' description='Ajuster le partitionnement' mode='expert' hidden='True'> + <value>non</value> + </variable> + <variable name='partitioning_lv_name' type='string' description='Nom du volume à créer' mode='expert' multi='True' mandatory='True'/> + <variable name='partitioning_lv_size' type='number' description='Taille du volume en pourcentage de l’espace disponible' mode='expert' mandatory='True'/> + <variable name='partitioning_lv_format' type='string' description='Format du système de fichiers' mode='expert'> + <value>ext4</value> + </variable> + <variable name='partitioning_lv_mount_point' type='filename' description='Point de montage du volume logique' mode='expert'/> + <variable name='partitioning_lv_mount_options' type='string' description='Options du montage' mode='expert'/> + <variable name='partitioning_lv_extend' type='oui/non' description='Allouer l’espace restant' mode='expert'> + <value>non</value> + </variable> + <variable name='partitioning_lv_to_extend' type='filename' description='Volume logique à étendre' mode='expert' mandatory='True'/> + </family> + <separators> + <separator name='partitioning_free_PE'>Ajustement du partitionnement</separator> + </separators> + </variables> + <constraints> + + <auto name='calc_free_PE' target='partitioning_free_PE'> + <param type='eole' name='mode_zephir' optional='True'>mode_zephir</param> + </auto> + + <auto name='enable_lv_creation' target='allow_manual_partitioning'> + <param type='eole' name='mode_zephir' optional='True'>mode_zephir</param> + </auto> + + <!-- The actual logical volumes on disk --> + <fill name='get_lv_names' target='eole_created_lv_names'> + <param type='eole' name='mode_zephir' optional='True'>mode_zephir</param> + </fill> + + <!-- Provide to the user all the actual logical volumes on disk --> + <fill name='calc_val' target='partitioning_lv_name'> + <param type='eole'>eole_created_lv_names</param> + </fill> + + <fill name='calc_val' target='partitioning_lv_size'> + <param type='number'>0</param> + </fill> + + <!-- Can we automatically extend logical volume sizes --> + <auto name='check_partitioning_auto_extend' target='test_extend_standard_partitioning'> + <param type='eole' name='expected_lv_names'>eole_lv_names</param> + <param type='eole' name='created_lv_names'>eole_created_lv_names</param> + <param type='eole' name='mode_zephir' optional='True'>mode_zephir</param> + </auto> + + <!-- + Simple double choice: + 1. Use EOLE default extension schema (by default if possible) + 2. Use custom extension + + Avoid cascade of problematic “disabled_if_if†with a fill + frozen + --> + <fill name='calc_val' target='use_eole_standard_volume_extension'> + <param type='eole'>test_extend_standard_partitioning</param> + </fill> + + <condition name='frozen_if_in' source='test_extend_standard_partitioning'> + <param>non</param> + <target>use_eole_standard_volume_extension</target> + </condition> + + <condition name='disabled_if_in' source='use_eole_standard_volume_extension'> + <param>oui</param> + <target>partitioning_create_lv</target> + <target>partitioning_lv_extend</target> + </condition> + + + + <check name='check_free_space' target='partitioning_lv_size' /> + + <condition name='disabled_if_in' source='allow_manual_partitioning'> + <param>non</param> + <target>partitioning_create_lv</target> + <target>partitioning_lv_extend</target> + </condition> + + <condition name='disabled_if_in' source='partitioning_create_lv'> + <param>non</param> + <target>partitioning_lv_name</target> + </condition> + + <condition name='disabled_if_in' source='partitioning_lv_extend'> + <param>non</param> + <target>partitioning_lv_to_extend</target> + </condition> + + <check name='is_fs_type' target='partitioning_lv_format'> + <param type='eole' name='mode_zephir' optional='True'>mode_zephir</param> + </check> + + <check name='is_lv_name' target='partitioning_lv_to_extend'> + <param type='eole' name='mode_zephir' optional='True'>mode_zephir</param> + </check> + + <group master='partitioning_lv_name'> + <slave>partitioning_lv_size</slave> + <slave>partitioning_lv_format</slave> + <slave>partitioning_lv_mount_point</slave> + <slave>partitioning_lv_mount_options</slave> + </group> + + </constraints> + <help> + <variable name='allow_manual_partitioning'>Active automatiquement les champs de saisie si le serveur n’est pas encore instancié et que le groupe de volumes dispose de PE libres</variable> + <variable name='test_extend_standard_partitioning'>Vérifier que le partitionnement est compatible EOLE afin de pouvoir être étendu automatiquement</variable> + <variable name='use_eole_standard_volume_extension'>L’administrateur souhaite utiliser le modèle de répartition de l’espace standard d’EOLE</variable> + <variable name='eole_lv_names'>Cette liste est utilisée pour calculer test_extend_standard_partitioning</variable> + <variable name='eole_lv_standard_extends'>Cette liste fournit le pourcentage d’espace libre à attribuer à chaque volume lors d’un partitionnement EOLE standard</variable> + <variable name='eole_created_lv_names'>Cette liste est utilisée pour calculer partitioning_lv_name et test_extend_standard_partitioning</variable> + <variable name='partitioning_create_lv'>Activer les champs de saisie pour la création de volumes logiques ou l’extension de volumes logiques existants</variable> + <variable name='partitioning_lv_name'>Nom du volume logique LVM à créer dans le groupe de volume par défaut</variable> + <variable name='partitioning_lv_size'>Taille du volume logique en pourcentage de l’espace disponible</variable> + <variable name='partitioning_lv_format'>Format de la partition</variable> + <variable name='partitioning_lv_mount_point'>Point de montage du volume logique</variable> + <variable name='partitioning_lv_mount_options'>Options du montage</variable> + <variable name='partitioning_lv_extend'>Allouer l’espace restant à un volume logique existant</variable> + <variable name='partitioning_lv_to_extend'>Nom du volume logique à étendre avec l’espace restant</variable> + </help> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/dictionaries/01_log.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/dictionaries/01_log.xml new file mode 100644 index 0000000000000000000000000000000000000000..886262640affbee55b92c16a57b4bb36ffa4f847 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/dictionaries/01_log.xml @@ -0,0 +1,170 @@ +<?xml version='1.0' encoding='utf-8'?> + +<creole> + + <files> + <!--démarré par le service networking--> + <!--<service'>rsyslog</service>--> + <file name='/etc/logrotate.d/rsyslog' source='rsyslog.logrotate'/> + <file filelist='certfiles' name='/etc/rsyslog.d/ssl/rsyslog-request.tmpl' mkdir="True"/> + <file filelist='certfiles' name='/etc/rsyslog.d/ssl/rsyslog-ca.tmpl' mkdir="True"/> + <file name='/etc/rsyslog.conf'/> + <file name='/etc/rsyslog.d/aggregation/all.conf' source='rsyslog_aggregation.conf' mkdir="True"/> + <file name='/etc/rsyslog.d/templates/eole_templates.conf' source='rsyslog_templates.conf' mkdir="True"/> + <file name='/etc/rsyslog.d/eole-views/errors.conf' source='rsyslog_views_errors.conf' mkdir="True"/> + <file name='/etc/rsyslog.d/eole-views/auth.conf' source='rsyslog_views_auth.conf' mkdir="True"/> + <file name='/etc/rsyslog.d/eole-traps/rsyslog.conf' source='rsyslog_traps_rsyslog.conf' mkdir="True"/> + <file name='/etc/rsyslog.d/eole-traps/cron.conf' source='rsyslog_traps_cron.conf' mkdir="True"/> + <file name='/etc/rsyslog.d/eole-traps/iptables.conf' source='rsyslog_traps_iptables.conf' mkdir="True"/> + <file name='/etc/rsyslog.d/eole-traps/gpm.conf' source='rsyslog_traps_gpm.conf' mkdir="True"/> + <file name='/etc/rsyslog.d/eole-traps/zephir.conf' source='rsyslog_traps_zephir.conf' mkdir="True"/> + <file name='/etc/rsyslog.d/eole-traps/eole.conf' source='rsyslog_traps_eole.conf' mkdir="True"/> + <file name='/etc/rsyslog.d/default_dispatching.conf' source='rsyslog_default_dispatching.conf'/> + <file name='/etc/rsyslog.d/eole-traps/xmlrpc.conf' source='rsyslog_traps_xmlrpc.conf' mkdir="True"/> + <service_access service='rsyslog_udp'> + <port protocol='udp'>514</port> + </service_access> + <service_restriction service='rsyslog_udp'> + <ip interface='eth0' netmask='netmask_client_logs_udp' netmask_type='SymLinkOption' ip_type='SymLinkOption'>adresses_ip_clients_logs_udp</ip> + </service_restriction> + <service_access service='rsyslog_tcp'> + <port>10514</port> + </service_access> + <service_restriction service='rsyslog_tcp'> + <ip interface='eth0' netmask='netmask_client_logs_tcp' netmask_type='SymLinkOption' ip_type='SymLinkOption'>adresses_ip_clients_logs_tcp</ip> + </service_restriction> + <service_access service='rsyslog_relp'> + <port>20514</port> + </service_access> + <service_restriction service='rsyslog_relp'> + <ip interface='eth0' netmask='netmask_client_logs_relp' netmask_type='SymLinkOption' ip_type='SymLinkOption'>adresses_ip_clients_logs_relp</ip> + </service_restriction> + </files> + + <variables> + <family name='services'> + <variable name='activer_log_distant' type='oui/non' description="Activer la gestion des logs centralisés" mode="expert"> + <value>non</value> + </variable> + </family> + <family name='logs' icon='edit'> + <variable name='activer_reception_logs' type='oui/non' description='Activer la réception des logs de machines distantes'> + <value>non</value> + </variable> + <variable name='activer_reception_logs_relp' type='oui/non' description='Activer la réception des logs de machines distantes via le protocole RELP (fiable, non compatible TLS)'> + <value>non</value> + </variable> + <variable name='adresses_ip_clients_logs_relp' type='ip' description='IP des clients à autoriser pour le protocole RELP' multi='True' mandatory='True'/> + <variable name='netmask_client_logs_relp' type='netmask' description="Masque du sous réseau" mandatory='True'/> + <variable name='activer_reception_logs_udp' type='oui/non' description='Activer la réception des logs de machines distantes via le protocole UDP'> + <value>non</value> + </variable> + <variable name='adresses_ip_clients_logs_udp' type='ip' description="Adresse IP équipement autorisé" multi='True' mandatory='True'/> + <variable name='netmask_client_logs_udp' type='netmask' description="Masque du sous réseau" mandatory='True'/> + <variable name='activer_reception_logs_tcp' type='oui/non' description='Activer la réception des logs de machines distantes via le protocole TCP (compatible TLS)'> + <value>non</value> + </variable> + <variable name='rsyslog_reception_tls' type='oui/non' description="Activer le chiffrement des transferts pour la réception (TLS)" hidden='True'> + <value>non</value> + </variable> + <variable name='adresses_ip_clients_logs_tcp' type='ip' description='IP des clients à autoriser pour le protocole TCP' multi='True' mandatory='True'/> + <variable name='netmask_client_logs_tcp' type='netmask' description="Masque du sous réseau" mandatory='True'/> + + <variable name='rsyslog_ca_file' type='filename' description="Emplacement de la CA" hidden='True'> + <value>/etc/rsyslog.d/ssl/certs/zephirlog_ca.pem</value> + </variable> + <variable name='rsyslog_privkey_file' type='filename' description="Emplacement de la clé" hidden='True'> + <value>/etc/rsyslog.d/ssl/private/rsyslog_privkey.pem</value> + </variable> + <variable name='rsyslog_cert_file' type='filename' description="Emplacement du certificat" hidden='True'> + <value>/etc/rsyslog.d/ssl/certs/rsyslog_cert.pem</value> + </variable> + <variable name='activer_envoi_logs' type='oui/non' description="Activer l'envoi des logs à une machine distante (TCP si TLS activé, RELP sinon)"> + <value>non</value> + </variable> + <variable name='adresse_ip_serveur_logs' type='ip' description='Adresse IP du serveur de log central' mandatory='True'/> + <variable name='rsyslog_envoi_tls' type='oui/non' description="Activer le chiffrement des transferts pour l'envoi (TLS)" > + <value>non</value> + </variable> + <variable name='envoyer_tous_logs' type='oui/non' description='Envoyer tous les journaux'> + <value>oui</value> + </variable> + <variable name='utiliser_rsyslog_plage_envoi_globale' type='oui/non' description="Utiliser une plage temporelle pour le transfert des logs"> + <value>non</value> + </variable> + <variable name='rsyslog_plage_globale_heure_debut' type='string' description="Heure de début du transfert des logs"/> + <variable name='rsyslog_plage_globale_heure_fin' type='string' description="Heure de fin du transfert des logs"/> + </family> + <separators> + <separator name='activer_reception_logs'>Réception</separator> + <separator name='activer_envoi_logs'>Envoi</separator> + <separator name='envoyer_tous_logs'>Choix des journaux à envoyer</separator> + </separators> + </variables> + + <constraints> + <check name='valid_enum' target='rsyslog_plage_globale_heure_debut'> + <param>["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24"]</param> + </check> + <check name='valid_enum' target='rsyslog_plage_globale_heure_fin'> + <param>["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24"]</param> + </check> + + <condition name='disabled_if_in' source='activer_log_distant'> + <param>non</param> + <target type='family'>logs</target> + </condition> + <condition name='disabled_if_in' source='activer_reception_logs'> + <param>non</param> + <target type='variable'>activer_reception_logs_relp</target> + <target type='variable'>activer_reception_logs_tcp</target> + <target type='variable'>activer_reception_logs_udp</target> + </condition> + <condition name='disabled_if_in' source='activer_reception_logs_udp'> + <param>non</param> + <target type='variable'>adresses_ip_clients_logs_udp</target> + <target type='variable'>netmask_client_logs_udp</target> + </condition> + <condition name='disabled_if_in' source='activer_reception_logs_tcp'> + <param>non</param> + <target type='variable'>adresses_ip_clients_logs_tcp</target> + <target type='variable'>netmask_client_logs_tcp</target> + <target type='variable'>rsyslog_reception_tls</target> + </condition> + <condition name='disabled_if_in' source='activer_reception_logs_relp'> + <param>non</param> + <target type='variable'>adresses_ip_clients_logs_relp</target> + <target type='variable'>netmask_client_logs_relp</target> + </condition> + <condition name='disabled_if_in' source='activer_envoi_logs'> + <param>non</param> + <target type='variable'>adresse_ip_serveur_logs</target> + <target type='variable'>rsyslog_envoi_tls</target> + <target type='variable'>envoyer_tous_logs</target> + </condition> + <condition name='disabled_if_in' source='envoyer_tous_logs'> + <param>non</param> + <target type='variable'>utiliser_rsyslog_plage_envoi_globale</target> + </condition> + <condition name='disabled_if_in' source='utiliser_rsyslog_plage_envoi_globale'> + <param>non</param> + <target type='variable'>rsyslog_plage_globale_heure_debut</target> + <target type='variable'>rsyslog_plage_globale_heure_fin</target> + </condition> + <group master='adresses_ip_clients_logs_udp'> + <slave>netmask_client_logs_udp</slave> + </group> + <group master='adresses_ip_clients_logs_tcp'> + <slave>netmask_client_logs_tcp</slave> + </group> + <group master='adresses_ip_clients_logs_relp'> + <slave>netmask_client_logs_relp</slave> + </group> + </constraints> + + <help> + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/dictionaries/01_network.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/dictionaries/01_network.xml new file mode 100644 index 0000000000000000000000000000000000000000..2645f8aff59e401d06a3efb0a63a796c8a8e5b70 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/dictionaries/01_network.xml @@ -0,0 +1,101 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + <file filelist='dhclient' name='/etc/dhcp/dhclient.conf'/> + <!-- filelist créée dans 10_era.xml et gérée si era est installé--> + <file filelist='era_not_installed' name='/usr/share/eole/bastion/data/10-chain_static_rules' mode='0755'/> + <file filelist='era_not_installed' name='/usr/share/eole/bastion/data/40-icmp_static_rules' mode='0755'/> + <file filelist='era_not_installed' name='/usr/share/eole/bastion/data/50-nat_rules' mode='0755'/> + <file filelist='era_not_installed' name='/usr/share/eole/bastion/data/99-end_static_rules' mode='0755'/> + <file filelist='era_not_installed' name='/etc/eole/hosts.allow'/> + <file filelist='active_bonding' name='/etc/modprobe.d/bonding.conf' rm='True'/> + <file name='/etc/hosts.deny'/> + <file name='/usr/sbin/ouvre.firewall' mode='755'/> + <file name='/usr/lib/eole/forteresse.sh'/> + <file name='/var/lib/eole/config/persistent-net.cfg'/> + <service_access service='sshd'> + <port>22</port> + <tcpwrapper>sshd</tcpwrapper> + </service_access> + <service_restriction service='sshd'> + <ip interface='eth0' netmask='netmask_ssh_eth0' netmask_type='SymLinkOption' ip_type='SymLinkOption'>ip_ssh_eth0</ip> + <ip interface='eth1' netmask='netmask_ssh_eth1' netmask_type='SymLinkOption' ip_type='SymLinkOption'>ip_ssh_eth1</ip> + <ip interface='eth2' netmask='netmask_ssh_eth2' netmask_type='SymLinkOption' ip_type='SymLinkOption'>ip_ssh_eth2</ip> + <ip interface='eth3' netmask='netmask_ssh_eth3' netmask_type='SymLinkOption' ip_type='SymLinkOption'>ip_ssh_eth3</ip> + <ip interface='eth4' netmask='netmask_ssh_eth4' netmask_type='SymLinkOption' ip_type='SymLinkOption'>ip_ssh_eth4</ip> + </service_restriction> + <service_access service='genconfig'> + <port>7000</port> + </service_access> + <service_restriction service='genconfig'> + <ip interface='eth0' netmask='netmask_ssh_eth0' netmask_type='SymLinkOption' ip_type='SymLinkOption'>ip_ssh_eth0</ip> + <ip interface='eth1' netmask='netmask_ssh_eth1' netmask_type='SymLinkOption' ip_type='SymLinkOption'>ip_ssh_eth1</ip> + <ip interface='eth2' netmask='netmask_ssh_eth2' netmask_type='SymLinkOption' ip_type='SymLinkOption'>ip_ssh_eth2</ip> + <ip interface='eth3' netmask='netmask_ssh_eth3' netmask_type='SymLinkOption' ip_type='SymLinkOption'>ip_ssh_eth3</ip> + <ip interface='eth4' netmask='netmask_ssh_eth4' netmask_type='SymLinkOption' ip_type='SymLinkOption'>ip_ssh_eth4</ip> + </service_restriction> + </files> + + + <variables> + + <!-- Cross interfaces variables --> + <family name='Interface-0' icon='sitemap'> + + <variable name='test_dhclient_is_active' type='oui/non' hidden='True' description='Au moins une interface est en DHCP' /> + <variable name='bonding_is_active' type='oui/non' hidden='True' description='Au moins une interface est de type bonding' /> + + </family> + + </variables> + + + <constraints> + + <!-- DHCP client --> + <auto name='calc_multi_condition' target='test_dhclient_is_active'> + <param>dhcp</param> + <param name="operator">OR</param> + <param type='eole' name='condition_1' hidden='False'>eth0_method</param> + <param type='eole' name='condition_2' hidden='False'>eth1_method</param> + <param type='eole' name='condition_3' hidden='False'>eth2_method</param> + <param type='eole' name='condition_4' hidden='False'>eth3_method</param> + <param type='eole' name='condition_5' hidden='False'>eth4_method</param> + <param name='match'>oui</param> + <param name='mismatch'>non</param> + </auto> + + <condition name='disabled_if_not_in' source='test_dhclient_is_active'> + <param>oui</param> + <target type='filelist'>dhclient</target> + </condition> + + + <!-- Bonding --> + <auto name='calc_multi_condition' target='bonding_is_active'> + <param>oui</param> + <param name="operator">OR</param> + <param type='eole' name='condition_1' hidden='False'>activer_bonding_eth0</param> + <param type='eole' name='condition_2' hidden='False'>activer_bonding_eth1</param> + <param type='eole' name='condition_3' hidden='False'>activer_bonding_eth2</param> + <param type='eole' name='condition_4' hidden='False'>activer_bonding_eth3</param> + <param type='eole' name='condition_5' hidden='False'>activer_bonding_eth4</param> + <param name='match'>oui</param> + <param name='mismatch'>non</param> + </auto> + + <condition name='disabled_if_in' source='bonding_is_active'> + <param>non</param> + <target type='filelist'>active_bonding</target> + </condition> + + </constraints> + + + <help /> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/dictionaries/01_network_interface0.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/dictionaries/01_network_interface0.xml new file mode 100644 index 0000000000000000000000000000000000000000..71d3cfd4717f1b0302291fbc5bead3319496eb71 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/dictionaries/01_network_interface0.xml @@ -0,0 +1,355 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + <file filelist='interface_0' name='/etc/eole/network/interface_0.conf' rm='True' /> + </files> + + + <variables> + + <family name='Interface-0' icon='sitemap'> + + <variable name='eth0_method' type='string' description="Méthode d'attribution de l'adressage pour l'interface 0" mode='basic'> + <value>statique</value> + </variable> + + <!-- Addresses --> + <variable name='adresse_ip_eth0' type='local_ip' description="Adresse IP de l'interface 0" mandatory='True' mode='basic'/> + <variable name='adresse_netmask_eth0' type='netmask' description="Masque de sous réseau de l'interface 0" mandatory='True' mode='basic'/> + <variable name='adresse_network_eth0' type='network' description="Adresse réseau de l'interface 0"/> + <variable name='adresse_broadcast_eth0' type='broadcast' description="Adresse broadcast de sous réseau de l'interface 0"/> + + <!-- Gateway --> + <variable name='adresse_ip_gw' type='ip' description='Adresse IP de la passerelle par défaut' mode='basic'/> + <!-- conserver pour raison de compatibilité, devrait être remplacé par nom_carte_eth0 --> + <variable name='interface_gw' type='string' description='Interface de sortie'/> + + <!-- Physical device --> + <variable name='nom_carte_eth0' type='string' description="Nom de l'interface réseau 0" multi='True' mode='expert'/> + <variable name='nom_zone_eth0' type='string' description="Nom de l'interface réseau de la zone 0" mode='expert'/> + + <!-- Bonding --> + <variable name='activer_bonding_eth0' type='oui/non' description="Paramétrer cette zone pour du bonding" hidden='True' mode='expert'/> + <variable name='bonding_mode_eth0' type='string' description="Mode de bonding" mode='expert' /> + <variable name='bonding_miimon_eth0' type='number' description="Fréquence des MII link monitoring en millisecondes" mandatory='True' mode='expert'> + <value>100</value> + </variable> + <variable name='bonding_downdelay_eth0' type='number' description="Temps en millisecondes pour qu'une interface soit détectée down" mandatory='True' mode='expert'> + <value>200</value> + </variable> + <variable name='bonding_updelay_eth0' type='number' description="Temps en millisecondes pour qu'une interface soit détectée comme active" mandatory='True' mode='expert'> + <value>200</value> + </variable> + + <!-- Speed --> + <variable name='debit_carte_eth0' type='string' description="Mode de connexion pour l'interface 0" mode='expert' /> + + <!-- SSH --> + <variable name='ssh_eth0' type='oui/non' description='Autoriser les connexions SSH' mode='basic'> + <value>oui</value> + </variable> + <variable name='ip_ssh_eth0' type='network' description="Adresse IP réseau autorisée pour les connexions SSH" multi='True' mandatory='True'/> + <variable name='netmask_ssh_eth0' type='netmask' description="Masque du sous réseau pour les connexions SSH" mandatory='True'/> + + <!-- Admin/EAD --> + <variable name='admin_eth0' type='oui/non' description='Autoriser les connexions pour administrer le serveur (EAD, phpMyAdmin, ...)' mode='basic'> + <value>oui</value> + </variable> + <variable name='ip_admin_eth0' type='network' description="Adresse IP réseau autorisée pour administrer le serveur" multi='True' mandatory='True'/> + <variable name='netmask_admin_eth0' type='netmask' description="Masque du sous réseau pour administrer le serveur" mandatory='True'/> + + <!-- Aliases --> + <variable name='alias_eth0' type='oui/non' description="Ajouter des IP alias sur l'interface 0" > + <value>non</value> + </variable> + <variable name='alias_ip_eth0' type='ip' description="Adresse IP alias pour l'interface 0" multi='True' mandatory='True' /> + <variable name='alias_netmask_eth0' type='netmask' description="Masque de sous réseau correspondant à cet alias" mandatory='True' /> + <variable name='alias_network_eth0' type='network' description="Adresse réseau correspondant à cet alias"/> + <variable name='alias_broadcast_eth0' type='broadcast' description="Adresse broadcast correspondant à cet alias"/> + <variable name='alias_gw_eth0' type='ip' description="Adresse de la passerelle pour cet alias (nécessaire à l'agrégation de liens)" hidden='True'/> + + <!-- VLAN --> + <variable name='vlan_eth0' type='oui/non' description="Activer le support des VLAN sur l'interface 0" > + <value>non</value> + </variable> + <variable name='vlan_id_eth0' type='number' description="Numéro d'identifiant du VLAN" multi='True' mandatory='True' /> + <variable name='vlan_ip_eth0' type='ip' description="Adresse IP de l'interface 0 dans ce VLAN" mandatory='True' /> + <variable name='vlan_netmask_eth0' type='netmask' description="Masque de sous réseau de l'interface 0 dans ce VLAN" mandatory='True' > + <value>255.255.255.0</value> + </variable> + <variable name='vlan_network_eth0' type='network' description="Adresse réseau de l'interface 0 dans ce VLAN" /> + <variable name='vlan_broadcast_eth0' type='broadcast' description="Adresse de broadcast de l'interface 0 dans ce VLAN" /> + <variable name='vlan_gw_eth0' type='ip' description='Adresse de la passerelle pour ce VLAN' /> + + </family> + + <separators> + <separator name='eth0_method'>Configuration de l'interface</separator> + <separator name='ssh_eth0' never_hidden='True'>Administration distante sur l'interface</separator> + <separator name='alias_eth0'>Configuration des alias sur l'interface</separator> + <separator name='vlan_eth0'>Configuration des VLAN sur l'interface</separator> + </separators> + + </variables> + + + <constraints> + + <check name='valid_enum' target='eth0_method'> + <param>['dhcp','statique']</param> + </check> + + + <!-- Addresses --> + <check name="valid_ipnetmask" target="adresse_netmask_eth0" level="warning"> + <param type='eole'>adresse_ip_eth0</param> + </check> + + <!-- The adresses are automatically calculated and hidden --> + <condition name='frozen_if_not_in' source='eth0_method'> + <param>statique</param> + <target type='variable'>adresse_ip_eth0</target> + <target type='variable'>adresse_netmask_eth0</target> + <target type='variable'>adresse_ip_gw</target> + </condition> + + <auto name='auto_eth' target='adresse_ip_eth0'> + <param type='eole'>nom_zone_eth0</param> + <param name='condition'>dhcp</param> + <param type='eole' name='parametre'>eth0_method</param> + </auto> + + <auto name='auto_netmask' target='adresse_netmask_eth0'> + <param type='eole'>nom_zone_eth0</param> + <param name='condition'>dhcp</param> + <param type='eole' name='parametre'>eth0_method</param> + </auto> + + <auto name='calc_or_auto_network' target='adresse_network_eth0'> + <param type='eole' name='nom_carte'>nom_zone_eth0</param> + <param name='condition'>dhcp</param> + <param type='eole' name='parametre'>eth0_method</param> + <param type='eole' name='ip'>adresse_ip_eth0</param> + <param type='eole' name='netmask'>adresse_netmask_eth0</param> + </auto> + + <auto name='calc_or_auto_broadcast' target='adresse_broadcast_eth0'> + <param type='eole' name='nom_carte'>nom_zone_eth0</param> + <param name='condition'>dhcp</param> + <param type='eole' name='parametre'>eth0_method</param> + <param type='eole' name='ip'>adresse_ip_eth0</param> + <param type='eole' name='netmask'>adresse_netmask_eth0</param> + </auto> + + + <!-- Gateway --> + <auto name='auto_defaultgw_ip' target='adresse_ip_gw'> + <param type='eole'>eth0_method</param> + <param type='eole'>nom_zone_eth0</param> + </auto> + + <!-- Gateway --> + <auto name='calc_val' target='interface_gw'> + <param type='eole'>nom_zone_eth0</param> + </auto> + + <check name="valid_in_network" target="adresse_ip_gw" level="warning"> + <param type='eole'>adresse_network_eth0</param> + <param type='eole'>adresse_netmask_eth0</param> + </check> + + <check name="valid_differ" target="adresse_ip_gw"> + <param type='eole'>adresse_ip_eth0</param> + </check> + + + <!-- SSH --> + <group master='ip_ssh_eth0'> + <slave>netmask_ssh_eth0</slave> + </group> + + <condition name='disabled_if_in' source='activer_firewall'> + <param>non</param> + <target type='variable'>ssh_eth0</target> + </condition> + + <condition name='disabled_if_in' source='ssh_eth0'> + <param>non</param> + <target type='variable'>ip_ssh_eth0</target> + <target type='variable'>netmask_ssh_eth0</target> + </condition> + + <check name="valid_networknetmask" target="netmask_ssh_eth0"> + <param type='eole'>ip_ssh_eth0</param> + </check> + + + <!-- Admin/EAD --> + <group master='ip_admin_eth0'> + <slave>netmask_admin_eth0</slave> + </group> + + <condition name='disabled_if_in' source='activer_firewall'> + <param>non</param> + <target type='variable'>admin_eth0</target> + </condition> + + <condition name='disabled_if_in' source='admin_eth0'> + <param>non</param> + <target type='variable'>ip_admin_eth0</target> + <target type='variable'>netmask_admin_eth0</target> + </condition> + + <check name="valid_networknetmask" target="netmask_admin_eth0"> + <param type='eole'>ip_admin_eth0</param> + </check> + + + <!-- Alias --> + <group master='alias_ip_eth0'> + <slave>alias_netmask_eth0</slave> + <slave>alias_network_eth0</slave> + <slave>alias_broadcast_eth0</slave> + <slave>alias_gw_eth0</slave> + </group> + + <condition name='disabled_if_in' source='alias_eth0'> + <param>non</param> + <target type='variable'>alias_ip_eth0</target> + <target type='variable'>alias_netmask_eth0</target> + <target type='variable'>alias_network_eth0</target> + <target type='variable'>alias_broadcast_eth0</target> + </condition> + + <fill name='calc_val' target='alias_netmask_eth0'> + <param type='eole' name='valeur'>adresse_netmask_eth0</param> + </fill> + + <auto name='calc_network' target='alias_network_eth0'> + <param type='eole' name='ip'>alias_ip_eth0</param> + <param type='eole' name='netmask'>alias_netmask_eth0</param> + </auto> + + <auto name='calc_broadcast' target='alias_broadcast_eth0'> + <param type='eole' name='ip'>alias_ip_eth0</param> + <param type='eole' name='netmask'>alias_netmask_eth0</param> + </auto> + + + <!-- VLAN --> + <group master='vlan_id_eth0'> + <slave>vlan_ip_eth0</slave> + <slave>vlan_netmask_eth0</slave> + <slave>vlan_network_eth0</slave> + <slave>vlan_broadcast_eth0</slave> + <slave>vlan_gw_eth0</slave> + </group> + + <condition name='disabled_if_in' source='vlan_eth0'> + <param>non</param> + <target type='variable'>vlan_id_eth0</target> + <target type='variable'>vlan_ip_eth0</target> + <target type='variable'>vlan_netmask_eth0</target> + <target type='variable'>vlan_network_eth0</target> + <target type='variable'>vlan_broadcast_eth0</target> + <target type='variable'>vlan_gw_eth0</target> + </condition> + + <auto name='calc_network' target='vlan_network_eth0'> + <param type='eole' name='ip'>vlan_ip_eth0</param> + <param type='eole' name='netmask'>vlan_netmask_eth0</param> + </auto> + + <auto name='calc_broadcast' target='vlan_broadcast_eth0'> + <param type='eole' name='ip'>vlan_ip_eth0</param> + <param type='eole' name='netmask'>vlan_netmask_eth0</param> + </auto> + + + <!-- Bonding --> + <check name="valid_enum" target="bonding_mode_eth0"> + <param>['balance-rr', 'active-backup', 'balance-xor', 'broadcast', '802.3ad', 'balance-tlb', 'balance-alb']</param> + </check> + + <auto name='list_len_gt' target='activer_bonding_eth0'> + <param type='eole' name='param'>nom_carte_eth0</param> + <param name='max_len'>1</param> + <param name='match'>oui</param> + <param name='mismatch'>non</param> + </auto> + + <condition name='disabled_if_in' source='activer_bonding_eth0'> + <param>non</param> + <target type='variable'>bonding_mode_eth0</target> + <target type='variable'>bonding_miimon_eth0</target> + <target type='variable'>bonding_downdelay_eth0</target> + <target type='variable'>bonding_updelay_eth0</target> + </condition> + + + <!-- Physical device --> + <check name='valid_enum' target="nom_carte_eth0"> + <param type='python'>eosfunc.get_net_devices()</param> + <param name="checkval">False</param> + </check> + + <fill name='get_net_device' target="nom_carte_eth0"> + <param type='number'>0</param> + <param type='eole' optional='True' name="mode_zephir">mode_zephir</param> + </fill> + + <fill name='get_zone_name' target='nom_zone_eth0'> + <param type='eole' name='nom_carte'>nom_carte_eth0</param> + <param type='eole' name='method'>eth0_method</param> + <param name='interface_no'>0</param> + </fill> + + <!-- Not on Zéphir: mandatory carte and zone names --> + <condition name='mandatory_if_in' source='mode_zephir' fallback="True"> + <param>non</param> + <target type='variable'>nom_carte_eth0</target> + <target type='variable'>nom_zone_eth0</target> + <target type='variable'>interface_gw</target> + </condition> + + <!-- Avoid 2 interfaces with the same name --> + <check name="valid_differ" target="nom_carte_eth0" level="warning"> + <param type='eole' hidden='False'>nom_carte_eth1</param> + </check> + + <check name="valid_differ" target="nom_carte_eth0" level="warning"> + <param type='eole' hidden='False'>nom_carte_eth2</param> + </check> + + <check name="valid_differ" target="nom_carte_eth0" level="warning"> + <param type='eole' hidden='False'>nom_carte_eth3</param> + </check> + + <check name="valid_differ" target="nom_carte_eth0" level="warning"> + <param type='eole' hidden='False'>nom_carte_eth4</param> + </check> + + + <!-- Speed --> + <check name='valid_enum' target='debit_carte_eth0'> + <param>['','speed 100 duplex full autoneg off','autoneg on','speed 10 duplex half autoneg off','speed 1000 duplex full autoneg off']</param> + </check> + + </constraints> + + + <help> + + <family name='Interface-0'>Configuration de l'interface 0</family> + <variable name='adresse_ip_eth0'>Adresse IP de la première interface réseau (ex: 10.21.5.1)</variable> + <variable name='adresse_netmask_eth0'>Adresse du masque de sous réseau de la première interface réseau (ex: 255.255.255.0)</variable> + <variable name='adresse_network_eth0'>'Adresse réseau de la première interface réseau (ex: 10.21.5.0)</variable> + <variable name='adresse_broadcast_eth0'>Adresse de broadcast (diffusion) de la première interface réseau (ex: 10.21.5.255)</variable> + <variable name='bonding_mode_eth0'>Mode de fonctionnement du bond</variable> + <variable name='bonding_miimon_eth0'>Intervalle de temps pour le monitoring des interfaces</variable> + + </help> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/dictionaries/01_network_interface1.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/dictionaries/01_network_interface1.xml new file mode 100644 index 0000000000000000000000000000000000000000..29df0de5e93bab0d2eb16e22d5d756747771036a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/dictionaries/01_network_interface1.xml @@ -0,0 +1,339 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + <file filelist='interface_1' name='/etc/eole/network/interface_1.conf' rm='True' /> + </files> + + + <variables> + + <family name='Interface-1' icon='sitemap'> + + <variable name='eth1_method' type='string' description="Méthode d'attribution de l'adressage pour l'interface 1" mode='expert'> + <value>statique</value> + </variable> + + <!-- Addresses --> + <variable name='adresse_ip_eth1' type='local_ip' description="Adresse IP de l'interface 1" mandatory='True' mode='basic'/> + <variable name='adresse_netmask_eth1' type='netmask' description="Masque de sous réseau de l'interface 1" mandatory='True' mode='basic'/> + <variable name='adresse_network_eth1' type='network' description="Adresse réseau de l'interface 1"/> + <variable name='adresse_broadcast_eth1' type='broadcast' description="Adresse broadcast de sous réseau de l'interface 1"/> + + <!-- Physical device --> + <variable name='nom_carte_eth1' type='string' description="Nom de l'interface réseau 1" multi='True' mode='expert'/> + <variable name='nom_zone_eth1' type='string' description="Nom de l'interface réseau de la zone 1" mode='expert'/> + + <!-- Bonding --> + <variable name='activer_bonding_eth1' type='oui/non' description="Paramétrer cette zone pour du bonding" hidden='True' mode='expert'/> + <variable name='bonding_mode_eth1' type='string' description="Mode de bonding" mode='expert' /> + <variable name='bonding_miimon_eth1' type='number' description="Fréquence des MII link monitoring en millisecondes" mandatory='True' mode='expert'> + <value>100</value> + </variable> + <variable name='bonding_downdelay_eth1' type='number' description="Temps en millisecondes pour qu'une interface soit détectée down" mandatory='True' mode='expert'> + <value>200</value> + </variable> + <variable name='bonding_updelay_eth1' type='number' description="Temps en millisecondes pour qu'une interface soit détectée comme active" mandatory='True' mode='expert'> + <value>200</value> + </variable> + + <!-- Speed --> + <variable name='debit_carte_eth1' type='string' description="Mode de connexion pour l'interface 1" mode='expert' /> + + <!-- SSH --> + <variable name='ssh_eth1' type='oui/non' description='Autoriser les connexions SSH' mode='basic'> + <value>oui</value> + </variable> + <variable name='ip_ssh_eth1' type='network' description="Adresse IP réseau autorisée pour les connexions SSH" multi='True' mandatory='True'/> + <variable name='netmask_ssh_eth1' type='netmask' description="Masque du sous réseau pour les connexions SSH" mandatory='True'/> + + <!-- Admin/EAD --> + <variable name='admin_eth1' type='oui/non' description='Autoriser les connexions pour administrer le serveur (EAD, phpMyAdmin, ...)' mode='basic'> + <value>oui</value> + </variable> + <variable name='ip_admin_eth1' type='network' description="Adresse IP réseau autorisée pour administrer le serveur" multi='True' mandatory='True'/> + <variable name='netmask_admin_eth1' type='netmask' description="Masque du sous réseau pour administrer le serveur" mandatory='True'/> + + <!-- Aliases --> + <variable name='alias_eth1' type='oui/non' description="Ajouter des IP alias sur l'interface" > + <value>non</value> + </variable> + <variable name='alias_ip_eth1' type='ip' description="Adresse IP alias pour l'interface 1" multi='True' mandatory='True' /> + <variable name='alias_netmask_eth1' type='netmask' description="Masque de sous réseau correspondant à cet alias" mandatory='True' /> + <variable name='alias_network_eth1' type='network' description="Adresse réseau correspondant à cet alias" /> + <variable name='alias_broadcast_eth1' type='broadcast' description="Adresse broadcast correspondant à cet alias" /> + + <variable name='dns_rvp_alias_eth1' type='oui/non' description="Autoriser cet alias à utiliser les DNS de Forward RVP/AGRIATES" hidden='True'> + <value>oui</value> + </variable> + <variable name='dns_forward_alias_eth1' type='oui/non' description="Autoriser cet alias à utiliser les DNS de zones forward additionnelles" hidden='True'> + <value>oui</value> + </variable> + + <!-- VLAN --> + <variable name='vlan_eth1' type='oui/non' description="Activer le support des VLAN sur l'interface" > + <value>non</value> + </variable> + <variable name='vlan_id_eth1' type='number' description="Numéro d'identifiant du VLAN" multi='True' mandatory='True' /> + <variable name='vlan_ip_eth1' type='ip' description="Adresse IP de l'interface dans ce VLAN" mandatory='True' /> + <variable name='vlan_netmask_eth1' type='netmask' description="Masque de sous réseau de l'interface dans ce VLAN" mandatory='True' > + <value>255.255.255.0</value> + </variable> + <variable name='vlan_network_eth1' type='network' description="Adresse réseau de l'interface dans ce VLAN" /> + <variable name='vlan_broadcast_eth1' type='broadcast' description="Adresse de broadcast de l'interface dans ce VLAN" /> + <variable name='dns_rvp_vlan_eth1' type='oui/non' description="Autoriser ce VLAN à utiliser les DNS de Forward RVP/AGRIATES" hidden='True'> + <value>oui</value> + </variable> + <variable name='dns_forward_vlan_eth1' type='oui/non' description="Autoriser ce VLAN à utiliser les DNS des zones forward additionnelles" hidden='True'> + <value>oui</value> + </variable> + + </family> + + <separators> + + <separator name='eth1_method'>Configuration de l'interface</separator> + <separator name='ssh_eth1'>Administration distante sur l'interface</separator> + <separator name='alias_eth1'>Configuration des alias sur l'interface</separator> + <separator name='vlan_eth1'>Configuration des VLAN sur l'interface</separator> + + </separators> + + </variables> + + + <constraints> + + <condition name='disabled_if_in' source='nombre_interfaces'> + <param>1</param> + <target type='family'>Interface-1</target> + <target type='filelist'>interface_1</target> + </condition> + + <check name='valid_enum' target='eth1_method'> + <param>['dhcp','statique']</param> + </check> + + + <!-- Addresses --> + <check name="valid_ipnetmask" target="adresse_netmask_eth1" level="warning"> + <param type='eole'>adresse_ip_eth1</param> + </check> + + <!-- The adresses are automatically calculated and hidden --> + <condition name='frozen_if_not_in' source='eth1_method'> + <param>statique</param> + <target type='variable'>adresse_ip_eth1</target> + <target type='variable'>adresse_netmask_eth1</target> + </condition> + + <auto name='auto_eth' target='adresse_ip_eth1'> + <param type='eole'>nom_zone_eth1</param> + <param name='condition'>dhcp</param> + <param type='eole' name='parametre'>eth1_method</param> + </auto> + + <auto name='calc_or_auto_network' target='adresse_network_eth1'> + <param type='eole' name='nom_carte'>nom_zone_eth1</param> + <param name='condition'>dhcp</param> + <param type='eole' name='parametre'>eth1_method</param> + <param type='eole' name='ip'>adresse_ip_eth1</param> + <param type='eole' name='netmask'>adresse_netmask_eth1</param> + </auto> + + <auto name='auto_netmask' target='adresse_netmask_eth1'> + <param type='eole'>nom_zone_eth1</param> + <param name='condition'>dhcp</param> + <param type='eole' name='parametre'>eth1_method</param> + </auto> + + <auto name='calc_or_auto_broadcast' target='adresse_broadcast_eth1'> + <param type='eole' name='nom_carte'>nom_zone_eth1</param> + <param name='condition'>dhcp</param> + <param type='eole' name='parametre'>eth1_method</param> + <param type='eole' name='ip'>adresse_ip_eth1</param> + <param type='eole' name='netmask'>adresse_netmask_eth1</param> + </auto> + + + <!-- SSH --> + <group master='ip_ssh_eth1'> + <slave>netmask_ssh_eth1</slave> + </group> + + <condition name='disabled_if_in' source='activer_firewall'> + <param>non</param> + <target type='variable'>ssh_eth1</target> + </condition> + + <condition name='disabled_if_in' source='ssh_eth1'> + <param>non</param> + <target type='variable'>ip_ssh_eth1</target> + <target type='variable'>netmask_ssh_eth1</target> + </condition> + + <check name="valid_networknetmask" target="netmask_ssh_eth1"> + <param type='eole'>ip_ssh_eth1</param> + </check> + + + <!-- Admin/EAD --> + <group master='ip_admin_eth1'> + <slave>netmask_admin_eth1</slave> + </group> + + <condition name='disabled_if_in' source='activer_firewall'> + <param>non</param> + <target type='variable'>admin_eth1</target> + </condition> + + <condition name='disabled_if_in' source='admin_eth1'> + <param>non</param> + <target type='variable'>ip_admin_eth1</target> + <target type='variable'>netmask_admin_eth1</target> + </condition> + + <check name="valid_networknetmask" target="netmask_admin_eth1"> + <param type='eole'>ip_admin_eth1</param> + </check> + + + <!-- Alias --> + <group master='alias_ip_eth1'> + <slave>alias_netmask_eth1</slave> + <slave>alias_network_eth1</slave> + <slave>alias_broadcast_eth1</slave> + <slave>dns_rvp_alias_eth1</slave> + <slave>dns_forward_alias_eth1</slave> + </group> + + <condition name='disabled_if_in' source='alias_eth1'> + <param>non</param> + <target type='variable'>alias_ip_eth1</target> + <target type='variable'>alias_netmask_eth1</target> + <target type='variable'>alias_network_eth1</target> + <target type='variable'>alias_broadcast_eth1</target> + </condition> + + <fill name='calc_val' target='alias_netmask_eth1'> + <param type='eole' name='valeur'>adresse_netmask_eth1</param> + </fill> + + <auto name='calc_network' target='alias_network_eth1'> + <param type='eole' name='ip'>alias_ip_eth1</param> + <param type='eole' name='netmask'>alias_netmask_eth1</param> + </auto> + + <auto name='calc_broadcast' target='alias_broadcast_eth1'> + <param type='eole' name='ip'>alias_ip_eth1</param> + <param type='eole' name='netmask'>alias_netmask_eth1</param> + </auto> + + + <!-- VLAN --> + <group master='vlan_id_eth1'> + <slave>vlan_ip_eth1</slave> + <slave>vlan_netmask_eth1</slave> + <slave>vlan_network_eth1</slave> + <slave>vlan_broadcast_eth1</slave> + <slave>dns_rvp_vlan_eth1</slave> + <slave>dns_forward_vlan_eth1</slave> + </group> + + <condition name='disabled_if_in' source='vlan_eth1'> + <param>non</param> + <target type='variable'>vlan_id_eth1</target> + <target type='variable'>vlan_ip_eth1</target> + <target type='variable'>vlan_netmask_eth1</target> + <target type='variable'>vlan_network_eth1</target> + <target type='variable'>vlan_broadcast_eth1</target> + </condition> + + <auto name='calc_network' target='vlan_network_eth1'> + <param type='eole' name='ip'>vlan_ip_eth1</param> + <param type='eole' name='netmask'>vlan_netmask_eth1</param> + </auto> + + <auto name='calc_broadcast' target='vlan_broadcast_eth1'> + <param type='eole' name='ip'>vlan_ip_eth1</param> + <param type='eole' name='netmask'>vlan_netmask_eth1</param> + </auto> + + + <!-- Bonding --> + <check name="valid_enum" target="bonding_mode_eth1"> + <param>['balance-rr', 'active-backup', 'balance-xor', 'broadcast', '802.3ad', 'balance-tlb', 'balance-alb']</param> + </check> + + <auto name='list_len_gt' target='activer_bonding_eth1'> + <param type='eole' name='param'>nom_carte_eth1</param> + <param name='max_len'>1</param> + <param name='match'>oui</param> + <param name='mismatch'>non</param> + </auto> + + <condition name='disabled_if_in' source='activer_bonding_eth1'> + <param>non</param> + <target type='variable'>bonding_mode_eth1</target> + <target type='variable'>bonding_miimon_eth1</target> + <target type='variable'>bonding_downdelay_eth1</target> + <target type='variable'>bonding_updelay_eth1</target> + </condition> + + + <!-- Physical device --> + <check name='valid_enum' target="nom_carte_eth1"> + <param type='python'>eosfunc.get_net_devices()</param> + <param name="checkval">False</param> + </check> + + <fill name='get_net_device' target="nom_carte_eth1"> + <param type='number'>1</param> + <param type='eole' optional='True' name="mode_zephir">mode_zephir</param> + </fill> + + <fill name='get_zone_name' target='nom_zone_eth1'> + <param type='eole' name='nom_carte'>nom_carte_eth1</param> + <param type='eole' name='method'>eth1_method</param> + <param name='interface_no'>1</param> + </fill> + + <!-- Not on Zéphir: mandatory carte and zone names --> + <condition name='mandatory_if_in' source='mode_zephir' fallback="True"> + <param>non</param> + <target type='variable'>nom_carte_eth1</target> + <target type='variable'>nom_zone_eth1</target> + </condition> + + <!-- Avoid 2 interfaces with the same name --> + <check name="valid_differ" target="nom_carte_eth1" level="warning"> + <param type='eole' hidden='False'>nom_carte_eth2</param> + </check> + + <check name="valid_differ" target="nom_carte_eth1" level="warning"> + <param type='eole' hidden='False'>nom_carte_eth3</param> + </check> + + <check name="valid_differ" target="nom_carte_eth1" level="warning"> + <param type='eole' hidden='False'>nom_carte_eth4</param> + </check> + + + <!-- Speed --> + <check name='valid_enum' target='debit_carte_eth1'> + <param>['','speed 100 duplex full autoneg off','autoneg on','speed 10 duplex half autoneg off','speed 1000 duplex full autoneg off']</param> + </check> + + </constraints> + + + <help> + + <family name='Interface-1'>Configuration de l'interface 1</family> + <variable name='bonding_mode_eth1'>Mode de fonctionnement du bond</variable> + <variable name='bonding_miimon_eth1'>Intervalle de temps pour le monitoring des interfaces</variable> + + </help> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/dictionaries/01_network_interface2.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/dictionaries/01_network_interface2.xml new file mode 100644 index 0000000000000000000000000000000000000000..8accb8c9233ffaea5923486f05b591e77617b33d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/dictionaries/01_network_interface2.xml @@ -0,0 +1,335 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + <file filelist='interface_2' name='/etc/eole/network/interface_2.conf' rm='True' /> + </files> + + + <variables> + + <family name='Interface-2' icon='sitemap'> + + <variable name='eth2_method' type='string' description="Méthode d'attribution de l'adressage pour l'interface 2" mode='expert'> + <value>statique</value> + </variable> + + <!-- Addresses --> + <variable name='adresse_ip_eth2' type='local_ip' description="Adresse IP de l'interface 2" mandatory='True' mode='basic'/> + <variable name='adresse_netmask_eth2' type='netmask' description="Masque de sous réseau de l'interface 2" mandatory='True' mode='basic'/> + <variable name='adresse_network_eth2' type='network' description="Adresse réseau de l'interface 2"/> + <variable name='adresse_broadcast_eth2' type='broadcast' description="Adresse broadcast de sous réseau de l'interface 2"/> + + <!-- Physical device --> + <variable name='nom_carte_eth2' type='string' description="Nom de l'interface réseau 2" multi='True' mode='expert'/> + <variable name='nom_zone_eth2' type='string' description="Nom de l'interface réseau de la zone 2" mode='expert'/> + + <!-- Bonding --> + <variable name='activer_bonding_eth2' type='oui/non' description="Paramétrer cette zone pour du bonding" hidden='True' mode='expert'/> + <variable name='bonding_mode_eth2' type='string' description="Mode de bonding" mode='expert' /> + <variable name='bonding_miimon_eth2' type='number' description="Fréquence des MII link monitoring en millisecondes" mandatory='True' mode='expert'> + <value>100</value> + </variable> + <variable name='bonding_downdelay_eth2' type='number' description="Temps en millisecondes pour qu'une interface soit détectée down" mandatory='True' mode='expert'> + <value>200</value> + </variable> + <variable name='bonding_updelay_eth2' type='number' description="Temps en millisecondes pour qu'une interface soit détectée comme active" mandatory='True' mode='expert'> + <value>200</value> + </variable> + + <!-- Speed --> + <variable name='debit_carte_eth2' type='string' description="Mode de connexion pour l'interface 2" mode='expert' /> + + <!-- SSH --> + <variable name='ssh_eth2' type='oui/non' description='Autoriser les connexions SSH' mode='basic'> + <value>non</value> + </variable> + <variable name='ip_ssh_eth2' type='network' description="Adresse IP réseau autorisée pour les connexions SSH" multi='True' mandatory='True'/> + <variable name='netmask_ssh_eth2' type='netmask' description="Masque du sous réseau pour les connexions SSH" mandatory='True'/> + + <!-- Admin/EAD --> + <variable name='admin_eth2' type='oui/non' description='Autoriser les connexions pour administrer le serveur (EAD, phpMyAdmin, ...)' mode='basic'> + <value>non</value> + </variable> + <variable name='ip_admin_eth2' type='network' description="Adresse IP réseau autorisée pour administrer le serveur" multi='True' mandatory='True'/> + <variable name='netmask_admin_eth2' type='netmask' description="Masque du sous réseau pour administrer le serveur" mandatory='True'/> + + <!-- Aliases --> + <variable name='alias_eth2' type='oui/non' description="Ajouter des IP alias sur l'interface 2" > + <value>non</value> + </variable> + <variable name='alias_ip_eth2' type='ip' description="Adresse IP alias pour l'interface 2" multi='True' mandatory='True' /> + <variable name='alias_netmask_eth2' type='netmask' description="Masque de sous réseau correspondant à cet alias" mandatory='True' /> + <variable name='alias_network_eth2' type='network' description="Adresse réseau correspondant à cet alias" mandatory='True' /> + <variable name='alias_broadcast_eth2' type='broadcast' description="Adresse broadcast correspondant à cet alias" mandatory='True' /> + <variable name='dns_rvp_alias_eth2' type='oui/non' description="Autoriser cet alias à utiliser les DNS de Forward RVP/AGRIATES" hidden='True'> + <value>non</value> + </variable> + <variable name='dns_forward_alias_eth2' type='oui/non' description="Autoriser cet alias à utiliser les DNS de zones forward additionnelles" hidden='True'> + <value>non</value> + </variable> + + <!-- VLAN --> + <variable name='vlan_eth2' type='oui/non' description="Activer le support des VLAN sur l'interface 2" > + <value>non</value> + </variable> + <variable name='vlan_id_eth2' type='number' description="Numéro d'identifiant du VLAN" multi='True' mandatory='True' /> + <variable name='vlan_ip_eth2' type='ip' description="Adresse IP de l'interface 2 dans ce VLAN" mandatory='True' /> + <variable name='vlan_netmask_eth2' type='netmask' description="Masque de sous réseau de l'interface 2 dans ce VLAN" mandatory='True' > + <value>255.255.255.0</value> + </variable> + <variable name='vlan_network_eth2' type='network' description="Adresse réseau de l'interface 2 dans ce VLAN" mandatory='True' /> + <variable name='vlan_broadcast_eth2' type='broadcast' description="Adresse de broadcast de l'interface 2 dans ce VLAN" mandatory='True' /> + <variable name='dns_rvp_vlan_eth2' type='oui/non' description="Autoriser ce VLAN à utiliser les DNS de Forward RVP/AGRIATES" hidden='True'> + <value>non</value> + </variable> + <variable name='dns_forward_vlan_eth2' type='oui/non' description="Autoriser ce VLAN à utiliser les DNS des zones forward additionnelles" hidden='True'> + <value>non</value> + </variable> + + </family> + + <separators> + + <separator name='eth2_method'>Configuration de l'interface</separator> + <separator name='ssh_eth2'>Administration distante sur l'interface</separator> + <separator name='alias_eth2'>Configuration des alias sur l'interface</separator> + <separator name='vlan_eth2'>Configuration des VLAN sur l'interface</separator> + + </separators> + + </variables> + + + <constraints> + + <condition name='disabled_if_in' source='nombre_interfaces'> + <param>1</param> + <param>2</param> + <target type='family'>Interface-2</target> + <target type='filelist'>interface_2</target> + </condition> + + <check name="valid_enum" target="eth2_method"> + <param>['dhcp','statique']</param> + </check> + + + <!-- Addresses --> + <check name="valid_ipnetmask" target="adresse_netmask_eth2" level="warning"> + <param type='eole'>adresse_ip_eth2</param> + </check> + + <!-- The adresses are automatically calculated and hidden --> + <condition name='frozen_if_not_in' source='eth2_method'> + <param>statique</param> + <target type='variable'>adresse_ip_eth2</target> + <target type='variable'>adresse_netmask_eth2</target> + </condition> + + <auto name='auto_eth' target='adresse_ip_eth2'> + <param type='eole'>nom_zone_eth2</param> + <param name='condition'>dhcp</param> + <param type='eole' name='parametre'>eth2_method</param> + </auto> + + <auto name='calc_or_auto_network' target='adresse_network_eth2'> + <param type='eole' name='nom_carte'>nom_zone_eth2</param> + <param name='condition'>dhcp</param> + <param type='eole' name='parametre'>eth2_method</param> + <param type='eole' name='ip'>adresse_ip_eth2</param> + <param type='eole' name='netmask'>adresse_netmask_eth2</param> + </auto> + + <auto name='auto_netmask' target='adresse_netmask_eth2'> + <param type='eole'>nom_zone_eth2</param> + <param name='condition'>dhcp</param> + <param type='eole' name='parametre'>eth2_method</param> + </auto> + + <auto name='calc_or_auto_broadcast' target='adresse_broadcast_eth2'> + <param type='eole' name='nom_carte'>nom_zone_eth2</param> + <param name='condition'>dhcp</param> + <param type='eole' name='parametre'>eth2_method</param> + <param type='eole' name='ip'>adresse_ip_eth2</param> + <param type='eole' name='netmask'>adresse_netmask_eth2</param> + </auto> + + + <!-- SSH --> + <group master='ip_ssh_eth2'> + <slave>netmask_ssh_eth2</slave> + </group> + + <condition name='disabled_if_in' source='activer_firewall'> + <param>non</param> + <target type='variable'>ssh_eth2</target> + </condition> + + <condition name='disabled_if_in' source='ssh_eth2'> + <param>non</param> + <target type='variable'>ip_ssh_eth2</target> + <target type='variable'>netmask_ssh_eth2</target> + </condition> + + <check name="valid_networknetmask" target="netmask_ssh_eth2"> + <param type='eole'>ip_ssh_eth2</param> + </check> + + + <!-- Admin/EAD --> + <group master='ip_admin_eth2'> + <slave>netmask_admin_eth2</slave> + </group> + + <condition name='disabled_if_in' source='activer_firewall'> + <param>non</param> + <target type='variable'>admin_eth2</target> + </condition> + + <condition name='disabled_if_in' source='admin_eth2'> + <param>non</param> + <target type='variable'>ip_admin_eth2</target> + <target type='variable'>netmask_admin_eth2</target> + </condition> + + <check name="valid_networknetmask" target="netmask_admin_eth2"> + <param type='eole'>ip_admin_eth2</param> + </check> + + + <!-- Alias --> + <group master='alias_ip_eth2'> + <slave>alias_netmask_eth2</slave> + <slave>alias_network_eth2</slave> + <slave>alias_broadcast_eth2</slave> + <slave>dns_rvp_alias_eth2</slave> + <slave>dns_forward_alias_eth2</slave> + </group> + + <condition name='disabled_if_in' source='alias_eth2'> + <param>non</param> + <target type='variable'>alias_ip_eth2</target> + <target type='variable'>alias_netmask_eth2</target> + <target type='variable'>alias_network_eth2</target> + <target type='variable'>alias_broadcast_eth2</target> + </condition> + + <fill name='calc_val' target='alias_netmask_eth2'> + <param type='eole' name='valeur'>adresse_netmask_eth2</param> + </fill> + + <auto name='calc_network' target='alias_network_eth2'> + <param type='eole' name='ip'>alias_ip_eth2</param> + <param type='eole' name='netmask'>alias_netmask_eth2</param> + </auto> + + <auto name='calc_broadcast' target='alias_broadcast_eth2'> + <param type='eole' name='ip'>alias_ip_eth2</param> + <param type='eole' name='netmask'>alias_netmask_eth2</param> + </auto> + + + <!-- VLAN --> + <group master='vlan_id_eth2'> + <slave>vlan_ip_eth2</slave> + <slave>vlan_netmask_eth2</slave> + <slave>vlan_network_eth2</slave> + <slave>vlan_broadcast_eth2</slave> + <slave>dns_rvp_vlan_eth2</slave> + <slave>dns_forward_vlan_eth2</slave> + </group> + + <condition name='disabled_if_in' source='vlan_eth2'> + <param>non</param> + <target type='variable'>vlan_id_eth2</target> + <target type='variable'>vlan_ip_eth2</target> + <target type='variable'>vlan_netmask_eth2</target> + <target type='variable'>vlan_network_eth2</target> + <target type='variable'>vlan_broadcast_eth2</target> + </condition> + + <auto name='calc_network' target='vlan_network_eth2'> + <param type='eole' name='ip'>vlan_ip_eth2</param> + <param type='eole' name='netmask'>vlan_netmask_eth2</param> + </auto> + + <auto name='calc_broadcast' target='vlan_broadcast_eth2'> + <param type='eole' name='ip'>vlan_ip_eth2</param> + <param type='eole' name='netmask'>vlan_netmask_eth2</param> + </auto> + + + <!-- Bonding --> + <check name="valid_enum" target="bonding_mode_eth2"> + <param>['balance-rr', 'active-backup', 'balance-xor', 'broadcast', '802.3ad', 'balance-tlb', 'balance-alb']</param> + </check> + + <auto name='list_len_gt' target='activer_bonding_eth2'> + <param type='eole' name='param'>nom_carte_eth2</param> + <param name='max_len'>1</param> + <param name='match'>oui</param> + <param name='mismatch'>non</param> + </auto> + + <condition name='disabled_if_in' source='activer_bonding_eth2'> + <param>non</param> + <target type='variable'>bonding_mode_eth2</target> + <target type='variable'>bonding_miimon_eth2</target> + <target type='variable'>bonding_downdelay_eth2</target> + <target type='variable'>bonding_updelay_eth2</target> + </condition> + + + <!-- Physical device --> + <check name='valid_enum' target="nom_carte_eth2"> + <param type='python'>eosfunc.get_net_devices()</param> + <param name="checkval">False</param> + </check> + + <fill name='get_net_device' target="nom_carte_eth2"> + <param type='number'>2</param> + <param type='eole' optional='True' name="mode_zephir">mode_zephir</param> + </fill> + + <fill name='get_zone_name' target='nom_zone_eth2'> + <param type='eole' name='nom_carte'>nom_carte_eth2</param> + <param type='eole' name='method'>eth2_method</param> + <param name='interface_no'>2</param> + </fill> + + <!-- Not on Zéphir: mandatory carte and zone names --> + <condition name='mandatory_if_in' source='mode_zephir' fallback="True"> + <param>non</param> + <target type='variable'>nom_carte_eth2</target> + <target type='variable'>nom_zone_eth2</target> + </condition> + + <!-- Avoid 2 interfaces with the same name --> + <check name="valid_differ" target="nom_carte_eth2" level="warning"> + <param type='eole' hidden='False'>nom_carte_eth3</param> + </check> + + <check name="valid_differ" target="nom_carte_eth2" level="warning"> + <param type='eole' hidden='False'>nom_carte_eth4</param> + </check> + + + <!-- Speed --> + <check name='valid_enum' target='debit_carte_eth2'> + <param>['','speed 100 duplex full autoneg off','autoneg on','speed 10 duplex half autoneg off','speed 1000 duplex full autoneg off']</param> + </check> + + </constraints> + + + <help> + + <family name='Interface-2'>Configuration de l'interface 2</family> + <variable name='bonding_mode_eth2'>Mode de fonctionnement du bond</variable> + <variable name='bonding_miimon_eth2'>Intervalle de temps pour le monitoring des interfaces</variable> + + </help> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/dictionaries/01_network_interface3.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/dictionaries/01_network_interface3.xml new file mode 100644 index 0000000000000000000000000000000000000000..5082d542380df4f650d0911868f22a3c02f2872e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/dictionaries/01_network_interface3.xml @@ -0,0 +1,333 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + <file filelist='interface_3' name='/etc/eole/network/interface_3.conf' rm='True' /> + </files> + + + <variables> + + <family name='Interface-3' icon='sitemap'> + + <variable name='eth3_method' type='string' description="Méthode d'attribution de l'adressage pour l'interface 3" mode='expert'> + <value>statique</value> + </variable> + + <!-- Addresses --> + <variable name='adresse_ip_eth3' type='local_ip' description="Adresse IP de l'interface 3" mandatory='True' mode='basic'/> + <variable name='adresse_netmask_eth3' type='netmask' description="Masque de sous réseau de l'interface 3" mandatory='True' mode='basic'/> + <variable name='adresse_network_eth3' type='network' description="Adresse réseau de l'interface 3"/> + <variable name='adresse_broadcast_eth3' type='broadcast' description="Adresse broadcast de sous réseau de l'interface 3"/> + + <!-- Physical device --> + <variable name='nom_carte_eth3' type='string' description="Nom de l'interface réseau 3" multi='True' mode='expert'/> + <variable name='nom_zone_eth3' type='string' description="Nom de l'interface réseau de la zone 3" mode='expert'/> + + <!-- Bonding --> + <variable name='activer_bonding_eth3' type='oui/non' description="Paramétrer cette zone pour du bonding" hidden='True' mode='expert'/> + <variable name='bonding_mode_eth3' type='string' description="Mode de bonding" mode='expert' /> + <variable name='bonding_miimon_eth3' type='number' description="Fréquence des MII link monitoring en millisecondes" mandatory='True' mode='expert'> + <value>100</value> + </variable> + <variable name='bonding_downdelay_eth3' type='number' description="Temps en millisecondes pour qu'une interface soit détectée down" mandatory='True' mode='expert'> + <value>200</value> + </variable> + <variable name='bonding_updelay_eth3' type='number' description="Temps en millisecondes pour qu'une interface soit détectée comme active" mandatory='True' mode='expert'> + <value>200</value> + </variable> + + <!-- Speed --> + <variable name='debit_carte_eth3' type='string' description="Mode de connexion pour l'interface 3" mode='expert' /> + + <!-- SSH --> + <variable name='ssh_eth3' type='oui/non' description='Autoriser les connexions SSH' mode='basic'> + <value>non</value> + </variable> + <variable name='ip_ssh_eth3' type='network' description="Adresse IP réseau autorisée pour les connexions SSH" multi='True' mandatory='True'/> + <variable name='netmask_ssh_eth3' type='netmask' description="Masque du sous réseau pour les connexions SSH" mandatory='True'/> + + <!-- Admin/EAD --> + <variable name='admin_eth3' type='oui/non' description='Autoriser les connexions pour administrer le serveur (EAD, phpMyAdmin, ...)' mode='basic'> + <value>non</value> + </variable> + <variable name='ip_admin_eth3' type='network' description="Adresse IP réseau autorisée pour administrer le serveur" multi='True' mandatory='True'/> + <variable name='netmask_admin_eth3' type='netmask' description="Masque du sous réseau pour administrer le serveur" mandatory='True'/> + + <!-- Aliases --> + <variable name='alias_eth3' type='oui/non' description="Ajouter des IP alias sur l'interface 3" > + <value>non</value> + </variable> + <variable name='alias_ip_eth3' type='ip' description="Adresse IP alias pour l'interface 3" multi='True' mandatory='True' /> + <variable name='alias_netmask_eth3' type='netmask' description="Masque de sous réseau correspondant à cet alias" mandatory='True' /> + <variable name='alias_network_eth3' type='network' description="Adresse réseau correspondant à cet alias" mandatory='True' /> + <variable name='alias_broadcast_eth3' type='broadcast' description="Adresse broadcast correspondant à cet alias" mandatory='True' /> + <variable name='dns_rvp_alias_eth3' type='oui/non' description="Autoriser cet alias à utiliser les DNS de Forward RVP/AGRIATES" hidden='True'> + <value>non</value> + </variable> + <variable name='dns_forward_alias_eth3' type='oui/non' description="Autoriser cet alias à utiliser les DNS de zones forward additionnelles" hidden='True'> + <value>non</value> + </variable> + + <!-- VLAN --> + <variable name='vlan_eth3' type='oui/non' description="Activer le support des VLAN sur l'interface 3" > + <value>non</value> + </variable> + <variable name='vlan_id_eth3' type='number' description="Numéro d'identifiant du VLAN" multi='True' mandatory='True' /> + <variable name='vlan_ip_eth3' type='ip' description="Adresse IP de l'interface 3 dans ce VLAN" mandatory='True' /> + <variable name='vlan_netmask_eth3' type='netmask' description="Masque de sous réseau de l'interface 3 dans ce VLAN" mandatory='True' > + <value>255.255.255.0</value> + </variable> + <variable name='vlan_network_eth3' type='network' description="Adresse réseau de l'interface 3 dans ce VLAN" mandatory='True' /> + <variable name='vlan_broadcast_eth3' type='broadcast' description="Adresse de broadcast de l'interface 3 dans ce VLAN" mandatory='True' /> + <variable name='dns_rvp_vlan_eth3' type='oui/non' description="Autoriser ce VLAN à utiliser les DNS de Forward RVP/AGRIATES" hidden='True'> + <value>non</value> + </variable> + <variable name='dns_forward_vlan_eth3' type='oui/non' description="Autoriser ce VLAN à utiliser les DNS des zones forward additionnelles" hidden='True'> + <value>non</value> + </variable> + + </family> + + <separators> + + <separator name='eth3_method'>Configuration de l'interface</separator> + <separator name='ssh_eth3'>Administration distante sur l'interface</separator> + <separator name='alias_eth3'>Configuration des alias sur l'interface</separator> + <separator name='vlan_eth3'>Configuration des VLAN sur l'interface</separator> + + </separators> + + </variables> + + + <constraints> + + <condition name='disabled_if_in' source='nombre_interfaces'> + <param>1</param> + <param>2</param> + <param>3</param> + <target type='family'>Interface-3</target> + <target type='filelist'>interface_3</target> + </condition> + + <check name="valid_enum" target="eth3_method"> + <param>['dhcp','statique']</param> + </check> + + + <!-- Addresses --> + <check name="valid_ipnetmask" target="adresse_netmask_eth3" level="warning"> + <param type='eole'>adresse_ip_eth3</param> + </check> + + <!-- The adresses are automatically calculated and hidden --> + <condition name='frozen_if_not_in' source='eth3_method'> + <param>statique</param> + <target type='variable'>adresse_ip_eth3</target> + <target type='variable'>adresse_netmask_eth3</target> + </condition> + + <auto name='auto_eth' target='adresse_ip_eth3'> + <param type='eole'>nom_zone_eth3</param> + <param name='condition'>dhcp</param> + <param type='eole' name='parametre'>eth3_method</param> + </auto> + + <auto name='calc_or_auto_network' target='adresse_network_eth3'> + <param type='eole' name='nom_carte'>nom_zone_eth3</param> + <param name='condition'>dhcp</param> + <param type='eole' name='parametre'>eth3_method</param> + <param type='eole' name='ip'>adresse_ip_eth3</param> + <param type='eole' name='netmask'>adresse_netmask_eth3</param> + </auto> + + <auto name='auto_netmask' target='adresse_netmask_eth3'> + <param type='eole'>nom_zone_eth3</param> + <param name='condition'>dhcp</param> + <param type='eole' name='parametre'>eth3_method</param> + </auto> + + <auto name='calc_or_auto_broadcast' target='adresse_broadcast_eth3'> + <param type='eole' name='nom_carte'>nom_zone_eth3</param> + <param name='condition'>dhcp</param> + <param type='eole' name='parametre'>eth3_method</param> + <param type='eole' name='ip'>adresse_ip_eth3</param> + <param type='eole' name='netmask'>adresse_netmask_eth3</param> + </auto> + + + <!-- SSH --> + <group master='ip_ssh_eth3'> + <slave>netmask_ssh_eth3</slave> + </group> + + <condition name='disabled_if_in' source='activer_firewall'> + <param>non</param> + <target type='variable'>ssh_eth3</target> + </condition> + + <condition name='disabled_if_in' source='ssh_eth3'> + <param>non</param> + <target type='variable'>ip_ssh_eth3</target> + <target type='variable'>netmask_ssh_eth3</target> + </condition> + + <check name="valid_networknetmask" target="netmask_ssh_eth3"> + <param type='eole'>ip_ssh_eth3</param> + </check> + + + <!-- Admin/EAD --> + <group master='ip_admin_eth3'> + <slave>netmask_admin_eth3</slave> + </group> + + <condition name='disabled_if_in' source='activer_firewall'> + <param>non</param> + <target type='variable'>admin_eth3</target> + </condition> + + <condition name='disabled_if_in' source='admin_eth3'> + <param>non</param> + <target type='variable'>ip_admin_eth3</target> + <target type='variable'>netmask_admin_eth3</target> + </condition> + + <check name="valid_networknetmask" target="netmask_admin_eth3"> + <param type='eole'>ip_admin_eth3</param> + </check> + + + <!-- Alias --> + <group master='alias_ip_eth3'> + <slave>alias_netmask_eth3</slave> + <slave>alias_network_eth3</slave> + <slave>alias_broadcast_eth3</slave> + <slave>dns_rvp_alias_eth3</slave> + <slave>dns_forward_alias_eth3</slave> + </group> + + <condition name='disabled_if_in' source='alias_eth3'> + <param>non</param> + <target type='variable'>alias_ip_eth3</target> + <target type='variable'>alias_netmask_eth3</target> + <target type='variable'>alias_network_eth3</target> + <target type='variable'>alias_broadcast_eth3</target> + </condition> + + <fill name='calc_val' target='alias_netmask_eth3'> + <param type='eole' name='valeur'>adresse_netmask_eth3</param> + </fill> + + + <auto name='calc_network' target='alias_network_eth3'> + <param type='eole' name='ip'>alias_ip_eth3</param> + <param type='eole' name='netmask'>alias_netmask_eth3</param> + </auto> + + <auto name='calc_broadcast' target='alias_broadcast_eth3'> + <param type='eole' name='ip'>alias_ip_eth3</param> + <param type='eole' name='netmask'>alias_netmask_eth3</param> + </auto> + + + <!-- VLAN --> + <group master='vlan_id_eth3'> + <slave>vlan_ip_eth3</slave> + <slave>vlan_netmask_eth3</slave> + <slave>vlan_network_eth3</slave> + <slave>vlan_broadcast_eth3</slave> + <slave>dns_rvp_vlan_eth3</slave> + <slave>dns_forward_vlan_eth3</slave> + </group> + + <condition name='disabled_if_in' source='vlan_eth3'> + <param>non</param> + <target type='variable'>vlan_id_eth3</target> + <target type='variable'>vlan_ip_eth3</target> + <target type='variable'>vlan_netmask_eth3</target> + <target type='variable'>vlan_network_eth3</target> + <target type='variable'>vlan_broadcast_eth3</target> + </condition> + + <auto name='calc_network' target='vlan_network_eth3'> + <param type='eole' name='ip'>vlan_ip_eth3</param> + <param type='eole' name='netmask'>vlan_netmask_eth3</param> + </auto> + + <auto name='calc_broadcast' target='vlan_broadcast_eth3'> + <param type='eole' name='ip'>vlan_ip_eth3</param> + <param type='eole' name='netmask'>vlan_netmask_eth3</param> + </auto> + + + <!-- Bonding --> + <check name="valid_enum" target="bonding_mode_eth3"> + <param>['balance-rr', 'active-backup', 'balance-xor', 'broadcast', '802.3ad', 'balance-tlb', 'balance-alb']</param> + </check> + + <auto name='list_len_gt' target='activer_bonding_eth3'> + <param type='eole' name='param'>nom_carte_eth3</param> + <param name='max_len'>1</param> + <param name='match'>oui</param> + <param name='mismatch'>non</param> + </auto> + + <condition name='disabled_if_in' source='activer_bonding_eth3'> + <param>non</param> + <target type='variable'>bonding_mode_eth3</target> + <target type='variable'>bonding_miimon_eth3</target> + <target type='variable'>bonding_downdelay_eth3</target> + <target type='variable'>bonding_updelay_eth3</target> + </condition> + + + <!-- Physical device --> + <check name='valid_enum' target="nom_carte_eth3"> + <param type='python'>eosfunc.get_net_devices()</param> + <param name="checkval">False</param> + </check> + + <fill name='get_net_device' target="nom_carte_eth3"> + <param type='number'>3</param> + <param type='eole' optional='True' name="mode_zephir">mode_zephir</param> + </fill> + + <fill name='get_zone_name' target='nom_zone_eth3'> + <param type='eole' name='nom_carte'>nom_carte_eth3</param> + <param type='eole' name='method'>eth3_method</param> + <param name='interface_no'>3</param> + </fill> + + <!-- Not on Zéphir: mandatory carte and zone names --> + <condition name='mandatory_if_in' source='mode_zephir' fallback="True"> + <param>non</param> + <target type='variable'>nom_carte_eth3</target> + <target type='variable'>nom_zone_eth3</target> + </condition> + + <!-- Avoid 2 interfaces with the same name --> + <check name="valid_differ" target="nom_carte_eth3" level="warning"> + <param type='eole' hidden='False'>nom_carte_eth4</param> + </check> + + + <!-- Speed --> + <check name='valid_enum' target='debit_carte_eth3'> + <param>['','speed 100 duplex full autoneg off','autoneg on','speed 10 duplex half autoneg off','speed 1000 duplex full autoneg off']</param> + </check> + + </constraints> + + + <help> + + <family name='Interface-3'>Configuration de l'interface 3</family> + <variable name='bonding_mode_eth3'>Mode de fonctionnement du bond</variable> + <variable name='bonding_miimon_eth3'>Intervalle de temps pour le monitoring des interfaces</variable> + + </help> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/dictionaries/01_network_interface4.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/dictionaries/01_network_interface4.xml new file mode 100644 index 0000000000000000000000000000000000000000..4b63df7012685459ecc81caf2f7a81dc79d05067 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/dictionaries/01_network_interface4.xml @@ -0,0 +1,331 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + <file filelist='interface_4' name='/etc/eole/network/interface_4.conf' rm='True' /> + </files> + + + <variables> + + <family name='Interface-4' icon='sitemap'> + + <variable name='eth4_method' type='string' description="Méthode d'attribution de l'adressage pour l'interface 4" mode='expert'> + <value>statique</value> + </variable> + + <!-- Addresses --> + <variable name='adresse_ip_eth4' type='local_ip' description="Adresse IP de l'interface 4" mandatory='True' mode='basic'/> + <variable name='adresse_netmask_eth4' type='netmask' description="Masque de sous réseau de l'interface 4" mandatory='True' mode='basic'/> + <variable name='adresse_network_eth4' type='network' description="Adresse réseau de l'interface 4"/> + <variable name='adresse_broadcast_eth4' type='broadcast' description="Adresse broadcast de sous réseau de l'interface 4"/> + + <!-- Physical device --> + <variable name='nom_carte_eth4' type='string' description="Nom de l'interface réseau 4" multi='True' mode='expert'/> + <variable name='nom_zone_eth4' type='string' description="Nom de l'interface réseau de la zone 4" mode='expert'/> + + <!-- Bonding --> + <variable name='activer_bonding_eth4' type='oui/non' description="Paramétrer cette zone pour du bonding" hidden='True' mode='expert'/> + <variable name='bonding_mode_eth4' type='string' description="Mode de bonding" mode='expert' /> + <variable name='bonding_miimon_eth4' type='number' description="Fréquence des MII link monitoring en millisecondes" mandatory='True' mode='expert'> + <value>100</value> + </variable> + <variable name='bonding_downdelay_eth4' type='number' description="Temps en millisecondes pour qu'une interface soit détectée down" mandatory='True' mode='expert'> + <value>200</value> + </variable> + <variable name='bonding_updelay_eth4' type='number' description="Temps en millisecondes pour qu'une interface soit détectée comme active" mandatory='True' mode='expert'> + <value>200</value> + </variable> + + <!-- Speed --> + <variable name='debit_carte_eth4' type='string' description="Mode de connexion pour l'interface 4" mode='expert' /> + + <!-- SSH --> + <variable name='ssh_eth4' type='oui/non' description='Autoriser les connexions SSH' mode='basic'> + <value>non</value> + </variable> + <variable name='ip_ssh_eth4' type='network' description="Adresse IP réseau autorisée pour les connexions SSH" multi='True' mandatory='True'/> + <variable name='netmask_ssh_eth4' type='netmask' description="Masque du sous réseau pour les connexions SSH" mandatory='True'/> + + <!-- Admin/EAD --> + <variable name='admin_eth4' type='oui/non' description='Autoriser les connexions pour administrer le serveur (EAD, phpMyAdmin, ...)' mode='basic'> + <value>non</value> + </variable> + <variable name='ip_admin_eth4' type='network' description="Adresse IP réseau autorisée pour administrer le serveur" multi='True' mandatory='True'/> + <variable name='netmask_admin_eth4' type='netmask' description="Masque du sous réseau pour administrer le serveur" mandatory='True'/> + + <!-- Aliases --> + <variable name='alias_eth4' type='oui/non' description="Ajouter des IP alias sur l'interface 4" > + <value>non</value> + </variable> + <variable name='alias_ip_eth4' type='ip' description="Adresse IP alias pour l'interface 4" multi='True' mandatory='True' /> + <variable name='alias_netmask_eth4' type='netmask' description="Masque de sous réseau correspondant à cet alias" mandatory='True' /> + <variable name='alias_network_eth4' type='network' description="Adresse réseau correspondant à cet alias" mandatory='True' /> + <variable name='alias_broadcast_eth4' type='broadcast' description="Adresse broadcast correspondant à cet alias" mandatory='True' /> + <variable name='dns_rvp_alias_eth4' type='oui/non' description="Autoriser cet alias à utiliser les DNS de Forward RVP/AGRIATES" hidden='True'> + <value>non</value> + </variable> + <variable name='dns_forward_alias_eth4' type='oui/non' description="Autoriser cet alias à utiliser les DNS de zones forward additionnelles" hidden='True'> + <value>non</value> + </variable> + + <!-- VLAN --> + <variable name='vlan_eth4' type='oui/non' description="Activer le support des VLAN sur l'interface 4" > + <value>non</value> + </variable> + <variable name='vlan_id_eth4' type='number' description="Numéro d'identifiant du VLAN" multi='True' mandatory='True' /> + <variable name='vlan_ip_eth4' type='ip' description="Adresse IP de l'interface 4 dans ce VLAN" mandatory='True' /> + <variable name='vlan_netmask_eth4' type='netmask' description="Masque de sous réseau de l'interface 4 dans ce VLAN" mandatory='True' > + <value>255.255.255.0</value> + </variable> + <variable name='vlan_network_eth4' type='network' description="Adresse réseau de l'interface 4 dans ce VLAN" mandatory='True' /> + <variable name='vlan_broadcast_eth4' type='broadcast' description="Adresse de broadcast de l'interface 4 dans ce VLAN" mandatory='True' /> + <variable name='dns_rvp_vlan_eth4' type='oui/non' description="Autoriser ce VLAN à utiliser les DNS de Forward RVP/AGRIATES" hidden='True'> + <value>non</value> + </variable> + <variable name='dns_forward_vlan_eth4' type='oui/non' description="Autoriser ce VLAN à utiliser les DNS des zones forward additionnelles" hidden='True'> + <value>non</value> + </variable> + + </family> + + <separators> + + <separator name='eth4_method'>Configuration de l'interface</separator> + <separator name='ssh_eth4'>Administration distante sur l'interface</separator> + <separator name='alias_eth4'>Configuration des alias sur l'interface</separator> + <separator name='vlan_eth4'>Configuration des VLAN sur l'interface</separator> + + </separators> + + </variables> + + + <constraints> + + <condition name='disabled_if_in' source='nombre_interfaces'> + <param>1</param> + <param>2</param> + <param>3</param> + <param>4</param> + <target type='family'>Interface-4</target> + <target type='filelist'>interface_4</target> + </condition> + + <check name="valid_enum" target="eth4_method"> + <param>['dhcp','statique']</param> + </check> + + + <!-- Addresses --> + <check name="valid_ipnetmask" target="adresse_netmask_eth4" level="warning"> + <param type='eole'>adresse_ip_eth4</param> + </check> + + <!-- The adresses are automatically calculated and hidden --> + <condition name='frozen_if_not_in' source='eth4_method'> + <param>statique</param> + <target type='variable'>adresse_ip_eth4</target> + <target type='variable'>adresse_netmask_eth4</target> + </condition> + + <auto name='auto_eth' target='adresse_ip_eth4'> + <param type='eole'>nom_zone_eth4</param> + <param name='condition'>dhcp</param> + <param type='eole' name='parametre'>eth4_method</param> + </auto> + + <auto name='calc_or_auto_network' target='adresse_network_eth4'> + <param type='eole' name='nom_carte'>nom_zone_eth4</param> + <param name='condition'>dhcp</param> + <param type='eole' name='parametre'>eth4_method</param> + <param type='eole' name='ip'>adresse_ip_eth4</param> + <param type='eole' name='netmask'>adresse_netmask_eth4</param> + </auto> + + <auto name='auto_netmask' target='adresse_netmask_eth4'> + <param type='eole'>nom_zone_eth4</param> + <param name='condition'>dhcp</param> + <param type='eole' name='parametre'>eth4_method</param> + </auto> + + <auto name='calc_or_auto_broadcast' target='adresse_broadcast_eth4'> + <param type='eole' name='nom_carte'>nom_zone_eth4</param> + <param name='condition'>dhcp</param> + <param type='eole' name='parametre'>eth4_method</param> + <param type='eole' name='ip'>adresse_ip_eth4</param> + <param type='eole' name='netmask'>adresse_netmask_eth4</param> + </auto> + + + <!-- SSH --> + <group master='ip_ssh_eth4'> + <slave>netmask_ssh_eth4</slave> + </group> + + <condition name='disabled_if_in' source='activer_firewall'> + <param>non</param> + <target type='variable'>ssh_eth4</target> + </condition> + + <condition name='disabled_if_in' source='ssh_eth4'> + <param>non</param> + <target type='variable'>ip_ssh_eth4</target> + <target type='variable'>netmask_ssh_eth4</target> + </condition> + + <check name="valid_networknetmask" target="netmask_ssh_eth4"> + <param type='eole'>ip_ssh_eth4</param> + </check> + + + <!-- Admin/EAD --> + <group master='ip_admin_eth4'> + <slave>netmask_admin_eth4</slave> + </group> + + <condition name='disabled_if_in' source='activer_firewall'> + <param>non</param> + <target type='variable'>admin_eth4</target> + </condition> + + <condition name='disabled_if_in' source='admin_eth4'> + <param>non</param> + <target type='variable'>ip_admin_eth4</target> + <target type='variable'>netmask_admin_eth4</target> + </condition> + + <check name="valid_networknetmask" target="netmask_admin_eth4"> + <param type='eole'>ip_admin_eth4</param> + </check> + + + <!-- Alias --> + <group master='alias_ip_eth4'> + <slave>alias_netmask_eth4</slave> + <slave>alias_network_eth4</slave> + <slave>alias_broadcast_eth4</slave> + <slave>dns_rvp_alias_eth4</slave> + <slave>dns_forward_alias_eth4</slave> + </group> + + <condition name='disabled_if_in' source='alias_eth4'> + <param>non</param> + <target type='variable'>alias_ip_eth4</target> + <target type='variable'>alias_netmask_eth4</target> + <target type='variable'>alias_network_eth4</target> + <target type='variable'>alias_broadcast_eth4</target> + </condition> + + <fill name='calc_val' target='alias_netmask_eth4'> + <param type='eole' name='valeur'>adresse_netmask_eth4</param> + </fill> + + <auto name='calc_network' target='alias_network_eth4'> + <param type='eole' name='ip'>alias_ip_eth4</param> + <param type='eole' name='netmask'>alias_netmask_eth4</param> + </auto> + + <auto name='calc_broadcast' target='alias_broadcast_eth4'> + <param type='eole' name='ip'>alias_ip_eth4</param> + <param type='eole' name='netmask'>alias_netmask_eth4</param> + </auto> + + + <!-- VLAN --> + <group master='vlan_id_eth4'> + <slave>vlan_ip_eth4</slave> + <slave>vlan_netmask_eth4</slave> + <slave>vlan_network_eth4</slave> + <slave>vlan_broadcast_eth4</slave> + <slave>dns_rvp_vlan_eth4</slave> + <slave>dns_forward_vlan_eth4</slave> + </group> + + <condition name='disabled_if_in' source='vlan_eth4'> + <param>non</param> + <target type='variable'>vlan_id_eth4</target> + <target type='variable'>vlan_ip_eth4</target> + <target type='variable'>vlan_netmask_eth4</target> + <target type='variable'>vlan_network_eth4</target> + <target type='variable'>vlan_broadcast_eth4</target> + </condition> + + <auto name='calc_network' target='vlan_network_eth4'> + <param type='eole' name='ip'>vlan_ip_eth4</param> + <param type='eole' name='netmask'>vlan_netmask_eth4</param> + </auto> + + <auto name='calc_broadcast' target='vlan_broadcast_eth4'> + <param type='eole' name='ip'>vlan_ip_eth4</param> + <param type='eole' name='netmask'>vlan_netmask_eth4</param> + </auto> + + + <!-- Bonding --> + <check name="valid_enum" target="bonding_mode_eth4"> + <param>['balance-rr', 'active-backup', 'balance-xor', 'broadcast', '802.3ad', 'balance-tlb', 'balance-alb']</param> + </check> + + <auto name='list_len_gt' target='activer_bonding_eth4'> + <param type='eole' name='param'>nom_carte_eth4</param> + <param name='max_len'>1</param> + <param name='match'>oui</param> + <param name='mismatch'>non</param> + </auto> + + <condition name='disabled_if_in' source='activer_bonding_eth4'> + <param>non</param> + <target type='variable'>bonding_mode_eth4</target> + <target type='variable'>bonding_miimon_eth4</target> + <target type='variable'>bonding_downdelay_eth4</target> + <target type='variable'>bonding_updelay_eth4</target> + </condition> + + + <!-- Physical device --> + <check name='valid_enum' target="nom_carte_eth4"> + <param type='python'>eosfunc.get_net_devices()</param> + <param name="checkval">False</param> + </check> + + <fill name='get_net_device' target="nom_carte_eth4"> + <param type='number'>4</param> + <param type='eole' optional='True' name="mode_zephir">mode_zephir</param> + </fill> + + <fill name='get_zone_name' target='nom_zone_eth4'> + <param type='eole' name='nom_carte'>nom_carte_eth4</param> + <param type='eole' name='method'>eth4_method</param> + <param name='interface_no'>4</param> + </fill> + + <!-- Not on Zéphir: mandatory carte and zone names --> + <condition name='mandatory_if_in' source='mode_zephir' fallback="True"> + <param>non</param> + <target type='variable'>nom_carte_eth4</target> + <target type='variable'>nom_zone_eth4</target> + </condition> + + <!-- Avoid 2 interfaces with the same name --> + <!-- Nothing for the last interface --> + + + <!-- Speed --> + <check name='valid_enum' target='debit_carte_eth4'> + <param>['','speed 100 duplex full autoneg off','autoneg on','speed 10 duplex half autoneg off','speed 1000 duplex full autoneg off']</param> + </check> + + </constraints> + + + <help> + + <family name='Interface-4'>Configuration de l'interface 4</family> + <variable name='bonding_mode_eth4'>Mode de fonctionnement du bond</variable> + <variable name='bonding_miimon_eth4'>Intervalle de temps pour le monitoring des interfaces</variable> + + </help> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/dictionaries/02_advanced_network.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/dictionaries/02_advanced_network.xml new file mode 100644 index 0000000000000000000000000000000000000000..e0431da80498950354887fbdc0973d7de67c3d57 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/dictionaries/02_advanced_network.xml @@ -0,0 +1,197 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + <file filelist='routes' name='/etc/netplan/01-extras-routes.yaml' rm='True'/> + </files> + <variables> + <family mode="expert" name="réseau avancé" icon='sitemap'> + <variable name="activer_firewall" type="oui/non" description="Activer le support du firewall"> + <value>oui</value> + </variable> + <variable name="restrict_ping_request" type="oui/non" description="Restreindre le ping aux réseaux autorisés pour administrer le serveur"> + <value>oui</value> + </variable> + <variable name="activer_ipv6" type="oui/non" description="Activer le support IPV6" hidden="True"> + <value>non</value> + </variable> + <variable name="activer_routage_ipv4" type="oui/non" description="Activer le routage IPv4 entre les interfaces"> + <value>non</value> + </variable> + <variable name="activer_routage_ipv6" type="oui/non" description="Activer le routage IPv6 entre les interfaces"> + <value>non</value> + </variable> + <variable name='activer_log_martian' type='oui/non' description='Journaliser les "martian sources"'> + <value>non</value> + </variable> + <variable name='activer_antispoofing' type='oui/non' description="Activer l'anti-spoofing sur toutes les interfaces"> + <value>non</value> + </variable> + <variable name='activer_ajout_hosts' type='oui/non' description="Déclarer des noms d'hôtes supplémentaires"> + <value>non</value> + </variable> + <variable name='adresse_ip_hosts' type='ip' description="Adresse IP de l'hôte" multi='True' mandatory='True'/> + <variable name='nom_long_hosts' type='domain_strict' description="Nom long de l'hôte" mandatory='True'/> + <!-- le nom court est facultatif --> + <variable name='nom_court_hosts' type='hostname_strict' description="Nom court de l'hôte"/> + <variable name='activer_route' type='oui/non' description="Ajouter des routes statiques"> + <value>non</value> + </variable> + <variable name='route_adresse' type='ip' description='Adresse IP ou réseau à ajouter dans la table de routage' multi='True' mandatory='True'/> + <variable name='route_netmask' type='netmask' description='Masque de sous réseau (mettre à 255.255.255.255 si adresse host)' mandatory='True'/> + <variable name='route_gw' type='ip' description='Adresse IP de la passerelle pour accéder à ce réseau' mandatory='True'/> + <variable name='route_int' type='string' description="Interface réseau reliée à la passerelle" mandatory='True'/> + <variable name='route_vlan_id' type='number' description="Numéro d'identifiant du VLAN ou rien" ></variable> + <variable name='dns_route' type='oui/non' description="Autoriser ce réseau à utiliser les DNS du serveur" hidden='True'> + <value>oui</value> + </variable> + <variable name='route_in_vpn' type='oui/non' description="Passer par le VPN pour accéder à ce réseau" hidden='True'> + <value>non</value> + </variable> + <variable name='dns_rvp_route' type='oui/non' description="Autoriser ce réseau à utiliser les DNS de Forward RVP/AGRIATES" hidden='True'> + <value>oui</value> + </variable> + <variable name='dns_forward_route' type='oui/non' description="Autoriser ce réseau à utiliser les DNS des zones forward additionnelles" hidden='True'> + <value>oui</value> + </variable> + <variable name="ip_no_pmtu_disc" type="oui/non" description="Configurer manuellement le MTU"> + <value>non</value> + </variable> + <variable name="valeur_mtu_eth0" type="number" description="Valeur du MTU pour l'interface 0 : rien = valeur par défaut de l'interface"/> + <variable name="valeur_mtu_eth1" type="number" description="Valeur du MTU pour l'interface 1 : rien = valeur par défaut de l'interface"/> + <variable name="valeur_mtu_eth2" type="number" description="Valeur du MTU pour l'interface 2 : rien = valeur par défaut de l'interface"/> + <variable name="valeur_mtu_eth3" type="number" description="Valeur du MTU pour l'interface 3 : rien = valeur par défaut de l'interface"/> + <variable name="valeur_mtu_eth4" type="number" description="Valeur du MTU pour l'interface 4 : rien = valeur par défaut de l'interface"/> + <variable name="ipv4_neigh_default_gc_thresh1" type="number" description="Neighbour table overflow stop culling limit"> + <value>128</value> + </variable> + <variable name="ipv4_neigh_default_gc_thresh2" type="number" description="Neighbour table overflow soft limit"> + <value>512</value> + </variable> + <variable name="ipv4_neigh_default_gc_thresh3" type="number" description="Neighbour table overflow hard limit"> + <value>1024</value> + </variable> + <variable name='test_distant_domaine' type='domain_strict' description="Domaine utilisé pour le test de l'accès distant" multi="True"> + <value>bp-eole.ac-dijon.fr</value> + <value>archive.ubuntu.com</value> + </variable> + </family> + <separators> + <!-- réseau avancé --> + <separator name='activer_route'>Ajout de routes statiques</separator> + <separator name='ip_no_pmtu_disc'>Configuration du MTU</separator> + <separator name='ipv4_neigh_default_gc_thresh1'>Configuration de la "neighbour table"</separator> + <separator name='test_distant_domaine'>Test de l'accès distant</separator> + <separator name='activer_log_martian'>Sécurité</separator> + <separator name='activer_ajout_hosts'>Ajout d'hôtes</separator> + </separators> + </variables> + + <constraints> + <check name="valid_enum" target="route_int"> + <param>['0','1','2','3','4']</param> + </check> + + <condition name='disabled_if_in' source='activer_firewall'> + <param>non</param> + <target type='variable'>restrict_ping_request</target> + </condition> + + <condition name='disabled_if_in' source='nombre_interfaces'> + <param>1</param> + <target type='variable'>activer_antispoofing</target> + </condition> + + <!-- Réseau avancé --> + <condition name='disabled_if_in' source='activer_ajout_hosts'> + <param>non</param> + <target type='variable'>adresse_ip_hosts</target> + <target type='variable'>nom_long_hosts</target> + <target type='variable'>nom_court_hosts</target> + </condition> + <group master='adresse_ip_hosts'> + <slave>nom_long_hosts</slave> + <slave>nom_court_hosts</slave> + </group> + <condition name='disabled_if_in' source='activer_route'> + <param>non</param> + <target type='variable'>route_adresse</target> + <target type='variable'>route_netmask</target> + <target type='variable'>route_gw</target> + <target type='variable'>route_int</target> + <target type='variable'>route_vlan_id</target> + <target type='filelist'>routes</target> + </condition> + <group master='route_adresse'> + <slave>route_netmask</slave> + <slave>route_gw</slave> + <slave>route_int</slave> + <slave>route_vlan_id</slave> + <slave>dns_route</slave> + <slave>route_in_vpn</slave> + <slave>dns_rvp_route</slave> + <slave>dns_forward_route</slave> + </group> + <condition name='disabled_if_in' source='mode_conteneur_actif'> + <param>non</param> + <target type='variable'>activer_routage_ipv6</target> + </condition> + <condition name='disabled_if_in' source='activer_ipv6'> + <param>non</param> + <target type='variable'>activer_routage_ipv6</target> + </condition> + <condition name='disabled_if_in' source='mode_conteneur_actif'> + <param>oui</param> + <target type='variable'>activer_routage_ipv4</target> + </condition> + <condition name='disabled_if_in' source='ip_no_pmtu_disc'> + <param>non</param> + <target type='variable'>valeur_mtu_eth0</target> + <target type='variable'>valeur_mtu_eth1</target> + <target type='variable'>valeur_mtu_eth2</target> + <target type='variable'>valeur_mtu_eth3</target> + <target type='variable'>valeur_mtu_eth4</target> + </condition> + <condition name='disabled_if_in' source='nombre_interfaces'> + <param>1</param> + <target type='variable'>valeur_mtu_eth1</target> + </condition> + <condition name='disabled_if_in' source='nombre_interfaces'> + <param>1</param> + <param>2</param> + <target type='variable'>valeur_mtu_eth2</target> + </condition> + <condition name='disabled_if_in' source='nombre_interfaces'> + <param>1</param> + <param>2</param> + <param>3</param> + <target type='variable'>valeur_mtu_eth3</target> + </condition> + <condition name='disabled_if_in' source='nombre_interfaces'> + <param>1</param> + <param>2</param> + <param>3</param> + <param>4</param> + <target type='variable'>valeur_mtu_eth4</target> + </condition> + </constraints> + <help> + <variable name='activer_routage_ipv4'>Permet d’activer le routage IPv4 au niveau du noyau en passant à 1 la valeur de /proc/sys/net/ipv4/ip_forward. Valeur par défaut: « non ».</variable> + <variable name='activer_routage_ipv6'>Permet d’activer le routage IPv6 au niveau du noyau en passant à 1 la valeur de /proc/sys/net/ipv6/conf/all/forwarding. Valeur par défaut: « non ».</variable> + <variable name='activer_ajout_hosts'>Permet d'ajouter des entrées dans le fichier /etc/hosts</variable> + <variable name='activer_route'>Permet de déclarer des routes afin d'accéder à des adresses ou à des plages d'adresses par un chemin différent de celui par défaut</variable> + <variable name='route_adresse'>Adresse IP ou réseau de destination</variable> + <variable name='route_netmask'>Masque de sous réseau de destination</variable> + <variable name='route_gw'>Adresse IP de la passerelle</variable> + <variable name='route_int'>Numéro de l'interface réseau par laquelle passer</variable> + <variable name='dns_route'>Permet de configurer le DNS du serveur pour autoriser ou non ce réseau à l'utiliser</variable> + <variable name='route_in_vpn'>L'accès à ce réseau passe ou non par le VPN</variable> + <variable name='dns_rvp_route'>Permet de configurer le DNS du serveur pour autoriser ou non ce réseau à utiliser les DNS de Forward RVP/AGRIATES</variable> + <variable name='dns_forward_route'>Permet de configurer le DNS du serveur pour autoriser ou non ce réseau à utiliser les DNS des zones forward additionnelles</variable> + <variable name="ip_no_pmtu_disc">En mode manuel, le path MTU discovery est désactivé (bit DF est positionné à 0)</variable> + </help> +</creole> + +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/dictionaries/02_certif.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/dictionaries/02_certif.xml new file mode 100644 index 0000000000000000000000000000000000000000..9e7d2462571bb892afa106140177a05ede7b3154 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/dictionaries/02_certif.xml @@ -0,0 +1,191 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + <file name='/etc/eole/ssl/certif-eole.conf' mkdir='True'/> + <file name='/etc/eole/ssl/client-eole.conf'/> + <file name='/etc/eole/ssl/ca-eole.conf'/> + <file filelist='le_active' name='/etc/eole/ssl/nginx-minimal.conf' rm="True"/> + <file filelist='le_active' name='/usr/share/eole/letsencrypt/hooks-post.d/00-copy' mode="755" source="le-00-copy"/> + <!--<file filelist='le_active' name='/etc/systemd/system/certbot.service.d/override.conf' source='certbot.override.conf' mkdir='True'/> + <service servicelist="le_active">certbot</service> + <service servicelist="le_active">certbot.timer</service> + --> + </files> + + <variables> + <family name='général'> + <variable name='cert_type' type='string' description='Certificat SSL' mode="basic"> + <value>autosigné</value> + </variable> + <variable name='server_cert' type='filename' description='Chemin du fichier contenant le certificat SSL' mandatory="True" mode="basic"/> + <variable name='server_key' type='filename' description='Chemin du fichier contenant la clé privée du certificat SSL' mandatory="True" mode="basic"> + <value>/etc/ssl/private/eole.key</value> + </variable> + <variable name='server_pem' type='filename' description='Chemin du fichier contenant la chaîne de certification' mandatory="True" mode="basic"/> + </family> + <family name='certificats ssl' mode='expert' icon='lock'> + <variable name='ssl_default_key_bits' type='number' description='Taille de la clé'> + <value>2048</value> + </variable> + <variable name='ssl_default_cert_time' type='number' description='Durée de validité du certificat (en jours)'> + <value>1096</value> + </variable> + <variable name='ssl_country_name' type='string' description='Nom du pays (C=)'/> + <variable name='ssl_organization_name' type='string' description="Nom de l'organisation (O=)"> + <value>Ministere Education Nationale (MENESR)</value> + </variable> + <variable name='ssl_organization_unit_name' type='string' description="Nom de l'unité de l'organisation (OU=)" multi='True'/> + <variable name='ssl_server_name' type='domain_strict' description="Nom DNS du serveur (de la forme nom-serveur.ac-acad.fr) (CN=)"/> + <variable name='ssl_subjectaltname' type='domain_strict' description="Nom DNS alternatif du serveur" multi='True'/> + <variable name='le_extra_names' description="Nom de domaines supplémentaires" type="domain_strict" multi='True'/> + <variable name='le_config_dir' type='filename' description="Répertoire de configuration du client Let's Encrypt"> + <value>/etc/ssl/letsencrypt/conf</value> + </variable> + <variable name='le_work_dir' type='filename' description="Répertoire de travail du client Let's Encrypt"> + <value>/tmp/letsencrypt/work</value> + </variable> + <variable name='le_logs_dir' type='filename' description="Répertoire de journalisation du client Let's Encrypt"> + <value>/var/log/letsencrypt/</value> + </variable> + <variable name='le_server_addr' type='string' description="Adresse du serveur Let's Encrypt"/> + <variable name='le_server_port' type='port' description="Port d'écoute du serveur Let's Encrypt"/> + <variable name='le_client_mode' type='string' description="Mode de fonctionnement du client Let's Encrypt" mode='expert'> + <value>webroot</value> + </variable> + <variable name='le_http_01_port' type='port' description="Port d'écoute pour la requête http-01"> + <value>80</value> + </variable> + <variable name='le_tls_sni_port' type='port' description="Port d'écoute pour la requêt TLS-SNI"> + <value>443</value> + </variable> + <variable name='le_ssl_cert' type='filename' description='Chemin du certificat SSL par défaut'/> + <variable name='le_ssl_key' type='filename' description='Chemin de là clé privée SSL par défaut'/> + <variable name='le_ssl_pem' type='filename' description='Chemin de la chaine complète SSL par défaut'/> + </family> + + <separators> + <!-- certificats --> + <separator name='cert_type'>Choix du certificat SSL</separator> + <separator name='ssl_default_key_bits'>Paramètres SSL</separator> + <separator name='ssl_country_name'>Subject (DN)</separator> + <separator name='ssl_subjectaltname'>Nom Alternatif de la machine (SubjectAltName)</separator> + <separator name='le_config_dir'>Paramètres du client Let's Encrypt</separator> + <separator name='le_extra_names'>Certificats supplémentaires à demander</separator> + </separators> + </variables> + + <constraints> + <check name='valid_enum' target='cert_type'> + <param>['autosigné','letsencrypt','manuel']</param> + </check> + <check name='valid_enum' target='le_client_mode'> + <param>['webroot','standalone']</param> + </check> + <check name='valid_country' target='ssl_country_name'> + </check> + <fill name='calc_ssl_country_name' target='ssl_country_name'> + <param type='eole' name='valeur'>suffixe_domaine_academique</param> + </fill> + <fill name='calc_multi_val' target='ssl_organization_unit_name'> + <param>110 043 015</param> + <param type='eole' >nom_academie</param> + </fill> + <fill name='calc_multi_domains' target='ssl_subjectaltname'> + <param type='eole'>nom_domaine_machine</param> + <param type='eole' optional='True' hidden='False'>revprox_domainname</param> + <param type='eole' optional='True' hidden='False'>eolesso_adresse</param> + <param type='eole' optional='True' hidden='False'>web_url</param> + </fill> + <fill name='calc_val' target='ssl_server_name'> + <param type='eole'>nom_domaine_machine</param> + </fill> + + <auto name='concat' target='le_ssl_cert'> + <param type='eole'>le_config_dir</param> + <param>/live/</param> + <param type='eole'>nom_domaine_machine</param> + <param>/cert.pem</param> + </auto> + + <auto name='concat' target='le_ssl_key'> + <param type='eole'>le_config_dir</param> + <param>/live/</param> + <param type='eole'>nom_domaine_machine</param> + <param>/privkey.pem</param> + </auto> + + <auto name='concat' target='le_ssl_pem'> + <param type='eole'>le_config_dir</param> + <param>/live/</param> + <param type='eole'>nom_domaine_machine</param> + <param>/fullchain.pem</param> + </auto> + + <condition name='frozen_if_in' source='cert_type'> + <param>letsencrypt</param> + <param>autosigné</param> + <target type='variable'>server_cert</target> + <target type='variable'>server_key</target> + <target type='variable'>server_pem</target> + </condition> + + <condition name='frozen_if_in' source='cert_type'> + <param>letsencrypt</param> + <target type='variable'>ssl_server_name</target> + <target type='variable'>ssl_subjectaltname</target> + <target type='variable'>ssl_default_key_bits</target> + <target type='variable'>ssl_default_cert_time</target> + <target type='variable'>ssl_country_name</target> + <target type='variable'>ssl_organization_name</target> + <target type='variable'>ssl_organization_unit_name</target> + </condition> + + <condition name='disabled_if_not_in' source='cert_type'> + <param>letsencrypt</param> + <target type='variable'>le_server_addr</target> + <target type='variable'>le_server_port</target> + <target type='variable'>le_http_01_port</target> + <target type='variable'>le_tls_sni_port</target> + <target type='variable'>le_config_dir</target> + <target type='variable'>le_work_dir</target> + <target type='variable'>le_logs_dir</target> + <target type='variable'>le_extra_names</target> + <target type='variable'>le_client_mode</target> + <target type='variable'>le_ssl_cert</target> + <target type='variable'>le_ssl_key</target> + <target type='variable'>le_ssl_pem</target> + <target type='filelist'>le_active</target> + <target type='servicelist'>le_active</target> + </condition> + + <fill name='calc_multi_condition' target='server_cert'> + <param>manuel</param> + <param type='eole' name='condition_1'>cert_type</param> + <param name='default_match'>None</param> + <param name='mismatch'>/etc/ssl/certs/eole.crt</param> + </fill> + <fill name='calc_multi_condition' target='server_pem'> + <param>manuel</param> + <param type='eole' name='condition_1'>cert_type</param> + <param name='default_match'>None</param> + <param name='mismatch'>/etc/ssl/certs/eole.pem</param> + </fill> + </constraints> + + <help> + <variable name='server_cert'>Le certificat SSL doit être au format PEM et est généralement fourni dans un fichier avec l'extension "crt"</variable> + <variable name='server_key'>La clé privé doit être au format PEM et est généralement fournie dans un fichier avec l'extension "key"</variable> + <variable name='server_pem'>La chaîne de certification doit être au format PEM et est généralement fournie dans un fichier avec l'extension "pem"</variable> + <variable name='le_server_addr'>Adresse du serveur ACME utilisé pour la génération automatique des certificats </variable> + <variable name='le_client_mode'>Mode de fonctionnement du client ACME pour la demande de certificat, (standalone ou webroot)</variable> + <variable name='le_server_port'>Port d'écoute du serveur ACME utilisé pour la génération automatique des certificats</variable> + <variable name='le_http_01_port'>Port d'écoute à ouvrir pour la vérification http 01 du serveur ACME lors de la demande de certificat</variable> + <variable name='le_tls_sni_port'>Port d'écoute à ouvrir pour la vérification TLS-SNI du serveur ACME lors de la demande de certificat</variable> + <variable name='le_config_dir'>Répertoire de configuration du client ACME (Let's Encrypt)</variable> + <variable name='le_work_dir'>Répertoire de travail du client ACME</variable> + <variable name='le_logs_dir'>Répertoire de journalisation du client ACME</variable> + <variable name='le_extra_names'>Liste des noms de domaine pour les certificats supplémentaires a demander lors de la requête</variable> + </help> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/dictionaries/03_maj.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/dictionaries/03_maj.xml new file mode 100644 index 0000000000000000000000000000000000000000..5e8266cebe00d8c22158451a6abeed2741844b80 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/dictionaries/03_maj.xml @@ -0,0 +1,91 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + <file name='/etc/apt/apt.conf.d/03-eole-changelogs' /> + </files> + + <containers> + + <all> + <file name='/etc/apt/apt.conf.d/03-eole-changelogs' instance_mode='when_container'/> + </all> + + </containers> + + <variables> + <family name='général'> + <variable name='serveur_maj' type='domain' description='Serveur de mise à jour' multi='True' mandatory='True'> + <value>eole.ac-dijon.fr</value> + <value>ftp.crihan.fr</value> + </variable> + <variable name='ubuntu_update_mirrors' type='domain' description='Serveur de mise à jour Ubuntu' multi='True' mandatory='True' mode='expert' /> + <variable name='update_mail_notification' type='string' description='Événements de mise à jour à notifier par courriel' mode='expert'> + <value>aucun</value> + </variable> + <variable name='reboot_after_scheduled_majauto' type='oui/non' description='Redémarrer automatiquement après mise à jour planifiée' mode='expert'> + <value>oui</value> + </variable> + </family> + <family name='dépôt tiers' icon='debian' mode='expert'> + <variable name='additional_repository_name' type='string' description='Libellé du dépôt' multi='True'/> + <variable name='additional_repository_source' type='string' description="Déclaration du dépôt" mandatory='True'/> + <variable name='additional_repository_key_type' type='string' description='Méthode de récupération de la clé publique du dépôt' mandatory='True'> + <value>serveur de clés</value> + </variable> + <variable name='additional_repository_key_url' type='web_address' description='URL de la clé' mandatory='True'/> + <variable name='additional_repository_key_signserver' type='string' description='URL du serveur de clés' mandatory='True'/> + <variable name='additional_repository_key_fingerprint' type='string' description='Empreinte de la clé' mandatory='True'/> + </family> + <separators> + <separator name='serveur_maj'>Mise à jour</separator> + <separator name='additional_repository_name'>Configuration des dépôts tiers</separator> + </separators> + </variables> + + <constraints> + <check name='valid_regexp' target='additional_repository_source'> + <param>^((deb)|(deb-src)) (\[ .* \] )?(((http)|(https)|(ftp)|(ftps))://\S+) (\S+)(( \S+)+)?</param> + <param name='err_msg'>La déclaration d'un dépôt doit respecter le format one-line-style (man 5 sources.list)</param> + </check> + <fill name='auto_copy_val' target='ubuntu_update_mirrors'> + <param type='eole'>serveur_maj</param> + </fill> + <check name='valid_enum' target='update_mail_notification'> + <param>['aucun', 'queryauto', 'kernel', 'tous']</param> + </check> + <group master='additional_repository_name'> + <slave>additional_repository_source</slave> + <slave>additional_repository_key_type</slave> + <slave>additional_repository_key_url</slave> + <slave>additional_repository_key_signserver</slave> + <slave>additional_repository_key_fingerprint</slave> + </group> + <check name='valid_enum' target='additional_repository_key_type'> + <param>['serveur de clés','URL de la clé']</param> + </check> + <condition name='disabled_if_in' source='additional_repository_key_type'> + <param>serveur de clés</param> + <target type='variable'>additional_repository_key_url</target> + </condition> + <condition name='disabled_if_in' source='additional_repository_key_type'> + <param>URL de la clé</param> + <target type='variable'>additional_repository_key_signserver</target> + <target type='variable'>additional_repository_key_fingerprint</target> + </condition> + + </constraints> + + <help> + <family name='dépôt tiers'>Ajout de nouveaux paquets absents des dépôts officiels</family> + <variable name='serveur_maj'>Nom ou adresse IP du serveur de mise à jour</variable> + <variable name='update_mail_notification'>Activer les notifications par courriel pour certains événements liés à la mise à jour comme la disponibilité de mises à jour ou la nécecessité de redémarrer le serveur pour passer au dernier noyau installé.</variable> + <variable name='reboot_after_scheduled_majauto'>Si la valeur est à oui, la mise à jour planifiée est suivie de la reconfiguration du serveur puis du redémarrage du serveur si un nouveau noyau est disponible. Sinon, l’étape du redémarrage automatique est désactivée.</variable> + <variable name='additional_repository_source'>Déclaration du dépôt dans le style one-line attendu pour les fichiers .list : type options uri suite components (deb|deb-src [ option1=value1 option2=value2 ] uri suite [component1] [component2] [...])</variable> + <variable name='ubuntu_update_mirrors'>Nom ou adresse IP du serveur de mise à jour pour les paquets Ubuntu (utilise la valeur de serveur_maj par défaut)</variable> + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/dictionaries/03_schedule.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/dictionaries/03_schedule.xml new file mode 100644 index 0000000000000000000000000000000000000000..24c860143a3cd326e68b0f8fdb15b23636ef0604 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/dictionaries/03_schedule.xml @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="utf-8"?> +<creole> + <variables> + <family name='schedule' icon='calendar'> + <variable name='schedule_customize_tasks' type='oui/non' description='Personnaliser la fréquence des tâches schedule' mode='expert'> + <value>non</value> + </variable> + <variable name='schedule_custom_queryauto_day' type='string' description='Fréquence de la tâche schedule queryauto'> + <value>none</value> + </variable> + <variable name='schedule_custom_majauto_day' type='string' description='Fréquence de la tâche schedule majauto'> + <value>weekly</value> + </variable> + </family> + </variables> + <constraints> + <condition name='disabled_if_in' source='schedule_customize_tasks'> + <param>non</param> + <target>schedule_custom_queryauto_day</target> + <target>schedule_custom_majauto_day</target> + </condition> + <check name='valid_enum' target='schedule_custom_queryauto_day'> + <param>['none', 'daily', 'weekly', 'monthly']</param> + </check> + <check name='valid_enum' target='schedule_custom_majauto_day'> + <param>['none', 'daily', 'weekly', 'monthly']</param> + </check> + </constraints> + <help> + <family name='schedule'>Personnalisation de la fréquence des tâches planifiées</family> + <variable name='schedule_customize_tasks'>Donne accès aux fréquences de déclenchement (jamais, une fois par jour, une fois par semaine, une fois par mois) de certaines tâches schedule.</variable> + <variable name='schedule_custom_queryauto_day'>La fréquence à laquelle la tâche queryauto (vérification de la disponibilité de mises à jour) est automatiquement exécutée (jamais par défaut).</variable> + <variable name='schedule_custom_majauto_day'>La fréquence à laquelle la tâche majauto (mise à jour effective du système) est automatiquement exécutée (une fois par semaine par défaut).</variable> + </help> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/dictionaries/99-network.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/dictionaries/99-network.xml new file mode 100644 index 0000000000000000000000000000000000000000..33c1f288bfe0a687127fbf952111cd5687f4bd3f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/dictionaries/99-network.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + <files> + <service>bastion</service> + <file name='/etc/eole/bastion.conf'/> + </files> + <variables/> + <constraints/> + <help/> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/etc/default/grub.d/eole.cfg b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/etc/default/grub.d/eole.cfg new file mode 100644 index 0000000000000000000000000000000000000000..49b483bbc1c5b3db1a2e32e5a7e849dbf0a3aef8 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/etc/default/grub.d/eole.cfg @@ -0,0 +1 @@ +GRUB_DISTRIBUTOR="EOLE" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/etc/dhcp/dhclient-enter-hooks.d/dhcp-eole b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/etc/dhcp/dhclient-enter-hooks.d/dhcp-eole new file mode 100644 index 0000000000000000000000000000000000000000..f1d662e23b95be968403827eae666c99b699850d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/etc/dhcp/dhclient-enter-hooks.d/dhcp-eole @@ -0,0 +1,13 @@ +#!/bin/sh +#conserve les serveurs DNS dans un fichier specifique a EOLE + +DOMAIN_EOLE_CONF=/etc/eole/resolv.conf.dhclient + + +rm -f /etc/eole/resolv.conf.dhclient +domain_setup() { + if [ -n "$new_domain_name_servers" ]; then + echo "$new_domain_name_servers" > $DOMAIN_EOLE_CONF + fi +} +domain_setup diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/etc/dhcp/dhclient-exit-hooks.d/bastion b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/etc/dhcp/dhclient-exit-hooks.d/bastion new file mode 100644 index 0000000000000000000000000000000000000000..14c6f54dbcfe1f0b0c06670d7fe5ba04cd4da062 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/etc/dhcp/dhclient-exit-hooks.d/bastion @@ -0,0 +1,30 @@ +# -*- sh -*- + +#------------------------------------------------------------------------ +# bastion - Restart bastion on DHCP BOUND +# Copyright © 2014 Pôle de compétences EOLE <eole@ac-dijon.fr> +# +# License CeCILL: +# * in french: http://www.cecill.info/licences/Licence_CeCILL_V2-fr.html +# * in english http://www.cecill.info/licences/Licence_CeCILL_V2-en.html + +# Check if some IP parameters has changed +is_ip_changed() { + [ "${new_ip_address}" != "${old_ip_address}" ] \ + || [ "${new_network_number}" != "${old_network_number}" ] \ + || [ "${new_subnet_mask}" != "${old_subnet_mask}" ] \ + || [ "${new_broadcast_address}" != "${old_broadcast_address}" ] \ + || [ "${new_routers}" != "${old_routers}" ] \ + || [ "${new_domain_name}" != "${old_domain_name}" ] \ + || [ "${new_domain_name_servers}" != "${old_domain_name_servers}" ] \ + || [ "${new_netbios_name_servers}" != "${old_netbios_name_servers}" ] \ + || [ "${new_ntp_servers}" != "${old_ntp_servers}" ] +} + +if [ "${reason}" = "BOUND" ] +then + if is_ip_changed + then + /usr/sbin/bastion regen + fi +fi diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/etc/grub.d/90_eole_default_kernel b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/etc/grub.d/90_eole_default_kernel new file mode 100644 index 0000000000000000000000000000000000000000..deeae7c5f568a21a9ffe28051d9984605d480b7d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/etc/grub.d/90_eole_default_kernel @@ -0,0 +1,73 @@ +#!/bin/sh +set -e + +# grub-mkconfig helper script. +# Copyright (C) 2011-2014 Equipe EOLE <eole@ac-dijon.fr> +# +# eole-common is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# GRUB is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with eole-kernel-version. If not, see <http://www.gnu.org/licenses/>. + +# This script will set the default entry used by grub based on local +# configuration in /usr/share/eole/noyau/local. + +prefix=/usr +exec_prefix=${prefix} +bindir=${exec_prefix}/bin +libdir=${exec_prefix}/lib +. ${libdir}/grub/grub-mkconfig_lib + +EOLE_GRUB_REGEX=invalid-kernel-regexp +EOLE_KERNEL_DIR=/usr/share/eole/noyau +EOLE_KERNEL_LOCAL=${EOLE_KERNEL_DIR}/local + +INITRD_DIR=/var/lib/initramfs-tools + +# If no local kernel config, back to default +grub-set-default 0 + +# No local kernel +test -f "${EOLE_KERNEL_LOCAL}" || exit 0 + +EOLE_GRUB_REGEX=$(head -n1 "${EOLE_KERNEL_LOCAL}") +if test -z "${EOLE_GRUB_REGEX}" +then + echo "Empty local kernel configuration file ${EOLE_KERNEL_LOCAL}." >&2 + exit 0 +fi +list=`for i in /boot/vmlinu[xz]-* /vmlinu[xz]-* /boot/kernel-* ; do + if grub_file_is_not_garbage "$i" ; then echo -n "$i " ; fi + done` + +in_submenu=false +submenu="" +while [ "x$list" != "x" ] ; do + linux=`version_find_latest $list` + if $(echo -n ${linux} | grep -qP "${EOLE_GRUB_REGEX}") + then + basename=`basename $linux` + version=`echo $basename | sed -e "s,^[^0-9]*-,,g"` + version_title=`grep "menuentry.*${version}" /boot/grub/grub.cfg | cut -d "'" -f4 | head -n 1` + echo "Found default kernel '${submenu}${version_title}' matching '${EOLE_GRUB_REGEX}'" >&2 + test -x /usr/sbin/grub-set-default && grub-set-default "${submenu}${version_title}" >&2 + test -d ${EOLE_KERNEL_DIR} \ + && echo ${version} >| ${EOLE_KERNEL_DIR}/current + test -d ${INITRD_DIR} && ! test -f ${INITRD_DIR}/${version} \ + && echo ${version} > ${INITRD_DIR}/${version} + break + fi + if [ "$list" ] && ! $in_submenu; then + submenu="$(gettext_printf "Advanced options for %s" "${GRUB_DISTRIBUTOR} GNU/Linux")>" + in_submenu=: + fi + list=`echo $list | tr ' ' '\n' | grep -vx $linux | tr '\n' ' '` +done diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/etc/profile.d/default_eole.sh b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/etc/profile.d/default_eole.sh new file mode 100644 index 0000000000000000000000000000000000000000..3ead2d4fcd5da267d3f632730868d8e73b9de1cc --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/etc/profile.d/default_eole.sh @@ -0,0 +1 @@ +PATH=$PATH:/usr/share/eole/sbin diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/etc/systemd/system/ntp.service.d/override.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/etc/systemd/system/ntp.service.d/override.conf new file mode 100644 index 0000000000000000000000000000000000000000..b622c5da370855ee14bb8d7b2b2955add6022bbb --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/etc/systemd/system/ntp.service.d/override.conf @@ -0,0 +1,3 @@ +[Unit] +After=time-sync.target +Wants=time-sync.target diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/lib/systemd/system/bastion.service b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/lib/systemd/system/bastion.service new file mode 100644 index 0000000000000000000000000000000000000000..07b1a014c750a7349735cf21fae185ba9bb8efc3 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/lib/systemd/system/bastion.service @@ -0,0 +1,16 @@ +[Unit] +Description=Bastion firewall manager +ConditionPathExists=/usr/lib/eole/forteresse.sh +ConditionPathExists=!/var/lock/bastion +After=multi-user.target + +[Service] +Type=oneshot +RemainAfterExit=yes +ExecStart=/usr/sbin/bastion start --systemd +ExecStartPost=/usr/bin/touch /var/lock/bastion +ExecStop=/usr/sbin/bastion stop --systemd +ExecStopPost=/bin/rm -rf /var/lock/bastion + +[Install] +WantedBy=multi-user.target diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/lib/systemd/system/ferme-firewall.service b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/lib/systemd/system/ferme-firewall.service new file mode 100644 index 0000000000000000000000000000000000000000..e438d63148e110030cf22ee87bcb7c2d957f724b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/lib/systemd/system/ferme-firewall.service @@ -0,0 +1,14 @@ +[Unit] +Description=Fermeture du firewall +DefaultDependencies=no +After=local-fs.target +Before=network-pre.service +ConditionPathExists=/usr/lib/eole/forteresse.sh + +[Service] +Type=oneshot +ExecStart=/usr/sbin/ferme.firewall --no-container +SyslogIdentifier=forteresse + +[Install] +WantedBy=multi-user.target diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/lib/systemd/system/netplan-apply.service b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/lib/systemd/system/netplan-apply.service new file mode 100644 index 0000000000000000000000000000000000000000..406177c7169b6a6ca4f90143c18ee330e494806d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/lib/systemd/system/netplan-apply.service @@ -0,0 +1,16 @@ +[Unit] +Description=Apply netplan config +Wants=network.target +After=local-fs.target network-pre.target apparmor.service systemd-sysctl.service systemd-modules-load.service +Before=network.target shutdown.target network-online.target + +[Install] +WantedBy=multi-user.target +RequiredBy=network-online.target + +[Service] +Type=oneshot +ExecStart=/usr/sbin/eole-purge-interfaces +ExecStart=/usr/sbin/netplan apply +RemainAfterExit=true + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/lib/systemd/system/netplan-wait-online.service b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/lib/systemd/system/netplan-wait-online.service new file mode 100644 index 0000000000000000000000000000000000000000..34beb9c93b0b2cb65cd1641427c4dc040385f81d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/lib/systemd/system/netplan-wait-online.service @@ -0,0 +1,15 @@ +[Unit] +Description=Wait for Network to be Configured by Netplan +DefaultDependencies=no +Conflicts=shutdown.target +Requires=netplan-apply.service +After=netplan-apply.service +Before=network-online.target shutdown.target + +[Service] +Type=oneshot +ExecStart=/lib/systemd/systemd-networkd-wait-online +RemainAfterExit=yes + +[Install] +WantedBy=network-online.target diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/lib/systemd/system/ntpdate.service b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/lib/systemd/system/ntpdate.service new file mode 100644 index 0000000000000000000000000000000000000000..5d7d8cef01c585b3f54e5c238a82ef4fee56808c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/lib/systemd/system/ntpdate.service @@ -0,0 +1,18 @@ +[Unit] +Description=Force synchronisation of time +ConditionPathExists=/etc/default/ntpdate +DefaultDependencies=no +Conflicts=shutdown.target +After=network-online.target +Before=time-sync.target shutdown.target +Wants=network-online.target time-sync.target + +[Service] +Type=oneshot +Environment="NTPSERVERS=pool.ntp.org" +EnvironmentFile=/etc/default/ntpdate +ExecStart=/usr/sbin/ntpdate -v $NTPSERVERS +RemainAfterExit=yes + +[Install] +WantedBy=sysinit.target diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/sbin/bastion b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/sbin/bastion new file mode 100644 index 0000000000000000000000000000000000000000..e19bc88c51a33506fd3c992eaad83cdc60f6eb49 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/sbin/bastion @@ -0,0 +1,266 @@ +#!/bin/sh + +# +# Transition script for bastion systemd trip +# + + +RETVAL=0 +[ "$TERM" = "dumb" ] && export TERM=eole +. /lib/lsb/init-functions + +# Don't regen bastion rules if server is not instanciate +[ -f /etc/eole/bastion.conf ] && . /etc/eole/bastion.conf || exit 0 + +export TPUT=/usr/bin/tput +export EXPR=/usr/bin/expr +#test si TPUT est utilisable +if [ ! "$TERM" = "" ] && $TPUT hpa 60 >/dev/null 2>&1 && $TPUT setaf 1 >/dev/null 2>&1; then + FANCYTTY=1 + COLS=`$TPUT cols` + if [ "$COLS" ] && [ "$COLS" -gt 6 ]; then + COL=`$EXPR $COLS - 7` + else + COLS=80 + COL=73 + fi + export COL +else + FANCYTTY=0 +fi +CACHE='/etc/eole/iptables' +CACHEMOD='/etc/eole/bastion-modules' +CACHESET='/etc/eole/ipset' +CACHEINCLUSION='/etc/eole/inclusion_statique' +TCPWRAPPER='/etc/eole/hosts.allow' +TCPWRAPPER_DEST='/etc/hosts.allow' + +INITQOS='/usr/share/eole/sbin/qoseole' +CONFQOS='/etc/qoseole.conf' +LOCKQOS='/var/lock/qoseole' +INITRVP='strongswan' +HA_RSC_FILE="/etc/ha.d/.rsc_list" +if [ "$install_rvp" = "oui" ] +then + if [ "$sw_database_mode" = "oui" ] + then + CONFRVP='/etc/ipsec.d/ipsec.db' + else + CONFRVP='/etc/ipsec.secrets' + fi +else + CONFRVP='' +fi +INITAGR='/usr/share/eole/sbin/agregation' +CONFAGR='/etc/agregation.conf' +LOCKAGR='/var/lock/agregation' +SOCKETLOG='/run/systemd/journal/syslog' + +[ "$TERM" = "dumb" ] && export TERM="eole" + +logit() { + # log dans syslog + /usr/bin/logger -u "$SOCKETLOG" -t "bastion" -p local2.info "$1" +} +logit2(){ + # log dans syslog et sur la console + FAILURE=$2 + logit "$1" + log_begin_msg "$1" + if [ "$FAILURE" = "failed" ]; then + log_end_msg 1 + fi +} +test_iptables(){ + if [ ! -x /sbin/iptables ];then + MSG="Erreur : /sbin/iptables non exécutable !" + logit2 "$MSG" "failed" + exit 1 + fi + iptables -nL >/dev/null + if [ $? -ne 0 ];then + MSG="Erreur iptables, vérifiez le noyau Linux utilisé par le serveur" + logit2 "$MSG" "failed" + exit 1 + fi +} + +firewall_start() { + test_iptables + if [ ! -x /usr/share/eole/firewall.start ] + then + logit2 "Pas de script permettant la prise en compte des règles de pare-feu" "failed" + return 1 + fi + echo -n " * Regénération des règles de pare-feu" + . /usr/share/eole/firewall.start + RETVAL=$? + log_end_msg $RETVAL + + return $RETVAL +} +start() { + if [ ! -e $CACHE ]; then + MSG="Erreur : pas de règle de pare-feu en cache, lancer $0 regen" + logit2 "$MSG" "failed" + stop + exit 1 + fi + MSG="Restauration des règles de pare-feu en cache" + logit2 "$MSG" + + test_iptables + [ -f $CACHEMOD ] && sh $CACHEMOD + [ -f $CACHESET ] && ipset restore -exist < $CACHESET + iptables-restore < $CACHE + RETVAL=$? + [ -f "$CACHEINCLUSION" ] && sh "$CACHEINCLUSION" + if [ "$mode_conteneur_actif" = "oui" ] + then + CreoleRun "service bastion start" all no yes + fi + [ -f $TCPWRAPPER ] && /bin/cp -f $TCPWRAPPER $TCPWRAPPER_DEST + #rules outside bastion scope + /bin/run-parts /usr/share/eole/bastion/post_cache + log_end_msg $RETVAL + if [ $RETVAL -eq 0 ]; then + #lancement de la qos si activée + if [ -e $CONFQOS ] && [ -x $INITQOS ] + then + logit "Mise en place des règles de QOS" + $INITQOS start + fi + #lancement de l'agrégation si activée + if [ -e $CONFAGR ] && [ -x $INITAGR ] + then + logit "Mise en place des règles d'agrégation" + $INITAGR start + fi + #lancement du rvp si activé + ## LE RVP DOIT ETRE LANCE EN DERNIER !!! + if [ -e $CONFRVP ] && [ "$install_rvp" = "oui" ] + then + INITRVP_ACTION="yes" + # Look if VPN is managed by Pacemaker + if [ -e $HA_RSC_FILE ] + then + while read LINE + do + SCE=$(echo "$LINE"|cut -d " " -f3) + if [ "$SCE" == "$INITRVP" ] + then + echo "HA STRONGSWAN" + INITRVP_ACTION="no" + break + fi + done< $HA_RSC_FILE + fi + # Stop VPN to be sure start action adds routes + # and specifics iptables rules for VPN + # * It will start automatically if managed by Pacemaker + service $INITRVP stop + # Start VPN if not managed by Pacemaker + if [ "$INITRVP_ACTION" == "yes" ] + then + logit "Mise en place des règles RVP" + service $INITRVP start + fi + fi + else + exit 1 + fi + return $RETVAL +} + +stopother() { + # arrêt des autres programmes gérés par bastion + if [ -e $LOCKQOS ] + then + logit "Arrêt des règles de QOS" + $INITQOS stop + fi + if [ -e $LOCKAGR ] + then + logit "Arrêt des règles d'agrégation" + $INITAGR stop + fi + ## LE RVP DOIT ETRE ARRETE EN DERNIER (juste avant le flush iptables) + if [ -e $CONFRVP ] && [ "$install_rvp" = "oui" ] + then + service $INITRVP stop + fi +} + +stop() { + silent=$1 + logit "Stopping firewall: bastion" + if [ ! -x /usr/sbin/ferme.firewall ] + then + logit2 "pas de script permettant la suppression des règles de pare-feu" "failed" + return 1 + fi + test_iptables + /usr/sbin/ferme.firewall $silent + RETVAL=$? + + if [ "$mode_conteneur_actif" = "oui" ] + then + CreoleRun "service bastion stop" all no yes + fi + + log_end_msg $RETVAL + stopother + return $RETVAL +} + +case "$1" in + start) + if [ "${2}" != "--systemd" ] + then + logit2 "'bastion start' interdit, utiliser 'service bastion start'" + else + start + fi + ;; + + stop) + if [ "${2}" != "--systemd" ] + then + logit2 "'bastion stop' interdit, utiliser 'service bastion stop'" + else + stop + fi + ;; + + regen|restart) + if [ $1 = "restart" ] + then + logit2 "L'option 'restart' est obsolète utiliser : " + logit2 " 'service bastion restart' pour relancer le service" + logit2 " 'bastion regen' pour regénérer et appliquer les règles du pare-feu" + fi + + stop yes + + firewall_start + RETVAL=$? + MSG="Mise en cache des règles de pare-feu" + if [ $RETVAL -eq 0 ]; then + logit2 "$MSG" + log_end_msg 0 + start + else + if [ -f $CACHE ]; then + MSG="$MSG (utiliser 'CreoleService bastion restart' pour appliquer l'ancien cache)" + logit2 "$MSG" "failed" + fi + stop + fi + ;; + + *) + echo "Usage: $0 regen" + exit 1 +esac + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/sbin/eole-purge-interfaces b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/sbin/eole-purge-interfaces new file mode 100644 index 0000000000000000000000000000000000000000..71712b25fd89d5eb695d7528953ff6c88f6cc981 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/sbin/eole-purge-interfaces @@ -0,0 +1,149 @@ +#!/usr/bin/python3 +# -*- mode: python; coding: utf-8 -*- +# +########################################################################## +# eole-purge-interfaces - flush IP addresses and delete virtual devices +# Copyright © 2018 Pôle de compétences EOLE <eole@ac-dijon.fr> +# +# License CeCILL: +# * in french: http://www.cecill.info/licences/Licence_CeCILL_V2-fr.html +# * in english http://www.cecill.info/licences/Licence_CeCILL_V2-en.html +########################################################################## +"""Flush IP addresses and delete virtual devices + +""" + +import sys +import os +import glob + +from subprocess import Popen, PIPE + +from pyeole.i18n import i18n + +_ = i18n('eole-purge-interfaces') + +ENCODING = sys.stdout.encoding +if ENCODING is None: + ENCODING = 'UTF-8' + + +def _exec(cmd): + """Execute a command and return the retcode, stdout and stderr + + :param list cmd: command to execute + :returns tuple: return code, standard output and standard error + """ + process = Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=PIPE) + stdout, stderr = process.communicate(None) + return_code = process.returncode + + return return_code, stdout.decode(ENCODING), stderr.decode(ENCODING) + + +def get_ip_interfaces(): + """Return the list of all interface names with an IP address + + """ + cmd = ['/sbin/ip', '-o', 'addr', 'show'] + code, stdout, stderr = _exec(cmd) + + if code != 0: + raise Exception(_('Error running command {0} : {1}').format(' '.join(cmd), stderr)) + + devs = set() + for line in stdout.splitlines(): + dev = line.strip().split() + if dev[1] == 'lo': + continue + + devs.add(dev[1]) + + return list(devs) + + +def get_virtual_devices(): + """Return the list of all virtual interface names + + """ + virtual_devices = [] + for dirname in glob.glob('/sys/class/net/*'): + name = os.path.basename(dirname) + if name == 'lo' or not os.path.islink(dirname) or os.path.islink(os.path.join(dirname, 'device', 'driver')): + continue + + virtual_devices.append(name) + + virtual_devices.sort() + return virtual_devices + +def down_interface(interface): + """Disable the interface `interface` + + :param str interface: name of the interface + :return bool: if the down command was sucessfull + """ + down_cmd = ['ip', 'link', 'set', interface, 'down'] + msg = _("Disable the interface '{interface}'... ") + print(msg.format(interface=interface), end='') + code, stdout, stderr = _exec(down_cmd) + if code == 0: + print("OK") + return True + + print(_("error: {error}").format(error=stderr)) + return False + + +def flush_interface(interface): + """Flush all IP addresses of the interface `interface` + + :param str interface: name of the interface + :return bool: if the flush command was sucessfull + """ + flush_cmd = ['ip', 'addr', 'flush', interface] + msg = _("Flush IP addresses of the interface '{interface}'... ") + print(msg.format(interface=interface), end='') + code, stdout, stderr = _exec(flush_cmd) + if code == 0: + print("OK") + return True + + print(_("error: {error}").format(error=stderr)) + return False + + +def delete_interface(interface): + """Delete the interface `interface` + + :param str interface: name of the interface + :return bool: if the delete command was sucessfull + """ + delete_cmd = ['ip', 'link', 'delete', interface] + msg = _("Delete the interface '{interface}'... ") + print(msg.format(interface=interface), end='') + code, stdout, stderr = _exec(delete_cmd) + if code == 0: + print("OK") + return True + + print(_("error: {error}").format(error=stderr)) + return False + + +def main(): + """Flush the IP addresses and delete virtual interfaces + + """ + print(_("Purge all interfaces... ")) + ip_interfaces = get_ip_interfaces() + virtual_interfaces = get_virtual_devices() + for interface in ip_interfaces: + down_interface(interface) + flush_interface(interface) + + for interface in virtual_interfaces: + delete_interface(interface) + +if __name__ == '__main__': + main() diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/sbin/ferme.firewall b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/sbin/ferme.firewall new file mode 100644 index 0000000000000000000000000000000000000000..bbad1dd9e499b71533dc488459cb7fa59ff07fc0 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/sbin/ferme.firewall @@ -0,0 +1,88 @@ +#!/bin/sh + +# Define LSB log_* functions. +# Depend on lsb-base (>= 3.2-14) to ensure that this file is present +# and status_of_proc is working. + +VERBOSE=true +CONTAINER=true + +usage() { + cat <<EOF +Usage: $(basename ${0}) [OPTIONS] + +Close the firewall on the server and in LXC containers. + +Options: +-------- + + --no-container Do not try to close firewall in LXC containers + -s, --silent Do not display messages on stdout + --help Show this message +EOF +} + +# Option management +TEMP=$(getopt -o sh --long silent,no-container,help -- "$@") +test $? = 0 || exit 1 +eval set -- "${TEMP}" + +while true +do + case "${1}" in + # Default options for utilities + -h|--help) + usage + exit 0 + ;; + + # Program options + -s|--silent) + VERBOSE=false + shift + ;; + + --no-container) + CONTAINER=false + shift + ;; + + # End of options + --) + shift + break + ;; + *) + echo "Error: unknown argument '${1}'" + exit 1 + ;; + esac +done + +# Compatibility with old command line usage +if [ $# -eq 1 -a "$1" = 'yes' ] +then + VERBOSE=false +fi + +FORTERESSE=/usr/lib/eole/forteresse.sh + +if [ -f "${FORTERESSE}" ] +then + . ${FORTERESSE} + forteresse_start + + if [ "${CONTAINER}" = 'true' ] + then + # lancement de firewall.stop sur chaque conteneur + close_all_containers + fi +else + echo "Impossible d’activer le mode forteresse, serveur instancié ?" + exit 1 +fi + +if [ "${VERBOSE}" = 'true' ] +then + echo "Le serveur est protégé. Pour relancer le pare-feu, exécuter \"CreoleService bastion restart\"" +fi diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/bash-completion/completions/CreoleSet b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/bash-completion/completions/CreoleSet new file mode 120000 index 0000000000000000000000000000000000000000..9f276cce2cd58b01d17b628499370604ca7698c3 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/bash-completion/completions/CreoleSet @@ -0,0 +1 @@ +CreoleGet \ No newline at end of file diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/bastion/data/00-static_rules b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/bastion/data/00-static_rules new file mode 100644 index 0000000000000000000000000000000000000000..f33bbb94807f8d1a8935b93808e6bf6230b3684c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/bastion/data/00-static_rules @@ -0,0 +1,30 @@ +#!/bin/bash +## Reinitialisation des chaines +/sbin/iptables -F +/sbin/iptables -t nat -F +/sbin/iptables -t mangle -F + +## on vide les regles utilisateurs +/sbin/iptables -X +/sbin/iptables -t nat -X +/sbin/iptables -t mangle -X + +## mise en place de la politique par defaut +/sbin/iptables -P INPUT DROP +/sbin/iptables -P OUTPUT ACCEPT +/sbin/iptables -P FORWARD DROP + +## Charger le module NAT +modprobe iptable_nat + +## Insere les modules de suivie de connexion +modprobe ip_conntrack + +## trafic illimite autorise sur l'interface locale +/sbin/iptables -A INPUT -i lo -j ACCEPT +/sbin/iptables -A OUTPUT -o lo -j ACCEPT + +/sbin/iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT + +## retour des requetes vers l'extérieur (#2261, #15903) +/sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/bastion/post_cache/README b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/bastion/post_cache/README new file mode 100644 index 0000000000000000000000000000000000000000..b762e45781e4de1b563e288331f0707945a16fe1 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/bastion/post_cache/README @@ -0,0 +1 @@ +Put here iptables rules not stored in cache. diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/certs/00_root.gen_cert b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/certs/00_root.gen_cert new file mode 100644 index 0000000000000000000000000000000000000000..33f919ad22595096bdff021d88497da30d5455d5 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/certs/00_root.gen_cert @@ -0,0 +1,4 @@ +#on genere le certificat eole.crt dans tous les cas +gen_certif(certfile='/etc/ssl/certs/eole.crt', keyfile='/etc/ssl/private/eole.key', regen=regen) +#creation de eole.pem (concatenation de eole.crt et eole.key) +concat_fic('/etc/ssl/certs/eole.pem', ['/etc/ssl/certs/eole.crt', '/etc/ssl/private/eole.key'], True) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/diagnose/00-systemd b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/diagnose/00-systemd new file mode 100644 index 0000000000000000000000000000000000000000..f68292ed5a129467653475c94d1da8e6e185667a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/diagnose/00-systemd @@ -0,0 +1,53 @@ +#!/bin/bash + +function is_running() { + state=$1 + container=$2 + error=0 + case $state in + running) + ;; + initializing|starting) + msg="Attention, serveur en cours de démarrage ($state)" + error=1 + ;; + stopping) + msg="Attention, serveur en cours d'arrêt" + error=1 + ;; + degraded) + lstsrvs=$(CreoleRun 'systemctl --state=failed --no-legend' $container \ + | awk '{print $1 " " $2 " " $3}') + msg="Attention, serveur opérationnel mais des services ne sont pas démarrés" + # Défaut d'indentation volontaire merci de ne pas y toucher. + msg="${msg} : + +${lstsrvs} +" + # À partir d'ici tout défaut d'indentation est involontaire + error=1 + ;; + *) + msg="Attention, état du serveur inconnu ($state)" + error=1 + esac + if [ $error = 1 ]; then + . /usr/lib/eole/diagnose.sh + if [ ! $container = 'root' ]; then + msg="$msg dans le conteneur $container" + fi + EchoRouge "$msg" + fi +} + +is_running $(systemctl is-system-running) 'root' + +if [[ $(CreoleGet mode_conteneur_actif) == "oui" ]] +then + for grp in $(CreoleGet --groups); do + if [[ ${grp} != 'root' ]] && [[ ${grp} != 'all' ]]; then + is_running "$(CreoleRun 'systemctl is-system-running' $grp)" $grp + fi + done +fi +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/diagnose/01-server b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/diagnose/01-server new file mode 100644 index 0000000000000000000000000000000000000000..155bc8ab426aaaf2ea1127e3d8afb941a7b0f9cd --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/diagnose/01-server @@ -0,0 +1,36 @@ +#!/bin/bash +if [ "$Verbose" != "yes" ] +then + exit 0 +fi + +. /usr/lib/eole/ihm.sh + +EchoGras "*** Configuration matérielle du serveur" +echo + +Vendeur=`dmidecode -s system-manufacturer` +Materiel=`dmidecode -s system-product-name` + +tempfile=$(mktemp) +/usr/bin/lshw -short -disable CPUID > $tempfile 2>/dev/null + +echo "Type : " +echo "$Materiel - $Vendeur" +echo + +echo "Processeur :" +/bin/grep "processor" $tempfile | awk -F "processor" '{print $2}' +echo + +echo "Carte réseau :" +/bin/grep "network" $tempfile | awk -F "network" '{print $2}' +echo + +echo "Disques :" +/bin/grep "disk" $tempfile | /bin/grep -v "partition" | awk -F "disk" '{print $2}' +echo + +rm $tempfile + +Pause diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/diagnose/02-disk b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/diagnose/02-disk new file mode 100644 index 0000000000000000000000000000000000000000..75da2a44311a01bc01fbc9f3379257e01e4880d6 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/diagnose/02-disk @@ -0,0 +1,19 @@ +#!/bin/bash +if [ "$Verbose" != "yes" ] +then + exit 0 +fi + +. /usr/lib/eole/ihm.sh + +EchoGras "*** Occupation des disques" +echo + +df -h +echo + +echo "Inode disques :" +df -ih +echo + +Pause diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/diagnose/03-packages b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/diagnose/03-packages new file mode 100644 index 0000000000000000000000000000000000000000..d968ab033b071efdf291e9c08401500f80eddb0a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/diagnose/03-packages @@ -0,0 +1,58 @@ +#!/bin/bash + +. /usr/lib/eole/ihm.sh + +Kernel=$(uname -sr) +tempfile=$(mktemp) + +EchoGras "*** Paquets installés" + +echo +echo -n "Noyau linux : $Kernel" +if command -v hwe-support-status > /dev/null +then + echo -n " => " + if LANG=C hwe-support-status --verbose | grep -qs 'is supported' + then + EchoVert "OK" + else + NEW_KERNEL=$(hwe-support-status --verbose \ + | sed -n -e '/apt-get install/ s,.*\(linux-image-generic[^[:space:]]*\).*,\1,p') + + if [ -n "${NEW_KERNEL}" ] + then + EchoRouge "non maintenu => $(EchoVert "installer ${NEW_KERNEL}")" + else + EchoRouge "non maintenu => nouveau noyau installé, vous devez redémarrer" + fi + fi +else + echo +fi +echo + +if [ "$Verbose" != "yes" ] +then + exit 0 +fi + +echo -n "Vérification des paquets installés : " +dpkg -C > $tempfile +if [ -s $tempfile ];then + EchoRouge "Attention" + cat $tempfile +else + EchoVert "OK" +fi +echo +echo "Vérification des mises à jour..." +Query-Auto +echo +Pause + +echo +echo "Dernières actions Creole" +echo +tail -n20 /var/log/rsyslog/local/zephir/zephir.log +echo +Pause diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/diagnose/04-network b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/diagnose/04-network new file mode 100644 index 0000000000000000000000000000000000000000..199df9cdef2d0c6c75d36f27fe2a6682b7f220d3 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/diagnose/04-network @@ -0,0 +1,133 @@ +#!/bin/bash + +. /usr/lib/eole/diagnose.sh + +#EOLERELEASE="/etc/eole/release" +#if [ ! -e $EOLERELEASE ]; then +# EchoRouge "Fichier $EOLERELEASE est introuvable" +# exit 1 +#fi +#. $EOLERELEASE +# +#EchoGras "*** Test du module $EOLE_MODULE version $EOLE_VERSION ($nom_machine $numero_etab) ***" +#echo + +EOLE_DIR="/usr/share/eole/creole" +nom_machine=$(CreoleGet nom_machine) +adresse_ip_gw=$(CreoleGet adresse_ip_gw) +nombre_interfaces=$(CreoleGet nombre_interfaces) + +EchoGras "*** Cartes réseau" +for numint in $(seq 0 $[nombre_interfaces-1]); do + int=$(CreoleGet nom_zone_eth$numint) + echo -n "$int: " + if ! /sbin/ifconfig $int > /dev/null 2>&1 + then + EchoRouge "inexistante" + else + set -o pipefail + if ! ethtool $int 2>/dev/null \ + | grep -E "Speed|Duplex|Link detected" \ + | tr -d '\t' \ + | tr '\n' ' ' + then + EchoRouge " impossible de diagnostiquer l'interface" + else + echo + fi + fi +done +cat /proc/net/dev | awk -F ":" '{print $1}' | sed 's/[[:blank:]]//g' | grep "^eth" | grep -v '\.' | sed 's/^eth//g'| sort -n | while read num; do + [ $num -ge $nombre_interfaces ] && echo -n "eth$num: " && EchoOrange "non prise en compte" +done +echo + +EchoGras "*** Interfaces" +Cpt=0 +while [ $Cpt -lt $nombre_interfaces ]; do + if [ $(CreoleGet eth${Cpt}_method) != 'manuel' ]; then + ip=$(CreoleGet adresse_ip_eth$Cpt) + name=$(CreoleGet nom_machine_eth$Cpt 2>/dev/null) + if [ -z "$name" ];then + name=$nom_machine + fi + TestIP $ip $name + else + echo -n "eth${Cpt}: " && echo "configuration manuelle" + fi + let Cpt=Cpt+1 +done +echo + +EchoGras "*** Services distants" + +if [ -n "$adresse_ip_gw" ] && [ "$adresse_ip_gw" != "0.0.0.0" ]; then + if [ "$(CreoleGet activer_agregation non)" = "oui" ]; then + TestARP $adresse_ip_gw "Passerelle $adresse_ip_gw" "eth0" + for passerelle in $(CreoleGet alias_gw_eth0); do + TestARP $passerelle "Passerelle $passerelle" "eth0" + done + else + TestARP $adresse_ip_gw "Passerelle $adresse_ip_gw" + fi +fi + +IPS_DNS_USER=$(CreoleGet adresse_ip_dns) +IPS_DNS_DHCP=$(CreoleGet adresse_ip_dns_du_dhcp) +if [ -n "${IPS_DNS_USER}" ] +then + IPS_DNS="${IPS_DNS_USER}" +elif [ -n "${IPS_DNS_DHCP}" ] +then + IPS_DNS="${IPS_DNS_DHCP}" +fi + +for dns in $(CreoleGet ad_address '') $(CreoleGet ad_rescue '') ${IPS_DNS}; do + for dnsname in $(CreoleGet test_distant_domaine); do + TestDns $dns $dnsname + [ $? = 0 ] && break + done +done + +# hack pour que le libellé soit aligné malgré l'accent ;) +len=$((len_pf+1)) +label=`printf "%${len}s" "Accès distant"` + +if [ -z "$adresse_ip_gw" ];then + #si pas de GW, pas d'accès distant + Inactif "$label" +else + TestNTP "$(CreoleGet serveur_ntp)" + TestWeb "$label" $(CreoleGet test_distant_domaine) +fi +echo + +Cpt=0; +while [ $Cpt -lt $nombre_interfaces ]; do + if [ $(CreoleGet eth${Cpt}_method) != 'manuel' ]; then + Eth="$(CreoleGet nom_zone_eth$Cpt)" + Adresse=$(CreoleGet adresse_ip_eth$Cpt) + ssh_actif=$(CreoleGet ssh_eth$Cpt oui) + adm_actif=$(CreoleGet admin_eth$Cpt oui) + echo "Sur l'interface réseau $Eth" + if [ $ssh_actif = "oui" ];then + TestService "SSH" $Adresse:22 + else + Inactif "SSH" + fi + if [ $adm_actif = "oui" ];then + TestService "EAD Server" $Adresse:4201 + if [ "$(CreoleGet activer_ead_web 2>/dev/null)" = "oui" ];then + TestService "EAD Web" $Adresse:4200 + else + Inactif "EAD Web" + fi + else + Inactif "EAD Web" + fi + fi + let Cpt=Cpt+1 +done +echo + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/diagnose/04-zfirewall b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/diagnose/04-zfirewall new file mode 100644 index 0000000000000000000000000000000000000000..dd4af5cb911fbe0dc7f94bcba81764e54c70039f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/diagnose/04-zfirewall @@ -0,0 +1,79 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +######################################################################### +# pyeole.service - manage EOLE services +# Copyright © 2014 Pôle de Compétence EOLE <eole@ac-dijon.fr> +# +# License CeCILL: +# * in french: http://www.cecill.info/licences/Licence_CeCILL_V2-fr.html +# * in english http://www.cecill.info/licences/Licence_CeCILL_V2-en.html +######################################################################### +from creole.client import CreoleClient +from creole.config import VIRTMASTER +from pyeole.diagnose import compare_iptables, compare_ipset, NOT_AVAILABLE, OK + + +from os.path import isfile +from commands import getstatusoutput + + +STATUS_FILE = '/var/lib/eole/reports/bastion.log' + + +if __name__ == "__main__": + client = CreoleClient() + + cmd = [". /usr/lib/eole/diagnose.sh"] + cmd.append('EchoGras "*** Pare-feu"') + if client.get_creole('activer_firewall') == 'non': + cmd.append('Inactif "Pare-feu"') + else: + if client.get_creole('activer_firewall'): + cmd.append('printf ". %$((len_pf+3))s => " "Génération des règles"') + if isfile(STATUS_FILE): + cmd.append('. /var/lib/eole/reports/bastion.log') + cmd.append('msg="(`date +%T\' \'%d/%m/%y -d @$DATE`)"') + cmd.append('[ "$STATUS" = "0" ] && EchoVert "Ok $msg"') + cmd.append('[ "$STATUS" != "0" ] && EchoRouge "Erreur : $MSG $msg"') + else: + cmd.append('EchoOrange "Aucune information"') + ret = compare_iptables() + mode_conteneur_actif = client.get_creole('mode_conteneur_actif') + if mode_conteneur_actif == 'oui': + cmd.append('printf ". %${len_pf}s => " "maitre"') + else: + cmd.append('printf ". %${len_pf}s => " "Pare-feu"') + if ret != NOT_AVAILABLE: + if ret == OK: + cmd.append('EchoVert "Ok"') + else: + cmd.append('EchoRouge "Erreur"') + else: + cmd.append('EchoOrange "Non généré"') + if mode_conteneur_actif == 'oui': + for container in client.get_groups(): + if container not in [VIRTMASTER, 'all']: + ret = compare_iptables(container) + cmd.append('printf ". %${{len_pf}}s => " "{0}"'.format(container)) + if ret != NOT_AVAILABLE: + if ret == OK: + cmd.append('EchoVert "Ok"') + else: + cmd.append('EchoRouge "Erreur"') + else: + cmd.append('EchoOrange "Non généré"') + + ret = compare_ipset() + if ret != NOT_AVAILABLE: + cmd.append('printf ". %${len_pf}s => " "IPSet"') + if ret == OK: + cmd.append('EchoVert "Ok"') + else: + cmd.append('EchoRouge "Erreur"') + cmd.append('echo') + else: + cmd.append('EchoOrange "désactivé"') + cmd_string = "\n".join(cmd) + err, ret = getstatusoutput(cmd_string) + print ret diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/diagnose/05-common b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/diagnose/05-common new file mode 100644 index 0000000000000000000000000000000000000000..d40e9a45ddfc0bedf7d6ee30349297768a0166b7 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/diagnose/05-common @@ -0,0 +1,36 @@ +#!/bin/bash + +. /usr/lib/eole/diagnose.sh + +server_cert=$(CreoleGet server_cert) +EOLE_DIR="/usr/share/eole/creole" +patchfiles="${EOLE_DIR}/patch/*.patch ${EOLE_DIR}/patch/variante/*.patch" +if [ `ls $patchfiles 2>/dev/null|wc -l` -gt 0 ];then + EchoGras "*** Patches" + printf ". %${len_pf}s => " "patches" + /usr/share/creole/testpatches.py + echo +fi + +EchoGras "*** Validité du certificat" +if [ $server_cert != "/etc/ssl/certs/eole.crt" ] +then + TestCerts $server_cert 10 "certificat expiré" +fi +TestCerts /etc/ssl/certs/eole.crt 10 "certificat expiré" + +echo +set_title=0 +for container in $(CreoleGet --groups);do + cpath=$(CreoleGet container_path_$container) + for file in $(ls $cpath/etc/init.d/*.dpkg-dist 2>/dev/null); do + if [ $set_title = 0 ]; then + EchoGras "*** Scripts d'init pas à jour" + set_title=1 + fi + EchoRouge "- $(basename ${file%.dpkg-dist}) ($container)" + done +done +[ $set_title = 1 ] && echo + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/diagnose/06-logs b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/diagnose/06-logs new file mode 100644 index 0000000000000000000000000000000000000000..173d19a5b330d66534ac524ed28952a4f821d512 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/diagnose/06-logs @@ -0,0 +1,134 @@ +#!/bin/bash + +. /usr/lib/eole/diagnose.sh + +# Éviter les affichages des messages d'erreur de CreoleGet +activer_log_distant=$(CreoleGet activer_log_distant 2>/dev/null) +rsyslog_envoi_tls=$(CreoleGet rsyslog_envoi_tls 2>/dev/null) +rsyslog_reception_tls=$(CreoleGet rsyslog_reception_tls 2>/dev/null) +rsyslog_ca_file=$(CreoleGet rsyslog_ca_file 2>/dev/null) +rsyslog_crt_file=$(CreoleGet rsyslog_crt_file 2>/dev/null) +activer_reception_logs=$(CreoleGet activer_reception_logs 2>/dev/null) +activer_reception_logs_relp=$(CreoleGet activer_reception_logs_relp 2>/dev/null) +activer_reception_logs_tcp=$(CreoleGet activer_reception_logs_tcp 2>/dev/null) +activer_reception_logs_udp=$(CreoleGet activer_reception_logs_udp 2>/dev/null) +activer_envoi_logs=$(CreoleGet activer_envoi_logs 2>/dev/null) + +# Test des connexions +if [ "$activer_log_distant" = "oui" ]; then + + EchoGras "*** Journalisation à distance" + if [ "$rsyslog_envoi_tls" = "oui" ] || [ "$rsyslog_reception_tls" = "oui" ]; then + purpose="sslclient" + if [ "$rsyslog_reception_tls" = "oui" ]; then + purpose="sslserver" + fi + # Test de la validité de la chaîne de certification + printf ". %${len_pf}s => " "Statut de TLS" + EchoVert "Activé" + + printf ". %${len_pf}s => " "Test de validité de la chaîne de certification" + openssl verify -purpose $purpose -CAfile $rsyslog_ca_file $rsyslog_crt_file #> /dev/null 2>&1 + if [ $? -ne 0 ]; then + EchoRouge "Erreur" + else + EchoVert "OK" + fi + else + Inactif "Statut de TLS" + fi + +# Test des ports +printf ". %${len_pf}s => " "Test de la configuration de réception" +if [ "$activer_reception_logs" = "oui" ]; then + EchoVert "Activée" + printf ". %${len_pf}s => " "Test de RELP" + if [ "$activer_reception_logs_relp" = "oui" ]; then + TestConnexion rsyslog tcp 20514 reception + if [ $? -ne 0 ]; then + EchoRouge "Erreur" + else + EchoVert "OK" + fi + else + EchoOrange "Désactivé" + fi + printf ". %${len_pf}s => " "Test de TCP" + if [ "$activer_reception_logs_tcp" = "oui" ]; then + TestConnexion rsyslog tcp 10514 reception + if [ $? -ne 0 ]; then + EchoRouge "Erreur" + else + EchoVert "OK" + fi + else + EchoOrange "Désactivé" + fi + printf ". %${len_pf}s => " "Test de UDP" + if [ "$activer_reception_logs_udp" = "oui" ]; then + TestConnexion rsyslog udp 514 + if [ $? -ne 0 ]; then + EchoRouge "Erreur" + else + EchoVert "OK" + fi + else + EchoOrange "Désactivé" + fi +else + EchoOrange "Désactivé" +fi + +printf ". %${len_pf}s => " "Test de la configuration d'envoi" +if [ "$activer_envoi_logs" = "oui" ]; then + EchoVert "Activée" + if [ "$rsyslog_envoi_tls" = "oui" ]; then + printf ". %${len_pf}s => " "Test de TCP" + TestConnexion rsyslog tcp 10514 envoi + if [ $? -ne 0 ]; then + EchoRouge "Erreur" + else + EchoVert "OK" + fi + else + printf ". %${len_pf}s => " "Test de RELP" + TestConnexion rsyslog tcp 20514 envoi + if [ $? -ne 0 ]; then + EchoRouge "Erreur" + else + EchoVert "OK" + fi + fi +else + EchoOrange "Désactivé" +fi +echo +fi + +EchoGras "*** Logrotate (fichiers pris en charge par rsyslog)" +LOGROTATED_DIR="" +for DIR in `cat /etc/logrotate.d/* | sed -e '/^\/.*/ !d' | sed -e 's/{//'`; do + LOGROTATED_DIR="$LOGROTATED_DIR `ls $DIR 2>/dev/null`" + +done +NB_LOGS=0 +NOT_ROTATED="" +for RSYSLOG_DIR in `find /var/log/rsyslog -type f -name "*.log"`; do + if [[ ! "$LOGROTATED_DIR" =~ $RSYSLOG_DIR ]]; then + NB_LOGS=$(( $NB_LOGS + 1 )) + NOT_ROTATED="$NOT_ROTATED\n$RSYSLOG_DIR" + fi +done +echo "Fichiers non pris en charge par logrotate : $NB_LOGS" +if [ "$Verbose" != "yes" ] + then + echo +else + echo -e $NOT_ROTATED + echo +fi +if [[ -e /etc/logrotate.d/generated_remote_rules ]] || [[ -e /etc/logrotate.d/generated_local_rules ]]; then + echo "Filtres automatiques (/etc/logrotate.d/generated_{remote,local}_rules) : " `cat /etc/logrotate.d/generated_*_rules 2>/dev/null | sed -e '/^\/var\/log\/rsyslog/ !d' |wc -l` + echo +fi +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/diagnose/07-container b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/diagnose/07-container new file mode 100644 index 0000000000000000000000000000000000000000..1ef52ebc7a29f77e169cb53582545f3fba04d8eb --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/diagnose/07-container @@ -0,0 +1,30 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +######################################################################### +# pyeole.service - manage EOLE services +# Copyright © 2014 Pôle de Compétence EOLE <eole@ac-dijon.fr> +# +# License CeCILL: +# * in french: http://www.cecill.info/licences/Licence_CeCILL_V2-fr.html +# * in english http://www.cecill.info/licences/Licence_CeCILL_V2-en.html +######################################################################### +from creole.client import CreoleClient +from pyeole.diagnose import test_containers, OK, NOK +from commands import getstatusoutput + + +if __name__ == "__main__": + client = CreoleClient() + if client.get_creole('mode_conteneur_actif') == 'oui': + cmd = [". /usr/lib/eole/diagnose.sh"] + cmd.append('EchoGras "*** Conteneurs"') + for container, status in test_containers().items(): + cmd.append('printf ". %${len_pf}s => " "' + container + '"') + if status: + cmd.append('EchoVert "Ok"') + else: + cmd.append('EchoRouge "Erreur"') + cmd_string = "\n".join(cmd) + err, ret = getstatusoutput(cmd_string) + print ret diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/diagnose/08-upgrade b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/diagnose/08-upgrade new file mode 100644 index 0000000000000000000000000000000000000000..e263d92fa36b571025e0d196d28993b3fc603401 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/diagnose/08-upgrade @@ -0,0 +1,42 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +######################################################################### +# diagnose +# Copyright © 2014 Pôle de Compétence EOLE <eole@ac-dijon.fr> +# +# License CeCILL: +# * in french: http://www.cecill.info/licences/Licence_CeCILL_V2-fr.html +# * in english http://www.cecill.info/licences/Licence_CeCILL_V2-en.html +######################################################################### + +from pyeole.diagnose import test_maj, test_maj_reconfigure, test_need_reboot +from commands import getstatusoutput + +if __name__ == "__main__": + cmd = [". /usr/lib/eole/diagnose.sh"] + cmd.append('EchoGras "*** Mise à jour"') + cmd.append('printf ". %$((len_pf+2))s => " "Dernière mise à jour"') + ret = test_maj() + if ret['status'] == 'On': + cmd.append('EchoVert "OK ({0})"'.format(ret['msg'])) + elif ret['status'] == 'Off': + cmd.append('EchoRouge "Erreur ({0})"'.format(ret['msg'])) + else: + cmd.append('EchoOrange "{0}"'.format(ret['msg'])) + cmd.append('printf ". %$((len_pf+1))s => " "Reconfigure effectué"') + ret = test_maj_reconfigure() + if ret['status'] == 'On': + cmd.append('EchoVert "OK"') + elif ret['status'] == 'Off': + cmd.append('EchoRouge "Erreur ({0})"'.format(ret['msg'])) + cmd.append('printf ". %$((len_pf+1))s => " "Reboot nécessaire"') + ret = test_need_reboot() + if not ret: + cmd.append('EchoVert "Non"') + else: + cmd.append('EchoRouge "Oui"') + cmd.append('echo') + cmd_string = "\n".join(cmd) + err, ret = getstatusoutput(cmd_string) + print ret diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/firewall.start b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/firewall.start new file mode 100644 index 0000000000000000000000000000000000000000..fdea0027e919f3e9472b4df3e61c6ed257d4705e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/firewall.start @@ -0,0 +1,74 @@ +#!/bin/bash + +RETVAL=0 +. /etc/eole/bastion.conf +CACHEMOD='/etc/eole/bastion-modules' +rm -f $CACHEMOD +if [ ! "$type_amon" = "" ]; then + . /usr/lib/eole/ihm.sh + if [ -f /usr/share/era/modeles/${type_amon}.xml ]; then + echo -n " (modèle \"${type_amon}\")" + ## lancement du script de generation du firewall + /usr/share/era/bastion.sh + if [ ! $? -eq 0 ]; then + echo -n "non appliquées !" + MSG="Erreur à la génération des règles du modèle ${type_amon}" + RETVAL=1 + else + if [ -x /usr/share/eole/bastion/data/90-lxc_rules ] + then + /usr/share/eole/bastion/data/90-lxc_rules + grep -h modprobe /usr/share/eole/bastion/data/90-lxc_rules >> $CACHEMOD + grep -h "echo " /usr/share/eole/bastion/data/90-lxc_rules >> $CACHEMOD + fi + fi + grep -h modprobe /sbin/lance.firewall >> $CACHEMOD + grep -h "echo " /sbin/lance.firewall >> $CACHEMOD + else + echo -n ", modèle \"${type_amon}\" non trouvé !" + MSG="Le modèle ${type_amon} n'existe pas" + RETVAL=1 + fi +else + if [ "$activer_firewall" = "oui" ]; then + /bin/run-parts --exit-on-error /usr/share/eole/bastion/data + RETVAL=$? + if [ ! "$RETVAL" = "0" ]; then + MSG="Erreur à l'exécution des scripts de firewall" + echo -n $MSG + fi + grep -h modprobe /usr/share/eole/bastion/data/* >> $CACHEMOD + grep -h "echo " /usr/share/eole/bastion/data/* >> $CACHEMOD + else + echo + /usr/sbin/ouvre.firewall + RETVAL=$? + if [ ! "$RETVAL" = "0" ]; then + MSG="Erreur à l'exécution du script ouvre.firewall" + echo -n $MSG + fi + fi +fi +if [ "$RETVAL" = "0" ]; then + if [ "$mode_conteneur_actif" = "oui" ]; then + CreoleRun "/bin/run-parts --exit-on-error /usr/share/eole/bastion/data" all no yes + fi + if [ -f /usr/share/era/postes_interdits.py ]; then + python /usr/share/era/postes_interdits.py + fi + /sbin/iptables-save > /etc/eole/iptables + [ $(command -v ipset) ] && ipset save > /etc/eole/ipset + if [ "$mode_conteneur_actif" = "oui" ]; then + CreoleRun "/sbin/iptables-save > /etc/eole/iptables" all no yes + CreoleRun "[ \$(command -v ipset) ] && ipset save > /etc/eole/ipset" all no yes + fi + # rules outside bastion scope + /bin/run-parts --exit-on-error /usr/share/eole/bastion/post_cache + +fi + +echo "# -*- coding: UTF-8 -*- +DATE=\"`date +%s`\" +STATUS=\"$RETVAL\" +MSG=\"$MSG\"" > /var/lib/eole/reports/bastion.log +return $RETVAL diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/firewall.stop b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/firewall.stop new file mode 100644 index 0000000000000000000000000000000000000000..215895c6f96e3a65987af595afe3972c21b90ecf --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/firewall.stop @@ -0,0 +1,13 @@ +#!/bin/sh + +. /usr/lib/eole/ihm.sh + +EchoOrange "Appel directe à ${0} déprécié, utiliser /usr/sbin/ferme.firewall" >&2 + +if [ -x /usr/sbin/ferme.firewall ] +then + /usr/sbin/ferme.firewall +else + EchoRouge "Script de forteresse indisponible" >&2 + exit 1 +fi diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/letsencrypt/hooks-post.d/99-restart b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/letsencrypt/hooks-post.d/99-restart new file mode 100644 index 0000000000000000000000000000000000000000..991dd257c64426431416eaf349c49d538431d1a4 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/letsencrypt/hooks-post.d/99-restart @@ -0,0 +1,5 @@ +#!/bin/bash + +[ ! "$1" = "reconfigure" ] && /usr/bin/StartAll + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/letsencrypt/post.sh b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/letsencrypt/post.sh new file mode 100644 index 0000000000000000000000000000000000000000..7dc24dda634b94685b931bdd2525c85ed7f662db --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/letsencrypt/post.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +arg=$1 +[ -z "$arg" ] && arg="full" + +[ "$arg" = "reconfigure" ] && echo "Prise en compte des nouveaux certificats Let’s Encrypt :" + +/bin/run-parts --exit-on-error -v /usr/share/eole/letsencrypt/hooks-post.d --arg "$arg" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/remove.d/eole.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/remove.d/eole.conf new file mode 100644 index 0000000000000000000000000000000000000000..4d6ba0251f99049e69658b8fed9026d5adbdfa0c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/eole/remove.d/eole.conf @@ -0,0 +1,3 @@ +apparmor-profiles +os-prober +ufw diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/locale/en/LC_MESSAGES/eole-common.mo b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/locale/en/LC_MESSAGES/eole-common.mo new file mode 100644 index 0000000000000000000000000000000000000000..b7b5772c5e11eece3be6d435d2168d4db591f1c6 Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/locale/en/LC_MESSAGES/eole-common.mo differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/locale/fr/LC_MESSAGES/eole-common.mo b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/locale/fr/LC_MESSAGES/eole-common.mo new file mode 100644 index 0000000000000000000000000000000000000000..2e45c0458c6c9eaa16efbd681f39c9721b745b66 Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/files/usr/share/locale/fr/LC_MESSAGES/eole-common.mo differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/postservices/00-eole-common b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/postservices/00-eole-common new file mode 100644 index 0000000000000000000000000000000000000000..0e5f519ddcacfb1d7812ca0d3768eea7ed20b29a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/postservices/00-eole-common @@ -0,0 +1,5 @@ +#!/bin/bash + +CreoleRun "service rsyslog restart" all no yes + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/postservices/00-letsencrypt b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/postservices/00-letsencrypt new file mode 100644 index 0000000000000000000000000000000000000000..006192dfadaa7f4cd4a5e959848347ddb4dd5758 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/postservices/00-letsencrypt @@ -0,0 +1,259 @@ +#!/bin/bash + +# +# AIM: Ask SSL certificates to an ACME Server +# + +. /usr/lib/eole/ihm.sh + +MODE=$1 +[ -z "$MODE" ] && MODE=test + +function openPorts() +{ + local SOURCE=${1} + shift + local PORTS=${@} + + for prt in ${PORTS} + do + iptables -I INPUT -p tcp -m tcp --dport ${prt} --tcp-flags FIN,SYN,RST,ACK SYN -j ACCEPT + done +} + +function startWWW() +{ + PIDFILE=$(mktemp) + WWWSRV=nginx + OPT="-c /etc/eole/ssl/nginx-minimal.conf" + CMD="${WWWSRV} ${OPT}" + [[ ! -d "/tmp/www" ]] && mkdir -p /tmp/www + + ${CMD} + PID=$(pidof ${CMD}) + if [[ -n ${PID} ]] + then + echo ${PID} > ${PIDFILE} + echo ${PIDFILE} + return 0 + else + return 1 + fi +} + +function getRevProxDomains() +{ + local names=($(CreoleGet revprox_domainname)) + local wildcards=($(CreoleGet revprox_domain_wildcard)) + local cert=("$(CreoleGet revprox_le_cert 2> /dev/null)") + local toRet="" + local i=0 + local i_cert=0 + + for name in ${names[@]} + do + wildcard="${wildcards[${i}]}" + if [[ ${wildcard} == "non" ]] + then + rep="${cert[${i_cert}]}" + if [[ ${rep} == 'oui' ]] + then + toRet="${toRet} ${name}" + fi + ((i_cert+=1)) + fi + ((i+=1)) + done + + echo ${toRet} + return 0 +} + +function startHttp() +{ + # Test if apache is running and stop it ! + PIDAPACHE=$(pidof apache2) + [[ -n ${PIDAPACHE} ]] && systemctl stop apache2 + + #arrêt de nginx pour laisser la place à nginx + PIDNGINX=$(pidof nginx) + [[ -n ${PIDNGINX} ]] && systemctl stop nginx.service + + if [[ ${LEMODE} = 'standalone' ]] + then + openPorts "${SERVER}" "${HTTP01PORT}" "${TLSNSIPORT}" + MODE_OPT="--standalone" + else + openPorts "${SERVER}" "80" + PIDFILE=$(startWWW) + if [[ ${?} -ne 0 ]] + then + EchoRouge "Erreur lors du lancement du serveur web temporaire" + killHttp + exit 22 + fi + MODE_OPT="--webroot --webroot-path /tmp/www" + fi +} +function killHttp() +{ + # Stop http server + if [[ -e ${PIDFILE} ]] + then + kill $(cat ${PIDFILE}) + if [[ ${?} -ne 0 ]] + then + EchoRouge "Erreur lors de l'arrêt du processus $(cat ${PIDFILE}) (serveur web temporaire)" + exit 45 + else + rm -f ${PIDFILE} + fi + fi +} + +if [[ $(CreoleGet cert_type non) == 'letsencrypt' ]] +then + PROTOC="https" + SERVER=$(CreoleGet le_server_addr) + PORT=$(CreoleGet le_server_port) + HTTP01PORT=$(CreoleGet le_http_01_port) + TLSNSIPORT=$(CreoleGet le_tls_sni_port) + CONFDIR=$(CreoleGet le_config_dir) + WOKRDIR=$(CreoleGet le_work_dir) + LOGSDIR=$(CreoleGet le_logs_dir) + LEMODE=$(CreoleGet le_client_mode) + PIDFILE="" + + LECLIENT='letsencrypt' + LEOPT='certonly' + + if [[ -n ${SERVER} ]] + then + SERVER="--server ${PROTOC}://${SERVER}" + [[ -n ${PORT} ]] && SERVER="${SERVER}:${PORT}" + SERVER="${SERVER}/directory" + fi + + NOMDOMAINEMACHINE="$(CreoleGet nom_domaine_machine)" + WEBURL=$(CreoleGet web_url "") + + DOMAINS="" + for domain in $(CreoleGet le_extra_names) + do + DOMAINS="${DOMAINS} ${domain}" + done + + if [[ "$(CreoleGet activer_revprox non )" == "oui" ]] + then + DOMAINS="${DOMAINS} $(getRevProxDomains)" + fi + + # Removing duplicate entries in domain list + DOMAINS=$(awk '{ while(++i<=NF) printf (!a[$i]++) ? $i FS : ""; i=split("",a); print "" }' <<< ${DOMAINS}) + + + if [ "$MODE" = "test" ]; then + MODE_OPT="$MODE_OPT --staging" + fi + + GETNEWCERTIF=1 + res=0 + if [ ! -d "${CONFDIR}/live/${NOMDOMAINEMACHINE}" ]; then + # Creating ACME client command line options for main domain + DOM_OPT="-d ${NOMDOMAINEMACHINE}" + if [[ -n ${WEBURL} ]] + then + if [[ ${NOMDOMAINEMACHINE} != ${WEBURL} ]] + then + DOM_OPT="${DOM_OPT} -d ${WEBURL}" + echo -n " - Demande de certificat pour ${NOMDOMAINEMACHINE} ${WEBURL}" + else + echo -n " - Demande de certificat pour ${NOMDOMAINEMACHINE}" + fi + else + echo -n " - Demande de certificat pour ${NOMDOMAINEMACHINE}" + fi + startHttp + ${LECLIENT} ${LEOPT} \ + ${MODE_OPT} \ + --expand \ + ${SERVER} \ + --http-01-port ${HTTP01PORT} \ + --tls-sni-01-port ${TLSNSIPORT} \ + ${DOM_OPT} \ + --no-verify-ssl \ + --non-interactive \ + --no-redirect \ + --agree-tos \ + --register-unsafely-without-email \ + --manual-public-ip-logging-ok \ + --config-dir ${CONFDIR} \ + --work-dir ${WOKRDIR} \ + --logs-dir ${LOGSDIR} > /var/log/eole-letsencrypt.log 2>&1 + cres=${?} + if [[ ${cres} -ne 0 ]]; then + EchoRouge " [KO]" + EchoRouge "Code retour ${cres}" + EchoRouge "Erreur à la demande du certificat, des logs sont disponibles dans le fichier /var/log/eole-letsencrypt.log" + killHttp + exit 1 + else + EchoVert " [OK]" + fi + ((res+=${cres})) + GETNEWCERTIF=0 + fi + + # Creating ACME client command line options for extra domains + for dom in ${DOMAINS} + do + if [ ! -d "${CONFDIR}/live/${dom}" ]; then + echo -n " - Demande de certificat pour ${dom}" + if [ "$GETNEWCERTIF" = "1" ]; then + startHttp + fi + ${LECLIENT} ${LEOPT} \ + ${MODE_OPT} \ + --expand \ + ${SERVER} \ + --http-01-port ${HTTP01PORT} \ + --tls-sni-01-port ${TLSNSIPORT} \ + -d ${dom} \ + --no-verify-ssl \ + --non-interactive \ + --no-redirect \ + --agree-tos \ + --register-unsafely-without-email \ + --manual-public-ip-logging-ok \ + --config-dir ${CONFDIR} \ + --work-dir ${WOKRDIR} \ + --logs-dir ${LOGSDIR} > /var/log/eole-letsencrypt.log 2>&1 + cres=${?} + if [[ ${cres} -ne 0 ]]; then + EchoRouge " [KO]" + EchoRouge "Code retour ${cres}" + EchoRouge "Erreur à la demande du certificat, des logs sont disponibles dans le fichier /var/log/eole-letsencrypt.log" + killHttp + exit 1 + else + EchoVert " [OK]" + fi + ((res+=${cres})) + GETNEWCERTIF=0 + fi + done + + killHttp + if [[ ${res} -ne 0 ]]; then + EchoRouge "Erreur lors de la requête ACME veuillez consulter les journaux dans le répertoire ${LOGSDIR}" + exit 1 + fi + if [ "$GETNEWCERTIF" = "0" ]; then + /usr/share/eole/letsencrypt/post.sh + EchoVert "Certificat généré et pris en compte" + fi + + exit ${res} +else + exit 0 +fi diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/postservices/00-systemd-networkd b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/postservices/00-systemd-networkd new file mode 100644 index 0000000000000000000000000000000000000000..ab3910cba7fb5ab6153989d37ae3a550e9f8b2f7 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/postservices/00-systemd-networkd @@ -0,0 +1,17 @@ +#!/bin/bash + +SERVICES="networking.service ifup@.service" + +> /etc/network/interfaces + +for service in ${SERVICES};do + if [ $(systemctl is-enabled ${service}) != 'masked' ];then + systemctl reset-failed ${service} > /dev/null 2>&1 + systemctl stop ${service} > /dev/null 2>&1 + systemctl disable ${service} > /dev/null 2>&1 + systemctl mask ${service} > /dev/null 2>&1 + fi +done + +exit 0 + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/postservices/00-ubuntu-motd b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/postservices/00-ubuntu-motd new file mode 100644 index 0000000000000000000000000000000000000000..0c0260ce10b1a230bffb396e2a1467a9fa5ec92e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/postservices/00-ubuntu-motd @@ -0,0 +1,23 @@ +#!/bin/bash + +motd_news_default="/etc/default/motd-news" +motd_news_cache="/var/cache/motd-news" + +ubuntu_advantage_tools_cron="/etc/cron.daily/ubuntu-advantage-tools" +ubuntu_advantage_tools_cache="/var/cache/ubuntu-advantage-tools/ubuntu-advantage-status.cache" + +if [ -f "${motd_news_default}" ];then + sed -i 's/^ENABLED\s*=.*$/ENABLED=0/' "${motd_news_default}" +fi + +if [ -f "${motd_news_cache}" ];then + > ${motd_news_cache} +fi + +if [ -f "${ubuntu_advantage_tools_cron}" ];then + rm -f "${ubuntu_advantage_tools_cron}" +fi + +if [ -f "${ubuntu_advantage_tools_cache}" ];then + rm -f "${ubuntu_advantage_tools_cache}" +fi diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/postservices/99-check-console-setup b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/postservices/99-check-console-setup new file mode 100644 index 0000000000000000000000000000000000000000..e1c082cb58e13aef109abcbadfb659260c1bd3f1 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/postservices/99-check-console-setup @@ -0,0 +1,9 @@ +#!/bin/bash + +if [ "$1" = "instance" ];then + if [ "$(systemctl is-active console-setup.service)" != "active" ];then + systemctl start console-setup.service > /dev/null 2>&1 + fi +fi + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/posttemplates/00-eole-common b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/posttemplates/00-eole-common new file mode 100644 index 0000000000000000000000000000000000000000..56c8590dd42a4ca4befb5365039c973682ed74d2 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/posttemplates/00-eole-common @@ -0,0 +1,237 @@ +#!/bin/bash + +############################################ +# Script eole-common +############################################ + +action=$1 + +. /usr/lib/eole/ihm.sh + +systemctl enable ferme-firewall + +#recharger les fichiers override +systemctl daemon-reload +CreoleRun "systemctl daemon-reload" all yes yes + +#recharger les profiles apparmor +service apparmor reload +#CreoleRun "service apparmor reload" all yes yes --> FIXME #20176 + +#test si le réseau est configuré sinon renvoie une erreur (#1100) +adresse_ip_eth0=`CreoleGet adresse_ip_eth0` +if [ "$adresse_ip_eth0" = "" ]; then + EchoRouge "Impossible de déterminer l'adresse réseau \"adresse_ip_eth0\"." + EchoRouge "Redemarrage du reseau" + service networking restart + EchoRouge "#######################################################################" + EchoRouge "# Veuillez relancer $action" + EchoRouge "#######################################################################" + exit 1 +fi + +bonding_is_active=$(CreoleGet bonding_is_active) +if [ "$bonding_is_active" != "oui" ] +then + lsmod | grep bonding -q && rmmod bonding +fi + +#pour rsyslog +LOG_BASE="/var/log/rsyslog" +[[ ! -d $LOG_BASE ]] && mkdir -p $LOG_BASE +chown -R syslog:adm $LOG_BASE + +#pour l'envoi des logs (#11404) +if [ "$(CreoleGet activer_envoi_logs non)" = oui ];then + if [ ! -d "${LOG_BASE}/queues" ];then + mkdir -p ${LOG_BASE}/queues + chown syslog:adm ${LOG_BASE}/queues + fi +fi + +#pour les logs de certains outils +mkdir -p /var/log/eole + +service rsyslog restart + +#pour logrotate +LOG_TYPES="local remote" +LOGROTATE_CONF_D=/etc/logrotate.d +LOGROTATED_DIRS='' + +# Clean generated files +for log_type in ${LOG_TYPES} +do + [ -e ${LOGROTATE_CONF_D}/generated_${log_type}_rules ] \ + && rm -f ${LOGROTATE_CONF_D}/generated_${log_type}_rules +done + +# Get all directories referenced in logrotate configuration +# Create them if they don't exists +for log_file in $(sed -ne '/^\/.*\.log/ s,{*,,p' ${LOGROTATE_CONF_D}/* 2> /dev/null); do + log_dir=$(dirname ${log_file}) + LOGROTATED_DIRS="${LOGROTATED_DIRS:+${LOGROTATED_DIRS}$'\n'}${log_dir}" + if [ ! -d "${log_dir}" ] + then + mkdir -p "${log_dir}" + chown syslog:adm "${log_dir}" + fi +done + +# Deduplicate directory list +LOGROTATED_DIRS=$(echo "$LOGROTATED_DIRS" | sort -u) + +vpn_service() { + ACTION=$1 + HA_RSC_FILE="/etc/ha.d/.rsc_list" + if [ -e $CONFRVP ] && [ "$install_rvp" = "oui" ] + then + INITRVP_ACTION="yes" + if [ -e $HA_RSC_FILE ] + then + while read LINE + do + SCE=$(echo "$LINE"|cut -d " " -f3) + if [ "$SCE" == "$INITRVP" ] + then + echo "HA STRONGSWAN" + INITRVP_ACTION="no" + break + fi + done< $HA_RSC_FILE + fi + if [ "$INITRVP_ACTION" == "yes" ] + then + service $INITRVP $ACTION + fi + fi +} + +get_not_rotated_log_files() { + local base_dir="${1}" + local not_rotated="" + [ -d "${base_dir}" ] || return + for log_file in $(find ${base_dir} -type f -name '*.log') + do + log_dir=$(dirname ${log_file}) + if [[ ! "$LOGROTATED_DIRS" =~ ${log_dir} ]]; then + # Avoid newline when ${not_rotated} is empty + not_rotated="${not_rotated:+${not_rotated}$'\n'}${log_file}" + fi + done + echo -e "${not_rotated}" +} + +gen_globs_from_files() { + local levels='\(panic\|emerg\|crit\|err\|error\|alert\|warn\|warning\|info\|notice\|debug\)' + echo "$@" | sed -e "s,\.${levels}\.,.\*.," | sort -u +} + +generate_logrotate_rules() { + local GLOBBING=$- + set -f # Disable globbing + local rules_file="${1}" + shift # strip first parameter + local globs="$@" + local globsuniq=$(echo $globs | sort -u) + local logs="" + # Avoid expanding globs + for log_glob in ${globsuniq} + do + [ -n "${log_glob}" ] || continue + logs="${logs:+${logs}$'\n'}${log_glob}" + done + if [ -n "${logs}" ]; then + cat >> ${rules_file} <<EOF +$logs { + missingok + daily + rotate 366 + compress + sharedscripts + postrotate + service rsyslog rotate > /dev/null + endscript +} +EOF + fi + [[ "${GLOBBING}" =~ f ]] && set +f + +} + +for log_type in ${LOG_TYPES} +do + rotate_conf_file=${LOGROTATE_CONF_D}/generated_${log_type}_rules + log_dir=${LOG_BASE}/${log_type} + + [ -f "${rotate_conf_file}" ] && rm -f "${rotate_conf_file}" + + echo "# Rules automatically generated" >> ${rotate_conf_file} + # Do not forget the double quoting or globs will be expanded + FILES="$(get_not_rotated_log_files ${log_dir})" + GLOBS="$(gen_globs_from_files "${FILES}")" + generate_logrotate_rules ${rotate_conf_file} "${GLOBS}" +done + +#commente HISTSIZE et HISTFILESIZE car ce sont des paramétrages en lecture seule +sed -i 's/^HISTSIZE/#HISTSIZE/g' /root/.bashrc +sed -i 's/^HISTFILESIZE/#HISTFILESIZE/g' /root/.bashrc + +#prend en compte le template 10-console-messages.conf +cat /etc/sysctl.d/10-console-messages.conf | sysctl -p - > /dev/null + +#regénération des règles iptables +IS_AMON=$(CreoleGet type_amon non) +if [ $IS_AMON != "non" ] +then + INITRVP='strongswan' + INITRVP_AMON='/etc/init.d/rvp' + install_rvp=$(CreoleGet install_rvp non) + if [ "$install_rvp" = "oui" ] + then + if [ "$(CreoleGet sw_database_mode)" = "oui" ] + then + CONFRVP='/etc/ipsec.d/ipsec.db' + else + CONFRVP='/etc/ipsec.secrets' + fi + else + CONFRVP='' + fi + vpn_service start > /dev/null + [ -f /etc/init.d/bind9 ] && CreoleService bind9 start > /dev/null +fi +echo -n "Génération des règles de pare-feu" +. /usr/share/eole/firewall.start +if [ $? -ne 0 ]; then + echo + EchoRouge "Erreur à la génération des règles de pare-feu" + rm -f /etc/eole/iptables + rm -f /etc/eole/ipset + exit 1 +fi +echo +#on repasse en mode forteresse avant le démarrage du service +if [ $IS_AMON != "non" ] +then + [ -f /lib/systemd/system/bind9.service ] && CreoleService bind9 stop > /dev/null + vpn_service stop > /dev/null +fi +/usr/sbin/ferme.firewall + +#notamment pour Era (#8106) +mkdir -p /root/.local/share + +#activation/désactivation de la séquence ctrl-alt-suppr (#17337) +TARGET="/etc/systemd/system/ctrl-alt-del.target" +if [ $(CreoleGet activer_ctrl_alt_suppr) = "oui" ];then + [ -L $TARGET ] && rm -f $TARGET +else + [ ! -e $TARGET ] && ln -nsf /dev/null $TARGET +fi + +#suppression d'un fichier généré par dhclient pré-instance (#21862) +rm -f /var/lib/ntpdate/default.dhcp +rm -f /var/lib/ntp/ntp.conf.dhcp + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/posttemplates/00-systemd-resolved b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/posttemplates/00-systemd-resolved new file mode 100644 index 0000000000000000000000000000000000000000..a1711a1741064527bb275da027c3ffa0a9e48aa5 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/posttemplates/00-systemd-resolved @@ -0,0 +1,12 @@ +#!/bin/bash + +# We force the restart of systemd-resolved to workaround https://dev-eole.ac-dijon.fr/issues/26290 +case $1 in + instance) + systemctl restart systemd-resolved.service + ;; + *) + ;; +esac + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/posttemplates/01-ntp b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/posttemplates/01-ntp new file mode 100644 index 0000000000000000000000000000000000000000..401c6dbbca8e0a93327cece8c589a7bd8ad6d2fd --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/posttemplates/01-ntp @@ -0,0 +1,8 @@ +#!/bin/bash + +echo "Désactivation de systemd-timesyncd.service" +systemctl stop systemd-timesyncd.service +systemctl disable systemd-timesyncd.service +systemctl mask systemd-timesyncd.service + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/preservices/00-anetwork b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/preservices/00-anetwork new file mode 100644 index 0000000000000000000000000000000000000000..d050f4e1704889d5bfd7d3b5f96bade9f878c764 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/preservices/00-anetwork @@ -0,0 +1,20 @@ +#!/bin/bash + +. /usr/lib/eole/ihm.sh + +error_int() { + EchoRouge "Impossible de trouver l'interface $1 alors qu'elle est activée dans la configuration" + exit 1 +} + +nombre_interfaces=$(CreoleGet nombre_interfaces) +for numint in `seq 0 $[nombre_interfaces-1]`; do + activer_bonding=$(CreoleGet activer_bonding_eth${numint}) + if [ "${activer_bonding}" == "non" ] + then + nom_carte=$(CreoleGet nom_zone_eth$numint) + [ -L /sys/class/net/$nom_carte ] || error_int $nom_carte + fi +done + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/pretemplates/00-letsencrypt b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/pretemplates/00-letsencrypt new file mode 100644 index 0000000000000000000000000000000000000000..0b0045904a44435f2b01969ed5d70ebea564a269 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/pretemplates/00-letsencrypt @@ -0,0 +1,68 @@ +#!/bin/bash + +# +# AIM: Ask SSL certificates to an ACME Server +# + +function getCertIssuerHash() +{ + cert=${1} + res=$(openssl x509 -noout -issuer_hash -in ${cert}) + ret=${?} + echo ${res} + return ${?} +} + +function updadteCA() +{ + issuerHash=${1} + ssoserver_cert=$(CreoleGet eolesso_cert "") + [[ -z ${ssoserver_cert} ]] && ssoserver_cert=$(CreoleGet server_cert) + ca_location=$(CreoleGet eolesso_ca_location "") + [[ -z ${ca_location} ]] && ca_location="/etc/ssl/local_ca" + + dst_root_x3=$(ls /etc/ssl/certs/DST_*.pem) + ca_dir="/usr/share/ca-certificates/letsencrypt" + + activer_sso=$(CreoleGet activer_sso non) + if [[ ${activer_sso} == "local" ]] + then + ssocertHash=$(getCertIssuerHash ${ssoserver_cert}) + if [[ ${issuerHash} == ${ssocertHash} ]] + then + cp -rp /usr/share/ca-certificates/letsencrypt/*.crt ${ca_location} + [[ ${?} -ne 0 ]] && echo "Warning : l'ajout de la CA Let's Encrypt pour eole-sso a échoué" + + cp -rp ${dst_root_x3} ${ca_location} + [[ ${?} -ne 0 ]] && echo "Warning : l'ajout de la CA DST pour eole-sso a échoué" + fi + fi +} + + +if [[ $(CreoleGet cert_type non) == 'letsencrypt' ]] +then + if [[ $(CreoleGet activer_sso non) != 'non' ]]; then + X3HASH="4f06f81d" + + # Mise en place de la CA let's Encrypt + updadteCA ${X3HASH} + fi + + cp -rp /usr/share/ca-certificates/letsencrypt/*.crt /usr/local/share/ca-certificates/ + update-ca-certificates > /dev/null 2>&1 + if [ -f /etc/ssl/letsencrypt/conf/live/$(CreoleGet nom_domaine_machine)/cert.pem ]; + then + + CONFDIR=$(CreoleGet le_config_dir) + WOKRDIR=$(CreoleGet le_work_dir) + LOGSDIR=$(CreoleGet le_logs_dir) + certbot --standalone --config-dir ${CONFDIR} --work-dir ${WOKRDIR} --logs-dir ${LOGSDIR} renew > /var/log/eole-letsencrypt-renew.log 2>&1 + fi + #We want to copy new certs to eole locations + /usr/share/eole/letsencrypt/post.sh reconfigure + +fi + + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/pretemplates/00-network b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/pretemplates/00-network new file mode 100644 index 0000000000000000000000000000000000000000..5ea8aa17043d7038f5856e7a18e552902822c1c6 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/pretemplates/00-network @@ -0,0 +1,103 @@ +#!/usr/bin/python +# -*- mode: python; coding: utf-8 -*- +# +########################################################################## +# 00-network - manage networkd override structure +# Copyright © 2018 Pôle de compétences EOLE <eole@ac-dijon.fr> +# +# License CeCILL: +# * in french: http://www.cecill.info/licences/Licence_CeCILL_V2-fr.html +# * in english http://www.cecill.info/licences/Licence_CeCILL_V2-en.html +########################################################################## + +"""Populate a per .network override + +""" + +from __future__ import absolute_import, print_function, unicode_literals + +import sys +import os + +import shutil + +from pyeole.i18n import i18n +from pyeole.log import init_logging + +from creole.client import CreoleClient + +_ = i18n('00-network') + +NETPLAN_CONFIG_DIR = '/etc/netplan' +NETWORKD_CONFIG_DIR = '/etc/systemd/network' +EOLE_CONFIG_DIR = '/etc/eole/network' + +log = None + +def clean_netplan_configs(): + """Remove all files under `/etc/netplan/` + + """ + log.debug(_('Cleanup netplan configuration')) + for filename in os.listdir(NETPLAN_CONFIG_DIR): + log.debug(_("Remove netplan file '{0}'").format(filename)) + os.remove(os.path.join(NETPLAN_CONFIG_DIR, filename)) + + +def clean_networkd_configs(): + """Remove all files under `/etc/systemd/network/` + + """ + log.debug(_('Cleanup networkd override configuration')) + for filename in os.listdir(NETWORKD_CONFIG_DIR): + full_path = os.path.join(NETWORKD_CONFIG_DIR, + filename) + if not filename.startswith('10-netplan') or not os.path.isdir(full_path): + continue + + log.debug(_("Remove networkd override directory '{0}'").format(full_path)) + shutil.rmtree(full_path) + + +def create_override_links(): + """Create the overrides links + + """ + log.debug(_('Create networkd override links')) + client = CreoleClient() + config = client.get_creole() + + if not os.path.isdir(EOLE_CONFIG_DIR): + os.makedirs(EOLE_CONFIG_DIR, mode=0o755) + + for index in range(int(config['nombre_interfaces'])): + name = config['nom_zone_eth{0}'.format(index)] + config_path = os.path.join(EOLE_CONFIG_DIR, + 'interface_{0}.conf'.format(index)) + override_dir = os.path.join(NETWORKD_CONFIG_DIR, + '10-netplan-{0}.network.d'.format(name)) + link_path = os.path.join(override_dir, 'eole.conf') + + if not os.path.isdir(override_dir): + log.debug(_("Create networkd override directory '{0}'").format(override_dir)) + os.makedirs(override_dir, mode=0o755) + + if not os.path.islink(link_path): + log.info(_("Create link '{link}' -> '{config}'").format(link=link_path, + config=config_path)) + os.symlink(config_path, link_path) + +def main(): + global log + log = init_logging(name=sys.argv[0], as_root=True, level='info') + + clean_netplan_configs() + clean_networkd_configs() + create_override_links() + + +if __name__ == "__main__": + try: + main() + except Exception as error: + log.error(_('Unable to setup per interface override: {error}').format(error=error)) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/pretemplates/00-ntp_signd b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/pretemplates/00-ntp_signd new file mode 100644 index 0000000000000000000000000000000000000000..96d6aebf8b2b1e0824f8c872f0ee8a9e005f7dc9 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/pretemplates/00-ntp_signd @@ -0,0 +1,25 @@ +#!/bin/bash + +# Pour Samba4, il faut 'ntp_sign' +# le fichier /etc/ntp.conf est un template EOLE +# mais il faut créer un fichier + +# rappel : Ntp must be Signed +# attention : Automatic ntp detection according to geographical zone is not always the best choice. +# Example scenario: you have a DC in paris and another DC London. timezone is different by one hour. your DC won't replicate as AD won't handle more than 5 minute in time difference between 2 AD DCs. +# In this scenario you'll have to use the same ntp so that they're set at the exact same time/date so they will replicate. +# In an AD environement, you absolutely want to avoid stale objects. + +ACTIVER_SAMBA_AD=$(CreoleGet activer_ad_smb non) +if [ ${ACTIVER_SAMBA_AD} == 'oui' ]; +then + #TODO: quid de l'existance de /var/lib/samba ? + if [ ! -f /var/lib/samba/ntp_signd ] + then + install -d /var/lib/samba/ntp_signd + chown root:ntp /var/lib/samba/ntp_signd + chmod 0750 /var/lib/samba/ntp_signd + fi +fi + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/pretemplates/00-partitioning b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/pretemplates/00-partitioning new file mode 100644 index 0000000000000000000000000000000000000000..cea9149e5b36ee4dab2bdcf2ecdad867614135a6 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/pretemplates/00-partitioning @@ -0,0 +1,184 @@ +#!/bin/bash + +. /usr/lib/eole/ihm.sh + +export LVM_SUPPRESS_FD_WARNINGS=1 + +function percentage_to_pe() +{ + echo `expr $FREE_PE \* $1 / 100` +} + +function extend_lv() +{ + local size=$2 + if [[ "${size}" = "0" ]] + then + echo "Nothing to do for ${1}" + return 0 + elif [[ "${size}" = "" ]] + then + size="100%FREE" + fi + echo "Extending ${1} with $size" + lvextend -l +$size ${LV_ROOT_PATH}/${1} -r > /dev/null 2>&1 + wait ${!} + return 0 +} + +function create_lvs() +{ + local lv_name=${LV_ROOT_PATH}/$1 + local lv_size=`percentage_to_pe $2` + local lv_format=$3 + echo "Creating LV $lv_name of $lv_size PE" + lvcreate -n $lv_name -l $lv_size > /dev/null 2>&1 + wait ${!} + if [[ "${lv_format}" != "None" ]] + then + echo "Creating fs $lv_format" + /sbin/mkfs.$lv_format $lv_name > /dev/null 2>&1 + wait ${!} + fi + return 0 +} + +function get_index() { + my_array=( "${@:2}" ) + for i in "${!my_array[@]}"; do + if [[ "${my_array[$i]}" = "$1" ]]; then + echo "${i}"; + fi + done +} + +function order_mount_points() { + elements=( "$@" ) + local processed='' + IFS=$'\n' sorted=( $(sort <<<"${elements[*]}") ) + unset IFS + for element in "${sorted[@]}"; do + indexes="$(get_index $element "${elements[@]}")" + # ${indexes} can have multiple entries for None + for index in ${indexes}; + do + if [[ "${processed}" =~ ";${index};" ]] + then + # Do not store 2 times the same entry + continue + else + processed="${processed};${index};" + echo ${index} + fi + done + done +} + +function create_fstab_entry() { + local lv_path=${LV_ROOT_PATH}/$1 + local lv_uuid=$(blkid -s UUID ${LV_ROOT_PATH}/$1 | cut -d ' ' -f 2) + local lv_mount_point=$2 + local lv_format=$3 + local lv_mount_options=$4 + if [[ "${lv_mount_point}" != "None" ]] && [[ "${lv_uuid}" != "" ]] && [[ ! "$lv_mount_point" =~ [[:space:]]+${lv_mount_point}[[:space:]]+ ]] + then + echo "Creating fstab entry for $lv_path on $lv_mount_point" + echo "${lv_uuid//\"/} $lv_mount_point $lv_format ${lv_mount_options/None/rw} 0 2" >> /etc/fstab + if [[ -d "$lv_mount_point" ]] + then + EchoOrange "Transfert des données" + for process in `lsof | awk -v mount_point="${lv_mount_point//\//\\\/}" '$0 ~ mount_point {print $2}' | uniq` + do + if [[ ! "$PIDS" =~ "(${process})" ]] + then + kill "${process}" + fi + done + temp_mount_point=$(mktemp -d) + mount $lv_path $temp_mount_point + cp -a $lv_mount_point/* $temp_mount_point + wait ${!} + rm -rf $lv_mount_point/* + umount $temp_mount_point + else + mkdir -p $lv_mount_point + fi + mount -a + if [[ "${lv_mount_options}" =~ quota ]] + then + if [ ! -e /sbin/quotacheck ] + then + EchoOrange "Installer le paquet quota et lancer la commande quotacheck -cgum ${lv_mount_point} pour finaliser l’activation des quotas." + else + quotacheck_options="-cm" + quotaon_options="-" + if [[ "${lv_mount_options}" =~ usrquota ]] + then + quotacheck_options="${quotacheck_options}u" + quotaon_options="${quotaon_options}u" + fi + if [[ "${lv_mount_options}" =~ grpquota ]] + then + quotacheck_options="${quotacheck_options}g" + quotaon_options="${quotaon_options}g" + fi + quotacheck "${quotacheck_options}" "${lv_mount_point}" + quotaon ${quotaon_options} ${lv_mount_point} + quotaon -p ${lv_mount_point} + fi + fi + else + echo "No fstab entry created for $lv_path" + fi + return 0 +} + +if [[ $(CreoleGet allow_manual_partitioning non) = 'oui' ]] && [[ "$1" = "instance" ]] +then + LV_ROOT_PATH=`dirname $(vgs -o lv_path --noheadings | head -n1)` + FREE_PE=`vgs -o vg_free_count --noheadings` + LV_NAMES=`lvs -o lv_name --noheadings` + MOUNT_POINTS="`awk '/^[^#]+$/ {print $2}' /etc/fstab`" + PIDS=`pstree -ps $$` + + # Use EOLE standard extension or personalisez one + if [[ $(CreoleGet use_eole_standard_volume_extension non) = 'oui' ]] + then + partitioning_lv_name=( $(CreoleGet eole_lv_names) ) + partitioning_lv_size=( $(CreoleGet eole_lv_standard_extends) ) + # Just count elements + indices=$(seq 0 $(( ${#partitioning_lv_name[@]} - 1 )) ) + elif [[ $(CreoleGet partitioning_create_lv non) = 'oui' ]] + then + partitioning_lv_name=( `CreoleGet partitioning_lv_name` ) + partitioning_lv_size=( $(CreoleGet partitioning_lv_size) ) + partitioning_lv_format=( `CreoleGet partitioning_lv_format` ) + partitioning_lv_mount_point=( `CreoleGet partitioning_lv_mount_point` ) + partitioning_lv_mount_options=( `CreoleGet partitioning_lv_mount_options` ) + indices="$(order_mount_points ${partitioning_lv_mount_point[@]})" + fi + + for index in $indices + do + EchoGras "Traitement du volume logique ${partitioning_lv_name[$index]}" + if [[ "${LV_NAMES}" =~ [[:space:]]+"${partitioning_lv_name[$index]}"([[:space:]]+|$) ]] + then + extend_lv "${partitioning_lv_name[$index]}" `percentage_to_pe ${partitioning_lv_size[$index]}` + else + create_lvs ${partitioning_lv_name[$index]} \ + ${partitioning_lv_size[$index]} \ + ${partitioning_lv_format[$index]} + + create_fstab_entry ${partitioning_lv_name[$index]} \ + ${partitioning_lv_mount_point[$index]} \ + ${partitioning_lv_format[$index]} \ + ${partitioning_lv_mount_options[$index]} + fi + done + + if [[ "`CreoleGet partitioning_lv_extend non`" = "oui" ]] + then + extend_lv "`CreoleGet partitioning_lv_to_extend`" + fi +fi +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/pretemplates/00-resolvconf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/pretemplates/00-resolvconf new file mode 100644 index 0000000000000000000000000000000000000000..e744c317c377ac0909160d7348654c02c525ed7a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/pretemplates/00-resolvconf @@ -0,0 +1,19 @@ +#!/bin/bash + +# Keep plain /etc/resolv.conf only if admin set the DNS IPs +# Otherwise, /etc/resolv.conf is a link to systemd-resolved compatibility file + +ACTIVER_RESOLV_TEMPLATE=$(CreoleGet test_activer_resolvconf_template) + +if [ "${ACTIVER_RESOLV_TEMPLATE}" = 'oui' -a -L /etc/resolv.conf ] +then + echo "Suppression du lien symbolique /etc/resolv.conf" + rm -f /etc/resolv.conf +elif [ "${ACTIVER_RESOLV_TEMPLATE}" = 'non' -a -f /etc/resolv.conf ] +then + echo "Création du lien symbolique /etc/resolv.conf vers /run/systemd/resolve/stub-resolv.conf" + rm -f /etc/resolv.conf + ln -s /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf +fi + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/pretemplates/00-timezone b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/pretemplates/00-timezone new file mode 100644 index 0000000000000000000000000000000000000000..1d26de9f979b539e2f0c643cdabfdcbb59730815 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/pretemplates/00-timezone @@ -0,0 +1,22 @@ +#!/bin/bash + +# appel en pretemplate pour les conteneurs +# le fichier /etc/timezone est un template EOLE +time_zone=`CreoleGet time_zone` +FILE=/usr/share/zoneinfo/$time_zone +if [ -f $FILE ]; then + for group in $(CreoleGet --group) + do + if CreoleRun 'test -L /etc/localtime' "${group}" + then + CreoleRun "ln -nsf $FILE /etc/localtime" "${group}" + else + CreoleRun "cp -f $FILE /etc/localtime" "${group}" + fi + done +else + . /usr/lib/eole/ihm.sh + EchoRouge "Pas de fuseau horaire $time_zone." +fi + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..975fc9e1f990becf6a461ba71e942a1885d187eb --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/service.yml @@ -0,0 +1,329 @@ +format: '0.1' +name: eole-server +version: |- + 2.7.1-20 +description: |- + Dictionnaires et templates communs pour EOLE + Ce paquet fournit la base commune à tous les modules EOLE. + . + Ce paquet est destiné à tous les serveurs, qu’ils soient contrôleur + LXC ou pas. +depends: + - or: + - zephir-stats + - eole-ead3 + - or: + - eole-exim + - eole-genconfig + - eole-nut +packages: + - acpid + - apparmor + - apt-show-versions + - at + - console-data + - convmv + - elinks + - fping + - gnutls-bin + - gpm + - htop + - language-pack-fr + - language-pack-gnome-fr + - libpam-passwdqc + - manpages-fr + - memtest86+ + - net-tools + - ntp + - ntpdate + - ntpstat + - numlockx + - pwgen + - rng-tools + - screen + - tcptraceroute + - tofrodos + - traceroute + - tree + - unzip + - update-manager-core + - vlan + - vnstat + - vnstati + - w3m + - or: + - zephir-backend + - zip + - creole + - plymouth-theme-eole-logo + - plymouth-theme-eole-text + - eole-common-pkg + - eole-debsums-zephir-agent + - eole-ead + - or: + - eole-mail + - eole-genconfig-client + - ubuntu-minimal + - ubuntu-standard +dictionaries: + - 00_common.xml + - 00_ntp.xml + - 00_partitioning.xml + - 01_log.xml + - 01_network.xml + - 01_network_interface0.xml + - 01_network_interface1.xml + - 01_network_interface2.xml + - 01_network_interface3.xml + - 01_network_interface4.xml + - 02_advanced_network.xml + - 02_certif.xml + - 03_maj.xml + - 03_schedule.xml + - 99-network.xml +extra_dictionaries: {} +templates: + - 00-container + - 00-eole.yaml + - 00-header + - 01-extras-routes.yaml + - 02eoleproxy + - 03-eole-changelogs + - 10-chain_static_rules + - 10-console-messages.conf + - 10-help-text + - 40-icmp_static_rules + - 50-nat_rules + - 99-end_static_rules + - DIR_COLORS + - additional.list + - bastion.conf + - bonding.conf + - ca-eole.conf + - certif-eole.conf + - client-eole.conf + - common-password + - container.lockfile + - cron-schedule + - dhclient.conf + - eole.cfg + - eolerc.sh + - forteresse.sh + - hostname + - hosts + - hosts.allow + - hosts.deny + - interface_0.conf + - interface_1.conf + - interface_2.conf + - interface_3.conf + - interface_4.conf + - issue + - le-00-copy + - logrotate_global_options + - nginx-minimal.conf + - ntp.conf + - ntpd.apparmor.conf + - ntpdate + - ntpdate.if-up + - openssh-server + - ouvre.firewall + - persistent-net.cfg + - policy-rc.d + - pythonrc + - release + - resolv.conf + - resolved.conf + - rng-tools + - rsyslog-ca.tmpl + - rsyslog-request.tmpl + - rsyslog.conf + - rsyslog.conf.container + - rsyslog.logrotate + - rsyslog_aggregation.conf + - rsyslog_default_dispatching.conf + - rsyslog_templates.conf + - rsyslog_traps_cron.conf + - rsyslog_traps_eole.conf + - rsyslog_traps_gpm.conf + - rsyslog_traps_iptables.conf + - rsyslog_traps_rsyslog.conf + - rsyslog_traps_xmlrpc.conf + - rsyslog_traps_zephir.conf + - rsyslog_views_auth.conf + - rsyslog_views_errors.conf + - server.cfg + - sources.list + - ssh_config + - sshd_config + - sudoers + - sysctl.conf + - timezone + - vimrc + - zstats.cfg +creole_funcs: + - get_etc_hosts.py + - master_network_interfaces.py + - partitioning_utils.py +preservices: + - 00-anetwork +postservices: + - 00-eole-common + - 00-letsencrypt + - 00-systemd-networkd + - 00-ubuntu-motd + - 99-check-console-setup +pretemplates: + - 00-letsencrypt + - 00-network + - 00-ntp_signd + - 00-partitioning + - 00-resolvconf + - 00-timezone +posttemplates: + - 00-eole-common + - 00-systemd-resolved + - 01-ntp +files: + /etc/default/grub.d/eole.cfg: + owner: root + group: root + mode: '0644' + /etc/dhcp/dhclient-enter-hooks.d/dhcp-eole: + owner: root + group: root + mode: '0644' + /etc/dhcp/dhclient-exit-hooks.d/bastion: + owner: root + group: root + mode: '0644' + /etc/grub.d/90_eole_default_kernel: + owner: root + group: root + mode: '0755' + /etc/profile.d/default_eole.sh: + owner: root + group: root + mode: '0644' + /etc/systemd/system/ntp.service.d/override.conf: + owner: root + group: root + mode: '0644' + /lib/systemd/system/bastion.service: + owner: root + group: root + mode: '0644' + /lib/systemd/system/ferme-firewall.service: + owner: root + group: root + mode: '0644' + /lib/systemd/system/netplan-apply.service: + owner: root + group: root + mode: '0644' + /lib/systemd/system/netplan-wait-online.service: + owner: root + group: root + mode: '0644' + /lib/systemd/system/ntpdate.service: + owner: root + group: root + mode: '0644' + /usr/sbin/bastion: + owner: root + group: root + mode: '0755' + /usr/sbin/eole-purge-interfaces: + owner: root + group: root + mode: '0755' + /usr/sbin/ferme.firewall: + owner: root + group: root + mode: '0755' + /usr/share/eole/bastion/data/00-static_rules: + owner: root + group: root + mode: '0755' + /usr/share/eole/bastion/post_cache/README: + owner: root + group: root + mode: '0644' + /usr/share/eole/certs/00_root.gen_cert: + owner: root + group: root + mode: '0644' + /usr/share/eole/diagnose/00-systemd: + owner: root + group: root + mode: '0755' + /usr/share/eole/diagnose/01-server: + owner: root + group: root + mode: '0755' + /usr/share/eole/diagnose/02-disk: + owner: root + group: root + mode: '0755' + /usr/share/eole/diagnose/03-packages: + owner: root + group: root + mode: '0755' + /usr/share/eole/diagnose/04-network: + owner: root + group: root + mode: '0755' + /usr/share/eole/diagnose/04-zfirewall: + owner: root + group: root + mode: '0755' + /usr/share/eole/diagnose/05-common: + owner: root + group: root + mode: '0755' + /usr/share/eole/diagnose/06-logs: + owner: root + group: root + mode: '0755' + /usr/share/eole/diagnose/07-container: + owner: root + group: root + mode: '0755' + /usr/share/eole/diagnose/08-upgrade: + owner: root + group: root + mode: '0755' + /usr/share/eole/firewall.start: + owner: root + group: root + mode: '0755' + /usr/share/eole/firewall.stop: + owner: root + group: root + mode: '0755' + /usr/share/eole/letsencrypt/hooks-post.d/99-restart: + owner: root + group: root + mode: '0755' + /usr/share/eole/letsencrypt/post.sh: + owner: root + group: root + mode: '0755' + /usr/share/eole/remove.d/eole.conf: + owner: root + group: root + mode: '0644' + /usr/share/locale/en/LC_MESSAGES/eole-common.mo: + owner: root + group: root + mode: '0644' + /usr/share/locale/fr/LC_MESSAGES/eole-common.mo: + owner: root + group: root + mode: '0644' + /usr/share/bash-completion/completions/CreoleSet: + owner: root + group: root + mode: '0644' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/00-container b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/00-container new file mode 100644 index 0000000000000000000000000000000000000000..fa7ec5bb5d0892354d2f2e7f8880eb251b7d0564 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/00-container @@ -0,0 +1,34 @@ +#!/bin/bash +%set interfaces = dict() +%for %%interface in %%creole_client.get_interfaces() + %set %%interfaces.setdefault(%%interface['container_group'], {})[%%interface['linkto']] = %%interface['name'] +%end for +## Reinitialisation des chaines +/sbin/iptables -F +/sbin/iptables -t nat -F +/sbin/iptables -t mangle -F + +## on vide les regles utilisateurs +/sbin/iptables -X +/sbin/iptables -t nat -X +/sbin/iptables -t mangle -X + +## mise en place de la politique par defaut +/sbin/iptables -P INPUT DROP +/sbin/iptables -P OUTPUT ACCEPT +/sbin/iptables -P FORWARD DROP +/sbin/iptables -A INPUT -i lo -j ACCEPT + +/sbin/iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT +/sbin/iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT +/sbin/iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT +%set %%created_int = [] +%for %%interface in %%interfaces.get(%%current_container['name'], {}).values() + %if %%interface not in %%created_int + %set %%chain = %%interface + '-root' +/sbin/iptables -N %%chain +/sbin/iptables -A INPUT -i %%interface -j %%chain + %%created_int.append(%%interface) + %end if +%end for +/sbin/iptables -A containers-root -j ACCEPT diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/00-eole.yaml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/00-eole.yaml new file mode 100644 index 0000000000000000000000000000000000000000..d9d05893c1ff4c1ed97d2c53ccf5b0fc4109120b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/00-eole.yaml @@ -0,0 +1,84 @@ +%set bonds = [] +%set vlans = [] + +network: + version: 2 + renderer: networkd + ethernets: +%for %%interface in range(0, %%int(%%nombre_interfaces)): + %set current_interface = 'eth' + str(%%interface) + %set interface_mode = %%getVar(%%current_interface + '_method') + %if %%getVar('activer_bonding_' + %%current_interface, "non") == 'non' + %%getVar('nom_zone_'+ %%current_interface): + link-local: [ ] + %if %%interface_mode == 'statique' and %%getVar("adresse_ip_" + %%current_interface): + addresses: + - %%getVar("adresse_ip_" + %%current_interface)/%%calc_classe(%%getVar('adresse_netmask_' + %%current_interface)) + %if %%getVar('alias_' + %%current_interface, "non") == "oui" + %for alias in %%getVar('alias_ip_' + %%current_interface) + - %%alias/%%calc_classe(getattr(alias, 'alias_netmask_' + %%current_interface)) + %end for + %end if + %if %%interface_gw == %%getVar('nom_zone_' + %%current_interface) and not %%is_empty(%%adresse_ip_gw) + gateway4: %%adresse_ip_gw + %end if + %elif %%interface_mode == 'dhcp' + dhcp4: yes + %else + dhcp4: no + %end if + %else + %%bonds.append(%%current_interface) + %for %%slave in %%getVar('nom_carte_' + %%current_interface): + %%slave: + optional: false + %end for + %end if + %if %%getVar('vlan_' + %%current_interface, 'non') == 'oui' + %%vlans.append(%%current_interface) + %end if +%end for + +%if len(%%bonds) > 0: + bonds: + %for bond in %%bonds: + %set %%bond_mode = %%getVar(%%bond + '_method') + %%getVar('nom_zone_' + %%bond): + link-local: [ ] + interfaces: [ %%custom_join(%%getVar('nom_carte_' + %%bond),',') ] + %if %%bond_mode == 'statique' + addresses: + - %%getVar("adresse_ip_" + %%bond)/%%calc_classe(%%getVar('adresse_netmask_' + %%bond)) + %if %%getVar('alias_' + %%current_interface, "non") == "oui" + %for alias in %%getVar('alias_ip_' + %%current_interface) + - %%alias/%%calc_classe(getattr(alias, 'alias_netmask_' + %%current_interface)) + %end for + %end if + %if %%interface_gw == %%getVar('nom_zone_' + %%bond) and not %%is_empty(%%adresse_ip_gw) + gateway4: %%adresse_ip_gw + %end if + %elif %%bond_mode == 'dhcp' + dhcp4: yes + %else + dhcp4: no + %end if + parameters: + mode: %%getVar('bonding_mode_' + %%bond) + mii-monitor-interval: %%getVar('bonding_miimon_' + %%bond) + up-delay: %%getVar('bonding_updelay_' + %%bond) + down-delay: %%getVar('bonding_downdelay_' + %%bond) + %end for +%end if + +%if len(vlans) > 0: + vlans: + %for vlan in %%vlans: + %for vlan_id in %%getVar('vlan_id_' + %%vlan): + vlan%%vlan_id: + link-local: [ ] + id: %%vlan_id + link: %%getVar('nom_zone_' + %%vlan) + addresses: [ %%getattr(vlan_id, 'vlan_ip_' + %%vlan)/%%calc_classe(%%getattr(vlan_id, 'vlan_netmask_' + %%vlan)) ] + %end for + %end for +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/00-header b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/00-header new file mode 100644 index 0000000000000000000000000000000000000000..15a65e38215131a8b82dd08d0c57fca8042b802f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/00-header @@ -0,0 +1,6 @@ +#!/bin/sh +printf " +EOLE est une distribution libre dérivée de la distribution Ubuntu. +Veuillez consulter les licences de chacun des produits dans +/usr/share/doc/*/copyright/. +" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/01-extras-routes.yaml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/01-extras-routes.yaml new file mode 100644 index 0000000000000000000000000000000000000000..04b3e290e00928795f7848e2f5c103e6954ba17c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/01-extras-routes.yaml @@ -0,0 +1,68 @@ +%set %%ethernet_routes = {} +%set %%bond_routes = {} +%set %%vlan_routes = {} +%set %%routes = False +%for %%route in %%route_adresse + %set %%interface = %%route.route_int + %if %%int(%%interface) >= %%int(%%nombre_interfaces) + %continue + %end if + %set %%carte = %%getVar(u'nom_zone_eth'+ %%interface) + %set %%routes = True + %if %%is_empty(%%route.route_vlan_id) + %if %%getVar(u'activer_bonding_eth'+ %%interface) == 'non' + %%ethernet_routes.setdefault(%%carte, []).append({'dest': %%route, + 'gw': %%route.route_gw, + 'netmask': %%route.route_netmask}) + %else + %%bond_routes.setdefault(%%carte, []).append({'dest': %%route, + 'gw': %%route.route_gw, + 'netmask': %%route.route_netmask}) + %end if + %else + %%vlan_routes.setdefault(%%route.route_vlan_id, []).append({'dest': %%route, + 'gw': %%route.route_gw, + 'netmask': %%route.route_netmask}) + %end if +%end for +%if %%routes +network: + version: 2 + renderer: networkd + %if %%ethernet_routes + ethernets: + %for %%interface in %%ethernet_routes: + %%interface: + routes: + %for %%route in %%ethernet_routes[interface]: + - to: %%route.dest/%%calc_classe(%%route.netmask) + via: %%route.gw + metric: 100 + %end for + %end for + %end if + %if %%vlan_routes + vlans: + %for %%vlan_id in %%vlan_routes: + vlan%%vlan_id: + routes: + %for %%route in %%vlan_routes[vlan_id]: + - to: %%route.dest/%%calc_classe(%%route.netmask) + via: %%route.gw + metric: 100 + %end for + %end for + %end if + %if %%bond_routes + bonds: + %for %%interface in %%bond_routes + %%interface: + routes: + %for %%route in %%bond_routes[interface]: + - to: %%route.dest/%%calc_classe(%%route.netmask) + via: %%route.gw + metric: 100 + %end for + %end for + %end if +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/02eoleproxy b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/02eoleproxy new file mode 100644 index 0000000000000000000000000000000000000000..9ec19290f9eccb1e3088d1e3b22bff0a56f24d2b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/02eoleproxy @@ -0,0 +1,15 @@ +// Configuration du proxy pour apt + +%if %%getVar('activer_apt_cacher', 'non') == 'oui' + %if %%getVar('mode_conteneur_actif', 'non') == 'oui' and %%current_container['name'] != 'root' +Acquire::http::Proxy "http://%%adresse_ip_br0:%%apt_cacher_port"; + %else +Acquire::http::Proxy "http://localhost:%%apt_cacher_port"; + %end if +%elif %%activer_proxy_client == 'oui' +Acquire::http::Proxy "http://%%proxy_client_adresse:%%proxy_client_port"; +//HTTPProxyUsername myusername +//HTTPProxyPassword mypass +%else +//Pas de proxy +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/03-eole-changelogs b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/03-eole-changelogs new file mode 100644 index 0000000000000000000000000000000000000000..453fbcfa78becf4a324cfde9e19993e55d4bc966 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/03-eole-changelogs @@ -0,0 +1,10 @@ +// Do not get online if we have the changelog locally +Acquire::Changelogs::AlwaysOnline "false"; + +// EOLE changelog URI +Acquire::Changelogs::URI::Origin::EOLE "http://%%serveur_maj[0]/eole/pool/@CHANGEPATH@.changelog"; + +%if %%getVar('envole_version', None) is not None +// Envole changelog URI +Acquire::Changelogs::URI::Origin::Envole "http://%%serveur_maj[0]/envole/pool/@CHANGEPATH@.changelog"; +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/10-chain_static_rules b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/10-chain_static_rules new file mode 100644 index 0000000000000000000000000000000000000000..cf1a51bcd8bda74f979643250f72187093c9da81 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/10-chain_static_rules @@ -0,0 +1,16 @@ +#!/bin/bash +%for num_int in %%range(0, %%int(%%nombre_interfaces)) +/sbin/iptables -N eth%%num_int-root +%end for + +%if %%mode_conteneur_actif == "oui" +# creation de la chaine conteneur à conteneur +/sbin/iptables -N cont-cont +# creation de la chaine conteneur à root +/sbin/iptables -N cont-root +# creation de la chaine conteneur à l'exterieur +/sbin/iptables -N cont-wide +%for num_int in %%range(0, %%int(%%nombre_interfaces)) +/sbin/iptables -N eth%%num_int-cont +%end for +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/10-console-messages.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/10-console-messages.conf new file mode 100644 index 0000000000000000000000000000000000000000..68828c24775e8542a8ba0b29e460dc1fd773de2a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/10-console-messages.conf @@ -0,0 +1,2 @@ +# the following stops low-level messages on console +kernel.printk = 1 4 1 7 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/10-help-text b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/10-help-text new file mode 100644 index 0000000000000000000000000000000000000000..4fd18557df327e91f4fb16db56ef1aa875e89777 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/10-help-text @@ -0,0 +1,2 @@ +#!/bin/sh +printf "\nDocumentation EOLE : http://eole.ac-dijon.fr/documentations/\n" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/40-icmp_static_rules b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/40-icmp_static_rules new file mode 100644 index 0000000000000000000000000000000000000000..0d579931422408da0edac5adaebfc0dd06153bd6 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/40-icmp_static_rules @@ -0,0 +1,19 @@ +#!/bin/bash +%for num_int in %%range(0, %%int(%%nombre_interfaces)) +/sbin/iptables -A eth%%num_int-root -p icmp --icmp-type destination-unreachable -j ACCEPT +/sbin/iptables -A eth%%num_int-root -p icmp --icmp-type network-unreachable -j ACCEPT +/sbin/iptables -A eth%%num_int-root -p icmp --icmp-type source-quench -j ACCEPT +/sbin/iptables -A eth%%num_int-root -p icmp --icmp-type fragmentation-needed -j ACCEPT +/sbin/iptables -A eth%%num_int-root -p icmp --icmp-type time-exceeded -j ACCEPT +/sbin/iptables -A eth%%num_int-root -p icmp --icmp-type parameter-problem -j ACCEPT +/sbin/iptables -A eth%%num_int-root -p icmp --icmp-type echo-reply -j ACCEPT + %if %%getVar('restrict_ping_request', 'non') == 'oui' + %if %%getVar('admin_eth' + %%str(%%num_int), 'non') == 'oui' + %for %%ip_admin in %%getVar('ip_admin_eth' + %%str(%%num_int)) +/sbin/iptables -A eth%%num_int-root -p icmp --icmp-type echo-request -s %%ip_admin/%%getattr(%%ip_admin, 'netmask_admin_eth' + %%str(%%num_int)) -j ACCEPT + %end for + %end if + %else +/sbin/iptables -A eth%%num_int-root -p icmp --icmp-type echo-request -j ACCEPT + %end if +%end for diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/50-nat_rules b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/50-nat_rules new file mode 100644 index 0000000000000000000000000000000000000000..da95dbea8c29bbfd48a92a43c3c383b007e3942a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/50-nat_rules @@ -0,0 +1,172 @@ +#!/bin/bash +µµµµµµµµµµ +µµµµµµµµµµ une regle conteneur : +µµµµµµµµµµ creer un regle d autorisation dans le conteneur courant si une interface existe +µµµµµµµµµµ sinon creer une regle de DNAT depuis le maitre +µµµµµµµµµµ +µµµµµµµµµµ une regle maitre/non conteneur : +µµµµµµµµµµ creer des regles d autorisation sur le maitre +µµµµµµµµµµ +µµµµµµµµµµ une restriction est mise en place, n autorise que sur cette page/ip +µµµµµµµµµµ +%set interfaces = dict() +%for %%interface in %%creole_client.get_interfaces() + %set %%interfaces.setdefault(%%interface['container_group'], {})[%%interface['linkto']] = %%interface['name'] +%end for +µµµµµµµµµµ +µµµµµµµµµµ +µµµµµµµµµµ build restrictions dictionary used to limit access to a service +µµµµµµµµµµ +#IMPORTANT: rules are at this end of this file +%set %%restrictions = dict() +%for %%restriction in %%creole_client.get_service_restrictions() + %if 'activate' in %%restriction + %set %%container = %%restriction['container_group'] + %set %%interface = %%restriction.get('interface') + %if %%interface is None + %continue + %end if + %set %%service = %%restriction['service'] + %if 'name' in %%restriction + %if %%isinstance(%%restriction['name'], list) + %set %%netmask = %%restriction['netmask'] + %if %%restriction['name'] == [] + %set %%l_interface = %%interface + %if %%l_interface == [] + %%l_interface = None + %end if + %%restrictions.setdefault(%%service, {}).setdefault(%%container, {}).setdefault(%%l_interface, []).append(None) + %end if + %for %%idx, %%rest in %%enumerate(%%restriction['name']) + %if %%isinstance(%%interface, list) + %set %%l_interface = %%interface[idx] + %else + %set %%l_interface = %%interface + %end if + %set %%ip = %%restriction['name'][idx] + %if %%ip is None + %%restrictions.setdefault(%%service, {}).setdefault(%%container, {}).setdefault(%%l_interface), []).append(None) + %continue + %end if + %if %%isinstance(%%netmask, list) + %set %%l_netmask = %%netmask[idx] + %else + %set %%l_netmask = %%netmask + %end if + %if %%l_interface == 'auto' + %set %%calc_interface = %%get_interface_from_ip(%%ip) + %else + %set %%calc_interface = %%getVar('nom_zone_' + %%l_interface, None) + %if %%calc_interface == None + %%restrictions.setdefault(%%service, {}).setdefault(%%container, {}).setdefault(%%l_interface, []).append(None) + %continue + %end if + %end if + %%restrictions.setdefault(%%service, {}).setdefault(%%container, {}).setdefault(%%calc_interface, []).append(%%ip + '/' + %%l_netmask) + %end for + %else + %set %%ip = %%restriction['name'] + %if %%ip is None + %%restrictions.setdefault(%%service, {}).setdefault(%%container, {}).setdefault(%%interface, []).append(None) + %continue + %end if + %if %%interface == 'auto' + %set %%calc_interface = %%get_interface_from_ip(%%ip) + %else + %set %%calc_interface = %%getVar('nom_zone_' + %%interface, None) + %if %%calc_interface == None + %%restrictions.setdefault(%%service, {}).setdefault(%%container, {}).setdefault(%%interface, []).append(None) + %continue + %end if + %end if + %%restrictions.setdefault(%%service, {}).setdefault(%%container, {}).setdefault(%%calc_interface, []).append(%%ip + '/' + %%restriction['netmask']) + %end if + %else + %%restrictions.setdefault(%%service, {}).setdefault(%%container, {}).setdefault(%%interface, []).append(None) + %end if + %end if +%end for +µµµµµµµµµµ +µµµµµµµµµµ +µµµµµµµµµµ build access (and remove duplication) +µµµµµµµµµµ +%set %%accesses = {} +%for num_int in %%range(0, %%int(%%nombre_interfaces)) + %set %%eth_name = 'eth' + %%str(num_int) + %set %%chain = %%eth_name + '-root' + %set %%accesses[%%chain] = {'tcp': {}, 'udp': {}} +%end for +%for access in %%creole_client.get_service_accesss() + %if 'activate' in %%access and 'name' in %%access and %%access['node_name'] == 'port' + %set %%container_name = %%access['container_group'] + %set %%container_ip = %%getVar('container_ip_' + %%container_name) + %set %%port = %%access['name'] + %set %%service = %%access['service'] + %set %%current_restrictions = %%restrictions.get(%%access['service'], {}) + %set %%protocol = %%access['protocol'] + %if %%protocol == 'tcp' + %set %%protocol_chain = '-p tcp --syn' + %else + %set %%protocol_chain = '-p udp -m udp' + %end if + %for num_int in %%range(0, %%int(%%nombre_interfaces)) + %set %%eth_name = 'eth' + %%str(num_int) + %set %%interface_in_container = %%interfaces.get(%%container_name, {}).get(%%eth_name, None) + %set %%interface = %%getVar('nom_zone_' + %%eth_name) + %set %%chain = %%eth_name + '-root' + %set %%chain_cont = %%eth_name + '-cont' + %if %%container_name in %%current_restrictions + µµµµµµµµµµ some restrictions are apply to an interface, so get restrictions for current eth_name or add no rule + %set %%sources = %%current_restrictions[%%container_name].get(%%interface, []) + %else + µµµµµµµµµµ no restriction, so open for every one + %set %%sources = ['0/0'] + %end if + %for %%source in %%sources + %if %%source == None + µµµµµµµµµµ source == None so no value + %break + %end if + %if not %%port in %%accesses[%%chain][%%protocol] + %set %%accesses[%%chain][%%protocol][%%port] = {} + %end if + %if %%source == 'all' + %set %%accesses[%%chain][%%protocol][%%port][%%source] = "#desactivate for {0}:{1} in chain {2} source {3}, all source are forbidden".format(%%container_ip, %%port, %%chain, %%source) + %break + %end if + %if %%current_container.ip == %%container_ip + %if %%current_container.ip != '127.0.0.1' and %%interface_in_container == None + %set %%accesses[%%chain][%%protocol][%%port][%%source] = "#desactivate for {0}:{1} in chain {2} no interface in this container".format(%%container_ip, %%port, %%chain) + %else + %set %%accesses[%%chain][%%protocol][%%port][%%source] = "/sbin/iptables -A {0} -s {1} {2} --dport {3} -j ACCEPT".format(%%chain, %%source, %%protocol_chain, %%port) + %end if + %else + %if %%current_container.ip == '127.0.0.1' + %if %%interface_in_container == None + %set %%accesses[%%chain][%%protocol][%%port][%%source] = """/sbin/iptables -A {0} -s {1} {2} --dport {3} -d {4} -j ACCEPT +/sbin/iptables -t nat -A PREROUTING -i {5} -s {1} {2} --dport {3} -j DNAT --to-destination {4}:{3}""".format(%%chain_cont, %%source, %%protocol_chain, %%port, %%container_ip, %%interface) + %else + %set %%accesses[%%chain][%%protocol][%%port][%%source] = "#desactivate DNAT for {0}:{1} in chain {2} source {3}, already in container".format(%%container_ip, %%port, %%chain_cont, %%source) + %end if + %else + %set %%accesses[%%chain][%%protocol][%%port][%%source] = "#desactivate for {0}:{1} in chain {2} source {3}, must be set in an other container".format(%%container_ip, %%port, %%chain, %%source) + %end if + %end if + %end for + %end for + %end if +%end for +µµµµµµµµµµ +µµµµµµµµµµ +µµµµµµµµµµ Write rules +µµµµµµµµµµ +%for %%name, %%chain in %%accesses.items() +#%%name + %for %%protocol in %%chain.values() + %for %%port in %%protocol.values() + %for %%access in %%port.values() +%%access + %end for + %end for + %end for +%end for diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/99-end_static_rules b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/99-end_static_rules new file mode 100644 index 0000000000000000000000000000000000000000..28b8444d4897fb5ecdc4f7db121176101a81eb36 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/99-end_static_rules @@ -0,0 +1,14 @@ +#!/bin/bash +%for num_int in %%range(0, %%int(%%nombre_interfaces)) + %set %%chain = 'eth' + %%str(num_int) + '-root' +/sbin/iptables -A %%chain -m state --state ESTABLISHED,RELATED -j ACCEPT +/sbin/iptables -A %%chain -j DROP +/sbin/iptables -A INPUT -i %%getVar('nom_zone_eth' + %%str(num_int)) -j %%chain + +%if %%mode_conteneur_actif == "oui" + %set %%chain_cont = 'eth' + %%str(num_int) + '-cont' +/sbin/iptables -A %%chain_cont -m state --state ESTABLISHED,RELATED -j ACCEPT +/sbin/iptables -A %%chain_cont -j DROP +/sbin/iptables -A FORWARD -i %%getVar('nom_zone_eth' + %%str(num_int)) -o br0 -j %%chain_cont +%end if +%end for diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/DIR_COLORS b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/DIR_COLORS new file mode 100644 index 0000000000000000000000000000000000000000..6121eed9419709c7b4a3612959f3f9148f0dfe3c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/DIR_COLORS @@ -0,0 +1,89 @@ +# Configuration file for the color ls utility +# This file goes in the /etc directory, and must be world readable. +# You can copy this file to .dir_colors in your $HOME directory to override +# the system defaults. + +# COLOR needs one of these arguments: 'tty' colorizes output to ttys, but not +# pipes. 'all' adds color characters to all output. 'none' shuts colorization +# off. +COLOR tty + +# Below, there should be one TERM entry for each termtype that is colorizable +TERM linux +TERM console +TERM con132x25 +TERM con132x30 +TERM con132x43 +TERM con132x60 +TERM con80x25 +TERM con80x28 +TERM con80x30 +TERM con80x43 +TERM con80x50 +TERM con80x60 +TERM xterm +TERM xterm-color +TERM color-xterm +TERM vt100 +TERM rxvt +TERM ansi +TERM Eterm + +# EIGHTBIT, followed by '1' for on, '0' for off. (8-bit output) +EIGHTBIT 1 + +# Below are the color init strings for the basic file types. A color init +# string consists of one or more of the following numeric codes: +# Attribute codes: +# 00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed +# Text color codes: +# 30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white +# Background color codes: +# 40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=white +NORMAL 00 # global default, although everything should be something. +FILE 00 # normal file +DIR 01;34 # directory +LINK 01;36 # symbolic link +FIFO 40;33 # pipe +SOCK 01;35 # socket +BLK 40;33;01 # block device driver +CHR 40;33;01 # character device driver +ORPHAN 01;05;37;41 # orphaned symlinks +MISSING 01;05;37;41 # ... and the files they point to + +# This is for files with execute permission: +EXEC 01;32 + +# List any file extensions like '.gz' or '.tar' that you would like ls +# to colorize below. Put the extension, a space, and the color init string. +# (and any comments you want to add after a '#') +.cmd 01;32 # executables (bright green) +.exe 01;32 +.com 01;32 +.btm 01;32 +.bat 01;32 +.tar 01;31 # archives or compressed (bright red) +.tgz 01;31 +.tbz2 01;31 +.arc 01;31 +.arj 01;31 +.taz 01;31 +.lzh 01;31 +.lha 01;31 +.zip 01;31 +.z 01;31 +.Z 01;31 +.gz 01;31 +.bz2 01;31 +.bz 01;31 +.tz 01;31 +.rpm 01;31 +.jpg 01;35 # image formats +.jpeg 01;35 +.gif 01;35 +.bmp 01;35 +.xbm 01;35 +.xpm 01;35 +.png 01;35 +.tif 01;35 +.tiff 01;35 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/additional.list b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/additional.list new file mode 100644 index 0000000000000000000000000000000000000000..5fbbbf15427d2bc7bb1c8f40bce3c9f6ce03af5a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/additional.list @@ -0,0 +1,6 @@ +#template genere par Maj-Auto +# +%for %%name in %%additional_repository_name +# dépôt %%name +%%name.additional_repository_source +%end for diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/bastion.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/bastion.conf new file mode 100644 index 0000000000000000000000000000000000000000..154112c1cca5ce00db72feddd9c190994d9c7828 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/bastion.conf @@ -0,0 +1,5 @@ +mode_conteneur_actif=%%mode_conteneur_actif +install_rvp=%%getVar('install_rvp', 'non') +sw_database_mode=%%getVar('sw_database_mode', 'non') +type_amon=%%getVar('type_amon', '') +activer_firewall=%%getVar('activer_firewall', 'non') diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/bonding.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/bonding.conf new file mode 100644 index 0000000000000000000000000000000000000000..99ceff347fff596c6042de9b1f62c6d81a2b7df9 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/bonding.conf @@ -0,0 +1,8 @@ +# Fichier autogénéré par EOLE +# Toute modification manuelle sera perdue + +%for %%interface in %%get_master_interfaces(%%self): + %if %%interface.activer_bonding == 'oui' +alias %%interface.name bonding + %end if +%end for diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/ca-eole.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/ca-eole.conf new file mode 100644 index 0000000000000000000000000000000000000000..a9097c9e7b29a871a9ea1168f13422ad186194a0 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/ca-eole.conf @@ -0,0 +1,90 @@ +######################################################################## +# Fichier de configuration d'OpenSSL +######################################################################## + +# Fichier de configuration d'OpenSSL pour la génération d'une requête de +# certificat au format PKCS#10. +# +HOME = . +RANDFILE = /etc/ssl/.rand + + +#################################################################### +[ ca ] +default_ca = CA_default # The default ca section + +[ CA_default ] +dir = /etc/ssl +certs = $dir/certs +crl_dir = $dir/crl +database = $dir/index.txt +new_certs_dir = $dir/newcerts +certificate = $dir/certs/ca_local.crt +serial = $dir/serial +#crl = $dir/ca.crl +private_key = $dir/private/ca.key +default_days = %%ssl_default_cert_time +default_md = sha256 +preserve = no +unique_subject = no +x509_extensions = SERVEUR +copy_extensions = copy +policy = policy_anything +email_in_dn = no +name_opt = ca_default +cert_opt = ca_default + +[ policy_anything ] +countryName = supplied +stateOrProvinceName = optional +localityName = optional +organizationName = supplied +organizationalUnitName = supplied +commonName = supplied +emailAddress = optional + +[ req ] +default_bits = %%ssl_default_key_bits +#default_keyfile = /tmp/privkey.pem +default_days = %%ssl_default_cert_time +distinguished_name = req_distinguished_name +string_mask = nombstr +default_md = sha256 +input_password = secret +output_password = secret +prompt = no + +[ req_distinguished_name ] +#countryName = Country Name (2 letter code) +countryName = %%ssl_country_name + +#organizationName = Organization Name (eg, company) +organizationName = %%ssl_organization_name + +%def debut_dom(chaine) + %if chaine.count('.') == 0 + %return chaine + %else + %return '.'.join(chaine.split('.')[0:-1]) + %end if +%end def +## OrganizationUnitName +%for %%ssl_ou in %%range(%%len(%%ssl_organization_unit_name)) +%if %%ssl_ou != [''] +%%ssl_ou%slurp +.organizationalUnitName = %%debut_dom(%%ssl_organization_unit_name[%%ssl_ou]) +%end if +%end for +#commonName = FQDN du serveur +commonName = CA-%%ssl_server_name + +[SERVEUR] +nsComment = "" +subjectKeyIdentifier = hash +authorityKeyIdentifier = keyid,issuer:always +issuerAltName = issuer:copy +basicConstraints = critical,CA:TRUE +keyUsage = digitalSignature +keyUsage = critical, keyCertSign, cRLSign +nsCertType = server +extendedKeyUsage = serverAuth diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/certif-eole.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/certif-eole.conf new file mode 100644 index 0000000000000000000000000000000000000000..519a8a489a3b8158948f6b057b4eff0422947d34 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/certif-eole.conf @@ -0,0 +1,100 @@ +######################################################################## +# Fichier de configuration d'OpenSSL +######################################################################## + +# Fichier de configuration d'OpenSSL pour la génération d'une requête de +# certificat au format PKCS#10. +# +HOME = . +RANDFILE = /etc/ssl/.rand + + +#################################################################### +[ ca ] +default_ca = CA_default # The default ca section + +[ CA_default ] +dir = /etc/ssl +certs = $dir/certs +crl_dir = $dir/crl +database = $dir/index.txt +new_certs_dir = $dir/newcerts +certificate = $dir/certs/ca_local.crt +serial = $dir/serial +#crl = $dir/ca.crl +private_key = $dir/private/ca.key +default_days = %%ssl_default_cert_time +default_md = sha256 +preserve = no +unique_subject = no +x509_extensions = SERVEUR +copy_extensions = copy +policy = policy_anything +email_in_dn = no +name_opt = ca_default +cert_opt = ca_default + +[ policy_anything ] +countryName = supplied +stateOrProvinceName = optional +localityName = optional +organizationName = supplied +organizationalUnitName = supplied +commonName = supplied +emailAddress = optional + +[ req ] +default_bits = %%ssl_default_key_bits +#default_keyfile = /tmp/privkey.pem +default_days = %%ssl_default_cert_time +distinguished_name = req_distinguished_name +x509_extensions = SERVEUR +req_extensions = SERVEUR +string_mask = nombstr +default_md = sha256 +input_password = secret +output_password = secret +prompt = no + +[ req_distinguished_name ] +##countryName = Country Name (2 letter code) +countryName = %%ssl_country_name + +##organizationName = Organization Name (eg, company) +organizationName = %%ssl_organization_name + +%def debut_dom(chaine) + %if chaine.count('.') == 0 + %return chaine + %else + %return '.'.join(chaine.split('.')[0:-1]) + %end if +%end def +## OrganizationUnitName +%for %%ssl_ou in %%range(%%len(%%ssl_organization_unit_name)) +%if %%ssl_ou != [''] +%%ssl_ou%slurp +.organizationalUnitName = %%debut_dom(%%ssl_organization_unit_name[%%ssl_ou]) +%end if +%end for +##CommonName +commonName = %%ssl_server_name + +[SERVEUR] +basicConstraints = CA:FALSE +keyUsage = nonRepudiation, digitalSignature, keyEncipherment +extendedKeyUsage = serverAuth, clientAuth +nsCertType = server +nsComment = " " +%if not %%is_empty(%%ssl_subjectaltname) +subjectAltName = @ALIASES + +[ALIASES] +%set %%idx_dn = 0 +%set %%set_ssl_subjectaltname = %%set(%%ssl_subjectaltname) +%for %%altname in %%set_ssl_subjectaltname +DNS.%%idx_dn = %%altname +%set idx_dn += 1 +%end for + +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/client-eole.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/client-eole.conf new file mode 100644 index 0000000000000000000000000000000000000000..03c578a4a2124619e1a549b064b8445404392165 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/client-eole.conf @@ -0,0 +1,100 @@ +######################################################################## +# Fichier de configuration d'OpenSSL +######################################################################## + +# Fichier de configuration d'OpenSSL pour la génération d'une requête de +# certificat au format PKCS#10. +# +HOME = . +RANDFILE = /etc/ssl/.rand + + +#################################################################### +[ ca ] +default_ca = CA_default # The default ca section + +[ CA_default ] +dir = /etc/ssl +certs = $dir/certs +crl_dir = $dir/crl +database = $dir/index.txt +new_certs_dir = $dir/newcerts +certificate = $dir/certs/ca_local.crt +serial = $dir/serial +#crl = $dir/ca.crl +private_key = $dir/private/ca.key +default_days = %%ssl_default_cert_time +default_md = sha256 +preserve = no +unique_subject = no +x509_extensions = SERVEUR +copy_extensions = copy +policy = policy_anything +email_in_dn = no +name_opt = ca_default +cert_opt = ca_default + +[ policy_anything ] +countryName = supplied +stateOrProvinceName = optional +localityName = optional +organizationName = supplied +organizationalUnitName = supplied +commonName = supplied +emailAddress = optional + +[ req ] +default_bits = %%ssl_default_key_bits +#default_keyfile = /tmp/privkey.pem +default_days = %%ssl_default_cert_time +distinguished_name = req_distinguished_name +x509_extensions = SERVEUR +req_extensions = SERVEUR +string_mask = nombstr +default_md = sha256 +input_password = secret +output_password = secret +prompt = no + +[ req_distinguished_name ] +##countryName = Country Name (2 letter code) +countryName = %%ssl_country_name + +##organizationName = Organization Name (eg, company) +organizationName = %%ssl_organization_name + +%def debut_dom(chaine) + %if chaine.count('.') == 0 + %return chaine + %else + %return '.'.join(chaine.split('.')[0:-1]) + %end if +%end def +## OrganizationUnitName +%for %%ssl_ou in %%range(%%len(%%ssl_organization_unit_name)) +%if %%ssl_ou != [''] +%%ssl_ou%slurp +.organizationalUnitName = %%debut_dom(%%ssl_organization_unit_name[%%ssl_ou]) +%end if +%end for +##CommonName +commonName = %%ssl_server_name + +[SERVEUR] +basicConstraints = CA:FALSE +keyUsage = nonRepudiation, digitalSignature, keyEncipherment +extendedKeyUsage = serverAuth, clientAuth +nsCertType = client +nsComment = " " +%if not %%is_empty(%%ssl_subjectaltname) +subjectAltName = @ALIASES + +[ALIASES] +%set %%idx_dn = 0 +%set %%set_ssl_subjectaltname = %%set(%%ssl_subjectaltname) +%for %%altname in %%set_ssl_subjectaltname +DNS.%%idx_dn = %%altname +%set idx_dn += 1 +%end for + +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/common-password b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/common-password new file mode 100644 index 0000000000000000000000000000000000000000..f8bbf1c21172efa30d2c9577030f2534a769619c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/common-password @@ -0,0 +1,70 @@ +# +# /etc/pam.d/common-password - password-related modules common to all services +# +# This file is included from other service-specific PAM config files, +# and should contain a list of modules that define the services to be +# used to change user passwords. The default is pam_unix. + +# Explanation of pam_unix options: +# +# The "nullok" option allows users to change an empty password, else +# empty passwords are treated as locked accounts. +# +# The "md5" option enables MD5 passwords. Without this option, the +# default is Unix crypt. +# +# The "obscure" option replaces the old `OBSCURE_CHECKS_ENAB' option in +# login.defs. +# +# You can also use the "min" option to enforce the length of the new +# password. +# +# See the pam_unix manpage for other options. + +%if %%check_passwd == 'oui' +%if %%check_passwd_min_len_one_type == 0 +%set %%min_len_one_type='disabled' +%else +%set %%min_len_one_type=%%check_passwd_min_len_one_type +%end if +%if %%check_passwd_min_len_two_type == 0 +%set %%min_len_two_type='disabled' +%else +%set %%min_len_two_type=%%check_passwd_min_len_two_type +%end if +%if %%check_passwd_min_len_three_type == 0 +%set %%min_len_three_type='disabled' +%else +%set %%min_len_three_type=%%check_passwd_min_len_three_type +%end if +%if %%check_passwd_min_len_four_type == 0 +%set %%min_len_four_type='disabled' +%else +%set %%min_len_four_type=%%check_passwd_min_len_four_type +%end if +password required pam_passwdqc.so similar=deny min=%%min_len_one_type,%%min_len_two_type,%%min_len_two_type,%%min_len_three_type,%%min_len_four_type passphrase=0 %slurp +%if %%check_passwd_max != 0: +max=%%check_passwd_max +%end if + +%end if +password requisite pam_unix.so nullok obscure sha512 %slurp +%if %%check_passwd == 'oui' +use_first_pass +%end if + +# Alternate strength checking for password. Note that this +# requires the libpam-cracklib package to be installed. +# You will need to comment out the password line above and +# uncomment the next two in order to use this. +# (Replaces the `OBSCURE_CHECKS_ENAB', `CRACKLIB_DICTPATH') +# +# password required pam_cracklib.so retry=3 minlen=6 difok=3 +# password required pam_unix.so use_authtok nullok md5 + +# minimally-intrusive inclusion of smbpass in the stack for +# synchronization. If the module is absent or the passwords don't +# match, this module will be ignored without prompting; and if the +# passwords do match, the NTLM hash for the user will be updated +# automatically. +#password optional pam_smbpass.so nullok use_authtok use_first_pass missingok diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/container.lockfile b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/container.lockfile new file mode 100644 index 0000000000000000000000000000000000000000..d8ffe0d1d613431be6ade391b62f1b6bddfb8d79 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/container.lockfile @@ -0,0 +1,6 @@ +########################################## +# Verrou d’utilisation du mode conteneur # +########################################## +# +# Ce fichier sert de verrou car la désactivation du mode conteneur +# n’est pas supportée. diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/cron-schedule b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/cron-schedule new file mode 100644 index 0000000000000000000000000000000000000000..5423a52f5002b5545fcecb9dd024850cf221d4a4 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/cron-schedule @@ -0,0 +1 @@ +%%creole_client.get('schedule.schedule.minute') %%creole_client.get('schedule.schedule.hour') * * * root python /usr/share/eole/schedule/schedule cron >> /var/log/schedule.log diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/dhclient.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/dhclient.conf new file mode 100644 index 0000000000000000000000000000000000000000..1ae7c2c526a3b3cb1dab030f484910db85568182 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/dhclient.conf @@ -0,0 +1,70 @@ +# Configuration file for /sbin/dhclient, which is included in Debian's +# dhcp3-client package. +# +# This is a sample configuration file for dhclient. See dhclient.conf's +# man page for more information about the syntax of this file +# and a more comprehensive list of the parameters understood by +# dhclient. +# +# Normally, if the DHCP server provides reasonable information and does +# not leave anything out (like the domain name, for example), then +# few changes must be made to this file, if any. +# + +option rfc3442-classless-static-routes code 121 = array of unsigned integer 8; + +send host-name "%%nom_domaine_machine"; +#send dhcp-client-identifier 1:0:a0:24:ab:fb:9c; +#send dhcp-lease-time 3600; +#supersede domain-name "fugue.com home.vix.com"; + +%if not %%is_empty(%%adresse_ip_dns) +# DNS forcés + %if %%is_defined('container_ip_dns') +supersede domain-name-servers %%container_ip_dns, %%custom_join(%%adresse_ip_dns, ', '); + %else +supersede domain-name-servers %%custom_join(%%adresse_ip_dns, ', '); + %end if +%elif %%is_defined('container_ip_dns') +# DNS local +prepend domain-name-servers %%container_ip_dns; +%end if + +supersede domain-search "%%nom_domaine_local"; +supersede domain-name "%%nom_domaine_local"; + +request subnet-mask, broadcast-address, time-offset, routers, + domain-name, domain-name-servers, domain-search, host-name, + netbios-name-servers, netbios-scope, interface-mtu, + rfc3442-classless-static-routes; +#remove ntp-servers (#5162) + +#require subnet-mask, domain-name-servers; +#timeout 60; +#retry 60; +#reboot 10; +#select-timeout 5; +#initial-interval 2; +#script "/etc/dhcp3/dhclient-script"; +#media "-link0 -link1 -link2", "link0 link1"; +#reject 192.33.137.209; + +#alias { +# interface "eth0"; +# fixed-address 192.5.5.213; +# option subnet-mask 255.255.255.255; +#} + +#lease { +# interface "eth0"; +# fixed-address 192.33.137.200; +# medium "link0 link1"; +# option host-name "andare.swiftmedia.com"; +# option subnet-mask 255.255.255.0; +# option broadcast-address 192.33.137.255; +# option routers 192.33.137.250; +# option domain-name-servers 127.0.0.1; +# renew 2 2000/1/12 00:00:01; +# rebind 2 2000/1/12 00:00:01; +# expire 2 2000/1/12 00:00:01; +#} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/eole.cfg b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/eole.cfg new file mode 100644 index 0000000000000000000000000000000000000000..a4a66152f80a7e1708f7d4b904a4b9c2cad4ce28 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/eole.cfg @@ -0,0 +1,18 @@ +[View] +View=DistUpgradeViewEOLE +SupportSSH=DistUpgradeViewEOLE + +[Distro] +%if %%eole_module != 'eolebase' +%if %%mode_conteneur_actif == 'oui' +MetaPkgs=eole-%%eole_module-module, eole-%%eole_module +%else +MetaPkgs=eole-%%eole_module-all, eole-%%eole_module +%end if +%end if +BaseMetaPkgs=eole-server +PostUpgradeRemove=libflashsupport, kvm-source, gtk-qt-engine, libparted1.8-12, usplash, printconf, foomatic-db-gutenprint, ebox-printers, kbluetooth, kde-plasmoid-cwp, eole-register +PostInstallScripts=./xorg_fix_proprietary.py,/tmp/Upgrade-Auto/EOLEPostInstallScripts.py + +[NonInteractive] +DebugBrokenScripts=yes diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/eolerc.sh b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/eolerc.sh new file mode 100644 index 0000000000000000000000000000000000000000..61636f5e267a7e643dcea7936e74180618c56e36 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/eolerc.sh @@ -0,0 +1,129 @@ +#!/bin/sh +## ajout du path du repertoire Eole +PYTHONPATH=/usr/share/eole/:$PYTHONPATH +#PATH=$PATH:/usr/share/eole:/usr/sbin:/sbin +PATH=/usr/share/eole:/usr/share/eole/sbin:$PATH +# Eviter les messages d'erreurs en cas de chargement/source multiple +(unset HISTCONTROL &>/dev/null) && HISTCONTROL=ignoredups +(unset HISTFILE &>/dev/null) && HISTFILE=~/.bash_history +(unset HISTSIZE &>/dev/null) && HISTSIZE=1000 +(unset HISTFILESIZE &>/dev/null) && HISTFILESIZE=9999 +(unset HISTIGNORE &>/dev/null) && HISTIGNORE="" +(unset HISTTIMEFORMAT &>/dev/null) && HISTTIMEFORMAT="[ %d/%m/%Y %H:%M:%S ] " +readonly HISTFILE +readonly HISTSIZE +readonly HISTFILESIZE +readonly HISTIGNORE +readonly HISTCONTROL +readonly HISTTIMEFORMAT +export HISTFILE HISTSIZE HISTFILESIZE HISTIGNORE HISTCONTROL HISTTIMEFORMAT +(unset TMOUT &>/dev/null) && TMOUT=%%bash_tmout +export PYTHONPATH TMOUT + +if [ -z "$EDITOR" ] ; then + export EDITOR="vi" +fi + +[ -f ~/.alias ] && [ -z "$LOAD_SYSTEM_ALIASES" ] +[ -n "$IGNORE_SYSTEM_ALIASES" ] + +[ -f "/etc/DIR_COLORS" ] && eval `dircolors --sh /etc/DIR_COLORS` + +# default ls options +LS_OPTIONS="-F" + +# this should be removed once the bug with ls and multibytes locales is fixed +[ -r /etc/profile.d/lang.sh ] && . /etc/profile.d/lang.sh +case "$LC_ALL$LC_CTYPE" in + ja*|ko*|zh*) LS_OPTIONS="$LS_OPTIONS --show-control-chars" ;; + *) if [ "`locale charmap`" = "UTF-8" ]; then + LS_OPTIONS="$LS_OPTIONS --show-control-chars" + fi ;; +esac + +# emacs doesn't support color +if [ ! "$TERM" = "emacs" ];then + LS_OPTIONS="$LS_OPTIONS --color=auto" +fi + +alias ls="ls $LS_OPTIONS" + +alias d="ls" +alias l="ls" # classical listing. +alias ll="ls -l" # List detailled. +alias la='ls -a' # List all. +alias lsd="ls -d */" # List only the directory. +alias cd..="cd .." +alias s="cd .." +alias p="cd -" +alias du='du -h' +alias df='df -h' + +alias md="mkdir" +alias rd="rmdir" +alias cp="cp -i" +alias mv="mv -i" +alias rm="rm -i" +alias vi="vim" +alias egrep='egrep --color' +alias fgrep='fgrep --color' +alias grep='grep --color' + +alias purge="find \( -name '*.pyc' -o -name '*~' \) -delete" + +# Make a filter for less +if [ -x /usr/bin/lesspipe.sh ];then + export LESSOPEN="|/usr/bin/lesspipe.sh %s" +fi + +export LESS=-MM + +export PATH +export LANG="fr_FR.UTF-8" +export LC_CTYPE="fr_FR.UTF-8" +export LC_NUMERIC="fr_FR.UTF-8" +export LC_TIME="fr_FR.UTF-8" +export LC_COLLATE="fr_FR.UTF-8" +export LC_MONETARY="fr_FR.UTF-8" +export LC_MESSAGES="fr_FR.UTF-8" +export LC_PAPER="fr_FR.UTF-8" +export LC_NAME="fr_FR.UTF-8" +export LC_ADDRESS="fr_FR.UTF-8" +export LC_TELEPHONE="fr_FR.UTF-8" +export LC_MEASUREMENT="fr_FR.UTF-8" +export LC_IDENTIFICATION="fr_FR.UTF-8" +export LC_ALL="fr_FR.UTF-8" + +if [ -n "$BASH" ] +then + # Bash specific stuffis + export PS1='\u@\h:\w\$' + if [ -f /etc/bash.bashrc ]; then + . /etc/bash.bashrc + fi + %if %%activer_bash_completion == 'non' + complete -r + %end if +fi +%if %%is_defined('login_graphique') +#si eclair +SDL_AUDIODRIVER='pulse' +if [ `id -u` = 0 ];then + umask 022 +else + umask 077 +fi +%else +umask 022 +%end if + +export PYTHONSTARTUP=/etc/pythonrc +export PYTHONIOENCODING='UTF8' + +#%if %%is_defined('activer_proxy_client') and %%activer_proxy_client == 'oui' +#export http_proxy="http://%%proxy_client_adresse:%%proxy_client_port/" +#export ftp_proxy="http://%%proxy_client_adresse:%%proxy_client_port/" +#%else +#export http_proxy="" +#export ftp_proxy="" +#%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/forteresse.sh b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/forteresse.sh new file mode 100644 index 0000000000000000000000000000000000000000..9b5e92ab2911900da15f1c303da6e1d50ca2cd0d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/forteresse.sh @@ -0,0 +1,133 @@ +#!/bin/sh + +#------------------------------------------------------------------------ +# forteresse.sh - Put the current server in fortress mode +# Everything is rejected except SSH for authorized networks +# +# Copyright © 2016 Pôle de compétences EOLE <eole@ac-dijon.fr> +# +# License CeCILL: +# * in french: http://www.cecill.info/licences/Licence_CeCILL_V2-fr.html +# * in english http://www.cecill.info/licences/Licence_CeCILL_V2-en.html + +%set %%enabled = {u'oui': 'true', u'non': 'false'} +FIREWALL_ENABLED=%%enabled[%%getVar(u'activer_firewall', u'non')] + +# Check if parameter is current interface +# If ${IFACE} is undef then match all interfaces +is_iface() { + [ -z "${IFACE}" -o "${IFACE}" = "${1}" ] +} + +forteresse_start() { + if [ -n "${IFACE}" -a "${MODE}" != 'start' ] + then + # From if-down script + exit 0 + fi + + if [ -n "${IFACE}" -a "${FIREWALL_ENABLED}" = 'false' ] + then + # From if-up script with firewall disabled + log_warning_msg "Pare-feu désactivé, mode forteresse inactif." + exit 0 + fi + + if [ -n "${IFACE}" -a "$(runlevel)" != "unknown" ] + then + # From if-up script in non booting mode + exit 0 + fi + + # Either from ifup with firewall enabled or direct call + if is_iface "lo" + then + + # Either from ifup with firewall enabled or direct call + ## Reinitialisation des chaines + /sbin/iptables -F + /sbin/iptables -t nat -F + ## on vide les regles utilisateurs + /sbin/iptables -t nat -X + /sbin/iptables -X + ## mise en place de la politique par defaut + /sbin/iptables -P INPUT DROP + /sbin/iptables -P OUTPUT ACCEPT + /sbin/iptables -P FORWARD DROP + ## lo ok + /sbin/iptables -A INPUT -i lo -j ACCEPT + + #Supprime les set ipset + if [ $(command -v ipset) ] + then + ipset -n list | while read setname; do + ipset flush "$setname"; + ipset destroy "$setname"; + done + fi + fi + + %if %%getVar('activer_haute_dispo', 'non') != "non" + %set %%interface_name = %%getVar(u'nom_zone_eth{0}'.format(%%corosync_dial_if)) + if is_iface "%%interface_name" + then + /sbin/iptables -A INPUT -i %%interface_name -m pkttype --pkt-type multicast -j ACCEPT + /sbin/iptables -A INPUT -i %%interface_name -p udp -m udp --dport %%corosync_mcastport -j ACCEPT + fi + %end if + + µµµµµµµµµµ range(3) => 0, 1, 2 + %for %%id_interface in %%range(%%int(%%nombre_interfaces)) + %set %%phy_interface = u'eth{0}'.format(%%id_interface) + %set %%interface_name = %%getVar(u'nom_zone_{0}'.format(%%phy_interface)) + if is_iface "%%interface_name" + then + [ "${VERBOSE}" = 'false' ] || echo "Activation du mode forteresse sur %%interface_name" + %if %%activer_firewall == u'non' + /sbin/iptables -A INPUT -i %%interface_name -p tcp --syn -s 0/0 --dport ssh -m state --state NEW -j ACCEPT + %else + %if %%getVar(u'ssh_{0}'.format(%%phy_interface), u'non') == u'oui' + %set %%mask_attribute_name = u'netmask_ssh_{0}'.format(%%phy_interface) + %for %%res_ssh in %%getVar(u'ip_ssh_{0}'.format(%%phy_interface)) + µµµµµµµµµµ Get netmask attribute + %set %%res_mask = %%getattr(%%res_ssh,%%mask_attribute_name) + /sbin/iptables -A INPUT -i %%interface_name -p tcp --syn -s %%res_ssh/%%res_mask --dport ssh -m state --state NEW -j ACCEPT + %end for + %end if + %end if + /sbin/iptables -A INPUT -i %%interface_name -m state --state ESTABLISHED,RELATED -j ACCEPT + fi + + %end for + + if is_iface "%%getVar('nom_zone_eth0', 'eth0')" + then + # Manage LXC if any + if [ -x /usr/share/eole/bastion/data/90-lxc_rules ] + then + /usr/share/eole/bastion/data/90-lxc_rules + fi + fi +} + +close_container() { + local container=$1 + tcpcheck 2 $container:22 &>/dev/null || return 1 + ssh -q -o LogLevel=ERROR -oStrictHostKeyChecking=no root@${container} /usr/share/eole/firewall.stop +} + +close_all_containers() { + %if %%mode_conteneur_actif == 'non' + # Container mode is disabled => do nothing + : + %else + %for %%group in %%creole_client.get_groups() + %if %%group in [u'root', u'all'] + %continue + %end if + [ "${VERBOSE}" = 'false' ] || echo "Activation du mode forteresse pour le conteneur %%group" + close_container %%getVar('adresse_ip_{0}'.format(%%group)) + + %end for + %end if +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/hostname b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/hostname new file mode 100644 index 0000000000000000000000000000000000000000..89b100e0eeeee5d4dc7d99329c6be57f7a2cccb9 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/hostname @@ -0,0 +1,6 @@ +%if %%getVar('activer_ad_smb', 'non') == 'oui' +%%nom_machine.%%ad_realm +%else +%%nom_machine +%end if + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/hosts b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/hosts new file mode 100644 index 0000000000000000000000000000000000000000..61c548da90438182eb4775200312e5f30fe384d5 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/hosts @@ -0,0 +1,128 @@ +127.0.0.1 localhost.localdomain localhost +%%adresse_ip_eth0 %%nom_domaine_machine %%nom_machine +%if %%nombre_interfaces >= "2" and %%is_defined('nom_machine_eth1') +%%adresse_ip_eth1 %%nom_machine_eth1.%%nom_domaine_local %%nom_machine_eth1 +%if %%is_defined('nom_domaine_local_supp') and %%nom_domaine_local_supp != [''] +%for %%domaines_iter in %%nom_domaine_local_supp +%%adresse_ip_eth0 %%nom_machine.%%domaines_iter +%%adresse_ip_eth1 %%nom_machine_eth1.%%domaines_iter +%end for +%end if +%end if +%if %%nombre_interfaces >= "3" and %%is_defined('nom_machine_eth2') + +%%adresse_ip_eth2 %%nom_machine_eth2.%%nom_domaine_local %%nom_machine_eth2 +%if %%is_defined('nom_domaine_local_supp') and %%nom_domaine_local_supp != [''] +%for %%domaines_iter in %%nom_domaine_local_supp +%%adresse_ip_eth2 %%nom_machine_eth2.%%domaines_iter +%end for +%end if +%end if +%if %%nombre_interfaces >= "4" and %%is_defined('nom_machine_eth3') + +%%adresse_ip_eth3 %%nom_machine_eth3.%%nom_domaine_local %%nom_machine_eth3 +%if %%is_defined('nom_domaine_local_supp') and %%nom_domaine_local_supp != [''] +%for %%domaines_iter in %%nom_domaine_local_supp +%%adresse_ip_eth3 %%nom_machine_eth3.%%domaines_iter +%end for +%end if +%end if +%if %%nombre_interfaces == "5" and %%is_defined('nom_machine_eth4') + +%%adresse_ip_eth4 %%nom_machine_eth4.%%nom_domaine_local %%nom_machine_eth4 +%if %%is_defined('nom_domaine_local_supp') and %%nom_domaine_local_supp != [''] +%for %%domaines_iter in %%nom_domaine_local_supp +%%adresse_ip_eth4 %%nom_machine_eth4.%%domaines_iter +%end for +%end if +%end if + +%if %%getVar('type_squid_auth', '') == 'NTLM/SMB' +#authentification NTLM/SMB + %if %%is_defined('smb_netbios_name') + %if %%smb_netbios_name != %%nom_serveur_smb + %%ip_serveur_smb %%nom_serveur_smb.%%nom_domaine_local %%smb_netbios_name %slurp + %if %%getVar('install_scribe_dmz', 'non') == 'oui' and %%ip_serveur_smb == %%ip_serveur_scribe_dmz and %%smb_netbios_name != %%nom_serveur_scribe_dmz +%%nom_serveur_scribe_dmz + %else + + %end if + %end if + %else +%%ip_serveur_smb %%nom_serveur_smb.%%nom_domaine_local %%nom_serveur_smb %slurp + %if %%getVar('install_scribe_dmz', 'non') == 'oui' and %%ip_serveur_smb == %%ip_serveur_scribe_dmz and %%nom_serveur_smb != %%nom_serveur_scribe_dmz +%%nom_serveur_scribe_dmz + %else + + %end if + %end if +%else + %if %%getVar('install_scribe_dmz', 'non') == 'oui' +# scribe en DMZ +%%ip_serveur_scribe_dmz %%nom_serveur_scribe_dmz.%%nom_domaine_local %%nom_serveur_scribe_dmz + %end if +%end if + +%if %%is_defined('type_squid_auth') and %%type_squid_auth == 'NTLM/KERBEROS' +%%ip_serveur_krb %%nom_serveur_krb.%%nom_domaine_krb %%nom_serveur_krb +%end if + +%if %%is_defined('wpad_domains') +%%adresse_ip_eth0 %slurp + %for %%wpad_domain in %%wpad_domains +wpad.%%wpad_domain %slurp + %end for +wpad +%end if + +%if %%is_defined('container_ip_dns') and %%container_ip_dns != '127.0.0.1' +#configuration du DNS +%%container_ip_dns %%container_name_dns.%%nom_domaine_local +%if %%is_defined('nom_domaine_local_supp') and %%nom_domaine_local_supp != [''] +%for %%domaines_iter in %%nom_domaine_local_supp +%%container_ip_dns %%container_name_dns.%%domaines_iter +%end for +%end if +%end if + +%if %%is_defined('web_url') and not %%is_ip(%%web_url) +#applications web +%%adresse_ip_eth0 %%web_url +%end if + +%if %%is_defined('smb_netbios_name') and %%nom_machine != %%smb_netbios_name +#serveur de fichiers +%if %%mode_conteneur_actif == 'non' +%%adresse_ip_eth0 %slurp +%else +%%adresse_ip_fichier_link %slurp +%end if +%%smb_netbios_name.%%nom_domaine_local +%end if + +%if %%activer_ajout_hosts == 'oui' +#ajouts locaux +%for %%hote in %%adresse_ip_hosts +%%hote %%hote.nom_long_hosts %%hote.nom_court_hosts +%end for +%end if + +# nodes haute dispo +%if %%is_defined('activer_haute_dispo') + %if %%activer_haute_dispo == 'maitre' +%%ip_machine_esclave %%nom_machine_esclave + %end if + %if %%activer_haute_dispo == 'esclave' +%%ip_machine_maitre %%nom_machine_maitre + %end if +%end if + +%if %%is_defined('one_master') +#Master OpenNebula +%%one_master_ip %%one_master +%end if + + +%if %%mode_conteneur_actif == 'oui' and %%is_defined('gaspacho_ssl_server_name') and %%is_defined('adresse_ip_fichier_link') +%%adresse_ip_fichier_link %%gaspacho_ssl_server_name +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/hosts.allow b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/hosts.allow new file mode 100644 index 0000000000000000000000000000000000000000..87df33901bf211b2d4a440e43370d8c1e3d923e3 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/hosts.allow @@ -0,0 +1,80 @@ +#this file is generated by EOLE, don't modify this file +µµµµµµµµµµ +µµµµµµµµµµ +µµµµµµµµµµ build restrictions dictionary used to limit access to a service +µµµµµµµµµµ +%if %%activer_firewall == 'non' +ALL:ALL +%else + +%if %%mode_conteneur_actif == "oui" +ALL:%%adresse_network_br0/%%adresse_netmask_br0 +%end if +%set global %%restrictions = dict() +%def add_restriction(%%service, %%container, %%ip, %%netmask, %%interface) + %if %%netmask != '255.255.255.255' + %set %%ip_restriction = %%ip + '/' + %%netmask + %else + %set %%ip_restriction = %%ip + %end if + %silent %%restrictions.setdefault(%%service, {}).setdefault(%%container, {}).setdefault(%%interface, []).append(%%ip_restriction) +%end def +%for %%restriction in %%creole_client.get_service_restrictions() + %set %%container = %%restriction['container_group'] + %set %%service = %%restriction['service'] + %set %%interface=%%restriction.get('interface', None) + %if 'activate' in %%restriction and 'name' in %%restriction + %if %%isinstance(%%restriction['name'], list) + %set %%netmask = %%restriction['netmask'] + %for %%idx, %%rest in %%enumerate(%%restriction['name']) + %if %%isinstance(%%interface, list) + %set %%l_interface = %%interface[idx] + %else + %set %%l_interface = %%interface + %end if + %if %%restriction['name'] == [] + %silent %%restrictions.setdefault(%%service, {}).setdefault(%%container, {}).setdefault(%%l_interface, []).append(None) + %end if + %if %%restriction['name'][idx] is None + %silent %%restrictions.setdefault(%%service, {}).setdefault(%%container, {}).setdefault(%%l_interface, []).append(None) + %continue + %end if + %if %%isinstance(%%netmask, list) + %set %%l_netmask = %%netmask[idx] + %else + %set %%l_netmask = %%netmask + %end if + %silent %%add_restriction(%%service, %%container, %%restriction['name'][idx], %%l_netmask, %%l_interface) + %end for + %else + %if %%restriction['name'] is None + %silent %%restrictions.setdefault(%%service, {}).setdefault(%%container, {}).setdefault(%%interface, []).append(None) + %continue + %end if + %silent %%add_restriction(%%service, %%container, %%restriction['name'], %%restriction['netmask'], %%interface) + %end if + %else + %silent %%restrictions.setdefault(%%service, {}).setdefault(%%container, {}).setdefault(%%interface, []).append(None) + %end if +%end for + +%for access in %%creole_client.get_service_accesss() + %if 'activate' in %%access and 'name' in %%access and %%access['node_name'] == 'tcpwrapper' + %set %%container_ip = %%getVar('container_ip_' + %%access['container']) + %set %%container_name = %%access['container_group'] + %if %%mode_conteneur_actif == "oui" and %%current_container['name'] != %%container_name +#desactived not in this container %slurp + %end if + %set %%sources = %%restrictions.get(%%access['service'], {}).get(%%container_name, {'all': ['0.0.0.0/0.0.0.0']}) + %for %%source in %%sources + %for %%interface in %%sources[%%source] + %if %%interface == None + %continue + %end if +%%access['name']:%%interface + %end for + %end for + %end if +%end for + +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/hosts.deny b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/hosts.deny new file mode 100644 index 0000000000000000000000000000000000000000..be58acbb52aaef8403eb72a267006ec11d55532f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/hosts.deny @@ -0,0 +1,27 @@ +# /etc/hosts.deny: list of hosts that are _not_ allowed to access the system. +# See the manual pages hosts_access(5) and hosts_options(5). +# +# Example: ALL: some.host.name, .some.domain +# ALL EXCEPT in.fingerd: other.host.name, .other.domain +# +# If you're going to protect the portmapper use the name "portmap" for the +# daemon name. Remember that you can only use the keyword "ALL" and IP +# addresses (NOT host or domain names) for the portmapper, as well as for +# rpc.mountd (the NFS mount daemon). See portmap(8) and rpc.mountd(8) +# for further information. +# +# The PARANOID wildcard matches any host whose name does not match its +# address. +# +# You may wish to enable this to ensure any programs that don't +# validate looked up hostnames still leave understandable logs. In past +# versions of Debian this has been the default. +# ALL: PARANOID + +%if %%activer_firewall == 'oui' + %set %%exceptions = '127.0.0.1' + %if %%mode_conteneur_actif == 'oui' + %set %%exceptions = %%exceptions + ' ' + %%adresse_network_br0 + '/' + %%adresse_netmask_br0 + %end if +ALL: ALL EXCEPT %%exceptions +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/interface_0.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/interface_0.conf new file mode 100644 index 0000000000000000000000000000000000000000..789bc37f6fc1f3c52febe05fc539a6452ab3e19e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/interface_0.conf @@ -0,0 +1,7 @@ +[Network] +ConfigureWithoutCarrier=yes + +[Link] +%if %%ip_no_pmtu_disc == 'oui' and %%valeur_mtu_eth0 is not None +MTUBytes=%%valeur_mtu_eth0 +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/interface_1.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/interface_1.conf new file mode 100644 index 0000000000000000000000000000000000000000..f8ef1a6a127c883fd58a804d47be4ceebbb7ae19 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/interface_1.conf @@ -0,0 +1,7 @@ +[Network] +ConfigureWithoutCarrier=yes + +[Link] +%if %%ip_no_pmtu_disc == 'oui' and %%valeur_mtu_eth1 is not None +MTUBytes=%%valeur_mtu_eth1 +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/interface_2.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/interface_2.conf new file mode 100644 index 0000000000000000000000000000000000000000..6821432294996ff66e0462ff6283360c8993b7cf --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/interface_2.conf @@ -0,0 +1,7 @@ +[Network] +ConfigureWithoutCarrier=yes + +[Link] +%if %%ip_no_pmtu_disc == 'oui' and %%valeur_mtu_eth2 is not None +MTUBytes=%%valeur_mtu_eth2 +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/interface_3.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/interface_3.conf new file mode 100644 index 0000000000000000000000000000000000000000..f6cd5db4e8ec79dd22b690eab3a4e27bd1bed808 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/interface_3.conf @@ -0,0 +1,7 @@ +[Network] +ConfigureWithoutCarrier=yes + +[Link] +%if %%ip_no_pmtu_disc == 'oui' and %%valeur_mtu_eth3 is not None +MTUBytes=%%valeur_mtu_eth3 +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/interface_4.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/interface_4.conf new file mode 100644 index 0000000000000000000000000000000000000000..6ee6c4e430a59932aa47c787956782de090a0691 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/interface_4.conf @@ -0,0 +1,7 @@ +[Network] +ConfigureWithoutCarrier=yes + +[Link] +%if %%ip_no_pmtu_disc == 'oui' and %%valeur_mtu_eth4 is not None +MTUBytes=%%valeur_mtu_eth4 +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/issue b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/issue new file mode 100644 index 0000000000000000000000000000000000000000..4e026e87e25bc37236fb49555bac5bea31ae414b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/issue @@ -0,0 +1,2 @@ +[H[2J +EOLE %%eole_version (%%eole_module) \l diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/le-00-copy b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/le-00-copy new file mode 100644 index 0000000000000000000000000000000000000000..c1acfeb2d6448ba0b8a58ae39f8fcea59c598413 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/le-00-copy @@ -0,0 +1,19 @@ +#!/bin/bash + +if [ -f "%%le_ssl_cert" ]; then + cp -f "%%le_ssl_cert" "%%server_cert" + chown root: %%server_cert + chmod 644 %%server_cert +fi +if [ -f "%%le_ssl_key" ]; then + cp -f "%%le_ssl_key" "%%server_key" + chown root: %%server_key + chmod 600 %%server_key +fi +if [ -f "%%le_ssl_pem" ]; then + cp -f "%%le_ssl_pem" "%%server_pem" + chown root: %%server_pem + chmod 600 %%server_pem +fi + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/logrotate_global_options b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/logrotate_global_options new file mode 100644 index 0000000000000000000000000000000000000000..bdef54eaa15d3160c52f41f01e6c5fe08292c1cd --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/logrotate_global_options @@ -0,0 +1,4 @@ +compress +missingok +notifempty +dateext diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/nginx-minimal.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/nginx-minimal.conf new file mode 100644 index 0000000000000000000000000000000000000000..597aae323b0ddf2dd020d0443e4b5975692e8aa4 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/nginx-minimal.conf @@ -0,0 +1,33 @@ +worker_processes auto; + +events { +# Maximum connection number worker_connections 2048; use epoll; +# multi_accept on; + worker_connections 1024; +} + +http { + include /etc/nginx/mime.types; + + ssl_session_cache shared:SSL:10m; + ssl_session_timeout 10m; + + gzip on; + gzip_http_version 1.1; + gzip_comp_level 2; + gzip_types text/plain text/css + application/x-javascript text/xml + application/xml application/xml+rss + text/javascript; + + server { + listen 80; + server_name %%nom_domaine_machine; + root /tmp/www; + keepalive_timeout 70; + + location / { + autoindex on; + } + } +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/ntp.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/ntp.conf new file mode 100644 index 0000000000000000000000000000000000000000..5982366fa98d7ef897a63c1f5a7e92fc84e96847 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/ntp.conf @@ -0,0 +1,64 @@ +# /etc/ntp.conf, configuration for ntpd; see ntp.conf(5) for help + +driftfile /var/lib/ntp/ntp.drift +%if %%getVar('activer_ad_smb', 'non') == 'oui' +ntpsigndsocket /var/lib/samba/ntp_signd/ +%end if + +# Enable this if you want statistics to be logged. +#statsdir /var/log/ntpstats/ + +#statistics loopstats peerstats clockstats +#filegen loopstats file loopstats type day enable +#filegen peerstats file peerstats type day enable +#filegen clockstats file clockstats type day enable + +# Specify one or more NTP servers. +# You do need to talk to an NTP server or two (or three). +%for %%ntp_iter in %%serveur_ntp +server %%ntp_iter iburst +%end for +%if not %%getVar('adresse_ip_gw', None) +server 127.127.1.0 +fudge 127.127.1.0 stratum 10 +%end if + +%if %%getVar('activer_ad_smb', 'non') == 'oui' and (%%getVar('ad_server_role', 'controleur de domaine') == 'membre' or %%getVar('ad_additional_dc', 'non') == 'oui' ) +# AD member must be synchronized on domain controller only +%else +# Fallback pool +pool europe.pool.ntp.org +%end if + +# By default, exchange time with everybody, but don't allow configuration. +restrict -4 default kod notrap nomodify nopeer noquery limited %slurp +%if %%getVar('activer_ad_smb', 'non') == 'oui' +mssntp +%else + +%end if +%if %%activer_ipv6 == 'oui' +restrict -6 default kod notrap nomodify nopeer noquery limited %slurp +%if %%getVar('activer_ad_smb', 'non') == 'oui' +mssntp +%else + +%end if +%end if + +# Local users may interrogate the ntp server more closely. +restrict 127.0.0.1 +restrict ::1 + +# Clients from this (example!) subnet have unlimited access, but only if +# cryptographically authenticated. +#restrict 192.168.123.0 mask 255.255.255.0 notrust + +# If you want to provide time to your local subnet, change the next line. +# (Again, the address is an example only.) +#broadcast 192.168.123.255 + +# If you want to listen to time broadcasts on your local subnet, de-comment the +# next lines. Please do this only if you trust everybody on the network! +#disable auth +#broadcastclient diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/ntpd.apparmor.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/ntpd.apparmor.conf new file mode 100644 index 0000000000000000000000000000000000000000..cf13468c151a08c40ac7bb675dfe9f657da34ca0 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/ntpd.apparmor.conf @@ -0,0 +1,10 @@ +# Site-specific additions and overrides for usr.sbin.ntpd. +# For more details, please see /etc/apparmor.d/local/README. +%if %%getVar('activer_client_ldap', False) + /etc/ldap/ldap.conf r, +%end if +%if %%getVar('activer_ad_smb', 'non') == 'oui' + /var/lib/samba/ntp_signd/** rw, + /var/lib/samba/ntp_signd/ rw, + /run/samba/winbindd/pipe rw, +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/ntpdate b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/ntpdate new file mode 100644 index 0000000000000000000000000000000000000000..ff33eed5b5342c2457450dc29011e333082d3149 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/ntpdate @@ -0,0 +1,7 @@ +# servers to check. (Separate multiple servers with spaces.) +#NTPSERVERS="pool.ntp.org" +NTPSERVERS="%%custom_join(%%serveur_ntp)" +# +# additional options for ntpdate +#NTPOPTIONS="-v" +NTPOPTIONS="-u" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/ntpdate.if-up b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/ntpdate.if-up new file mode 100644 index 0000000000000000000000000000000000000000..58bc8a43283f17165d7de11367efa4e5c3b2394c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/ntpdate.if-up @@ -0,0 +1,38 @@ +#!/bin/sh + +set -e + +PATH=/sbin:/bin:/usr/sbin:/usr/bin + +# This is a heuristic: The idea is that if a static interface is brought +# up, that is a major event, and we can put in some extra effort to fix +# the system time. Feel free to change this, especially if you regularly +# bring up new network interfaces. +if [ "$METHOD" = static ]; then + OPTS="-b" +fi + +if [ "$METHOD" = loopback ]; then + exit 0 +fi + +# Check whether ntpdate was removed but not purged; it's useless to wait for +# it in that case. +if [ ! -x /usr/sbin/ntpdate-debian ] && [ -d /usr/sbin ]; then + exit 0 +fi + +#EOLE do not fork! +#( + +# This is for the case that /usr will be mounted later. +if [ -r /lib/udev/hotplug.functions ]; then + . /lib/udev/hotplug.functions + wait_for_file /usr/sbin/ntpdate-debian +fi + +# Avoid running more than one at a time +flock -n /run/lock/ntpdate /usr/sbin/ntpdate-debian -s $OPTS 2>/dev/null || : +# +#EOLE end do not fork +#) & diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/openssh-server b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/openssh-server new file mode 100644 index 0000000000000000000000000000000000000000..da89535882cbbbf32de545122ec3978c1cf3031b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/openssh-server @@ -0,0 +1,42 @@ +#! /bin/sh +# Reload the OpenSSH server when an interface comes up, to allow it to start +# listening on new addresses. + +set -e + +# Don't bother to restart sshd when lo is configured. +if [ "$IFACE" = lo ]; then + exit 0 +fi + +# Only run from ifup. +if [ "$MODE" != start ]; then + exit 0 +fi + +# OpenSSH only cares about inet and inet6. Get ye gone, strange people +# still using ipx. +if [ "$ADDRFAM" != inet ] && [ "$ADDRFAM" != inet6 ] && [ "$ADDRFAM" != meta ]; then + exit 0 +fi + +# Is /usr mounted? +if [ ! -e /usr/sbin/sshd ]; then + exit 0 +fi + +if [ ! -f /var/run/sshd.pid ] || \ + [ "$(ps -p "$(cat /var/run/sshd.pid)" -o comm=)" != sshd ]; then + exit 0 +fi + +# We'd like to use 'reload' here, but it has some problems; see #502444. On +# the other hand, repeated restarts of ssh make systemd unhappy +# (#756547/#757822), so use reload in that case. +if [ -d /run/systemd/system ]; then + systemctl reload --no-block ssh.service >/dev/null 2>&1 || true +else + invoke-rc.d ssh restart >/dev/null 2>&1 || true +fi + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/ouvre.firewall b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/ouvre.firewall new file mode 100644 index 0000000000000000000000000000000000000000..c906a8dfcabd90fa7f62c982369a96116b0349b2 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/ouvre.firewall @@ -0,0 +1,66 @@ +#!/bin/sh + +#------------------------------------------------------------------------------------------------------ +## ouvre.firewall pour EOLE +#------------------------------------------------------------------------------------------------------ + + +### politique par defaut + +## on vide les regles existantes +/sbin/iptables -t filter -F +/sbin/iptables -t mangle -F +/sbin/iptables -t nat -F + +## on vide les regles utilisateurs +/sbin/iptables -t filter -X +/sbin/iptables -t mangle -X +/sbin/iptables -t nat -X + +## activer l'anti-spoofing +echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter +## mise en place de la politique par defaut +/sbin/iptables -P INPUT ACCEPT +/sbin/iptables -P OUTPUT ACCEPT +/sbin/iptables -P FORWARD ACCEPT + +#tcpwrapper +echo "ALL: ALL" > /etc/hosts.allow + +# NAT tout ce qui n’est pas sur le même réseau +iptables -t nat -A POSTROUTING ! -s %%adresse_network_eth0/%%adresse_netmask_eth0 -o %%nom_zone_eth0 -j MASQUERADE +#------------------------------------------------------------------------------------------------------ + +%if %%mode_conteneur_actif == 'oui' + %set interfaces = dict() + %for %%interface in %%creole_client.get_interfaces() + %set %%interfaces.setdefault(%%interface['container_group'], {})[%%interface['linkto']] = %%interface['name'] + %end for + %for access in %%creole_client.get_service_accesss() + %if 'activate' in %%access and 'name' in %%access and %%access['node_name'] == 'port' + %set %%container_name = %%access['container_group'] + %set %%container_ip = %%getVar('container_ip_' + %%container_name) + %set %%port = %%access['name'] + %set %%source = '0/0' + %if %%access['protocol'] == 'tcp' + %set %%protocol = '-p tcp --syn' + %else + %set %%protocol = '-p udp -m udp' + %end if + %for num_int in %%range(0, %%int(%%nombre_interfaces)) + %set %%eth_name = 'eth' + %%str(num_int) + %set %%interface = %%getVar('nom_zone_' + %%eth_name) + %set %%interface_in_container = %%interfaces.get(%%container_name, {}).get(%%eth_name, None) + %if %%current_container.ip == '127.0.0.1' and %%current_container.ip != %%container_ip and %%interface_in_container == None +/sbin/iptables -A FORWARD -i %%interface -s %%source %%protocol --dport %%port -d %%container_ip -j ACCEPT +/sbin/iptables -t nat -A PREROUTING -i %%interface -s %%source %%protocol --dport %%port -j DNAT --to-destination %%container_ip:%%port + %end if + %end for + %end if + %end for +%end if + +# lancement de ouvre.firewall sur chaque conteneur +CreoleRun /usr/share/eole/ouvre.firewall all + +echo "Le serveur n'est plus protégé. Pour relancer le pare-feu, exécuter \"CreoleService bastion restart\"" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/persistent-net.cfg b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/persistent-net.cfg new file mode 100644 index 0000000000000000000000000000000000000000..ae3c4eac828157127b88a4b4f529e637d21d3cf6 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/persistent-net.cfg @@ -0,0 +1,5 @@ +%for %%i in xrange(0, %%int(%%nombre_interfaces)) + %for %%nom_carte in %%getVar('nom_carte_eth' + %%str(%%i)) +%%nom_carte + %end for +%end for diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/policy-rc.d b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/policy-rc.d new file mode 100644 index 0000000000000000000000000000000000000000..d900db17d3a3b3de50fbd89365866f38cba481ce --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/policy-rc.d @@ -0,0 +1,24 @@ +#!/bin/sh + +# Do not execute action for disabled service +skip_disabled() { + if [ -d /run/systemd ] && ! systemctl is-enabled "${1}" 2>&1 /dev/null + then + # OK, do not run + exit 101 + else + # OK, run + exit 104 + fi +} + +case "${1}-${2}" in + freeradius-*reload) + # https://bugs.launchpad.net/ubuntu/+source/freeradius/+bug/1712817 + skip_disabled "${1}" + ;; + *) + # OK, run + exit 104 + ;; +esac diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/pythonrc b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/pythonrc new file mode 100644 index 0000000000000000000000000000000000000000..d4ba602176b7de2bcd1153667838629f886f86f6 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/pythonrc @@ -0,0 +1,17 @@ +# this add completion to python interpreter +import readline +import rlcompleter +# see readline man page for this +readline.parse_and_bind("set show-all-if-ambiguous on") +readline.parse_and_bind("tab: complete") +import os +histfile = os.path.join(os.environ["HOME"], ".pyhist") +try: + readline.read_history_file(histfile) +except IOError: + pass +import atexit +atexit.register(readline.write_history_file, histfile) +del os, histfile +# you can place a file .pythonrc.py in your home to overrides this one +# but then, this file will not be sourced \ No newline at end of file diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/release b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/release new file mode 100644 index 0000000000000000000000000000000000000000..8f8a2b08178838d47d834ecbd6b8da2e81948e44 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/release @@ -0,0 +1,3 @@ +EOLE_MODULE=%%eole_module +EOLE_VERSION=%%eole_version +EOLE_RELEASE=%%eole_release diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/resolv.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/resolv.conf new file mode 100644 index 0000000000000000000000000000000000000000..7c1bebc535ac7f23e28d4935529e39a6947159a7 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/resolv.conf @@ -0,0 +1,42 @@ +#------------------------------------------------------------------------- +## resolv.conf pour EOLE +#------------------------------------------------------------------------- +# vi:syntax=conf + +%if not %%is_defined('_minimal_mode') + %if %%getVar('activer_ad_smb', 'non') == 'oui' +# Search in Samba AD realm DNS suffix +search %%ad_realm + %if %%getVar('ad_server_role') == 'controleur de domaine' +# Local Samba AD DNS +nameserver 127.0.0.1 + %if %%getVar('ad_additional_dc') == 'non' +µµµµµµµµµµ We are the sysvol Samba DC reference, we use all additional DC as fallback DNS + %for %%dns in [dns_ip for dns_ip in %%getVar('ad_additional_dc_ip', [])] +# Samba additionnal DC DNS +nameserver %%dns + %end for + %else +µµµµµµµµµµ We are an additional Samba DC, we use sysvol reference as secondary DNS +# Samba sysvol reference DNS +nameserver %%ad_dc_sysvol_ref + %for %%dns in [dns_ip for dns_ip in %%getVar('ad_additional_dc_ip', []) if dns_ip != %%ad_dc_sysvol_ref] +µµµµµµµµµµ We are an additional Samba DC, we use all othr additional DC as fallback DNS +# Samba additionnal DC DNS +nameserver %%dns + %end for + %end if + %end if + %else +search %%nom_domaine_local + %if %%is_defined('container_ip_dns') +# DNS in container +nameserver %%container_ip_dns + %end if + %end if +%end if +µµµµµµµµµµ We always add the General DNS variable as last fallbacks +%for %%dns in %%adresse_ip_dns +# General DNS server +nameserver %%dns +%end for diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/resolved.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/resolved.conf new file mode 100644 index 0000000000000000000000000000000000000000..222c555c47844fab3fc2594cd129dc2001b5b5d2 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/resolved.conf @@ -0,0 +1,26 @@ +# This file is part of systemd. +# +# systemd is free software; you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. +# +# Entries in this file show the compile time defaults. +# You can change settings by editing this file. +# Defaults can be restored by simply deleting this file. +# +# See resolved.conf(5) for details + +[Resolve] +#DNS= +#FallbackDNS= +#Domains=dompedago.etb1.lan +#LLMNR=no +#MulticastDNS=no +#DNSSEC=no +#Cache=yes +%if %%test_activer_resolvconf_template == 'oui' +DNSStubListener=no +%else +DNSStubListener=yes +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rng-tools b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rng-tools new file mode 100644 index 0000000000000000000000000000000000000000..22e58438770d95c8ccff0a4a08d964a7b08634fa --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rng-tools @@ -0,0 +1,15 @@ +# Configuration for the rng-tools initscript +# $Id: rng-tools.default,v 1.1.2.1.2.2 2005/05/11 09:44:51 hmh Exp $ + +# This is a POSIX shell fragment + +# Set to the input source for random data, leave undefined +# for the initscript to attempt auto-detection +HRNGDEVICE=/dev/urandom + +# Additional options to send to rngd. See the rngd(8) manpage for +# more information. Do not specify -r/--rng-device here, use +# HRNGDEVICE for that instead. +RNGDOPTIONS="-W 80% -t 20" +#RNGDOPTIONS="--trng=intelfwh" +#RNGDOPTIONS="--trng=via" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rsyslog-ca.tmpl b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rsyslog-ca.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..c489743bddeb1e4283f6c213c87a154e6840aff0 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rsyslog-ca.tmpl @@ -0,0 +1,111 @@ +# X.509 Certificate options +# +# DN options + +# The organization of the subject. +organization = "%%ssl_organization_name" + +# The organizational unit of the subject. +#unit = "" + +# The locality of the subject. +# locality = "" + +# The state of the certificate owner. +state = "France" + +# The country of the subject. Two letter code. +country = %%ssl_country_name + +# The common name of the certificate owner. +cn = "%%nom_machine" + +# A user id of the certificate owner. +#uid = "clauper" + +# If the supported DN OIDs are not adequate you can set +# any OID here. +# For example set the X.520 Title and the X.520 Pseudonym +# by using OID and string pairs. +#dn_oid = "2.5.4.12" "Dr." "2.5.4.65" "jackal" + +# This is deprecated and should not be used in new +# certificates. +# pkcs9_email = "none@none.org" + +# The serial number of the certificate +serial = 007 + +# In how many days, counting from today, this certificate will expire. +expiration_days = %%ssl_default_cert_time + + +# X.509 v3 extensions + +# A dnsname in case of a WWW server. + +%set %%set_ssl_subjectaltname = %%set(%%ssl_subjectaltname) +%for %%altname in %%set_ssl_subjectaltname +dns_name = %%altname +%end for + +# An email in case of a person +#email = "none@none.org" + +# An URL that has CRLs (certificate revocation lists) +# available. Needed in CA certificates. +#crl_dist_points = "http://www.getcrl.crl/getcrl/" + +# Whether this is a CA certificate or not +ca + +# Whether this certificate will be used for a TLS client +#tls_www_client + +# Whether this certificate will be used for a TLS server +#tls_www_server + +# Whether this certificate will be used to sign data (needed +# in TLS DHE ciphersuites). +#signing_key + +# Whether this key will be used to sign other certificates. +cert_signing_key + +# Whether this key will be used to sign CRLs. +crl_signing_key + +# Whether this key will be used to sign code. +#code_signing_key + +# Whether this key will be used to sign OCSP data. +#ocsp_signing_key + +# Whether this key will be used for time stamping. +#time_stamping_key + +#a space separated list of key purpose OIDs to be added +#key_purpose_oids = "1.3.6.1.5.5.7.3.1" "1.2.3.4.5.6" + +# Things for PKCS #10 certificate Requests + +# A challenge password for the request. +#challenge_password = "My challenge password" + +# When generating certificate use extensions found in certificate request. +#honor_crq_extensions + +# Other things. + +# A password to be used while encrypting/decrypting. +#password = "my pass" + +# The next update (in days from now) for a CRL +#crl_next_update = 30 + +# The CRL number extension +#crl_number = 1 + +# A name for a PKCS #12 key +#pkcs12_key_name = "Anonymous key" + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rsyslog-request.tmpl b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rsyslog-request.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..0eb1fbcc8babe928d5deeba93ba1acc123f44a1d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rsyslog-request.tmpl @@ -0,0 +1,111 @@ +# X.509 Certificate options +# +# DN options + +# The organization of the subject. +organization = "%%ssl_organization_name" + +# The organizational unit of the subject. +#unit = "" + +# The locality of the subject. +# locality = "" + +# The state of the certificate owner. +state = "France" + +# The country of the subject. Two letter code. +country = %%ssl_country_name + +# The common name of the certificate owner. +cn = "%%nom_machine" + +# A user id of the certificate owner. +#uid = "clauper" + +# If the supported DN OIDs are not adequate you can set +# any OID here. +# For example set the X.520 Title and the X.520 Pseudonym +# by using OID and string pairs. +#dn_oid = "2.5.4.12" "Dr." "2.5.4.65" "jackal" + +# This is deprecated and should not be used in new +# certificates. +# pkcs9_email = "none@none.org" + +# The serial number of the certificate +serial = 007 + +# In how many days, counting from today, this certificate will expire. +expiration_days = %%ssl_default_cert_time + + +# X.509 v3 extensions + +# A dnsname in case of a WWW server. + +%set %%set_ssl_subjectaltname = %%set(%%ssl_subjectaltname) +%for %%altname in %%set_ssl_subjectaltname +dns_name = %%altname +%end for + +# An email in case of a person +#email = "none@none.org" + +# An URL that has CRLs (certificate revocation lists) +# available. Needed in CA certificates. +#crl_dist_points = "http://www.getcrl.crl/getcrl/" + +# Whether this is a CA certificate or not +#ca + +# Whether this certificate will be used for a TLS client +tls_www_client + +# Whether this certificate will be used for a TLS server +tls_www_server + +# Whether this certificate will be used to sign data (needed +# in TLS DHE ciphersuites). +#signing_key + +# Whether this key will be used to sign other certificates. +#cert_signing_key + +# Whether this key will be used to sign CRLs. +#crl_signing_key + +# Whether this key will be used to sign code. +#code_signing_key + +# Whether this key will be used to sign OCSP data. +#ocsp_signing_key + +# Whether this key will be used for time stamping. +#time_stamping_key + +#a space separated list of key purpose OIDs to be added +#key_purpose_oids = "1.3.6.1.5.5.7.3.1" "1.2.3.4.5.6" + +# Things for PKCS #10 certificate Requests + +# A challenge password for the request. +#challenge_password = "My challenge password" + +# When generating certificate use extensions found in certificate request. +#honor_crq_extensions + +# Other things. + +# A password to be used while encrypting/decrypting. +#password = "my pass" + +# The next update (in days from now) for a CRL +#crl_next_update = 30 + +# The CRL number extension +#crl_number = 1 + +# A name for a PKCS #12 key +#pkcs12_key_name = "Anonymous key" + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rsyslog.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rsyslog.conf new file mode 100644 index 0000000000000000000000000000000000000000..9297929265a5ddbbbe7bfeca2786a31ef47aef7d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rsyslog.conf @@ -0,0 +1,120 @@ +# /etc/rsyslog.conf Configuration file for rsyslog. +# +# For more information see +# /usr/share/doc/rsyslog-doc/html/rsyslog_conf.html +# +# Default logging rules can be found in /etc/rsyslog.d/50-default.conf + + +################# +#### MODULES #### +################# + +$ModLoad imuxsock # provides support for local system logging +$ModLoad immark # provides --MARK-- message capability + +# commented in container (eole-conteneur/lxc_install.sh l.216-7) +$ModLoad imklog # provides kernel logging support (previously done by rklogd) +$KLogPath /proc/kmsg + +$PreserveFQDN on +%if %%getVar("rsyslog_envoi_tls", "non") == 'oui' or %%getVar("rsyslog_reception_tls", "non") == "oui" +# utilisation du chiffrement + +# configuration general pour le chiffrement +$DefaultNetstreamDriver gtls +$DefaultNetstreamDriverCAFile %%rsyslog_ca_file +$DefaultNetstreamDriverCertFile /etc/ssl/certs/eole.crt +$DefaultNetstreamDriverKeyFile /etc/ssl/private/eole.key + +%end if + +%if %%mode_conteneur_actif == 'oui' or %%getVar("activer_reception_logs_relp", "non") == 'oui' +# utilisation du protocole RELP + +$ModLoad imrelp +$InputRELPServerRun 20514 + +%end if + +%if %%getVar("activer_reception_logs_tcp", "non") == 'oui' +# utilisation du protocole TCP + +$ModLoad imtcp + +%if %%getVar("rsyslog_reception_tls", "non") == "oui" +# configuration TLS propre a la reception + +$InputTCPServerStreamDriverMode 1 +$InputTCPServerStreamDriverAuthMode anon +%for %%client_ip in %%adresses_ip_clients_logs_tcp +$InputTCPServerStreamDriverPermittedPeer %%client_ip/%%calc_classe(%%client_ip.netmask_client_logs_tcp) +%end for + +%end if + +$AllowedSender TCP%slurp +%for %%tcp_client in %%adresses_ip_clients_logs_tcp +, %%tcp_client/%%calc_classe(%%tcp_client.netmask_client_logs_tcp)%slurp +%end for + +$InputTCPServerRun 10514 +%end if + +%if %%getVar("activer_reception_logs_udp", "non") == 'oui' +# utilisation du protocole UDP + +$ModLoad imudp +$AllowedSender UDP%slurp +%for %%udp_client in %%adresses_ip_clients_logs_udp +, %%udp_client/%%calc_classe(%%udp_client.netmask_client_logs_udp)%slurp +%end for + +$UDPServerRun 514 + +%end if + +########################### +#### GLOBAL DIRECTIVES #### +########################### + +# +# Use traditional timestamp format. +# To enable high precision timestamps, comment out the following line. +# +# $ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat + +# Filter duplicated messages +$RepeatedMsgReduction on + +# +# Set the default permissions for all log files. +# +$DirOwner syslog +$DirGroup adm +$FileOwner syslog +$FileGroup adm +$FileCreateMode 0640 +$DirCreateMode 0755 +$Umask 0022 +$PrivDropToUser syslog +$PrivDropToGroup adm + +%if %%getVar("activer_envoi_logs", "non") == "oui" and %%getVar("rsyslog_envoi_tls", "non") == 'non' +# +# Use omrelp module to send logs. +# + +$ModLoad omrelp +%end if + +# +# Include config files in /etc/rsyslog.d/ +# +$IncludeConfig /etc/rsyslog.d/aggregation/*.conf +$IncludeConfig /etc/rsyslog.d/templates/*.conf +$IncludeConfig /etc/rsyslog.d/eole-views/*.conf +$IncludeConfig /etc/rsyslog.d/custom-views/*.conf +$IncludeConfig /etc/rsyslog.d/custom-traps/*.conf +$IncludeConfig /etc/rsyslog.d/eole-traps/*.conf +$IncludeConfig /etc/rsyslog.d/default_dispatching.conf diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rsyslog.conf.container b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rsyslog.conf.container new file mode 100644 index 0000000000000000000000000000000000000000..4ba67ad32480ef62b784ea70f2306044e122f727 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rsyslog.conf.container @@ -0,0 +1,67 @@ +# /etc/rsyslog.conf Configuration file for rsyslog. +# +# For more information see +# /usr/share/doc/rsyslog-doc/html/rsyslog_conf.html +# +# Default logging rules can be found in /etc/rsyslog.d/50-default.conf + + +################# +#### MODULES #### +################# + +$ModLoad imuxsock # provides support for local system logging +$ModLoad immark # provides --MARK-- message capability + +########################### +#### GLOBAL DIRECTIVES #### +########################### + +# +# Use traditional timestamp format. +# To enable high precision timestamps, comment out the following line. +# +# $ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat + +# Filter duplicated messages +$RepeatedMsgReduction on + +# +# Set the default permissions for all log files. +# +$DirOwner syslog +$DirGroup adm +$FileOwner syslog +$FileGroup adm +$FileCreateMode 0640 +$DirCreateMode 0755 +$Umask 0022 +$PrivDropToUser syslog +$PrivDropToGroup adm + +$ModLoad omrelp +µµµµµµµµµµ des regles sont specifiques au conteneur 'proxy' +µµµµµµµµµµ recupere le nom du groupe de conteneur pour le comparer au groupe courant +%try +%set %%proxy_container = %%creole_client.get_container('proxy')['group'] +%except +%set %%proxy_container = '' +%end try + +%if %%current_container['name'] == %%proxy_container +$ActionQueueType LinkedList +$ActionQueueFileName relpact +$ActionQueueSaveOnShutdown on +:programname, contains, "squid" :omrelp:%%adresse_ip_br0:20514 +& stop +%end if + +# +# Include config files in /etc/rsyslog.d/ +# +#$IncludeConfig /etc/rsyslog.d/default_dispatching.conf + +#Default policy +*.* :omrelp:%%adresse_ip_br0:20514 +& stop + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rsyslog.logrotate b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rsyslog.logrotate new file mode 100644 index 0000000000000000000000000000000000000000..29a5671fd678ad237085c74e522d6455c63bf0f3 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rsyslog.logrotate @@ -0,0 +1,141 @@ +missingok +notifempty +compress + +/var/log/rsyslog/local/auth/*.log { + rotate 52 + weekly +} + +/var/log/rsyslog/local/iptables/*.log { + rotate 52 + weekly +} + +/var/log/rsyslog/local/bastion/*.log { + rotate 52 + weekly +} + +/var/log/rsyslog/local/sshd/*.log { + rotate 52 + weekly +} + +/var/log/rsyslog/local/sSMTP/*.log { + rotate 52 + weekly +} + +/var/log/rsyslog/local/su/*.log { + rotate 52 + weekly +} + +/var/log/rsyslog/local/sudo/*.log { + rotate 52 + weekly +} + +/var/log/rsyslog/local/cron/*.log { + rotate 15 + weekly +} + +/var/log/rsyslog/local/dhclient/*.log { + rotate 15 + weekly +} + +/var/log/daemon.log { + rotate 15 + weekly +} + +/var/log/debug { + rotate 4 + weekly +} + +/var/log/rsyslog/local/kernel/*.log { + rotate 4 + weekly +} + +/var/log/rsyslog/local/rsyslog/*.log { + rotate 4 + weekly +} + +/var/log/rsyslog/local/init/*.log { + rotate 4 + weekly +} + +/var/log/rsyslog/local/ipsec_starter/*.log { + rotate 4 + weekly +} + +/var/log/rsyslog/local/modprobe/*.log { + rotate 4 + weekly +} + +/var/log/rsyslog/local/python/*.log { + rotate 4 + weekly +} + +/var/log/rsyslog/local/pluto/*.log { + rotate 4 + weekly +} + +/var/log/rsyslog/local/rngd/*.log { + rotate 4 + weekly +} + +/var/log/rsyslog/local/twisted/*.log { + rotate 4 + weekly +} + +/var/log/rsyslog/local/login/*.log { + rotate 52 + weekly +} +/var/log/rsyslog/local/ntpd/*.log { + rotate 4 + weekly +} + +/var/log/lpr.log { + rotate 4 + weekly +} + +/var/log/messages { + rotate 15 + weekly +} + +/var/log/user.log { + rotate 15 + weekly +} + +/var/log/uucp.log { + rotate 4 + weekly +} + +/var/log/syslog { + rotate 52 + weekly + nomissingok + postrotate + service rsyslog rotate >/dev/null + endscript +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rsyslog_aggregation.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rsyslog_aggregation.conf new file mode 100644 index 0000000000000000000000000000000000000000..49b270bb69e045cb0dac588949786723deb35c74 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rsyslog_aggregation.conf @@ -0,0 +1,24 @@ +%if %%activer_log_distant == 'oui' and %%activer_envoi_logs == 'oui' and %%envoyer_tous_logs == 'oui' + +$WorkDirectory /var/log/rsyslog/queues +$ActionQueueType LinkedList + %if %%utiliser_rsyslog_plage_envoi_globale == 'oui' and %%rsyslog_plage_globale_heure_debut != '' and %%rsyslog_plage_globale_heure_fin != '' +$ActionQueueSize 10000 +$ActionQueueDequeueTimeBegin %%rsyslog_plage_globale_heure_debut +$ActionQueueDequeueTimeEnd %%rsyslog_plage_globale_heure_fin + %end if +$ActionQueueFileName send_all +$ActionQueueSaveOnShutdown on + + %if %%rsyslog_envoi_tls == 'oui' +$ActionSendStreamDriverAuthMode x509/name +$IncludeConfig /etc/rsyslog.d/outgoing_peers/*.peers +$ActionSendStreamDriverMode 1 +*.* @@%%adresse_ip_serveur_logs:10514 + %else +*.* :omrelp:%%adresse_ip_serveur_logs:20514 + %end if + +%else +# Cette machine n'est pas configurée pour transmettre ses logs en globalité à une machine distante. +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rsyslog_default_dispatching.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rsyslog_default_dispatching.conf new file mode 100644 index 0000000000000000000000000000000000000000..d63dd66c603e24f739b6511905a190c5921c9bb1 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rsyslog_default_dispatching.conf @@ -0,0 +1,20 @@ +:fromhost-ip, startswith, "127" ?DynLocalDispatch +& stop + +%if %%mode_conteneur_actif == 'oui' +:fromhost-ip, startswith, "%%adresse_ip_br0[:-2]" ?DynLocalDispatch +& stop + +# Use fromhost in addition to fromhost-ip since there are issues +# http://dev-eole.ac-dijon.fr/issues/1204#note-4 +:fromhost, startswith, "%%adresse_ip_br0[:-2]" ?DynLocalDispatch +& stop +%end if + +:fromhost, isequal, "" ?DynLocalDispatch +& stop + +%if %%activer_log_distant == 'oui' and %%activer_reception_logs == 'oui' +*.* ?DynRemoteDispatch +& stop +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rsyslog_templates.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rsyslog_templates.conf new file mode 100644 index 0000000000000000000000000000000000000000..f6a57d346b0d0455ef37428adfa7992725c79988 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rsyslog_templates.conf @@ -0,0 +1,3 @@ +$template DynLocalDispatch, "/var/log/rsyslog/local/%programname%/%programname%.%syslogseverity-text%.log" + +$template DynRemoteDispatch, "/var/log/rsyslog/remote/%hostname%/%programname%/%programname%.%syslogseverity-text%.log" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rsyslog_traps_cron.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rsyslog_traps_cron.conf new file mode 100644 index 0000000000000000000000000000000000000000..e22df50997899e7da775a6eb703c076fb2e4d673 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rsyslog_traps_cron.conf @@ -0,0 +1,23 @@ +# Templates for local and remote logging +$template DynLocalCron, "/var/log/rsyslog/local/cron/cron.%syslogseverity-text%.log" +$template DynRemoteCron, "/var/log/rsyslog/remote/%hostname:::secpath-replace%/cron/cron.%syslogseverity-text%.log" + +%if %%getVar('activer_reception_logs', 'non') == 'non' +# all messages go in local branch +if ($programname == 'cron' or $programname == 'CRON') then ?DynLocalCron +& stop +%else +# all messages from localhost go in local branch +if ($programname == 'cron' or $programname == 'CRON') and $fromhost-ip startswith '127' then ?DynLocalCron +& stop +%if %%mode_conteneur_actif == 'oui' +# all messages from containers go in local branch +if ($programname == 'cron' or $programname == 'CRON') and $fromhost-ip startswith '%%adresse_ip_br0[:-2]' then ?DynLocalCron +& stop +if ($programname == 'cron' or $programname == 'CRON') and $fromhost startswith '%%adresse_ip_br0[:-2]' then ?DynLocalCron +& stop +%end if +# all remaining messages go in remote branch +if ($programname == 'cron' or $programname == 'CRON') then ?DynRemoteCron +& stop +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rsyslog_traps_eole.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rsyslog_traps_eole.conf new file mode 100644 index 0000000000000000000000000000000000000000..06154aac69241817278568c6b626bf72b1dd612d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rsyslog_traps_eole.conf @@ -0,0 +1,22 @@ +%if %%getVar('activer_reception_logs', 'non') == 'non' +# all messages go in local branch +if $programname == "eole-schedule" then { + action(type="omfile" file="/var/log/rsyslog/local/eole-schedule/eole-schedule.log") + stop +} +%else +# all messages from localhost go in local branch +if $programname == 'eole-schedule' and $fromhost-ip == '127' then { + action(type="omfile" file="/var/log/rsyslog/local/eole-schedule/eole-schedule.log") + stop +} + +template(name="remote_eole_schedule" type="string" + string="/var/log/rsyslog/remote/%fromhost%/eole-schedule/eole-schedule.log" +) + +if $programname == 'eole-schedule' then { + action(type="omfile" file="remote_eole_schedule") + stop +} +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rsyslog_traps_gpm.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rsyslog_traps_gpm.conf new file mode 100644 index 0000000000000000000000000000000000000000..4e03c631c6c25a5ff8088a7a2fdea8702ac5cf61 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rsyslog_traps_gpm.conf @@ -0,0 +1,24 @@ +# Templates for local and remote logging +$template DynLocalGpm, "/var/log/rsyslog/local/gpm/gpm.%syslogseverity-text%.log" +$template DynRemoteGpm, "/var/log/rsyslog/remote/%fromhost%/gpm/gpm.%syslogseverity-text%.log" + +%if %%getVar('activer_reception_logs', 'non') == 'non' +# all messages go in local branch +:syslogtag, startswith, "/usr/sbin/gpm" ?DynLocalGpm +& stop +%else +# all messages from localhost go in local branch +if $syslogtag startswith '/usr/sbin/gpm' and $fromhost-ip startswith '127' then ?DynLocalGpm +& stop +%if %%mode_conteneur_actif == 'oui' +# all messages from containers go in local branch +if $syslogtag startswith '/usr/sbin/gpm' and $fromhost-ip startswith '%%adresse_ip_br0[:-2]' then ?DynLocalGpm +& stop +if $syslogtag startswith '/usr/sbin/gpm' and $fromhost startswith '%%adresse_ip_br0[:-2]' then ?DynLocalGpm +& stop +%end if +# all remaining messages go in remote branch +:syslogtag, startswith, "/usr/sbin/gpm" ?DynRemoteGpm +& stop +%end if + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rsyslog_traps_iptables.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rsyslog_traps_iptables.conf new file mode 100644 index 0000000000000000000000000000000000000000..398ad228a2df021fa2fca37770cea5146c200036 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rsyslog_traps_iptables.conf @@ -0,0 +1,23 @@ +# Templates for local and remote logging +$template DynLocalIptables, "/var/log/rsyslog/local/iptables/iptables.%syslogseverity-text%.log" +$template DynRemoteIptables, "/var/log/rsyslog/remote/%hostname:::secpath-replace%/iptables/iptables.%syslogseverity-text%.log" + +%if %%getVar('activer_reception_logs', 'non') == 'non' +# all messages go in local branch +:msg, contains, "iptables" ?DynLocalIptables +& stop +%else +# all messages from localhost go in local branch +if $msg contains 'iptables' and $fromhost-ip startswith '127' then ?DynLocalIptables +& stop +%if %%mode_conteneur_actif == 'oui' +# all messages from containers go in local branch +if $msg contains 'iptables' and $fromhost-ip startswith '%%adresse_ip_br0[:-2]' then ?DynLocalIptables +& stop +if $msg contains 'iptables' and $fromhost startswith '%%adresse_ip_br0[:-2]' then ?DynLocalIptables +& stop +%end if +# all remaining messages go in remote branch +:msg, contains, "iptables" ?DynRemoteIptables +& stop +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rsyslog_traps_rsyslog.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rsyslog_traps_rsyslog.conf new file mode 100644 index 0000000000000000000000000000000000000000..4200333a28ce333fe034ee6d47fdc991701494fd --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rsyslog_traps_rsyslog.conf @@ -0,0 +1,23 @@ +# Templates for local and remote logging +$template DynLocalRsyslog, "/var/log/rsyslog/local/rsyslog/rsyslog.%syslogseverity-text%.log" +$template DynRemoteRsyslog, "/var/log/rsyslog/remote/%hostname:::secpath-replace%/rsyslog/rsyslog.%syslogseverity-text%.log" + +%if %%getVar('activer_reception_logs', 'non') == 'non' +# all messages go in local branch +:programname, startswith, "rsyslog" ?DynLocalRsyslog +& stop +%else +# all messages from localhost go in local branch +if $programname startswith 'rsyslog' and $fromhost-ip startswith '127' then ?DynLocalRsyslog +& stop +%if %%mode_conteneur_actif == 'oui' +# all messages from containers go in local branch +if $programname startswith 'rsyslog' and $fromhost-ip startswith '%%adresse_ip_br0[:-2]' then ?DynLocalRsyslog +& stop +if $programname startswith 'rsyslog' and $fromhost startswith '%%adresse_ip_br0[:-2]' then ?DynLocalRsyslog +& stop +%end if +# all remaining messages go in remote branch +:programname, startswith, "rsyslog" ?DynRemoteRsyslog +& stop +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rsyslog_traps_xmlrpc.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rsyslog_traps_xmlrpc.conf new file mode 100644 index 0000000000000000000000000000000000000000..963f47156939f971aab76b4d4154dcb509d77f62 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rsyslog_traps_xmlrpc.conf @@ -0,0 +1,6 @@ +# filtering rules for HTTP POST xml-rpc requests matches HTTP/1.0 and HTTP/1.1 +if $msg contains 'POST /RPC2 HTTP/1' then stop +if $msg contains 'POST / HTTP/1' then stop + + + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rsyslog_traps_zephir.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rsyslog_traps_zephir.conf new file mode 100644 index 0000000000000000000000000000000000000000..2a0e5b18043f2a779a82337de45002f11af01354 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rsyslog_traps_zephir.conf @@ -0,0 +1,22 @@ +# Templates for local and remote logging +$template DynLocalZephir, "/var/log/rsyslog/local/zephir/zephir.log" +$template DynRemoteZephir, "/var/log/rsyslog/remote/%hostname:::secpath-replace%/zephir/zephir.log" +%if %%getVar('activer_reception_logs', 'non') == 'non' +# all messages go in local branch +:programname, isequal, "zephir" ?DynLocalZephir +& stop +%else +# all messages from localhost go in local branch +if $programname == 'zephir' and $fromhost-ip == '127' then ?DynLocalZephir +& stop + %if %%mode_conteneur_actif == 'oui' +# all messages from containers go in local branch +if $programname == 'zephir' and $fromhost-ip == '%%adresse_ip_br0[:-2]' then ?DynLocalZephir +& stop +if $programname == 'zephir' and $fromhost == '%%adresse_ip_br0[:-2]' then ?DynLocalZephir +& stop + %end if +# all remaining messages go in remote branch +:programname, isequal, "zephir" ?DynRemoteZephir +& stop +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rsyslog_views_auth.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rsyslog_views_auth.conf new file mode 100644 index 0000000000000000000000000000000000000000..0c4b570bc426e73eec98d00aa6a85a6084090dbb --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rsyslog_views_auth.conf @@ -0,0 +1,18 @@ +$template DynLocalAuth, "/var/log/rsyslog/local/auth/auth.%syslogseverity-text%.log" +$template DynRemoteAuth, "/var/log/rsyslog/remote/%hostname:::secpath-replace%/auth/auth.%syslogseverity-text%.log" + +%if %%getVar('activer_reception_logs', 'non') == 'non' +auth,authpriv.* ?DynLocalAuth +%else +if $syslogfacility-text startswith 'auth' and $fromhost-ip startswith '127' then ?DynLocalAuth + + %if %%mode_conteneur_actif == 'oui' +if $syslogfacility-text startswith 'auth' and ($fromhost-ip startswith '%%creole_client.get('containers.network.adresse_ip_br0')[:-2]' or $fromhost startswith '%%creole_client.get('containers.network.adresse_ip_br0')[:-2]') then ?DynLocalAuth + +if $syslogfacility-text startswith 'auth' and not ($fromhost-ip startswith '%%creole_client.get('containers.network.adresse_ip_br0')[:-2]' or $fromhost startswith '%%creole_client.get('containers.network.adresse_ip_br0')[:-2]' or $fromhost-ip startswith '127') then ?DynRemoteAuth + + %else +if $syslogfacility-text startswith 'auth' and not ($fromhost-ip startswith '%%creole_client.get('containers.network.adresse_ip_br0')[:-2]' or $fromhost startswith '%%creole_client.get('containers.network.adresse_ip_br0')[:-2]' or $fromhost-ip startswith '127') then ?DynRemoteAuth + %end if +%end if + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rsyslog_views_errors.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rsyslog_views_errors.conf new file mode 100644 index 0000000000000000000000000000000000000000..64c735a7ad9459de0f722e658d9da958d4444c7b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/rsyslog_views_errors.conf @@ -0,0 +1 @@ +*.err /var/log/syslog diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/server.cfg b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/server.cfg new file mode 100644 index 0000000000000000000000000000000000000000..0fe9bbd22cd376d656c83b6719f51382be2ffa43 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/server.cfg @@ -0,0 +1,12 @@ +[global] +hostname = %%nom_domaine_machine +ip = %%adresse_ip_eth0 + +[update] +notification = %%update_mail_notification +reboot = %%reboot_after_scheduled_majauto + +[smtp] +mailhost = 127.0.0.1 +system_mail_from = root@%%nom_domaine_machine +system_mail_to = %%system_mail_to diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/sources.list b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/sources.list new file mode 100644 index 0000000000000000000000000000000000000000..99f2bfb5a213287f5c1da68ff3d40f37f72d1806 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/sources.list @@ -0,0 +1,38 @@ +%set %%_eole_release = %%getVar('_eole_release', %%eole_release) + +%if %%_mirror_ubuntu is not None +# Ubuntu +deb [ arch=amd64 ] %%_mirror_ubuntu %%{ubuntu_version} main universe multiverse restricted +deb [ arch=amd64 ] %%_mirror_ubuntu %%{ubuntu_version}-security main universe multiverse restricted +deb [ arch=amd64 ] %%_mirror_ubuntu %%{ubuntu_version}-updates main universe multiverse restricted +%end if + +%if %%_mirror_eole is not None +# EOLE + %if %%_eole_level in ['stable', 'proposed'] +deb [ arch=amd64 ] %%_mirror_eole eole-%%{_eole_release} main cloud +deb [ arch=amd64 ] %%_mirror_eole eole-%%{_eole_release}-security main cloud +deb [ arch=amd64 ] %%_mirror_eole eole-%%{_eole_release}-updates main cloud + %if %%_eole_level == 'proposed' +deb [ arch=amd64 ] %%_mirror_eole eole-%%{_eole_release}-proposed-updates main cloud + %end if + %else +deb [ arch=amd64 ] %%_mirror_eole eole-%%{eole_version}-unstable main cloud + %end if +%end if + +%if %%getVar('_mirror_envole', None) is not None and %%getVar('envole_version', None) is not None +# Envole + %if %%_envole_level in ['stable', 'proposed'] +deb [ arch=amd64 ] %%_mirror_envole envole-%%{envole_version} main + %if %%_envole_level == 'proposed' +deb [ arch=amd64 ] %%_mirror_envole envole-%%{envole_version}-testing main + %end if + %else +deb [ arch=amd64 ] %%_mirror_envole envole-%%{envole_version}-unstable main + %end if +%end if + +%if %%_mirror_cdrom is not None +deb [ arch=amd64 ] %%_mirror_cdrom %%{ubuntu_version} main universe +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/ssh_config b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/ssh_config new file mode 100644 index 0000000000000000000000000000000000000000..db268aea83bc703fbeea980a3a795f93bd80036e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/ssh_config @@ -0,0 +1,53 @@ +# $OpenBSD: ssh_config,v 1.21 2005/12/06 22:38:27 reyk Exp $ + +# This is the ssh client system-wide configuration file. See +# ssh_config(5) for more information. This file provides defaults for +# users, and the values can be changed in per-user configuration files +# or on the command line. + +# Configuration data is parsed as follows: +# 1. command line options +# 2. user-specific file +# 3. system-wide file +# Any configuration value is only changed the first time it is set. +# Thus, host-specific definitions should be at the beginning of the +# configuration file, and defaults at the end. + +# Site-wide defaults for some commonly used options. For a comprehensive +# list of available options, their meanings and defaults, please see the +# ssh_config(5) man page. + +Host * +# ForwardAgent no +# ForwardX11 no +# ForwardX11Trusted yes +# RhostsRSAAuthentication no +# RSAAuthentication yes +# PasswordAuthentication yes +# HostbasedAuthentication no +# BatchMode no +# CheckHostIP yes +# AddressFamily any +# ConnectTimeout 0 +StrictHostKeyChecking no +# IdentityFile ~/.ssh/identity +# IdentityFile ~/.ssh/id_rsa +# IdentityFile ~/.ssh/id_dsa +# Port 22 +# Protocol 2,1 +# Cipher 3des +# Ciphers aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,arcfour,aes192-cbc,aes256-cbc +# EscapeChar ~ +# Tunnel no +# TunnelDevice any:any +# PermitLocalCommand no + SendEnv LANG LC_* + HashKnownHosts yes + +%for %%c_dict in %%creole_client.get_containers(): + %if %%c_dict.ip is None or %%c_dict.name == 'root' + %continue + %end if +Host %%c_dict.name + Hostname=%%c_dict.ip +%end for diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/sshd_config b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/sshd_config new file mode 100644 index 0000000000000000000000000000000000000000..ce2d8444ce06251dd2b2fe53640bd34187e6dc25 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/sshd_config @@ -0,0 +1,146 @@ +############################################################## +# sshd_config : fichier de configuration du service ssh +# Pour EOLE +#samuel morin <samuel.morin@ac-dijon.fr> +############################################################## +#OpenBSD: sshd_config + +# This is the sshd server system-wide configuration file. See +# sshd_config(5) for more information. + +# This sshd was compiled with PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin + +# The strategy used for options in the default sshd_config shipped with +# OpenSSH is to specify options with their default value where +# possible, but leave them commented. Uncommented options change a +# default value. + +Port 22 +Protocol 2 +#Evite les erreurs "WARNING: Not loading blacklisted module ipv6" +AddressFamily inet + +Ciphers chacha20-poly1305@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr +MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha1-96-etm@openssh.com,hmac-sha1-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,hmac-sha1-96,hmac-sha1 + +#ListenAddress + +#ListenAddress :: + +# HostKey for protocol version 1 +#HostKey /etc/ssh/ssh_host_key +# HostKeys for protocol version 2 +HostKey /etc/ssh/ssh_host_ecdsa_key +HostKey /etc/ssh/ssh_host_rsa_key +HostKey /etc/ssh/ssh_host_ed25519_key + +# Logging +#obsoletes QuietMode and FascistLogging +SyslogFacility AUTH +LogLevel INFO + +# Authentication: + +LoginGraceTime 30 + +StrictModes yes + +PubkeyAuthentication yes +AuthorizedKeysFile %h/.ssh/authorized_keys + +# rhosts authentication should not be used +#RhostsAuthentication no +# Don't read the user's ~/.rhosts and ~/.shosts files +IgnoreRhosts yes +# similar for protocol version 2 +HostbasedAuthentication no +# Change to yes if you don't trust ~/.ssh/known_hosts for +# RhostsRSAAuthentication and HostbasedAuthentication +IgnoreUserKnownHosts yes +%if not %%is_defined('login_graphique') +AllowGroups %slurp + %if %%is_defined('activer_web_zephir') +uucp %slurp + %end if +root %slurp +adm %slurp + %for %%allow_group in %%ssh_allow_groups +%%allow_group %slurp + %end for +%end if +%if %%getVar('activer_onenode','non') == 'oui' + %if %%is_defined('virt_group') +%%virt_group %slurp + %end if +%end if + +%if %%ssh_permit_root == "oui" +PermitRootLogin yes +%else +PermitRootLogin no +%end if + +# To disable tunneled clear text passwords, change to no here! +%if %%ssh_allow_passwd == "oui" +PasswordAuthentication yes +%else +PasswordAuthentication no +%end if + +PermitEmptyPasswords no +# Change to no to disable s/key passwords +ChallengeResponseAuthentication no +PermitUserEnvironment no +AllowTcpForwarding no +ClientAliveInterval 30 +ClientAliveCountMax 10 + +# Kerberos options +#KerberosAuthentication no +#KerberosOrLocalPasswd yes +#KerberosTicketCleanup yes + +#AFSTokenPassing no + +# Kerberos TGT Passing only works with the AFS kaserver +#KerberosTgtPassing no + +# Set this to 'yes' to enable PAM keyboard-interactive authentication +# Warning: enabling this may bypass the setting of 'PasswordAuthentication' +#PAMAuthenticationViaKbdInt yes + +X11Forwarding yes +X11DisplayOffset 10 +#X11UseLocalhost yes +PrintMotd no +PrintLastLog yes +TCPKeepAlive no +#UseLogin no +UsePrivilegeSeparation yes +Compression delayed + +MaxStartups %%ssh_maxstartups +# no default banner path +Banner none +#VerifyReverseMapping no + +#Suppress DNS verification +UseDNS no + +# Allow client to pass locale environment variables +AcceptEnv LANG LANGUAGE LC_* EDITOR + +UsePAM yes +# override default of no subsystems +Subsystem sftp /usr/lib/sftp-server + +%if %%getVar('ip_machine_esclave', "non") != "non" +Match Address %%ip_machine_esclave + PermitRootLogin yes +%end if + +%if %%getVar('ip_machine_maitre', "non") != "non" +Match Address %%ip_machine_maitre + PermitRootLogin yes +%end if + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/sudoers b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/sudoers new file mode 100644 index 0000000000000000000000000000000000000000..5bbe05a6daf29f26fa874156ce64edb3cc1eff70 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/sudoers @@ -0,0 +1,32 @@ +#------------------------------------------------------------------------------- +## sudoers pour EOLE version 2.4 +## EOLE <eole@ac-dijon.fr> +#------------------------------------------------------------------------------- +# sudoers file. +# +# This file MUST be edited with the 'visudo' command as root. +# +# See the sudoers man page for the details on how to write a sudoers file. +# + +# Host alias specification + +# User alias specification +User_Alias GRPADM = %slurp +%echo "%adm" + +# Cmnd alias specification +# User privilege specification +root ALL=(ALL) ALL + +# interface semi-graphique & MAJ +GRPADM ALL=NOPASSWD : /usr/bin/Query-Cd "",/usr/bin/Maj-Cd "", /usr/bin/Maj-Auto "", /usr/bin/Query-Auto "" +GRPADM ALL=NOPASSWD : /usr/bin/reconfigure "", /usr/bin/StartAll +GRPADM ALL=NOPASSWD : /usr/bin/diagnose +GRPADM ALL=NOPASSWD : /sbin/halt, /sbin/reboot + +# outils zephir +uucp ALL=NOPASSWD : /usr/share/zephir/scripts/*.zephir + +#includedir /etc/sudoers.d + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/sysctl.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/sysctl.conf new file mode 100644 index 0000000000000000000000000000000000000000..7926eedbdc563c032b17f4ad96be526f71cef7e2 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/sysctl.conf @@ -0,0 +1,93 @@ +#---------------------------------------------------------------------------- +## sysctl.conf pour EOLE +#---------------------------------------------------------------------------- + + +# activer l'antispoofing pour interface 1 (%%nom_carte_eth0) +%for %%interface in %%nom_carte_eth0 +net.ipv4.conf.%%{interface}.rp_filter = 1 +%end for +net.ipv4.conf.%%{nom_zone_eth0}.rp_filter = 1 +%if %%nombre_interfaces >= "2" +%if %%activer_antispoofing == 'oui' +# activer l'antispoofing pour toutes les interfaces +net.ipv4.conf.all.rp_filter = 1 +%end if +%end if +# packet forwarding +%set %%ipv4_routing = 0 +%if %%mode_conteneur_actif == 'oui' or %%activer_routage_ipv4 == 'oui' + %set %%ipv4_routing = 1 +%end if +net.ipv4.ip_forward = %%ipv4_routing +# Enable the magic-sysrq key +kernel.sysrq = 1 +# Disable tcp_timestamp +net.ipv4.tcp_timestamps = 0 +# eviter les attaques SYN +#net.ipv4.tcp_syncookies = 1 +#interdire l'ICMP redirection +net.ipv4.conf.all.accept_redirects = 0 +#désactiver source routing +net.ipv4.conf.all.accept_source_route = 0 +# Désactiver la notification de congestion (Prble http avec certain serveur) +net.ipv4.tcp_ecn = 0 +%if %%activer_log_martian == 'oui' +# log martian sources activé +net.ipv4.conf.all.log_martians = 1 +%else +# log martian sources désactivé +net.ipv4.conf.all.log_martians = 0 +%end if +# random ip IDs +#kernel.grsecurity.rand_ip_ids = 1 +# random tcp src port +#kernel.grsecurity.rand_tcp_src_ports = 1 +# random pids +#kernel.grsecurity.rand_pids = 1 +# altere ping +#kernel.grsecurity.altered_pings = 1 +kernel.hostname = %%nom_machine +kernel.domainname = %%nom_domaine_local +#neighbour table overflow stop culling limit +net.ipv4.neigh.default.gc_thresh1 = %%ipv4_neigh_default_gc_thresh1 +#neighbour table overflow soft limit +net.ipv4.neigh.default.gc_thresh2 = %%ipv4_neigh_default_gc_thresh2 +#neighbour table overflow hard limit +net.ipv4.neigh.default.gc_thresh3 = %%ipv4_neigh_default_gc_thresh3 +#ip_no_pmtu_disc : desactive le path mtu discovery le bit DF n'est pas positionne à 1 +%if %%ip_no_pmtu_disc == "oui" +net.ipv4.ip_no_pmtu_disc = 1 +%else +net.ipv4.ip_no_pmtu_disc = 0 +%end if +# for smb (#5256) +%if %%is_defined('fs_inotify_max_user_instances') +fs.inotify.max_user_instances = %%fs_inotify_max_user_instances +%end if +%if %%is_defined('fs_inotify_max_user_watches') +fs.inotify.max_user_watches = %%fs_inotify_max_user_watches +%end if +%if %%is_defined('fs_inotify_max_queued_events') +fs.inotify.max_queued_events = %%fs_inotify_max_queued_events +%end if +# utilisation de la swap par rapport à la mémoire vive (#10569) +vm.swappiness = %%vm_swappiness + +# Support IPV6 +%set %%ipv6_routing = 0 +%if %%activer_ipv6 == 'oui' + %if %%getVar('activer_routage_ipv6', 'non') == 'oui' + %set %%ipv6_routing = 1 + %end if +net.ipv6.conf.all.disable_ipv6=0 +net.ipv6.conf.default.disable_ipv6=0 +net.ipv6.conf.lo.disable_ipv6=0 +%else +net.ipv6.conf.all.disable_ipv6=1 +net.ipv6.conf.default.disable_ipv6=1 +net.ipv6.conf.lo.disable_ipv6=1 +%end if + +# Routage IPv6 +net.ipv6.conf.all.forwarding=%%ipv6_routing diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/timezone b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/timezone new file mode 100644 index 0000000000000000000000000000000000000000..cc3c13e3213e403fc199b9a2880558c580395008 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/timezone @@ -0,0 +1 @@ +%%time_zone diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/vimrc b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/vimrc new file mode 100644 index 0000000000000000000000000000000000000000..cb7eb5b749aef97ff65bf378862dacacdac043c0 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/vimrc @@ -0,0 +1,114 @@ +" An example for a vimrc file. +" +" Maintainer: Bram Moolenaar <Bram@vim.org> +" Last change: 2002 Sep 19 +" +" To use it, copy it to +" for Unix and OS/2: ~/.vimrc +" for Amiga: s:.vimrc +" for MS-DOS and Win32: $VIM\_vimrc +" for OpenVMS: sys$login:.vimrc + +" When started as "evim", evim.vim will already have done these settings. +if v:progname =~? "evim" + finish +endif + +" Use Vim settings, rather then Vi settings (much better!). +" This must be first, because it changes other options as a side effect. +set nocompatible + +" allow backspacing over everything in insert mode +set backspace=indent,eol,start + +" set background option +set background=%%vim_background + +if has("vms") + set nobackup " do not keep a backup file, use versions instead +else + set backup " keep a backup file +endif +set history=50 " keep 50 lines of command line history +set ruler " show the cursor position all the time +set showcmd " display incomplete commands +set incsearch " do incremental searching + +" For Win32 GUI: remove 't' flag from 'guioptions': no tearoff menu entries +" let &guioptions = substitute(&guioptions, "t", "", "g") + +" Don't use Ex mode, use Q for formatting +map Q gq + +" This is an alternative that also works in block mode, but the deleted +" text is lost and it only works for putting the current register. +"vnoremap p "_dp + +" Switch syntax highlighting on, when the terminal has colors +" Also switch on highlighting the last used search pattern. +if &t_Co > 2 || has("gui_running") + syntax on + set hlsearch +endif + +" Only do this part when compiled with support for autocommands. +if has("autocmd") + + " Enable file type detection. + " Use the default filetype settings, so that mail gets 'tw' set to 72, + " 'cindent' is on in C files, etc. + " Also load indent files, to automatically do language-dependent indenting. + filetype plugin indent on + + " Put these in an autocmd group, so that we can delete them easily. + augroup vimrcEx + au! + + " For all text files set 'textwidth' to 78 characters. + autocmd FileType text setlocal textwidth=78 + + " Lie les .tac comme des .py et les .eol comme des .ini + autocmd BufRead *.tac set filetype=python + autocmd BufRead *.eol set filetype=dosini + autocmd BufRead nginx.* set filetype=nginx + autocmd BufRead /etc/nginx/* set filetype=nginx + + " Supprime les espaces en fin de ligne avant de sauver + autocmd BufWrite * silent! %s/[\r \t]\+$// + + " When editing a file, always jump to the last known cursor position. + " Don't do it when the position is invalid or when inside an event handler + " (happens when dropping a file on gvim). + autocmd BufReadPost * + \ if line("'\"") > 0 && line("'\"") <= line("$") | + \ exe "normal g`\"" | + \ endif + + augroup END + +else + + set autoindent " always set autoindenting on + +endif " has("autocmd") +"Pour le collage" +set pt=<F5> +set vb t_vb=" +set shiftwidth=4 +set expandtab +set ts=4 +set sw=4 +syntax on +filetype indent on +filetype plugin on +set autoindent +set hlsearch " Surligne les resultats de recherche +set wrap " Pas de retour a la ligne auto (affichage) +set showmatch " Affiche parenthese correspondante +set softtabstop=4 " Largeur d'une tabulation +"set fdm=indent " Repli selon l'indentation +map <F9> :let &background = ( &background == "dark"? "light" : "dark" )<CR> +" 2016-10-07 peut présenter des risques de vulnérabilités sans vraiment +" arriver à trouver lesquels (chercher 'vim modeline vulnerability' sur +" Internet) +" set modeline diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/zstats.cfg b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/zstats.cfg new file mode 100644 index 0000000000000000000000000000000000000000..27d034d7db82c6d8ae9e72e7bf17a0d6367c5371 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-server/templates/zstats.cfg @@ -0,0 +1,250 @@ +%def return_yesno(%%varname) + %if %%getVar(%%varname, 'non') == 'oui' +yes + %else +no + %end if +%end def +[eole] +nom_machine = %%nom_machine +eole_module = %%eole_module +eole_version = %%eole_version +eole_release = %%eole_release +mode_conteneur_actif = %%return_yesno('mode_conteneur_actif')%slurp +nombre_interfaces = %%nombre_interfaces +%for %%i in %%xrange(0, 5) + %if %%i < %%int(%%nombre_interfaces) +nom_zone_eth%%i = %%getVar('nom_zone_eth' + str(%%i)) + %else +nom_zone_eth%%i = '' + %end if +%end for +has_adresse_ip_gw = %slurp +%if %%is_empty(%%adresse_ip_gw) +no +%else +yes +%end if +adresse_ip_annuaire = %%getVar('adresse_ip_annuaire', '127.0.0.1') +adresse_ip_mail = %%getVar('adresse_ip_mail', '127.0.0.1') +adresse_imap = %%getVar('adresse_imap', '') +adresse_ip_service_web = %slurp +%if %%getVar('container_ip_web', '127.0.0.1') == '127.0.0.1' +%%adresse_ip_eth0 +%else +%%container_ip_web +%end if +has_type_amon = %slurp +%if %%is_empty(%%getVar('type_amon', '')) +no +%else +yes +%end if +groups = %%custom_join(%%creole_client.get_groups()) +adresse_ip_dns = %slurp +%if %%getVar("ad_address", "") +%%ad_address %slurp + %if %%getVar("ad_rescue", "") +%%ad_rescue %slurp + %end if +%end if +%%custom_join(%%adresse_ip_dns) +test_distant_domaine = %%custom_join(%%test_distant_domaine) +activer_proxy_client = %%return_yesno('activer_proxy_client')%slurp +proxy_client_adresse%slurp +%if %%activer_proxy_client == 'oui' + = %%proxy_client_adresse +%else + +%end if +proxy_client_port%slurp +%if %%activer_proxy_client == 'oui' + = %%proxy_client_port +%else + +%end if +adresse_ip_mysql = %%getVar('adresse_ip_mysql', 'localhost') +container_ip_dns%slurp +%if %%getVar('container_ip_dns', '') != '' + = %%container_ip_dns +%else + +%end if +adresse_ip_fichier = %%getVar('adresse_ip_fichier', 'localhost') +nom_machine_eth =%slurp +%if %%nombre_interfaces == '1' + %%nom_machine +%else +%for %%i in xrange(1, %%int(%%nombre_interfaces)) + %%getVar('nom_machine_eth' + %%str(%%i), '')%slurp +%end for + +%end if + +[service] +activer_clam = %%return_yesno('activer_clam')%slurp +activer_cups = %%return_yesno('activer_cups')%slurp +activer_firewall = %%return_yesno('activer_firewall')%slurp +%set %%_activer_bareos_dir = %%getVar('activer_bareos_dir', 'non') == 'oui' +activer_bareos_dir = %slurp +%if %%_activer_bareos_dir +yes +%else +no +%end if +%set %%_activer_bareos_sd = %%getVar('activer_bareos_sd', 'non') == 'oui' +activer_bareos_sd = %slurp +%if %%_activer_bareos_sd +yes +%else +no +%end if +install_rvp = %%return_yesno('install_rvp')%slurp +%set %%_activer_nut = %%getVar('activer_nut', 'non') == 'oui' +activer_nut = %slurp +%if %%_activer_nut +yes +%else +no +%end if +%set _activer_sso_local = %%getVar('activer_sso', 'non') == 'local' +activer_sso_local = %slurp +%if %%_activer_sso_local +yes +%else +no +%end if +activer_filtrage_proxy = %%return_yesno('activer_filtrage_proxy')%slurp +smb_vscan = %%return_yesno('smb_vscan')%slurp +activer_ead_web = %%return_yesno('activer_ead_web')%slurp +activer_client_ldap_local = %slurp +%if %%getVar('activer_client_ldap', 'non') == 'local' +yes +%else +no +%end if +activer_spamassassin = %%return_yesno('activer_spamassassin')%slurp +activer_courier_pop = %%return_yesno('activer_courier_pop')%slurp +activer_courier_imap = %%return_yesno('activer_courier_imap')%slurp +activer_apache = %%return_yesno('activer_apache')%slurp +activer_squid2 = %%return_yesno('activer_squid2')%slurp +activer_haute_dispo = %%getVar('activer_haute_dispo', 'non') +activer_mysql = %%return_yesno('activer_mysql')%slurp +activer_proftpd = %%return_yesno('activer_proftpd')%slurp +activer_squid_auth = %%return_yesno('activer_squid_auth')%slurp +activer_radius = %%return_yesno('activer_freeradius')%slurp +activer_ead_web = %%return_yesno('activer_ead_web')%slurp +activer_sympa = %%return_yesno('activer_sympa')%slurp +activer_postgresql= %%return_yesno('activer_postgresql')%slurp +horus_frontend= %%return_yesno('horus_frontend')%slurp +%if %%_activer_bareos_dir or %%_activer_bareos_sd + +[bareos] +bareos_mon_password = %%creole_client.get('bareos.monitor.bareos_mon_password') +%end if +%if %%_activer_nut + +[nut] +nut_ups_name = %slurp + %if %%nut_ups_daemon == 'oui' +%%custom_join(%%nut_ups_name) + %else +%%nut_monitor_foreign_name + %end if +nut_ups_host =%slurp + %if %%nut_ups_daemon == 'oui' + %for %%tmp in %%nut_ups_name + localhost%slurp + %end for + + %else + %%nut_monitor_foreign_host + %end if +%end if +%if %%_activer_sso_local + +[sso] +eolesso_port = %%eolesso_port +%end if + +[proxy] +%if %%getVar('activer_filtrage_proxy', None) is None +container_ip_proxy +adresse_ip_service_proxy +dansguardian_port3 +nom_machine_proxy +interface_proxy +maxchildren1 +maxchildren2 +dansguardian_eth +proxy2_port +%else +container_ip_proxy = %%getVar('container_ip_proxy', '') + %if %%nombre_interfaces == '1' + %set %%interf = '0' + %else + %set %%interf = '1' + %end if +%set %%ip_proxy = [] + %if %%interf == '0' + %if %%mode_conteneur_actif == 'oui' +%%ip_proxy.append(%%adresse_ip_eth0_proxy_link)%slurp + %else +%%ip_proxy.append(%%adresse_ip_eth0)%slurp + %end if + %else + %for %%i in xrange(1, %%int(%%nombre_interfaces)) + %if %%mode_conteneur_actif == 'oui' +%%ip_proxy.append(%%getVar('adresse_ip_eth' + %%str(%%i) + '_proxy_link'))%slurp + %else +%%ip_proxy.append(%%getVar('adresse_ip_eth' + %%str(%%i)))%slurp + %end if + %end for + %end if +adresse_ip_service_proxy = %%custom_join(%%ip_proxy) +dansguardian_port3%slurp + %if %%getVar('dansguardian_port3', '') != '' + = %%dansguardian_port3 + %else + + %end if +proxy2_port = %%getVar('proxy2_port', '') + %if %%interf == '0' +nom_machine_proxy = %%getVar('nom_machine') + %else +nom_machine_proxy = %%getVar('nom_machine_eth' + %%interf, '') + %end if +interface_proxy = %%interf +maxchildren1 = %%getVar('guardian_httpworkers1', 0) +maxchildren2 = %%getVar('guardian_httpworkers2', 0) +%set %%ethpolicies = [] + %if %%getVar('activer_filtrage_proxy', 'non') == 'oui' + %if %%nombre_interfaces == '1' +%%ethpolicies.append(%%getVar('dansguardian_eth0', 0))%slurp + %else + %for %%i in %%xrange(1, %%int(%%nombre_interfaces)) +%%ethpolicies.append(%%getVar('dansguardian_eth' + %%str(%%i)))%slurp + %end for + %end if + %end if +dansguardian_eth = %%custom_join(%%ethpolicies) +%end if + +[rvp] +%if %%getVar('install_rvp', 'non') == 'oui' +sw_threads = %%sw_threads +%else +sw_threads = 0 +%end if + +[haute_dispo] +nom_machine_maitre = %%getVar('nom_machine_maitre', '') +nom_machine_esclave = %%getVar('nom_machine_esclave', '') + +[hapy] +ip_sunstone = %%getVar('ip_sunstone', '') +vnc_proxy_port_sunstone = %%getVar('vnc_proxy_port_sunstone', '') +port_sunstone = %%getVar('port_sunstone', '') +activer_oneflow = %%return_yesno('activer_oneflow')%slurp +ip_oneflow = %%getVar('ip_oneflow', '') +port_oneflow = %%getVar('port_oneflow', '') diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-seshat/dictionaries/00_eole-seshat_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-seshat/dictionaries/00_eole-seshat_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..1aaf6347d4f6f7e9bfb502405e53b595704e8844 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-seshat/dictionaries/00_eole-seshat_packages.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>eole-seshat-backend</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-seshat/dictionaries/30_seshat.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-seshat/dictionaries/30_seshat.xml new file mode 100644 index 0000000000000000000000000000000000000000..f4618b8e45641f534ea6e0562d8ff696af969e85 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-seshat/dictionaries/30_seshat.xml @@ -0,0 +1,105 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + <!-- FIXME : ldap_admin ? --> + <!--<file name='/etc/eole/eoleldap.conf' mode='0600'/>--> + </files> + + <variables> + + <family name='general'> + <variable name='eole_module' redefine='True' > + <value>seshat</value> + </variable> + <variable name='nombre_interfaces' redefine='True' mode='expert'/> + </family> + + <family name='système'> + + <!-- We need to recalculate the variables --> + <variable name='eole_lv_names' redefine='True' remove_check='True' /> + <variable name='eole_lv_standard_extends' redefine='True' remove_check='True' /> + + </family> + + <family name='Interface-0'> + <variable name='eth0_method' redefine='True' hidden='True'> + <value>statique</value> + </variable> + </family> + + <family name='services'> + <variable name='activer_client_ldap' redefine='True' hidden='True'/> + <!-- service eole-sso local activé par défaut --> + <variable name='activer_sso' redefine='True'> + <value>local</value> + </variable> + <variable name='activer_apache' redefine='True'> + <value>non</value> + </variable> + <variable name='activer_mysql' redefine='True'> + <value>non</value> + </variable> + </family> + + <family name='clamav'> + <variable name='exim_clamav' redefine='True'> + <value>oui</value> + </variable> + </family> + + <family name='messagerie'> + <variable name='exim_relay' redefine='True'> + <value>oui</value> + </variable> + </family> + + <family name='openldap' mode='expert'> + <variable name='ldap_replication' redefine='True' hidden='True'/> + <variable name='ldap_replication_client' redefine='True' hidden='False'> + <value>oui</value> + </variable> + </family> + + <family name='eole-sso'> + <variable name='ead_sso' redefine='True'> + <value>non</value> + </variable> + </family> + + <separators /> + + </variables> + + <constraints> + + <fill name='calc_val' target='exim_relay_manual_routes'> + <param type='eole' name='valeur'>exim_relay</param> + </fill> + + <!-- Default AmonEcole* logical volumes --> + <auto name='calc_multi_val' target='eole_lv_names'> + <param>root</param> + <param>tmp</param> + <param>var</param> + <param>home</param> + </auto> + + <!-- Default AmonEcole* logical volumes extension: 100% /home --> + <auto name='calc_multi_val' target='eole_lv_standard_extends'> + <param type='number'>0</param> + <param type='number'>0</param> + <param type='number'>100</param> + <param type='number'>0</param> + </auto> + + </constraints> + + <help> + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-seshat/extra_dictionaries/schedule/01_freduvecteur.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-seshat/extra_dictionaries/schedule/01_freduvecteur.xml new file mode 100644 index 0000000000000000000000000000000000000000..a8916b3d7b6e98e9f9d2f32d73a90960c29a56fe --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-seshat/extra_dictionaries/schedule/01_freduvecteur.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + <variables> + <family name='freduvecteur'> + <variable name="description" type="string"><value>Re-génération de la base integrTeleservice.db</value></variable> + <variable name="day" type="schedule"><value>daily</value></variable> + <variable name="mode" type="schedulemod"><value>post</value></variable> + </family> + </variables> + <constraints> + </constraints> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-seshat/files/usr/share/ead2/backend/config/actions/actions_seshat.cfg b/seed/release/eole-2.7/2.7.1/applicationservice/eole-seshat/files/usr/share/ead2/backend/config/actions/actions_seshat.cfg new file mode 100644 index 0000000000000000000000000000000000000000..bf5a96bfa96f72970399036cea5894fa33d290c2 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-seshat/files/usr/share/ead2/backend/config/actions/actions_seshat.cfg @@ -0,0 +1 @@ +seshat/routes diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-seshat/files/usr/share/ead2/backend/config/perms/perm_seshat.ini b/seed/release/eole-2.7/2.7.1/applicationservice/eole-seshat/files/usr/share/ead2/backend/config/perms/perm_seshat.ini new file mode 100644 index 0000000000000000000000000000000000000000..f4ca57309558c22d23645863b3076c322b9c714d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-seshat/files/usr/share/ead2/backend/config/perms/perm_seshat.ini @@ -0,0 +1,5 @@ +[roles] +admin=admin + +[permissions] +routes=admin diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-seshat/files/usr/share/eole/schedule/scripts/freduvecteur b/seed/release/eole-2.7/2.7.1/applicationservice/eole-seshat/files/usr/share/eole/schedule/scripts/freduvecteur new file mode 100644 index 0000000000000000000000000000000000000000..247eea25e116a6a7dba81148287237539ee1259e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-seshat/files/usr/share/eole/schedule/scripts/freduvecteur @@ -0,0 +1,3 @@ +#!/bin/bash +# re-génération de la base integrTeleservice.db +/usr/share/eole/sbin/gen_freduvecteur.py diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-seshat/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-seshat/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..ce73b3fb1bdb22f63c57c277bafb9e95d31fcbc2 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-seshat/service.yml @@ -0,0 +1,45 @@ +format: '0.1' +name: eole-seshat +version: |- + 2.7.0-2 +description: |- + Configuration du module EOLE : Seshat + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: + - eole-annuaire + - eole-antivirus + - eole-exim + - eole-mysql + - eole-adminer + - eole-spamassassin + - eole-web + - eole-server +packages: + - eole-seshat-backend +dictionaries: + - 30_seshat.xml +extra_dictionaries: + schedule: + - 01_freduvecteur.xml +templates: [] +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: [] +files: + /usr/share/ead2/backend/config/actions/actions_seshat.cfg: + owner: root + group: root + mode: '0644' + /usr/share/ead2/backend/config/perms/perm_seshat.ini: + owner: root + group: root + mode: '0644' + /usr/share/eole/schedule/scripts/freduvecteur: + owner: root + group: root + mode: '0755' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-seth-aaf/dictionaries/00_eole-seth-aaf_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-seth-aaf/dictionaries/00_eole-seth-aaf_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..30654f9034a34fafa4841fdb8d38f13c94b4b712 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-seth-aaf/dictionaries/00_eole-seth-aaf_packages.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>eole-mongodb</package> + <package>python-sethaaf</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-seth-aaf/dictionaries/25_sethaaf.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-seth-aaf/dictionaries/25_sethaaf.xml new file mode 100644 index 0000000000000000000000000000000000000000..473bcb8fb15fcf852142095669e323cc0c215f66 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-seth-aaf/dictionaries/25_sethaaf.xml @@ -0,0 +1,24 @@ +<?xml version='1.0' encoding='utf-8'?> + +<creole> + + <files> + <file name="/etc/aaf.conf"/> + </files> + <variables> + <family name="Nginx"> + <!-- increase client_max_body_size to upload large AAF files --> + <variable name="php_post_max_size" redefine='True'> + <value>100</value> + </variable> + </family> + <family name="Importation" icon='download'> + <variable name="ad_importation_type" description="Les utilisateurs importés dans la base Active Directory sont dans une OU" mode="expert" auto_freeze="True"/> + </family> + </variables> + <constraints> + <check name="valid_enum" target="ad_importation_type"> + <param>['unique', 'par établissement']</param> + </check> + </constraints> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-seth-aaf/extra_dictionaries/aafreport/00_action.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-seth-aaf/extra_dictionaries/aafreport/00_action.xml new file mode 100644 index 0000000000000000000000000000000000000000..32604e6f996a449f1680fdc91f9365949be1b18b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-seth-aaf/extra_dictionaries/aafreport/00_action.xml @@ -0,0 +1,29 @@ +<creole> + <family_action name="Importation"> + <action type="reader" + title="Rapport d'importation AAF" + description="Afficher le journal de l'importation AAF" + image="icons/edit-find.svg"> + <profile>ead_admin</profile> + <ewtapp>ead</ewtapp> + <tag>log</tag> + <tag>aaf</tag> + <tag>samba</tag> + <tag>importation</tag> + </action> + </family_action> + <variables> + <family name="options" + description="rapport AAF"> + <variable name="filename" type="filename"> + <value>/var/lib/eole/reports/importaaf.log</value> + </variable> + <variable name="language" type="string"> + <value>prolog</value> + </variable> + </family> + </variables> + <constraints> + </constraints> + <help/> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-seth-aaf/extra_dictionaries/importaaf/00_action.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-seth-aaf/extra_dictionaries/importaaf/00_action.xml new file mode 100644 index 0000000000000000000000000000000000000000..361e39ab98674593dc24cfd4097a2bd81098afc4 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-seth-aaf/extra_dictionaries/importaaf/00_action.xml @@ -0,0 +1,28 @@ +<creole> + <family_action name="Importation" + description="Gestion de l'importation" + color="#fcce74" + image="system.svg"> + <action type="form" + title="Traitement des fichiers AAF" + description="Lancement de la procédure d'importation AAF vers une base de données intermédiaire" + image="icons/preferences-system-session.svg"> + <input>Lancer le traitement</input> + <profile>ead_admin</profile> + <ewtapp>ead</ewtapp> + <tag>aaf</tag> + <tag>importation</tag> + </action> + </family_action> + <variables> + <family name="aaf" description="Fichier"> + <variable name="aaf_filename" description="Nom du fichier de configuration (attention, importer le fichier au bon endroit)"/> + <variable name="aaf_type" description="Importation complète ou delta"/> + </family> + </variables> + <constraints> + <check name="valid_enum" target="importaaf.aaf.aaf_filename"><param type="python">eosfunc.uploaded_files(['.zip'], "Aucun fichier téléversé depuis l'action 'Gérer les fichiers'")</param></check> + <check name="valid_enum" target="importaaf.aaf.aaf_type"><param>['complète', 'delta']</param></check> + </constraints> + <help/> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-seth-aaf/extra_dictionaries/importad/00_action.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-seth-aaf/extra_dictionaries/importad/00_action.xml new file mode 100644 index 0000000000000000000000000000000000000000..35ead2f6646b5f76b1f855a820916ca52d5d7d13 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-seth-aaf/extra_dictionaries/importad/00_action.xml @@ -0,0 +1,19 @@ +<creole> + <family_action name="Importation"> + <action type="form" + title="Importation des comptes" + description="Lancement de la procédure d'importation des comptes et des groupes depuis la base intermédiaire vers Active Directory" + image="icons/preferences-system-session.svg"> + <input>Lancer une importation</input> + <profile>ead_admin</profile> + <ewtapp>ead</ewtapp> + <tag>aaf</tag> + <tag>importation</tag> + </action> + </family_action> + <variables> + </variables> + <constraints> + </constraints> + <help/> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-seth-aaf/files/usr/share/eole/sbin/import-aaf.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-seth-aaf/files/usr/share/eole/sbin/import-aaf.py new file mode 100644 index 0000000000000000000000000000000000000000..50a42e6068b6fbe33b5981ef2d588fb80806224b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-seth-aaf/files/usr/share/eole/sbin/import-aaf.py @@ -0,0 +1,105 @@ +#! /usr/bin/env python2 +#-*- encoding: utf-8 -*- +import sys +from os.path import isdir, isfile, join +from os import makedirs, listdir, rename, unlink +from shutil import rmtree +from zipfile import ZipFile +from json import dumps +import traceback +from pyeole.lock import acquire, release + +from eoleaaf.parseaaf import main as complet_main +from eoleaaf.parsedelta import main as delta_main +from eoleaaf.config import path_aaf_complet +from eoleaaf.util import db +from logging import getLogger + +aaflog = getLogger("AAF") + +def processfile(filename, level, delete=False): + """ + :param filename: fullpath of the archive to unzip + :param level: type of import ('complète' or 'delta') + :param delete: if True, remove the import file after successfull process + """ + aaflog.info(20*'*') + aaflog.info('*** Début du traitement des fichiers AAF (importation {1}) : {0}'.format(filename, level)) + if level == 'complète': + main = complet_main + elif level == 'delta': + main = delta_main + else: + sys.exit(1) + try: + acquire('importaaf', level="system") + except Exception as err: + sys.exit(2) + + # the file must exists + if not isfile(filename): + release('importaaf', level='system') + sys.exit(3) + + try: + kwargs = {} + if db.db.user.find_one(): + if level == 'complète': + kwargs['maj_mode'] = True + else: + if level == 'delta': + release('importaaf', level='system') + sys.exit(4) + if level == 'complète': + kwargs['maj_mode'] = False + except Exception as err: + traceback.print_exc() + release('importaaf', level='system') + sys.exit(5) + + # purge the folders + try: + if isdir(path_aaf_complet): + rmtree(path_aaf_complet) + makedirs(path_aaf_complet) + except Exception as err: + traceback.print_exc() + release('importaaf', level='system') + sys.exit(6) + + # unzip the files + try: + zip_ref = ZipFile(filename, 'r') + zip_ref.extractall(path_aaf_complet) + zip_ref.close() + # move the files in path_aaf_complet if there is any subfolder + for fname in listdir(path_aaf_complet): + fullname = join(path_aaf_complet, fname) + if isdir(fullname): + for subfname in listdir(fullname): + rename(join(fullname, subfname), join(path_aaf_complet, subfname)) + except Exception as err: + traceback.print_exc() + release('importaaf', level='system') + sys.exit(7) + + try: + # imports the files in mongodb + main(path_aaf_complet, **kwargs) + except Exception as err: + traceback.print_exc() + release('importaaf', level='system') + sys.exit(8) + + # Delete AAF zip file if success + if delete: + unlink(filename) + aaflog.info('Suppression du fichier {0}'.format(filename)) + + aaflog.info('*** Fin du traitement des fichiers AAF') + aaflog.info(20*'*') + release('importaaf', level='system') + sys.exit(0) + +if __name__ == "__main__": + processfile(*sys.argv[1:]) \ No newline at end of file diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-seth-aaf/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-seth-aaf/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..35aa4dc90216001b45314f2c5b6d6407ce1cb4b0 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-seth-aaf/service.yml @@ -0,0 +1,38 @@ +format: '0.1' +name: eole-seth-aaf +version: |- + 2.7.1-1 +description: |- + Gestion des imports AAF pour le module Seth + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: [] +packages: + - eole-mongodb + - python-sethaaf +dictionaries: + - 25_sethaaf.xml +extra_dictionaries: + aafreport: + - 00_action.xml + importaaf: + - 00_action.xml + importad: + - 00_action.xml +templates: + - aaf.conf +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: [] +files: + /usr/share/eole/sbin/import-aaf.py: + owner: root + group: root + mode: '0755' +excluding_regexp: + /usr/share/doc: 2 + /usr/share/eole/creole/extra/importaaf/salt/: 1 + /usr/share/eole/creole/extra/importad/salt/: 1 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-seth-aaf/templates/aaf.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-seth-aaf/templates/aaf.conf new file mode 100644 index 0000000000000000000000000000000000000000..6bf099d2561775ce27a170b5bf16c0fd72894700 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-seth-aaf/templates/aaf.conf @@ -0,0 +1,8 @@ +dbtype="mongodb" +aaf_type="samba4" +basedn="DC=%echo ',DC='.join(%%ad_realm.split('.')) + '"' +%if %%ad_importation_type == 'unique' +smbstructure="toplevel" +%else +smbstructure="split" +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-seth/dictionaries/30_seth.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-seth/dictionaries/30_seth.xml new file mode 100644 index 0000000000000000000000000000000000000000..0a2fcd58c302dc13d4a752b3caba17ce6bc6d829 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-seth/dictionaries/30_seth.xml @@ -0,0 +1,54 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <containers /> + + <variables> + + <family name='general'> + <variable name='eole_module' redefine='True'> + <value>seth</value> + </variable> + </family> + + <family name='système'> + + <!-- if we have free space --> + <variable name='partitioning_create_lv' redefine='True'> + <value>oui</value> + </variable> + + <!-- We need to recalculate the variables --> + <variable name='eole_lv_names' redefine='True' remove_check='True' /> + <variable name='eole_lv_standard_extends' redefine='True' remove_check='True' /> + + </family> + + </variables> + + <constraints> + + <!-- Default AmonEcole* logical volumes --> + <auto name='calc_multi_val' target='eole_lv_names'> + <param>root</param> + <param>tmp</param> + <param>var</param> + <param>home</param> + </auto> + + <!-- Default AmonEcole* logical volumes extension: 100% /home --> + <auto name='calc_multi_val' target='eole_lv_standard_extends'> + <param type='number'>0</param> + <param type='number'>0</param> + <param type='number'>0</param> + <param type='number'>100</param> + </auto> + + </constraints> + + <help/> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-seth/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-seth/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..e25c2e34d31ca092ad6595d55f5185609263534c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-seth/service.yml @@ -0,0 +1,27 @@ +format: '0.1' +name: eole-seth +version: |- + 2.7.1-15 +description: |- + Module EOLE Seth + Configuration du module EOLE Seth. + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: + - eole-dhcp + - eole-ad-dc + - eole-antivirus +packages: [] +dictionaries: + - 30_seth.xml +extra_dictionaries: {} +templates: [] +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: [] +files: {} +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-smartmontools/creole_funcs/eole_smartmontools.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-smartmontools/creole_funcs/eole_smartmontools.py new file mode 100644 index 0000000000000000000000000000000000000000..3b3d65af65df915c72273cb378d8cd0ae77728d1 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-smartmontools/creole_funcs/eole_smartmontools.py @@ -0,0 +1,82 @@ +#!/usr/bin/python + +def calc_smart_test_regex (test): + from creole.client import CreoleClient + client = CreoleClient() + + m = calc_smart_test_months(client.get_creole('smartmontools_%s_months' % test)) + d = calc_smart_test_days(client.get_creole('smartmontools_%s_days' % test)) + wd = calc_smart_test_week_days(client.get_creole('smartmontools_%s_week_days' % test)) + h = calc_smart_test_hours(client.get_creole('smartmontools_%s_hours' % test)) + + return m + d + wd + h + +def calc_smart_test_months(months): + month = { 'tous':'..', + 'janvier':'01', + 'fevrier':'02', + 'mars':'03', + 'avril':'04', + 'mai':'05', + 'juin':'06', + 'juillet':'07', + 'aout':'08', + 'septembre':'09', + 'octobre':'10', + 'novembre':'11', + 'decembre':'12' } + + if 'tous' in months: + return '/..' + + mreg = '|'.join( map(lambda x: month[x], months) ) + if mreg == '': + return '/..' + elif mreg.find('|') == -1: + return '/' + mreg + else: + return '/(' + mreg + ')' + +def calc_smart_test_days(days): + if '0' in days: + return '/..' + + dreg = '|'.join( map(lambda x: str(x).rjust(2,'0') if x < 10 else str(x), days) ) + if dreg == '': + return '/..' + elif dreg.find('|') == -1: + return '/' + dreg + else: + return '/(' + dreg + ')' + +def calc_smart_test_week_days(week_days): + week_day = { 'tous':'.', + 'lundi':'1', + 'mardi':'2', + 'mercredi':'3', + 'jeudi':'4', + 'vendredi':'5', + 'samedi':'6', + 'dimanche':'7'} + + if 'tous' in week_days: + return '/.' + + wdreg = '|'.join( map(lambda x: week_day[x], week_days) ) + if wdreg == '': + return '/.' + elif wdreg.find('|') == -1: + return '/' + wdreg + else: + return '/(' + wdreg + ')' + +def calc_smart_test_hours(hours): + from random import randint + hreg = '|'.join( map(lambda x: str(x).rjust(2,'0') if x < 10 else str(x), hours) ) + if hreg == '': + return '/' + str(randint(0,23)).rjust(2,'0') + elif hreg.find('|') == -1: + return '/' + hreg + else: + return '/(' + hreg + ')' + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-smartmontools/dictionaries/00_eole-smartmontools_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-smartmontools/dictionaries/00_eole-smartmontools_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..94c133f261b17064b51c6a98f3991eff1ada3e0e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-smartmontools/dictionaries/00_eole-smartmontools_packages.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>smartmontools</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-smartmontools/dictionaries/02_smartmontools.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-smartmontools/dictionaries/02_smartmontools.xml new file mode 100644 index 0000000000000000000000000000000000000000..d2e516f56c9aa243c91eb5f67a2a5e0e18645cc6 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-smartmontools/dictionaries/02_smartmontools.xml @@ -0,0 +1,777 @@ +<creole> + <files> + <file name="/etc/smartd.conf" filelist="eole-smartmontools" /> + <file name="/etc/default/smartmontools" + source="smartmontools.default" + filelist="eole-smartmontools" rm="True"/> + <file name="/etc/smartmontools/run.d/10mail" + source="smartmontools.mailscript" + mode="0755" + filelist="eole-smartmontools" /> + </files> + + <!-- ********************************************************************* --> + + <variables> + + <!-- Activation des services --> + <family name="services"> + + <variable name="activer_smartmontools" type="oui/non" + description="Activer de smartmontools"> + <value>non</value> + </variable> + + </family> + + <family name="smartmontools"> + + <!-- + ENVOIS DES MAILS + --> + + <variable name="smartmontools_mail" type="oui/non" + description="Activer l'envois des mails"> + <value>non</value> + </variable> + + <variable name="smartmontools_mail_dests" type="string" + description="Adresses mails destinataires des alertes" + mandatory="True" + multi="True"/> + + <variable name="smartmontools_period_alerts" type="number" + description="Période en secondes entre deux mesures des alertes SMART" + mode="expert"> + <value>60</value> + </variable> + + <variable name="smartmontools_period_attrs" type="number" + description="Période en secondes entre deux mesures des attributs SMART" + mode="expert"> + <value>7200</value> + </variable> + + <!-- + GESTION DES DEVICES + --> + + <variable name="smartmontools_auto_detect" type="oui/non" + description="Détecter les périphériques à monitorer"> + <value>oui</value> + </variable> + + <variable name="smartmontools_devs" type="string" + description="Liste des peripheriques" + multi="True" + mandatory="True"> + <value>/dev/sda</value> + </variable> + + <variable name="smartmontools_devs_type" type="string" + description="Type des peripheriques" + multi="True"> + <value>auto</value> + </variable> + + <variable name="smartmontools_devs_attrs_fail_ignore" type="number" + description="Liste des ID d'attributs d'usage a ignorer" + multi="True" mode="expert"> + </variable> + + <variable name="smartmontools_devs_attrs_change_ignore" type="number" + description="Liste des ID d'attributs changant a ignorer" + multi="True" mode="expert"> + </variable> + + <!-- <variable name="smartmontools_devs_type_number" type="number" --> + <!-- description="Identifiant du disque sur le controleur"> --> + <!-- <value>0</value> --> + <!-- </variable> --> + + + <!-- + SURVEILLANCES + --> + + <variable name="smartmontools_attr_warn" type="number" + description="Écart entre la valeur actuelle et le seuil generant un avertissement" + mode="expert"> + <value>1</value> + </variable> + + <variable name="smartmontools_autosave" type="oui/non" + description="Activer la sauvegarde automatique des attributs" + mode="expert"> + <value>oui</value> + </variable> + + + <variable name="smartmontools_data_collect_online" type="oui/non" + description="Activer la collecte des données SMART en ligne" + mode="expert"> + <value>oui</value> + </variable> + + <variable name="smartmontools_data_collect_offline" type="oui/non" + description="Activer la collecte des données SMART hors ligne" + mode="expert"> + <value>oui</value> + </variable> + + <!-- + COLLECTE DE DONNÉES IMMÉDIATE + --> + <variable name="smartmontools_immediate_data_collect_self_test" + type="oui/non" + description="Activer la collecte immédiate des données hors lignes" + mode="expert"> + <value>oui</value> + </variable> + + <variable name="smartmontools_immediate_data_collect_months" + type="string" + description="Mois d'activation de la collecte immédiate des données hors lignes" + multi="True" mode="expert"> + <value>tous</value> + </variable> + + <variable name="smartmontools_immediate_data_collect_days" + type="number" + description="Jours du mois d'activation de la collecte immédiate des données hors lignes" + multi="True" mode="expert"> + <value>0</value> + </variable> + + <variable name="smartmontools_immediate_data_collect_week_days" + type="string" + description="Jours de la semaine d'activation de la collecte immédiate des données hors lignes" + multi="True" mode="expert"> + <value>tous</value> + </variable> + + <variable name="smartmontools_immediate_data_collect_hours" + type="number" + description="Heures d'activation les tests hors lignes" + multi="True" mode="expert"> + <value>6</value> + <value>12</value> + <value>18</value> + </variable> + + <!-- + TEST COURT + --> + <variable name="smartmontools_short_self_test" type="oui/non" + description="Activer les tests courts" + mode="expert"> + <value>oui</value> + </variable> + + <variable name="smartmontools_short_months" type="string" + description="Mois d'activation des tests courts" + multi="True" mode="expert"> + <value>tous</value> + </variable> + + <variable name="smartmontools_short_days" type="number" + description="Jours du mois d'activation des tests courts" + multi="True" mode="expert"> + <value>0</value> + </variable> + + <variable name="smartmontools_short_week_days" type="string" + description="Jours de la semaine d'activation des tests courts" + multi="True" mode="expert"> + <value>tous</value> + </variable> + + <variable name="smartmontools_short_hours" type="number" + description="Heures d'activation les tests courts" + multi="True" mode="expert"> + <value>4</value> + <value>20</value> + </variable> + + <!-- + TEST LONG + --> + <variable name="smartmontools_long_self_test" type="oui/non" + description="Activer les tests longs" + mode="expert"> + <value>oui</value> + </variable> + + <variable name="smartmontools_long_months" type="string" + description="Mois d'activation des tests longs" + multi="True" mode="expert"> + <value>tous</value> + </variable> + + <variable name="smartmontools_long_days" type="number" + description="Jours du mois d'activation des tests longs" + multi="True" mode="expert"> + <value>0</value> + </variable> + + <variable name="smartmontools_long_week_days" type="string" + description="Jours de la semaine d'activation des tests longs" + multi="True" mode="expert"> + <value>dimanche</value> + </variable> + + <variable name="smartmontools_long_hours" type="number" + description="Heures d'activation les tests longs" + multi="True" mode="expert"> + <value>22</value> + </variable> + + <!-- + TEST DE TRANSPORT + --> + <variable name="smartmontools_conveyance_self_test" + type="oui/non" + description="Activer les tests de transport" + mode="expert"> + <value>oui</value> + </variable> + + <variable name="smartmontools_conveyance_months" type="string" + description="Mois d'activation des tests de transports" + multi="True" mode="expert"> + <value>tous</value> + </variable> + + <variable name="smartmontools_conveyance_days" type="number" + description="Jours du mois d'activation des tests de transports" + multi="True" mode="expert"> + <value>0</value> + </variable> + + <variable name="smartmontools_conveyance_week_days" type="string" + description="Jours de la semaine d'activation des tests de transports" + multi="True" mode="expert"> + <value>tous</value> + </variable> + + <variable name="smartmontools_conveyance_hours" type="number" + description="Heures d'activation les tests de transports" + multi="True" mode="expert"> + <value>23</value> + </variable> + + + <!-- + TEMPERATURE + --> + + <variable name="smartmontools_track_temp" type="oui/non" + description="Activer la supervision de la température"> + <value>oui</value> + </variable> + + <variable name="smartmontools_temp_diff" type="number" + description="Ecart de température générant une alerte (0 désactivé)"> + <value>10</value> + </variable> + + <variable name="smartmontools_temp_info" type="number" + description="Température d'avertissement"> + <value>35</value> + </variable> + + <variable name="smartmontools_temp_crit" type="number" + description="Température critique générant un mail"> + <value>45</value> + </variable> + + </family> + + <separators> + <separator name="smartmontools_data_collect_online">Collecte automatique des données</separator> + <separator name="smartmontools_immediate_data_collect_self_test">Tests de collecte des données SMART</separator> + <separator name="smartmontools_short_self_test">Tests courts</separator> + <separator name="smartmontools_long_self_test">Tests longs</separator> + <separator name="smartmontools_conveyance_self_test">Tests de transport</separator> + <separator name="smartmontools_track_temp">Température</separator> + </separators> + + </variables> + + <constraints> + + <condition name="hidden_if_in" source="activer_smartmontools"> + <param>non</param> + <target type="family">smartmontools</target> + <target type="filelist">eole-smartmontools</target> + <target type="servicelist">smartmontools</target> + </condition> + + <!-- + GESTION DES MAILS + --> + + <condition name="hidden_if_in" source="smartmontools_mail"> + <param>non</param> + <target type="variable">smartmontools_mail_dests</target> + </condition> + + <!-- À faire lorsque eole-exim sera prêt --> + + <!-- <fill name='calc_multi_val' target='smartmontools_mail_dests'> --> + <!-- <param type='eole'>system_mail_to</param> --> + <!-- </fill> --> + + <!-- + GESTION DES DEVICES + --> + + <condition name="hidden_if_in" source="smartmontools_auto_detect"> + <param>oui</param> + <target type="variable">smartmontools_devs</target> + </condition> + + <check name="valid_enum" target="smartmontools_devs_type"> + <param>['auto', 'sat', 'ata', 'scsi', 'usbcypress', 'usbjmicron', 'marvell']</param> + <!-- + The following need a multi of multi to describe disks to + monitor: + 'megaraid,N', '3ware,N', 'areca,N', 'cciss,N', 'hpt,L/M/N' + --> + </check> + + <check name="valid_entier" target="smartmontools_period_alerts"> + <param name="mini">0</param> + <param name="maxi">86400</param> + </check> + + <check name="valid_entier" target="smartmontools_period_attrs"> + <param name="mini">0</param> + <param name="maxi">86400</param> + </check> + + <group master="smartmontools_devs"> + <slave>smartmontools_devs_type</slave> + </group> + + + <check name="valid_entier" target="smartmontools_devs_attrs_fail_ignore"> + <param name="mini">1</param> + <param name="maxi">255</param> + </check> + + <check name="valid_entier" target="smartmontools_devs_attrs_change_ignore"> + <param name="mini">1</param> + <param name="maxi">255</param> + </check> + + <check name="valid_entier" target="smartmontools_attr_warn"> + <param name="mini">0</param> + </check> + + <condition name="hidden_if_in" source="smartmontools_immediate_data_collect_self_test"> + <param>non</param> + <target type="variable">smartmontools_immediate_data_collect_months</target> + <target type="variable">smartmontools_immediate_data_collect_days</target> + <target type="variable">smartmontools_immediate_data_collect_week_days</target> + <target type="variable">smartmontools_immediate_data_collect_hours</target> + </condition> + + <condition name="hidden_if_in" source="smartmontools_short_self_test"> + <param>non</param> + <target type="variable">smartmontools_short_months</target> + <target type="variable">smartmontools_short_days</target> + <target type="variable">smartmontools_short_week_days</target> + <target type="variable">smartmontools_short_hours</target> + </condition> + + <condition name="hidden_if_in" source="smartmontools_long_self_test"> + <param>non</param> + <target type="variable">smartmontools_long_months</target> + <target type="variable">smartmontools_long_days</target> + <target type="variable">smartmontools_long_week_days</target> + <target type="variable">smartmontools_long_hours</target> + </condition> + + <condition name="hidden_if_in" source="smartmontools_conveyance_self_test"> + <param>non</param> + <target type="variable">smartmontools_conveyance_months</target> + <target type="variable">smartmontools_conveyance_days</target> + <target type="variable">smartmontools_conveyance_week_days</target> + <target type="variable">smartmontools_conveyance_hours</target> + </condition> + + <!-- + COLLECTE DE DONNÉES IMMÉDIATE + --> + <check name="valid_enum" target="smartmontools_immediate_data_collect_months"> + <param>['tous','janvier','fevrier','mars','avri','mai','juin','juillet','aout','septembre','octobre','novembre','decembre']</param> + </check> + + <check name="valid_entier" target="smartmontools_immediate_data_collect_days"> + <param name="mini">0</param> + <param name="maxi">31</param> + </check> + + <check name="valid_enum" target="smartmontools_immediate_data_collect_week_days"> + <param>['tous','lundi','mardi','mercredi','jeudi','vendredi','samedi','dimanche']</param> + </check> + + <check name="valid_entier" target="smartmontools_immediate_data_collect_hours"> + <param name="mini">0</param> + <param name="maxi">23</param> + </check> + + <!-- + TEST COURT + --> + <check name="valid_enum" target="smartmontools_short_months"> + <param>['tous','janvier','fevrier','mars','avri','mai','juin','juillet','aout','septembre','octobre','novembre','decembre']</param> + </check> + + <check name="valid_entier" target="smartmontools_short_days"> + <param name="mini">0</param> + <param name="maxi">31</param> + </check> + + <check name="valid_enum" target="smartmontools_short_week_days"> + <param>['tous','lundi','mardi','mercredi','jeudi','vendredi','samedi','dimanche']</param> + </check> + + <check name="valid_entier" target="smartmontools_short_hours"> + <param name="mini">0</param> + <param name="maxi">23</param> + </check> + + <!-- + TEST LONG + --> + <check name="valid_enum" target="smartmontools_long_months"> + <param>['tous','janvier','fevrier','mars','avri','mai','juin','juillet','aout','septembre','octobre','novembre','decembre']</param> + </check> + + <check name="valid_entier" target="smartmontools_long_days"> + <param name="mini">0</param> + <param name="maxi">31</param> + </check> + + <check name="valid_enum" target="smartmontools_long_week_days"> + <param>['tous','lundi','mardi','mercredi','jeudi','vendredi','samedi','dimanche']</param> + </check> + + <check name="valid_entier" target="smartmontools_long_hours"> + <param name="mini">0</param> + <param name="maxi">23</param> + </check> + + <!-- + TEST DE TRANSPORT + --> + <check name="valid_enum" target="smartmontools_conveyance_months"> + <param>['tous','janvier','fevrier','mars','avri','mai','juin','juillet','aout','septembre','octobre','novembre','decembre']</param> + </check> + + <check name="valid_entier" target="smartmontools_conveyance_days"> + <param name="mini">0</param> + <param name="maxi">31</param> + </check> + + <check name="valid_enum" target="smartmontools_conveyance_week_days"> + <param>['tous','lundi','mardi','mercredi','jeudi','vendredi','samedi','dimanche']</param> + </check> + + <check name="valid_entier" target="smartmontools_conveyance_hours"> + <param name="mini">0</param> + <param name="maxi">23</param> + </check> + + <!-- <condition name="hidden_if_not_in" source="smartmontools_devs_type"> --> + <!-- <param>3ware,N</param> --> + <!-- <param>cciss,N</param> --> + <!-- <target type="variable">smartmontools_devs_type_number</target> --> + <!-- </condition> --> + + <!-- <group master="smartmontools_devs_type"> --> + <!-- <slave>smartmontools_devs_type_number</slave> --> + <!-- </group> --> + + <!-- <check name="valid_entier" target="smartmontools_devs_type_number"> --> + <!-- <param name="mini">0</param> --> + <!-- <param name="maxi">15</param> --> + <!-- </check> --> + + <!-- + TEMPERATURE + --> + + <condition name="hidden_if_in" source="smartmontools_track_temp"> + <param>non</param> + <target type="variable">smartmontools_temp_diff</target> + <target type="variable">smartmontools_temp_info</target> + <target type="variable">smartmontools_temp_crit</target> + </condition> + + + <check name="valid_entier" target="smartmontools_temp_diff"> + <param name="mini">0</param> + <param name="maxi">65</param> + </check> + <check name="valid_entier" target="smartmontools_temp_info"> + <param name="mini">0</param> + <param name="maxi">65</param> + </check> + <check name="valid_entier" target="smartmontools_temp_crit"> + <param name="mini">0</param> + <param name="maxi">65</param> + </check> + + </constraints> + + <help> + + <family name="smartmontools"> + Supervision SMART des + disques. http://fr.wikipedia.org/wiki/Self-Monitoring,_Analysis_and_Reporting_Technology. + </family> + + <variable name="activer_smartmontools"> + Activer le service de supervision SMART + (smartmontools). Valeur par défaut: "non". + </variable> + + <variable name="smartmontools_mail"> + Activer l'envois des mails lors d'alertes. Valeur par + défaut: "non". + </variable> + + <variable name="smartmontools_mail_dests"> + Liste des adresses mails destinataires des alertes + SMART. Valeur par défaut: "". + </variable> + + <variable name="smartmontools_auto_detect"> + Activer l’autodétection des disques. Smartd cherchera + automatiquement tous les périphériques block. Valeur par + défaut: "oui". + </variable> + + <variable name="smartmontools_devs"> + Liste des périphériques supervisés par le service + SMART. Seuls les peripheriques de disque internes ont une + chance d'etre compatible SMART. Valeur par défaut: + "/dev/sda". + </variable> + + <variable name="smartmontools_devs_type"> + Type des périphériques supervisés par le service SMART. Les + périphériques peuvent etre du type "ATA" (ata), "SCSI" + (scsi), "SATA" (sat), "MARVELL" (marvell). Valeur par + défaut: "sat". + </variable> + + <variable name="smartmontools_period_alerts"> + Liste des durées entre deux mesures d'alerte. Une mesure + par disque. Le maximum est d'une mesure par jour + (86400s). Valeur par défaut: "60". + </variable> + + <variable name="smartmontools_period_attrs"> + Liste des durées entre deux mesures des attributs. Une + mesure par disque. Le maximum est d'une mesure par jour + (86400s). Valeur par défaut: "7200" (2h). + </variable> + + <variable name="smartmontools_devs_attrs_fail_ignore"> + Liste des identifiants, de 1 à 255, des attributs SMART à + ignorer lors de la vérification des erreurs ou de l'usage + des périphériques. Cette liste est commune à tous les + périphériques. Valeur par défaut: "". + </variable> + + <variable name="smartmontools_devs_attrs_change_ignore"> + Liste des identifiants, de 1 à 255, des attributs SMART + dont les changements de valeur sont à ignorer. Cette liste + est commune à tous les périphériques. Valeur par défaut: + "". + </variable> + + <variable name="smartmontools_attr_warn"> + Écart entre la valeur d'un attribut et son seuil générant + un avertissement. Cela permet de voir lorsque des + attributs se rapprochent de la valeur seuil sans la + dépasser. Valeur par défaut: "1". + </variable> + + <variable name="smartmontools_autosave"> + Activer la sauvegarde automatique des attributs + SMART. Valeur par défaut: "oui". + </variable> + + <variable name="smartmontools_data_collect_online"> + Activer la collecte en ligne des données SMART (option + smartctl "-s"). Incorrectement appellee "online test", ces + collectes n'ont aucun impacte sur les performances. Il est + possible de repérer quels attributs sont mis à jours par + cette option dans la page de l'agent zephir de + surveillance des attributes SMART: colonne "mise à jour" = + "Always". Valeur par défaut: "oui". + </variable> + + <variable name="smartmontools_data_collect_offline"> + Activer la collecte des données SMART (option smartd + "-o"). Incorrectement appellee "offline test", ces + collectes ont possiblement un impacte sur les + performances, bien que la collecte doit s’arrêter lors + d’activités du disque. Il est possible de repérer quels + attributs sont mis à jours par cette option dans la page + de l'agent zephir de surveillance des attributes SMART: + colonne "mise à jour" = "Offline". Valeur par défaut: + "oui". + </variable> + + <!-- + COLLECTE DE DONNÉES IMMÉDIATE + --> + <variable name="smartmontools_immediate_data_collect_self_test"> + Activer la collecte immédiate des données hors + ligne. Durée généralement inférieure a 10mn. Valeur par + défaut: "oui". + </variable> + + <variable name="smartmontools_immediate_data_collect_months"> + Liste des mois ou programmer la collecte immédiate des + données hors ligne. Valeur par défaut: "tous". + </variable> + + <variable name="smartmontools_immediate_data_collect_days"> + Liste des numeros de jours du mois ou programmer la + collecte immédiate des données hors ligne. Valeur par + défaut: "0" (tous les jours). + </variable> + + <variable name="smartmontools_immediate_data_collect_week_days"> + Liste des jours de la semaine ou programmer la collecte + immédiate des données hors ligne. Valeur par défaut: + "tous". + </variable> + + <variable name="smartmontools_immediate_data_collect_hours"> + Liste des heures de la journée ou programmer la collecte + immédiate des données hors ligne. Valeur par défaut: "6, + 12, 18". + </variable> + + <!-- + TEST COURT + --> + <variable name="smartmontools_short_self_test"> + Activer les tests courts. Durée généralement inférieure a + 10mn. Valeur par défaut: "oui". + </variable> + + <variable name="smartmontools_short_months"> + Liste des mois ou programmer les tests courts. Valeur par + défaut: "tous". + </variable> + + <variable name="smartmontools_short_days"> + Liste des numeros de jours du mois ou programmer les tests + courts. Valeur par défaut: "0" (tous les jours). + </variable> + + <variable name="smartmontools_short_week_days"> + Liste des jours de la semaine ou programmer les tests + courts. Valeur par défaut: "tous". + </variable> + + <variable name="smartmontools_short_hours"> + Liste des heures de la journée ou programmer les tests + courts. Valeur par défaut: "4, 20". + </variable> + + <!-- + TEST LONG + --> + <variable name="smartmontools_long_self_test"> + Activer les tests longs. Durée généralement de plusieurs + dizaine de minutes. Valeur par défaut: "oui". + </variable> + + <variable name="smartmontools_long_months"> + Liste des mois ou programmer les tests longs. Valeur par + défaut: "tous". + </variable> + + <variable name="smartmontools_long_days"> + Liste des numeros de jours du mois ou programmer les tests + longs. Valeur par défaut: "0" (tous les jours). + </variable> + + <variable name="smartmontools_long_week_days"> + Liste des jours de la semaine ou programmer les tests + longs. Valeur par défaut: "dimanche". + </variable> + + <variable name="smartmontools_long_hours"> + Liste des heures de la journée ou programmer les tests + longs. Valeur par défaut: "22". + </variable> + + <!-- + TEST DE TRANSPORT + --> + <variable name="smartmontools_conveyance_self_test"> + Activer les tests de transports (uniquement ATA). Ce test + a pour but de desceller les problèmes liées au transport + des disques. Durée de généralement de quelques + minutes. Valeur par défaut: "oui". + </variable> + + <variable name="smartmontools_conveyance_months"> + Liste des mois ou programmer les tests de + transports. Valeur par défaut: "tous". + </variable> + + <variable name="smartmontools_conveyance_days"> + Liste des numeros de jours du mois ou programmer les tests + de transports. Valeur par défaut: "1" (tous les jours). + </variable> + + <variable name="smartmontools_conveyance_week_days"> + Liste des jours de la semaine ou programmer les tests de + transports. Valeur par défaut: "tous". + </variable> + + <variable name="smartmontools_conveyance_hours"> + Liste des heures de la journée ou programmer les tests de + transports. Valeur par défaut: "23". + </variable> + + <variable name="smartmontools_track_temp"> + Activer la supervision de la température des + disques. SMART peut rapporter des alertes sur la + température. Valeur par défaut: "oui". + </variable> + + <variable name="smartmontools_temp_diff"> + Écart de température générant une alerte SMART. Si la + température entre deux mesures dévie d'au moins + smartmontools_temp_diff alors une alerte est générée. La + valeur "0" désactive cette fonctionnalite. Valeur par + défaut: "0". + </variable> + + <variable name="smartmontools_temp_info"> + Limite de température en dégrée celcius entrainant une + alerte de type INFO dans les journaux systèmes. Valeur par + défaut: "35". + </variable> + + <variable name="smartmontools_temp_crit"> + Limite critique de température en dégrée celcius générant + une alerte de type critique et un mail s'il est + activé. Valeur par défaut: "45". + </variable> + + </help> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-smartmontools/files/etc/smartmontools/run.d/05zephir-smart b/seed/release/eole-2.7/2.7.1/applicationservice/eole-smartmontools/files/etc/smartmontools/run.d/05zephir-smart new file mode 100644 index 0000000000000000000000000000000000000000..2f9a379bf81c98786bb0d0ad74ec5da71bf16840 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-smartmontools/files/etc/smartmontools/run.d/05zephir-smart @@ -0,0 +1,18 @@ +#!/bin/bash -e + +SHM=/run/shm +STATUS_D=${SHM}/smart.d/ + +test ! -w "$SHM" && exit 1 +test ! -d "$STATUS_D" && mkdir "$STATUS_D" + +DEVICE=$(echo $SMARTD_DEVICE | tr '/' '_') +STATUS_F="$STATUS_D/$DEVICE" + +cat <<EOF >> $STATUS_F 2>&1 +FAILTYPE: $SMARTD_FAILTYPE +DEVICE: $SMARTD_DEVICE +TFIRSTEPOCH: $SMARTD_TFIRSTEPOCH +MESSAGE: $SMARTD_MESSAGE + +EOF diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-smartmontools/postservices/eole-smartmontools b/seed/release/eole-2.7/2.7.1/applicationservice/eole-smartmontools/postservices/eole-smartmontools new file mode 100644 index 0000000000000000000000000000000000000000..707ab54207c779476b9beaac373854e4546bd371 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-smartmontools/postservices/eole-smartmontools @@ -0,0 +1,25 @@ +#!/bin/bash + +ACTIVER_SMARTMONTOOLS=$(CreoleGet activer_smartmontools) + +if [ -z "$ACTIVER_SMARTMONTOOLS" ] || [ "$ACTIVER_SMARTMONTOOLS" == "non" ] +then + exit 0 +fi + +. /usr/lib/eole/ihm.sh + +# Associative array to map oui/on non/off +declare -A ONOFF +ONOFF=( [non]=off [oui]=on ) + +auto_save="${ONOFF[$(CreoleGet smartmontools_autosave)]}" +data_collect_online="${ONOFF[$(CreoleGet smartmontools_data_collect_online)]}" +data_collect_offline="${ONOFF[$(CreoleGet smartmontools_data_collect_offline)]}" + +for disk in $(CreoleGet smartmontools_devs) +do + smartctl -s "${data_collect_online}" -o "${data_collect_offline}" -S "${auto_save}" \ + "${disk}" > /dev/null 2>&1 \ + || EchoRouge "Problème d'accès au disque $disk: pas de support SMART ?" +done diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-smartmontools/posttemplates/eole-smartmontools b/seed/release/eole-2.7/2.7.1/applicationservice/eole-smartmontools/posttemplates/eole-smartmontools new file mode 100644 index 0000000000000000000000000000000000000000..6bf758136c1e53ea83ee5b14391f2ad1c3b7e4c7 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-smartmontools/posttemplates/eole-smartmontools @@ -0,0 +1,10 @@ +#!/bin/bash + +default=/etc/default/smartmontools + +if [ "$(CreoleGet activer_smartmontools)" == "oui" ] +then + sed -i 's/^#start_smartd/start_smartd/' $default +else + sed -i 's/^start_smartd/#start_smartd/' $default +fi diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-smartmontools/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-smartmontools/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..35f765f615d9532d95f1e807162760c66b035a3e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-smartmontools/service.yml @@ -0,0 +1,35 @@ +format: '0.1' +name: eole-smartmontools +version: |- + 2.4.0-4 +description: |- + configuration Eole du paquet smartmontools + Configuration EOLE de l’utilitaire smartmontools de surveillance des + disques. + . + Ce paquet fourni les dictionnaires, template et scripts. +depends: [] +packages: + - smartmontools +dictionaries: + - 02_smartmontools.xml +extra_dictionaries: {} +templates: + - smartd.conf + - smartmontools.mailscript + - smartmontools.default +creole_funcs: + - eole_smartmontools.py +preservices: [] +postservices: + - eole-smartmontools +pretemplates: [] +posttemplates: + - eole-smartmontools +files: + /etc/smartmontools/run.d/05zephir-smart: + owner: root + group: root + mode: '0755' +excluding_regexp: + /usr/share/doc: 4 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-smartmontools/templates/smartd.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-smartmontools/templates/smartd.conf new file mode 100644 index 0000000000000000000000000000000000000000..63c3cc99db408c77931caa8718a88e6fe4bef140 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-smartmontools/templates/smartd.conf @@ -0,0 +1,85 @@ +%set %%onoff={'oui' : 'on', 'non' : 'off'} +# /etc/smartd.conf +# Configuration file for smartd. Use "man smartd.conf" for more information. + +# Home page is: http://smartmontools.sourceforge.net + +# smartd will re-read the configuration file if it receives a HUP +# signal + +# The file gives a list of devices to monitor using smartd, with one +# device per line. Text after a hash (#) is ignored, and you may use +# spaces and tabs for white space. You may use '\' to continue lines. + +# You can usually identify which hard disks are on your system by +# looking in /proc/ide and in /proc/scsi. +%set %%data_collect = '' +%set %%short_test = '' +%set %%long_test = '' +%set %%conveyance_test = '' +µµµµµµµµµµ IMMEDIATE DATA COLLECT +%if %%smartmontools_immediate_data_collect_self_test == 'oui' + %set %%data_collect += 'O' + %%calc_smart_test_regex('immediate_data_collect') +%end if +µµµµµµµµµµ SHORT TEST +%if %%smartmontools_short_self_test == 'oui' + %set %%short_test += 'S' + %%calc_smart_test_regex('short') +%end if +µµµµµµµµµµ LONG TEST +%if %%smartmontools_long_self_test == 'oui' + %set %%long_test += 'L' + %%calc_smart_test_regex('long') +%end if +µµµµµµµµµµ CONVEYANCE TEST +%if %%smartmontools_conveyance_self_test == 'oui' + %set %%conveyance_test += 'C' + %%calc_smart_test_regex('conveyance') +%end if +µµµµµµµµµµ TEST REGEX +%set %%self_tests = '' +%if %%data_collect != '' + %set %%self_tests = %%data_collect +%end if +%if %%short_test != '' + %if %%self_tests != '' + %set %%self_tests += '|' + %%short_test + %else + %set %%self_tests = %%short_test + %end if +%end if +%if %%long_test != '' + %if %%self_tests != '' + %set %%self_tests += '|' + %%long_test + %else + %set %%self_tests = %%long_test + %end if +%end if +%if %%conveyance_test != '' + %if %%self_tests != '' + %set %%self_tests += '|' + %%conveyance_test + %else + %set %%self_tests = %%conveyance_test + %end if +%end if +%if %%self_tests != '' + %set %%self_tests = ' -s (' + %%self_tests + ')' +%end if +%set %%devopts = '-a' +%set %%devopts += ' -S ' + %%onoff[%%smartmontools_autosave] +%set %%devopts += ' -o ' + %%onoff[%%smartmontools_data_collect_offline] +%if %%smartmontools_track_temp == 'oui' + %set %%devopts += ' -W {0},{1},{2}'.format(%%smartmontools_temp_diff, %%smartmontools_temp_info, %%smartmontools_temp_crit) +%end if +%for %%ignore in %%smartmontools_devs_attrs_fail_ignore + %set %%devopts += ' -i {0}'.format(%%ignore) +%end for +%for %%ignore in %%smartmontools_devs_attrs_change_ignore + %set %%devopts += ' -I {0}'.format(%%ignore) +%end for +%set %%devopts += %%self_tests +%set %%devopts += ' -m root -M exec /usr/share/smartmontools/smartd-runner' +%if %%smartmontools_auto_detect == 'oui' +DEVICESCAN %%devopts +%else + %for %%dev in %%smartmontools_devs +%%dev -d %%dev.smartmontools_devs_type %%devopts + %end for +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-smartmontools/templates/smartmontools.default b/seed/release/eole-2.7/2.7.1/applicationservice/eole-smartmontools/templates/smartmontools.default new file mode 100644 index 0000000000000000000000000000000000000000..ac2a830b589d7284e86f2f34cae4e591a1f7c6c4 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-smartmontools/templates/smartmontools.default @@ -0,0 +1,13 @@ +%set %%yesno={'oui' : 'yes', 'non' : 'no'} +# Defaults for smartmontools initscript (/etc/init.d/smartmontools) +# This is a POSIX shell fragment + +# List of devices you want to explicitly enable S.M.A.R.T. for +# Not needed (and not recommended) if the device is monitored by smartd +#enable_smart="/dev/hda /dev/hdb" + +# uncomment to start smartd on system startup +start_smartd=%%yesno[%%activer_smartmontools] + +# uncomment to pass additional options to smartd on startup +#smartd_opts="--interval=1800" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-smartmontools/templates/smartmontools.mailscript b/seed/release/eole-2.7/2.7.1/applicationservice/eole-smartmontools/templates/smartmontools.mailscript new file mode 100644 index 0000000000000000000000000000000000000000..e859fec7c746e664f9a30c516daaf431dbe23408 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-smartmontools/templates/smartmontools.mailscript @@ -0,0 +1,30 @@ +#!/bin/bash + +# Send mail if /usr/sbin/bsmtp exists or exit +[ -x /usr/bin/mail ] || exit 1 + +[ -x /usr/bin/CreoleGet ] || exit 1 + +passerelle_smtp=$(CreoleGet passerelle_smtp) +test -z "${passerelle_smtp}" && exit 0 + +smartmontools_mail=$(CreoleGet smartmontools_mail) +test "${smartmontools_mail}" == "non" && exit 0 + +smartmontools_mail_dests=$(CreoleGet smartmontools_mail_dests) +test -z "${smartmontools_mail_dests}" && exit 1 + +nom_machine=$(CreoleGet nom_machine) +nom_domaine_local=$(CreoleGet nom_domaine_local) + +system_mail_from=$(CreoleGet system_mail_from) + +if test -z $system_mail_from +then + system_mail_from="smart@${nom_machine}.${nom_domaine_local}" +fi + +/usr/sbin/smartctl -a -d $SMARTD_DEVICETYPE $SMARTD_DEVICE >> $1 2>&1 + +cat $1 | /usr/bin/mail -r "$system_mail_from" \ + -s "$3" "${smartmontools_mail_dests}" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-snmpd/dictionaries/00_eole-snmpd_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-snmpd/dictionaries/00_eole-snmpd_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..adeb13f51088529a39245a12cde1747efb903d63 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-snmpd/dictionaries/00_eole-snmpd_packages.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>snmpd</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-snmpd/dictionaries/20_snmpd.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-snmpd/dictionaries/20_snmpd.xml new file mode 100644 index 0000000000000000000000000000000000000000..11a08eee52dd8596a6bc709f0d91d7a284e1ee3e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-snmpd/dictionaries/20_snmpd.xml @@ -0,0 +1,61 @@ +<?xml version='1.0' encoding='utf-8'?> + +<creole> + <files> + <service servicelist='snmpd'>snmpd</service> + <file filelist='snmpd' name='/etc/snmp/snmpd.conf'/> + <file filelist='snmpd' name='/etc/default/snmpd' source='snmpd.default'/> + <service_access service='snmpd'> + <port>161</port> + <port protocol='udp'>161</port> + <tcpwrapper>snmpd</tcpwrapper> + </service_access> + <service_restriction service='snmpd'> + <ip interface='auto' netmask='snmp_allow_mask' netmask_type='SymLinkOption' ip_type='SymLinkOption'>snmp_allow_ip</ip> + </service_restriction> + </files> + <variables> + <family name='services'> + <variable name='activer_snmpd' type='oui/non' description="Activer le service SNMP"> + <value>non</value> + </variable> + </family> + <family name='snmpd' icon='exchange'> + <variable name='snmp_allow_ip' type='network' description="Adresse autorisée à se connecter au démon SNMP" multi='True' mandatory='True'/> + <variable name='snmp_allow_mask' type='netmask' description="Masque associé à l'adresse"> + <value>255.255.255.255</value> + </variable> + <variable name='snmp_community' type='filename' description="Nom de la communauté"> + <value>public</value> + </variable> + </family> + <separators/> + </variables> + + <constraints> + <condition name='disabled_if_in' source='activer_snmpd'> + <param>non</param> + <target type='filelist'>snmpd</target> + <target type='servicelist'>snmpd</target> + <target type='family'>snmpd</target> + </condition> + <group master='snmp_allow_ip'> + <slave>snmp_allow_mask</slave> + <slave>snmp_community</slave> + </group> + <check name='valid_networknetmask' target='snmp_allow_mask'> + <param type='eole'>snmp_allow_ip</param> + </check> + </constraints> + + <help> + <variable name='activer_snmpd'>SNMP (Simple Network Management Protocol) est un protocole d'administration distante ou locale, utilisé sur les réseaux de type Internet</variable> + <family name='snmpd'>Configuration des accès SNMP</family> + <variable name='snmp_allow_ip'>Exemple : adresse IP de la console de supervision SNMP</variable> + <variable name='snmp_allow_mask'>Masque de sous-réseau associé à l'adresse : pour une machine isolée, utiliser 255.255.255.255</variable> + <variable name='snmp_community'>La communauté permet de créer des domaines d'administration</variable> + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-snmpd/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-snmpd/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..4054147d2ab30b4579fa8b35f0efa68695c0d4a6 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-snmpd/service.yml @@ -0,0 +1,26 @@ +format: '0.1' +name: eole-snmpd +version: |- + 2.7.0-1 +description: |- + Templates et dictionnaires pour SNMP EOLE + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: + - eole-server +packages: + - snmpd +dictionaries: + - 20_snmpd.xml +extra_dictionaries: {} +templates: + - snmpd.conf + - snmpd.default +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: [] +files: {} +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-snmpd/templates/snmpd.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-snmpd/templates/snmpd.conf new file mode 100644 index 0000000000000000000000000000000000000000..ee1bf8e8ed4e1078112fa448e827ede1cdbbcd41 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-snmpd/templates/snmpd.conf @@ -0,0 +1,398 @@ +############################################################################### +# Access Control +############################################################################### + +# YOU SHOULD CHANGE THE "COMMUNITY" TOKEN BELOW TO A NEW KEYWORD ONLY +# KNOWN AT YOUR SITE. YOU *MUST* CHANGE THE NETWORK TOKEN BELOW TO +# SOMETHING REFLECTING YOUR LOCAL NETWORK ADDRESS SPACE. + +# By far, the most common question I get about the agent is "why won't +# it work?", when really it should be "how do I configure the agent to +# allow me to access it?" +# +# By default, the agent responds to the "public" community for read +# only access, if run out of the box without any configuration file in +# place. The following examples show you other ways of configuring +# the agent so that you can change the community names, and give +# yourself write access as well. +# +# The following lines change the access permissions of the agent so +# that the COMMUNITY string provides read-only access to your entire +# NETWORK (EG: 10.10.10.0/24), and read/write access to only the +# localhost (127.0.0.1, not its real ipaddress). +# +# For more information, read the FAQ as well as the snmpd.conf(5) +# manual page. + +#### +# First, map the community name (COMMUNITY) into a security name +# (local and mynetwork, depending on where the request is coming +# from): + +# sec.name source community +#com2sec paranoid default public +%for adresse in %%snmp_allow_ip +com2sec readonly %%adresse/%%adresse.snmp_allow_mask %%adresse.snmp_community +%end for +#com2sec readwrite default private + +#### +# Second, map the security names into group names: + +# sec.model sec.name +group MyROGroup v1 readonly +group MyROGroup v2c readonly +group MyROGroup usm readonly + +#### +# Third, create a view for us to let the groups have rights to: + +# incl/excl subtree mask +view all included .1 80 +#view system included .1.3.6.1.2.1.1 +#view system included .iso.org.dod.internet.mgmt.mib-2.system + +#### +# Finally, grant the 2 groups access to the 1 view with different +# write permissions: + +# context sec.model sec.level match read write notif +#access MyROSystem "" any noauth exact system none none +access MyROGroup "" any noauth exact all none none +#access MyRWGroup "" any noauth exact all all none + +# ----------------------------------------------------------------------------- + +############################################################################### +# Proxy support +# + +# This token specifies that any incoming requests under OID should be +# proxied on to HOST instead. Optionally, relocate the local OID tree +# to the new location at the REMOTEOID. +# To authenticate to HOST you should use the appropriate set of +# SNMPCMD ARGS. See the snmpcmd man page for details. +# Examples: +# proxy -v 1 -c public remotehost .1.3.6.1.4.1.2021 +# proxy -v 3 -l noAuthNoPriv -u user remotehost .1.3.6.1.3.10 .1.3.6.1.2.1.1 + +proxy -v 2c -c public 127.0.0.1:3401 .1.3.6.1.4.1.3495 + + +############################################################################### +# System contact information +# + +# It is also possible to set the sysContact and sysLocation system +# variables through the snmpd.conf file. **PLEASE NOTE** that setting +# the value of these objects here makes these objects READ-ONLY +# (regardless of any access control settings). Any attempt to set the +# value of an object whose value is given here will fail with an error +# status of notWritable. + +#syslocation Unknown (configure /etc/snmp/snmpd.local.conf) +#syscontact Root <root@localhost> (configure /etc/snmp/snmpd.local.conf) + +# Example output of snmpwalk: +# % snmpwalk -v 1 -c public localhost system +# system.sysDescr.0 = "SunOS name sun4c" +# system.sysObjectID.0 = OID: enterprises.ucdavis.ucdSnmpAgent.sunos4 +# system.sysUpTime.0 = Timeticks: (595637548) 68 days, 22:32:55 +# system.sysContact.0 = "Me <me@somewhere.org>" +# system.sysName.0 = "name" +# system.sysLocation.0 = "Right here, right now." +# system.sysServices.0 = 72 + + +# ----------------------------------------------------------------------------- + + +############################################################################### +# Process checks. +# +# The following are examples of how to use the agent to check for +# processes running on the host. The syntax looks something like: +# +# proc NAME [MAX=0] [MIN=0] +# +# NAME: the name of the process to check for. It must match +# exactly (ie, http will not find httpd processes). +# MAX: the maximum number allowed to be running. Defaults to 0. +# MIN: the minimum number to be running. Defaults to 0. + +# +# Examples: +# + +# Make sure mountd is running +#proc mountd + +# Make sure there are no more than 4 ntalkds running, but 0 is ok too. +#proc ntalkd 4 + +# Make sure at least one sendmail, but less than or equal to 10 are running. +#proc sendmail 10 1 + +# A snmpwalk of the prTable would look something like this: +# +# % snmpwalk -v 1 -c public localhost .1.3.6.1.4.1.2021.2 +# enterprises.ucdavis.procTable.prEntry.prIndex.1 = 1 +# enterprises.ucdavis.procTable.prEntry.prIndex.2 = 2 +# enterprises.ucdavis.procTable.prEntry.prIndex.3 = 3 +# enterprises.ucdavis.procTable.prEntry.prNames.1 = "mountd" +# enterprises.ucdavis.procTable.prEntry.prNames.2 = "ntalkd" +# enterprises.ucdavis.procTable.prEntry.prNames.3 = "sendmail" +# enterprises.ucdavis.procTable.prEntry.prMin.1 = 0 +# enterprises.ucdavis.procTable.prEntry.prMin.2 = 0 +# enterprises.ucdavis.procTable.prEntry.prMin.3 = 1 +# enterprises.ucdavis.procTable.prEntry.prMax.1 = 0 +# enterprises.ucdavis.procTable.prEntry.prMax.2 = 4 +# enterprises.ucdavis.procTable.prEntry.prMax.3 = 10 +# enterprises.ucdavis.procTable.prEntry.prCount.1 = 0 +# enterprises.ucdavis.procTable.prEntry.prCount.2 = 0 +# enterprises.ucdavis.procTable.prEntry.prCount.3 = 1 +# enterprises.ucdavis.procTable.prEntry.prErrorFlag.1 = 1 +# enterprises.ucdavis.procTable.prEntry.prErrorFlag.2 = 0 +# enterprises.ucdavis.procTable.prEntry.prErrorFlag.3 = 0 +# enterprises.ucdavis.procTable.prEntry.prErrMessage.1 = "No mountd process running." +# enterprises.ucdavis.procTable.prEntry.prErrMessage.2 = "" +# enterprises.ucdavis.procTable.prEntry.prErrMessage.3 = "" +# enterprises.ucdavis.procTable.prEntry.prErrFix.1 = 0 +# enterprises.ucdavis.procTable.prEntry.prErrFix.2 = 0 +# enterprises.ucdavis.procTable.prEntry.prErrFix.3 = 0 +# +# Note that the errorFlag for mountd is set to 1 because one is not +# running (in this case an rpc.mountd is, but thats not good enough), +# and the ErrMessage tells you what's wrong. The configuration +# imposed in the snmpd.conf file is also shown. +# +# Special Case: When the min and max numbers are both 0, it assumes +# you want a max of infinity and a min of 1. +# + + +# ----------------------------------------------------------------------------- + + +############################################################################### +# Executables/scripts +# + +# +# You can also have programs run by the agent that return a single +# line of output and an exit code. Here are two examples. +# +# exec NAME PROGRAM [ARGS ...] +# +# NAME: A generic name. +# PROGRAM: The program to run. Include the path! +# ARGS: optional arguments to be passed to the program + +# a simple hello world +#exec echotest /bin/echo hello world + +# Run a shell script containing: +# +# #!/bin/sh +# echo hello world +# echo hi there +# exit 35 +# +# Note: this has been specifically commented out to prevent +# accidental security holes due to someone else on your system writing +# a /tmp/shtest before you do. Uncomment to use it. +# +#exec shelltest /bin/sh /tmp/shtest + +# Then, +# % snmpwalk -v 1 -c public localhost .1.3.6.1.4.1.2021.8 +# enterprises.ucdavis.extTable.extEntry.extIndex.1 = 1 +# enterprises.ucdavis.extTable.extEntry.extIndex.2 = 2 +# enterprises.ucdavis.extTable.extEntry.extNames.1 = "echotest" +# enterprises.ucdavis.extTable.extEntry.extNames.2 = "shelltest" +# enterprises.ucdavis.extTable.extEntry.extCommand.1 = "/bin/echo hello world" +# enterprises.ucdavis.extTable.extEntry.extCommand.2 = "/bin/sh /tmp/shtest" +# enterprises.ucdavis.extTable.extEntry.extResult.1 = 0 +# enterprises.ucdavis.extTable.extEntry.extResult.2 = 35 +# enterprises.ucdavis.extTable.extEntry.extOutput.1 = "hello world." +# enterprises.ucdavis.extTable.extEntry.extOutput.2 = "hello world." +# enterprises.ucdavis.extTable.extEntry.extErrFix.1 = 0 +# enterprises.ucdavis.extTable.extEntry.extErrFix.2 = 0 + +# Note that the second line of the /tmp/shtest shell script is cut +# off. Also note that the exit status of 35 was returned. + +# ----------------------------------------------------------------------------- + + +############################################################################### +# disk checks +# + +# The agent can check the amount of available disk space, and make +# sure it is above a set limit. + +# disk PATH [MIN=DEFDISKMINIMUMSPACE] +# +# PATH: mount path to the disk in question. +# MIN: Disks with space below this value will have the Mib's errorFlag set. +# Default value = DEFDISKMINIMUMSPACE. + +# Check the / partition and make sure it contains at least 10 megs. + +#disk / 10000 + +# % snmpwalk -v 1 -c public localhost .1.3.6.1.4.1.2021.9 +# enterprises.ucdavis.diskTable.dskEntry.diskIndex.1 = 0 +# enterprises.ucdavis.diskTable.dskEntry.diskPath.1 = "/" Hex: 2F +# enterprises.ucdavis.diskTable.dskEntry.diskDevice.1 = "/dev/dsk/c201d6s0" +# enterprises.ucdavis.diskTable.dskEntry.diskMinimum.1 = 10000 +# enterprises.ucdavis.diskTable.dskEntry.diskTotal.1 = 837130 +# enterprises.ucdavis.diskTable.dskEntry.diskAvail.1 = 316325 +# enterprises.ucdavis.diskTable.dskEntry.diskUsed.1 = 437092 +# enterprises.ucdavis.diskTable.dskEntry.diskPercent.1 = 58 +# enterprises.ucdavis.diskTable.dskEntry.diskErrorFlag.1 = 0 +# enterprises.ucdavis.diskTable.dskEntry.diskErrorMsg.1 = "" + +# ----------------------------------------------------------------------------- + + +############################################################################### +# load average checks +# + +# load [1MAX=DEFMAXLOADAVE] [5MAX=DEFMAXLOADAVE] [15MAX=DEFMAXLOADAVE] +# +# 1MAX: If the 1 minute load average is above this limit at query +# time, the errorFlag will be set. +# 5MAX: Similar, but for 5 min average. +# 15MAX: Similar, but for 15 min average. + +# Check for loads: +#load 12 14 14 + +# % snmpwalk -v 1 -c public localhost .1.3.6.1.4.1.2021.10 +# enterprises.ucdavis.loadTable.laEntry.loadaveIndex.1 = 1 +# enterprises.ucdavis.loadTable.laEntry.loadaveIndex.2 = 2 +# enterprises.ucdavis.loadTable.laEntry.loadaveIndex.3 = 3 +# enterprises.ucdavis.loadTable.laEntry.loadaveNames.1 = "Load-1" +# enterprises.ucdavis.loadTable.laEntry.loadaveNames.2 = "Load-5" +# enterprises.ucdavis.loadTable.laEntry.loadaveNames.3 = "Load-15" +# enterprises.ucdavis.loadTable.laEntry.loadaveLoad.1 = "0.49" Hex: 30 2E 34 39 +# enterprises.ucdavis.loadTable.laEntry.loadaveLoad.2 = "0.31" Hex: 30 2E 33 31 +# enterprises.ucdavis.loadTable.laEntry.loadaveLoad.3 = "0.26" Hex: 30 2E 32 36 +# enterprises.ucdavis.loadTable.laEntry.loadaveConfig.1 = "12.00" +# enterprises.ucdavis.loadTable.laEntry.loadaveConfig.2 = "14.00" +# enterprises.ucdavis.loadTable.laEntry.loadaveConfig.3 = "14.00" +# enterprises.ucdavis.loadTable.laEntry.loadaveErrorFlag.1 = 0 +# enterprises.ucdavis.loadTable.laEntry.loadaveErrorFlag.2 = 0 +# enterprises.ucdavis.loadTable.laEntry.loadaveErrorFlag.3 = 0 +# enterprises.ucdavis.loadTable.laEntry.loadaveErrMessage.1 = "" +# enterprises.ucdavis.loadTable.laEntry.loadaveErrMessage.2 = "" +# enterprises.ucdavis.loadTable.laEntry.loadaveErrMessage.3 = "" + +# ----------------------------------------------------------------------------- + + +############################################################################### +# Extensible sections. +# + +# This alleviates the multiple line output problem found in the +# previous executable mib by placing each mib in its own mib table: + +# Run a shell script containing: +# +# #!/bin/sh +# echo hello world +# echo hi there +# exit 35 +# +# Note: this has been specifically commented out to prevent +# accidental security holes due to someone else on your system writing +# a /tmp/shtest before you do. Uncomment to use it. +# +# exec .1.3.6.1.4.1.2021.50 shelltest /bin/sh /tmp/shtest + +# % snmpwalk -v 1 -c public localhost .1.3.6.1.4.1.2021.50 +# enterprises.ucdavis.50.1.1 = 1 +# enterprises.ucdavis.50.2.1 = "shelltest" +# enterprises.ucdavis.50.3.1 = "/bin/sh /tmp/shtest" +# enterprises.ucdavis.50.100.1 = 35 +# enterprises.ucdavis.50.101.1 = "hello world." +# enterprises.ucdavis.50.101.2 = "hi there." +# enterprises.ucdavis.50.102.1 = 0 + +# Now the Output has grown to two lines, and we can see the 'hi +# there.' output as the second line from our shell script. +# +# Note that you must alter the mib.txt file to be correct if you want +# the .50.* outputs above to change to reasonable text descriptions. + +# Other ideas: +# +# exec .1.3.6.1.4.1.2021.51 ps /bin/ps +# exec .1.3.6.1.4.1.2021.52 top /usr/local/bin/top +# exec .1.3.6.1.4.1.2021.53 mailq /usr/bin/mailq + +# ----------------------------------------------------------------------------- + + +############################################################################### +# Pass through control. +# + +# Usage: +# pass MIBOID EXEC-COMMAND +# +# This will pass total control of the mib underneath the MIBOID +# portion of the mib to the EXEC-COMMAND. +# +# Note: You'll have to change the path of the passtest script to your +# source directory or install it in the given location. +# +# Example: (see the script for details) +# (commented out here since it requires that you place the +# script in the right location. (its not installed by default)) + +# pass .1.3.6.1.4.1.2021.255 /bin/sh /usr/local/passtest + +# % snmpwalk -v 1 -c public localhost .1.3.6.1.4.1.2021.255 +# enterprises.ucdavis.255.1 = "life the universe and everything" +# enterprises.ucdavis.255.2.1 = 42 +# enterprises.ucdavis.255.2.2 = OID: 42.42.42 +# enterprises.ucdavis.255.3 = Timeticks: (363136200) 42 days, 0:42:42 +# enterprises.ucdavis.255.4 = IpAddress: 127.0.0.1 +# enterprises.ucdavis.255.5 = 42 +# enterprises.ucdavis.255.6 = Gauge: 42 +# +# % snmpget -v 1 -c public localhost .1.3.6.1.4.1.2021.255.5 +# enterprises.ucdavis.255.5 = 42 +# +# % snmpset -v 1 -c public localhost .1.3.6.1.4.1.2021.255.1 s "New string" +# enterprises.ucdavis.255.1 = "New string" +# + +# For specific usage information, see the man/snmpd.conf.5 manual page +# as well as the local/passtest script used in the above example. + +############################################################################### +# Subagent control +# + +# The agent can support subagents using a number of extension mechanisms. +# From the 4.2.1 release, AgentX support is being compiled in by default. +# To use this mechanism, simply uncomment the following directive. +# +# master agentx +# +# Please see the file README.agentx for more details. +# + + +############################################################################### +# Further Information +# +# See the snmpd.conf manual page, and the output of "snmpd -H". +# MUCH more can be done with the snmpd.conf than is shown as an +# example here. diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-snmpd/templates/snmpd.default b/seed/release/eole-2.7/2.7.1/applicationservice/eole-snmpd/templates/snmpd.default new file mode 100644 index 0000000000000000000000000000000000000000..c4f8aa9b5546438e19d75caffc76aac0f8f57cda --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-snmpd/templates/snmpd.default @@ -0,0 +1,23 @@ +# This file controls the activity of snmpd and snmptrapd + +# MIB directories. /usr/share/snmp/mibs is the default, but +# including it here avoids some strange problems. +export MIBDIRS=/usr/share/snmp/mibs + +# snmpd control (yes means start daemon). +SNMPDRUN=yes + +# snmpd options (use syslog, close stdin/out/err). +#SNMPDOPTS='-Lsd -Lf /dev/null -u snmp -g snmp -I -smux -p /var/run/snmpd.pid 127.0.0.1' +SNMPDOPTS='-Lsd -Lf /dev/null -I -smux -p /var/run/snmpd.pid' + +# snmptrapd control (yes means start daemon). As of net-snmp version +# 5.0, master agentx support must be enabled in snmpd before snmptrapd +# can be run. See snmpd.conf(5) for how to do this. +TRAPDRUN=no + +# snmptrapd options (use syslog). +TRAPDOPTS='-Lsd -p /var/run/snmptrapd.pid' + +# create symlink on Debian legacy location to official RFC path +SNMPDCOMPAT=yes diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-spamassassin/dictionaries/22_spamassassin.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-spamassassin/dictionaries/22_spamassassin.xml new file mode 100644 index 0000000000000000000000000000000000000000..ea7e04b1926d5ccd2fa5bef757597bee08526a0d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-spamassassin/dictionaries/22_spamassassin.xml @@ -0,0 +1,45 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + <files/> + <containers> + <container name='mail' id='13'> + <package>eole-spamassassin-pkg</package> + <service servicelist='spamassassin'>spamassassin</service> + <file filelist='spamassassin' name='/etc/default/spamassassin'/> + <file filelist='spamassassin' name='/etc/mail/spamassassin/local.pre'/> + <file filelist='spamassassin' name='/etc/mail/spamassassin/local.cf'/> + </container> + </containers> + + <variables> + + <family name='messagerie'> + <variable name='activer_spamassassin' type='oui/non' description="Activer le service anti-spam SpamAssassin"> + <value>oui</value> + </variable> + </family> + <separators> + <separator name='activer_spamassassin'>Service anti-spam</separator> + </separators> + + <separators/> + + </variables> + + <constraints> + <condition name='disabled_if_in' source='activer_spamassassin'> + <param>non</param> + <target type='filelist'>spamassassin</target> + <target type='servicelist'>spamassassin</target> + </condition> + </constraints> + + <help> + <variable name='activer_spamassassin'>Le but de ce logiciel est de filtrer le trafic des courriels pour éradiquer les courriels reconnus comme pourriels ou courriels non sollicités</variable> + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-spamassassin/files/usr/share/eole/diagnose/51-spamassassin b/seed/release/eole-2.7/2.7.1/applicationservice/eole-spamassassin/files/usr/share/eole/diagnose/51-spamassassin new file mode 100644 index 0000000000000000000000000000000000000000..da3e26c257c3a6adc4576af72c35a3be147dc5a2 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-spamassassin/files/usr/share/eole/diagnose/51-spamassassin @@ -0,0 +1,8 @@ +#!/bin/bash +if [ $(CreoleGet activer_spamassassin) = 'oui' ] +then + . /usr/lib/eole/diagnose.sh + TestPid Anti-Spam "spamd child" + echo +fi +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-spamassassin/files/usr/share/zephir/monitor/configs/services/24_spamd.srv b/seed/release/eole-2.7/2.7.1/applicationservice/eole-spamassassin/files/usr/share/zephir/monitor/configs/services/24_spamd.srv new file mode 100644 index 0000000000000000000000000000000000000000..3605cd1eb6ded9974b881c6d320e24148c95756a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-spamassassin/files/usr/share/zephir/monitor/configs/services/24_spamd.srv @@ -0,0 +1,12 @@ +# -*- coding: UTF-8 -*- +""" +Surveillance du service Spamassassin +""" + +from zephir.monitor.agentmanager.config import ACTIVER_SPAMASSASSIN +from zephir.monitor.agents.services import PIDService + +if ACTIVER_SPAMASSASSIN: + data = {'spamd child' : "AntiSpam (Spamassassin)"} + AGENTS.append(PIDService('spamd', data, period=115, + description="Etat du serveur AntiSpam (Spamassassin)")) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-spamassassin/posttemplates/00-spamassassin b/seed/release/eole-2.7/2.7.1/applicationservice/eole-spamassassin/posttemplates/00-spamassassin new file mode 100644 index 0000000000000000000000000000000000000000..bed097320f7d77839c786a5d6e59cf7905db383d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-spamassassin/posttemplates/00-spamassassin @@ -0,0 +1,9 @@ +#!/bin/bash + +# répertoire des listes blanches spamassassin +container_path_mail=$(CreoleGet container_path_mail) +mkdir -p $container_path_mail/var/spool/spamassassin +touch $container_path_mail/var/spool/spamassassin/auto-whitelist +CreoleRun "chown -R mail:mail /var/spool/spamassassin" mail + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-spamassassin/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-spamassassin/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..ab69fcd2e76fc37a98791c03df8672f1bf317f41 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-spamassassin/service.yml @@ -0,0 +1,36 @@ +format: '0.1' +name: eole-spamassassin +version: |- + 2.6.0-1 +description: |- + Templates et dictionnaires pour le service anti-spam + Configuration du service SpamAssassin + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: [] +packages: [] +dictionaries: + - 22_spamassassin.xml +extra_dictionaries: {} +templates: + - local.cf + - local.pre + - spamassassin +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: + - 00-spamassassin +files: + /usr/share/zephir/monitor/configs/services/24_spamd.srv: + owner: root + group: root + mode: '0644' + /usr/share/eole/diagnose/51-spamassassin: + owner: root + group: root + mode: '0755' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-spamassassin/templates/local.cf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-spamassassin/templates/local.cf new file mode 100644 index 0000000000000000000000000000000000000000..d2917a4cc7f5a41c6cd10e1e074136370ae4fc62 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-spamassassin/templates/local.cf @@ -0,0 +1,48 @@ +#***********************************************************************# +# # +# Fichier de configuration SpamAssassin # +# philippe.caseiro, joel.cuissinat # +# Pour Scribe, Projet E.O.L.E. # +# # +#***********************************************************************# + +# Score du message avant d'etre traite comme un spam. +required_hits 6 + +# Reecriture de l'entete du message suspect. +rewrite_header Subject [**Eole***SPAM***Eole**] + +# Encapsulation du spam dans un attachement +report_safe 1 + +# Activer le systeme de règles Bayes "0/1" +use_bayes 1 + +# Activer l'auto_apprentissage de Bayes "0/1" +bayes_auto_learn 1 + +# Langue du pays des boites e-mails +#ok_languages fr + +# Langue des mails locaux +# as being possibly spam in a foreign language. +ok_locales fr + +# Set which networks or hosts are considered 'trusted' by your mail +# trusted_networks 212.17.35. + +# Set file-locking method (flock is not safe over NFS, but is faster) +# lock_method flock + +# utilisation du plugin AWL +auto_whitelist_path /var/spool/spamassassin/auto-whitelist +auto_whitelist_file_mode 0666 + +# Set headers which may provide inappropriate cues to the Bayesian +# classifier +# bayes_ignore_header X-Bogosity +# bayes_ignore_header X-Spam-Flag +# bayes_ignore_header X-Spam-Status + +# "désactivation" de la règle RCVD_IN_PBL (Received via a relay in Spamhaus PBL) +score RCVD_IN_PBL 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-spamassassin/templates/local.pre b/seed/release/eole-2.7/2.7.1/applicationservice/eole-spamassassin/templates/local.pre new file mode 100644 index 0000000000000000000000000000000000000000..155dd99888c2696de8a65b925135736c9c52e8c4 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-spamassassin/templates/local.pre @@ -0,0 +1,7 @@ +## Fichier d'activation de plugins supplémentaires pour Spamassassin +## Scribe 2.2 +## Avril 2010 +## Equipe Eole eole@ac-dijon.fr + +# activation du plugin AWL (auto white list) +loadplugin Mail::SpamAssassin::Plugin::AWL diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-spamassassin/templates/spamassassin b/seed/release/eole-2.7/2.7.1/applicationservice/eole-spamassassin/templates/spamassassin new file mode 100644 index 0000000000000000000000000000000000000000..6a079ce31c48805c9237d5d77182f1ff74598daa --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-spamassassin/templates/spamassassin @@ -0,0 +1,33 @@ +# /etc/default/spamassassin +# Duncan Findlay + +# WARNING: please read README.spamd before using. +# There may be security risks. + +# Change to one to enable spamd +ENABLED=1 + +# Options +# See man spamd for possible options. The -d option is automatically added. + +# SpamAssassin uses a preforking model, so be careful! You need to +# make sure --max-children is not set to anything higher than 5, +# unless you know what you're doing. + +#OPTIONS="--create-prefs --max-children 5 --helper-home-dir" +# Options Eole +OPTIONS="--max-children 5 --nouser-config --username mail --ipv4-only" + +# Pid file +# Where should spamd write its PID to file? If you use the -u or +# --username option above, this needs to be writable by that user. +# Otherwise, the init script will not be able to shut spamd down. +PIDFILE="/var/run/spamd.pid" + +# Set nice level of spamd +#NICE="--nicelevel 15" + +# Cronjob +# Set to anything but 0 to enable the cron job to automatically update +# spamassassin's rules on a nightly basis +CRON=0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/dictionaries/00_eole-sphynx_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/dictionaries/00_eole-sphynx_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..b09f28e211cc8314ec152ee35cdc19da7969bee9 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/dictionaries/00_eole-sphynx_packages.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>arv</package> + <package>quagga</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/dictionaries/30_sphynx.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/dictionaries/30_sphynx.xml new file mode 100644 index 0000000000000000000000000000000000000000..a7358799765b320884538879c0d2239d9bbb4e04 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/dictionaries/30_sphynx.xml @@ -0,0 +1,385 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + <files> + <service servicelist='dyn_route'>quagga</service> + <service_access service='arv'> + <port port_type='SymLinkOption'>arv_port</port> + </service_access> + <service_restriction service='arv'> + <ip interface='eth0' netmask='netmask_admin_eth0' netmask_type='SymLinkOption' ip_type='SymLinkOption'>ip_admin_eth0</ip> + <ip interface='eth1' netmask='netmask_admin_eth1' netmask_type='SymLinkOption' ip_type='SymLinkOption'>ip_admin_eth1</ip> + <ip interface='eth2' netmask='netmask_admin_eth2' netmask_type='SymLinkOption' ip_type='SymLinkOption'>ip_admin_eth2</ip> + <ip interface='eth3' netmask='netmask_admin_eth3' netmask_type='SymLinkOption' ip_type='SymLinkOption'>ip_admin_eth3</ip> + <ip interface='eth4' netmask='netmask_admin_eth4' netmask_type='SymLinkOption' ip_type='SymLinkOption'>ip_admin_eth4</ip> + </service_restriction> + <service_access service='isakmp'> + <port protocol='udp'>500</port> + <port protocol='udp'>4500</port> + </service_access> + <service_restriction service='isakmp'> + <ip interface='eth0' netmask='0.0.0.0'>0.0.0.0</ip> + </service_restriction> + <file name='/etc/eole/ssl/ca-sphynx.conf' mkdir="True"/> + <file name='/etc/eole/ssl/certif-vpn.conf' mkdir="True"/> + <file name='/etc/arv/arv.conf'/> + <file name='/usr/share/eole/bastion/data/60-Sphynx_rules' mode='755' /> + <file filelist='dyn_route' name='/etc/quagga/zebra.conf'/> + <file filelist='dyn_route' name='/etc/quagga/debian.conf' source='quagga.conf'/> + <file filelist='dyn_route' name='/etc/quagga/daemons' source='quagga-daemons'/> + <file filelist='dyn_route' name='/etc/quagga/ospfd.conf'/> + <file filelist='dyn_route' name='/etc/quagga/ripd.conf'/> + </files> + + <variables> + + <family name='general'> + <variable name='nombre_interfaces' redefine='True' hidden='True'> + <value>2</value> + </variable> + <variable name='eole_module' redefine='True'> + <value>sphynx</value> + </variable> + </family> + + <family name='services'> + <variable name='dyn_route' type='oui/non' description="Activer le routage dynamique sur l'interface interne 1" > + <value>non</value> + </variable> + </family> + + <family name='système'> + + <!-- We need to recalculate the variables --> + <variable name='eole_lv_names' redefine='True' remove_check='True' /> + <variable name='eole_lv_standard_extends' redefine='True' remove_check='True' /> + + </family> + + <family name='Interface-0'> + <variable name='eth0_method' redefine='True' hidden='True' > + <value>statique</value> + </variable> + <variable name='admin_eth0' redefine='True' description='Autoriser les connexions pour administrer le serveur (EAD, ARV, ...)'/> + </family> + + <family name='Interface-1'> + <variable name='eth1_method' redefine='True' hidden='True' > + <value>statique</value> + </variable> + <variable name='admin_eth1' redefine='True' description='Autoriser les connexions pour administrer le serveur (EAD, ARV, ...)'/> + </family> + + <family name='réseau avancé' mode='expert'> + <variable name='activer_routage_ipv4' redefine='True' hidden='True'> + <value>oui</value> + </variable> + <variable name="activer_firewall" redefine='True' hidden='True'> + <value>oui</value> + </variable> + </family> + + <family name='arv' icon='certificate'> + <variable name='arv_allow_user' type='string' description='Utilisateurs autorisés à se connecter sur ARV' multi='True'> + <value>root</value> + <value>eole</value> + </variable> + <variable name='arv_port' type='number' description='Port du serveur ARV' mode='expert' mandatory='True' > + <value>8088</value> + </variable> + </family> + + <family name='rvp' > + <variable name='ip_test_rvp' redefine='True' hidden='True' /> + <variable name='sw_forceencap' type='oui/non' description="Forcer l'encapsulation (Détection NAT)" mandatory='True' mode='expert' > + <value>non</value> + </variable> + <variable name='sw_mobike' type='oui/non' description="Autoriser le changement d'adresse IP d'une extrémité de connexion" mandatory='True' mode='expert' > + <value>non</value> + </variable> + </family> + <family name='vpn-pki' icon='key'> + <variable name='use_pncn' type='oui/non' description='Utiliser la PKI PNCN'> + <value>oui</value> + </variable> + <variable name='x509_default_key_bits' type='number' description='Taille de la clé RSA' mandatory='True'> + <value>2048</value> + </variable> + <variable name='x509_country_name' type='string' description='Nom du pays (2 caractères) (C=)' mandatory='True' hidden='True'/> + <variable name='x509_locality_name' type='string' description='Localité (L=)' mandatory='True'/> + <variable name='x509_organization_name' type='string' description="Nom de l'organisation (O=)" mandatory='True'/> + <variable name='x509_organization_unit_name' type='string' description="Nom de l'unité de l'organisation (OU=)" multi='True' mandatory='True'/> + <variable name='ou_old_pki' hidden='True' type='string' description="OU ancienne PKI" multi='True'/> + <variable name='ou_pncn_pki' hidden='True' type='string' description="OU PKI PNCN" multi='True'/> + <variable name='url_crl' type='string' description='URL des listes de révocation de certificats (sinon rien)' multi='True'/> + <variable name='fw_interetab_accept' type='oui/non' description='Autoriser les réseaux établissements à communiquer entre eux' > + <value>non</value> + </variable> + <variable name='val_mtu_interetab' type='string' description="Valeur du mtu pour les connexions intersite (ou rien)"/> + <variable name='ip_source_etab' type='ip' description="Adresse source à autoriser" multi='True'> + <value>0.0.0.0</value> + </variable> + <variable name='netmask_source_etab' type='netmask' description="Adresse netmask de l'IP source à autoriser"> + <value>0.0.0.0</value> + </variable> + <variable name='ip_dest_etab' type='ip' description="Adresse destination à autoriser"> + <value>0.0.0.0</value> + </variable> + <variable name='netmask_dest_etab' type='netmask' description="Adresse netmask de l'IP destination à autoriser"> + <value>0.0.0.0</value> + </variable> + <variable name='proto_dest_etab' type='string' description="Protocole destination à autoriser"> + <value>tout</value> + </variable> + <variable name='port_dest_etab' type='string' description="Port destination à autoriser pour TCP et UDP (plage possible)"> + <value>0:65535</value> + </variable> + </family> + + <family name='quagga' icon='road'> + <variable name='dyn_route_type' type='string' description='Choix du protocole de routage a mettre en oeuvre' > + <value>rip</value> + </variable> + <variable name='dyn_route_network' type='ip' description="Adresses reseau autorisee a ajouter des routes dynamiquement" multi='True' /> + <variable name='dyn_route_netmask' type='netmask' description="Masque de sous reseau associee a cette adresse" /> + </family> + + <family name='haute-dispo'> + <variable name='corosync_dial_if' redefine='True'> + <value>2</value> + </variable> + <variable name='vip_externe' type='ip' description='Adresse IP externe redondée (VIP)' mandatory='True' /> + <variable name='vip_interne' type='ip' description='Adresse IP interne redondée (VIP)' mandatory='True' /> + <variable name='vip_resource_name' redefine='True' mandatory='True' /> + <variable name='activer_resource_arv' type='oui/non' description='Superviser le service ARV' /> + <variable name='service_resource_arv_startdelay' type='number' description="Délai d'attente au lancement d'ARV avant supervision (en secondes)"> + <value>30</value> + </variable> + <variable name='synchro_fichiers' redefine ='True' /> + </family> + + <separators> + <separator name='adresse_ip_eth0'>Configuration de l'interface</separator> + <separator name='adresse_ip_eth1'>Configuration de l'interface</separator> + <separator name='x509_default_key_bits'>Paramètres des certificats</separator> + <separator name='fw_interetab_accept'>Filtrage des tunnels</separator> + <separator name='vip_externe'>Adresses IP redondées (VIP)</separator> + <separator name='activer_resource_arv'>Superviser le service ARV</separator> + </separators> + </variables> +<!--************************************************************************************************* --> + + <constraints> + <!-- Sphynx >= 2 cartes réseau ou 3 si haute dispo activée --> + <check name="valid_enum" target="nombre_interfaces"> + <param>['2','3']</param> + </check> + + <!-- **** Listes deroulantes **** --> + <check name="valid_enum" target='proto_dest_etab'> + <param>['tcp','udp','icmp','tout']</param> + </check> + <check name="valid_enum" target='dyn_route_type'> + <param>['rip','ocsp']</param> + </check> + <check name="valid_in_network" target="vip_externe" level="warning"> + <param type='eole' hidden="False">adresse_network_eth0</param> + <param type='eole'>adresse_netmask_eth0</param> + </check> + <check name="valid_in_network" target="vip_interne" level="warning"> + <param type='eole' hidden="False">adresse_network_eth1</param> + <param type='eole'>adresse_netmask_eth1</param> + </check> + <check name="valid_differ" target="vip_externe"> + <param type='eole' hidden="False">adresse_ip_eth0</param> + </check> + <check name="valid_differ" target="vip_interne"> + <param type='eole' hidden="False">adresse_ip_eth1</param> + </check> + + <!-- **** Conditions **** --> + <condition name='disabled_if_in' source='activer_haute_dispo'> + <param>non</param> + <param>esclave</param> + <target type='variable'>vip_externe</target> + <target type='variable'>vip_interne</target> + <target type='variable'>activer_resource_arv</target> + <target type='variable'>service_resource_arv_startdelay</target> + </condition> + <condition name='disabled_if_in' source='activer_resource_arv'> + <param>non</param> + <target>service_resource_arv_startdelay</target> + </condition> + + <condition name='disabled_if_in' source='fw_interetab_accept'> + <param>non</param> + <target type='variable'>val_mtu_interetab</target> + <target type='variable'>ip_source_etab</target> + <target type='variable'>netmask_source_etab</target> + <target type='variable'>ip_dest_etab</target> + <target type='variable'>netmask_dest_etab</target> + <target type='variable'>proto_dest_etab</target> + <target type='variable'>port_dest_etab</target> + </condition> + + <condition name='disabled_if_in' source='dyn_route'> + <param>non</param> + <target type='filelist'>dyn_route</target> + <target type='family'>quagga</target> + <target type='servicelist'>dyn_route</target> + </condition> + + <condition name='disabled_if_in' source='use_pncn'> + <param>non</param> + <target type='variable'>x509_locality_name</target> + </condition> + + <!-- **** fill **** --> + <fill name='calc_multi_val' target='ou_old_pki'> + <param>education</param> + <param type='eole' >nom_academie</param> + </fill> + <fill name='calc_multi_val' target='ou_pncn_pki'> + <param>0002 110043015</param> + </fill> + <fill name='calc_multi_condition' target='x509_organization_name'> + <param>non</param> + <param type='eole' name='condition_1'>use_pncn</param> + <param name='match'>gouv</param> + <param name='mismatch'>Education Nationale</param> + </fill> + <fill name='calc_multi_condition' target='x509_organization_unit_name'> + <param>non</param> + <param type='eole' name='condition_1'>use_pncn</param> + <param type='eole' name='match'>ou_old_pki</param> + <param type='eole' name='mismatch'>ou_pncn_pki</param> + </fill> + + <!-- **** auto **** --> + <auto name='auto_copy_val' target='x509_country_name'> + <param type='eole'>ssl_country_name</param> + </auto> + <auto name='calc_multi_val' target='synchro_fichiers'> + <param>/etc/ipsec.conf</param> + <param>/etc/ipsec.secrets</param> + <param>/etc/ipsec.d/</param> + <param>/etc/arv/arv.conf</param> + <param>/var/lib/arv/db/</param> + <param>/var/lib/arv/CA/</param> + <param>/home/data/</param> + </auto> + <auto name='calc_multi_condition' target='nombre_interfaces'> + <param>non</param> + <param type='eole' name='condition_1'>activer_haute_dispo</param> + <param name='match'>2</param> + <param name='mismatch'>3</param> + </auto> + <auto name='calc_multi_val' target='vip_resource_name'> + <param>VIP_externe</param> + <param>VIP_interne</param> + </auto> + <auto name='calc_multi_val' target='vip_resource_if'> + <param>0</param> + <param>1</param> + </auto> + <auto name='calc_multi_val' target='vip_resource_location'> + <param>maitre</param> + <param>maitre</param> + </auto> + <auto name='calc_multi_val' target='vip_resource_adresseip'> + <param type='eole'>vip_externe</param> + <param type='eole'>vip_interne</param> + </auto> + <auto name='calc_multi_val' target='vip_resource_netmask'> + <param type='eole'>adresse_netmask_eth0</param> + <param type='eole'>adresse_netmask_eth1</param> + </auto> + <auto name='calc_val' target='activer_service_resource'> + <param>oui</param> + </auto> + <auto name='calc_multi_condition' target='service_resource_name'> + <param>non</param> + <param type='eole' name='condition_1'>activer_resource_arv</param> + <param name='match'>ipsec_rsc</param> + <param name='mismatch'>[u'ipsec_rsc', u'arv_rsc']</param> + <param name='eval_mismatch'>True</param> + </auto> + <auto name='calc_multi_condition' target='service_resource_script'> + <param>non</param> + <param type='eole' name='condition_1'>activer_resource_arv</param> + <param name='match'>strongswan</param> + <param name='mismatch'>[u'strongswan', u'arv']</param> + <param name='eval_mismatch'>True</param> + </auto> + <auto name='calc_multi_condition' target='service_resource_interval'> + <param>non</param> + <param type='eole' name='condition_1'>activer_resource_arv</param> + <param name='match' type='number'>10</param> + <param name='mismatch'>[10, 10]</param> + <param name='eval_mismatch'>True</param> + </auto> + <auto name='calc_multi_condition' target='service_resource_timeout'> + <param>non</param> + <param type='eole' name='condition_1'>activer_resource_arv</param> + <param name='match' type='number'>30</param> + <param name='mismatch'>[30, 30]</param> + <param name='eval_mismatch'>True</param> + </auto> + <auto name='calc_multi_val' target='service_resource_startdelay'> + <param type='number'>15</param> + <param type='eole' hidden='False' optional='True'>service_resource_arv_startdelay</param> + </auto> + + <!-- **** Groupes **** --> + <group master='ip_source_etab'> + <slave>netmask_source_etab</slave> + <slave>ip_dest_etab</slave> + <slave>netmask_dest_etab</slave> + <slave>proto_dest_etab</slave> + <slave>port_dest_etab</slave> + </group> + <group master='dyn_route_network'> + <slave>dyn_route_netmask</slave> + </group> + + <!-- Default AmonEcole* logical volumes --> + <auto name='calc_multi_val' target='eole_lv_names'> + <param>root</param> + <param>tmp</param> + <param>var</param> + <param>home</param> + </auto> + + <!-- Default AmonEcole* logical volumes extension: 100% /home --> + <auto name='calc_multi_val' target='eole_lv_standard_extends'> + <param type='number'>0</param> + <param type='number'>0</param> + <param type='number'>100</param> + <param type='number'>0</param> + </auto> + + </constraints> + + <help> + <family name='arv'>Paramétrage de l'interface de génération des configurations RVP</family> + <family name='quagga'>Configuration du routage dynamique</family> + <variable name='arv_allow_user'>Utilisateurs système de Sphynx et utilisateurs autorisés dans Zéphir</variable> + <variable name='url_crl'>URL complète du serveur primaire permettant de télécharger la liste de révocation lorsqu'on utilise des certificats X509 (de la forme http://serveur/fic_crl.crl). Paramètre facultatif (si utilisation de certificats auto-signés ou si L'URL est dans le certificat).</variable> + <variable name='sw_forceencap'>* UDP/500 si valeur à non et pas de NAT détecté; +* UDP/4500 si valeur à non et NAT détecté ou si valeur à oui.</variable> + <variable name='sw_mobike'>* UDP/500 si valeur à non; +* UDP/4500 si valeur à oui.</variable> + <family name='vpn-pki'>Paramètres concernant l'utilisation d'une PKI</family> + <variable name='use_pncn'>'non' pour configurer Openssl pour l'ancienne PKI ou 'oui' pour le Pôle National de Confiance Numérique (PNCN)</variable> + <variable name='port_dest_etab'>Port ou plage de ports (exemple: 53 ou 0:65535) pour les protocoles TCP et UDP. +Pour "tout" les protocoles et l'ICMP cette variable est inutile.</variable> + <variable name='dyn_route'>Activation du routage dynamique</variable> + <variable name='vip_externe'>Adresse IP externe partagée dans le cluster</variable> + <variable name='vip_interne'>Adresse IP interne partagée dans le cluster</variable> + <variable name='activer_resource_arv'>Superviser le service ARV avec pacemaker</variable> + <variable name='service_resource_arv_startdelay'>Délai avant de contrôler l'état d'ARV. Cela lui laisse le temps de démarrer.</variable> + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/files/usr/share/eole/sbin/init_pncn b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/files/usr/share/eole/sbin/init_pncn new file mode 100644 index 0000000000000000000000000000000000000000..ee809e4f945664635cc387c5bb6e055e463bd5ed --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/files/usr/share/eole/sbin/init_pncn @@ -0,0 +1,97 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import sys +import glob +import subprocess +from os.path import isfile, join +from getpass import getpass + +from creole import cert +from creole.client import CreoleClient + +from arv.db.initialize import initialize_database, commit_database +from arv.db.edge import (get_credential, get_credentials_auth, get_tmpl_connects, + get_tmpl_edges, add_credential_auth, add_tmpl_connect) +from arv.db.node import get_tmpl_nodes, get_tmpl_vertices, add_tmpl_node +from arv.config import sqlite_database, CACert +from arv.lib.util import split_pkcs7 + +def populate_database(): + zephir = None + sphynxmodule = None + amonmodule = None + conf_eole = CreoleClient().get_creole() + if conf_eole['activer_haute_dispo'] == 'esclave': + print "Abandon : Ce serveur est esclave pour la haute disponibilité." + sys.exit(1) + if not isfile(sqlite_database): + print("Abandon : base de données ARV inexistante") + print("Lancer le script 'init_sphynx' pour initialiser la base.") + sys.exit() + if conf_eole['use_pncn'] == 'non': + print("Le serveur n'est pas configué pour la PKI PNCN") + sys.exit(1) + + initialize_database() + #add Toulouse CA chain + cred_auths_name = [] + for cred_auth in get_credentials_auth(): + cred_auths_name.append(cred_auth.name) + new_cacerts, certif = split_pkcs7(CACert) + for new_cacert in new_cacerts: + new_cacert_name = cert.get_subject(new_cacert)[1] + if new_cacert_name not in cred_auths_name: + print("Ajout du certificat AC '{0}'".format(new_cacert_name)) + add_credential_auth(new_cacert) + else: + print("Le certificat AC '{0}' est déjà présent dans la base ARV".format(new_cacert_name)) + cred_auth_name = cert.get_subject(new_cacerts[len(new_cacerts)-1])[1] + cred_auth = get_credential(cred_auth_name) + + #add TmplNode Sphynx and Etablissement + tmplnode1 = tmplnode2 = None + for tmpl_node in get_tmpl_nodes(): + if tmpl_node.mimetype == u'sphynx': + tmplnode1 = tmpl_node + if tmpl_node.mimetype == u'etablissement': + tmplnode2 = tmpl_node + if not tmplnode1: + tmplnode1 = add_tmpl_node(name=u"Sphynx", mimetype=u'sphynx') + if not tmplnode2: + tmplnode2 = add_tmpl_node(name=u"Etablissement", mimetype=u'etablissement') + if not tmplnode3: + tmplnode3 = add_tmpl_node(name=u"Roadwarrior", mimetype=u'roadwarrior') + + #create tmplconnect and tmpledges + tmplconnects = get_tmpl_connects() + exist_PNCN_tmplconnect = False + for tmplconnect in tmplconnects: + if tmplconnect.cred_auth == cred_auth: + exist_PNCN_tmplconnect = True + break + for tmplconnect in tmplconnects: + if tmplconnect.cred_auth.name == "RACINE AGRIATES": + tmplconnect_name = tmplconnect.name.replace('OLD_PKI_', '') + tmplconnect.name = "OLD_PKI_" + tmplconnect_name + if not exist_PNCN_tmplconnect: + PNCN_tmplconnect = add_tmpl_connect(tmplconnect_name, + tmplconnect.tmpl_node_a, + tmplconnect.tmpl_node_b, + cred_auth) + tmpledges = get_tmpl_edges(tmplconnect) + for tmpledge in tmpledges: + tmpledge_name = tmpledge.name.replace('OLD_PKI_', '') + tmpledge.name = "OLD_PKI_" + tmpledge_name + PNCN_tmplconnect.add_tmpl_edge(name=tmpledge_name, + tmpl_vertex_a=tmpledge.tmpl_vertex_a, + tmpl_vertex_b=tmpledge.tmpl_vertex_b) + + #Restart ARV + cmd = "service arv restart".split() + process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=False) + if process.wait() != 0: + print("Le redémarrage du service ARV a échoué") + +populate_database() +commit_database() diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/files/usr/share/eole/sbin/init_sphynx b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/files/usr/share/eole/sbin/init_sphynx new file mode 100644 index 0000000000000000000000000000000000000000..1b587412be16d2230cfa4be03e449067c851e83b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/files/usr/share/eole/sbin/init_sphynx @@ -0,0 +1,272 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import sys +import glob +import socket +from os.path import isfile, join +from os import unlink, system +from getpass import getpass + +from creole import cert +from pyeole.ihm import question_ouinon +from creole.client import CreoleClient +from pyeole.ansiprint import print_red + +from arv.db.initialize import initialize_database, commit_database +from arv.db.edge import * +from arv.db.node import * +from arv.config import (sqlite_database, strongswan_database, + strongswan_tmpconfigs_directory, arv_address_ip, + ssl_dir, ca_conf_file, x509_default_key_bits, + ssl_default_cert_time, CACert) +from arv.lib.util import (split_pkcs7, decrypt_privkey, password_OK, + ipsec_restart, purge_file) +from arv.lib.usezephir import Zephir +try: + from zephir.zephir_conf import zephir_conf + zephir_recorded = True +except: + print_red("Le serveur n'est pas enregistré sur Zéphir.") + question = 'Voulez-vous continuer et créer une base ARV minimale ?' + if question_ouinon(question, level='warn') == 'non': + exit(0) + else: + zephir_recorded = False + +defaults = {} + +def saisie(variable, message): + """effectue la saisie d'une variable en utilisant + une valeur par défaut si disponible + """ + try: + val_def = " (%s par défaut)" % defaults[variable] + except Exception, e: + val_def = "" + val = raw_input(message + val_def + " : ") + if val == "" and val_def != "": + return defaults[variable] + else: + return val + +def gen_local_ca(): + try: + cert.load_conf({'ssl_dir': ssl_dir, 'start_index': "01", + 'ca_conf_file': ca_conf_file, 'ca_file': join(ssl_dir, 'certs/CaCert.pem'), + 'ssl_default_key_bits': x509_default_key_bits, + 'ssl_default_cert_time': '5475'}) + cert.gen_ca(regen=True, extensions="ac-ext") + except Exception, e: + print "ERROR: --- unable to create the certificate --- : %s " % str(e) + sys.exit(1) + +def populate_database(): + conf_eole = CreoleClient().get_creole() + if conf_eole['activer_haute_dispo'] == 'esclave': + print "Abandon : Ce serveur est esclave pour la haute disponibilité." + sys.exit(1) + if isfile(sqlite_database): + question = "Une base ARV existe déjà . Écraser la base actuelle ?" + if question_ouinon(question, level='warn') == 'non': + sys.exit() + unlink(sqlite_database) + if isfile(strongswan_database): + unlink(strongswan_database) + for filename in glob.glob('%s*.db'% strongswan_tmpconfigs_directory): + unlink(filename) + + gen_local_ca() + initialize_database(create=True) + #add local certification authority + credential = open(cert.ca_file, 'r').read() + credauth = add_credential_auth(credential=credential, local=True) + #add TmplNode Sphynx and Etablissement + tmplnode1 = add_tmpl_node(name=u"Sphynx", mimetype=u'sphynx') + tmplnode2 = add_tmpl_node(name=u"Etablissement", mimetype=u'etablissement') + tmplnode3 = add_tmpl_node(name=u"Roadwarrior", mimetype=u'roadwarrior') + tmplnode3.add_tmpl_vertex(name="RW_SourceIP", mimetype=u'ip') + + if zephir_recorded: + try: + login = raw_input("Entrez le login Zéphir : ") + passwd = getpass("Entrez le mot de passe Zéphir : ") + zephir = Zephir(user=login, password=passwd) + except: + print("La connexion à Zéphir n'a pas pu être établie.") + sys.exit(1) + sphynxmodule = zephir.get_module('sphynx')['moduleid'] + amonmodule = zephir.get_module('amon')['moduleid'] + + subnet_eth1 = tmplnode1.add_tmpl_vertex(name="reseau_eth1", mimetype=u'network', zephir_module=sphynxmodule, zephir_var_ip1="adresse_network_eth1", zephir_var_ip2="adresse_netmask_eth1") + subnet10 = tmplnode1.add_tmpl_vertex(name="reseau_10", mimetype=u'network', zephir_module="", zephir_var_ip1="10.0.0.0", zephir_var_ip2="255.0.0.0") + subnet192 = tmplnode1.add_tmpl_vertex(name="reseau_192", mimetype=u'network', zephir_module="", zephir_var_ip1="192.168.0.0", zephir_var_ip2="255.255.0.0") + subnet172 = tmplnode1.add_tmpl_vertex(name="reseau_172", mimetype=u'network', zephir_module="", zephir_var_ip1="172.16.0.0", zephir_var_ip2="255.240.0.0") + subnet_ader = tmplnode1.add_tmpl_vertex(name="reseau_ader", mimetype=u'network', zephir_module="", zephir_var_ip1="161.48.0.0", zephir_var_ip2="255.255.224.0") + + subnet_admin = tmplnode2.add_tmpl_vertex(name="admin", mimetype=u'network', zephir_module=amonmodule, zephir_var_ip1="adresse_network_eth1", zephir_var_ip2="adresse_netmask_eth1") + subnet_pedago = tmplnode2.add_tmpl_vertex(name="pedago", mimetype=u'network', zephir_module=amonmodule, zephir_var_ip1="adresse_network_eth2", zephir_var_ip2="adresse_netmask_eth2") + subnet_dmz = tmplnode2.add_tmpl_vertex(name="dmz", mimetype=u'network', zephir_module=amonmodule, zephir_var_ip1="adresse_network_eth3", zephir_var_ip2="adresse_netmask_eth3") + + #add node Sphynx + lzephir = zephir.get_sphynxs() + not_onzephir = False + current_id_zephir = zephir_conf.id_serveur + current_sphynx = zephir.get_etab_server(id_server=current_id_zephir) + current_rne = current_sphynx['rne'] + current_libelle = current_sphynx['libelle'] + + if lzephir: + i = 1 + menu = [] + for sphynx in lzephir: + menu.append("{0}- {1}--{2} - Id Zéphir : {3} - Version : {4}".format(i, sphynx[1], sphynx[0], sphynx[2], sphynx[3])) + if sphynx[1] == current_rne and unicode(sphynx[0], 'utf-8') == current_libelle or sphynx[2] == current_id_zephir: + defaults['choix_sphynx'] = i + i += 1 + menu.append("{0}- ajouter un serveur Sphynx non enregistré".format(i)) + print "\n".join(menu) + choix_sphynx = saisie('choix_sphynx', 'Choisissez le serveur Sphynx à ajouter') + try: + choix_sphynx = int(choix_sphynx) + except: + print "Choix entre 1 et {0}".format(i) + pass + while choix_sphynx < 1 or choix_sphynx > i: + print "\n".join(menu) + choix_sphynx = saisie('choix_sphynx', 'Choisissez le serveur Sphynx à ajouter') + try: + choix_sphynx = int(choix_sphynx) + except: + print "Choix entre 1 et {0}".format(i) + pass + if choix_sphynx == i: + not_onzephir = True + else: + #print lzephir[choix_sphynx-1][0] + name = unicode(lzephir[choix_sphynx-1][0], 'utf-8') + rne = unicode(lzephir[choix_sphynx-1][1], 'utf-8') + id_zephir = lzephir[choix_sphynx-1][2] + eole_version = unicode(lzephir[choix_sphynx-1][3], 'utf-8') + if type(name) == unicode: + name = unicode.encode(name, "utf-8") + if type(rne) == unicode: + rne = unicode.encode(rne, "utf-8") + node1 = tmplnode1.add_node(name=name, uai=rne, id_zephir=id_zephir, eole_version=eole_version) + print "Serveur {0}--{1} - Id Zéphir : {2} - Version : {3} ajouté".format(str(rne), str(name), str(id_zephir), str(eole_version)) + + haute_dispo = zephir.get_var(uai=rne, name=name, var="activer_haute_dispo") + if haute_dispo == "non": + pub_ip = zephir.get_var(uai=rne, name=name, var="adresse_ip_eth0") + else: + vips_name = zephir.get_var(uai=rne, name=name, var="vip_resource_name").split('| ') + vips_adresseip = zephir.get_var(uai=rne, name=name, var="vip_resource_adresseip").split('| ') + try: + index = vips_name.index('VIP_externe') + pub_ip = vips_adresseip[index] + except: + print_red('La ressource "VIP_externe" n\'existe pas !!!') + print_red('Vérifier la configuration haute dispo du Sphynx') + print_red('Ou ajoutez le Sphynx haute dispo maitre') + raise Exception() + node1.add_extremity(pub_ip=pub_ip) + network_eth1 = zephir.get_var(uai=rne, name=name, var="adresse_network_eth1") + netmask_eth1 = zephir.get_var(uai=rne, name=name, var="adresse_netmask_eth1") + subnet_eth1.add_vertex(node1, ip1=network_eth1, ip2=netmask_eth1) + + if not_onzephir: + print "Ajout du serveur sphynx..." + name = conf_eole['nom_machine'] + if type(name) == unicode: + name = unicode.encode(name, "utf-8") + rne = conf_eole['numero_etab'] + if type(rne) == unicode: + rne = unicode.encode(rne, "utf-8") + node1 = tmplnode1.add_node(name=name, uai=rne) + if arv_address_ip != None: + node1.add_extremity(pub_ip=arv_address_ip) + + #Add vertex for each tmpl_vertex for sphynx node + subnet10.add_vertex(node1, ip1="10.0.0.0", ip2="255.0.0.0") + subnet192.add_vertex(node1, ip1 = "192.168.0.0", ip2 = "255.255.0.0") + subnet172.add_vertex(node1, ip1 = "172.16.0.0", ip2 = "255.240.0.0") + subnet_ader.add_vertex(node1, ip1 = "161.48.0.0", ip2 = "255.255.224.0") + + add_credential('sphynx', 'eole', node1, 'autosigned') + #add Toulouse CA credential + cred_auth = add_certificate_authorities(certif=CACert) + + question = """Voulez-vous ajouter un certificat pour le serveur sphynx + (les fichiers clé et certificat doivent être accessibles) ?""" + if question_ouinon(question, level='warn') == 'oui': + #add sphynx and CA credential from pkcs7 file and sphynx private key + print "Ajout du certificat du serveur sphynx..." + cred_file = raw_input("Chemin complet du fichier pkcs7 : ") + while not isfile(cred_file): + cred_file = raw_input("Fichier inexistant, réessayez : ") + privkey_file = raw_input("Chemin complet de la clé privée : ") + while not isfile(privkey_file): + privkey_file = raw_input("Fichier inexistant, réessayez : ") + + fh = open(cred_file, 'r') + credential = fh.read() + fh.close() + ca_cred, cred = split_pkcs7(credential) + + fh = open(privkey_file, 'r') + privkey = fh.read() + fh.close() + print "Saisir passphrase de la clé privée : ", + passwd = getpass("") + while not password_OK(private_key=privkey_file, password=passwd): + print "erreur passphrase, veuillez réessayer : ", + passwd = getpass("") + decrypted_key = decrypt_privkey(privkey_string=privkey, passwd=passwd) + + node1.import_credential(private_key=decrypted_key, credential=credential, passwd=passwd) + + #Add crl for CA + crls = conf_eole['url_crl'] + for uri in crls: + if uri: + add_crl_uri(cred_auth, uri) + + #create tmplconnect and tmpledges + tmplconnect = add_tmpl_connect("amon-sphynx", tmplnode2, tmplnode1, cred_auth) + tmplconnect.add_tmpl_edge("admin-reseau_eth1", subnet_admin, subnet_eth1) + tmplconnect.add_tmpl_edge("admin-reseau10", subnet_admin, subnet10) + tmplconnect.add_tmpl_edge("admin-reseau192", subnet_admin, subnet192) + tmplconnect.add_tmpl_edge("admin-reseau172", subnet_admin, subnet172) + tmplconnect.add_tmpl_edge("admin-reseau_ader", subnet_admin, subnet_ader) + tmplconnect.add_tmpl_edge("pedago-reseau10", subnet_pedago, subnet10) + tmplconnect.add_tmpl_edge("pedago-reseau192", subnet_pedago, subnet192) + tmplconnect.add_tmpl_edge("pedago-reseau172", subnet_pedago, subnet172) + tmplconnect.add_tmpl_edge("pedago-reseau_ader", subnet_pedago, subnet_ader) + tmplconnect.add_tmpl_edge("dmz-reseau10", subnet_dmz, subnet10) + tmplconnect.add_tmpl_edge("dmz-reseau192", subnet_dmz, subnet192) + tmplconnect.add_tmpl_edge("dmz-reseau172", subnet_dmz, subnet172) + tmplconnect.add_tmpl_edge("dmz-reseau_ader", subnet_dmz, subnet_ader) + else: + print "Ajout du serveur sphynx..." + name = conf_eole['nom_machine'] + if type(name) == unicode: + name = unicode.encode(name, "utf-8") + rne = conf_eole['numero_etab'] + if type(rne) == unicode: + rne = unicode.encode(rne, "utf-8") + node1 = tmplnode1.add_node(name=name, uai=rne) + if arv_address_ip != None: + node1.add_extremity(pub_ip=arv_address_ip) + + + #Restart ARV + system("service arv restart") + if isfile(strongswan_database): + purge_file(strongswan_database) + ipsec_restart() + + +populate_database() +commit_database() + + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/files/usr/share/eole/sbin/restauration.sh b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/files/usr/share/eole/sbin/restauration.sh new file mode 100644 index 0000000000000000000000000000000000000000..0b1e5117726e740c2a6ea8ef2a03511a52f4ce8b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/files/usr/share/eole/sbin/restauration.sh @@ -0,0 +1,226 @@ +#!/bin/bash +########################################## +# Restauration EOLE +# - Zephir - +# LB Dijon 13/01/2006 +# bruno boiget <bruno.boiget@ac-dijon.fr> +# samuel morin <samuel.morin@ac-dijon.fr> +########################################## + +# color ASCII codes +# +DEFAULT="\e[0m" +BOLD="\e[1m" +BLACK="\e[30m" +RED="\e[31m" +GREEN="\e[32m" +YELLOW="\e[33m" +BLUE="\e[34m" +VIOLET="\e[35m" +CYAN="\e[36m" +WHITE="\e[37m" + +Lock="sauvegarde" +Excl="maj" + +RepEole=${RepEole="/usr/share/eole"} +activer_haute_dispo=$(CreoleGet activer_haute_dispo) + +backup_dir=/var/lib/sphynx_backups + + +if [ ! -d $backup_dir ] +then + echo -e "${RED} Erreur, répertoire des sauvegardes non trouvé ${DEFAULT}" + exit 1 +fi +pushd $backup_dir &>/dev/null 2>&1 + +if [ ! -z $1 ] +then + archive=$1 + basename=`echo -e $archive | sed -e s/"\.tar\.gz"/""/` +else + archive=/tmp +fi + +while [ ! -f $archive ] +do + # pas de fichier passé en paramètre + save_files=`ls *.tar.gz | sed -e s/".tar.gz"/""/` + echo -e " Utilitaire de restauration sphynx" + echo -e + echo -e "${RED}!!Attention : toutes les modifications effectuées" + echo -e " après la sauvegarde restaurée seront perdues!!${DEFAULT}" + echo -e + echo -e "${CYAN}liste des sauvegardes présentes :${DEFAULT}" + echo -e + echo -e "$save_files" + echo -e + read -p "sauvegarde à restaurer (rien pour sortir): " basename + if [ -z $basename ] + then + exit 0 + fi + if [ -f $basename.tar.gz ] + then + archive=$basename.tar.gz + else + echo -e "fichier invalide : $basename.tar.gz" + fi +done + +svg_version_file="2.3.10" +echo -e "décompression en cours..." +tar xzf $archive +cd $basename +echo -e "vérification des données..." +if ! ( [ -f var/lib/arv/db/sphynxdb.sqlite ] && ( [ -f etc/ipsec.d/ipsec.db ] && [ -f etc/ipsec.conf ] || [ -f etc/ipsec.conf ] )) +then + if [ ! -f sphynxdb.sqlite ] && [ ! -f ipsec.db ] + then + echo -e "${RED}sauvegarde de la base ARV et de la configuration Strongswan non trouvée${DEFAULT}" + exit 1 + else + echo -e "Sauvegarde effectuée par un serveur Sphynx non à jour !!!" + echo -e "Génération d'un fichier ipsec.conf minimal pour le mode database..." + echo "config setup + uniqueids = yes + cachecrls = yes + strictcrlpolicy = no +">/etc/ipsec.conf + svg_version_file="2.3.9" + fi +fi +if [ ! -f root_ssh.tar ] +then + echo -e "${RED}sauvegarde des clefs ssh non trouvée${DEFAULT}" + exit 1 +fi + +if [ ! -f conf_eole.tar ] +then + echo -e "${RED}sauvegarde de la configuration du serveur non trouvée${DEFAULT}" + exit 1 +fi + +ARV_INIT_SCE="arv" +CURRENT_EOLE_VERSION=$(dpkg -p creole | grep Version) +CURRENT_EOLE_VERSION=$(echo $CURRENT_EOLE_VERSION | sed -e 's/^Version: \([0-9]*\.[0-9]*\.[0-9]\).*/\1/') +if [[ $CURRENT_EOLE_VERSION =~ ^2\.4\..*$ ]] +then + IPSEC_INIT_SCE="ipsec" +else + IPSEC_INIT_SCE="strongswan" +fi + +tar -C /tmp/ -xpf conf_eole.tar etc/eole/config.eol >/dev/null 2>&1 +read FIST_LINE < /tmp/etc/eole/config.eol +echo $FIST_LINE | grep -qe "^\[" +if [ $? -eq 0 ] +then + SVG_EOLE_VERSION="2.3" +else + echo $FIST_LINE | grep -qe "^{" + if [[ $? -eq 0 ]] + then + VERSION_LINE=$(grep -e "___version___" /tmp/etc/eole/config.eol) + if [[ $? -eq 0 ]] + then + SVG_EOLE_VERSION=$(echo $VERSION_LINE | sed -e 's/^.*___version___":[ ]*"\([0-9]*\.[0-9]*\.[0-9]*\).*$/\1/') + else + SVG_EOLE_VERSION="2.4.0" + fi + else + SVG_EOLE_VERSION="INCONNUE" + fi +fi +echo -e "Restauration d'une sauvegarde $SVG_EOLE_VERSION sur $CURRENT_EOLE_VERSION" + +# restauration des données de la base xml +. /usr/lib/eole/ihm.sh +Question_ouinon "Restaurer les bases ARV et la configuration Strongswan (o/n) ?" "True" "non" +if [ $? -eq 0 ];then + echo -e " - bases ARV + Strongswan" + if [ "${svg_version_file}" == "2.3.9" ] + then + cp -f sphynxdb.sqlite /var/lib/arv/db/ + cp -f ipsec.db /etc/ipsec.d/ + elif [ "${svg_version_file}" == "2.3.10" ] + then + rsync --owner --group --recursive --links --perms --times etc/ipsec* /etc/ + rsync --owner --group --recursive --links --perms --times var/lib/arv/* /var/lib/arv/ + fi + if [ "${activer_haute_dispo}" == "non" ] + then + service $IPSEC_INIT_SCE stop + service $ARV_INIT_SCE stop + service $ARV_INIT_SCE start &>/dev/null + service $IPSEC_INIT_SCE start &>/dev/null + elif [ "${activer_haute_dispo}" == "maitre" ] + then + service strongswan stop + fi +fi +echo -e + +# restauration des répertoires et fichiers importants +# /root/.ssh +rm -rf /root/.ssh +tar -C /root -xpf root_ssh.tar >/dev/null 2>&1 +echo -e " - configuration eole" + +if [ -f /etc/eole/config.eol ] +then + mv -f /etc/eole/config.eol /etc/eole/config.eol.bak +fi + +echo -e "${CYAN}" +# vérification du dictionnaire +if [ "$SVG_EOLE_VERSION" == "$CURRENT_EOLE_VERSION" ] +then + if [ -f /etc/eole/config.eol.bak ] && [ -f /etc/eole/.instance ] + then + diff -q /etc/eole/config.eol.bak /tmp/etc/eole/config.eol &>/dev/null + if [ ! $? -eq 0 ] + then + echo -e "Le fichier /etc/eole/config.eol est différent de la version restaurée" + echo -e "Le fichier présent actuellement a été renommé en /etc/eole/config.eol.bak" + echo -e + echo -e " - Renommez éventuellement /etc/eole/config.eol.bak en /etc/eole/config.eol auparavant" + echo -e " - Lancez 'reconfigure'" + echo -e + else + echo -e "Lancez 'reconfigure'" + fi + else + echo -e "Après la fin de la restauration :" + echo -e " - Lancez 'instance'" + fi + + # Restauration dicos, patchs, ssl + rm -rf /usr/share/eole/creole/dicos /usr/share/eole/creole/patch /etc/ssl/* + tar -C / -xpf conf_eole.tar >/dev/null 2>&1 +else + echo -e "Après la fin de la restauration :" + echo -e " - Lancez 'gen_config' et enregistrez la configuration" + if [ -f /etc/eole/config.eol.bak ] && [ -f /etc/eole/.instance ] + then + echo -e " - Lancez 'reconfigure'" + else + echo -e " - Lancez 'instance'" + echo -e " Attention à ne PAS réinitialiser la base ARV pendant l'instance !!!" + fi + # Si version EOLE de la sauvegarde différente, restaure config.eol uniquement + tar -C / -xpf conf_eole.tar etc/eole/config.eol >/dev/null 2>&1 +fi +echo -e "${DEFAULT}" + +echo -e "Suppression du répertoire temporaire..." +rm -f /tmp/etc/eole/config.eol +rm -rf $backup_dir/$basename +echo -e "${GREEN}Système restauré${DEFAULT}" +echo -e +# retour au répertoire d'origine +popd >/dev/null 2>&1 + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/files/usr/share/eole/sbin/sauvegarde.sh b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/files/usr/share/eole/sbin/sauvegarde.sh new file mode 100644 index 0000000000000000000000000000000000000000..8ec0a50f8ef91c7efe0a8f71eb8555c2668f113f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/files/usr/share/eole/sbin/sauvegarde.sh @@ -0,0 +1,69 @@ +#!/bin/bash +########################################## +# Sauvegarde EOLE +# - Sphynx - +# LB Dijon 13/01/2006 +# bruno boiget <bruno.boiget@ac-dijon.fr> +# samuel morin <samuel.morin@ac-dijon.fr> +########################################## + +# color ASCII codes +# +DEFAULT="\e[0m" +BOLD="\e[1m" +BLACK="\e[30m" +RED="\e[31m" +GREEN="\e[32m" +YELLOW="\e[33m" +BLUE="\e[34m" +VIOLET="\e[35m" +CYAN="\e[36m" +WHITE="\e[37m" + +Lock="sauvegarde" +Excl="maj" + +day=`date +%d-%m-%Y` +backup_dir=/var/lib/sphynx_backups +tmp_backup=$backup_dir/$day + +if [ ! -d $backup_dir ] +then + mkdir $backup_dir +fi +rm -rf $tmp_backup +mkdir $tmp_backup + +# sauvegarde des bases de données ARV et Strongswan +echo -e +echo -e "${CYAN}Sauvegarde en cours, patientez ...${DEFAULT}" + +echo -e " - base ARV + Strongswan" +rsync --relative --owner --group --recursive --links --perms --times /etc/ipsec* $tmp_backup +rsync --relative --owner --group --recursive --links --perms --times /var/lib/arv/* $tmp_backup + +pushd /etc > /dev/null 2>&1 + +echo -e " - clés de connexion" +# /root/.ssh +cd /root +tar -cpf $tmp_backup/root_ssh.tar .ssh + +echo -e " - configuration eole" +# configuration EOLE et certificats générés +tar -cpf $tmp_backup/conf_eole.tar /etc/eole/config.eol \ +/usr/share/eole/creole/dicos /usr/share/eole/creole/patch \ +/etc/ssl + +# création du fichier de sauvegarde compressé +echo -e "${CYAN}Compression de l'archive...${DEFAULT}" +cd $backup_dir +tar -czf $day.tar.gz $day +echo -e +echo -e "${GREEN}Archive créée : $backup_dir/$day.tar.gz${DEFAULT}" +echo -e + +# suppression du répertoire temporaire +rm -rf $tmp_backup +# retour au répertoire d'origine +popd >/dev/null 2>&1 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/files/usr/share/zephir/monitor/configs/crl.agent b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/files/usr/share/zephir/monitor/configs/crl.agent new file mode 100644 index 0000000000000000000000000000000000000000..41ca90e3aad72af7462e7ab44c8181eb141ada90 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/files/usr/share/zephir/monitor/configs/crl.agent @@ -0,0 +1,17 @@ +# -*- coding: UTF-8 -*- +""" +agent de surveillance des CRL pour ipsec +""" + +import subprocess +from zephir.monitor.agents.crl import Crl + +cmd = "ipsec listcrls".split() +process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=False) +if process.wait() == 0: + crl = Crl('crl', period=180, description='Validité de la CRL', section="""Services""") + # liste des agents qui seront chargés + AGENTS = [crl] +else: + AGENTS = [] + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/files/usr/share/zephir/monitor/configs/sw.agent b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/files/usr/share/zephir/monitor/configs/sw.agent new file mode 100644 index 0000000000000000000000000000000000000000..e58eca46fbd66f01c1ed0c3dc3cdc95f33ffa982 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/files/usr/share/zephir/monitor/configs/sw.agent @@ -0,0 +1,44 @@ +# -*- coding: UTF-8 -*- +""" +""" + +from os.path import isfile + +from zephir.monitor.agents.rvp import strongSwan_threads +period = 180 + +sw_threads = strongSwan_threads('sw_threads', + period = period, + description='État des threads strongSwan', + section="""Système""", + datasources = [ + {'name': "max_threads", 'min_bound': 0}, + {'name': "running_threads", 'min_bound': 0} + ], + archives = [{'rows':60, 'steps':1}, + {'rows':24*4, 'steps':900/period}, + {'rows':24*7, 'steps':3600/period} + ], + graphs = [ + { 'pngname': "sw_threads-all.png", + 'vnamedefs': {"max_threads": ("max_threads", 'AVERAGE'), + "running_threads": ("running_threads", 'AVERAGE')}, + 'options': ["-l0", "-s end-1day", "-e now", "-t Threads", "-v nombre de threads", + "AREA:max_threads#CCFF80:threads disponibles", "AREA:running_threads#D91616:threads en cours d'exécution"] + }, + { 'pngname': "sw_threads-all-week.png", + 'vnamedefs': {"max_threads": ("max_threads", 'AVERAGE'), + "running_threads": ("running_threads", 'AVERAGE')}, + 'options': ["-l0", "-s end-7day", "-e now", "-t Threads sur 7 jours", "-v nombre de threads", + "AREA:max_threads#CCFF80:threads disponibles", "AREA:running_threads#D91616:threads en cours d'exécution"] + }, + { 'pngname': "sw_threads-all-month.png", + 'vnamedefs': {"max_threads": ("max_threads", 'AVERAGE'), + "running_threads": ("running_threads", 'AVERAGE')}, + 'options': ["-l0", "-s end-1month", "-e now", "-t Threads sur 1 mois", "-v nombre de threads", + "AREA:max_threads#CCFF80:threads disponibles", "AREA:running_threads#D91616:threads en cours d'exécution"] + } + ]) + +# liste des agents qui seront chargés +AGENTS = [sw_threads] diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/postservices/01-haute-dispo-sphynx b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/postservices/01-haute-dispo-sphynx new file mode 100644 index 0000000000000000000000000000000000000000..95b6ba953272be147af6f970e21f4d5b261a3a1c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/postservices/01-haute-dispo-sphynx @@ -0,0 +1,70 @@ +#!/bin/bash + +. /usr/lib/eole/ihm.sh +. /usr/lib/eole/utils.sh + +activer_haute_dispo=$(CreoleGet activer_haute_dispo) + +# Si haute dispo, on arrête ipsec et arv. Les lancements seront gérés par Corosync +if [ "${activer_haute_dispo}" != "non" ] +then + if [ ! -e /etc/ha.d/.rsc_list ] + then + if [ "${activer_haute_dispo}" = "maitre" ] + then + EchoOrange "La haute disponibilité n'a pas été configurée !!!" + EchoOrange "N'oubliez pas de lancer le script appliquer_hautedispo" + exit 0 + elif [ "${activer_haute_dispo}" = "esclave" ] + then + EchoOrange "La synchronisation n'a pas été exécutée sur le noeud maître !!!" + if [ $1 = "instance" ] + then + EchoOrange "Vous pouvez exécuter dès maintenant depuis le noeud maître le script synchro-nodes.sh" + EchoOrange "Vous aurez 2 minutes à partir du moment où vous aurez répondu à la question suivante :" + Question_ouinon "Voulez-vous attendre que le script synchro-nodes.sh soit exécuté sur le noeud maître ?" "True" "non" + rep=$? + else + rep=1 + fi + if [ $rep -eq 0 ] + then + wait_true_retcode "Attente synchro-nodes.sh maître " "[ -e /etc/ha.d/.rsc_list ]" + else + EchoOrange "Il faudra relancer '/usr/share/eole/postservice/01-haute-dispo-sphynx instance' quand le script 'synchro-nodes.sh' aura été correctement exécuté depuis le noeud maître." + exit 0 + fi + fi + fi + for service_link in /etc/rc3.d/* + do + while IFS=" " read rsc_type rsc_name rsc_sce rsc_location + do + # On désactive le service arv si il est supervisé + if [ "${rsc_sce}" = "arv" ] + then + systemctl disable arv.service > /dev/null 2>&1 + break + fi + done < /etc/ha.d/.rsc_list + done +fi + +# Si pas de haute dispo, on ajoute arv s'il n'existe pas au niveau des rc +if [ "${activer_haute_dispo}" == "non" ] +then + arv_exists=0 + for service_link in /etc/rc3.d/* + do + if [[ "${service_link}" =~ S[0-9]*arv ]] + then + arv_exists=1 + fi + done + if [ $arv_exists -eq 0 ] + then + systemctl enable arv.service > /dev/null 2>&1 + service arv start + fi +fi + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..1c25589dd2bf81660dce233a241f0ec30120b62b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/service.yml @@ -0,0 +1,61 @@ +format: '0.1' +name: eole-sphynx +version: |- + 2.7.0-2 +description: |- + configuration du module EOLE : Sphynx + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: + - eole-vpn + - eole-pacemaker + - eole-server +packages: + - arv + - quagga +dictionaries: + - 30_sphynx.xml +extra_dictionaries: {} +templates: + - 60-Sphynx_rules + - arv.conf + - ca-sphynx.conf + - certif-vpn.conf + - ospfd.conf + - quagga-daemons + - quagga.conf + - ripd.conf + - zebra.conf +creole_funcs: [] +preservices: [] +postservices: + - 01-haute-dispo-sphynx +pretemplates: [] +posttemplates: [] +files: + /usr/share/eole/sbin/init_pncn: + owner: root + group: root + mode: '0755' + /usr/share/eole/sbin/init_sphynx: + owner: root + group: root + mode: '0755' + /usr/share/eole/sbin/restauration.sh: + owner: root + group: root + mode: '0755' + /usr/share/eole/sbin/sauvegarde.sh: + owner: root + group: root + mode: '0755' + /usr/share/zephir/monitor/configs/crl.agent: + owner: root + group: root + mode: '0644' + /usr/share/zephir/monitor/configs/sw.agent: + owner: root + group: root + mode: '0644' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/templates/60-Sphynx_rules b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/templates/60-Sphynx_rules new file mode 100644 index 0000000000000000000000000000000000000000..30bc4e900d85f05b73424374a0981c63083598cc --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/templates/60-Sphynx_rules @@ -0,0 +1,79 @@ +#!/bin/bash + +## on change la politique par defaut du nat +/sbin/iptables -t nat -P PREROUTING ACCEPT +/sbin/iptables -t nat -P POSTROUTING ACCEPT + +## Charger le module TIME +modprobe ipt_time + +## activer l'anti-spoofing +echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter + +## creation de la chaine icmp accept +/sbin/iptables -N icmp-acc + +### Creation des chaines zone-zone +/sbin/iptables -t filter -N eth0-eth1 +/sbin/iptables -t filter -N eth1-eth0 +/sbin/iptables -t filter -N root-eth0 +/sbin/iptables -t filter -N eth0-eth0 +/sbin/iptables -t filter -A eth0-eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT +/sbin/iptables -t filter -A eth1-eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT +/sbin/iptables -t filter -A root-eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT +/sbin/iptables -t filter -A eth0-eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT + +## definition de la chaine root-eth0 +/sbin/iptables -A root-eth0 -m state --state NEW -d 0/0 -j ACCEPT +# autoriser les connexions au travers d'ipsec +/sbin/iptables -A root-eth0 -m policy --pol ipsec --proto esp --dir out -j ACCEPT + +## definition de la chaine eth0-root +/sbin/iptables -A eth0-root -p esp -j ACCEPT +/sbin/iptables -A eth0-root -m policy --dir in --pol ipsec --proto esp -j ACCEPT + +%if %%nombre_interfaces >= '2' +## definition de la chaine eth0-eth1 +/sbin/iptables -A FORWARD -i %%nom_zone_eth0 -o %%nom_zone_eth1 -j eth0-eth1 +/sbin/iptables -A eth0-eth1 -m policy --dir in --pol ipsec --proto esp -j ACCEPT +/sbin/iptables -A eth0-eth1 -j DROP +## definition de la chaine eth1-eth0 +/sbin/iptables -A FORWARD -i %%nom_zone_eth1 -o %%nom_zone_eth0 -j eth1-eth0 +/sbin/iptables -A eth1-eth0 -m policy --dir out --pol ipsec --proto esp -j ACCEPT +/sbin/iptables -A eth1-eth0 -j DROP +## definition de la chaine eth1-root +/sbin/iptables -A INPUT -d %%adresse_ip_eth1 -i %%nom_zone_eth1 -j eth1-root +/sbin/iptables -A eth1-root -m policy --dir in --pol ipsec --proto esp -j ACCEPT +%end if + +%if %%nombre_interfaces >= '3' +## definition de la chaine eth2-root + %if %%getVar('activer_haute_dispo', 'non') != "non" +/sbin/iptables -A eth%%corosync_dial_if-root -m pkttype --pkt-type multicast -j ACCEPT +/sbin/iptables -A eth%%corosync_dial_if-root -p udp -m udp --dport %%corosync_mcastport -j ACCEPT + %end if +%end if + +%if %%fw_interetab_accept == "oui" +## definition de la chaine eth0-eth0 +# autoriser les connexions inter etablissement au travers d'ipsec +/sbin/iptables -A FORWARD -i %%nom_zone_eth0 -o %%nom_zone_eth0 -j eth0-eth0 + %for %%ip_etab in %%ip_source_etab + %if %%ip_etab.proto_dest_etab == "tout" +/sbin/iptables -A eth0-eth0 -m policy --pol ipsec --proto esp --dir in -s %%ip_etab/%%ip_etab.netmask_source_etab -d %%ip_etab.ip_dest_etab/%%ip_etab.netmask_dest_etab -j ACCEPT + %else if %%ip_etab.proto_dest_etab == "icmp" +/sbin/iptables -A eth0-eth0 -m policy --pol ipsec --proto esp --dir in -s %%ip_etab/%%ip_etab.netmask_source_etab -d %%ip_etab.ip_dest_etab/%%ip_etab.netmask_dest_etab -p %%ip_etab.proto_dest_etab -j ACCEPT + %else +/sbin/iptables -A eth0-eth0 -m policy --pol ipsec --proto esp --dir in -m state --state NEW -s %%ip_etab/%%ip_etab.netmask_source_etab -d %%ip_etab.ip_dest_etab/%%ip_etab.netmask_dest_etab -p %%ip_etab.proto_dest_etab --dport %%ip_etab.port_dest_etab -j ACCEPT + %end if + %end for +#pour finir, on interdit le reste +/sbin/iptables -A eth0-eth0 -m policy --pol ipsec --proto esp --dir in -j DROP + + %if %%getVar('val_mtu_interetab', None) != None +#mise en place de la règle pour fixer le mtu intersite +/sbin/iptables -t mangle -F +/sbin/iptables -t mangle -A FORWARD -i %%nom_zone_eth0 -o %%nom_zone_eth0 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss %%val_mtu_interetab +%% + %end if +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/templates/arv.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/templates/arv.conf new file mode 100644 index 0000000000000000000000000000000000000000..6f24c1ab28260a4f2ea580350b73d88abb87072a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/templates/arv.conf @@ -0,0 +1,196 @@ +# Configuration du Réseau Virtuel Privé +allow_user = %%custom_join(%%arv_allow_user, ',') +sw_database_mode = %%sw_database_mode +%if %%activer_haute_dispo == 'maitre' + %for %%vip in %%vip_resource_name + %if %%vip == 'VIP_externe' +arv_address_ip = %%vip.vip_resource_adresseip + %end if + %if %%vip == 'VIP_interne' +arv_address_ip_private = %%vip.vip_resource_adresseip + %end if + %end for +%else +arv_address_ip = %%adresse_ip_eth0 +arv_address_ip_private = %%adresse_ip_eth1 +%end if +arv_port = %%arv_port +log_level = critical +arv_crt = %%server_cert +arv_key = %%server_key +x509_default_key_bits = %%x509_default_key_bits +ssl_default_cert_time = 1825 +ChildConfig_lifetime = 1200 +ChildConfig_rekeytime = 1020 +ChildConfig_jitter = 180 +ChildConfig_hostaccess = 1 +ChildConfig_mode = 2 +ChildConfig_close_action = 0 +ChildConfig_ipcomp = 0 +IkeConfig_certreq = 1 +%if %%sw_forceencap == 'oui' +IkeConfig_force_encap = 1 +%else +IkeConfig_force_encap = 0 +%end if +PeerConfig_ike_version = 2 +PeerConfig_cert_policy = 1 +PeerConfig_uniqueid = 1 +PeerConfig_auth_method = 1 +PeerConfig_eap_type = 0 +PeerConfig_eap_vendor = 0 +PeerConfig_keyingtries = 1 +PeerConfig_rekeytime = 0 +PeerConfig_reauthtime = 3600 +PeerConfig_jitter = 180 +PeerConfig_overtime = 300 +%if %%sw_mobike == 'oui' +PeerConfig_mobike = 1 +%else +PeerConfig_mobike = 0 +%end if +PeerConfig_dpd_delay = 120 +PeerConfig_mediation = 0 +PeerConfig_mediated_by = 0 +PeerConfig_peer_id = 0 +%if %%getVar('use_pncn', 'oui') == 'non' +suffix_dns = '' +CACert = """-----BEGIN CERTIFICATE----- +MIIDbDCCAlSgAwIBAgIQKTWuGL06M2NDuMGw5Cj3IjANBgkqhkiG9w0BAQUFADA2 +MQswCQYDVQQGEwJmcjENMAsGA1UEChMEZ291djEYMBYGA1UEAxMPUkFDSU5FIEFH +UklBVEVTMB4XDTA5MTIwOTEzMjY0MloXDTIwMTEzMDAxMDAwMlowNjELMAkGA1UE +BhMCZnIxDTALBgNVBAoTBGdvdXYxGDAWBgNVBAMTD1JBQ0lORSBBR1JJQVRFUzCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALbZX6PN43QoUrP4Ul3sNP+I +5oly+lJsaYPR5VokB7WIuU+HCX2V9DVusPdq43tJf2Csih0O+fT4M2KWI/6CkRGg +ChaVJ1d3wB1a71TMCfoihjkYu5NTILmP6C+XNCgds4aYF4RQWJdb+mhqB5NWUmrA +NvJhR7LYBtLj5f2vcOtLzlLFCK7Vsuz+y7j+762FJ2kVjcXTQMFV7zdNqIArE11w +9tCd1IirOlH6FG2YChWv0q6GvSPU+k6QgmUs/n4rH/ST7+5RSNp187HZtsh4m3d7 +YO8vlPqbV3w0AxBUHZzbxjup/39cMjmWen9L7RGUC5rBsz0r+RjSEIJN6qc42PEC +AwEAAaN2MHQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFHq8tGj4saIyRMnQ6/2eBsJWASsDMA4GA1UdDwEB/wQEAwIBhjAfBgNV +HSMEGDAWgBR6vLRo+LGiMkTJ0Ov9ngbCVgErAzANBgkqhkiG9w0BAQUFAAOCAQEA +elq6Qq6gSvtxvdnZIbSxy5WnGLokY1URlAJUbCXITCe6+QUHlSQfiZ1+FeqFBt5a +ZD9BR2fHLbRu2Je26IWeMbjvsFX1CfnNv2CrYsS+Ge3GTVX5tYMcPrPIpKGOS7GS +XYRFGP85RZgvdm5UD8Y6xcgaQG8+E9UqZZ6VqycbO9xJin1D6Kkdnb3SM/15pZSi +4ZeJ7+ZQLtqqLxUaG9THuHOSU2w0l4IgVenxdhgm9o1G1CGLthutprDOBStH5b8s +IJhSMrjsQwf32tX6q24ffghAc0UUnvh7PwoM/TI+lPDcIuOkKVtPyhAR9IMMjGhC +AZFKCrG9SP6o0k/CN1xuHg== +-----END CERTIFICATE----- +""" +%else +suffix_dns = '.%%nom_academie.%%suffixe_domaine_academique' +CACert="""-----BEGIN PKCS7----- +MIIUAwYJKoZIhvcNAQcCoIIT9DCCE/ACAQExADALBgkqhkiG9w0BBwGgghPWMIIG +xjCCBK6gAwIBAgISESFs7msV6YMzhDbImDR4EO59MA0GCSqGSIb3DQEBCwUAMGUx +CzAJBgNVBAYTAkZSMRwwGgYDVQQKDBNFZHVjYXRpb24gTmF0aW9uYWxlMRcwFQYD +VQQLDA4wMDAyIDExMDA0MzAxNTEfMB0GA1UEAwwWQUMgRWR1Y2F0aW9uIE5hdGlv +bmFsZTAeFw0xNDA4MjYwMDAwMDBaFw0yODAzMzExMjAwMDBaMGsxCzAJBgNVBAYT +AkZSMRwwGgYDVQQKDBNFZHVjYXRpb24gTmF0aW9uYWxlMRcwFQYDVQQLDA4wMDAy +IDExMDA0MzAxNTElMCMGA1UEAwwcQUMgRU4gU2NvbGFyaXRlIGV0IEZvcm1hdGlv +bjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKlJF9kxN9iLd98zT+2l +ht2cyRXKsTH3oy/brFka1EiKsb5+D8ZXN4fp35rgpc3MKVajYwQRMZmQpZkRTI6X +9nx1QG+n/l2SkyR4+BAbQB1t1o5nYYJnwzQi5qsqBdJEdTAMmmJf0Itih1AS1peC ++nmqon02EsWvRg2hep4QeZvqstuZBncBBXx/AzrqZT4Xo0MLLbOKS2QA8mHCrdZF +K9T8QDXyoTXpSXJWzcY9Nkt/J1Dx5NBJLe4QXWdezvoqu2JekaR7lupnPFQxTiNo +gxDBndfVaMC7LNOXvUCu4hxBKvTMCvawgY8wpnbNkNYZKnUSRwSXD8W8FG/kc7b+ +Hy32hn6u4GHC5qbFqwwEWwfMLY/d3iS9rFJtYhpVO6o5NwlUz3VUjgUwozbxt3jb +fkemZfzjZ7eyMu6/6hlqFELBzAfWdfx+IxMD6t/4FEM5RUqy057TjxqvTbpCqP9E +89dVpqHuf1xQ6h07rNyHAzT27+8WEaNYxqSPlmK0FvHpysITB5T8vwBgT3608K+Q +DhNHu7+6ogHmugz67IoNHuDSSjpTubJLEoPcLFwtUQZNZFXSI3zNPJP5nUTANgEC +vaU/SAG/PLCMU5dxc4L3iWwgVu0rrUlTFfzeMrULQ4SsE0dgPSVLE3WwYBLrrWh0 +TRBPQ5PskCqYdKRbNwPi+AKzAgMBAAGjggFoMIIBZDAOBgNVHQ8BAf8EBAMCAQYw +QQYDVR0gBDowODA2BgRVHSAAMC4wLAYIKwYBBQUHAgEWIGh0dHA6Ly9wbmNuLmVk +dWNhdGlvbi5nb3V2LmZyL3BjMBIGA1UdEwEB/wQIMAYBAf8CAQAwPQYDVR0fBDYw +NDAyoDCgLoYsaHR0cDovL2NybC5wbmNuLmVkdWNhdGlvbi5nb3V2LmZyL2FjLW1l +bi5jcmwwfAYIKwYBBQUHAQEEcDBuMDgGCCsGAQUFBzAChixodHRwOi8vY2VyLnBu +Y24uZWR1Y2F0aW9uLmdvdXYuZnIvYWMtbWVuLmNlcjAyBggrBgEFBQcwAYYmaHR0 +cDovL29jc3AucG5jbi5lZHVjYXRpb24uZ291di5mci9tZW4wHQYDVR0OBBYEFMwu +Nw8Gsrm16S3/vlI3xh20twcXMB8GA1UdIwQYMBaAFNm/Qt0YmzxmJfq7LgoQiIk2 +LLnLMA0GCSqGSIb3DQEBCwUAA4ICAQCnYLAQop2w4RbsQx3sAIzvYlQHVgp8KpkU +GD9vSTkcQM6qMIqs9GAPjr6SYiYRcnV8isiucZf4u735xpjQmbRQanHQdOb8Jd52 +mEPYcRofoInRKOPJ/ZQPEnCwr8YzhcF+fzxop5eZEu9XmnHcHxihXo36N2cvNIVt +kX+71vgcDnLICcMmWvyMB12mw1QF18w0JxXoV37YTX4EFyMBDPmzbereTrgcYpHQ +ZEZSH3McQgVBWLXln8RXTV78AwvexmlN/SwUiP3o7Mx1nKhYL8ACwSNUVwJ8wHHu +ulS2GdZYS4hFfn32Z98XSkhwb2BFP4w4Y8ejgwvzRK8+/YTV+rZ/t+uqDgK6CqE+ +SXq6o/eCHfvX3QPQ3gXFg4OpztoFuyr6S+6F8ICNxe/jeDXkhfT3PA0ScCRMboHb ++1jd0TGWZSGlQh3Zrt3e3JJR1gU2EC/Sh7reFbzqChWjSc61LNLxvJOeAVw5bVEL +TlkSlMh/hHxbYTDydm0V7GtrJt6/mbFg4LkTDKb+yTLccThUyzlUbXSLsafMJ951 +dp2nALg8H3q5PZ0dP5JIr6rQ/tRj769VS5eqSZvuqXTDdpIhhw5plZLdRIOYA+8u +VWwA5vyAokAAyBRDJ8DzpCloBRjzkiYbz/izhKrQPG9ozckNF0pDjZbK5Ghz8AMX +f8ZfoPf+eDCCBtwwggTEoAMCAQICEhEhR9wdd/e9aYqeGrlHhoffJjANBgkqhkiG +9w0BAQsFADB6MQswCQYDVQQGEwJGUjFHMEUGA1UECgw+TWluaXN0ZXJlIEVkdWNh +dGlvbiBOYXRpb25hbGUgRW5zZWlnbmVtZW50IFN1cGVyaWV1ciBSZWNoZXJjaGUx +IjAgBgNVBAMMGUFDIFJhY2luZSBNaW5pc3RlcmUgRU5FU1IwHhcNMTQwODI2MDAw +MDAwWhcNMjgwMzMxMTIwMDAwWjBlMQswCQYDVQQGEwJGUjEcMBoGA1UECgwTRWR1 +Y2F0aW9uIE5hdGlvbmFsZTEXMBUGA1UECwwOMDAwMiAxMTAwNDMwMTUxHzAdBgNV +BAMMFkFDIEVkdWNhdGlvbiBOYXRpb25hbGUwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQDbMT2WHsNBaX+3EmNCig+jaIDYrlcwlmoaTgfSupdRJOAQzYJF +63d255zMH4eSNGpzSXGdEKb5Dz6kXY68cGye+thyv39oxavoIkVWRGesdjNhgxDv +PatItVIE+J+iqMUknfGGOq74ea5ALOWV2L0Z4AHvkkJlVEe5dnU1blN3etRDowSd +ygBBjGTHt1pHXwyfywcz8nROkxn2LGe6nKkCtODo6L5GsRVH6bv67N2K11dsMJSh +FLtKI8R3TcXh4MTcjvhtyp7pM+Zz7sRkFHAjDnmqLmN9CzUnh94wrqbxklYRffbb +NwvdpIV+GaX9Pa3w+LQ1ZQZzDWMIQm+5t28g9g7VTXTC3RTXa3800yzQPoV+MGOc +R8u+xHG8rIec5DkUUC4seT4e7viYsL2RfFfIHw/5mqJL3Q1i77m7/8xif7m4cA4H +EmQjFMWSUNFuSIh7Ap5o9Zw9mlKGcY51GssALlT+iHH+YPuf1QwZeK06p3nYfnj2 +GTotQmvz98eC75fypUK7DKYhmCGGZZa7JkJ9eQ3l58/2k+K1VvwToNsy2fRo5lRT +eVBx5Hhi4hNDzk+WXQ8mvvzBjTiAFPRmjAoMEsiVgeLOh1yfwH7EHacoetMX/mBQ +MIvyc5i3MFhzRIv67TaQG+k+PvCRMJ7qWsO7eY88f1+Af+9s1OhKTzFTIwIDAQAB +o4IBbzCCAWswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wQQYDVR0g +BDowODA2BgRVHSAAMC4wLAYIKwYBBQUHAgEWIGh0dHA6Ly9wbmNuLmVkdWNhdGlv +bi5nb3V2LmZyL3BjMEAGA1UdHwQ5MDcwNaAzoDGGL2h0dHA6Ly9jcmwucG5jbi5l +ZHVjYXRpb24uZ291di5mci9hYy1tZW5lc3IuY3JsMIGCBggrBgEFBQcBAQR2MHQw +OwYIKwYBBQUHMAKGL2h0dHA6Ly9jZXIucG5jbi5lZHVjYXRpb24uZ291di5mci9h +Yy1tZW5lc3IuY2VyMDUGCCsGAQUFBzABhilodHRwOi8vb2NzcC5wbmNuLmVkdWNh +dGlvbi5nb3V2LmZyL21lbmVzcjAdBgNVHQ4EFgQU2b9C3RibPGYl+rsuChCIiTYs +ucswHwYDVR0jBBgwFoAUPFvznBbSbhYGxS/M7pILbLHSOCUwDQYJKoZIhvcNAQEL +BQADggIBAFjKNoPxmEadk/t1HfUDul8MSe1HBOoxKPJJVYtDRZ8ZE4UJcuSG5BoV +WgXbS1IANj6Z0Q2VYZXV0BmTAqmcR/io+FfM1IVW+HRaRxGe3h+wparbz9ygeGKh +//EW1sFUyqYL3/3jHs0esbSwuxfGZ5q/kqn7G59+JzX5V10SIKeEC5YT6q6G4c5w +dujE0+bj5SIv+c2zTGAse8ZGYkdOe85/vF59vDg58/1p8VJNWgRjE02KtbN2VNeU +ZUBeNScDBAFwUQLZrMcbCMFNm9kxycevND1YcfFSR18DkgIdlfjUhJEU3CCkDHrg +uVDQErRFFr1EXjb2T2yNvfU7rVrlQDhRwjRvi15V9eVkIZJmCeuoo5gXJ/+BNpyd +BJwIXNrJOpJHO92p7ZwBOKTcIcDMtsGgJPxOmQpPVwGK49VEJmOeC5eZNKgtycG6 +rapusHeUqfQs2o/fsnBV+T/L4Sx6lctG2eO6phivv/0c5T+wFCDJh+gqtk+TtgI1 +sYaq2s7TA8RtKvg6eO06IrZPcGL/yj1erwiPshH3XKute9VJ/5xm54Tn2nJZRjL3 +m+0cDz83pWfjr6VKmGwyg69HxcGLAPiVLsH4b+aoGtTVpjnxtdoj8dgbX7tSi+13 ++p9b8UvZk7krj/hnH307JxCJmPYNEBkZBCoDUoJg+4wAZ2ZQoYa+MIIGKDCCBBCg +AwIBAgISESGJ+eg/hmHHgCXXwyfu15IqMA0GCSqGSIb3DQEBCwUAMHoxCzAJBgNV +BAYTAkZSMUcwRQYDVQQKDD5NaW5pc3RlcmUgRWR1Y2F0aW9uIE5hdGlvbmFsZSBF +bnNlaWduZW1lbnQgU3VwZXJpZXVyIFJlY2hlcmNoZTEiMCAGA1UEAwwZQUMgUmFj +aW5lIE1pbmlzdGVyZSBFTkVTUjAeFw0xNDA4MjYwMDAwMDBaFw0yODAzMzExMjAw +MDBaMHoxCzAJBgNVBAYTAkZSMUcwRQYDVQQKDD5NaW5pc3RlcmUgRWR1Y2F0aW9u +IE5hdGlvbmFsZSBFbnNlaWduZW1lbnQgU3VwZXJpZXVyIFJlY2hlcmNoZTEiMCAG +A1UEAwwZQUMgUmFjaW5lIE1pbmlzdGVyZSBFTkVTUjCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBAL8KwWEFVqktJ8T6GK4PYwm1z/l+gi0SA8Y3eVN9diDu +r8DK+S7CLbhDTF483NnuuQ/fQxRvLX3ad9xXMySnxxm9P1fPa3oF0kLdDREZwgi3 +niHZlQITOLrCS1Syw6OZbWAJS6kSMX59abLuh4QOCFgFe8rjv6fbfZcmbh+2ELfq +gzJp/YUmqLrvhL0mmSnlWPymDzTUxUulqBco84QV7UMHSJtt8W+c8UCnEkiZqSmZ +RBl3GMSk4Xej8H/+xPYPg6cNNevS7Bu9cr/3xhRaicZjrkhlMHNyHyHwJv5hYVFS +w7RR+7a+yGNe+ig2btkDxrcf/v5PWuJJ6PpHxByNz4RzVTtWh+OkPrx3rJo1fV5y +nj7L6Uh4uOW4TRdbxQUIIK7dTeOSG1/ezKrXxeTF1xp2rndMIsKFAxg4ujAonjHP +gNmkidvMjMbO0QplfYQRDjJmlKrC2fwl7oLa1ejk0xfhg6b8szBAkvKf0WEJ/CAk +r5XOvo5nPaWGVGqGpnLMm9BGQrZs/17DzP/hS/Pr7yqv8RzM2YdSSGcq65bPiFkN +XdUiPxiepz9pwPw19roYywkxqhg1ouQKrmF5c+y+Ul4c143qO1XpFXmhmC7acxw2 +nOrS0fIO/L+vWwK2NufNxygIU+UnooLtFsSZHMBZwB7ZXMIisZyfMhnXCbMdCEEH +AgMBAAGjgacwgaQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wQQYD +VR0gBDowODA2BgRVHSAAMC4wLAYIKwYBBQUHAgEWIGh0dHA6Ly9wbmNuLmVkdWNh +dGlvbi5nb3V2LmZyL3BjMB0GA1UdDgQWBBQ8W/OcFtJuFgbFL8zukgtssdI4JTAf +BgNVHSMEGDAWgBQ8W/OcFtJuFgbFL8zukgtssdI4JTANBgkqhkiG9w0BAQsFAAOC +AgEAgWUHFpfFYEFMRrM1WofV5xcQVSC9W2sQWotY5pEPLf2E/gJ+rWqVJj40djDb +0P5HqDYDW+GO/RSMIx6pvbLVOsyrVNLzdDQGdAAIGdyPYa+A80RwQG23fWsUOeLN +1ZNFbvhK5ajLnjOmsaiozj/zxBr8aZsHq1kfzWEaQVAFcTX6PYw3zyKTHZsABVHj +BNXAmWWn8u0YYYodUyKXVAW51qmKMEILXEKziISkH/R9Jcgioe9jbzCk/MvQQTrk +3GE/EDpIiLgawgoE6THb/3o5iqKCQLeVWgmgOfgSCOobu9w3LrGOTrR0hHQ/Hz+0 +zKokAyPlr0eTUSTri35SSTQH9yJIh0QowUCyi98qBB865kIDuluNMuDE2lmPuBWV +EZNBuvQaxd6U//W9p7IceOM14ThQa84wO/f9ujQl3S31Ya5jlnxrERevxOXDMvWp +egInuIz3hKSxkD31rKSYnT9VLuB8TI15aPW1r/k/NFsgpQTkMVAUabaYVRTZT5Z4 +xPp64D6WXMAnTQlJJKJT+6hMPXQ7ZU1FX99n2aajywW05fjHJ26J9ducVcAw7rEN +Uh4fBVJLwmz/HjHElF7/yiiYO9pM67ErW9F3NDIrPMM8VJW4tqPazBkK6W0U9iTx +/DfE1x8voAdRJfK1dUrHBZcRXKa2q7MW8szfBT+eMoMnR4qhADEA +-----END PKCS7----- +""" +%end if +# Types de modules acceptés +# ATTENTION, ne pas oublier la virgule en fin de liste +amon_module_list = amon, +sphynx_module_list = sphynx, diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/templates/ca-sphynx.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/templates/ca-sphynx.conf new file mode 100644 index 0000000000000000000000000000000000000000..22d3260552e3a028cfff1b605a2247dbeaa0b8db --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/templates/ca-sphynx.conf @@ -0,0 +1,85 @@ +######################################################################## +# Fichier de configuration d'OpenSSL +######################################################################## + +# Fichier de configuration d'OpenSSL pour la génération d'une requête de +# certificat au format PKCS#10. +# +HOME = . +RANDFILE = /etc/ssl/.rand + + +#################################################################### +[ ca ] +default_ca = CA_default # The default ca section + +[ CA_default ] +dir = /var/lib/arv/CA +certs = $dir/certs +crl_dir = $dir/crl +database = $dir/index.txt +new_certs_dir = $dir/newcerts +certificate = $dir/certs/CaCert.pem +serial = $dir/serial +#crl = $dir/ca.crl +private_key = $dir/private/ca.key +default_days = 1825 +default_crl_days = 30 +default_md = sha256 +preserve = no +unique_subject = no +policy = policy_anything +email_in_dn = no + +[ policy_anything ] +countryName = supplied +stateOrProvinceName = optional +%if %%getVar('use_pncn', 'non') == 'non' +localityName = optional +%else +localityName = supplied +%end if +organizationName = supplied +organizationalUnitName = supplied +commonName = supplied +emailAddress = optional + +[ req ] +default_days = 1825 +default_bits = %%x509_default_key_bits +distinguished_name = req_distinguished_name +x509_extensions = ac-ext +copy_extensions = copy +string_mask = nombstr +default_md = sha256 +input_password = secret +output_password = secret +prompt = no + +[ req_distinguished_name ] +#countryName = Country Name (2 letter code) +countryName = %%x509_country_name + +#organizationName = Organization Name (eg, company) +organizationName = %%x509_organization_name + +%if %%getVar('use_pncn', 'non') == 'oui' +## localityName = Locality Name (eg, city) +localityName = %%x509_locality_name + +%end if +## OrganizationUnitName +%for %%idx, %%x509_ou in %%enumerate(%%x509_organization_unit_name) +%%{idx}.organizationalUnitName = %%x509_ou +%end for +#commonName = Nom du serveur +commonName = CA-%%nom_machine-RVP + +[ac-ext] +#nsComment = "" +subjectKeyIdentifier = hash +authorityKeyIdentifier = keyid,issuer:always +basicConstraints = critical,CA:TRUE +keyUsage = critical,digitalSignature,keyCertSign,cRLSign +nsCertType = objCA +#extendedKeyUsage = critical,serverAuth diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/templates/certif-vpn.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/templates/certif-vpn.conf new file mode 100644 index 0000000000000000000000000000000000000000..57003dee2d7fbfced85ef2933c8342f9e27eee99 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/templates/certif-vpn.conf @@ -0,0 +1,82 @@ +######################################################################## +# Fichier de configuration d'OpenSSL +######################################################################## + +# Fichier de configuration d'OpenSSL pour la génération d'une requête de +# certificat au format PKCS#10. +# +HOME = . +RANDFILE = /etc/ssl/.rand + + +#################################################################### +[ ca ] +default_ca = CA_default # The default ca section + +[ CA_default ] +dir = /var/lib/arv/CA +certs = $dir/certs +crl_dir = $dir/crl +database = $dir/index.txt +new_certs_dir = $dir/newcerts +certificate = $dir/certs/CaCert.pem +serial = $dir/serial +#crl = $dir/ca.crl +private_key = $dir/private/ca.key +default_days = @@DEFAULT_DAYS@@ +default_md = sha256 +preserve = no +unique_subject = no +policy = policy_anything +email_in_dn = no + +[ policy_anything ] +countryName = supplied +stateOrProvinceName = optional +%if %%getVar('use_pncn', 'non') == 'non' +localityName = optional +%else +localityName = supplied +%end if +organizationName = supplied +organizationalUnitName = supplied +commonName = supplied +emailAddress = optional + +[ req ] +default_bits = %%x509_default_key_bits +#default_keyfile = /tmp/privkey.pem +distinguished_name = req_distinguished_name +x509_extensions = serv-ext +#req_extensions = serv-ext +string_mask = nombstr +encrypt_key = yes +default_md = sha256 +input_password = '@@PASSWD@@' +output_password = '@@PASSWD@@' +prompt = no + +[ req_distinguished_name ] +##countryName = Country Name (2 letter code) +countryName = %%x509_country_name + +##organizationName = Organization Name (eg, company) +organizationName = %%x509_organization_name + +%if %%getVar('use_pncn', 'non') == 'oui' +## localityName = Locality Name (eg, city) +localityName = %%x509_locality_name + +%end if +## OrganizationUnitName +%for %%idx, %%x509_ou in %%enumerate(%%x509_organization_unit_name) +%%{idx}.organizationalUnitName = %%x509_ou +%end for +##CommonName +commonName = @@CN-SERVEUR@@ + +[serv-ext] +subjectKeyIdentifier = hash +authorityKeyIdentifier = keyid,issuer:always +basicConstraints = CA:FALSE +keyUsage = nonRepudiation, digitalSignature, keyEncipherment diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/templates/ospfd.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/templates/ospfd.conf new file mode 100644 index 0000000000000000000000000000000000000000..87e40eb76ff3b1e592e607cd7877c8e0f408f1d1 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/templates/ospfd.conf @@ -0,0 +1,16 @@ +! -*- ospf -*- +! +! OSPFd sample configuration file +! +! +hostname %%nom_machine.%%nom_domaine_local +password zebra +!enable password please-set-at-here +! +router ospf +! network 192.168.1.0/24 area 0 +%for %%reseau in %%dyn_route_network +network %%reseau/%%calc_classe(%%reseau.dyn_route_netmask) area 0 +%end for +! +log stdout diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/templates/quagga-daemons b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/templates/quagga-daemons new file mode 100644 index 0000000000000000000000000000000000000000..e0cb57ac76c7b0df93ac1429db2fed5808e864ec --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/templates/quagga-daemons @@ -0,0 +1,42 @@ +# This file tells the quagga package which daemons to start. +# +# Entries are in the format: <daemon>=(yes|no|priority) +# 0, "no" = disabled +# 1, "yes" = highest priority +# 2 .. 10 = lower priorities +# Read /usr/share/doc/quagga/README.Debian for details. +# +# Sample configurations for these daemons can be found in +# /usr/share/doc/quagga/examples/. +# +# ATTENTION: +# +# When activation a daemon at the first time, a config file, even if it is +# empty, has to be present *and* be owned by the user and group "quagga", else +# the daemon will not be started by /etc/init.d/quagga. The permissions should +# be u=rw,g=r,o=. +# When using "vtysh" such a config file is also needed. It should be owned by +# group "quaggavty" and set to ug=rw,o= though. +# +%if %%dyn_route == "non" +zebra=no +bgpd=no +ospfd=no +ospf6d=no +ripd=no +ripngd=no +isisd=no +%else if %%dyn_route =="oui" +zebra=yes +%if %%dyn_route_type == "ospf" +ospfd=yes +ripd=no +%else if %%dyn_route_type == "rip" +ospfd=no +ripd=yes +%end if +ospf6d=no +bgpd=no +ripngd=no +isisd=no +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/templates/quagga.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/templates/quagga.conf new file mode 100644 index 0000000000000000000000000000000000000000..e448f3bef10cf4d0f6f2423c8fae5ca70be1d91c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/templates/quagga.conf @@ -0,0 +1,28 @@ +# +# If this option is set the /etc/init.d/quagga script automatically loads +# the config via "vtysh -b" when the servers are started. +# +%if %%dyn_route == "non" +vtysh_enable=no +zebra_options=" --daemon -A 127.0.0.1" +bgpd_options=" --daemon -A 127.0.0.1" +ospfd_options=" --daemon -A 127.0.0.1" +ospf6d_options="--daemon -A ::1" +ripd_options=" --daemon -A 127.0.0.1" +ripngd_options="--daemon -A ::1" +isisd_options=" --daemon -A 127.0.0.1" +%else if %%dyn_route == "oui" +vtysh_enable=yes +zebra_options=" --daemon -A %%adresse_ip_eth1" +bgpd_options=" --daemon -A 127.0.0.1" +%if %%dyn_route_type == "ospf" +ospfd_options=" --daemon -A %%adresse_ip_eth1" +ripd_options=" --daemon -A 127.0.0.1" +%else if %%dyn_route_type == "rip" +ospfd_options=" --daemon -A 127.0.0.1" +%end if +ripd_options=" --daemon -A %%adresse_ip_eth1" +ospf6d_options="--daemon -A ::1" +ripngd_options="--daemon -A ::1" +isisd_options=" --daemon -A 127.0.0.1" +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/templates/ripd.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/templates/ripd.conf new file mode 100644 index 0000000000000000000000000000000000000000..9189da71f518e50e0baf857e0925fb49f4d43b17 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/templates/ripd.conf @@ -0,0 +1,32 @@ +! -*- rip -*- +! +! RIPd sample configuration file +! +! $Id: ripd.conf.sample,v 1.1.1.1 2002/12/13 20:15:30 paul Exp $ +! +hostname %%nom_machine.%%nom_domaine_local +password zebra +! +! debug rip events +! debug rip packet +! +router rip + version 2 + network %%nom_zone_eth1 + distribute-list private-only in %%nom_zone_eth1 + redistribute kernel +! network 11.0.0.0/8 +! network %%nom_zone_eth0 +! route 10.0.0.0/8 +! distribute-list private-only in %%nom_zone_eth0 +! +%for %%reseau in %%dyn_route_network +access-list private-only permit %%reseau/%%calc_classe(%%reseau.dyn_route_netmask) +%end for +!access-list private-only deny any +! access-list private-only permit %%nom_zone_eth1 + access-list private-only deny any +! +log file /var/log/quagga/ripd.log +! +log stdout diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/templates/zebra.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/templates/zebra.conf new file mode 100644 index 0000000000000000000000000000000000000000..f38012d11ce727bb1a9938d1b96f08af67e39238 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sphynx/templates/zebra.conf @@ -0,0 +1,25 @@ +! -*- zebra -*- +! +! zebra sample configuration file +! +! $Id: zebra.conf.sample,v 1.1.1.1 2002/12/13 20:15:30 paul Exp $ +! +hostname %%nom_machine.%%nom_domaine_local +password zebra +enable password zebra +! +! Interface's description. +! +!interface lo +! description test of desc. +! +!interface sit0 +! multicast + +! +! Static default route sample. +! +!ip route 0.0.0.0/0 203.181.89.241 +! + +!log file /var/log/quagga/zebra.log diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso-cluster-client/dictionaries/00_eole-sso-cluster-client_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso-cluster-client/dictionaries/00_eole-sso-cluster-client_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..18e84f3d9b5f969f7bba68832432d713a6a48583 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso-cluster-client/dictionaries/00_eole-sso-cluster-client_packages.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>python-redis</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso-cluster-client/dictionaries/23_sso_cluster_client.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso-cluster-client/dictionaries/23_sso_cluster_client.xml new file mode 100644 index 0000000000000000000000000000000000000000..c3218e924695e02fff79cbddead0f9eb5d25eb72 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso-cluster-client/dictionaries/23_sso_cluster_client.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<creole> + <files> + <file filelist="eolesso_cluster_client" name="/etc/stunnel/redis_client.conf" source="stunnel_redis_client.conf" rm='True'/> + </files> + <variables> + <family name='eole sso cluster'> + <variable name='eolesso_stunnel_server' type='domain' description="Adresse d'accès au service Redis distant (stunnel)" mandatory='True'/> + <variable name='redis_client_cert' type='filename' description="Chemin du certificat client stunnel (Redis)" mode="expert"> + <value>/etc/ssl/certs/stunnel_client.crt</value> + </variable> + <variable name='redis_client_key' type='filename' description="Chemin de la clé du client stunnel (Redis)" mode="expert"> + <value>/etc/ssl/private/stunnel_client.key</value> + </variable> + </family> + </variables> + <constraints> + <condition name='disabled_if_in' source='eolesso_cluster_server'> + <param>oui</param> + <target type='variable'>eolesso_stunnel_server</target> + <target type='variable'>redis_client_cert</target> + <target type='variable'>redis_client_key</target> + <target type='filelist'>eolesso_cluster_client</target> + </condition> + </constraints> + <help> + <variable name='eolesso_stunnel_server'>Adresse IP ou DNS du serveur hébergeant Redis</variable> + <variable name='redis_client_cert'>Chemin du certificat utilisé pour se connecter à Redis.\n Copier la CA associée (/etc/ssl/certs/ca_local.crt par défaut)\ndans le répertoire /etc/stunnel/eole du serveur</variable> + <variable name='redis_client_key'>Chemin de la clé du Certificat utilisé pour se connecter à Redis</variable> + </help> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso-cluster-client/files/usr/share/eole/certs/10_stunnel_client.gen_cert b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso-cluster-client/files/usr/share/eole/certs/10_stunnel_client.gen_cert new file mode 100644 index 0000000000000000000000000000000000000000..8b6b4031a2d0046a43c131c64c00732f34478093 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso-cluster-client/files/usr/share/eole/certs/10_stunnel_client.gen_cert @@ -0,0 +1,7 @@ +if client.get_creole('eolesso_activer_cluster') == 'oui' and client.get_creole('eolesso_cluster_server') == "non": + # generation du certificat pour stunnel (protection de Redis) + gen_certif(certfile='/etc/ssl/certs/stunnel_client.crt', keyfile='/etc/ssl/private/stunnel_client.key', regen=regen, client_cert=True) + # creation d'un fichier PEM contenant certificat et clef + concat_fic('/etc/ssl/certs/stunnel_client.pem', ['/etc/ssl/certs/stunnel_client.crt', '/etc/ssl/private/stunnel_client.key'], True) + # application des droits 640 sur le fichier stunnel_client.pem + finalise_cert('/etc/ssl/certs/stunnel_client.pem', '/etc/ssl/private/stunnel_client.key', cert_chmod="640", key_chmod="600") diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso-cluster-client/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso-cluster-client/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..06c7ae1f4a7c968fbb866c83ee2f707b0d342a11 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso-cluster-client/service.yml @@ -0,0 +1,30 @@ +format: '0.1' +name: eole-sso-cluster-client +version: |- + 2.7.0-6 +description: |- + Activation d'un client stunnel pour stocker les sessions dans Redis + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: + - eole-sso + - eole-sso-cluster-common +packages: + - python-redis +dictionaries: + - 23_sso_cluster_client.xml +extra_dictionaries: {} +templates: + - stunnel_redis_client.conf +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: [] +files: + /usr/share/eole/certs/10_stunnel_client.gen_cert: + owner: root + group: root + mode: '0644' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso-cluster-client/templates/stunnel_redis_client.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso-cluster-client/templates/stunnel_redis_client.conf new file mode 100644 index 0000000000000000000000000000000000000000..a6cd44bc96487f5a1f3a77c64d6ae2f370c7d081 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso-cluster-client/templates/stunnel_redis_client.conf @@ -0,0 +1,10 @@ +pid = /var/run/stunnel.pid +[redis_tunnel] +client = yes +cert = %%redis_client_cert +key = %%redis_client_key +CApath = /etc/stunnel/eole +verify = 2 +SSLversion=TLSv1 +accept = 127.0.0.1:%%eolesso_stunnel_port +connect = %%eolesso_stunnel_server:%%eolesso_stunnel_port diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso-cluster-common/dictionaries/00_eole-sso-cluster-common_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso-cluster-common/dictionaries/00_eole-sso-cluster-common_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..59e23ae1d7ee15e4789f520291878166c9b02fd2 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso-cluster-common/dictionaries/00_eole-sso-cluster-common_packages.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>stunnel4</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso-cluster-common/dictionaries/21_sso_cluster_common.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso-cluster-common/dictionaries/21_sso_cluster_common.xml new file mode 100644 index 0000000000000000000000000000000000000000..14d3a3de1667621b83c55e361909cefd957039ef --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso-cluster-common/dictionaries/21_sso_cluster_common.xml @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="utf-8"?> +<creole> + <files> + <file filelist="eolesso_cluster" name="/etc/default/stunnel4" source="stunnel4_default" rm='True'/> + <service servicelist="eolesso_cluster">stunnel4</service> + </files> + <variables> + <family name='service'> + <!-- FIXME : always hidden :o --> + <variable name='eolesso_activer_cluster' type='oui/non' description="Activer le mode cluster" hidden='True'> + <value>oui</value> + </variable> + </family> + <family name='eole sso cluster' icon='redis'> + <variable name='eolesso_cluster_server' type='oui/non' description="oui si cluster-server installé" hidden='True'> + <value>non</value> + </variable> + <variable name='eolesso_stunnel_port' type='port' description="Port pour l'accès au service Redis à travers un tunnel SSL"> + <value>6380</value> + </variable> + </family> + </variables> + <constraints> + <condition name='disabled_if_in' source='eolesso_activer_cluster'> + <param>non</param> + <target type='family'>eole sso cluster</target> + <target type='filelist'>eolesso_cluster</target> + <target type='servicelist'>eolesso_cluster</target> + <target type='filelist' optional='True'>eolesso_cluster_server</target> + <target type='servicelist' optional='True'>eolesso_cluster_server</target> + <target type='filelist' optional='True'>eolesso_cluster_client</target> + </condition> + </constraints> + <help> + <family name='eole sso cluster'>Configuration d'EoleSSO en mode cluster</family> + <variable name='eolesso_activer_cluster'>Active le stockage des sessions dans une base Redis</variable> + <variable name='eolesso_stunnel_port'>Port permettant d'accéder au serveur Redis à travers un tunnel SSL</variable> + </help> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso-cluster-common/posttemplates/30-eolesso-cluster b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso-cluster-common/posttemplates/30-eolesso-cluster new file mode 100644 index 0000000000000000000000000000000000000000..38b860988890cdcbff5fc848bb7e6e38f49f2902 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso-cluster-common/posttemplates/30-eolesso-cluster @@ -0,0 +1,5 @@ +#!/bin/bash + +c_rehash /etc/stunnel/eole >/dev/null + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso-cluster-common/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso-cluster-common/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..90c649e5432494505209e74dad96e4eedbbb2e51 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso-cluster-common/service.yml @@ -0,0 +1,26 @@ +format: '0.1' +name: eole-sso-cluster-common +version: |- + 2.7.0-6 +description: |- + Configuration d'EoleSSO pour stockage des sessions dans un base + Redis (via stunnel). Fichiers communs au mode serveur et client. + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: [] +packages: + - stunnel4 +dictionaries: + - 21_sso_cluster_common.xml +extra_dictionaries: {} +templates: + - stunnel4_default +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: + - 30-eolesso-cluster +files: {} +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso-cluster-common/templates/stunnel4_default b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso-cluster-common/templates/stunnel4_default new file mode 100644 index 0000000000000000000000000000000000000000..5737c5ee1e2725ef8f0830b2d6cb34615ee9c2fa --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso-cluster-common/templates/stunnel4_default @@ -0,0 +1,11 @@ +# /etc/default/stunnel +# Julien LEMOINE <speedblue@debian.org> +# September 2003 + +# Change to one to enable stunnel automatic startup +ENABLED=1 +FILES="/etc/stunnel/*.conf" +OPTIONS="" + +# Change to one to enable ppp restart scripts +PPP_RESTART=0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso-cluster-server/dictionaries/00_eole-sso-cluster-server_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso-cluster-server/dictionaries/00_eole-sso-cluster-server_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..9db2a64f6cfbc1e3ea00c1eff8f3413cdc4a6354 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso-cluster-server/dictionaries/00_eole-sso-cluster-server_packages.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>redis-server</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso-cluster-server/dictionaries/22_sso_cluster_server.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso-cluster-server/dictionaries/22_sso_cluster_server.xml new file mode 100644 index 0000000000000000000000000000000000000000..7b9f02748b4a1ebcad823eb090857709db05e752 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso-cluster-server/dictionaries/22_sso_cluster_server.xml @@ -0,0 +1,51 @@ +<?xml version="1.0" encoding="utf-8"?> +<creole> + <files> + <file filelist="eolesso_cluster_stunnel" name="/etc/stunnel/redis_server.conf" source="stunnel_redis_server.conf" rm='True'/> + <file filelist="eolesso_cluster_redis" name="/etc/redis/redis-eolesso.conf" rm='True'/> + <service servicelist="eolesso_cluster_redis">redis-eolesso</service> + <service_access service='stunnel4'> + <port port_type="SymLinkOption">eolesso_stunnel_port</port> + <tcpwrapper>redis_tunnel</tcpwrapper> + </service_access> + </files> + <variables> + <family name='eole sso cluster'> + <variable name='eolesso_cluster_server' redefine='True'> + <value>oui</value> + </variable> + <variable name='eolesso_stunnel_host' type='domain' description="Adresse pour l'accès au service Redis depuis l'extérieur (stunnel)" mandatory='True'/> + <variable name='eolesso_redis_host' type='domain' description="Adresse du serveur Redis" mode="expert"> + <value>localhost</value> + </variable> + <variable name='eolesso_redis_port' type='port' description="Port du serveur Redis" mode="expert" mandatory='True'/> + <variable name='redis_server_cert' type='filename' description="Chemin du certificat Serveur stunnel (Redis)" mode="expert"> + <value>/etc/ssl/certs/stunnel_server.crt</value> + </variable> + <variable name='redis_server_key' type='filename' description="Chemin de la clé du Serveur stunnel (Redis)" mode="expert"> + <value>/etc/ssl/private/stunnel_server.key</value> + </variable> + </family> + </variables> + <constraints> + <fill name='calc_val' target='eolesso_stunnel_host'> + <param type='eole' name='valeur'>adresse_ip_eth0</param> + </fill> + <fill name='calc_val' target='eolesso_redis_port'> + <param type='eole' name='valeur'>eolesso_stunnel_port</param> + </fill> + <condition name='disabled_if_not_in' source='eolesso_redis_host'> + <param>localhost</param> + <param>127.0.0.1</param> + <target type='servicelist'>eolesso_cluster_redis</target> + <target type='filelist'>eolesso_cluster_redis</target> + </condition> + </constraints> + <help> + <variable name='eolesso_stunnel_host'>Adresse IP ou DNS permettant aux clients d'accéder au serveur Redis à travers stunnel</variable> + <variable name='eolesso_redis_host'>Adresse IP ou DNS du serveur Redis</variable> + <variable name='eolesso_redis_port'>Port du serveur Redis</variable> + <variable name='redis_server_cert'>Chemin du certificat utilisé pour sécuriser l'accès à Redis.\n Copier la CA associée (/etc/ssl/certs/ca_local.crt par défaut)\ndans le répertoire /etc/stunnel/eole des clients</variable> + <variable name='redis_server_key'>Chemin de la clé du Certificat utilisé pour sécuriser l'accès à Redis</variable> + </help> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso-cluster-server/files/lib/systemd/system/redis-eolesso.service b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso-cluster-server/files/lib/systemd/system/redis-eolesso.service new file mode 100644 index 0000000000000000000000000000000000000000..d5567047d0700aa7ebfb6eddcace53b50803f16c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso-cluster-server/files/lib/systemd/system/redis-eolesso.service @@ -0,0 +1,37 @@ +[Unit] +Description=Advanced key-value store +After=network.target +Documentation=http://redis.io/documentation, man:redis-server(1) + +[Service] +Type=forking +ExecStart=/usr/bin/redis-server /etc/redis/redis-eolesso.conf +PIDFile=/var/run/redis/redis-eolesso.pid +TimeoutStopSec=0 +Restart=always +User=redis +Group=redis + +ExecStartPre=-/bin/run-parts --verbose /etc/redis/redis-server.pre-up.d +ExecStartPost=-/bin/run-parts --verbose /etc/redis/redis-server.post-up.d +ExecStop=-/bin/run-parts --verbose /etc/redis/redis-server.pre-down.d +ExecStop=/bin/kill -s TERM $MAINPID +ExecStopPost=-/bin/run-parts --verbose /etc/redis/redis-server.post-down.d + +PrivateTmp=yes +PrivateDevices=yes +ProtectHome=yes +ReadOnlyDirectories=/ +ReadWriteDirectories=-/var/lib/redis +ReadWriteDirectories=-/var/log/redis +ReadWriteDirectories=-/var/run/redis +CapabilityBoundingSet=~CAP_SYS_PTRACE + +# redis-server writes its own config file when in cluster mode so we allow +# writing there (NB. ProtectSystem=true over ProtectSystem=full) +ProtectSystem=true +ReadWriteDirectories=-/etc/redis + +[Install] +WantedBy=multi-user.target +Alias=redis-eolesso.service diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso-cluster-server/files/usr/share/eole/certs/10_stunnel_server.gen_cert b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso-cluster-server/files/usr/share/eole/certs/10_stunnel_server.gen_cert new file mode 100644 index 0000000000000000000000000000000000000000..34abf40fc18358cbe08d816c412e4b6ca33571b3 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso-cluster-server/files/usr/share/eole/certs/10_stunnel_server.gen_cert @@ -0,0 +1,7 @@ +if client.get_creole('eolesso_activer_cluster') == 'oui': + # generation du certificat pour stunnel (protection de Redis) + gen_certif(certfile='/etc/ssl/certs/stunnel_server.crt', keyfile='/etc/ssl/private/stunnel_server.key', regen=regen) + # creation d'un fichier PEM contenant certificat et clef + concat_fic('/etc/ssl/certs/stunnel_server.pem', ['/etc/ssl/certs/stunnel_server.crt', '/etc/ssl/private/stunnel_server.key'], True) + # application des droits 640 sur le fichier stunnel_server.pem + finalise_cert('/etc/ssl/certs/stunnel_server.pem', '/etc/ssl/private/stunnel_server.key', cert_chmod="640", key_chmod="600") diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso-cluster-server/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso-cluster-server/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..5ecadbf567a57d4182726a18548691c896c04a6f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso-cluster-server/service.yml @@ -0,0 +1,34 @@ +format: '0.1' +name: eole-sso-cluster-server +version: |- + 2.7.0-6 +description: |- + Configuration de Redis pour EoleSSO avec accès par stunnel + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: + - eole-sso-cluster-common +packages: + - redis-server +dictionaries: + - 22_sso_cluster_server.xml +extra_dictionaries: {} +templates: + - redis-eolesso.conf + - stunnel_redis_server.conf +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: [] +files: + /lib/systemd/system/redis-eolesso.service: + owner: root + group: root + mode: '0644' + /usr/share/eole/certs/10_stunnel_server.gen_cert: + owner: root + group: root + mode: '0644' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso-cluster-server/templates/redis-eolesso.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso-cluster-server/templates/redis-eolesso.conf new file mode 100644 index 0000000000000000000000000000000000000000..24622bf229f1c510ae1f5aa1c01d89d71007f9b1 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso-cluster-server/templates/redis-eolesso.conf @@ -0,0 +1,943 @@ +# Redis configuration file example. +# +# Note that in order to read the configuration file, Redis must be +# started with the file path as first argument: +# +# ./redis-server /path/to/redis.conf + +# Note on units: when memory size is needed, it is possible to specify +# it in the usual form of 1k 5GB 4M and so forth: +# +# 1k => 1000 bytes +# 1kb => 1024 bytes +# 1m => 1000000 bytes +# 1mb => 1024*1024 bytes +# 1g => 1000000000 bytes +# 1gb => 1024*1024*1024 bytes +# +# units are case insensitive so 1GB 1Gb 1gB are all the same. + +################################## INCLUDES ################################### + +# Include one or more other config files here. This is useful if you +# have a standard template that goes to all Redis servers but also need +# to customize a few per-server settings. Include files can include +# other files, so use this wisely. +# +# Notice option "include" won't be rewritten by command "CONFIG REWRITE" +# from admin or Redis Sentinel. Since Redis always uses the last processed +# line as value of a configuration directive, you'd better put includes +# at the beginning of this file to avoid overwriting config change at runtime. +# +# If instead you are interested in using includes to override configuration +# options, it is better to use include as the last line. +# +# include /path/to/local.conf +# include /path/to/other.conf + +################################ GENERAL ##################################### + +# By default Redis does not run as a daemon. Use 'yes' if you need it. +# Note that Redis will write a pid file in /var/run/redis.pid when daemonized. +daemonize yes + +# When running daemonized, Redis writes a pid file in /var/run/redis.pid by +# default. You can specify a custom pid file location here. +pidfile /var/run/redis/redis-eolesso.pid + +# Accept connections on the specified port, default is 6379. +# If port 0 is specified Redis will not listen on a TCP socket. +port %%eolesso_redis_port + +# TCP listen() backlog. +# +# In high requests-per-second environments you need an high backlog in order +# to avoid slow clients connections issues. Note that the Linux kernel +# will silently truncate it to the value of /proc/sys/net/core/somaxconn so +# make sure to raise both the value of somaxconn and tcp_max_syn_backlog +# in order to get the desired effect. +tcp-backlog 511 + +# By default Redis listens for connections from all the network interfaces +# available on the server. It is possible to listen to just one or multiple +# interfaces using the "bind" configuration directive, followed by one or +# more IP addresses. +# +# Examples: +# +# bind 192.168.1.100 10.0.0.1 +bind 127.0.0.1 + +# Specify the path for the Unix socket that will be used to listen for +# incoming connections. There is no default, so Redis will not listen +# on a unix socket when not specified. +# +# unixsocket /var/run/redis/redis.sock +# unixsocketperm 700 + +# Close the connection after a client is idle for N seconds (0 to disable) +timeout 0 + +# TCP keepalive. +# +# If non-zero, use SO_KEEPALIVE to send TCP ACKs to clients in absence +# of communication. This is useful for two reasons: +# +# 1) Detect dead peers. +# 2) Take the connection alive from the point of view of network +# equipment in the middle. +# +# On Linux, the specified value (in seconds) is the period used to send ACKs. +# Note that to close the connection the double of the time is needed. +# On other kernels the period depends on the kernel configuration. +# +# A reasonable value for this option is 60 seconds. +tcp-keepalive 0 + +# Specify the server verbosity level. +# This can be one of: +# debug (a lot of information, useful for development/testing) +# verbose (many rarely useful info, but not a mess like the debug level) +# notice (moderately verbose, what you want in production probably) +# warning (only very important / critical messages are logged) +loglevel notice + +# Specify the log file name. Also the empty string can be used to force +# Redis to log on the standard output. Note that if you use standard +# output for logging but daemonize, logs will be sent to /dev/null +logfile /var/log/redis/redis-eolesso.log + +# To enable logging to the system logger, just set 'syslog-enabled' to yes, +# and optionally update the other syslog parameters to suit your needs. +# syslog-enabled no + +# Specify the syslog identity. +# syslog-ident redis + +# Specify the syslog facility. Must be USER or between LOCAL0-LOCAL7. +# syslog-facility local0 + +# Set the number of databases. The default database is DB 0, you can select +# a different one on a per-connection basis using SELECT <dbid> where +# dbid is a number between 0 and 'databases'-1 +databases 16 + +################################ SNAPSHOTTING ################################ +# +# Save the DB on disk: +# +# save <seconds> <changes> +# +# Will save the DB if both the given number of seconds and the given +# number of write operations against the DB occurred. +# +# In the example below the behaviour will be to save: +# after 900 sec (15 min) if at least 1 key changed +# after 300 sec (5 min) if at least 10 keys changed +# after 60 sec if at least 10000 keys changed +# +# Note: you can disable saving completely by commenting out all "save" lines. +# +# It is also possible to remove all the previously configured save +# points by adding a save directive with a single empty string argument +# like in the following example: +# +# save "" + +save 900 1 +save 300 10 +save 60 10000 + +# By default Redis will stop accepting writes if RDB snapshots are enabled +# (at least one save point) and the latest background save failed. +# This will make the user aware (in a hard way) that data is not persisting +# on disk properly, otherwise chances are that no one will notice and some +# disaster will happen. +# +# If the background saving process will start working again Redis will +# automatically allow writes again. +# +# However if you have setup your proper monitoring of the Redis server +# and persistence, you may want to disable this feature so that Redis will +# continue to work as usual even if there are problems with disk, +# permissions, and so forth. +stop-writes-on-bgsave-error yes + +# Compress string objects using LZF when dump .rdb databases? +# For default that's set to 'yes' as it's almost always a win. +# If you want to save some CPU in the saving child set it to 'no' but +# the dataset will likely be bigger if you have compressible values or keys. +rdbcompression yes + +# Since version 5 of RDB a CRC64 checksum is placed at the end of the file. +# This makes the format more resistant to corruption but there is a performance +# hit to pay (around 10%) when saving and loading RDB files, so you can disable it +# for maximum performances. +# +# RDB files created with checksum disabled have a checksum of zero that will +# tell the loading code to skip the check. +rdbchecksum yes + +# The filename where to dump the DB +dbfilename dump-eolesso.rdb + +# The working directory. +# +# The DB will be written inside this directory, with the filename specified +# above using the 'dbfilename' configuration directive. +# +# The Append Only File will also be created inside this directory. +# +# Note that you must specify a directory here, not a file name. +dir /var/lib/redis + +################################# REPLICATION ################################# + +# Master-Slave replication. Use slaveof to make a Redis instance a copy of +# another Redis server. A few things to understand ASAP about Redis replication. +# +# 1) Redis replication is asynchronous, but you can configure a master to +# stop accepting writes if it appears to be not connected with at least +# a given number of slaves. +# 2) Redis slaves are able to perform a partial resynchronization with the +# master if the replication link is lost for a relatively small amount of +# time. You may want to configure the replication backlog size (see the next +# sections of this file) with a sensible value depending on your needs. +# 3) Replication is automatic and does not need user intervention. After a +# network partition slaves automatically try to reconnect to masters +# and resynchronize with them. +# +# slaveof <masterip> <masterport> + +# If the master is password protected (using the "requirepass" configuration +# directive below) it is possible to tell the slave to authenticate before +# starting the replication synchronization process, otherwise the master will +# refuse the slave request. +# +# masterauth <master-password> + +# When a slave loses its connection with the master, or when the replication +# is still in progress, the slave can act in two different ways: +# +# 1) if slave-serve-stale-data is set to 'yes' (the default) the slave will +# still reply to client requests, possibly with out of date data, or the +# data set may just be empty if this is the first synchronization. +# +# 2) if slave-serve-stale-data is set to 'no' the slave will reply with +# an error "SYNC with master in progress" to all the kind of commands +# but to INFO and SLAVEOF. +# +slave-serve-stale-data yes + +# You can configure a slave instance to accept writes or not. Writing against +# a slave instance may be useful to store some ephemeral data (because data +# written on a slave will be easily deleted after resync with the master) but +# may also cause problems if clients are writing to it because of a +# misconfiguration. +# +# Since Redis 2.6 by default slaves are read-only. +# +# Note: read only slaves are not designed to be exposed to untrusted clients +# on the internet. It's just a protection layer against misuse of the instance. +# Still a read only slave exports by default all the administrative commands +# such as CONFIG, DEBUG, and so forth. To a limited extent you can improve +# security of read only slaves using 'rename-command' to shadow all the +# administrative / dangerous commands. +slave-read-only yes + +# Replication SYNC strategy: disk or socket. +# +# ------------------------------------------------------- +# WARNING: DISKLESS REPLICATION IS EXPERIMENTAL CURRENTLY +# ------------------------------------------------------- +# +# New slaves and reconnecting slaves that are not able to continue the replication +# process just receiving differences, need to do what is called a "full +# synchronization". An RDB file is transmitted from the master to the slaves. +# The transmission can happen in two different ways: +# +# 1) Disk-backed: The Redis master creates a new process that writes the RDB +# file on disk. Later the file is transferred by the parent +# process to the slaves incrementally. +# 2) Diskless: The Redis master creates a new process that directly writes the +# RDB file to slave sockets, without touching the disk at all. +# +# With disk-backed replication, while the RDB file is generated, more slaves +# can be queued and served with the RDB file as soon as the current child producing +# the RDB file finishes its work. With diskless replication instead once +# the transfer starts, new slaves arriving will be queued and a new transfer +# will start when the current one terminates. +# +# When diskless replication is used, the master waits a configurable amount of +# time (in seconds) before starting the transfer in the hope that multiple slaves +# will arrive and the transfer can be parallelized. +# +# With slow disks and fast (large bandwidth) networks, diskless replication +# works better. +repl-diskless-sync no + +# When diskless replication is enabled, it is possible to configure the delay +# the server waits in order to spawn the child that transfers the RDB via socket +# to the slaves. +# +# This is important since once the transfer starts, it is not possible to serve +# new slaves arriving, that will be queued for the next RDB transfer, so the server +# waits a delay in order to let more slaves arrive. +# +# The delay is specified in seconds, and by default is 5 seconds. To disable +# it entirely just set it to 0 seconds and the transfer will start ASAP. +repl-diskless-sync-delay 5 + +# Slaves send PINGs to server in a predefined interval. It's possible to change +# this interval with the repl_ping_slave_period option. The default value is 10 +# seconds. +# +# repl-ping-slave-period 10 + +# The following option sets the replication timeout for: +# +# 1) Bulk transfer I/O during SYNC, from the point of view of slave. +# 2) Master timeout from the point of view of slaves (data, pings). +# 3) Slave timeout from the point of view of masters (REPLCONF ACK pings). +# +# It is important to make sure that this value is greater than the value +# specified for repl-ping-slave-period otherwise a timeout will be detected +# every time there is low traffic between the master and the slave. +# +# repl-timeout 60 + +# Disable TCP_NODELAY on the slave socket after SYNC? +# +# If you select "yes" Redis will use a smaller number of TCP packets and +# less bandwidth to send data to slaves. But this can add a delay for +# the data to appear on the slave side, up to 40 milliseconds with +# Linux kernels using a default configuration. +# +# If you select "no" the delay for data to appear on the slave side will +# be reduced but more bandwidth will be used for replication. +# +# By default we optimize for low latency, but in very high traffic conditions +# or when the master and slaves are many hops away, turning this to "yes" may +# be a good idea. +repl-disable-tcp-nodelay no + +# Set the replication backlog size. The backlog is a buffer that accumulates +# slave data when slaves are disconnected for some time, so that when a slave +# wants to reconnect again, often a full resync is not needed, but a partial +# resync is enough, just passing the portion of data the slave missed while +# disconnected. +# +# The bigger the replication backlog, the longer the time the slave can be +# disconnected and later be able to perform a partial resynchronization. +# +# The backlog is only allocated once there is at least a slave connected. +# +# repl-backlog-size 1mb + +# After a master has no longer connected slaves for some time, the backlog +# will be freed. The following option configures the amount of seconds that +# need to elapse, starting from the time the last slave disconnected, for +# the backlog buffer to be freed. +# +# A value of 0 means to never release the backlog. +# +# repl-backlog-ttl 3600 + +# The slave priority is an integer number published by Redis in the INFO output. +# It is used by Redis Sentinel in order to select a slave to promote into a +# master if the master is no longer working correctly. +# +# A slave with a low priority number is considered better for promotion, so +# for instance if there are three slaves with priority 10, 100, 25 Sentinel will +# pick the one with priority 10, that is the lowest. +# +# However a special priority of 0 marks the slave as not able to perform the +# role of master, so a slave with priority of 0 will never be selected by +# Redis Sentinel for promotion. +# +# By default the priority is 100. +slave-priority 100 + +# It is possible for a master to stop accepting writes if there are less than +# N slaves connected, having a lag less or equal than M seconds. +# +# The N slaves need to be in "online" state. +# +# The lag in seconds, that must be <= the specified value, is calculated from +# the last ping received from the slave, that is usually sent every second. +# +# This option does not GUARANTEE that N replicas will accept the write, but +# will limit the window of exposure for lost writes in case not enough slaves +# are available, to the specified number of seconds. +# +# For example to require at least 3 slaves with a lag <= 10 seconds use: +# +# min-slaves-to-write 3 +# min-slaves-max-lag 10 +# +# Setting one or the other to 0 disables the feature. +# +# By default min-slaves-to-write is set to 0 (feature disabled) and +# min-slaves-max-lag is set to 10. + +################################## SECURITY ################################### + +# Require clients to issue AUTH <PASSWORD> before processing any other +# commands. This might be useful in environments in which you do not trust +# others with access to the host running redis-server. +# +# This should stay commented out for backward compatibility and because most +# people do not need auth (e.g. they run their own servers). +# +# Warning: since Redis is pretty fast an outside user can try up to +# 150k passwords per second against a good box. This means that you should +# use a very strong password otherwise it will be very easy to break. +# +# requirepass foobared + +# Command renaming. +# +# It is possible to change the name of dangerous commands in a shared +# environment. For instance the CONFIG command may be renamed into something +# hard to guess so that it will still be available for internal-use tools +# but not available for general clients. +# +# Example: +# +# rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52 +# +# It is also possible to completely kill a command by renaming it into +# an empty string: +# +# rename-command CONFIG "" +# +# Please note that changing the name of commands that are logged into the +# AOF file or transmitted to slaves may cause problems. + +################################### LIMITS #################################### + +# Set the max number of connected clients at the same time. By default +# this limit is set to 10000 clients, however if the Redis server is not +# able to configure the process file limit to allow for the specified limit +# the max number of allowed clients is set to the current file limit +# minus 32 (as Redis reserves a few file descriptors for internal uses). +# +# Once the limit is reached Redis will close all the new connections sending +# an error 'max number of clients reached'. +# +# maxclients 10000 + +# Don't use more memory than the specified amount of bytes. +# When the memory limit is reached Redis will try to remove keys +# according to the eviction policy selected (see maxmemory-policy). +# +# If Redis can't remove keys according to the policy, or if the policy is +# set to 'noeviction', Redis will start to reply with errors to commands +# that would use more memory, like SET, LPUSH, and so on, and will continue +# to reply to read-only commands like GET. +# +# This option is usually useful when using Redis as an LRU cache, or to set +# a hard memory limit for an instance (using the 'noeviction' policy). +# +# WARNING: If you have slaves attached to an instance with maxmemory on, +# the size of the output buffers needed to feed the slaves are subtracted +# from the used memory count, so that network problems / resyncs will +# not trigger a loop where keys are evicted, and in turn the output +# buffer of slaves is full with DELs of keys evicted triggering the deletion +# of more keys, and so forth until the database is completely emptied. +# +# In short... if you have slaves attached it is suggested that you set a lower +# limit for maxmemory so that there is some free RAM on the system for slave +# output buffers (but this is not needed if the policy is 'noeviction'). +# +# maxmemory <bytes> + +# MAXMEMORY POLICY: how Redis will select what to remove when maxmemory +# is reached. You can select among five behaviors: +# +# volatile-lru -> remove the key with an expire set using an LRU algorithm +# allkeys-lru -> remove any key according to the LRU algorithm +# volatile-random -> remove a random key with an expire set +# allkeys-random -> remove a random key, any key +# volatile-ttl -> remove the key with the nearest expire time (minor TTL) +# noeviction -> don't expire at all, just return an error on write operations +# +# Note: with any of the above policies, Redis will return an error on write +# operations, when there are no suitable keys for eviction. +# +# At the date of writing these commands are: set setnx setex append +# incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd +# sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby +# zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby +# getset mset msetnx exec sort +# +# The default is: +# +# maxmemory-policy noeviction + +# LRU and minimal TTL algorithms are not precise algorithms but approximated +# algorithms (in order to save memory), so you can tune it for speed or +# accuracy. For default Redis will check five keys and pick the one that was +# used less recently, you can change the sample size using the following +# configuration directive. +# +# The default of 5 produces good enough results. 10 Approximates very closely +# true LRU but costs a bit more CPU. 3 is very fast but not very accurate. +# +# maxmemory-samples 5 + +############################## APPEND ONLY MODE ############################### + +# By default Redis asynchronously dumps the dataset on disk. This mode is +# good enough in many applications, but an issue with the Redis process or +# a power outage may result into a few minutes of writes lost (depending on +# the configured save points). +# +# The Append Only File is an alternative persistence mode that provides +# much better durability. For instance using the default data fsync policy +# (see later in the config file) Redis can lose just one second of writes in a +# dramatic event like a server power outage, or a single write if something +# wrong with the Redis process itself happens, but the operating system is +# still running correctly. +# +# AOF and RDB persistence can be enabled at the same time without problems. +# If the AOF is enabled on startup Redis will load the AOF, that is the file +# with the better durability guarantees. +# +# Please check http://redis.io/topics/persistence for more information. + +appendonly no + +# The name of the append only file (default: "appendonly.aof") + +appendfilename "appendonly.aof" + +# The fsync() call tells the Operating System to actually write data on disk +# instead of waiting for more data in the output buffer. Some OS will really flush +# data on disk, some other OS will just try to do it ASAP. +# +# Redis supports three different modes: +# +# no: don't fsync, just let the OS flush the data when it wants. Faster. +# always: fsync after every write to the append only log. Slow, Safest. +# everysec: fsync only one time every second. Compromise. +# +# The default is "everysec", as that's usually the right compromise between +# speed and data safety. It's up to you to understand if you can relax this to +# "no" that will let the operating system flush the output buffer when +# it wants, for better performances (but if you can live with the idea of +# some data loss consider the default persistence mode that's snapshotting), +# or on the contrary, use "always" that's very slow but a bit safer than +# everysec. +# +# More details please check the following article: +# http://antirez.com/post/redis-persistence-demystified.html +# +# If unsure, use "everysec". + +# appendfsync always +appendfsync everysec +# appendfsync no + +# When the AOF fsync policy is set to always or everysec, and a background +# saving process (a background save or AOF log background rewriting) is +# performing a lot of I/O against the disk, in some Linux configurations +# Redis may block too long on the fsync() call. Note that there is no fix for +# this currently, as even performing fsync in a different thread will block +# our synchronous write(2) call. +# +# In order to mitigate this problem it's possible to use the following option +# that will prevent fsync() from being called in the main process while a +# BGSAVE or BGREWRITEAOF is in progress. +# +# This means that while another child is saving, the durability of Redis is +# the same as "appendfsync none". In practical terms, this means that it is +# possible to lose up to 30 seconds of log in the worst scenario (with the +# default Linux settings). +# +# If you have latency problems turn this to "yes". Otherwise leave it as +# "no" that is the safest pick from the point of view of durability. + +no-appendfsync-on-rewrite no + +# Automatic rewrite of the append only file. +# Redis is able to automatically rewrite the log file implicitly calling +# BGREWRITEAOF when the AOF log size grows by the specified percentage. +# +# This is how it works: Redis remembers the size of the AOF file after the +# latest rewrite (if no rewrite has happened since the restart, the size of +# the AOF at startup is used). +# +# This base size is compared to the current size. If the current size is +# bigger than the specified percentage, the rewrite is triggered. Also +# you need to specify a minimal size for the AOF file to be rewritten, this +# is useful to avoid rewriting the AOF file even if the percentage increase +# is reached but it is still pretty small. +# +# Specify a percentage of zero in order to disable the automatic AOF +# rewrite feature. + +auto-aof-rewrite-percentage 100 +auto-aof-rewrite-min-size 64mb + +# An AOF file may be found to be truncated at the end during the Redis +# startup process, when the AOF data gets loaded back into memory. +# This may happen when the system where Redis is running +# crashes, especially when an ext4 filesystem is mounted without the +# data=ordered option (however this can't happen when Redis itself +# crashes or aborts but the operating system still works correctly). +# +# Redis can either exit with an error when this happens, or load as much +# data as possible (the default now) and start if the AOF file is found +# to be truncated at the end. The following option controls this behavior. +# +# If aof-load-truncated is set to yes, a truncated AOF file is loaded and +# the Redis server starts emitting a log to inform the user of the event. +# Otherwise if the option is set to no, the server aborts with an error +# and refuses to start. When the option is set to no, the user requires +# to fix the AOF file using the "redis-check-aof" utility before to restart +# the server. +# +# Note that if the AOF file will be found to be corrupted in the middle +# the server will still exit with an error. This option only applies when +# Redis will try to read more data from the AOF file but not enough bytes +# will be found. +aof-load-truncated yes + +################################ LUA SCRIPTING ############################### + +# Max execution time of a Lua script in milliseconds. +# +# If the maximum execution time is reached Redis will log that a script is +# still in execution after the maximum allowed time and will start to +# reply to queries with an error. +# +# When a long running script exceeds the maximum execution time only the +# SCRIPT KILL and SHUTDOWN NOSAVE commands are available. The first can be +# used to stop a script that did not yet called write commands. The second +# is the only way to shut down the server in the case a write command was +# already issued by the script but the user doesn't want to wait for the natural +# termination of the script. +# +# Set it to 0 or a negative value for unlimited execution without warnings. +lua-time-limit 5000 + +################################ REDIS CLUSTER ############################### +# +# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +# WARNING EXPERIMENTAL: Redis Cluster is considered to be stable code, however +# in order to mark it as "mature" we need to wait for a non trivial percentage +# of users to deploy it in production. +# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +# +# Normal Redis instances can't be part of a Redis Cluster; only nodes that are +# started as cluster nodes can. In order to start a Redis instance as a +# cluster node enable the cluster support uncommenting the following: +# +# cluster-enabled yes + +# Every cluster node has a cluster configuration file. This file is not +# intended to be edited by hand. It is created and updated by Redis nodes. +# Every Redis Cluster node requires a different cluster configuration file. +# Make sure that instances running in the same system do not have +# overlapping cluster configuration file names. +# +# cluster-config-file nodes-6379.conf + +# Cluster node timeout is the amount of milliseconds a node must be unreachable +# for it to be considered in failure state. +# Most other internal time limits are multiple of the node timeout. +# +# cluster-node-timeout 15000 + +# A slave of a failing master will avoid to start a failover if its data +# looks too old. +# +# There is no simple way for a slave to actually have a exact measure of +# its "data age", so the following two checks are performed: +# +# 1) If there are multiple slaves able to failover, they exchange messages +# in order to try to give an advantage to the slave with the best +# replication offset (more data from the master processed). +# Slaves will try to get their rank by offset, and apply to the start +# of the failover a delay proportional to their rank. +# +# 2) Every single slave computes the time of the last interaction with +# its master. This can be the last ping or command received (if the master +# is still in the "connected" state), or the time that elapsed since the +# disconnection with the master (if the replication link is currently down). +# If the last interaction is too old, the slave will not try to failover +# at all. +# +# The point "2" can be tuned by user. Specifically a slave will not perform +# the failover if, since the last interaction with the master, the time +# elapsed is greater than: +# +# (node-timeout * slave-validity-factor) + repl-ping-slave-period +# +# So for example if node-timeout is 30 seconds, and the slave-validity-factor +# is 10, and assuming a default repl-ping-slave-period of 10 seconds, the +# slave will not try to failover if it was not able to talk with the master +# for longer than 310 seconds. +# +# A large slave-validity-factor may allow slaves with too old data to failover +# a master, while a too small value may prevent the cluster from being able to +# elect a slave at all. +# +# For maximum availability, it is possible to set the slave-validity-factor +# to a value of 0, which means, that slaves will always try to failover the +# master regardless of the last time they interacted with the master. +# (However they'll always try to apply a delay proportional to their +# offset rank). +# +# Zero is the only value able to guarantee that when all the partitions heal +# the cluster will always be able to continue. +# +# cluster-slave-validity-factor 10 + +# Cluster slaves are able to migrate to orphaned masters, that are masters +# that are left without working slaves. This improves the cluster ability +# to resist to failures as otherwise an orphaned master can't be failed over +# in case of failure if it has no working slaves. +# +# Slaves migrate to orphaned masters only if there are still at least a +# given number of other working slaves for their old master. This number +# is the "migration barrier". A migration barrier of 1 means that a slave +# will migrate only if there is at least 1 other working slave for its master +# and so forth. It usually reflects the number of slaves you want for every +# master in your cluster. +# +# Default is 1 (slaves migrate only if their masters remain with at least +# one slave). To disable migration just set it to a very large value. +# A value of 0 can be set but is useful only for debugging and dangerous +# in production. +# +# cluster-migration-barrier 1 + +# By default Redis Cluster nodes stop accepting queries if they detect there +# is at least an hash slot uncovered (no available node is serving it). +# This way if the cluster is partially down (for example a range of hash slots +# are no longer covered) all the cluster becomes, eventually, unavailable. +# It automatically returns available as soon as all the slots are covered again. +# +# However sometimes you want the subset of the cluster which is working, +# to continue to accept queries for the part of the key space that is still +# covered. In order to do so, just set the cluster-require-full-coverage +# option to no. +# +# cluster-require-full-coverage yes + +# In order to setup your cluster make sure to read the documentation +# available at http://redis.io web site. + +################################## SLOW LOG ################################### + +# The Redis Slow Log is a system to log queries that exceeded a specified +# execution time. The execution time does not include the I/O operations +# like talking with the client, sending the reply and so forth, +# but just the time needed to actually execute the command (this is the only +# stage of command execution where the thread is blocked and can not serve +# other requests in the meantime). +# +# You can configure the slow log with two parameters: one tells Redis +# what is the execution time, in microseconds, to exceed in order for the +# command to get logged, and the other parameter is the length of the +# slow log. When a new command is logged the oldest one is removed from the +# queue of logged commands. + +# The following time is expressed in microseconds, so 1000000 is equivalent +# to one second. Note that a negative number disables the slow log, while +# a value of zero forces the logging of every command. +slowlog-log-slower-than 10000 + +# There is no limit to this length. Just be aware that it will consume memory. +# You can reclaim memory used by the slow log with SLOWLOG RESET. +slowlog-max-len 128 + +################################ LATENCY MONITOR ############################## + +# The Redis latency monitoring subsystem samples different operations +# at runtime in order to collect data related to possible sources of +# latency of a Redis instance. +# +# Via the LATENCY command this information is available to the user that can +# print graphs and obtain reports. +# +# The system only logs operations that were performed in a time equal or +# greater than the amount of milliseconds specified via the +# latency-monitor-threshold configuration directive. When its value is set +# to zero, the latency monitor is turned off. +# +# By default latency monitoring is disabled since it is mostly not needed +# if you don't have latency issues, and collecting data has a performance +# impact, that while very small, can be measured under big load. Latency +# monitoring can easily be enabled at runtime using the command +# "CONFIG SET latency-monitor-threshold <milliseconds>" if needed. +latency-monitor-threshold 0 + +############################# EVENT NOTIFICATION ############################## + +# Redis can notify Pub/Sub clients about events happening in the key space. +# This feature is documented at http://redis.io/topics/notifications +# +# For instance if keyspace events notification is enabled, and a client +# performs a DEL operation on key "foo" stored in the Database 0, two +# messages will be published via Pub/Sub: +# +# PUBLISH __keyspace@0__:foo del +# PUBLISH __keyevent@0__:del foo +# +# It is possible to select the events that Redis will notify among a set +# of classes. Every class is identified by a single character: +# +# K Keyspace events, published with __keyspace@<db>__ prefix. +# E Keyevent events, published with __keyevent@<db>__ prefix. +# g Generic commands (non-type specific) like DEL, EXPIRE, RENAME, ... +# $ String commands +# l List commands +# s Set commands +# h Hash commands +# z Sorted set commands +# x Expired events (events generated every time a key expires) +# e Evicted events (events generated when a key is evicted for maxmemory) +# A Alias for g$lshzxe, so that the "AKE" string means all the events. +# +# The "notify-keyspace-events" takes as argument a string that is composed +# of zero or multiple characters. The empty string means that notifications +# are disabled. +# +# Example: to enable list and generic events, from the point of view of the +# event name, use: +# +# notify-keyspace-events Elg +# +# Example 2: to get the stream of the expired keys subscribing to channel +# name __keyevent@0__:expired use: +# +# notify-keyspace-events Ex +# +# By default all notifications are disabled because most users don't need +# this feature and the feature has some overhead. Note that if you don't +# specify at least one of K or E, no events will be delivered. +notify-keyspace-events "" + +############################### ADVANCED CONFIG ############################### + +# Hashes are encoded using a memory efficient data structure when they have a +# small number of entries, and the biggest entry does not exceed a given +# threshold. These thresholds can be configured using the following directives. +hash-max-ziplist-entries 512 +hash-max-ziplist-value 64 + +# Similarly to hashes, small lists are also encoded in a special way in order +# to save a lot of space. The special representation is only used when +# you are under the following limits: +list-max-ziplist-entries 512 +list-max-ziplist-value 64 + +# Sets have a special encoding in just one case: when a set is composed +# of just strings that happen to be integers in radix 10 in the range +# of 64 bit signed integers. +# The following configuration setting sets the limit in the size of the +# set in order to use this special memory saving encoding. +set-max-intset-entries 512 + +# Similarly to hashes and lists, sorted sets are also specially encoded in +# order to save a lot of space. This encoding is only used when the length and +# elements of a sorted set are below the following limits: +zset-max-ziplist-entries 128 +zset-max-ziplist-value 64 + +# HyperLogLog sparse representation bytes limit. The limit includes the +# 16 bytes header. When an HyperLogLog using the sparse representation crosses +# this limit, it is converted into the dense representation. +# +# A value greater than 16000 is totally useless, since at that point the +# dense representation is more memory efficient. +# +# The suggested value is ~ 3000 in order to have the benefits of +# the space efficient encoding without slowing down too much PFADD, +# which is O(N) with the sparse encoding. The value can be raised to +# ~ 10000 when CPU is not a concern, but space is, and the data set is +# composed of many HyperLogLogs with cardinality in the 0 - 15000 range. +hll-sparse-max-bytes 3000 + +# Active rehashing uses 1 millisecond every 100 milliseconds of CPU time in +# order to help rehashing the main Redis hash table (the one mapping top-level +# keys to values). The hash table implementation Redis uses (see dict.c) +# performs a lazy rehashing: the more operation you run into a hash table +# that is rehashing, the more rehashing "steps" are performed, so if the +# server is idle the rehashing is never complete and some more memory is used +# by the hash table. +# +# The default is to use this millisecond 10 times every second in order to +# actively rehash the main dictionaries, freeing memory when possible. +# +# If unsure: +# use "activerehashing no" if you have hard latency requirements and it is +# not a good thing in your environment that Redis can reply from time to time +# to queries with 2 milliseconds delay. +# +# use "activerehashing yes" if you don't have such hard requirements but +# want to free memory asap when possible. +activerehashing yes + +# The client output buffer limits can be used to force disconnection of clients +# that are not reading data from the server fast enough for some reason (a +# common reason is that a Pub/Sub client can't consume messages as fast as the +# publisher can produce them). +# +# The limit can be set differently for the three different classes of clients: +# +# normal -> normal clients including MONITOR clients +# slave -> slave clients +# pubsub -> clients subscribed to at least one pubsub channel or pattern +# +# The syntax of every client-output-buffer-limit directive is the following: +# +# client-output-buffer-limit <class> <hard limit> <soft limit> <soft seconds> +# +# A client is immediately disconnected once the hard limit is reached, or if +# the soft limit is reached and remains reached for the specified number of +# seconds (continuously). +# So for instance if the hard limit is 32 megabytes and the soft limit is +# 16 megabytes / 10 seconds, the client will get disconnected immediately +# if the size of the output buffers reach 32 megabytes, but will also get +# disconnected if the client reaches 16 megabytes and continuously overcomes +# the limit for 10 seconds. +# +# By default normal clients are not limited because they don't receive data +# without asking (in a push way), but just after a request, so only +# asynchronous clients may create a scenario where data is requested faster +# than it can read. +# +# Instead there is a default limit for pubsub and slave clients, since +# subscribers and slaves receive data in a push fashion. +# +# Both the hard or the soft limit can be disabled by setting them to zero. +client-output-buffer-limit normal 0 0 0 +client-output-buffer-limit slave 256mb 64mb 60 +client-output-buffer-limit pubsub 32mb 8mb 60 + +# Redis calls an internal function to perform many background tasks, like +# closing connections of clients in timeout, purging expired keys that are +# never requested, and so forth. +# +# Not all tasks are performed with the same frequency, but Redis checks for +# tasks to perform according to the specified "hz" value. +# +# By default "hz" is set to 10. Raising the value will use more CPU when +# Redis is idle, but at the same time will make Redis more responsive when +# there are many keys expiring at the same time, and timeouts may be +# handled with more precision. +# +# The range is between 1 and 500, however a value over 100 is usually not +# a good idea. Most users should use the default of 10 and raise this up to +# 100 only in environments where very low latency is required. +hz 10 + +# When a child rewrites the AOF file, if the following option is enabled +# the file will be fsync-ed every 32 MB of data generated. This is useful +# in order to commit the file to the disk more incrementally and avoid +# big latency spikes. +aof-rewrite-incremental-fsync yes diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso-cluster-server/templates/stunnel_redis_server.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso-cluster-server/templates/stunnel_redis_server.conf new file mode 100644 index 0000000000000000000000000000000000000000..2a372c3de1c0d180df0f422dffa326f779fef34d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso-cluster-server/templates/stunnel_redis_server.conf @@ -0,0 +1,9 @@ +pid = /var/run/stunnel.pid +[redis_tunnel] +cert = %%redis_server_cert +key = %%redis_server_key +CApath = /etc/stunnel/eole +verify = 2 +SSLversion=TLSv1 +accept = %%eolesso_stunnel_host:%%eolesso_stunnel_port +connect = %%eolesso_redis_host:%%eolesso_redis_port diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso/dictionaries/00_eole-sso_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso/dictionaries/00_eole-sso_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..3dcbd29f78c836fe973e302376e8169c048fbe43 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso/dictionaries/00_eole-sso_packages.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>eole-sso-server</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso/dictionaries/21_sso.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso/dictionaries/21_sso.xml new file mode 100644 index 0000000000000000000000000000000000000000..3fd1dd8e162ed47b6ba327364f0a849288beef63 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso/dictionaries/21_sso.xml @@ -0,0 +1,311 @@ +<?xml version="1.0" encoding="utf-8"?> +<creole> + <files> + <service servicelist="sso">eole-sso</service> + <service_access service='sso'> + <port port_type="SymLinkOption">eolesso_port</port> + </service_access> + + </files> + <variables> + + <family name='services'> + <variable name='activer_sso' type='string' description='Utiliser un serveur EoleSSO'> + <value>non</value> + </variable> + </family> + + <family name='eole sso' icon='group'> + + <!-- Configuration --> + <variable name='eolesso_adresse' type='domain_strict' description= "Nom de domaine du serveur d'authentification SSO"/> + <variable name='eolesso_port' type='port' description='Port utilisé par le service EoleSSO' mandatory='True'> + <value>8443</value> + </variable> + <variable name='eolesso_session_timeout' type='number' description="Durée de vie d'une session sur le serveur SSO (en secondes)"> + <value>7200</value> + </variable> + <variable name='eolesso_css' type='string' description="CSS par défaut du service SSO (sans le .css)"/> + + <!-- LDAP --> + <variable name='eolesso_ldap' type='domain' description='Adresse du serveur LDAP utilisé par EoleSSO' multi='True'> + <value>localhost</value> + </variable> + <variable name='eolesso_port_ldap' type='port' description='Port du serveur LDAP utilisé par EoleSSO'> + <value>389</value> + </variable> + <variable name='eolesso_base_ldap' type='string' description="Chemin de recherche dans l'annuaire" mandatory='True'/> + <variable name='eolesso_ldap_label' type='string' description="Libellé à présenter aux utilisateurs en cas d'homonymes" mandatory='True'/> + <variable name='eolesso_ldap_infos' type='string' description="Informations supplémentaire dans le cadre d'information sur les homonymes"> + <value></value> + </variable> + <variable name='eolesso_ldap_reader' type='string' description='Utilisateur de lecture des comptes LDAP (nécessaire pour la fédération)'/> + <variable name='eolesso_ldap_reader_passfile' type='filename' description="Fichier de mot de passe de l'utilisateur de lecture"> + <value>/root/.reader</value> + </variable> + <variable name='eolesso_ldap_match_attribute' type='string' description="Attribut de recherche des utilisateurs"> + <value>uid</value> + </variable> + <variable name='eolesso_ldap_login_otp' type='string' description="Identifiants OTP pour cet annuaire"> + <value>inactifs</value> + </variable> + <variable name='eolesso_ldap_filter_user' type='string' description="Filtre d'utilisateurs"> + <value>objectClass=person</value> + </variable> + <variable name='eolesso_ldap_filter_group' type='string' description="Filtre de groupes"> + <value>objectClass=posixGroup</value> + </variable> + <variable name='eolesso_ldap_dntree_user' type='string' description="DN racine de l'arbre utilisateurs"> + <value></value> + </variable> + <variable name='eolesso_ldap_dntree_group' type='string' description="DN racine de l'arbre groupes"> + <value></value> + </variable> + <variable name='eolesso_ldap_fill_displayname' type='string' description="Champ 'nom d'affichage' de l'utilisateur"> + <value>displayName</value> + </variable> + <variable name='eolesso_ldap_fill_mail' type='string' description="Champ 'mail' de l'utilisateur"> + <value>mail</value> + </variable> + <variable name='eolesso_ldap_fill_fonction' type='string' description="Champ 'fonction' de l'utilisateur"> + <value></value> + </variable> + <variable name='eolesso_ldap_fill_categorie' type='string' description="Champ 'categorie' de l'utilisateur"> + <value></value> + </variable> + <variable name='eolesso_ldap_fill_rne' type='string' description="Champ 'rne' de l'utilisateur"> + <value></value> + </variable> + <variable name='eolesso_ldap_fill_fredurne' type='string' description="Champ 'fredurne' de l'utilisateur"> + <value></value> + </variable> + <variable name='eolesso_ldap_fill_displaygroup' type='string' description="Champ 'nom d'affichage' du groupe"> + <value>cn</value> + </variable> + <variable name='eolesso_ldap_apps_params' type='oui/non' description="Information LDAP supplémentaires (applications)"> + <value>non</value> + </variable> + + <!-- SSO parent --> + <variable name='eolesso_adresse_parent' type='string' description='Adresse du serveur SSO parent'/> + <variable name='eolesso_port_parent' type='number' description='Port du serveur SSO parent'> + <value>8443</value> + </variable> + + <!-- federation --> + <variable name='eolesso_entity_name' type='string' description="Nom d'entité SAML du serveur eole-sso (ou rien)"/> + <variable name='federation_transparente' type='oui/non' description="Cacher le formulaire lors de l'envoi des informations de fédération"> + <value>non</value> + </variable> + + <!-- OTP --> + <variable name='eolesso_pam_securid' type='oui/non' description="Gestion de l'authentification OTP (RSA SecurID)"> + <value>non</value> + </variable> + <variable name='eolesso_otppass_minsize' type='number' description="Taille minimum du passcode OTP"> + <value>10</value> + </variable> + <variable name='eolesso_otppass_maxsize' type='number' description="Taille maximum du passcode OTP"> + <value>12</value> + </variable> + <variable name='eolesso_otppass_regx' type='string' description="Expression régulière de détection des passcodes OTP"> + <value>^[0-9]{10,12}$</value> + </variable> + <variable name='eolesso_otp_desync' type='oui/non' description="Gestion locale des clés OTP désynchronisées"> + <value>non</value> + </variable> + <variable name='eolesso_otp_portal' type='string' description="Adresse de la mire OTP en cas désynchronisation de clé"/> + + <!-- Certificats --> + <variable name='eolesso_cert' type='string' description='Chemin du certificat SSL'/> + <variable name='eolesso_key' type='string' description='Chemin de la clé privée liée au certificat SSL'/> + <variable name='eolesso_ca_location' type='string' description="Chemin de l'autorité de certification (ou rien)"/> + + <!-- Autres --> + <variable name='eolesso_cas_folder' type='filename' description="Alias d'accès au service SSO (paramètre : __CAS_FOLDER)" mode='expert'/> + <variable name='eolesso_cookie_name' type='string' description="Nom du cookie EoleSSO" mode="expert"> + <value>EoleSSOServer</value> + </variable> + <variable name='eolesso_cookie_domain' type='string' description= "Domaine du cookie EoleSSO" mode="expert"> + <value></value> + </variable> + <variable name='eolesso_responsive' type='oui/non' description="Activer la balise meta viewport (CSS responsive)" mode="expert"> + <value>non</value> + </variable> + <variable name='eolesso_metrics' type='oui/non' description="Générer des statistiques d'usage du service" mode="expert"> + <value>non</value> + </variable> + <variable name='cas_send_logout' type='oui/non' description="Activer le logout centralisé du serveur SSO" hidden='True'> + <value>oui</value> + </variable> + <variable name='cas_verify_service' type='oui/non' description="Ne pas répondre aux demandes CAS des applications inconnues" mode="expert"> + <value>non</value> + </variable> + <variable name='sso_saml_time_adjust' type='number' description="Décalage de temps (en secondes) dans les messages de fédération SAML" mode="expert"> + <value>-300</value> + </variable> + </family> + + <separators> + <separator name='eolesso_ldap'>Configuration LDAP</separator> + <separator name='eolesso_adresse_parent'>Serveur SSO parent</separator> + <separator name='eolesso_entity_name'>Fédération d'identité</separator> + <separator name='eolesso_pam_securid'>Authentification par clé OTP</separator> + <separator name='eolesso_cert'>Certificats</separator> + <separator name='eolesso_cas_folder'>Autres options</separator> + </separators> + + </variables> + + <constraints> + <fill name='calc_val_first_value' target='eolesso_adresse'> + <param type='eole' optional='True' hidden='False'>web_url</param> + <param type='eole'>nom_domaine_machine</param> + </fill> + <fill name='calc_val_first_value' target='eolesso_base_ldap'> + <param type='eole' optional='True' hidden='False'>ldap_base_dn</param> + <param>o=gouv,c=fr</param> + </fill> + <fill name='concat' target='eolesso_ldap_reader'> + <param>cn=reader,</param> + <param type='eole'>eolesso_base_ldap</param> + </fill> + <fill name='calc_val' target='eolesso_cert'> + <param type='eole' name='valeur'>server_cert</param> + </fill> + <fill name='calc_val' target='eolesso_key'> + <param type='eole' name='valeur'>server_key</param> + </fill> + <condition name='disabled_if_in' source='activer_sso'> + <param>non</param> + <target type='family'>eole sso</target> + <target type='filelist'>ssoclient</target> + </condition> + <condition name='disabled_if_not_in' source='activer_sso'> + <param>local</param> + <target type='servicelist'>sso</target> + <target type='filelist'>sso</target> + <target type='variable'>eolesso_ldap</target> + <target type='variable'>eolesso_port_ldap</target> + <target type='variable'>eolesso_base_ldap</target> + <target type='variable'>eolesso_ldap_label</target> + <target type='variable'>eolesso_ldap_infos</target> + <target type='variable'>eolesso_ldap_reader</target> + <target type='variable'>eolesso_ldap_reader_passfile</target> + <target type='variable'>eolesso_ldap_match_attribute</target> + <target type='variable'>eolesso_adresse_parent</target> + <target type='variable'>eolesso_port_parent</target> + <target type='variable'>eolesso_cert</target> + <target type='variable'>eolesso_key</target> + <target type='variable'>eolesso_ca_location</target> + <target type='variable'>eolesso_css</target> + <target type='variable'>eolesso_responsive</target> + <target type='variable'>federation_transparente</target> + <target type='variable'>eolesso_entity_name</target> + <target type='variable'>eolesso_pam_securid</target> + <target type='variable'>eolesso_ldap_apps_params</target> + </condition> + <condition name='disabled_if_in' source='eolesso_pam_securid'> + <param>non</param> + <target>eolesso_otp_desync</target> + <target>eolesso_ldap_login_otp</target> + <target>eolesso_otppass_minsize</target> + <target>eolesso_otppass_maxsize</target> + <target>eolesso_otppass_regx</target> + </condition> + <condition name='disabled_if_in' source='eolesso_otp_desync'> + <param>oui</param> + <target>eolesso_otp_portal</target> + </condition> + <condition name='disabled_if_in' source='eolesso_ldap_apps_params'> + <param>non</param> + <target>eolesso_ldap_filter_user</target> + <target>eolesso_ldap_filter_group</target> + <target>eolesso_ldap_dntree_user</target> + <target>eolesso_ldap_dntree_group</target> + <target>eolesso_ldap_fill_displayname</target> + <target>eolesso_ldap_fill_mail</target> + <target>eolesso_ldap_fill_fonction</target> + <target>eolesso_ldap_fill_categorie</target> + <target>eolesso_ldap_fill_rne</target> + <target>eolesso_ldap_fill_fredurne</target> + <target>eolesso_ldap_fill_displaygroup</target> + </condition> + <check name='valid_enum' target='activer_sso'> + <param>['non', 'local', 'distant']</param> + </check> + <check name='valid_enum' target='eolesso_ldap_login_otp'> + <param>['inactifs','identiques','configurables']</param> + </check> + <fill name='calc_libelle_annuaire' target='eolesso_ldap_label'> + <param type='eole'>eolesso_ldap</param> + <param type='eole'>nom_machine</param> + <param type='eole'>nom_domaine_local</param> + </fill> + <group master='eolesso_ldap'> + <slave>eolesso_port_ldap</slave> + <slave>eolesso_base_ldap</slave> + <slave>eolesso_ldap_label</slave> + <slave>eolesso_ldap_infos</slave> + <slave>eolesso_ldap_reader</slave> + <slave>eolesso_ldap_reader_passfile</slave> + <slave>eolesso_ldap_match_attribute</slave> + <slave>eolesso_ldap_login_otp</slave> + <slave>eolesso_ldap_filter_user</slave> + <slave>eolesso_ldap_filter_group</slave> + <slave>eolesso_ldap_dntree_user</slave> + <slave>eolesso_ldap_dntree_group</slave> + <slave>eolesso_ldap_fill_displayname</slave> + <slave>eolesso_ldap_fill_mail</slave> + <slave>eolesso_ldap_fill_fonction</slave> + <slave>eolesso_ldap_fill_categorie</slave> + <slave>eolesso_ldap_fill_rne</slave> + <slave>eolesso_ldap_fill_fredurne</slave> + <slave>eolesso_ldap_fill_displaygroup</slave> + </group> + </constraints> + + <help> + <family name='eole sso'>Configuration du serveur d'authentification EoleSSO</family> + <variable name='activer_sso'>EoleSSO est un serveur d'authentification développé pour répondre à la problématique du SSO (authentification unique)</variable> + <variable name='eolesso_adresse'>Nom de domaine du serveur d'authentification, ne pas utiliser d'adresse IP ou localhost</variable> + <variable name='eolesso_session_timeout'>Durée de la validité du cookie utilisé par le serveur SSO</variable> + <variable name='eolesso_cas_folder'>Certains serveurs SSO tels que lemonLDAP ou keycloak ont besoin d'un alias spécifique en plus du domaine et du port, exemple : https://monserveursso:8443/CAS</variable> + <variable name='eolesso_cookie_name'>Nom du cookie identifiant la session SSO</variable> + <variable name='eolesso_cookie_domain'>Domaine du cookie SSO ( si rien: utilise le nom d'hôte du serveur)</variable> + <variable name='eolesso_cert'>Certificat utilisé par le serveur SSO</variable> + <variable name='eolesso_key'>Valeur ignorée si le certificat n'est pas défini. si rien et certificat défini: 'nom_certificat.key' dans le même répertoire.</variable> + <variable name='eolesso_ca_location'>Certificat de l'autorité de certification validant le certificat du serveur SSO (dans le cas d'une chaine de certification, tous les certificats de la chaine doivent être intégés)</variable> + <variable name='eolesso_css'>CSS par défaut pour les pages du service SSO (sans le .css, le fichier est à placer dans /usr/share/sso/interface/[nom_fichier].css)</variable> + <variable name='eolesso_responsive'>Inclut la balise meta 'viewport' dans les pages de l'application (avec content="width=device-width, initial-scale=1"). A activer en cas d'utilisation d'une CSS 'responsive'.</variable> + <variable name='federation_transparente'>Lors de l'envoi d'attributs de l'utilisateur à un fournisseur tiers dans le cadre d'une fédération d'identité, un formulaire est présenté pour le prévenir. En choisissant 'oui', le formulaire sera envoyé automatiquement sans être affiché.</variable> + <variable name='eolesso_ldap_label'>Dans le cas ou un utilisateur aurait un homonyme dans un des annuaires configurés, une liste déroulante lui permet de choisir sa provenance (un des annuaires configurés, ou un établissement en cas d'annuaire multi établissements). Ce libellé est utilisé pour décrire cet annuaire. (si rien: Annuaire de 'adresse_serveur')</variable> + <variable name='eolesso_ldap_infos'>Dans le cas ou des homonymes sont détectés, le contenu du fichier indiqué sera ajouté au code html du cadre affiché (seulement si l'utilisateur est présent dans cet annuaire). Le fichier doit être dans le répertoire /usr/share/sso/interface/infos_homonymes</variable> + <variable name='eolesso_ldap_reader'>La fédération nécessite un compte LDAP ayant accès en lecture aux attributs de tous les utilisateurs. Dans le cas de l'utilisation d'un annuaire fourni par le paquet eole-annuaire, l'utilisateur "cn=reader,o=gouv,c=fr" est disponible</variable> + <variable name='eolesso_ldap_reader_passfile'>Fichier contenant le mot de passe de l'utilisateur de lecture des comptes LDAP. si le fichier ou le compte n'existent pas, la recherche d'attributs en cas de fédération se fera de façon anonyme</variable> + <variable name='eolesso_ldap_match_attribute'>Attribut utilisé comme identifiant des utilisateurs pour cet annuaire ('uid' par défaut. Si autre valeur, les groupes de l'utilisateur ne seront pas détectés)</variable> + <variable name='eolesso_ldap_filter_user'>Sans élément de substitution, par exemple "objectClass=person".</variable> + <variable name='eolesso_ldap_filter_group'>Sans élément de substitution, par exemple "objectClass=posixGroup".</variable> + <variable name='eolesso_ldap_fill_displayname'>Attribut utilisé comme nom complet pour l'utilisateur</variable> + <variable name='eolesso_ldap_fill_mail'>Attribut utilisé comme mail pour l'utilisateur</variable> + <variable name='eolesso_ldap_fill_fonction'>Attribut utilisé comme fonction pour l'utilisateur</variable> + <variable name='eolesso_ldap_fill_categorie'>Attribut utilisé comme catégorie pour l'utilisateur</variable> + <variable name='eolesso_ldap_fill_rne'>Attribut utilisé comme rne pour l'utilisateur</variable> + <variable name='eolesso_ldap_fill_fredurne'>Attribut utilisé comme fredurne pour l'utisateur</variable> + <variable name='eolesso_ldap_fill_displaygroup'>Attribut utilisé comme nom du groupe de l'utilisateur</variable> + <variable name='eolesso_ldap_apps_params'>Permet de configurer des paramètres supplémentaires pour chaque annuaire LDAP. Utilisé par les applications accédant directement aux annuaires (ex: ownCloud)</variable> + <variable name='eolesso_ldap_login_otp'>Type d'identifiants OTP gérés pour les utilisateurs de cet annuaire. Inactifs : OTP non disponible; identiques : identifiant identique à l'identifiant LDAP; configurables : identifiant personnalisé renseigné par l'utilisateur à la première connexion en mode OTP</variable> + <variable name='eolesso_otppass_minsize'>Taille minimum des mots de passe OTP (code PIN + clé)</variable> + <variable name='eolesso_otppass_maxsize'>Taille maximum des mots de passe OTP (code PIN + clé)</variable> + <variable name='eolesso_otppass_regx'>Expression régulière pour valider que le mot de passe saisi est de type OTP (vérifié quand la longueursaisie correspond au tailles min/max). Comprend le code PIN + la clé. Par défaut : chaîne de 12 caractères numériques.</variable> + <variable name='eolesso_otp_desync'>Choix du mode de fonctionnement en cas de clé OTP désynchronisée (par ex. suite à plusieurs tentatives échouées).Si non, l'utilisateur est invité à débloquer la situation en allant sur une URL particulière. Si oui, EoleSSO va demander la saisie d'un deuxième mot de passe pour débloquer la situation</variable> + <variable name='eolesso_otp_portal'>En cas de désynchronisation d'une clé OTP, l'utilisateur sera redirigé sur cette adresse pour débloquer la situation. Si vide, un message par défaut est affiché</variable> + <variable name='eolesso_entity_name'>Nom d'entité du serveur EoleSSO local à indiquer dans les messages SAML (si rien, une valeur est calculée depuis le nom de l'académie et le nom de machine)</variable> + <variable name='sso_saml_time_adjust'>Décalage en secondes appliqué aux dates dans les messages de fédération SAML. Permet d'éviter le rejet des messages lorsque le serveur partenaire n'est pas tout à fait synchrone (par défaut, on décale de 5 minutes dans le passé). Ce délai est aussi pris en compte pour la validation des messages reçus.</variable> + <variable name='cas_verify_service'>Si ce paramètre est à oui, seules les applications renseignées dans les fichiers d'applications (/usr/share/sso/app_filters/*_apps.ini) sont autorisées à recevoir des réponses du serveur en mode CAS. Si il est à non, le filtre par défaut leur sera appliqué</variable> + <variable name='eolesso_metrics'>Génère des statistiques d'usage du service sur l'URL /metrics</variable> + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso/dictionaries/23_sso_openid.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso/dictionaries/23_sso_openid.xml new file mode 100644 index 0000000000000000000000000000000000000000..4c71e02bf8dcc2031b75f0edeff7ae330927deed --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso/dictionaries/23_sso_openid.xml @@ -0,0 +1,111 @@ +<?xml version="1.0" encoding="utf-8"?> +<creole> + <variables> + <family name='eole sso'> + <variable name='activer_openid' type='oui/non' description="Autoriser l'authentification OpenID Connect" mode="expert"> + <value>non</value> + </variable> + <variable name='openid_providers' type='string' description="Référence du fournisseur d'identité OpenID" mode="expert" multi='True' mandatory='True'/> + <variable name='openid_providers_label' type='string' description="Libellé du fournisseur d'identité OpenID" mandatory='True'/> + <variable name='openid_providers_issuer' type='web_address' description="URL d'accès (issuer)" mandatory='True'/> + <variable name='openid_providers_about_url' type='web_address' description="URL d'information (A propos)"/> + <variable name='openid_providers_about_label' type='string' description="Libellé de l'URL d'information (A propos)"/> + <variable name='openid_providers_auth_endp' type='web_address' description="URL de demande d'autorisation (authorization endpoint)" mandatory='True'/> + <variable name='openid_providers_reg_endp' type='web_address' description="URL d'enregistrement automatique (register endpoint)" hidden='True'/> + <variable name='openid_providers_token_endp' type='web_address' description="URL de récupération de jeton d'accès (token endpoint)" mandatory='True'/> + <variable name='openid_providers_logout_endp' type='web_address' description="URL de déconnexion (logout endpoint)"/> + <variable name='openid_providers_userinfo_endp' type='web_address' description="URL de lecture des informations (userinfo endpoint)"/> + <variable name='openid_providers_jwks_uri' type='web_address' description="URL de description des certificats de signature (jwks URI)"/> + </family> + <separators> + <separator name='activer_openid'>Authentification OpenID</separator> + </separators> + </variables> + <constraints> + <condition name='disabled_if_in' source='activer_openid'> + <param>non</param> + <target type='variable'>openid_providers</target> + </condition> + <group master='openid_providers'> + <slave>openid_providers_label</slave> + <slave>openid_providers_issuer</slave> + <slave>openid_providers_about_url</slave> + <slave>openid_providers_about_label</slave> + <slave>openid_providers_auth_endp</slave> + <slave>openid_providers_reg_endp</slave> + <slave>openid_providers_token_endp</slave> + <slave>openid_providers_logout_endp</slave> + <slave>openid_providers_userinfo_endp</slave> + <slave>openid_providers_jwks_uri</slave> + </group> + <check name="valid_enum" target="openid_providers"> + <param>['fconnect']</param> + <param name="checkval">False</param> + </check> + <fill name='calc_multi_condition' target='openid_providers_label'> + <param>fconnect</param> + <param type='eole' name='condition_1'>openid_providers</param> + <param name='match'>France Connect</param> + <param name='default_mismatch'>None</param> + </fill> + <fill name='calc_multi_condition' target='openid_providers_about_label'> + <param>fconnect</param> + <param type='eole' name='condition_1'>openid_providers</param> + <param name='match'>Qu'est ce que FranceConnect ?</param> + <param name='default_mismatch'>None</param> + </fill> + <fill name='calc_multi_condition' target='openid_providers_about_url'> + <param>fconnect</param> + <param type='eole' name='condition_1'>openid_providers</param> + <param name='match'>https://fcp.integ01.dev-franceconnect.fr/a-propos</param> + <param name='default_mismatch'>None</param> + </fill> + <fill name='calc_multi_condition' target='openid_providers_issuer'> + <param>fconnect</param> + <param type='eole' name='condition_1'>openid_providers</param> + <param name='match'>https://fcp.integ01.dev-franceconnect.fr/api/v1/</param> + <param name='default_mismatch'>None</param> + </fill> + <fill name='calc_multi_condition' target='openid_providers_auth_endp'> + <param>fconnect</param> + <param type='eole' name='condition_1'>openid_providers</param> + <param name='match'>https://fcp.integ01.dev-franceconnect.fr/api/v1/authorize</param> + <param name='default_mismatch'>None</param> + </fill> + <fill name='calc_multi_condition' target='openid_providers_reg_endp'> + <param>fconnect</param> + <param type='eole' name='condition_1'>openid_providers</param> + <param name='match'>https://fcp.integ01.dev-franceconnect.fr/api/v1/register</param> + <param name='default_mismatch'>None</param> + </fill> + <fill name='calc_multi_condition' target='openid_providers_token_endp'> + <param>fconnect</param> + <param type='eole' name='condition_1'>openid_providers</param> + <param name='match'>https://fcp.integ01.dev-franceconnect.fr/api/v1/token</param> + <param name='default_mismatch'>None</param> + </fill> + <fill name='calc_multi_condition' target='openid_providers_userinfo_endp'> + <param>fconnect</param> + <param type='eole' name='condition_1'>openid_providers</param> + <param name='match'>https://fcp.integ01.dev-franceconnect.fr/api/v1/userinfo</param> + <param name='default_mismatch'>None</param> + </fill> + <fill name='calc_multi_condition' target='openid_providers_logout_endp'> + <param>fconnect</param> + <param type='eole' name='condition_1'>openid_providers</param> + <param name='match'>https://fcp.integ01.dev-franceconnect.fr/api/v1/logout</param> + <param name='default_mismatch'>None</param> + </fill> + </constraints> + <help> + <variable name='openid_providers'>nom du fournisseur d'identité. Non affiché, utilisé dans le nom des images (logos)</variable> + <variable name='openid_providers_label'>Libellé présenté aux utilisateurs pour décrire le fournisseur</variable> + <variable name='openid_providers_issuer'>URL de base du fournisseur d'identité (généralement appelée issuer)</variable> + <variable name='openid_providers_auth_endp'>URL de réception des requêtes d'authentification.</variable> + <variable name='openid_providers_reg_endp'>URL d'enregistrement automatique du client (non géré)</variable> + <variable name='openid_providers_token_endp'>URL de récupération de jeton d'accès (access token)</variable> + <variable name='openid_providers_logout_endp'>URL de déconnexion du fournisseur d'identité (non utilisé pour Google,Facebook,Live)</variable> + <variable name='openid_providers_userinfo_endp'>URL de récupération des informations sur l'utilisateur (non utilisé si renvoyées avec le jeton d'accès)</variable> + <variable name='openid_providers_jwks_uri'>URL décrivant les certificats utilisés pour la signature des jetons (si disponible)</variable> + </help> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso/files/usr/share/eole/diagnose/151-sso b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso/files/usr/share/eole/diagnose/151-sso new file mode 100644 index 0000000000000000000000000000000000000000..3f4b6edee71d0930d474d1e2e2a0f2d345735d8a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso/files/usr/share/eole/diagnose/151-sso @@ -0,0 +1,36 @@ +#!/bin/bash + +. /usr/lib/eole/diagnose.sh + +EchoGras "*** Service SSO" +sso_actif=$(CreoleGet activer_sso) +if [ "$sso_actif" != 'non' ];then + TestService SSO $(CreoleGet eolesso_adresse):$(CreoleGet eolesso_port) + if [ "$sso_actif" == "local" ]; then + EoleSSOCert=$(CreoleGet eolesso_cert) + EoleSSOCA=$(CreoleGet eolesso_ca_location) + # Vérification du certificat si différent de eole.crt + if [ ! -z "$EoleSSOCert" ];then + EchoGras "*** Certificat SSO" + TestCerts "$EoleSSOCert" 10 "certificat expiré" "$EoleSSOCA" "$EoleSSOCA" + fi + fi + openid_actif=$(CreoleGet activer_openid) + if [ "$openid_actif" == "oui" ] + then + EchoGras "*** Configuration des fournisseurs OpenID Connect" + for prov in $(CreoleGet openid_providers) + do + grep "^$prov.*=.*:.*" /etc/eole/eolesso_openid.conf >/dev/null + if [ $? -ne 0 ] + then + EchoOrange "* Pas d'identifiant/clé configurés pour le client OpenID : $prov" + EchoOrange " Renseigner /etc/eole/eolesso_openid.conf (Voir la documentation d'EoleSSO)" + fi + done + fi +else + Inactif SSO +fi +echo +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..d44efe5a7c463eee5f6e9d2ada821732a0e4fb6e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso/service.yml @@ -0,0 +1,31 @@ +format: '0.1' +name: eole-sso +version: |- + 2.7.0-6 +description: |- + Eolisation du serveur EoleSSO + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: [] +packages: + - eole-sso-server +dictionaries: + - 21_sso.xml + - 23_sso_openid.xml +extra_dictionaries: {} +templates: + - cas.inc.php.tmpl + - eoleCASConfig.php.tmpl + - pam_cas_auth.conf +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: [] +files: + /usr/share/eole/diagnose/151-sso: + owner: root + group: root + mode: '0755' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso/templates/cas.inc.php.tmpl b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso/templates/cas.inc.php.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..411623b06b1001ca56c957093a891b9ad5bd6155 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso/templates/cas.inc.php.tmpl @@ -0,0 +1,23 @@ +<?php +define("__CAS_SERVER", "%%eolesso_adresse"); +define("__CAS_VERSION", "2.0"); +define("__CAS_FOLDER", "%%eolesso_cas_folder"); +define("__CAS_PORT", %%eolesso_port); +define("__CAS_PROTO", "https"); +%if %%cas_send_logout == 'oui' +define("__CAS_LOGOUT", true); +%else +define("__CAS_LOGOUT", false); +%end if +%if %%getVar('activer_web_valider_ca', 'non') == 'oui' +define("__CAS_VALIDER_CA", true); +%else +define("__CAS_VALIDER_CA", false); +%end if +%if %%is_empty(%%getVar('eolesso_ca_location', '')) +define("__CAS_CA_LOCATION", "/etc/ssl/certs/ca.crt"); +%else +define("__CAS_CA_LOCATION", "%%eolesso_ca_location"); +%end if +define("__CAS_DEBUG", false); +?> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso/templates/eoleCASConfig.php.tmpl b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso/templates/eoleCASConfig.php.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..d260ac44a523361e90fc6dd673475094c0e5d519 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso/templates/eoleCASConfig.php.tmpl @@ -0,0 +1,7 @@ +<?php +%if %%mode_conteneur_actif != "non" +define("__CAS_IP", "%%adresse_ip_br0"); +%else +define("__CAS_IP", "false"); +%end if +?> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso/templates/pam_cas_auth.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso/templates/pam_cas_auth.conf new file mode 100644 index 0000000000000000000000000000000000000000..abe6258e67780b97f12d41481392b04d0d2888be --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sso/templates/pam_cas_auth.conf @@ -0,0 +1,35 @@ +# sample pam_cas config + +# host from CAS server. mandatory +host %%eolesso_adresse + +# port from CAS server. Default to 80 or 443, depends from ssl instruction +port %%eolesso_port + +# uri to validate ticket. Default to /proxyValidate +uriValidate /proxyValidate + +# https or no. values on or off. Default to on. +ssl on + +# debug (on) or no (off). debug in syslog, level LOG_DEBUG. Default to off +debug off + +# proxy or proxies who deliver Proxy Ticket. +# If no proxy, pam_cas doesn't control it +# It may be several proxy instructions +#proxy https://%%eolesso_adresse/proxycas/casimap.php +#proxy https://imp.its.yale.edu/cas/casProxy.php +#proxy https://uportal1.its.yale.edu/CasProxyServlet +#proxy https://uportal2.its.yale.edu/CasProxyServlet + +# trusted_ca. mandatory if ssl on. +# It a file in pem format. It can contents several certificates +# If the CAS server certificate is auto-signed, the file must content the certificate +# If the certificate is trusted by an Certificate Autority, The file must content +# certificate from high level CA +%if not %%is_empty(%%getVar('eolesso_ca_location', '')) +trusted_ca %%eolesso_ca_location +%else +trusted_ca /etc/ssl/certs/ca.crt +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/dictionaries/25_sympa.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/dictionaries/25_sympa.xml new file mode 100644 index 0000000000000000000000000000000000000000..cdc4677163a1b269fb3729a75deb5e0981e0f4fe --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/dictionaries/25_sympa.xml @@ -0,0 +1,68 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- doit être chargé après le dictionnaire mysql --> +<creole> + + <files> + <!-- robot.conf fait l'objet d'un cp en posttemplate --> + <file name='/var/lib/eole/robot.conf'/> + <file name='/etc/logrotate.d/sympa' source='sympa.logrotate'/> + <file name='/etc/rsyslog.d/eole-traps/sympa.conf' source='rsyslog_traps_sympa.conf' mkdir="True"/> + <!-- action EAD (liens vers sympa) --> + <file filelist='sympa' name='/usr/share/ead2/backend/config/actions/actions_mail.cfg' rm='True'/> + <file filelist='sympa' name='/etc/eole/eole-db.d/sympa.yml' source='sympa-eoledb.yml' rm='True' /> + </files> + + <containers> + <container name='mail' id='13'> + <package>eole-sympa-pkg</package> + <service servicelist='sympa'>sympa</service> + <service_access service='sympa'> + <port>8787</port> + <port>8888</port> + </service_access> + <service_restriction service='sympa'> + <ip interface='eth0' netmask='netmask_admin_eth0' netmask_type='SymLinkOption' ip_type='SymLinkOption'>ip_admin_eth0</ip> + <ip interface='eth1' netmask='netmask_admin_eth1' netmask_type='SymLinkOption' ip_type='SymLinkOption'>ip_admin_eth1</ip> + <ip interface='eth2' netmask='netmask_admin_eth2' netmask_type='SymLinkOption' ip_type='SymLinkOption'>ip_admin_eth2</ip> + <ip interface='eth3' netmask='netmask_admin_eth3' netmask_type='SymLinkOption' ip_type='SymLinkOption'>ip_admin_eth3</ip> + <ip interface='eth4' netmask='netmask_admin_eth4' netmask_type='SymLinkOption' ip_type='SymLinkOption'>ip_admin_eth4</ip> + </service_restriction> + <service servicelist='sympa'>apache2</service> + <service method="apache" servicelist='sympa'>wwsympa</service> + <file filelist='sympa' name='/etc/sympa/topics.conf'/> + <file filelist='sympa' name='/etc/sympa/list_aliases.tt2'/> + <file filelist='sympa' name='/etc/sympa/auth.conf' owner='sympa' group='sympa' source='sympa.auth.conf'/> + <file filelist='sympa' name='/etc/sympa/sympa/sympa.conf' mode='0640' owner='sympa' group="sympa"/> + <file filelist='sympa' name='/etc/sympa/wwsympa.conf' mode='0644' owner='sympa' group="sympa"/> + <file filelist='sympa' name='/etc/apache2/sites-available/wwsympa' source='apache-sympa.conf'/> + <file filelist='sympa' name='/var/www/sympa/wwsympa.fcgi' source='wwsympa.fcgi' owner='sympa' group='sympa' mkdir='True' mode='0755'/> + </container> + </containers> + + <variables> + <family name='messagerie'> + <variable name='activer_sympa' type='oui/non' description="Activer le serveur de listes de diffusion Sympa"> + <value>oui</value> + </variable> + </family> + <separators> + <separator name='activer_sympa'>Serveur de listes</separator> + </separators> + + </variables> + + <constraints> + <condition name='disabled_if_in' source='activer_sympa'> + <param>non</param> + <target type='servicelist'>sympa</target> + <target type='filelist'>sympa</target> + </condition> + </constraints> + + <help> + <variable name='activer_sympa'>Sympa (Système de Multi-Postage Automatique) est un gestionnaire de listes électroniques</variable> + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/files/usr/share/eole/db/eole-sympa/gen/mysql_create.sql b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/files/usr/share/eole/db/eole-sympa/gen/mysql_create.sql new file mode 100644 index 0000000000000000000000000000000000000000..a37f6d94758e25ecc156a19dd011d038b054c0af --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/files/usr/share/eole/db/eole-sympa/gen/mysql_create.sql @@ -0,0 +1,3 @@ +/* MySQL Database creation script */ + +CREATE DATABASE sympa; diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/files/usr/share/eole/diagnose/52-sympa b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/files/usr/share/eole/diagnose/52-sympa new file mode 100644 index 0000000000000000000000000000000000000000..19f50ef85209778f613e9fa80e8a7db62822c472 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/files/usr/share/eole/diagnose/52-sympa @@ -0,0 +1,29 @@ +#!/bin/bash + +######################################################################### +# pyeole.service - manage EOLE services +# Copyright © 2014 Pôle de Compétence EOLE <eole@ac-dijon.fr> +# +# License CeCILL: +# * in french: http://www.cecill.info/licences/Licence_CeCILL_V2-fr.html +# * in english http://www.cecill.info/licences/Licence_CeCILL_V2-en.html +######################################################################### +. /usr/lib/eole/diagnose.sh + + +if [ $(CreoleGet activer_sympa non) == 'oui' ];then + PID_NAMES="sympa_msg archived bulk bounced task_manager" + + EchoGras "*** Gestion de listes SYMPA" + for pid_name in $PID_NAMES;do + CreoleRun "pgrep ${pid_name}.pl" mail >/dev/null + if [ $? == 0 ];then + printf ". %${len_pf}s => " "${pid_name}" + EchoVert "Ok" + else + printf ". %${len_pf}s => " "${pid_name}" + EchoRouge "Erreur" + fi + done + echo +fi diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/files/usr/share/zephir/monitor/configs/services/24_zarchived.srv b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/files/usr/share/zephir/monitor/configs/services/24_zarchived.srv new file mode 100644 index 0000000000000000000000000000000000000000..e2dc1caf8ac3b6888f18f0cea942d570b9d1caa4 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/files/usr/share/zephir/monitor/configs/services/24_zarchived.srv @@ -0,0 +1,13 @@ +# -*- coding: UTF-8 -*- +""" +Surveillance du service sympa +""" + +from zephir.monitor.agents.services import PgrepService +from zephir.monitor.agentmanager.config import ACTIVER_SYMPA + +if ACTIVER_SYMPA: + srv = 'archived' + data = {srv + '.pl' : "Service de liste ({0})".format(srv)} + AGENTS.append(PgrepService('z' + srv, data, period=115, + description="Etat du service sympa : {0}".format(srv))) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/files/usr/share/zephir/monitor/configs/services/24_zbounced.srv b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/files/usr/share/zephir/monitor/configs/services/24_zbounced.srv new file mode 100644 index 0000000000000000000000000000000000000000..e9f11816b0cb0c1e5ebe37d2e185d76fce4ff7d6 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/files/usr/share/zephir/monitor/configs/services/24_zbounced.srv @@ -0,0 +1,13 @@ +# -*- coding: UTF-8 -*- +""" +Surveillance du service sympa +""" + +from zephir.monitor.agents.services import PgrepService +from zephir.monitor.agentmanager.config import ACTIVER_SYMPA + +if ACTIVER_SYMPA: + srv = 'bounced' + data = {srv + '.pl' : "Service de liste ({0})".format(srv)} + AGENTS.append(PgrepService('z' + srv, data, period=115, + description="Etat du service sympa : {0}".format(srv))) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/files/usr/share/zephir/monitor/configs/services/24_zbulk.srv b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/files/usr/share/zephir/monitor/configs/services/24_zbulk.srv new file mode 100644 index 0000000000000000000000000000000000000000..87be0bbdc60e4de74a4a057864babd6cbe188186 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/files/usr/share/zephir/monitor/configs/services/24_zbulk.srv @@ -0,0 +1,13 @@ +# -*- coding: UTF-8 -*- +""" +Surveillance du service sympa +""" + +from zephir.monitor.agents.services import PgrepService +from zephir.monitor.agentmanager.config import ACTIVER_SYMPA + +if ACTIVER_SYMPA: + srv = 'bulk' + data = {srv + '.pl' : "Service de liste ({0})".format(srv)} + AGENTS.append(PgrepService('z' + srv, data, period=115, + description="Etat du service sympa : {0}".format(srv))) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/files/usr/share/zephir/monitor/configs/services/24_zsympa.srv b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/files/usr/share/zephir/monitor/configs/services/24_zsympa.srv new file mode 100644 index 0000000000000000000000000000000000000000..8be1d23945468419ac723c91597fad2fc8f0c1b4 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/files/usr/share/zephir/monitor/configs/services/24_zsympa.srv @@ -0,0 +1,13 @@ +# -*- coding: UTF-8 -*- +""" +Surveillance du service sympa +""" + +from zephir.monitor.agents.services import PgrepService +from zephir.monitor.agentmanager.config import ACTIVER_SYMPA + +if ACTIVER_SYMPA: + srv = 'sympa_msg' + data = {srv + '.pl' : "Service de liste ({0})".format(srv)} + AGENTS.append(PgrepService('z' + srv, data, period=115, + description="Etat du service sympa : {0}".format(srv))) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/files/usr/share/zephir/monitor/configs/services/24_ztask_manager.srv b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/files/usr/share/zephir/monitor/configs/services/24_ztask_manager.srv new file mode 100644 index 0000000000000000000000000000000000000000..14013cad6c77d3f120f7478ea9d73761f7426aa2 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/files/usr/share/zephir/monitor/configs/services/24_ztask_manager.srv @@ -0,0 +1,13 @@ +# -*- coding: UTF-8 -*- +""" +Surveillance du service sympa +""" + +from zephir.monitor.agents.services import PgrepService +from zephir.monitor.agentmanager.config import ACTIVER_SYMPA + +if ACTIVER_SYMPA: + srv = 'task_manager' + data = {srv + '.pl' : "Service de liste ({0})".format(srv)} + AGENTS.append(PgrepService('z' + srv, data, period=115, + description="Etat du service sympa : {0}".format(srv))) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/posttemplates/05-sympa b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/posttemplates/05-sympa new file mode 100644 index 0000000000000000000000000000000000000000..a0746a8290f507c48a3d42fa85a3aecd69d277a8 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/posttemplates/05-sympa @@ -0,0 +1,102 @@ +#!/bin/bash + +domaine_messagerie_etab=$(CreoleGet domaine_messagerie_etab) +container_path_mail=$(CreoleGet container_path_mail) +activer_sympa=$(CreoleGet activer_sympa non) + +#à appeler après la generation de l'annuaire pour l'appel à Group() + +option=$1 + +# copie du fichier de conf du domaine interne SYMPA +# /etc/sympa/i-$domaine_messagerie_etab +SYMPACONFDIR="/etc/sympa" +ETCSYMPA="${SYMPACONFDIR}/i-${domaine_messagerie_etab}" +FULL_ETCSYMPA="$container_path_mail/$ETCSYMPA" +if [ ! -d $FULL_ETCSYMPA ];then + if [ "$option" = "reconfigure" ]; then + echo "ATTENTION ! Le domaine de messagerie semble avoir changé" + echo "Des dysfonctionnements sont possibles..." + echo + fi + mkdir -p $FULL_ETCSYMPA +fi +cp /var/lib/eole/robot.conf $FULL_ETCSYMPA + +# Mode d'authentification du robot #25281 +cp ${container_path_mail}/${SYMPACONFDIR}/auth.conf ${FULL_ETCSYMPA}/ + +CreoleRun "chown -R sympa:sympa $ETCSYMPA" mail + +# FIXME +#chmod a+r $SYMPADIR/cookie + +# listes internes : /var/lib/sympa/expl/i-$domaine_messagerie_etab +VARSYMPA="/var/lib/sympa/expl/i-$domaine_messagerie_etab" +FULL_VARSYMPA="$container_path_mail/$VARSYMPA" +if [ ! -d $FULL_VARSYMPA ];then + mkdir -p $FULL_VARSYMPA + CreoleRun "chown sympa:sympa $VARSYMPA" mail + # création des listes de base + python -c "from scribe.eolegroup import Group; group = Group(); \ + group.add_maillist('Groupe', 'professeurs', 'restreint'); \ + group.add_maillist('Groupe', 'eleves', 'restreint'); \ + group.add_maillist('Groupe', 'administratifs', 'restreint')" +fi + +# correction des droits sur /var/lib/sympa/expl (#23103) +CreoleRun "chown sympa:sympa /var/lib/sympa/expl" mail + +# fichier des alias sympa pour Exim4 +SYMPAALIAS="/etc/mail/sympa/aliases" +FULL_SYMPAALIAS="$container_path_mail/$SYMPAALIAS" +grep -q '^sympa: ' $FULL_SYMPAALIAS +if [ $? -ne 0 ];then + echo "sympa: \"|/usr/lib/sympa/bin/queue sympa\"" >> $FULL_SYMPAALIAS + CreoleRun "chown sympa:sympa $SYMPAALIAS" mail + chmod 644 $FULL_SYMPAALIAS +fi + +# sticky bit pour que l'appli web tourne en sympa +CreoleRun "chown sympa:sympa /usr/lib/cgi-bin/sympa/wwsympa.fcgi" mail +chmod u+s $container_path_mail/usr/lib/cgi-bin/sympa/wwsympa.fcgi +chmod g+s $container_path_mail/usr/lib/cgi-bin/sympa/wwsympa.fcgi + +# Bonnes permissions sur le dossier du fake cgi +mkdir -p $container_path_mail/var/www/sympa +CreoleRun "chown sympa:sympa /var/www/sympa" mail + +# Désactiver le configuration Apache de Sympa (#19561) +CreoleRun "/usr/sbin/a2disconf sympa" mail > /dev/null + +# mod-rewrite apache2 +CreoleRun "/usr/sbin/a2enmod rewrite >/dev/null" mail +# mod_suexec apache2 +CreoleRun "/usr/sbin/a2enmod suexec >/dev/null" mail + +READER="/root/.reader" +if [ $activer_sympa == 'oui' -a -f $READER ];then + SEARCHPATH="$container_path_mail/var/lib/sympa/expl" + PASSWORD=`cat /root/.reader` + # vérification du mot de passe du reader ldap + for config in `grep -l "user cn=reader" $SEARCHPATH/*/config $SEARCHPATH/*/*/config 2>/dev/null`;do + grep -Eq "^passwd $PASSWORD$" $config + if [ $? -ne 0 ];then + sed -i "s/^passwd .*$/passwd $PASSWORD/g" $config + fi + done +fi + +# We want to populate sympa database +# in mail container silently +CreoleService mysql start > /dev/null +CreoleRun 'su -l sympa -s /bin/sh -c "/usr/lib/sympa/bin/sympa.pl --upgrade_config_location"' mail >& /dev/null +CreoleRun 'su -l sympa -s /bin/sh -c "/usr/lib/sympa/bin/sympa.pl --health_check"' mail >& /dev/null +CreoleRun 'su -l sympa -s /bin/sh -c "/usr/lib/sympa/bin/sympa.pl --upgrade"' mail >& /dev/null +CreoleRun 'su -l sympa -s /bin/sh -c "/usr/share/sympa/bin/upgrade_bulk_spool.pl"' mail >& /dev/null +CreoleRun 'su -l sympa -s /bin/sh -c "/usr/share/sympa/bin/upgrade_send_spool.pl"' mail >& /dev/null +CreoleService mysql start > /dev/null +#End sympa database population + + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..123744908e3a120a6c5d73198b2d3ab8881b0512 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/service.yml @@ -0,0 +1,65 @@ +format: '0.1' +name: eole-sympa +version: |- + 2.7.1-1 +description: |- + Templates et dictionnaires pour Sympa + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: + - eole-exim + - eole-web +packages: [] +dictionaries: + - 25_sympa.xml +extra_dictionaries: {} +templates: + - actions_mail.cfg + - apache-sympa.conf + - list_aliases.tt2 + - robot.conf + - rsyslog_traps_sympa.conf + - sympa-eoledb.yml + - sympa.auth.conf + - sympa.conf + - sympa.logrotate + - topics.conf + - wwsympa.conf + - wwsympa.fcgi +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: + - 05-sympa +files: + /usr/share/eole/db/eole-sympa/gen/mysql_create.sql: + owner: root + group: root + mode: '0644' + /usr/share/eole/diagnose/52-sympa: + owner: root + group: root + mode: '0755' + /usr/share/zephir/monitor/configs/services/24_zarchived.srv: + owner: root + group: root + mode: '0644' + /usr/share/zephir/monitor/configs/services/24_zbounced.srv: + owner: root + group: root + mode: '0644' + /usr/share/zephir/monitor/configs/services/24_zbulk.srv: + owner: root + group: root + mode: '0644' + /usr/share/zephir/monitor/configs/services/24_zsympa.srv: + owner: root + group: root + mode: '0644' + /usr/share/zephir/monitor/configs/services/24_ztask_manager.srv: + owner: root + group: root + mode: '0644' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/templates/actions_mail.cfg b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/templates/actions_mail.cfg new file mode 100644 index 0000000000000000000000000000000000000000..d9c929b8b18801da138287355ea702311d63da9a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/templates/actions_mail.cfg @@ -0,0 +1 @@ +scribe/sympa diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/templates/apache-sympa.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/templates/apache-sympa.conf new file mode 100644 index 0000000000000000000000000000000000000000..18b7e5a1221f54b992c23d9039218cff7d478378 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/templates/apache-sympa.conf @@ -0,0 +1,38 @@ +%if %%container_ip_mail == '127.0.0.1' +%set %%adresse_ip=%%adresse_ip_eth0 +%else +%set %%adresse_ip=%%container_ip_mail +%end if + +Listen %%adresse_ip:8787 +Listen %%adresse_ip:8888 + +<directory /var/lib/sympa/static_content> + Require all granted +</directory> + +<VirtualHost %%adresse_ip:8787> + # permet a Sympa de savoir sur quel domaine repondre + ServerName list.%%domaine_messagerie_etab + + Alias /static-sympa /var/lib/sympa/static_content + SuexecUserGroup sympa sympa + ScriptAlias /wws /var/www/sympa/wwsympa.fcgi + + RewriteEngine On + RewriteRule ^/$ /wws [R=permanent] + UseCanonicalName On +</VirtualHost> + +<VirtualHost %%adresse_ip:8888> + # permet a Sympa de savoir sur quel domaine repondre + ServerName list.i-%%domaine_messagerie_etab + + Alias /static-sympa /var/lib/sympa/static_content + SuexecUserGroup sympa sympa + ScriptAlias /wws2 /var/www/sympa/wwsympa.fcgi + + RewriteEngine On + RewriteRule ^/$ /wws2 [R=permanent] + UseCanonicalName On +</VirtualHost> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/templates/list_aliases.tt2 b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/templates/list_aliases.tt2 new file mode 100644 index 0000000000000000000000000000000000000000..41007da9913be2622bd84438ab12625407a7cd3f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/templates/list_aliases.tt2 @@ -0,0 +1,6 @@ +#------------------------------ [% list.name %]: list alias created [% date %] +[% list.domain %]-[% list.name %]: "| /usr/lib/sympa/bin/queue [% list.name %]@[% list.domain %]" +[% list.domain %]-[% list.name %]-request: "| /usr/lib/sympa/bin/queue [% list.name %]-request@[% list.domain %]" +[% list.domain %]-[% list.name %]-editor: "| /usr/lib/sympa/bin/queue [% list.name %]-editor@[% list.domain %]" +[% list.domain %]-[% list.name %]-unsubscribe: "| /usr/lib/sympa/bin/queue [% list.name %]-unsubscribe@[% list.domain %]" +[% list.domain %]-[% list.name %][% return_path_suffix %]: "| /usr/lib/sympa/bin/bouncequeue [% list.name %]@[% list.domain %]" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/templates/robot.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/templates/robot.conf new file mode 100644 index 0000000000000000000000000000000000000000..0615b940cb48000ff8e2c111e80884b39a1919b7 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/templates/robot.conf @@ -0,0 +1,8 @@ +http_host list.i-%%domaine_messagerie_etab +%if %%container_ip_mail == '127.0.0.1' +wwsympa_url http://%%adresse_ip_eth0:8888/wws2 +%else +wwsympa_url http://%%container_ip_mail:8888/wws2 +%end if +title Robot gerant la Mail List du domaine restreint +listmaster admin@%%domaine_messagerie_etab diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/templates/rsyslog_traps_sympa.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/templates/rsyslog_traps_sympa.conf new file mode 100644 index 0000000000000000000000000000000000000000..37fb1e8a41afc9ad12d0a90920f39e85c1548a01 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/templates/rsyslog_traps_sympa.conf @@ -0,0 +1,42 @@ +# Templates for local and remote logging +$template DynLocalSympa, "/var/log/rsyslog/local/sympa/sympa.%syslogseverity-text%.log" +$template DynRemoteSympa, "/var/log/rsyslog/remote/%fromhost%/sympa/sympa.%syslogseverity-text%.log" +%if %%getVar("activer_reception_logs", "non") == 'non' +# all messages go in local branch +:programname, startswith, "bounced" ?DynLocalSympa +& ~ +:programname, startswith, "archived" ?DynLocalSympa +& ~ +:programname, startswith, "sympa" ?DynLocalSympa +& ~ +:programname, startswith, "task_manager" ?DynLocalSympa +& ~ +:programname, startswith, "wwsympa" ?DynLocalSympa +& ~ +:programname, startswith, "bulk" ?DynLocalSympa +& ~ +%else +# all messages from localhost go in local branch +if ($programname startswith 'archived' or $programname startswith 'bounced' or $programname startswith 'sympa' or $programname startswith 'task_manager' or $programname startswith 'wwsympa' or $programname startswith 'bulk') and $fromhost-ip startswith '127' then ?DynLocalRsyslog +& ~ +%if %%mode_conteneur_actif == 'oui' +# all messages from containers go in local branch +if ($programname startswith 'archived' or $programname startswith 'bounced' or $programname startswith 'sympa' or $programname startswith 'task_manager' or $programname startswith 'wwsympa' or $programname startswith 'bulk') and $fromhost-ip startswith '%%adresse_ip_br0[:-2]' then ?DynLocalRsyslog +& ~ +if ($programname startswith 'archived' or $programname startswith 'bounced' or $programname startswith 'sympa' or $programname startswith 'task_manager' or $programname startswith 'wwsympa' or $programname startswith 'bulk') and $fromhost startswith '%%adresse_ip_br0[:-2]' then ?DynLocalRsyslog +& ~ +%end if +# all remaining messages go in remote branch +:programname, startswith, "bounced" ?DynRemoteSympa +& ~ +:programname, startswith, "archived" ?DynRemoteSympa +& ~ +:programname, startswith, "sympa" ?DynRemoteSympa +& ~ +:programname, startswith, "task_manager" ?DynRemoteSympa +& ~ +:programname, startswith, "wwsympa" ?DynRemoteSympa +& ~ +:programname, startswith, "bulk" ?DynRemoteSympa +& ~ +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/templates/sympa-eoledb.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/templates/sympa-eoledb.yml new file mode 100644 index 0000000000000000000000000000000000000000..24595701696b60e7ddf3a75bb7134a776e509506 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/templates/sympa-eoledb.yml @@ -0,0 +1,10 @@ +--- +dbtype: mysql +dbname: sympa +dbuser: sympa +dbpass: "%%gen_random()" +createscript: "/usr/share/eole/db/eole-sympa/gen/mysql_create.sql" +pwd_files: + - {file: '%%container_path_mail/etc/sympa/sympa/sympa.conf', + pattern: 'db_passwd ', + mod: '640'} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/templates/sympa.auth.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/templates/sympa.auth.conf new file mode 100644 index 0000000000000000000000000000000000000000..efee9bb79e598d77962ddc7198b54724071dd7dc --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/templates/sympa.auth.conf @@ -0,0 +1,8 @@ +ldap + host %%adresse_ip_ldap:389 + suffix %%ldap_base_dn + scope sub + timeout 20 + get_dn_by_uid_filter (uid=[sender]) + get_dn_by_email_filter (mail=[sender]) + email_attribute mail diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/templates/sympa.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/templates/sympa.conf new file mode 100644 index 0000000000000000000000000000000000000000..6f2e3f3fda928eaf711561b2ae979b1133d10ccf --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/templates/sympa.conf @@ -0,0 +1,136 @@ +## Configuration file for Sympa +## refer to the documentation for a detailed list of parameters + +## Directory containing config. files for the lists, helpfile and list +## of lists. Non-absolute path is relative to this directory. +home /var/lib/sympa/expl + +## Directory for configuration files +## It also contains scenari/ and templates/ directories +etc /etc/sympa + +## Umask used for file creation by Sympa +umask 027 + +## Facility used by Syslogd +#syslog `/bin/cat /etc/sympa/facility` +syslog LOCAL1 + +## Communication mode with syslogd is either 'unix' (via Unix sockets) or +## 'inet' (use of UDP) +log_socket_type unix + +## Maximum number of recipients per call to Sendmail +nrcpt 40 + +## Average number of recipients (ie max. number of different domains) +## per call to Sendmail +avg 10 + +## Max. number of Sendmail processes (launched by Sympa) running simultaneously +## Proposed value is quite low, you can rise it up to 100, 200 or even 300 +## with powerfull systems. +maxsmtp 50 + +## The full path to the Message Transfer Agent program (default is Sendmail 8.7 +## or above) +sendmail /usr/sbin/sendmail + +## Name of the host for Sympa +#domain `/bin/cat /etc/mailname || /bin/hostname -f` +domain %%domaine_messagerie_etab + +## Listmaster +#listmaster `echo -n listmaster@; /bin/cat /etc/mailname || /bin/hostname -f` +listmaster admin@%%domaine_messagerie_etab + +## WWSympa root URL +#wwsympa_url `echo -n 'http://'; hostname -f | tr -d "\n"; echo -n '/wws'` +%if %%container_ip_mail == '127.0.0.1' +wwsympa_url http://%%adresse_ip_eth0:8787/wws +%else +wwsympa_url http://%%container_ip_mail:8787/wws +%end if + +## Cookie used to generate MD5 authentication keys +cookie `/bin/cat /etc/sympa/cookie` + +## E-mail address for sending / replying to administrative commands +## Effective address will be $EMAIL@$HOST +email sympa + +## default language +#lang us +lang fr_FR.UTF-8 + +## Supported languages for the user interface +supported_lang fr_FR.UTF-8,en_US + +#### Spools location + +## Parent directory containing all spools +spool /var/spool/sympa + +## Directory is the main spool containing mails to be processed by Sympa +## (commands or messages). This should be the absolute path. +queue /var/spool/sympa/queue + +## Expiration delay for BAD-* files in queue directory +clean_delay_queue 1 + +## Digest spool +queuedigest /var/spool/sympa/queuedigest + +## Moderation spool (when send is set to editorkey or editorkeyonly) +queuemod /var/spool/sympa/queuemod + +## Expiration delay for moderation requests, (may be configure per list +## in the list config file) +clean_delay_queuemod 10 + +## Authentication spool. It contains authentication requests waiting for +## the requester to confirm (send param. set to privatekey/publickey) +queueauth /var/spool/sympa/queueauth + +## Expiration delay in the authentication spool +clean_delay_queueauth 3 + +## Bounce queue +queuebounce /var/spool/sympa/queuebounce + +## Outgoing queue +queueoutgoing /var/spool/sympa/queueoutgoing + +## Directory for task files created by the task manager +queuetask /var/spool/sympa/queuetask + +## Delay between two scan of the main spool (queue). Avoid Zero value ! +sleep 5 + +## Temporaty directory +tmpdir /var/spool/sympa/tmp + +#### Database + +## Database type (mysql | Pg | Oracle | Sybase) +## be carefull to the case +db_type mysql + +## Name of the database +db_name sympa + +## The host hosting your sympa database +db_host %%container_ip_mysql + +## Database user for connexion +db_user sympa + +## Database password (associated to the db_user) +## What ever you use a password or not, you must protect the SQL server (is it a not a public internet service ?) +db_passwd sympa + +#Necessaire en 2.4 +bounce_halt_rate 50 + +#Necessaire en 2.4 +bounce_warn_rate 20 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/templates/sympa.logrotate b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/templates/sympa.logrotate new file mode 100644 index 0000000000000000000000000000000000000000..24eb1fd7f483e5f11d9471b6e0c9714a55525b14 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/templates/sympa.logrotate @@ -0,0 +1,8 @@ +missingok +notifempty +compress + +/var/log/rsyslog/local/sympa/*.log { + weekly + rotate 4 +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/templates/topics.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/templates/topics.conf new file mode 100644 index 0000000000000000000000000000000000000000..869ed72c11676e9a7bee5d563394daea8a082368 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/templates/topics.conf @@ -0,0 +1,32 @@ +Classe +title Classes +visibility noconceal + +Niveau +title Niveaux +visibility noconceal + +Equipe +title Equipes pédagogiques +visibility noconceal + +Matiere +title Matières +visibility noconceal + +Groupe +title Groupes de travail +visibility noconceal + +Option +title Options +visibility noconceal + +Service +title Services administratifs +visibility noconceal + +Responsables +title Responsables élèves +visibility noconceal + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/templates/wwsympa.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/templates/wwsympa.conf new file mode 100644 index 0000000000000000000000000000000000000000..a58269a994e25a9e523ddf767f56fcf9fdd96eb5 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/templates/wwsympa.conf @@ -0,0 +1,67 @@ +###\\\\ Directories and file location ////### + +## Where to store HTML archives +## Better if not in a critical partition +arc_path /var/lib/sympa/wwsarchive + +## Where to store bounces +## Better if not in a critical partition +bounce_path /var/spool/sympa/wwsbounce + +###\\\\ Syslog ////### + +## The syslog facility for wwsympa, archived and bounced +## default is to use previously defined sympa log facility +log_facility LOCAL1 + +#log_module +# +#log_condition + +###\\\\ General definition ////### + +###\\\\ Tuning ////### + +## Password case (insensitive | sensitive) +## Should not be changed ! May invalid all user password +password_case insensitive + +## HTTP cookies lifetime +cookie_expire 0 + +## HTTP cookies validity domain +cookie_domain localhost + +###\\\\ Internationalization ////### + +###\\\\ Errors management ////### + +###\\\\ MTA related ////### + +###\\\\ Plugin ////### + +## Path to MhOnarc mail2html pluggin +## This is required for HTML mail archiving +mhonarc /usr/bin/mhonarc + +###\\\\ DKIM ////### + +###\\\\ S/MIME pluggin ////### + +###\\\\ Database ////### + +###\\\\ Web interface ////### + +## Is fast_cgi module for Apache (or Roxen) installed (0 | 1) +## This module provide much faster web interface +use_fast_cgi 1 + +## Title of main web page +title Mailing lists service + +## Main page type (lists | home) +default_home home + +## Default index organization (thrd | mail) +archive_default_index thrd + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/templates/wwsympa.fcgi b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/templates/wwsympa.fcgi new file mode 100644 index 0000000000000000000000000000000000000000..ef91f5baa526bcffca6997a9dd40d37e91b2107a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-sympa/templates/wwsympa.fcgi @@ -0,0 +1,2 @@ +#!/bin/sh +/usr/lib/cgi-bin/sympa/wwsympa.fcgi diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-thot/dictionaries/00_eole-thot_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-thot/dictionaries/00_eole-thot_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..c39d3d3f62ded031b3cb4d6f2cebe6239d35b8e4 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-thot/dictionaries/00_eole-thot_packages.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>python-eoleaaf</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-thot/dictionaries/30_thot.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-thot/dictionaries/30_thot.xml new file mode 100644 index 0000000000000000000000000000000000000000..35375fd5d7eb72520a7e7a7d0f1aa5a164f22328 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-thot/dictionaries/30_thot.xml @@ -0,0 +1,110 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + <file name='/etc/aaf.conf'/> + </files> + + <containers> + <container name="annuaire"> + <file name='/var/lib/eole/02_thot.ldif' mkdir='True'/> + </container> + </containers> + + <variables> + + <family name='general'> + <variable name='eole_module' redefine='True' > + <value>thot</value> + </variable> + <variable name='nombre_interfaces' redefine='True' mode='expert'/> + </family> + + <family name='services'> + <variable name='activer_apache' redefine='True'> + <value>non</value> + </variable> + <variable name='activer_mysql' redefine='True' hidden='True'/> + <variable name='activer_client_ldap' redefine='True' hidden='True'/> + </family> + + <family name='système'> + + <!-- We need to recalculate the variables --> + <variable name='eole_lv_names' redefine='True' remove_check='True' /> + <variable name='eole_lv_standard_extends' redefine='True' remove_check='True' /> + + </family> + + <family name='Interface-0'> + <variable name='eth0_method' redefine='True' hidden='True'> + <value>statique</value> + </variable> + </family> + + <family name='annuaire'> + <variable name='ldap_base_dn' auto_freeze='True' redefine='True'> + <value>dc=eole,dc=lan</value> + </variable> + </family> + + <family name='sdet' icon='reorder'> + <variable name='code_ent' type='string' description="Code du projet ENT" mandatory='True' auto_freeze='True'/> + <variable name='autoritary_source' type='string' description="Identifiant de la source autoritaire représentant le SI du MEN" mandatory='True' auto_freeze='True'/> + </family> + + <family name='openldap'> + <variable name='ldap_replication' redefine='True' hidden='True'/> + <variable name='ldap_schema' redefine='True'> + <value>sdet</value> + </variable> + </family> + + <family name='eole-sso'> + <variable name='ead_sso' redefine='True'> + <value>non</value> + </variable> + </family> + + <separators /> + + </variables> + + <constraints> + + <fill name='calc_val' target='autoritary_source'> + <param type='eole' name='valeur'>nom_academie</param> + </fill> + + <check name='valid_regexp' target='code_ent'> + <param>^[A-Z][0-9A-F]$</param> + </check> + + <!-- Default AmonEcole* logical volumes --> + <auto name='calc_multi_val' target='eole_lv_names'> + <param>root</param> + <param>tmp</param> + <param>var</param> + <param>home</param> + </auto> + + <!-- Default AmonEcole* logical volumes extension: 100% /home --> + <auto name='calc_multi_val' target='eole_lv_standard_extends'> + <param type='number'>0</param> + <param type='number'>0</param> + <param type='number'>100</param> + <param type='number'>0</param> + </auto> + + </constraints> + + <help> + <family name='sdet'>Paramètres nécessaires à la mise en oeuvre des préconisations du Schéma Directeur des Espaces numériques de Travail</family> + <variable name='code_ent'>Code de l'ENT tel que défini dans l'Annexe Interopérabilité du SDET</variable> + <variable name='autoritary_source'>Pour l'alimentation depuis le SI du MEN, l'identifiant doit être de la forme AC-ACAD</variable> + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-thot/files/usr/share/eole/annuaire/password_files/eoleaaf.ini b/seed/release/eole-2.7/2.7.1/applicationservice/eole-thot/files/usr/share/eole/annuaire/password_files/eoleaaf.ini new file mode 100644 index 0000000000000000000000000000000000000000..30d20b07d6aa6502624f415f7d4590b98dae3caa --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-thot/files/usr/share/eole/annuaire/password_files/eoleaaf.ini @@ -0,0 +1,8 @@ +# Mot de passe ldap pour eole-aaf + +[aaf.conf] +path='/etc' +string=rootdnpasswd = " +rights='root:root' +mode='0600' + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-thot/files/usr/share/eole/applications/gen/eoleaaf.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-thot/files/usr/share/eole/applications/gen/eoleaaf.py new file mode 100644 index 0000000000000000000000000000000000000000..78af29b3095a404ca90b699993898033efeb270f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-thot/files/usr/share/eole/applications/gen/eoleaaf.py @@ -0,0 +1,38 @@ +#-*- coding: utf-8 -*- +########################################################################## +# Eole NG - 2013 +# Copyright Pole de competence Eole (Ministere Education - Academie Dijon) +# Licence CeCill cd /root/LicenceEole.txt +# eole@ac-dijon.fr +# +# aaf.py +# +# Creation de la base de donnees pour eole-aaf +########################################################################## +""" + Creation de la base aaf +""" +from eolesql.db_test import db_exists + +TABLEFILENAMES = ['/usr/share/eole/mysql/eole-aaf/gen/eoleaaf.sql'] + +def test(): + """ + test l'existence de la base aaf + """ + return not db_exists('eoleaaf') + +def pregen_func(db_handler): + """ + Fonction exécutée avant la génération si le test est bon + """ + db_handler.simple_query("CREATE DATABASE eoleaaf CHARACTER SET utf8;") + db_handler.simple_query("GRANT ALL PRIVILEGES ON eoleaaf.* to 'eoleaaf'@'localhost' identified by 'eoleaaf';") + db_handler.simple_query("USE eoleaaf ;") + +conf_dict = dict(filenames=TABLEFILENAMES, + test=test, + inject='USE eoleaaf ;', + pregen=pregen_func, + ) + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-thot/files/usr/share/eole/applications/passwords/eoleaaf.ini b/seed/release/eole-2.7/2.7.1/applicationservice/eole-thot/files/usr/share/eole/applications/passwords/eoleaaf.ini new file mode 100644 index 0000000000000000000000000000000000000000..baf4f3182fdd162ad31295afb1b0d11d2c4ea40a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-thot/files/usr/share/eole/applications/passwords/eoleaaf.ini @@ -0,0 +1,7 @@ +[eoleaaf] +username=eoleaaf +template=dbpasswd = " +filename=/etc/aaf.conf +owner=root:root +chmod=660 + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-thot/files/usr/share/eole/applications/updates/eole-aaf-INE/__init__.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-thot/files/usr/share/eole/applications/updates/eole-aaf-INE/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-thot/files/usr/share/eole/applications/updates/eole-aaf-INE/config.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-thot/files/usr/share/eole/applications/updates/eole-aaf-INE/config.py new file mode 100644 index 0000000000000000000000000000000000000000..1232e1cb0cc6cbc8b9b8780cd1ef56391f8fea54 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-thot/files/usr/share/eole/applications/updates/eole-aaf-INE/config.py @@ -0,0 +1,17 @@ +#-*-coding:utf-8-*- + +FILENAMES = ['/usr/share/eole/mysql/eole-aaf/updates/eoleaaf-update-1.sql'] +# existance du champ ENTEleveINE +QUERY = "select * from information_schema.columns where column_name='ENTEleveINE' and table_name='eleve'" + +def test_response(result): + """ + """ + return result == [] + +conf_dict = dict(db='eoleaaf', + condition_query=QUERY, + expected_response=test_response, + filenames=FILENAMES, + version='ENTEleveINE') + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-thot/files/usr/share/eole/applications/updates/eole-aaf/__init__.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-thot/files/usr/share/eole/applications/updates/eole-aaf/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-thot/files/usr/share/eole/applications/updates/eole-aaf/config.py b/seed/release/eole-2.7/2.7.1/applicationservice/eole-thot/files/usr/share/eole/applications/updates/eole-aaf/config.py new file mode 100644 index 0000000000000000000000000000000000000000..be055715a5b77483c4643ba10c43d8511d7d9f7d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-thot/files/usr/share/eole/applications/updates/eole-aaf/config.py @@ -0,0 +1,16 @@ +#-*-coding:utf-8-*- + +FILENAMES = ['/usr/share/eole/mysql/eole-aaf/updates/eoleaaf-update-0.sql'] +# existance du champ ENTPersonAdresseDiffusion +QUERY = "select * from information_schema.columns where column_name='ENTPersonAdresseDiffusion' and table_name='responsable'" + +def test_response(result): + """ + """ + return result == [] + +conf_dict = dict(db='eoleaaf', + condition_query=QUERY, + expected_response=test_response, + filenames=FILENAMES, + version='Mise à jour SDET 5.0') diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-thot/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-thot/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..03c19a5c39a89cb817e715047a9aa3b2f977c5c1 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-thot/service.yml @@ -0,0 +1,58 @@ +format: '0.1' +name: eole-thot +version: |- + 2.7.1-1 +description: |- + configuration du module EOLE : Thot + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: + - eole-server + - eole-annuaire + - eole-mysql + - eole-web + - eole-adminer +packages: + - python-eoleaaf +dictionaries: + - 30_thot.xml +extra_dictionaries: {} +templates: + - 02_thot.ldif + - aaf.conf +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: [] +files: + /usr/share/eole/annuaire/password_files/eoleaaf.ini: + owner: root + group: root + mode: '0644' + /usr/share/eole/applications/gen/eoleaaf.py: + owner: root + group: root + mode: '0644' + /usr/share/eole/applications/passwords/eoleaaf.ini: + owner: root + group: root + mode: '0644' + /usr/share/eole/applications/updates/eole-aaf/__init__.py: + owner: root + group: root + mode: '0644' + /usr/share/eole/applications/updates/eole-aaf/config.py: + owner: root + group: root + mode: '0644' + /usr/share/eole/applications/updates/eole-aaf-INE/__init__.py: + owner: root + group: root + mode: '0644' + /usr/share/eole/applications/updates/eole-aaf-INE/config.py: + owner: root + group: root + mode: '0644' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-thot/templates/02_thot.ldif b/seed/release/eole-2.7/2.7.1/applicationservice/eole-thot/templates/02_thot.ldif new file mode 100644 index 0000000000000000000000000000000000000000..d511a778814d0a6ef335fd0a0140ff5ad6f0380e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-thot/templates/02_thot.ldif @@ -0,0 +1,24 @@ +####################################################### +# +# Organisation à plat du DIT : +# tous les objets de l'annuaire sont classés dans +# des catégories directement rattachées à la racine +# +# Equipe Eole eole@ac-dijon.fr +# +######################################################## +dn: ou=personnes,%%ldap_base_dn +objectClass: organizationalUnit +ou: personnes + +dn: ou=structures,%%ldap_base_dn +objectClass: organizationalUnit +ou: structures + +dn: ou=groupes,%%ldap_base_dn +objectClass: organizationalUnit +ou: groupes + +dn: ou=applications,%%ldap_base_dn +objectClass: organizationalUnit +ou: applications diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-thot/templates/aaf.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-thot/templates/aaf.conf new file mode 100644 index 0000000000000000000000000000000000000000..43b75d6e2510144d1c98dd4c71ca8673ee75b407 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-thot/templates/aaf.conf @@ -0,0 +1,23 @@ +# Configuration eole-aaf pour Thot + +# name of the autoritary source +autoritary_source = "%%upper(%%autoritary_source)" +# letter of the ENT project code +ent_letter = "%%code_ent[0]" +# number of the ENT project code +ent_number = "%%code_ent[1]" + +# SQL configuration +dbname = "eoleaaf" +dbuser = "eoleaaf" +dbpasswd = "eoleaaf" + +# ldap configuration +basedn = "%%ldap_base_dn" +rootdn = "cn=admin,%%ldap_base_dn" +rootdnpasswd = "rootdnpasswd" +# paths aaf +ldif_path = '/home' +path_aaf_complet = "/home/aaf-complet" +path_aaf_delta = "/home/aaf-delta" + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-userpassword/dictionaries/19_password.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-userpassword/dictionaries/19_password.xml new file mode 100644 index 0000000000000000000000000000000000000000..00da12ecaa7ca7214e2961f6f1108bf97b0eadc1 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-userpassword/dictionaries/19_password.xml @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files/> + <containers/> + + <variables> + <family name='Mots de passe' icon='keyboard'> + <variable name='smb_min_password_length' type='string' description='Longueur minimale des mots de passe'> + <value>5</value> + </variable> + <variable name='smb_min_password_class' type='string' description='Nombre minimum de classes de caractères'> + <value>2</value> + </variable> + </family> + <separators> + <separator name='smb_min_password_length'>Politique de mot de passe pour les utilisateurs LDAP</separator> + </separators> + </variables> + + <constraints> + <check name='valid_enum' target='smb_min_password_length'> + <param type="python">[str(i) for i in range(3, 13)]</param> + </check> + <check name='valid_enum' target='smb_min_password_class'> + <param>['1', '2', '3', '4']</param> + </check> + </constraints> + + <help> + <variable name='smb_min_password_class'>Les classes de caractères sont : chiffres, lettres minuscules, lettres majuscules, et autres caractères</variable> + <family name='Mots de passe'>Politique générale pour les utilisateurs des applications web et de Samba</family> + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-userpassword/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-userpassword/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..fd6c344daac4bd4a8dec1cdd214b0041a29f3d73 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-userpassword/service.yml @@ -0,0 +1,24 @@ +format: '0.1' +name: eole-userpassword +version: |- + 2.7.1-2 +description: |- + Templates et dictionnaires pour le paramètrage des mots de passe + Templates et dictionnaires liés à la gestion des mots de passe + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: [] +packages: [] +dictionaries: + - 19_password.xml +extra_dictionaries: {} +templates: [] +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: [] +files: {} +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/dictionaries/00_eole-vpn_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/dictionaries/00_eole-vpn_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..891ccc2400d2179f07467d7564c4f4d1bc19f2cc --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/dictionaries/00_eole-vpn_packages.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>strongswan</package> + <package>libstrongswan-extra-plugins</package> + <package>libstrongswan-standard-plugins</package> + <package>python-arv</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/dictionaries/20_vpn.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/dictionaries/20_vpn.xml new file mode 100644 index 0000000000000000000000000000000000000000..d4fb69a1ff46e6489f1cda912e51bc40491caa56 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/dictionaries/20_vpn.xml @@ -0,0 +1,105 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + <files> + <file filelist='rvp' name='/etc/strongswan.conf' /> + <file filelist='rvp' name='/etc/strongswan.d/starter.conf' /> + <file filelist='rvp' name='/etc/strongswan.d/charon.conf' /> + <file filelist='rvp' name='/etc/strongswan.d/charon-logging.conf' /> + <file filelist='rvp' name='/etc/strongswan.d/charon/revocation.conf' /> + <file filelist='rvp' name='/etc/strongswan.d/charon/kernel-netlink.conf' /> + <file filelist='rvp' name='/etc/strongswan.d/charon/farp.conf' /> + <file filelist='rvp' name='/etc/strongswan.d/charon/dhcp.conf' /> + <file filelist='rvp' name='/etc/ipsec.d/ipsec_updown' mode='755' rm='True' /> + <file filelist='rvp' name='/usr/share/eole/test-rvp_more_ip' rm='True' /> + </files> + <variables> + <family name='services'> + <variable name='install_rvp' type='oui/non' description='Activer le réseau virtuel privé RVP' hidden='True' > + <value>oui</value> + </variable> + </family> + <family name='réseau avancé'> + <variable name='route_in_vpn' redefine='True' hidden='False' /> + </family> + <family name='rvp' icon='lock'> + <variable name='sw_database_mode' type='oui/non' description='Configuration des tunnels en mode database' hidden='True' /> + <variable name='sw_retransmit_tries' type='number' description="Nombre d'essais de retransmission avant Dead Peer Detection" mandatory='True' mode='expert' > + <value>11</value> + </variable> + <variable name='sw_stroke_timeout' type='number' description="Timeout pour le process stroke" mandatory='True' mode='expert' > + <value>0</value> + </variable> + <variable name='sw_install_vpn_route' type='oui/non' description='Gestion des routes par strongSwan' mode='expert' > + <value>oui</value> + </variable> + <variable name='sw_force_ip_src' type='string' description="Forcer l'adresse IP source de l'interface" mandatory='True' mode='expert' > + <value>1</value> + </variable> + <variable name='sw_threads' type='number' description="Nombre de threads disponibles pour strongSwan" mandatory='True' mode='expert' > + <value>32</value> + </variable> + <variable name='sw_high_priority_threads' type='number' description="Nombre de threads à réserver pour les jobs HIGH priority" mandatory='True' mode='expert' > + <value>2</value> + </variable> + <variable name='sw_medium_priority_threads' type='number' description="Nombre de threads à réserver pour les jobs MEDIUM priority" mandatory='True' mode='expert' > + <value>4</value> + </variable> + <variable name='sw_fragment_size' type='number' description="Taille maximum d'un fragment IKE" mandatory='True' mode='expert' > + <value>1280</value> + </variable> + <variable name='sw_mss' type='number' description="MSS à positionner sur les routes (0 pour désactiver)" mandatory='True' mode='expert' > + <value>0</value> + </variable> + <variable name='sw_mtu' type='number' description="MTU à positionner sur les routes (0 pour désactiver)" mandatory='True' mode='expert' > + <value>0</value> + </variable> + <variable name='ip_test_rvp' type='ip' description='Adresses IP à tester dans test-rvp' multi='True' /> + <variable name='sw_crl_check' type='oui/non' description="Contrôle du status des certificats dans la CRL" mandatory='True' mode='expert' > + <value>oui</value> + </variable> + </family> + <separators> + <!--<separator name='install_rvp'>Réseau Virtuel Privé (RVP)</separator>--> + <separator name='sw_database_mode'>Paramètres strongSwan</separator> + <separator name='sw_install_vpn_route'>Gestion des Routes VPN</separator> + <separator name='sw_threads'>Gestion des threads</separator> + <separator name='sw_fragment_size'>Gestion de la fragmentation</separator> + <separator name='ip_test_rvp'>Paramètres agent Zéphir RVP et diagnose</separator> + <separator name='sw_crl_check'>Paramètres IPsec</separator> + </separators> + </variables> + <constraints> + <auto name='calc_val' target='sw_database_mode'> + <param name='valeur'>non</param> + </auto> + <condition name='disabled_if_in' source='sw_install_vpn_route'> + <param>oui</param> + <target type='variable'>sw_force_ip_src</target> + </condition> + <condition name='disabled_if_in' source='install_rvp'> + <param>non</param> + <target type='variable'>route_in_vpn</target> + <target type='filelist'>rvp</target> + </condition> + <check name="valid_enum" target="sw_force_ip_src"> + <param>['non','1','2','3','4']</param> + <param name="checkval">True</param> + </check> + </constraints> + <help> + <variable name='install_rvp'>Le RVP utilise strongSwan qui est une implémentation libre et complète de VPN IPsec</variable> + <family name='rvp'>Paramétrage du réseau virtuel privé</family> + <variable name='sw_database_mode'>Configuration des tunnels en mode database (oui -> ipsec.db) +ou fichier plat (non -> ipsec.conf) </variable> + <variable name='sw_stroke_timeout'>Exemples de process pouvant se figer : "ipsec stroke statusall", "ipsec stroke delete connexion_name"</variable> + <variable name='sw_fragment_size'>Cette taille sera utilisée uniquement si la fragmentation est autorisée dans la configuration IPSec</variable> + <variable name='sw_mss'>Contournement en cas de problème de MTU/MSS.</variable> + <variable name='sw_mtu'>Contournement en cas de problème de MTU/MSS.</variable> + <variable name='sw_install_vpn_route'>Si 'oui', l'adresse IP d'une des interfaces sera mise en source route selon l'ordre de montée des tunnels; +Si 'non', l'adresse IP de l'interface spécifiée sera forcée comme source lors de l'utilisation des tunnels par le serveur lui-même.</variable> + <variable name='sw_force_ip_src'>Lorsque le serveur aura besoin de passer par un tunnel, il sera vu avec cette adresse IP à l'autre extrémité du tunnel (dans la mesure où le reseau source inclu cette adresse)</variable> + </help> +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/files/etc/logrotate.d/charon b/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/files/etc/logrotate.d/charon new file mode 100644 index 0000000000000000000000000000000000000000..112ac2463c29ea95add994de3f1923a37e4a32c1 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/files/etc/logrotate.d/charon @@ -0,0 +1,7 @@ +/var/log/rsyslog/local/charon/*.log { + rotate 52 + missingok + notifempty + weekly + compress +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/files/usr/share/eole/diagnose/152-rvp b/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/files/usr/share/eole/diagnose/152-rvp new file mode 100644 index 0000000000000000000000000000000000000000..a3ff77450a7e9f6b69a682a2704a235e0d65fc44 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/files/usr/share/eole/diagnose/152-rvp @@ -0,0 +1,113 @@ +#!/usr/bin/env python +# -*- coding: utf8 -*- +""" +diagnose du rvp +""" +import subprocess +import shlex +import re +import time +from commands import getstatusoutput +from os.path import isfile +from creole import config +from creole.client import CreoleClient +from zephir.monitor.agents.rvp import parse_ipsec_statusall + + +dico_eole = CreoleClient().get_creole() +install_rvp = dico_eole.get('install_rvp', 'non') +cmd = [". /usr/lib/eole/diagnose.sh"] +cmd.append('EchoGras "*** Réseau virtuel privé"') + +# test du RVP si configuré +if install_rvp == "oui": + process = subprocess.Popen(['ipsec', 'statusall'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=False) + ret, err_output = process.communicate() + statusall_err = process.returncode + + if statusall_err == 0: + tunnels, total, up, down, idle_threads = parse_ipsec_statusall(ret) + + if dico_eole.get('type_amon') is not None: + # diagnose Amon + TEST_RVP = "/usr/share/eole/test-rvp" + if isfile(TEST_RVP): + if statusall_err == 0: + if "0 up, 0 connecting" in ret: + cmd.append('printf ". %${len_pf}s =>" "RVP"') + cmd.append('EchoOrange " Aucun tunnel actif"') + else: + for tunnel in tunnels: + if tunnel['child_name'] != '': + tested_ip = tunnel['dst'].split('--') + if len(tested_ip) > 1: + for ip in tested_ip: + if "injoignable" in ip: + cmd_line = 'printf ". %${len_pf}s => " "RVP ' + cmd_line += str(ip.split('injoignable')[0].strip())\ + +'"'+'\nEchoRouge " Erreur"' + if cmd_line not in cmd: + cmd.append(cmd_line) + elif "joignable" in ip: + cmd_line = 'printf ". %${len_pf}s => " "RVP ' + cmd_line += str(ip.split('joignable')[0].strip())\ + +'"'+'\nEchoVert " OK"' + if cmd_line not in cmd: + cmd.append(cmd_line) + else: + print statusall_err + cmd.append('printf ". %${len_pf}s => " "RVP"') + cmd.append('EchoRouge " Erreur"') + else: + cmd.append('NoConfig "RVP"') + else: + # diagnose Eolebase ou Sphynx + activer_haute_dispo = dico_eole.get('activer_haute_dispo', 'non') + local_ipsec = True + remote_ipsec = False + if activer_haute_dispo != 'non': + crm_cmd = ['crm', 'resource', 'show', 'ipsec_rsc'] + crm_process = subprocess.Popen(crm_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=False) + crm_output, err_output = crm_process.communicate() + rc_crm = process.returncode + if rc_crm == 0: + crm_output = crm_output.split('\n')[0] + local_node = dico_eole['nom_machine'] + if dico_eole['activer_haute_dispo'] == 'maitre': + remote_node = dico_eole['nom_machine_esclave'] + elif dico_eole['activer_haute_dispo'] == 'esclave': + remote_node = dico_eole['nom_machine_maitre'] + find_line = "^resource ipsec_rsc is running on: {0} $" + if re.match(find_line.format(local_node), crm_output): + local_ipsec = True + remote_ipsec = False + elif re.match(find_line.format(remote_node), crm_output): + local_ipsec = False + remote_ipsec = True + else: + local_ipsec = False + remote_ipsec = False + if local_ipsec: + cmd.append('printf ". %${len_pf}s =>" "VPN"') + if statusall_err == 0: + if "0 up, 0 connecting" in ret: + cmd.append('EchoOrange " Aucun tunnel actif"') + else: + cmd.append('EchoVert " Ok"') + else: + cmd.append('EchoRouge " Erreur"') + cmd.append('TestService ARV $(CreoleGet adresse_ip_eth0):$(CreoleGet arv_port)') + elif remote_ipsec: + cmd.append('printf ". %${len_pf}s =>" ""') + cmd.append('EchoBleu " IPsec sur noeud distant"') + else: + cmd.append('printf ". %${len_pf}s =>" ""') + cmd.append('EchoRouge " IPsec sur aucun noeud du cluster"') +else: + cmd.append('Inactif "RVP"') +cmd.append('echo') +# Exécution des commandes +cmd_string = "\n".join(cmd) +err, ret = getstatusoutput(cmd_string) +print ret +exit(0) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/files/usr/share/eole/sbin/active_rvp b/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/files/usr/share/eole/sbin/active_rvp new file mode 100644 index 0000000000000000000000000000000000000000..f35ae0a97d616a5647642b8816fe39288cf28fc1 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/files/usr/share/eole/sbin/active_rvp @@ -0,0 +1,438 @@ +#!/usr/bin/env python +# -*- coding: utf8 -*- +""" +utilitaire active_rvp sur l'Amon +""" +import sys +import xmlrpclib +import re +from getpass import getpass +from os import system, sep, unlink, mkdir, listdir +from os.path import isfile, isdir, dirname, join +from shutil import copy +from IPy import IP + +from pyeole.ihm import question_ouinon +from pyeole.ansiprint import print_orange, print_red +from creole import config +from creole.client import CreoleClient +from creole.cert import get_subject +from zephir.lib_zephir import TransportEole +try: + from zephir.zephir_conf.zephir_conf import id_serveur, adresse_zephir + ZEPHIR = True +except: + ZEPHIR = False +from arv.config import strongswan_database, ipsec_tmp_path +from arv.lib.util import decrypt_privkey, password_OK, ipsec_restart,\ + ipsec_running, fill_file, clean_directory +from arv.lib import cmd2 as cmd +from arv.db.strongswandb import (PeerConfigs, PrivateKey, PrivateKeyIdentity, + SharedSecrets, SharedSecretIdentity, Identity, + CertificateIdentity, Certificates, initialise) +from arv.config import ipsec_conf_file, ipsec_include_conf_files + +def get_password(): + if isfile(str(join(ipsec_tmp_path, "ipsec.db"))) or isdir(join(ipsec_tmp_path, "CA")): + password = getpass("") + else: + print_red("archive inexistante") + sys.exit() + return password + + +#______________________________________________________________________________ +# command line interpreter +class Cli(cmd.Cmd): + "command line interpreter (abstract base class)" + def __init__(self): + cmd.Cmd.__init__(self) + self.doc_header = "Commandes documentées" + self.undoc_header = "Commandes non documentées" + self.ruler = '-' + self.prompt = "#ActiveRVP> " + self.intro = """Console ActiveRVP : + tapez help (ou "?") pour avoir la liste des commandes, + tapez help <command> pour avoir une aide sur chaque commande""" + + def emptyline(self): + print("Type 'exit' to finish with the session or type ? for help.") + +# def postcmd(self, stop, line): +# stop = True + + def default(self, line): + print("unknown command prefix") + print "*** unknown syntax : %s (type 'help' for help for a list of valid commands)"%line + self.emptyline() + + def do_exit(self, line): + """Exits from the console""" + return True + + def do_quit(self, line): + return True + + def do_EOF(self, args): + """Exit on system end of file character""" + return True #self.do_exit(args) + +# def postloop(self): +# # put here your post actions +# print "exit cli" + + +#_____________________________________________________________________________ +# active_rvp command line interpreter +class ActiveRVPCli(Cli): + """Active RVP Command line interpreter + """ + global conf_eole + global module + conf_eole = CreoleClient().get_creole() + # Test si on est sur Amon/Amonecole ou pas + try: + zone_rvp = conf_eole['type_amon'] + module = "amon" + except: + module = "autre" + + def do_init(self, line): + """Mode d'activation rvp + """ + if conf_eole['install_rvp'] == 'oui': + if ZEPHIR: + mode = self.select("manuel zephir quitter", "choisissez le mode : ") + if mode == "zephir": + self.onecmd("zephir") + elif mode == "manuel": + self.onecmd("manuel") + else: + self.onecmd("exit") + else: + print_orange("Le serveur n'est pas enregistré sur un Zéphir") + rep = question_ouinon("configurer en mode manuel", default='non') + if rep == 'oui': + self.onecmd("manuel") + else: + print "Abandon de la configuration RVP" + return True + else: + print_orange("Le RVP n'est pas activé dans la configuration du serveur.") + return True + + def do_manuel(self, line): + """mode manuel""" + # FIXME + print_red("copier le contenu de l'archive dans " + ipsec_tmp_path) + self.onecmd("start_ipsec") + return True + + def do_zephir(self, line): + """activation du rvp par zephir + """ + if not ZEPHIR: + print_red("serveur non enregistré sur Zéphir") + return True + if self.onecmd("get_rvp_from_zephir"): + self.onecmd("start_ipsec") + return True + + def do_delete(self, line): + """Désactivation rvp + """ + rep = question_ouinon("Etes-vous certain de vouloir désactiver le VPN ?", default='non') + if rep == 'oui': + try: + activer_haute_dispo = conf_eole['activer_haute_dispo'] + except: + activer_haute_dispo = "non" + system("service strongswan stop") + if isfile("/etc/ipsec.conf"): + unlink("/etc/ipsec.conf") + if isfile(strongswan_database): + unlink(strongswan_database) + if isfile("/usr/share/eole/test-rvp"): + unlink("/usr/share/eole/test-rvp") + if isfile("/etc/ipsec.secrets"): + unlink("/etc/ipsec.secrets") + for f in listdir("/etc/ipsec.d/cacerts"): + unlink("/etc/ipsec.d/cacerts/"+f) + for f in listdir("/etc/ipsec.d/certs"): + unlink("/etc/ipsec.d/certs/"+f) + for f in listdir("/etc/ipsec.d/private"): + unlink("/etc/ipsec.d/private/"+f) + else: + print "Abandon de la suppression du RVP" + return True + + def do_get_rvp_from_zephir(self, line): + """récupération de l'archive rvp sur le Zephir""" + + #login, passwd, id_sphynx, tmp_ipsec_path + login = raw_input("Entrez le login Zephir : ") + passwd = getpass("Entrez le mot de passe Zephir : ") + id_sphynx = raw_input("Entrez l'identifiant Zephir du serveur ARV (Sphynx) : ") + if not isdir(dirname(ipsec_tmp_path)): + mkdir(dirname(ipsec_tmp_path)) + if not isdir(ipsec_tmp_path): + mkdir(ipsec_tmp_path) + # remove temporaries files + clean_directory(ipsec_tmp_path) + zephir_proxy = xmlrpclib.ServerProxy("https://%s:%s@%s:7080" % (login, passwd, adresse_zephir), transport=TransportEole()) + try: + # récupération de l'archive de configuration vpn + ret, contenu_b64 = zephir_proxy.uucp.sphynx_get(id_sphynx, id_serveur) + except xmlrpclib.ProtocolError: + print "Erreur d'authentification zephir !" + return False + if ret: + contenu = xmlrpclib.base64.decodestring(contenu_b64) + # écriture du fichier tar + archive = join(ipsec_tmp_path, 'vpn_{0}.tar.gz'.format(id_sphynx)) + f=open(archive,"w") + f.write(contenu) + f.close() + # décompression de l'archive + system("/bin/tar xzf {0} -C {1}".format(archive,ipsec_tmp_path)) + unlink(archive) + print "#->archive récupérée" + return True + else: + print "Erreur :", contenu_b64 + return False + + def do_generate_passthrough(self, line): + """ + Generate passthrough connections based on ipsec configuration and local networks + """ + + # Passthrough connection + # Example : + # ipsec_conf_passthrough_connection.format(\ + # "10.1.1.0/24",\ + # "10.1.2.0/24, 10.1.3.0/24") + ipsec_conf_passthrough_connection = u"""#DEB:passthrough-{0}-{1} +conn "passthrough-{0}-{1}" + leftsubnet = {0} + rightsubnet = {1} + type = passthrough + auto = route +#FIN:passthrough-{0}-{1} + +""" + + if not isdir(dirname(ipsec_include_conf_files)): + mkdir(dirname(ipsec_include_conf_files)) + passthrough_vertices = {} + conn_pattern = re.compile(r'^conn (.*)') + leftsubnet_pattern = re.compile(r'^ *leftsubnet = (.*)') + rightsubnet_pattern = re.compile(r'^ *rightsubnet = (.*)') + rightsourceip_pattern = re.compile(r'^ *rightsourceip = .*') + + # Put each left and right subnet in passthrough dictionnary + # left subnet is the key + with open("/etc/ipsec.conf", "r") as ipsec_conf_file: + leftsubnets = "" + rightsubnets = "" + for conn_line in ipsec_conf_file: + conn_match = conn_pattern.match(conn_line) + if conn_match: + # First connection found + # Exit the loop and continue the find left and right subnet for each connection + break + + for leftsubnet_line in ipsec_conf_file: + leftsubnet_match = leftsubnet_pattern.match(leftsubnet_line) + if leftsubnet_match: + # left subnet found + # memorize leftsubnet match + leftsubnet = leftsubnet_match.group(1) + for right_line in ipsec_conf_file: + rightsubnet_match = rightsubnet_pattern.match(right_line) + if rightsubnet_match: + # rightsubnet found + # memorize rightsubnet match + rightsubnet = rightsubnet_match.group(1) + # Set values into passthrough dictionnary + for localsubnet in leftsubnet.replace('"','').split(','): + for remotesubnet in rightsubnet.replace('"','').split(','): + if IP(localsubnet) not in passthrough_vertices: + passthrough_vertices[IP(localsubnet)] = [IP(remotesubnet)] + else: + passthrough_vertices[IP(localsubnet)].append(IP(remotesubnet)) + # Exit loop to find a new connection + break + else: + rightsourceip_match = rightsourceip_pattern.match(right_line) + if rightsourceip_match: + leftsubnets = "" + rightsubnets = "" + # left subnet and rightsourceip found + # It's a roadwarrior, no passthrough needed + break + else: + conn_match = conn_pattern.match(right_line) + if conn_match: + # Found a new connection but no right subnet + leftsubnets = "" + rightsubnets = "" + # left subnet found but not right subnet found + # Exit loop to find a left subnet line + break + else: + conn_match = conn_pattern.match(leftsubnet_line) + if conn_match: + # No left subnet found but found a new connection in lesftsubnet loop + # Continue in this loop to find left subnet for the new connection + leftsubnets = "" + rightsubnets = "" + + # Add passthrough connection for each local network alias, vlan and local routes when needed + local_subnets = [] + for no_int in range(int(conf_eole['nombre_interfaces'])): + local_subnets.append(IP(conf_eole['adresse_network_eth' + str(no_int)] + "/" + conf_eole['adresse_netmask_eth' + str(no_int)])) + if conf_eole['alias_eth' + str(no_int)] == "oui": + network_var = 'alias_ip_eth' + str(no_int) + '.' + 'alias_network_eth' + str(no_int) + netmask_var = 'alias_ip_eth' + str(no_int) + '.' + 'alias_netmask_eth' + str(no_int) + network = conf_eole[network_var] + netmask = conf_eole[netmask_var] + for i in range(len(network)): + local_subnets.append(IP(network[i] + "/" + netmask[i])) + if conf_eole['vlan_eth' + str(no_int)] == "oui": + network_var = 'vlan_id_eth' + str(no_int) + '.' + 'vlan_network_eth' + str(no_int) + netmask_var = 'vlan_id_eth' + str(no_int) + '.' + 'vlan_netmask_eth' + str(no_int) + network = conf_eole[network_var] + netmask = conf_eole[netmask_var] + for i in range(len(network)): + local_subnets.append(IP(network[i] + "/" + netmask[i])) + if conf_eole['activer_route'] == "oui": + network_var = 'route_adresse' + netmask_var = 'route_adresse' + '.' + 'route_netmask' + route_in_vpn_var = 'route_adresse' + '.' + 'route_in_vpn' + network = conf_eole[network_var] + netmask = conf_eole[netmask_var] + route_in_vpn = conf_eole[route_in_vpn_var] + for i in range(len(network)): + if route_in_vpn[i] == "non": + local_subnets.append(IP(network[i] + "/" + netmask[i])) + + with open(dirname(ipsec_include_conf_files) + sep + 'passthrough', "w") as passthrough: + for local_subnet in local_subnets: + if local_subnet in passthrough_vertices: + for remote_subnet in passthrough_vertices[local_subnet]: + for local_dst_subnet in local_subnets: + if local_dst_subnet in remote_subnet: + passthrough.write(ipsec_conf_passthrough_connection.format(local_subnet, local_dst_subnet)) + return True + + def do_start_ipsec(self, line): + """Mise en place de la configuration ipsec""" + try: + if conf_eole['sw_database_mode'] == 'oui': + # On déchiffre les clefs privées + session = initialise("sqlite:///"+join(ipsec_tmp_path, "ipsec.db")) + for privkey, ident in session.query(PrivateKey, Identity).\ + filter(PrivateKey.id == PrivateKeyIdentity.private_key).\ + filter(PeerConfigs.local_id==PrivateKeyIdentity.identity).\ + filter(PeerConfigs.local_id == Identity.id).\ + filter(Identity.type==9).all(): + + certif, certident = session.query(Certificates.data, + CertificateIdentity.certificate).\ + filter(Certificates.id == CertificateIdentity.certificate).\ + filter(CertificateIdentity.identity == ident.id).first() + + certname = unicode(get_subject(cert=certif)[1], 'utf-8') + print + print "Passphrase du certificat {0} : ".format(certname), + tmpkey = '/tmp/pk.pem' + privatekey_file = open(tmpkey, "w") + privatekey_file.write(privkey.data) + privatekey_file.close() + passwd = get_password() + tried = 1 + while not password_OK(tmpkey, passwd) and tried < 3: + print "erreur passphrase, veuillez réessayer : ", + passwd = get_password() + tried +=1 + if tried == 3 and not password_OK(tmpkey, passwd): + print "Passphrase erronée, trop de tentatives !!!" + unlink(tmpkey) + exit(1) + unlink(tmpkey) + decrypted_privkey = decrypt_privkey(privkey.data, passwd) + privkey.data = decrypted_privkey + session.commit() + session.flush() + # Remplace le contenu de /etc/ipsec.d/ipsec.db par celui de l'archive + fill_file(join(ipsec_tmp_path, "ipsec.db"), strongswan_database) + else: + # Mode fichier plat + # On déchiffre les clefs privées + ipsec_tmp_include_conf_path = join(ipsec_tmp_path, "ipsec.d/conf") + ipsec_tmp_private_path = join(ipsec_tmp_path, "ipsec.d/private") + ipsec_tmp_cacerts_path = join(ipsec_tmp_path, "ipsec.d/cacerts") + ipsec_tmp_certs_path = join(ipsec_tmp_path, "ipsec.d/certs") + privkey_files = listdir(ipsec_tmp_private_path) + for privkey_filename in privkey_files: + certname = privkey_filename.replace('priv', '').replace('.pem', '') + copy(join(ipsec_tmp_private_path, privkey_filename), "/etc/ipsec.d/private/") + dst_privkey_filename = join("/etc/ipsec.d/private", privkey_filename) + print + passwd = getpass("Passphrase du certificat {0} : ".format(certname)) + tried = 1 + while not password_OK(dst_privkey_filename, passwd) and tried < 3: + passwd = getpass("erreur passphrase, veuillez réessayer : ") + tried +=1 + if tried == 3 and not password_OK(dst_privkey_filename, passwd): + print "Passphrase erronée, trop de tentatives !!!" + exit(1) + privkey_handler = open(dst_privkey_filename, "r") + privkey_string = privkey_handler.read() + privkey_handler.close() + privkey_handler = open(dst_privkey_filename, "w") + privkey_handler.write(decrypt_privkey(privkey_string, passwd)) + privkey_handler.close() + copy(join(ipsec_tmp_path, "ipsec.secrets"), "/etc/ipsec.secrets") + for ca_filename in listdir(ipsec_tmp_cacerts_path): + copy(join(ipsec_tmp_cacerts_path, ca_filename), "/etc/ipsec.d/cacerts/") + for cert_filename in listdir(ipsec_tmp_certs_path): + copy(join(ipsec_tmp_certs_path, cert_filename), "/etc/ipsec.d/certs/") + if isdir(ipsec_tmp_include_conf_path): + for include_conf_filename in listdir(ipsec_tmp_include_conf_path): + copy(join(ipsec_tmp_include_conf_path, include_conf_filename), dirname(ipsec_include_conf_files)) + + if isfile(str(join(ipsec_tmp_path, "ipsec.conf"))): + copy(join(ipsec_tmp_path, "ipsec.conf"), "/etc/ipsec.conf") + else: + print("Cette archive est générée par un serveur ARV non à jour !!!") + print("Fichier ipsec.conf absent de l'archive. Création d'un fichier /etc/ipsec.conf minimum pour le mode VPN database.") + ipsec_conf_file = open("/etc/ipsec.conf", "w") + ipsec_conf_content = """config setup + uniqueids = yes + cachecrls = yes + strictcrlpolicy = no +""" + ipsec_conf_file.write(ipsec_conf_content) + ipsec_conf_file.close() + + self.onecmd("generate_passthrough") + if module == "amon": + copy(join(ipsec_tmp_path, "test-rvp"), "/usr/share/eole/test-rvp") + ipsec_restart() + else: + if not ipsec_running(): + ipsec_restart() + else: + system("""ipsec rereadall + ipsec update""") + return True + except: + print_red("RVP non configuré !!!") + self.onecmd("exit") +#_____________________________________________________________________________ +# launch interpreter +cmd = ActiveRVPCli() +cmd.cmdloop() + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/files/usr/share/zephir/monitor/configs/cert.agent b/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/files/usr/share/zephir/monitor/configs/cert.agent new file mode 100644 index 0000000000000000000000000000000000000000..5b2a0b09c8b58f5448cabc133ffa3efa3d39f629 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/files/usr/share/zephir/monitor/configs/cert.agent @@ -0,0 +1,16 @@ +# -*- coding: UTF-8 -*- +""" +agent de surveillance des certificats ipsec (validité) +""" + +from os import system +from zephir.monitor.agents.cert import Cert + +# on vérifie si le service rvp est configuré pour fonctionner +res = system('/usr/sbin/ipsec listcerts | grep -q subject') +if res == 0: + certs = Cert('cert', period=3600, description='Validité des certificats ipsec', section="""Services""") + AGENTS = [certs] +else: + # on supprime le répertoire des stats rvp si il existe (pour ne pas avoir d'erreur sur zephir) + AGENTS = [] diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/files/usr/share/zephir/monitor/configs/rvp.agent b/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/files/usr/share/zephir/monitor/configs/rvp.agent new file mode 100644 index 0000000000000000000000000000000000000000..35c6e66032028e43e6327493bc07454e22216cea --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/files/usr/share/zephir/monitor/configs/rvp.agent @@ -0,0 +1,56 @@ +# -*- coding: UTF-8 -*- +""" +""" + +from os.path import isfile +from zephir.monitor.agentmanager.config import INSTALL_RVP, HAS_TYPE_AMON + +# on vérifie si le service rvp est configuré pour fonctionner +if INSTALL_RVP and HAS_TYPE_AMON: + from zephir.monitor.agents.rvp import RvpAmon + tunnels = RvpAmon('rvp', period=180, + description='Etat des Tunnels', + section="""Services""") + AGENTS = [tunnels] +elif INSTALL_RVP: + from zephir.monitor.agents.rvp import RvpSphynx + period = 180 + + tunnels = RvpSphynx('rvp', + period = period, + description='Etat des Tunnels', + section="""Services""", + datasources = [ + {'name': "bad", 'min_bound': 0}, + {'name': "total", 'min_bound': 0}, + ], + archives = [{'rows':60, 'steps':1}, + {'rows':24*4, 'steps':900/period}, + {'rows':24*7, 'steps':3600/period} + ], + graphs = [ + { 'pngname': "rvp-all.png", + 'vnamedefs': {"all": ("total", 'AVERAGE'), + "bad": ("bad", 'AVERAGE')}, + 'options': ["-l0", "-s end-1day", "-e now", "-t Tunnels", "-v nombre de tunnels", + "AREA:all#CCFF80", "AREA:bad#D91616:tunnels en erreur"] + }, + { 'pngname': "rvp-all-week.png", + 'vnamedefs': {"all": ("total", 'AVERAGE'), + "bad": ("bad", 'AVERAGE')}, + 'options': ["-l0", "-s end-7day", "-e now", "-t Tunnels sur 7 jours", "-v nombre de tunnels", + "AREA:all#CCFF80", "AREA:bad#D91616:tunnels en erreur"] + }, + { 'pngname': "rvp-all-month.png", + 'vnamedefs': {"all": ("total", 'AVERAGE'), + "bad": ("bad", 'AVERAGE')}, + 'options': ["-l0", "-s end-1month", "-e now", "-t Tunnels sur 1 mois", "-v nombre de tunnels", + "AREA:all#CCFF80", "AREA:bad#D91616:tunnels en erreur"] + }, + ]) + + # liste des agents qui seront chargés + AGENTS = [tunnels] +else: + # on supprime le répertoire des stats rvp si il existe (pour ne pas avoir d'erreur sur zephir) + AGENTS = [] diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/postservices/00-rvp b/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/postservices/00-rvp new file mode 100644 index 0000000000000000000000000000000000000000..e49f148535cd5b06eee62e218651a06f1e7622e2 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/postservices/00-rvp @@ -0,0 +1,25 @@ +#!/bin/bash +. /usr/lib/eole/ihm.sh +UPSTART_STRONGSWAN="strongswan" + +install_rvp=$(CreoleGet install_rvp) +type_amon=$(CreoleGet type_amon '') +if [ "$install_rvp" = "non" ] +then + # ipsec est inutile (#1937) + service $UPSTART_STRONGSWAN stop &>/dev/null +elif [ "${type_amon}" != "" ] +then + if [ "$1" = "instance" ] + then + ## Mise en place du VPN ## + echo + Question_ouinon "Voulez-vous (re)configurer le Réseau Virtuel Privé maintenant ?" "True" "non" "warn" + if [ $? -eq 0 ];then + /usr/share/eole/sbin/active_rvp init + fi + echo + fi +fi + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/posttemplates/00-rvp b/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/posttemplates/00-rvp new file mode 100644 index 0000000000000000000000000000000000000000..bfb4f1ecbdaea2d2d6cd6f0d76744dc23c0e7437 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/posttemplates/00-rvp @@ -0,0 +1,18 @@ +#!/bin/bash + +CRL_CACHE_DIR="/etc/ipsec.d/crls" +install_rvp=$(CreoleGet install_rvp non) +if [ "$install_rvp" = "oui" ] +then + # On vide le cache CRL strongSwan (#15970) + # Il sera recréé au lancement du service + if [ -d $CRL_CACHE_DIR ] + then + rm -f $CRL_CACHE_DIR/* >> /dev/null 2>&1 + fi + + # Génération des connexions passthrough (le template ip_xfrm_policy n'existe plus #24753) + /usr/share/eole/sbin/active_rvp generate_passthrough +fi + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..29f32fb46a600cf427a9edfc508d7ffbba23dffc --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/service.yml @@ -0,0 +1,59 @@ +format: '0.1' +name: eole-vpn +version: |- + 2.7.1-1 +description: |- + Templates, dictionnaire et scripts pour le gestion du VPN + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: [] +packages: + - strongswan + - libstrongswan-extra-plugins + - libstrongswan-standard-plugins + - python-arv +dictionaries: + - 20_vpn.xml +extra_dictionaries: {} +templates: + - charon-logging.conf + - charon.conf + - dhcp.conf + - farp.conf + - ipsec_updown + - kernel-netlink.conf + - revocation.conf + - starter.conf + - strongswan.conf + - test-rvp_more_ip +creole_funcs: [] +preservices: [] +postservices: + - 00-rvp +pretemplates: [] +posttemplates: + - 00-rvp +files: + /etc/logrotate.d/charon: + owner: root + group: root + mode: '0644' + /usr/share/eole/diagnose/152-rvp: + owner: root + group: root + mode: '0755' + /usr/share/eole/sbin/active_rvp: + owner: root + group: root + mode: '0755' + /usr/share/zephir/monitor/configs/cert.agent: + owner: root + group: root + mode: '0644' + /usr/share/zephir/monitor/configs/rvp.agent: + owner: root + group: root + mode: '0644' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/templates/charon-logging.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/templates/charon-logging.conf new file mode 100644 index 0000000000000000000000000000000000000000..b70e8d1d78adb13c093ca8b6a1194471db940340 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/templates/charon-logging.conf @@ -0,0 +1,75 @@ +charon { + + # Section to define file loggers, see LOGGER CONFIGURATION in + # strongswan.conf(5). + filelog { + + # <filename> is the full path to the log file. + # <filename> { + + # Loglevel for a specific subsystem. + # <subsystem> = <default> + + # If this option is enabled log entries are appended to the existing + # file. + # append = yes + + # Default loglevel. + # default = 1 + + # Enabling this option disables block buffering and enables line + # buffering. + # flush_line = no + + # Prefix each log entry with the connection name and a unique + # numerical identifier for each IKE_SA. + # ike_name = no + + # Adds the milliseconds within the current second after the + # timestamp (separated by a dot, so time_format should end with %S + # or %T). + # time_add_ms = no + + # Prefix each log entry with a timestamp. The option accepts a + # format string as passed to strftime(3). + # time_format = + + # } + + } + + # Section to define syslog loggers, see LOGGER CONFIGURATION in + # strongswan.conf(5). + syslog { + + # Identifier for use with openlog(3). + # identifier = + + # <facility> is one of the supported syslog facilities, see LOGGER + # CONFIGURATION in strongswan.conf(5). + # <facility> { + + # Loglevel for a specific subsystem. + # <subsystem> = <default> + + # Default loglevel. + # default = 1 + + # Prefix each log entry with the connection name and a unique + # numerical identifier for each IKE_SA. + # ike_name = no + + # } + daemon { + default = 1 + } + # very minimalistic IKE auditing logs to LOG_AUTHPRIV + auth { + default = 0 + ike = 0 + } + + } + +} + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/templates/charon.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/templates/charon.conf new file mode 100644 index 0000000000000000000000000000000000000000..328ecd24df07e2fb329269c7641247bd658a5631 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/templates/charon.conf @@ -0,0 +1,334 @@ +# Options for the charon IKE daemon. +charon { + + # Accept unencrypted ID and HASH payloads in IKEv1 Main Mode. + # accept_unencrypted_mainmode_messages = no + + # Maximum number of half-open IKE_SAs for a single peer IP. + # block_threshold = 5 + + # Whether relations in validated certificate chains should be cached in + # memory. + # cert_cache = yes + + # Send Cisco Unity vendor ID payload (IKEv1 only). + # cisco_unity = no + + # Close the IKE_SA if setup of the CHILD_SA along with IKE_AUTH failed. + # close_ike_on_child_failure = no + + # Number of half-open IKE_SAs that activate the cookie mechanism. + # cookie_threshold = 10 + + # Use ANSI X9.42 DH exponent size or optimum size matched to cryptographic + # strength. + # dh_exponent_ansi_x9_42 = yes + + # Use RTLD_NOW with dlopen when loading plugins and IMV/IMCs to reveal + # missing symbols immediately. + # dlopen_use_rtld_now = no + + # DNS server assigned to peer via configuration payload (CP). + # dns1 = + + # DNS server assigned to peer via configuration payload (CP). + # dns2 = + + # Enable Denial of Service protection using cookies and aggressiveness + # checks. + # dos_protection = yes + + # Compliance with the errata for RFC 4753. + # ecp_x_coordinate_only = yes + + # Free objects during authentication (might conflict with plugins). + # flush_auth_cfg = no + + # Maximum size (complete IP datagram size in bytes) of a sent IKE fragment + # when using proprietary IKEv1 or standardized IKEv2 fragmentation (0 for + # address family specific default values). If specified this limit is + # used for both IPv4 and IPv6. + fragment_size = %%sw_fragment_size + + # Name of the group the daemon changes to after startup. + # group = + + # Timeout in seconds for connecting IKE_SAs (also see IKE_SA_INIT DROPPING). + # half_open_timeout = 30 + + # Enable hash and URL support. + # hash_and_url = no + + # Allow IKEv1 Aggressive Mode with pre-shared keys as responder. + # i_dont_care_about_security_and_use_aggressive_mode_psk = no + + # Whether to ignore the traffic selectors from the kernel's acquire events + # for IKEv2 connections (they are not used for IKEv1). + # ignore_acquire_ts = no + + # A space-separated list of routing tables to be excluded from route + # lookups. + # ignore_routing_tables = + + # Maximum number of IKE_SAs that can be established at the same time before + # new connection attempts are blocked. + # ikesa_limit = 0 + + # Number of exclusively locked segments in the hash table. + # ikesa_table_segments = 1 + + # Size of the IKE_SA hash table. + # ikesa_table_size = 1 + + # Whether to close IKE_SA if the only CHILD_SA closed due to inactivity. + # inactivity_close_ike = no + + # Limit new connections based on the current number of half open IKE_SAs, + # see IKE_SA_INIT DROPPING in strongswan.conf(5). + # init_limit_half_open = 0 + + # Limit new connections based on the number of queued jobs. + # init_limit_job_load = 0 + + # Causes charon daemon to ignore IKE initiation requests. + # initiator_only = no + + # Install routes into a separate routing table for established IPsec + # tunnels. + # install_routes = yes + %if %%is_defined('sw_install_vpn_route') and %%sw_install_vpn_route == 'oui' + install_routes = yes + %else + install_routes = no + %end if + + # Install virtual IP addresses. + # install_virtual_ip = yes + + # The name of the interface on which virtual IP addresses should be + # installed. + # install_virtual_ip_on = + + # Check daemon, libstrongswan and plugin integrity at startup. + # integrity_test = no + + # A comma-separated list of network interfaces that should be ignored, if + # interfaces_use is specified this option has no effect. + # interfaces_ignore = + + # A comma-separated list of network interfaces that should be used by + # charon. All other interfaces are ignored. + # interfaces_use = + + # NAT keep alive interval. + # keep_alive = 20s + + # Plugins to load in the IKE daemon charon. + # load = + + # Determine plugins to load via each plugin's load option. + # load_modular = no + + # Initiate IKEv2 reauthentication with a make-before-break scheme. + # make_before_break = no + + # Maximum number of IKEv1 phase 2 exchanges per IKE_SA to keep state about + # and track concurrently. + # max_ikev1_exchanges = 3 + + # Maximum packet size accepted by charon. + # max_packet = 10000 + + # Enable multiple authentication exchanges (RFC 4739). + # multiple_authentication = yes + multiple_authentication = no + + # WINS servers assigned to peer via configuration payload (CP). + # nbns1 = + + # WINS servers assigned to peer via configuration payload (CP). + # nbns2 = + + # UDP port used locally. If set to 0 a random port will be allocated. + # port = 500 + + # UDP port used locally in case of NAT-T. If set to 0 a random port will be + # allocated. Has to be different from charon.port, otherwise a random port + # will be allocated. + # port_nat_t = 4500 + + # By default public IPv6 addresses are preferred over temporary ones (RFC + # 4941), to make connections more stable. Enable this option to reverse + # this. + # prefer_temporary_addrs = no + + # Process RTM_NEWROUTE and RTM_DELROUTE events. + # process_route = yes + + # Delay in ms for receiving packets, to simulate larger RTT. + # receive_delay = 0 + + # Delay request messages. + # receive_delay_request = yes + + # Delay response messages. + # receive_delay_response = yes + + # Specific IKEv2 message type to delay, 0 for any. + # receive_delay_type = 0 + + # Size of the AH/ESP replay window, in packets. + # replay_window = 32 + + # Base to use for calculating exponential back off, see IKEv2 RETRANSMISSION + # in strongswan.conf(5). + # retransmit_base = 1.8 + + # Timeout in seconds before sending first retransmit. + # retransmit_timeout = 4.0 + + # Number of times to retransmit a packet before giving up. + # retransmit_tries = 5 + retransmit_tries = %%sw_retransmit_tries + + # Interval in seconds to use when retrying to initiate an IKE_SA (e.g. if + # DNS resolution failed), 0 to disable retries. + # retry_initiate_interval = 0 + + # Initiate CHILD_SA within existing IKE_SAs. + # reuse_ikesa = yes + + # Numerical routing table to install routes to. + # routing_table = + routing_table = main + + # Priority of the routing table. + # routing_table_prio = + + # Delay in ms for sending packets, to simulate larger RTT. + # send_delay = 0 + + # Delay request messages. + # send_delay_request = yes + + # Delay response messages. + # send_delay_response = yes + + # Specific IKEv2 message type to delay, 0 for any. + # send_delay_type = 0 + + # Send strongSwan vendor ID payload + # send_vendor_id = no + + # Whether to enable Signature Authentication as per RFC 7427. + # signature_authentication = yes + + # Whether to enable constraints against IKEv2 signature schemes. + # signature_authentication_constraints = yes + + # Number of worker threads in charon. + # threads = 16 + threads = %%sw_threads + + # Name of the user the daemon changes to after startup. + # user = + + crypto_test { + + # Benchmark crypto algorithms and order them by efficiency. + # bench = no + + # Buffer size used for crypto benchmark. + # bench_size = 1024 + + # Number of iterations to test each algorithm. + # bench_time = 50 + + # Test crypto algorithms during registration (requires test vectors + # provided by the test-vectors plugin). + # on_add = no + + # Test crypto algorithms on each crypto primitive instantiation. + # on_create = no + + # Strictly require at least one test vector to enable an algorithm. + # required = no + + # Whether to test RNG with TRUE quality; requires a lot of entropy. + # rng_true = no + + } + + host_resolver { + + # Maximum number of concurrent resolver threads (they are terminated if + # unused). + # max_threads = 3 + + # Minimum number of resolver threads to keep around. + # min_threads = 0 + + } + + leak_detective { + + # Includes source file names and line numbers in leak detective output. + # detailed = yes + + # Threshold in bytes for leaks to be reported (0 to report all). + # usage_threshold = 10240 + + # Threshold in number of allocations for leaks to be reported (0 to + # report all). + # usage_threshold_count = 0 + + } + + processor { + + # Section to configure the number of reserved threads per priority class + # see JOB PRIORITY MANAGEMENT in strongswan.conf(5). + priority_threads { + high = %%sw_high_priority_threads + medium = %%sw_medium_priority_threads + } + + } + + # Section containing a list of scripts (name = path) that are executed when + # the daemon is started. + start-scripts { + + } + + # Section containing a list of scripts (name = path) that are executed when + # the daemon is terminated. + stop-scripts { + + } + + tls { + + # List of TLS encryption ciphers. + # cipher = + + # List of TLS key exchange methods. + # key_exchange = + + # List of TLS MAC algorithms. + # mac = + + # List of TLS cipher suites. + # suites = + + } + + x509 { + + # Discard certificates with unsupported or unknown critical extensions. + # enforce_critical = yes + + } + +} + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/templates/dhcp.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/templates/dhcp.conf new file mode 100644 index 0000000000000000000000000000000000000000..c179f2dd3809c32ee9bcec44386ca08e85ea0359 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/templates/dhcp.conf @@ -0,0 +1,20 @@ +dhcp { + + # Always use the configured server address. + # force_server_address = no + + # Derive user-defined MAC address from hash of IKE identity. + # identity_lease = no + + # Interface name the plugin uses for address allocation. + # interface = + + # Whether to load the plugin. Can also be an integer to increase the + # priority of this plugin. + load = no + + # DHCP server unicast or broadcast IP address. + # server = 255.255.255.255 + +} + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/templates/farp.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/templates/farp.conf new file mode 100644 index 0000000000000000000000000000000000000000..6c15c4f97876038dbecc2942f1d4533ae27c5492 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/templates/farp.conf @@ -0,0 +1,8 @@ +farp { + + # Whether to load the plugin. Can also be an integer to increase the + # priority of this plugin. + load = no + +} + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/templates/ipsec_updown b/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/templates/ipsec_updown new file mode 100644 index 0000000000000000000000000000000000000000..f7be1a0f6ad1b90a7267f95970ca8985a79ad444 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/templates/ipsec_updown @@ -0,0 +1,632 @@ +#! /bin/bash +# iproute2 version, default updown script +# +# Copyright (C) 2003-2004 Nigel Meteringham +# Copyright (C) 2003-2004 Tuomo Soini +# Copyright (C) 2002-2004 Michael Richardson +# Copyright (C) 2005-2006 Andreas Steffen <andreas.steffen@strongswan.org> +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# RCSID $Id: _updown.in,v 1.2 2006/04/17 15:06:29 as Exp $ + +# CAUTION: Installing a new version of strongSwan will install a new +# copy of this script, wiping out any custom changes you make. If +# you need changes, make a copy of this under another name, and customize +# that, and use the (left/right)updown parameters in ipsec.conf to make +# strongSwan use yours instead of this default one. + +# things that this script gets (from ipsec_pluto(8) man page) +# +# PLUTO_VERSION +# indicates what version of this interface is being +# used. This document describes version 1.1. This +# is upwardly compatible with version 1.0. +# +# PLUTO_VERB +# specifies the name of the operation to be performed +# (prepare-host, prepare-client, up-host, up-client, +# down-host, or down-client). If the address family +# for security gateway to security gateway communica +# tions is IPv6, then a suffix of -v6 is added to the +# verb. +# +# PLUTO_CONNECTION +# is the name of the connection for which we are +# routing. +# +# PLUTO_NEXT_HOP +# is the next hop to which packets bound for the peer +# must be sent. +# +# PLUTO_INTERFACE +# is the name of the ipsec interface to be used. +# +# PLUTO_REQID +# is the requid of the ESP policy +# +# PLUTO_ME +# is the IP address of our host. +# +# PLUTO_MY_ID +# is the ID of our host. +# +# PLUTO_MY_CLIENT +# is the IP address / count of our client subnet. If +# the client is just the host, this will be the +# host's own IP address / max (where max is 32 for +# IPv4 and 128 for IPv6). +# +# PLUTO_MY_CLIENT_NET +# is the IP address of our client net. If the client +# is just the host, this will be the host's own IP +# address. +# +# PLUTO_MY_CLIENT_MASK +# is the mask for our client net. If the client is +# just the host, this will be 255.255.255.255. +# +# PLUTO_MY_SOURCEIP +# if non-empty, then the source address for the route will be +# set to this IP address. +# +# PLUTO_MY_PROTOCOL +# is the IP protocol that will be transported. +# +# PLUTO_MY_PORT +# is the UDP/TCP port to which the IPsec SA is +# restricted on our side. +# +# PLUTO_PEER +# is the IP address of our peer. +# +# PLUTO_PEER_ID +# is the ID of our peer. +# +# PLUTO_PEER_CA +# is the CA which issued the cert of our peer. +# +# PLUTO_PEER_CLIENT +# is the IP address / count of the peer's client sub +# net. If the client is just the peer, this will be +# the peer's own IP address / max (where max is 32 +# for IPv4 and 128 for IPv6). +# +# PLUTO_PEER_CLIENT_NET +# is the IP address of the peer's client net. If the +# client is just the peer, this will be the peer's +# own IP address. +# +# PLUTO_PEER_CLIENT_MASK +# is the mask for the peer's client net. If the +# client is just the peer, this will be +# 255.255.255.255. +# +# PLUTO_PEER_PROTOCOL +# is the IP protocol that will be transported. +# +# PLUTO_PEER_PORT +# is the UDP/TCP port to which the IPsec SA is +# restricted on the peer side. +# + +# uncomment to log VPN connections +VPN_LOGGING=1 +# +# tag put in front of each log entry: +TAG=vpn +# +# syslog facility and priority used: +FAC_PRIO=local0.notice +# +# to create a special vpn logging file, put the following line into +# the syslog configuration file /etc/syslog.conf: +# +# local0.notice -/var/log/vpn +# + +# check interface version +case "$PLUTO_VERSION" in +1.[0|1]) # Older Pluto?!? Play it safe, script may be using new features. + echo "$0: obsolete interface version \`$PLUTO_VERSION'," >&2 + echo "$0: called by obsolete Pluto?" >&2 + exit 2 + ;; +1.*) ;; +*) echo "$0: unknown interface version \`$PLUTO_VERSION'" >&2 + exit 2 + ;; +esac + +# check parameter(s) +case "$1:$*" in +':') # no parameters + ;; +iptables:iptables) # due to (left/right)firewall; for default script only + ;; +custom:*) # custom parameters (see above CAUTION comment) + ;; +*) echo "$0: unknown parameters \`$*'" >&2 + exit 2 + ;; +esac + + +# convert cidr mask to dot-decimal notation +cidr2mask() { + local i mask="" + local full_octets=$(($1/8)) + local partial_octet=$(($1%8)) + + for ((i=0;i<4;i+=1)); do + if [ $i -lt $full_octets ]; then + mask+=255 + elif [ $i -eq $full_octets ]; then + mask+=$((256 - 2**(8-$partial_octet))) + else + mask+=0 + fi + test $i -lt 3 && mask+=. + done + + echo $mask +} + +# utility functions for route manipulation +# Meddling with this stuff should not be necessary and requires great care. +uproute() { + doroute replace + ip route flush cache +} +downroute() { + doroute delete + ip route flush cache +} + +addsource() { + st=0 + if ! ip -o route get ${PLUTO_MY_SOURCEIP%/*} | grep -q ^local + then + it="ip addr add ${PLUTO_MY_SOURCEIP%/*}/32 dev $PLUTO_INTERFACE" + oops="`eval $it 2>&1`" + st=$? + if test " $oops" = " " -a " $st" != " 0" + then + oops="silent error, exit status $st" + fi + if test " $oops" != " " -o " $st" != " 0" + then + echo "$0: addsource \`$it' failed ($oops)" >&2 + fi + fi + return $st +} + +doroute() { + st=0 + parms="$PLUTO_PEER_CLIENT" + + parms2= + if [ -n "$PLUTO_NEXT_HOP" ] + then + parms2="via $PLUTO_NEXT_HOP" + fi + parms2="$parms2 dev $PLUTO_INTERFACE" + + if [ -z "$PLUTO_MY_SOURCEIP" ] + then + if [ -f /etc/sysconfig/defaultsource ] + then + . /etc/sysconfig/defaultsource + fi + + if [ -f /etc/conf.d/defaultsource ] + then + . /etc/conf.d/defaultsource + fi + + if [ -n "$DEFAULTSOURCE" ] + then + PLUTO_MY_SOURCEIP=$DEFAULTSOURCE + fi + fi + %if %%is_defined('sw_force_ip_src') and %%sw_force_ip_src != "non" + #PLUTO_MY_SOURCEIP=`grep -A 2 "auto %%sw_force_ip_src" /etc/network/interfaces |grep address|cut -d" " -f2` + PLUTO_MY_SOURCEIP=`ip addr show dev %%getVar('nom_zone_eth' + %%sw_force_ip_src) | grep -m 1 "inet " | sed -e "s/^.*inet \(.*\)\/.*$/\1/"` + %else + PLUTO_MY_SOURCEIP="" + %end if + + parms3= + SRC_IP_ROUTE=$(ip route list ${PLUTO_PEER_CLIENT}|sed "s/^.*src \(.*\)/\1/") + if test "$1" = "replace" -a -n "$PLUTO_MY_SOURCEIP" + then + addsource + # if no src for remote subnet + if [ "${SRC_IP_ROUTE}" == "" ] + then + %if %%is_defined('sw_force_ip_src') and %%sw_force_ip_src != "non" + MY_SOURCEIP_NETMASK_CIDR=$(ip addr show dev %%getVar('nom_zone_eth' + %%sw_force_ip_src)|grep "${PLUTO_MY_SOURCEIP}"|sed "s/^.*inet.*\/\([0-9]*\) .*$/\1/") + %else + MY_SOURCEIP_NETMASK_CIDR=$(ip addr show dev %%getVar('nom_zone_eth1', 'no_eth1')|grep "${PLUTO_MY_SOURCEIP}"|sed "s/^.*inet.*\/\([0-9]*\) .*$/\1/") + %end if + MY_SOURCEIP_NETMASK_DOT=$(cidr2mask ${MY_SOURCEIP_NETMASK_CIDR}) + byte1="$[$(echo ${PLUTO_MY_SOURCEIP}|cut -d"." -f1)&$(echo ${MY_SOURCEIP_NETMASK_DOT}|cut -d"." -f1)]" + byte2="$[$(echo ${PLUTO_MY_SOURCEIP}|cut -d"." -f2)&$(echo ${MY_SOURCEIP_NETMASK_DOT}|cut -d"." -f2)]" + byte3="$[$(echo ${PLUTO_MY_SOURCEIP}|cut -d"." -f3)&$(echo ${MY_SOURCEIP_NETMASK_DOT}|cut -d"." -f3)]" + byte4="$[$(echo ${PLUTO_MY_SOURCEIP}|cut -d"." -f4)&$(echo ${MY_SOURCEIP_NETMASK_DOT}|cut -d"." -f4)]" + MYSOURCEIP_NETWORK="${byte1}.${byte2}.${byte3}.${byte4}/${MY_SOURCEIP_NETMASK_CIDR}" + if [ "${MYSOURCEIP_NETWORK}" != "${PLUTO_MY_CLIENT}" ] + then + PLUTO_MY_SOURCEIP=$(ip route list $PLUTO_MY_CLIENT|sed 's/^.*src \(.*\)/\1/') + fi + fi + parms3="$parms3 src ${PLUTO_MY_SOURCEIP%/*}" + fi + + case "$PLUTO_PEER_CLIENT" in + "0.0.0.0/0") + # opportunistic encryption work around + # need to provide route that eclipses default, without + # replacing it. + it="ip route $1 0.0.0.0/1 $parms2 $parms3 && + ip route $1 128.0.0.0/1 $parms2 $parms3" + ;; + *) if test "$1" = "delete" + then + # if already existing route with another src IP + # don't suppress it + MY_SRC_IP_ROUTE=$(ip route list $PLUTO_MY_CLIENT|sed 's/^.*src \(.*\)/\1/') + if [ "${SRC_IP_ROUTE}" != "${MY_SRC_IP_ROUTE}" ] + then + it="echo 2>&1" + else + it="ip route $1 $parms $parms2 $parms3" + fi + else + it="ip route $1 $parms $parms2 $parms3" + fi + ;; + esac + oops="`eval $it 2>&1`" + st=$? + if test " $oops" = " " -a " $st" != " 0" + then + oops="silent error, exit status $st" + fi + if test " $oops" != " " -o " $st" != " 0" + then + echo "$0: doroute \`$it' failed ($oops)" >&2 + fi + return $st +} + +# in the presence of KLIPS and ipsecN interfaces do not use IPSEC_POLICY +if [ `echo "$PLUTO_INTERFACE" | grep "ipsec"` ] +then + IPSEC_POLICY_IN="" + IPSEC_POLICY_OUT="" +else + IPSEC_POLICY="-m policy --pol ipsec --proto esp --reqid $PLUTO_REQID" + IPSEC_POLICY_IN="$IPSEC_POLICY --dir in" + IPSEC_POLICY_OUT="$IPSEC_POLICY --dir out" +fi + +# are there port numbers? +if [ "$PLUTO_MY_PORT" != 0 ] +then + S_MY_PORT="--sport $PLUTO_MY_PORT" + D_MY_PORT="--dport $PLUTO_MY_PORT" +fi +if [ "$PLUTO_PEER_PORT" != 0 ] +then + S_PEER_PORT="--sport $PLUTO_PEER_PORT" + D_PEER_PORT="--dport $PLUTO_PEER_PORT" +fi + +# the big choice +case "$PLUTO_VERB:$1" in +prepare-host:*|prepare-client:*) + # delete possibly-existing route (preliminary to adding a route) + case "$PLUTO_PEER_CLIENT" in + "0.0.0.0/0") + # need to provide route that eclipses default, without + # replacing it. + parms1="0.0.0.0/1" + parms2="128.0.0.0/1" + it="ip route delete $parms1 2>&1 ; ip route delete $parms2 2>&1" + oops="`ip route delete $parms1 2>&1 ; ip route delete $parms2 2>&1`" + ;; + *) + parms="$PLUTO_PEER_CLIENT" + it="ip route delete $parms 2>&1" + oops="`ip route delete $parms 2>&1`" + ;; + esac + status="$?" + if test " $oops" = " " -a " $status" != " 0" + then + oops="silent error, exit status $status" + fi + case "$oops" in + *'RTNETLINK answers: No such process'*) + # This is what route (currently -- not documented!) gives + # for "could not find such a route". + oops= + status=0 + ;; + esac + if test " $oops" != " " -o " $status" != " 0" + then + echo "$0: \`$it' failed ($oops)" >&2 + fi + exit $status + ;; +route-host:*|route-client:*) + # connection to me or my client subnet being routed + uproute + ;; +unroute-host:*|unroute-client:*) + # connection to me or my client subnet being unrouted + downroute + ;; +up-host:) + # connection to me coming up + # If you are doing a custom version, firewall commands go here. + ;; +down-host:) + # connection to me going down + # If you are doing a custom version, firewall commands go here. + ;; + +up-client:) + # connection to my client subnet coming up + #Passer le POSTROUTING sans SNAT pour le rvp + /sbin/iptables -t nat -I POSTROUTING -m state --state NEW -s $PLUTO_MY_CLIENT -o %%interface_gw -d $PLUTO_PEER_CLIENT -j ACCEPT + /sbin/iptables -t nat -I POSTROUTING -m state --state ESTABLISHED,RELATED -s $PLUTO_MY_CLIENT -o %%interface_gw -d $PLUTO_PEER_CLIENT -j ACCEPT + #Autoriser les connexions au fw pour les paquets provenant du RVP + /sbin/iptables -I INPUT -m state --state NEW -m policy --pol ipsec --proto esp --dir in -i %%interface_gw -s $PLUTO_PEER_CLIENT -j ACCEPT + /sbin/iptables -I INPUT -m state --state ESTABLISHED,RELATED -m policy --pol ipsec --proto esp --dir in -i %%interface_gw -s $PLUTO_PEER_CLIENT -j ACCEPT + #Autoriser les paquets provenant du rvp et ceux a destination du rvp a traverser le FW + /sbin/iptables -I FORWARD -m state --state NEW -m policy --pol ipsec --proto esp --dir out -s $PLUTO_MY_CLIENT -o %%interface_gw -d $PLUTO_PEER_CLIENT -j ACCEPT + /sbin/iptables -I FORWARD -m state --state ESTABLISHED,RELATED -m policy --pol ipsec --proto esp --dir out -s $PLUTO_MY_CLIENT -o %%interface_gw -d $PLUTO_PEER_CLIENT -j ACCEPT + /sbin/iptables -I FORWARD -m state --state NEW -m policy --pol ipsec --proto esp --dir in -i %%interface_gw -s $PLUTO_PEER_CLIENT -d $PLUTO_MY_CLIENT -j ACCEPT + /sbin/iptables -I FORWARD -m state --state ESTABLISHED,RELATED -m policy --pol ipsec --proto esp --dir in -i %%interface_gw -s $PLUTO_PEER_CLIENT -d $PLUTO_MY_CLIENT -j ACCEPT + #Autoriser le FW a acceder au RVP + /sbin/iptables -I OUTPUT -m state --state NEW -m policy --pol ipsec --proto esp --dir out -o %%interface_gw -d $PLUTO_PEER_CLIENT -j ACCEPT + /sbin/iptables -I OUTPUT -m state --state ESTABLISHED,RELATED -m policy --pol ipsec --proto esp --dir out -o %%interface_gw -d $PLUTO_PEER_CLIENT -j ACCEPT + %if %%mode_conteneur_actif == "oui" + # Si mode conteneur, on translate le réseau des conteneurs dans les tunnels du réseau de l'interface 1 + for ip in $(hostname -I) + do + ip addr show %%getVar('nom_zone_eth1', 'no_eth1')|grep -q $(echo $ip |sed "s/\./\\\./g") + ret=$? + if [ $ret -eq 0 ] + then + CONTAINER_SOURCE_IP=$ip + break; + fi + done + /sbin/iptables -I POSTROUTING -t nat -s 192.0.2.0/24 -d $PLUTO_PEER_CLIENT -o eth0 -j SNAT --to-source $CONTAINER_SOURCE_IP + /sbin/iptables -I FORWARD -s 192.0.2.0/24 -d $PLUTO_PEER_CLIENT -i br0 -o eth0 -j ACCEPT + %end if + # If you are doing a custom version, firewall commands go here. + %if %%sw_install_vpn_route == "non" + uproute + %end if + + ;; + +down-client:) + # If you are doing a custom version, firewall commands go here. + ## + /sbin/iptables -t nat -D POSTROUTING -m state --state NEW -s $PLUTO_MY_CLIENT -o %%interface_gw -d $PLUTO_PEER_CLIENT -j ACCEPT + /sbin/iptables -t nat -D POSTROUTING -m state --state ESTABLISHED,RELATED -s $PLUTO_MY_CLIENT -o %%interface_gw -d $PLUTO_PEER_CLIENT -j ACCEPT + ## + /sbin/iptables -D INPUT -m state --state NEW -m policy --pol ipsec --proto esp --dir in -i %%interface_gw -s $PLUTO_PEER_CLIENT -j ACCEPT + /sbin/iptables -D INPUT -m state --state ESTABLISHED,RELATED -m policy --pol ipsec --proto esp --dir in -i %%interface_gw -s $PLUTO_PEER_CLIENT -j ACCEPT + ## + /sbin/iptables -D FORWARD -m state --state NEW -m policy --pol ipsec --proto esp --dir out -s $PLUTO_MY_CLIENT -o %%interface_gw -d $PLUTO_PEER_CLIENT -j ACCEPT + /sbin/iptables -D FORWARD -m state --state ESTABLISHED,RELATED -m policy --pol ipsec --proto esp --dir out -s $PLUTO_MY_CLIENT -o %%interface_gw -d $PLUTO_PEER_CLIENT -j ACCEPT + /sbin/iptables -D FORWARD -m state --state NEW -m policy --pol ipsec --proto esp --dir in -i %%interface_gw -s $PLUTO_PEER_CLIENT -d $PLUTO_MY_CLIENT -j ACCEPT + /sbin/iptables -D FORWARD -m state --state ESTABLISHED,RELATED -m policy --pol ipsec --proto esp --dir in -i %%interface_gw -s $PLUTO_PEER_CLIENT -d $PLUTO_MY_CLIENT -j ACCEPT + ## + /sbin/iptables -D OUTPUT -m state --state NEW -m policy --pol ipsec --proto esp --dir out -o %%interface_gw -d $PLUTO_PEER_CLIENT -j ACCEPT + /sbin/iptables -D OUTPUT -m state --state ESTABLISHED,RELATED -m policy --pol ipsec --proto esp --dir out -o %%interface_gw -d $PLUTO_PEER_CLIENT -j ACCEPT + %if %%mode_conteneur_actif == "oui" + # Si mode conteneur, on supprime la tranlation du réseau des conteneurs dans les tunnels du réseau ide l'interface 1 + for ip in $(hostname -I) + do + ip addr show %%getVar('nom_zone_eth1', 'no_eth1')|grep -q $(echo $ip |sed "s/\./\\\./g") + ret=$? + if [ $ret -eq 0 ] + then + CONTAINER_SOURCE_IP=$ip + break; + fi + done + /sbin/iptables -D POSTROUTING -t nat -s 192.0.2.0/24 -d $PLUTO_PEER_CLIENT -o eth0 -j SNAT --to-source $CONTAINER_SOURCE_IP + /sbin/iptables -D FORWARD -s 192.0.2.0/24 -d $PLUTO_PEER_CLIENT -i br0 -o eth0 -j ACCEPT + %end if + %if %%sw_install_vpn_route == "non" + downroute + %end if + + ;; + # connection to my client subnet going down +up-host:iptables) + # connection to me, with (left/right)firewall=yes, coming up + # This is used only by the default updown script, not by your custom + # ones, so do not mess with it; see CAUTION comment up at top. + iptables -I INPUT 1 -i $PLUTO_INTERFACE -p $PLUTO_MY_PROTOCOL \ + -s $PLUTO_PEER_CLIENT $S_PEER_PORT \ + -d $PLUTO_ME $D_MY_PORT $IPSEC_POLICY_IN -j ACCEPT + iptables -I OUTPUT 1 -o $PLUTO_INTERFACE -p $PLUTO_PEER_PROTOCOL \ + -s $PLUTO_ME $S_MY_PORT $IPSEC_POLICY_OUT \ + -d $PLUTO_PEER_CLIENT $D_PEER_PORT -j ACCEPT + # + # log IPsec host connection setup + if [ $VPN_LOGGING ] + then + if [ "$PLUTO_PEER_CLIENT" == "$PLUTO_PEER/32" ] + then + logger -t $TAG -p $FAC_PRIO \ + "+ `echo -e $PLUTO_PEER_ID` $PLUTO_PEER -- $PLUTO_ME" + else + logger -t $TAG -p $FAC_PRIO \ + "+ `echo -e $PLUTO_PEER_ID` $PLUTO_PEER_CLIENT == $PLUTO_PEER -- $PLUTO_ME" + fi + fi + ;; +down-host:iptables) + # connection to me, with (left/right)firewall=yes, going down + # This is used only by the default updown script, not by your custom + # ones, so do not mess with it; see CAUTION comment up at top. + iptables -D INPUT -i $PLUTO_INTERFACE -p $PLUTO_MY_PROTOCOL \ + -s $PLUTO_PEER_CLIENT $S_PEER_PORT \ + -d $PLUTO_ME $D_MY_PORT $IPSEC_POLICY_IN -j ACCEPT + iptables -D OUTPUT -o $PLUTO_INTERFACE -p $PLUTO_PEER_PROTOCOL \ + -s $PLUTO_ME $S_MY_PORT $IPSEC_POLICY_OUT \ + -d $PLUTO_PEER_CLIENT $D_PEER_PORT -j ACCEPT + # + # log IPsec host connection teardown + if [ $VPN_LOGGING ] + then + if [ "$PLUTO_PEER_CLIENT" == "$PLUTO_PEER/32" ] + then + logger -t $TAG -p $FAC_PRIO -- \ + "- `echo -e $PLUTO_PEER_ID` $PLUTO_PEER -- $PLUTO_ME" + else + logger -t $TAG -p $FAC_PRIO -- \ + "- `echo -e $PLUTO_PEER_ID` $PLUTO_PEER_CLIENT == $PLUTO_PEER -- $PLUTO_ME" + fi + fi + ;; +up-client:iptables) + # connection to client subnet, with (left/right)firewall=yes, coming up + # This is used only by the default updown script, not by your custom + # ones, so do not mess with it; see CAUTION comment up at top. + if [ "$PLUTO_PEER_CLIENT" != "$PLUTO_MY_SOURCEIP/32" ] + then + iptables -I FORWARD 1 -o $PLUTO_INTERFACE -p $PLUTO_PEER_PROTOCOL \ + -s $PLUTO_MY_CLIENT $S_MY_PORT \ + -d $PLUTO_PEER_CLIENT $D_PEER_PORT \ + $IPSEC_POLICY_OUT -j ACCEPT + iptables -I FORWARD 1 -i $PLUTO_INTERFACE -p $PLUTO_MY_PROTOCOL \ + -s $PLUTO_PEER_CLIENT $S_PEER_PORT \ + -d $PLUTO_MY_CLIENT $D_MY_PORT \ + $IPSEC_POLICY_IN -j ACCEPT + fi + # + # a virtual IP requires an INPUT and OUTPUT rule on the host + # or sometimes host access via the internal IP is needed + if [ -n "$PLUTO_MY_SOURCEIP" -o -n "$PLUTO_HOST_ACCESS" ] + then + iptables -I INPUT 1 -i $PLUTO_INTERFACE -p $PLUTO_MY_PROTOCOL \ + -s $PLUTO_PEER_CLIENT $S_PEER_PORT \ + -d $PLUTO_MY_CLIENT $D_MY_PORT \ + $IPSEC_POLICY_IN -j ACCEPT + iptables -I OUTPUT 1 -o $PLUTO_INTERFACE -p $PLUTO_PEER_PROTOCOL \ + -s $PLUTO_MY_CLIENT $S_MY_PORT \ + -d $PLUTO_PEER_CLIENT $D_PEER_PORT \ + $IPSEC_POLICY_OUT -j ACCEPT + fi + # + # log IPsec client connection setup + if [ $VPN_LOGGING ] + then + if [ "$PLUTO_PEER_CLIENT" == "$PLUTO_PEER/32" ] + then + logger -t $TAG -p $FAC_PRIO \ + "+ `echo -e $PLUTO_PEER_ID` $PLUTO_PEER -- $PLUTO_ME == $PLUTO_MY_CLIENT" + else + logger -t $TAG -p $FAC_PRIO \ + "+ `echo -e $PLUTO_PEER_ID` $PLUTO_PEER_CLIENT == $PLUTO_PEER -- $PLUTO_ME == $PLUTO_MY_CLIENT" + fi + fi + ;; +down-client:iptables) + # connection to client subnet, with (left/right)firewall=yes, going down + # This is used only by the default updown script, not by your custom + # ones, so do not mess with it; see CAUTION comment up at top. + if [ "$PLUTO_PEER_CLIENT" != "$PLUTO_MY_SOURCEIP/32" ] + then + iptables -D FORWARD -o $PLUTO_INTERFACE -p $PLUTO_PEER_PROTOCOL \ + -s $PLUTO_MY_CLIENT $S_MY_PORT \ + -d $PLUTO_PEER_CLIENT $D_PEER_PORT \ + $IPSEC_POLICY_OUT -j ACCEPT + iptables -D FORWARD -i $PLUTO_INTERFACE -p $PLUTO_MY_PROTOCOL \ + -s $PLUTO_PEER_CLIENT $S_PEER_PORT \ + -d $PLUTO_MY_CLIENT $D_MY_PORT \ + $IPSEC_POLICY_IN -j ACCEPT + fi + # + # a virtual IP requires an INPUT and OUTPUT rule on the host + # or sometimes host access via the internal IP is needed + if [ -n "$PLUTO_MY_SOURCEIP" -o -n "$PLUTO_HOST_ACCESS" ] + then + iptables -D INPUT -i $PLUTO_INTERFACE -p $PLUTO_MY_PROTOCOL \ + -s $PLUTO_PEER_CLIENT $S_PEER_PORT \ + -d $PLUTO_MY_CLIENT $D_MY_PORT \ + $IPSEC_POLICY_IN -j ACCEPT + iptables -D OUTPUT -o $PLUTO_INTERFACE -p $PLUTO_PEER_PROTOCOL \ + -s $PLUTO_MY_CLIENT $S_MY_PORT \ + -d $PLUTO_PEER_CLIENT $D_PEER_PORT \ + $IPSEC_POLICY_OUT -j ACCEPT + fi + # + # log IPsec client connection teardown + if [ $VPN_LOGGING ] + then + if [ "$PLUTO_PEER_CLIENT" == "$PLUTO_PEER/32" ] + then + logger -t $TAG -p $FAC_PRIO -- \ + "- `echo -e $PLUTO_PEER_ID` $PLUTO_PEER -- $PLUTO_ME == $PLUTO_MY_CLIENT" + else + logger -t $TAG -p $FAC_PRIO -- \ + "- `echo -e $PLUTO_PEER_ID` $PLUTO_PEER_CLIENT == $PLUTO_PEER -- $PLUTO_ME == $PLUTO_MY_CLIENT" + fi + fi + ;; +# +# IPv6 +# +prepare-host-v6:*|prepare-client-v6:*) + ;; +route-host-v6:*|route-client-v6:*) + # connection to me or my client subnet being routed + #uproute_v6 + ;; +unroute-host-v6:*|unroute-client-v6:*) + # connection to me or my client subnet being unrouted + #downroute_v6 + ;; +up-host-v6:*) + # connection to me coming up + # If you are doing a custom version, firewall commands go here. + ;; +down-host-v6:*) + # connection to me going down + # If you are doing a custom version, firewall commands go here. + ;; +up-client-v6:) + # connection to my client subnet coming up + # If you are doing a custom version, firewall commands go here. + ;; +down-client-v6:) + # connection to my client subnet going down + # If you are doing a custom version, firewall commands go here. + ;; +*) echo "$0: unknown verb \`$PLUTO_VERB' or parameter \`$1'" >&2 + exit 1 + ;; +esac + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/templates/kernel-netlink.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/templates/kernel-netlink.conf new file mode 100644 index 0000000000000000000000000000000000000000..06fff6aca2daf622c01826f6548eadf08b7336aa --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/templates/kernel-netlink.conf @@ -0,0 +1,53 @@ +kernel-netlink { + + # Buffer size for received Netlink messages. + # buflen = <min(PAGE_SIZE, 8192)> + + # Firewall mark to set on the routing rule that directs traffic to our + # routing table. + # fwmark = + + # Whether to ignore errors potentially resulting from a retransmission. + # ignore_retransmit_errors = no + + # Whether to load the plugin. Can also be an integer to increase the + # priority of this plugin. + load = yes + + # MSS to set on installed routes, 0 to disable. + mss = %%sw_mss + + # MTU to set on installed routes, 0 to disable. + mtu = %%sw_mtu + + # Whether to perform concurrent Netlink ROUTE queries on a single socket. + # parallel_route = no + + # Whether to perform concurrent Netlink XFRM queries on a single socket. + # parallel_xfrm = no + + # Whether to always use XFRM_MSG_UPDPOLICY to install policies. + # policy_update = no + + # Whether to use port or socket based IKE XFRM bypass policies. + # port_bypass = no + + # Number of Netlink message retransmissions to send on timeout. + # retries = 0 + + # Whether to trigger roam events when interfaces, addresses or routes + # change. + # roam_events = yes + + # Whether to set protocol and ports in the selector installed on transport + # mode IPsec SAs in the kernel. + # set_proto_port_transport_sa = no + + # Netlink message retransmission timeout, 0 to disable retransmissions. + # timeout = 0 + + # Lifetime of XFRM acquire state in kernel. + # xfrm_acq_expires = 165 + +} + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/templates/revocation.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/templates/revocation.conf new file mode 100644 index 0000000000000000000000000000000000000000..17362f3c9a395ec2588cc166af14b80645abbe35 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/templates/revocation.conf @@ -0,0 +1,12 @@ +revocation { + + # Whether to load the plugin. Can also be an integer to increase the + # priority of this plugin. + %if %%sw_crl_check == 'oui' + load = yes + %else + load = no + %end if + +} + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/templates/starter.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/templates/starter.conf new file mode 100644 index 0000000000000000000000000000000000000000..5cdcbfdd2abe0304047ee7ae31a7085b098e8915 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/templates/starter.conf @@ -0,0 +1,10 @@ +starter { + + # Location of the ipsec.conf file + # config_file = ${sysconfdir}/ipsec.conf + + # Disable charon plugin load option warning. + # load_warning = yes + +} + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/templates/strongswan.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/templates/strongswan.conf new file mode 100644 index 0000000000000000000000000000000000000000..d9067286170335142a8a5990dab028cee460f4f9 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/templates/strongswan.conf @@ -0,0 +1,14 @@ +# strongswan.conf - strongSwan configuration file +# +# Refer to the strongswan.conf(5) manpage for details +# +# Configuration changes should be made in the included files + +charon { + load_modular = yes + plugins { + include strongswan.d/charon/*.conf + } +} + +include strongswan.d/*.conf diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/templates/test-rvp_more_ip b/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/templates/test-rvp_more_ip new file mode 100644 index 0000000000000000000000000000000000000000..d7bb99737cd45cc3b1d8840bca8dc2fc7c1e2320 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-vpn/templates/test-rvp_more_ip @@ -0,0 +1,7 @@ +%if %%is_defined('ip_test_rvp') and %%ip_test_rvp != [] +%for %%ip in %%ip_test_rvp +#fping %%ip +%end for +%else +exit 0 +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/dictionaries/00_eole-web_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/dictionaries/00_eole-web_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..d555dfb2d801b0639eaf04283f42c15ec018ca20 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/dictionaries/00_eole-web_packages.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>eole-sso-client</package> + <package>curl</package> + <package>creole</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/dictionaries/20_web.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/dictionaries/20_web.xml new file mode 100644 index 0000000000000000000000000000000000000000..7a14bd76ed91337376690eefa5c1179f5107935d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/dictionaries/20_web.xml @@ -0,0 +1,217 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <containers> + <all> + <host hostlist='web' name='web_url' ip='adresse_ip_br0' instance_mode='when_container' + comment='Serveur web sur l’IP eth0' /> + </all> + + <container name='web' id='15'> + <package>eole-web-pkg</package> + <service servicelist='apache'>apache2</service> + <!-- si eole-reverseproxy c'est eole-reverseproxy qui à raison --> + <service_access service='apache'> + <port>80</port> + <port>443</port> + </service_access> + <!-- gestion des sites apache attention pas de 000-default comme pour a2ensite --> + <service method='apache' servicelist='apache'>default</service> + <service method='apache' servicelist='apache'>Vhost</service> + <service method='apache' servicelist='apache'>Vhost-ssl</service> + <service method='apache' servicelist='apache'>eole</service> + <!-- fichiers de configuration apache --> + <file name='/etc/apache2/ports.conf'/> + <file filelist='apache' name='/etc/apache2/apache2.conf'/> + <file filelist='apache' name='/etc/apache2/conf-available/security.conf' source='apache-security'/> + <file name='/etc/apache2/sites-available/default' source='apache-default'/> + <file name='/etc/apache2/sites-available/eole' source='apache-eole.conf'/> + <file name='/etc/apache2/sites-available/Vhost' source='Vhost.conf'/> + <file name='/etc/apache2/sites-available/Vhost-ssl' source='Vhost-ssl.conf'/> + <file filelist='apache' name='/etc/php/7.2/apache2/php.ini' del_comment=';'/> + <file filelist='apache' name='/etc/php/7.2/mods-available/eole.ini' source='php-eole.ini'/> + <file filelist='apache' name='/etc/apache2/mods-available/mpm_prefork.conf'/> + <!-- apache derrière un reverseproxy--> + <file filelist='remoteip' name='/etc/apache2/mods-available/remoteip.conf'/> + <file filelist='ssoclient' name='/usr/share/php/configCAS/cas.inc.php' source='cas.inc.php.tmpl' mkdir='True'/> + <file filelist='ssoclient' name='/usr/share/php/CAS/eoleCASConfig.php' source='eoleCASConfig.php.tmpl' mkdir='True'/> + </container> + </containers> + + <variables> + <family name='général'> + <variable name='envole_update_mirrors' type='domain' description='Serveur de mise à jour Envole' multi='True' mandatory='True' mode='expert' /> + </family> + <family name='services'> + <variable name='activer_apache' type='oui/non' description="Activer le serveur web Apache" > + <value>oui</value> + </variable> + </family> + <family name='applications web' icon='php-alt'> + <variable name='envole_version' type='string' description="Numéro de version majeure d’Envole" hidden="True" /> + <variable name='web_url' type='domain_strict' description="Nom de domaine des applications web (sans http://)" mandatory='True' auto_freeze='True'/> + <!-- pré-déclaration pour ordonnancement des variables --> + <variable name='force_envole' type='oui/non' description='Utiliser Envole comme application par défaut en frontal' hidden='True'> + <value>non</value> + </variable> + <variable name='web_redirection' type='filename' description='Application web par défaut (redirection)' mandatory='True' /> + <variable name='activer_web_behind_revproxy' type='oui/non' description="Le serveur web est derrière un reverse proxy"> + <value>non</value> + </variable> + <variable name='web_behind_revproxy_ip' type='ip' description="Adresse IP du serveur reverse proxy" mandatory='True'/> + <variable name='activer_web_valider_ca' type='oui/non' mode='expert' description="Activer la vérification de l'autorité de certification pour les applications web cassifiées"> + <value>non</value> + </variable> + <variable name='apache_cert' type='filename' mode='expert' description="Certificat utilisé par apache"/> + </family> + <family name='apache' mode='expert' icon='apache'> + <variable name='apache_plus' type='oui/non' description="Déclarer des applications web supplémentaires" > + <value>non</value> + </variable> + <variable name='apache_dir' type='filename' description="Chemin complet l'application (exemple : /var/www/html/appli)" multi='True' mandatory='True'/> + <variable name='apache_alias' type='filename' description="Alias de l'application (exemple : /appli)" mandatory='True'/> + <variable name='apache_directory_index' type='filename' description="Fichier à rechercher lorsqu'un client envoie une requête pour l'index d'un répertoire"> + <value>index.php</value> + </variable> + + <variable name='apache_lister_repertoires' type='oui/non' description="Permettre de lister les répertoires et leur contenu"> + <value>non</value> + </variable> + <variable name='apache_timeout' type='number' description="Temps en secondes pendant lequel le serveur va attendre des entrées/sorties avant de considérer qu'une requête a échoué"> + <value>300</value> + </variable> + <variable name='apache_keepalive' type='string' description="Autoriser les connexions persistantes"> + <value>On</value> + </variable> + + <variable name='mpm_startservers' type='number' description="Nombre de processus enfants du serveur créés au démarrage"> + <value>5</value> + </variable> + <variable name='mpm_minspareservers' type='number' description="Nombre minimum de processus serveurs enfants inactifs"> + <value>5</value> + </variable> + <variable name='mpm_maxspareservers' type='number' description="Nombre maximum de processus serveurs enfants inactifs"> + <value>10</value> + </variable> + <variable name='mpm_maxrequestworkers' type='number' description="Nombre maximum de connexions pouvant être traitées simultanément"> + <value>150</value> + </variable> + <variable name='mpm_maxconnectionsperchild' type='number' description="Nombre maximum de connexions qu'un processus enfant va traiter au cours de son fonctionnement"> + <value>0</value> + </variable> + + <variable name='php_post_max_size' type='number' description="Taille maximale des données reçues par la méthode POST (en Mo)"> + <value>32</value> + </variable> + <variable name='php_upload_max_filesize' type='number' description="Taille maximale d'un fichier à charger (en Mo)"> + <value>16</value> + </variable> + <variable name='php_max_execution_time' type='number' description="Temps maximal d'exécution d'un script (en secondes)"> + <value>30</value> + </variable> + <variable name='php_max_input_time' type='number' description="Durée maximale pour analyser les données d'entrée (en secondes)"> + <value>60</value> + </variable> + <variable name='php_memory_limit' type='number' description="Taille mémoire maximale qu'un script est autorisé à allouer (en Mo)"> + <value>128</value> + </variable> + <variable name='php_display_errors' type='string' description="Affichage des erreurs à l'écran"> + <value>Off</value> + </variable> + <variable name='php_session_gc_maxlifetime' type='number' description="Durée de vie des données sur le serveur (en secondes)"> + <value>3600</value> + </variable> + <variable name='php_session_entropy_length' type='number' mandatory='True' description="Nombre d'octets à lire dans le fichier utilisé comme source additionnelle d'entropie"> + <value>16</value> + </variable> + <variable name='php_browscap' type='oui/non' description="Activer la directive de configuration browscap" > + <value>non</value> + </variable> + </family> + <separators> + <separator name='apache_plus'>Applications supplementaires</separator> + <separator name='apache_lister_repertoires'>Configuration Apache</separator> + <separator name='php_post_max_size'>Configuration PHP</separator> + </separators> + </variables> + + <constraints> + + <auto name='get_version' target='envole_version'> + <param>ENVOLE_VERSION</param> + </auto> + + <fill name='auto_copy_val' target='envole_update_mirrors'> + <param type='eole'>serveur_maj</param> + </fill> + + <fill name='calc_webredirection' target='web_redirection'> + <param type='eole' name="roundcube" optional="True" hidden="False">activer_roundcube</param> + <param type='eole' name="force_envole" optional="True" hidden="False">force_envole</param> + </fill> + + <check name='valid_enum' target='apache_keepalive'> + <param>['On','Off']</param> + </check> + <check name='valid_enum' target='php_display_errors'> + <param>['On','Off']</param> + </check> + <check name='valid_regexp' target='web_redirection'> + <param>^/</param> + <param name='err_msg'>Les alias doivent débuter par un "/"</param> + </check> + <check name='valid_regexp' target='apache_alias'> + <param>^/</param> + <param name='err_msg'>Les alias doivent débuter par un "/"</param> + </check> + <check name='valid_enum' target='apache_directory_index'> + <param>['index.php', 'index.html']</param> + <param name="checkval">False</param> + </check> + + <group master='apache_dir'> + <slave>apache_alias</slave> + <slave>apache_directory_index</slave> + </group> + + <condition name='disabled_if_in' source='activer_web_behind_revproxy'> + <param>non</param> + <target type="filelist">remoteip</target> + <target type='variable'>web_behind_revproxy_ip</target> + </condition> + <condition name='disabled_if_in' source='activer_apache'> + <param>non</param> + <target type='servicelist'>apache</target> + <target type='filelist'>apache</target> + <target type='family'>apache</target> + <target type='family'>applications web</target> + <target type='hostlist'>web</target> + </condition> + <condition name='disabled_if_in' source='apache_plus'> + <param>non</param> + <target type='variable'>apache_dir</target> + <target type='variable'>apache_alias</target> + </condition> + <fill name='calc_val' target='apache_cert'> + <param type='eole' name='valeur'>server_cert</param> + </fill> + + </constraints> + + <help> + <family name='applications web'>Paramètrage et gestion des applications web</family> + <family name='apache'>Paramètrage avancé du serveur web Apache</family> + <variable name='activer_apache'>Apache un serveur HTTP</variable> + <variable name='web_redirection'>Application proposée par défaut lors de l'accès du serveur web</variable> + <variable name='web_url'>Nom de domaine de votre établissement ex : etablissement.ac-acad.fr</variable> + <variable name='mpm_maxrequestworkers'>Si la limite MaxRequestWorkers est atteinte, toute tentative de connexion sera normalement mise dans une file d'attente</variable> + <variable name='mpm_maxspareservers'>S'il y a plus de MaxSpareServers processus inactifs, le processus parent arrêtera les processus excédentaires</variable> + <variable name='mpm_maxconnectionsperchild'>Si MaxConnectionsPerChild est définie à 0, il n'y a plus aucune limite sur le nombre de connexions que le processus pourra traiter</variable> + <variable name='php_session_entropy_length'>Spécifie le nombre d'octets qui seront lus dans le fichier utilisé comme source additionnelle d'entropie pour la création de l'identifiant de session. Mettre à 0 pour le désactiver.</variable> + <variable name='php_browscap'>La directive de configuration browscap permet d'obtenir plus d'information sur les capacités du navigateur client grâce à la fonction get_browser()</variable> + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/dictionaries/29_eoleapps.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/dictionaries/29_eoleapps.xml new file mode 100644 index 0000000000000000000000000000000000000000..3682d4cf673a76581c2c7768dd77fb446c82b76d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/dictionaries/29_eoleapps.xml @@ -0,0 +1,43 @@ +<?xml version='1.0' encoding='utf-8'?> + +<creole> + + <containers> + <container name="web"> + <service servicelist="eoleapps">eoleapps</service> + <service servicelist="eoleapps" method="apache">eoleapps-apache</service> + <file filelist="eoleapps" name="/etc/apache2/sites-available/eoleapps-apache" source="apache-eoleapps.conf" /> + <file filelist="eoleapps" name="/etc/eole/flask/eoleapps.conf" /> + </container> + </containers> + + <variables> + + <family name='eoleflask'> + <variable name='activer_eoleapps' type='oui/non' description="Activer le service eoleapps"> + <value>non</value> + </variable> + </family> + + </variables> + + <constraints> + <condition name="disabled_if_in" source="activer_apache"> + <param>non</param> + <target type='variable'>activer_eoleapps</target> + </condition> + + <condition name="disabled_if_in" source="activer_eoleapps"> + <param>non</param> + <target type='servicelist'>eoleapps</target> + <target type='filelist'>eoleapps</target> + </condition> + </constraints> + + <help> + <variable name="activer_eoleapps">Serveur d'applications flask EOLE</variable> + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/files/etc/logrotate.d/eole-web b/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/files/etc/logrotate.d/eole-web new file mode 100644 index 0000000000000000000000000000000000000000..ec467cc998dfad804c6c56d44cc0249b61eaa516 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/files/etc/logrotate.d/eole-web @@ -0,0 +1,10 @@ +/var/log/rsyslog/local/apache2/*.log { + rotate 10 + weekly + missingok + compress + postrotate + service rsyslog rotate >/dev/null + endscript +} + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/files/usr/share/eole/certs/01_apache.gen_cert b/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/files/usr/share/eole/certs/01_apache.gen_cert new file mode 100644 index 0000000000000000000000000000000000000000..578bae3ef359bb816d7f22168dd97bf71caa8bd5 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/files/usr/share/eole/certs/01_apache.gen_cert @@ -0,0 +1,10 @@ +if client.get_creole('activer_apache') == 'oui': + apache_cert = client.get_creole('apache_cert') + if not os.path.isfile(apache_cert): + gen_certif(certfile=apache_cert, keyfile=key_file) + + chain = get_intermediate_certs(apache_cert) + if chain != []: + apache_ca_chain = splitext(apache_cert)[0] + '_ca-chain.crt' + concat_fic(apache_ca_chain, chain, True) + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/files/usr/share/eole/diagnose/65-web b/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/files/usr/share/eole/diagnose/65-web new file mode 100644 index 0000000000000000000000000000000000000000..960e51ff55a555801ec5a89651849cf84cd46857 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/files/usr/share/eole/diagnose/65-web @@ -0,0 +1,14 @@ +#!/bin/bash + +if [ $(CreoleGet activer_apache) != "non" ];then + . /usr/lib/eole/diagnose.sh + EchoGras "*** Services Web" + if [ $(CreoleGet container_ip_web) = '127.0.0.1' ];then + TestHTTPPage Web $(CreoleGet adresse_ip_eth0):80 + else + TestHTTPPage Web $(CreoleGet container_ip_web):80 + fi + echo +fi + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/files/usr/share/zephir/monitor/configs/services/23_http.srv b/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/files/usr/share/zephir/monitor/configs/services/23_http.srv new file mode 100644 index 0000000000000000000000000000000000000000..a76d7934ac6ae30fdd716ad6784670ab62c2fdd8 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/files/usr/share/zephir/monitor/configs/services/23_http.srv @@ -0,0 +1,14 @@ +# -*- coding: UTF-8 -*- +""" +Surveillance du service Apache2 +""" + +from zephir.monitor.agents.services import TCPServices +from zephir.monitor.agentmanager.config import ADRESSE_IP_SERVICE_WEB, ACTIVER_APACHE + +if ACTIVER_APACHE: + test = '%s:80' % ADRESSE_IP_SERVICE_WEB + data = {test : "Serveur Web (HTTP)"} + # /!\ l'agent de surveillance des services distants s'appelle déjà "web" /!\ + AGENTS.append(TCPServices('http', data, period=115, + description="Etat du serveur Web (HTTP)")) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/posttemplates/00-web b/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/posttemplates/00-web new file mode 100644 index 0000000000000000000000000000000000000000..fb88e56fb395a77ed4dd5683bf0fbf941ee0fc4e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/posttemplates/00-web @@ -0,0 +1,21 @@ +#!/bin/bash + +if [ "$(CreoleGet activer_apache)" = 'oui' ];then + # activation des modes PHP + CreoleRun "phpenmod eole" web + CreoleRun "phpenmod imap" web + + # gestion des modes apache + ENMOD="ssl rewrite authnz_ldap proxy headers proxy_http" + DISMOD="" + # gestion des cas particuliers (rpaf: #2570 changement vers remoteip: #19148) + if [ "$(CreoleGet activer_web_behind_revproxy)" = 'oui' ];then + ENMOD="$ENMOD remoteip" + else + DISMOD="$DISMOD remoteip" + fi + CreoleRun "a2enmod $ENMOD >/dev/null" web + [ ! -z $DISMOD ] && CreoleRun "a2dismod $DISMOD >/dev/null" web +fi + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/pretemplates/00-web b/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/pretemplates/00-web new file mode 100644 index 0000000000000000000000000000000000000000..0712c5123449b6ced1611408e99a618d7bb7941a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/pretemplates/00-web @@ -0,0 +1,15 @@ +#!/bin/bash + +# désactivation du shell pour www-data +container_path_web=$(CreoleGet container_path_web) +if [ -n "$container_path_web" ];then + CHROOT="chroot $container_path_web" +else + CHROOT="" +fi +TUSER="www-data" +NEWSHELL="/bin/false" +OLDSHELL="`$CHROOT getent passwd $TUSER|awk -F: '{ print $7 }'`" +[ ! "$OLDSHELL" = "$NEWSHELL" ] && $CHROOT usermod -s $NEWSHELL $TUSER + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..6a81483b7964f7b5862f10b9fa3c8c4e11956b11 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/service.yml @@ -0,0 +1,60 @@ +format: '0.1' +name: eole-web +version: |- + 2.7.0-4 +description: |- + Templates et dictionnaires pour les services web + Configuration du serveur web Apache2 + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: + - eole-mysql +packages: + - eole-sso-client + - curl + - creole +dictionaries: + - 20_web.xml + - 29_eoleapps.xml +extra_dictionaries: {} +templates: + - Vhost-ssl.conf + - Vhost.conf + - apache-default + - apache-eole.conf + - apache-eoleapps.conf + - apache-security + - apache2.conf + - eoleapps.conf + - mpm_prefork.conf + - php-eole.ini + - php.ini + - ports.conf + - remoteip.conf +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: + - 00-web +posttemplates: + - 00-web +files: + /etc/logrotate.d/eole-web: + owner: root + group: root + mode: '0644' + /usr/share/eole/certs/01_apache.gen_cert: + owner: root + group: root + mode: '0644' + /usr/share/eole/diagnose/65-web: + owner: root + group: root + mode: '0755' + /usr/share/zephir/monitor/configs/services/23_http.srv: + owner: root + group: root + mode: '0644' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/templates/Vhost-ssl.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/templates/Vhost-ssl.conf new file mode 100644 index 0000000000000000000000000000000000000000..d0b46567489abc661c214864e2fab0ea85fe7a6a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/templates/Vhost-ssl.conf @@ -0,0 +1,35 @@ +%if %%activer_apache == 'oui' + %if %%container_ip_web != '127.0.0.1' +<VirtualHost %%container_ip_web:443> + %else +<VirtualHost %%adresse_ip_eth0:443> + %end if +%import os +%from creole.cert import get_intermediate_certs +%set %%apache_ca_chain = %%os.path.splitext(%%apache_cert)[0] + "_ca-chain.crt" + DocumentRoot /var/www/html + ErrorLog /var/log/apache2/ssl_error.log + %if %%is_defined('web_behind_revproxy_ip') + CustomLog /var/log/apache2/ssl_access.log with_reverse_proxy + %else + CustomLog /var/log/apache2/ssl_access.log common + %end if + SSLEngine on + SSLCertificateFile %%apache_cert + SSLCertificateKeyFile %%server_key + SSLProtocol all -SSLv3 -SSLv2 +%if %%len(%%get_intermediate_certs(%%apache_cert)) > 0 + SSLCertificateChainFile %%apache_ca_chain +%end if + %if not %%is_ip(%%web_url) + ServerName %%web_url + %else + ServerName %%nom_machine + %end if + RewriteEngine On + %if %%web_redirection != '/' + RewriteRule ^/$ %%web_redirection [R=permanent] + %end if + +</VirtualHost> +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/templates/Vhost.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/templates/Vhost.conf new file mode 100644 index 0000000000000000000000000000000000000000..3d38fc677c2e807e16ee39ef9f6c641d711ce60a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/templates/Vhost.conf @@ -0,0 +1,21 @@ +%if %%activer_apache == 'oui' + %if %%container_ip_web != '127.0.0.1' +<VirtualHost %%container_ip_web:80> + %else +<VirtualHost %%adresse_ip_eth0:80> + %end if + DocumentRoot /var/www/html + ServerName %%nom_domaine_machine + %if %%is_defined('web_behind_revproxy_ip') + CustomLog /var/log/apache2/access.log with_reverse_proxy + %else + CustomLog /var/log/apache2/access.log common + %end if + ErrorLog /var/log/apache2/error.log + RewriteEngine On + %if %%web_redirection != '/' + RewriteRule ^/$ %%web_redirection [R=permanent] + %end if + +</VirtualHost> +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/templates/apache-default b/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/templates/apache-default new file mode 100644 index 0000000000000000000000000000000000000000..3550d928f7134ca76827a4fa682ce0552c14bed2 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/templates/apache-default @@ -0,0 +1,16 @@ +#EOLE : autorise, par défaut les deny/allow dans les fichiers .htaccess +<Directory "/"> + AllowOverride Limit +</Directory> + +#interdit l'acces des fichiers finissant par ~ +<Files ~ "~$"> + Order allow,deny + Deny from all +</Files> + +%if %%getVar('apache_lister_repertoires', 'non') == 'non' +#Pas de liste des repertoires +Options -Indexes +%end if + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/templates/apache-eole.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/templates/apache-eole.conf new file mode 100644 index 0000000000000000000000000000000000000000..f9510e4a3d7d348f98ec667ec07e8c531da90ca1 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/templates/apache-eole.conf @@ -0,0 +1,21 @@ +######################################## +## Configuration des applications Web ## +## supplémentaires sur un module EOLE ## +######################################## +%if %%activer_apache == 'oui' and %%apache_plus == 'oui' + %for %%ap_dir in %%apache_dir +Alias %%ap_dir.apache_alias %%ap_dir +<Directory "%%ap_dir"> + DirectoryIndex %%ap_dir.apache_directory_index +%if %%apache_lister_repertoires == 'oui' + Options Indexes FollowSymLinks +%else + Options FollowSymLinks +%end if + Require all granted +</Directory> + + %end for +%else +# aucune application supplémentaire n'est configurée +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/templates/apache-eoleapps.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/templates/apache-eoleapps.conf new file mode 100644 index 0000000000000000000000000000000000000000..59a108e484fb8b6d3943596f403034bac852c830 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/templates/apache-eoleapps.conf @@ -0,0 +1,14 @@ +# Tells apache where .../static/... should go +AliasMatch /eoleapps/(.*/static/.*) /usr/share/eole/flask/$1 +# Proxy everything to gunicorn EXCEPT .../static +ProxyPassMatch /eoleapps/.*/static ! +ProxyPreserveHost On +<Location /eoleapps> + RewriteEngine On + RewriteCond %{HTTPS} off + RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] + ProxyPass http://%%container_ip_web:10000/eoleapps + ProxyPassReverse http://%%container_ip_web:10000/eoleapps + RequestHeader set X-Forwarded-Proto "https" + Require all granted +</Location> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/templates/apache-security b/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/templates/apache-security new file mode 100644 index 0000000000000000000000000000000000000000..6f04280b1136a91574c0daeb83f2773e170d3a2b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/templates/apache-security @@ -0,0 +1,74 @@ +# +# Disable access to the entire file system except for the directories that +# are explicitly allowed later. +# +# This currently breaks the configurations that come with some web application +# Debian packages. +# +#<Directory /> +# AllowOverride None +# Order Deny,Allow +# Deny from all +#</Directory> + + +# Changing the following options will not really affect the security of the +# server, but might make attacks slightly more difficult in some cases. + +# +# ServerTokens +# This directive configures what you return as the Server HTTP response +# Header. The default is 'Full' which sends information about the OS-Type +# and compiled in modules. +# Set to one of: Full | OS | Minimal | Minor | Major | Prod +# where Full conveys the most information, and Prod the least. +#ServerTokens Minimal +ServerTokens Prod +#ServerTokens Full + +# +# Optionally add a line containing the server version and virtual host +# name to server-generated pages (internal error documents, FTP directory +# listings, mod_status and mod_info output etc., but not CGI generated +# documents or custom error documents). +# Set to "EMail" to also include a mailto: link to the ServerAdmin. +# Set to one of: On | Off | EMail +ServerSignature Off +#ServerSignature On + +# +# Allow TRACE method +# +# Set to "extended" to also reflect the request body (only for testing and +# diagnostic purposes). +# +# Set to one of: On | Off | extended +TraceEnable Off +#TraceEnable On + +# +# Forbid access to version control directories +# +# If you use version control systems in your document root, you should +# probably deny access to their directories. For example, for subversion: +# +#<DirectoryMatch "/\.svn"> +# Require all denied +#</DirectoryMatch> + +# +# Setting this header will prevent MSIE from interpreting files as something +# else than declared by the content type in the HTTP headers. +# Requires mod_headers to be enabled. +# +#Header set X-Content-Type-Options: "nosniff" + +# +# Setting this header will prevent other sites from embedding pages from this +# site as frames. This defends against clickjacking attacks. +# Requires mod_headers to be enabled. +# +#Header set X-Frame-Options: "sameorigin" + + +# vim: syntax=apache ts=4 sw=4 sts=4 sr noet diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/templates/apache2.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/templates/apache2.conf new file mode 100644 index 0000000000000000000000000000000000000000..03f605fee692d426f77bdda3c7687fe1c0195e10 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/templates/apache2.conf @@ -0,0 +1,228 @@ +# This is the main Apache server configuration file. It contains the +# configuration directives that give the server its instructions. +# See http://httpd.apache.org/docs/2.4/ for detailed information about +# the directives and /usr/share/doc/apache2/README.Debian about Debian specific +# hints. +# +# +# Summary of how the Apache 2 configuration works in Debian: +# The Apache 2 web server configuration in Debian is quite different to +# upstream's suggested way to configure the web server. This is because Debian's +# default Apache2 installation attempts to make adding and removing modules, +# virtual hosts, and extra configuration directives as flexible as possible, in +# order to make automating the changes and administering the server as easy as +# possible. + +# It is split into several files forming the configuration hierarchy outlined +# below, all located in the /etc/apache2/ directory: +# +# /etc/apache2/ +# |-- apache2.conf +# | `-- ports.conf +# |-- mods-enabled +# | |-- *.load +# | `-- *.conf +# |-- conf-enabled +# | `-- *.conf +# `-- sites-enabled +# `-- *.conf +# +# +# * apache2.conf is the main configuration file (this file). It puts the pieces +# together by including all remaining configuration files when starting up the +# web server. +# +# * ports.conf is always included from the main configuration file. It is +# supposed to determine listening ports for incoming connections which can be +# customized anytime. +# +# * Configuration files in the mods-enabled/, conf-enabled/ and sites-enabled/ +# directories contain particular configuration snippets which manage modules, +# global configuration fragments, or virtual host configurations, +# respectively. +# +# They are activated by symlinking available configuration files from their +# respective *-available/ counterparts. These should be managed by using our +# helpers a2enmod/a2dismod, a2ensite/a2dissite and a2enconf/a2disconf. See +# their respective man pages for detailed information. +# +# * The binary is called apache2. Due to the use of environment variables, in +# the default configuration, apache2 needs to be started/stopped with +# service apache2 or apache2ctl. Calling /usr/bin/apache2 directly will not +# work with the default configuration. + + +# Global configuration +# + +# +# ServerRoot: The top of the directory tree under which the server's +# configuration, error, and log files are kept. +# +# NOTE! If you intend to place this on an NFS (or otherwise network) +# mounted filesystem then please read the Mutex documentation (available +# at <URL:http://httpd.apache.org/docs/2.4/mod/core.html#mutex>); +# you will save yourself a lot of trouble. +# +# Do NOT add a slash at the end of the directory path. +# +#ServerRoot "/etc/apache2" + +# +# The accept serialization lock file MUST BE STORED ON A LOCAL DISK. +# +Mutex file:${APACHE_LOCK_DIR} default + +# +# PidFile: The file in which the server should record its process +# identification number when it starts. +# This needs to be set in /etc/apache2/envvars +# +PidFile ${APACHE_PID_FILE} + +# +# Timeout: The number of seconds before receives and sends time out. +# +Timeout %%apache_timeout + +# +# KeepAlive: Whether or not to allow persistent connections (more than +# one request per connection). Set to "Off" to deactivate. +# +KeepAlive %%apache_keepalive + +# +# MaxKeepAliveRequests: The maximum number of requests to allow +# during a persistent connection. Set to 0 to allow an unlimited amount. +# We recommend you leave this number high, for maximum performance. +# +MaxKeepAliveRequests 100 + +# +# KeepAliveTimeout: Number of seconds to wait for the next request from the +# same client on the same connection. +# +KeepAliveTimeout 5 + + +# These need to be set in /etc/apache2/envvars +User ${APACHE_RUN_USER} +Group ${APACHE_RUN_GROUP} + +# +# HostnameLookups: Log the names of clients or just their IP addresses +# e.g., www.apache.org (on) or 204.62.129.132 (off). +# The default is off because it'd be overall better for the net if people +# had to knowingly turn this feature on, since enabling it means that +# each client request will result in AT LEAST one lookup request to the +# nameserver. +# +HostnameLookups Off + +# ErrorLog: The location of the error log file. +# If you do not specify an ErrorLog directive within a <VirtualHost> +# container, error messages relating to that virtual host will be +# logged here. If you *do* define an error logfile for a <VirtualHost> +# container, that host's errors will be logged there and not here. +# +#ErrorLog ${APACHE_LOG_DIR}/error.log +ErrorLog syslog + +# +# LogLevel: Control the severity of messages logged to the error_log. +# Available values: trace8, ..., trace1, debug, info, notice, warn, +# error, crit, alert, emerg. +# It is also possible to configure the log level for particular modules, e.g. +# "LogLevel info ssl:warn" +# +#LogLevel warn +LogLevel info + +# Include module configuration: +IncludeOptional mods-enabled/*.load +IncludeOptional mods-enabled/*.conf + +# Include list of ports to listen on +Include ports.conf + + +# Sets the default security model of the Apache2 HTTPD server. It does +# not allow access to the root filesystem outside of /usr/share and /var/www. +# The former is used by web applications packaged in Debian, +# the latter may be used for local directories served by the web server. If +# your system is serving content from a sub-directory in /srv you must allow +# access here, or in any related virtual host. +<Directory /> + Options FollowSymLinks + AllowOverride None + Require all denied +</Directory> + +<Directory /usr/share> + AllowOverride None + Require all granted +</Directory> + +<Directory /var/www/> +%if %%apache_lister_repertoires == 'oui' + Options Indexes FollowSymLinks +%else + Options FollowSymLinks +%end if + AllowOverride None + Require all granted +</Directory> + +#<Directory /srv/> +# Options Indexes FollowSymLinks +# AllowOverride None +# Require all granted +#</Directory> + + + + +# AccessFileName: The name of the file to look for in each directory +# for additional configuration directives. See also the AllowOverride +# directive. +# +AccessFileName .htaccess + +# +# The following lines prevent .htaccess and .htpasswd files from being +# viewed by Web clients. +# +<FilesMatch "^\.ht"> + Require all denied +</FilesMatch> + + +# +# The following directives define some format nicknames for use with +# a CustomLog directive. +# +# These deviate from the Common Log Format definitions in that they use %O +# (the actual bytes sent including headers) instead of %b (the size of the +# requested file), because the latter makes it impossible to detect partial +# requests. +# +# Note that the use of %{X-Forwarded-For}i instead of %h is not recommended. +# Use mod_remoteip instead. +# +LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined +LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined +LogFormat "%h %l %u %t \"%r\" %>s %O" common +LogFormat "%{Referer}i -> %U" referer +LogFormat "%{User-agent}i" agent +LogFormat "%a %h %t \"%r\" %>s %O" with_reverse_proxy + +# Include of directories ignores editors' and dpkg's backup files, +# see README.Debian for details. + +# Include generic snippets of statements +IncludeOptional conf-enabled/*.conf + +# Include the virtual host configurations: +IncludeOptional sites-enabled/*.conf + +# vim: syntax=apache ts=4 sw=4 sts=4 sr noet diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/templates/eoleapps.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/templates/eoleapps.conf new file mode 100644 index 0000000000000000000000000000000000000000..8beda3cfca3acad94207a685becaab1a280e43d6 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/templates/eoleapps.conf @@ -0,0 +1,63 @@ +# -*- coding: utf-8 -*- +# Documentation is at http://docs.gunicorn.org/en/latest/configure.html#config-file +#Server Socket +# The socket to bind. +# A string of the form: ‘HOST’, ‘HOST:PORT’, ‘unix:PATH’. An IP is a valid HOST. +# Multiple addresses can be bound. +bind = '%%container_ip_web:10000' + +#The maximum number of pending connections. +#This refers to the number of clients that can be waiting to be served. +#Exceeding this number results in the client getting an error when attempting to connect. +#It should only affect servers under significant load. +backlog = '2048' +#end Socket + +#Server Mechanics +# Daemonize the Gunicorn process. +daemon = 'True' +# Pid File name +pidfile = '/run/eoleapps.pid' + +#Worker handling +# The number of worker process for handling requests. +# A positive integer generally in the 2-4 x $(NUM_CORES) range +workers = '1' +# one of [ sync eventlet gevent tornado ] +worker_class = 'eventlet' +# The maximum number of simultaneous clients +worker_connections = '100' + +# The maximum number of requests a worker will process before restarting +# If this is set to zero (the default) then the automatic worker restarts are disabled +max_requests = '0' + +# Workers silent for more than this many seconds are killed and restarted. +timeout = '30' + +# Timeout for graceful workers restart. +graceful_timeout = '30' + +# The number of seconds to wait for requests on a Keep-Alive connection. +# Generally set in the 1-5 seconds range. +keepalive = '2' +#End Worker + +#Security +# The maximum size of HTTP request line in bytes +limit_request_line = '4094' + +# Limit the number of HTTP headers fields in a request +limit_request_field = '100' + +# Limit the allowed size of an HTTP request header field +limit_request_field_size = '8190' +#End Security + +#Log haddling +# one of [ debug info warning error critical ] +loglevel = 'info' +# files +accesslog = '/var/log/eoleflask/gunicorn-eoleapps-access.log' +errorlog = '/var/log/eoleflask/gunicorn-eoleapps-error.log' +#End log diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/templates/mpm_prefork.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/templates/mpm_prefork.conf new file mode 100644 index 0000000000000000000000000000000000000000..f86b06e78e85d199490dde6bfa62b0c177d2ff17 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/templates/mpm_prefork.conf @@ -0,0 +1,19 @@ +# prefork MPM +# StartServers: number of server processes to start +# MinSpareServers: minimum number of server processes which are kept spare +# MaxSpareServers: maximum number of server processes which are kept spare +# MaxRequestWorkers: maximum number of server processes allowed to start +# MaxConnectionsPerChild: maximum number of requests a server process serves + +<IfModule mpm_prefork_module> + StartServers %%mpm_startservers + MinSpareServers %%mpm_minspareservers + MaxSpareServers %%mpm_maxspareservers +%if %%mpm_maxrequestworkers > 256 + ServerLimit %%mpm_maxrequestworkers +%end if + MaxRequestWorkers %%mpm_maxrequestworkers + MaxConnectionsPerChild %%mpm_maxconnectionsperchild +</IfModule> + +# vim: syntax=apache ts=4 sw=4 sts=4 sr noet diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/templates/php-eole.ini b/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/templates/php-eole.ini new file mode 100644 index 0000000000000000000000000000000000000000..7e736a29f7bc4dfa7b2a177f31234c124331c72c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/templates/php-eole.ini @@ -0,0 +1,2 @@ +;Support de "<?" pour les applications Envole (#15534) +short_open_tag = On diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/templates/php.ini b/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/templates/php.ini new file mode 100644 index 0000000000000000000000000000000000000000..8de589f39584ff5994ce48557ce7b398717b4889 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/templates/php.ini @@ -0,0 +1,1874 @@ +[PHP] + +;;;;;;;;;;;;;;;;;;; +; About php.ini ; +;;;;;;;;;;;;;;;;;;; +; PHP's initialization file, generally called php.ini, is responsible for +; configuring many of the aspects of PHP's behavior. + +; PHP attempts to find and load this configuration from a number of locations. +; The following is a summary of its search order: +; 1. SAPI module specific location. +; 2. The PHPRC environment variable. (As of PHP 5.2.0) +; 3. A number of predefined registry keys on Windows (As of PHP 5.2.0) +; 4. Current working directory (except CLI) +; 5. The web server's directory (for SAPI modules), or directory of PHP +; (otherwise in Windows) +; 6. The directory from the --with-config-file-path compile time option, or the +; Windows directory (C:\windows or C:\winnt) +; See the PHP docs for more specific information. +; http://php.net/configuration.file + +; The syntax of the file is extremely simple. Whitespace and lines +; beginning with a semicolon are silently ignored (as you probably guessed). +; Section headers (e.g. [Foo]) are also silently ignored, even though +; they might mean something in the future. + +; Directives following the section heading [PATH=/www/mysite] only +; apply to PHP files in the /www/mysite directory. Directives +; following the section heading [HOST=www.example.com] only apply to +; PHP files served from www.example.com. Directives set in these +; special sections cannot be overridden by user-defined INI files or +; at runtime. Currently, [PATH=] and [HOST=] sections only work under +; CGI/FastCGI. +; http://php.net/ini.sections + +; Directives are specified using the following syntax: +; directive = value +; Directive names are *case sensitive* - foo=bar is different from FOO=bar. +; Directives are variables used to configure PHP or PHP extensions. +; There is no name validation. If PHP can't find an expected +; directive because it is not set or is mistyped, a default value will be used. + +; The value can be a string, a number, a PHP constant (e.g. E_ALL or M_PI), one +; of the INI constants (On, Off, True, False, Yes, No and None) or an expression +; (e.g. E_ALL & ~E_NOTICE), a quoted string ("bar"), or a reference to a +; previously set variable or directive (e.g. ${foo}) + +; Expressions in the INI file are limited to bitwise operators and parentheses: +; | bitwise OR +; ^ bitwise XOR +; & bitwise AND +; ~ bitwise NOT +; ! boolean NOT + +; Boolean flags can be turned on using the values 1, On, True or Yes. +; They can be turned off using the values 0, Off, False or No. + +; An empty string can be denoted by simply not writing anything after the equal +; sign, or by using the None keyword: + +; foo = ; sets foo to an empty string +; foo = None ; sets foo to an empty string +; foo = "None" ; sets foo to the string 'None' + +; If you use constants in your value, and these constants belong to a +; dynamically loaded extension (either a PHP extension or a Zend extension), +; you may only use these constants *after* the line that loads the extension. + +;;;;;;;;;;;;;;;;;;; +; About this file ; +;;;;;;;;;;;;;;;;;;; +; PHP comes packaged with two INI files. One that is recommended to be used +; in production environments and one that is recommended to be used in +; development environments. + +; php.ini-production contains settings which hold security, performance and +; best practices at its core. But please be aware, these settings may break +; compatibility with older or less security conscience applications. We +; recommending using the production ini in production and testing environments. + +; php.ini-development is very similar to its production variant, except it is +; much more verbose when it comes to errors. We recommend using the +; development version only in development environments, as errors shown to +; application users can inadvertently leak otherwise secure information. + +; This is php.ini-production INI file. + +;;;;;;;;;;;;;;;;;;; +; Quick Reference ; +;;;;;;;;;;;;;;;;;;; +; The following are all the settings which are different in either the production +; or development versions of the INIs with respect to PHP's default behavior. +; Please see the actual settings later in the document for more details as to why +; we recommend these changes in PHP's behavior. + +; display_errors +; Default Value: On +; Development Value: On +; Production Value: Off + +; display_startup_errors +; Default Value: Off +; Development Value: On +; Production Value: Off + +; error_reporting +; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED +; Development Value: E_ALL +; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT + +; html_errors +; Default Value: On +; Development Value: On +; Production value: On + +; log_errors +; Default Value: Off +; Development Value: On +; Production Value: On + +; max_input_time +; Default Value: -1 (Unlimited) +; Development Value: 60 (60 seconds) +; Production Value: 60 (60 seconds) + +; output_buffering +; Default Value: Off +; Development Value: 4096 +; Production Value: 4096 + +; register_argc_argv +; Default Value: On +; Development Value: Off +; Production Value: Off + +; request_order +; Default Value: None +; Development Value: "GP" +; Production Value: "GP" + +; session.gc_divisor +; Default Value: 100 +; Development Value: 1000 +; Production Value: 1000 + +; session.hash_bits_per_character +; Default Value: 4 +; Development Value: 5 +; Production Value: 5 + +; short_open_tag +; Default Value: On +; Development Value: Off +; Production Value: Off + +; track_errors +; Default Value: Off +; Development Value: On +; Production Value: Off + +; url_rewriter.tags +; Default Value: "a=href,area=href,frame=src,form=,fieldset=" +; Development Value: "a=href,area=href,frame=src,input=src,form=fakeentry" +; Production Value: "a=href,area=href,frame=src,input=src,form=fakeentry" + +; variables_order +; Default Value: "EGPCS" +; Development Value: "GPCS" +; Production Value: "GPCS" + +;;;;;;;;;;;;;;;;;;;; +; php.ini Options ; +;;;;;;;;;;;;;;;;;;;; +; Name for user-defined php.ini (.htaccess) files. Default is ".user.ini" +;user_ini.filename = ".user.ini" + +; To disable this feature set this option to empty value +;user_ini.filename = + +; TTL for user-defined php.ini files (time-to-live) in seconds. Default is 300 seconds (5 minutes) +;user_ini.cache_ttl = 300 + +;;;;;;;;;;;;;;;;;;;; +; Language Options ; +;;;;;;;;;;;;;;;;;;;; + +; Enable the PHP scripting language engine under Apache. +; http://php.net/engine +engine = On + +; This directive determines whether or not PHP will recognize code between +; <? and ?> tags as PHP source which should be processed as such. It is +; generally recommended that <?php and ?> should be used and that this feature +; should be disabled, as enabling it may result in issues when generating XML +; documents, however this remains supported for backward compatibility reasons. +; Note that this directive does not control the <?= shorthand tag, which can be +; used regardless of this directive. +; Default Value: On +; Development Value: Off +; Production Value: Off +; http://php.net/short-open-tag +short_open_tag = On + +; The number of significant digits displayed in floating point numbers. +; http://php.net/precision +precision = 14 + +; Output buffering is a mechanism for controlling how much output data +; (excluding headers and cookies) PHP should keep internally before pushing that +; data to the client. If your application's output exceeds this setting, PHP +; will send that data in chunks of roughly the size you specify. +; Turning on this setting and managing its maximum buffer size can yield some +; interesting side-effects depending on your application and web server. +; You may be able to send headers and cookies after you've already sent output +; through print or echo. You also may see performance benefits if your server is +; emitting less packets due to buffered output versus PHP streaming the output +; as it gets it. On production servers, 4096 bytes is a good setting for performance +; reasons. +; Note: Output buffering can also be controlled via Output Buffering Control +; functions. +; Possible Values: +; On = Enabled and buffer is unlimited. (Use with caution) +; Off = Disabled +; Integer = Enables the buffer and sets its maximum size in bytes. +; Note: This directive is hardcoded to Off for the CLI SAPI +; Default Value: Off +; Development Value: 4096 +; Production Value: 4096 +; http://php.net/output-buffering +output_buffering = 4096 + +; You can redirect all of the output of your scripts to a function. For +; example, if you set output_handler to "mb_output_handler", character +; encoding will be transparently converted to the specified encoding. +; Setting any output handler automatically turns on output buffering. +; Note: People who wrote portable scripts should not depend on this ini +; directive. Instead, explicitly set the output handler using ob_start(). +; Using this ini directive may cause problems unless you know what script +; is doing. +; Note: You cannot use both "mb_output_handler" with "ob_iconv_handler" +; and you cannot use both "ob_gzhandler" and "zlib.output_compression". +; Note: output_handler must be empty if this is set 'On' !!!! +; Instead you must use zlib.output_handler. +; http://php.net/output-handler +;output_handler = + +; Transparent output compression using the zlib library +; Valid values for this option are 'off', 'on', or a specific buffer size +; to be used for compression (default is 4KB) +; Note: Resulting chunk size may vary due to nature of compression. PHP +; outputs chunks that are few hundreds bytes each as a result of +; compression. If you prefer a larger chunk size for better +; performance, enable output_buffering in addition. +; Note: You need to use zlib.output_handler instead of the standard +; output_handler, or otherwise the output will be corrupted. +; http://php.net/zlib.output-compression +zlib.output_compression = Off + +; http://php.net/zlib.output-compression-level +;zlib.output_compression_level = -1 + +; You cannot specify additional output handlers if zlib.output_compression +; is activated here. This setting does the same as output_handler but in +; a different order. +; http://php.net/zlib.output-handler +;zlib.output_handler = + +; Implicit flush tells PHP to tell the output layer to flush itself +; automatically after every output block. This is equivalent to calling the +; PHP function flush() after each and every call to print() or echo() and each +; and every HTML block. Turning this option on has serious performance +; implications and is generally recommended for debugging purposes only. +; http://php.net/implicit-flush +; Note: This directive is hardcoded to On for the CLI SAPI +implicit_flush = Off + +; The unserialize callback function will be called (with the undefined class' +; name as parameter), if the unserializer finds an undefined class +; which should be instantiated. A warning appears if the specified function is +; not defined, or if the function doesn't include/implement the missing class. +; So only set this entry, if you really want to implement such a +; callback-function. +unserialize_callback_func = + +; When floats & doubles are serialized store serialize_precision significant +; digits after the floating point. The default value ensures that when floats +; are decoded with unserialize, the data will remain the same. +serialize_precision = 17 + +; open_basedir, if set, limits all file operations to the defined directory +; and below. This directive makes most sense if used in a per-directory +; or per-virtualhost web server configuration file. +; http://php.net/open-basedir +;open_basedir = + +; This directive allows you to disable certain functions for security reasons. +; It receives a comma-delimited list of function names. +; http://php.net/disable-functions +disable_functions = pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority, + +; This directive allows you to disable certain classes for security reasons. +; It receives a comma-delimited list of class names. +; http://php.net/disable-classes +disable_classes = + +; Colors for Syntax Highlighting mode. Anything that's acceptable in +; <span style="color: ???????"> would work. +; http://php.net/syntax-highlighting +;highlight.string = #DD0000 +;highlight.comment = #FF9900 +;highlight.keyword = #007700 +;highlight.default = #0000BB +;highlight.html = #000000 + +; If enabled, the request will be allowed to complete even if the user aborts +; the request. Consider enabling it if executing long requests, which may end up +; being interrupted by the user or a browser timing out. PHP's default behavior +; is to disable this feature. +; http://php.net/ignore-user-abort +;ignore_user_abort = On + +; Determines the size of the realpath cache to be used by PHP. This value should +; be increased on systems where PHP opens many files to reflect the quantity of +; the file operations performed. +; http://php.net/realpath-cache-size +;realpath_cache_size = 16k + +; Duration of time, in seconds for which to cache realpath information for a given +; file or directory. For systems with rarely changing files, consider increasing this +; value. +; http://php.net/realpath-cache-ttl +;realpath_cache_ttl = 120 + +; Enables or disables the circular reference collector. +; http://php.net/zend.enable-gc +zend.enable_gc = On + +; If enabled, scripts may be written in encodings that are incompatible with +; the scanner. CP936, Big5, CP949 and Shift_JIS are the examples of such +; encodings. To use this feature, mbstring extension must be enabled. +; Default: Off +;zend.multibyte = Off + +; Allows to set the default encoding for the scripts. This value will be used +; unless "declare(encoding=...)" directive appears at the top of the script. +; Only affects if zend.multibyte is set. +; Default: "" +;zend.script_encoding = + +;;;;;;;;;;;;;;;;; +; Miscellaneous ; +;;;;;;;;;;;;;;;;; + +; Decides whether PHP may expose the fact that it is installed on the server +; (e.g. by adding its signature to the Web server header). It is no security +; threat in any way, but it makes it possible to determine whether you use PHP +; on your server or not. +; http://php.net/expose-php +expose_php = Off + +;;;;;;;;;;;;;;;;;;; +; Resource Limits ; +;;;;;;;;;;;;;;;;;;; + +; Maximum execution time of each script, in seconds +; http://php.net/max-execution-time +; Note: This directive is hardcoded to 0 for the CLI SAPI +max_execution_time = %%php_max_execution_time + +; Maximum amount of time each script may spend parsing request data. It's a good +; idea to limit this time on productions servers in order to eliminate unexpectedly +; long running scripts. +; Note: This directive is hardcoded to -1 for the CLI SAPI +; Default Value: -1 (Unlimited) +; Development Value: 60 (60 seconds) +; Production Value: 60 (60 seconds) +; http://php.net/max-input-time +max_input_time = %%php_max_input_time + +; Maximum input variable nesting level +; http://php.net/max-input-nesting-level +;max_input_nesting_level = 64 + +; How many GET/POST/COOKIE input variables may be accepted +; max_input_vars = 1000 + +; Maximum amount of memory a script may consume (128MB) +; http://php.net/memory-limit +memory_limit = %%{php_memory_limit}M + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Error handling and logging ; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +; This directive informs PHP of which errors, warnings and notices you would like +; it to take action for. The recommended way of setting values for this +; directive is through the use of the error level constants and bitwise +; operators. The error level constants are below here for convenience as well as +; some common settings and their meanings. +; By default, PHP is set to take action on all errors, notices and warnings EXCEPT +; those related to E_NOTICE and E_STRICT, which together cover best practices and +; recommended coding standards in PHP. For performance reasons, this is the +; recommend error reporting setting. Your production server shouldn't be wasting +; resources complaining about best practices and coding standards. That's what +; development servers and development settings are for. +; Note: The php.ini-development file has this setting as E_ALL. This +; means it pretty much reports everything which is exactly what you want during +; development and early testing. +; +; Error Level Constants: +; E_ALL - All errors and warnings (includes E_STRICT as of PHP 5.4.0) +; E_ERROR - fatal run-time errors +; E_RECOVERABLE_ERROR - almost fatal run-time errors +; E_WARNING - run-time warnings (non-fatal errors) +; E_PARSE - compile-time parse errors +; E_NOTICE - run-time notices (these are warnings which often result +; from a bug in your code, but it's possible that it was +; intentional (e.g., using an uninitialized variable and +; relying on the fact it is automatically initialized to an +; empty string) +; E_STRICT - run-time notices, enable to have PHP suggest changes +; to your code which will ensure the best interoperability +; and forward compatibility of your code +; E_CORE_ERROR - fatal errors that occur during PHP's initial startup +; E_CORE_WARNING - warnings (non-fatal errors) that occur during PHP's +; initial startup +; E_COMPILE_ERROR - fatal compile-time errors +; E_COMPILE_WARNING - compile-time warnings (non-fatal errors) +; E_USER_ERROR - user-generated error message +; E_USER_WARNING - user-generated warning message +; E_USER_NOTICE - user-generated notice message +; E_DEPRECATED - warn about code that will not work in future versions +; of PHP +; E_USER_DEPRECATED - user-generated deprecation warnings +; +; Common Values: +; E_ALL (Show all errors, warnings and notices including coding standards.) +; E_ALL & ~E_NOTICE (Show all errors, except for notices) +; E_ALL & ~E_NOTICE & ~E_STRICT (Show all errors, except for notices and coding standards warnings.) +; E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR (Show only errors) +; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED +; Development Value: E_ALL +; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT +; http://php.net/error-reporting +error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT + +; This directive controls whether or not and where PHP will output errors, +; notices and warnings too. Error output is very useful during development, but +; it could be very dangerous in production environments. Depending on the code +; which is triggering the error, sensitive information could potentially leak +; out of your application such as database usernames and passwords or worse. +; For production environments, we recommend logging errors rather than +; sending them to STDOUT. +; Possible Values: +; Off = Do not display any errors +; stderr = Display errors to STDERR (affects only CGI/CLI binaries!) +; On or stdout = Display errors to STDOUT +; Default Value: On +; Development Value: On +; Production Value: Off +; http://php.net/display-errors +display_errors = %%php_display_errors + +; The display of errors which occur during PHP's startup sequence are handled +; separately from display_errors. PHP's default behavior is to suppress those +; errors from clients. Turning the display of startup errors on can be useful in +; debugging configuration problems. We strongly recommend you +; set this to 'off' for production servers. +; Default Value: Off +; Development Value: On +; Production Value: Off +; http://php.net/display-startup-errors +display_startup_errors = Off + +; Besides displaying errors, PHP can also log errors to locations such as a +; server-specific log, STDERR, or a location specified by the error_log +; directive found below. While errors should not be displayed on productions +; servers they should still be monitored and logging is a great way to do that. +; Default Value: Off +; Development Value: On +; Production Value: On +; http://php.net/log-errors +log_errors = On + +; Set maximum length of log_errors. In error_log information about the source is +; added. The default is 1024 and 0 allows to not apply any maximum length at all. +; http://php.net/log-errors-max-len +log_errors_max_len = 1024 + +; Do not log repeated messages. Repeated errors must occur in same file on same +; line unless ignore_repeated_source is set true. +; http://php.net/ignore-repeated-errors +ignore_repeated_errors = Off + +; Ignore source of message when ignoring repeated messages. When this setting +; is On you will not log errors with repeated messages from different files or +; source lines. +; http://php.net/ignore-repeated-source +ignore_repeated_source = Off + +; If this parameter is set to Off, then memory leaks will not be shown (on +; stdout or in the log). This has only effect in a debug compile, and if +; error reporting includes E_WARNING in the allowed list +; http://php.net/report-memleaks +report_memleaks = On + +; This setting is on by default. +;report_zend_debug = 0 + +; Store the last error/warning message in $php_errormsg (boolean). Setting this value +; to On can assist in debugging and is appropriate for development servers. It should +; however be disabled on production servers. +; Default Value: Off +; Development Value: On +; Production Value: Off +; http://php.net/track-errors +track_errors = Off + +; Turn off normal error reporting and emit XML-RPC error XML +; http://php.net/xmlrpc-errors +;xmlrpc_errors = 0 + +; An XML-RPC faultCode +;xmlrpc_error_number = 0 + +; When PHP displays or logs an error, it has the capability of formatting the +; error message as HTML for easier reading. This directive controls whether +; the error message is formatted as HTML or not. +; Note: This directive is hardcoded to Off for the CLI SAPI +; Default Value: On +; Development Value: On +; Production value: On +; http://php.net/html-errors +html_errors = Off + +; If html_errors is set to On *and* docref_root is not empty, then PHP +; produces clickable error messages that direct to a page describing the error +; or function causing the error in detail. +; You can download a copy of the PHP manual from http://php.net/docs +; and change docref_root to the base URL of your local copy including the +; leading '/'. You must also specify the file extension being used including +; the dot. PHP's default behavior is to leave these settings empty, in which +; case no links to documentation are generated. +; Note: Never use this feature for production boxes. +; http://php.net/docref-root +; Examples +;docref_root = "/phpmanual/" + +; http://php.net/docref-ext +;docref_ext = .html + +; String to output before an error message. PHP's default behavior is to leave +; this setting blank. +; http://php.net/error-prepend-string +; Example: +;error_prepend_string = "<span style='color: #ff0000'>" + +; String to output after an error message. PHP's default behavior is to leave +; this setting blank. +; http://php.net/error-append-string +; Example: +;error_append_string = "</span>" + +; Log errors to specified file. PHP's default behavior is to leave this value +; empty. +; http://php.net/error-log +; Example: +;error_log = php_errors.log +; Log errors to syslog (Event Log on Windows). +;error_log = syslog + +;windows.show_crt_warning +; Default value: 0 +; Development value: 0 +; Production value: 0 + +;;;;;;;;;;;;;;;;; +; Data Handling ; +;;;;;;;;;;;;;;;;; + +; The separator used in PHP generated URLs to separate arguments. +; PHP's default setting is "&". +; http://php.net/arg-separator.output +; Example: +;arg_separator.output = "&" + +; List of separator(s) used by PHP to parse input URLs into variables. +; PHP's default setting is "&". +; NOTE: Every character in this directive is considered as separator! +; http://php.net/arg-separator.input +; Example: +;arg_separator.input = ";&" + +; This directive determines which super global arrays are registered when PHP +; starts up. G,P,C,E & S are abbreviations for the following respective super +; globals: GET, POST, COOKIE, ENV and SERVER. There is a performance penalty +; paid for the registration of these arrays and because ENV is not as commonly +; used as the others, ENV is not recommended on productions servers. You +; can still get access to the environment variables through getenv() should you +; need to. +; Default Value: "EGPCS" +; Development Value: "GPCS" +; Production Value: "GPCS"; +; http://php.net/variables-order +variables_order = "GPCS" + +; This directive determines which super global data (G,P & C) should be +; registered into the super global array REQUEST. If so, it also determines +; the order in which that data is registered. The values for this directive +; are specified in the same manner as the variables_order directive, +; EXCEPT one. Leaving this value empty will cause PHP to use the value set +; in the variables_order directive. It does not mean it will leave the super +; globals array REQUEST empty. +; Default Value: None +; Development Value: "GP" +; Production Value: "GP" +; http://php.net/request-order +request_order = "GP" + +; This directive determines whether PHP registers $argv & $argc each time it +; runs. $argv contains an array of all the arguments passed to PHP when a script +; is invoked. $argc contains an integer representing the number of arguments +; that were passed when the script was invoked. These arrays are extremely +; useful when running scripts from the command line. When this directive is +; enabled, registering these variables consumes CPU cycles and memory each time +; a script is executed. For performance reasons, this feature should be disabled +; on production servers. +; Note: This directive is hardcoded to On for the CLI SAPI +; Default Value: On +; Development Value: Off +; Production Value: Off +; http://php.net/register-argc-argv +register_argc_argv = Off + +; When enabled, the ENV, REQUEST and SERVER variables are created when they're +; first used (Just In Time) instead of when the script starts. If these +; variables are not used within a script, having this directive on will result +; in a performance gain. The PHP directive register_argc_argv must be disabled +; for this directive to have any affect. +; http://php.net/auto-globals-jit +auto_globals_jit = On + +; Whether PHP will read the POST data. +; This option is enabled by default. +; Most likely, you won't want to disable this option globally. It causes $_POST +; and $_FILES to always be empty; the only way you will be able to read the +; POST data will be through the php://input stream wrapper. This can be useful +; to proxy requests or to process the POST data in a memory efficient fashion. +; http://php.net/enable-post-data-reading +;enable_post_data_reading = Off + +; Maximum size of POST data that PHP will accept. +; Its value may be 0 to disable the limit. It is ignored if POST data reading +; is disabled through enable_post_data_reading. +; http://php.net/post-max-size +post_max_size = %%{php_post_max_size}M + +; Automatically add files before PHP document. +; http://php.net/auto-prepend-file +auto_prepend_file = + +; Automatically add files after PHP document. +; http://php.net/auto-append-file +auto_append_file = + +; By default, PHP will output a media type using the Content-Type header. To +; disable this, simply set it to be empty. +; +; PHP's built-in default media type is set to text/html. +; http://php.net/default-mimetype +default_mimetype = "text/html" + +; PHP's default character set is set to UTF-8. +; http://php.net/default-charset +default_charset = "UTF-8" + +; PHP internal character encoding is set to empty. +; If empty, default_charset is used. +; http://php.net/internal-encoding +;internal_encoding = + +; PHP input character encoding is set to empty. +; If empty, default_charset is used. +; http://php.net/input-encoding +;input_encoding = + +; PHP output character encoding is set to empty. +; If empty, default_charset is used. +; mbstring or iconv output handler is used. +; See also output_buffer. +; http://php.net/output-encoding +;output_encoding = + +;;;;;;;;;;;;;;;;;;;;;;;;; +; Paths and Directories ; +;;;;;;;;;;;;;;;;;;;;;;;;; + +; UNIX: "/path1:/path2" +;include_path = ".:/usr/share/php" +; +; Windows: "\path1;\path2" +;include_path = ".;c:\php\includes" +; +; PHP's default setting for include_path is ".;/path/to/php/pear" +; http://php.net/include-path + +; The root of the PHP pages, used only if nonempty. +; if PHP was not compiled with FORCE_REDIRECT, you SHOULD set doc_root +; if you are running php as a CGI under any web server (other than IIS) +; see documentation for security issues. The alternate is to use the +; cgi.force_redirect configuration below +; http://php.net/doc-root +doc_root = + +; The directory under which PHP opens the script using /~username used only +; if nonempty. +; http://php.net/user-dir +user_dir = + +; Directory in which the loadable extensions (modules) reside. +; http://php.net/extension-dir +; extension_dir = "./" +; On windows: +; extension_dir = "ext" + +; Directory where the temporary files should be placed. +; Defaults to the system default (see sys_get_temp_dir) +; sys_temp_dir = "/tmp" + +; Whether or not to enable the dl() function. The dl() function does NOT work +; properly in multithreaded servers, such as IIS or Zeus, and is automatically +; disabled on them. +; http://php.net/enable-dl +enable_dl = Off + +; cgi.force_redirect is necessary to provide security running PHP as a CGI under +; most web servers. Left undefined, PHP turns this on by default. You can +; turn it off here AT YOUR OWN RISK +; **You CAN safely turn this off for IIS, in fact, you MUST.** +; http://php.net/cgi.force-redirect +;cgi.force_redirect = 1 + +; if cgi.nph is enabled it will force cgi to always sent Status: 200 with +; every request. PHP's default behavior is to disable this feature. +;cgi.nph = 1 + +; if cgi.force_redirect is turned on, and you are not running under Apache or Netscape +; (iPlanet) web servers, you MAY need to set an environment variable name that PHP +; will look for to know it is OK to continue execution. Setting this variable MAY +; cause security issues, KNOW WHAT YOU ARE DOING FIRST. +; http://php.net/cgi.redirect-status-env +;cgi.redirect_status_env = + +; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP's +; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok +; what PATH_INFO is. For more information on PATH_INFO, see the cgi specs. Setting +; this to 1 will cause PHP CGI to fix its paths to conform to the spec. A setting +; of zero causes PHP to behave as before. Default is 1. You should fix your scripts +; to use SCRIPT_FILENAME rather than PATH_TRANSLATED. +; http://php.net/cgi.fix-pathinfo +;cgi.fix_pathinfo=1 + +; FastCGI under IIS (on WINNT based OS) supports the ability to impersonate +; security tokens of the calling client. This allows IIS to define the +; security context that the request runs under. mod_fastcgi under Apache +; does not currently support this feature (03/17/2002) +; Set to 1 if running under IIS. Default is zero. +; http://php.net/fastcgi.impersonate +;fastcgi.impersonate = 1 + +; Disable logging through FastCGI connection. PHP's default behavior is to enable +; this feature. +;fastcgi.logging = 0 + +; cgi.rfc2616_headers configuration option tells PHP what type of headers to +; use when sending HTTP response code. If set to 0, PHP sends Status: header that +; is supported by Apache. When this option is set to 1, PHP will send +; RFC2616 compliant header. +; Default is zero. +; http://php.net/cgi.rfc2616-headers +;cgi.rfc2616_headers = 0 + +;;;;;;;;;;;;;;;; +; File Uploads ; +;;;;;;;;;;;;;;;; + +; Whether to allow HTTP file uploads. +; http://php.net/file-uploads +file_uploads = On + +; Temporary directory for HTTP uploaded files (will use system default if not +; specified). +; http://php.net/upload-tmp-dir +;upload_tmp_dir = + +; Maximum allowed size for uploaded files. +; http://php.net/upload-max-filesize +upload_max_filesize = %%{php_upload_max_filesize}M + +; Maximum number of files that can be uploaded via a single request +max_file_uploads = 20 + +;;;;;;;;;;;;;;;;;; +; Fopen wrappers ; +;;;;;;;;;;;;;;;;;; + +; Whether to allow the treatment of URLs (like http:// or ftp://) as files. +; http://php.net/allow-url-fopen +allow_url_fopen = Off + +; Whether to allow include/require to open URLs (like http:// or ftp://) as files. +; http://php.net/allow-url-include +allow_url_include = Off + +; Define the anonymous ftp password (your email address). PHP's default setting +; for this is empty. +; http://php.net/from +;from="john@doe.com" + +; Define the User-Agent string. PHP's default setting for this is empty. +; http://php.net/user-agent +;user_agent="PHP" + +; Default timeout for socket based streams (seconds) +; http://php.net/default-socket-timeout +default_socket_timeout = 60 + +; If your scripts have to deal with files from Macintosh systems, +; or you are running on a Mac and need to deal with files from +; unix or win32 systems, setting this flag will cause PHP to +; automatically detect the EOL character in those files so that +; fgets() and file() will work regardless of the source of the file. +; http://php.net/auto-detect-line-endings +;auto_detect_line_endings = Off + +;;;;;;;;;;;;;;;;;;;;;; +; Dynamic Extensions ; +;;;;;;;;;;;;;;;;;;;;;; + +; If you wish to have an extension loaded automatically, use the following +; syntax: +; +; extension=modulename.extension +; +; For example, on Windows: +; +; extension=msql.dll +; +; ... or under UNIX: +; +; extension=msql.so +; +; ... or with a path: +; +; extension=/path/to/extension/msql.so +; +; If you only provide the name of the extension, PHP will look for it in its +; default extension directory. +; +; Windows Extensions +; Note that ODBC support is built in, so no dll is needed for it. +; Note that many DLL files are located in the extensions/ (PHP 4) ext/ (PHP 5+) +; extension folders as well as the separate PECL DLL download (PHP 5+). +; Be sure to appropriately set the extension_dir directive. +; +;extension=php_bz2.dll +;extension=php_curl.dll +;extension=php_fileinfo.dll +;extension=php_gd2.dll +;extension=php_gettext.dll +;extension=php_gmp.dll +;extension=php_intl.dll +;extension=php_imap.dll +;extension=php_interbase.dll +;extension=php_ldap.dll +;extension=php_mbstring.dll +;extension=php_exif.dll ; Must be after mbstring as it depends on it +;extension=php_mysqli.dll +;extension=php_oci8_12c.dll ; Use with Oracle Database 12c Instant Client +;extension=php_openssl.dll +;extension=php_pdo_firebird.dll +;extension=php_pdo_mysql.dll +;extension=php_pdo_oci.dll +;extension=php_pdo_odbc.dll +;extension=php_pdo_pgsql.dll +;extension=php_pdo_sqlite.dll +;extension=php_pgsql.dll +;extension=php_shmop.dll + +; The MIBS data available in the PHP distribution must be installed. +; See http://www.php.net/manual/en/snmp.installation.php +;extension=php_snmp.dll + +;extension=php_soap.dll +;extension=php_sockets.dll +;extension=php_sqlite3.dll +;extension=php_tidy.dll +;extension=php_xmlrpc.dll +;extension=php_xsl.dll + +;;;;;;;;;;;;;;;;;;; +; Module Settings ; +;;;;;;;;;;;;;;;;;;; + +[CLI Server] +; Whether the CLI web server uses ANSI color coding in its terminal output. +cli_server.color = On + +[Date] +; Defines the default timezone used by the date functions +; http://php.net/date.timezone +date.timezone = "%%time_zone" + +; http://php.net/date.default-latitude +;date.default_latitude = 31.7667 + +; http://php.net/date.default-longitude +;date.default_longitude = 35.2333 + +; http://php.net/date.sunrise-zenith +;date.sunrise_zenith = 90.583333 + +; http://php.net/date.sunset-zenith +;date.sunset_zenith = 90.583333 + +[filter] +; http://php.net/filter.default +;filter.default = unsafe_raw + +; http://php.net/filter.default-flags +;filter.default_flags = + +[iconv] +; Use of this INI entry is deprecated, use global input_encoding instead. +; If empty, default_charset or input_encoding or iconv.input_encoding is used. +; The precedence is: default_charset < intput_encoding < iconv.input_encoding +;iconv.input_encoding = + +; Use of this INI entry is deprecated, use global internal_encoding instead. +; If empty, default_charset or internal_encoding or iconv.internal_encoding is used. +; The precedence is: default_charset < internal_encoding < iconv.internal_encoding +;iconv.internal_encoding = + +; Use of this INI entry is deprecated, use global output_encoding instead. +; If empty, default_charset or output_encoding or iconv.output_encoding is used. +; The precedence is: default_charset < output_encoding < iconv.output_encoding +; To use an output encoding conversion, iconv's output handler must be set +; otherwise output encoding conversion cannot be performed. +;iconv.output_encoding = + +[intl] +;intl.default_locale = +; This directive allows you to produce PHP errors when some error +; happens within intl functions. The value is the level of the error produced. +; Default is 0, which does not produce any errors. +;intl.error_level = E_WARNING +;intl.use_exceptions = 0 + +[sqlite3] +;sqlite3.extension_dir = + +[Pcre] +;PCRE library backtracking limit. +; http://php.net/pcre.backtrack-limit +;pcre.backtrack_limit=100000 + +;PCRE library recursion limit. +;Please note that if you set this value to a high number you may consume all +;the available process stack and eventually crash PHP (due to reaching the +;stack size limit imposed by the Operating System). +; http://php.net/pcre.recursion-limit +;pcre.recursion_limit=100000 + +;Enables or disables JIT compilation of patterns. This requires the PCRE +;library to be compiled with JIT support. +;pcre.jit=1 + +[Pdo] +; Whether to pool ODBC connections. Can be one of "strict", "relaxed" or "off" +; http://php.net/pdo-odbc.connection-pooling +;pdo_odbc.connection_pooling=strict + +;pdo_odbc.db2_instance_name + +[Pdo_mysql] +; If mysqlnd is used: Number of cache slots for the internal result set cache +; http://php.net/pdo_mysql.cache_size +pdo_mysql.cache_size = 2000 + +; Default socket name for local MySQL connects. If empty, uses the built-in +; MySQL defaults. +; http://php.net/pdo_mysql.default-socket +pdo_mysql.default_socket= + +[Phar] +; http://php.net/phar.readonly +;phar.readonly = On + +; http://php.net/phar.require-hash +;phar.require_hash = On + +;phar.cache_list = + +[mail function] +; For Win32 only. +; http://php.net/smtp +SMTP = localhost +; http://php.net/smtp-port +smtp_port = 25 + +; For Win32 only. +; http://php.net/sendmail-from +;sendmail_from = me@example.com + +; For Unix only. You may supply arguments as well (default: "sendmail -t -i"). +; http://php.net/sendmail-path +;sendmail_path = + +; Force the addition of the specified parameters to be passed as extra parameters +; to the sendmail binary. These parameters will always replace the value of +; the 5th parameter to mail(). +;mail.force_extra_parameters = + +; Add X-PHP-Originating-Script: that will include uid of the script followed by the filename +mail.add_x_header = On + +; The path to a log file that will log all mail() calls. Log entries include +; the full path of the script, line number, To address and headers. +;mail.log = +; Log mail to syslog (Event Log on Windows). +;mail.log = syslog + +[SQL] +; http://php.net/sql.safe-mode +sql.safe_mode = Off + +[ODBC] +; http://php.net/odbc.default-db +;odbc.default_db = Not yet implemented + +; http://php.net/odbc.default-user +;odbc.default_user = Not yet implemented + +; http://php.net/odbc.default-pw +;odbc.default_pw = Not yet implemented + +; Controls the ODBC cursor model. +; Default: SQL_CURSOR_STATIC (default). +;odbc.default_cursortype + +; Allow or prevent persistent links. +; http://php.net/odbc.allow-persistent +odbc.allow_persistent = On + +; Check that a connection is still valid before reuse. +; http://php.net/odbc.check-persistent +odbc.check_persistent = On + +; Maximum number of persistent links. -1 means no limit. +; http://php.net/odbc.max-persistent +odbc.max_persistent = -1 + +; Maximum number of links (persistent + non-persistent). -1 means no limit. +; http://php.net/odbc.max-links +odbc.max_links = -1 + +; Handling of LONG fields. Returns number of bytes to variables. 0 means +; passthru. +; http://php.net/odbc.defaultlrl +odbc.defaultlrl = 4096 + +; Handling of binary data. 0 means passthru, 1 return as is, 2 convert to char. +; See the documentation on odbc_binmode and odbc_longreadlen for an explanation +; of odbc.defaultlrl and odbc.defaultbinmode +; http://php.net/odbc.defaultbinmode +odbc.defaultbinmode = 1 + +;birdstep.max_links = -1 + +[Interbase] +; Allow or prevent persistent links. +ibase.allow_persistent = 1 + +; Maximum number of persistent links. -1 means no limit. +ibase.max_persistent = -1 + +; Maximum number of links (persistent + non-persistent). -1 means no limit. +ibase.max_links = -1 + +; Default database name for ibase_connect(). +;ibase.default_db = + +; Default username for ibase_connect(). +;ibase.default_user = + +; Default password for ibase_connect(). +;ibase.default_password = + +; Default charset for ibase_connect(). +;ibase.default_charset = + +; Default timestamp format. +ibase.timestampformat = "%Y-%m-%d %H:%M:%S" + +; Default date format. +ibase.dateformat = "%Y-%m-%d" + +; Default time format. +ibase.timeformat = "%H:%M:%S" + +[MySQLi] + +; Maximum number of persistent links. -1 means no limit. +; http://php.net/mysqli.max-persistent +mysqli.max_persistent = -1 + +; Allow accessing, from PHP's perspective, local files with LOAD DATA statements +; http://php.net/mysqli.allow_local_infile +;mysqli.allow_local_infile = On + +; Allow or prevent persistent links. +; http://php.net/mysqli.allow-persistent +mysqli.allow_persistent = On + +; Maximum number of links. -1 means no limit. +; http://php.net/mysqli.max-links +mysqli.max_links = -1 + +; If mysqlnd is used: Number of cache slots for the internal result set cache +; http://php.net/mysqli.cache_size +mysqli.cache_size = 2000 + +; Default port number for mysqli_connect(). If unset, mysqli_connect() will use +; the $MYSQL_TCP_PORT or the mysql-tcp entry in /etc/services or the +; compile-time value defined MYSQL_PORT (in that order). Win32 will only look +; at MYSQL_PORT. +; http://php.net/mysqli.default-port +mysqli.default_port = 3306 + +; Default socket name for local MySQL connects. If empty, uses the built-in +; MySQL defaults. +; http://php.net/mysqli.default-socket +mysqli.default_socket = + +; Default host for mysql_connect() (doesn't apply in safe mode). +; http://php.net/mysqli.default-host +mysqli.default_host = + +; Default user for mysql_connect() (doesn't apply in safe mode). +; http://php.net/mysqli.default-user +mysqli.default_user = + +; Default password for mysqli_connect() (doesn't apply in safe mode). +; Note that this is generally a *bad* idea to store passwords in this file. +; *Any* user with PHP access can run 'echo get_cfg_var("mysqli.default_pw") +; and reveal this password! And of course, any users with read access to this +; file will be able to reveal the password as well. +; http://php.net/mysqli.default-pw +mysqli.default_pw = + +; Allow or prevent reconnect +mysqli.reconnect = Off + +[mysqlnd] +; Enable / Disable collection of general statistics by mysqlnd which can be +; used to tune and monitor MySQL operations. +; http://php.net/mysqlnd.collect_statistics +mysqlnd.collect_statistics = On + +; Enable / Disable collection of memory usage statistics by mysqlnd which can be +; used to tune and monitor MySQL operations. +; http://php.net/mysqlnd.collect_memory_statistics +mysqlnd.collect_memory_statistics = Off + +; Size of a pre-allocated buffer used when sending commands to MySQL in bytes. +; http://php.net/mysqlnd.net_cmd_buffer_size +;mysqlnd.net_cmd_buffer_size = 2048 + +; Size of a pre-allocated buffer used for reading data sent by the server in +; bytes. +; http://php.net/mysqlnd.net_read_buffer_size +;mysqlnd.net_read_buffer_size = 32768 + +[OCI8] + +; Connection: Enables privileged connections using external +; credentials (OCI_SYSOPER, OCI_SYSDBA) +; http://php.net/oci8.privileged-connect +;oci8.privileged_connect = Off + +; Connection: The maximum number of persistent OCI8 connections per +; process. Using -1 means no limit. +; http://php.net/oci8.max-persistent +;oci8.max_persistent = -1 + +; Connection: The maximum number of seconds a process is allowed to +; maintain an idle persistent connection. Using -1 means idle +; persistent connections will be maintained forever. +; http://php.net/oci8.persistent-timeout +;oci8.persistent_timeout = -1 + +; Connection: The number of seconds that must pass before issuing a +; ping during oci_pconnect() to check the connection validity. When +; set to 0, each oci_pconnect() will cause a ping. Using -1 disables +; pings completely. +; http://php.net/oci8.ping-interval +;oci8.ping_interval = 60 + +; Connection: Set this to a user chosen connection class to be used +; for all pooled server requests with Oracle 11g Database Resident +; Connection Pooling (DRCP). To use DRCP, this value should be set to +; the same string for all web servers running the same application, +; the database pool must be configured, and the connection string must +; specify to use a pooled server. +;oci8.connection_class = + +; High Availability: Using On lets PHP receive Fast Application +; Notification (FAN) events generated when a database node fails. The +; database must also be configured to post FAN events. +;oci8.events = Off + +; Tuning: This option enables statement caching, and specifies how +; many statements to cache. Using 0 disables statement caching. +; http://php.net/oci8.statement-cache-size +;oci8.statement_cache_size = 20 + +; Tuning: Enables statement prefetching and sets the default number of +; rows that will be fetched automatically after statement execution. +; http://php.net/oci8.default-prefetch +;oci8.default_prefetch = 100 + +; Compatibility. Using On means oci_close() will not close +; oci_connect() and oci_new_connect() connections. +; http://php.net/oci8.old-oci-close-semantics +;oci8.old_oci_close_semantics = Off + +[PostgreSQL] +; Allow or prevent persistent links. +; http://php.net/pgsql.allow-persistent +pgsql.allow_persistent = On + +; Detect broken persistent links always with pg_pconnect(). +; Auto reset feature requires a little overheads. +; http://php.net/pgsql.auto-reset-persistent +pgsql.auto_reset_persistent = Off + +; Maximum number of persistent links. -1 means no limit. +; http://php.net/pgsql.max-persistent +pgsql.max_persistent = -1 + +; Maximum number of links (persistent+non persistent). -1 means no limit. +; http://php.net/pgsql.max-links +pgsql.max_links = -1 + +; Ignore PostgreSQL backends Notice message or not. +; Notice message logging require a little overheads. +; http://php.net/pgsql.ignore-notice +pgsql.ignore_notice = 0 + +; Log PostgreSQL backends Notice message or not. +; Unless pgsql.ignore_notice=0, module cannot log notice message. +; http://php.net/pgsql.log-notice +pgsql.log_notice = 0 + +[bcmath] +; Number of decimal digits for all bcmath functions. +; http://php.net/bcmath.scale +bcmath.scale = 0 + +[browscap] +; http://php.net/browscap +%if %%php_browscap == 'oui' +browscap = /etc/php/7.2/apache2/extra/browscap.ini +%end if + +[Session] +; Handler used to store/retrieve data. +; http://php.net/session.save-handler +session.save_handler = files + +; Argument passed to save_handler. In the case of files, this is the path +; where data files are stored. Note: Windows users have to change this +; variable in order to use PHP's session functions. +; +; The path can be defined as: +; +; session.save_path = "N;/path" +; +; where N is an integer. Instead of storing all the session files in +; /path, what this will do is use subdirectories N-levels deep, and +; store the session data in those directories. This is useful if +; your OS has problems with many files in one directory, and is +; a more efficient layout for servers that handle many sessions. +; +; NOTE 1: PHP will not create this directory structure automatically. +; You can use the script in the ext/session dir for that purpose. +; NOTE 2: See the section on garbage collection below if you choose to +; use subdirectories for session storage +; +; The file storage module creates files using mode 600 by default. +; You can change that by using +; +; session.save_path = "N;MODE;/path" +; +; where MODE is the octal representation of the mode. Note that this +; does not overwrite the process's umask. +; http://php.net/session.save-path +;session.save_path = "/var/lib/php/sessions" + +; Whether to use strict session mode. +; Strict session mode does not accept uninitialized session ID and regenerate +; session ID if browser sends uninitialized session ID. Strict mode protects +; applications from session fixation via session adoption vulnerability. It is +; disabled by default for maximum compatibility, but enabling it is encouraged. +; https://wiki.php.net/rfc/strict_sessions +session.use_strict_mode = 0 + +; Whether to use cookies. +; http://php.net/session.use-cookies +session.use_cookies = 1 + +; http://php.net/session.cookie-secure +;session.cookie_secure = + +; This option forces PHP to fetch and use a cookie for storing and maintaining +; the session id. We encourage this operation as it's very helpful in combating +; session hijacking when not specifying and managing your own session id. It is +; not the be-all and end-all of session hijacking defense, but it's a good start. +; http://php.net/session.use-only-cookies +session.use_only_cookies = 1 + +; Name of the session (used as cookie name). +; http://php.net/session.name +session.name = PHPSESSID + +; Initialize session on request startup. +; http://php.net/session.auto-start +session.auto_start = 0 + +; Lifetime in seconds of cookie or, if 0, until browser is restarted. +; http://php.net/session.cookie-lifetime +session.cookie_lifetime = 0 + +; The path for which the cookie is valid. +; http://php.net/session.cookie-path +session.cookie_path = / + +; The domain for which the cookie is valid. +; http://php.net/session.cookie-domain +session.cookie_domain = + +; Whether or not to add the httpOnly flag to the cookie, which makes it inaccessible to browser scripting languages such as JavaScript. +; http://php.net/session.cookie-httponly +session.cookie_httponly = + +; Handler used to serialize data. php is the standard serializer of PHP. +; http://php.net/session.serialize-handler +session.serialize_handler = php + +; Defines the probability that the 'garbage collection' process is started +; on every session initialization. The probability is calculated by using +; gc_probability/gc_divisor. Where session.gc_probability is the numerator +; and gc_divisor is the denominator in the equation. Setting this value to 1 +; when the session.gc_divisor value is 100 will give you approximately a 1% chance +; the gc will run on any give request. +; Default Value: 1 +; Development Value: 1 +; Production Value: 1 +; http://php.net/session.gc-probability +session.gc_probability = 0 + +; Defines the probability that the 'garbage collection' process is started on every +; session initialization. The probability is calculated by using the following equation: +; gc_probability/gc_divisor. Where session.gc_probability is the numerator and +; session.gc_divisor is the denominator in the equation. Setting this value to 1 +; when the session.gc_divisor value is 100 will give you approximately a 1% chance +; the gc will run on any give request. Increasing this value to 1000 will give you +; a 0.1% chance the gc will run on any give request. For high volume production servers, +; this is a more efficient approach. +; Default Value: 100 +; Development Value: 1000 +; Production Value: 1000 +; http://php.net/session.gc-divisor +session.gc_divisor = 1000 + +; After this number of seconds, stored data will be seen as 'garbage' and +; cleaned up by the garbage collection process. +; http://php.net/session.gc-maxlifetime +session.gc_maxlifetime = %%php_session_gc_maxlifetime + +; NOTE: If you are using the subdirectory option for storing session files +; (see session.save_path above), then garbage collection does *not* +; happen automatically. You will need to do your own garbage +; collection through a shell script, cron entry, or some other method. +; For example, the following script would is the equivalent of +; setting session.gc_maxlifetime to 1440 (1440 seconds = 24 minutes): +; find /path/to/sessions -cmin +24 -type f | xargs rm + +; Check HTTP Referer to invalidate externally stored URLs containing ids. +; HTTP_REFERER has to contain this substring for the session to be +; considered as valid. +; http://php.net/session.referer-check +session.referer_check = + +; How many bytes to read from the file. +; http://php.net/session.entropy-length +session.entropy_length = %%php_session_entropy_length + +; Specified here to create the session id. +; http://php.net/session.entropy-file +; Defaults to /dev/urandom +; On systems that don't have /dev/urandom but do have /dev/arandom, this will default to /dev/arandom +; If neither are found at compile time, the default is no entropy file. +; On windows, setting the entropy_length setting will activate the +; Windows random source (using the CryptoAPI) +;session.entropy_file = /dev/urandom + +; Set to {nocache,private,public,} to determine HTTP caching aspects +; or leave this empty to avoid sending anti-caching headers. +; http://php.net/session.cache-limiter +session.cache_limiter = nocache + +; Document expires after n minutes. +; http://php.net/session.cache-expire +session.cache_expire = 180 + +; trans sid support is disabled by default. +; Use of trans sid may risk your users' security. +; Use this option with caution. +; - User may send URL contains active session ID +; to other person via. email/irc/etc. +; - URL that contains active session ID may be stored +; in publicly accessible computer. +; - User may access your site with the same session ID +; always using URL stored in browser's history or bookmarks. +; http://php.net/session.use-trans-sid +session.use_trans_sid = 0 + +; Select a hash function for use in generating session ids. +; Possible Values +; 0 (MD5 128 bits) +; 1 (SHA-1 160 bits) +; This option may also be set to the name of any hash function supported by +; the hash extension. A list of available hashes is returned by the hash_algos() +; function. +; http://php.net/session.hash-function +session.hash_function = 0 + +; Define how many bits are stored in each character when converting +; the binary hash data to something readable. +; Possible values: +; 4 (4 bits: 0-9, a-f) +; 5 (5 bits: 0-9, a-v) +; 6 (6 bits: 0-9, a-z, A-Z, "-", ",") +; Default Value: 4 +; Development Value: 5 +; Production Value: 5 +; http://php.net/session.hash-bits-per-character +session.hash_bits_per_character = 5 + +; The URL rewriter will look for URLs in a defined set of HTML tags. +; form/fieldset are special; if you include them here, the rewriter will +; add a hidden <input> field with the info which is otherwise appended +; to URLs. If you want XHTML conformity, remove the form entry. +; Note that all valid entries require a "=", even if no value follows. +; Default Value: "a=href,area=href,frame=src,form=,fieldset=" +; Development Value: "a=href,area=href,frame=src,input=src,form=fakeentry" +; Production Value: "a=href,area=href,frame=src,input=src,form=fakeentry" +; http://php.net/url-rewriter.tags +url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry" + +; Enable upload progress tracking in $_SESSION +; Default Value: On +; Development Value: On +; Production Value: On +; http://php.net/session.upload-progress.enabled +;session.upload_progress.enabled = On + +; Cleanup the progress information as soon as all POST data has been read +; (i.e. upload completed). +; Default Value: On +; Development Value: On +; Production Value: On +; http://php.net/session.upload-progress.cleanup +;session.upload_progress.cleanup = On + +; A prefix used for the upload progress key in $_SESSION +; Default Value: "upload_progress_" +; Development Value: "upload_progress_" +; Production Value: "upload_progress_" +; http://php.net/session.upload-progress.prefix +;session.upload_progress.prefix = "upload_progress_" + +; The index name (concatenated with the prefix) in $_SESSION +; containing the upload progress information +; Default Value: "PHP_SESSION_UPLOAD_PROGRESS" +; Development Value: "PHP_SESSION_UPLOAD_PROGRESS" +; Production Value: "PHP_SESSION_UPLOAD_PROGRESS" +; http://php.net/session.upload-progress.name +;session.upload_progress.name = "PHP_SESSION_UPLOAD_PROGRESS" + +; How frequently the upload progress should be updated. +; Given either in percentages (per-file), or in bytes +; Default Value: "1%" +; Development Value: "1%" +; Production Value: "1%" +; http://php.net/session.upload-progress.freq +;session.upload_progress.freq = "1%" + +; The minimum delay between updates, in seconds +; Default Value: 1 +; Development Value: 1 +; Production Value: 1 +; http://php.net/session.upload-progress.min-freq +;session.upload_progress.min_freq = "1" + +; Only write session data when session data is changed. Enabled by default. +; http://php.net/session.lazy-write +;session.lazy_write = On + +[Assertion] +; Switch whether to compile assertions at all (to have no overhead at run-time) +; -1: Do not compile at all +; 0: Jump over assertion at run-time +; 1: Execute assertions +; Changing from or to a negative value is only possible in php.ini! (For turning assertions on and off at run-time, see assert.active, when zend.assertions = 1) +; Default Value: 1 +; Development Value: 1 +; Production Value: -1 +; http://php.net/zend.assertions +zend.assertions = -1 + +; Assert(expr); active by default. +; http://php.net/assert.active +;assert.active = On + +; Throw an AssertationException on failed assertions +; http://php.net/assert.exception +;assert.exception = On + +; Issue a PHP warning for each failed assertion. (Overridden by assert.exception if active) +; http://php.net/assert.warning +;assert.warning = On + +; Don't bail out by default. +; http://php.net/assert.bail +;assert.bail = Off + +; User-function to be called if an assertion fails. +; http://php.net/assert.callback +;assert.callback = 0 + +; Eval the expression with current error_reporting(). Set to true if you want +; error_reporting(0) around the eval(). +; http://php.net/assert.quiet-eval +;assert.quiet_eval = 0 + +[COM] +; path to a file containing GUIDs, IIDs or filenames of files with TypeLibs +; http://php.net/com.typelib-file +;com.typelib_file = + +; allow Distributed-COM calls +; http://php.net/com.allow-dcom +;com.allow_dcom = true + +; autoregister constants of a components typlib on com_load() +; http://php.net/com.autoregister-typelib +;com.autoregister_typelib = true + +; register constants casesensitive +; http://php.net/com.autoregister-casesensitive +;com.autoregister_casesensitive = false + +; show warnings on duplicate constant registrations +; http://php.net/com.autoregister-verbose +;com.autoregister_verbose = true + +; The default character set code-page to use when passing strings to and from COM objects. +; Default: system ANSI code page +;com.code_page= + +[mbstring] +; language for internal character representation. +; This affects mb_send_mail() and mbstring.detect_order. +; http://php.net/mbstring.language +;mbstring.language = Japanese + +; Use of this INI entry is deprecated, use global internal_encoding instead. +; internal/script encoding. +; Some encoding cannot work as internal encoding. (e.g. SJIS, BIG5, ISO-2022-*) +; If empty, default_charset or internal_encoding or iconv.internal_encoding is used. +; The precedence is: default_charset < internal_encoding < iconv.internal_encoding +;mbstring.internal_encoding = + +; Use of this INI entry is deprecated, use global input_encoding instead. +; http input encoding. +; mbstring.encoding_traslation = On is needed to use this setting. +; If empty, default_charset or input_encoding or mbstring.input is used. +; The precedence is: default_charset < intput_encoding < mbsting.http_input +; http://php.net/mbstring.http-input +;mbstring.http_input = + +; Use of this INI entry is deprecated, use global output_encoding instead. +; http output encoding. +; mb_output_handler must be registered as output buffer to function. +; If empty, default_charset or output_encoding or mbstring.http_output is used. +; The precedence is: default_charset < output_encoding < mbstring.http_output +; To use an output encoding conversion, mbstring's output handler must be set +; otherwise output encoding conversion cannot be performed. +; http://php.net/mbstring.http-output +;mbstring.http_output = + +; enable automatic encoding translation according to +; mbstring.internal_encoding setting. Input chars are +; converted to internal encoding by setting this to On. +; Note: Do _not_ use automatic encoding translation for +; portable libs/applications. +; http://php.net/mbstring.encoding-translation +;mbstring.encoding_translation = Off + +; automatic encoding detection order. +; "auto" detect order is changed according to mbstring.language +; http://php.net/mbstring.detect-order +;mbstring.detect_order = auto + +; substitute_character used when character cannot be converted +; one from another +; http://php.net/mbstring.substitute-character +;mbstring.substitute_character = none + +; overload(replace) single byte functions by mbstring functions. +; mail(), ereg(), etc are overloaded by mb_send_mail(), mb_ereg(), +; etc. Possible values are 0,1,2,4 or combination of them. +; For example, 7 for overload everything. +; 0: No overload +; 1: Overload mail() function +; 2: Overload str*() functions +; 4: Overload ereg*() functions +; http://php.net/mbstring.func-overload +;mbstring.func_overload = 0 + +; enable strict encoding detection. +; Default: Off +;mbstring.strict_detection = On + +; This directive specifies the regex pattern of content types for which mb_output_handler() +; is activated. +; Default: mbstring.http_output_conv_mimetype=^(text/|application/xhtml\+xml) +;mbstring.http_output_conv_mimetype= + +[gd] +; Tell the jpeg decode to ignore warnings and try to create +; a gd image. The warning will then be displayed as notices +; disabled by default +; http://php.net/gd.jpeg-ignore-warning +;gd.jpeg_ignore_warning = 0 + +[exif] +; Exif UNICODE user comments are handled as UCS-2BE/UCS-2LE and JIS as JIS. +; With mbstring support this will automatically be converted into the encoding +; given by corresponding encode setting. When empty mbstring.internal_encoding +; is used. For the decode settings you can distinguish between motorola and +; intel byte order. A decode setting cannot be empty. +; http://php.net/exif.encode-unicode +;exif.encode_unicode = ISO-8859-15 + +; http://php.net/exif.decode-unicode-motorola +;exif.decode_unicode_motorola = UCS-2BE + +; http://php.net/exif.decode-unicode-intel +;exif.decode_unicode_intel = UCS-2LE + +; http://php.net/exif.encode-jis +;exif.encode_jis = + +; http://php.net/exif.decode-jis-motorola +;exif.decode_jis_motorola = JIS + +; http://php.net/exif.decode-jis-intel +;exif.decode_jis_intel = JIS + +[Tidy] +; The path to a default tidy configuration file to use when using tidy +; http://php.net/tidy.default-config +;tidy.default_config = /usr/local/lib/php/default.tcfg + +; Should tidy clean and repair output automatically? +; WARNING: Do not use this option if you are generating non-html content +; such as dynamic images +; http://php.net/tidy.clean-output +tidy.clean_output = Off + +[soap] +; Enables or disables WSDL caching feature. +; http://php.net/soap.wsdl-cache-enabled +soap.wsdl_cache_enabled=1 + +; Sets the directory name where SOAP extension will put cache files. +; http://php.net/soap.wsdl-cache-dir +soap.wsdl_cache_dir="/tmp" + +; (time to live) Sets the number of second while cached file will be used +; instead of original one. +; http://php.net/soap.wsdl-cache-ttl +soap.wsdl_cache_ttl=86400 + +; Sets the size of the cache limit. (Max. number of WSDL files to cache) +soap.wsdl_cache_limit = 5 + +[sysvshm] +; A default size of the shared memory segment +;sysvshm.init_mem = 10000 + +[ldap] +; Sets the maximum number of open links or -1 for unlimited. +ldap.max_links = -1 + +[mcrypt] +; For more information about mcrypt settings see http://php.net/mcrypt-module-open + +; Directory where to load mcrypt algorithms +; Default: Compiled in into libmcrypt (usually /usr/local/lib/libmcrypt) +;mcrypt.algorithms_dir= + +; Directory where to load mcrypt modes +; Default: Compiled in into libmcrypt (usually /usr/local/lib/libmcrypt) +;mcrypt.modes_dir= + +[dba] +;dba.default_handler= + +[opcache] +; Determines if Zend OPCache is enabled +;opcache.enable=0 + +; Determines if Zend OPCache is enabled for the CLI version of PHP +;opcache.enable_cli=0 + +; The OPcache shared memory storage size. +;opcache.memory_consumption=64 + +; The amount of memory for interned strings in Mbytes. +;opcache.interned_strings_buffer=4 + +; The maximum number of keys (scripts) in the OPcache hash table. +; Only numbers between 200 and 100000 are allowed. +;opcache.max_accelerated_files=2000 + +; The maximum percentage of "wasted" memory until a restart is scheduled. +;opcache.max_wasted_percentage=5 + +; When this directive is enabled, the OPcache appends the current working +; directory to the script key, thus eliminating possible collisions between +; files with the same name (basename). Disabling the directive improves +; performance, but may break existing applications. +;opcache.use_cwd=1 + +; When disabled, you must reset the OPcache manually or restart the +; webserver for changes to the filesystem to take effect. +;opcache.validate_timestamps=1 + +; How often (in seconds) to check file timestamps for changes to the shared +; memory storage allocation. ("1" means validate once per second, but only +; once per request. "0" means always validate) +;opcache.revalidate_freq=2 + +; Enables or disables file search in include_path optimization +;opcache.revalidate_path=0 + +; If disabled, all PHPDoc comments are dropped from the code to reduce the +; size of the optimized code. +;opcache.save_comments=1 + +; If enabled, a fast shutdown sequence is used for the accelerated code +;opcache.fast_shutdown=0 + +; Allow file existence override (file_exists, etc.) performance feature. +;opcache.enable_file_override=0 + +; A bitmask, where each bit enables or disables the appropriate OPcache +; passes +;opcache.optimization_level=0xffffffff + +;opcache.inherited_hack=1 +;opcache.dups_fix=0 + +; The location of the OPcache blacklist file (wildcards allowed). +; Each OPcache blacklist file is a text file that holds the names of files +; that should not be accelerated. The file format is to add each filename +; to a new line. The filename may be a full path or just a file prefix +; (i.e., /var/www/x blacklists all the files and directories in /var/www +; that start with 'x'). Line starting with a ; are ignored (comments). +;opcache.blacklist_filename= + +; Allows exclusion of large files from being cached. By default all files +; are cached. +;opcache.max_file_size=0 + +; Check the cache checksum each N requests. +; The default value of "0" means that the checks are disabled. +;opcache.consistency_checks=0 + +; How long to wait (in seconds) for a scheduled restart to begin if the cache +; is not being accessed. +;opcache.force_restart_timeout=180 + +; OPcache error_log file name. Empty string assumes "stderr". +;opcache.error_log= + +; All OPcache errors go to the Web server log. +; By default, only fatal errors (level 0) or errors (level 1) are logged. +; You can also enable warnings (level 2), info messages (level 3) or +; debug messages (level 4). +;opcache.log_verbosity_level=1 + +; Preferred Shared Memory back-end. Leave empty and let the system decide. +;opcache.preferred_memory_model= + +; Protect the shared memory from unexpected writing during script execution. +; Useful for internal debugging only. +;opcache.protect_memory=0 + +; Allows calling OPcache API functions only from PHP scripts which path is +; started from specified string. The default "" means no restriction +;opcache.restrict_api= + +; Mapping base of shared memory segments (for Windows only). All the PHP +; processes have to map shared memory into the same address space. This +; directive allows to manually fix the "Unable to reattach to base address" +; errors. +;opcache.mmap_base= + +; Enables and sets the second level cache directory. +; It should improve performance when SHM memory is full, at server restart or +; SHM reset. The default "" disables file based caching. +;opcache.file_cache= + +; Enables or disables opcode caching in shared memory. +;opcache.file_cache_only=0 + +; Enables or disables checksum validation when script loaded from file cache. +;opcache.file_cache_consistency_checks=1 + +; Enables or disables copying of PHP code (text segment) into HUGE PAGES. +; This should improve performance, but requires appropriate OS configuration. +;opcache.huge_code_pages=1 + +[curl] +; A default value for the CURLOPT_CAINFO option. This is required to be an +; absolute path. +;curl.cainfo = + +[openssl] +; The location of a Certificate Authority (CA) file on the local filesystem +; to use when verifying the identity of SSL/TLS peers. Most users should +; not specify a value for this directive as PHP will attempt to use the +; OS-managed cert stores in its absence. If specified, this value may still +; be overridden on a per-stream basis via the "cafile" SSL stream context +; option. +;openssl.cafile= + +; If openssl.cafile is not specified or if the CA file is not found, the +; directory pointed to by openssl.capath is searched for a suitable +; certificate. This value must be a correctly hashed certificate directory. +; Most users should not specify a value for this directive as PHP will +; attempt to use the OS-managed cert stores in its absence. If specified, +; this value may still be overridden on a per-stream basis via the "capath" +; SSL stream context option. +;openssl.capath= + +; Local Variables: +; tab-width: 4 +; End: diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/templates/ports.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/templates/ports.conf new file mode 100644 index 0000000000000000000000000000000000000000..18b410cd196eefd6ef3cd053d1d703df34f72e82 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/templates/ports.conf @@ -0,0 +1,15 @@ +%if %%activer_apache == 'non' +#apache desactivated +%else +%if %%container_ip_web != '127.0.0.1' +#http +Listen %%container_ip_web:80 +#https +Listen %%container_ip_web:443 +%else +#http +Listen %%adresse_ip_eth0:80 +#https +Listen %%adresse_ip_eth0:443 +%end if +%end if \ No newline at end of file diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/templates/remoteip.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/templates/remoteip.conf new file mode 100644 index 0000000000000000000000000000000000000000..582b2e528eb5243a1ab8dff204f91044bcec3441 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-web/templates/remoteip.conf @@ -0,0 +1,2 @@ +RemoteIPHeader X-Forwarded-For +RemoteIPInternalProxy %%web_behind_revproxy_ip diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-workstation-binaries/dictionaries/00_eole-workstation-binaries_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-workstation-binaries/dictionaries/00_eole-workstation-binaries_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..c5cb5859ee2051179a042ca351fb360b5fedcf85 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-workstation-binaries/dictionaries/00_eole-workstation-binaries_packages.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>eole-workstation-joineole</package> + <package>eole-workstation-minion</package> + <package>eole-workstation-formula</package> + <package>eole-workstation-veyon</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-workstation-binaries/dictionaries/30_workstation_binaries_http.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-workstation-binaries/dictionaries/30_workstation_binaries_http.xml new file mode 100644 index 0000000000000000000000000000000000000000..1a4d204f37702a6a64580e0342df81fd366335b4 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-workstation-binaries/dictionaries/30_workstation_binaries_http.xml @@ -0,0 +1,47 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + <!-- apache --> + <file name='/etc/apache2/sites-available/workstation.conf' source='workstation.apache.conf' rm='True' filelist='workstation_apache' /> + <service method='apache' servicelist='workstation_apache'>workstation</service> + <!-- nginx --> + <file name='/etc/nginx/http.d/workstation.conf' source='workstation.nginx.conf' rm='True' mkdir='True' filelist='workstation_nginx' /> + <file name='/etc/nginx/sites-enabled/workstation_apache.conf' source='workstation.apache_nginx.conf' rm='True' filelist='workstation_nginx' /> + <service_access service='apache_nginx'> + <port>80</port> + </service_access> + </files> + + <variables> + <family name='services'> + <variable name='workstation_http_server' type='string' description='Détermine le serveur HTTP à utiliser'/> + </family> + </variables> + + <constraints> + <auto name='calc_multi_condition' target='workstation_http_server'> + <param>['non', 'oui']</param> + <param type='eole' name='condition_1'>mode_conteneur_actif</param> + <!-- activer_apache should be defined (cf. workaround in 29_genconfig.xml) --> + <param type='eole' name='condition_2'>activer_apache</param> + <param name='match'>apache</param> + <param name='mismatch'>nginx</param> + </auto> + <condition name='disabled_if_not_in' source='workstation_http_server'> + <param>apache</param> + <target type='filelist'>workstation_apache</target> + <target type='servicelist'>workstation_apache</target> + </condition> + <condition name='disabled_if_not_in' source='workstation_http_server'> + <param>nginx</param> + <target type='filelist'>workstation_nginx</target> + </condition> + </constraints> + + <help> + </help> + +</creole> + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-workstation-binaries/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-workstation-binaries/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..ae7b527a1bae790dd95ab1f11c93ccc801b0e1fa --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-workstation-binaries/service.yml @@ -0,0 +1,30 @@ +format: '0.1' +name: eole-workstation-binaries +version: |- + 2.7.1-8 +description: |- + Provides executable files for eole-workstation + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: [] +packages: + - eole-workstation-joineole + - eole-workstation-minion + - eole-workstation-formula + - eole-workstation-veyon +dictionaries: + - 30_workstation_binaries_http.xml +extra_dictionaries: {} +templates: + - workstation.apache.conf + - workstation.apache_nginx.conf + - workstation.nginx.conf +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: [] +files: {} +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-workstation-binaries/templates/workstation.apache.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-workstation-binaries/templates/workstation.apache.conf new file mode 100644 index 0000000000000000000000000000000000000000..00947616e4e963f7289826e4f37d8db757b0c9fb --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-workstation-binaries/templates/workstation.apache.conf @@ -0,0 +1,6 @@ +Alias /joineole /usr/share/eole/workstation + +<Directory /usr/share/eole/workstation> + Options Indexes + Require all granted +</Directory> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-workstation-binaries/templates/workstation.apache_nginx.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-workstation-binaries/templates/workstation.apache_nginx.conf new file mode 100644 index 0000000000000000000000000000000000000000..8c1b5c298a2c5308d46e54015c884410f3912cc8 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-workstation-binaries/templates/workstation.apache_nginx.conf @@ -0,0 +1,5 @@ +# Configuration for workstation binaries +server { + listen 80; + include http.d/workstation.conf; +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-workstation-binaries/templates/workstation.nginx.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-workstation-binaries/templates/workstation.nginx.conf new file mode 100644 index 0000000000000000000000000000000000000000..03a857acb429443383633859934bbf1a2d3b3d95 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-workstation-binaries/templates/workstation.nginx.conf @@ -0,0 +1,5 @@ +location /joineole { + alias /usr/share/eole/workstation; + autoindex on; + allow all; +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-workstation-manager/dictionaries/00_eole-workstation-manager_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-workstation-manager/dictionaries/00_eole-workstation-manager_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..7b6b68c1df6f18a868a296d2a5fbd8a58573f7e9 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-workstation-manager/dictionaries/00_eole-workstation-manager_packages.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>salt-master</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-workstation-manager/dictionaries/20_workstation_manager.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-workstation-manager/dictionaries/20_workstation_manager.xml new file mode 100644 index 0000000000000000000000000000000000000000..0c57cda114b4d44675516a0da0d732761bdd3f38 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-workstation-manager/dictionaries/20_workstation_manager.xml @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + <file filelist="workstation-manager" name="/etc/salt/master.d/workstation-manager.conf"/> + <file filelist="workstation-manager" name="/usr/share/eole/saltstack/pillar/eole-workstation.sls" rm='True' /> + <service servicelist="workstation-manager">eole-workstation-manager</service> + + <service_access service='eole-workstation-manager'> + <port>4505</port> + <port>4506</port> + </service_access> + + </files> + + <variables> + <family name="services"> + <variable name="activer_workstation_manager" type="oui/non" description="Activer le service de gestion des postes clients"> + <value>oui</value> + </variable> + </family> + + <separators> + </separators> + </variables> + + <constraints> + <condition name='disabled_if_in' source='activer_workstation_manager'> + <param>non</param> + <target type='servicelist'>workstation-manager</target> + <target type='filelist'>workstation-manager</target> + </condition> + </constraints> + + <help> + <variable name="activer_workstation_manager">Le service de gestion des postes clients utilise SaltStack</variable> + </help> + +</creole> + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-workstation-manager/files/lib/systemd/system/eole-workstation-manager.service b/seed/release/eole-2.7/2.7.1/applicationservice/eole-workstation-manager/files/lib/systemd/system/eole-workstation-manager.service new file mode 100644 index 0000000000000000000000000000000000000000..d62116969da63a6f49468e2e478e95258d90351d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-workstation-manager/files/lib/systemd/system/eole-workstation-manager.service @@ -0,0 +1,19 @@ +[Unit] +Description=The Salt Master Server for workstation manager +Documentation=man:salt-master(1) file:///usr/share/doc/salt/html/contents.html https://docs.saltstack.com/en/latest/contents.html +After=network.target + +[Service] +LimitNOFILE=100000 +Type=notify +NotifyAccess=all +ExecStart=/usr/bin/salt-master +User=root +Group=root +CacheDirectory=salt/master +RuntimeDirectory=salt +StateDirectory=salt/pki/master +SyslogIdentifier=eole-workstation-manager + +[Install] +WantedBy=multi-user.target diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-workstation-manager/files/usr/share/eole/saltstack/pillar/top.sls b/seed/release/eole-2.7/2.7.1/applicationservice/eole-workstation-manager/files/usr/share/eole/saltstack/pillar/top.sls new file mode 100644 index 0000000000000000000000000000000000000000..c668addffcc9acf034b40ca1682d84e349811497 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-workstation-manager/files/usr/share/eole/saltstack/pillar/top.sls @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +# Static top pillar file for EOLE workstation formula + +base: + 'G@os_family:Windows': + - eole-workstation diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-workstation-manager/files/usr/share/eole/saltstack/salt/top.sls b/seed/release/eole-2.7/2.7.1/applicationservice/eole-workstation-manager/files/usr/share/eole/saltstack/salt/top.sls new file mode 100644 index 0000000000000000000000000000000000000000..df9ba17a7d10ff632bae6de1524fa77ef10a9401 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-workstation-manager/files/usr/share/eole/saltstack/salt/top.sls @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +# Static top file for EOLE workstation formula + +base: + 'G@os_family:Windows': + - eole-workstation diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-workstation-manager/postservices/30-eole-workstation-manager b/seed/release/eole-2.7/2.7.1/applicationservice/eole-workstation-manager/postservices/30-eole-workstation-manager new file mode 100644 index 0000000000000000000000000000000000000000..4332813b8eff9817e4befcc643b1c80cd131fd61 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-workstation-manager/postservices/30-eole-workstation-manager @@ -0,0 +1,80 @@ +#!/bin/bash + +. /usr/lib/eole/ihm.sh + +if [ -f /etc/eole/samba4-vars.conf ];then + . /etc/eole/samba4-vars.conf + [ "$(CreoleGet ad_server_role)" == "controleur de domaine" ] || exit 0 + # Seth DC + SALT_IP=$AD_HOST_IP + SSH_EXEC="eval" +elif [ -f /usr/lib/eole/eolead.sh ];then + . /usr/lib/eole/eolead.sh + # ScribeAD/HorusAD + . $CONTAINER_ROOTFS/etc/eole/samba4-vars.conf + AD_HOST_IP=$CONTAINER_IP + SALT_IP=$(CreoleGet adresse_ip_eth0) + SSH_EXEC="ssh -t -q -o LogLevel=ERROR -o StrictHostKeyChecking=no root@$CONTAINER_IP" +else + exit 0 +fi + +SALT_ADDR=$(dig @$AD_HOST_IP salt.$AD_REALM +short) +if [ "$SALT_ADDR" != "$SALT_IP" ] +then + + if [ -n "$SALT_ADDR" ]; then + EchoOrange "Attention : Le nom d'hôte \"salt\" est résolu en $SALT_ADDR alors qu'il devrait être en $SALT_IP" + else + echo -n "Résolution du nom d'hôte \"salt\" en $SALT_IP : " + $SSH_EXEC "kinit ${AD_HOST_NAME^^}@${AD_REALM^^} -k -t $AD_HOST_KEYTAB_FILE" + $SSH_EXEC "samba-tool dns add $AD_HOST_NAME.$AD_REALM $AD_REALM salt A $SALT_IP -k 1" + $SSH_EXEC "kdestroy" + echo + + fi +fi + +PRIVATE_DIR=/etc/eole/private +MANAGER_PASSWORD_FILE="${PRIVATE_DIR}/eole-workstation-manager.password" +READER_PASSWORD_FILE="${PRIVATE_DIR}/eole-workstation-reader.password" + +user_exists() { + local username="${1}" + $SSH_EXEC "samba-tool user show '${username}'" > /dev/null 2>&1 +} + +if [ ! -s "${MANAGER_PASSWORD_FILE}" ] +then + EchoRouge "Le fichier de mot de passe '${MANAGER_PASSWORD_FILE}' n’existe pas" +else + MANAGER_PASSWORD=$(cat "${MANAGER_PASSWORD_FILE}") + if ! user_exists eole-workstation-manager + then + echo "Ajout du compte de jonction au domaine 'eole-workstation-manager'... " + $SSH_EXEC "samba-tool user create --random-password eole-workstation-manager" + fi + + echo "Mise en conformité de l’utilisateur 'eole-workstation-manager'... " + $SSH_EXEC "samba-tool user setexpiry eole-workstation-manager --noexpiry" + $SSH_EXEC "samba-tool group addmembers 'Domain Admins' eole-workstation-manager" + $SSH_EXEC "samba-tool user setpassword eole-workstation-manager --newpassword='${MANAGER_PASSWORD}'" +fi + +if [ ! -s "${READER_PASSWORD_FILE}" ] +then + EchoRouge "Le fichier de mot de passe '${READER_PASSWORD_FILE}' n’existe pas" +else + READER_PASSWORD=$(cat "${READER_PASSWORD_FILE}") + if ! user_exists eole-workstation-reader + then + echo "Ajout du compte de lecture 'eole-workstation-reader'... " + $SSH_EXEC "samba-tool user create --random-password eole-workstation-reader" + fi + + echo "Mise en conformité de l’utilisateur 'eole-workstation-reader'... " + $SSH_EXEC "samba-tool user setexpiry eole-workstation-reader --noexpiry" + $SSH_EXEC "samba-tool user setpassword eole-workstation-reader --newpassword='${READER_PASSWORD}'" +fi + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-workstation-manager/pretemplates/30-eole-workstation-manager b/seed/release/eole-2.7/2.7.1/applicationservice/eole-workstation-manager/pretemplates/30-eole-workstation-manager new file mode 100644 index 0000000000000000000000000000000000000000..d35ede116182045f593e1cd11648d69260d55f55 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-workstation-manager/pretemplates/30-eole-workstation-manager @@ -0,0 +1,29 @@ +#!/bin/bash +set -e + +PRIVATE_DIR=/etc/eole/private + +# Permit to join workstation to the domain +MANAGER_PASS_FILE="${PRIVATE_DIR}/eole-workstation-manager.password" + +# Lookup information in Active Directory +READER_PASS_FILE="${PRIVATE_DIR}/eole-workstation-reader.password" + +if [ ! -d "${PRIVATE_DIR}" ] +then + mkdir -p "${PRIVATE_DIR}" + chmod 700 "${PRIVATE_DIR}" +fi + +# Reset password at each reconfigure +pwgen -scn1 42 > "${MANAGER_PASS_FILE}" +chmod 700 "${MANAGER_PASS_FILE}" + +if [ ! -s "${READER_PASS_FILE}" ] +then + # Long time password + pwgen -scn1 42 > "${READER_PASS_FILE}" +fi +chmod 700 "${READER_PASS_FILE}" + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-workstation-manager/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-workstation-manager/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..4edb2b32f8d4c13ea0cd533aa3044a542f9e9d6c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-workstation-manager/service.yml @@ -0,0 +1,40 @@ +format: '0.1' +name: eole-workstation-manager +version: |- + 2.7.1-10 +description: |- + SaltMaster server for workstation management + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: [] +packages: + - salt-master +dictionaries: + - 20_workstation_manager.xml +extra_dictionaries: {} +templates: + - eole-workstation.sls + - workstation-manager.conf +creole_funcs: [] +preservices: [] +postservices: + - 30-eole-workstation-manager +pretemplates: + - 30-eole-workstation-manager +posttemplates: [] +files: + /lib/systemd/system/eole-workstation-manager.service: + owner: root + group: root + mode: '0644' + /usr/share/eole/saltstack/pillar/top.sls: + owner: root + group: root + mode: '0644' + /usr/share/eole/saltstack/salt/top.sls: + owner: root + group: root + mode: '0644' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-workstation-manager/templates/eole-workstation.sls b/seed/release/eole-2.7/2.7.1/applicationservice/eole-workstation-manager/templates/eole-workstation.sls new file mode 100644 index 0000000000000000000000000000000000000000..da036f5fa24a35a45b293a9b863f705633d91aa8 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-workstation-manager/templates/eole-workstation.sls @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +%set %%basedn = 'dc=' + %%custom_join(%%ad_domain.split('.'), ',dc=') + +eole-workstation: + + ad: + + domain: %%ad_domain + join_username: eole-workstation-manager + join_password: %include '/etc/eole/private/eole-workstation-manager.password' + + veyon: + + ldap: + + server: addc.%%ad_domain + port: 389 + base_dn: %%basedn + username: %%smb_workgroup\eole-workstation-reader + password: %include '/etc/eole/private/eole-workstation-reader.password' diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-workstation-manager/templates/workstation-manager.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-workstation-manager/templates/workstation-manager.conf new file mode 100644 index 0000000000000000000000000000000000000000..f6b5ced3f70ea44ad366d26aefa5ecf2bdfe24ed --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-workstation-manager/templates/workstation-manager.conf @@ -0,0 +1,49 @@ +#Tune salt-master for eole-workstation-manager +# + +# The user under which the salt master will run. Salt will update all +# permissions to allow the specified user to run the master. The exception is +# the job cache, which must be deleted if this user is changed. If the +# modified files cause conflicts, set verify_env to False. +user: root + +# The hash_type is the hash to use when discovering the hash of a file on +# the master server. The default is md5 but sha1, sha224, sha256, sha384 +# and sha512 are also supported. +# +# WARNING: While md5 is supported, do not use it due to the high chance +# of possible collisions and thus security breach. +# +# Prior to changing this value, the master should be stopped and all Salt +# caches should be cleared. +hash_type: sha256 + +########################################## +##### Logging settings ##### +########################################## +# The location of the master log file +# The master log can be sent to a regular file, local path name, or network +# location. Remote logging works best when configured to use rsyslogd(8) (e.g.: +# ``file:///dev/log``), with rsyslogd(8) configured for network logging. The URI +# format is: <file|udp|tcp>://<host|socketpath>:<port-if-required>/<log-facility> +#log_file: /var/log/salt/master +#log_file: file:///dev/log +#log_file: udp://loghost:10514 +log_file: file:///dev/log +#log_fmt_logfile: '%(asctime)s,%(msecs)03.0f [%(name)-17s][%(levelname)-8s] %(message)s' +log_fmt_logfile: 'eole-workstation-manager[%(name)-17s][%(levelname)-8s] %(message)s' + +file_roots: + base: + - /srv/salt + - /usr/share/eole/saltstack/salt + +pillar_roots: + base: + - /srv/pillar + - /usr/share/eole/saltstack/pillar + +# Configure pkg repository for Windows machines +winrepo_remotes: [] +winrepo_remotes_ng: [] +winrepo_dir_ng: /usr/share/eole/saltstack/salt/win/repo-ng diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpad/dictionaries/00_eole-wpad_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpad/dictionaries/00_eole-wpad_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..ecdf1a7299a4f42e7bc0e0c8f8e01b6fd8c38688 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpad/dictionaries/00_eole-wpad_packages.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>nginx-full</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpad/dictionaries/24_wpad.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpad/dictionaries/24_wpad.xml new file mode 100644 index 0000000000000000000000000000000000000000..399d4f96bfe9c1d7af9df93a8910b79c690bb916 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpad/dictionaries/24_wpad.xml @@ -0,0 +1,194 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + <files> + <!-- le service nginx est déclaré dans 28_eoleflask.xml --> + <service_access service='nginx'> + <port service_accesslist="wpad">80</port> + </service_access> + <file filelist="wpad" name='/etc/nginx/sites-enabled/wpad' source='nginx.wpad' rm="True"/> + <file filelist='wpad' name="/var/www/wpad.eth0" mode='644' mkdir='True' rm="True"/> + <file filelist='wpad' name="/var/www/wpad.eth1" mode='644' mkdir='True' rm="True"/> + <file filelist='wpad' name="/var/www/wpad.eth2" mode='644' mkdir='True' rm="True"/> + <file filelist='wpad' name="/var/www/wpad.eth3" mode='644' mkdir='True' rm="True"/> + <file filelist='wpad' name="/var/www/wpad.eth4" mode='644' mkdir='True' rm="True"/> + </files> + + <variables> + <family name='services'> + <variable name='activer_wpad' type="oui/non" description="Activer le support de WPAD"> + <value>oui</value> + </variable> + </family> + <family name='wpad' icon='code-fork'> + <variable name="wpad_domains" type="domain_strict" description="Nom de domaine du service WPAD" mandatory="True" multi="True"/> + </family> + + <family name='Interface-0'> + <variable name="wpad_proxyport_eth0" type="port" description="Port du proxy diffusé par WPAD" mode="expert" mandatory="True"> + <value>3128</value> + </variable> + <variable name="wpad_proxyport_vlan_eth0" type="port" description="Port du proxy diffusé par WPAD pour ce VLAN" mode="expert" mandatory="True"/> + <variable name="wpad_proxyport_alias_eth0" type="port" description="Port du proxy diffusé par WPAD pour cet alias" mode="expert" mandatory="True"/> + </family> + <family name='Interface-1'> + <variable name="wpad_proxyport_eth1" type="port" description="Port du proxy diffusé par WPAD" mode="expert" mandatory="True"> + <value>3128</value> + </variable> + <variable name="wpad_proxyport_vlan_eth1" type="port" description="Port du proxy diffusé par WPAD pour ce VLAN" mode="expert" mandatory="True"/> + <variable name="wpad_proxyport_alias_eth1" type="port" description="Port du proxy diffusé par WPAD pour cet alias" mode="expert" mandatory="True"/> + </family> + <family name='Interface-2'> + <variable name="wpad_proxyport_eth2" type="port" description="Port du proxy diffusé par WPAD" mode="expert" mandatory="True"> + <value>3128</value> + </variable> + <variable name="wpad_proxyport_vlan_eth2" type="port" description="Port du proxy diffusé par WPAD pour ce VLAN" mode="expert" mandatory="True"/> + <variable name="wpad_proxyport_alias_eth2" type="port" description="Port du proxy diffusé par WPAD pour cet alias" mode="expert" mandatory="True"/> + </family> + <family name='Interface-3'> + <variable name="wpad_proxyport_eth3" type="port" description="Port du proxy diffusé par WPAD" mode="expert" mandatory="True"> + <value>3128</value> + </variable> + <variable name="wpad_proxyport_vlan_eth3" type="port" description="Port du proxy diffusé par WPAD pour ce VLAN" mode="expert" mandatory="True"/> + <variable name="wpad_proxyport_alias_eth3" type="port" description="Port du proxy diffusé par WPAD pour cet alias" mode="expert" mandatory="True"/> + </family> + <family name='Interface-4'> + <variable name="wpad_proxyport_eth4" type="port" description="Port du proxy diffusé par WPAD" mode="expert" mandatory="True"> + <value>3128</value> + </variable> + <variable name="wpad_proxyport_vlan_eth4" type="port" description="Port du proxy diffusé par WPAD pour ce VLAN" mode="expert" mandatory="True"/> + <variable name="wpad_proxyport_alias_eth4" type="port" description="Port du proxy diffusé par WPAD pour cet alias" mode="expert" mandatory="True"/> + </family> + + <family name='exceptions proxy'> + <!-- exceptions localHostOrDomainIs --> + <variable name='nom_host_wpad_exclude' type='string' description="Ne pas passer par le proxy pour l'hôte ou le domaine" multi="True"/> + <variable name='nom_host_interface_wpad_exclude' type='string' description="Interface(s) concernée(s)"/> + </family> + + <separators> + <separator name='nom_host_wpad_exclude'>Exceptions d'hôte ou de domaine spécifiques à WPAD</separator> + <separator name='wpad_proxyport_eth0'>Configuration de la détection automatique du proxy</separator> + <separator name='wpad_proxyport_eth1'>Configuration de la détection automatique du proxy</separator> + <separator name='wpad_proxyport_eth2'>Configuration de la détection automatique du proxy</separator> + <separator name='wpad_proxyport_eth3'>Configuration de la détection automatique du proxy</separator> + <separator name='wpad_proxyport_eth4'>Configuration de la détection automatique du proxy</separator> + </separators> + </variables> + + <constraints> + <check name='valid_enum' target='nom_host_interface_wpad_exclude'> + <param>['Toutes','1','2','3','4']</param> + </check> + <condition name='disabled_if_not_in' source='nombre_interfaces' > + <param>2</param> + <param>3</param> + <param>4</param> + <param>5</param> + <target type='variable'>nom_host_interface_wpad_exclude</target> + </condition> + <condition name='disabled_if_not_in' source='activer_wpad'> + <param>oui</param> + <target type='filelist'>wpad</target> + <target type='service_accesslist'>wpad</target> + <target type='family'>wpad</target> + <target type='variable'>wpad_proxyport_eth0</target> + <target type='variable'>wpad_proxyport_vlan_eth0</target> + <target type='variable'>wpad_proxyport_alias_eth0</target> + <target type='variable'>wpad_proxyport_eth1</target> + <target type='variable'>wpad_proxyport_vlan_eth1</target> + <target type='variable'>wpad_proxyport_alias_eth1</target> + <target type='variable'>wpad_proxyport_eth2</target> + <target type='variable'>wpad_proxyport_vlan_eth2</target> + <target type='variable'>wpad_proxyport_alias_eth2</target> + <target type='variable'>wpad_proxyport_eth3</target> + <target type='variable'>wpad_proxyport_vlan_eth3</target> + <target type='variable'>wpad_proxyport_alias_eth3</target> + <target type='variable'>wpad_proxyport_eth4</target> + <target type='variable'>wpad_proxyport_vlan_eth4</target> + <target type='variable'>wpad_proxyport_alias_eth4</target> + <target type='variable'>nom_host_wpad_exclude</target> + <target type='variable'>nom_host_interface_wpad_exclude</target> + </condition> + <condition name='disabled_if_not_in' source='nombre_interfaces' > + <param>1</param> + <target type='variable'>wpad_proxyport_eth0</target> + <target type='variable'>wpad_proxyport_vlan_eth0</target> + <target type='variable'>wpad_proxyport_alias_eth0</target> + </condition> + <group master='nom_host_wpad_exclude'> + <slave>nom_host_interface_wpad_exclude</slave> + </group> + <group master='vlan_id_eth0'> + <slave>wpad_proxyport_vlan_eth0</slave> + </group> + <group master='alias_ip_eth0'> + <slave>wpad_proxyport_alias_eth0</slave> + </group> + <group master='vlan_id_eth1'> + <slave>wpad_proxyport_vlan_eth1</slave> + </group> + <group master='alias_ip_eth1'> + <slave>wpad_proxyport_alias_eth1</slave> + </group> + <group master='vlan_id_eth2'> + <slave>wpad_proxyport_vlan_eth2</slave> + </group> + <group master='alias_ip_eth2'> + <slave>wpad_proxyport_alias_eth2</slave> + </group> + <group master='vlan_id_eth3'> + <slave>wpad_proxyport_vlan_eth3</slave> + </group> + <group master='alias_ip_eth3'> + <slave>wpad_proxyport_alias_eth3</slave> + </group> + <group master='vlan_id_eth4'> + <slave>wpad_proxyport_vlan_eth4</slave> + </group> + <group master='alias_ip_eth4'> + <slave>wpad_proxyport_alias_eth4</slave> + </group> + <fill name='calc_val' target='wpad_domains'> + <param type='eole' name='valeur'>nom_domaine_local</param> + </fill> + <fill name='calc_val' target='wpad_proxyport_vlan_eth0'> + <param type='eole' name='valeur'>wpad_proxyport_eth0</param> + </fill> + <fill name='calc_val' target='wpad_proxyport_alias_eth0'> + <param type='eole' name='valeur'>wpad_proxyport_eth0</param> + </fill> + <fill name='calc_val' target='wpad_proxyport_vlan_eth1'> + <param type='eole' name='valeur'>wpad_proxyport_eth1</param> + </fill> + <fill name='calc_val' target='wpad_proxyport_alias_eth1'> + <param type='eole' name='valeur'>wpad_proxyport_eth1</param> + </fill> + <fill name='calc_val' target='wpad_proxyport_vlan_eth2'> + <param type='eole' name='valeur'>wpad_proxyport_eth2</param> + </fill> + <fill name='calc_val' target='wpad_proxyport_alias_eth2'> + <param type='eole' name='valeur'>wpad_proxyport_eth2</param> + </fill> + <fill name='calc_val' target='wpad_proxyport_vlan_eth3'> + <param type='eole' name='valeur'>wpad_proxyport_eth3</param> + </fill> + <fill name='calc_val' target='wpad_proxyport_alias_eth3'> + <param type='eole' name='valeur'>wpad_proxyport_eth3</param> + </fill> + <fill name='calc_val' target='wpad_proxyport_vlan_eth4'> + <param type='eole' name='valeur'>wpad_proxyport_eth4</param> + </fill> + <fill name='calc_val' target='wpad_proxyport_alias_eth4'> + <param type='eole' name='valeur'>wpad_proxyport_eth4</param> + </fill> + </constraints> + + <help> + <family name='wpad'>Paramètrage de la découverte automatique du proxy</family> + <variable name='activer_wpad'>WPAD est un protocole qui permet la découverte automatique du proxy par les navigateurs</variable> + <variable name='nom_host_wpad_exclude'>Les exclusions associées sont générées avec la fonction localHostOrDomainIs()</variable> + </help> +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpad/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpad/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..70892fc994fc6d7d4ee74be23d42ee0778bb4dc3 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpad/service.yml @@ -0,0 +1,34 @@ +format: '0.1' +name: eole-wpad +version: |- + 2.7.1-1 +description: |- + Templates et dictionnaires pour la fonctionnalité WPAD + Configuration de la distribution des fichiers WPAD + sur les modules EOLE + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: + - eole-proxy-bypass +packages: + - nginx-full +dictionaries: + - 24_wpad.xml +extra_dictionaries: {} +templates: + - nginx.wpad + - wpad.eth0 + - wpad.eth1 + - wpad.eth2 + - wpad.eth3 + - wpad.eth4 + - wpad.tmpl +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: [] +files: {} +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpad/templates/nginx.wpad b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpad/templates/nginx.wpad new file mode 100644 index 0000000000000000000000000000000000000000..0ae6902d65b42d72367164014e21f1d23dd651aa --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpad/templates/nginx.wpad @@ -0,0 +1,155 @@ +%def gen_geo_zone(%%nb_zone) + %%getVar('adresse_network_eth' + %%nb_zone)/%%calc_classe(%%getVar('adresse_netmask_eth' + %%nb_zone)) eth%%nb_zone; + %if %%getVar('vlan_eth' + %%nb_zone) == 'oui' + %for %%vlan in %%getVar('vlan_id_eth' + %%nb_zone) + %set vlan_network = 'vlan_network_eth' + %%nb_zone + %set vlan_netmask = 'vlan_netmask_eth' + %%nb_zone + %%getattr(vlan, %%vlan_network)/%%calc_classe(%%getattr(vlan, %%vlan_netmask)) eth%%{nb_zone}.%%vlan; + %end for + %end if + %if %%getVar('alias_eth' + %%nb_zone) == 'oui' + %for %%idx, %%alias in %%enumerate(%%getVar('alias_ip_eth' + %%nb_zone)) + %set alias_network = 'alias_network_eth' + %%nb_zone + %set alias_netmask = 'alias_netmask_eth' + %%nb_zone + %%getattr(alias, %%alias_network)/%%calc_classe(%%getattr(alias, %%alias_netmask)) eth%%{nb_zone}:%%idx; + %end for + %end if +%end def +geo $zone_name { + default all; +%if %%nombre_interfaces == '1' +µµµµµµµµµµ squid_auth_eth0 n'existe pas dans Creole +%set global %%squid_auth_eth0=%%activer_squid_auth +%%gen_geo_zone("0") +%end if +%if %%nombre_interfaces >= "2" +%%gen_geo_zone("1") +%end if +%if %%nombre_interfaces >= "3" +%%gen_geo_zone("2") +%end if +%if %%nombre_interfaces >= "4" +%%gen_geo_zone("3") +%end if +%if %%nombre_interfaces >= "5" +%%gen_geo_zone("4") +%end if +%if %%activer_route == "oui" + #Routes statiques + %for %%indirectnet in %%route_adresse + %%indirectnet/%%calc_classe(%%indirectnet.route_netmask) eth%%indirectnet.route_int%slurp + %if %%indirectnet.route_vlan_id +.%%indirectnet.route_vlan_id%slurp + %end if +; + %end for +%end if +} + +%def gen_wpad_end_of_file(%%nb_zone, %%ip_zone, %%port_proxy) + + %if %%mode_conteneur_actif == 'oui' + %set %%ip_zone = %%getVar('adresse_ip_eth' + %%nb_zone + '_proxy_link') + %end if + %if not %%is_empty(%%ip_zone) + %if %%getVar('squid_auth_eth' + %%nb_zone, 'non') == 'oui' and %%getVar('activer_cntlm_eth' + %%nb_zone, 'non') == 'oui' + echo_after_body ' { return "PROXY %%ip_zone:3128"; }'; + %end if + echo_after_body ' return "PROXY %%ip_zone:%%port_proxy";'; + %else + echo_after_body ' return "DIRECT";'; + %end if + echo_after_body '}'; +%end def + +%def gen_wpad(%%nb_zone) + %if %%getVar('vlan_eth' + %%nb_zone) == 'oui' + %set %%vlan_net = 'vlan_network_eth' + %%nb_zone + %set %%vlan_mask = 'vlan_netmask_eth' + %%nb_zone + %for %%vlan in %%getVar('vlan_id_eth' + %%nb_zone) + location /wpad.eth%%{nb_zone}.%%vlan { + default_type application/x-ns-proxy-autoconfig; + %%gen_wpad_end_of_file(%%nb_zone, %%getattr(%%vlan, 'vlan_ip_eth' + %%nb_zone), %%getattr(%%vlan, 'wpad_proxyport_vlan_eth' + %%nb_zone)) + rewrite ^/wpad.eth%%{nb_zone}.%%vlan /wpad.eth%%{nb_zone} break; + allow %%getattr(%%vlan, %%vlan_net)/%%calc_classe(%%getattr(%%vlan, %%vlan_mask)); + %if %%activer_route == "oui" + %for %%route_iter in %%route_adresse + %if %%route_iter.route_int == %%nb_zone and %%route_iter.route_vlan_id == %%vlan + allow %%route_iter/%%calc_classe(route_iter.route_netmask); + %end if + %end for + %end if + deny all; + } + %end for + %end if + %if %%getVar('alias_eth' + %%nb_zone) == 'oui' + %set %%alias_net = 'alias_network_eth' + %%nb_zone + %set %%alias_mask = 'alias_netmask_eth' + %%nb_zone + %for %%idx, %%alias in %%enumerate(%%getVar('alias_ip_eth' + %%nb_zone)) + location /wpad.eth%%{nb_zone}:%%idx { + default_type application/x-ns-proxy-autoconfig; + %%gen_wpad_end_of_file(%%nb_zone, %%alias, %%getattr(%%alias, 'wpad_proxyport_alias_eth' + %%nb_zone)) + rewrite ^/wpad.eth%%{nb_zone}:%%idx /wpad.eth%%{nb_zone} break; + allow %%getattr(%%alias, %%alias_net)/%%calc_classe(%%getattr(%%alias, %%alias_mask)); + deny all; + } + %end for + %end if + location /wpad.eth%%{nb_zone} { + default_type application/x-ns-proxy-autoconfig; + %%gen_wpad_end_of_file(%%nb_zone, %%getVar('adresse_ip_eth' + %%nb_zone), %%getVar('wpad_proxyport_eth' + %%nb_zone)) + allow %%getVar('adresse_network_eth' + %%nb_zone)/%%calc_classe(%%getVar('adresse_netmask_eth' + %%nb_zone)); + %if %%activer_route == "oui" + %for %%indirectnet in %%route_adresse + %if %%indirectnet.route_int == 'eth' + %%nb_zone + allow %%indirectnet/%%calc_classe(%%indirectnet.route_netmask); + %end if + %end for + %end if + deny all; + } +%end def +server { + listen 80; + %for %%wpad_domain in %%wpad_domains + server_name wpad.%%wpad_domain; + %end for + server_name wpad; + %set %%is_revprox_domain_ip_eth0 = "non" + %if %%getVar('revprox_activate_http', 'non') == "oui" + %for %%revprox_domain in %%revprox_domainname + %if %%revprox_domain == %%adresse_ip_eth0 + %set %%is_revprox_domain_ip_eth0 = "oui" + %break + %end if + %end for + %end if + %if %%is_revprox_domain_ip_eth0 == "non" + server_name %%adresse_ip_eth0; + %end if + root /var/www/; + #for IE + index wpad.$zone_name; + #for firefox + rewrite ^/wpad.dat /wpad.$zone_name break; + #deny all, so wpad.all too + location / { + deny all; + } +%if %%nombre_interfaces == '1' +%%gen_wpad("0") +%end if +%if %%nombre_interfaces >= "2" +%%gen_wpad("1") +%end if +%if %%nombre_interfaces >= "3" +%%gen_wpad("2") +%end if +%if %%nombre_interfaces >= "4" +%%gen_wpad("3") +%end if +%if %%nombre_interfaces >= "5" +%%gen_wpad("4") +%end if +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpad/templates/wpad.eth0 b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpad/templates/wpad.eth0 new file mode 100644 index 0000000000000000000000000000000000000000..6baa64830bfe1965147bc2944965349f95753744 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpad/templates/wpad.eth0 @@ -0,0 +1,6 @@ +%if %%nombre_interfaces == '1' +%set global %%nb_int="0" +µµµµµµµµµµ squid_auth_eth0 n'existe pas dans Creole +%set global %%squid_auth_eth0=%%activer_squid_auth +%include "/var/lib/creole/wpad.tmpl" +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpad/templates/wpad.eth1 b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpad/templates/wpad.eth1 new file mode 100644 index 0000000000000000000000000000000000000000..50ffc9b7f81e3755480f27ded9b50b2dd1aadf26 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpad/templates/wpad.eth1 @@ -0,0 +1,2 @@ +%set global %%nb_int="1" +%include "/var/lib/creole/wpad.tmpl" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpad/templates/wpad.eth2 b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpad/templates/wpad.eth2 new file mode 100644 index 0000000000000000000000000000000000000000..5c6684ecd85eb2aac06129925bea4f89b9018ecd --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpad/templates/wpad.eth2 @@ -0,0 +1,2 @@ +%set global %%nb_int="2" +%include "/var/lib/creole/wpad.tmpl" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpad/templates/wpad.eth3 b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpad/templates/wpad.eth3 new file mode 100644 index 0000000000000000000000000000000000000000..ad7fec22c9ac7e6297f357c4ee91935d4b16ce25 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpad/templates/wpad.eth3 @@ -0,0 +1,2 @@ +%set global %%nb_int="3" +%include "/var/lib/creole/wpad.tmpl" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpad/templates/wpad.eth4 b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpad/templates/wpad.eth4 new file mode 100644 index 0000000000000000000000000000000000000000..f1b109e88d35e7ce0cb413d0efabf0561bcec3b4 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpad/templates/wpad.eth4 @@ -0,0 +1,2 @@ +%set global %%nb_int="4" +%include "/var/lib/creole/wpad.tmpl" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpad/templates/wpad.tmpl b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpad/templates/wpad.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..6bb18effac2984cb0013e3df69a6b01c30c04e07 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpad/templates/wpad.tmpl @@ -0,0 +1,111 @@ +%if %%nb_int < %%nombre_interfaces +function FindProxyForURL(url, host) { + if ( + isInNet(dnsResolve(host), "127.0.0.0", "255.255.255.0") || + isInNet(dnsResolve(host), "%%getVar('adresse_network_eth' + %%nb_int)", "%%getVar('adresse_netmask_eth' + %%nb_int)")%slurp + %for %%adresse_ip_exclude in %%getVar('proxy_bypass_network_eth' + %%nb_int, []) + || + isInNet(dnsResolve(host), "%%adresse_ip_exclude", "%%getattr(%%adresse_ip_exclude, 'proxy_bypass_netmask_eth' + %%nb_int)")%slurp + %end for + %if %%activer_route == "oui" + %for %%indirectnet in %%route_adresse + %if %%indirectnet.route_int == %%nb_int + || + isInNet(dnsResolve(host), "%%indirectnet", "%%indirectnet.route_netmask")%slurp + %end if + %end for + %end if + %if %%is_defined('proxy_bypass_domain_eth' + %%nb_int) + %for %%adresse_exclude in %%getVar('proxy_bypass_domain_eth' + %%nb_int) + || + dnsDomainIs(host, "%%adresse_exclude")%slurp + %end for + %end if + %for %%adresse_exclude in %%nom_host_wpad_exclude + %if %%getattr(%%adresse_exclude, 'nom_host_interface_wpad_exclude', '0') in ['Toutes', %%nb_int] + || + localHostOrDomainIs(host, "%%adresse_exclude")%slurp + %end if + %end for + + ) + { + return "DIRECT"; + }; + %if %%getVar('squid_auth_eth' + %%nb_int, 'non') == 'oui' and %%getVar('activer_cntlm_eth' + %%nb_int, 'non') == 'oui' +µµµµµµµµµµ support proxy noauth +%set %%domains = %%set() +%for %%domain in %%proxy_noauth_auto +%%domains.add(%%domain)%slurp +%if %%domain.startswith('.') +%%domains.add(%%domain[1:])%slurp +%end if +%end for +%for %%domain in %%proxy_noauth +%%domains.add(%%domain)%slurp +%if %%domain.startswith('.') +%%domains.add(%%domain[1:])%slurp +%end if +%end for +%set %%domains=%%list(domains) +%%domains.sort()%slurp +µµµµµµµµµµ support local network +%set %%networks = %%set() +%if %%is_defined('route_adresse') + %for %%i_route_adresse in %%route_adresse +%%networks.add((%%i_route_adresse, %%i_route_adresse.route_netmask))%slurp + %end for +%end if +%def set_interfaces(%%interface, %%networks) +%%networks.add((%%getVar('adresse_network_eth' + %%interface), %%getVar('adresse_netmask_eth' + %%interface)))%slurp + %if %%getVar('vlan_eth' + %%interface) == "oui" + %for %%vlans_iter in %%getVar('vlan_id_eth'+%%interface) + %set %%network_key = "vlan_network_eth" + %%interface + %set %%netmask_key = "vlan_netmask_eth" + %%interface +%%networks.add((%%getattr(%%vlans_iter, 'vlan_network_eth' + %%interface), %%getattr(%%vlans_iter, 'vlan_netmask_eth' + %%interface)))%slurp + %end for + %end if + %if %%getVar('alias_eth' + %%interface) == "oui" + %for %%res_alias in %%getVar('alias_ip_eth'+%%interface) +%%networks.add((%%getattr(%%res_alias, "alias_network_eth"+%%interface), %%getattr(%%res_alias, "alias_netmask_eth"+%%interface)))%slurp + %end for + %end if +%end def +%if %%nombre_interfaces == '1' +%%set_interfaces('0', %%networks)%slurp +%else +%%set_interfaces('1', %%networks)%slurp + %if %%nombre_interfaces >= "3" +%%set_interfaces('2', %%networks)%slurp + %end if + %if %%nombre_interfaces >= "4" +%%set_interfaces('3', %%networks)%slurp + %end if + %if %%nombre_interfaces >= "5" +%%set_interfaces('3', %%networks)%slurp + %end if +%end if +%set %%networks=%%list(networks) +%%networks.sort()%slurp +µµµµµµµµµµ + if ( +%for %%domain in %%domains + %if %%domain.startswith('.') + dnsDomainIs(host, "%%domain") || + %else + shExpMatch(host, "%%domain") || + %end if +%end for +%set %%len_networks = %%len(%%networks) - 1 +%for %%idx, %%network in %%enumerate(%%networks) + isInNet(dnsResolve(host), "%%network[0]", "%%network[1]")%slurp +%if %%idx < %%len_networks + || +%end if +%end for + + ) + %end if +µµµµµµµµµµ le return final doit être placé dans nginx +µµµµµµµµµµ pour un meilleur support des vlan/alias +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/dictionaries/00_eole-wpkg_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/dictionaries/00_eole-wpkg_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..5b4a32659afed9b16663e8fd2d60245fe4efd619 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/dictionaries/00_eole-wpkg_packages.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>creole</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/dictionaries/20_wpkg.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/dictionaries/20_wpkg.xml new file mode 100644 index 0000000000000000000000000000000000000000..ece8b16838c8ef7278ef660b15f6b6d33f070ab8 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/dictionaries/20_wpkg.xml @@ -0,0 +1,134 @@ +<?xml version='1.0' encoding='utf-8'?> + +<creole> + <files> + <file filelist='wpkg' name='/home/wpkg/tools/wpkg_client_install.bat'/> + <file filelist='wpkg' name='/home/wpkg/tools/wpkg_client_update_conf.bat'/> + <file filelist='wpkg' name='/home/wpkg/tools/wpkg-gp_install.bat'/> + <file filelist='wpkg' name='/home/wpkg/tools/wpkg-gp_update_conf.bat'/> + <file filelist='wpkg' name='/home/wpkg/preinstall.bat'/> + <file filelist='wpkg' name='/home/wpkg/config.xml'/> + </files> + <containers> + <container name='fichier'> + <file filelist='wpkg' name='/etc/samba/conf.d/wpkg.conf' mkdir='True'/> + </container> + </containers> + <variables> + <family name='services'> + <variable name='activer_wpkg' type='oui/non' description="Gérer la configuration WPKG"> + <value>oui</value> + </variable> + </family> + <family name='wpkg'> + <variable name='wpkg_wpkg_base' type='string' description='wpkg_base' > + <value></value> + </variable> + <variable name='wpkg_force' type='oui/non' description='Forcer la detection des paquets' > + <value>non</value> + </variable> + <variable name='wpkg_forceInstall' type='oui/non' description='Forcer la re-installation des paquets' > + <value>non</value> + </variable> + <variable name='wpkg_quitonerror' type='oui/non' description="Quitter lorsqu'une erreur apparait" > + <value>non</value> + </variable> + <variable name='wpkg_debug' type='oui/non' description='Activer le mode "debug"' > + <value>non</value> + </variable> + <variable name='wpkg_dryrun' type='oui/non' description="Activer le mode simulation (n'installe aucun package)" > + <value>non</value> + </variable> + <variable name='wpkg_quiet' type='oui/non' description='Execution silencieuse' > + <value>non</value> + </variable> + <variable name='wpkg_nonotify' type='oui/non' description="Desactive l'avertissement des changements en cours aux utilisaeurs connectes" > + <value>non</value> + </variable> + <variable name='wpkg_notificationDisplayTime' type='number' description="Duree d'affichage de l'avertissement" > + <value>10</value> + </variable> + <variable name='wpkg_noreboot' type='oui/non' description='Ne pas redemarrer automatiquement' > + <value>non</value> + </variable> + <variable name='wpkg_noRunningState' type='oui/non' description='noRunningState' > + <value>non</value> + </variable> + <variable name='wpkg_caseSensitivity' type='oui/non' description='caseSensitivity' > + <value>oui</value> + </variable> + <variable name='wpkg_rebootCmd' type='string' description='rebootCmd' > + <value>standard</value> + </variable> + <variable name='wpkg_settings_file_name' type='string' description='settings_file_name' > + <value>wpkg.xml</value> + </variable> + <variable name='wpkg_settings_file_path' type='string' description='settings_file_path' > + <value>%SystemRoot%\\system32</value> + </variable> + <variable name='wpkg_noForcedRemove' type='oui/non' description="Desactive la suppression forcee d'un paquet de la base locale" > + <value>non</value> + </variable> + <variable name='wpkg_noRemove' type='oui/non' description='Desactive la suppression des packages' > + <value>non</value> + </variable> + <variable name='wpkg_sendStatus' type='oui/non' description='sendStatus' > + <value>non</value> + </variable> + <variable name='wpkg_noUpgradeBeforeRemove' type='oui/non' description='Ne pas mettre a jour le package avant de le des-installer' > + <value>non</value> + </variable> + <variable name='wpkg_volatileReleaseMarker' type='string' description='volatileReleaseMarker' > + <value>[built-in]</value> + </variable> + <variable name='wpkg_logAppend' type='oui/non' description='logAppend' > + <value>non</value> + </variable> + <variable name='wpkg_logLevel' type='string' description='logLevel' > + <value>0xFF</value> + </variable> + <variable name='wpkg_log_file_path' type='string' description='log_file_path' > + <value>C:\\</value> + </variable> + <variable name='wpkg_logfilePattern' type='string' description='logfilePattern' > + <value>wpkg-[HOSTNAME].log</value> + </variable> + <variable name='wpkg_packages_file_name' type='string' description='packages_file_name' > + <value>packages.xml</value> + </variable> + <variable name='wpkg_profiles_file_name' type='string' description='profiles_file_name' > + <value>profiles.xml</value> + </variable> + <variable name='wpkg_hosts_file_name' type='string' description='hosts_file_name' > + <value>hosts.xml</value> + </variable> + <variable name='wpkg_web_packages_file_name' type='string' description='web_packages_file_name' > + <value>packages_xml_out.php</value> + </variable> + <variable name='wpkg_web_profiles_file_name' type='string' description='web_profiles_file_name' > + <value>profiles_xml_out.php</value> + </variable> + <variable name='wpkg_web_hosts_file_name' type='string' description='web_hosts_file_name' > + <value>hosts_xml_out.php</value> + </variable> + <variable name='wpkg_sRegPath' type='string' description='sRegPath' > + <value>SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall</value> + </variable> + <variable name='wpkg_sRegWPKG_Running' type='string' description='sRegWPKG_Running' > + <value>HKLM\\Software\\WPKG\\running</value> + </variable> + </family> + </variables> + <constraints> + <condition name='disabled_if_in' source='activer_wpkg'> + <param>non</param> + <target type='filelist'>wpkg</target> + <target type='family'>wpkg</target> + <target type='family'>wpkg client</target> + </condition> + </constraints> + <help/> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/dictionaries/20_wpkg_client.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/dictionaries/20_wpkg_client.xml new file mode 100644 index 0000000000000000000000000000000000000000..0473d33f62d6d84b161c3322335c74b4aec97718 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/dictionaries/20_wpkg_client.xml @@ -0,0 +1,142 @@ +<?xml version='1.0' encoding='utf-8'?> + +<creole> + <files> + <file filelist='wpkg' name='/home/wpkg/settings.xml'/> + <file filelist='wpkg' name='/home/wpkg/wpkg-gp.ini'/> + </files> + <variables> + <family name='wpkg client'> + <variable name='wpkg_address' type='string' description='Adresse du serveur de fichiers'/> + <variable name='wpkgcli_file' type='string' description='file'/> + <variable name='wpkgcli_parameters' type='string' description='parameters' > + <value>/synchronize /nonotify /quiet</value> + </variable> + <variable name='wpkgcli_path_user' type='string' description='path-user' /> + <variable name='wpkgcli_path_password' type='string' description='path-password' /> + <variable name='wpkgcli_net_use_machine_account' type='string' description='net-use-machine-account' > + <value>NO</value> + </variable> + <variable name='wpkgcli_exec_user' type='string' description='exec-user' > + <value>SYSTEM</value> + </variable> + <variable name='wpkgcli_exec_password' type='string' description='exec-password' /> + <variable name='wpkgcli_silent' type='string' description='silent' > + <value>YES</value> + </variable> + + <variable name='wpkgcli_script_variable_name' type='string' description='script-variable (name)' multi='True' > + <value>SOFTWARE</value> + </variable> + <variable name='wpkgcli_script_variable_val' type='string' description='script-variable (value)' /> + <variable name='wpkgcli_pre_action' type='string' description='pre-action' /> + <variable name='wpkgcli_post_action' type='string' description='post-action' /> + <variable name='wpkgcli_show_GUI' type='string' description='show-GUI' > + <value>NO</value> + </variable> + + <variable name='wpkgcli_run_on_shutdown' type='string' description='run-on-shutdown' > + <value>NO</value> + </variable> + <variable name='wpkgcli_logon_delay' type='number' description='logon-delay' > + <value>1</value> + </variable> + <variable name='wpkgcli_shutdown_delay' type='number' description='shutdown-delay' > + <value>10</value> + </variable> + <variable name='wpkgcli_logon_interrupt_password' type='string' description='logon-interrupt-password' /> + <variable name='wpkgcli_logon_message_title' type='string' description='logon-message-title' > + <value>Déploiement d'application WPKG</value> + </variable> + <variable name='wpkgcli_logon_message_logo_picture' type='string' description='logon-message-logo-picture' /> + <variable name='wpkgcli_logon_message_1' type='string' description='logon-message-1' > + <value>WPKG installe les applications et applique les paramètres...</value> + </variable> + <variable name='wpkgcli_logon_message_2' type='string' description='logon-message-2' > + <value>Veuillez patienter et ne pas redémarrer votre ordinateur...</value> + </variable> + + <variable name='wpkgcli_priority' type='string' description='priority' > + <value>normal</value> + </variable> + <variable name='wpkgcli_stop_service_after_done' type='string' description='stop-service-after-done' > + <value>YES</value> + </variable> + <variable name='wpkgcli_log_file' type='string' description='log-file' /> + + <variable name='wpkgcli_laptop_mode' type='string' description='laptop-mode' > + <value>NO</value> + </variable> + <variable name='wpkgcli_server_connecting_method' type='string' description='server-connecting-method' > + <value>standard</value> + </variable> + <variable name='wpkgcli_server_connecting_ip' type='string' description='server-connecting-ip' /> + <variable name='wpkgcli_server_connecting_timeout' type='number' description='server-connecting-timeout' > + <value>3</value> + </variable> + <variable name='wpkgcli_server_connecting_script_file' type='string' description='server-connecting-script-file' /> + <variable name='wpkgcli_server_connecting_script_timeout' type='number' description='server-connecting-script-timeout' > + <value>3</value> + </variable> + </family> + <separators> + <separator name='wpkgcli_file'>Path, users</separator> + <separator name='wpkgcli_script_variable_name'>Variables, actions</separator> + <separator name='wpkgcli_run_on_shutdown'>Logon settings</separator> + <separator name='wpkgcli_priority'>Misc settings</separator> + <separator name='wpkgcli_laptop_mode'>Offline mode settings</separator> + </separators> + </variables> + <constraints> + <auto name='calc_multi_condition' target='wpkg_address'> + <param>non</param> + <param type='eole' name='condition_1'>mode_conteneur_actif</param> + <param type='eole' name='match'>adresse_ip_eth0</param> + <param type='eole' name='mismatch' hidden='False'>adresse_ip_fichier_link</param> + </auto> + <fill name="concat" target='wpkgcli_file'> + <param name='valeur1'>\\</param> + <param type='eole' name='valeur2'>wpkg_address</param> + <param name='valeur3'>\wpkg\wpkg.js</param> + </fill> + <fill name="concat" target='wpkgcli_script_variable_val'> + <param name='valeur1'>\\</param> + <param type='eole' name='valeur2'>wpkg_address</param> + <param name='valeur3'>\wpkg\softwares</param> + </fill> + <fill name="concat" target='wpkgcli_pre_action'> + <param name='valeur1'>\\</param> + <param type='eole' name='valeur2'>wpkg_address</param> + <param name='valeur3'>\wpkg\tools\preinstall.bat</param> + </fill> + <fill name="concat" target='wpkgcli_post_action'> + <param name='valeur1'>\\</param> + <param type='eole' name='valeur2'>wpkg_address</param> + <param name='valeur3'>\wpkg\tools\postinstall.bat</param> + </fill> + + <check name='valid_enum' target='wpkgcli_net_use_machine_account'> + <param>['YES','NO']</param> + </check> + <check name='valid_enum' target='wpkgcli_silent'> + <param>['YES','NO']</param> + </check> + <check name='valid_enum' target='wpkgcli_show_GUI'> + <param>['YES','NO']</param> + </check> + <check name='valid_enum' target='wpkgcli_stop_service_after_done'> + <param>['YES','NO']</param> + </check> + <check name='valid_enum' target='wpkgcli_laptop_mode'> + <param>['YES','NO']</param> + </check> + <check name='valid_enum' target='wpkgcli_run_on_shutdown'> + <param>['YES','NO']</param> + </check> + <group master='wpkgcli_script_variable_name'> + <slave>wpkgcli_script_variable_val</slave> + </group> + </constraints> + <help> + </help> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/files/home/wpkg/bureau-menu_demarrer.reg b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/files/home/wpkg/bureau-menu_demarrer.reg new file mode 100644 index 0000000000000000000000000000000000000000..039ea1c9808f310b8b299baa3f2f146e25304f5f Binary files /dev/null and b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/files/home/wpkg/bureau-menu_demarrer.reg differ diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/files/home/wpkg/documents/CHANGES b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/files/home/wpkg/documents/CHANGES new file mode 100644 index 0000000000000000000000000000000000000000..55f1a3ded21d63a3bb9aaedb9a56c73fb9ad938b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/files/home/wpkg/documents/CHANGES @@ -0,0 +1,815 @@ +=============================================================================== += CHANGES FOR 1.1 release +=============================================================================== + +Change notes +============ +WPKG Version: 1.1.2 +Author: : Rainer Meier <skybeam (at) users.sourceforge.net> +Date : 2009-09-26 +Status : released + +Changes/fixes visible to the user: + +Summary: +- Added path/value expansion for registry checks. Fixes Bug 139. +- Added variable expansion for registry uninstall searches. +- Fixed typos. +- Added additional status print messages on installation tasks. +- Fixed exception when getting system locale on some systems. +- Another small fix for system locale read. +- Moved documents to documents/ folder. +- Updated some documentation. +- WPKG now saves progress immediately to settings (wpkg.xml) +- Environment load/restore code changes. +- Revert partially the environment load/restore code changes. +- Fixed two more environment load/restore bugs. +- Fixed bug introduced with immediate setting save. Fixes Bug 167. +- Fixed uninstall version check in case of non-installed software. +- Fixed uninstall version comparison "versionsmallerthan". +- Added execute="changed" attribute to packages. +- Fixed notify="false" was not taken into account during removal. +- Notifications are now only sent if commands are executed. +- Version comparison improvement during installation. +- Added regular expression matching to uninstall key search. +- Changed informational level to debug level output for registry check. +- Added Windows Vista/7 msg.exe user-notification support. +- Added expansion of environment variables in rebootCmd setting. +- Fixed typo in registry equality check. +- Fixed some more code formatting and typo. +- Updated built-in user notification text. +- Added environment expansion in package revision attribute. +- Fixed duplicated version read from file if a file version check is used. +- Added environment value expansion for file version values. +- Added environment value expansion for uninstall version values. +- Added environment value expansion for execute check return values. +- Modified printed debug message if uninstall checks regex match fails. + +NEW: Registry path checks can now contain variables in the form of %VAR% too. + Variable expansion is allowed for the value attribute too. Please note + that WPKG first tries to locate the unexpanded key and compare unexpanded + values. For example if you use a registry equal check for the value of + "%APPDATA%" then it first tries to look for the "%APPDATA%" string and + only if this value does not exist it will compare the expanded value. + This allows you to still match REG_EXPAND_SZ values which contain + variable definitions. + This should fix Bug 139 as reported on Bugzilla. + Thanks to "graham" for reporting. +NEW: Variable expansion (see Bug 139) is now supported for uninstall entries as + as well. +FIX: Fixed a couple of typos. Thanks to Malte Starostik for reporting. +NEW: Added additional output to the status printer (when /sendStatus is + enabled) when installPackage() performs installation tasks and therefore + takes some time to finish. This allows external tools to inform the user + about ongoing actions. + Thanks to Malte Starostik for the suggestion. +FIX: Retrieving the system locale caused an exception on some systems. + Thanks to Simon Kelsall for reporting. +FIX: Fixed another small problem when locating system locales which could lead + to an exception in case the "HKCU\Control Panel\International\Locale" key + does not exist. +MOD: Moved documents to the documents/ sub-folder in order to clean up the root + directory. +MOD: Small corrections and updates to some documents. +MOD: Modified bahavior of WPKG whensaving settings (wpkg.xml). Now the settings + are saved immediately after modification instead of just when WPKG + terminates. Mainly this helps in case of unexpected reboot (initiated + outside WPKG) to prevent loss of some progress in case of unexpected + interruption. + Thanks to Johannes Brix for open discussion on the mailing list. +MOD: Changed some code to load package environment and and when restoring + previous environment to prevent some IDE errors (but cscript somehow seems + to accept the code). +FIX: The environment set changes done in previous release did not work as$ + expected. WSH does not provide convenient methods to modify the + environment. Maybe I will find a work-around later... +FIX: Fixed two more bugs introduced in 1.1.2-RC6 regarding environment + handling. + Fixes Bug 164. + Fixes Bug 165. + Thanks to Stefan Pendl. +FIX: The change introduced to save the settings on each change inroduced some + problems in case the settings (wpkg.xml) are created from scratch. + In this case the settings were not saved at all until a change (package + added to or package removed from) was done during WPKG operation. + This fixes Bug 167. Thanks to Falko Trojahn for reporting. +FIX: Version checks on uninstall enttries could evaluate "true" in case the + software is not installed at all. + Fixes Bug 170. Thanks to Malte Starostik for reporting and discussion. +FIX: Fixed bug where "versionsmallerthan" version comparison on uninstall + entries almost always returned false. + Thanks to Falko Trojahn for reporting. +NEW: Added possibility to set execute="changed". This allows you to specify + packages which are executed only if there are other packages (with + different execute attributes) processed during this WPKG run. + If no package is processed an execute="changed" package will not be + processed at all. This allows one to define packages for actions which + should run on every change (but not each time like execute="always" + would). + Please note: Due to the nature of these packages they form their own + "group" in the WPKG package tree. All execute="changed" packages are + executed in the order of priority at the end of the synchronization. + Packages with lower priority but other execute attribute values are always + executed before execute="changed" packages (even if the execute="changed" + package has higher priority). + Also note that the package using execute="changed" will be processed + like every other package. So if you define checks which yield true, then + the package is not installed/upgraded. If you want it to be executed on + really each system change, then you should not specify any check. + Addresses feature request as proposed in Bug 168. +FIX: If notify="false" attribute is used WPKG was still notifying users during + removal. Now WPKG will also not notify users on removal of such packages. +MOD: During install/upgrade/downgrade the user was notified (if notifications + are enabled) even if the package did not have any commands specified for + the action to be processed (e.g. upgrade without upgrade commands). + This has been changed now and the user will be notified only if some + commands are actually executed. +FIX: Version comparison is now done only once to detect if upgrade or downgrade + should be performed. This has not been a bug actually but it prevents + duplicated version checking and prevents redundant log output. +NEW: Added expression matching to uninstall key scanner. This allows to specify + a check as follows: + <check type='uninstall' condition='exists' path='Mozilla Firefox.*' /> + This matches all Firefox versions. In this case the check remains true if + the user changes to another Firefox versions. Note that in this case WPKG + would not even complain/reinstall the package if the user downgrades. + To prevent this you might specify + <check type='uninstall' condition='exists' + path='Mozilla Firefox \(3\.5\.[0-9]*\)' /> + This would allow any Firefox 3.5.x version to be installed by the user. + Plese note that this does not prevent WPKG to upgrade the package when + the administrator provides a new version. + For example the Administrator might install Firefox 3.5.1. Then version + 3.5.2 is released and manually installed by the user. WPKG will accept + this new version due to the regular expression and will not try to + re-install (downgrade in this case) to version 3.5.1. But as soon as + the administrator releases version 3.5.2 officially and increases the + package version then WPKG will enforce to install the version provided + by the administrator. + Please also note that the regular expression you give has to match the + full string read from the uninstall key. The heading "^" and trailing + "$" are automatically added to the regular expression. + This implements change request included in Bug 166. + Thanks to Stefan Pendl. +MOD: Changed information-level output to debug-level output in registry equal + checks if check fails. This avoids unnecessary output in the event log. + Thanks to Malte Starostik for reporting. +NEW: Added support for Windows Vista/7 msg.exe-based user notification + (replaces "net send" messaging on those systems). Unfortunately there are + some limitations. For example the message is ignored if it is longer than + 256 characters. So be aware and update your config.xml as needed. + A new option to define a timeout after which the notification disappears + automatically on those systems has been added (notificationDisplayTime). + This defaults to 10 which will make the message to be automatically + discarded after 10 seconds. + Adresses report 171. Thanks to Ralf Lederle. +NEW: Added expansion of environment variables in rebootCmd setting. + Thanks to grubi for request. + On this occasion I've updated some code to correctly expand + settings_file_name too (in case no settings_file_path is defined). + Environment expansion of logfilePattern setting has been added too. +FIX: Fixed typo in registry equality checks which caused exceptions. + Thanks to Malte Starostik. +FIX: Fixed some code formatting and typo. +MOD: Updated built-in user notification to fit within the 256 character limit. +NEW: Expands environment variables in package revision. For example + revision="%PRG_VERSION%" is valid now. Make sure the environment variable + is defined before you use it. + Fixes Bug 173. Thanks to Stefan Pendl. +MOD: Added check for package revision environment expansion. Expansion is only + done if the revision string contains two "%" characters which indicates + an environment definition in the form of %VAR%. + This should prevent unneeded environment setups and therefore it prevents + wasting resources. +FIX: Fixed duplicated version read from file if a file version check is used. +NEW: Added environment value expansion for file version values. +NEW: Added environment value expansion for uninstall version values. +NEW: Added environment value expansion for execute check return values. +MOD: Modified message if uninstall check string fails to be used as a regular + expression. + + +Change notes +============ +WPKG Version: 1.1.1 +Author: : Rainer Meier <skybeam (at) users.sourceforge.net> +Date : 2009-06-25 +Status : released + +Changes/fixes visible to the user: + +Summary: +- Added new /noUpgradeBeforeRemove switch. +- Reverted STDOUT/STDERR handling to WPKG 1.0 algorithm. +- Updated README.TXT in tools/ folder. +- Fixed typo in DB inconsistency message. +- Changed wording in database-inconsistency message. +- Changed install success message wording. +- Enhanced variable expansion within variable definitions. +- Enhanced human-style version comparison. +- Improved human-style version comparison algorithm. +- Extended volatile release marker list. +- Added possibility to define volatile release markres in config.xml. +- Updated profiles.xsd +- Fixed wrong default for /noUpgradeBeforeRemove switch +- Fixed typo in install-success message. Fixes Bug 163. +- Fixed variable overwriting. Fixes Bug 156. + +NEW: Added a new switch: /noUpgradeBeforeRemove. + This switch allows to disable the upgrade-before-remove feature. + Usually WPKG upgrades a package to the latest available version before it + removes the package. This allows administrators to fix bugs in the package + and assure proper removal. + However this feature can lead to (sometimes unexpected) re-execution of + packages. For example if execution=always is used the package will run + once again before it is finally removed. + It's advised to leave this option on default unless you really know what + you're doing. + Thanks to Simon. +NEW: Unfortunately the %COMSPEC%-wrapping introduced in WPKG 1.1.0 to allow + STDOUT/STDERR flushing (see Bug 155) does not work in any case as + expected. Therefore I decided to revert the change and fall back to the + default execution behavior of WPKG 1.0. This should solve execution and + return code problems for the moment. + However the issue that commands which print > 4k to STDOUT/STDERR will + block and not finish until the timeout has been reached. So make sure + your installers are (quite-) silent on STDOUT/STDERR or to redirect the + output to a file or NUL by appending ">NUL 2>&1" to commands which are + using verbose printing. +MOD: Updated README.TXT in tools/ folder to reflect the truth that the tools + put into the tools folder are not automatically added to the PATH. + Thanks to Chris Allen. +MOD: Fixed typo in in database-inconsistency message. Thanks to Gerd Ott. +MOD: Changed Wording after successful installation of a package. + Thanks to Simon. +MOD: Enhanced variable expansion within <variable /> nodes. If the value + contains shell variables they are expanded immediately. + Thanks to Chris Allen for reporting and Stefan Pendl for fix suggestion. +MOD: The comparison of of version strings the same way how a human would read + it is quite difficult. Up to now WPKG supported only versions containing a + sequence of colon-separated digits. The algorithm has been re-worked to + support much more complicated version strings. Some examples include: + A B Result + "1" "2" B is newer + "1" "15" B is newer + "1.0" "1.2.b" B is newer + "1.35" "1.35-2" B is newer + "1.35-2" "1.36" B is newer + "1.35R3" "1.36" B is newer + "1" "1.0.00.0000" Versions are equal + "1" "1.0" Versions are equal + "1.35" "1.35-2" B is newer + "1.35-2" "1.35" A is newer + "1.35R3" "1.36R4" B is newer + "1.35-2" "1.35-2.0" Versions are equal + "1.35.1" "1.35.1.0" Versions are equal + Thanks to Jens Geile for asking an improved algorithm. +MOD: Updated version comparison algorithm to treat some version appendixes as + "volatile". Volatile means that WPKG would claim that a revision witout + that suffix is newer than the one which carries this suffix. Usually a + version is assumed to be higher if it has an additional suffix but in case + of RC (Release Candidate), M (Milestone) and I (Integration) releases it's + usually the opposite way around. For example: + A B Result + "1.0RC2" "1.0" B us newer (A is an "RC" version) + "1.5" "1.5I3656" A is newer (B is an "I"/intgration version) + "1.5" "1.5M3656" A is newer (B is an "M"/milestone version) + but (still) + "1.5" "1.5u3656" B is newer (B is an update version) +MOD: Updated the list of volatile release markers (see previous change). +NEW: Added the possibility to define "volatileReleaseMarker" parameters within + config.xml. This allows users to extend the list of volatile release + markers on-the-fly. +MOD: Updated profiles.xsd. However I could not find a problem with the current + profile definition but Brian reported on the mailing list that his editor + throws a validation error. So I changed the definition according to his + proposal. +FIX: The /noUpgradeBeforeRemove remove switch was "on" by default. Somehow I + left that in the code by accident from my testing sessions. + Thanks to Stefan Pendl for reporting. +FIX: Fixed typo in install-success notification: + "Package and all chained packages ininstalled successfully." + changed to + "Package and all chained packages installed successfully." + Thanks to Stefan Pendl for reporting. + Fixes Bug 163. +FIX: Fixed WPKG quit if a variable definition appears twice (re-defined). For + example if a variable is defined in profiles.xml and overwritten in + hosts.xml. + Thanks to Jindrich Vorlicek for reporting. + Fixes Bug 156. + + +Change notes +============ +WPKG Version: 1.1.0 +Author: : Rainer Meier <skybeam (at) users.sourceforge.net> +Date : 2009-05-23 +Status : released + +Changes/fixes visible to the user: + +Summary: +- Improved MSXML factory handling. +- Got rid of false-positive virus warning by Avira AntiVir. +- Added italian LCIDs and messages. +- Added work-around for STDOUT/STDERR flushing problem. Fixes Bug 155. +- Fixed multiple dependency removal. Fixes Bug 145 and Bug 137. +- Fixed another problem with STDOUT/STDERR flushing code. +- Fixed WPKG ignoring /log_file_path:<path> parameter. Fixes Bug 157. +- (Again) fixed dependency removal. Fixes Bug 145 and Bug 137. +- Fixed bug which caused null-pointer when removing packages from server. +- Updated regression-test suite to work with WPKG 1.1.0. +- Added "-accepteula" parameter to psshutdown. Fixes Bug 159. +- Internal getPackageName() enhancement. +- WPKG 1.1.0 released. + + +MOD: Improved file downloading. Different versions of MSXML use different + factories. Now WPKG supports multiple factories. +MOD: Re-arranged download functions to avoid false-positive warning by + Avira AntiVir where WPKG was wrongly recognized as HTML/ADODB.Exploit.Gen. +NEW: Italian LCIDs added to configuration (config.xml). + Thanks to Marco Gaiarin. +FIX: Added work-around for STDOUT/STDERR flushing problem. Unfortunately + reading from output streams is terribly broken in WSH. Reading output from + the streams blocks if the process does not write to the stream. + Even reading the "AtEndOfStream" property blocks which makes it impossible + to read from a stream which receives data without blocking the application. + As a work-around WPKG now makes sure STDOUT/STDERR is redirected to NUL + to discard them completely. Well, if your command includes the strings + " >" or " 2>" WPKG will not replace them by NUL redirects. This means you + can still redirect the output manually to files (or redirect to NUL by + yourself). The code just makes sure that output which would be discarded + anyway is not even sent to the buffers. + The drawback of this work-around is that it is not possible to capture the + output from within WPKG and therefore it will not appear within the logs. + However this is the same behavior as all WPKG versions (except 1.1.0-M21) + had. So no big loss. + Fixes Bug 155. +FIX: Fixed a problem where removing the same package multiple times during one + session ended in a null pointer exception. This could have happened if + packages with dependencies are removed and therefore the packages which + depend on the removed package is removed too. + In case a package is removed two times now WPKG will detect it. In case + the package has been removed successfully during this session the remove + function returns successful state. + Fixes Bug 137 and 145 I hope. +FIX: STDOUT/STDERR flushing code did not work for non-cmd/%COMSPEC% based + installer scripts. Unfortunately on Windows it looks like the I/O re- + director parameters ">" or "2>" need to be handled by the application + and not by the shell/OS. As a result appending ">NUL" caused invalid/ + unknown arguments to be passed to some commands (like msiexec). As a + work-around WPKG is now executing all commands within a %COMSPEC% shell + unless they already use STDOUT & STDERR redirectors. +FIX: WPKG was ignoring the command-line parameter /log_file_path:<path>. + This bug was not affecting log_file_path property set in config.xml. + Fixes Bug 157. + Thanks to Luca Manganelli. +FIX: Dependency removal was not fully fixed. Actually the bug has been fixed + but the fix contained another issue which caused the same exception. + In fact WPKG was comparing the package name with the package ID during + the check if the package has been removed already during this session. + This of course caused WPKG to belive that it's the first time the package + is attempted to be removed and returned a failure code. + Fixes Bug 137 and 145. +FIX: Fixed bug which caused a null-pointer exception when a package marked for + removal (removed from the profile) was removed from the package tree on + server side. The bug has been reported in Bug 145. +FIX: Updated regression-test suite which contained some tests which failed + because they used unix path separator "/" instead of windows "\" + separator. Problems with this tests have been reported in Bug 145. +MOD: PsTools of Sysinternals have been taken over by Microsoft. The latest + version seems to require an additional (undocumented of course) switch + "-accepteula" in order to prevent a screen displaying the EULA to pop + up which has to be interactively accepted by the user. + The work-around for this is to add the "-accepteula" flag to the "special" + reboot command by default. + Fixes Bug 159. +MOD: Enhanced getPackageName() to prevent null pointer exceptions if the + package node passed within the arguments is null. According to the + documentation it should not throw an exception but return an empty string. +NEW: WPKG 1.1.0 is finally released! + WPKG 1.1.0 now becomse the stable branch and WPKG 1.0 releases are marked + as end of life. WPKG 1.1.0 is fully backwards compatible and entirely + replaces WPKG 1.0. Basically all you need to do in order to upgrade is to + replace wpkg.js in your installation. It is recommended to migrate + config.xml too because of a few new prameters. + Package, host and profile definitions can be kept from previous WPKG + versions. + + +Change notes +============ +WPKG Version: 1.1.0-M21 +Author: : Rainer Meier <skybeam (at) users.sourceforge.net> +Date : 2009-04-11 +Status : Released + +Changes/fixes visible to the user: + +Summary: +- Show useage if executed without parameter. +- Unnecessary null-reference check removed from getPackageChecks() method. +- Updated help and config.xml (grammar and consistency fixes). Fixes Bug 116. +- Updated XSD to support installdate & uninstalldate package attributes. +- Changed exit behavior in case of overridden reboot (exits with 3010 << 8). +- Fixed invalid env-splitting. +- Fixed environment setup. +- Fixed package ID reading bug wen reading profile. +- Fixed recursive dependency tree build. +- Fixed crash when profile did not havree any packages assigned. +- Show usage when no parameter is given +- improved documentation +- Migrated code to work with Eclipse JSDT +- Fixed typo when reading fixed IP addresses from registry +- Added possibility for package chaining +- Fixed removal of dependent packages. Fixes Bug 150. +- Fixed typo in removal message. Fixes Bug 151. +- Fixed more typos in output messages. Fixes Bug 152. +- Fixed environment setup for remove commands. Fixes Bug 146. +- XSD fixes +- Fixed multi-dependency removal. Fixes Bug 153. +- Added flushing of STDOUT and STDERR during exec(). Fixes Bug 123. +- Fix writing null value to system log fails. Fix for Bug 135. +- Removed unused varialble. Fix for Bug 154. + + +NEW: Shows usage if executed without parameter (instead of just throwing an + error and exiting). +FIX: In case a command is executed which does not exist (WScript.Shell.exec() + throws exception) WPKG does not immediately terminate. +FIX: Removed unnecessary check for undefined checks in getPackageChecks() + method. It seems that selectNodes(String) never returns null but instead + returns empty collection. +FIX: Updated help and config.xml with grammar and consistency fixes as proposed + by Jens Geile. Thanks Jens. Fixes Bug 116. +FIX: Updated XSD to suppport installdate and uninstalldate package attributes. + The attributes have been missing from the XSD definition. +MOD: Changed behavior of wpkg.js again in case reboot is overridden. + Previously it was exiting with exit code 3010 but this caused WPKG client + to initiate a reboot immediately after wpkg.js terminated. + Now WPKG returns code 3010 << 8 (3010 bit-shifted by 8 bits to the left) + which evaluates to a decimal value of 770560. This allows an external + tool to verify if a reboot was initiated but overridden. + If you would like WPKG to exit with code 3010 without issuing a reboot + consider to specify a reboot command within the configuration + (see rebootCmd in config.xml or /rebootcmd: switch) which points to a + script which does not do anything. In this case WPKG executes the script + (e.g. reboot.cmd) and then exits with code 3010. + This was discussed in Bug 132. +FIX: Fixed invalid env-splitting introduced in earlier pre-release version. +FIX: Fixed environment setup for package install/remove/upgrade. +FIX: Package IDs wrongly read from profile. +FIX: Fixed recursive dependency tree build introduced in previous milestone + checkin. +FIX: Fixed error if profile does not have any packages assigned. +NEW: Shows usage if executed without parameter (instead of just throwing an + error and exiting). +MOD: Improved documentation. +MOD: Updated source to be readable by Eclipse JSDT. This will be my primary + development environment now. + The change already helped me to identify a bunch of unused code and to + improve code quality in general. +MOD: Fixed typo when reading fixed IP adresses from registry. It looks like + it did not have any effect on the functionality. + Changed + var fixedIPs = getRegistryValue(regBase, "IPAddress").toArray(); + to + var fixedIPs = getRegistryValue(regBase + "IPAddress").toArray(); + Thanks to Alan for reporting it. +NEW: Added possiblity to chain packages. Use the following synatx: + <chain package-id="some-id" /> + A chained package is pretty much similar to the + <depends package-id="some-id" /> + functionality but chained packages are installed right after the package + which specifies the chain. + Personally I prefer to set a dependency on the "chained" package to assure + that the "chaining" package is installed _before_ the package which + depends on it. +FIX: Fixed removal of package dependencies by fixing up removePackage() return + value. Anyway by definition it should return the success state according + to the documentation which was not the case yet. + Fixes Bug 150. Thanks to Jason Oster. +MOD: Modified message when removing depending package from + Removal of depending package package '<package-id'> ... + to + Removal of depending package '<package-id'> ... + Fixes Bug 151.. Thanks to Jason Oster. +MOD: Changed misspelled word "referemces" to "references" + Changed quoting in "Removal of <package> successful." message. + Fixes Bug 152. Thanks to Jason Oster. +FIX: Fixed loading of package-specific environment for remove commands. + Previously environment variables set for a package have been unavailable + to remove commands. + Fixes Bug 146. Thanks to Jason Oster. +FIX: Fixed packages.xsd - type of some elements was wrongly set to String. + Now correctly refers to packageReference where appropriate + (chain, depends, include). + Fixed 'type' attribute of 'check' element to be specified in lower case. +FIX: Fixed possible errors when a package is removed twice during the same + session. This could happen if a package depends on multiple other + packages which are removed during a WPKG session. + Fixes Bug 153. Thanks to Jason Oster. +MOD: Added flushing of STDOUT and STDERR during exec(). Due to strange + behavior of WSH a command might block if the buffer for STDOUT/STDERR + is full. Now WPKG flushes this buffer every second and prints its + contents to the debug log. This also allows you to see the console + output of the executed command if any. +FIX: Writing log events to event log with null value might fail due to the + fact that WshShell.logEvent() method does not accept null values + directly. Now the string "null" will be logged in such case. + Fixes Bug 135. +FIX: Unused Array removed from getPackageDependencies() function. Seems to be + some left-over from a testing session. + Fixes Bug 154. Thanks to Jason Oster. + + +Change notes +============ +WPKG Version: 1.1.0-M7 +Author: : Rainer Meier <skybeam (at) users.sourceforge.net> +Date : 2008-05-08 + +Changes/fixes visible to the user: + +Summary: +- Improved variable support for all package actions. +- Fixed missing quote in debug output. Fixes Bug 115. + +NEW: Variables now supported for all package actions (install, remove upgrade, + downgrade, check). This issue was reported on the mailing list. + +FIX: Fixed missing quote in debug output. Changed + Found package node "'Package name (PackageID) in package database " + to + Found package node "'Package name' (PackageID) in package database." + Thanks to Jens Geile for reporting it. Fixes Bug 115. + + +Change notes +============ +WPKG Version: 1.1.0-M6 +Author: : Rainer Meier <skybeam (at) users.sourceforge.net> +Date : 2008-04-24 + +Changes/fixes visible to the user: + +Summary: +- Fixed broken file size check. Fixes Bug 112. + +NEW: File size checks were broken due to faulty code in get file size method + which was modified to support expanding of environment variables. + WPKG 1.0 is not affected. This fixes Bug 112. Thanks to Daniel Dehennin! + +Change notes +============ +WPKG Version: 1.1.0-M5 +Author: : Rainer Meier <skybeam (at) users.sourceforge.net> +Date : 2008-04-21 + +Changes/fixes visible to the user: + +Summary: +- Improved handling of event log system errors. Fixes Bug 109. + +NEW: Improved handling of event log system errors. In case writing to event log + causes an exception WPKG will not exit silently any more but fall back to + write to STDOUT and log to the log file as appropriate (depending on log + level). Thanks to Brian May for reporting and debugging. + This fixes Bug 109. + + +Change notes +============ +WPKG Version: 1.1.0-M4 +Author: : Rainer Meier <skybeam (at) users.sourceforge.net> +Date : 2008-04-10 + +Changes/fixes visible to the user: + +Summary: +- Fixed Bug 107. Registry equality checks fail on REG_DWORD values. +- Changed confusing info message about non-zero exit code even if code was 0 +- Allow usage of environment variables within the "execute" check type + +FIX: Fixed Bug 107. Registry equality checks throw an error in case of checked + value is of type REG_DWORD or REG_BINARY. Now the values are converted to + strings before comparing it to the 'value' attribute. REG_MULTI_SZ and + REG_BINARY values are concatenated using newline characters. For + REG_BINARY values each octett is converted to its decinal number + representation. Examples: + REG_MULTI_SZ = a + b + c + value = "a + b + c" + will match. + REG_BINARY values will be converted to multiline string as well. Each octett of the binary value + is converted to its decimal representation. + REG_BINARY = "11 22 33 44" + value = "17 + 34 + 51 + 68" + will match. + +MOD: Misleading/confusing info message about non-zero exit code (even if exit + code was 0) changed from: + Command '<cmd> returned non-zero exit code [<code>]. This exit code... + to + Command '<cmd>' returned exit code [<code>]. This exit code... + The quoting has been fixed as well (see above). + +MOD: Download XML nodes are now allowed as sub-nodes of any command (install/ + upgrade/downgrade/remove). This allows you to specify a download which is + only downloaded for a specific command. This was implemented since it + usually makes no sense to download the installation package again right + before the remove commands are executed (which usually runs a local + uninstall command which does not need the original installer). + Specifying a download XML node on the global package level (not below a + specific command definition) is still allowed. Such downloads will be + executed regardless of the command to be executed. So you can specify some + global downloads which are executed in any case. + Note: If multiple install (or upgrade/downgrade/remove) commands are + specified WPKG will download the the files of all command nodes of the + same kind before starting to execute the commands in sequence. + Example: + <package...> + <donwoad url="http://example.org/package.exe" target="package.exe" /> + <install cmd="%TEMP%\file.exe some arguments" ...> + <donwoad url="http://example.org/file.exe" target="file.exe" /> + </install> + <install cmd="%TEMP%\file2.exe some arguments" ...> + <donwoad url="http://example.org/file2.exe" target="file2.exe" /> + </install> + <upgrade cmd="%TEMP%\update.exe arguments" ...> + <donwoad url="http://example.org/update.exe" target="update.exe" /> + </upgrade> + </package> + This definition will simply download "package.exe" (global). "file.exe" + and "file2.exe" right before the install commands are executed in + seuence. + In case of upgrade it will download "package.exe" (global) and + "update.exe" before executing the upgrade command(s). + +NEW: Checks of type 'execute' allow to use environment variables within the + 'path' attribute now. For example the following specification is valid + now: + "%SystemRoot%\mycheck.cmd" + + +Change notes +============ + +WPKG Version: 1.1.0-M3 +Author: : Rainer Meier <skybeam (at) users.sourceforge.net> +Date : 2008-04-05 + +Changes/fixes visible to the user: + +Summary: +- Fixed crash when /force was used in conjunction with /synchronize +- Do not force quit if installation fails (unsless /qutonerror is set) +- Extended uninstall check (check for DisplayVersion) +- New package check: execute +- Added download extension (allows downloading installers) +- Added downgrade package functionality +- Added status output on STDOUT which can be used by the GUI + +FIX: WPKG crashed when /force was used in conjunction with /synchronize. Fixed. + +MOD: WPKG was forced to exit if package checks failed after installation or if + a package failed to remove. This has been changed. Now WPKG prints an + error (unless /quitonerror is used). + Note that installation of packages depending on the failed one will fail + as well. Some packages require reboot unless checks yield true. Therefore + it is crucial to define correct package reboot flags for such packages. + +NEW: Package uninstall checks have been extended. The following values are now + valid: + type="uninstall" path="prg" condition="versionsmallerthan" value="1.1" + Check if version is smaller than the specified value + + type="uninstall" path="prg" condition="versionlessorequal" value="1.1" + Check if version is less or equal than the specified value + + type="uninstall" path="prg" condition="versionequalto" value="1.1" + Check if version is exactly equal to the specified value + + type="uninstall" path="prg" condition="versiongreaterorequal" value="1.1" + Check if version is greater or equal to the specified value + + type="uninstall" path="prg" condition="versiongreaterthan" value="1.1" + Check if version is greater than the specified value + + The version is compared to the DisplayVersion value within the uninstall + entry within the Windows registry. + Changes are based on a patch by Richard de Vos. Thanks! + +NEW: Added new check type: "execute". This allows you to execute any script + which checks if an application is installed - based on the exit code of + the script. + Usage: + type="execute" path="\\path\to\script.cmd" + condition="exitcodesmallerthan" value="0" + Evaluates true if the exit code is negative + + type="execute" path="\\path\to\script.cmd" + condition="exitcodelessorequal" value="0" + Evalueates true if exit code is 0 or negative + + type="execute" path="\\path\to\script.cmd" + condition="exitcodeequalto" value="0" + Evaluates true only if exit code is exactly 0 + + type="execute" path="\\path\to\script.cmd" + condition="exitcodegreaterorequal" value="0" + Evaluates true if exit code is 0 or any poitive number + + type="execute" path="\\path\to\script.cmd" + condition="exitcodegreaterthan" value="0" + Evaluates true if exit code is any positive number + + This type of check also allows very complex checks. For example there is a + limitation of the RegRead method used by WPKG to query registry values + which contain backslashes '\'. Now you can execute a batch script which + checks for such registry values using 'reg query ...'. + +NEW: Added download extension as initially proposed by Tomasz Chmielewski (with + some changes). A download definition is specified as follows: + <download url="http://server.domain.tld/path/to/file.msi" + target="subdir/file.msi" timeout="7200" /> + + The 'timeout' attribute is entirely optional. It defaults to the value of + 'downloadTimeout' as specified within config.xml (7200 if not omitted). + The value is specified in seconds. + + The 'target' attribute specifies a path relative to the 'downloadDir' as + specified within config.xml (defaults to '%TEMP%' if omitted). + NOTE: You need to specify the full file path, including the file name, not + just a directory name! + + So to install the package above could be installed by the following + install command definition: + <install cmd="msiexec /qn /i %TEMP%\subdir\file.msi"> + +NEW: Added downgrade command nodes. These commands are executed if the version + installed on the client is newer thant the one on the server side. + Example: + <downgrade cmd=""\\Store1\Mozilla\Firefox Setup 2.0.0.12.exe" /S"/> + +NEW: Added /sendStatus flag and 'sendStatus' configuration parameter in + config.xml. The parameter allows to enable printing of status information + to STDOUT in order to be parsed by the calling program (e.g. WPKG client). + This allows the calling program to display some status messages about the + synchronization process. + The status update might not be very linear depending on the package sizes + but at least it allows to display the start time (and therefore also + elapsed time to the user. So the user can see at least how many percent of + packages have been synchronized already and for how long the current task + is running currently. + Users usually feel much less annoyed when waiting for a task to be + finished if there are at least some screen updates and a kind of progress + bar which is updating from time to time. + Note: STDOUT was chosen due to the fact that I was unable to find a way to + write to named pipes from JScript yet. However the implementation could + easily be adapted to pipes or sockets. + I also updated wrapper.js to read STDOUT of the called wpkg.js and print + it to its own STDOUT. This required if WPKG client is going to read the + output of wpkg.js, in that case output needs to be "chained" to be + forwarded to the GUI. + + +Change notes +============ + +WPKG Version: 1.1-M1 +Author: : Rainer Meier <skybeam (at) users.sourceforge.net> +Date : 2008-01-14 + +Changes/fixes visible to the user: + +Summary: +- Added dependency awareness for package removal + +NEW: removePackage now removes all packages which depends on the one to be + removed as well (recursively). This assures that after poackage uninstall + no packages are left installed which miss their required dependency. + Please note that if a package which depends on the one to be removed + specifies an immediate reboot the reboot takes place right after the + this package has been removed. In such case the package initially + requested to be removed will still be there after the reboot. + To avoid this it is possible that depending packages use the postponed + reboot functionality. Alternatively you can use the /noreboot switch + to advice WPKG to ignore each reboot request. Note that in such cases + some packages will not properly finish their uninstall procedure. + In case removing of any package from the dependency tree fails WPKG + will stop uninstalling and print a message. In such case the package + you requested to remove will still be there because there is at least one + more package which depends on it. You can advice WPKG to remove the + requested package in any case by using the /force switch. Warning: In such + case it might happen that some packages depending on the removed one could + not be removed and therefore will be left on the system (probably not + working any more). diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/files/home/wpkg/documents/CONTRIBUTORS b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/files/home/wpkg/documents/CONTRIBUTORS new file mode 100644 index 0000000000000000000000000000000000000000..a8557e4b66c9469bd8ffb6f9aa2ee9bd9ad30e50 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/files/home/wpkg/documents/CONTRIBUTORS @@ -0,0 +1,48 @@ +The following people contributed code to WPKG: + + + +The following people contributed code to WPKG: + +Knud Ahrnell Albrechtsen - snakebyte ##at# email (dot) dk + +K. Dohmann - harlekin_666 #at# gmx (dot) net + +Andre Fantomass - ai #at# bsdler (dot) de + +Chris Freeze - cfreeze #at# cfreeze (dot) com + +Paul Griffith - paulg #at# cs (dot) yorku (dot) ca + +Jerry Haltom - original (wpkg.js) idea + +Stian Husemoen - stian (dot) husemoen #at# batbelt (dot) org + +Andre Ilie - ai #at# photonic-sense (dot) com + +Michael J. Kidd - wpkg #at# linuxkidd (dot) com + +Kristofer Kiik - kristofer (dot) kiik #at# gmail (dot) com + +Suuri Kikkeli - suurikikkeli #at# yahoo (dot) com + +Gordon Klimm - Gordon (dot) Klimm #at# gmx (dot) net + +Frank Lee - rl201 #at# cam (dot) ac (dot) uk + +Artur Majuch - artur (dot) majuch #at# pronet (dot) lublin (dot) pl - WPKG Client + +Rainer Meier - r.meier #at# wpkg (dot) org + +Jason Owen - r (dot) alex (dot) owen #at# gmail (dot) com + +Falko Trojahn - ftrojahn #at# smi-softmark (dot) de + +Aleksander Wysocki - papopypu #at# op (dot) pl + + +WPKG logo was contributed by Eric Le Henaff - eric (dot) le (dot) henaff #at# ens (dot) fr + +Tomasz Chmielewski is the maintainer of WPKG. + +Thanks! diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/files/home/wpkg/documents/Changelog b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/files/home/wpkg/documents/Changelog new file mode 100644 index 0000000000000000000000000000000000000000..1a87c366ee0c8a90a34d51b2c1ae56f9cb08d07f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/files/home/wpkg/documents/Changelog @@ -0,0 +1,728 @@ +=============================================================================== += CHANGES FOR 1.1 release +=============================================================================== +Changes 2009-09-26, v1.1.2 by Rainer Meier <r.meier (at) wpkg.org> +NEW: Final release of WPKG 1.1.2 + +Changes 2009-09-22, v1.1.2-RC19 by Rainer Meier <r.meier (at) wpkg.org> +FIX: Fixed duplicated version read from file if a file version check is used. +NEW: Added environment value expansion for file version values. +NEW: Added environment value expansion for uninstall version values. +NEW: Added environment value expansion for execute check return values. +MOD: Modified message if uninstall check string fails to be used as a regular + expression. + +Changes 2009-09-21, v1.1.2-RC18 by Rainer Meier <r.meier (at) wpkg.org> +MOD: Added check for package revision environment expansion. Expansion is only + done if the revision string contains two "%" characters which indicates + an environment definition in the form of %VAR%. + This should prevent unneeded environment setups and therefore it prevents + wasting resources. + +Changes 2009-09-21, v1.1.2-RC17 by Rainer Meier <r.meier (at) wpkg.org> +NEW: Expands environment variables in package revision. For example + revision="%PRG_VERSION%" is valid now. Make sure the environment variable + is defined before you use it. + Fixes Bug 173. Thanks to Stefan Pendl. + +Changes 2009-09-10, v1.1.2-RC16 by Rainer Meier <r.meier (at) wpkg.org> +FIX: Fixed typo in registry equality checks which caused exceptions. + Thanks to Malte Starostik. +FIX: Fixed some code formatting and typo. +MOD: Updated built-in user notification to fit within the 256 character limit. + +Changes 2009-09-05, v1.1.2-RC15 by Rainer Meier <r.meier (at) wpkg.org> +NEW: Added expansion of environment variables in rebootCmd setting. + Thanks to grubi for request. + On this occasion I've updated some code to correctly expand + settings_file_name too (in case no settings_file_path is defined). + Environment expansion of logfilePattern setting has been added too. + +Changes 2009-09-04, v1.1.2-RC14 by Rainer Meier <r.meier (at) wpkg.org> +NEW: Added support for Windows Vista/7 msg.exe-based user notification + (replaces "net send" messaging on those systems). Unfortunately there are + some limitations. For example the message is ignored if it is longer than + 256 characters. So be aware and update your config.xml as needed. + A new option to define a timeout after which the notification disappears + automatically on those systems has been added (notificationDisplayTime). + This defaults to 10 which will make the message to be automatically + discarded after 10 seconds. + Adresses report 171. Thanks to Ralf Lederle. + +Changes 2009-08-29, v1.1.2-RC13 by Rainer Meier <r.meier (at) wpkg.org> +MOD: Changed information-level output to debug-level output in registry equal + checks if check fails. This avoids unnecessary output in the event log. + Thanks to Malte Starostik for reporting. + +Changes 2009-08-23, v1.1.2-RC12 by Rainer Meier <r.meier (at) wpkg.org> +NEW: Added expression matching to uninstall key scanner. This allows to specify + a check as follows: + <check type='uninstall' condition='exists' path='Mozilla Firefox.*' /> + This matches all Firefox versions. In this case the check remains true if + the user changes to another Firefox versions. Note that in this case WPKG + would not even complain/reinstall the package if the user downgrades. + To prevent this you might specify + <check type='uninstall' condition='exists' + path='Mozilla Firefox \(3\.5\.[0-9]*\)' /> + This would allow any Firefox 3.5.x version to be installed by the user. + Plese note that this does not prevent WPKG to upgrade the package when + the administrator provides a new version. + For example the Administrator might install Firefox 3.5.1. Then version + 3.5.2 is released and manually installed by the user. WPKG will accept + this new version due to the regular expression and will not try to + re-install (downgrade in this case) to version 3.5.1. But as soon as + the administrator releases version 3.5.2 officially and increases the + package version then WPKG will enforce to install the version provided + by the administrator. + Please also note that the regular expression you give has to match the + full string read from the uninstall key. The heading "^" and trailing + "$" are automatically added to the regular expression. + This implements change request included in Bug 166. + Thanks to Stefan Pendl. + +Changes 2009-08-23, v1.1.2-RC11 by Rainer Meier <r.meier (at) wpkg.org> +NEW: Added possibility to set execute="changed". This allows you to specify + packages which are executed only if there are other packages (with + different execute attributes) processed during this WPKG run. + If no package is processed an execute="changed" package will not be + processed at all. This allows one to define packages for actions which + should run on every change (but not each time like execute="always" + would). + Please note: Due to the nature of these packages they form their own + "group" in the WPKG package tree. All execute="changed" packages are + executed in the order of priority at the end of the synchronization. + Packages with lower priority but other execute attribute values are always + executed before execute="changed" packages (even if the execute="changed" + package has higher priority). + Also note that the package using execute="changed" will be processed + like every other package. So if you define checks which yield true, then + the package is not installed/upgraded. If you want it to be executed on + really each system change, then you should not specify any check. + Addresses feature request as proposed in Bug 168. +FIX: If notify="false" attribute is used WPKG was still notifying users during + removal. Now WPKG will also not notify users on removal of such packages. +MOD: During install/upgrade/downgrade the user was notified (if notifications + are enabled) even if the package did not have any commands specified for + the action to be processed (e.g. upgrade without upgrade commands). + This has been changed now and the user will be notified only if some + commands are actually executed. +FIX: Version comparison is now done only once to detect if upgrade or downgrade + should be performed. This has not been a bug actually but it prevents + duplicated version checking and prevents redundant log output. + +Changes 2009-08-23, v1.1.2-RC10 by Rainer Meier <r.meier (at) wpkg.org> +FIX: Fixed bug where "versionsmallerthan" version comparison on uninstall + entries almost always returned false. + Thanks to Falko Trojahn for reporting. + +Changes 2009-08-10, v1.1.2-RC9 by Rainer Meier <r.meier (at) wpkg.org> +FIX: Version checks on uninstall enttries could evaluate "true" in case the + software is not installed at all. + Fixes Bug 170. Thanks to Malte Starostik for reporting and discussion. + +Changes 2009-08-09, v1.1.2-RC8 by Rainer Meier <r.meier (at) wpkg.org> +FIX: The change introduced to save the settings on each change inroduced some + problems in case the settings (wpkg.xml) are created from scratch. + In this case the settings were not saved at all until a change (package + added to or package removed from) was done during WPKG operation. + This fixes Bug 167. Thanks to Falko Trojahn for reporting. + +Changes 2009-07-29, v1.1.2-RC7 by Rainer Meier <r.meier (at) wpkg.org> +FIX: Fixed two more bugs introduced in 1.1.2-RC6 regarding environment + handling. + Fixes Bug 164. + Fixes Bug 165. + Thanks to Stefan Pendl. + +Changes 2009-07-29, v1.1.2-RC6 by Rainer Meier <r.meier (at) wpkg.org> +FIX: The environment set changes done in previous release did not work as + expected. WSH does not provide convenient methods to modify the + environment. Maybe I will find a work-around later... + +Changes 2009-07-28, v1.1.2-RC5 by Rainer Meier <r.meier (at) wpkg.org> +MOD: Modified bahavior of WPKG whensaving settings (wpkg.xml). Now the settings + are saved immediately after modification instead of just when WPKG + terminates. Mainly this helps in case of unexpected reboot (initiated + outside WPKG) to prevent loss of some progress in case of unexpected + interruption. + Thanks to Johannes Brix for open discussion on the mailing list. +MOD: Changed some code to load package environment and and when restoring + previous environment to prevent some IDE errors (but cscript somehow seems + to accept the code). + +Changes 2009-07-18, v1.1.2-RC4 by Rainer Meier <r.meier (at) wpkg.org> +MOD: Moved documents to the documents/ sub-folder in order to clean up the root + directory. +MOD: Small corrections and updates to some documents. + +Changes 2009-07-17, v1.1.2-RC4 by Rainer Meier <r.meier (at) wpkg.org> +FIX: Fixed another small problem when locating system locales which could lead + to an exception in case the "HKCU\Control Panel\International\Locale" key + does not exist. + +Changes 2009-07-17, v1.1.2-RC3 by Rainer Meier <r.meier (at) wpkg.org> +FIX: Retrieving the system locale caused an exception on some systems. + Thanks to Simon Kelsall for reporting. + +Changes 2009-07-10, v1.1.2-RC2 by Rainer Meier <r.meier (at) wpkg.org> +FIX: Fixed a couple of typos. Thanks to Malte Starostik for reporting. +NEW: Added additional output to the status printer (when /sendStatus is + enabled) when installPackage() performs installation tasks and therefore + takes some time to finish. This allows external tools to inform the user + about ongoing actions. + Thanks to Malte Starostik for the suggestion. + +Changes 2009-06-25, v1.1.2-RC1 by Rainer Meier <r.meier (at) wpkg.org> +NEW: Registry path checks can now contain variables in the form of %VAR% too. + Variable expansion is allowed for the value attribute too. Please note + that WPKG first tries to locate the unexpanded key and compare unexpanded + values. For example if you use a registry equal check for the value of + "%APPDATA%" then it first tries to look for the "%APPDATA%" string and + only if this value does not exist it will compare the expanded value. + This allows you to still match REG_EXPAND_SZ values which contain + variable definitions. + This should fix Bug 139 as reported on Bugzilla. + Thanks to "graham" for reporting. +NEW: Variable expansion (see Bug 139) is now supported for uninstall entries as + as well. + +Changes 2009-06-25, v1.1.1 by Rainer Meier <r.meier (at) wpkg.org> +NEW: Final release of WPKG 1.1.1 + +Changes 2009-06-25, v1.1.1-RC9 by Rainer Meier <r.meier (at) wpkg.org> +FIX: Fixed WPKG quit if a variable definition appears twice (re-defined). For + example if a variable is defined in profiles.xml and overwritten in + hosts.xml. + Thanks to Jindrich Vorlicek for reporting. + Fixes Bug 156. + +Changes 2009-06-19, v1.1.1-RC8 by Rainer Meier <r.meier (at) wpkg.org> +FIX: Fixed typo in install-success notification: + "Package and all chained packages ininstalled successfully." + changed to + "Package and all chained packages installed successfully." + Thanks to Stefan Pendl for reporting. + Fixes Bug 163. + +Changes 2009-06-18, v1.1.1-RC7 by Rainer Meier <r.meier (at) wpkg.org> +FIX: The /noUpgradeBeforeRemove remove switch was "on" by default. Somehow I + left that in the code by accident from my testing sessions. + Thanks to Stefan Pendl for reporting. + +Changes 2009-06-17, v1.1.1-RC6 by Rainer Meier <r.meier (at) wpkg.org> +MOD: Updated profiles.xsd. However I could not find a problem with the current + profile definition but Brian reported on the mailing list that his editor + throws a validation error. So I changed the definition according to his + proposal. + +Changes 2009-06-15, v1.1.1-RC5 by Rainer Meier <r.meier (at) wpkg.org> +MOD: Updated the list of volatile release markers (see previous change). +NEW: Added the possibility to define "volatileReleaseMarker" parameters within + config.xml. This allows users to extend the list of volatile release + markers on-the-fly. + +Changes 2009-06-15, v1.1.1-RC4 by Rainer Meier <r.meier (at) wpkg.org> +MOD: Updated version comparison algorithm to treat some version appendixes as + "volatile". Volatile means that WPKG would claim that a revision witout + that suffix is newer than the one which carries this suffix. Usually a + version is assumed to be higher if it has an additional suffix but in case + of RC (Release Candidate), M (Milestone) and I (Integration) releases it's + usually the opposite way around. For example: + A B Result + "1.0RC2" "1.0" B us newer (A is an "RC" version) + "1.5" "1.5I3656" A is newer (B is an "I"/intgration version) + "1.5" "1.5M3656" A is newer (B is an "M"/milestone version) + but (still) + "1.5" "1.5u3656" B is newer (B is an update version) + +Changes 2009-06-14, v1.1.1-RC3 by Rainer Meier <r.meier (at) wpkg.org> +MOD: The comparison of of version strings the same way how a human would read + it is quite difficult. Up to now WPKG supported only versions containing a + sequence of colon-separated digits. The algorithm has been re-worked to + support much more complicated version strings. Some examples include: + A B Result + "1" "2" B is newer + "1" "15" B is newer + "1.0" "1.2.b" B is newer + "1.35" "1.35-2" B is newer + "1.35-2" "1.36" B is newer + "1.35R3" "1.36" B is newer + "1" "1.0.00.0000" Versions are equal + "1" "1.0" Versions are equal + "1.35" "1.35-2" B is newer + "1.35-2" "1.35" A is newer + "1.35R3" "1.36R4" B is newer + "1.35-2" "1.35-2.0" Versions are equal + "1.35.1" "1.35.1.0" Versions are equal + Thanks to Jens Geile for asking an improved algorithm. + +Changes 2009-06-09, v1.1.1-RC2 by Rainer Meier <r.meier (at) wpkg.org> +NEW: Added a new switch: /noUpgradeBeforeRemove. + This switch allows to disable the upgrade-before-remove feature. + Usually WPKG upgrades a package to the latest available version before it + removes the package. This allows administrators to fix bugs in the package + and assure proper removal. + However this feature can lead to (sometimes unexpected) re-execution of + packages. For example if execution=always is used the package will run + once again before it is finally removed. + It's advised to leave this option on default unless you really know what + you're doing. + Thanks to Simon. +NEW: Unfortunately the %COMSPEC%-wrapping introduced in WPKG 1.1.0 to allow + STDOUT/STDERR flushing (see Bug 155) does not work in any case as + expected. Therefore I decided to revert the change and fall back to the + default execution behavior of WPKG 1.0. This should solve execution and + return code problems for the moment. + However the issue that commands which print > 4k to STDOUT/STDERR will + block and not finish until the timeout has been reached. So make sure + your installers are (quite-) silent on STDOUT/STDERR or to redirect the + output to a file or NUL by appending ">NUL 2>&1" to commands which are + using verbose printing. +MOD: Updated README.TXT in tools/ folder to reflect the truth that the tools + put into the tools folder are not automatically added to the PATH. + Thanks to Chris Allen. +MOD: Fixed typo in in database-inconsistency message. Thanks to Gerd Ott. +MOD: Changed Wording after successful installation of a package. + Thanks to Simon. +MOD: Enhanced variable expansion within <variable /> nodes. If the value + contains shell variables they are expanded immediately. + Thanks to Chris Allen for reporting and Stefan Pendl for fix suggestion. + +Changes 2009-05-23, v1.1.0 by Rainer Meier <r.meier (at) wpkg.org> +NEW: WPKG 1.1.0 is finally released! + WPKG 1.1.0 now becomse the stable branch and WPKG 1.0 releases are marked + as end of life. WPKG 1.1.0 is fully backwards compatible and entirely + replaces WPKG 1.0. Basically all you need to do in order to upgrade is to + replace wpkg.js in your installation. It is recommended to migrate + config.xml too because of a few new prameters. + Package, host and profile definitions can be kept from previous WPKG + versions. + +Changes 2009-05-20, v1.1.0-M31 by Rainer Meier <r.meier (at) wpkg.org> +MOD: Enhanced getPackageName() to prevent null pointer exceptions if the + package node passed within the arguments is null. According to the + documentation it should not throw an exception but return an empty string. + +Changes 2009-05-13, v1.1.0-M30 by Rainer Meier <r.meier (at) wpkg.org> +MOD: PsTools of Sysinternals have been taken over by Microsoft. The latest + version seems to require an additional (undocumented of course) switch + "-accepteula" in order to prevent a screen displaying the EULA to pop + up which has to be interactively accepted by the user. + The work-around for this is to add the "-accepteula" flag to the "special" + reboot command by default. + Fixes Bug 159. + +Changes 2009-05-09, v1.1.0-M29 by Rainer Meier <r.meier (at) wpkg.org> +FIX: Fixed bug which caused a null-pointer exception when a package marked for + removal (removed from the profile) was removed from the package tree on + server side. The bug has been reported in Bug 145. +FIX: Updated regression-test suite which contained some tests which failed + because they used unix path separator "/" instead of windows "\" + separator. Problems with this tests have been reported in Bug 145. + +Changes 2009-05-06, v1.1.0-M28 by Rainer Meier <r.meier (at) wpkg.org> +FIX: Dependency removal was not fully fixed. Actually the bug has been fixed + but the fix contained another issue which caused the same exception. + In fact WPKG was comparing the package name with the package ID during + the check if the package has been removed already during this session. + This of course caused WPKG to belive that it's the first time the package + is attempted to be removed and returned a failure code. + Fixes Bug 137 and 145. + +Changes 2009-04-30, v1.1.0-M27 by Rainer Meier <r.meier (at) wpkg.org> +FIX: WPKG was ignoring the command-line parameter /log_file_path:<path>. + This bug was not affecting log_file_path property set in config.xml. + Fixes Bug 157. + Thanks to Luca Manganelli. + +Changes 2009-04-28, v1.1.0-M26 by Rainer Meier <r.meier (at) wpkg.org> +FIX: STDOUT/STDERR flushing code did not work for non-cmd/%COMSPEC% based + installer scripts. Unfortunately on Windows it looks like the I/O re- + director parameters ">" or "2>" need to be handled by the application + and not by the shell/OS. As a result appending ">NUL" caused invalid/ + unknown arguments to be passed to some commands (like msiexec). As a + work-around WPKG is now executing all commands within a %COMSPEC% shell + unless they already use STDOUT & STDERR redirectors. + +Changes 2009-04-27, v1.1.0-M25 by Rainer Meier <r.meier (at) wpkg.org> +FIX: Fixed a problem where removing the same package multiple times during one + session ended in a null pointer exception. This could have happened if + packages with dependencies are removed and therefore the packages which + depend on the removed package is removed too. + In case a package is removed two times now WPKG will detect it. In case + the package has been removed successfully during this session the remove + function returns successful state. + Fixes Bug 137 and 145 I hope. + +Changes 2009-04-26, v1.1.0-M24 by Rainer Meier <r.meier (at) wpkg.org> +FIX: Added work-around for STDOUT/STDERR flushing problem. Unfortunately + reading from output streams is terribly broken in WSH. Reading output from + the streams blocks if the process does not write to the stream. + Even reading the "AtEndOfStream" property blocks which makes it impossible + to read from a stream which receives data without blocking the application. + As a work-around WPKG now makes sure STDOUT/STDERR is redirected to NUL + to discard them completely. Well, if your command includes the strings + " >" or " 2>" WPKG will not replace them by NUL redirects. This means you + can still redirect the output manually to files (or redirect to NUL by + yourself). The code just makes sure that output which would be discarded + anyway is not even sent to the buffers. + The drawback of this work-around is that it is not possible to capture the + output from within WPKG and therefore it will not appear within the logs. + However this is the same behavior as all WPKG versions (except 1.1.0-M21) + had. So no big loss. + Fixes Bug 155. + +Changes 2009-04-22, v1.1.0-M23 by Rainer Meier <r.meier (at) wpkg.org> +NEW: Italian LCIDs added to configuration (config.xml). + Thanks to Marco Gaiarin. + +Changes 2009-04-12, v1.1.0-M22 by Rainer Meier <r.meier (at) wpkg.org> +MOD: Improved file downloading. Different versions of MSXML use different + factories. Now WPKG supports multiple factories. +MOD: Re-arranged download functions to avoid false-positive warning by + Avira AntiVir where WPKG was wrongly recognized as HTML/ADODB.Exploit.Gen. + +Changes 2009-04-11, v1.1.0-M21 by Rainer Meier <r.meier (at) wpkg.org> +FIX: Unused Array removed from getPackageDependencies() function. Seems to be + some left-over from a testing session. + Fixes Bug 154. Thanks to Jason Oster. + +Changes 2009-04-11, v1.1.0-M20 by Rainer Meier <r.meier (at) wpkg.org> +FIX: Writing log events to event log with null value might fail due to the + fact that WshShell.logEvent() method does not accept null values + directly. Now the string "null" will be logged in such case. + Fixes Bug 135. + +Changes 2009-04-11, v1.1.0-M19 by Rainer Meier <r.meier (at) wpkg.org> +MOD: Added flushing of STDOUT and STDERR during exec(). Due to strange + behavior of WSH a command might block if the buffer for STDOUT/STDERR + is full. Now WPKG flushes this buffer every second and prints its + contents to the debug log. This also allows you to see the console + output of the executed command if any. + +Changes 2009-04-11, v1.1.0-M18 by Rainer Meier <r.meier (at) wpkg.org> +FIX: Fixed possible errors when a package is removed twice during the same + session. This could happen if a package depends on multiple other + packages which are removed during a WPKG session. + Fixes Bug 153. Thanks to Jason Oster. + +Changes 2009-04-10, v1.1.0-M17 by Rainer Meier <r.meier (at) wpkg.org> +FIX: Fixed loading of package-specific environment for remove commands. + Previously environment variables set for a package have been unavailable + to remove commands. + Fixes Bug 146. Thanks to Jason Oster. +FIX: Fixed packages.xsd - type of some elements was wrongly set to String. + Now correctly refers to packageReference where appropriate + (chain, depends, include). + Fixed 'type' attribute of 'check' element to be specified in lower case. + +Changes 2009-04-10, v1.1.0-M16 by Rainer Meier <r.meier (at) wpkg.org> +MOD: Changed misspelled word "referemces" to "references" + Changed quoting in "Removal of <package> successful." message. + Fixes Bug 152. Thanks to Jason Oster. + +Changes 2009-04-08, v1.1.0-M15 by Rainer Meier <r.meier (at) wpkg.org> +MOD: Modified message when removing depending package from + Removal of depending package package '<package-id'> ... + to + Removal of depending package '<package-id'> ... + Fixes Bug 151.. Thanks to Jason Oster. + +Changes 2009-04-07, v1.1.0-M14 by Rainer Meier <r.meier (at) wpkg.org> +FIX: Fixed removal of package dependencies by fixing up removePackage() return + value. Anyway by definition it should return the success state according + to the documentation which was not the case yet. + Fixes Bug 150. Thanks to Jason Oster. + +Changes 2009-03-29, v1.1.0-M13 by Rainer Meier <r.meier (at) wpkg.org> +MOD: Fixed typo when reading fixed IP adresses from registry. It looks like + it did not have any effect on the functionality. + Changed + var fixedIPs = getRegistryValue(regBase, "IPAddress").toArray(); + to + var fixedIPs = getRegistryValue(regBase + "IPAddress").toArray(); + Thanks to Alan for reporting it. +NEW: Added possiblity to chain packages. Use the following synatx: + <chain package-id="some-id" /> + A chained package is pretty much similar to the + <depends package-id="some-id" /> + functionality but chained packages are installed right after the package + which specifies the chain. + Personally I prefer to set a dependency on the "chained" package to assure + that the "chaining" package is installed _before_ the package which + depends on it. + + +Changes 2009-03-29, v1.1.0-M12 by Rainer Meier <r.meier (at) wpkg.org> +MOD: Updated source to be readable by Eclipse JSDT. This will be my primary + development environment now. + The change already helped me to identify a bunch of unused code and to + improve code quality in general. + +Changes 2009-03-29, v1.1.0-M11 by Rainer Meier <r.meier (at) wpkg.org> + +MOD: Changed behavior of wpkg.js again in case reboot is overridden. + Previously it was exiting with exit code 3010 but this caused WPKG client + to initiate a reboot immediately after wpkg.js terminated. + Now WPKG returns code 3010 << 8 (3010 bit-shifted by 8 bits to the left) + which evaluates to a decimal value of 770560. This allows an external + tool to verify if a reboot was initiated but overridden. + If you would like WPKG to exit with code 3010 without issuing a reboot + consider to specify a reboot command within the configuration + (see rebootCmd in config.xml or /rebootcmd: switch) which points to a + script which does not do anything. In this case WPKG executes the script + (e.g. reboot.cmd) and then exits with code 3010. + This was discussed in Bug 132. +FIX: Fixed invalid env-splitting introduced in earlier pre-release version. +FIX: Fixed environment setup for package install/remove/upgrade. +FIX: Package IDs wrongly read from profile. +FIX: Fixed recursive dependency tree build introduced in previous milestone + checkin. +FIX: Fixed error if profile does not have any packages assigned. +NEW: Shows usage if executed without parameter (instead of just throwing an + error and exiting). +MOD: Improved documentation. + + +Changes 2009-03-12, v1.1.0-M10 by Rainer Meier <r.meier (at) wpkg.org> +FIX: In case a command is executed which does not exist (WScript.Shell.exec() + throws exception) WPKG does not immediately terminate. + +Changes 2009-02-16, v1.1.0-M9 by Rainer Meier <r.meier (at) wpkg.org> +FIX: After quite an intensive search I migrated my development tools from + JSEclipse to Eclipse JSDT (JavaScript Development Tools). Unfortunately + it does not yet fully support all WSH classes because it's mainly targeted + to be used for Ajax and Web development and used for scripts running + within IE and Firefox. However it provides syntax checking, type and style + checks. Unfortunately this means I had to re-write some parts slightly in + order to get rid of errors/warnings yielded by JSDT within parts of the + code which was accepted by Microsoft JScript interpreter. However I think + this slightly improved the quality of the code and will for sure help + avoiding unnecessary mistakes in the future. + +FIX: Removed unnecessary check for undefined checks in getPackageChecks() + method. It seems that selectNodes(String) never returns null but instead + returns empty collection. + +Changes 2008-05-11, v1.1.0-M8 by Rainer Meier <r.meier (at) wpkg.org> +FIX: Updated help and config.xml with grammar and consistency fixes as proposed + by Jens Geile. Thanks Jens. Fixes Bug 116. + + +Changes 2008-05-08, v1.1.0-M7 by Rainer Meier <r.meier (at) wpkg.org> (not released) +NEW: Variables now supported for all package actions (install, remove upgrade, + downgrade, check). This issue was reported on the mailing list. + +FIX: Fixed missing quote in debug output. Changed + Found package node "'Package name (PackageID) in package database " + to + Found package node "'Package name' (PackageID) in package database." + Thanks to Jens Geile for reporting it. Fixes Bug 115. + + +Changes 2008-04-24, v1.1.0-M6 by Rainer Meier <r.meier (at) wpkg.org> +NEW: File size checks were broken due to faulty code in get file size method + which was modified to support expanding of environment variables. + WPKG 1.0 is not affected. This fixes Bug 112. Thanks to Daniel Dehennin! + + +Changes 2008-04-21, v1.1.0-M5 by Rainer Meier <r.meier (at) wpkg.org> +NEW: Improved handling of event log system errors. In case writing to event log + causes an exception WPKG will not exit silently any more but fall back to + write to STDOUT and log to the log file as appropriate (depending on log + level). Thanks to Brian May for reporting and debugging. + This fixes Bug 109. + + +Changes 2008-04-10, v1.1.0-M4 by Rainer Meier <r.meier (at) wpkg.org> +FIX: Fixed Bug 107. Registry equality checks throw an error in case of checked + value is of type REG_DWORD or REG_BINARY. Now the values are converted to + strings before comparing it to the 'value' attribute. REG_MULTI_SZ and + REG_BINARY values are concatenated using newline characters. For + REG_BINARY values each octett is converted to its decinal number + representation. Examples: + REG_MULTI_SZ = a + b + c + value = "a + b + c" + will match. + REG_BINARY values will be converted to multiline string as well. Each octett of the binary value + is converted to its decimal representation. + REG_BINARY = "11 22 33 44" + value = "17 + 34 + 51 + 68" + will match. + +MOD: Misleading/confusing info message about non-zero exit code (even if exit + code was 0) changed from: + Command '<cmd> returned non-zero exit code [<code>]. This exit code... + to + Command '<cmd>' returned exit code [<code>]. This exit code... + The quoting has been fixed as well (see above). + +MOD: Download XML nodes are now allowed as sub-nodes of any command (install/ + upgrade/downgrade/remove). This allows you to specify a download which is + only downloaded for a specific command. This was implemented since it + usually makes no sense to download the installation package again right + before the remove commands are executed (which usually runs a local + uninstall command which does not need the original installer). + Specifying a download XML node on the global package level (not below a + specific command definition) is still allowed. Such downloads will be + executed regardless of the command to be executed. So you can specify some + global downloads which are executed in any case. + Note: If multiple install (or upgrade/downgrade/remove) commands are + specified WPKG will download the the files of all command nodes of the + same kind before starting to execute the commands in sequence. + Example: + <package...> + <donwoad url="http://example.org/package.exe" target="package.exe" /> + <install cmd="%TEMP%\file.exe some arguments" ...> + <donwoad url="http://example.org/file.exe" target="file.exe" /> + </install> + <install cmd="%TEMP%\file2.exe some arguments" ...> + <donwoad url="http://example.org/file2.exe" target="file2.exe" /> + </install> + <upgrade cmd="%TEMP%\update.exe arguments" ...> + <donwoad url="http://example.org/update.exe" target="update.exe" /> + </upgrade> + </package> + This definition will simply download "package.exe" (global). "file.exe" + and "file2.exe" right before the install commands are executed in + seuence. + In case of upgrade it will download "package.exe" (global) and + "update.exe" before executing the upgrade command(s). + +NEW: Checks of type 'execute' allow to use environment variables within the + 'path' attribute now. For example the following specification is valid + now: + "%SystemRoot%\mycheck.cmd" + + +Changes 2007-04-05, v1.1.0-M3 by Rainer Meier <skybeam (at) users.sourceforge.net> +NEW: Package uninstall checks have been extended. The following values are now + valid: + type="uninstall" path="prg" condition="versionsmallerthan" value="1.1" + Check if version is smaller than the specified value + + type="uninstall" path="prg" condition="versionlessorequal" value="1.1" + Check if version is less or equal than the specified value + + type="uninstall" path="prg" condition="versionequalto" value="1.1" + Check if version is exactly equal to the specified value + + type="uninstall" path="prg" condition="versiongreaterorequal" value="1.1" + Check if version is greater or equal to the specified value + + type="uninstall" path="prg" condition="versiongreaterthan" value="1.1" + Check if version is greater than the specified value + + The version is compared to the DisplayVersion value within the uninstall + entry within the Windows registry. + Changes are based on a patch by Richard de Vos. Thanks! + +NEW: Added new check type: "execute". This allows you to execute any script + which checks if an application is installed - based on the exit code of + the script. + Usage: + type="execute" path="\\path\to\script.cmd" + condition="exitcodesmallerthan" value="0" + Evaluates true if the exit code is negative + + type="execute" path="\\path\to\script.cmd" + condition="exitcodelessorequal" value="0" + Evalueates true if exit code is 0 or negative + + type="execute" path="\\path\to\script.cmd" + condition="exitcodeequalto" value="0" + Evaluates true only if exit code is exactly 0 + + type="execute" path="\\path\to\script.cmd" + condition="exitcodegreaterorequal" value="0" + Evaluates true if exit code is 0 or any poitive number + + type="execute" path="\\path\to\script.cmd" + condition="exitcodegreaterthan" value="0" + Evaluates true if exit code is any positive number + + This type of check also allows very complex checks. For example there is a + limitation of the RegRead method used by WPKG to query registry values + which contain backslashes '\'. Now you can execute a batch script which + checks for such registry values using 'reg query ...'. + +NEW: Added download extension as initially proposed by Tomasz Chmielewski (with + some changes). A download definition is specified as follows: + <download url="http://server.domain.tld/path/to/file.msi" + target="subdir/file.msi" timeout="7200" /> + + The 'timeout' attribute is entirely optional. It defaults to the value of + 'downloadTimeout' as specified within config.xml (7200 if not omitted). + The value is specified in seconds. + + The 'target' attribute specifies a path relative to the 'downloadDir' as + specified within config.xml (defaults to '%TEMP%' if omitted). + NOTE: You need to specify the full file path, including the file name, not + just a directory name! + + So to install the package above could be installed by the following + install command definition: + <install cmd="msiexec /qn /i %TEMP%\subdir\file.msi"> + +NEW: Added downgrade command nodes. These commands are executed if the version + installed on the client is newer thant the one on the server side. + Example: + <downgrade cmd=""\\Store1\Mozilla\Firefox Setup 2.0.0.12.exe" /S"/> + +NEW: Added /sendStatus flag and 'sendStatus' configuration parameter in + config.xml. The parameter allows to enable printing of status information + to STDOUT in order to be parsed by the calling program (e.g. WPKG client). + This allows the calling program to display some status messages about the + synchronization process. + The status update might not be very linear depending on the package sizes + but at least it allows to display the start time (and therefore also + elapsed time to the user. So the user can see at least how many percent of + packages have been synchronized already and for how long the current task + is running currently. + Users usually feel much less annoyed when waiting for a task to be + finished if there are at least some screen updates and a kind of progress + bar which is updating from time to time. + Note: STDOUT was chosen due to the fact that I was unable to find a way to + write to named pipes from JScript yet. However the implementation could + easily be adapted to pipes or sockets. + I also updated wrapper.js to read STDOUT of the called wpkg.js and print + it to its own STDOUT. This required if WPKG client is going to read the + output of wpkg.js, in that case output needs to be "chained" to be + forwarded to the GUI. + + +Changes 2008-02-18, v1.1-M2 by Rainer Meier <skybeam (at) users.sourceforge.net> +FIX: Included cosmetic fix for Bug 104 (opening quotation missing). + This fix adds a missing opening quotation in debug output when a new + package is added to the local settings node (after installation success). +FIX: Fixed Bug 103. /help screen is not showing up if config.xml is missing and + null-pointer exception is thrown. + + +Changes 2007-01-14, v1.1-M1 by Rainer Meier <skybeam (at) users.sourceforge.net> +NEW: removePackage now removes all packages which depends on the one to be + removed as well (recursively). This assures that after poackage uninstall + no packages are left installed which miss their required dependency. + Please note that if a package which depends on the one to be removed + specifies an immediate reboot the reboot takes place right after the + this package has been removed. In such case the package initially + requested to be removed will still be there after the reboot. + To avoid this it is possible that depending packages use the postponed + reboot functionality. Alternatively you can use the /noreboot switch + to advice WPKG to ignore each reboot request. Note that in such cases + some packages will not properly finish their uninstall procedure. + In case removing of any package from the dependency tree fails WPKG + will stop uninstalling and print a message. In such case the package + you requested to remove will still be there because there is at least one + more package which depends on it. You can advice WPKG to remove the + requested package in any case by using the /force switch. Warning: In such + case it might happen that some packages depending on the removed one could + not be removed and therefore will be left on the system (probably not + working any more). diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/files/home/wpkg/documents/GPL-2 b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/files/home/wpkg/documents/GPL-2 new file mode 100644 index 0000000000000000000000000000000000000000..5a965fbc58c9914c3e70e7eb0681acc3a3acd281 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/files/home/wpkg/documents/GPL-2 @@ -0,0 +1,280 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/files/home/wpkg/documents/INSTALL b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/files/home/wpkg/documents/INSTALL new file mode 100644 index 0000000000000000000000000000000000000000..1b80db619a0abab6bebb4884cb766ba35c487aed --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/files/home/wpkg/documents/INSTALL @@ -0,0 +1,2 @@ +For installation instructions, documentation and additional info, visit +<http://wpkg.org/> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/files/home/wpkg/documents/LICENSE b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/files/home/wpkg/documents/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..e530d984d0cb13461d49d019b64fb6fe1ef35247 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/files/home/wpkg/documents/LICENSE @@ -0,0 +1,20 @@ +wpkg - Windows automated software deployment tool +Copyright (C) 2003 Jerry Haltom +Copyright (C) 2005-2007 Tomasz Chmielewski <tch (at) wpkg . org> +Copyright (C) 2005 Aleksander Wysocki <papopypu (at) op . pl> +Copyright (C) 2007 Rainer Meier <skybeam (at) users.sourceforge.net> + + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/files/home/wpkg/documents/README b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/files/home/wpkg/documents/README new file mode 100644 index 0000000000000000000000000000000000000000..87fe55fed063ea1add80d8e8ecc4d808a241ec19 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/files/home/wpkg/documents/README @@ -0,0 +1,51 @@ +Windows Packager +Simple package distribution utility for Windows + +This program is used to push/pull software packages, such as Service Packs, +hotfixes, or program installations from a central server to a number of +workstations. + +Package definations are stored in packages.xml, profile definations in +profiles.xml and host definitions in hosts.xml. The configuration is stored in +config.xml. + +A package is a software entity that can be installed and removed by running a +series of command lines. All of those commands must be successful, either by +returning a zero exit code, or by returning an exit code listed for the +command. + +The system keeps track of what versions of what packages are currently +installed and what version are available in order to decide weither to install, +remove, or upgrade a package. + +Profiles denote a certain "class" of workstations, such as departments. +Profiles can depend on other profiles making the resulting profile including all +packages from the profile it depends on. + +Host definitions are used by WPKG to assign profiles to hosts depending on their +host name or IP address. Regular expression matchin can be used for simpified +group matching. + +A Host definition assigns a profile to the host WPKG is running on. A profile +can depend on other profiles and assign packages. The packages finally define +how the package/software is installed on the host. + +Installation consists of copying the wpkg.js, packages.xml, profiles.xml, +hosts.xml and config.xml files to a centralized folder on a file server. + +The administrator would then define his packages in packages.xml, and then +define his profile structure in profiles.xml. Each workstation will need to +be configured to run the WPKG command in order to install/update/remove +packages from itself. The recommended way to achieve this is to install WPKG +client which runs on the client as a Windows service. + +The values in config.xml control WPKG behaviour but in most environments the +values can be kept at their defaults. Open the file in your favourite XML +editor. It contains a lot of comments to describe each parameter. + +Logs are reported to the Windows Event Log ant to plain-text log files which can +be stored on a public share too. + + +For installation instructions, documentation and additional info, visit +<http://wpkg.org/> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/files/home/wpkg/packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/files/home/wpkg/packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..6e6945a9c4c8d8d3104d9b4c799ed376ac7dbe8a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/files/home/wpkg/packages.xml @@ -0,0 +1,54 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<!-- Available package database. + + This is a list of all packages that can be deployed to workstations. + + Each package has the following attributes: + + id A unique identifier representing the package. Should be + short and to the point. + + name Longer textual description of the package. This should be + the full product name. + + revision User created integer to represent the "version" of the + specific package. Should be incremented when creating a new + release. + + reboot If "true" system reboots when done installing, removing or + upgrading the package. + + priority Specifies a numeric value that determines in what order a + package will be installed. + + The following additional elements can or must be included within a package: + + depends Specifies that this package depends on another package and + optionally version. Either that package must be installed or + must be installable. + + install Contains command(s) to be run when the package is to be + installed. + + remove Contains command(s) to be run when the package is to be + removed. + + upgrade Contains commands(s) to be run when the package is already + installed, but the new revision number is greater than the + old revision number. + + env Sets an environmental variable to the specified value + (not yet implemented). + + THIS IS A SAMPLE FILE + + For more info, see http://wpkg.org/index.php/Category:Documentation + +--> + +<packages> + + <package/> + +</packages> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/files/home/wpkg/tools/postinstall.bat b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/files/home/wpkg/tools/postinstall.bat new file mode 100644 index 0000000000000000000000000000000000000000..05c0a0c4c2cc9f520b75a4a3b4426a074e3927f7 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/files/home/wpkg/tools/postinstall.bat @@ -0,0 +1,6 @@ +rem remet les chemins comme ils etaient avant l'installation +regedit /S %WINDIR%\sauv_menu-dem.reg +regedit /S %WINDIR%\sauv_menu-dem2.reg +del /F %WINDIR%\sauv_menu-dem.reg +del /F %WINDIR%\sauv_menu-dem2.reg + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/files/home/wpkg/tools/restart_wpkg.bat b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/files/home/wpkg/tools/restart_wpkg.bat new file mode 100644 index 0000000000000000000000000000000000000000..b8ad48b06d5d4803a2a25298a588dfd8eec315eb --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/files/home/wpkg/tools/restart_wpkg.bat @@ -0,0 +1,3 @@ +net stop wpkgservice +taskkill /F /IM WPKGSrv.exe +net start wpkgservice \ No newline at end of file diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/files/home/wpkg/wpkg.js b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/files/home/wpkg/wpkg.js new file mode 100644 index 0000000000000000000000000000000000000000..d6a066ea38cce3cc0fc48641b8caedc79010ba69 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/files/home/wpkg/wpkg.js @@ -0,0 +1,10676 @@ +var WPKG_VERSION = "1.3.0"; +/******************************************************************************* + * + * WPKG - Windows Packager + * + * Copyright 2003 Jerry Haltom<br> + * Copyright 2005 Aleksander Wysocki <papopypu (at) op . pl><br> + * Copyright 2005-2006 Tomasz Chmielewski <mangoo (at) wpkg . org><br> + * Copyright 2007-2011 Rainer Meier <r.meier (at) wpkg.org><br> + * + * Please report your issues to the list on http://wpkg.org/ + */ + +/** + * Displays command usage. + */ +function showUsage() { +var message = "" + +"If you cannot read this since it is displayed within a dialog-window please \n" + +"execute 'cscript wpkg.js /help' on the command line. This will print all \n" + +"messages to the console. \n\n" + +"Command Line Switches \n" + +"===================== \n" + +"Note: These command line switches overwrite parameters within config.xml. For \n" + +"example the /quiet flag overwrites an eventually present quiet parameter within \n" + +"config.xml. \n" + +"Usually you should specify as few parameters as possible since changing \n" + +"config.xml on the server might be much easier than changing all client-side \n" + +"stored parameters. Typically you would use the following command-line in \n" + +"production: \n" + +" wpkg.js /synchronize \n" + +"\n" + +"Frequently used parameters (package operations, you need to choose one): \n" + +"======================================================================== \n" + +"\n" + +"/install:<package>[,package2[,package3,[...]]] \n" + +" Install the specified package(s) on the system. \n" + +"\n" + +"/query:<option> \n" + +" Display a list of packages matching the specified criteria. Valid \n" + +" options are: \n" + +"\n" + +" a - Query all packages (includes installed packages and package database). \n" + +" x - List packages which are not installed but in package database. \n" + +" i - List all packages which are currently installed. \n" + +" I - List packages which are about to be installed during synchronization. \n" + +" u - List packages which are about to be upgraded during synchronization. \n" + +" d - List packages which are about to be downgraded during synchronization. \n" + +" r - List packages which are about to be removed during synchronization. \n" + +" m - List all modifications which would apply during synchronization \n" + +" (equal to Iudr) \n" + +" n - List packages which belong to the profile but are not modified during \n" + +" synchronization. \n" + +" s - List host attributes from settings (wpkg.xml). \n" + +" l - List host attributes read from local host. \n" + +"\n" + +"/remove:<package>[,package2[,package3,[...]]] \n" + +" Remove the specified package(s) from the system. \n" + +"\n" + +"/show:<package> \n" + +" Display a summary of the specified package, including it's state. \n" + +"\n" + +"/upgrade:<package>[,package2[,package3,[...]]] \n" + +" Upgrade the already installed package(s) on the system. \n" + +"\n" + +"/synchronize \n" + +" Synchronize the current program state with the suggested program state \n" + +" of the specified profile. This is the action that should be called at \n" + +" system boot time for this program to be useful. \n" + +"\n" + +"/help \n" + +" Show this message. \n" + +"\n" + +"\n" + +"Optional parameters (usually defined within config.xml): \n" + +"======================================================== \n" + +"\n" + +"/base:<path> \n" + +" Set the local or remote path to find the xml input files. \n" + +" Can also be set to a web URL for direct XML retrieval from wpkg_web. \n" + +"\n" + +"/dryrun[:<true>|<false>] \n" + +" Do not execute any actions. Implies debug mode. \n" + +"\n" + +"/quiet[:<true>|<false>] \n" + +" Use the event log to record all error/status messages. Use this when \n" + +" running unattended. \n" + +"\n" + +"/nonotify[:<true>|<false>] \n" + +" Logged in users are not notified about impending updates. \n" + +"\n" + +"/noreboot[:<true>|<false>] \n" + +" System does not reboot regardless of need. \n" + +"\n" + +"/quitonerror[:<true>|<false>] \n" + +" Quit execution if the installation of any package was unsuccessful \n" + +" (default: install next package and show the error summary). \n" + +"\n" + +"/sendStatus[:<true>|<false>] \n" + +" Send status messages on STDOUT which can be parsed by calling program to \n" + +" display status information to the user. \n" + +"\n" + +"/noUpgradeBeforeRemove[:<true>|<false>] \n" + +" Usually WPKG upgrades a package to the latest available version before it \n" + +" removes the package. This allows administrators to fix bugs in the package \n" + +" and assure proper removal.\n" + +"\n" + +"/applymultiple[:<true>|<false>] \n" + +" Apply profiles of all host nodes with matching attributes. \n" + +" Only first matching host node is returned if not switched on. \n" + +" This parameter must be used with caution, it can break existing setup. \n" + +"\n" + +"Rarely used parameters (mainly for testing): \n" + +"============================================ \n" + +"\n" + +"/config:<path> \n" + +" Path to the configuration file to be used. The path might be absolute \n" + +" or relative but including the XML file name. This parameter is entirely \n" + +" OPTIONAL and should normally not be specified at all. \n" + +" If not specified the configuration will be searched at: \n" + +" <script-path>\\config.xml \n" + +" where <script-path> is the directory from which the script is executed. \n" + +" e.g. '\\\\server\\share\\directory\\config.xml'. \n" + +" e.g. 'directory\\config.xml'. \n" + +" You can use environment variables as well as the following expressions: \n" + +" [HOSTNAME] Replaced by the executing hostname. \n" + +" [PROFILE] Replaced by the concatenated list of profiles applied. \n" + +"\n" + +"/settings:<path> \n" + +" Path to the settings (local WPKG database) file to be used. The path might \n" + +" be absolute or relative but including the XML file name. This parameter is \n" + +" entirely OPTIONAL and should normally not be specified at all. \n" + +" If not specified the settings file will be searched at: \n" + +" %SystemRoot%\\system32\\wpkg.xml \n" + +" e.g. '%SystemRoot%\\system32\\wpkg-custom.xml'. \n" + +" e.g. '\\\\server\share\directory\\[HOSTNAME].xml'. \n" + +" If you store the settings file on a share make sure the names is unique! \n" + +" You can use environment variables as well as the following expressions: \n" + +" [HOSTNAME] Replaced by the executing hostname. \n" + +" [PROFILE] Replaced by the concatenated list of profiles applied. \n" + +"\n" + +"/queryMode:<mode> \n" + +" Allows to switch to remote mode where package verification is skipped. \n" + +" remote: Disable package checks and assume that packages in settings \n" + +" database are still correctly installed. In remote mode also the \n" + +" host information is read from the local settings database. \n" + +" local: Default setting. Query verifies package status using all checks. \n" + +" Note: Query mode can only be used with the query switch. \n" + +"\n" + +"/profile:<profile> \n" + +" Force the name of the profile to use. If not specified, the profile to use \n" + +" is looked up in hosts.xml. \n" + +"\n" + +"/debug[:<true>|<false>] or /verbose[:<true>|<false>] \n" + +" Enable debug output. Please note that this parameter only influences \n" + +" notification and event log output. It does not affect the logging level. \n" + +" It is possible to get debug-level output even without using this \n" + +" switch. \n" + +"\n" + +"/force[:<true>|<false>] \n" + +" When used in conjunction with /synchronize WPKG will ignore the local \n" + +" settings file (wpkg.xml) and re-build the database with installed \n" + +" packages. \n" + +" When used in conjunction with /remove forces removal of the specified \n" + +" package even if not all packages which depend on the one to be removed \n" + +" could be removed. \n" + +"\n" + +"/forceinstall[:<true>|<false>] \n" + +" Force installation over existing packages. \n" + +"\n" + +"/host:<hostname> \n" + +" Use the specified hostname instead of reading it from the executing host. \n" + +"\n" + +"/os:<hostos> \n" + +" Use the specified operating system string instead of reading it from the \n" + +" executing host. \n" + +"\n" + +"/ip:<ip-address-1,ip-address-2,...,ip-address-n> \n" + +" Use the specified ipaddresses instead of reading it from the executing host. \n" + +"\n" + +"/domainname:<domain> \n" + +" Name of the windows domain the computer belongs to. \n" + +" This permit to use group membership even on a non-member workstation. \n" + +"\n" + +"/group:<group-name-1,group-name-2,...,group-name-n>\n" + +" Name of the group the computer must belongs to instead of reading it from \n" + +" the executing host. \n" + +"\n" + +"/ignoreCase[:<true>|<false>] \n" + +" Disable case sensitivity of packages and profiles. Therefore you can \n" + +" assign the package 'myapp' to a profile while only a package 'MyApp' is \n" + +" defined within the packages. \n" + +" Note that this change requires modification of the package/profile/host nodes \n" + +" read from the XML files. All IDs are converted to lowercase. \n" + +" Note: This requires converting all profile/package IDs to lowercase. \n" + +" Therefore you will only see lowercase entries within the log files \n" + +" and also within the local package database. \n" + +"\n" + +"/logAppend[:<true>|<false>] \n" + +" Append log files instead of overwriting existing files. \n" + +" NOTE: You can specify a log file pattern which will create a new file on \n" + +" each run. Appending logs might cause problems with some log rotation \n" + +" scripts as well. So use it with caution. \n" + +"\n" + +"/logfilePattern:<pattern> \n" + +" Pattern for log file naming: \n" + +" Recognized patterns: \n" + +" [HOSTNAME] Replaced by the executing hostname. \n" + +" [PROFILE] Replaced by the concatenated list of profiles applied. \n" + +" [YYYY] Replaced by year (4 digits). \n" + +" [MM] Replaced by month number (2 digits). \n" + +" [DD] Replaced by the day of the month (2 digits). \n" + +" [hh] Replaced by hour of the day (24h format, 2 digits). \n" + +" [mm] Replaced by minutes (2 digits). \n" + +" [ss] Replaced by seconds (2 digits). \n" + +"\n" + +" Examples: \n" + +" 'wpkg-[YYYY]-[MM]-[DD]-[HOSTNAME].log' \n" + +" results in a name like 'wpkg-2007-11-04-myhost.log' \n" + +" NOTE: Using [PROFILE] causes all log messages before reading profiles.xml \n" + +" to be temporarily written to local %TEMP% folder. So they might \n" + +" appear on the final log file with some delay. \n" + +"\n" + +"/logLevel:[0-31] \n" + +" Level of detail for log file: \n" + +" use the following values: \n" + +" Log level is defined as a bitmask. Just sum up the values of each log \n" + +" severity you would like to include within the log file and add this value \n" + +" to your config.xml or specify it at /logLevel:<#>. \n" + +" Specify 0 to disable logging. \n" + +" 1: log errors only \n" + +" 2: log warnings \n" + +" 4: log information \n" + +" 8: log audit success \n" + +" 16: log audit failure \n" + +" Example: \n" + +" 31 log everything (1+2+4+8+16=31) \n" + +" 13 log errors, information and audit success (1+4+8=13) \n" + +" 3 log errors and warnings only (1+2=3) \n" + +" Default is 0 which will suppress all messages printed before log level is \n" + +" properly initialized by config.xml or by /logLevel:<#> parameter. \n" + +"\n" + +"/log_file_path:<path> \n" + +" Path where the log files will be stored. Also allows specifying an UNC \n" + +" path (e.g. '\\server\share\directory'). Make sure the path exists and \n" + +" that the executing user has write access to it. \n" + +" NOTE: If you set this parameter within config.xml please note that you \n" + +" need to escape backslashes: \n" + +" e.g. '\\\\server\\share\\directory'. \n" + +"\n" + +"/noforcedremove[:<true>|<false>] \n" + +" Do not remove packages from local package database if remove fails even \n" + +" if the package does not exist in the package database on the server and \n" + +" is not referenced within the profile. \n" + +" By default packages which have been removed from the server package \n" + +" database and the profile will be uninstalled and then removed \n" + +" from the local package database even if uninstall failed. \n" + +" This has been introduced to prevent a package whose uninstall script \n" + +" fails to repeat its uninstall procedure on each execution without the \n" + +" possibility to fix the problem since the package (including its \n" + +" uninstall string) is available on the local machine only. \n" + +" HINT: If you like the package to stay in the local database (including \n" + +" uninstall-retry on next boot) just remove it from the profile but do not \n" + +" completely delete it from the package database. \n" + +"\n" + +"/noremove[:<true>|<false>] \n" + +" Disable the removal of all packages. If used in conjunction with the \n" + +" /synchronize parameter it will just add packages but never remove them. \n" + +" Instead of removing a list of packages which would have been removed \n" + +" during that session is printed on exit. Packages are not removed from \n" + +" the local settings database (wpkg.xml). Therefore it will contain a list \n" + +" of all packages ever installed. \n" + +" Note that each package which is requested to be removed (manually or by \n" + +" a synchronization request) will be checked for its state by executing its \n" + +" included package checks. If the package has been removed manually it will \n" + +" also be removed from the settings database. This does not apply to packages \n" + +" which do not specify any checks. Such packages will remain in the local \n" + +" settings database even if the software has been removed manually. \n" + +"\n" + +"/noDownload[:<true>|<false>] \n" + +" Ignore all download nodes in packages. \n" + +" Useful for testing and in case your download targets already exist. \n" + +"\n" + +"/norunningstate[:<true>|<false>] \n" + +" Do not export the running state to the registry. \n" + +"\n" + +"/rebootcmd:<option> \n" + +" Use the specified boot command, either with full path or \n" + +" relative to the location of wpkg.js \n" + +" Specifying 'special' as option uses tools\psshutdown.exe \n" + +" from www.sysinternals.com - if it exists - and a notification loop \n"; + + alert(message); +} + +/******************************************************************************* + * + * Global variables + * + ******************************************************************************/ +/** base where to find the XML input files */ +var wpkg_base = ""; + +/** forces to check for package existence but ignores wpkg.xml */ +var force = false; + +/** force installation */ +var forceInstall = false; + +/** + * Forced remove of non-existing packages from wpkg.xml even if uninstall + * command fails. + */ +var noForcedRemove = false; + +/** defined if script should quit on error */ +var quitonerror = false; + +/** Debug output. */ +var debug = false; + +/** Dry run */ +var dryrun = false; + +/** notify user using net send? */ +var nonotify = false; + +/** timeout for user notifications. Works only if msg.exe is available */ +var notificationDisplayTime = 10; + +/** set to true to prevent reboot */ +var noreboot = false; + +/** stores if package removal should be skipped - see /noremove flag */ +var noRemove = false; + +/** allows disabling/enabling of running state export to registry */ +var noRunningState = false; + +/** type of reboot command */ +var rebootCmd = "standard"; + +/** set to true for quiet mode */ +var quietDefault = false; + +/** registry path where WPKG stores its running state */ +var sRegWPKG_Running = "HKLM\\Software\\WPKG\\running"; + +/** configuration file to hold the settings for the script */ +var config_file_name = "config.xml"; + +/** name of package database file */ +var packages_file_name = "packages.xml"; +/** name of profiles database file */ +var profiles_file_name = "profiles.xml"; +/** name of hosts definition database file */ +var hosts_file_name = "hosts.xml"; + +/** + * specify if manually installed packages should be kept during synchronization + * true: keep manually installed packages false: remove any manually installed + * package which does not belong to the profile + */ +var keepManual = true; + +/** + * path where log-files are stored.<br> + * Defaults to "%TEMP%" if empty. + */ +var log_file_path = "%TEMP%"; + +/** path where downloads are stored, defaults to %TEMP% if not defined */ +var downloadDir = "%TEMP%"; + +/** timeout for downloads */ +var downloadTimeout = 7200; + +/** if set to true logfiles will be appended, otherwise they are overwritten */ +var logAppend = false; + +/** + * set to true to enable sending of status messages to STDOUT, regardless of the + * status of /debug + */ +var sendStatus = false; + +/** + * Set to true to disable upgrade-before-remove feature by default + */ +var noUpgradeBeforeRemove = false; + +/** + * use the following values: Log level is defined as a bitmask. Just add sum up + * the values of each log severity you would like to include within the log file + * and add this value to your config.xml or specify it at /logLevel:<num>. + * + * Specify 0 to disable logging. + * + * <pre> + * 1: log errors only + * 2 : log warnings + * 4 : log information + * 8 : log audit success + * </pre> + * + * Example: + * + * <pre> + * 31 log everything (1+2+4+8+16=32) + * 13 logs errors, information and audit success (1+4+8=13) + * 3 logs errors and warnings only (1+2=3) + * </pre> + * + * Default is 0 which will suppress all messages printed before log level is + * properly initialized by config.xml or by /logLevel:<#> parameter. + */ +var logLevelDefault = 0xFF; + +/** + * var logfile pattern Recognized patterns: + * + * <pre> + * [HOSTNAME] replaced by the executing hostname + * [PROFILE] replaced by the name + * [YYYY] replaced by year (4 digits) + * [MM] replaced by month number (2 digits) + * [DD] replaced by the day of the month (2 digits) + * [HH] replaced by hour of the day (24h format, 2 digits) + * [mm] replaced by minute (2 digits) + * </pre> + * + * Examples: + * + * <pre> + * wpkg-[YYYY]-[MM]-[DD]-[HOSTNAME].log + * </pre> + * + * results in a name like "wpkg-2007-11-04-myhost.log" + */ +var logfilePattern = "wpkg-[HOSTNAME].log"; + +/** web file name of package database if base is an http url */ +var web_packages_file_name = "packages_xml_out.php"; +/** web file name of profile database if base is an http url */ +var web_profiles_file_name = "profiles_xml_out.php"; +/** web file name of hosts database if base is an http url */ +var web_hosts_file_name = "hosts_xml_out.php"; + +/** name of local settings file */ +var settings_file_name = "wpkg.xml"; + +/** path to settings file, defaults to system folder if set to null */ +var settings_file_path = null; + +/** defines if package/profile IDs are handled case sensitively */ +var caseSensitivity = true; + +/** set to true to want to apply profiles of all matching host nodes */ +var applyMultiple = false; + +/** globally disable any downloads */ +var noDownload = false; + +/** + * Allows to disable insert of host attributes to local settings DB. This is + * handy for testing as the current test-suite compares the local wpkg.xml + * database and the file will look different on all test machines if these + * attribute are present. This setting might be removed if all test-cases + * are adapted. + */ +var settingsHostInfo = true; + +/** + * Query mode. In order to "simulate" the result of a query on a system on + * anohter (remote-) system you can set queryMode to "remote". This will + * disable package checks because they will not return the same results on a + * remote system. + */ +var queryMode = "local"; + +/** + * XML namespaces. + */ +var namespaceSettings = "http://www.wpkg.org/settings"; +var namespaceHosts = "http://www.wpkg.org/hosts"; +var namespaceProfiles = "http://www.wpkg.org/profiles"; +var namespacePackages = "http://www.wpkg.org/packages"; +var namespaceConfig = "http://www.wpkg.org/config"; + +/******************************************************************************* + * + * Caching variables - used by internal functions. + * + ******************************************************************************/ + +/** file to which the log is written to */ +var logfileHandler = null; + +/** path to the log file (corresponds to logfileHandler) */ +var logfilePath = null; + +/** store whether log file was opened in append mode */ +var logfileAppendMode = logAppend; + +/** stores if the user was notified about start of actions */ +var was_notified = false; + +/** + * holds a list of packages which have been installed during this execution this + * is used to prevent dependency packages without checks and always execution to + * be executed several times as well as preventing infinite- loops on recursive + * package installation. + */ +var packagesInstalled = new Array(); + +/** + * holds a list of packages which have been removed during this execution This + * is used to prevent removing packages multiple times during a session because + * they are referenced as dependencies by multiple other packages. + */ +var packagesRemoved = new Array(); + +/** host properties used within script */ +var hostName = null; +var hostOs = null; +var domainName = null; +var ipAddresses = null; +var hostGroups = null; +var hostArchitecture = null; +var hostAttributes = null; + +/** String representing path where the settings are stored */ +var settings_file = null; + +/** Flag whether settings path was processed to replace parameters */ +var settings_file_processed = false; + +/** declare variables for data storage */ +var packages = null; +var profiles = null; +var hosts = null; +var settings = null; +var config = null; + +/** List of profiles assigned directly to current host */ +var applyingProfilesDirect = null; + +/** profiles applying to the current host (including dependencies) */ +var applyingProfilesAll = null; + +/** caches the host node entries applying to the current host */ +var applyingHostNodes = null; + +/** Packages belonging to current host (package nodes) */ +var profilePackageNodes = null; + +/** stores the locale ID (LCID) which applies for the local executing user */ +var LCID = null; + +/** stores the locale ID (LCID) which applies for the local machine */ +var LCIDOS = null; + +/** caches the language node applying to the current system locale */ +var languageNode = null; + +/** declare log level variable */ +var logLevel = null; + +/** actual value for log level */ +var logLevelValue = 0x03; + +/** buffer to store log entries while no real log file is available */ +var logBuffer = null; + +/** flag which is true if log is ready to be initialize */ +var logInitReady = false; + +/** flag which is set to true internally during log initialization */ +var logInitializing = false; + +/** declare quiet mode variable */ +var quiet = null; + +/** current value of quiet operation flag */ +var quietMode = quietDefault; + +/** stores if a postponed reboot is scheduled */ +var postponedReboot = false; + +/** set to true when a reboot is in progress */ +var rebooting = false; + +/** set to true to skip write attempts to event log */ +var skipEventLog = false; + +/** set to true to log event log entries to STDOUT (fallback mode) */ +var eventLogFallback = false; + +/** holds an array of packages which were not removed due to the /noremove flag */ +var skippedRemoveNodes = null; + +/** + * holds status of change: true: System has been changed (package + * installed/removed/updated/downgraded... false: System has not been touched + * (yet) + */ +var systemChanged = false; + +/** + * Holds a list of packages which have been manually installed. + */ +var manuallyInstalled = null; + +/** + * Marks volatile releases and "inverts" the algorithm that a longer version + * number is newer. For example 1.0RC2 would be newer than 1.0 because it + * appends characters to the version. Using "rc" as a volatile release marker + * the algorithm ignores the appendix and assumes that the string which omits + * the marker is newer. + * + * Resulting in 1.0 to be treated as newer than 1.0RC2. + * + * NOTE: The strings are compared as lower-case. So use lower-case definitions + * only! + */ +var volatileReleaseMarkers = ["rc", "i", "m", "alpha", "beta", "pre", "prerelease"]; + +/** stores if system is running on a 64-bit OS */ +var x64 = null; + +/** Stores variables assigned to host definitions applying to current host */ +var hostsVariables = null; + +/** Stores variables from profiles assigned to current hsot */ +var profilesVariables = null; + +/*********************************************************************************************************************** + * + * Program execution + * + **********************************************************************************************************************/ + +/** + * Call the main function with arguments while catching all errors and + * forwarding them to the error output. + */ +try { + main(); +} catch (e) { + // Log error message. + error("Message: " + e.message + "\n" + + "Description: " + e.description + "\n" + + "Error number: " + hex(e.number) + "\n" + + "Stack: " + e.stack + "\n" + + "Line: " + e.lineNumber + "\n" + ); + notifyUserFail(); + // Make sure log is initialized to write the output. + if (logBuffer != null) { + initializeLog(); + } + exit(2); +} + +/** + * Main execution method. Actually runs the script + */ +function main() { + // Do not open pop-up window while initializing. + setQuiet(true); + + // Initialize WPKG internals. + initialize(); + + // Process command line arguments to determine course of action. + // Get special purpose argument lists. + var argv = getArgv(); + var argn = argv.Named; + // var argu = argv.Unnamed; + if (argn.Item("query") != null) { + // Do not log to event log during query. + var eventLogStatus = isSkipEventLog(); + setSkipEventLog(true); + + if (getQueryMode() == "remote") { + getSettingHostAttributes(); + } + + // Now all parameters are set to build the final log file name + // even if [PROFILE] is used. + // WScript.Echo("Initializing Log"); + // WScript.Echo("Buffer: " + logBuffer); + // Flag log file ready for initialization. + logInitReady = true; + + // Do not log to log file during query. + var logValue = getLogLevel(); + // setLogLevel(0); + + // Read query argument characters. + var queryRequest = argn.Item("query").split(""); + + // Supported arguments: + // a Query all packages. + // x List packages which are not installed but in package database. + // i List all packages which are currently installed. + // I List packages which are about to be installed during synchronization. + // u List packages which are about to be upgraded during synchronization. + // d List packages which are about to be downgraded during synchronization. + // r List packages which are about to be removed during synchronization. + // m List all modifications which would apply during synchronization (equal to Iudr) + // n List packages which belong to the profile but are not modified during synchronization. + // s List host attributes from settings (wpkg.xml). + // l List host attributes read from local host. + var listSyncInstall = false; + var listSyncUpgrade = false; + var listSyncDowngrade = false; + var listSyncRemove = false; + var listSyncUnmodified = false; + for (var i=0; i<queryRequest.length; i++) { + var requestCharacter = queryRequest[i]; + switch (requestCharacter) { + case "a": + queryAllPackages(); + break; + + case "x": + queryUninstalledPackages(); + break; + + case "i": + queryInstalledPackages(); + break; + + case "I": + listSyncInstall = true; + break; + + case "u": + listSyncUpgrade = true; + break; + + case "d": + listSyncDowngrade = true; + break; + + case "r": + listSyncRemove = true; + break; + + case "n": + listSyncUnmodified = true; + break; + + case "m": + listSyncInstall = true; + listSyncUpgrade = true; + listSyncDowngrade = true; + listSyncRemove = true; + break; + + case "s": + queryHostInformationFromSettings(); + break; + + case "l": + queryHostInformation(); + break; + + default: + break; + } + } + // Print requested output. + if (listSyncInstall || listSyncUpgrade || listSyncDowngrade || listSyncRemove || listSyncUnmodified) { + queryProfilePackages(listSyncInstall, listSyncUpgrade, listSyncDowngrade, listSyncRemove, listSyncUnmodified); + } + + setSkipEventLog(eventLogStatus); + setLogLevel(logValue); + } else { + + // set profile-based log level (if available) + var profileLogLevel = getProfilesLogLevel(); + if (profileLogLevel != null) { + setLogLevel(profileLogLevel); + } + + // Now all parameters are set to build the final log file name + // even if [PROFILE] is used. + // WScript.Echo("Initializing Log"); + // WScript.Echo("Buffer: " + logBuffer); + // Flag log file ready for initialization. + logInitReady = true; + + var message; + if(isDebug()) { + var hst = getHostNodes(); + message = "Hosts file contains " + hst.length + " hosts:"; + for (var iHost = 0; iHost < hst.length; iHost++ ) { + message += "\n'" + getHostNodeDescription(hst[iHost]) + "'"; + } + dinfo(message); + + var settingsPkg = getSettingNodes(); + message = "Settings file contains " + settingsPkg.length + " packages:"; + for (var iSettings = 0; iSettings < settingsPkg.length; iSettings++) { + if (settingsPkg[iSettings] != null) { + message += "\n'" + getPackageID(settingsPkg[iSettings]) + "'"; + } + } + dinfo(message); + + var packageNodes = getPackageNodes(); + message = "Packages file contains " + packageNodes.length + " packages:"; + for (var iPackage = 0; iPackage < packageNodes.length; iPackage++) { + if (packageNodes[iPackage] != null) { + message += "\n'" + getPackageID(packageNodes[iPackage]) + "'"; + } + } + dinfo(message); + + var profileNodes = getProfileNodes(); + message = "Profile file contains " + profileNodes.length + " profiles:"; + for (var iProfile = 0; iProfile < profileNodes.length; iProfile++) { + if (profileNodes[iProfile] != null) { + message += "\n'" + getProfileID(profileNodes[iProfile]) + "'"; + } + } + dinfo(message); + + // Get list of profiles directly assigned to host. + var profiles = getProfileList(); + message = "Using profile(s): "; + for (var i=0; i < profiles.length; i++) { + message += "\n'" + profiles[i] + "'"; + } + dinfo(message); + } + + // Check if all referenced profiles are available. + var profileList = getProfileList(); + var error = false; + message = "Could not locate referenced profile(s):\n"; + for (var iProf = 0; iProf < profileList.length; iProf++) { + var currentProfile = getProfileNode(profileList[iProf]); + if (currentProfile == null) { + error = true; + message += profileList[iProf] + "\n"; + } + } + if (error) { + throw new Error(message); + } + + if (argn.Item("show") != null) { + var requestedPackageName = argn.Item("show"); + // if case sensitive mode is disabled convert package name to lower case + if (!isCaseSensitive()) { + requestedPackageName = requestedPackageName.toLowerCase(); + } + var message = queryPackage(getPackageNodeFromAnywhere(requestedPackageName), null); + info(message); + } else if (argn.Item("install") != null) { + var packageList = argn.Item("install").split(","); + for (var iPackage=0; iPackage < packageList.length; iPackage++) { + installPackageName(packageList[iPackage], true); + } + } else if (argn.Item("remove") != null) { + var packageList = argn.Item("remove").split(","); + for (var iPackage=0; iPackage < packageList.length; iPackage++) { + removePackageName(packageList[iPackage]); + } + } else if (argn.Item("upgrade") != null) { + var packageList = argn.Item("upgrade").split(","); + for (var iPackage=0; iPackage < packageList.length; iPackage++) { + installPackageName(packageList[iPackage], false); + } + } else if (isArgSet(argv, "/synchronize")) { + synchronizeProfile(); + } else { + showUsage(); + throw new Error("No action specified."); + } + } + exit(0); +} + + +/** + * Adds a sub-node for the given XML node entry. + * + * @param XMLNode + * the XML node to add to (e.g. packages or settings) + * @param subNode + * the node to be added to the XMLNode (for example a package node) + * NOTE: The node will be cloned before add + * @return Returns true in case of success, returns false if no node could be + * added + */ +function addNode(XMLNode, subNode) { + var returnvalue = false; + var result = XMLNode.appendChild(subNode.cloneNode(true)); + if(result != null) { + returnvalue = true; + } + return returnvalue; +} + + +/** + * Adds a package node to the settings XML node. In case a package with the same + * ID already exists it will be replaced. + * + * @param packageNode + * the package XML node to add. + * @param saveImmediately + * Set to true in order to save settings immediately after adding. + * Settings will not be saved immediately if value is false. + * @return true in case of success, otherwise returns false + */ +function addSettingsNode(packageNode, saveImmediately) { + // first remove entry if one already exists + + // get current settings node + var packageID = getPackageID(packageNode); + var settingsNode = getSettingNode(packageID); + + if (settingsNode != null) { + dinfo("Removing currently existing settings node first: '" + + getPackageName(settingsNode) + "' (" + getPackageID(settingsNode) + + "), Revision " + getPackageRevision(settingsNode) + "."); + removeSettingsNode(settingsNode, false); + } + + dinfo("Adding settings node: '" + + getPackageName(packageNode) + "' (" + getPackageID(packageNode) + + "), Revision " + getPackageRevision(packageNode) + "."); + + var success = addNode(getSettings(), packageNode); + // save settings if remove was successful + if (success && saveImmediately) { + saveSettings(true); + } + return success; +} + +/** + * Adds a package node to the list of skipped packages during removal process. + * + * @param packageNode + * the node which has been skipped during removal + */ +function addSkippedRemoveNodes(packageNode) { + var skippedNodes = getSkippedRemoveNodes(); + skippedNodes.push(packageNode); +} + +/** + * Appends dependent profile nodes of the specified profile to the specified + * array. Recurses into self to get an entire dependency tree. + */ +function appendProfileDependencies(profileArray, profileNode) { + var profileNodes = getProfileDependencies(profileNode); + + // add nodes if they are not yet part of the array + for (var i=0; i < profileNodes.length; i++) { + var currentNode = profileNodes[i]; + if(!searchArray(profileArray, currentNode)) { + dinfo("Adding profile dependencies of profile '" + + getProfileID(profileNode) + "': '" + + getProfileID(currentNode) + "'"); + profileArray.push(currentNode); + + // add dependencies of these profiles as well + appendProfileDependencies(profileArray, currentNode); + } else { + dinfo("Profile '" + + getProfileID(currentNode) + "' " + + "already exists in profile dependency tree. Skipping."); + } + } +} + +/** + * Evaluates all checks in the check nodes array and returns its result. + * @param checkNodes Array of XML <check /> nodes to be evaluated. + * @returns {Boolean} true if all checks are true. False if at least one failed. + */ +function checkAll(checkNodes) { + if (checkNodes == null) { + return true; + } + + // Initialize return value. + var result = true; + + // Save environment. + var previousEnv = getEnv(); + + // Loop over every condition check. + // If all are successful, we consider package as installed. + for (var i = 0; i < checkNodes.length; i++) { + try { + if (!checkCondition(checkNodes[i])) { + result = false; + break; + } + } catch (err) { + message = "Error evaluating check: " + err.description; + if (isQuitOnError()) { + throw new Error(message); + } else { + error(message); + result = false; + break; + } + } finally { + // Restore environment. + loadEnv(previousEnv); + } + } + return result; +} + +/** + * Checks for the success of a check condition for a package. + * + * @param checkNode + * XML check node to be evaluated + * @throws Error + * Throws error in case of invalid XML node definition + */ +function checkCondition(checkNode) { + var shell = new ActiveXObject("WScript.Shell"); + + // get attributes of check + var checkType = checkNode.getAttribute("type"); + var checkCond = checkNode.getAttribute("condition"); + var checkPath = checkNode.getAttribute("path"); + var checkValue = checkNode.getAttribute("value"); + + // In remote mode try to verify the check using cached check results in + // settings database. + if (getQueryMode() == "remote") { + // Logical checks shall be evaluated as usual. + // Only look for previous check results for other types of checks. + if (checkType != "logical") { + var result = getSettingsCheckResult(checkNode); + if (result == null) { + error("Result of check of type '" + checkType + "' with condition '" + + checkCond + "', path '" + checkPath + "' and value '" + + checkValue + "' is missing in settings database. " + + "Trying to evaluate locally. Results might be inaccurate"); + } else { + return result; + } + } + } + + // Sanity check: must have Type set here. + if (checkType == null) { + throw new Error("Check Type is null - this is not permitted. Perhaps a typo? " + + "To help find it, here are the other pieces of information: " + + "condition='" + checkCond + "', path='" + checkPath + + "', value='" + checkValue + "'."); + } + + // Initialize return value; + var returnValue = false; + + // get expanded values for path and value used by some checks + var checkPathExpanded = null; + if (checkPath != null) { + checkPathExpanded = shell.ExpandEnvironmentStrings(checkPath); + } + var checkValueExpanded = null; + if (checkValue != null) { + checkValueExpanded = shell.ExpandEnvironmentStrings(checkValue); + } + + switch(checkType) { + // check type: registry + case "registry": + // Sanity check: must have Cond and Path set for all registry checks. + if ((checkCond == null) || (checkPath == null)) { + throw new Error("Condition and / or path is null for a registry check. Perhaps " + + "a typo? To help find it, here are the other pieces of information: " + + "condition='" + checkCond + "', path='" + checkPath + + "', value='" + checkValue + "'."); + } + + // branch on check condition + switch (checkCond) { + case "exists": + if (getRegistryValue(checkPath) != null) { + // Some debugging information. + dinfo("The registry path '" + checkPath + "' exists: the check was successful."); + returnValue = true; + } else if (getRegistryValue(checkPathExpanded) != null) { + dinfo("The expanded registry path '" + checkPathExpanded + "' exists: the check was successful."); + returnValue = true; + } else { + // path does not exist + dinfo("Neither the registry path '" + checkPath + "' nor its expanded value of '" + + checkPathExpanded + "' exist: the check failed."); + returnValue = false; + } + break; + + case "equals": + // read registry value and convert it to string in order to compare + // to supplied + // string within the 'value' attribute + var readValue = getRegistryValue(checkPath); + + // check if value is eventually null (non-existing) + if (readValue == null) { + // the path might have to be expanded + readValue = getRegistryValue(checkPathExpanded); + if (readValue == null) { + dinfo("The registry path '" + checkPath + "' did not exist. Check failed."); + returnValue = false; + break; + } + dinfo("The expanded registry path '" + checkPathExpanded + "' could be read."); + } else { + dinfo("The registry path '" + checkPath+ "' could be read."); + } + + // try treating the value as array + var registyValue = ""; + try { + var readArray = readValue.toArray(); + dinfo("The registry value received is an array, concatenating values for comparison."); + for (var iRegKey=0; iRegKey<readArray.length; iRegKey++) { + registyValue = registyValue + readArray[iRegKey] + ""; + if ( (iRegKey+1) < readArray.length) { + registyValue += "\n"; + } + } + } catch(notAnArray) { + dinfo("The registry value received is a scalar value."); + registyValue = readValue + ""; + } + + if (registyValue == checkValue) { + // Some debugging information. + dinfo("The registry path '" + checkPath + "' contained the correct value: '" + + checkValue + "'. The check was successful."); + returnValue = true; + } else { + // Try if expanded value matches (case-insensitive). + if (registyValue.toLowerCase() == checkValueExpanded.toLowerCase()) { + dinfo("The registry path '" + checkPath + "' contained the expanded value: '" + + checkValueExpanded + "'. The check was successful."); + returnValue = true; + } else { + dinfo("The registry path '" + checkPath + "' did not contain the value: '" + + checkValue + "'. Instead it contained '" + registyValue + "'. the check failed."); + returnValue = false; + } + } + break; + + default: + throw new Error("Check condition " + checkCond + " unknown " + + "for type registry."); + break; + } + + // The result of Registry checks shall be stored in local settings node. + addSettingsCheckResult(checkNode, returnValue); + + break; + + // check type: file + case "file": + // Sanity check: must have Cond and Path set for all file checks. + if ((checkCond == null) || + (checkPath == null)) { + throw new Error("Condition and / or path is null for a file check. Perhaps " + + "a typo? To help find it, here are the other pieces of information: " + + "condition='" + checkCond + "', path='" + checkPath + + "', value='" + checkValue + "'"); + } + + // expand environment variables + // use only expanded value here + checkPath = checkPathExpanded; + + if (checkCond == "exists") { + var fso = new ActiveXObject("Scripting.FileSystemObject"); + if (fso.FileExists(checkPath)) { + // Some debugging information. + dinfo("The path '" + checkPath + "' exists and is a file: the test was successful."); + returnValue = true; + } else if (fso.FolderExists(checkPath)) { + // Some debugging information. + dinfo("The path '" + checkPath + "' exists and is a folder: the test was successful."); + returnValue = true; + } else { + // Some debugging information. + dinfo("The path '" + checkPath + "' does not exist: the test failed."); + returnValue = false; + } + + } else if (checkCond == "sizeequals") { + // sanity check: must have Value set for a size check. + if (checkValue == null) { + throw new Error("Value is null for a file sizeequals check. Perhaps " + + "a typo? To help find it, here are the other pieces of information: " + + "condition='" + checkCond + + "', path='" + checkPath + + "', value='" + checkValue + "'."); + } + + var filesize = getFileSize(checkPath); + if (filesize == checkValueExpanded) { + dinfo("The file '" + checkPath + "' has size " + filesize + ": the test was successful."); + returnValue = true; + } else { + dinfo("The file '" + checkPath + "' has size " + filesize + " - wanted " + + checkValueExpanded + ": the test fails."); + returnValue = false; + } + } else if (checkCond.substring(0,7) == "version") { + // Sanity check: Must have a value set for version check. + if (checkValue == null) { + throw new Error("Value is null for a file version check. Perhaps " + + "a type? To help find it, here are the other pieces of information: " + + "condition='" + checkCond + "', path='" + checkPath + + "', value='" + checkValue + "'."); + } // if checkValue == null + + var fileVersion = getFileVersion(checkPath); + + if (fileVersion == null || fileVersion == "") { + // no file version could be obtained + dinfo("Unable to find the file version for '" + checkPath + "'."); + returnValue = false; + } else { + + var fileVersionCompare = versionCompare(fileVersion, checkValueExpanded); + dinfo ("Checking file version " + fileVersion + " is " + checkCond + + " (than) " + checkValueExpanded + " - got result " + fileVersionCompare + "."); + + var fileVersionCompResult = false; + switch (checkCond) { + case "versionsmallerthan": + if (fileVersionCompare < 0) { + fileVersionCompResult = true; + } + break; + case "versionlessorequal": + if (fileVersionCompare <= 0) { + fileVersionCompResult = true; + } + break; + case "versionequalto": + if (fileVersionCompare == 0) { + fileVersionCompResult = true; + } + break; + case "versiongreaterorequal": + if (fileVersionCompare >= 0) { + fileVersionCompResult = true; + } + break; + case "versiongreaterthan": + if (fileVersionCompare > 0) { + fileVersionCompResult = true; + } + break; + default: + error("Unknown operation on file versions : " + checkCond); + fileVersionCompResult = false; + break; + } + + dinfo("File version check for file '" + checkPath + "' returned " + + fileVersionCompResult + " for operation type " + checkCond + "."); + returnValue = fileVersionCompResult; + } + + } else if (checkCond.substring(0,4) == "date") { + var fileDate = null; + var comparisonDesc = ""; + var dateType = checkCond.substring(4,10); + // Evaluate if modification date shall be checked. + if (dateType == "modify") { + dinfo("Checking file modification date."); + // Evaluate file modification date. + fileDate = getFileDateModification(checkPath); + comparisonDesc = "Modification"; + } else if (dateType == "create") { + dinfo("Checking file creation date."); + // Evaluate file creation date. + fileDate = getFileDateCreation(checkPath); + comparisonDesc = "Creation"; + } else if (dateType == "access") { + dinfo("Checking file access date."); + // Evaluate file access date. + fileDate = getFileDateLastAccess(checkPath); + comparisonDesc = "Access"; + } else { + throw new Error ("Invalid file date comparison type: " + checkCond + "."); + } + + // If file date could not be read: Comparison failed. + if (fileDate == null) { + dinfo("File modification date could not be read, check failed."); + returnValue = false; + break; + } + // Make sure file date is in Date() format. + fileDate = new Date(fileDate); + + // Parse comparison date. + var firstChar = checkValueExpanded.substring(0,1); + var comparisonDate = null; + var comparisonType = "string"; + if (firstChar == "+" || firstChar == "-") { + // Relative date. Create time offset in minutes. + dinfo("Reading relative comparison date: " + checkValueExpanded + " minutes."); + var timeOffset = parseInt(checkValueExpanded) * 1000 * 60; + var now = new Date(); + comparisonDate = new Date(now.getTime() + timeOffset); + } else if (firstChar == "@" ) { + // Remember type of comparison. + comparisonType = "file"; + // Evaluate date of reference file. + var filePath = checkValueExpanded.substring(1); + if (dateType == "modify") { + dinfo("Reading file modification date of reference file '" + filePath + "'."); + // Evaluate file modification date. + comparisonDate = getFileDateModification(filePath); + } else if (dateType == "create") { + dinfo("Reading file creation date of reference file '" + filePath + "'."); + // Evaluate file creation date. + comparisonDate = getFileDateCreation(filePath); + } else if (dateType == "access") { + dinfo("Reading file access date of reference file '" + filePath + "'."); + // Evaluate file access date. + comparisonDate = getFileDateLastAccess(filePath); + } + // If comparison date could not be read then comparison failed. + if (comparisonDate == null) { + dinfo("File comparison date could not be read, check failed."); + returnValue = false; + break; + } + // Make sure comparison date is in Date() format. + comparisonDate = new Date(comparisonDate); + + } else { + dinfo("Reading comparison date: " + checkValueExpanded + "."); + switch (checkValueExpanded) { + case "yesterday": + // Relative date. Create time offset of one day. + var timeOffset = -1000 * 60 * 60 * 24; + var now = new Date(); + comparisonDate = new Date(now.getTime() + timeOffset); + break; + + case "last-week": + // Relative date. Create time offset of one week ago. + var timeOffset = -1000 * 60 * 60 * 24 * 7; + var now = new Date(); + comparisonDate = new Date(now.getTime() + timeOffset); + break; + + case "last-month": + // Relative date. Create time offset of one month ago. + var timeOffset = -1000 * 60 * 60 * 24 * 30; + var now = new Date(); + comparisonDate = new Date(now.getTime() + timeOffset); + break; + + case "last-year": + // Relative date. Create time offset of one year ago. + var timeOffset = -1000 * 60 * 60 * 24 * 365; + var now = new Date(); + comparisonDate = new Date(now.getTime() + timeOffset); + break; + + default: + // Date is supposed to be in ISO format. + comparisonDate = parseISODate(checkValueExpanded, false); + break; + } + } + // Check whether comparison date has been evaluated properly. + if (comparisonDate == null) { + throw new Error ("Unable to evaluate date from value '" + checkValueExpanded + "'."); + } + + var success = false; + + // Get file date of file specified in path. + var comparison = checkCond.substring(10); + + var comparisonCond = ""; + switch (comparison) { + case "olderthan": + comparisonCond = "older than"; + if (fileDate.getTime() < comparisonDate.getTime()) { + success = true; + } else { + success = false; + } + break; + + case "equalto": + var fileDateCompare = new Date(fileDate); + // Reduce accuracy to milliseconds for equal comparison when comparing to user string. + if (comparisonType != "file") { + fileDateCompare.setMilliseconds(0); + comparisonDate.setMilliseconds(0); + } + comparisonCond = "equal to"; + if (fileDateCompare.getTime() == comparisonDate.getTime()) { + success = true; + } else { + success = false; + } + break; + + case "newerthan": + comparisonCond = "newer than"; + if (fileDate.getTime() > comparisonDate.getTime()) { + success = true; + } else { + success = false; + } + break; + + default: + throw new Error ("Invalid file date comparison parameter: '" + checkCond + "'."); + break; + } + + if (success) { + dinfo(comparisonDesc + " date of file '" + checkPath + "' is " + fileDate + + " which is " + comparisonCond + " the comparison date " + + comparisonDate + " check succeeded."); + } else { + dinfo(comparisonDesc + " date of file '" + checkPath + "' is " + fileDate + + " which isn't " + comparisonCond + " the comparison date " + + comparisonDate + " check failed."); + } + returnValue = success; + } else { + throw new Error("Check condition " + checkCond + " unknown for " + + "type file."); + } + + // The result of Registry checks shall be stored in local settings node. + addSettingsCheckResult(checkNode, returnValue); + + break; + + // check type: uninstall + case "uninstall": + // Sanity check: must have Cond and Path set for all uninstall checks. + if ((checkCond == null) || + (checkPath == null)) { + throw new Error("Condition and / or path is null for an uninstall check. Perhaps " + + "a typo? To help find it, here are the other pieces of information: " + + "condition='" + checkCond + + "', path='" + checkPath + "'."); + } + var uninstallLocations = scanUninstallKeys(checkPath); + // If expanded path is different to path read these keys too. + if (checkPath != checkPathExpanded) { + var uninstallLocationsExpanded = scanUninstallKeys(checkPathExpanded); + for (var i=0; i < uninstallLocationsExpanded.length; i++) { + uninstallLocations.push(uninstallLocationsExpanded[i]); + } + } + + if (checkCond == "exists") { + if (uninstallLocations.length > 0) { + dinfo("Uninstall entry for " + checkPath + " was found: test successful."); + returnValue = true; + } else { + dinfo("Uninstall entry for " + checkPath + " missing: test failed."); + returnValue = false; + } + } else if (checkCond.substring(0,7) == "version") { + // check versions of all installed instances + // for version checks we need a value + if (checkValue == null) { + throw new Error ("Uninstall entry version check has been specified but no" + + "'value' is defined. Please add a 'value=<version>' attribute."); + } + + if (uninstallLocations.length <= 0) { + dinfo("No uninstall entry for '" + checkPath + "' found. " + + "Version comparison check failed."); + returnValue = false; + } else { + + var uninstallCheckResult = true; + for (var iUninstKey=0; iUninstKey < uninstallLocations.length; iUninstKey++) { + var uninstallValue = getRegistryValue(uninstallLocations[iUninstKey] + "\\DisplayVersion"); + + dinfo("Found version of '" + checkPath + "' at " + uninstallLocations[iUninstKey] + + ": " + uninstallValue + "\n" + "Comparing to expected version: " + checkValue + "."); + + // check if valid version value was returned + if (uninstallValue == null || uninstallValue == "") { + error("Check condition '" + checkCond + "' cannot be executed" + + " since no version information is available for '" + checkPath + "'" + + " at " + uninstallLocations[iUninstKey] + "."); + uninstallCheckResult = false; + break; + } else { + + var uninstallVersionCompare = versionCompare(uninstallValue, checkValueExpanded); + dinfo ("Comparing uninstall version '" + uninstallValue + "' to expected version '" + + checkValueExpanded + "' using condition '" + checkCond + "' returned " + uninstallVersionCompare + "."); + + var uninstallVersionCompResult = false; + switch (checkCond) { + case "versionsmallerthan": + if (uninstallVersionCompare < 0) { + uninstallVersionCompResult = true; + } + break; + case "versionlessorequal": + if (uninstallVersionCompare <= 0) { + uninstallVersionCompResult = true; + } + break; + case "versionequalto": + if (uninstallVersionCompare == 0) { + uninstallVersionCompResult = true; + } + break; + case "versiongreaterorequal": + if (uninstallVersionCompare >= 0) { + uninstallVersionCompResult = true; + } + break; + case "versiongreaterthan": + if (uninstallVersionCompare > 0) { + uninstallVersionCompResult = true; + } + break; + default: + error("Unknown operation on uninstall version check: " + checkCond + "."); + uninstallVersionCompResult = false; + break; + } + + dinfo("Uninstall version check for package '" + checkPath + "' returned " + + uninstallVersionCompResult + " for operation type " + checkCond + "."); + + // in case the current entry does not match the condition, + // immediately return + // else the next uninstall entry might be checked + if (uninstallVersionCompResult == false) { + uninstallCheckResult = false; + break; + } + } + } + // If all checks succeeded, set return value to true. + if (uninstallCheckResult) { + returnValue = true; + } + } + } else { + throw new Error("Check condition " + checkCond + " unknown for " + + "type uninstall."); + } + + // The result of Registry checks shall be stored in local settings node. + addSettingsCheckResult(checkNode, returnValue); + + break; + + // check type: execution + case "execute": + // check if path to script is given + if (checkPath == null) { + throw new Error("No path is specified for execute check!"); + } + if (checkCond == null) { + dinfo("No execute condition specified, assuming 'exitcodeequalto'."); + checkCond = "exitcodeequalto"; + } + if (checkValueExpanded == null || checkValueExpanded == "") { + dinfo("No execute value specified, assuming '0'."); + checkValueExpanded = 0; + } else { + checkValueExpanded = parseInt(checkValueExpanded); + if(isNaN(checkValueExpanded) == true) { + checkValueExpanded = 0; + } + } + + // use expanded path only + checkPath = checkPathExpanded; + // execute and catch return code + var exitCode = exec(checkPath, 3600, null); + + var executeResult = false; + switch (checkCond) { + case "exitcodesmallerthan": + if (exitCode < checkValueExpanded) { + executeResult = true; + } + break; + case "exitcodelessorequal": + if (exitCode <= checkValueExpanded) { + executeResult = true; + } + break; + case "exitcodeequalto": + if (exitCode == checkValueExpanded) { + executeResult = true; + } + break; + case "exitcodegreaterorequal": + if (exitCode >= checkValueExpanded) { + executeResult = true; + } + break; + case "exitcodegreaterthan": + if (exitCode > checkValueExpanded) { + executeResult = true; + } + break; + default: + dinfo("Invalid execute condition specified '" + checkCond + + "', check failed."); + executeResult = false; + break; + } + + dinfo("Execute check for program '" + checkPath + "' returned '" + + exitCode + "'. Evaluating condition '" + checkCond + + "' revealed " + executeResult + " when comparing to expected" + + " value of '" + checkValueExpanded + "'."); + returnValue = executeResult; + break; + + // check type: logical + case "logical": + + // check if logical condition is set + if (checkCond == null) { + throw new Error("Condition is null for a logical check."); + } + + var subcheckNodes = getChecks(checkNode); + + switch (checkCond) { + case "not": + var checkResult = false; + for (var iNotNodes=0; iNotNodes < subcheckNodes.length; iNotNodes++) { + // check if one of the subchecks return false + if (!checkCondition(subcheckNodes[iNotNodes])) { + checkResult = true; + break; + } + } + if (checkResult) { + dinfo("Result of logical 'NOT' check is true."); + } else { + dinfo("Result of logical 'NOT' check is false."); + } + returnValue = checkResult; + break; + + case "and": + var checkResult = true; + for (var iAndNodes = 0; iAndNodes < subcheckNodes.length; iAndNodes++) { + // check if one of the subchecks return false + if (!checkCondition(subcheckNodes[iAndNodes])) { + checkResult = false; + break; + } + } + if (checkResult) { + dinfo("Result of logical 'AND' check is true."); + } else { + dinfo("Result of logical 'AND' check is false."); + } + returnValue = checkResult; + break; + + case "or": + // check if one of the sub-checks returns true + var checkResult = false; + for (var iOrNodes = 0; iOrNodes < subcheckNodes.length; iOrNodes++) { + if (checkCondition(subcheckNodes[iOrNodes])) { + checkResult = true; + break; + } + } + if (checkResult) { + dinfo("Result of logical 'OR' check is true."); + } else { + dinfo("Result of logical 'OR' check is false"); + } + returnValue = checkResult; + break; + + case "atleast": + if (checkValue == null) { + throw new Error("Check condition logical 'atleast' requires a value."); + } + + // count number of checks which return true + var numAtLeastNodes=0; + var checkResult = false; + for (var iAtLeastNodes = 0; iAtLeastNodes < subcheckNodes.length; iAtLeastNodes++) { + if (checkCondition(subcheckNodes[iAtLeastNodes])) { + numAtLeastNodes++; + } + // check if at least x checks revealed true + if (numAtLeastNodes >= checkValue) { + checkResult = true; + break; + } + } + if (checkResult) { + dinfo("Result of logical 'AT LEAST' check is true."); + } else { + dinfo("Result of logical 'AT LEAST' check is false."); + } + returnValue = checkResult; + break; + + case "atmost": + // check if maximum x checks return true + var checkResult = true; + var numAtMostNodes = 0; + for (var iAtMostNodes = 0; iAtMostNodes < subcheckNodes.length; iAtMostNodes++) { + if (checkCondition(subcheckNodes[iAtMostNodes])) { + numAtMostNodes++; + } + if (numAtMostNodes > checkValue) { + checkResult = false; + break; + } + } + if (checkResult) { + dinfo("Result of logical 'AT MOST' check is true."); + } else { + dinfo("Result of logical 'AT MOST' check is false."); + } + returnValue = checkResult; + break; + + default: + throw new Error("Check condition " + checkCond + " unknown for " + + "type logical."); + break; + } + + // Logical checks shall not be added to local settings node. + break; + + // Check type: host + case "host": + // check if logical condition is set + if (checkCond == null) { + throw new Error("Condition is null for a host check."); + } + if (checkValueExpanded == null) { + throw new Error("Value is null for a host check."); + } + + // Verify if the host check matches current host. + returnValue = checkHostAttribute(checkCond, checkValueExpanded); + + // The result of Registry checks shall be stored in local settings node. + addSettingsCheckResult(checkNode, returnValue); + + break; + + // no such check type + default: + throw new Error("Check condition type " + checkType + " unknown."); + break; + } + + return returnValue; +} + +/** + * Checks whether the specified host attribute matches the expression passed as + * argument. + * + * @param attributeName + * Name of host attribute to match. See getHostInformation() + * function for valid host attributes. + * @param expression + * Regular expression (or list for certain attributes) to use for + * matching. + * @returns {Boolean} True if attribute matches the expression. + */ +function checkHostAttribute(attributeName, expression) { + // Terminate if attribute name is not specified. + if (attributeName == null) { + error("Host attribute matching failed. No attribute name specified."); + return false; + } + var hostAttribute = attributeName; + + // Terminate if expression is not specified. + if (expression == null) { + error("Host attribute matching for attribute '" + hostAttribute + "' failed. No expression specified."); + return false; + } + // Expand environment variables in expressions. + var checkExpression = new ActiveXObject("WScript.Shell").ExpandEnvironmentStrings(expression); + + // Initialize return value. + var returnValue = false; + + // Fetch current host attributes. + var globalHostInformation = getHostInformation(); + + // Add "environment" key since we want to support environment matching too. + var hostInformation = new ActiveXObject("Scripting.Dictionary"); + var keys = globalHostInformation.keys().toArray(); + for (var i=0; i<keys.length; i++) { + hostInformation.Add(keys[i], globalHostInformation.Item(keys[i])); + } + hostInformation.Add("environment", ""); + + // First verify if the requested host information attribute exists. + var hostInfoValue = hostInformation.Item(hostAttribute); + if (hostInfoValue == null || (typeof(hostInfoValue) == "object" && hostInfoValue.length <= 0) ) { + dinfo("Host match requires attribute '" + hostAttribute + "' " + + "which is not defined for current host. No match found."); + return false; + } + + var attrMatchExpression = new RegExp(checkExpression, "i"); + // First try to match array objects. + if (typeof(hostInfoValue) == "object" && hostInfoValue.length > 0) { + for (var iHostInfo=0; iHostInfo < hostInfoValue.length; iHostInfo++) { + // Get value from attribute array + var hostInfoElement = hostInfoValue[iHostInfo]; + dinfo("Comparing multi-valued attribute '" + hostAttribute + "' with value '" + + hostInfoElement + "' using expression '" + checkExpression + "'."); + + // Compare attribute array element with expected + // value. + if (attrMatchExpression.test(hostInfoElement) == true) { + dinfo("Match for attribute '" + hostAttribute + "' with value '" + hostInfoElement + "' found."); + returnValue = true; + break; + } + } + // } else if (typeof(host[hostNodeAttrName]) != "object") { + } else { + // Match simple attributes. + switch (hostAttribute) { + case "environment": + // Match environment condition to actual environment variable. + + // Get condition value from from parameter, could be multiple, separated by '|'. + var environmentConditions = checkExpression.split('|'); + returnValue = true; + for (var iEnv=0; iEnv < environmentConditions.length; iEnv++) { + var environmentCondition = environmentConditions[iEnv]; + // Split environment conditions into key and value pairs. + var envConditionSplit = environmentCondition.split("="); + // Need at least the key and value. If there are less components, then skip it. + if (envConditionSplit.length >= 2) { + // The first value is the key. + var envKey = envConditionSplit[0]; + if (envKey == "") { + dinfo("Invalid empty environment variable name."); + returnValue = false; + break; + } + + // Fetch environment value. + var expandString = "%" + envKey + "%"; + var envValueRead = new ActiveXObject("WScript.Shell").ExpandEnvironmentStrings(expandString); + + if (envValueRead == expandString) { + // Environment variable is not defined, match failed. + dinfo("Required environment not matched. Environment variable '" + envKey + "' not defined."); + returnValue = false; + break; + } + + // All following values are belonging to the value. + /* + var valueParts = new Array(); + for (var iValues=1; iValues < envConditionSplit.length; iValues++) { + valueParts.push(envConditionSplit[iValues]); + } + // Join values to re-assemble the value specified. + var envValue = valueParts.join(""); + */ + + // Re-assemble value. + var valueStartOffset = envKey.length + 1; + var envValue = environmentCondition.substr(valueStartOffset); + + // Check environment using regular expression match. + var envMatchExpression = new RegExp(envValue, "i"); + if (envMatchExpression.test(envValueRead) == true) { + dinfo("Required environment matched. Environment variable '" + envKey + + "' with value '" + envValueRead + "' matches '" + envValue + "'."); + // Check next value. All of them need to be true. + continue; + } else { + dinfo("Required environment dit not match. Environment variable '" + envKey + + "' with value '" + envValueRead + "' does not match '" + envValue + "'."); + returnValue = false; + break; + } + } else { + error("Invalid environment match expression '" + environmentCondition + "'. Match skipped."); + } + } + break; + + case "lcid": + // Check whether any LCID matches the current host executing user LCID. + var attributeLCIDs = checkExpression.split(","); + for (var iLCID=0; iLCID < attributeLCIDs.length; iLCID++) { + // check if it corresponds to the system LCID + var currentLcid = trimLeadingZeroes(trim(attributeLCIDs[iLCID])); + if (currentLcid == hostInfoValue) { + dinfo("Required LCID match found. LCID '" + currentLcid + "' matches current user LCID."); + returnValue = true; + break; + } + } + if (!returnValue) { + dinfo("None of the required LCID values (" + checkExpression + + ") matched the current host LCID of '" + hostInfoValue + "'."); + } + break; + + case "lcidOS": + // Check whether any LCID matches the current host OS LCID. + var attributeLCIDs = checkExpression.split(","); + for (var iLCIDOS=0; iLCIDOS < attributeLCIDs.length; iLCIDOS++) { + // check if it corresponds to the system LCID + var currentLcid = trimLeadingZeroes(trim(attributeLCIDs[iLCIDOS])); + if (currentLcid == hostInfoValue) { + dinfo("Required OS LCID match found. LCID '" + currentLcid + "' matches current host LCID."); + returnValue = true; + break; + } + } + if (!returnValue) { + // Check if any LCID matched the current host. + dinfo("None of the required LCID values (" + checkExpression + + ") matched the current host LCID of '" + hostInfoValue + "'."); + } + break; + + default: + // perform simple regular expression match of + // attribute + if (attrMatchExpression.test(hostInfoValue) == true) { + dinfo("Host attribute '" + hostAttribute + "' with value '" + + hostInfoValue + "' matches expression '" + checkExpression + "'."); + returnValue = true; + } else { + dinfo("Host attribute '" + hostAttribute + "' with value '" + + hostInfoValue + "' does not match expression '" + checkExpression + "'."); + returnValue = false; + } + break; + } + } + return returnValue; +} + + +/** + * Creates a new hosts XML root-node and returns it + * + * @return new hosts node + */ +function createHosts() { + var newHosts = createXml("wpkg:wpkg", namespaceHosts); + return newHosts; +} + +/** + * Creates a new packages XML root-node and returns it + * + * @return new profiles node + */ +function createPackages() { + var newPackages = createXml("packages:package", namespacePackages); + return newPackages; +} + +/** + * Creates a new profiles XML root-node and returns it + * + * @return new profiles node + */ +function createProfiles() { + var newProfiles = createXml("profiles:profiles", namespaceProfiles); + return newProfiles; +} + +/** + * Creates a new settings XML root-node and returns it + * + * @return new settings node + */ +function createSettings() { + var newSettings = createXml("wpkg:wpkg", namespaceSettings); + if (settingsHostInfo) { + // Add host attributes. + // NOTE: These attributes are currently not used by WPKG but might be + // useful if wpkg.xml is copied to an external system so wpkg.xml + // will include some host information. + var hostInformation = getHostInformation(); + var attributes = hostInformation.keys().toArray(); + for (var i=0; i<attributes.length; i++) { + var value = hostInformation.Item(attributes[i]); + newSettings.setAttribute(attributes[i], value); + } + } + return newSettings; +} + +/** + * Create a new settings XML root-node by reading a file and returns it + * + * @param fileName String pointing to the settings file to be created + * (full path). + * @return settings root node as stored within the file + */ +function createSettingsFromFile(fileName) { + var newSettings = loadXml(fileName, null, "settings"); + return newSettings; +} + +/** + * Downloads a file as specified within a download node. + * + * @param downloadNode + * XML 'download' node to be used + * @return true in case of successful download, false in case of error + */ +function download(downloadNode) { + // get attributes + var url = getDownloadUrl(downloadNode); + var target = getDownloadTarget(downloadNode); + var timeout = getDownloadTimeout(downloadNode); + var expandURL = getDownloadExandURL(downloadNode); + + // initiate download + return downloadFile(url, target, timeout, expandURL); +} + +/** + * Downloads all files from the given array of download XML nodes + * + * @param downloadNodes + * Array of download XML nodes to be downloaded + * @return true in case of successful download, false in case of error + */ +function downloadAll(downloadNodes) { + var returnValue = true; + if (downloadNodes != null) { + for (var i=0; i<downloadNodes.length; i++) { + var result = download(downloadNodes[i]); + // stop downloading if + if (result != true) { + returnValue = false; + } + } + } + return returnValue; +} + +/** + * Removes eventually existing temporary downloads of the specified XML node + * + * @param downloadNode + * XML node which contains the download definition to clean + */ +function downloadClean(downloadNode) { + // get download attributes + var target = getDownloadTarget(downloadNode); + + // evaluate target directory + if (target == null || target == "") { + error("Invalid download target specified: " + target); + target = downloadDir; + } else { + target = downloadDir + "\\" + target; + } + target = new ActiveXObject("WScript.Shell").ExpandEnvironmentStrings(target); + var fso = new ActiveXObject("Scripting.FileSystemObject"); + // delete temporary file if it already exists + if (fso.FileExists(target)) { + fso.DeleteFile(target); + } +} + + +/** + * Cleans all temporary files belonging to the download XML nodes within the + * passed array of download XML nodes + * + * @param downloadNodes + * Array of download XML nodes + */ +function downloadsClean(downloadNodes) { + if (downloadNodes != null) { + for (var i=0; i<downloadNodes.length; i++) { + downloadClean(downloadNodes[i]); + } + } +} + + +/** + * Builds settings document tree containing actually installed packages. Tests + * all packages from given doc tree for "check" conditions. If given conditions + * are positive, package is considered as installed. + */ +function fillSettingsWithInstalled() { + + var packagesNodes = getPackageNodes(); + + // check each available package + var foundPackage = false; + for (var i = 0; i < packagesNodes.length; i++) { + var packNode = packagesNodes[i]; + + // add package node to settings if it is installed + if (isInstalled(packNode)) { + addSettingsNode(packNode, true); + foundPackage = true; + } + } + if (foundPackage) { + saveSettings(true); + } +} + +/** + * Returns the command line argument for this command node. A command node can + * be an <install/>, <upgrade/> or <remove/> node. + * + * @param cmdNode + * cmd XML node to read from + * @return command defined within the given cmd XML node, returns null + * if no command is defined. + */ +function getCommandCmd(cmdNode) { + return cmdNode.getAttribute("cmd"); +} + +/** + * Returns the value of an exit code node within the given command node. A + * command node can be an <install/>, <upgrade/> or <remove/> node. In case no + * such exit code was defined null will be returned. In case the code is defined + * the string "success" is returned. In case the exit code specifies an + * immediate reboot then the string "reboot" is returned. + * + * @return returns string "reboot" in case a reboot is required.<br> + * returns string "delayedReboot" in case a reboot should be scheduled + * as soon as possible<br> + * returns string "postponedReboot" in case a reboot after installing + * all packages is required<br> + * returns string "success" in case exit code specifies successful + * installation.<br> + * returns null in case the exit code is not defined. + */ +function getCommandExitCodeAction(cmdNode, exitCode) { + var returnValue = null; + var exitNode = cmdNode.selectSingleNode("exit[@code='" + exitCode + "']"); + if (exitNode == null) { + exitNode = cmdNode.selectSingleNode("exit[@code='any']"); + } + if (exitNode == null) { + exitNode = cmdNode.selectSingleNode("exit[@code='*']"); + } + if (exitNode != null) { + if (exitNode.getAttribute("reboot") == "true") { + // This exit code forces a reboot. + info("Command '" + getCommandCmd(cmdNode) + "' returned " + + " exit code [" + exitCode + "]. This exit code " + + "requires an immediate reboot."); + returnValue = "reboot"; + } else if (exitNode.getAttribute("reboot") == "delayed") { + info("Command '" + getCommandCmd(cmdNode) + "' returned " + + " exit code [" + exitCode + "]. This exit code " + + "schedules a reboot after execution of all commands."); + returnValue = "delayedReboot"; + } else if (exitNode.getAttribute("reboot") == "postponed") { + info("Command '" + getCommandCmd(cmdNode) + "' returned " + + " exit code [" + exitCode + "]. This exit code " + + "schedules a reboot after execution of all packages."); + returnValue = "postponedReboot"; + } else { + // This exit code is successful. + info("Command '" + getCommandCmd(cmdNode) + "' returned " + + " exit code [" + exitCode + "]. This exit code " + + "indicates success."); + returnValue = "success"; + } + } + return returnValue; +} + + +/** + * Return value of include attribute of the given cmd node. + * Returns null if include attribute is not set. + * + * @param cmdNode + * The command node to read the include attribute from. + * + * @returns Value of include attribute, returns null if attribute is undefined. + */ +function getCommandInclude(cmdNode) { + return cmdNode.getAttribute("include"); +} + + +/** + * Returns the timeout value for this command node. A command node can be an + * <install/>, <upgrade/> or <remove/> node. + * + * @param cmdNode + * cmd XML node to read from. + * @return the timeout for the given cmd XML node - returns 0 if no timeout is + * defined + */ +function getCommandTimeout(cmdNode) { + var timeout = cmdNode.getAttribute("timeout"); + if (timeout == null) { + timeout = 0; + } + return parseInt(timeout); +} + +/** + * Returns the value of the workdir attribute of the given cmd XML node. + * + * @param cmdNode + * cmd XML node to read from + * @return the workdir attribute value. Returns null in case value is not + * defined. + */ +function getCommandWorkdir(cmdNode) { + var workdir = cmdNode.getAttribute("workdir"); + return workdir; +} + +/** + * Returns condition node of a given XML node. Returns null if there is no + * condition node specified. + * + * @param xmlNode XML node which is supposed to have a <condition /> sub-node. + * @returns Array of condition XML-nodes, might be null if no condition is specified + */ +function getConditions(xmlNode) { + // Read condition nodes (might be 0, 1 or any number) + var conditionNodes = xmlNode.selectNodes("condition"); + + /* + var conditionNodes = xmlNode.selectNodes("wpkg:condition"); + if (conditionNodes.length <= 0) { + // Maybe namespace has not been specified correctly. + // Try reading from default namespace. + conditionNodes = xmlNode.selectNodes("condition"); + } + */ + + // Per specification only one single condition node shall be specified + /* + if (conditionNodes != null && conditionNodes.length > 1) { + error("More than one condition node specified. Ignoring all but the first condition."); + } + */ + + // Return condition node. + return conditionNodes; +} + +/** + * Returns XML node which contains the configuration + */ +function getConfig() { + if (config == null) { + // load config + + // get argument list + var argv = getArgv(); + // Get special purpose argument lists. + var argn = argv.Named; + + // if set to true it will throw an error to quit in case of + // file-not-found + var exitIfNotFound = false; + + // stores config file path + var config_file = null; + + // will be used for file operations + var fso = new ActiveXObject("Scripting.FileSystemObject"); + + if (argn("config") != null) { + var configPath = argn("config"); + var wshObject = new ActiveXObject("WScript.Shell"); + var expConfigPath = wshObject.ExpandEnvironmentStrings(configPath); + config_file = fso.GetAbsolutePathName(expConfigPath); + // config was explicitly specified - I think we should quit if it + // is not available + exitIfNotFound = true; + } else { + // if config_file_name (config.xml) exists, use it + var fullScriptPATH = WScript.ScriptFullName; + var base = fso.GetParentFolderName(fullScriptPATH); + config_file = fso.BuildPath(base, config_file_name); + // config is optional in this case + exitIfNotFound = false; + } + + if (fso.FileExists(config_file)) { + try { + // Read in config.xml. + config = loadXml(config_file, null, "config"); + if (config == null) { + throw new Error("Unable to parse config file!"); + } + } catch (e) { + // There was an error processing the config.xml file. Alert the + // user + error("Error reading "+ config_file + ": " + e.description); + exit(99); // Exit code 99 means config.xml read error. + } + } else { + var message = config_file + " could not be found."; + if (exitIfNotFound) { + error(message); + exit(99); // Exit code 99 means config.xml read error. + } else { + dinfo(message); + } + } + // create empty config if no config could be read + if (config == null) { + config = createXml("config"); + } + } + return config; +} + +/** + * Returns array of <param> nodes from the configuration. Returns array of size + * 0 in case no parameter is defined. + * + * @return <param> nodes + */ +function getConfigParamArray() { + return getConfig().selectNodes("param"); +} + +/** + * Returns download XML node array on a given XML node + * + * @param xmlNode + * the xml node to read child-nodes of type download from + * @param downloadsArray + * array of downloads to be extended with the ones from the given XML + * node, specify null to return a new array. + * @return XML node array on a given package XML node containing all package + * downloads. returns empty array if no downloads are defined + */ +function getDownloads(xmlNode, downloadsArray) { + var downloadsArrayRef = downloadsArray; + if (downloadsArrayRef == null) { + downloadsArrayRef = new Array(); + } + // Only fetch download nodes if downloads are not disabled. + // Just hide download nodes in case downloads are disabled. + if (!isNoDownload()) { + var downloads = xmlNode.selectNodes("download"); + if (downloads != null) { + var filteredDownloads = filterConditionalNodes(downloads, true); + for(var i=0; i<filteredDownloads.length; i++) { + downloadsArrayRef.push(filteredDownloads[i]); + } + } + } + return downloadsArrayRef; +} + +/** + * Returns 'target' attribute from the given download XML node + * + * @param downloadNode + * download XML node + * @return value of 'target' attribute, null if attribute is not defined + */ +function getDownloadTarget(downloadNode){ + return downloadNode.getAttribute("target"); +} + +/** + * Returns 'timeout' attribute from the given download XML node + * + * @param downloadNode + * download XML node + * @return {Number} Value of 'timeout' attribute, returns value of downloadTimeout if no + * timeout value exists or it cannot be parsed. Returns integer. + */ +function getDownloadTimeout(downloadNode) { + var returnValue = downloadTimeout; + var timeout = downloadNode.getAttribute("timeout"); + if (timeout != null) { + try { + returnValue = parseInt(timeout); + } catch(e) { + error("Error parsing timeout attribute: " + e.description); + } + } + + return returnValue; +} + +/** + * Returns value of expandURL attribute from a download node. + * @param downloadNode The download XML node. + * @returns true if variables shall be expanded in URL attribute, + * false if they should not be expanded. Defaults to true if attribute is undefined. + */ +function getDownloadExandURL(downloadNode) { + var returnValue = true; + var attributeValue = downloadNode.getAttribute("expandURL"); + if (attributeValue != null && attributeValue == "false") { + returnValue = false; + } + return returnValue; +} + +/** + * Returns 'url' attribute from the given download XML node + * + * @param downloadNode + * download XML node + * @return value of 'url' attribute, null if attribute is not defined + */ +function getDownloadUrl(downloadNode) { + return downloadNode.getAttribute("url"); +} + +/** + * Gets the size of a file (in Bytes). The path is allowed to contain + * environment variables like "%TEMP%\somefile.txt". + * + * @param file + * path to the file whose size has to be returned + * @return size of the file (in Bytes), returns -1 if file size could not be + * determined + */ +function getFileSize (file) { + var size = -1; + try { + dinfo ("Finding size of '" + file + "'\n"); + var expandedPath = new ActiveXObject("WScript.Shell").ExpandEnvironmentStrings(file); + var FSO = new ActiveXObject("Scripting.FileSystemObject"); + var fsof = FSO.GetFile(expandedPath); + size = fsof.Size; + } catch (e) { + size = -1; + dinfo("Unable to get file size for '" + file + "': " + + e.description); + } + dinfo ("Leaving getFileSize with size " + size); + return size; +} + +/** + * Gets the creation date of a file. + * + * @param file + * Path to the file from which to read the creation date. + * @returns Date when the file has been created. + * Returns null if file date could not be read. + */ +function getFileDateCreation(file) { + var fileDate = null; // new Date(); + try { + dinfo ("Reading creation date of '" + file + "'."); + var expandedPath = new ActiveXObject("WScript.Shell").ExpandEnvironmentStrings(file); + var FSO = new ActiveXObject("Scripting.FileSystemObject"); + var fsof = FSO.GetFile(expandedPath); + fileDate = fsof.DateCreated; + } catch (e) { + fileDate = null; + dinfo("Unable to get file creation date for '" + file + "': " + + e.description); + } + return fileDate; +} + +/** + * Gets the last modified date of a file. + * + * @param file + * Path to the file from which to read the last modification date. + * @returns Date when the file has been last modified. + * Returns null if file date could not be read. + */ +function getFileDateModification(file) { + var fileDate = null; // new Date(); + try { + dinfo ("Reading last modification date of '" + file + "'."); + var expandedPath = new ActiveXObject("WScript.Shell").ExpandEnvironmentStrings(file); + var FSO = new ActiveXObject("Scripting.FileSystemObject"); + var fsof = FSO.GetFile(expandedPath); + fileDate = fsof.DateLastModified; + } catch (e) { + fileDate = null; + dinfo("Unable to get file last modification date for '" + file + "': " + + e.description); + } + return fileDate; +} + +/** + * Gets the last access date of a file. + * + * @param file + * Path to the file from which to read the last access date. + * @returns Date when the file has been last accessed. + * Returns null if file date could not be read. + */ +function getFileDateLastAccess(file) { + var fileDate = null; // new Date(); + try { + dinfo ("Reading last access date of '" + file + "'."); + var expandedPath = new ActiveXObject("WScript.Shell").ExpandEnvironmentStrings(file); + var FSO = new ActiveXObject("Scripting.FileSystemObject"); + var fsof = FSO.GetFile(expandedPath); + fileDate = fsof.DateLastAccessed; + } catch (e) { + fileDate = null; + dinfo("Unable to get file last accessed date for '" + file + "': " + + e.description); + } + return fileDate; +} + +/** + * Returns the version of a file. + * + * @return string representation of version, null in case no version could be + * read. + */ +function getFileVersion (file) { + var version = null; + try { + dinfo ("Trying to find version of " + file); + var FSO = new ActiveXObject("Scripting.FileSystemObject"); + version = FSO.GetFileVersion(file); + dinfo ("Obtained version '" + version + "'."); + } catch (e) { + version = null; + dinfo("Unable to find file version for " + file + " : " + + e.description); + } + return version; +} + +/** + * Returns the hostname of the machine running this script. The hostname might + * be overwritten by the /host:<hostname> switch. + */ +function getHostname() { + if (hostName == null) { + var WshNetwork = WScript.CreateObject("WScript.Network"); + setHostname(WshNetwork.ComputerName.toLowerCase()); + } + return hostName; +} + +/** + * Returns a string representing the regular expression associated to the host + * definition in hosts.xml. + */ +function getHostNameAttribute(hostNode) { + return hostNode.getAttribute("name"); +} + +/** + * Returns the operating system of the machine running this script. The return + * format is: + * + * <pre> + * <OS-caption>, <OS-description>, <CSD-version>, <OS-version> + * example output: + * microsoft windows 7 professional, , sp1, 6.1.7601 + * </pre> + * + * It might be overwritten by the /os:<hostos> switch. + * + * Note: Some values might be empty. + * + * @returns Host operating system specification as a plain string converted to + * lower case letters to ease parsing + */ +function getHostOS() { + if (hostOs == null) { + var strComputer = "."; + var strQuery = "Select * from Win32_OperatingSystem"; + try { + var objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\\\" + + strComputer + "\\root\\cimv2"); + var colOSes = objWMIService.ExecQuery(strQuery,"WQL",48); + var osEnum = new Enumerator(colOSes); + for (; !osEnum.atEnd(); osEnum.moveNext()) { + var osItem = osEnum.item(); + var OtherTypeDescription = ""; + var CSDVersion = ""; + if (osItem.OtherTypeDescription != null) { + OtherTypeDescription = osItem.OtherTypeDescription; + } + if (osItem.CSDVersion != null) { + CSDVersion = osItem.CSDVersion.replace(/Service Pack /i,"SP"); + } + var strSystem = trim(osItem.Caption) + ", " + + OtherTypeDescription + ", " + + CSDVersion + ", " + + osItem.Version; + hostOs = strSystem.toLowerCase(); + dinfo("Host operating system: " + hostOs); + } + } catch (e) { + dinfo("Warning: unable to get operating system information."); + } + } + return hostOs; +} + +/** + * Returns name of domain on which the executing host is member of. + * + * @returns Returns domain name string. + */ +function getDomainName() { + if (domainName == null) { + try { + var strComputer = "." ; + + // Get WMI object to read information from. + var WMIServiceStr = "winmgmts:{impersonationLevel=impersonate}!\\\\" + + strComputer + "\\root\\cimv2"; + var objWMIService = GetObject(WMIServiceStr) ; + + // Query domain name from WMI. + var QueryRes = objWMIService.ExecQuery("Select * from Win32_ComputerSystem where PartOfDomain=True "); + var items=new Enumerator(QueryRes); + items.moveFirst(); + if (items.atEnd() == true) { + // Not a domain member + dinfo("Not a domain member."); + // set + domainName = ""; + } else { + var First = items.item(); + domainName = First.Domain.toLowerCase(); + dinfo("Domain Name: " + domainName); + } + } catch (e) { + dinfo("Message: Unable to get domain information."); + } + } + return domainName; +} + +/** + * Returns array of group names where the executing host is member of. + * + * @returns Returns list of membership groups. + */ +function getHostGroups() { + if (hostGroups == null) { + hostGroups = new Array(); + try { + var hostName = getHostname(); + var domainName = getDomainName(); + var obj = GetObject("WinNT://" + domainName + "/" + hostName + "$,user") ; + var groups = obj.Groups(); + for (var item =new Enumerator(groups); !item.atEnd(); item.moveNext() ) { + var group = item.item(); + dinfo("Found computer group: " + group.Name); + hostGroups.push(group.Name); + } + } catch (e) { + dinfo("Message: Unable to fetch computer membership groups. Probably not a domain member."); + } + } + return hostGroups; +} + +/** + * Returns a list of attribute/value pair associated to the host + * definition in hosts.xml. + * + * @param hostNode XML node of the host definition + * @return dictionary of attribute/value pair. + */ +function getHostAttributes(hostNode) { + var hostAttributes = new ActiveXObject("Scripting.Dictionary"); + + if(hostNode.attributes != null) { + for (var i=0; i<hostNode.attributes.length; i++) { + if (hostNode.attributes[i].value != null) { + hostAttributes.Add(hostNode.attributes[i].name, hostNode.attributes[i].value); + } + } + } + return hostAttributes; +} + +/** + * Returns a string identifying a host node including all attributes. + * + * @param hostNode + * XML node of the host definition + * @return a string of concatenate 'attribute=value' + */ +function getHostNodeDescription(hostNode) { + // Get dictionary object of all attributes. + var hostNodeAttrs = getHostAttributes(hostNode); + + // Fill all attributes into array. + var attrsKeys = hostNodeAttrs.keys().toArray(); + var attrDesc = new Array(); + for (var i=0; i<attrsKeys.length; i++) { + var attrName = attrsKeys[i]; + var attrValue = hostNodeAttrs.Item(attrName); + attrDesc.push(attrName + "='" + attrValue + "'"); + } + // Convert array to comma-separated list + // attr1='value1',attr2='value2' + return attrDesc.join(","); +} + + +/** + * Collects information from local host and stores it into a scripting + * dictionary object. + * + * @returns host attributes stored within a dictionary object. This currently + * includes the following attributes: name, architecture, os, + * ipaddresses, domainname, groups, lcid + */ +function getHostInformation() { + // Fetch host information if not already collected. + // This information is supposed to be static during execution and + // therefore it will be cached. + if (hostAttributes == null) { + hostAttributes = new ActiveXObject("Scripting.Dictionary"); + hostAttributes.Add("hostname", getHostname()); + hostAttributes.Add("architecture", getArchitecture()); + hostAttributes.Add("os", getHostOS()); + hostAttributes.Add("ipaddresses", getIPAddresses()); + hostAttributes.Add("domainname", getDomainName()); + hostAttributes.Add("groups", getHostGroups()); + hostAttributes.Add("lcid", getLocale()); + hostAttributes.Add("lcidOS", getLocaleOS()); + + // Print information found for debug purposes. + dinfo("Host properties: " + + "hostname='" + hostAttributes.Item("hostname") + "'\n" + + "architecture='" + hostAttributes.Item("architecture") + "'\n" + + "os='" + hostAttributes.Item("os") + "'\n" + + "ipaddresses='" + hostAttributes.Item("ipaddresses").join(",") + "'\n" + + "domain name='" + hostAttributes.Item("domainname") + "'\n" + + "groups='" + hostAttributes.Item("groups").join(",") + "'\n" + + "lcid='" + hostAttributes.Item("lcid") + "'\n" + + "lcidOS='" + hostAttributes.Item("lcidOS") + "'" + ); + } + return hostAttributes; +} + +/** + * Accepts a list of XML nodes (Array of XML nodes) which is then filtered for + * XML nodes which either do not specify specific host matches or all specified + * attributes match the current host. For example the following XML nodes would + * match: + * + * E.g. + * + * <pre> + * <host name="nodename"; os="windows"; attributeX="value" profile-id="default" /> + * <host name="nodename" profile-id="default" /> + * <package os="windows" package-id="value" ipaddresses="192\.168\.1\..*" /> + * <package package-id="value" /> + * </pre> + * + * The last example matches since there is no limitation to host attributes in the definition. + * + * The return value will be an Array object listing only the XML nodes which + * match. + * + * @param xmlNodes + * Array of XML nodes which shall be verified for current host match. + * @param getAllMatches + * If set to true returns all matches. If set to false just returns the first matching node from xmlNodes. In this case the return array will contain only one element (or 0 if no match was found). + * @returns Array of XML nodes which match the current host. + */ +function filterConditionalNodes(xmlNodes, getAllMatches) { + // Create array to store the XML nodes which match this host. + var applyingNodes = new Array(); + + if(getAllMatches == null) { + getAllMatches = true; + } + + // Check if xmlNode array passed as argument is valid + if (xmlNodes == null || xmlNodes.length <= 0) { + return applyingNodes; + } + + // Fetch current host attributes. + var globalHostInformation = getHostInformation(); + + // Add "environment" key since we want to support environment matching too. + var hostInformation = new ActiveXObject("Scripting.Dictionary"); + var keys = globalHostInformation.keys().toArray(); + for (var i=0; i<keys.length; i++) { + hostInformation.Add(keys[i], globalHostInformation.Item(keys[i])); + } + hostInformation.Add("environment", ""); + + // Check all nodes whether they match the current host. + for (var i=0; i < xmlNodes.length; i++) { + var xmlNode = xmlNodes[i]; + if (xmlNode == null) { + // Skip to next node + continue; + } + // Set to true if all host attributes from XML specification match + // this host. + var hostMatchFound = true; + + // Fetch all XML attributes which correspond to a defined host property. + var xmlNodeAttrs = new ActiveXObject("Scripting.Dictionary"); + for (var iAttribute=0; iAttribute < xmlNode.attributes.length; iAttribute++) { + if( hostInformation.Item(xmlNode.attributes[iAttribute].name) != null ) { + xmlNodeAttrs.Add(xmlNode.attributes[iAttribute].name, xmlNode.attributes[iAttribute].value); + } + } + + // Check whether all of the attributes match the current host. + var attrsKeys = xmlNodeAttrs.keys().toArray(); + for (var iAttr=0; iAttr<attrsKeys.length; iAttr++) { + var xmlNodeAttrName = attrsKeys[iAttr]; + var xmlNodeAttrValue = xmlNodeAttrs.Item(xmlNodeAttrName); + + // Check whether the attribute matches the current host. + var attributeMatchFound = checkHostAttribute(xmlNodeAttrName, xmlNodeAttrValue); + + // Verify if the attribute does match to current host. + if (attributeMatchFound != true) { + // No match found. Advance to next host. + dinfo("No value of '" + xmlNodeAttrName + "' matched '" + xmlNodeAttrValue + "'. Skipping to next definition."); + hostMatchFound = false; + break; + } + /* + * else { // This attribute matched, continue with next attribute hostMatchFound = true; continue; } + */ + } + + // If not all attributes match the current host definition then the node is not included. + // All nodes which do not specify advanced host match attributes are included too. + if (hostMatchFound) { + // All attributes matched + + // Print some debug information about which extended host attributes matched. + if (xmlNodeAttrs.count > 0) { + var attrsKeys = xmlNodeAttrs.keys().toArray(); + var attrDesc = new Array(); + for (var iAttrKeys=0; iAttrKeys<attrsKeys.length; iAttrKeys++) { + attrDesc.push(attrsKeys[iAttrKeys] + "=" + xmlNodeAttrs.Item(attrsKeys[iAttrKeys])); + } + dinfo("XML node with special host attribute match found: " + attrDesc.join(", ")); + } + + // Verify if the XML node has a <condition /> sub-node + var conditionMatched = true; + var conditionNode = getConditions(xmlNode); + if (conditionNode != null) { + for (var iCond=0; iCond < conditionNode.length; iCond++) { + var condition = conditionNode[iCond]; + // Run all checks + conditionMatched = checkAll(getChecks(condition)); + if (conditionMatched) { + dinfo("Additional conditions matched successfully."); + } else { + conditionMatched = false; + dinfo("Additional conditions did not match."); + break; + } + } + } + + // Insert node to list of matched nodes. + if (conditionMatched) { + applyingNodes.push(xmlNode); + if (!getAllMatches) { + dinfo("Single-match mode. Host match finished."); + break; + } + } + } else { + dinfo("Could not match all attributes of XML node to current host. Skipping to next definition."); + } + } + + return applyingNodes; +} + +/** + * Retrieves host nodes from given "hosts" XML documents. Searches for nodes + * having matching attributes and returns their array. + * + * First matching host node is returned by default. If switch /applymultiple is + * used all matching host nodes are returned. + * + * @return returns the first matching host XML node or the list of all matching + * host XML nodes if applymultiple is true. Returns null if no host node + * matches. + */ +function getHostsApplying() { + if (applyingHostNodes == null) { + // Create new array to store matching hosts. + hostNodesApplying = new Array(); + + // Get available host definitions. + var hostNodes = getHostNodes(); + + // Check each node independently. + for (var iHost=0; iHost < hostNodes.length; iHost++) { + var hostNode = hostNodes[iHost]; + + // Check conditions to determine whether the host definition is + // applied. + var previousEnv = getEnv(); + var variables = getVariables(hostNode, null); + + // Apply variables to environment. + for (var iVariable=0; iVariable < variables.length; iVariable++) { + var varDefinition = variables[iVariable]; + var variableKeys = varDefinition.keys().toArray(); + for (var iVarKey = 0; iVarKey < variableKeys.length; iVarKey++) { + var key = variableKeys[iVarKey]; + var value = varDefinition.Item(key); + setEnv(key, value); + } + } + + // Checkthis host node for special conditions. + var hostList = new Array(); + hostList.push(hostNode); + hostList = filterConditionalNodes(hostList, true); + if (hostList.length < 1) { + // Restore environment. + loadEnv(previousEnv); + // Skipt to next host node. + continue; + } + + // Get host name attribute. + var hostNameAttribute = getHostNameAttribute(hostNode); + + if (hostNameAttribute != null && hostNameAttribute != "") { + // Try direct match first (non-regular-expression matching). + if (hostNameAttribute.toUpperCase() == getHostname().toUpperCase()) { + // Append host to applying hosts. + hostNodesApplying.push(hostNode); + + } else { + + // Flag to check if IP-address match succeeded. + var ipMatchSuccess = false; + try { + // Try IPv4-address matching. + // Get IPv4 addresses (might be multiple). + var ipAddresses = getIPAddresses(); + + // check for each address if a host node matches + // try non-regular-expression matching + for (var iIPAdresses=0; iIPAdresses < ipAddresses.length; iIPAdresses++) { + var ipAddress = ipAddresses[iIPAdresses]; + + // splitvalues + // dinfo("Trying to match IP '" + ipAddress + "' to " + + // "'" + matchPattern + "'"); + var splitIP = ipAddress.split("."); + var splitPattern = hostNameAttribute.split("."); + // check if format was correct + if (splitIP.length == 4 && + splitPattern.length == 4) { + var firstValue = 0; + var secondValue = 0; + var match = true; + for (var k=0; k<splitIP.length; k++) { + // get first range value + var ipOctet = parseInt(splitIP[k]); + var matchOctet = splitPattern[k]; + + // check if ip octet defines a range + var splitMatchOctet = matchOctet.split("-"); + firstValue = parseInt(splitMatchOctet[0]); + if (splitMatchOctet.length > 1) { + secondValue = parseInt(splitMatchOctet[1]); + } else { + secondValue = firstValue; + } + if (firstValue > secondValue) { + // swap values + var temp = firstValue; + firstValue = secondValue; + secondValue = temp; + } + // let's finally see if the ip octet is outside the range + if ((ipOctet < firstValue || ipOctet > secondValue)) { + // if octet did not match the requirements + // dinfo("no match!"); + match = false; + // no need to continue + break; + } + } + // If all matched, take this profile. + if (match) { + dinfo("Found host '" + hostNameAttribute + + "' matching IP '" + ipAddress + "'"); + // Append host to applying hosts. + hostNodesApplying.push(hostNode); + ipMatchSuccess = true; + break; + } + } + } + } catch(e) { + ipMatchSuccess = false; + dinfo("IP-Address match failed: " + e.description); + } + + // If we still got no match with, then try regular expression matching. + if (!ipMatchSuccess) { + try { + var hostNameAttributeMatcher = new RegExp("^" + hostNameAttribute + "$", "i"); + + if (hostNameAttributeMatcher.test(getHostname()) == true) { + hostNodesApplying.push(hostNode); + } + } catch (e) { + warning("Invalid regular expression for host name matching: '" + + hostNameAttribute + "'."); + } + } + } + + } else { + + // Host "name" attribute is missing or empty. Include host as potential match. + // This allows to filter this host later using extended host matching + hostNodesApplying.push(hostNode); + } + + // Restore environment. + loadEnv(previousEnv); + } + + // Filter host nodes by matching them to the local host. + // hostNodesApplying = filterConditionalNodes(hostNodesApplying, isApplyMultiple()); + + // Matches might have returned multiple matching results. In case of + // single-matching mode (default) only the first result shall be + // returned + if (!isApplyMultiple() && hostNodesApplying.length > 1) { + var applyingHostNode = hostNodesApplying[0]; + hostNodesApplying = new Array(); + hostNodesApplying.push(applyingHostNode); + } + + if (hostNodesApplying.length <= 0) { + hostNodesApplying = null; + throw new Error("Unable to find any matching host definition!"); + } + applyingHostNodes = hostNodesApplying; + } + + return applyingHostNodes; +} + +/** + * Returns an array of host nodes which specify the host regular expression and + * the corresponding profile + */ +function getHostNodes() { + return getHosts().selectNodes("host"); +} + +/** + * Returns the profile-id associated with the given host node. + * The node structure is defined as follows: + * + * The profile-id or the enclosed <profile... /> nodes might be omitted but not + * both! + * + * @param hostNode XML node of the host definition + * @return array of strings with referenced profiles + * (array might be of length 0 if no profiles are defined) + */ +function getHostProfiles(hostNode) { + // create array to store profile IDs + var profileList = new Array(); + + // try to receive profile ID from host node + var profileID = hostNode.getAttribute("profile-id"); + + if (profileID != null) { + // convert to lower case if case-sensitivity is off + if (!isCaseSensitive()) { + profileList.push(profileID.toLowerCase()); + } else { + profileList.push(profileID); + } + } + + // Load host definition environment (environment might be used in condition + // checks. + var previousEnv = getEnv(); + var variables = getVariables(hostNode, null); + + // Apply variables to environment. + for (var iVariable=0; iVariable < variables.length; iVariable++) { + var varDefinition = variables[iVariable]; + var variableKeys = varDefinition.keys().toArray(); + for (var iVarKey = 0; iVarKey < variableKeys.length; iVarKey++) { + var key = variableKeys[iVarKey]; + var value = varDefinition.Item(key); + setEnv(key, value); + } + } + + var profileNodes = hostNode.selectNodes("profile"); + if (profileNodes != null) { + // Get only dependencies which match the current host. + var matchingProfileNodes = filterConditionalNodes(profileNodes, true); + for (var iProfile=0; iProfile<matchingProfileNodes.length; iProfile++) { + var profileNode = matchingProfileNodes[iProfile]; + // get id attribute + var profileId = profileNode.getAttribute("id"); + + // convert to lower case if case-sensitivity is off + if (!isCaseSensitive()) { + profileList.push(profileId.toLowerCase()); + } else { + profileList.push(profileId); + } + } + } + + // Restore environment. + loadEnv(previousEnv); + + if (profileList.length > 0) { + var message = "Profiles applying to the current host:\n"; + for (var iProfileIndex=0; iProfileIndex<profileList.length; iProfileIndex++) { + message += profileList[iProfileIndex] + "\n"; + } + dinfo(message); + } else { + error("No profiles assigned to the current host!"); + } + + return profileList; +} + +/** + * Returns XML node which contains all host configurations + */ +function getHosts() { + if(hosts == null) { + var newHosts = createHosts(); + setHosts(newHosts); + } + return hosts; +} + +/** + * Returns a list of variables from the applying hosts definition. + * + * @param array + * Object of type Array to which the the variables appended. + * In case null is supplied it returns a new Array object. + * @return Object of type Scripting.Dictionary which contains all key/value + * pairs from the applying hosts. + */ +function getHostsVariables(array) { + dinfo("Reading variables from hosts[s]"); + + // Fetch host definitions which apply to current host. + if (hostsVariables == null) { + hostsVariables = new Array(); + var hostNodes = getHostsApplying() ; + for (var iHostNode=0; iHostNode < hostNodes.length; iHostNode++) { + var hostNode = hostNodes[iHostNode]; + dinfo("Reading variables from host: " + getHostNodeDescription(hostNode)); + + // Add variables from host XML node. + hostsVariables = getVariables(hostNode, hostsVariables); + } + } + + // Concatenate variable list if list was passed as parameter. + var concatenatedVariables = hostsVariables; + if (array != null) { + // concatenatedVariables = concatenateDictionary(dictionary, hostsVariables); + concatenatedVariables = hostsVariables.concat(array); + } + + return concatenatedVariables; +} + +/** + * Returns the corresponding string defined within the configuration. + * + * @param stringID + * the identification of the corresponding string as listed within + * the configuration + * + * @return returns the string as it appears within the configuration. Returns + * null if the string id is not defined. + */ +function getLocalizedString(stringID) { + if (languageNode == null && getConfig() != null) { + // read node which contains all the strings + var languagesNodes = getConfig().selectNodes("languages"); + + if (languagesNodes != null) { + // there might be multiple languages nodes + for (var i=0; i < languagesNodes.length; i++) { + // get language nodes + var languageNodes = languagesNodes[i].selectNodes("language"); + + for (var j=0; j < languageNodes.length && languageNode == null; j++) { + var currentLangNode = languageNodes[j]; + + // get associated language LCIDs + var lcidString = currentLangNode.getAttribute("lcid"); + var lcids = lcidString.split(","); + for (var k=0; k < lcids.length; k++) { + // check if it corresponds to the system LCID + var currentLcid = trimLeadingZeroes(trim(lcids[k])); + if (currentLcid == getLocale()) { + dinfo("Found language definition node for language ID " + currentLcid); + languageNode = currentLangNode; + break; + } + } + } + } + } + + } + + // check if language has not been found + if (languageNode == null) { + // create empty node + languageNode = createXml("language"); + } + + // try to find node matching the requested sting id + var stringNode = languageNode.selectSingleNode("string[@id='" + stringID + "']"); + if (stringNode != null) { + return stringNode.text; + } else { + dinfo("No locale language definition found for message ID '" + stringID + + "' (language LCID '" + getLocale() + "')."); + return null; + } +} + +/** + * Returns array of package IDs which includes package IDs of chained packages. + * Returns empty array in case the package does not have any chained packages. + * + * @param packageNode + * the package node to read the list of chained packages from + * @param packageList + * optional reference to an array which is used to insert the chained + * packages to. Specify null to create a new Array + * @return Array specified in packageList parameter extended by package IDs + * (string values) which represent the chained packages + */ +function getPackageChained(packageNode, packageList) { + // output array + if (packageList == null) { + packageList = new Array(); + } + + if(packageNode != null) { + var includeNodes = packageNode.selectNodes("chain"); + if (includeNodes != null) { + matchingChainNodes = filterConditionalNodes(includeNodes, true); + for (var i=0; i < matchingChainNodes.length; i++) { + var dependId = matchingChainNodes[i].getAttribute("package-id"); + + // convert to lower case if case-insensitive mode is on + if (dependId != null) { + if (!isCaseSensitive()) { + dependId = dependId.toLowerCase(); + } + packageList.push(dependId); + } + } + } + } + + return packageList; +} + +/** + * Defines how package checks are used during package installation. + * + * Currently supported values: + * + * "always" (default): + * When a package is new to the host then first the checks are run in order to + * verify whether the package is already installed. If the checks succeed then + * it is assumed that no further installation is needed. The package is silently + * added to the host without executing any commands. + * + * "never": + * When a package is new to the host then the install commands are run in any + * case (without doing checks first). Note: Checks will still be done after + * package installation to verify whether installation was successful. + * + * @param packageNode Package XML node to read attribute from. + * @returns "always" or "never" according to precheck-install attribute of + * package. + */ +function getPackagePrecheckPolicyInstall(packageNode) { + var checkPolicy = "always"; + var installCheckPolicy = packageNode.getAttribute("precheck-install"); + if (installCheckPolicy != null) { + checkPolicy = installCheckPolicy; + } + return checkPolicy; +} + +/** + * Defines how package checks are used during package removal. + * + * Currently supported values: + * + * "always": + * When a package is removed from a host then the checks will be executed + * before removal is processes. If the checks fail this potentially means that + * the package has been removed already. In such case the package remove + * commands will be skipped. + * + * "never" (default): + * When a package is about to be removed from the host then WPKG will execute + * the remove commands in any case without executing the checks first. + * Note: Checks will still be done after package removal to verify whether the + * removal was successful. + * + * @param packageNode Package XML node to read attribute from. + * @returns "always" or "never" according to precheck-remove attribute of + * package. + */ +function getPackagePrecheckPolicyRemove(packageNode) { + var checkPolicy = "never"; + var removeCheckPolicy = packageNode.getAttribute("precheck-remove"); + if (removeCheckPolicy != null) { + checkPolicy = removeCheckPolicy; + } + return checkPolicy; +} + +/** + * Defines how package checks are used during package upgrade. + * + * Currently supported values: + * + * "always": + * When a package is upgraded the checks specified will be be executed before + * the upgrade takes place. If checks succeed, then the upgrade will not be + * performed (WPKG just assumes that the new version is already applied + * correctly. + * Please note that your checks shall verify a specific software version and + * not just a generic check which is true for all versions. If your checks + * are true for the old version too then WPKG would never perform the upgrade + * in this mode. + * + * "never" (default): + * When a package is about to be upgraded then WPKG will execute the upgrade + * commands in any case without executing the checks first. This is the + * recommended behavior. + * Note: Checks will still be done after package upgrade to verify whether the + * upgrade was successful. + * + * @param packageNode Package XML node to read attribute from. + * @returns "always" or "never" according to precheck-upgrade attribute of + * package. + */ +function getPackagePrecheckPolicyUpgrade(packageNode) { + var checkPolicy = "never"; + var upgradeCheckPolicy = packageNode.getAttribute("precheck-upgrade"); + if (upgradeCheckPolicy != null) { + checkPolicy = upgradeCheckPolicy; + } + return checkPolicy; +} + +/** + * Defines how package checks are used during package downgrade. + * + * Currently supported values: + * + * "always": + * When a package is downgraded the checks specified will be be executed before + * the downgrade takes place. If checks succeed, then the downgrade will not be + * performed (WPKG just assumes that the old version is already applied + * correctly. + * Please note that your checks shall verify a specific software version and + * not just a generic check which is true for all versions. If your checks + * are true for the new/current version too then WPKG would never perform the + * downgrade in this mode. + * + * "never" (default): + * When a package is about to be downgraded then WPKG will execute the + * downgrade commands in any case without executing the checks first. This is + * the recommended behavior. + * Note: Checks will still be done after package downgrade to verify whether + * the downgrade was successful. + * + * @param packageNode Package XML node to read attribute from. + * @returns "always" or "never" according to precheck-downgrade attribute of + * package. + */ +function getPackagePrecheckPolicyDowngrade(packageNode) { + var checkPolicy = "never"; + var downgradeCheckPolicy = packageNode.getAttribute("precheck-downgrade"); + if (downgradeCheckPolicy != null) { + checkPolicy = downgradeCheckPolicy; + } + return checkPolicy; +} + +/** + * Returns an array of <check /> XML sub-nodes on a given XML node. + * In case extended host matching attributes are used only the checks which match the + * current host are returned. + * + * @param xmlNode The XML node from which all 'check' sub-nodes are read + * @return Array of XML nodes containing all 'check'-nodes which match to the current host. + * Returns empty array if no checks are defined. + * If extended host matching attributes like "hostname", "os" or similar are used + * then checks which do not match the current host are not returned. + */ +function getChecks(xmlNode) { + var checkNodes = xmlNode.selectNodes("check"); + /* + var checkNodes = xmlNode.selectNodes("wpkg:check"); + if (checkNodes.length <= 0) { + // Maybe amespace was wrongly specified. + // Try default namespace. + checkNodes = xmlNode.selectNodes("check"); + } + */ + return filterConditionalNodes(checkNodes); +} + +/** + * This is a convenience-method to get all downgrade commands. + * + * @param packageNode + * package XML node which contains 'downgrade' nodes + * @return Array of 'downgrade' XML nodes, returns empty array if no nodes are + * defined + */ +function getPackageCmdDowngrade(packageNode, includeChain) { + // Fetch commands from package node. + var commandNodes = getPackageCmd(packageNode, "downgrade", null); + + // Return list of applying install commands. + return commandNodes; +} + +/** + * This is a convenience-method to get all install commands. + * + * @param packageNode + * package XML node which contains 'install' nodes + * @return Array of 'install' XML nodes, returns empty array if no nodes are + * defined + */ +function getPackageCmdInstall(packageNode, includeChain) { + // Fetch commands from package node. + var commandNodes = getPackageCmd(packageNode, "install", null); + + // Return list of applying install commands. + return commandNodes; +} + + +/** + * This is a convenience-method to get all remove commands. + * + * @param packageNode + * package XML node which contains 'remove' nodes + * @return Array of 'remove' XML nodes, returns empty array if no nodes are + * defined + */ +function getPackageCmdRemove(packageNode, includeChain) { + // Fetch commands from package node. + var commandNodes = getPackageCmd(packageNode, "remove", null); + + // Return list of applying install commands. + return commandNodes; +} + +/** + * This is a convenience-method to get all upgrade commands. + * + * @param packageNode + * package XML node which contains 'remove' nodes + * @return Array of 'upgrade' XML nodes, returns empty array if no nodes are + * defined + */ +function getPackageCmdUpgrade(packageNode, includeChain) { + // Fetch commands from package node. + var commandNodes = getPackageCmd(packageNode, "upgrade", null); + + // Return list of applying install commands. + return commandNodes; +} + + +/** + * Returns a list of commands which apply to the given command type. + * Common types are 'install', 'upgrade', 'downgrade' or 'remove' but WPKG + * allows any custom type definition within the commands/command XML structure. + * For example it is possible to specify <command type="test-type" /> and then + * receive all "test-type" commands using this method. + * + * @param packageNode + * package XML node which contains command nodes. + * @param type + * Type description. Defines which command group to receive. + * @param includeChain + * Array of command types (install/upgrade/downgrade/remove) already + * included. + * This is used to detect inclusion loops (recursive inclusion). + * @return Array of command XML nodes, returns empty array if no nodes are + * defined + */ +function getPackageCmd(packageNode, type, includeChain) { + // Verify input parameters. + if (packageNode == null) { + return null; + } + + // Type must be specified in order to get command group. + if (type == null || type == "") { + return null; + } + + var alreadyIncluded; + if (includeChain == null) { + alreadyIncluded = new Array(); + } else { + alreadyIncluded = includeChain; + } + alreadyIncluded.push(type); + + // This variable holds the result set returned. + var commandNodeList = new Array(); + + // Fetch commands directly attached to package node + var directCommandNodes = null; + switch (type) { + case "install": + directCommandNodes = packageNode.selectNodes("install"); + break; + case "upgrade": + directCommandNodes = packageNode.selectNodes("upgrade"); + break; + case "downgrade": + directCommandNodes = packageNode.selectNodes("downgrade"); + break; + case "remove": + directCommandNodes = packageNode.selectNodes("remove"); + break; + default: + // Command type is none of the "default" types This command type is + // supported in command nodes only. + break; + } + + // Fetch command-nodes from <commands><command type="type" /></commands> structure. + var commandNodes = packageNode.selectNodes("commands/command[@type=\"" + type + "\"]"); + + // Merge command lists. + if (directCommandNodes != null) { + for (var iCmd=0; iCmd < directCommandNodes.length; iCmd++) { + commandNodeList.push(directCommandNodes[iCmd]); + } + } + if (commandNodes != null) { + for (var iCmd=0; iCmd < commandNodes.length; iCmd++) { + commandNodeList.push(commandNodes[iCmd]); + } + } + + // Filter out all packages which do not apply to current host. + commandNodeList = filterConditionalNodes(commandNodeList, true); + + // Expand command includes. + // Create array which is returned as a complete command list. + var fullCommandList = new Array(); + + // Check all commands for inclusion. + for (var iTypeCommands=0; iTypeCommands<commandNodeList.length; iTypeCommands++) { + var command = commandNodeList[iTypeCommands]; + var include = getCommandInclude(command); + + // Inclusion found. + if (include != null) { + dinfo("Found inclusion for command type " + include + "."); + + // Clone array of already included command types which helps to + // detect duplicated includes. + // The same loop will check whether the type to be included has + // already been included (recursive inclusion detection). + var prevIncluded = new Array(); + for (var j=0; j<alreadyIncluded.length; j++) { + var includeElement = alreadyIncluded[j]; + if (includeElement == include) { + throw new Error("Recursive inclusion detected!"); + } else { + prevIncluded.push(alreadyIncluded[j]); + } + } + + // Fetch commands of specified type (if any) + var includedCommands = getPackageCmd(packageNode, include, prevIncluded); + + // Insert fetched commands to command list. + if (includedCommands != null) { + for (var iIncCmds=0; iIncCmds<includedCommands.length; iIncCmds++) { + fullCommandList.push(includedCommands[iIncCmds]); + } + } + } else { + // Include command in command-list. + fullCommandList.push(command); + } + } + + // Return list of applying commands. + return fullCommandList; +} + + +/** + * Returns array of package IDs which represent the package dependencies. + * Returns empty array in case the package does not have any dependency. + * + * @param packageNode + * the package node to read the list of dependencies from + * @param packageList + * optional reference to an array which is used to insert the + * dependencies to. Specify null to create a new Array + * @return Array specified in packageList parameter extended by package IDs + * (string values) which represent the dependencies + */ +function getPackageDependencies(packageNode, packageList) { + // output array + if (packageList == null) { + packageList = new Array(); + } + + if(packageNode != null) { + var dependNodes = packageNode.selectNodes("depends"); + if (dependNodes != null) { + // Get only dependencies which match the current host. + var matchingDependNodes = filterConditionalNodes(dependNodes, true); + for (var i=0; i < matchingDependNodes.length; i++) { + var dependId = matchingDependNodes[i].getAttribute("package-id"); + + // convert to lower case if case-insensitive mode is on + if (dependId != null) { + if (!isCaseSensitive()) { + dependId = dependId.toLowerCase(); + } + packageList.push(dependId); + } + } + } + } + + return packageList; +} + +/** + * Returns the package execute attribute value (String) + * + * @param packageNode + * the package node to get the attribute from + * @return package execute attribute value, empty string if undefined + */ +function getPackageExecute(packageNode) { + var execAttr = packageNode.getAttribute("execute"); + if (execAttr == null) { + execAttr = ""; + } + return execAttr; +} + +/** + * Returns the package ID string from the given package XML node. + * + * @return package ID + */ +function getPackageID(packageNode) { + return packageNode.getAttribute("id"); +} + +/** + * Returns array of package IDs which represent the package includes. Returns + * empty array in case the package does not have any dependency. + * + * @param packageNode + * the package node to read the list of includes from + * @param packageList + * optional reference to an array which is used to insert the + * includes to. Specify null to create a new Array + * @return Array specified in packageList parameter extended by package IDs + * (string values) which represent the includes + */ +function getPackageIncludes(packageNode, packageList) { + // output array + if (packageList == null) { + packageList = new Array(); + } + + if(packageNode != null) { + var includeNodes = packageNode.selectNodes("include"); + if (includeNodes != null) { + var matchingIncludeNodes = filterConditionalNodes(includeNodes, true); + for (var i=0; i < matchingIncludeNodes.length; i++) { + var dependId = matchingIncludeNodes[i].getAttribute("package-id"); + + // convert to lower case if case-insensitive mode is on + if (dependId != null) { + if (!isCaseSensitive()) { + dependId = dependId.toLowerCase(); + } + packageList.push(dependId); + } + } + } + } + + return packageList; +} + +/** + * Reads the "manualInstall" attribute from a package node. + * This attribute is true only if the package as installed manually via + * command line. It is false for packages which are initially installed by + * package synchronization. + * + * @param packageNode the package from which the attribute is read. + * @returns {Boolean} True if package was installed manually, false if it is + * applied by profile. + */ +function getPackageManualInstallation(packageNode) { + // Initialize return variable. + var isManualInstall = false; + + // Read yctual value. + var manualInstall = packageNode.getAttribute("manualInstall"); + + // Evaluate result. + if (manualInstall != null && manualInstall == "true") { + isManualInstall = true; + } + return isManualInstall; +} + +/** + * Returns the package name from the given package XML node + * + * @return returns the package name attribute - empty string if no name is + * defined + */ +function getPackageName(packageNode) { + var packageName = ""; + if(packageNode != null) { + packageName = packageNode.getAttribute("name"); + if (packageName == null) { + packageName = ""; + } + } + return packageName; +} + +/** + * Returns the corresponding package XML node from the package database + * (packages.xml). Returns null in case no such package exists. + */ +function getPackageNode(packageID) { + // get first node which matched the specified ID + return getPackages().selectSingleNode("package[@id='" + packageID +"']"); +} + +/** + * Returns the corresponding package XML node to the requested package ID by + * searching the packages database first. If the package cannot be located + * within the package database it prints an error and looks for the node within + * the local settings database. + * If even the local database does not contain such a package entry then it + * prints an error about missing package definition. In case '/quitonerror' is + * set it exits. + * + * If the package could be located within the local package database it prints + * a warning and returns the local package node. + * + * Algorithmic description: + * + * <pre> + * search package node within local package database + * if found + * return it + * else + * print warning + * look for package within local settings + * if found + * print warning + * return it + * else + * print error (or exit by throwing error in case of /quitonerror) + * return null + * fi + * fi + * </pre> + */ +function getPackageNodeFromAnywhere(packageID) { + var packageNode = null; + + // try to get package node from package database + var packageDBNode = getPackageNode(packageID); + + // check if node exists; if not then try to get the node from the settings + if(packageDBNode != null) { + // package found in package database, mark for installation/upgrade + dinfo("Found package node '" + getPackageName(packageDBNode) + "' (" + + getPackageID(packageDBNode) + ") in package database."); + packageNode = packageDBNode; + } else { + // error package not in package database + // looking for package node within the local settings file + /* + * var packageNotFoundMessage = "Profile inconsistency: Package '" + packageID + "' does not exist within the + * package database. " + "Please contact your system administrator!"; + * + * warning(packageNotFoundMessage); + */ + + // try to get package node from local settings + var packageSettingsNode = getSettingNode(packageID); + + // if no package definition has been found jet the package is not + // installed + if(packageSettingsNode != null) { + // Check if the package has been manually installed. + var messageLocalOnly = ""; + var isManualInstall = getPackageManualInstallation(packageSettingsNode); + if (isManualInstall == true) { + messageLocalOnly = "Manually installed package not found in server database."; + } else { + messageLocalOnly = "Database inconsistency: Package with package ID '" + + packageID + "' missing in package database. Package information " + + "found on local installation:\n"; + } + messageLocalOnly += "Package ID: " + messageLocalOnly + "\n" + + "Package Name: " + getPackageName(packageSettingsNode) + "\n" + + "Package Revision: " + getPackageRevision(packageSettingsNode) + "\n"; + warning(messageLocalOnly); + packageNode = packageSettingsNode; + } else { + var messageNotFound = "Database inconsistency: Package with ID '" + packageID + + "' does not exist within the package database or the local settings file. " + + "Please contact your system administrator!"; + if (isQuitOnError()) { + throw new Error(messageNotFound); + } else { + error(messageNotFound); + } + } + } + + // return result + return packageNode; +} + +/** + * Returns an array of all package nodes that can be installed. This list + * includes all packages found in the package database. It does not include + * local packages from the settings file (currently installed ones). + * + * @return Array containing XML nodes (package nodes). Array might be of size 0 + */ +function getPackageNodes() { + // Retrieve packages. + var packageNodes = getPackages().selectNodes("package"); + + // make sure a package ID exists only once + packageNodes = uniqueAttributeNodes(packageNodes, "id"); + + // return this array + return packageNodes; +} + +/** + * Returns the package notify attribute value + * + * @param packageNode + * the package node to get the notify attribute from + * @return Notify attribute value (true in case of String "true" false + * otherwise. + */ +function getPackageNotify(packageNode) { + var returnvalue = true; + var notify = packageNode.getAttribute("notify"); + if (notify == "false") { + returnvalue = false; + } + return returnvalue; +} + +/** + * Returns the package priority from the given package XML node + * + * @return package priority - returns 0 if no priority is defined + */ +function getPackagePriority(packageNode) { + var priority = packageNode.getAttribute("priority"); + if (priority == null) { + priority = 0; + } + return parseInt(priority); +} + + +/** + * Returns the package reboot attribute value. This attribute can add + * additional reboots but not limit or invalidate reboot flags set on the + * command-level. + * + * This value can have three states: + * + * <pre> + * "true" Immediate reboot after package installation. + * This will take precedence of any command-level reboot="postponed" + * attribute if present and reboot immediately after package + * installation. + * A reboot="true" attribute on command-level will still result in + * an immediate reboot. + * Resulting status depending on command-level reboot flag: + * "true" immediate reboot after command execution + * "delayed" reboot after package installation + * "postponed" reboot after package installation + * "false" reboot after package installation + * "postponed" Schedule reboot after installing all packages within this + * session, for example after synchronizing. + * Resulting status depending on command-level reboot flag: + * "true" immediate reboot after command execution + * "delayed" reboot after package installation + * "postponed" reboot after all actions are completed + * "false" reboot after all actions are completed + * "false" No reboot unless one is defined at command-level. + * or not set Resulting status depending on command-level reboot flag: + * "true" immediate reboot after command execution + * "delayed" reboot after package installation + * "postponed" reboot after all actions are completed + * "false" no reboot + * </pre> + * + * As a result there are four possibilities to schedule a reboot in order of + * precedence: + * + * <pre> + * immediate Command node specified reboot=true, immediate reboot takes place. + * package Reboot is issued right after installing: + * - package specifies reboot="true" + * OR + * - any command node specified reboot="delayed" + * postponed Reboot will take place after all packages have been applied. + * - package specifies reboot="postponed" + * OR + * - any command node specified reboot="postponed" + * none No reboot is issued by this package: + * - package does not specify reboot or specifies reboot="false" + * AND + * - no command node specified any form of reboot reboot + * </pre> + * + * This means that an immediate reboot always has the highest priority. You + * can just set "reboot markers" on a "timeline" on package and command level + * where the closest reboot marker will be executed: + * immediate => package => postponed => none + * + * @return one of the states (string values): + * "true", always reboot after package installation + * "postponed", reboot before script exits + * "false", reboot only if command specified reboot=delayed/postponed + * + */ +function getPackageReboot(packageNode) { + var rebootAction = "false"; + var packageReboot = packageNode.getAttribute("reboot"); + if (packageReboot != null) { + if (packageReboot == "true") { + rebootAction = packageReboot; + } else if (packageReboot == "postponed") { + rebootAction = packageReboot; + } + } + return rebootAction; +} + +/** + * Adds all packages referenced by the specified package node to the given + * array. In other words all dependencies, chained packages and includes of the + * given node will be appended to the array. If you specify null or an empty + * array the array returned will contain all packages from the dependency tree + * of the given package node. + * + * @param packageNode + * full dependency tree of the specified package will be added to the + * given array. + * @param packageArray + * Array to which all referenced packages are added to. Specify null + * to create a new array finally containing only the dependency tree + * of the specified package. + * @return array containing all referenced packages (full package nodes). NOTE: + * The returned array is not sorted. + */ +function getPackageReferences(packageNode, packageArray) { + if (packageArray == null) { + packageArray = new Array(); + } + + // get dependencies, includes and chains + var linkedPackageIDs = getPackageDependencies(packageNode, null); + getPackageIncludes(packageNode, linkedPackageIDs); + getPackageChained(packageNode, linkedPackageIDs); + + // add nodes if they are not yet part of the array + for (var i=0; i < linkedPackageIDs.length; i++) { + var currentNode = getPackageNodeFromAnywhere(linkedPackageIDs[i]); + if (currentNode != null) { + if(!searchArray(packageArray, currentNode)) { + dinfo("Adding referenced package '" + getPackageName(currentNode) + "' (" + + getPackageID(currentNode) + ") for package '" + + getPackageName(packageNode) + "' (" + getPackageID(packageNode) + + ")"); + // add the package first (so it's not added again, this prevents + // loops) + packageArray.push(currentNode); + + // add dependencies of these package as well + getPackageReferences(currentNode, packageArray); + } else { + dinfo("Referenced package '" + getPackageName(currentNode) + "' (" + + getPackageID(currentNode) + ") for package '" + + getPackageName(packageNode) + "' (" + getPackageID(packageNode) + + ") already added."); + } + } + } +} + +/** + * Returns the package version string from the given package XML node. Returns 0 + * if package has no revision specified. + * + * @return String representing the package revision (might be a dot-separated + * version) <#>[.<#>]* + */ +function getPackageRevision(packageNode) { + var packageRevision = packageNode.getAttribute("revision"); + if (packageRevision == null) { + // set to string "0" if no revision is defined + packageRevision = 0 + ""; + } else { + // check if the revision contains the "%" character (environment + // variable) + if( packageRevision.match(new RegExp("%.+%"), "ig") ) { + // Generate the correct environment. + var previousEnv = getEnv(); + + // set package specific environment + loadPackageEnv(packageNode); + + // expand environment strings + var wshObject = new ActiveXObject("WScript.Shell"); + packageRevision = wshObject.ExpandEnvironmentStrings(packageRevision); + + // reset environment + loadEnv(previousEnv); + } + } + return packageRevision; +} + +/** + * Returns XML node which contains all packages (package database). + */ +function getPackages() { + if(packages == null) { + var newPackages = createPackages(); + setPackages(newPackages); + } + return packages; +} + +/** + * Returns the action to be performed on a given package if the package is + * applied to the current host. + * Valid actions are: + * "none" No action; package installed already + * "install" Installation, package is new on the host + * "upgrade" Upgrade package which already exists on the system + * New version higher than installed version + * "downgrade" Downgrade package which already exists on the system + * New version lower than installed version + * + * @param packageNode + * The package to be checked. + * @returns Action to be performed. Can be 0=nothing, 1=install, 2=upgrade, 3=downgrade. + */ +function getPackageInstallAction(packageNode) { + // Action to be performed when + var actionNone = "none"; + var actionInstall = "install"; + var actionUpgrade = "upgrade"; + var actionDowngrade = "downgrade"; + var action = actionNone; + + var packageName = getPackageName(packageNode); + var packageID = getPackageID(packageNode); + var packageRev = getPackageRevision(packageNode); + var executeAttr = getPackageExecute(packageNode); + // var notifyAttr = getPackageNotify(packageNode); + + // Search for the package in the local settings. + var installedPackage = getSettingNode(packageID); + + // String to print in events which identifies the package. + var packageMessage = "Package '" + packageName + "' (" + packageID + "): "; + + // Evaluate type of installation (install/upgrade/downgrade/none). + // INSTALL: + if (installedPackage == null) { + // ONE-TIME INSTALL PACKAGE, NOT INSTALLED YET (according to settings) + // Install the package after checking that it is not installed already. + dinfo(packageMessage + "Not in local package database; Marking for installation."); + action = actionInstall; + + // UPGRADE/DOWNGRADE: + } else { + // Get revision of installed package. + var packageRevInstalled = getPackageRevision(installedPackage); + // Compare Versions. + var comparisonResult = versionCompare(packageRev, packageRevInstalled); + + if (comparisonResult > 0) { + // ONE-TIME INSTALL PACKAGE, UPGRADE: + info(packageMessage + + "Already installed but version mismatch.\n" + + "Installed revision: '" + packageRevInstalled + "'\n" + + "Available revision: '" + packageRev + "'.\n" + + "Preparing upgrade." + ); + action = actionUpgrade; + + } else if (comparisonResult < 0) { + // ONE-TIME INSTALL PACKAGE, DOWNGRADE: + info(packageMessage + + "Already installed but version mismatch.\n" + + "Installed revision '" + packageRevInstalled + "'\n" + + "Available revision: '" + packageRev + "'.\n" + + "Preparing downgrade." + ); + action = actionDowngrade; + + } else { + // ONE-TIME INSTALL PACKAGE, ALREADY INSTALLED: + + if (executeAttr == "always") { + // ALWAYS EXECUTION PACKAGE + // Packages with exec attribute "always" will be installed on each run; regardless of their version. + dinfo(packageMessage + "Is requested to be executed 'always'. Preparing installation."); + action = actionInstall; + + } else if (isForceInstall()) { + // if installation is forced, install anyway + info(packageMessage + "Already installed. Re-installation enforced."); + action = actionInstall; + + } else { + // If execute is 'once' then package checks are not executed. + // We just trust that the package is installed. + if (executeAttr == "once") { + dinfo(packageMessage + "Installed already."); + action = actionNone; + } else { + // In case no execution attribute is defined + // check real package state. + if (getQueryMode() == "remote") { + // Assume package is properly installed. + action = actionNone; + } else { + // Verify that package is still installed. + if (isInstalled(installedPackage)) { + action = actionNone; + } else { + // Package found in local database but checks failed. + // Maybe the user uninstalled the package manually. + dinfo(packageMessage + "Installed but checks failed. Re-Installing."); + action = actionInstall; + } + } + } + } + } + } + return action; +} + +/** + * Returns list of packages which have been manually installed. + * + * @returns List of packages manually installed in local settings database. + * Returns empty array if no package is found. + */ +function getPackagesManuallyInstalled() { + if (manuallyInstalled == null) { + // Get list of currently installed packages. + var settings = getSettings(); + + // Filter manually installed packages. + // Fetch command-nodes from <commands><command type="type" /></commands> structure. + manuallyInstalled = settings.selectNodes("package[@manualInstall=\"true\"]"); + + // Return empty array if no package is found. + if (manuallyInstalled == null) { + manuallyInstalled = new Array(); + } + } + return manuallyInstalled; +} + +/** + * Returns an array of packages which are not assigned to the current host any more. + * + * Packages which are manually installed are not included in the list of packages + * to be removed. Except if the package does not exist on server side any more. + * Therefore in case a package is removed from the server it is removed from + * clients as well even if the package was installed manually because it is to be + * assumed tha the administrator no longer wants to support this type of software. + * + * @return Array of packages which will be removed during synchronization. + */ +function getPackagesRemoved() { + dinfo("Evaluating packages to be removed."); + /** + * Get package nodes referenced within the profile (and profile + * dependencies). This includes package dependencies as well. + */ + var profilePackageNodes = getProfilePackageNodes(); + + // Get list of currently installed packages. + var installedPackages = getSettingNodes(); + + // Array to store packages to be removed. + var removablesArray = new Array(); + + // Loop over each installed package and check whether it still applies. + for (var iInstalledPkg = 0; iInstalledPkg < installedPackages.length; iInstalledPkg++) { + var installedPackageNode = installedPackages[iInstalledPkg]; + dinfo("Found installed package '" + getPackageName(installedPackageNode) + "' (" + + getPackageID(installedPackageNode) + ")."); + + // Search for the installed package in available packages. + var found = false; + + for (var j=0; j < profilePackageNodes.length; j++) { + var profilePackageNode = profilePackageNodes[j]; + if (getPackageID(installedPackageNode) == getPackageID(profilePackageNode)) { + dinfo("Package '" + getPackageName(installedPackageNode) + "' (" + + getPackageID(installedPackageNode) + ") found in profile packages."); + found = true; + break; + } + } + + // If package is no longer present, mark for remove if not installed manually. + if (!found) { + // Check if package was installed manually. + // Manually installed packages remain on the system. + var packageMessage = "Package '" + getPackageName(installedPackageNode) + "' (" + + getPackageID(installedPackageNode) + "): "; + var isManuallyInstalled = getPackageManualInstallation(installedPackageNode); + if (isManuallyInstalled == true) { + if (isZombie(installedPackageNode)) { + // Package is not in server package database any more. + dinfo("Package was manually installed but is " + + "not in package database any more. Marking package for removal."); + removablesArray.push(installedPackageNode); + } else { + dinfo("Package was manually installed and is " + + "still available in package database. Keeping package."); + } + } else { + dinfo(packageMessage + "Marked for removal."); + removablesArray.push(installedPackageNode); + } + } + } + + return removablesArray; +} + + +/** + * Returns a list of variables for the given package. + * + * @param packageNode + * The package node to get the variables from. + * @param array + * Object of type Array to which the the variables appended. + * In case null is supplied it returns a new Array object. + * @return Object of type Scripting.Dictionary which contains all key/value + * pairs from the given package including its dependencies + */ +function getPackageVariables(packageNode, array) { + dinfo("Reading variables from package '" + getPackageName(packageNode) + "'."); + array = getVariables(packageNode, array); + return array; +} + +/** + * Returns array of profile nodes which represent the profile dependencies. + * Returns empty array in case the profile does not have any dependency. + * + * @return Array of strings representing the references to dependent profiles + */ +function getProfileDependencies(profileNode) { + // output array + var dependencyNodes = new Array(); + + var dependNodes = profileNode.selectNodes("depends"); + if (dependNodes != null) { + // Get only dependencies which match the current host. + var matchingDependNodes = filterConditionalNodes(dependNodes, true); + for (var i=0; i < matchingDependNodes.length; i++) { + var dependencyId = matchingDependNodes[i].getAttribute("profile-id"); + + // convert dependency to lower case if case-sensitive mode is off + if (dependencyId != null && !isCaseSensitive()) { + dependencyId = dependencyId.toLowerCase(); + } + + // get the profile node + var dependencyNode = getProfileNode(dependencyId); + if (dependencyNode != null) { + dependencyNodes.push(dependencyNode); + } else { + error("Profile '" + dependencyId + "' referenced but not " + + "found. Ignoring profile."); + } + } + } + + return dependencyNodes; +} + +/** + * Returns the corresponding profile ID stored within the given profile XML + * node. + * + * @return String representing the ID of the supplied profile node. + */ +function getProfileID(profileNode) { + return profileNode.getAttribute("id"); +} + +/** + * Returns an array of strings which represents the profiles directly referenced + * by the applying host node. The profiles are evaluated as follows: + * <pre> + * - /profile:<profile> parameter + * - /host:<hostname> parameter matching within hosts.xml + * - profiles defined within host.xml which are assigned to the matching hosts entry + * </pre> + * + * @return array of strings representing the referenced profiles + */ +function getProfileList() { + if (applyingProfilesDirect == null) { + var profilesMatching = new Array(); + + // get arguments + var argn = getArgv().Named; + + // Set the profile from either the command line or the hosts file. + if (argn("profile") != null) { + profilesMatching.push(argn("profile")); + } else { + var hostNodes = getHostsApplying(); + for (var ihostNode=0; ihostNode < hostNodes.length; ihostNode++) { + profilesMatching = profilesMatching.concat(getHostProfiles(hostNodes[ihostNode])); + } + if (profilesMatching.length <= 0) { + throw new Error("Could not find any profile for host " + getHostname() + "."); + } + } + applyingProfilesDirect = profilesMatching; + } + return applyingProfilesDirect; +} + +/** + * Returns the corresponding profile XML node from the profile database + * (profile.xml). Returns null in case no such profile exists. + * + * @param profileID + * String representation of profile to get the node from. + */ +function getProfileNode(profileID) { + // get first node which matched the specified ID + return getProfiles().selectSingleNode("profile[@id='" + profileID +"']"); +} + +/** + * Returns an array of all profile nodes available. + * + * @return array of profile XML nodes. + */ +function getProfileNodes() { + // Retrieve packages. + var profileNodes = getProfiles().selectNodes("profile"); + + // make sure a package ID exists only once + profileNodes = uniqueAttributeNodes(profileNodes, "id"); + + // return this array + return profileNodes; +} + +/** + * Returns an array of strings which contains a list of package IDs referenced + * by the currently applied profile(s). + * + * The list will contain all referenced IDs within profile.xml which apply to + * the current profile(s) (including profile dependencies). Packages which are + * referenced but do not exist within the package database (packages.xml) are + * included as well. So be aware that in case of inconsistency between + * profiles.xml and packages.xml it might be possible that the returned list + * refers to packages not available within packages.xml. + * + * NOTE: The list does NOT contain IDs of package dependencies. Just the list of + * packages as referred in profiles.xml. Dependency information is only available + * within the concrete package nodes within packages.xml. Refer to + * getProfilePackageNodes() to get packages including dependencies. + * + * If you like to get a list of full package nodes have a look at + * getProfilePackageNodes() but note that it cannot return full nodes for + * packages referenced within profiles.xml but missing in the package database. + * + * @return array of package IDs applying to this profile (empty array if no + * packages are assigned). + */ +function getProfilePackageIDs() { + // Get array of all profiles that apply to the base profile. + // This includes depending profiles + var profileArray = getProfilesApplying(); + + // Create array to store all referenced package IDs + var packageIDs = new Array(); + + // New date object, used for install/uninstall date comparison. + var now = new Date(); + + // Add each profile's package IDs to the array. + for (var i=0; i < profileArray.length; i++) { + profileNode = profileArray[i]; + + // Load profile environment. + var previousEnv = getEnv(); + + // Array to store all variables found. + var variables = new Array(); + + // Host variables first... + variables = getHostsVariables(variables); + + // Get variables of this profile. + variables = getVariables(profileNode, variables); + + // Apply variables to environment. + for (var iVariable=0; iVariable < variables.length; iVariable++) { + var varDefinition = variables[iVariable]; + var variableKeys = varDefinition.keys().toArray(); + for (var iVarKey = 0; iVarKey < variableKeys.length; iVarKey++) { + var key = variableKeys[iVarKey]; + var value = varDefinition.Item(key); + setEnv(key, value); + } + } + + // Fetch packages from profile. + var profilePackageNodes = profileNode.selectNodes("package"); + // Filter out packages which shall not apply to this host + var packageNodes = filterConditionalNodes(profilePackageNodes, true); + + // Add all package IDs to the array and avoid duplicates + for (var j = 0; j < packageNodes.length; j++) { + // get package ID + var packageNode = packageNodes[j]; + var packageId = packageNode.getAttribute("package-id"); + // Skip package if package ID is not defined. + if (packageId == null || packageId == "") { + continue; + } + + // Use package methods for profile package node because the + // attribute is the same. + var installDate = getProfilePackageInstallDate(packageNode); + var uninstallDate = getProfilePackageUninstallDate(packageNode); + var includePackage = true; + + // Check if package + + // Check if the package should be included regarding installation + // period. + if (installDate != null || uninstallDate != null) { + // either install or uninstall date was defined + if (now >= installDate && + now <= uninstallDate) { + includePackage = true; + dinfo("Package'" + packageId + "' specified an install date range: " + + installDate + " to " + uninstallDate + + "; current time (" + now + ") is within the time frame. Including package."); + } else { + includePackage = false; + dinfo("Package '" + packageId + "' specified an install date range: " + + installDate + " to " + uninstallDate + + "; out of range, skipping package (local time: " + now + ")."); + } + } + + // Search array for pre-existing ID, we don't want duplicates. + if (includePackage) { + // Check if package shall be included case-sensitive. If not; + // convert to lower-case. + if (!isCaseSensitive()) { + packageId = packageId.toLowerCase(); + } + var alreadyAdded = false; + for (var k=0; k < packageIDs.length; k++) { + if (packageIDs[k] == packageId) { + alreadyAdded = true; + break; + } + } + if (!alreadyAdded) { + packageIDs.push(packageId); + } + } + } + // Restore environment. + loadEnv(previousEnv); + } + + return packageIDs; +} + +/** + * Returns date object reflecting installation date defined in given node + * + * @param packageNode + * the package definition node as specified within the profile + * definition + * @return date object representing installation date. Null if date is undefined. + */ +function getProfilePackageInstallDate(packageNode) { + var installDate = null; + var packageInstallDate = packageNode.getAttribute("installdate"); + if (packageInstallDate != null) { + installDate = parseISODate(packageInstallDate, false); + } + return installDate; +} + +/** + * Returns an array of package nodes that should be applied to the current + * profile. This function returns full package nodes. + * + * NOTE: Since the profile + * just contains the package IDs referenced within profiles.xml but not + * existing within the packages database (packages.xml) will not be part of the + * list. + * + * In case you like to get a list of package IDs referenced by the profile + * (regardless if the package definition exists) have a look at + * getProfilePackageIDs(). + * + * @return array of package nodes applying to the assigned profile(s) + */ +function getProfilePackageNodes() { + if (profilePackageNodes == null) { + // Create a new empty package array. + packageNodes = new Array(); + + /* + * get package IDs which apply to the profile (without dependencies, includes and chained packages) regardless + * if the package definition is available or not. + */ + var packageIDs = getProfilePackageIDs(); + + // get package definitions and all dependencies + for ( var i = 0; i < packageIDs.length; i++) { + var packageID = packageIDs[i]; + dinfo("Adding package with ID '" + packageID + "' to profile packages."); + var packageNode = getPackageNodeFromAnywhere(packageID); + + // add dependencies first + if (packageNode != null) { + getPackageReferences(packageNode, packageNodes); + if (!searchArray(packageNodes, packageNode)) { + // Add the new node to the array _after_ adding dependencies. + packageNodes.push(packageNode); + } + } + } + profilePackageNodes = packageNodes; + } + return profilePackageNodes; +} + +/** + * Returns Date representation of 'uninstalldate' attribute from the given + * package definition as specified within the profile. + * + * @param packageNode + * the package node to read the 'uninstalldate' attribute from + * @return Date object representing uninstall date of the given package. Returns + * null in case the 'uninstalldate' attribute is not set. + */ +function getProfilePackageUninstallDate(packageNode) { + var uninstallDate = null; + var packageUninstallDate = packageNode.getAttribute("uninstalldate"); + if (packageUninstallDate != null) { + uninstallDate = parseISODate(packageUninstallDate, true); + } + return uninstallDate; +} + +/** + * Returns XML node which contains all profiles (profile database). + */ +function getProfiles() { + if(profiles == null) { + var newProfiles = createProfiles(); + setProfiles(newProfiles); + } + return profiles; +} + +/** + * Returns an array of profile nodes that should be applied to the current + * profile. This includes also all profile dependencies. + * + * @return array of profiles (directly associated profiles and dependencies) + */ +function getProfilesApplying() { + dinfo("Getting profiles which apply to this node."); + if (applyingProfilesAll == null) { + // create cache entry + var profilesApplying = new Array(); + + // get list of applying profiles + var profileList = getProfileList(); + + for (var i=0; i<profileList.length; i++) { + // receive profile node + var profileNode = getProfileNode(profileList[i]); + + if (profileNode != null) { + dinfo("Applying profile: " + getProfileID(profileNode)); + + // Add the current profile's node as the first element in the + // array. + profilesApplying.push(profileNode); + + appendProfileDependencies(profilesApplying, profileNode); + } else { + error("Profile '" + profileList[i] + "' applies to this host but was not found!"); + } + } + applyingProfilesAll = profilesApplying; + } + return applyingProfilesAll; +} + +/** + * Returns the log level associated with a given profile. + * + * @return merged log levels from all applying profiles. For example if one + * profile specifies info logging and a second profile specifies error. + * The resulting log level will be info+error. Returns null if no custom + * log level is specified for this profile. + */ +function getProfilesLogLevel() { + // set initial bitmask to 0x00; + var logLevel = 0x00; + + // merge log levels + try { + var profileList = getProfileList(); + for (var i=0; i<profileList.length; i++) { + var profileId = profileList[i]; + var profileNode = getProfileNode(profileId); + if (profileNode != null) { + // add bitmask + logLevel = logLevel | profileNode.getAttribute("logLevel"); + } + } + } catch (e) { + // Unable to read profile-specific log leve. + // Maybe there is no profile found for this host. + dinfo("No profile-specific log level found."); + } + if (logLevel > 0x00) { + return logLevel; + } else { + return null; + } +} + +/** + * Returns a list of variables from the Profile. + * + * @param array + * Object of type Array to which the the variables are appended. + * In case null is supplied it returns a new Array object. + * @return Object of type Scripting.Dictionary which contains all key/value + * pairs from the given profile including its dependencies + */ +function getProfileVariables(array) { + dinfo("Reading variables from profile[s]"); + if (profilesVariables == null) { + profilesVariables = new Array(); + var profileArray = getProfilesApplying(); + // dinfo(profileArray.length + " profiles apply to this host."); + + /* + * add each profile's variables to the array in reverse order reversing the order is done in order to allow + * overwriting of variables from dependent profiles + */ + + for (var iProfiles=profileArray.length-1; iProfiles >= 0; iProfiles--) { + var profileNode = profileArray[iProfiles]; + dinfo("Reading variables from profile " + getProfileID(profileNode)); + + // Add variables from profile XML node. + profilesVariables = getVariables(profileNode, profilesVariables); + } + } + + var concatenatedVariables = profilesVariables; + if (array != null) { + concatenatedVariables = profilesVariables.concat(array); + } + + return concatenatedVariables; +} + +/** + * Returns current state of query mode. + * @returns {String} Current query mode. + */ +function getQueryMode() { + return queryMode; +} + +/** + * Returns the corresponding package XML node from the settings database + * (wpkg.xml). Returns null in case no such package is installed. + * + * @param packageID + * ID of the package to be returned + * @return returns package XML node as stored within the settings. Returns null + * if no such package exists. + */ +function getSettingNode(packageID) { + // get first node which matched the specified ID + return getSettings().selectSingleNode("package[@id='" + packageID +"']"); +} + + +/** + * Tries to read host attributes from the settings database. + * All host attributes found in the settings database will be used to override + * attributes of the local host. + */ +function getSettingHostAttributes() { + // Fetch settings. + var settings = getSettings(); + var attributes = settings.attributes; + + // Check whether attributes are defined. + if (attributes.length > 0) { + + // Reset cache for host information. + resetHostInformationCache(); + + for (var iAttribute=0; iAttribute < attributes.length; iAttribute++) { + var node = attributes.item(iAttribute); + var attribute = node.nodeName; + + var value = node.nodeValue; + switch (attribute) { + case "hostname": + setHostname(value); + break; + + case "architecture": + setArchitecture(value); + break; + + case "os": + setHostOS(value); + break; + + case "ipaddresses": + var ipList = value.split(","); + setIPAddresses(ipList); + break; + + case "domainname": + setDomainName(value); + break; + + case "groups": + var hostGroupList = value.split(","); + setHostGroups(hostGroupList); + break; + + case "lcid": + setLocale(value); + break; + + case "lcidOS": + setLocaleOS(value); + break; + + default: + break; + } + } + } +} + +/** + * Returns an array of all installed packages from the local wpkg.xml + * + * @return Array of installed packages (XML nodes) + */ +function getSettingNodes() { + // retrieve packages + var packageNodes = getSettings().selectNodes("package"); + + // make sure a package ID exists only once + // commented since the local database should not contain duplicated entries + packageNodes = uniqueAttributeNodes(packageNodes, "id"); + + // return this array + return packageNodes; +} + +/** + * Returns current path to settings file. + * + * @returns Settings file FS object. + */ +function getSettingsPath() { + if (settings_file == null || settings_file == "") { + // Will be used for file operations. + var fso = new ActiveXObject("Scripting.FileSystemObject"); + + // Evaluate path. + // Our default settings file is located in %SystemRoot%\system32. + // If settings path was not specified via command line, then evaluate it + // from the configuration file or fall back to default. + if (settings_file_path == null) { + var SystemFolder = 1; + settings_file_path = fso.GetSpecialFolder(SystemFolder); + } + settings_file = settings_file_path + "\\" + settings_file_name; + settings_file_processed = false; + } + + if (!settings_file_processed) { + // Check whether [PROFILE] epxression was used and repace it. + var profileExp = new RegExp("\\[PROFILE\\]", "g"); + if (profileExp.test(settings_file) == true) { + // This will throw an error if profile is not available yet. + var profileList = getProfileList(); + + // concatenate profile names or throw error if no names + // available + if (profileList.length > 0) { + var allProfiles = ""; + for (var i=0; i<profileList.length; i++) { + if (allProfiles == "") { + allProfiles = profileList[i]; + } else { + allProfiles += "-" + profileList[i]; + } + } + settings_file = settings_file.replace(profileExp, allProfiles); + } else { + throw new Error("Profile information not available."); + } + } + + // Check whether [HOSTNAME] expression was used and replace it. + var hostnameExp = new RegExp("\\[HOSTNAME\\]", "g"); + if (hostnameExp.test(settings_file) == true) { + settings_file = settings_file.replace(hostnameExp, getHostname()); + } + } + + return settings_file; +} + +/** + * Returns XML node which contains all settings (local package database). + */ +function getSettings() { + if(settings == null) { + var newSettings = createSettings(); + setSettings(newSettings, true); + } + return settings; +} + +/** + * Returns the checkResults node of the settings database. + * + * @returns checkResults node of currently loaded settings database. + */ +function getSettingsCheckResults() { + var currentSettings = getSettings(); + var checkResults = currentSettings.selectSingleNode("checkResults"); + if (checkResults == null) { + var xmlDoc = new ActiveXObject("Msxml2.DOMDocument.3.0"); + checkResults = xmlDoc.createElement("checkResults"); + currentSettings.appendChild(checkResults); + } + return checkResults; +} + +/** + * Adds the given check node to the checkResults list in the settings database. + * + * @param checkNode Check XML node to be inserted. + * @param result Result of the check on current node. + */ +function addSettingsCheckResult(checkNode, result) { + try { + // Clone XML node to be added to settings. + var settingsCheckNode = checkNode.cloneNode(false); + + // Check if there is already a check with the same attributes. + var previousChecks = getSettingsCheck(settingsCheckNode); + + // Fetching checkResults node from settings. + var checkResults = getSettingsCheckResults(); + + // If a check was found then remove it from the results in order to avoid + // duplicate entries. Checks might also be executed multiple times (with + // potentially different results) and only the last result should be kept. + if (previousChecks != null) { + for (var i=0; i < previousChecks.length; i++) { + dinfo("Replacing check results of previous evaluation"); + var previousCheck = previousChecks[i]; + checkResults.removeChild(previousCheck); + } + } + + // Add result attribute. + var resultValue = "false"; + if(result != null && result == true) { + resultValue = "true"; + } + settingsCheckNode.setAttribute("result", resultValue); + + // Add check results node. + checkResults.appendChild(settingsCheckNode); + + // Save modified settings. + saveSettings(false); + } catch (e) { + error("Unable to add result of check to settings: " + e.message); + } +} + +/** + * Returns result of pre-evaluated check from settings node. + * + * @param checkNode the check node for which to look in the settings + * "checkResults" nodes to verify if the check has been executed already. + * + * @returns result of already evaluated check. Returns null if the check has + * not been evaluated and saved to settings node before. + */ +function getSettingsCheckResult(checkNode) { + var result = null; + var previousChecks = getSettingsCheck(checkNode); + if (previousChecks != null) { + // Get latest check result. + var previousCheck = previousChecks[previousChecks.length-1]; + var checkResult = previousCheck.getAttribute("result"); + if (checkResult != null && checkResult == "true") { + result = true; + } else { + result = false; + } + dinfo("Found previously executed check with result '" + result + "'."); + } + return result; +} + +/** + * Takes a check as a parameter and looks for the same check in the local + * settings database. If an identical check with results is found, then this + * check is returned in an array. Returns null if no identical check could be + * found in the local settings database. + * + * @param checkNode check to seek for in local settings databse. + * + * @returns Array of matching checks; returns null if no check match. + */ +function getSettingsCheck(checkNode) { + if (checkNode == null) { + return null; + } + var result = null; + var currentSettings = getSettings(); + + var checkResults = currentSettings.selectSingleNode("checkResults"); + + if (checkResults != null) { + var attributes = checkNode.attributes; + + // Check whether attributes are defined. + if (attributes.length > 0) { + var attributesClause = ""; + var checkMessage = ""; + for (var iAttribute=0; iAttribute < attributes.length; iAttribute++) { + if (attributesClause != "") { + attributesClause += " and "; + checkMessage += ", "; + } + var node = attributes.item(iAttribute); + var attribute = node.nodeName; + var value = node.nodeValue.replace(new RegExp("\\\\", "g"), "\\\\"); + attributesClause += "@" + attribute + "=\"" + value + "\""; + checkMessage += attribute + "='" + value +"'"; + } + // Get all nodes which match the attributes. + dinfo("Searching for previously executed checks with attributes " + checkMessage); + var xPathQuery = "check[" + attributesClause + "]"; + // dinfo("Query to find previously executed check: " + xPathQuery); + var checkNodes = checkResults.selectNodes(xPathQuery); + + if (checkNodes != null) { + // Make sure the check nodes found do not contain any attributes + // not present in comparison node. + for (var iCheck=0; iCheck < checkNodes.length; iCheck++) { + var checkNode = checkNodes[iCheck]; + // dinfo("Found previously executed check: " + checkNode.xml); + var checkAttributes = checkNode.attributes; + var allAttrFound = true; + + // Iterate over all attributes of the check node found and + // verify that the attribute is found in comparison node. + // (Except the result attribute) + for (var iAttr=0; iAttr < checkAttributes.length; iAttr++) { + var attrFound = false; + var checkAttrSettings = checkAttributes.item(iAttr).nodeName; + + if (checkAttrSettings == "result") { + attrFound = true; + } else { + for (var iRefAttr=0; iRefAttr < attributes.length; iRefAttr++) { + var checkAttrRef = attributes.item(iRefAttr).nodeName; + if (checkAttrRef == checkAttrSettings) { + attrFound = true; + break; + } + } + } + + // If attribute has not been found in comparison node + // Then the node contains different checks. + if (attrFound == false) { + allAttrFound = false; + break; + } + } + + // If all attributes were found in original query node then + // the check is identical to the one in the settings DB. + if (allAttrFound) { + if (result == null) { + result = new Array(); + } + result.push(checkNode); + } + } + } + if (result != null) { + dinfo("Found " + result.length + " previously executed checks."); + } else { + dinfo("Unable to find any previously executed checks with these attributes."); + } + } + } + return result; +} + + +/** + * Returns a list of package nodes (Array object) which have been scheduled for + * removal but are not removed due to the /noremove flag. + * + * @return Array of package nodes which would have been removed during this + * session + */ +function getSkippedRemoveNodes() { + if (skippedRemoveNodes == null) { + skippedRemoveNodes = new Array(); + } + return skippedRemoveNodes; +} + +/** + * Returns a list of key/value pairs representing all variable definitions from + * the given XML node. + * + * @param XMLNode + * The XML node to get the variables from + * @param array + * Object of type Array to which the the variables are appended. + * In case null is supplied it returns a new Array object. + * Each array element is a dictionary object containing a key and + * a value. The key is the variable name and the value is the + * variable value to be assigned. + * @return Object of type Scripting.Dictionary which contains all key/value + * pairs from the given XML node. + */ +function getVariables(XMLNode, array) { + // a new empty array of variables + var variables = null; + + // make sure variables is either created or assigned + if(array == null) { + // variables = new ActiveXObject("Scripting.Dictionary"); + variables = new Array(); + } else { + variables = array; + } + + var variableNodes = XMLNode.selectNodes("variable"); + + // Perform host matching on variables. + variableNodes = filterConditionalNodes(variableNodes, true); + + for (var i=0; i < variableNodes.length; i++) { + var variableName = variableNodes[i].getAttribute("name"); + var variableValue = variableNodes[i].getAttribute("value"); + + if (variableName == null || variableValue == null) { + error("Incomplete variable specification found. " + + "Variable name is '" + variableName + "' and variable value is '" + + variableValue + "'. Ignoring variable."); + continue; + } + + // Expand environment variables in value. + // variableValue = shell.ExpandEnvironmentStrings(variableValue); + dinfo("Got variable '" + variableName + "' of value '" + variableValue + "'"); + + var variable = new ActiveXObject("Scripting.Dictionary"); + variable.Add(variableName, variableValue); + + // Add to variables list. + variables.push(variable); + } + + return variables; +} + +/** + * Installs the specified package node to the system. If an old package node is + * supplied performs an upgrade. In case the old package node is null an + * installation is performed. + * + */ +function installPackage(packageNode) { + // Initialize return value. + var success = false; + + var packageName = getPackageName(packageNode); + var packageID = getPackageID(packageNode); + var packageRev = getPackageRevision(packageNode); + var executeAttr = getPackageExecute(packageNode); + var notifyAttr = getPackageNotify(packageNode); + var rebootAttr = getPackageReboot(packageNode); + + // Get check policies. + var installCheckPolicy = getPackagePrecheckPolicyInstall(packageNode); + var upgradeCheckPolicy = getPackagePrecheckPolicyUpgrade(packageNode); + var downgradeCheckPolicy = getPackagePrecheckPolicyDowngrade(packageNode); + + dinfo("Going to install package '" + packageName + "' (" + packageID + + "), Revision " + packageRev + ", (execute flag is '" + executeAttr + + "', notify flag is '" + notifyAttr + "')."); + + // search for the package in the local settings + var installedPackage = getSettingNode(packageID); + + // Check if package is manually installed. + if (installedPackage != null) { + var isManual = getPackageManualInstallation(installedPackage); + if (isManual == true) { + // Transfer manual install flag to new package. + setPackageManualInstallation(packageNode, true); + } + } + + + // if set then the package installation will be bypassed + var bypass = false; + // type of installation "install" or "upgrade" + var typeInstall = "install"; + var typeUpgrade = "upgrade"; + var typeDowngrade = "downgrade"; + var installType = typeInstall; + + // string to print in events which identifies the package + var packageMessage = "Package '" + packageName + "' (" + packageID + ")" + + ": "; + + // check if the package has been executed already + if(searchArray(packagesInstalled, packageNode)) { + // has been installed already during this session + dinfo(packageMessage + + "Already installed once during this session.\n" + + "Checking if package is properly installed."); + bypass=true; + + // check if installation of package node was successful + if ((installedPackage != null) && + (versionCompare(getPackageRevision(installedPackage), packageRev) >= 0)) { + // package successfully installed + dinfo(packageMessage + "Verified; " + + "package successfully installed during this session."); + + success = true; + + } else { + dinfo(packageMessage + + "Installation failed during this session."); + // package installation must have been failed + + success = false; + + } + } else { + // mark package as processed + packagesInstalled.push(packageNode); + + dinfo(packageMessage + "Not yet processed during this session."); + bypass = false; + // evaluate what do do with the package + + // Get action of package to be installed. + var packageAction = getPackageInstallAction(packageNode); + + // Evaluate installation actions. + switch (packageAction) { + case "none": + // No package actions shall be performed. + dinfo(packageMessage + "Already installed."); + installType = typeUpgrade; + bypass = true; + success = true; + break; + + case "install": + // Package needs to be installed. + dinfo(packageMessage + "Prepared for installation."); + installType = typeInstall; + bypass = false; + success = false; + + // If execute attribute is set to "always" just continue with installation. + if (executeAttr == "always") { + break; + } + if (installCheckPolicy == "never") { + // Checks shall be bypassed and package is installed in any case. + dinfo(packageMessage + "Skipping checks whether package is already installed."); + } else { + // Default is to execute checks first in order to evaluate if + // package is already installed. + if (isInstalled(packageNode)) { + info(packageMessage + + "Already installed (checks succeeded). Checking dependencies and chained packages."); + + // append new node to local xml + addSettingsNode(packageNode, true); + + // install all dependencies + var depSuccess = installPackageReferences(packageNode, "dependencies"); + if (depSuccess) { + info(packageMessage + + "Package and all dependencies are already installed. Skipping."); + + } else { + info(packageMessage + + "Installed but at least one dependency is missing."); + } + + // install all chained packages + var chainedSuccess = installPackageReferences(packageNode, "chained"); + if (chainedSuccess) { + info(packageMessage + + "Package and all chained packages are already installed. Skipping."); + + } else { + info(packageMessage + + "Installed but at least one chained package is missing."); + } + + // Bypass installation as installations seems to be done already. + bypass = true; + installType = typeInstall; + + // Still set success to true since the package seems to be + // installed properly (check succeed). + success = true; + + } else { + // Package not installed yet. Perform normal installation. + info(packageMessage + + "Not installed (checks failed). Preparing installation."); + } + } + break; + + case "upgrade": + // Package needs to be upgraded. + dinfo(packageMessage + "Prepared for upgrade."); + installType = typeUpgrade; + bypass = false; + success = false; + + // If check policy is set to "always" then verify if the upgrade + // might have been performed already. + if (upgradeCheckPolicy == "always" && isInstalled(packageNode)) { + // Package marked for upgrade but upgrade is not necessary. + dinfo(packageMessage + + "Forced checks on upgrades succeeded. Package already up to date."); + + // Update local package database. + addSettingsNode(packageNode, true); + + // Package does not need to be upgraded. + bypass = true; + success = true; + } + break; + + case "downgrade": + // Package needs to be downgraded. + dinfo(packageMessage + "Prepared for downgrade."); + installType = typeDowngrade; + bypass = false; + success = false; + + // If check policy is set to "always" then verify if the downgrade + // might have been performed already. + if (downgradeCheckPolicy == "always" && isInstalled(packageNode)) { + dinfo(packageMessage + + "Forced checks on downgrade succeeded. Package already downgraded."); + + // Update local package database. + addSettingsNode(packageNode, true); + + // Package does not need to be downgraded. + bypass = true; + success = true; + } + break; + + default: + bypass = true; + error("Unknown package action: " + packageAction); + break; + } + } + + if (!bypass) { + // Store current environment. + var previousEnv = getEnv(); + + try { + // install dependencies + var depInstallSuccess = installPackageReferences(packageNode, "dependencies"); + + // abort installation in case dependencies could not be installed + if (!depInstallSuccess) { + throw new Error("Installing dependencies failed"); + } + + // print event log entry + info("Installing '" + packageName + "' (" + packageID + ")..."); + logStatus("Performing operation (" + installType + ") on '" + packageName + "' (" + packageID + ")"); + + // stores if the package needs a reboot after installation + var rebootRequired = false; + + // stores if the package needs a reboot after installing all + // packages + var rebootPostponed = false; + + // Generate the correct environment. + + // Set package specific environment. + loadPackageEnv(packageNode); + + // Select command lines to install. + var cmds; + dinfo("Install type: " + installType); + if (installType == typeUpgrade) { + // installation is an upgrade + cmds = getPackageCmdUpgrade(packageNode, null); + dinfo("Fetched " + cmds.length + " upgrade command(s)."); + } else if (installType == typeDowngrade) { + // prepare downgrade + cmds = getPackageCmdDowngrade(packageNode, null); + dinfo("Fetched " + cmds.length + " downgrade command(s)."); + }else { + // installation is default + cmds = getPackageCmdInstall(packageNode, null); + dinfo("Fetched " + cmds.length + " install command(s)."); + } + + // Get downloads from package node (if any). + var downloadNodes = getDownloads(packageNode, null); + // Append downloads from command node. + for (var iCommands = 0; iCommands < cmds.length; iCommands++) { + var commandNode = cmds[iCommands ]; + getDownloads(commandNode, downloadNodes); + } + + // Download all specified downloads. + var downloadResult = downloadAll(downloadNodes); + if (downloadResult != true) { + var failureMessage = "Failed to download all files."; + if (isQuitOnError()) { + throw new Error(failureMessage); + } else { + error(failureMessage); + } + } + + // execute each command line + for (var iCmd = 0; iCmd < cmds.length; iCmd++) { + // execute commands + var cmdNode = cmds[iCmd]; + var cmd = getCommandCmd(cmdNode); + if(cmd == null) { + error("Error: Command missing. Please fix the package. Ignoring command."); + continue; + } + var timeout = getCommandTimeout(cmdNode); + var workdir = getCommandWorkdir(cmdNode); + + // mark system as changed (command execution in progress) + setSystemChanged(); + if (notifyAttr) { + // notify user about start of installation + notifyUserStart(); + } + + var result = 0; + result = exec(cmd, timeout, workdir); + + // search for exit code + var exitAction = getCommandExitCodeAction(cmdNode, result); + + // check for special exit codes + if (exitAction != null) { + if (exitAction == "reboot") { + // This exit code forces a reboot. + info("Command in installation of " + packageName + + " returned exit code [" + result + "]. This " + + "exit code requires an immediate reboot."); + reboot(); + } else if (exitAction == "delayedReboot") { + // This exit code schedules a reboot + info("Command in installation of " + packageName + + " returned exit code [" + result + "]. This " + + "exit code schedules a reboot."); + // schedule reboot + rebootRequired = true; + // proceed with next command + continue; + } else if (exitAction == "postponedReboot") { + info("Command in installation of " + packageName + + " returned exit code [" + result + "]. This " + + "exit code schedules a postponed reboot."); + rebootPostponed = true; + setPostponedReboot(rebootPostponed); + // execute next command + continue; + } else { + // this exit code is successful + info("Command in installation of " + packageName + + " returned exit code [" + result + "]. This " + + "exit code indicates success."); + // execute next command + continue; + } + } else if(result == 0) { + // if exit code is 0, return success + // execute next command + dinfo("Command in installation of " + packageName + + " returned exit code [" + result + "]. Success."); + continue; + } else { + // command did not succeed, throw an error + throw new Error("Exit code returned non-successful value (" + + result + ") on command '" + cmd + "'"); + } + } + + // packages with checks have to pass the isInstalled() test + if (getChecks(packageNode).length > 0 && !isInstalled(packageNode)) { + // package failed for now + success = false; + + // check if a delayed reboot has been scheduled + // if reboot is scheduled it might be OK if the package check + // fails + if (rebootRequired || rebootAttr == "true") { + warning("Package processing (" + installType + ") failed for package " + + packageName + ".\nHowever the package requires a reboot to complete. Rebooting."); + // reboot system without adding to local settings yet + reboot(); + } else if (rebootPostponed || rebootAttr == "postponed") { + warning("Package processing (" + installType + ") failed for package " + + packageName + ".\nHowever the package schedules a postponed reboot."); + } else { + // package installation failed + var failMessage = "Could not process (" + installType + ") " + packageName + ".\n" + + "Failed checking after installation."; + if (isQuitOnError()) { + throw new Error(failMessage); + } else { + error(failMessage); + } + } + } else { + success = true; + // append new node to local xml + addSettingsNode(packageNode, true); + + // install chained packages + var chainedStatus = installPackageReferences(packageNode, "chained"); + if (chainedStatus) { + info(packageMessage + + "Package and all chained packages installed successfully."); + + } else { + info(packageMessage + + "Package installed but at least one chained package failed to install."); + } + + // Reboot the system if needed. + if (rebootRequired || rebootAttr == "true") { + info("Installation of " + packageName + " successful, system " + + "rebooting."); + reboot(); + } else if (rebootPostponed || rebootAttr == "postponed") { + info("Installation of " + packageName + " successful, postponed reboot scheduled."); + setPostponedReboot(true); + } else { + info("Processing (" + installType + ") of " + packageName + " successful."); + } + } + } catch (err) { + success = false; + var errorMessage = "Could not process (" + installType + ") package '" + + packageName + "' (" + packageID + "):\n" + err.description + "."; + if (isQuitOnError()) { + throw new Error(errorMessage); + } else { + error(errorMessage); + } + } finally { + // cleaning up temporary downloaded files + dinfo("Cleaning up temporary downloaded files"); + // clean downloads + downloadsClean(downloadNodes); + + // restore old environment + dinfo("Restoring previous environment."); + // restore previous environment + loadEnv(previousEnv); + } + } + return success; +} + + /** + * Installs all packages references of the selected type. Returns true in + * case all references could be installed. Returns false if at least one + * reference failed. + * + * @param packageNode + * package to install the references of (XML node) NOTE: The + * package itself is not installed. + * @param referenceType + * select "dependencies" or "chained". Defaults to + * "dependencies". + * @return true=all dependencies installed successful; false=at least one + * dependency failed + */ + function installPackageReferences(packageNode, referenceType) { + var problemDesc = ""; + var refSuccess = true; + + // get references + var type; + var references = new Array(); + switch (referenceType) { + case "chained": + type = "chained"; + references = getPackageChained(packageNode, null); + break; + + default: + type = "dependencies"; + references = getPackageDependencies(packageNode, null); + break; + } + if (references.length > 0) { + info("Installing references (" + type + ") of '" + + getPackageName(packageNode) + + "' (" + getPackageID(packageNode) + ")."); + } + for (var i=0; i < references.length; i++) { + var refPackage = getPackageNodeFromAnywhere(references[i]); + if (refPackage == null) { + problemDesc += "Package references '" + references[i] + + "' but no such package exists"; + refSuccess = false; + break; + } else { + // install this package + var success = installPackage(refPackage); + if (!success) { + problemDesc += "Installation of reference (" + type + ") package '" + + getPackageName(refPackage) + "' (" + + getPackageID(refPackage) + ") failed"; + refSuccess = false; + // skip remaining references + break; + } + } + } + if (refSuccess) { + var successMessage = "Installation of references (" + type + ") for '" + + getPackageName(packageNode) + "' (" + + getPackageID(packageNode) + ") successfully finished."; + dinfo(successMessage); + } else { + var failMessage = "Installation of references (" + type + ") for '" + + getPackageName(packageNode) + "' (" + + getPackageID(packageNode) + ") failed. " + problemDesc; + if (isQuitOnError()) { + throw new Error(failMessage); + } else { + error(failMessage); + } + } + + return refSuccess; + } + + +/** + * Installs a package by name. + * + * @param name Package ID of package to be installed. + * @param manualInstall Boolean value specifying whether the package is + * manually added. These packages are handled differently and not + * removed during synchronization. + */ +function installPackageName(name, manualInstall) { + // Check package name. + if (name == null || name == "") { + info("Package ID missing!"); + return; + } + + // Query manual installation flag. + var isManual = false; + if (manualInstall != null && manualInstall == true) { + isManual = true; + } + + // Query the package node. + var node = getPackageNode(name); + + if (node == null) { + info("Package " + name + " not found!"); + return; + } + + // Set manual installation flag. + if (isManual) { + setPackageManualInstallation(node, true); + } + + installPackage(node); +} + +/** + * Returns true if running on a 64-bit system. False if running on a 32-bit + * system. + * + * Please note that WPKG needs to be run from the local 64-bit cscript + * instance in order to be able to access 64-bit directories and registry keys. + * The 64-bit instance of cscript is located at %SystemRoot%\system32\. If + * cscript from %SystemRoot%\SysWOW64\ is used (32-bit binary) then all reads to + * %ProgramFiles% will be redirected to %ProgramFiles(x86). Hence it is not + * possible for WPKG to access the "real" %ProgramFiles% folder with the 64-bit + * binaries. The same applies for the registry. If 32-bit cscript is used all + * reads to HKLM\Software\* are redirected to HKLM\Software\Wow6432Node\*. + * + * WARNING: If cscript is invoked from a 32-bit application it is not possible + * to run the 64-bit version of cscript since the real %SystemRoot%\System32 + * directory is not visible to 32-bit applications. So Windows will invoke the + * 32-bit version even if the full path is specified! + * + * A work-around is to copy the 64-bit cmd.exe from %SystemRoot%\System32 + * manually to a temporary folder and invoke it by using + * c:\path\to\64-bit\cmd.exe /c \\path\to\wpkg.js + * + * @return true in case the system is running on a 64-bit Windows version. + * otherwise false is returned. + */ +function is64bit() { + if (x64 == null) { + x64 = false; + var architecture = getArchitecture(); + if (architecture != "x86") { + x64 = true; + } + } + return x64; +} + +/** + * Returns the current setting of apply multiple configuration. + * + * @returns Current state of apply multiple setting. + */ +function isApplyMultiple() { + return applyMultiple; +} + + +/** + * returns current state of case sensitivity flag + * + * @return true if case case sensitivity is enabled, false if it is disabled + * (boolean) + */ +function isCaseSensitive() { + return caseSensitivity; +} + +/** + * Returns current debug status. + * + * @return true if debug state is on, false if debug is off + */ +function isDebug() { + return debug; +} + +/** + * Returns current dry run status. + * + * @return true if dry run state is on, false if dry run is off + */ +function isDryRun() { + return dryrun; +} + +/** + * Returns current value of the force flag. + * + * @return true if force is enabled, false if it is disabled (boolean). + */ +function isForce() { + return force; +} + +/** + * Returns current value of the forceinstall flag. + * + * @return true if forced installation is enabled, false if it is disabled + * (boolean). + */ +function isForceInstall() { + return forceInstall; +} + +/** + * Returns if log should be appended or overwritten + * + * @return true in case log should be appended. false if it should be + * overwritten (boolean). + */ +function isLogAppend() { + return logAppend; +} + +/** + * Check if package is installed. + * + * @return returns true in case the package is installed, false otherwise + * @throws Error + * in case checks could not be evaluated + */ +function isInstalled(packageNode) { + var packageName = getPackageName(packageNode); + var result = true; + + dinfo ("Checking existence of package: " + packageName); + + // Get a list of checks to perform before installation. + var checkNodes = getChecks(packageNode); + + // When there are no check conditions, say "not installed". + if (checkNodes.length == 0) { + return false; + } + + // Save current environment. + var previousEnv = getEnv(); + + // load package specific environment + loadPackageEnv(packageNode); + + // Verify checks + result = checkAll(checkNodes); + + // restore environment + loadEnv(previousEnv); + + return result; +} + +/** + * Returns current status of /noDownload parameter + * + * @return true in case downloads shall be disabled, false if downloads are enabled + */ +function isNoDownload() { + return noDownload; +} + +/** + * Returns current status of /noforcedremove parameter + * + * @return true in case forced remove is enabled, false if it is disabled + */ +function isNoForcedRemove() { + return noForcedRemove; +} + +/** + * Returns if the nonotify flag is set or not. + * + * @return true if nonotify flag is set, false if nonotify is not set (boolean) + */ +function isNoNotify() { + return nonotify; +} + +/** + * Returns if the noreboot flag is set or not. + * + * @return true if noreboot flag is set, false if noreboot is not set (boolean) + */ +function isNoReboot() { + return noreboot; +} + +/** + * Returns the current state (boolean) of the noremove flag. + * + * @return true if noremove flag is set, false if noremove is not set (boolean) + */ +function isNoRemove() { + return noRemove; +} + +/** + * Returns if the noRunningState flag is set or not. + * + * @return true if noRunningState flag is set, false if noRunningState is not + * set (boolean) + */ +function isNoRunningState() { + return noRunningState; +} + +/** + * Returns the current state of postponed reboots. If it returns true a reboot + * is scheduled when the script exits (after completing all actions). + * + * @return current status of postponed reboot (boolean) + */ +function isPostponedReboot() { + return postponedReboot; +} + +/** + * Returns current value of the sendStatus flag + * + * @return true in case status should be sent, otherwise returns false + */ +function isSendStatus() { + return sendStatus; +} + +/** + * Returns true in case a package has been processed yet. Returns false if no + * package has been processed yet at all. + * + * @return true in case a package has been processed, false otherwise. + */ +function isSystemChanged() { + return systemChanged; +} + +/** + * Returns the current value of the upgrade-before-remove feature flag. + * + * @return true in case upgrade-before-remove should be enabled, otherwise + * returns false. + */ +function isUpgradeBeforeRemove() { + return !noUpgradeBeforeRemove; +} + +/** + * Returns current value of skip event log setting. + * + * @return true in case event log logging is enabled, false if it is disabled + * (boolean). + */ +function isSkipEventLog() { + return skipEventLog; +} + +/** + * Returns current state of event log fallback mode (logging to STDOUT instead + * of event log. + * + * @returns {Boolean} Current status of event log fallback mode. + */ +function isEventLogFallback() { + return eventLogFallback; +} + +/** + * Returns true if quiet mode is on. False otherwise. + * + * @return true if quiet flag is set, false if it is unset (boolean) + */ +function isQuiet() { + return quietMode; +} + +/** + * Returns current value of quit on error setting (see '/quitonerror' parameter) + * + * @return true in case quit on error is enabled, false if it is disabled + * (boolean). + */ +function isQuitOnError() { + return quitonerror; +} + +/** + * Checks if a package is a zombie package which means that it exists within the + * locale package database (wpkg.xml) but not on server database (packages.xml). + * + * @return true in case the package is a zombie, false otherwise + */ +function isZombie(packageNode) { + var packageName = getPackageID(packageNode); + var allPackagesArray = getPackageNodes(); + var zombie = true; + dinfo("Checking " + packageName + " zombie state."); + for (var i=0; i < allPackagesArray.length; i++) { + if (getPackageID(allPackagesArray[i]) == packageName) { + zombie = false; + break; + } + } + + // print message for zombie packages + if (zombie) { + var errorMessage = "Error while synchronizing package " + packageName + + "\nZombie found: package installed but not in packages database."; + if (isQuitOnError()) { + errorMessage += " Aborting synchronization."; + error(errorMessage); + throw new Error(errorMessage); + } else { + errorMessage += " Removing package."; + error(errorMessage); + } + } + + return zombie; +} + + +/** + * Query and print local host information (read from the host where wpkg.js is + * executed). + */ +function queryHostInformation() { + // Reset cache for host information. + resetHostInformationCache(); + + var hostInfoAttributes = getHostInformation(); + var hostInfo = hostInfoAttributes.keys().toArray(); + // Initialize output message. + var message = "Host information attributes from local host:\n"; + // Fetch all host information attributes. + for (var i=0; i < hostInfo.length; i++) { + var hostInfoKey = hostInfo[i]; + message += " " + hostInfoKey + ":"; + + // Pad label to 20 characters (minus one for the colon ":"). + var padding = 19 - hostInfoKey.length; + for (var iPadding=0; iPadding < padding; iPadding++) { + message += " "; + } + message += hostInfoAttributes.Item(hostInfoKey) + "\n"; + } + message += "\n\n"; + + // If remote query mode is active reset host information. + if (getQueryMode() == "remote") { + dinfo("Query mode: remote"); + getSettingHostAttributes(); + } + + // Print message. + alert(message); +} + + +/** + * Query and print host information fread from settings file. This requires + * that host information is available in settings file. You must have + * settingsHostInfo enabled in your configuration. + */ +function queryHostInformationFromSettings() { + // Fetch settings. + var settings = getSettings(); + var attributes = settings.attributes; + + // Initialize output message. + var message = "Host information attributes from settings database:\n"; + + // Check whether attributes are defined. + if (attributes.length > 0) { + + for (var iAttribute=0; iAttribute < attributes.length; iAttribute++) { + var node = attributes.item(iAttribute); + var attribute = node.nodeName; + var value = node.nodeValue; + + message += " " + attribute + ":"; + + // Pad label to 20 characters (minus one for the colon ":"). + var padding = 19 - attribute.length; + for (var iPadding=0; iPadding < padding; iPadding++) { + message += " "; + } + message += value + "\n"; + } + } else { + message += " No host attributes found in settings database.\n" + + "Make sure \"settingsHostInfo\" is enabled in your configuration.\n"; + } + message += "\n\n"; + + // Print message. + alert(message); +} + +/** + * Queries all available packages (from package database and local settings) and + * prints a quick summary. + */ +function queryAllPackages() { + // Retrieve packages. + var settingsNodes = getSettingNodes(); + var packagesNodes = getPackageNodes(); + + // Concatenate both lists. + var packageNodes = concatenateList(settingsNodes, packagesNodes); + packageNodes = uniqueAttributeNodes(packageNodes, "id"); + + // Create a string to append package descriptions to. + var message = "All available packages (" + packageNodes.length + "):\n"; + + // query all packages + for (var i = 0; i < packageNodes.length; i++) { + message += queryPackage(packageNodes[i], null) + "\n\n"; + } + + alert(message); +} + +/** + * Show the user a list of packages that are currently installed. + */ +function queryInstalledPackages() { + // Retrieve currently installed nodes. + var packageNodes = getSettingNodes(); + + // Create a string to append package descriptions to. + var message = "Packages currently installed:\n"; + + for (var i = 0; i < packageNodes.length; i++) { + message += queryPackage(packageNodes[i], null) + "\n\n"; + } + + alert(message); +} + +/** + * Show the user information about a specific package. + * + * @param packageNode + * The package node to print information of + * @param packageAction + * Optional argument to include the action applied to the package + * in the package information. If set to null the package action + * information is omitted from the output. + * @return string representing the package information + */ +function queryPackage(packageNode, packageAction) { + var message = ""; + if (packageNode != null) { + var settingNode = getSettingNode(getPackageID(packageNode)); + var executeAttribute = getPackageExecute(packageNode); + if (executeAttribute == null || executeAttribute == "") { + executeAttribute = "-"; + } + + message = getPackageName(packageNode) + "\n"; + message += " ID: " + getPackageID(packageNode) + "\n"; + + if (settingNode != null && packageAction != null) { + var newPackageRevision = getPackageRevision(packageNode); + var oldPackageRevision = getPackageRevision(settingNode); + if (newPackageRevision != oldPackageRevision) { + message += " Revision (new): " + getPackageRevision(packageNode) + "\n"; + message += " Revision (old): " + getPackageRevision(settingNode) + "\n"; + } else { + message += " Revision: " + getPackageRevision(packageNode) + "\n"; + } + } else { + message += " Revision: " + getPackageRevision(packageNode) + "\n"; + } + + if (packageAction != null) { + message += " Action: " + packageAction + "\n"; + } + + message += " Reboot: " + getPackageReboot(packageNode) + "\n"; + message += " Execute: " + executeAttribute + "\n"; + message += " Priority: " + getPackagePriority(packageNode) + "\n"; + if (settingNode != null) { + message += " Status: Installed\n"; + } else { + message += " Status: Not Installed\n"; + } + + } else { + message += "No such package\n"; + } + + return message; +} + +/** + * Shows the user a list of packages that are currently not installed. + */ +function queryUninstalledPackages() { + // Create a string to append package descriptions to. + var message = "Packages not installed:\n"; + + // Get list of all available packages from package database. + var packageNodes = getPackageNodes(); + + // Check for each package if it is installed. + for (var i = 0; i < packageNodes.length; i++) { + if (getSettingNode(getPackageID(packageNodes[i])) == null) { + message += queryPackage(packageNodes[i], null) + "\n\n"; + } + } + + alert(message); +} + +/** + * Query packages listed in the current profile. + * @param listInstall List packages which are pending to be installed. + * @param listUpgrade List packages which are pending to be upgraded. + * @param listDowngrade List packages which are pending to be downgraded. + * @param listRemove List packages which are pending to be removed. + * @param listUnmodified List packages which are not modified during synchronization. + */ +function queryProfilePackages(listInstall, listUpgrade, listDowngrade, listRemove, listUnmodified) { + // Message to be shown as a result of query. + var message = "Current profile packages:\n"; + + // Message which is appended when system is modified (includes execute="change" packages). + var messageOnChangeOnly = ""; + + // Flag whether the system would be modified when WPKG is run. + var systemModified = false; + + var profilePackageNodes = getProfilePackageNodes(); + // Read all packages applying to current profile. + for (var i=0; i<profilePackageNodes.length; i++) { + var packageNode = profilePackageNodes[i]; + + // Check package action which would be applied during synchronization. + var packageAction = getPackageInstallAction(packageNode); + + // "none" No action; package installed already + // "install" Installation, package is new on the host + // "upgrade" Upgrade package which already exists on the system + // New version higher than installed version + // "downgrade" Downgrade package which already exists on the system + // New version lower than installed version + var packageMessage = ""; + var changesSystem = false; + switch (packageAction) { + case "none": + if (listUnmodified) { + packageMessage += queryPackage(packageNode, "None") + "\n\n"; + } + break; + + case "install": + if (listInstall) { + packageMessage += queryPackage(packageNode, "Installation pending") + "\n\n"; + changesSystem = true; + } + break; + + case "upgrade": + if (listUpgrade) { + packageMessage += queryPackage(packageNode, "Upgrade pending") + "\n\n"; + changesSystem = true; + } + break; + + case "downgrade": + if (listDowngrade) { + packageMessage += queryPackage(packageNode, "Downgrade pending") + "\n\n"; + changesSystem = true; + } + break; + + default: + break; + } + var executeAttribute = getPackageExecute(packageNode); + if (executeAttribute == "changed") { + messageOnChangeOnly += packageMessage; + } else { + message += packageMessage; + // If the package modifies the system also packages which are + // executed on change only shall be executed. + if (changesSystem) { + systemModified = changesSystem; + } + } + } + if (systemModified) { + message += messageOnChangeOnly; + } + + // Print packages which are pending for removal. + if (listRemove) { + var removeList = getPackagesRemoved(); + for (var i=0; i<removeList.length; i++) { + var packageNode = removeList[i]; + message += queryPackage(packageNode, "Remove pending") + "\n\n"; + } + } + alert(message); +} + +/** + * Removes the specified package node from the system. This function will remove + * all packages which depend on the one to be removed prior to the package + * itself. In case the /force parameter is set the function will even remove the + * requested package if not all packages depending on it could be removed. Note + * that these packages might probably not work any more in such case. + * + * @param packageNode + * Package to be removed + * @return True in case of successful remove of package and all packages + * depending on it. False in case of failed package uninstall of failed + * uninstall of package depending on it. + */ +function removePackage(packageNode) { + var packageName = getPackageName(packageNode); + var packageID = getPackageID(packageNode); + var notifyAttr = getPackageNotify(packageNode); + + // stores if the package needs a reboot after removing + var rebootRequired = false; + // stores if a postponed reboot should be scheduled + var rebootPostponed = false; + + // Get package removal check policy. + var checkPolicy = getPackagePrecheckPolicyRemove(packageNode); + + var success = true; + var bypass = false; + + // string to print in events which identifies the package + var packageMessage = "Package '" + packageName + "' (" + packageID + ")" + + ": "; + + // check if package has been processed already + if(searchArray(packagesRemoved, packageNode)) { + // package has been removed during this session already + dinfo(packageMessage + + "Already removed once during this session.\n" + + "Checking if package has been removed properly."); + bypass=true; + + // check if installation of package node was successful + var installedPackage = getSettingNode(packageID); + if (installedPackage == null) { + // package successfully removed + dinfo(packageMessage + "Verified; " + + "package successfully removed during this session."); + + success = true; + + } else { + dinfo(packageMessage + + "Package removal failed during this session."); + // package removal must have failed + + success = false; + } + } else { + dinfo(packageMessage + "Not yet processed during this session."); + } + + // Verify whether checks shall be used to verify if the package + // has been removed already. + if (checkPolicy == "always" && !isInstalled(packageNode)) { + dinfo(packageMesseage + "Package already removed from system. Skipping removal."); + // Package already removed. Skip removal. + success = true; + + // Remove package node from local xml. + removeSettingsNode(packageNode, true); + + // set package as processed in order to prevent processing multiple + // times + packagesRemoved.push(packageNode); + + // Cancel further removal processing. + bypass = true; + } + + + if (!bypass) { + // set package as processed in order to prevent processing multiple + // times + packagesRemoved.push(packageNode); + + if (isNoRemove()) { + var message = "Package removal disabled: "; + // check if the package is still installed + if (isInstalled(packageNode)) { + // the package is installed - keep it and add to skipped nodes + dinfo(message + "Package " + packageName + " (" + packageID + + ") will not be removed."); + addSkippedRemoveNodes(packageNode); + + // package is not effectively removed + success = false; + } else { + // Get a list of checks to perform before installation. + var checkNodes = getChecks(packageNode); + + if (checkNodes.length != 0) { + // package not installed - remove from local settings file + dinfo(message + "Package " + packageName + " (" + packageID + + ") will be removed from local settings because it is not installed."); + removeSettingsNode(packageNode, true); + success = true; + } else { + // unable to detect if the package is installed properly + // assume it's still installed + dinfo(message + "Package " + packageName + " (" + packageID + + ") remains within local settings (no checks defined so WPKG " + + "cannot verify if the package is still installed properly)."); + success = false; + } + } + } else { + // remove dependent packages first + var allSuccess = removePackagesDependent(packageNode); + if (!allSuccess && !isForce()) { + // removing of at least one dependent package failed + var failedRemove = "Failed to remove package which depends on '" + + packageName + " (" + packageID + "), skipping removal.\n" + + "You might use the /force flag to force removal but " + + "remember that the package depending on this one might " + + "stop working."; + success = false; + + if (isQuitOnError()) { + throw new Error(0, failedRemove); + } else { + error(failedRemove); + } + } else { + // Save environment. + var previousEnv = getEnv(); + + try { + info("Removing " + packageName + " (" + packageID + ")..."); + + // select command lines to remove + var cmds = getPackageCmdRemove(packageNode, null); + + // set package specific environment + loadPackageEnv(packageNode); + + // Get downloads from package node (if any). + var downloadNodes = getDownloads(packageNode, null); + // Append downloads from command node. + for (var iCommand = 0; iCommand < cmds.length; iCommand++) { + var commandNode = cmds[iCommand ]; + getDownloads(commandNode, downloadNodes); + } + + // Download all specified downloads. + var downloadResult = downloadAll(downloadNodes); + if (downloadResult != true) { + var failureMessage = "Failed to download all files."; + if (isQuitOnError()) { + throw new Error(failureMessage); + } else { + error(failureMessage); + } + } + + // execute all remove commands + for (var iCommand = 0; iCommand < cmds.length; iCommand++) { + // execute commands + var cmdNode = cmds[iCommand ]; + var cmd = getCommandCmd(cmdNode); + if(cmd == null) { + error("Error: Command missing. Please fix the package. Ignoring command."); + continue; + } + var timeout = getCommandTimeout(cmdNode); + var workdir = getCommandWorkdir(cmdNode); + + // mark system as changed (command execution in + // progress) + setSystemChanged(); + if(notifyAttr) { + notifyUserStart(); + } + + var result = exec(cmd, timeout, workdir); + + dinfo("Command returned result: " + result); + + // check if there is an exit code defined + var exitAction = getCommandExitCodeAction(cmdNode, result); + + // Check for special exit codes. + if (exitAction != null) { + if (exitAction == "reboot") { + // This exit code forces a reboot. + info("Command in removal of " + packageName + " returned " + + "exit code [" + result + "]. This exit code " + + "requires an immediate reboot."); + + // Verify if the package is a zombie (not in package + // database any more). If it is a zombie, and not referenced + // in the profile then prevent endless reboots by removing + // the package from local database. + if(isZombie(packageNode)) { + // check if still referenced within the profile + var profilePackageArray = getProfilePackageNodes(); + var referenceFound = false; + for (var iPackage = 0; iPackage < profilePackageArray.length; iPackage++) { + if (packageID == getPackageID(profilePackageArray[iPackage])) { + referenceFound = true; + break; + } + } + // if package is a zombie and not referenced + // within the profile remove the settings entry + if(!referenceFound && !isNoForcedRemove()) { + removeSettingsNode(packageNode, true); + info("Removed '" + packageName + "' (" + + packageID + ") from local settings.\n" + + "Package initiated immediate reboot and is a zombie."); + } + } + + reboot(); + } else if(exitAction == "delayedReboot") { + // This exit code schedules a reboot + info("Command in removal of " + packageName + + " returned exit code [" + result + "]. This " + + "exit code schedules a reboot."); + // schedule reboot + rebootRequired = true; + // execute next command + continue; + } else if(exitAction == "postponedReboot") { + info("Command in removal of " + packageName + + " returned exit code [" + result + "]. This " + + "exit code schedules a postponed reboot."); + rebootPostponed = true; + setPostponedReboot(rebootPostponed); + // execute next command + continue; + } else { + // This exit code is successful. + info("Command in removal of " + packageName + " returned " + + " exit code [" + result + "]. This exit code " + + "indicates success."); + continue; + } + } else if(result == 0) { + // if exit code is 0, return success + // execute next command + dinfo("Command in removal of " + packageName + + " returned exit code [" + result + "]. Success."); + continue; + } else { + // command did not succeed, log error + var failedCmd = "Exit code returned non-successful value: " + + result + "\nPackage: " + packageName + ".\nCommand:\n" + cmd; + // error occurred during remove + success = false; + + if (isQuitOnError()) { + throw new Error(0, failedCmd); + } else { + error(failedCmd); + } + } + } + } catch (err) { + success = false; + var errorMessage = "Could not process (remove) package '" + + packageName + "' (" + packageID + "):\n" + err.description + "."; + if (isQuitOnError()) { + throw new Error(errorMessage); + } else { + error(errorMessage); + } + } finally { + // restore old environment + dinfo("Restoring previous environment."); + + // restore previous environment + loadEnv(previousEnv); + } + } + + // read reboot attribute + var rebootAttr = getPackageReboot(packageNode); + + // Use package checks to prove if package has been removed. + // Zombies are removed in any case (even if uninstall failed) except + // if the + // "/noforcedremove" parameter was set + if (!isInstalled(packageNode)) { + // Remove package node from local xml. + removeSettingsNode(packageNode, true); + + if (rebootRequired || rebootAttr == "true") { + info("Removal of " + packageName + " successful, system " + + "rebooting."); + reboot(); + } else if (rebootPostponed || rebootAttr == "postponed") { + info("Removal of " + packageName + " successful, postponed reboot scheduled."); + } else { + info("Removal of " + packageName + " successful."); + } + } else { + // Check if package is a zombie. + if(isZombie(packageNode)) { + // Check if still referenced within the profile. + var packageArray = getProfilePackageNodes(); + var referenced = false; + for (var i=0; i < packageArray.length; i++) { + if (packageID == getPackageID(packageArray[i])) { + referenced = true; + break; + } + } + // If package is a zombie and not referenced within the profile + // remove the settings entry. + if(!referenced && !isNoForcedRemove()) { + removeSettingsNode(packageNode, true); + warning("Errors occurred while removing '" + packageName + "' (" + + packageID + ").\nPackage has been removed anyway because it was a zombie " + + "and not referenced within the profile."); + } + } else if (rebootRequired || rebootAttr == "true") { + warning("Package processing (remove) failed for package " + + packageName + ".\nHowever the package requires a reboot to complete. Rebooting."); + // reboot system without adding to local settings yet + reboot(); + } else if (rebootPostponed || rebootAttr == "postponed") { + warning("Package processing (remove) failed for package " + + packageName + ".\nHowever the package schedules a postponed reboot."); + } else { + // package installation failed + success = false; + message = "Could not process (remove) " + packageName + ".\n" + + "Package still installed."; + if (isQuitOnError()) { + throw new Error(message); + } else { + error(message); + } + } + } + } + } + + // return status + return success; +} + +/** + * Removes a package by name. + * + * @param name + * name of the package to be removed (package ID). + * @return True in case of successful remove of package and all packages + * depending on it. False in case of failed package uninstall of failed + * uninstall of package depending on it. + */ +function removePackageName(name) { + // Query the package node. + var node = getSettingNode(name); + + // return code + var success = false; + + dinfo("Removing package '" + name + "'."); + + if (node == null) { + + // check if the package has been removed during this session + var alreadyRemoved = false; + for (var iRemovedPkg = 0; iRemovedPkg < packagesRemoved.length; iRemovedPkg++) { + var removedPackage = packagesRemoved[iRemovedPkg]; + if (name == getPackageID(removedPackage)) { + alreadyRemoved = true; + break; + } + } + if (alreadyRemoved) { + dinfo("Package '" + name + "' already removed during this session."); + success = true; + } else { + info("Package '" + name + "' currently not installed."); + success = false; + } + } else { + success = removePackage(node); + } + return success; +} + +/** + * Removes all packages which depends on the given package. Returns true in case + * all packages could be removed. Returns false if at least one dependent + * package failed to remove. + * + * @param packageNode + * package to install the dependencies of (XML node) NOTE: The + * package itself is not installed. + * @return true=all dependencies installed successful; false=at least one + * dependency failed + */ +function removePackagesDependent(packageNode) { + var packageID = getPackageID(packageNode); + var packageName = getPackageName(packageNode); + + var problemDesc = ""; + // search for all packages which depend on the one to be removed + var dependencies = new Array(); + var installedPackages = getSettingNodes(); + for (var iInstPkg = 0; iInstPkg<installedPackages.length; iInstPkg++) { + // get dependencies of this package + var pkgDeps = getPackageDependencies(installedPackages[iInstPkg]); + for (var j=0; j<pkgDeps.length; j++) { + if (pkgDeps[j] == packageID) { + dependencies.push(installedPackages[iInstPkg]); + break; + } + } + } + if (dependencies.length > 0) { + info("Removing packages depending on '" + packageName + + "' (" + packageID + ")."); + } + var depSuccess = true; + for (var iDependencies = 0; iDependencies < dependencies.length; iDependencies++) { + var dependingPackage = dependencies[iDependencies]; + // install this package + var success = removePackage(dependingPackage); + if (!success) { + problemDesc += "Removal of depending package '" + + getPackageName(dependingPackage) + "' (" + + getPackageID(dependingPackage) + ") failed"; + depSuccess = false; + // skip remaining dependencies + break; + } + } + + if (depSuccess) { + dinfo("Removal of depending packages for '" + + packageName + "' (" + + packageID + ") successfully finished."); + } else { + var failMessage = "Removal of depending packages for '" + + packageName + "' (" + + packageID + ") failed. " + problemDesc; + if (isQuitOnError()) { + throw new Error(failMessage); + } else { + error(failMessage); + } + } + + return depSuccess; +} + +/** + * Removes a package node from the settings XML node + * + * @param packageNode + * The package node to be removed from settings. + * @param saveImmediately + * Set to true in order to save settings immediately after removing. + * Settings will not be saved immediately if value is false. + * @return Returns true in case of success, returns false if no node could be + * removed + */ +function removeSettingsNode(packageNode, saveImmediately) { + // make sure the settings node is selected + var packageID = getPackageID(packageNode); + dinfo("Removing package id '" + packageID + "' from settings."); + var settingsNode = getSettingNode(packageID); + var success = false; + if(settingsNode != null) { + success = removeNode(getSettings(), settingsNode); + } + // save settings if remove was successful + if (success && saveImmediately) { + saveSettings(true); + } + return success; +} + +/** + * Erases host information cache to enforce re-reading of host information when + * getter methods like getHostInformation(), getHostOS(), getLocale() etc are + * executed. + */ +function resetHostInformationCache() { + // Empty caches. + hostName = null; + hostOs = null; + domainName = null; + ipAddresses = null; + hostGroups = null; + hostArchitecture = null; + hostAttributes = null; +} + + +/** + * Sets state of multiple profile assignment. + * + * @param newState + * new debug state + */ +function setApplyMultiple(newState) { + applyMultiple = newState; +} + +/** + * Set new architecture for this host. + * @param newArchitecture Architecture to used for this host. + */ +function setArchitecture(newArchitecture) { + hostArchitecture = newArchitecture; +} + +/** + * Sets new status of the case-sensitive flag + * + * @param newSensitivity + * true to enable case sensitivity, false to disable it (boolean) + */ +function setCaseSensitivity(newSensitivity) { + caseSensitivity = newSensitivity; +} + +/** + * Sets debug value to the given state. + * + * @param newState + * new debug state + */ +function setDebug(newState) { + debug = newState; +} + +/** + * Sets domain name used by the script. + * + * @param newDomainName + * new domain name + */ +function setDomainName(newDomainName) { + domainName = newDomainName; +} + +/** + * Sets dry run value to the given state. + * + * @param newState + * new dry run state + */ +function setDryRun(newState) { + dryrun = newState; +} + +/** + * Sets a new value for the forceinstall flag. + * + * @param newState + * new value for the forceinstall flag (boolean) + */ +function setForce(newState) { + force = newState; +} + +/** + * Sets a new value for the forceinstall flag. + * + * @param newState + * new value for the forceinstall flag (boolean) + */ +function setForceInstall(newState) { + forceInstall = newState; +} + +/** + * Set new group names the host belongs to. + * + * @param newGroupNames + * Array of group names the host belongs to. + */ +function setHostGroups(newGroupNames) { + hostGroups = newGroupNames; +} + +/** + * Set a new host name which will be used by the script. This is useful for + * debugging purposes. + * + * @param newHostname + * host name to be used + */ +function setHostname(newHostname) { + hostName = newHostname; +} + +/** + * Set new host OS variable overwriting automatically-detected value. + * + * @param newHostOS + * host OS name + */ +function setHostOS(newHostOS) { + hostOs = newHostOS; +} + + +/** + * Sets a new profile-id attribute to the given host XML node + * + * @param hostNode + * the host XML node to modify + * @param profileID + * the new profile ID to be written to this node + */ +function setHostProfile(hostNode, profileID) { + hostNode.setAttribute("profile-id", profileID); +} + +/** + * Set a new hosts node + * + * @param newHosts + * the new hosts XML node to be used fro now on + */ +function setHosts(newHosts) { + hosts = newHosts; +} + +/** + * Set a new IP address list array. + * + * @param newIPAdresses + * Array of IP addresses to be used by script. + */ +function setIPAddresses(newIPAdresses) { + ipAddresses = newIPAdresses; +} + +/** + * Set new value for log file pattern + * + * @param pattern + * new pattern to be used + * @return returns the pattern with expanded environment variables + */ +function setLogfilePattern(pattern) { + var wshShell = new ActiveXObject("WScript.Shell"); + logfilePattern = wshShell.ExpandEnvironmentStrings(pattern); + return logfilePattern; +} + +/** + * Sets new value for the no-download flag. + * + * @param newState + * new value for the no-download flag (boolean). + * If set to true then all downloads are disabled (just skipped). + */ +function setNoDownload(newState) { + noDownload = newState; +} + +/** + * Sets new value for the noforcedremove flag. + * + * @param newState + * new value for the noforcedremove flag (boolean). + */ +function setNoForcedRemove(newState) { + noForcedRemove = newState; +} + +/** + * Sets new state for the noreboot flag. + * + * @param newState + * new state of the noreboot flag (boolean) + */ +function setNoReboot(newState) { + noreboot = newState; +} + +/** + * Sets new state for the noremove flag. + * + * @param newState + * new state of the noremove flag (boolean) + */ +function setNoRemove(newState) { + noRemove = newState; +} + +/** + * Sets new state for the noRunningState flag. + * + * @param newState + * new state of the noreboot flag (boolean) + */ +function setNoRunningState(newState) { + noRunningState = newState; +} + +/** + * Sets a new package id-attribute to the given host XML node + * + * @param packageNode + * the package XML node to modify + * @param packageID + * the new package ID to be written to this node + */ +function setPackageID(packageNode, packageID) { + packageNode.setAttribute("id", packageID); +} + +/** + * Set a new value for the manual installation flag of the given package. + * Manual installations are flagged only for packages which are installed via + * command line directly and not via synchronization. + * + * @param packageNode package to be modified. + * @param manualInstall {Boolean} new value of package installation flag. + */ +function setPackageManualInstallation(packageNode, manualInstall) { + if (packageNode == null) { + error("No package node specified. Cannot set manual installation flag."); + return; + } + if (manualInstall == null) { + error("No manual installation flag value specified."); + return; + } + if (manualInstall == true) { + packageNode.setAttribute("manualInstall", "true"); + } +} + +/** + * Set a new packages node. + * + * @param newPackages + * the new packages XML node to be used fro now on + */ +function setPackages(newPackages) { + packages = newPackages; + // iterate through all packages and set the package id to lower case + // this allows XPath search for lowercase value later on (case-insensitive) + if (packages != null && !isCaseSensitive()) { + var packageNodes = getPackageNodes(); + for (var i=0; i<packageNodes.length; i++) { + var packageNode = packageNodes[i]; + setPackageID(packageNode, getPackageID(packageNode).toLowerCase()); + } + } +} + +/** + * Sets the status of postponed reboot. A postponed reboot schedules a system + * reboot after finishing all actions (right before the script exits). + * + * @param newState + * new state of postponed reboot + */ +function setPostponedReboot(newState) { + postponedReboot = newState; +} + +/** + * Sets a new profile id-attribute to the given profile XML node + * + * @param profileNode + * the profile XML node to modify + * @param profileID + * the new profile ID to be written to this node + */ +function setProfileID(profileNode, profileID) { + profileNode.setAttribute("id", profileID); +} + +/** + * Set a new profiles node + * + * @param newProfiles + * the new profiles XML node to be used fro now on + */ +function setProfiles(newProfiles) { + profiles = newProfiles; + // iterate through all profiles and set the profile id to lower case + // this allows XPath search for lowercase value later on (case-insensitive) + if (profiles != null && !isCaseSensitive()) { + var profileNodes = getProfileNodes(); + for (var i=0; i<profileNodes.length; i++) { + var profileNode = profileNodes[i]; + setProfileID(profileNode, getProfileID(profileNode).toLowerCase()); + } + } +} + +/** + * Sets query mode to new state. Allowed states are "remote" and "local". + * + * @param newState query mode value to be set. + */ +function setQueryMode(newState) { + if (newState != null && (newState == "remote" || newState == "local")) { + queryMode = newState; + } +} + +/** + * Sets new state of the quiet flag + * + * @param newState + * new status of quiet flag (boolean) + */ +function setQuiet(newState) { + quietMode = newState; +} + +/** + * Sets a new value for the quit on error flag. + * + * @param newState + * new value for the quit on error flag (boolean). + */ +function setQuitOnError(newState) { + quitonerror = newState; +} + +/** + * Sets new value for the reboot command (rebootCmd). + * + * @param newCommand + */ +function setRebootCmd(newCommand) { + var wshShell = new ActiveXObject("WScript.Shell"); + rebootCmd = wshShell.ExpandEnvironmentStrings(newCommand); +} + +/** + * Set state of application so other applications can see that it is running by + * reading from the registry. + * + * @param statename + * String which is written to the registry as a value of the + * "running" key + */ +function setRunningState(statename) { + var WshShell = new ActiveXObject("WScript.Shell"); + var val; + + try { + val = WshShell.RegWrite(sRegWPKG_Running, statename); + } catch (e) { + val = null; + } + + return val; +} + +/** + * Sets new value for the sendStatus flag which defines if status messages are + * sent to the calling program using STDOUT + * + * @param newStatus + * new value for the sendStatus flag (boolean) + */ +function setSendStatus(newStatus) { + sendStatus = newStatus; +} + +/** + * Set a new settings node + * + * @param newSettings + * the new settings XML node to be used fro now on + */ +function setSettings(newSettings, saveImmediately) { + settings = newSettings; + // iterate through all packages and set the package id to lower case + // this allows XPath search for lowercase value later on (case-insensitive) + if (settings != null && !isCaseSensitive()) { + var packageNodes = getSettingNodes(); + for (var i=0; i<packageNodes.length; i++) { + var packageNode = packageNodes[i]; + setPackageID(packageNode, getPackageID(packageNode).toLowerCase()); + } + } + // save new settings + if(saveImmediately) { + saveSettings(true); + } +} + +/** + * Set path to local settings file (locak package database). + * The path might contain environment variables as well as the following + * expressions: + * [HOSTNAME] Replaced by the executing hostname. + * [PROFILE] Replaced by the concatenated list of profiles applied. + * @param path path to settings XML file. + */ +function setSettingsPath(path) { + if (path == null || path == "") { + error("Path to settings is required"); + return; + } + + var wshObject = new ActiveXObject("WScript.Shell"); + var expandedSettingsPath = wshObject.ExpandEnvironmentStrings(path); + + // Set global variable holding settings file path. + settings_file = expandedSettingsPath; +} + + +/** + * Sets the system changed attribute to true. Call this method to make WPKG + * aware that a system change has been done. + * + * @return returns current system change status (always true after this method + * has been called + */ +function setSystemChanged() { + systemChanged = true; + return systemChanged; +} + +/** + * Set new value for the boolean flag to disable/enable event log logging. + * + * @param newValue + * value to be used for the skip event log flag from now on. + */ +function setSkipEventLog(newValue) { + skipEventLog = newValue; +} + +/** + * Set event log fallback to new value (enabled/disabled). + * + * @param newValue + * value to be used for the event log fallback flag. + */ +function setEventLogFallback(newValue) { + eventLogFallback = newValue; +} + +/** + * Sorts package nodes by priority flag. + * + * @param packageNodes + * JScript Array containing package node entries + * @param sortBy + * select the field to sort on. Supported Values are "PRIORITY" and + * "NAME" + * @param sortOrder + * order in which the elements are sorted (integer) valid values:<br>1 + * sort ascending (default)<br>2 sort descending + * + * @return new Array containing the same package nodes in sorted order (sorted + * by priority) + */ +function sortPackageNodes(packageNodes, sortBy, sortOrder) { + // create array to do the sorting on + var sortedPackages = new Array(); + for (var iPkgNodes = 0; iPkgNodes < packageNodes.length; iPkgNodes++) { + sortedPackages.push(packageNodes[iPkgNodes]); + } + // Classic bubble-sort algorithm on selected attribute + for (var iSortedPkg = 0; iSortedPkg < sortedPackages.length - 1; iSortedPkg++) { + for (var j=0; j < sortedPackages.length - 1 - iSortedPkg; j++) { + var prio1; + var prio2; + var priVal1 = null; + var priVal2 = null; + + switch(sortBy) { + case "NAME": + priVal1 = getPackageName(sortedPackages[j]); + priVal2 = getPackageName(sortedPackages[j + 1]); + break; + default: + priVal1 = parseInt(getPackagePriority(sortedPackages[j])); + priVal2 = parseInt(getPackagePriority(sortedPackages[j + 1])); + break; + } + // If a priority is not set, we assume 0. + + if (priVal1 == null) { + prio1 = 0; + } else { + prio1 = priVal1; + } + + if (priVal2 == null) { + prio2 = 0; + } else { + prio2 = priVal2; + } + + var swapElements = false; + switch (sortOrder) { + case 2: + if (prio1 < prio2) { + swapElements = true; + } + break; + default: + if (prio1 > prio2) { + swapElements = true; + } + break; + } + // If the priority of the first one in the list exceeds the second, + // swap the packages. + if (swapElements) { + var tmp = sortedPackages[j]; + sortedPackages[j] = sortedPackages[j + 1]; + sortedPackages[j + 1] = tmp; + } + } + } + return sortedPackages; +} + +/** + * Sorts the settings file by package name. Returns sorted package XML node. + */ +function sortSettings() { + // sort current setting nodes + var sortedPackages = sortPackageNodes(getSettingNodes(), "NAME", 1); + + // Get setting checks. + var settingsChecks = getSettingsCheckResults(); + + // create new (empty) settings node + var sortedSettings = createSettings(); + sortedSettings.appendChild(settingsChecks); + + // use this settings node + setSettings(sortedSettings, false); + + // fill new settings node with sorted packages (same order) + for (var i=0; i<sortedPackages.length; i++) { + addSettingsNode(sortedPackages[i], false); + } +} + +/** + * Synchronizes the current package state to that of the specified profile, + * adding, removing or upgrading packages. + */ +function synchronizeProfile() { + // send message to client + logStatus("Starting software synchronization"); + + /** + * Get package nodes referenced within the profile (and profile + * dependencies). This includes package dependencies as well. + */ + var profilePackageNodes = getProfilePackageNodes(); + dinfo("Synchronizing. Number of packages referenced by profile: " + profilePackageNodes.length + "."); + + var localPackages = getPackagesManuallyInstalled(); + if (localPackages.length > 0) { + dinfo("Synchronizing. Locally installed packages: " + localPackages.length + "."); + for(var i=0; i<localPackages.length; i++) { + // Fetch latest package node to schedule installation/upgrade. + var localPackage = localPackages[i]; + var latestVersion = getPackageNode(getPackageID(localPackage)); + if (latestVersion != null) { + profilePackageNodes.push(latestVersion); + } + } + } + + // Get list of packages scheduled for removal. + // This excludes manually installed packages except if they do not exist. + var removablesArray = getPackagesRemoved(); + + dinfo("Number of packages to remove: " + removablesArray.length); + logStatus("Number of packages to be removed: " + removablesArray.length); + /* + * upgrade packages to be removed to latest version first. This allows system administrators to provide a fixed + * version of the package which allows clean uninstall. + * + * This was done to allow fixing a broken uninstall-procedure on server side. Without upgrading to the latest + * version here it might happen that the package cannot be removed without the possibility to fix it. If you remove + * the package completely from the package database it will be forced to be removed from the local settings file + * even if uninstall fails. + * + * NOTE: This is not done within the same loop as the removal (see below) in order to prevent re-installing already + * removed dependencies. + */ + // sort packages to upgrade the ones with highest priority first + if (isUpgradeBeforeRemove()) { + var sortedUpgradeList = sortPackageNodes(removablesArray, "PRIORITY", 2); + for (var iSortedPkg = 0; iSortedPkg < sortedUpgradeList.length; iSortedPkg++) { + var upgradePkgNode = sortedUpgradeList[iSortedPkg]; + // upgrade package if package is available on server database + var serverPackage = getPackageNode(getPackageID(upgradePkgNode)); + if (serverPackage != null) { + logStatus("Remove: Checking status of '" + getPackageName(serverPackage) + + "' (" + (iSortedPkg+1) + "/" + sortedUpgradeList.length + ")"); + // start upgrade first + installPackage(serverPackage); + } + } + } + + // Remove packages which do not exist in package database or do not apply + // to the profile + // reverse-sort packages to remove the one with lowest priority first + var sortedRemovablesArray = sortPackageNodes(removablesArray, "PRIORITY", 1); + for (var iRemovables = 0; iRemovables < sortedRemovablesArray.length; iRemovables++) { + var removePkgNode = sortedRemovablesArray[iRemovables]; + // remove package from system + // the settings node might have been changed during update before + // reload it. + logStatus("Remove: Removing package '" + getPackageName(removePkgNode) + + "' (" + (iRemovables+1) + "/" + sortedRemovablesArray.length + ")"); + // removePackage(getSettingNode(getPackageID(removePkgNode))); + removePackageName(getPackageID(removePkgNode)); + } + + // create array to do the sorting on + var sortedPackages = sortPackageNodes(profilePackageNodes, "PRIORITY", 2); + + /* + * Move packages with execute=changed attribute to independent array in order to allow them to be executed after the + * other packages. + */ + var packagesToInstall = new Array(); + var packagesAwaitingChange = new Array(); + // NOTE: This should not change the sort order of the packages. + for (var iPkg = 0; iPkg < sortedPackages.length; iPkg++) { + var packageNode = sortedPackages[iPkg]; + var executeAttribute = getPackageExecute(packageNode); + if (executeAttribute == "changed") { + packagesAwaitingChange.push(packageNode); + } else { + packagesToInstall.push(packageNode); + } + } + + /* + * Loop over each available package and install it. No check required if package is already installed or not. The + * install method will check by itself if the package needs to be installed/upgraded or no action is needed. + */ + for (var iInstallPkg=0; iInstallPkg < packagesToInstall.length; iInstallPkg++) { + // install/upgrade package + logStatus("Install: Verifying package '" + getPackageName(packagesToInstall[iInstallPkg]) + + "' (" + (iInstallPkg + 1) + "/" + packagesToInstall.length + ")"); + installPackage(packagesToInstall[iInstallPkg]); + } + + /* + * Install packages which might have been postponed because no other change has been done to the system. + */ + for(var iChangeAwait = 0; iChangeAwait < packagesAwaitingChange.length; iChangeAwait++) { + // try applying this packages again now. + if (isSystemChanged()) { + logStatus("Install: Verifying package (system changed) '" + getPackageName(packagesAwaitingChange[iChangeAwait]) + + "' (" + (packagesToInstall.length + iChangeAwait + 1) + "/" + sortedPackages.length + ")"); + + installPackage(packagesAwaitingChange[iChangeAwait]); + } else { + logStatus("Install: No system change, skipping '" + getPackageName(packagesAwaitingChange[iChangeAwait]) + + "' (" + (packagesToInstall.length + iChangeAwait + 1) + "/" + sortedPackages.length + ")"); + } + } + + logStatus("Finished software synchronization"); + + // If we had previously warned the user about an impending installation, let + // them know that all action is complete. + notifyUserStop(); +} + +/******************************************************************************* + * XML handling + * **************************************************************************** + */ + +/** + * Saves the root element to the specified XML file. + */ +function saveXml(root, path) { + if (isDryRun()) { + path += ".dryrun"; + } + dinfo("Saving XML : " + path); + var xmlDoc = new ActiveXObject("Msxml2.DOMDocument.3.0"); + var processing = xmlDoc.createProcessingInstruction("xml", "version='1.0' encoding='UTF-8'"); + xmlDoc.insertBefore(processing, xmlDoc.firstChild); + xmlDoc.appendChild(root); + if (xmlDoc.save(path)) { + throw new Error(0, "Could not save XML document to " + path); + } +} + +/** + * Creates a new root element of the specified name. + * + * @param root + * Root element name to be created. Might be prefixed by a namespace. + * e.g. "packages" or "packages:packages" + * @param rootNS + * Optionally specify a namespace. + * e.g. "http://www.wpkg.org/packages" + */ +function createXml(root, rootNS) { + // Verify root node name. + if (root == null) { + return null; + } + // Evaluate namespace. + var nameSpace = rootNS; + if (nameSpace == null) { + nameSpace = ""; + } + + // Create XML document. + var xmlDoc = new ActiveXObject("Msxml2.DOMDocument.3.0"); + xmlDoc.async = false; + + // Create root node. + var rootNode = xmlDoc.createNode(1, root, nameSpace); + + return rootNode; +} + +/** + * Loads XML from the given path and/or directory. Returns null in case XML + * could not be loaded. + * + * @param xmlPath + * optional path to XML file to be loaded, specify null if you do not + * want to load from XML file + * @param xmlDirectory + * optional path to directory where XML file(s) might can be found. + * Specify null if you do not want to read from a directory. + * @param type + * optional, type of XML to be loaded. If type is specified some + * validation on XML structure is done like the verification of root + * and child node names. In addition correct namespace is inserted + * into generated XML document. + * Supported types: + * - settings (local WPKG database XML) + * - hosts (hosts database) + * - profiles (profile database) + * - packages (package database) + * - config (configuration file) + * @return XML root node containing all nodes from the specified files. + */ +function loadXml(xmlPath, xmlDirectory, type) { + // Initialize return variable. + var xmlDocument = new ActiveXObject("Msxml2.DOMDocument.3.0"); + + // Validation variables. + // Name of XML root node. If null it will not be verified. + var rootNodeName = null; + + // Namespace of XML if it is to be created. + var xmlNamespace = null; + + // Name of child elements to be read if multiple files are read from directory. + var childElementNodeName = null; + + // Evaluate type. + var xmlType = type; + if (xmlType != null) { + switch (xmlType) { + case "settings": + rootNodeName = "wpkg"; + // childElementNodeName = "package"; + // Multiple child nodes (packages and check results). + childElementNodeName = null; + xmlNamespace = namespaceSettings; + break; + + case "hosts": + rootNodeName = "wpkg"; + childElementNodeName = "host"; + xmlNamespace = namespaceHosts; + break; + + case "profiles": + rootNodeName = "profiles"; + childElementNodeName = "profile"; + xmlNamespace = namespaceProfiles; + break; + + case "packages": + rootNodeName = "packages"; + childElementNodeName = "package"; + xmlNamespace = namespacePackages; + break; + + case "config": + rootNodeName = "config"; + // Do not verify child nodes as there are multiple: + // - param + // - languages + childElementNodeName = null; + xmlNamespace = namespaceConfig; + break; + + default: + break; + } + } + + // create variable to return + // var rootNodeName = "pkg:packages"; + // var rootNodeName = "packages"; + // source.setProperty("SelectionNamespaces", "xmlns:packages='http://www.wpkg.org/packages'"); + var filePaths = new Array(); + + // Read data from specified XML directory (load all XML from folder). + if (xmlDirectory != null) { + dinfo("Trying to read XML files from directory: " + xmlDirectory); + // check if directory exists + var fso = new ActiveXObject("Scripting.FileSystemObject"); + if( fso.FolderExists( xmlDirectory ) ) { + var folder = fso.GetFolder(xmlDirectory); + var e = new Enumerator(folder.files); + + // read all files + for( e.moveFirst(); ! e.atEnd(); e.moveNext() ) { + var file = e.item(); + var filePath = xmlDirectory.replace( /\\/g, "/" ) + "/" + file.name; + + // search for last "." + var dotLocation = file.name.toString().lastIndexOf('.'); + var extension = file.name.toString().substr(dotLocation + 1, file.name.toString().length); + + // make sure to read only .xml files + if(extension == "xml") { + // Add file to list of files to be read. + filePaths.push(filePath); + } + } + // Sort files by name (ASCII order). + filePaths.sort(null); + } else { + dinfo("Specified XML directory does not exist: " + xmlDirectory); + } + } + + // Add XML single-file path to the list of files to be read. + if (xmlPath != null) { + filePaths.push(xmlPath.replace( /\\/g, "/" )); + } + + for( var i=0; i < filePaths.length; i++) { + var filePath = filePaths[i]; + dinfo("Reading XML file: " + filePath); + + // Read XML file from file system. + var xsl = new ActiveXObject("Msxml2.DOMDocument.3.0"); + xsl.async = false; + xsl.validateOnParse = false; + /* + var str = "<?xml version=\"1.0\"?>\r\n"; + str += "<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" xmlns:wpkg=\"" + xmlNamespace + "\" version=\"1.0\">\r\n"; + str += " <xsl:output encoding=\"utf-8\" indent=\"yes\" method=\"xml\" version=\"1.0\"/>\r\n"; + str += " <xsl:template match=\"/\">\r\n"; + str += " <" + "wpkg:" + rootNodeName + ">\r\n"; + str += " <xsl:copy-of select=\"document('" + + filePath + + "')/wpkg:" + rootNodeName + "/child::*\"/>\r\n"; + str += " <xsl:copy-of select=\"document('" + + filePath + + "')/" + rootNodeName + "/child::*\"/>\r\n"; + str += " </" + "wpkg:" + rootNodeName + ">\r\n"; + str += " </xsl:template>\r\n"; + str += "</xsl:stylesheet>\r\n"; + + xsl.loadXML(str); + */ + xsl.load(filePath); + // dinfo("XSLT: " + xsl.xml); + + // Apply transforms. + var source = new ActiveXObject("Msxml2.DOMDocument.3.0"); + source.async = false; + source.validateOnParse = false; + try { + source.loadXML(source.transformNode(xsl)); + } catch (e) { + var errorMessage = "Error parsing xml '" + filePath + "': " + e.description; + if (isQuitOnError()) { + throw new Error(errorMessage); + } else { + error(errorMessage); + } + } + + // check if there was an error when loading XML + if (source.parseError.errorCode != 0) { + var loadError = source.parseError; + var errorMessage = "Error parsing xml '" + filePath + "': " + loadError.reason + "\n" + + "File " + filePath + "\n" + + "Line " + loadError.line + "\n" + + "Linepos " + loadError.linepos + "\n" + + "Filepos " + loadError.filepos + "\n" + + "srcText " + loadError.srcText + "\n"; + if (isQuitOnError()) { + throw new Error(errorMessage); + } else { + error(errorMessage); + } + } else { + // dinfo("Loaded: " + source.xml); + + // Verify document structure. + if (source.documentElement == null) { + var message = "No root element found in '" + filePath + "'."; + if (isQuitOnError()) { + throw new Error(message); + } else { + error(message); + } + continue; + } + var xmlRootNodeName = source.documentElement.tagName; + + // Check name spaces. + var rootComponents = xmlRootNodeName.split(":"); + var rootElementName = xmlRootNodeName; + if (rootComponents.length > 1) { + // nameSpace = rootComponents[0]; + rootElementName = rootComponents[1]; + } + + // Verify if root element is correct. + if (rootNodeName != null && rootNodeName != rootElementName) { + // Element does not match expected root element name. + var message = "Invalid XML structure found. Root element '" + + rootElementName + "' does not match expected element name of '" + + rootNodeName + "'."; + if (isQuitOnError()) { + throw new Error(message); + } else { + error(message); + } + continue; + } + + // If this is the only document to read, then just return it. + if (filePaths.length <= 1) { + xmlDocument = source; + break; + } else { + // Merge document contents. + if (xmlDocument.documentElement == null) { + var rootName = rootElementName; + if (xmlNamespace != null) { + rootName = rootName + ":" + rootName; + } + var rootElement = createXml(rootName, xmlNamespace); + xmlDocument.appendChild(rootElement); + } + // Fetch all document nodes from loaded XML document. + var childPath; + if (childElementNodeName != null) { + childPath = childElementNodeName; + } else { + childPath = "*"; + } + var documentNodes = source.documentElement.selectNodes(childPath); + + // Add all nodes to XML document to be returned. + var xmlRoot = xmlDocument.documentElement; + for (var iDocumentNode=0; iDocumentNode < documentNodes.length; iDocumentNode++) { + xmlRoot.appendChild(documentNodes[iDocumentNode]); + } + } + } + } + // In local (non-remote) mode the settings database read shall be reset in + // order to assure to re-build the cached check-results. + if (xmlType != null && xmlType == "settings" && getQueryMode() != "remote" ) { + var documentElement = xmlDocument.documentElement; + if (documentElement != null) { + var checkResultsNode = documentElement.selectSingleNode("checkResults"); + if (checkResultsNode != null) { + documentElement.removeChild(checkResultsNode); + } + } + } + return xmlDocument.documentElement; +} + +/** + * Removes a sub-node from the given XML node entry. + * + * @param XMLNode + * the XML node to remove from (e.g. packages or settings) + * @param subNode + * the node to be removed from the XMLNode (for example a package + * node) + * @return Returns true in case of success, returns false if no node could be + * removed + */ +function removeNode(XMLNode, subNode) { + var returnvalue = false; + var result = XMLNode.removeChild(subNode); + if(result != null) { + returnvalue = true; + } + return returnvalue; +} + +/** + * Returns a new array of XML nodes unique by the specified attribute. + */ +function uniqueAttributeNodes(nodes, attribute) { + // Hold unique nodes in a new array. + var newNodes = new Array(); + + // Loop over nodes provided nodes searching for duplicated entries. + for (var i = 0; i < nodes.length; i++) { + // Get node for this loop. + var node = nodes[i]; + + // Get attribute which should be unique + var attributeValue = node.getAttribute(attribute); + + // Determine if node with attribute already exists. + var found = false; + + // Loop over elements of new nodes array and look for pre-existing + // element. + for (var j = 0; j < newNodes.length; j++) { + var newNodeAttribute = newNodes[j].getAttribute(attribute); + if (attributeValue == newNodeAttribute) { + found = true; + break; + } + } + + // If it doesn't exist, add it. + if (!found) { + newNodes.push(node); + } + } + return newNodes; +} + +/******************************************************************************* + * Initialization and cleanup + * **************************************************************************** + */ + +/** + * Clean up function called at the end. Writes all required files, closes + * handlers and prints/writes log. Then exits with the given exit code. + */ +function cleanup() { + // write settings XML file + // no need as we save on each settings modification now. + // saveSettings(); + + // If there is still something in the log buffer write it to a file. + if (logBuffer != null) { + initializeLog(); + } + + // close log file + // do not close the file if reboot is in progress + // this is done since there might still be some writes to the file + // before the reboot actually takes place + if (getLogLevel() > 0 && !rebooting && getLogFile() != null) { + // close the log + getLogFile().Close(); + } +} + +/** + * Ends program execution with the specified exit code. + */ +function exit(exitCode) { + // print packages which have not been removed + var skippedPackages = getSkippedRemoveNodes(); + if (skippedPackages.length > 0) { + var message = "Packages where removal has been aborted:\n"; + for (var i=0; i<skippedPackages.length; i++) { + var packageNode = skippedPackages[i]; + message += getPackageName(packageNode) + " (" + + getPackageID(packageNode) + ")\n"; + } + info(message); + } + + // check if there is a postponed reboot scheduled + // cleanup is done directly within the reboot function + if (isPostponedReboot()) { + // postponed reboot executed + setPostponedReboot(false); + reboot(); + } + + // run cleanup + cleanup(); + + // reset running state + if (!isNoRunningState()) { + // Reset running state. + setRunningState("false"); + } + + WScript.Quit(exitCode); +} + +/** + * Initializes the system, all required variables... + */ +function initialize() { + // Initialize configuration (read and set values). + initializeConfig(); + + // Parse command-line parameters. + parseArguments(getArgv()); + + // Print version number. + dinfo("WPKG " + WPKG_VERSION + " starting..."); + + // Inform to which value reboot command is set. + dinfo("Reboot-Cmd is " + getRebootCmd() + "."); + + // Set quiet mode to desired value. + if (quiet != null) { + setQuiet(quiet); + } else { + setQuiet(quietDefault); + } + + // get argument list + var argv = getArgv(); + + // Will be used for file operations. + var fso = new ActiveXObject("Scripting.FileSystemObject"); + + var httpregex = new RegExp("^http"); + + var isWeb = false; + var base = ""; + + if(httpregex.test(wpkg_base) == true) { + isWeb = true; + base = wpkg_base; + } else { + // Use the executing location of the script as the default base + // path. + isWeb = false; + if (wpkg_base == "") { + var path = WScript.ScriptFullName; + base = fso.GetParentFolderName(path); + } else { + base = fso.GetAbsolutePathName(wpkg_base); + } + } + + dinfo("Base directory is '" + base + "'."); + dinfo("Log level is " + getLogLevel()); + + var packages_file; + var profiles_file; + var hosts_file; + var nodes; + if (!isWeb) { + // Append the settings file names to the end of the base path. + packages_file = fso.BuildPath(base, packages_file_name); + var packages_folder = fso.BuildPath(base, "packages"); + profiles_file = fso.BuildPath(base, profiles_file_name); + var profiles_folder = fso.BuildPath(base, "profiles"); + hosts_file = fso.BuildPath(base, hosts_file_name); + var hosts_folder = fso.BuildPath(base, "hosts"); + nodes = loadXml(profiles_file, profiles_folder, "profiles"); + if (nodes == null) { + // cannot continue without profiles (probably network error + // occurred) + throw new Error(10, "No profiles found. Aborting"); + } + setProfiles(nodes); + nodes = loadXml(hosts_file, hosts_folder, "hosts"); + if (nodes == null) { + // cannot continue without hosts (probably network error occurred) + throw new Error(10, "No hosts found. Aborting"); + } + setHosts(nodes); + // load packages + setPackages(loadXml(packages_file, packages_folder, "packages")); + } else { + packages_file = base + "/" + web_packages_file_name; + profiles_file = base + "/" + web_profiles_file_name; + hosts_file = base + "/" + web_hosts_file_name; + nodes = loadXml(profiles_file, null, "profiles"); + if (nodes == null) { + // cannot continue without profiles (probably network error + // occurred) + throw new Error(10, "No profiles found. Aborting"); + } + setProfiles(nodes); + nodes = loadXml(hosts_file, null, "hosts"); + if (nodes == null) { + // cannot continue without hosts (probably network error occurred) + throw new Error(10, "No hosts found. Aborting"); + } + setHosts(nodes); + // load packages + setPackages(loadXml(packages_file, null, "packages")); + } + + // Load packages and profiles. + if (isForce() && isArgSet(argv, "/synchronize")) { + dinfo("Skipping current settings. Checking for actually installed packages."); + + setSettings(createSettings(), true); + + fillSettingsWithInstalled(); + + } else { + // Load or create settings file. + if (!fso.FileExists(getSettingsPath())) { + dinfo("Settings file does not exist. Creating a new file."); + + setSettings(createSettings(), true); + } else { + dinfo("Reading settings file: " + getSettingsPath()); + // No need to save immediately because there is no change yet. + setSettings(createSettingsFromFile(getSettingsPath()), false); + } + } +} + +/** + * Initializes configuration file + */ +function initializeConfig() { + // get list of parameters (<param... /> nodes) + var param = getConfigParamArray(); + + // loop through all parameters + for (var i=0; i < param.length; i++) { + var name = param[i].getAttribute("name"); + var value= param[i].getAttribute("value"); + if (name == "volatileReleaseMarker") { + volatileReleaseMarkers.push((param[i].getAttribute("value")).toLowerCase()); + } else if(value === "true" || value === "false" || value === "null") { + // If value is boolean or null, we don't want " around it. + // Otherwise it'll be assigned as a string. + + // Here is where the <param name='...' ... /> is used as the + // variable name and assigned the + // <param ... value='...' /> value from the config.xml file. We're + // using eval to do variable + // substitution for the variable name. + eval ( name + " = " + value ); + } else { + // Non-Boolean value, put " around it. + + // Here is where the <param name='...' ... /> is used as the + // variable name and assigned the + // <param ... value='...' /> value from the config.xml file. We're + // using eval to do variable + // substitution for the variable name. + eval ( name + " = \"" + value + "\"" ); + } + } + // Expand environment variables. + var wshShell = new ActiveXObject("WScript.Shell"); + if(rebootCmd != null) { + rebootCmd = wshShell.ExpandEnvironmentStrings(rebootCmd); + } + if(logfilePattern != null) { + logfilePattern = wshShell.ExpandEnvironmentStrings(logfilePattern); + } + + // Check if log level shall be altered. + if (logLevel != null) { + setLogLevel(logLevel); + } else { + setLogLevel(logLevelDefault); + } +} + +/** + * Initializes log file depending on information available. If log file path is + * not set or unavailable creates logfile within %TEMP%. Sets log file handler + * to null in case logging is disabled (logLevel=0) + * @returns log file handler; returns null if no logfile was initialized. + */ +function initializeLog() { + // Abort initialization if initialization is already running. + if (logInitializing) { + return logfileHandler; + } + /* + * Set initializing flag during initialization to prevent initialization loop when logs are written during + * initialization. + */ + logInitializing = true; + + // only initialize a log file if log level is greater than 0 + if (getLogLevel() <= 0) { + if (logfileHandler != null) { + logfileHandler.Close(); + logfileHandler = null; + } + logfilePath = null; + return null; + } + + /** stores the new filehandler created during this execution */ + var newLogfileHandler = null; + var newLogfilePath = null; + var newLogfileAppendMode = false; + + /** file system object */ + var fso = new ActiveXObject("Scripting.FileSystemObject"); + + // try to initialize real log file + try { + // build log file name + var today = new Date(); + var year = today.getFullYear(); + var month = today.getMonth() + 1; + var day = today.getDate(); + var hour = today.getHours(); + var minute = today.getMinutes(); + var second = today.getSeconds(); + if (month < 10) { + month = "0" + month; + } + if (day < 10) { + day = "0" + day; + } + if (hour < 10) { + hour = "0" + hour; + } + if (minute < 10) { + minute = "0" + minute; + } + if (second < 10) { + second = "0" + second; + } + + var logFileName = getLogfilePattern().replace(new RegExp("\\[HOSTNAME\\]", "g"), getHostname()); + logFileName = logFileName.replace(new RegExp("\\[YYYY\\]", "g"), year); + logFileName = logFileName.replace(new RegExp("\\[MM\\]", "g"), month); + logFileName = logFileName.replace(new RegExp("\\[DD\\]", "g"), day); + logFileName = logFileName.replace(new RegExp("\\[hh\\]", "g"), hour); + logFileName = logFileName.replace(new RegExp("\\[mm\\]", "g"), minute); + logFileName = logFileName.replace(new RegExp("\\[ss\\]", "g"), second); + // only apply profile if required + /* + * NOTE: In case profiles.xml is not valid this will quit the script on getProfile() call while keeping the + * temporary local log file handler. As a result errors at initialization will be logged to local log only. So + * make sure not to use the [PROFILE] placeholder if you like to remote- initialization logs (e.g. missing XML + * files). + */ + var regularExp = new RegExp("\\[PROFILE\\]", "g"); + if (regularExp.test(logFileName) == true) { + // this will throw an error if profile is not available yet + var profileList = getProfileList(); + // concatenate profile names or throw error if no names + // available + if (profileList.length > 0) { + var allProfiles = ""; + for (var i=0; i<profileList.length; i++) { + if (allProfiles == "") { + allProfiles = profileList[i]; + } else { + allProfiles += "-" + profileList[i]; + } + } + logFileName = logFileName.replace(regularExp, allProfiles); + } else { + throw new Error("Profile information not available."); + } + } + + if (log_file_path == null || log_file_path == "") { + log_file_path = "%TEMP%"; + } + + newLogfilePath = new ActiveXObject("WScript.Shell").ExpandEnvironmentStrings(log_file_path + "\\" + logFileName); + + // Just open the log file in case it is not opened already or append mode changed from false to true. + // Do not support switching from append mode to overwrite mode if the + // log file is not changed as this would erase log entries. + if (logfilePath != newLogfilePath || (logfileAppendMode != isLogAppend() && isLogAppend() == true)) { + var newLogMessage = "Initializing new log file: '" + newLogfilePath + "' in "; + if (isLogAppend()) { + newLogMessage += "append"; + } else { + newLogMessage += "replace"; + } + newLogMessage += " mode."; + + dinfo(newLogMessage); + try { + // Evaluate append mode. + // 2=write (use 8 for append mode) + var openMode = 2; + if (isLogAppend()) { + openMode = 8; + } + + // If new logfile path is identical to existing log file then just the append mode changed. + if (logfilePath == newLogfilePath) { + // Paths are identical, so mode must have been changed. + // Re-open the file with new file mode. + // NOTE: This should be handled as an atomic/synchronized + // operation in multi-threaded environment (not for WSH). + if(logfileHandler != null) { + // Close file first. + logfileHandler.Close(); + // Replace handler. + logfileHandler = fso.OpenTextFile(newLogfilePath, openMode, true, -2); + logfileAppendMode = isLogAppend(); + } + } else { + // Open mode: + // 2=write (use 8 for append mode) + // true=create if not exist + // 0=ASCII, -1=unicode, -2=system default + newLogfileHandler = fso.OpenTextFile(newLogfilePath, openMode, true, -2); + } + newLogfileAppendMode = isLogAppend(); + } catch (e) { + // Fall back to local temp folder. + newLogfilePath = new ActiveXObject("WScript.Shell").ExpandEnvironmentStrings("%TEMP%\\" + logFileName); + dinfo("Failed to open log file: " + e.description + "; falling back to local logging: " + newLogfilePath); + if (logfilePath != newLogfilePath) { + // Open mode: + // 2=write (use 8 for append mode) + // true=create if not exist + // 0=ASCII, -1=unicode, -2=system default + newLogfileHandler = fso.OpenTextFile(newLogfilePath, 2, true, -2); + newLogfileAppendMode = false; + } + } + } + } catch (err) { + dinfo("Cannot initialize log file (" + err.description + "), probably not all data available " + + "yet, stick with local log file. "); + // Initialize local log file. + var newLogfile = new ActiveXObject("WScript.Shell").ExpandEnvironmentStrings("%TEMP%\\wpkg-logInit.log"); + // create new temporary file - overwrite existing + newLogfileHandler = fso.OpenTextFile(newLogfile, 8, true, -2); + newLogfileAppendMode = true; + dinfo("Initialized temporary local log file: " + logfilePath); + } + + + // In case a new log file handler was created switch handlers and move data + // from old log file to new log file. + if (newLogfileHandler != null) { + // Switch to new log file handler. + // NOTE: In multi-threaded environment this shall be synchronized. + var oldLogfileHandler = logfileHandler; + var oldLogfilePath = logfilePath; + logfileHandler = newLogfileHandler; + logfileAppendMode = newLogfileAppendMode; + logfilePath = newLogfilePath; + + // Transfer all logs to the new logfile and close old log file. + if (oldLogfileHandler != null) { + oldLogfileHandler.Close(); + } + if (oldLogfilePath != null) { + // Read old log file and write contents to new log file. + // Open read-only. + var readerFile = fso.OpenTextFile(oldLogfilePath, 1, true, -2); + while (!readerFile.AtEndOfStream) { + logfileHandler.WriteLine(readerFile.ReadLine()); + } + readerFile.Close(); + // delete old logfile + fso.DeleteFile(oldLogfilePath, true); + } + // Write log buffer to file and clean buffer. + if (logBuffer != null) { + logfileHandler.Write(logBuffer); + logBuffer = null; + } + } + // Initialization finished. + logInitializing = false; + return logfileHandler; +} + +/** + * Processes command line options and sets internal variables accordingly. + */ +function parseArguments(argv) { + // Initialize temporary log file + // Note: this will be done automatically on first log output + // initializeLog(); + + // Parse bare arguments. + // All which start with a "/" and do not have a ":" in them. + for (var i=0; i < argv.length; i++) { + var argument = argv.Item(i); + switch (argument) { + // Check for quiet mode. + case "/quiet": + quiet = true; + break; + + // Check for log append flag. + case "/logAppend": + setLogAppend(true); + break; + + // Check for dry run flag. + case "/dryrun": + setDryRun(true); + setDebug(true); + setNoReboot(true); + break; + + // Check for debug flag. + case "/debug": + case "/verbose": + setDebug(true); + break; + + // Check for help flag. + case "/help": + showUsage(); + exit(0); + break; + + // Check for nonotify flag. + case "/nonotify": + setNoNotify(true); + break; + + // Check for noreboot flag. + case "/noreboot": + setNoReboot(true); + break; + + // Check for noremove flag. + case "/noremove": + setNoRemove(true); + break; + + // Check for force flag. + case "/force": + setForce(true); + break; + + // Check for quot on error flag. + case "/quitonerror": + setQuitOnError(true); + break; + + // Check if status messages should be sent. + case "/sendStatus": + setSendStatus(true); + break; + + // Check if upgrade-before-remove feature should be enabled. + case "/noUpgradeBeforeRemove": + setUpgradeBeforeRemove(false); + break; + + // Check if installation should be forced. + case "/forceinstall": + setForceInstall(true); + break; + + // Check if forced remove shall be disabled. + case "/noforcedremove": + setNoForcedRemove(true); + break; + + // Check if WPKG state shall be exported to registry. + case "/norunningstate": + setNoRunningState(true); + break; + + // Check if WPKG shall work case-insensitive. + case "/ignoreCase": + setCaseSensitivity(false); + break; + + // Check if multiple profiles shall be applied + case "/applymultiple": + setApplyMultiple(true); + break; + + // Check if user likes to disable all downloads. + case "/noDownload": + setNoDownload(true); + break; + + // Check if /synchronize parameter is set. + case "/synchronize": + // Do not do anything. The /synchronize parameter is handled by main() function. + break; + + default: + // Check if the argument is a named argument. + var argument = argv.Item(i); + if (argument.indexOf(":") < 0) { + dinfo("Unknown argument: " + argv.Item(i)); + } + } + } + + // Get special purpose argument lists. + var argn = argv.Named; + + // Process quiet mode flag. + var quietFlagValue = argn.Item("quiet"); + if (quietFlagValue != null) { + if (quietFlagValue == "true") { + quiet = true; + } else if (quietFlagValue == "false"){ + quiet = false; + } + } + + // Process log append mode flag. + var logAppendFlagValue = argn.Item("logAppend"); + if (logAppendFlagValue != null) { + if (logAppendFlagValue == "true") { + setLogAppend(true); + } else if (logAppendFlagValue == "false"){ + setLogAppend(false); + } + } + + // Process dryrun mode flag. + var dryrunFlagValue = argn.Item("dryrun"); + if (dryrunFlagValue != null) { + if (dryrunFlagValue == "true") { + setDryRun(true); + setDebug(true); + setNoReboot(true); + } else if (dryrunFlagValue == "false"){ + setDryRun(false); + setNoReboot(false); + } + } + + // Process verbose mode flag. + var verboseFlagValue = argn.Item("verbose"); + if (verboseFlagValue != null) { + if (verboseFlagValue == "true") { + setDebug(true); + } else if (verboseFlagValue == "false"){ + setDebug(false); + } + } + + // Process debug mode flag. + var debugFlagValue = argn.Item("debug"); + if (debugFlagValue != null) { + if (debugFlagValue == "true") { + setDebug(true); + } else if (debugFlagValue == "false"){ + setDebug(false); + } + } + + // Process nonotify mode flag. + var nonotifyFlagValue = argn.Item("nonotify"); + if (nonotifyFlagValue != null) { + if (nonotifyFlagValue == "true") { + setNoNotify(true); + } else if (nonotifyFlagValue == "false"){ + setNoNotify(false); + } + } + + // Process noreboot mode flag. + var norebootFlagValue = argn.Item("noreboot"); + if (norebootFlagValue != null) { + if (norebootFlagValue == "true") { + setNoReboot(true); + } else if (norebootFlagValue == "false"){ + setNoReboot(false); + } + } + + // Process noremove mode flag. + var noremoveFlagValue = argn.Item("noremove"); + if (noremoveFlagValue != null) { + if (noremoveFlagValue == "true") { + setNoRemove(true); + } else if (noremoveFlagValue == "false"){ + setNoRemove(false); + } + } + + // Process force mode flag. + var forceFlagValue = argn.Item("force"); + if (forceFlagValue != null) { + if (forceFlagValue == "true") { + setForce(true); + } else if (forceFlagValue == "false"){ + setForce(false); + } + } + + // Process quitonerror mode flag. + var quitonerrorFlagValue = argn.Item("quitonerror"); + if (quitonerrorFlagValue != null) { + if (quitonerrorFlagValue == "true") { + setQuitOnError(true); + } else if (quitonerrorFlagValue == "false"){ + setQuitOnError(false); + } + } + + // Process sendStatus mode flag. + var sendStatusFlagValue = argn.Item("sendStatus"); + if (sendStatusFlagValue != null) { + if (sendStatusFlagValue == "true") { + setSendStatus(true); + } else if (sendStatusFlagValue == "false"){ + setSendStatus(false); + } + } + + // Process noUpgradeBeforeRemove mode flag. + var noUpgradeBeforeRemoveFlagValue = argn.Item("noUpgradeBeforeRemove"); + if (noUpgradeBeforeRemoveFlagValue != null) { + if (noUpgradeBeforeRemoveFlagValue == "true") { + setUpgradeBeforeRemove(false); + } else if (noUpgradeBeforeRemoveFlagValue == "false"){ + setUpgradeBeforeRemove(true); + } + } + + // Process forceinstall mode flag. + var forceInstallFlagValue = argn.Item("forceinstall"); + if (forceInstallFlagValue != null) { + if (forceInstallFlagValue == "true") { + setForceInstall(true); + } else if (forceInstallFlagValue == "false"){ + setForceInstall(false); + } + } + + // Process noforcedremove mode flag. + var noForcedRemoveFlagValue = argn.Item("noforcedremove"); + if (noForcedRemoveFlagValue != null) { + if (noForcedRemoveFlagValue == "true") { + setNoForcedRemove(true); + } else if (noForcedRemoveFlagValue == "false"){ + setNoForcedRemove(false); + } + } + + // Process norunningstate mode flag. + var noRunningStateFlagValue = argn.Item("norunningstate"); + if (noRunningStateFlagValue != null) { + if (noRunningStateFlagValue == "true") { + setNoRunningState(true); + } else if (noRunningStateFlagValue == "false"){ + setNoRunningState(false); + } + } + + // Process ignoreCase mode flag. + var ignoreCaseFlagValue = argn.Item("ignoreCase"); + if (ignoreCaseFlagValue != null) { + if (ignoreCaseFlagValue == "true") { + setCaseSensitivity(false); + } else if (ignoreCaseFlagValue == "false"){ + setCaseSensitivity(true); + } + } + + // Process applymultiple mode flag. + var applyMultipleFlagValue = argn.Item("applymultiple"); + if (applyMultipleFlagValue != null) { + if (applyMultipleFlagValue == "true") { + setApplyMultiple(true); + } else if (applyMultipleFlagValue == "false"){ + setApplyMultiple(false); + } + } + + // Process noDownload mode flag. + var noDownloadFlagValue = argn.Item("noDownload"); + if (noDownloadFlagValue != null) { + if (noDownloadFlagValue == "true") { + setNoDownload(true); + } else if (noDownloadFlagValue == "false"){ + setNoDownload(false); + } + } + + // Parse parameters with string values. + + // Fetch base folder where to read XML files from. + if (argn("base") != null) { + wpkg_base = argn("base"); + } + + // Process log level. + if (argn.Item("logLevel") != null) { + setLogLevel(parseInt(argn.Item("logLevel"))); + } + + // Set the profile from either the command line or the hosts file. + if (argn.Item("host") != null) { + setHostname(argn("host")); + } + + // Parse OS override setting. + if (argn.Item("os") != null) { + setHostOS(argn("os")); + } + + // Parse IP address override setting. + if (argn.Item("ip") != null) { + var ipListParam = argn.Item("ip").split(","); + setIPAddresses(ipListParam); + } + + // Parse domain name override setting. + if (argn.Item("domainname") != null) { + setDomainName(argn.Item("domainname")); + } + + // Parse group override setting. + if (argn.Item("group") != null) { + var hostGroupParam = argn.Item("group").split(","); + setHostGroups(hostGroupParam); + } + + // Process log file pattern. + if (argn.Item("logfilePattern") != null) { + setLogfilePattern(argn.Item("logfilePattern")); + } + + // Process path to log file. + if (argn.Item("log_file_path") != null) { + log_file_path = argn.Item("log_file_path"); + } + + // Parse reboot command. + if (argn.Item("rebootcmd") != null) { + setRebootCmd(argn.Item("rebootcmd")); + } + + // Parse path to settings file. + if (argn.Item("settings") != null) { + setSettingsPath(argn.Item("settings")); + } + + // Evaluate query mode. + if (argn.Item("query") != null) { + // Read query mode. + setQueryMode(argn.Item("queryMode")); + + if (getQueryMode() == "remote") { + dinfo("Query mode: remote"); + } + } +} + +/** + * Saves settings to file system. Optionally allows sorting of package nodes. + * + * @param sort {Boolean} Set to true in order to sort package nodes. + */ +function saveSettings(sort) { + if (getQueryMode() == "remote") { + // Do not save settings in remote qurey mode. + dinfo("Skipping settings save: Remote query mode enabled."); + return; + } + + var sortPackages = true; + if (sort != null && sort == false) { + sortPackages = false; + } + + if (sortPackages) { + dinfo("Saving sorted settings to '" + getSettingsPath() + "'." + sort); + sortSettings(); + } else { + dinfo("Saving unsorted settings to '" + getSettingsPath() + "'." + sort); + } + + // Do not save settings if settings are empty or in remote query mode. + if (getSettingsPath() != null && settings != null) { + saveXml(settings, getSettingsPath()); + } else { + dinfo("Settings not saved! Either settings are empty or path is not set."); + } +} + +/******************************************************************************* + * LOG FUNCTIONS + * **************************************************************************** + */ + +/** + * Echos text to the command line or a prompt depending on how the program is + * run. + */ +function alert(message) { + WScript.Echo(message); +} + +/** + * Presents some debug output if debugging is enabled + */ +function dinfo(stringInfo) { + log(8, stringInfo); +} + +/** + * Logs or presents an error message depending on interactivity. + */ +function error(message) { + log(1, message); +} + +/** + * Returns log file handler. If logfile has not been initialized yet, starts + * initialization and returns new filehandler. + * + * Returns null in case logLevel is set to 0. + * + * @return log file handler (returns null if log level is 0) + */ +function getLogFile() { + return logfileHandler; +} + +/** + * Creates a log line from a given string. The severity string is automatically + * padded to a fixed length too to make the log entries easily readable. + * + * @param severity + * string which represents log severity + * @param message + * string which represents the message to be logged + * @return log entry in its default format:<br>YYYY-MM-DD hh:mm:ss, SEVERITY: + * <message> + */ +function getLogLine(severity, message) { + var severityPadding = 7; + // pad string with spaces + for (var i = severity.length; i <= severityPadding; i++) { + severity += " "; + } + + // escape pipes (since they are used as new-line characters) + var logLine = message.replace(new RegExp("\\|", "g"), "\\|"); + // replace new-lines by pipes + logLine = logLine.replace(new RegExp("(\\r\\n)|(\\n\\r)|[\\r\\n]+", "g"), "|"); + + // build date string + var today = new Date(); + var year = today.getFullYear(); + var month = today.getMonth() + 1; + var day = today.getDate(); + var hour = today.getHours(); + var minute = today.getMinutes(); + var second = today.getSeconds(); + if (month < 10) { + month = "0" + month; + } + if (day < 10) { + day = "0" + day; + } + if (hour < 10) { + hour = "0" + hour; + } + if (minute < 10) { + minute = "0" + minute; + } + if (second < 10) { + second = "0" + second; + } + + var tstamp = year + "-" + month + "-" + day + " " + hour + ":" + minute + ":" + second; + + // build log line + logLine = tstamp + ", " + severity + ": " + logLine; + + return logLine; +} + +/** + * Returns the current log level: + * + * @return Log level<br> + * 0: do not log anything, disables writing of a log-file<br> + * 1: log errors only<br> + * 2: log errors and warnings<br> + * 4: log errors, warnings and information<br> + */ +function getLogLevel() { + return logLevelValue; +} + +/** + * Logs or presents an info message depending on interactivity. + */ +function info(message) { + log(4, message); +} + +/** + * Logs the specified event type and description in the Windows event log. + * + * Log types: + * <pre> + * 0 SUCCESS + * 1 ERROR + * 2 WARNING + * 4 INFORMATION + * 8 AUDIT_SUCCESS + * 16 AUDIT_FAILURE + * </pre> + */ +function log(type, description) { + // just log information level to event log or everything in case debug is + // enabled. + if (((type & 7) > 0 || isDebug()) && !isSkipEventLog()) { + if(isQuiet() && !isEventLogFallback()) { + try { + WshShell = WScript.CreateObject("WScript.Shell"); + WshShell.logEvent(type, "" + description); + } catch (e) { + // skip future event log entries and log an error + setEventLogFallback(true); + var message = "Error when writing to event log, falling back" + + " to standard output (STDOUT).\n" + + "Description: " + e.description + "\n" + + "Error number: " + hex(e.number) + "\n" + + "Stack: " + e.stack + "\n" + + "Line: " + e.lineNumber + "\n"; + error(message); + + // write message to STDOUT to ensure it is not lost + alert(description); + } + } else { + alert(description); + } + } + if ((type & getLogLevel()) > 0) { + // write to log file + var logSeverity = "unspecified"; + switch(type) { + case 0: + logSeverity = "SUCCESS"; + break; + case 1: + logSeverity = "ERROR"; + break; + case 2: + logSeverity = "WARNING"; + break; + case 4: + logSeverity = "INFO"; + break; + case 8: + logSeverity = "DEBUG"; + break; + case 16: + logSeverity = "DEBUG"; + break; + } + + var logFile = getLogFile(); + if (logFile != null) { + // Write log to file. + logFile.WriteLine(getLogLine(logSeverity, description)); + } else { + // First write log line to buffer. + if (logBuffer != null) { + // Write log entry to local buffer. + logBuffer += getLogLine(logSeverity, description) + "\r\n"; + } else { + // Create new log buffer. + logBuffer = getLogLine(logSeverity, description) + "\r\n"; + } + if (logInitReady == true) { + // Log file not initialized but ready to be initialized + // If log is ready to be initialized, then initialize it. + initializeLog(); + } + } + } +} + +/** + * Logs status message which can be read by WPKG client to display messages to + * the user + * + * @param message + * the message to be sent to the client. + */ +function logStatus(message) { + if (isSendStatus()) { + alert(getLogLine("STATUS", message)); + } +} + +/** + * Notifies the user/computer with a pop up message. + */ +function notify(message) { + if (!isNoNotify()) { + var msgPath = "%SystemRoot%\\System32\\msg.exe"; + var netPath = "%SystemRoot%\\System32\\net.exe"; + var cmd = ""; + // check if msg.exe exists + var fso = new ActiveXObject("Scripting.FileSystemObject"); + if(fso.FileExists(new ActiveXObject("WScript.Shell").ExpandEnvironmentStrings(msgPath))) { + // try msg method + // cmd += "%COMSPEC% /U /C chcp 65001 && echo " + message + " | " + + // msgPath + " * /TIME:" + notificationDisplayTime; + cmd += msgPath + " * /TIME:" + notificationDisplayTime + " \"" + message + "\""; + } else { + // try net send method + cmd += netPath + " SEND "; + cmd += getHostname(); + cmd += " \"" + message + "\""; + } + try { + exec(cmd, 0, null); + } catch (e) { + var errorMessage = "Notification failed. " + e.description; + if (isQuitOnError()) { + throw new Error(0, errorMessage); + } else { + error(errorMessage); + } + } + } else { + info("User notification suppressed. Message: " + message); + } +} + +/** + * Sends a message to the system console notifying the user that installation + * failed. + */ +function notifyUserFail() { + // get localized message + var msg = getLocalizedString("notifyUserFail"); + if (msg == null) { + msg = "The software installation has failed."; + } + + try { + notify(msg); + } catch (e) { + error("Unable to notify the user that all action has been completed."); + } +} + +/** + * Sends a message to the system console notifying of impending action. + */ +function notifyUserStart() { + if (!was_notified) { + // get localized message + var msg = getLocalizedString("notifyUserStart"); + if (msg == null) { + msg = ""; + msg += "Automatic software deployment is currently updating your "; + msg += "system. Please wait until the process has finished. Thank you."; + } + + was_notified = true; + + try { + notify(msg); + } catch (e) { + throw new Error(0, "Unable to notify user that the system was " + + "about to begin updating. " + e.description); + } + } +} + +/** + * Sends a message to the system console notifying them that all action is + * complete. + */ +function notifyUserStop() { + if(was_notified) { + // get localized message + var msg = getLocalizedString("notifyUserStop"); + if (msg == null) { + msg = ""; + msg += "The automated software installation utility has completed "; + msg += "installing or updating software on your system. No reboot was "; + msg += "necessary. All updates are complete."; + } + + try { + notify(msg); + } catch (e) { + error("Unable to notify the user that all actions have been completed."); + } + } +} + +/** + * Set new locale LCID for user. + * + * @param newLocale new locale to be used starting from now. + */ +function setLocale(newLocale) { + if (newLocale != null) { + LCID = newLocale; + } +} + +/** + * Set new locale LCID for OS. + * + * @param newLocale new locale to be used starting from now. + */ +function setLocaleOS(newLocale) { + if (newLocale != null) { + LCIDOS = newLocale; + } +} + +/** + * Sets new log append value. + * + * @param append + * true if log should be appended, false otherwise (boolean) + */ +function setLogAppend(append) { + logAppend = append; +} + + +/** + * Sets new logging level. + * + * @param newLevel new log level to be used:<br> + * 0: do not log anything, disables writing of a log-file<br> + * 1: log errors only<br> + * 2: log errors and warnings<br> + * 4: log errors, warnings and information + */ +function setLogLevel(newLevel) { + logLevelValue = parseInt(newLevel); +} + +/** + * Sets new state for the nonotify flag. + * + * @param newState + * new state of the nonotify flag (boolean) + */ +function setNoNotify(newState) { + nonotify = newState; +} + +/** + * Sets new state for the upgrade-before-remove flag. + * + * @param newState + * set to true if you want to enable the upgrade-before-remove + * feature. Otherwise set false. + */ +function setUpgradeBeforeRemove(newState) { + noUpgradeBeforeRemove = !newState; +} + +/** + * Logs or presents a warning message depending on interactivity. + */ +function warning(message) { + log(2, message); +} + +/******************************************************************************* + * SUPPLEMENTARY FUNCTIONS Not directly related to the application logic but + * used by several functions to fulfill the task. + * **************************************************************************** + */ + + +/** + * Combines one list and another list into a single array. + */ +function concatenateList(list1, list2) { + // Create a new array the size of the sum of both original lists. + var list = new Array(); + + for (var iList1 = 0; iList1 < list1.length; iList1++) { + list.push(list1[iList1]); + } + + for (var iList2 = 0; iList2 < list2.length; iList2++) { + list.push(list2[iList2]); + } + + return list; +} + +/** + * Concatenates two Dictionary object and returns concatenated list. + * Does not modify any of the dictionaries passed as paramters. Returns new + * Dictionary object instead. + * If an element is listed in both dictionaries, then the value of the second + * Dictionary is applied (overwrite). + * Throws error in case an error occurs during dictionary append. + * @param dictionary1 Dictionary to be used as a base. + * @param dictionary2 Dictionary to be appended to dictionary1. + * @returns Dictionary object containing values of dicitonary1 and dictionary2. + */ +function concatenateDictionary(dictionary1, dictionary2) { + // Return variable. + var concatenatedDictionary = new ActiveXObject("Scripting.Dictionary"); + + var dictionaries = new Array(); + dictionaries.push(dictionary1); + dictionaries.push(dictionary2); + + // Concatenate + for (var iDictionary=0; iDictionary<dictionaries.length; iDictionary++) { + var dictionary = dictionaries[iDictionary]; + var dictKeys = dictionaries[iDictionary].keys().toArray(); + + for (var iDictKey=0; iDictKey<dictKeys.length; iDictKey++) { + var key = dictKeys[iDictKey]; + var value = dictionary.Item(key); + + // remove eventually existing variable + // I don't like to use + // variables.Item(variableName)=variableValue; + // because my IDE/parser treats it as an error: + // "The left-hand side of an assignment must be a variable" + try { + concatenatedDictionary.Remove(key); + } catch(e) { + // dinfo("Dictionary element '" + key + "' was not defined before. Creating now."); + } + try { + concatenatedDictionary.Add(key, value); + } catch(e) { + var message = "Dictionary element '" + key + "' with value '" + value + "'" + + " could not be assigned to dictionary!"; + if (isQuitOnError()) { + throw new Error(message); + } + error(message); + } + } + } + + return concatenatedDictionary; +} + + +/** + * Downloads a file by url, target directory and timeout + * + * @param url + * full file URL to download (http://www.server.tld/path/file.msi) + * @param target + * target directory do download to. This is specified relative to the + * downloadUrl path as specified within config.xml + * @param timeout + * timeout in seconds + * @return true in case of successful download, false in case of error + */ +function downloadFile(url, target, timeout, expandURL) { + if (url == null || url == "") { + error("No URL specified for download!"); + return false; + } + + // evaluate target directory + if (target == null || target == "") { + error("Invalid download target specified: " + target); + return false; + } else { + target = downloadDir + "\\" + target; + } + + try { + // Get shell to expand environment. + var shell = new ActiveXObject("WScript.Shell"); + + // Expand environment on target. + target = shell.ExpandEnvironmentStrings(target); + + // Expand environment on URL. + if (expandURL) { + url = shell.ExpandEnvironmentStrings(url); + } + + var fso = new ActiveXObject("Scripting.FileSystemObject"); + var stream = new ActiveXObject("ADODB.Stream"); + var xmlHttp = new createXmlHttp(); + + dinfo("Downloading '" + url + "' to '" + target + "'"); + + // open HTTP connection + xmlHttp.open("GET", url, true); + xmlHttp.setRequestHeader("User-Agent", "XMLHTTP/1.0"); + xmlHttp.send(); + + for (var t=0; t < timeout; t++) { + if (xmlHttp.ReadyState == 4) { + break; + } + WScript.Sleep(1000); + } + + // abort download if not finished yet + if (xmlHttp.ReadyState != 4) { + xmlHttp.abort(); + error("HTTP Timeout after " + timeout + " seconds."); + } + + // check if download has been completed + if (xmlHttp.status != 200) { + error("HTTP Error: " + xmlHttp.status + ", " + xmlHttp.StatusText); + } + + stream.open(); + stream.type = 1; + + stream.write(xmlHttp.responseBody); + stream.position = 0; + + // delete temporary file if it already exists + if (fso.FileExists(target)) { + fso.DeleteFile(target); + } + + // check if target folder exists, crate if required + var folder = fso.getParentFolderName(target); + var folderStructure = new Array(); + + while (!fso.FolderExists(folder)) { + folderStructure.push(folder); + folder = fso.getParentFolderName(folder); + } + // create folders + for (var i=folderStructure.length-1; i>=0; i--) { + fso.createFolder(folderStructure[i]); + } + + // write file + stream.saveToFile(target); + stream.close(); + + } catch (e) { + error("Download failed: " + e.description); + return false; + } + + return true; +} + +/** + * This method is used to return an XMLHTTP object. Depending on the MSXML + * version used the factory is different. + * + * @return XMLHTTP object + */ +function createXmlHttp() { + var xmlHttpFactories = [ + function () {return new XMLHttpRequest();}, + function () {return new ActiveXObject("Msxml2.XMLHTTP");}, + function () {return new ActiveXObject("Msxml3.XMLHTTP");}, + function () {return new ActiveXObject("Microsoft.XMLHTTP");} + ]; + + var xmlHttp = null; + for (var i=0; i < xmlHttpFactories.length; i++) { + try { + xmlHttp = xmlHttpFactories[i](); + } catch (e) { + continue; + } + break; + } + return xmlHttp; +} + + + +/** + * Executes a shell command and blocks until it is completed, returns the + * program's exit code. Command times out and is terminated after the specified + * number of seconds. + * + * @param cmd + * the command line to be executed + * @param timeout + * timeout value in seconds (use value <= 0 for default timeout) + * @param workdir + * working directory (optional). If set to null uses the current + * working directory of the script. + * @return command exit code (or -1 in case of timeout) + */ +function exec(cmd, timeout, workdir) { + if (isDryRun()) { + return 0; + } + // Create shell object for variable expansion. + var shell = new ActiveXObject("WScript.Shell"); + + // Expand command for better traceability in logs. + var cmdExpanded = shell.ExpandEnvironmentStrings(cmd); + + // Initialize shell execute object. + var shellExec = null; + + try { + + // Timeout after an hour by default. + if (timeout <= 0) { + timeout = 3600; + } + + // set working directory (if supplied) + if (workdir != null && workdir != "") { + workdir = shell.ExpandEnvironmentStrings(workdir); + dinfo("Switching to working directory: " + workdir); + shell.CurrentDirectory = workdir; + } + + var executeMessage = "Executing command: '" + cmd + "'"; + if (cmd != cmdExpanded) { + executeMessage += " ('" + cmdExpanded + "')"; + } + dinfo(executeMessage + "."); + var shellExec = shell.exec(cmd); + var startTime = (new Date()).getTime(); + + // close STDIN channel as we won't write to it and some command like + // PowerShell might wait for it to be closed on exit + shellExec.StdIn.close(); + + var timeUsed = 0; + var timeoutMilliseconds = timeout * 1000; + var increment = 10; + var incrementMax = 1000; + while (shellExec.status == 0) { + /* + * Unfortunately WSH is terribly broken when handling I/O streams from processes. AtEndOfStream blocks as + * well as ReadAll(), Read(x) and ReadLine(). So it's impossible to fetch STDOUT/ STDERR without blocking + * the main WPKG program. So either you can fetch the output or wait for the program to terminate, but not + * both. For WPKG it's more important to handle a timeout in order to handle programs which do not terminate + * properly or interactively ask for input. Unfortunately sub-processes seem to be blocked if they write + * more than 4k of data to STDOUT and/or STDERR buffer. So make sure your commands do not print too much on + * the console. If in doubt you might redirect STDOUT/STDERR to a file. For example by adding "> + * %TEMP%\myprog-out.txt 2>&1" to the command line. See + * <http://www.tech-archive.net/Archive/Scripting/microsoft.public.scripting.wsh/2004-10/0204.html> for a + * discussion on this topic. + */ + // Read and discard the output buffers to prevent process blocking + /* + * if (!shellExec.StdOut.AtEndOfStream) { dinfo("STDOUT: " + shellExec.StdOut.ReadAll()); } if + * (!shellExec.StdErr.AtEndOfStream) { dinfo("STDERR: " + shellExec.StdErr.ReadAll()); } + */ + + for(var i=0; i < 10 && shellExec.status == 0 && timeUsed < timeoutMilliseconds; i++) { + WScript.Sleep(increment); + timeUsed += increment; + } + + if (shellExec.status != 0) { + break; + } + increment = increment * 10; + if(increment > incrementMax) { + increment = incrementMax; + } + // Update time used to get real time used + timeUsed = (new Date()).getTime() - startTime; + if (timeUsed >= timeoutMilliseconds) { + throw new Error("Timeout reached while executing."); + } + } + + return shellExec.exitCode; + } catch (e) { + // handle execution exception + var message = "Command '" + cmd + "'"; + if (cmd != cmdExpanded) { + message += " ('" + cmdExpanded + "')"; + } + message += " was unsuccessful.\n" + e.description; + if(isQuitOnError()) { + throw new Error(message); + } else { + error(message); + return -1; + } + } finally { + // If process is not terminated then make sure it's terminated now. + if (shellExec != null && shellExec.status == 0) { + shellExec.Terminate(); + } + } +} + +/** + * Returns script arguments + */ +function getArgv() { + return WScript.Arguments; +} + +/** + * Returns processor architecture as reported by Windows. + * Currently returns the following architecture strings: + * <pre> + * String Description + * x86 Intel x86 compatible 32-bit architecture + * x64 AMD64 compatible 64-bit architecture + * ia64 Itanium compatible 64-bit IA64 instruction set + * </pre> + * + * Other architectures are currently not supported. + * + * @returns Processor architecture string. + */ +function getArchitecture() { + if (hostArchitecture == null) { + hostArchitecture = "x86"; + var wshObject = new ActiveXObject("WScript.Shell"); + // check if PROCESSOR_ARCHITECTURE is AMD64 + // NOTE: On 32-bit systems PROCESSOR_ARCHITECTURE is x86 even if the CPU is + // actually a 64-bit CPU + var architecture = wshObject.ExpandEnvironmentStrings("%PROCESSOR_ARCHITECTURE%"); + switch (architecture) { + case "AMD64": + hostArchitecture = "x64"; + break; + case "IA64": + hostArchitecture = "ia64"; + break; + } + } + return hostArchitecture; +} + +/** + * This function retrieves the IP address from the registry. + * + * @return array of IP address strings, array can be of length 0 + */ +function getIPAddresses() { + if (ipAddresses == null) { + ipAddresses = new Array(); + + var netCards = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\NetworkCards\\"; + var netInterfaces = "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\"; + + var subKeys = getRegistrySubkeys(netCards, 0); + if (subKeys != null) { + for (var i=0; i < subKeys.length; i++) { + // get service name entry + var service = getRegistryValue("HKLM\\" + netCards + subKeys[i] + "\\ServiceName"); + if (service != null && service != "") { + dinfo("Found network service: " + service); + + var regBase = "HKLM\\" + netInterfaces + service + "\\"; + var isInterface = getRegistryValue(regBase); + if (isInterface == null) { + dinfo("No TCP/IP Parameters for network service " + service); + } else { + // check if DHCP is enabled + var isDHCP = getRegistryValue(regBase + "EnableDHCP"); + if (isDHCP != null && isDHCP > 0) { + dinfo("Reading DHCP address."); + // read DHCP address + var dhcpIP = getRegistryValue(regBase + "DhcpIPAddress"); + if (dhcpIP != null && dhcpIP != "") { + ipAddresses.push(dhcpIP); + dinfo("Found DHCP address: " + dhcpIP); + } + } else { + // try reading fixed IP + dinfo("Reading fixed IP address(es)."); + + var fixedIPsRegs = getRegistryValue(regBase + "IPAddress"); + if (fixedIPsRegs == null || fixedIPsRegs == "") { + dinfo("Error reading fixed IP address(es)."); + } else { + var fixedIPs = fixedIPsRegs.toArray(); + if (fixedIPs != null) { + for (var j=0; j < fixedIPs.length; j++) { + if (fixedIPs[j] != null && + fixedIPs[j] != "" && + fixedIPs[j] != "0.0.0.0") { + ipAddresses.push(fixedIPs[j]); + dinfo("Found fixed IP address: " + fixedIPs[j]); + } + } + } + } + } + } + } + } + } + } + return ipAddresses; +} + +/** + * Returns the Windows LCID configured for the current user.<br> + * NOTE: The LCID is read from "HKCU\Control Panel\International\Locale" + * This is the locale of the user under which WPKG is run. In case WPKG GUI is + * used this might probably differ from the real locale of the user but at + * least it will match the system default locale. A user working on an English + * installation will most probably be able to understand English messages even + * if the users locale might be set to German. I was yet unable to find any + * other reliable way to read the locale. + * + * @return LCID value corresponding to current locale. See + * http://www.microsoft.com/globaldev/reference/lcid-all.mspx for a list + * of possible values. Leading zeroes are stripped. + */ +function getLocale() { + if (LCID == null) { + // set default to English - United States + var defaultLocale = "409"; + var localePath = "HKCU\\Control Panel\\International\\Locale"; + + // read the key + var regLocale = getRegistryValue(localePath); + if (regLocale != null) { + // trim leading zeroes + var locale = trimLeadingZeroes(regLocale).toLowerCase(); + dinfo("Found user locale: " + locale); + LCID = locale; + } else { + LCID = defaultLocale; + dinfo("Unable to locate user locale. Using default locale: " + defaultLocale); + } + } + + return LCID; +} + +/** + * Returns the Windows operating system install language LCID.<br> + * NOTE: The LCID is read from the InstallLanguage value at + * HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\Language\. + * This is the locale under which the OS has been initially installed + * regardless of the user locale settings.<br> + * For example on an English Windows installation with the locale settings set + * to German it will still return 409. + * + * @returns LCID value corresponding to system install language. See + * http://www.microsoft.com/globaldev/reference/lcid-all.mspx for a list + * of possible values. Leading zeroes are stripped. + */ +function getLocaleOS() { + if (LCIDOS == null) { + // set default to English - United States + var defaultLocale = "409"; + var localePath = "HKLM\\SYSTEM\\CurrentControlSet\\Control\\Nls\\Language\\InstallLanguage"; + + // read the key + var regLocale = getRegistryValue(localePath); + if (regLocale != null) { + // trim leading zeroes + var locale = trimLeadingZeroes(regLocale).toLowerCase(); + dinfo("Found system locale: " + locale); + LCIDOS = locale; + } else { + LCIDOS = defaultLocale; + dinfo("Unable to locate system locale. Using default locale: " + defaultLocale); + } + } + + return LCIDOS; +} + +/** + * Returns the logfile pattern currently in use + * + * @return current value of logfilePattern + */ +function getLogfilePattern() { + return logfilePattern; +} + +/** + * Returns the current value of the rebootCmd variable. + * + * @return current value of rebootCmd + */ +function getRebootCmd() { + return rebootCmd; +} + +/** + * Returns a string array containing the names of the subkeys of the given + * registry key. The parentKey parameter has to be specified without the leading + * HKCU part. + * + * @param parentKey + * key to read subkeys from (e.g. "SOFTWARE\\Microsoft" + * @param subLevels + * number of sub-levels to parse. Set to 0 in order to parse only + * direct sub-keys of the given parent key. If set to 1 it will parse + * the subkeys of all direct child keys as well. Set to 2 to parse 2 + * levels. Set to negative value (e.g. -1) to parse recursively + * without any recursion limit. + * + * @return array containing a list of strings representing the subkey names + * returns null in case of error or empty array in case of no available + * subkeys. + */ +function getRegistrySubkeys(parentKey, subLevels) { + // dinfo("Getting registry subkeys from: " + parentKey); + + // get number of recursion levels + if( subLevels == null ) { + subLevels = 0; + } + + // key representing HKEY_LOCAL_MACHINE + var HKLM = 0x80000002; + + var returnArray = new Array(); + + try { + // Getting registry access object. + var locator = new ActiveXObject("WbemScripting.SWbemLocator"); + var service = locator.ConnectServer(".", "root\\default"); + var regProvider = service.Get("StdRegProv"); + + var enumKeyMethod = regProvider.Methods_.Item("EnumKey"); + var inputParameters = enumKeyMethod.InParameters.SpawnInstance_(); + inputParameters.hDefKey = HKLM; + inputParameters.sSubKeyName = parentKey; + var outputParam = regProvider.ExecMethod_(enumKeyMethod.Name, inputParameters); + + try { + returnArray = outputParam.sNames.toArray(); + + // if there is a sub key parse it as well if recursion is requested + if (returnArray != null && ( subLevels >= 1 ) || subLevels < 0) { + for (var i = 0; i < returnArray.length; i++) { + var subKey = parentKey + "\\" + returnArray[i]; + var subKeys = getRegistrySubkeys(subKey, subLevels - 1); + if (subKeys != null) { + for (var j = 0; j < subKeys.length; j++) { + returnArray.push(returnArray[i] + "\\" + subKeys[j]); + } + } + } + } + } catch (readError) { + /* + * a read error on outputParam.sNames typically means that there are no sub-keys available. + */ + } + + } catch(err) { + error("Error when searching registry sub-keys at 'HKLM\\" + + parentKey + "'\nCode: " + hex(err.number) + "; Descriptions: " + + err.description); + returnArray = null; + } + + return returnArray; +} + +/** + * Returns value of given key in registry. If a key is specified instead of a + * registry value returns its "(default)" value. In case no default value is + * assigned returns an empty string (""). + * + * In case no such key or value exists within the registry, returns null + * + * @return registry value, key default value (or "") or null if path does not + * exist. In case the read value is a REG_DWORD returns an integer. In + * case the value is of type REG_MULTI_SZ returns a VBArray of strings. + * In case value is of type REG_BINARY returns VBArray of integer. + */ +function getRegistryValue(registryPath) { + registryPath = trim(registryPath); + var originalPath = registryPath; + + var WshShell = new ActiveXObject("WScript.Shell"); + var val = ""; + try { + val = WshShell.RegRead(registryPath); + } catch (e) { + var readError = e.description; + // dinfo("Error reading value at '" + registryPath + "', trying to read + // it as a key"); + + // supplied path is probably a key, test for key existence + if (registryPath.match(new RegExp("\\\\$", "g")) == null) { + // dinfo("String '" + registryPath + "' is not backslash " + + // "terminated, adding trailing backslash and test for key + // existence"); + + registryPath = registryPath + "\\"; + try { + val = WshShell.RegRead(registryPath); + } catch (keyErr) { + val = null; + // readError = keyErr.description; + // dinfo("Error reading key'" + registryPath + "': " + + // readError); + } + } + + // force error message to get returned error string + // in case the key does not exist + var noSuchKeyError = ""; + try { + WshShell.RegRead("HKLM\\SOFTWARE\\NOSUCHKEY\\"); + } catch (noKeyError) { + noSuchKeyError = noKeyError.description; + // dinfo("Error when reading inexistent key: " + noSuchKeyError); + } + // check if the error message we got is the same + if (noSuchKeyError.replace(new RegExp("HKLM\\\\SOFTWARE\\\\NOSUCHKEY\\\\"), + registryPath) == readError) { + + // check if key exists for 32-bit applications in redirected path + // (only if the path if not already pointing to the Wow6432Node key + if (is64bit() && + originalPath.match(new RegExp("^HKLM\\\\SOFTWARE", "i")) && + !originalPath.match(new RegExp("^HKLM\\\\SOFTWARE\\\\Wow6432Node", "i"))) { + // dinfo("Searching for value at 32-bit redirection node."); + var redirectPath = originalPath.replace(new RegExp("^HKLM\\\\SOFTWARE", "i"), + "HKLM\\Software\\Wow6432Node"); + val = getRegistryValue(redirectPath); + } else { + // dinfo("No such key or value at '" + registryPath + "' + // returning null."); + // return null - not found + val = null; + } + } else { + // dinfo("Key found at '" + registryPath + "'."); + } + } + + return val; +} + +/** + * User-defined function to format error codes. VBScript has a Hex() function + * but JScript does not. + */ +function hex(nmb) { + if (nmb > 0) { + return nmb.toString(16); + } else { + return (nmb + 0x100000000).toString(16); + } +} + +/** + * Scans an argument vector for an argument "arg". Returns true if found, else + * false. + */ +function isArgSet(argv, arg) { + // Loop over argument vector and return true if we hit it... + for (var i = 0; i < argv.length; i++) { + if (argv(i) == arg) { + return true; + } + } + // ...otherwise, return false. + return false; +} + +/** + * Loads environment for the specified package (including applying hosts and + * profile variables). + * + * NOTE: You should invoke saveEnv() before loading the package environment. + * This allows you to call loadEnv() after operations are done to restore + * the previous environment. + * + * <pre> + * [...] + * var previousEnv = getEnv(); + * loadPackageEnv(package); + * // do some actions + * loadEnv(previousEnv); + * </pre> + * + * @param packageNode The package definition to load the environment from + */ +function loadPackageEnv(packageNode) { + + // Array to store all variables found. + var variables = new Array(); + + // Host variables first... + variables = getHostsVariables(variables); + + // ...then profile variables... + variables = getProfileVariables(variables); + + // ...and lastly package variables. + variables = getPackageVariables(packageNode, variables); + + // Apply variables to environment. + for (var iVariable=0; iVariable < variables.length; iVariable++) { + var varDefinition = variables[iVariable]; + var variableKeys = varDefinition.keys().toArray(); + for (var iVarKey = 0; iVarKey < variableKeys.length; iVarKey++) { + var key = variableKeys[iVarKey]; + var value = varDefinition.Item(key); + dinfo("Setting variable: '" + key + "=" + value + "'."); + setEnv(key, value); + } + } +} + +/** + * Restores environment using the given dictionary object. + * Variables which are not defined within the dictionary object are unset. + * Variables which are defined within the dictionary object are set to the + * value defined in the dictionary object. + * @param environment + * Optionally specify a Scripting.Dictionary object which contains + * the environment to load. If null is passed loads the environment + * previously saved with parameter-less saveEnv(). + * @return Always returns true. + */ +function loadEnv(environment) { + // dinfo("Loading environment"); + if (environment == null) { + return true; + } + var success = true; + var procEnv = new ActiveXObject("WScript.Shell").Environment("Process"); + for(var e = new Enumerator(procEnv); !e.atEnd(); e.moveNext()) { + var env = e.item(e); + var splitEnv = env.split("=", 1); + var key = splitEnv[0]; + if (key != null && key != "") { + if (environment.Exists(key)) { + // dinfo("Setting environment variable '" + key + "' to value '" + environment(key) + "'."); + procEnv(key) = environment(key); + // yields warning in my IDE: + // procEnv.Remove(key); + // procEnv.add(key, environment.Item(key)); + } else { + procEnv.Remove(key); + } + } + } + return success; +} + +/** + * Parses Date according to ISO 8601. See <http://www.w3.org/TR/NOTE-datetime>. + * + * Generic format example: + * + * <pre> + * "YYYY-MM-DD hh:mm:ss" + * Valid date examples: + * (the following dates are all equal if ceil is set to false) + * "2007-11-23 22:00" (22:00 local time) + * "2007-11-23T22:00" (Both, "T" and space delimiter are allowed) + * "2007-11-23 22:00:00" (specifies seconds which default to 0 above) + * "2007-11-23 22:00:00.000" (specifies milliseconds which default to 0) + * It is allowed to specify the timezone as well: + * "2007-11-23 22:00+01:00" (22:00 CET) + * "2007-11-23 21:00Z" (21:00 UTC/GMT = 22:00 CET) + * "2007-11-23 22:00+00:00" (21:00 UTC/GMT = 22:00 CET) + * </pre> + * + * If 'ceil' is set to true then unspecified date components do not fall back + * to "floor" (basically 0) but will be extended to the next value. + * This allows easy comparison if the current date is within a parsed "!ceil" + * date and a parsed "ceil" date. + * + * Examples: + * <pre> + * ceil=false: + * "2007-11-23" => "2007-11-23 00:00:00" + * "2007-11" => "2007-11-01 00:00:00" + * ceil=true: + * "2007-11-23" => "2007-11-24 00:00:00" + * "2007-11" => "2007-12-01 00:00:00" + * </pre> + * + * so you can specify a range in the following format +* <pre> + * if (parseISODate("2007-11", !ceil) >= currentDate && + * parseISODate("2007-11", ceil) <= currentDate) { + * // this will be true for all dates within November 2007 + * ... + * } + * </pre> + * + * TIMEZONES: + * + * As specified by ISO 8601 the date is parsed as local date in case no + * time zone is specified. If you define a time zone then the specified time + * is parsed as local time for the given time zone. So if you specify + * "2007-11-23 22:00+05:00" this will be equal to "2007-11-23 18:00+01:00" while + * "+01:00" is known as CET as well. The special identifier "Z" is equal to + * "+00:00" time zone offset. + * + * Specifying an empty string as dateString is allowed and will results in + * returning the first of January 00:00 of the current year (ceil=false) or + * first of January 0:00 of the next year (ceil=true). + * + * @param dateString + * the string to be parsed as ISO 8601 date + * @param ceil + * defines if missing date components are "rounded-up" or "rounded + * down", see above + * @return Date object representing the specified date. Returns null if the + * date cannot be parsed. + */ +function parseISODate(dateString, ceil) { + // <YYYY>[-]<MM>[-]<DD>[T ]<hh>:<mm>:<ss>.<ms>[ + // make sure dateString is defined + var now = new Date(); + var dateStringValue = dateString; + if (dateStringValue == null) { + dateStringValue = now.getFullYear() + ""; + } + + // http://www.w3.org/TR/NOTE-datetime + var regexp = "([0-9]{4})(?:-?([0-9]{1,2})(?:-?([0-9]{1,2})" + + "(?:[T ]([0-9]{1,2}):([0-9]{1,2})(?::([0-9]{1,2})(?:\\.([0-9]{1,3}))?)?" + + "(?:(Z)|(?:([-+])([0-9]{1,2})(?::([0-9]{1,2}))?))?)?)?)?"; + + // execute matching + var matches = dateStringValue.match(new RegExp(regexp)); + + var ceilValue = ceil; + if (ceilValue == null) { + ceilValue = false; + } + + // create new date object using the year parsed + var date = new Date(now.getFullYear(), 0, 1); + if (matches[1]) { + date.setFullYear(matches[1]); + } else { + dinfo("Date '" + dateString + "' could not be parsed."); + return null; + } + /* + else if (ceilValue) { + date.setFullYear(date.getFullYear() + 1); + } */ + // parse months + if (matches[2]) { + date.setMonth(matches[2] - 1); + } else if (ceilValue) { + // month not defined, advance to next year + date.setFullYear(date.getFullYear() + 1); + ceilValue = false; + } + // parse days (of the month) + if (matches[3]) { + date.setDate(matches[3]); + } else if (ceilValue) { + // date (day of the month) not defined, advance to next month + date.setMonth(date.getMonth() + 1); + ceilValue = false; + } + // parse hours + if (matches[4]) { + date.setHours(matches[4]); + } else if (ceilValue) { + // hours not defined, advance to next day + date.setDate(date.getDate() + 1); + ceilValue = false; + } + // parse minutes + if (matches[5]) { + date.setMinutes(matches[5]); + } else if (ceilValue) { + // minutes not defined, advance to next hour + date.setHours(date.getHours() + 1); + ceilValue = false; + } + // parse seconds + if (matches[6]) { + date.setSeconds(matches[6]); + } else if (ceilValue) { + // seconds not defined, advance to next minute + date.setMinutes(date.getMinutes() + 1); + ceilValue = false; + } + // parse milliseconds + if (matches[7]) { + date.setMilliseconds(Number(matches[7])); + } else if (ceilValue) { + // milliseconds not defined, advance to next second + date.setSeconds(date.getSeconds() + 1); + ceilValue = false; + } + // parse timezone offset + var timeZoneSet = false; + if (matches[8] == "Z") { + matches[9] = 0; + matches[10] = 0; + timeZoneSet = true; + } + if (matches[9] || timeZoneSet) { + // if offset is specified, translate time to local time + var dateOffset = 0; + if (matches[11]) { + dateOffset = Number(matches[11]); + } + // convert to milliseconds + dateOffset += Number(matches[10]) * 60; + + // evaluate prefix + dateOffset *= (matches[9] == "+") ? 1 : -1; + + // calculate actual time + // get UTC representation of the specified date in milliseconds + time = Date.UTC(date.getFullYear(), + date.getMonth(), + date.getDate(), + date.getHours(), + date.getMinutes(), + date.getSeconds(), + date.getMilliseconds()); + + // subtract specified offset to get UTC representation of specified date + time -= dateOffset * 60 * 1000; + + // create new date object using the UTC time specified + date = new Date(time); + } + + return date; +} + +/** + * Reboots the system using tools\psshutdown.exe from the script execution + * directory. + */ +function psreboot() { + if (!isNoReboot() ) { + rebooting = true; + // RFL prefers shutdown tool to this method: allows user to cancel + // if required, but we loop for ever until they give in! + // get localized message + var msg = getLocalizedString("notifyUserReboot"); + if (msg == null) { + msg="Rebooting to complete software installation. Please note that "+ + "some software might not work until the machine is rebooted."; + } + // Overwrites global variable rebootcmd! + var rebootCmd = "tools\\psshutdown.exe"; + var fso = new ActiveXObject("Scripting.FileSystemObject"); + if (!fso.FileExists(rebootCmd)) { + var path = WScript.ScriptFullName; + var psBase = fso.GetParentFolderName(path); + rebootCmd = fso.BuildPath(psBase, rebootCmd); + if (!fso.FileExists(rebootCmd)) { + throw new Error("Could not locate rebootCmd '" + rebootCmd + "'."); + } + } + var shutdown=rebootCmd + " -r -accepteula "; + + cleanup(); + for (var iCountdown1 = 60; iCountdown1 != 0; iCountdown1 = iCountdown1-1) { + // This could be cancelled. + var cmd1 = shutdown + " -c -m \"" + msg + "\" -t " + iCountdown1; + info("Running a shutdown command: "+ cmd1); + exec(cmd1, 0, null); + WScript.Sleep(iCountdown1 * 1000); + } + // Hmm. We're still alive. Let's get more annoying. + for (var iCountdown2 = 60; iCountdown2 != 0; iCountdown2 = iCountdown2 - 3) { + var cmd2 = shutdown + " -m \"" + msg + "\" -t "+ iCountdown2; + info("Running a shutdown command: " + cmd2); + exec(cmd2, 0, null); + WScript.Sleep(iCountdown2 * 1000); + } + // And if we're here, there's problem. + notify("This machine needs to reboot."); + + } else { + info("System reboot was initiated but overridden."); + } + + exit(0); +} + +/** + * Reboots the system. + */ +function reboot() { + if (!isNoReboot() ) { + // set global var that all functions know that a reboot is in progress + rebooting = true; + switch (getRebootCmd()) { + case "standard": + var wmi = GetObject("winmgmts:{(Shutdown)}//./root/cimv2"); + var win = wmi.ExecQuery("select * from Win32_OperatingSystem where Primary=true"); + var e = new Enumerator(win); + + info("System reboot in progress!"); + + if (!isNoRunningState()) { + // Reset running state. + setRunningState("false"); + } + // make sure files are written + cleanup(); + for (; !e.atEnd(); e.moveNext()) { + var x = e.item(); + x.win32Shutdown(6); + } + exit(3010); + break; + case "special": + psreboot(); + break; + default: + var fso = new ActiveXObject("Scripting.FileSystemObject"); + if (!fso.FileExists(getRebootCmd())) { + var path = WScript.ScriptFullName; + var toolBase = fso.GetParentFolderName(path); + setRebootCmd(fso.BuildPath(toolBase, getRebootCmd())); + if (!fso.FileExists(getRebootCmd())) { + throw new Error("Could not locate rebootCmd '" + getRebootCmd() + "'."); + } + } + info("Running a shutdown command: " + getRebootCmd()); + // close files + cleanup(); + // execute shutdown + exec(getRebootCmd(), 0, null); + exit(3010); + break; + } + } else { + info("System reboot was initiated but overridden."); + } + + // exit with code "3010 << 8" (770560) which means 3010 shifted by 8 bits. + // exiting with code 3010 will make WPKG client to initiate a reboot + // which is unlikely to be expected because reboot command is overridden. + exit(3010 << 8); +} + +/** + * Fetches current environment and returns Scripting.Dictionary object + * containing current environment. + * @returns {ActiveXObject} Dictionary representing current environment. + */ +function getEnv() { + // dinfo("Fetching environment"); + var currentEnvironment = new ActiveXObject("Scripting.Dictionary"); + var procEnv = new ActiveXObject("WScript.Shell").Environment("Process"); + for(var e=new Enumerator(procEnv); !e.atEnd(); e.moveNext()) { + var env = e.item(e); + var envKey = env.split("=", 1); + var key = envKey[0]; + if (key != null && key != "") { + var valueStartOffset = key.length + 1; + currentEnvironment.add(envKey[0], env.substr(valueStartOffset)); + } + } + return currentEnvironment; +} + + +/** + * Set an environment variable in the current script environment. + * @param key Environment variable name. + * @param value Value to assign to the variable. + */ +function setEnv(key, value) { + if (key == null) { + dinfo("Cannot set environment variable: No key specified!"); + return; + } + if (value == null) { + dinfo("Cannot set environment variable '" + key + "': No value specified!"); + return; + } + + // Expand environment variables in variable definition. + var shell = new ActiveXObject("WScript.Shell"); + // Somehow an empty string is not accepted as string in set instruction below. + // So make sure value is of type string. + var valueExpanded = shell.ExpandEnvironmentStrings(value) + ""; + + // Fetch process environment. + var procEnv = new ActiveXObject("WScript.Shell").Environment("Process"); + + // Set environment. + procEnv(key) = valueExpanded; + + /* + if (procEnv.Exist(key)) { + procEnv.Remove(key); + } + procEnv.add(key, value); + */ +} + + +/** + * Scans uninstall list for given name. Uninstall list is placed in registry + * under HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall Every + * subkey represents package that can be uninstalled. Function checks each + * subkey for containing value named DisplayName. If this value exists, function + * returns true if nameSearched matches it. + * + * @param nameSearched + * The uninstall string to look for (as it appears within control + * panel => add/remove software) + * @return returns an array of registry paths to the uninstall entries found. An + * array is returned since the same software might be installed more + * than once (32-bit and 64-bit versions). Returns an empty array in + * case no uninstall entry could be located. + */ +function scanUninstallKeys(nameSearched) { + var uninstallPath = new Array(); + var scanKeys = new Array(); + scanKeys.push("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall"); + if (is64bit()) { + // scan redirected path as well (assures that 32-bit applications are + // found) + scanKeys.push("SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall"); + } + + // try regular expression matching + var regularExpression = true; + for (var i=0; i < scanKeys.length; i++) { + var regPath = scanKeys[i]; + /* + * recursive registry reading is very slow with WSH. Therefore supporting Sub-keys in uninstall entries slows + * down uninstall key scanning dramatically. So I leave it off for the moment. Please use registry key checks if + * you need to check an uninstall key defined within a sub-key of the uninstall registry location + */ + // var keyNames = getRegistrySubkeys(regPath, -1); + var keyNames = getRegistrySubkeys(regPath, 0); + /* + * for (var k=0; k < keyNames.length; k++) { dinfo("Uninstall key: " + keyNames[k]); } + */ + + for (var j=0; j < keyNames.length; j++) { + var registryPath = "HKLM\\" + regPath + "\\" + keyNames[j]; + var displayName = getRegistryValue(registryPath + "\\DisplayName"); + + if (displayName != null) { + // first try direct 1:1 matching + if (displayName == nameSearched) { + dinfo("Uninstall entry '" + displayName + + "' matches string '" + nameSearched + "'."); + uninstallPath.push(registryPath); + break; + } else if(regularExpression) { + try { + // try regular-expression matching + var displayNameRegExp = new RegExp("^" + nameSearched + "$"); + + if (displayNameRegExp.test(displayName) == true) { + dinfo("Uninstall entry '" + displayName + + "' matches expression '" + nameSearched+ "'."); + uninstallPath.push(registryPath); + break; + } + } catch (error) { + regularExpression = false; + dinfo("Unable to match uninstall key with regular expression. " + + "Usually this means that the string '" + nameSearched + + "'does not qualify as a regular expression: " + + error.description); + } + } + } + } + } + return uninstallPath; +} + +/** + * Scans the specified array for the specified element and returns true if + * found. + */ +function searchArray(array, element) { + for (var i=0; i < array.length; i++) { + var e = array[i]; + if (element == e) { + return true; + } + } + + return false; +} + +/** + * Removes leading / trailing spaces. + */ +function trim(string) { + if(string != null) { + return(string.replace(new RegExp("(^\\s+)|(\\s+$)"),"")); + } else { + return null; + } +} + +/** + * Removes leading zeroes from a string (does not touch trailing zeroes) + */ +function trimLeadingZeroes(string) { + if(string != null) { + return(string.replace(new RegExp("^[0]*"),"")); + } else { + return null; + } +} + +/** + * Remove duplicate items from an array. + */ +function uniqueArray(array) { + // Hold unique elements in a new array. + var newArray = new Array(); + + // Loop over elements. + for (var i = 0; i < array.length; i++) { + var found = false; + for (var j = 0; j < newArray.length; j++) { + if (array[i] == newArray[j]) { + found = true; + break; + } + } + + if (!found) { + newArray.push(array[i]); + } + } + + return newArray; +} + +/** + * versionCompare - compare two version strings. + * + * The algorithm is supposed to deliver "human" results. It's not just + * comparing numbers but also allows versions with characters. + * + * Some version number contain appendices to the version string indicating + * "volatile" versions like "pre releases". For example some packages use + * versions like "1.0RC1" or "1.0alpha2". Usually a version like "1.0RC1" would + * be considered to be newer than "1.0" by the algorithm but in case of "RC" + * versions this would be wrong. To handle such cases a number of strings are + * defined in order to define such volatile releases. + * + * The list of prefixes is defined in the global volatileReleaseMarker array. + * + * Valid comparisons include: + * <pre> + * A B Result + * "1" "2" B is newer + * "1" "15" B is newer + * "1.0" "1.2.b" B is newer + * "1.35" "1.35-2" B is newer + * "1.35-2" "1.36" B is newer + * "1.35R3" "1.36" B is newer + * "1" "1.0.00.0000" Versions are equal + * "1" "1.0" Versions are equal + * "1.35" "1.35-2" B is newer + * "1.35-2" "1.35" A is newer + * "1.35R3" "1.36R4" B is newer + * "1.35-2" "1.35-2.0" Versions are equal + * "1.35.1" "1.35.1.0" Versions are equal + * "1.3RC2" "1.3" B is newer (special case where A is an "RC" version) + * "1.5" "1.5I3656" A is newer (B is an "I"/integration version) + * "1.5" "1.5M3656" A is newer (B is an "M"/milestone version) + * "1.5" "1.5u3656" B is newer (B is an update version) + * </pre> + * + * @return 0 if equal,<br> + * -1 if a < b,<br> + * +1 if a > b + */ +function versionCompare(a, b) { + // first split the version into sub-versions separated by dots + // eg. "1.00.1b20-R0" => 1, 00, 1b20-R0 + // constants defining the return values + dinfo("Comparing version: '" + a + "' <=> '" + b + "'."); + var BNEWER = -1; + var ANEWER = 1; + var EQUAL = 0; + + // small optimization, in most cases the strings will be equal. + if (a == b) { + return EQUAL; + } + + var versionA = a.split("."); + var versionB = b.split("."); + var length = 0; + versionA.length >= versionB.length ? length = versionA.length : length = versionB.length; + var result = EQUAL; + + // split by sub-version-numbers + // e.g. 1b20-R0" => 1b20, R0 + for (var i = 0; i < length; i++) { + var versionPartsA = new Array(); + var versionPartsB = new Array(); + var partsSplitter = new RegExp("[^0-9a-zA-Z]"); + if( i < versionA.length ) { + versionPartsA = versionA[i].split(partsSplitter); + } else { + // there is no such part on A side + // assume 0 + versionPartsA.push(0); + } + if( i < versionB.length ) { + versionPartsB = versionB[i].split(partsSplitter); + } else { + // there is no such part on B side + // assume 0 + versionPartsB.push(0); + } + var versionParts = 0; + versionPartsA.length > versionPartsB.length ? versionParts = versionPartsA.length : versionParts = versionPartsB.length; + + // split these parts into char/number fields + // e.g "1b20" => 1, b, 20 + for (var j = 0; j < versionParts; j++) { + // get A-side version part + var versionPartA; + if( j < versionPartsA.length ) { + versionPartA = "" + versionPartsA[j]; + } else { + // A does not have such a part, so B seems to be a higher + // revision + result = BNEWER; + break; + } + // get B-side version part + var versionPartB; + if( j < versionPartsB.length ) { + versionPartB = "" + versionPartsB[j]; + } else { + // B does not have such a part, so A seems to be a higher + // revision + result = ANEWER; + break; + } + + // both versions have such a part, compare them + dinfo("Comparing version fragments: '" + versionPartA + "' <=> '" + versionPartB + "'"); + + // first split the part into number/character parts + var numCharSplitter = new RegExp("([0-9]+)|([a-zA-Z]+)", "g"); + var numCharPartsA = versionPartA.match(numCharSplitter); + var numCharPartsB = versionPartB.match(numCharSplitter); + var numCharLength = 0; + numCharPartsA.length > numCharPartsB.length ? numCharLength = numCharPartsA.length : numCharLength = numCharPartsB.length; + // now start comparing the parts + for (var k = 0; k < numCharLength; k++) { + var numCharPartA; + var numCharPartB; + // get A-side + if( k < numCharPartsA.length ) { + numCharPartA = numCharPartsA[k]; + } else { + // A-side does not have such a part, so B seems to be either + // a higher revision or appends a volatile version + // identifier + var bSideString = numCharPartsB[k]; + // check if it matches one from the volatile list + for (var vId = 0; vId < volatileReleaseMarkers.length; vId++) { + if (bSideString.toLowerCase() == volatileReleaseMarkers[vId]) { + dinfo("Special case: '" + a + "' is newer because '" + b + "' " + + "is considered to have a volatile version appendix (" + + volatileReleaseMarkers[vId] + ")."); + result = ANEWER; + break; + } + } + if (result == EQUAL) { + // B is newer + result = BNEWER; + } + break; + } + if( k < numCharPartsB.length ) { + numCharPartB = numCharPartsB[k]; + } else { + // B-side does not have such a part, so A seems to be either + // a higher revision or appends a volatile version + // identifier + var aSideString = numCharPartsA[k]; + // check if it matches one from the volatile list + for (var volId = 0; volId < volatileReleaseMarkers.length; volId++) { + if (aSideString.toLowerCase() == volatileReleaseMarkers[volId]) { + dinfo("Special case: '" + a + "' is newer because '" + b + "' " + + "is considered to have a volatile version appendix (" + + volatileReleaseMarkers[volId] + ")."); + result = BNEWER; + break; + } + } + if (result == EQUAL) { + result = ANEWER; + } + break; + } + + // both versions have such a part, compare them + // strip off leading zeroes first + var stripExpression = new RegExp("^[0 \t]*(.+)$"); + var strippedA = numCharPartA.match(stripExpression); + numCharPartA = strippedA[1]; + + var strippedB = numCharPartB.match(stripExpression); + numCharPartB = strippedB[1]; + + var numCharSplitA = numCharPartA.split(""); + var numCharSplitB = numCharPartB.split(""); + if (numCharSplitB.length > numCharSplitA.length) { + // version B seems to be higher + result = BNEWER; + break; + } else if (numCharSplitA.length > numCharSplitB.length) { + // version a seems to be higher + result = ANEWER; + break; + } + + // both versions seem to have equal length, compare them + for (var l = 0; l < numCharSplitA.length; l++) { + var characterA = numCharSplitA[l]; + var characterB = numCharSplitB[l]; + if (characterB > characterA) { + // B seems to be newer + result = BNEWER; + break; + } else if( characterA > characterB) { + // A seems to be newer + result = ANEWER; + break; + } + } + + // stop evaluating + if(result != EQUAL) { + break; + } + } + + // stop evaluating + if(result != EQUAL) { + break; + } + } + + // stop evaluating + if(result != EQUAL) { + break; + } + } + + return result; +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/posttemplates/05-wpkg b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/posttemplates/05-wpkg new file mode 100644 index 0000000000000000000000000000000000000000..e8c745e94c169834bd3d4e2fc2b027f7056bcea5 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/posttemplates/05-wpkg @@ -0,0 +1,27 @@ +#!/bin/bash + +if [ ! -e /home/wpkg/hosts.xml ]; then + cat > /home/wpkg/hosts.xml <<EOF +<?xml version="1.0" encoding="UTF-8"?> +<wpkg> +<host /> +</wpkg> +EOF +fi + +if [ ! -e /home/wpkg/profiles.xml ]; then + cat > /home/wpkg/profiles.xml <<EOF +<?xml version="1.0" encoding="UTF-8"?> +<profiles> + <profile/> +</profiles> +EOF +fi + +if [ ! -d /home/wpkg/profiles ]; then + #WPKG n'a jamais été utilisé => initialisation des droits + #Ensuite, ne plus y toucher pour .EtatsClients (rapports WPKG) + mkdir -p /home/wpkg/profiles + chmod -R 755 /home/wpkg + getfacl --access --absolute-names /home/wpkg|setfacl -d -RM - /home/wpkg +fi diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..697e2ebd8f2f44c551750afd28c4f49895e393f0 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/service.yml @@ -0,0 +1,82 @@ +format: '0.1' +name: eole-wpkg +version: |- + 2.6.0-1 +description: |- + Configuration et Scripts WPKG pour les modules EOLE + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: [] +packages: + - creole +dictionaries: + - 20_wpkg_client.xml + - 20_wpkg.xml +extra_dictionaries: {} +templates: + - wpkg-gp_update_conf.bat + - wpkg-gp.ini + - wpkg.conf + - preinstall.bat + - config.xml + - settings.xml + - wpkg-gp_install.bat + - wpkg_client_install.bat + - wpkg_client_update_conf.bat +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: + - 05-wpkg +files: + /home/wpkg/wpkg.js: + owner: root + group: root + mode: '0644' + /home/wpkg/bureau-menu_demarrer.reg: + owner: root + group: root + mode: '0755' + /home/wpkg/packages.xml: + owner: root + group: root + mode: '0644' + /home/wpkg/documents/CHANGES: + owner: root + group: root + mode: '0644' + /home/wpkg/documents/CONTRIBUTORS: + owner: root + group: root + mode: '0644' + /home/wpkg/documents/Changelog: + owner: root + group: root + mode: '0644' + /home/wpkg/documents/INSTALL: + owner: root + group: root + mode: '0644' + /home/wpkg/documents/GPL-2: + owner: root + group: root + mode: '0644' + /home/wpkg/documents/README: + owner: root + group: root + mode: '0644' + /home/wpkg/documents/LICENSE: + owner: root + group: root + mode: '0644' + /home/wpkg/tools/restart_wpkg.bat: + owner: root + group: root + mode: '0644' + /home/wpkg/tools/postinstall.bat: + owner: root + group: root + mode: '0644' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/templates/config.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/templates/config.xml new file mode 100644 index 0000000000000000000000000000000000000000..2180b11fb785c3c4c47dddd90b1e0b20b1dae9ad --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/templates/config.xml @@ -0,0 +1,647 @@ +<?xml version="1.0" encoding="utf-8" ?> +%set %%truefalse={'oui': 'true', 'non':'false', 'true': 'true', 'false': 'false'} +<!-- + ******************************************************************************* + * This is the WPKG configuration file. + * Place it within the same directory as you place wpkg.js. + * All parameters are optional. If not specified WPKG falls back to the default + * values. So it's recommended just to uncomment the values you like to change. + ******************************************************************************* +--> + +<config> + <!-- + ******************************************************************************* + * + * If you use wpkg_web, you can set wpkg_base to the base URL of your + * WPKG_Web installation. NO TRAILING SLASH (/). This will allow WPKG to + * use the web generated XML file and not require further XML Exports to the + * file system. + * + * Examples: + * <param name='wpkg_base' value='http://wpkg.mydomain.com' /> + * <param name='wpkg_base' value='http://www.mydomain.com/wpkg_web' /> + * <param name='wpkg_base' value='http://USER:PASS@wpkg.mydomain.com' /> + * + * NOTE: Replace USER and PASS with the required credentials to access your + * installation. Configure this user in config.php for WPKG_Web + * version 1.1.0 and greater. + * + * NOTE: If you would like to use the flat XML file instead of the web based + * method, leave the variable declaration as followed: + * <param name='wpkg_base' value='' /> + * + * Default value : '' + * Command-line switch: /base:<base-url> + ****************************************************************************** + --> + <!-- + <param name='wpkg_base' value='http://wpkg:secret@wpkg.mydomain.com' /> + --> + <!-- + <param name='wpkg_base' value='' /> + --> +%if %%wpkg_wpkg_base != None + <param name='wpkg_base' value='%%wpkg_wpkg_base' /> +%end if + + <!-- + **************************************************************************** + * True : Do not consider wpkg.xml but check existence of packages. + * False: Do not force re-detection. Use wpkg.xml to detect current package + * status + * + * Default value : false + * Command-line switch: /force + **************************************************************************** + --> + <!-- + <param name='force' value='false' /> + --> + <param name='force' value='%%truefalse[%%wpkg_force]' /> + + + <!-- + **************************************************************************** + * True : Force installation over existing packages. + * False: Skip package installation if package is already installed. + * + * Default value : false + * Command-line switch: /forceinstall + **************************************************************************** + --> + <!-- + <param name='forceInstall' value='false' /> + --> + <param name='forceInstall' value='%%truefalse[%%wpkg_forceInstall]' /> + + + <!-- + **************************************************************************** + * True : Force the script to immediately quit on error. + * False: Errors are logged but WPKG continues processing. + * + * Default value : false + * Command-line switch: /quitonerror + **************************************************************************** + --> + <!-- + <param name='quitonerror' value='false' /> + --> + <param name='quitonerror' value='%%truefalse[%%wpkg_quitonerror]' /> + + + + <!-- + **************************************************************************** + * True : Enable debug mode. Prints lots of ugly debug messages to event log. + * False: Disable debug logging to event log. + * + * NOTE: This flag is independent from the log level setting. So you can even + * enable debug logging to log files without setting this flag to true + * which prevents your event log to be flooded. + * + * Default value : false + * Command-line switch: /debug + **************************************************************************** + --> + <!-- + <param name='debug' value='false' /> + --> + <param name='debug' value='%%truefalse[%%wpkg_debug]' /> + + + <!-- + **************************************************************************** + * True : Enable dryrun mode. Does not apply any changes to the system. + * Enables debug output and disables reboot. + * False: Apply changes to the system. + * + * Default value : false + * Command-line switch: /dryrun + **************************************************************************** + --> + <!-- + <param name='dryrun' value='false' /> + --> + <param name='dryrun' value='%%truefalse[%%wpkg_dryrun]' /> + + + <!-- + **************************************************************************** + * Should be set to true in case of unattended run (WPKG service). + * + * True : Disable all log messages printed to the console (cscript) or + * displayed as dialog boxes (wscript). + * False: Alerts the user about ongoing activity using windows messaging. + * + * Default value : false + * Command-line switch: /quiet + **************************************************************************** + --> + <!-- + <param name='quiet' value='false' /> + --> + <param name='quiet' value='%%truefalse[%%wpkg_quiet]' /> + + + <!-- + **************************************************************************** + * True : Disable user notification about WPKG actions using windows messaging. + * Should be set to true in case of unattended run (WPKG service) + * False: Alerts the user about ongoing activity using windows messaging. + * + * Default value : false + * Command-line switch: /nonotify + **************************************************************************** + --> + <!-- + <param name='nonotify' value='false' /> + --> + <param name='nonotify' value='%%truefalse[%%wpkg_nonotify]' /> + + + <!-- + **************************************************************************** + * Defines how long a user notification is displayed to the user. After + * timeout has been reached the message will be closed. Specify 0 in order to + * specify that messages are never closed automatically. + * Note: This only works on Windows Vista or newer where msg.exe is + * available. + * + * Default value : 10 + * Command-line switch: - + **************************************************************************** + --> + <!-- + <param name='notificationDisplayTime' value='10' /> + --> + <param name='notificationDisplayTime' value='%%wpkg_notificationDisplayTime' /> + + + <!-- + **************************************************************************** + * True : System does not reboot regardless of need. + * False: Reboot the system as specified by packages. + * + * Default value : false + * Command-line switch: /noreboot + **************************************************************************** + --> + <!-- + <param name='noreboot' value='false' /> + --> + <param name='noreboot' value='%%truefalse[%%wpkg_noreboot]' /> + + + <!-- + **************************************************************************** + * True : Disable export of running state to Windows registry at + * HKCU\Software\WPKG\running + * False: Export running state to Windows registry at HKCU\Software\WPKG\running + * + * Default value : false + * Command-line switch: /norunningstate + **************************************************************************** + --> + <!-- + <param name='noRunningState' value='false' /> + --> + <param name='noRunningState' value='%%truefalse[%%wpkg_noRunningState]' /> + + + <!-- + **************************************************************************** + * True : Matching of package and profile IDs is case sensitive. + * False: Disable case sensitivity for package and profile IDs. + * WPKG will consider the package ID "SomePackage" and "SoMePaCkAgE" + * the same. + * + * Default value : true + * Command-line switch: /ignoreCase + **************************************************************************** + --> + <!-- + <param name='caseSensitivity' value='true' /> + --> + <param name='caseSensitivity' value='%%truefalse[%%wpkg_caseSensitivity]' /> + + + <!-- + **************************************************************************** + * Use the specified command for rebooting, either with full path or relative + * to the location of wpkg.js. + * Setting rebootCmd to "special" will use tools\psshutdown.exe from + * from www.sysinternals.com - if it exists + * Any other value will make WPKG to try executing the command specified as + * <command> and then exit with code 3010. + * + * Default value : "standard" + * Command-line switch: /rebootcmd:<command> + **************************************************************************** + --> + <!-- + <param name='rebootCmd' value='standard' /> + --> +%if %%wpkg_rebootCmd != 'standard' + <param name='rebootCmd' value='%%wpkg_rebootCmd' /> +%end if + + + <!-- + **************************************************************************** + * Filename of the local package database (client-side) stored at + * %SystemRoot%\system32 by default (see settings_file_path) + * + * Default value : "wpkg.xml" + * Command-line switch: - + **************************************************************************** + --> + <!-- + <param name='settings_file_name' value='wpkg.xml' /> + --> +%if %%wpkg_settings_file_name != 'wpkg.xml' + <param name='settings_file_name' value='%%wpkg_settings_file_name' /> +%end if + + + <!-- + **************************************************************************** + * Path to the local package database (client-side). It is strongly suggested + * to NOT set this parameter at all if not required. + * Only change this parameter if you really know what you're doing. + * + * Default value : "%SystemRoot%\\system32" + * Command-line switch: - + **************************************************************************** + --> + <!-- + <param name='settings_file_path' value='%SystemRoot%\\system32' /> + --> +%if %%wpkg_settings_file_path != '%SystemRoot%\\\\system32' + <param name='settings_file_path' value='%%wpkg_settings_file_path' /> +%end if + + + <!-- + **************************************************************************** + * True : Disable forced removal of packages if they are removed from the + * profile AND the package database. + * NOTE: A client might continuously try to uninstall a package if an + * uninstall command fails. + * False: + * + * Default value : false + * Command-line switch: /noforcedremove + **************************************************************************** + --> + <!-- + <param name='noForcedRemove' value='false' /> + --> + <param name='noForcedRemove' value='%%truefalse[%%wpkg_noForcedRemove]' /> + + + <!-- + **************************************************************************** + * True : Allows to disable removing of packages. If used in conjunction with + * the /synchronize parameter it will just add packages but never remove + * them. Instead of removing a list of packages which would have been + * removed during that session is printed on exit. Packages are not + * removed from the local settings database (wpkg.xml). Therefore it + * will contain a list of all packages ever installed. + * NOTE: Each package which is requested to be removed (manually or by + * a synchronization request) will be checked for its state by executing + * its included package checks. If the package has been removed manually + * it will also be removed from the settings database. Due to the fact + * that packages whithout checks always return 'false' for during the + * install-status check these packages will disappear from the local + * wpkg.xml. + * False: Remove packages from the system if they are not listed within the + * profile any more. + * + * Default value : false + * Command-line switch: /noremove + **************************************************************************** + --> + <!-- + <param name='noRemove' value='false' /> + --> + <param name='noRemove' value='%%truefalse[%%wpkg_noRemove]' /> + + + <!-- + **************************************************************************** + * Controls weather WPKG prints some information about its progress to + * STDOUT. This output can be read by another program (GUI) to display some + * progress bar or additional status information to the user. + * + * True : Enable status output on STDOUT. + * False: Disable status output on STDOUT. + * + * Default value : false + * Command-line switch: /sendStatus + **************************************************************************** + --> + <!-- + <param name='sendStatus' value='false' /> + --> + <param name='sendStatus' value='%%truefalse[%%wpkg_sendStatus]' /> + + + <!-- + **************************************************************************** + * Usually WPKG upgrades a package to the latest available version before it + * removes the package. This allows administrators to fix bugs in the package + * and assure proper removal. + * However this feature can lead to (sometimes unexpected) re-execution of + * packages. For example if execution=always is used the package will run + * once again before it is finally removed. + * It's advised to leave this option on default unless you really know what + * you're doing. + * + * True : Disables the upgrade-before-remove feature + * False: Leave the upgrade-before-remove feature enabled + * + * Default value : false + * Command-line switch: /noUpgradeBeforeRemove + **************************************************************************** + --> + <!-- + <param name='noUpgradeBeforeRemove' value='false' /> + --> + <param name='noUpgradeBeforeRemove' value='%%truefalse[%%wpkg_noUpgradeBeforeRemove]' /> + + + <!-- + **************************************************************************** + * Marks volatile releases and "inverts" the algorithm that a longer + * version number is newer. For example 1.0RC2 would be newer than 1.0 because + * it appends characters to the version. Using "rc" as a volatile release + * marker the algorithm ignores the appendix and assumes that the string which + * omits the marker is newer. + * Resulting in 1.0 to be treated as newer than 1.0RC2. + * Caution: Be careful defining volatile release markers because it could have + * undesired effects. For example specifying "b" would also make 1.0b5 appear + * to be older than 1.0 (where "b" is usually a build number appended to the + * version). + * So please change this parameter only if you really know what you're doing. + * + * Currently the built-in list contains the following appendices: + * "rc", "i", "m", "alpha", "beta", "pre", "prerelease" + * + * The parameter might be defined as many times as you like. Each entry will + * add another entry to the list of volatile version markers. + * + * Default value : [built-in] + * Command-line switch: - + **************************************************************************** + --> + <!-- + <param name='volatileReleaseMarker' value='gamma' /> + <param name='volatileReleaseMarker' value='delta' /> + <param name='volatileReleaseMarker' value='testing' /> + --> +%if %%wpkg_volatileReleaseMarker != '[built-in]' + <param name='volatileReleaseMarker' value='%%wpkg_volatileReleaseMarker' /> +%end if + + <!-- + **************************************************************************** + **************************************************************************** + * + * Logging properties + * + **************************************************************************** + **************************************************************************** + --> + <!-- + **************************************************************************** + * Specifies if the log file should be appended or overwritten. + * + * True : Log files are appended instead of overwritten. Please note that + * log files could grow quite large if debug level logging is enabled. + * Depending on the pattern (date and time used) a new log file might + * be written on each run. + * False: Log files are overwritten on each run. This is the default setting + * and it is aimed for the target to keep only the log of the most + * recent WPKG run. + * + * Default value : false + * Command-line switch: /logAppend + **************************************************************************** + --> + <!-- + <param name='logAppend' value='false' /> + --> + <param name='logAppend' value='%%truefalse[%%wpkg_logAppend]' /> + + + <!-- + **************************************************************************** + * Log level is defined as a bitmask. Just sum up the values of each log + * severity you would like to include within the log file and add this value + * to your config.xml or specify it at /logLevel:<num>. + * Specify 0 to disable logging. + * 1: log errors only + * 2: log warnings + * 4: log information + * 8: log audit success + * 16: log audit failure + * + * Examples: + * 31 log everything (1+2+4+8+16=31) + * 13 log errors, information and audit success (1+4+8=13) + * 3 log errors and warnings only (1+2=3) + * + * Default value : "0xFF" + * Command-line switch: /logLevel:<level> + **************************************************************************** + --> + <!-- + <param name='logLevel' value='0xFF' /> + --> +%if %%wpkg_logLevel != '0xFF' + <param name='logLevel' value='%%wpkg_logLevel' /> +%end if + + <!-- + **************************************************************************** + * Path where the logfiles are written to. This might be an UNC path on the + * network as well as a local path. Environment variables are expanded. + * + * Examples: + * <param name='log_file_path' value='%TEMP%' /> + * <param name='log_file_path' value='\\\\server\\share\\dir' /> + * + * Default value : "%TEMP%" + * Command-line switch: /log_file_path:<path> + **************************************************************************** + --> + <!-- + <param name='log_file_path' value='%TEMP%' /> + --> +%if %%wpkg_log_file_path != '%TEMP%' + <param name='log_file_path' value='%%wpkg_log_file_path' /> +%end if + + + <!-- + **************************************************************************** + * Pattern to generate the log file name. + * Recognized patterns: + * [HOSTNAME] replaced by the executing hostname + * [PROFILE] replaced by the applying profile name + * [YYYY] replaced by year (4 digits) + * [MM] replaced by month number (2 digits) + * [DD] replaced by the day of the month (2 digits) + * [hh] replaced by hour of the day (24h format, 2 digits) + * [mm] replaced by minutes (2 digits) + * [ss] replaced by seconds (2 digits) + * + * Examples: + * "wpkg-[YYYY]-[MM]-[DD]-[HOSTNAME].log" results in a name like + * "wpkg-2007-11-04-myhost.log" + * + * NOTE: Using [PROFILE] causes all log messages from before reading + * profiles.xml to be temporarily written to the local %TEMP% folder. + * So they might appear on the final log file with some delay. + * + * NOTE: The default pattern allows tracing of last execution without polluting + * the log directory. Subsequent executions will overwrite the same log + * file. + * + * Default value : "wpkg-[HOSTNAME].log" + * Command-line switch: /logfilePattern:<pattern> + **************************************************************************** + --> + <!-- + <param name='logfilePattern' value='wpkg-[HOSTNAME].log' /> + --> +%if %%wpkg_logfilePattern != 'wpkg-[HOSTNAME].log' + <param name='logfilePattern' value='%%wpkg_logfilePattern' /> +%end if + + + <!-- + **************************************************************************** + **************************************************************************** + * + * Path properties + * + **************************************************************************** + **************************************************************************** + --> + <!-- + **************************************************************************** + * Names of the the XML input files. Not used if base begins with "http" + **************************************************************************** + --> + <!-- + <param name='packages_file_name' value='packages.xml' /> + <param name='profiles_file_name' value='profiles.xml' /> + <param name='hosts_file_name' value='hosts.xml' /> + --> +%if %%wpkg_packages_file_name != 'packages.xml' + <param name='packages_file_name' value='%%wpkg_packages_file_name' /> +%end if +%if %%wpkg_profiles_file_name != 'profiles.xml' + <param name='profiles_file_name' value='%%wpkg_profiles_file_name' /> +%end if +%if %%wpkg_hosts_file_name != 'hosts.xml' + <param name='hosts_file_name' value='%%wpkg_hosts_file_name' /> +%end if + + <!-- + **************************************************************************** + * Names of the PHP scripts which output the XML files. Only used if + * base begins with "http" + **************************************************************************** + --> + <!-- + <param name='web_packages_file_name' value='packages_xml_out.php' /> + <param name='web_profiles_file_name' value='profiles_xml_out.php' /> + <param name='web_hosts_file_name' value='hosts_xml_out.php' /> + --> +%if %%wpkg_web_packages_file_name != 'packages_xml_out.php' + <param name='web_packages_file_name' value='%%wpkg_web_packages_file_name' /> +%end if +%if %%wpkg_web_profiles_file_name != 'profiles_xml_out.php' + <param name='web_profiles_file_name' value='%%wpkg_web_profiles_file_name' /> +%end if +%if %%wpkg_web_hosts_file_name != 'hosts_xml_out.php' + <param name='web_hosts_file_name' value='%%wpkg_web_hosts_file_name' /> +%end if + + <!-- + **************************************************************************** + * Registry paths + **************************************************************************** + --> + <!-- + <param name='sRegPath' value='SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall' /> + <param name='sRegWPKG_Running' value='HKLM\\Software\\WPKG\\running' /> + --> +%if %%wpkg_sRegPath != 'SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Uninstall' + <param name='sRegPath' value='%%wpkg_sRegPath' /> +%end if +%if %%wpkg_sRegWPKG_Running != 'HKLM\\\\Software\\\\WPKG\\\\running' + <param name='sRegWPKG_Running' value='%%wpkg_sRegWPKG_Running' /> +%end if + + + <!-- + **************************************************************************** + **************************************************************************** + * Language definitions + * + * Defines language specific strings. Insert languages as you wish. Multiple + * LCID codes might be handled by one language definition. Just separate them + * by comma. A full list of LCIDs might be found at: + * http://www.microsoft.com/globaldev/reference/lcid-all.mspx + * + * This is entirely optional. If a message is not defined here the script + * will just print a built-in english message. + * + * Please note that the message has a maximum of 256 characters on Windows + * Vista and newer operating systems due to limitation of the messaging + * system. Longer messages will result in no message being displayed at all. + * + **************************************************************************** + **************************************************************************** + --> + <languages> + <!-- english LCIDs --> + <language lcid="409,809,c09,2809,1009,2409,3c09,4009,3c09,4009,3809,1809,2009,4409,1409,3409,4809,1c09,2c09,3009"> + <!-- <string id="notifyUserStart">The automated software installation utility has or is currently applying software updates to your system. Please check the time shown at the beginning of this message to determine if it is out of date. If not, please save all your open documents, as the system might require a reboot. If so, the system will be rebooted with no warning when installation is complete. Thank you.</string> --> + <string id="notifyUserStart">Automatic software deployment is currently updating your system. Plase safe all your documents as the the system might reboot without further notice. Thank you.</string> + <string id="notifyUserStop">The automated software installation utility has completed installing or updating software on your system. No reboot was necessary. All updates are complete.</string> + <string id="notifyUserFail">The software installation has failed.</string> + <string id="notifyUserReboot">Rebooting to complete software installation. Please note that some software might not work until the machine is rebooted.</string> + </language> + + <!-- french LCIDs --> + <language lcid="40c,80c,2c0c,c0c,240c,300c,3c0c,140c,340c,180c,380c,e40c,200c,280c,100c,1c0c"> + <string id="notifyUserStart">WPKG, l'utilitaire d'installation automatique des programmes a appliqué ou applique en ce moment des mises à jour à votre système. Veuillez consulter l'heure au début de ce message afin de vérifier que cette information ne soit pas obsolète. Veuillez sauvegarder tous vos documents ouverts, car un redémarrage peut être nécessaire et, dans ce cas, le système redémarrera sans avertissement à la fin de l'installation ou de la mise à jour. Merci.</string> + <string id="notifyUserStop">WPKG, l'utilitaire d'installation automatique de logiciels a terminé l'installation ou l'actualisation des logiciels sur votre système. Aucun redémarrage n'était requis. Toutes les mises à jour sont achevées.</string> + <string id="notifyUserFail">L'installation des logiciels est échoué.</string> + <string id="notifyUserReboot">Un rédémarrage est nécessaire pour compléter l'installation ou la mise à jour. Veuillez noter que les programmes nouveaux/actualisées peuvent ne pas fonctionner avant redémarrage du système.</string> + </language> + + <!-- german LCIDs --> + <language lcid="407,c07,1407,1007,807"> + <!-- <string id="notifyUserStart">Das WPKG Software-Installationstool installiert oder aktualisiert gerade Software auf Ihrem System. Bitte die Zeit am Anfang der Nachricht kontrollieren, ggf. ist dieser Hinweis veraltet. Wenn nicht: Speichern Sie bitte alle Ihre offenen Dokumente, da ein Neustart notwendig werden kann. Das System wird ohne weitere Warnung neu starten, wenn die Installation oder Aktualisierung beendet wurde. Danke.</string> --> + <string id="notifyUserStart">Die automatische Software-Verteilung läuft gerade. Bitte speichern sie ihre offenen Dokuemnte weil das System unter Umständen ohne weitere Warnung neu startet. Danke.</string> + <string id="notifyUserStop">Das WPKG Software-Installationstool hat die Installation oder Aktualisierung von Software auf Ihrem System beendet. Es war kein Neustart notwendig. Alle Updates sind komplett.</string> + <string id="notifyUserFail">Die Software-Installation ist fehlgeschlagen.</string> + <string id="notifyUserReboot">Neustart zum Abschliessen der Installation. Bitte beachten: Die neu installierte/aktualisierte Software funktioniert ggf. erst nach einem Neustart.</string> + </language> + + <!-- italian LCIDs --> + <language lcid="410,810"> + <string id="notifyUserStart">L'utilità di installazione automatica del software sta aggiornando il sistema. Verifica la marcatura temporale di questa segnalazione per capire se c'è qualche problema. Se tutto è a posto, salva e chiudi tutte le applicazioni aperte, perchè potrebbe essere necessario un riavvio. Se necessario, il sistema verrà infatti riavviato senza alcun preavviso. Grazie.</string> + <string id="notifyUserStop">L'utilità di installazione automatica del software ha terminato di aggiornare il sistema. Non si è reso necessario un riavvio. Tutti gli aggiornamenti sono andati a buon fine.</string> + <string id="notifyUserFail">Qualcosa nell'aggiornamento del sistema è fallito.</string> + <string id="notifyUserReboot">Riavvia per completare l'aggiornamento del sistema. Qualche programma potrebbe non funzionare correttamente senza un riavvio.</string> + </language> + </languages> +</config> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/templates/preinstall.bat b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/templates/preinstall.bat new file mode 100644 index 0000000000000000000000000000000000000000..e49fd7f9e9c35937fc6c6174f749e450e26e770c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/templates/preinstall.bat @@ -0,0 +1,9 @@ +rem remet les chemins par defaut avant l'installation +regedit /E %WINDIR%\sauv_menu-dem.reg "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" +regedit /E %WINDIR%\sauv_menu-dem2.reg "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" +%if %%mode_conteneur_actif == 'non' +set ip-scribe=%%adresse_ip_eth0 +%else +set ip-scribe=%%adresse_ip_fichier_link +%end if +regedit /S "\\\%ip-scribe%\wpkg\bureau-menu_demarrer.reg" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/templates/settings.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/templates/settings.xml new file mode 100644 index 0000000000000000000000000000000000000000..4e5234ac54ddb97b88d059957d6a1d882472f2fe --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/templates/settings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<configuration> + <file>%%wpkgcli_file</file> + <net-use-machine-account>%%wpkgcli_net_use_machine_account</net-use-machine-account> + <path-user>%%wpkgcli_path_user</path-user> + <path-password>%%wpkg_crypt(%%wpkgcli_path_password)</path-password> + <exec-user>%%wpkgcli_exec_user</exec-user> + <exec-password>%%wpkg_crypt(%%wpkgcli_exec_password)</exec-password> + <parameters>%%wpkgcli_parameters</parameters> + <silent>%%wpkgcli_silent</silent> + <pre-action>%%wpkgcli_pre_action</pre-action> + <post-action>%%wpkgcli_post_action</post-action> + <show-GUI>%%wpkgcli_show_GUI</show-GUI> + <logon-delay>%%wpkgcli_logon_delay</logon-delay> + <logon-message-title>%%wpkgcli_logon_message_title</logon-message-title> + <logon-message-logo-picture>%%wpkgcli_logon_message_logo_picture</logon-message-logo-picture> + <logon-message-1>%%wpkgcli_logon_message_1</logon-message-1> + <logon-message-2>%%wpkgcli_logon_message_2</logon-message-2> +%for %%script in %%wpkgcli_script_variable_name + <script-variable name="%%script">%%script.wpkgcli_script_variable_val</script-variable> +%end for + <priority>%%wpkgcli_priority</priority> + <stop-service-after-done>%%wpkgcli_stop_service_after_done</stop-service-after-done> + <laptop-mode>%%wpkgcli_laptop_mode</laptop-mode> + <server-connecting-method>%%wpkgcli_server_connecting_method</server-connecting-method> + <server-connecting-ip>%%wpkgcli_server_connecting_ip</server-connecting-ip> + <server-connecting-timeout>%%wpkgcli_server_connecting_timeout</server-connecting-timeout> + <server-connecting-script-timeout>%%wpkgcli_server_connecting_script_timeout</server-connecting-script-timeout> + <server-connecting-script-file>%%wpkgcli_server_connecting_script_file</server-connecting-script-file> + <log-file>%%wpkgcli_log_file</log-file> + <run-on-shutdown>%%wpkgcli_run_on_shutdown</run-on-shutdown> + <shutdown-delay>%%wpkgcli_shutdown_delay</shutdown-delay> + <logon-interrupt-password>%%wpkg_crypt(%%wpkgcli_logon_interrupt_password)</logon-interrupt-password> +</configuration> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/templates/wpkg-gp.ini b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/templates/wpkg-gp.ini new file mode 100644 index 0000000000000000000000000000000000000000..365fbdf9b79c4345f4619fbf0c47c9c2d36ffa1b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/templates/wpkg-gp.ini @@ -0,0 +1,83 @@ +[WpkgConfig] +# If you want Wpkg-GP to run from local group policies, e.g. execute +# without you configuring anything on the servers, set this to 1 +# Default: 1 +# Alternatives: 0 | 1 +EnableViaLGP =1 + +# If you want the settings configured in this config file to override +# any settings set through the Group Policy administrative template for +# Wpkg-GP, and deployed through Group Policies, set this to 1 +IgnoreGroupPolicy = 0 + +# Do not execute Wpkg-GP at bootup. Other methods of executing will still work. +# Default: 0 +# Alternatives: 0 | 1 +DisableAtBootUp = 0 + +# The path to your wpkg.js here +# This setting is required +WpkgCommand = %%wpkgcli_file + +# The log level (a value between 0 and 3) +WpkgVerbosity = 1 + +# The user name WPKG will use for connecting to the network +# Default: Not set +# Example: CONTOSO\InstallUser +WpkgNetworkUsername = + +# The password WPKG will use when connecting to the network +# The service will automatically convert a cleartext password to +# an encrypted one the first time it is starting. +# The password is unique to the computer and the user the service +# is running as, so the encrypted password cannot be transferred to +# other computers. +# Default: Not set +# Example: clear:P@$$w0rd +# Example: crypt:AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAsq/aNBh+HEi94fU5pxkb+gAAAAAoAAAARQB4AGUAYwB1AHQAZQBVAHMAZQByAFAAYQBzAHMAdwBvAHIAZAAAAANmAACoAAAAEAAAAJ3Jmb/7KPeQxclXo9RDypkAAAAABIAAAKAAAAAQAAAA+2T8G/OxrjIa+FBC1p68VAgAAAB7G5ApMTstrRQAAACiljCkFZ2zS5oqlnLzlhyN1/Biyw== +# Note: If your password contains hashes (#'s), the entire string should +# be enclosed in double quotes to avoid it being interpreted as a +# inline comment. +# Example: WpkgNetworkPassword = "clear:P@$$#0rd" +WpkgNetworkPassword = + +# The maximum number of consecutive reboots allowed before skipping +# execution of Wpkg-GP +WpkgMaxReboots = 10 + +# Configure whether Wpkg-GP should initialize a reboot when Wpkg.js requests it, or not. +# Alternatives: force | ignore +# Default: force +WpkgRebootPolicy = force + +# Configure whether users not in local administrators group +# should be able to execute Wpkg-GP. Enabling this means that users +# on other computers that is not a member of the local administrators +# group on this computer can execute Wpkg-GP. Users that are a member +# of the local Administrators group can always execute Wpkg-GP regardless +# of this setting. +# Alternatives: 1 | 0 +# Default: 0 +WpkgExecuteByNonAdmins = 0 + +# Configure whether all local users on the computer should be able to execute Wpkg-GP. +# This is necessary for the users to initiate installation of software themselves if +# the setting WpkgExecuteByNonAdmins = 0 +# Alternatives: 1 | 0 +# Default: 1 +WpkgExecuteByLocalUsers = 1 + + +# Configure whether to show an activity indicator when Wpkg-GP is executing +# Alternatives: 1 | 0 +# Default: 1 +WpkgActivityIndicator = 1 + +[EnvironmentVariables] +# Specify environment variables you want Wpkg to have here + +# Example: SOFTWARE = \\file001\install\software +%for %%script in %%wpkgcli_script_variable_name +%%script = %%script.wpkgcli_script_variable_val +%end for diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/templates/wpkg-gp_install.bat b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/templates/wpkg-gp_install.bat new file mode 100644 index 0000000000000000000000000000000000000000..d4b05cb05c62a9f7bbfaee1707428ad0899e18e6 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/templates/wpkg-gp_install.bat @@ -0,0 +1,50 @@ +@echo off +echo. + +%if %%mode_conteneur_actif == 'non' +set ip-scribe=%%adresse_ip_eth0 +%else +set ip-scribe=%%adresse_ip_fichier_link +%end if +set settings-file=\\\%ip-scribe%\wpkg\Wpkg-GP.ini + +Set RegQry=HKLM\Hardware\Description\System\CentralProcessor\0 +REG.exe Query %RegQry% > %TMP%\checkOS.txt +Find /i "x86" < %TMP%\CheckOS.txt > nul +If %ERRORLEVEL% == 0 ( + echo "Installation 32 bits." + set wpkg-client=\\\%ip-scribe%\wpkg\Wpkg-GP_x86.exe + goto InstallClient +) ELSE ( + echo "Installation 64 bits." + set wpkg-client=\\\%ip-scribe%\wpkg\Wpkg-GP_x64.exe + goto InstallClient +) + + +:InstallClient +IF NOT EXIST "%wpkg-client%" goto ErrClient + +IF NOT EXIST "%settings-file%" goto ErrSettings +goto SuiteClient + +:ErrClient +echo ERREUR: "%wpkg-client%" introuvable, installation impossible ! +ping -n 10 127.0.0.1 > nul +goto Fin + +:ErrSettings +echo ERREUR : "%settings-file%" introuvable, installation impossible ! +ping -n 10 127.0.0.1 > nul +goto Fin + +:SuiteClient +"%wpkg-client%" /S /INI "%settings-file%" +echo *************************************************************************** +echo Installation de "%wpkg-client%" terminee. +echo *************************************************************************** +ping -n 2 127.0.0.1 > nul + + +:Fin +echo. diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/templates/wpkg-gp_update_conf.bat b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/templates/wpkg-gp_update_conf.bat new file mode 100644 index 0000000000000000000000000000000000000000..88189539607b0e7fb35c1234f07677dd3ff5cb19 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/templates/wpkg-gp_update_conf.bat @@ -0,0 +1,33 @@ +@echo off +echo. + +%if %%mode_conteneur_actif == 'non' +set ip-scribe=%%adresse_ip_eth0 +%else +set ip-scribe=%%adresse_ip_fichier_link +%end if +set settings-file=\\\%ip-scribe%\wpkg\wpkg-gp.ini +set wpkg-gp-dir="%PROGRAMFILES%\Wpkg-GP\" + +IF NOT EXIST "%settings-file%" goto ErrSettings +goto SuiteClient + +:ErrSettings +echo ERREUR : "%settings-file%" introuvable +echo Mise a jour impossible ! +ping -n 10 127.0.0.1 > nul +goto Fin + +:SuiteClient +xcopy /Y %settings-file% %wpkg-gp-dir%% + +net stop wpkgserver +net start wpkgserver + +echo *************************************************************************** +echo Mise a jour depuis "%settings-file%" terminee. +echo *************************************************************************** +ping -n 2 127.0.0.1 > nul + +:Fin +echo. diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/templates/wpkg.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/templates/wpkg.conf new file mode 100644 index 0000000000000000000000000000000000000000..0c156bcf3303b021d2629e5587de27b9240137a3 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/templates/wpkg.conf @@ -0,0 +1,7 @@ +[wpkg] + inherit permissions = Yes + inherit acls = Yes + path = /home/wpkg + browseable = No + read only = No + guest ok = Yes diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/templates/wpkg_client_install.bat b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/templates/wpkg_client_install.bat new file mode 100644 index 0000000000000000000000000000000000000000..524997c939f180c369e99468aebad52181409545 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/templates/wpkg_client_install.bat @@ -0,0 +1,50 @@ +@echo off +echo. + +%if %%mode_conteneur_actif == 'non' +set ip-scribe=%%adresse_ip_eth0 +%else +set ip-scribe=%%adresse_ip_fichier_link +%end if +set settings-file=\\\%ip-scribe%\wpkg\settings.xml + +Set RegQry=HKLM\Hardware\Description\System\CentralProcessor\0 +REG.exe Query %RegQry% > %TMP%\checkOS.txt +Find /i "x86" < %TMP%\CheckOS.txt > nul +If %ERRORLEVEL% == 0 ( + echo "Installation 32 bits." + set wpkg-client=\\\%ip-scribe%\wpkg\WPKG_Client32.msi + goto InstallClient +) ELSE ( + echo "Installation 64 bits." + set wpkg-client=\\\%ip-scribe%\wpkg\WPKG_Client64.msi + goto InstallClient +) + + +:InstallClient +IF NOT EXIST "%wpkg-client%" goto ErrClient + +IF NOT EXIST "%settings-file%" goto ErrSettings +goto SuiteClient + +:ErrClient +echo ERREUR: "%wpkg-client%" introuvable, installation impossible ! +ping -n 10 127.0.0.1 > nul +goto Fin + +:ErrSettings +echo ERREUR : "%settings-file%" introuvable, installation impossible ! +ping -n 10 127.0.0.1 > nul +goto Fin + +:SuiteClient +msiexec /qb-! /i "%wpkg-client%" SETTINGSFILE="%settings-file%" +echo *************************************************************************** +echo Installation de "%wpkg-client%" terminee. +echo *************************************************************************** +ping -n 2 127.0.0.1 > nul + + +:Fin +echo. diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/templates/wpkg_client_update_conf.bat b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/templates/wpkg_client_update_conf.bat new file mode 100644 index 0000000000000000000000000000000000000000..82c3d1f21b3b71930208703da42d33c69f00f197 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eole-wpkg/templates/wpkg_client_update_conf.bat @@ -0,0 +1,39 @@ +@echo off +echo. + +%if %%mode_conteneur_actif == 'non' +set ip-scribe=%%adresse_ip_eth0 +%else +set ip-scribe=%%adresse_ip_fichier_link +%end if +set settings-file=\\\%ip-scribe%\wpkg\settings.xml +set wpkginst=%PROGRAMFILES%\WPKG\wpkginst.exe + +IF NOT EXIST "%wpkginst%" goto ErrClient + +IF NOT EXIST "%settings-file%" goto ErrSettings +goto SuiteClient + +:ErrClient +echo ERREUR : "%wpkginst%" introuvable +echo Le client WPKG n'est probablement pas installe +echo Mise a jour impossible ! +ping -n 10 127.0.0.1 > nul +goto Fin + +:ErrSettings +echo ERREUR : "%settings-file%" introuvable +echo Mise a jour impossible ! +ping -n 10 127.0.0.1 > nul +goto Fin + +:SuiteClient +"%wpkginst%" --SETTINGSFILE=%settings-file%% + +echo *************************************************************************** +echo Mise a jour depuis "%settings-file%" terminee. +echo *************************************************************************** +ping -n 2 127.0.0.1 > nul + +:Fin +echo. diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eolead-gpo-script/dictionaries/25_gposcript.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eolead-gpo-script/dictionaries/25_gposcript.xml new file mode 100644 index 0000000000000000000000000000000000000000..3e205aaf21fdaa7db0e0f6aa209439057e928fba --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eolead-gpo-script/dictionaries/25_gposcript.xml @@ -0,0 +1,28 @@ +<?xml version='1.0' encoding='utf-8'?> + +<creole> + + <files> + <file name='/etc/eole/gposcript.conf'/> + </files> + + <variables> + + <family name='GPO' icon='windows'> + <variable name='activer_gpo_script' type='oui/non' description="Activer l'exécution de scripts à la connexion des utilisateurs" /> + </family> + + </variables> + + <constraints> + </constraints> + + <help> + <family name='GPO'>Paramétrage des GPO EOLE</family> + <variable name='activer_gpo_script'>Active l'exécution de scripts de "Logon"</variable> + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eolead-gpo-script/dictionaries/26_eolead_gposcript.xml b/seed/release/eole-2.7/2.7.1/applicationservice/eolead-gpo-script/dictionaries/26_eolead_gposcript.xml new file mode 100644 index 0000000000000000000000000000000000000000..dfca8bafda608dec37b261df8e804d224b1aa9e8 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eolead-gpo-script/dictionaries/26_eolead_gposcript.xml @@ -0,0 +1,21 @@ +<?xml version='1.0' encoding='utf-8'?> + +<creole> + + <files> + <file name='/var/lib/lxc/addc/rootfs/etc/eole/gposcript.conf'/> + </files> + + <variables> + </variables> + + <constraints> + </constraints> + + <help> + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eolead-gpo-script/postservices/07-eolead-gpo b/seed/release/eole-2.7/2.7.1/applicationservice/eolead-gpo-script/postservices/07-eolead-gpo new file mode 100644 index 0000000000000000000000000000000000000000..b76f663a20d51c024c24914e271b5b677b179b78 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eolead-gpo-script/postservices/07-eolead-gpo @@ -0,0 +1,11 @@ +#!/bin/bash + +# Do not use agent for connections in the container +unset SSH_AUTH_SOCK + +ssh -t -q -o LogLevel=ERROR -o StrictHostKeyChecking=no root@addc "/usr/share/eole/postservice/30-gposcript" + +# Create logon script files for network drives mapping +[ -x /usr/share/eole/sbin/special_shares.sh ] && /usr/share/eole/sbin/special_shares.sh + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eolead-gpo-script/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/eolead-gpo-script/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..72f313c926f6879c0aefea722dec222fba6fd97e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eolead-gpo-script/service.yml @@ -0,0 +1,26 @@ +format: '0.1' +name: eolead-gpo-script +version: |- + 2.7.1-9 +description: |- + Variante d'eole-gpo-script pour ScribeAD/HorusAD + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: [] +packages: [] +dictionaries: + - 25_gposcript.xml + - 26_eolead_gposcript.xml +extra_dictionaries: {} +templates: + - gposcript.conf +creole_funcs: [] +preservices: [] +postservices: + - 07-eolead-gpo +pretemplates: [] +posttemplates: [] +files: {} +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/eolead-gpo-script/templates/gposcript.conf b/seed/release/eole-2.7/2.7.1/applicationservice/eolead-gpo-script/templates/gposcript.conf new file mode 100644 index 0000000000000000000000000000000000000000..bd7e0875e66eb1f31f216f550db8ec70332b0ba0 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/eolead-gpo-script/templates/gposcript.conf @@ -0,0 +1,5 @@ +%if %%activer_gpo_script == 'oui' +GPOSCRIPT=0 +%else +GPOSCRIPT=1 +%end if diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/era-actions/dictionaries/00_era-actions_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/era-actions/dictionaries/00_era-actions_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..9fa615c39a2760efeaac8ec1f98a4c3f4f102b0f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/era-actions/dictionaries/00_era-actions_packages.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>era</package> + <package>python3-iptables</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/era-actions/extra_dictionaries/eraallrules/00_action.xml b/seed/release/eole-2.7/2.7.1/applicationservice/era-actions/extra_dictionaries/eraallrules/00_action.xml new file mode 100644 index 0000000000000000000000000000000000000000..09aeae526db136312d30f02eaa90ba4553acfdfb --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/era-actions/extra_dictionaries/eraallrules/00_action.xml @@ -0,0 +1,21 @@ +<creole> + <family_action name="Pare-feu" + description="Gestion courante du pare-feu" + color="#313192" + image="firewall.svg"> + <action type="custom" + title="Règles cachées activées" + description="Affiche les règles optionnelles cachées activées" + image="firewall.svg" + actionlist="firewall"> + <profile>ead_admin</profile> + <ewtapp>ead</ewtapp> + <tag>firewall</tag> + </action> + </family_action> + <variables> + </variables> + <constraints> + </constraints> + <help/> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/era-actions/extra_dictionaries/eraoptionalrules/00_action.xml b/seed/release/eole-2.7/2.7.1/applicationservice/era-actions/extra_dictionaries/eraoptionalrules/00_action.xml new file mode 100644 index 0000000000000000000000000000000000000000..7fd61178ed1c79850f75411a949517b1b073adcb --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/era-actions/extra_dictionaries/eraoptionalrules/00_action.xml @@ -0,0 +1,21 @@ +<creole> + <family_action name="Pare-feu" + description="Gestion courante du pare-feu" + color="#313192" + image="firewall.svg"> + <action type="custom" + title="Gérer les règles optionnelles" + description="Activation et désactivation des règles optionnelles" + image="firewall.svg" + actionlist="firewall"> + <profile>ead_admin</profile> + <ewtapp>ead</ewtapp> + <tag>firewall</tag> + </action> + </family_action> + <variables> + </variables> + <constraints> + </constraints> + <help/> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/era-actions/extra_dictionaries/iptables/00_action.xml b/seed/release/eole-2.7/2.7.1/applicationservice/era-actions/extra_dictionaries/iptables/00_action.xml new file mode 100644 index 0000000000000000000000000000000000000000..5df63f9037b9c1beca8691c5240d53a2b018a643 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/era-actions/extra_dictionaries/iptables/00_action.xml @@ -0,0 +1,21 @@ +<creole> + <family_action name="Pare-feu" + description="Gestion courante du pare-feu" + color="#313192" + image="firewall.svg"> + <action type="custom" + title="Règles de pare-feu appliquées" + description="Affiche les règles de pare-feu appliquées" + image="firewall.svg" + actionlist="firewall"> + <profile>ead_admin</profile> + <ewtapp>ead</ewtapp> + <tag>firewall</tag> + </action> + </family_action> + <variables> + </variables> + <constraints> + </constraints> + <help/> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/era-actions/posttemplates/01-export-era b/seed/release/eole-2.7/2.7.1/applicationservice/era-actions/posttemplates/01-export-era new file mode 100644 index 0000000000000000000000000000000000000000..f605d595cfc64bdf0f37413b9a06c92deb2fe8f2 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/era-actions/posttemplates/01-export-era @@ -0,0 +1,107 @@ +#!/usr/bin/env python2 +# -*- coding: utf-8 -*- + +from sys import path +from os.path import join +import json +from creole.client import CreoleClient +from amon.era import regles + +creole_client = CreoleClient() + +ERA_MODEL = creole_client.get_creole('type_amon') +ERA_PARENT_DIR = '/usr/share' +ERA_ROOT_DIR = join(ERA_PARENT_DIR, 'era') +ERA_MODEL_PATH = join(ERA_ROOT_DIR, 'modeles', '{}.xml'.format(ERA_MODEL)) +ACTIVE_TAGS = '/var/lib/eole/config/regles.csv' +MATRIX_EXPORT_PATH = '/var/lib/eole/config/era_matrix.json' + +class OptionalRule(object): + OPTIONAL_MASK = 1 + ACTIVE_MASK = 2 + LOG_MASK = 4 + IPSET_MASK = 8 + HIDDEN_MASK = 16 + + def __init__(self, label, default_state, count, interface): + self.label = label + self.default_state = int(default_state) + self.state = int(default_state) + self.count = count + self.interface = interface + + def set_state(self, value): + self.state = int(value) + + def is_optional(self): + return self.OPTIONAL_MASK & self.state == self.OPTIONAL_MASK + + def is_hidden(self): + return self.HIDDEN_MASK & self.state == self.HIDDEN_MASK + + def is_active(self): + return self.ACTIVE_MASK & self.state == self.ACTIVE_MASK + + def activate(self): + self.state = self.state | self.ACTIVE_MASK + + def deactivate(self): + self.state = self.state ^ self.ACTIVE_MASK + + def output(self): + return ','.join([self.label, str(self.state), str(self.count), self.interface]) + + +def update_directive_states(directives): + with open(ACTIVE_TAGS, 'r') as active_tags_stream: + for tag in active_tags_stream.readlines(): + label, state, _, _ = tag.split(',') + for directive in directives: + if label == directive.label: + directive.set_state(state) + + +def get_interfaces(client): + interfaces = {'%%nom_zone_eth{}'.format(i): {'name': client.get_creole('nom_zone_eth{}'.format(i)), + 'zone': client.get_creole('dansguardian_eth{}'.format(i), None)} + for i in range(int(client.get_creole('nombre_interfaces')))} + return interfaces + +def get_directives(matrix): + directives = [OptionalRule(d[0], d[1], d[2], interfaces[d[3]]['name']) for d in matrix.get_active_list()] + update_directive_states(directives) + return directives + + +def export_data(data, file_path=MATRIX_EXPORT_PATH): + with open(file_path, 'w') as matrix_export_stream: + json.dump(zones, matrix_export_stream) + +if __name__ == '__main__': + path.append(ERA_PARENT_DIR) + from era.noyau.initialize import initialize_app + + matrix = initialize_app(ERA_MODEL_PATH) + + interfaces = get_interfaces(creole_client) + directives = get_directives(matrix) + + zones = {} + zones['générales'] = {interfaces[i]['name']: [{'label': d.label, 'state': d.state, 'count': d.count, 'interface': d.interface} for d in directives if d.interface == interfaces[i]['name']] + for i in interfaces + if not interfaces[i]['zone']} + + if creole_client.get_creole('activer_filtrage_proxy', 'non') == 'oui': + for i in ['1', '2', '3']: + if creole_client.get_creole('dans_instance_{}_active'.format(i)) == 'oui': + zone = creole_client.get_creole('dansguardian_ead_filtre{}'.format(i)) + zones[zone] = {interfaces[iface]['name']: [{'label': d.label, + 'state': d.state, + 'count': d.count, + 'interface': d.interface} + for d in directives + if d.interface == interfaces[iface]['name']] + for iface in interfaces + if interfaces[iface]['zone'] == i} + + export_data(zones, MATRIX_EXPORT_PATH) diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/era-actions/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/era-actions/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..30c9b5c80b0116c222ceee16829a975ee5c3d931 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/era-actions/service.yml @@ -0,0 +1,37 @@ +format: '0.1' +name: era-actions +version: |- + 2.7.1-5 +description: |- + Actions EAD3 pour la gestion des règles de pare-feu + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: [] +packages: + - era + - python3-iptables +dictionaries: [] +extra_dictionaries: + eraallrules: + - 00_action.xml + eraoptionalrules: + - 00_action.xml + iptables: + - 00_action.xml +templates: [] +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: + - 01-export-era +files: {} +excluding_regexp: + /usr/share/doc: 2 + /usr/share/eole/creole/extra/eraallrules/custom/: 7642 + /usr/share/eole/creole/extra/eraallrules/salt/: 1 + /usr/share/eole/creole/extra/eraoptionalrules/custom/: 7870 + /usr/share/eole/creole/extra/eraoptionalrules/salt/: 1 + /usr/share/eole/creole/extra/iptables/custom/: 7642 + /usr/share/eole/creole/extra/iptables/salt/: 1 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/horus-ad/dictionaries/00_horus-ad_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/horus-ad/dictionaries/00_horus-ad_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..36bd0d7b0d7f65eea39f641d759b61b0890665a8 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/horus-ad/dictionaries/00_horus-ad_packages.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>eole-horus-module</package> + <package>eole-workstation</package> + <package>lxc-templates</package> + <package>debootstrap</package> + <package>cgroup-lite</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/horus-ad/dictionaries/25_eolead_container.xml b/seed/release/eole-2.7/2.7.1/applicationservice/horus-ad/dictionaries/25_eolead_container.xml new file mode 100644 index 0000000000000000000000000000000000000000..45e647ff49c17750cafe0e994c0a4a4a8e2ff8e1 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/horus-ad/dictionaries/25_eolead_container.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + </files> + + <variables> + + <family name='EoleAD'> + <variable name='ad_public_address' type='ip' description='Adresse IP publique Active Directory ' mandatory='True' /> + </family> + + </variables> + + <constraints> + + <check name="valid_in_network" target="ad_public_address"> + <param type='eole'>adresse_network_eth0</param> + <param type='eole'>adresse_netmask_eth0</param> + </check> + <check name="valid_differ" target="ad_public_address"> + <param type='eole'>adresse_ip_eth0</param> + </check> + + </constraints> + + <help> + <variable name='ad_public_address'>Adresse du service AD exposée sur le réseau</variable> + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/horus-ad/dictionaries/27_eolead_container.xml b/seed/release/eole-2.7/2.7.1/applicationservice/horus-ad/dictionaries/27_eolead_container.xml new file mode 100644 index 0000000000000000000000000000000000000000..cd98c06b31e442572f43ebff04ad6dee1c430149 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/horus-ad/dictionaries/27_eolead_container.xml @@ -0,0 +1,64 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + <!-- copie du template fourni par eole-lxc-controller --> + <file name='/usr/share/eole/bastion/data/90-lxc_rules' mode='0755'/> + <service>lxc-net</service> + <service>lxc</service> + </files> + + <variables> + + <family name='réseau avancé'> + <variable name='activer_ajout_hosts' redefine='True' hidden='True'> + <value>oui</value> + </variable> + <variable name='adresse_ip_hosts' redefine='True'/> + <variable name='nom_long_hosts' redefine='True'/> + <variable name='nom_court_hosts' redefine='True'/> + </family> + + <family name='EoleAD'> + <variable name='ad_server' redefine='True' hidden='True'> + <value>addc</value> + </variable> + <variable name='ad_domain' redefine='True' hidden='True'/> + <variable name='ad_address' redefine='True' hidden='True'> + <value>192.0.2.2</value> + </variable> + <variable name='ad_rescue' redefine='True' hidden='True'/> + <variable name='ad_user' redefine='True' hidden='True'> + <value>Administrator</value> + </variable> + <variable name='ad_container' redefine='True' hidden='True'/> + <variable name='ad_ldaps' redefine='True' hidden='True'> + <value>oui</value> + </variable> + </family> + + </variables> + + <constraints> + + <auto name='calc_val' target='adresse_ip_hosts'> + <param type='eole'>ad_address</param> + </auto> + <auto name='concat' target='nom_long_hosts'> + <param type='eole' name='valeur1'>ad_server</param> + <param name='valeur2'>.</param> + <param type='eole' name='valeur3'>ad_domain</param> + </auto> + <auto name='calc_val' target='nom_court_hosts'> + <param type='eole'>ad_server</param> + </auto> + + </constraints> + + <help> + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/horus-ad/files/etc/systemd/system/lxc-net.service.d/override.conf b/seed/release/eole-2.7/2.7.1/applicationservice/horus-ad/files/etc/systemd/system/lxc-net.service.d/override.conf new file mode 100644 index 0000000000000000000000000000000000000000..03890fae843c2e832e8639a00971ba64fac1e839 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/horus-ad/files/etc/systemd/system/lxc-net.service.d/override.conf @@ -0,0 +1,2 @@ +[Unit] +Wants=network-online.target diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/horus-ad/files/usr/lib/eole/eolead.sh b/seed/release/eole-2.7/2.7.1/applicationservice/horus-ad/files/usr/lib/eole/eolead.sh new file mode 100644 index 0000000000000000000000000000000000000000..629bb67cee68c258d8b753ba6c8d582c1a7195a4 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/horus-ad/files/usr/lib/eole/eolead.sh @@ -0,0 +1,14 @@ +CONTAINER_NAME=addc +CONTAINER_IP=192.0.2.2 +CONTAINER_ROOTFS=/var/lib/lxc/$CONTAINER_NAME/rootfs + +ConfigureSourcesList() { + # Configuration des sources.list dans le conteneur addc + # $1 : adresse du serveur de mise à jour + grep -iv envole /etc/apt/sources.list > $CONTAINER_ROOTFS/etc/apt/sources.list + cp /etc/apt/trusted.gpg.d/eole-archive-keyring.gpg $CONTAINER_ROOTFS/etc/apt/trusted.gpg.d/eole-archive-keyring.gpg + cat > $CONTAINER_ROOTFS/etc/apt/sources.list.d/seth-samba.list <<EOF +deb http://$1/samba samba-4.9 main +EOF + +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/horus-ad/files/usr/share/eole/majauto/eolead b/seed/release/eole-2.7/2.7.1/applicationservice/horus-ad/files/usr/share/eole/majauto/eolead new file mode 100644 index 0000000000000000000000000000000000000000..a1128b8bcf792bff1bc73978e40ef1f39ad6b0bc --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/horus-ad/files/usr/share/eole/majauto/eolead @@ -0,0 +1,18 @@ +#!/bin/bash +set -e +. /usr/lib/eole/eolead.sh + +# Do not use agent for connections in the container +unset SSH_AUTH_SOCK + +if [ ! -d $CONTAINER_ROOTFS ]; then + echo "Le conteneur $CONTAINER_NAME n'existe pas" + exit 0 +fi + +echo "Mise à jour du conteneur $CONTAINER_NAME" +ConfigureSourcesList $(CreoleGet serveur_maj | head -n 1) +SSH_EXEC="ssh -t -q -o LogLevel=ERROR -o StrictHostKeyChecking=no root@$CONTAINER_NAME" +$SSH_EXEC "apt-get update" +$SSH_EXEC "DEBIAN_FRONTEND=noninteractive apt-get dist-upgrade -y" +$SSH_EXEC "apt-get clean" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/horus-ad/files/usr/share/eole/sbin/eolead b/seed/release/eole-2.7/2.7.1/applicationservice/horus-ad/files/usr/share/eole/sbin/eolead new file mode 100644 index 0000000000000000000000000000000000000000..5b9198bba3a41bd1343ce742f999782b845112f9 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/horus-ad/files/usr/share/eole/sbin/eolead @@ -0,0 +1,321 @@ +#!/bin/bash + +set -e + +. /etc/lsb-release +. /usr/lib/eole/ihm.sh +. /usr/lib/eole/utils.sh +#eolead.sh fournit CONTAINER_NAME, IP et ROOTFS +. /usr/lib/eole/eolead.sh + +CACHE_DIR=/var/cache/lxc/${DISTRIB_CODENAME} +PARTIAL_DIR=${CACHE_DIR}/partial-amd64 +SSH_EXEC="ssh -t -q -o LogLevel=ERROR -o StrictHostKeyChecking=no root@$CONTAINER_IP" + +REALM=$(CreoleGet ad_domain) +WORKGROUP=$(CreoleGet ad_workgroup) +EOLE_MIRROR=$(CreoleGet serveur_maj | head -n 1) +DNS=$(CreoleGet adresse_ip_dns | head -n 1) +NTP=$(CreoleGet serveur_ntp) +NOM_CARTE=$(CreoleGet nom_carte_eth0) +GATEWAY=$(CreoleGet adresse_ip_gw) +CONTAINER_ETH0=$(CreoleGet ad_public_address) +CONTAINER_CIDR0=$(mask2cdr $(CreoleGet adresse_netmask_eth0)) +EOLE_PROXY_ADDRESS=$(CreoleGet proxy_client_adresse '') +EOLE_PROXY_PORT=$(CreoleGet proxy_client_port '') +APT_PROXY_RES=$(apt-config shell APT_PROXY Acquire::http::Proxy) +eval ${APT_PROXY_RES} + +# Do not use agent for connections in the container +unset SSH_AUTH_SOCK + +# copied from diagnose/151-AD +IFS='.' read -a DN <<< $(CreoleGet ad_domain) +BASE_DN="DC=${DN[0]}" +for ((i=1;i<${#DN[@]};i++)) +do + BASE_DN="${BASE_DN},DC=${DN[$i]}" +done + +echo +EchoBleu "Génération du conteneur $CONTAINER_NAME" + +export DEBIAN_FRONTEND=noninteractive + +# Use proxy from APT if not defined +if [ -z "${http_proxy}" ] +then + if [ -n "${EOLE_PROXY_ADDRESS}" ] + then + export http_proxy="http://${EOLE_PROXY_ADDRESS}:${EOLE_PROXY_PORT}" + export https_proxy="${http_proxy}" + elif [ -n "${APT_PROXY}" ] + then + export http_proxy=${APT_PROXY} + export https_proxy=${APT_PROXY} + fi +fi + +mkdir -p ${PARTIAL_DIR}/etc/apt/apt.conf.d +#We need Apt::Pipeline and No:Cache +cp /etc/apt/apt-eole.conf ${PARTIAL_DIR}/etc/apt/apt.conf +if [ -n "${http_proxy}" ] +then + cat > ${PARTIAL_DIR}/etc/apt/apt.conf.d/02eoleproxy <<EOF +Acquire::http::Proxy "${http_proxy}"; +Acquire::https::Proxy "${http_proxy}"; +EOF +fi + +# Réseau des conteneurs en 192.0.2.0/24 +cat > /etc/default/lxc-net <<EOF +USE_LXC_BRIDGE="true" +LXC_BRIDGE="br0" +LXC_ADDR="192.0.2.1" +LXC_NETMASK="255.255.255.0" +LXC_NETWORK="192.0.2.0/24" +EOF + +systemctl stop lxc-net +ip link del lxcbr0 2>/dev/null || true +sed -i 's/lxc.network.link.*/lxc.network.link = br0/' /etc/lxc/default.conf +systemctl start lxc-net + +lxc-create -n $CONTAINER_NAME -t ubuntu -- -r $DISTRIB_CODENAME -u $DISTRIB_ID -S ~root/.ssh/id_rsa.pub --mirror http://$EOLE_MIRROR/ubuntu + +# Workaround us keyboard set by lxc-create (#24385) +service keyboard-setup restart + +echo +EchoBleu "Configuration du conteneur $CONTAINER_NAME" + +# Configure keyboard +cp /etc/default/keyboard ${CONTAINER_ROOTFS}/etc/default/keyboard + +# addc container in the master timezone #24933 +cp /etc/timezone ${CONTAINER_ROOTFS}/etc/timezone +ln -nsf $(readlink /etc/localtime) ${CONTAINER_ROOTFS}/etc/localtime + +[ ! -f /root/.ssh/id_rsa.pub ] && ssh-keygen -f /root/.ssh/id_rsa -N '' +mkdir -p $CONTAINER_ROOTFS/root/.ssh/ +cp /root/.ssh/id_rsa.pub $CONTAINER_ROOTFS/root/.ssh/authorized_keys +chmod -R 600 $CONTAINER_ROOTFS/root/.ssh/ + +rm -f $CONTAINER_ROOTFS/etc/network/interfaces + +chroot $CONTAINER_ROOTFS apt-get purge -y resolvconf +[ -L $CONTAINER_ROOTFS/etc/resolv.conf ] && rm -f $CONTAINER_ROOTFS/etc/resolv.conf +cat > $CONTAINER_ROOTFS/etc/resolv.conf <<EOF +nameserver $CONTAINER_ETH0 +nameserver $DNS +search $REALM +EOF + +# No dhcp interface in container +sed -ie 's/\( eth0:\) {dhcp4: true}/\1{dhcp4: false}/' ${CONTAINER_ROOTFS}/etc/netplan/10-lxc.yaml + +cat > /var/lib/lxc/$CONTAINER_NAME/config <<EOF +# Template used to create this container: /usr/share/lxc/templates/lxc-ubuntu + +# Common configuration +lxc.include = /usr/share/lxc/config/ubuntu.common.conf + +# Container specific configuration +lxc.uts.name = $CONTAINER_NAME +lxc.arch = amd64 +lxc.rootfs.path = $CONTAINER_ROOTFS + +# EOLE look for /dev/lxc to detect container mode and behave differently +lxc.tty.dir = LXC + +# Automatic start at bootup +lxc.start.auto = 1 + +# Network configuration +# eth0 on eth0 +lxc.net.0.type = macvlan +lxc.net.0.link = $NOM_CARTE +lxc.net.0.flags = up +lxc.net.0.name = eth0 +lxc.net.0.mtu = 1500 +lxc.net.0.macvlan.mode = bridge +lxc.net.0.ipv4.address = $CONTAINER_ETH0/$CONTAINER_CIDR0 +lxc.net.0.ipv4.gateway = ${GATEWAY} + +# containers on br0 +# Reuse LTSP server IP +# http://eole.ac-dijon.fr/documentations/2.6/partielles/beta/EOLE/co/02-fichiers.html +lxc.net.1.type=veth +lxc.net.1.link=br0 +lxc.net.1.flags=up +lxc.net.1.name = containers +lxc.net.1.mtu = 1500 +lxc.net.1.veth.pair = ${CONTAINER_NAME}_0 +lxc.net.1.ipv4.address = $CONTAINER_IP/24 +EOF + +cat > $CONTAINER_ROOTFS/etc/nsswitch.conf <<EOF +passwd: compat winbind +group: compat winbind +shadow: compat +gshadow: files + +hosts: files dns +networks: files + +protocols: db files +services: db files +ethers: db files +rpc: db files + +netgroup: nis +EOF + +mkdir -p $CONTAINER_ROOTFS/etc/eole +cat > $CONTAINER_ROOTFS/etc/eole/samba4-vars.conf <<EOF +AD_REALM='$REALM' +AD_DOMAIN='$WORKGROUP' +AD_HOST_NAME='$CONTAINER_NAME' +AD_HOST_IP='$CONTAINER_ETH0' +NOM_CARTE_NIC1='eth0' +AD_SERVER_ROLE='controleur de domaine' +BASEDN='$BASE_DN' +NTP_SERVERS='$NTP' +AD_ADDITIONAL_DC_IP='' +AD_DOMAIN_SID='' +AD_ADDITIONAL_DC='non' +AD_DNS_BACKEND='SAMBA_INTERNAL' +AD_ADMIN='Administrator' +AD_HOST_KEYTAB_FILE='/var/lib/samba/eole-ad-dc.keytab' +ACTIVER_AD_HOMES_SHARE='oui' +ACTIVER_AD_PROFILES_SHARE='oui' +AD_HOMES_SHARE_HOST_NAME='' +AD_PROFILES_SHARE_HOST_NAME='' +AD_HOME_SHARE_PATH='/home/adhomes' +AD_PROFILE_SHARE_PATH='/home/adprofiles' +AD_INSTANCE_LOCK_FILE='/var/lib/samba/.instance_ok' +AD_BACKEND_STORE='tdb' +AD_PLAINTEXT_SECRETS='non' +EOF + +mkdir -p $CONTAINER_ROOTFS/usr/lib/eole +cp /usr/lib/eole/ihm.sh $CONTAINER_ROOTFS/usr/lib/eole/ihm.sh +cp /usr/bin/tcpcheck $CONTAINER_ROOTFS/usr/bin/tcpcheck + +ConfigureSourcesList $EOLE_MIRROR + +echo +EchoBleu "Démarrage du conteneur $CONTAINER_NAME" +lxc-start -n $CONTAINER_NAME -d + +try=0 +max_try=10 +while [ ${try} -le ${max_try} ]; do + if [ ${try} -eq ${max_try} ]; then + EchoRouge "Impossible de contacter le conteneur via ssh" + exit 1 + fi + sleep 2 + tcpcheck 3 $CONTAINER_IP:22 >/dev/null && break + try=$((try+1)) +done +echo -n "Serveur démarré : " +$SSH_EXEC "cat /etc/hostname" + +echo +EchoBleu "Finalisation du conteneur $CONTAINER_NAME" + +cat > $CONTAINER_ROOTFS/usr/sbin/policy-rc.d <<EOF +#!/bin/sh +exit 101 +EOF +chmod a+x $CONTAINER_ROOTFS/usr/sbin/policy-rc.d + + +$SSH_EXEC "userdel -r Ubuntu 2>/dev/null" + +$SSH_EXEC "apt-get update" +$SSH_EXEC "DEBIAN_FRONTEND=noninteractive apt-get install eole-ad-pkg -y" +$SSH_EXEC "apt-get clean" + +cat > $CONTAINER_ROOTFS/etc/krb5.conf <<EOF +[libdefaults] +default_realm = ${REALM^^} +dns_lookup_realm = false +dns_lookup_kdc = false + +[realms] +${REALM^^} = { +kdc = $CONTAINER_ETH0 +} + +[domain_realms] +.${REALM} = ${REALM^^} +${REALM} = ${REALM^^} +EOF + +cat > $CONTAINER_ROOTFS/etc/samba/smb.conf <<EOF +[global] + realm = ${REALM^^} + workgroup = ${WORKGROUP^^} + netbios name = ${CONTAINER_NAME^^} + disable netbios = yes + smb ports = 445 + vfs objects = acl_xattr + map acl inherit = Yes + store dos attributes = Yes + winbind separator = / + server role = active directory domain controller + dns forwarder = $DNS + tls enabled = yes + tls keyfile = /var/lib/samba/private/tls/key.pem + tls certfile = /var/lib/samba/private/tls/cert.pem + tls cafile = /var/lib/samba/private/tls/ca.pem + +[netlogon] + comment = Network Logon Service + path = /home/sysvol/$REALM/scripts + read only = No + guest ok = yes + +[sysvol] + comment = Sysvol Service + path = /home/sysvol + read only = No + guest ok = yes + +[homes] + path = "/home/adhomes/%u" + root preexec = /usr/share/eole/sbin/create_adhome.sh "%u" "/home/adhomes" + comment = Home Directories + read only = no + invalid users = nobody guest + +[profiles] + comment = Profiles + path = "/home/adprofiles" + read only = No + invalid users = nobody guest +EOF + + +echo +EchoBleu "Configuration du service samba-ad-dc" +$SSH_EXEC "systemctl mask smbd" +$SSH_EXEC "systemctl mask nmbd" +$SSH_EXEC "systemctl mask winbind" +$SSH_EXEC "systemctl unmask samba-ad-dc" +$SSH_EXEC "systemctl enable samba-ad-dc" + +rm $CONTAINER_ROOTFS/usr/sbin/policy-rc.d + +$SSH_EXEC ". /usr/lib/eole/samba4.sh && . /etc/eole/samba4-vars.conf && samba_instance" + +cp $CONTAINER_ROOTFS/etc/krb5.conf $CONTAINER_ROOTFS/var/lib/samba/private/krb5.conf + +[ ! -e /var/log/samba-ad-dc ] && ln -ns $CONTAINER_ROOTFS/var/log/samba /var/log/samba-ad-dc + +# clean container cache +rm -rf ${CACHE_DIR} + +echo diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/horus-ad/postservices/06-eolead-inject-password b/seed/release/eole-2.7/2.7.1/applicationservice/horus-ad/postservices/06-eolead-inject-password new file mode 100644 index 0000000000000000000000000000000000000000..ba9a2aa93ecbd9569cecc7b475f1f05e2afbd66b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/horus-ad/postservices/06-eolead-inject-password @@ -0,0 +1,22 @@ +#!/bin/bash +. /usr/lib/eole/ihm.sh + +# Do not use agent for connections in the container +unset SSH_AUTH_SOCK + +[ "$1" = "instance" ] || exit 0 +resync=0 + +if [ -f /etc/eole/.instance ];then + Question_ouinon "Voulez-vous (re)synchroniser les mots de passe des utilisateurs ?" "True" "oui" "warn" + resync="$?" +fi +if [ "$resync" = "0" ]; then + pdbedit -L -w | sed -e "/^.*$:/d" | awk -F: '{print "pdbedit -u " $1 " --set-nt-hash " $4}' > /var/lib/lxc/addc/rootfs/tmp/injectpwd + nb=$(wc -l < /var/lib/lxc/addc/rootfs/tmp/injectpwd) + echo "Synchronisation en cours ($nb mots de passe)..." + ssh -t -q -o LogLevel=ERROR -o StrictHostKeyChecking=no root@addc "bash /tmp/injectpwd >/dev/null" + [ $? -ne 0 ] && exit 1 + rm -f /var/lib/lxc/addc/rootfs/tmp/injectpwd + echo +fi diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/horus-ad/posttemplates/04-samba-ad b/seed/release/eole-2.7/2.7.1/applicationservice/horus-ad/posttemplates/04-samba-ad new file mode 100644 index 0000000000000000000000000000000000000000..c7158286f0525d995e3f1a5cbd1ea07e9862553f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/horus-ad/posttemplates/04-samba-ad @@ -0,0 +1,10 @@ +#!/bin/bash +. /usr/lib/eole/eolead.sh + +#Deactivate resolver on 127.0.0.53:53 for samba interantl dns +cp /etc/systemd/resolved.conf $CONTAINER_ROOTFS/etc/systemd/resolved.conf + +# update DNS forwarder +sed -ie "s/dns forwarder.*/dns forwarder = $(CreoleGet adresse_ip_dns | head -n 1)/" $CONTAINER_ROOTFS/etc/samba/smb.conf + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/horus-ad/posttemplates/05-eolead b/seed/release/eole-2.7/2.7.1/applicationservice/horus-ad/posttemplates/05-eolead new file mode 100644 index 0000000000000000000000000000000000000000..7a0b90c13fd1041402db03683e54df4a47a7b30f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/horus-ad/posttemplates/05-eolead @@ -0,0 +1,13 @@ +#!/bin/bash + +. /usr/lib/eole/eolead.sh + +#Take care of motd in addc container +cp -f /etc/update-motd.d/{00-header,10-help-text} $CONTAINER_ROOTFS/etc/update-motd.d/ +cp -f /etc/default/motd-news $CONTAINER_ROOTFS/etc/default/motd-news +rm -rf $CONTAINER_ROOTFSetc/cron.daily/ubuntu-advantage-tools +> $CONTAINER_ROOTFS/var/cache/motd-news +rm -rf $CONTAINER_ROOTFS/var/cache/ubuntu-advantage-tools/* +#End motd configuration + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/horus-ad/preservices/05-eolead b/seed/release/eole-2.7/2.7.1/applicationservice/horus-ad/preservices/05-eolead new file mode 100644 index 0000000000000000000000000000000000000000..36d149f0785abff36c747ea5146f9b0023b9dd8d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/horus-ad/preservices/05-eolead @@ -0,0 +1,30 @@ +#!/bin/bash + +. /usr/lib/eole/ihm.sh +. /usr/lib/eole/eolead.sh + +if [ "$1" = "instance" ]; then + if [ -d $CONTAINER_ROOTFS ]; then + echo "Le conteneur $CONTAINER_NAME est présent" + else + if grep -qE ' (cdrom|file):' /etc/apt/sources.list + then + EchoOrange "La construction du conteneur est impossible à partir du CD-ROM" + EchoCyan "Configuration des sources APT afin de mettre à jour depuis le réseau" + Query-Auto + [ $? -ne 0 ] && exit 1 + fi + /usr/share/eole/sbin/eolead + [ $? -ne 0 ] && exit 1 + keytool -delete -alias eole-ad -keystore /etc/ssl/certs/java/cacerts -storepass changeit >/dev/null + keytool -import -trustcacerts -keystore /etc/ssl/certs/java/cacerts -storepass changeit -noprompt -alias eole-ad -file $CONTAINER_ROOTFS/var/lib/samba/private/tls/ca.pem + fi +elif [ ! -d $CONTAINER_ROOTFS ]; then + echo + EchoRouge "Le conteneur $CONTAINER_NAME n'existe pas" + echo "Il est nécessaire de relancer la procédure d'instanciation" + echo + exit 1 +fi + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/horus-ad/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/horus-ad/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..4333e962a4ba6e7e6674da931c9d3b4f9cdb8376 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/horus-ad/service.yml @@ -0,0 +1,53 @@ +format: '0.1' +name: horus-ad +version: |- + 2.7.1-6 +description: |- + Transformation d'un Horus NT en Horus AD + Avec ajout du service samba-ad-dc dans un conteneur LXC + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: + - eole-ad + - eolead-gpo-script +packages: + - eole-horus-module + - eole-workstation + - lxc-templates + - debootstrap + - cgroup-lite +dictionaries: + - 25_eolead_container.xml + - 27_eolead_container.xml +extra_dictionaries: {} +templates: + - 90-lxc_rules +creole_funcs: [] +preservices: + - 05-eolead +postservices: + - 06-eolead-inject-password +pretemplates: [] +posttemplates: + - 04-samba-ad + - 05-eolead +files: + /etc/systemd/system/lxc-net.service.d/override.conf: + owner: root + group: root + mode: '0644' + /usr/lib/eole/eolead.sh: + owner: root + group: root + mode: '0644' + /usr/share/eole/majauto/eolead: + owner: root + group: root + mode: '0755' + /usr/share/eole/sbin/eolead: + owner: root + group: root + mode: '0755' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/horus-ad/templates/90-lxc_rules b/seed/release/eole-2.7/2.7.1/applicationservice/horus-ad/templates/90-lxc_rules new file mode 100644 index 0000000000000000000000000000000000000000..98faa542da1e9cb04ab31467a5378812e21ee338 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/horus-ad/templates/90-lxc_rules @@ -0,0 +1,20 @@ +#!/bin/bash + +# Accept from containers to LXC controller +/sbin/iptables -A INPUT -i br0 -s 192.0.2.2/255.255.255.0 -j ACCEPT + +# Accept from LXC controller to containers +/sbin/iptables -A OUTPUT -o br0 -d 192.0.2.2/255.255.255.0 -j ACCEPT + +# Accept from containers to containers +/sbin/iptables -A FORWARD -i br0 -o br0 -s 192.0.2.2/255.255.255.0 -d 192.0.2.2/255.255.255.0 -j ACCEPT + +# Accept from containers to outside +/sbin/iptables -A FORWARD -i br0 -j ACCEPT + +# Accept ESTABLISHED from outside to containers +# Required in forteress mode +/sbin/iptables -A FORWARD -o br0 -m state --state ESTABLISHED,RELATED -j ACCEPT + +# MASQUERADE containers getting outside +/sbin/iptables -t nat -A POSTROUTING -s 192.0.2.2/255.255.255.0 ! -o br0 -j MASQUERADE diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/scribe-ad/dictionaries/00_scribe-ad_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/scribe-ad/dictionaries/00_scribe-ad_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..21b9233199056ed6d66abd8dbe1ded78a280ce83 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/scribe-ad/dictionaries/00_scribe-ad_packages.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>eole-scribe-module</package> + <package>eole-workstation</package> + <package>lxc-templates</package> + <package>debootstrap</package> + <package>cgroup-lite</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/scribe-ad/dictionaries/25_eolead_container.xml b/seed/release/eole-2.7/2.7.1/applicationservice/scribe-ad/dictionaries/25_eolead_container.xml new file mode 100644 index 0000000000000000000000000000000000000000..45e647ff49c17750cafe0e994c0a4a4a8e2ff8e1 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/scribe-ad/dictionaries/25_eolead_container.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + </files> + + <variables> + + <family name='EoleAD'> + <variable name='ad_public_address' type='ip' description='Adresse IP publique Active Directory ' mandatory='True' /> + </family> + + </variables> + + <constraints> + + <check name="valid_in_network" target="ad_public_address"> + <param type='eole'>adresse_network_eth0</param> + <param type='eole'>adresse_netmask_eth0</param> + </check> + <check name="valid_differ" target="ad_public_address"> + <param type='eole'>adresse_ip_eth0</param> + </check> + + </constraints> + + <help> + <variable name='ad_public_address'>Adresse du service AD exposée sur le réseau</variable> + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/scribe-ad/dictionaries/27_eolead_container.xml b/seed/release/eole-2.7/2.7.1/applicationservice/scribe-ad/dictionaries/27_eolead_container.xml new file mode 100644 index 0000000000000000000000000000000000000000..cd98c06b31e442572f43ebff04ad6dee1c430149 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/scribe-ad/dictionaries/27_eolead_container.xml @@ -0,0 +1,64 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + <!-- copie du template fourni par eole-lxc-controller --> + <file name='/usr/share/eole/bastion/data/90-lxc_rules' mode='0755'/> + <service>lxc-net</service> + <service>lxc</service> + </files> + + <variables> + + <family name='réseau avancé'> + <variable name='activer_ajout_hosts' redefine='True' hidden='True'> + <value>oui</value> + </variable> + <variable name='adresse_ip_hosts' redefine='True'/> + <variable name='nom_long_hosts' redefine='True'/> + <variable name='nom_court_hosts' redefine='True'/> + </family> + + <family name='EoleAD'> + <variable name='ad_server' redefine='True' hidden='True'> + <value>addc</value> + </variable> + <variable name='ad_domain' redefine='True' hidden='True'/> + <variable name='ad_address' redefine='True' hidden='True'> + <value>192.0.2.2</value> + </variable> + <variable name='ad_rescue' redefine='True' hidden='True'/> + <variable name='ad_user' redefine='True' hidden='True'> + <value>Administrator</value> + </variable> + <variable name='ad_container' redefine='True' hidden='True'/> + <variable name='ad_ldaps' redefine='True' hidden='True'> + <value>oui</value> + </variable> + </family> + + </variables> + + <constraints> + + <auto name='calc_val' target='adresse_ip_hosts'> + <param type='eole'>ad_address</param> + </auto> + <auto name='concat' target='nom_long_hosts'> + <param type='eole' name='valeur1'>ad_server</param> + <param name='valeur2'>.</param> + <param type='eole' name='valeur3'>ad_domain</param> + </auto> + <auto name='calc_val' target='nom_court_hosts'> + <param type='eole'>ad_server</param> + </auto> + + </constraints> + + <help> + </help> + +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/scribe-ad/files/etc/systemd/system/lxc-net.service.d/override.conf b/seed/release/eole-2.7/2.7.1/applicationservice/scribe-ad/files/etc/systemd/system/lxc-net.service.d/override.conf new file mode 100644 index 0000000000000000000000000000000000000000..03890fae843c2e832e8639a00971ba64fac1e839 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/scribe-ad/files/etc/systemd/system/lxc-net.service.d/override.conf @@ -0,0 +1,2 @@ +[Unit] +Wants=network-online.target diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/scribe-ad/files/usr/lib/eole/eolead.sh b/seed/release/eole-2.7/2.7.1/applicationservice/scribe-ad/files/usr/lib/eole/eolead.sh new file mode 100644 index 0000000000000000000000000000000000000000..629bb67cee68c258d8b753ba6c8d582c1a7195a4 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/scribe-ad/files/usr/lib/eole/eolead.sh @@ -0,0 +1,14 @@ +CONTAINER_NAME=addc +CONTAINER_IP=192.0.2.2 +CONTAINER_ROOTFS=/var/lib/lxc/$CONTAINER_NAME/rootfs + +ConfigureSourcesList() { + # Configuration des sources.list dans le conteneur addc + # $1 : adresse du serveur de mise à jour + grep -iv envole /etc/apt/sources.list > $CONTAINER_ROOTFS/etc/apt/sources.list + cp /etc/apt/trusted.gpg.d/eole-archive-keyring.gpg $CONTAINER_ROOTFS/etc/apt/trusted.gpg.d/eole-archive-keyring.gpg + cat > $CONTAINER_ROOTFS/etc/apt/sources.list.d/seth-samba.list <<EOF +deb http://$1/samba samba-4.9 main +EOF + +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/scribe-ad/files/usr/share/eole/majauto/eolead b/seed/release/eole-2.7/2.7.1/applicationservice/scribe-ad/files/usr/share/eole/majauto/eolead new file mode 100644 index 0000000000000000000000000000000000000000..a1128b8bcf792bff1bc73978e40ef1f39ad6b0bc --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/scribe-ad/files/usr/share/eole/majauto/eolead @@ -0,0 +1,18 @@ +#!/bin/bash +set -e +. /usr/lib/eole/eolead.sh + +# Do not use agent for connections in the container +unset SSH_AUTH_SOCK + +if [ ! -d $CONTAINER_ROOTFS ]; then + echo "Le conteneur $CONTAINER_NAME n'existe pas" + exit 0 +fi + +echo "Mise à jour du conteneur $CONTAINER_NAME" +ConfigureSourcesList $(CreoleGet serveur_maj | head -n 1) +SSH_EXEC="ssh -t -q -o LogLevel=ERROR -o StrictHostKeyChecking=no root@$CONTAINER_NAME" +$SSH_EXEC "apt-get update" +$SSH_EXEC "DEBIAN_FRONTEND=noninteractive apt-get dist-upgrade -y" +$SSH_EXEC "apt-get clean" diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/scribe-ad/files/usr/share/eole/sbin/eolead b/seed/release/eole-2.7/2.7.1/applicationservice/scribe-ad/files/usr/share/eole/sbin/eolead new file mode 100644 index 0000000000000000000000000000000000000000..5b9198bba3a41bd1343ce742f999782b845112f9 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/scribe-ad/files/usr/share/eole/sbin/eolead @@ -0,0 +1,321 @@ +#!/bin/bash + +set -e + +. /etc/lsb-release +. /usr/lib/eole/ihm.sh +. /usr/lib/eole/utils.sh +#eolead.sh fournit CONTAINER_NAME, IP et ROOTFS +. /usr/lib/eole/eolead.sh + +CACHE_DIR=/var/cache/lxc/${DISTRIB_CODENAME} +PARTIAL_DIR=${CACHE_DIR}/partial-amd64 +SSH_EXEC="ssh -t -q -o LogLevel=ERROR -o StrictHostKeyChecking=no root@$CONTAINER_IP" + +REALM=$(CreoleGet ad_domain) +WORKGROUP=$(CreoleGet ad_workgroup) +EOLE_MIRROR=$(CreoleGet serveur_maj | head -n 1) +DNS=$(CreoleGet adresse_ip_dns | head -n 1) +NTP=$(CreoleGet serveur_ntp) +NOM_CARTE=$(CreoleGet nom_carte_eth0) +GATEWAY=$(CreoleGet adresse_ip_gw) +CONTAINER_ETH0=$(CreoleGet ad_public_address) +CONTAINER_CIDR0=$(mask2cdr $(CreoleGet adresse_netmask_eth0)) +EOLE_PROXY_ADDRESS=$(CreoleGet proxy_client_adresse '') +EOLE_PROXY_PORT=$(CreoleGet proxy_client_port '') +APT_PROXY_RES=$(apt-config shell APT_PROXY Acquire::http::Proxy) +eval ${APT_PROXY_RES} + +# Do not use agent for connections in the container +unset SSH_AUTH_SOCK + +# copied from diagnose/151-AD +IFS='.' read -a DN <<< $(CreoleGet ad_domain) +BASE_DN="DC=${DN[0]}" +for ((i=1;i<${#DN[@]};i++)) +do + BASE_DN="${BASE_DN},DC=${DN[$i]}" +done + +echo +EchoBleu "Génération du conteneur $CONTAINER_NAME" + +export DEBIAN_FRONTEND=noninteractive + +# Use proxy from APT if not defined +if [ -z "${http_proxy}" ] +then + if [ -n "${EOLE_PROXY_ADDRESS}" ] + then + export http_proxy="http://${EOLE_PROXY_ADDRESS}:${EOLE_PROXY_PORT}" + export https_proxy="${http_proxy}" + elif [ -n "${APT_PROXY}" ] + then + export http_proxy=${APT_PROXY} + export https_proxy=${APT_PROXY} + fi +fi + +mkdir -p ${PARTIAL_DIR}/etc/apt/apt.conf.d +#We need Apt::Pipeline and No:Cache +cp /etc/apt/apt-eole.conf ${PARTIAL_DIR}/etc/apt/apt.conf +if [ -n "${http_proxy}" ] +then + cat > ${PARTIAL_DIR}/etc/apt/apt.conf.d/02eoleproxy <<EOF +Acquire::http::Proxy "${http_proxy}"; +Acquire::https::Proxy "${http_proxy}"; +EOF +fi + +# Réseau des conteneurs en 192.0.2.0/24 +cat > /etc/default/lxc-net <<EOF +USE_LXC_BRIDGE="true" +LXC_BRIDGE="br0" +LXC_ADDR="192.0.2.1" +LXC_NETMASK="255.255.255.0" +LXC_NETWORK="192.0.2.0/24" +EOF + +systemctl stop lxc-net +ip link del lxcbr0 2>/dev/null || true +sed -i 's/lxc.network.link.*/lxc.network.link = br0/' /etc/lxc/default.conf +systemctl start lxc-net + +lxc-create -n $CONTAINER_NAME -t ubuntu -- -r $DISTRIB_CODENAME -u $DISTRIB_ID -S ~root/.ssh/id_rsa.pub --mirror http://$EOLE_MIRROR/ubuntu + +# Workaround us keyboard set by lxc-create (#24385) +service keyboard-setup restart + +echo +EchoBleu "Configuration du conteneur $CONTAINER_NAME" + +# Configure keyboard +cp /etc/default/keyboard ${CONTAINER_ROOTFS}/etc/default/keyboard + +# addc container in the master timezone #24933 +cp /etc/timezone ${CONTAINER_ROOTFS}/etc/timezone +ln -nsf $(readlink /etc/localtime) ${CONTAINER_ROOTFS}/etc/localtime + +[ ! -f /root/.ssh/id_rsa.pub ] && ssh-keygen -f /root/.ssh/id_rsa -N '' +mkdir -p $CONTAINER_ROOTFS/root/.ssh/ +cp /root/.ssh/id_rsa.pub $CONTAINER_ROOTFS/root/.ssh/authorized_keys +chmod -R 600 $CONTAINER_ROOTFS/root/.ssh/ + +rm -f $CONTAINER_ROOTFS/etc/network/interfaces + +chroot $CONTAINER_ROOTFS apt-get purge -y resolvconf +[ -L $CONTAINER_ROOTFS/etc/resolv.conf ] && rm -f $CONTAINER_ROOTFS/etc/resolv.conf +cat > $CONTAINER_ROOTFS/etc/resolv.conf <<EOF +nameserver $CONTAINER_ETH0 +nameserver $DNS +search $REALM +EOF + +# No dhcp interface in container +sed -ie 's/\( eth0:\) {dhcp4: true}/\1{dhcp4: false}/' ${CONTAINER_ROOTFS}/etc/netplan/10-lxc.yaml + +cat > /var/lib/lxc/$CONTAINER_NAME/config <<EOF +# Template used to create this container: /usr/share/lxc/templates/lxc-ubuntu + +# Common configuration +lxc.include = /usr/share/lxc/config/ubuntu.common.conf + +# Container specific configuration +lxc.uts.name = $CONTAINER_NAME +lxc.arch = amd64 +lxc.rootfs.path = $CONTAINER_ROOTFS + +# EOLE look for /dev/lxc to detect container mode and behave differently +lxc.tty.dir = LXC + +# Automatic start at bootup +lxc.start.auto = 1 + +# Network configuration +# eth0 on eth0 +lxc.net.0.type = macvlan +lxc.net.0.link = $NOM_CARTE +lxc.net.0.flags = up +lxc.net.0.name = eth0 +lxc.net.0.mtu = 1500 +lxc.net.0.macvlan.mode = bridge +lxc.net.0.ipv4.address = $CONTAINER_ETH0/$CONTAINER_CIDR0 +lxc.net.0.ipv4.gateway = ${GATEWAY} + +# containers on br0 +# Reuse LTSP server IP +# http://eole.ac-dijon.fr/documentations/2.6/partielles/beta/EOLE/co/02-fichiers.html +lxc.net.1.type=veth +lxc.net.1.link=br0 +lxc.net.1.flags=up +lxc.net.1.name = containers +lxc.net.1.mtu = 1500 +lxc.net.1.veth.pair = ${CONTAINER_NAME}_0 +lxc.net.1.ipv4.address = $CONTAINER_IP/24 +EOF + +cat > $CONTAINER_ROOTFS/etc/nsswitch.conf <<EOF +passwd: compat winbind +group: compat winbind +shadow: compat +gshadow: files + +hosts: files dns +networks: files + +protocols: db files +services: db files +ethers: db files +rpc: db files + +netgroup: nis +EOF + +mkdir -p $CONTAINER_ROOTFS/etc/eole +cat > $CONTAINER_ROOTFS/etc/eole/samba4-vars.conf <<EOF +AD_REALM='$REALM' +AD_DOMAIN='$WORKGROUP' +AD_HOST_NAME='$CONTAINER_NAME' +AD_HOST_IP='$CONTAINER_ETH0' +NOM_CARTE_NIC1='eth0' +AD_SERVER_ROLE='controleur de domaine' +BASEDN='$BASE_DN' +NTP_SERVERS='$NTP' +AD_ADDITIONAL_DC_IP='' +AD_DOMAIN_SID='' +AD_ADDITIONAL_DC='non' +AD_DNS_BACKEND='SAMBA_INTERNAL' +AD_ADMIN='Administrator' +AD_HOST_KEYTAB_FILE='/var/lib/samba/eole-ad-dc.keytab' +ACTIVER_AD_HOMES_SHARE='oui' +ACTIVER_AD_PROFILES_SHARE='oui' +AD_HOMES_SHARE_HOST_NAME='' +AD_PROFILES_SHARE_HOST_NAME='' +AD_HOME_SHARE_PATH='/home/adhomes' +AD_PROFILE_SHARE_PATH='/home/adprofiles' +AD_INSTANCE_LOCK_FILE='/var/lib/samba/.instance_ok' +AD_BACKEND_STORE='tdb' +AD_PLAINTEXT_SECRETS='non' +EOF + +mkdir -p $CONTAINER_ROOTFS/usr/lib/eole +cp /usr/lib/eole/ihm.sh $CONTAINER_ROOTFS/usr/lib/eole/ihm.sh +cp /usr/bin/tcpcheck $CONTAINER_ROOTFS/usr/bin/tcpcheck + +ConfigureSourcesList $EOLE_MIRROR + +echo +EchoBleu "Démarrage du conteneur $CONTAINER_NAME" +lxc-start -n $CONTAINER_NAME -d + +try=0 +max_try=10 +while [ ${try} -le ${max_try} ]; do + if [ ${try} -eq ${max_try} ]; then + EchoRouge "Impossible de contacter le conteneur via ssh" + exit 1 + fi + sleep 2 + tcpcheck 3 $CONTAINER_IP:22 >/dev/null && break + try=$((try+1)) +done +echo -n "Serveur démarré : " +$SSH_EXEC "cat /etc/hostname" + +echo +EchoBleu "Finalisation du conteneur $CONTAINER_NAME" + +cat > $CONTAINER_ROOTFS/usr/sbin/policy-rc.d <<EOF +#!/bin/sh +exit 101 +EOF +chmod a+x $CONTAINER_ROOTFS/usr/sbin/policy-rc.d + + +$SSH_EXEC "userdel -r Ubuntu 2>/dev/null" + +$SSH_EXEC "apt-get update" +$SSH_EXEC "DEBIAN_FRONTEND=noninteractive apt-get install eole-ad-pkg -y" +$SSH_EXEC "apt-get clean" + +cat > $CONTAINER_ROOTFS/etc/krb5.conf <<EOF +[libdefaults] +default_realm = ${REALM^^} +dns_lookup_realm = false +dns_lookup_kdc = false + +[realms] +${REALM^^} = { +kdc = $CONTAINER_ETH0 +} + +[domain_realms] +.${REALM} = ${REALM^^} +${REALM} = ${REALM^^} +EOF + +cat > $CONTAINER_ROOTFS/etc/samba/smb.conf <<EOF +[global] + realm = ${REALM^^} + workgroup = ${WORKGROUP^^} + netbios name = ${CONTAINER_NAME^^} + disable netbios = yes + smb ports = 445 + vfs objects = acl_xattr + map acl inherit = Yes + store dos attributes = Yes + winbind separator = / + server role = active directory domain controller + dns forwarder = $DNS + tls enabled = yes + tls keyfile = /var/lib/samba/private/tls/key.pem + tls certfile = /var/lib/samba/private/tls/cert.pem + tls cafile = /var/lib/samba/private/tls/ca.pem + +[netlogon] + comment = Network Logon Service + path = /home/sysvol/$REALM/scripts + read only = No + guest ok = yes + +[sysvol] + comment = Sysvol Service + path = /home/sysvol + read only = No + guest ok = yes + +[homes] + path = "/home/adhomes/%u" + root preexec = /usr/share/eole/sbin/create_adhome.sh "%u" "/home/adhomes" + comment = Home Directories + read only = no + invalid users = nobody guest + +[profiles] + comment = Profiles + path = "/home/adprofiles" + read only = No + invalid users = nobody guest +EOF + + +echo +EchoBleu "Configuration du service samba-ad-dc" +$SSH_EXEC "systemctl mask smbd" +$SSH_EXEC "systemctl mask nmbd" +$SSH_EXEC "systemctl mask winbind" +$SSH_EXEC "systemctl unmask samba-ad-dc" +$SSH_EXEC "systemctl enable samba-ad-dc" + +rm $CONTAINER_ROOTFS/usr/sbin/policy-rc.d + +$SSH_EXEC ". /usr/lib/eole/samba4.sh && . /etc/eole/samba4-vars.conf && samba_instance" + +cp $CONTAINER_ROOTFS/etc/krb5.conf $CONTAINER_ROOTFS/var/lib/samba/private/krb5.conf + +[ ! -e /var/log/samba-ad-dc ] && ln -ns $CONTAINER_ROOTFS/var/log/samba /var/log/samba-ad-dc + +# clean container cache +rm -rf ${CACHE_DIR} + +echo diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/scribe-ad/postservices/06-eolead-inject-password b/seed/release/eole-2.7/2.7.1/applicationservice/scribe-ad/postservices/06-eolead-inject-password new file mode 100644 index 0000000000000000000000000000000000000000..ba9a2aa93ecbd9569cecc7b475f1f05e2afbd66b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/scribe-ad/postservices/06-eolead-inject-password @@ -0,0 +1,22 @@ +#!/bin/bash +. /usr/lib/eole/ihm.sh + +# Do not use agent for connections in the container +unset SSH_AUTH_SOCK + +[ "$1" = "instance" ] || exit 0 +resync=0 + +if [ -f /etc/eole/.instance ];then + Question_ouinon "Voulez-vous (re)synchroniser les mots de passe des utilisateurs ?" "True" "oui" "warn" + resync="$?" +fi +if [ "$resync" = "0" ]; then + pdbedit -L -w | sed -e "/^.*$:/d" | awk -F: '{print "pdbedit -u " $1 " --set-nt-hash " $4}' > /var/lib/lxc/addc/rootfs/tmp/injectpwd + nb=$(wc -l < /var/lib/lxc/addc/rootfs/tmp/injectpwd) + echo "Synchronisation en cours ($nb mots de passe)..." + ssh -t -q -o LogLevel=ERROR -o StrictHostKeyChecking=no root@addc "bash /tmp/injectpwd >/dev/null" + [ $? -ne 0 ] && exit 1 + rm -f /var/lib/lxc/addc/rootfs/tmp/injectpwd + echo +fi diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/scribe-ad/posttemplates/04-samba-ad b/seed/release/eole-2.7/2.7.1/applicationservice/scribe-ad/posttemplates/04-samba-ad new file mode 100644 index 0000000000000000000000000000000000000000..c7158286f0525d995e3f1a5cbd1ea07e9862553f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/scribe-ad/posttemplates/04-samba-ad @@ -0,0 +1,10 @@ +#!/bin/bash +. /usr/lib/eole/eolead.sh + +#Deactivate resolver on 127.0.0.53:53 for samba interantl dns +cp /etc/systemd/resolved.conf $CONTAINER_ROOTFS/etc/systemd/resolved.conf + +# update DNS forwarder +sed -ie "s/dns forwarder.*/dns forwarder = $(CreoleGet adresse_ip_dns | head -n 1)/" $CONTAINER_ROOTFS/etc/samba/smb.conf + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/scribe-ad/posttemplates/05-eolead b/seed/release/eole-2.7/2.7.1/applicationservice/scribe-ad/posttemplates/05-eolead new file mode 100644 index 0000000000000000000000000000000000000000..7a0b90c13fd1041402db03683e54df4a47a7b30f --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/scribe-ad/posttemplates/05-eolead @@ -0,0 +1,13 @@ +#!/bin/bash + +. /usr/lib/eole/eolead.sh + +#Take care of motd in addc container +cp -f /etc/update-motd.d/{00-header,10-help-text} $CONTAINER_ROOTFS/etc/update-motd.d/ +cp -f /etc/default/motd-news $CONTAINER_ROOTFS/etc/default/motd-news +rm -rf $CONTAINER_ROOTFSetc/cron.daily/ubuntu-advantage-tools +> $CONTAINER_ROOTFS/var/cache/motd-news +rm -rf $CONTAINER_ROOTFS/var/cache/ubuntu-advantage-tools/* +#End motd configuration + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/scribe-ad/preservices/05-eolead b/seed/release/eole-2.7/2.7.1/applicationservice/scribe-ad/preservices/05-eolead new file mode 100644 index 0000000000000000000000000000000000000000..36d149f0785abff36c747ea5146f9b0023b9dd8d --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/scribe-ad/preservices/05-eolead @@ -0,0 +1,30 @@ +#!/bin/bash + +. /usr/lib/eole/ihm.sh +. /usr/lib/eole/eolead.sh + +if [ "$1" = "instance" ]; then + if [ -d $CONTAINER_ROOTFS ]; then + echo "Le conteneur $CONTAINER_NAME est présent" + else + if grep -qE ' (cdrom|file):' /etc/apt/sources.list + then + EchoOrange "La construction du conteneur est impossible à partir du CD-ROM" + EchoCyan "Configuration des sources APT afin de mettre à jour depuis le réseau" + Query-Auto + [ $? -ne 0 ] && exit 1 + fi + /usr/share/eole/sbin/eolead + [ $? -ne 0 ] && exit 1 + keytool -delete -alias eole-ad -keystore /etc/ssl/certs/java/cacerts -storepass changeit >/dev/null + keytool -import -trustcacerts -keystore /etc/ssl/certs/java/cacerts -storepass changeit -noprompt -alias eole-ad -file $CONTAINER_ROOTFS/var/lib/samba/private/tls/ca.pem + fi +elif [ ! -d $CONTAINER_ROOTFS ]; then + echo + EchoRouge "Le conteneur $CONTAINER_NAME n'existe pas" + echo "Il est nécessaire de relancer la procédure d'instanciation" + echo + exit 1 +fi + +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/scribe-ad/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/scribe-ad/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..99c896e8ef458be96044f9b780bacfff8a9f26a3 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/scribe-ad/service.yml @@ -0,0 +1,53 @@ +format: '0.1' +name: scribe-ad +version: |- + 2.7.1-6 +description: |- + Transformation d'un Scribe NT en Scribe AD + Avec ajout du service samba-ad-dc dans un conteneur LXC + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: + - eole-ad + - eolead-gpo-script +packages: + - eole-scribe-module + - eole-workstation + - lxc-templates + - debootstrap + - cgroup-lite +dictionaries: + - 25_eolead_container.xml + - 27_eolead_container.xml +extra_dictionaries: {} +templates: + - 90-lxc_rules +creole_funcs: [] +preservices: + - 05-eolead +postservices: + - 06-eolead-inject-password +pretemplates: [] +posttemplates: + - 04-samba-ad + - 05-eolead +files: + /etc/systemd/system/lxc-net.service.d/override.conf: + owner: root + group: root + mode: '0644' + /usr/lib/eole/eolead.sh: + owner: root + group: root + mode: '0644' + /usr/share/eole/majauto/eolead: + owner: root + group: root + mode: '0755' + /usr/share/eole/sbin/eolead: + owner: root + group: root + mode: '0755' +excluding_regexp: + /usr/share/doc: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/scribe-ad/templates/90-lxc_rules b/seed/release/eole-2.7/2.7.1/applicationservice/scribe-ad/templates/90-lxc_rules new file mode 100644 index 0000000000000000000000000000000000000000..98faa542da1e9cb04ab31467a5378812e21ee338 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/scribe-ad/templates/90-lxc_rules @@ -0,0 +1,20 @@ +#!/bin/bash + +# Accept from containers to LXC controller +/sbin/iptables -A INPUT -i br0 -s 192.0.2.2/255.255.255.0 -j ACCEPT + +# Accept from LXC controller to containers +/sbin/iptables -A OUTPUT -o br0 -d 192.0.2.2/255.255.255.0 -j ACCEPT + +# Accept from containers to containers +/sbin/iptables -A FORWARD -i br0 -o br0 -s 192.0.2.2/255.255.255.0 -d 192.0.2.2/255.255.255.0 -j ACCEPT + +# Accept from containers to outside +/sbin/iptables -A FORWARD -i br0 -j ACCEPT + +# Accept ESTABLISHED from outside to containers +# Required in forteress mode +/sbin/iptables -A FORWARD -o br0 -m state --state ESTABLISHED,RELATED -j ACCEPT + +# MASQUERADE containers getting outside +/sbin/iptables -t nat -A POSTROUTING -s 192.0.2.2/255.255.255.0 ! -o br0 -j MASQUERADE diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/seth-aaf/dictionaries/00_seth-aaf_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/seth-aaf/dictionaries/00_seth-aaf_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..7d3d23001fe841f5d86693ec1916b5c2dfbfdfe9 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/seth-aaf/dictionaries/00_seth-aaf_packages.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>eole-mongodb</package> + <package>python-eoleaaf</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/seth-aaf/dictionaries/20_sethaaf.xml b/seed/release/eole-2.7/2.7.1/applicationservice/seth-aaf/dictionaries/20_sethaaf.xml new file mode 100644 index 0000000000000000000000000000000000000000..38f46ef2d06b215b727ea362d8372c421b3016d9 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/seth-aaf/dictionaries/20_sethaaf.xml @@ -0,0 +1,9 @@ +<?xml version='1.0' encoding='utf-8'?> + +<creole> + + <files> + <file name="/etc/aaf.conf"/> + </files> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/seth-aaf/extra_dictionaries/importaaf/00_action.xml b/seed/release/eole-2.7/2.7.1/applicationservice/seth-aaf/extra_dictionaries/importaaf/00_action.xml new file mode 100644 index 0000000000000000000000000000000000000000..d7ae135109b8f2587b1506f17364f22c82669b26 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/seth-aaf/extra_dictionaries/importaaf/00_action.xml @@ -0,0 +1,28 @@ +<creole> + <family_action name="AAF" + description="Import AAF" + color="#fcce74" + image="system.svg"> + <action type="form" + title="Import AAF" + description="Lancement de la procédure d'importation AAF" + image="icons/preferences-system-session.svg"> + <input>Lancer une importation</input> + <profile>ead_admin</profile> + <ewtapp>ead</ewtapp> + <tag>aaf</tag> + <tag>importation</tag> + </action> + </family_action> + <variables> + <family name="aaf" description="Fichier"> + <variable name="aaf_filename" description="Nom du fichier de configuration (attention, importer le fichier au bon endroit)"/> + <variable name="aaf_type" description="Import complet ou delta"/> + </family> + </variables> + <constraints> + <check name="valid_enum" target="importaaf.aaf.aaf_filename"><param type="python">eosfunc.uploaded_files(['.zip'], "Aucun fichier téléversé depuis l'action 'Gérer les fichiers'")</param></check> + <check name="valid_enum" target="importaaf.aaf.aaf_type"><param>['complet', 'delta']</param></check> + </constraints> + <help/> +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/seth-aaf/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/seth-aaf/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..c18b21eac341849c91590954bfc271d786b1cb8a --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/seth-aaf/service.yml @@ -0,0 +1,29 @@ +format: '0.1' +name: seth-aaf +version: |- + 2.6.2-4 +description: |- + version seth de AAF + . + Pour toute information complémentaire, veuillez vous rendre sur le + site du projet EOLE. +depends: [] +packages: + - eole-mongodb + - python-eoleaaf +dictionaries: + - 20_sethaaf.xml +extra_dictionaries: + importaaf: + - 00_action.xml +templates: + - aaf.conf +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: [] +files: {} +excluding_regexp: + /usr/share/doc: 2 + /usr/share/eole/creole/extra/importaaf/salt/: 2 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/seth-aaf/templates/aaf.conf b/seed/release/eole-2.7/2.7.1/applicationservice/seth-aaf/templates/aaf.conf new file mode 100644 index 0000000000000000000000000000000000000000..a79f77e0eaba7e1e7e1c3412c1ad1a72074e7e4c --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/seth-aaf/templates/aaf.conf @@ -0,0 +1,3 @@ +dbtype="mongodb" +aaf_type="samba4" +basedn="DC=%echo ',DC='.join(%%ad_realm.split('.')) + '"' diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/zephir-stats/dictionaries/00_zephir-stats_packages.xml b/seed/release/eole-2.7/2.7.1/applicationservice/zephir-stats/dictionaries/00_zephir-stats_packages.xml new file mode 100644 index 0000000000000000000000000000000000000000..fdab90588c9aef84451151bbbb86efe5d1935984 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/zephir-stats/dictionaries/00_zephir-stats_packages.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + + <files> + + <package>zephir-client</package> + + </files> + + <variables /> + <constraints /> + <help /> + +</creole> diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/zephir-stats/dictionaries/99_zephir-stats.xml b/seed/release/eole-2.7/2.7.1/applicationservice/zephir-stats/dictionaries/99_zephir-stats.xml new file mode 100644 index 0000000000000000000000000000000000000000..bdb705ef50105c6087285abb480048a9e201efed --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/zephir-stats/dictionaries/99_zephir-stats.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> + +<creole> + <files> + <service>z_stats</service> + <service_access service='z_stats'> + <port>8090</port> + </service_access> + <service_restriction service='z_stats'> + <ip interface='eth0' netmask='netmask_admin_eth0' netmask_type='SymLinkOption' ip_type='SymLinkOption'>ip_admin_eth0</ip> + <ip interface='eth1' netmask='netmask_admin_eth1' netmask_type='SymLinkOption' ip_type='SymLinkOption'>ip_admin_eth1</ip> + <ip interface='eth2' netmask='netmask_admin_eth2' netmask_type='SymLinkOption' ip_type='SymLinkOption'>ip_admin_eth2</ip> + <ip interface='eth3' netmask='netmask_admin_eth3' netmask_type='SymLinkOption' ip_type='SymLinkOption'>ip_admin_eth3</ip> + <ip interface='eth4' netmask='netmask_admin_eth4' netmask_type='SymLinkOption' ip_type='SymLinkOption'>ip_admin_eth4</ip> + </service_restriction> + </files> + <variables /> + <constraints /> + <help /> +</creole> +<!-- vim: ts=4 sw=4 expandtab +--> + + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/zephir-stats/files/etc/cron.d/zephir-stats b/seed/release/eole-2.7/2.7.1/applicationservice/zephir-stats/files/etc/cron.d/zephir-stats new file mode 100644 index 0000000000000000000000000000000000000000..5777553764a8634dc1ad9644bc156c3623e0a00e --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/zephir-stats/files/etc/cron.d/zephir-stats @@ -0,0 +1 @@ +*/10 * * * * root /usr/share/zephir/scripts/cron-zephir.sh &>/dev/null diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/zephir-stats/files/etc/logrotate.d/zephir-stats b/seed/release/eole-2.7/2.7.1/applicationservice/zephir-stats/files/etc/logrotate.d/zephir-stats new file mode 100644 index 0000000000000000000000000000000000000000..297489969225ee382965ef088b801edb1fa60bca --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/zephir-stats/files/etc/logrotate.d/zephir-stats @@ -0,0 +1,18 @@ +missingok +notifempty +compress + +/var/log/zephir/actions.log { + rotate 10 + weekly +} + +/var/log/rsyslog/local/zephir/zephir*.log +/var/log/rsyslog/local/zephiragents/zephiragents*.log { + rotate 10 + weekly + sharedscripts + postrotate + service rsyslog rotate > /dev/null + endscript +} diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/zephir-stats/files/lib/systemd/system/z_stats.service b/seed/release/eole-2.7/2.7.1/applicationservice/zephir-stats/files/lib/systemd/system/z_stats.service new file mode 100644 index 0000000000000000000000000000000000000000..4d835955975f28d725f80615df09b3dae474ef3b --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/zephir-stats/files/lib/systemd/system/z_stats.service @@ -0,0 +1,24 @@ +[Unit] +Description=Agent zephir +After=bastion.service +ConditionPathExists=/etc/eole/config.eol + +[Service] +Type=idle +ExecStart=/usr/bin/twistd \ + --nodaemon \ + --no_save \ + --pidfile /run/z_stats.pid \ + zephiragents \ + --tmp=data \ + --data=stats \ + --archive=/tmp \ + --static=static \ + --actions=actions +PIDFile=/run/z_stats.pid +WorkingDirectory=/usr/share/zephir/monitor +Restart=always +SyslogIdentifier=zephiragents + +[Install] +WantedBy=bastion.service diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/zephir-stats/files/usr/share/ead2/backend/actions/cmd_update_zephir.py b/seed/release/eole-2.7/2.7.1/applicationservice/zephir-stats/files/usr/share/ead2/backend/actions/cmd_update_zephir.py new file mode 100644 index 0000000000000000000000000000000000000000..befd35f4bc0fa8971ce9d1b30cca02d0acbbaf45 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/zephir-stats/files/usr/share/ead2/backend/actions/cmd_update_zephir.py @@ -0,0 +1,12 @@ +# -*- coding: UTF-8 -*- +from ead2.backend.actions.lib.main import Cmd + +class Cmd_Zephir(Cmd): + """ + Action du mode commande + """ + name = "cmd_update_zephir" + # propriété de la commande à exécuter + cmd_template = "/usr/share/zephir/scripts/zephir_client save_files 3" + cmd_libelle = "Remonter les données locales sur Zéphir" + diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/zephir-stats/files/usr/share/ead2/backend/config/actions/actions_zstats.cfg b/seed/release/eole-2.7/2.7.1/applicationservice/zephir-stats/files/usr/share/ead2/backend/config/actions/actions_zstats.cfg new file mode 100644 index 0000000000000000000000000000000000000000..6b7499420ce92c6f7f7d7c911be1b89f74a9b6a5 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/zephir-stats/files/usr/share/ead2/backend/config/actions/actions_zstats.cfg @@ -0,0 +1 @@ +cmd_update_zephir diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/zephir-stats/files/usr/share/ead2/backend/config/cmds/zstats.cmd b/seed/release/eole-2.7/2.7.1/applicationservice/zephir-stats/files/usr/share/ead2/backend/config/cmds/zstats.cmd new file mode 100644 index 0000000000000000000000000000000000000000..6b7499420ce92c6f7f7d7c911be1b89f74a9b6a5 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/zephir-stats/files/usr/share/ead2/backend/config/cmds/zstats.cmd @@ -0,0 +1 @@ +cmd_update_zephir diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/zephir-stats/files/usr/share/ead2/backend/config/perms/perm_zstats.ini b/seed/release/eole-2.7/2.7.1/applicationservice/zephir-stats/files/usr/share/ead2/backend/config/perms/perm_zstats.ini new file mode 100644 index 0000000000000000000000000000000000000000..d77a94d64dfc547b9ececa9d0979545028d363c3 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/zephir-stats/files/usr/share/ead2/backend/config/perms/perm_zstats.ini @@ -0,0 +1,5 @@ +[roles] +admin=Administrateur + +[permissions] +cmd_update_zephir=admin diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/zephir-stats/files/usr/share/zephir/scripts/cron-zephir.sh b/seed/release/eole-2.7/2.7.1/applicationservice/zephir-stats/files/usr/share/zephir/scripts/cron-zephir.sh new file mode 100644 index 0000000000000000000000000000000000000000..a2f152cde896fc4f0167886774ff402f7f7a6fc8 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/zephir-stats/files/usr/share/zephir/scripts/cron-zephir.sh @@ -0,0 +1,36 @@ +#!/bin/bash +########################################################################### +# Eole NG - 2007 +# Copyright Pole de Competence Eole (Ministere Education - Academie Dijon) +# Licence CeCill cf /root/LicenceEole.txt +# eole@ac-dijon.fr +# +# cronzephir.sh +# +# script relançant le service z_stats si il est arreté +# +########################################################################### + +# ne pas relancer z_stats avant la première installation +is_inst=$(CreoleGet "module_instancie") +[ "$is_inst" = "non" ] && exit 0 + +/usr/bin/enregistrement_zephir --check >/dev/null +if [ $? -eq 0 ] +then + # le serveur est enregistré, on vérifie que le service de statistiques fonctionne + systemctl status z_stats &> /dev/null + if [ $? != 0 ] + then + . /usr/lib/eole/zephir.sh + # pas de redémarrage au milieu du reconfigure (#3133) + # test de lock système globaux via CreoleLock + CreoleLock is_locked --level=system + if [ $? -ne 0 ] + then + CreoleService z_stats restart + Zephir "MSG" "Service z_stats arreté : redémarrage" "ZEPHIR" + fi + fi +fi +exit 0 diff --git a/seed/release/eole-2.7/2.7.1/applicationservice/zephir-stats/service.yml b/seed/release/eole-2.7/2.7.1/applicationservice/zephir-stats/service.yml new file mode 100644 index 0000000000000000000000000000000000000000..d70b33f60992d8013b48c5c3e2633336b967d655 --- /dev/null +++ b/seed/release/eole-2.7/2.7.1/applicationservice/zephir-stats/service.yml @@ -0,0 +1,57 @@ +format: '0.1' +name: zephir-stats +version: |- + 2.7.1-2 +description: |- + programmes d'interconnexion d'un client EOLE avec un Zéphir + Pour toute information complementaire, veuillez vous rendre + sur le site du Projet a l'adresse suivante : + . + http://eole.orion.education.fr +depends: [] +packages: + - zephir-client +dictionaries: + - 99_zephir-stats.xml +extra_dictionaries: {} +templates: [] +creole_funcs: [] +preservices: [] +postservices: [] +pretemplates: [] +posttemplates: [] +files: + /etc/cron.d/zephir-stats: + owner: root + group: root + mode: '0644' + /etc/logrotate.d/zephir-stats: + owner: root + group: root + mode: '0644' + /lib/systemd/system/z_stats.service: + owner: root + group: root + mode: '0644' + /usr/share/ead2/backend/actions/cmd_update_zephir.py: + owner: root + group: root + mode: '0644' + /usr/share/ead2/backend/config/actions/actions_zstats.cfg: + owner: root + group: root + mode: '0644' + /usr/share/ead2/backend/config/cmds/zstats.cmd: + owner: root + group: root + mode: '0644' + /usr/share/ead2/backend/config/perms/perm_zstats.ini: + owner: root + group: root + mode: '0644' + /usr/share/zephir/scripts/cron-zephir.sh: + owner: root + group: root + mode: '0755' +excluding_regexp: + /usr/share/doc: 2