Installer Alfresco CE (5.x) + DEBIAN

Laurent Archambault

Historique des versions
Version 1.020 juillet 2016
Aflfresco Community - 5.1.0 (r125711-b6) - Publication.
Historique des versions
Version 1.125 juillet 2016
Aflfresco Community - 5.1.0 (r127059-b7) - Mises à jour et publication .
Historique des versions
Version 1.205 novembre 2016
Aflfresco Community - 5.1.0 (r127059-b7) - Install Clamav et Borg; publication .
Historique des versions
Version 1.327 décembre 2016
Aflfresco Community - 5.2.0 (r133656-b12) - Update version 5.1 à 5.2.0 et diverses corrections; publication .

Table des matières

Contexte
1. Préparations nécessaires avant installation.
Les dépendances
Les partitions disques
Ajout d'un nouveau disque
REBOOT et fsck
La configuration réseau
Les sources d'Alfresco Community
Le connecteur JAVA-Mysql
2. Installation de Alfresco Community
Préparation de la base de données
Installation d'Alfresco Community 5.1.0
Copie du connecteur JAVA/Mysql
Adapter le fichier de configuration selon vos paramètres
3. Post lancement
Accès aux interfaces
Alfresco et LibreOffice
Le fichier alfresco.sh
Le fichier libreoffice_ctl.sh
Le process Soffice.bin
Les fichiers d'historiques
Optimisation de la JVM
4. La sauvegarde intégrale (classique)
Le répertoire Alfresco et la base de données (Mysql)
Sauvegarde des données
Sauvegarde niveau utilisateurs
5. Alfresco et les suites bureautiques
Pour Ms Office 2010/2013
Du côté d'Alfresco :
Du côté de Microsoft™ Office 2010/2013
Pour LibreOffice (ou OpenOffice)
6. Divers
Mise à jour des certificats HTTPS/TLS
Insertion du certificat d'autorité
Pour Windows
Pour GNU/Linux
Durée d'une session :
Activation de la messagerie pour les notifications
Suppression des index SOLR
7. Les thèmes
Création d'un nouveau thème
Ajout d'un thème
8. Les flux IP
Les différents flux
Les flux
Retrait des services inutiles
Activation d'Iptables
Les modules Apache nécessaires
Les certificats pour Apache
Le script de création des certificats SSLmaison
SOLR 4 en HTTP
9. BeCpg (projet)
Installation du module beCPG
Petit guide
10. Modifications diverses pour l'interface
Suppression du bouton Like (aimer)
11. Création via l'interface WEB
Gestion des rôles
Création d'un utilisateur
Création d'un groupe
Création d'un site
Suppression création de site/utilisateurs
12. Le classement des documents/informations
Les catégories et les tags :
Les règles applicables aux dossiers
Exemple : durée de vie d'une image(s)
Les aspects
13. Les extensions d'Alfresco
La liste de données
Les Discussions
Les liens
Le Blog
Le Wiki
Le calendrier
Les Membres du site
14. Les modèles
Ajout d'un modèle dans la Liste de données
Mon modèle "mutation"
mutation_2-model-context.xml
mutation_2-model.xml
share-config-custom.xml
Lister les modèles
ERROR de nom d'espace
15. Personnalisation des méls Alfresco
Modifier le texte des méls envoyés par Alfresco
16. Installation d'un antivirus (Clamav)
Installation
Configuration
Exploitation
17. La supervision possible
18. La sauvegarde dédupliquée (Borg)
Borg Backup et la déduplication
Installation
Initialisation :
Création de la 1ere sauvegarde
La sauvegarde suite
Borg extract
Borg mount
Automatiser la sauvegarde
Le script plus évolué
Lister les sauvegardes
Changement du mot passphrase
Au final
19. La mise à jour (de 5.1 à 5.2)
Procédure :
Sauvegarde de alf_data
Sauvegarde de la base de données.
Légère complication :
Installation de la nouvelle version (5.2) :
Installation suites :
20. Activer une fonction OCR (simple-OCR)
Téléchargement du fichier
Installation des dépendances :
A. Les liens utiles.
Glossary

List of Tables

11.1. Plus en détail
11.2. Les permissions sur les dossiers :
11.3. Les permissions sur les répertoires :
11.4. Les permissions sur les utilisateurs :
11.5. Les privilèges :

Contexte

Ce document va tenter de vous expliquer comment installer, configurer et exploiter Alfresco Community™ 5.1, qui est sortie en juin 2016.

Ce choix pour Alfresco™ n'est pas un hasard. Il est dû à un choix possible techniquement par mes DSI, ceci me permet de présenter un produit approuvé/autorisé dans mon entreprise. Je sais c'est un long débat; c'est aussi un système de fichier CIFS (1985 par IBM qu'il est utile de rappeller) que je percois désormais comme complètement non approprié pour un travail en réseau collaboratif, sans parlé de la sécurité. Pour moi c'est tout juste bon pour de la sauvegarde/archivage.

Il est temps de faire voir au DSI qu'il est possible d'avoir des fonctionnalités meilleures, et sans rien débourser. C'est le domaine des applications ECM (gestion de contenu d'entreprise), qui est très proche du système GED (gestion électronique de documents).

Il est à noter qu'Alfresco propose deux versions, l'une est payante et l'autre non. La différence provient du support, et de certaines fonctionnalités. C'est la version gratuite qui sera choisie, les 2 solutions proposées sont toutes en Open source. Toutes ces versions prennent en compte l'économie, l'innovation, l'interopérabilité et même la prise en compte des mobiles.

[Note]Note
Alfresco en 2009 ou 2010 a remporté la certification DoD 5015.2 du ministère américain de la Défense.

Il est à noter que ce document doit aussi me servir de cahier de consignes à propos de ce serveur, d'ou parfois une sortie du sujet principal le tout volontairement.

Voici comment installer le tueur de Microsoft Share Point, je pense qu'éffectivement ceci n'est pas surévalué, essayez et vous verrez ! Mais fini le clickodrome, la limite désormais c'est vous !

Remerciements à Monsieur Guillou, qui m'a aidé sur plusieurs points, et qui utilise bien évidemment Alfresco.

Chapter 1. Préparations nécessaires avant installation.

Une machine virtuelle (MV) avec VirtualBox et une Debian 8.5. Même si cela a été un échec pour moi, voici la commande pour intégrer les addons virtualBox dans un environnement sans aucune interface graphique :

sh /media/cdrom/VBoxLinuxAdditions.run -nox11

Ne pas installer cette option ne compromet rien.

Les dépendances

Elles sont assez nombreuses, de plus cette machine virtuelle (MV) sera en mesure d'héberger d'autres petites applications en complément. Le rôle principal comme les ressources pour ce serveur sont réservés pour Alfresco. À ce titre c'est Mysql qui sera installé, avec Phpmyadmin pour la gestion graphique. Alfresco préconise Postgresql, c'est un excellent choix. Le passage de Postgresql à Mysql est facile.

apt-get update ; aptitude install postfix mysql xfonts-base imagemagick ghostscript libmail-sendmail-perl mysql-server  \
  build-essential zlib1g-dev libfreetype6-dev libjpeg-dev libgif-dev ffmpeg openssh-server openssh-client postfix \
  console-data phpmyadmin ntpdate  xfonts-100dpi xfonts-75dpi xfonts-encodings xfonts-scalable \ 
  xfonts-bolkhov-75dpi xfonts-bolkhov-koi8r-misc xfonts-bolkhov-misc libemail-sender-perl libnet-ssh2-perl \
  xfonts-cronyx-koi8r-100dpi xfonts-cronyx-koi8r-75dpi xfonts-cronyx-koi8r-misc xfonts-cyrillic libmail-sender-perl \
  sensord ntpdate

Il est à noter que les programmes suivants sont aussi installés ghostscript, ffmpeg et imagemagick. Ces programmes ne sont pas demandés, néanmoins pour des versions précédentes ils étaient nécessaires, d'où cette action. Ils servent principalement à faire du rendu au travers du WEB (apercu PDF, images...). Ils sont inclus dans les sources d'Alfresco, donc c'est un des gadgets. Ceci ne mange pas de pain...on ne sait jamais.

Les partitions disques

En général je n'en parle pas, cette MV sera dotée de LVM2 Linux. Donc les partitions qui sont définies pourront évoluer avec souplesse. Je ne vais pas m'étendre sur le sujet.

ACTIVE            '/dev/alfresco-vg/root' [8,38 GiB] inherit
ACTIVE            '/dev/alfresco-vg/var' [2,79 GiB] inherit
ACTIVE            '/dev/alfresco-vg/swap_1' [6,05 GiB] inherit
ACTIVE            '/dev/alfresco-vg/tmp' [380,00 MiB] inherit
ACTIVE            '/dev/alfresco-vg/home' [42,55 GiB] inherit

Et pour information, une fois le système opérationnel, voici la place occupée :

root@alfresco:/opt/alfresco-community# pvdisplay
    --- Physical volume ---
PV Name               /dev/sda5
VG Name               alfresco-vg
PV Size               60,15 GiB / not usable 0   
Allocatable           yes (but full)
PE Size               4,00 MiB
Total PE              15398
Free PE               0
Allocated PE          15398
PV UUID               10qNv0-wS3i-QMuS-FFsL-HpxJ-rlkF-NveWw0 

J'ai donc pour Alfresco un disque au total de 60 Go, géré par LVM2 sur une seule partition Nom du PV : alfresco-vg. Ce volume logique (PV) doit contenir un système de fichier, c'est le rôle du LV (logicial volume).

Voici ce que donne les LV au complet :

root@alfresco:/opt/alfresco-community# lvdisplay
  --- Logical volume ---
LV Path                /dev/alfresco-vg/root
LV Name                root
VG Name                alfresco-vg
LV UUID                RyrTMJ-tE2N-pbtP-SZ1x-YLYc-zkpZ-Uhoi3u
LV Write Access        read/write
LV Creation host, time alfresco, 2016-06-08 06:09:18 +0200
LV Status              available
# open                 1
LV Size                8,38 GiB
Current LE             2145
Segments               1
Allocation             inherit
Read ahead sectors     auto
- currently set to     256
Block device           254:0

--- Logical volume ---
LV Path                /dev/alfresco-vg/var
LV Name                var
VG Name                alfresco-vg
LV UUID                AWwDAj-mxdZ-mhVs-KM88-1cXX-Tm15-p48MY6
LV Write Access        read/write
LV Creation host, time alfresco, 2016-06-08 06:09:18 +0200
LV Status              available
# open                 0
LV Size                2,79 GiB
Current LE             715
Segments               1
Allocation             inherit
Read ahead sectors     auto
- currently set to     256
Block device           254:2

--- Logical volume ---
LV Path                /dev/alfresco-vg/swap_1
LV Name                swap_1
VG Name                alfresco-vg
LV UUID                4gOuaW-Hj68-XqIp-RMao-gWrb-Y6YI-N7NxJH
LV Write Access        read/write
LV Creation host, time alfresco, 2016-06-08 06:09:18 +0200
LV Status              available
# open                 2
LV Size                6,05 GiB
Current LE             1550
Segments               1
Allocation             inherit
Read ahead sectors     auto
- currently set to     256
Block device           254:1

--- Logical volume ---
LV Path                /dev/alfresco-vg/tmp
LV Name                tmp
VG Name                alfresco-vg
LV UUID                eVnvsu-DWF7-ccRS-O8Rd-T3nW-t3m9-kYRlVa
LV Write Access        read/write
LV Creation host, time alfresco, 2016-06-08 06:09:18 +0200
LV Status              available
# open                 1
LV Size                380,00 MiB
Current LE             95
Segments               1
Allocation             inherit
Read ahead sectors     auto
- currently set to     256
Block device           254:3

--- Logical volume ---
LV Path                /dev/alfresco-vg/home
LV Name                home
VG Name                alfresco-vg
LV UUID                lys2CU-ZvoG-sZrN-h22S-uaVD-Og12-5I30H1
LV Write Access        read/write
LV Creation host, time alfresco, 2016-06-08 06:09:18 +0200
LV Status              available
# open                 1
LV Size                42,55 GiB
Current LE             10893
Segments               1
Allocation             inherit
Read ahead sectors     auto
- currently set to     256
Block device           254:4 

Et c'est en regardant ce tableau que je me suis dit que j'avais fait une erreur. Le LV /home fait 42 Go et le LV /var à une capacité de 2.8 Go. C'est juste une inversion, et grâce à LVM2 des modifications sont faisables (heureusement). Autant dire que sur des partitions classiques c'est nettement plus fun.

Donc on va réduire la taille de /home à 2 Go, ce qui est largement assez sur un serveur.

[Warning]Attention
Bien que ceci ne soit qu'une indication, l'identification du type de fichier dans fdisk devrait être 8E, qui correspond à Linux LVM.

root@alfresco:/etc# lvresize --resizefs -L 2G /dev/alfresco-vg/var 
Do you want to unmount "/home"? [Y|n] y fsck from util-linux 2.25.2
HOME : 28/1274880 fichiers (0.0% non contigus), 98387/5242880 blocs resize2fs 1.43.1 (08-Jun-2016)
En train de redimensionner le système de fichiers sur /dev/mapper/alfresco--vg-var à 524288 (4k) blocs.
Le système de fichiers sur /dev/mapper/alfresco--vg-var a maintenant une taille de 524288 blocs (4k).

Size of logical volume alfresco-vg/var changed from 20,00 GiB (5120 extents) to 2,00 GiB (512 extents).
Logical volume var successfully resized

Et voilà qui est fait, le tout instantanément. J'ai donc désormais un espace libre d'environ 40 Go pour offrir à /var, en partie. Car mon système de fichiers n'est pas adapté à une mise en production. La partition racine sature, et le répertoire /opt sur lequel est stocké Alfresco est basé sur cette même partition. Il faut donc offrir un espace dédié au répertoire /opt/ afin de pouvoir augmenter cette partition sans tout changer partout.

Passage de 2 Go à 20 Go pour /var, il faut de la place, car ce répertoire contient les fichiers d'historiques du système. De plus, il est important de les garder sur une période plus ou moins longue, au moins me concernant. Sauf que ce répertoire est primordial pour le bon fonctionnement du système, et que bien évidemment il est monté. La solution consiste à le retirer du montage dans fstab, puis de rebooter (par brudance). Ensuite, on peut intervenir librement sur le volume concerné.

root@alfresco:/opt/alfresco-community# lvreduce --resizefs -L 23G -v /dev/alfresco-vg/home 
DEGRADED MODE. Incomplete RAID LVs will be processed.
Finding volume group alfresco-vg
Executing: fsadm --verbose check /dev/alfresco-vg/home fsadm: "ext4" filesystem found on "/dev/mapper/alfresco--vg-home" 
fsadm: Filesystem has not been checked after the last mount, using fsck -f 
fsadm: Executing fsck -f -p /dev/mapper/alfresco--vg-home fsck from util-linux 2.25.2
VAR : 5076/2793472 fichiers (3.6% non contigus), 404745/11154432 blocs
Executing: fsadm --verbose resize /dev/alfresco-vg/home 24117248K 
fsadm: "ext4" filesystem found on "/dev/mapper/alfresco--vg-home" 
fsadm: Device "/dev/mapper/alfresco--vg-home" size is 45688553472 bytes 
fsadm: Parsing tune2fs -l "/dev/mapper/alfresco--vg-home" 
fsadm: Resizing filesystem on device "/dev/mapper/alfresco--vg-home" to 24696061952 bytes (11154432 -> 6029312 blocks of 4096 bytes) 
fsadm: Executing resize2fs /dev/mapper/alfresco--vg-home 6029312 resize2fs 1.43.1 (08-Jun-2016)
En train de redimensionner le système de fichiers sur /dev/mapper/alfresco--vg-home à 6029312 (4k) blocs.
Le système de fichiers sur /dev/mapper/alfresco--vg-home a maintenant une taille de 6029312 blocs (4k).

Archiving volume group "alfresco-vg" metadata (seqno 7).
Reducing logical volume alfresco-vg/home to 23,00 GiB
Size of logical volume alfresco-vg/home changed from 42,55 GiB (10893 extents) to 23,00 GiB (5888 extents).
Loading alfresco--vg-home table (254:4)
Suspending alfresco--vg-home (254:4) with device flush
Resuming alfresco--vg-home (254:4)
Creating volume group backup "/etc./lvm/backup/alfresco-vg" (seqno 8).
Logical volume home successfully resized 

A noter l'option --resizefs qui permet de retailler le système de fichier immédiatement. C'est très important de placer cette option ou alors il faut lancer la commande resizefs' pour adapter/finaliser ceci à cette nouvelle dimension. Reste plus qu'à corriger le fichier fstab à l'identique avant la réduction (mout -a et c'est reparti !).

/dev/dm-0   8,2G    7,6G  121M  99% / 

Nous allons créer la partition pour recevoir le répertoire /opt, mais combien reste t-il en réalité pour utiliser les 100% de libre. Cette commande va me le dire précisément

root@alfresco:/opt/alfresco-community# vgdisplay
    --- Volume group ---
VG Name               alfresco-vg
System ID             
Format                lvm2
Metadata Areas        1
Metadata Sequence No  9
VG Access             read/write
VG Status             resizable
MAX LV                0
Cur LV                5
Open LV               5
Max PV                0
Cur PV                1
Act PV                1
VG Size               60,15 GiB
PE Size               4,00 MiB
Total PE              15398
Alloc PE / Size       9422 / 36,80 GiB
Free  PE / Size       5976 / 23,34 GiB
VG UUID               O0a2Qf-YjK1-Y9gK-sDfE-KTof-wAAq-17WGE4

Donc il me reste 23.34 Go de libre, ce qui très bien pour un début avec Alfresco. Comme on peut le voir, bouger les partitions n'est pas un problème, il me suffira d'ajouter un disque pour faire grossir cette partition si nécessaire.

Création de cette fameuse partition, il existe 2 solutions via cette commande lvcreate -L 23,34G -n opt alfresco-vg ou via lvcreate -l 100%FREE -n opt alfresco-vg

Hormis la différence très visible, il y a aussi la lettre "l" en majuscule ou pas.

root@alfresco:/opt/alfresco-community# lvcreate -l 100%FREE -n opt alfresco-vg
    Logical volume "opt" created

Et voilà c'est fait, il faut désormais poser le système de fichiers, voici des informations sur ce LV.

  --- Logical volume ---
LV Path                /dev/alfresco-vg/opt
LV Name                opt
VG Name                alfresco-vg
LV UUID                4BLTbm-kbLB-aaGH-30rc-JS46-Y2Ed-vn1q0d
LV Write Access        read/write
LV Creation host, time alfresco, 2016-06-21 10:29:58 +0200
LV Status              available
# open                 0
LV Size                23,34 GiB
Current LE             5976
Segments               1
Allocation             inherit
Read ahead sectors     auto
- currently set to     256
Block device           254:5

Rien de plus facile pour formater :

mkfs.ext4 -L OPT /dev/alfresco-vg/opt

Et maintenant c'est assez simple, il suffit d'inclure le montage du répertoire /opt dans ce volume, et le tout dans le fichier /etc./fstab. Ce qui donne :

dev/mapper/alfresco--vg-opt /opt           ext4    noatime         0       2

Le montage se fait via la commande mount -a.

Et voilà le résulat :

/dev/mapper/alfresco--vg-home    42G    832M   39G   3% 
/var /dev/mapper/alfresco--vg-tmp    360M    2,1M  335M   1% 
/tmp /dev/mapper/alfresco--vg-var    2,7G    4,3M  2,6G   1% 
/home /dev/mapper/alfresco--vg-opt     23G     45M   22G   1% 
/opt

Il reste pour finir à renommer les LV, passage de home à home2, de var à home puis de home2 à var .

 lvrename alfresco-vg dev/alfresco-vg/home2 dev/alfresco-vg/var

Je ferme cette parenthèse magique.

Ajout d'un nouveau disque

Ce n’est guère plus compliqué que les précédentes manipulations. Donc désormais j'ai un nouveau disque de 60 Go de libre, identifié en /dev/sdb1. Pour l'ajouter au système, ou plutôt pour la prise en compte, il suffit de faire : pvcreate /dev/sdb1. Pour vérifier, on ne sait jamais :

root@alfresco:/opt/alfresco-community# pvdisplay
--- Physical volume ---
PV Name               /dev/sda5
VG Name               alfresco-vg
PV Size               60,15 GiB / not usable 0   
Allocatable           yes (but full)
PE Size               4,00 MiB
Total PE              15398
Free PE               0
Allocated PE          15398
PV UUID               10qNv0-wS3i-QMuS-FFsL-HpxJ-rlkF-NveWw0

"/dev/sdb1" is a new physical volume of "60,54 GiB"
--- NEW Physical volume ---
PV Name               /dev/sdb1
VG Name               
PV Size               60,54 GiB
Allocatable           NO
PE Size               0   
Total PE              0
Free PE               0
Allocated PE          0
PV UUID               ODuDch-Szvc-8T4F-LutO-mOWk-a6l4-eiU1zO

Mes deux disques sont présents, il faut maintenant les affecter.

root@alfresco:/opt/alfresco-community# vgextend alfresco-vg /dev/sdb1
Volume group "alfresco-vg" successfully extended

Changement de niveau, prise en compte au niveau de LV :

root@alfresco:/opt/alfresco-community# lvcreate -l 100%FREE -n opt alfresco-vg
Logical volume "opt" created 

Voilà reste plus qu'à donner l'ordre de monter le répertoire /opt sur cette nouvelle partition et le tour est joué. Néanmoins malgré formatage juste avant cette opération, il faut faire ou plutôt refaire ceci : mkfs.ext4 -L OPT /dev/alfresco-vg/opt. Et vraiment pour finir un mount -a, et je retrouve pas partition /opt là ou il faut avec son nouvel espace dédié. Je ne peux que vous conseiller de faire une sauvegarde avant de ce répertoire avant, ça peut aider...

REBOOT et fsck

Bien que le système de fichiers GNU/Linux est costaud et que nous relançons pas le serveur suite à une petite mise à jour; je préfère ne pas attendre les X montages pour tester la structure des disques. Et donc à chaque reboot, les systèmes de fichiers importants seront scruptés, voilà les commandes à faire (ou pas) :

root@:/opt # tune2fs -c 1 /dev/mapper/alfresco--vg-opt 
tune2fs 1.43.3 (04-Sep-2016)
Définition du nombre maximal de montages à 1
root@:/opt # tune2fs -c 1 /dev/mapper/alfresco--vg-var 
tune2fs 1.43.3 (04-Sep-2016)
Définition du nombre maximal de montages à 1
root@:/opt # tune2fs -c 1 /dev/mapper/alfresco--vg-home 
tune2fs 1.43.3 (04-Sep-2016)
Définition du nombre maximal de montages à 1
root@:/opt # tune2fs -c 1 /dev/dm-0 
tune2fs 1.43.3 (04-Sep-2016)
Définition du nombre maximal de montages à 1

La configuration réseau

Habituellement je n'en parle pas. A savoir que Alfresco utilise la résolution hosts/dns dès son démarrage, si jamais cette étape n'est pas faite/parfaite voici l'erreur retournée :

2016-06-04 07:08:00,044  ERROR [solr.tracker.AbstractTracker] [SolrTrackerScheduler_Worker-3] Model tracking failed
org.alfresco.error.AlfrescoRuntimeException: 05040831 GetModelsDiff return status is 404

J'ai donc perdu du temps à découvrir que ceci venait tout simplement de la résolution. Mon erreur venait que j'avais oublié la résolution IPV6 uniquement ! Merci en passant aux logs de Tomcat pour le côté précis ou explicite d'un problème.

Les sources d'Alfresco Community

Les sources sont disponibles sur cette page, néanmoins il faut s'inscrire : https://www.alfresco.com/alfresco-community-download. De là vous avez le fichier alfresco-community-installer-201605-linux-x64.bin avec une taille de 771 Mo. Ce fichier est déjà au format exécutable sous Gnu/Linux, sinon ne pas hésiter à faire un chmod +x sur lui.

Le connecteur JAVA-Mysql

C'est tout simplement sur la page d'Oracle (Mysql) que nous pouvons le trouver : https://dev.mysql.com/downloads/connector/j/5.1.html. Il sera nécessaire de le décompresser pour récupérer uniquement ce fichier mysql-connector-java-5.1.38-bin.jar. Cette version est la dernière à ce jour : Connector/J 5.1.39

Chapter 2. Installation de Alfresco Community

Préparation de la base de données

C'est très simple à faire, il suffit de suivre les commandes ci-dessous. Libre à vous de donner des noms différents pour la base de données, l'administrateur et le mot de passe.

root@alfresco:/home/adminsi# mysql -u root -p
Enter password: 
Server version: 5.6.30-1 (Debian)

mysql> CREATE DATABASE alfresco DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Query OK, 0 rows affected (0,00 sec)
GRANT ALL PRIVILEGES ON alfresco.* TO alfresco@localhost IDENTIFIED BY 'le-mot-de-passe';
Query OK, 0 rows affected (0,00 sec)
FLUSH PRIVILEGES;
quit ;

Installation d'Alfresco Community 5.1.0

Lancez la commande ./alfresco-community-installer-201604-linux-x64.bin, puis répondre aux diverses questions comme mentionnées ci-dessous. Il faut saisir les données suivantes pour la prise en compte de Mysql, le tout au travers de 2 questions : , jdbc:mysql://127.0.0.1:3306/alfresco?useUnicode=yes&characterEncoding=UTF-8. et org.gjt.mm.mysql.Driver

[Warning]Attention
Attention à ne pas lancer Alfresco au final, il est nécessaire de procéder à des modifications avant !

alfresco:~# ./alfresco-community-installer-201604-linux-x64.bin 
Language Selection

Please select the installation language
[1] English - English 
[2] French - Français 
[3] Spanish - Español 
[4] Italian - Italiano 
[5] German - Deutsch 
[6] Japanese - ???
[7] Dutch - Nederlands 
[8] Russian - ???????
[9] Simplified Chinese - ????
[10] Norwegian - Norsk bokmål 
[11] Brazilian Portuguese - Português Brasileiro
Please choose an option [1] : 2

Bienvenue dans l'assistant d'installation de Alfresco Community

Type d'installation [1] Facile - Installation avec la configuration par défaut.
[2] Avancé - Configure les ports du serveur et les propriétés du service.: Choisissez les composants optionnels à installer.
Merci de choisi une option. [1] : 2

Sélectionnez des composants que vous désirez installer, décochez ceux que vous  ne voulez pas installer. 
Cliquez sur Suivant pour continuer.

Java [Y/n] :Y
PostgreSQL [Y/n] :N
LibreOffice [Y/n] :Y
Alfresco Community : Y (Cannot be edited)
Solr1 [y/N] : n
Solr4 [Y/n] :Y
Alfresco Office Services [Y/n] :Y
Web Quick Start [y/N] : n
Intégration de Google Docs [Y/n] :n
Est-ce que la sélection est correcte ? [Y/n]: Y

Dossier d'installation
Sélectionnez un dossier d'installation de Alfresco Community.
Sélectionnez un dossier : [/opt/alfresco-community]: 

Paramètres du serveur de base de données
Saisissez le port de votre base de données.
Port du serveur de base de données : [5432]: 

Configuration du port Tomcat
Saisissez vos paramètres de configuration Tomcat.
Domaine du serveur Web : [127.0.0.1]: 192.168.1.250 
Port de serveur Tomcat : [8080]: 
Port d'arrêt Tomcat : [8005]: 
Port SSL Tomcat : [8443]: 
Port AJP Tomcat : [8009]: 

Attention: Liaison au numéro de port indiqué impossible. 
Ce port est déjà  utilisé par le processus java (deleted). Sélectionnez un autre port de serveur  Tomcat.
Pressez [Entrée] pour continuer
Attention: Liaison au numéro de port indiqué impossible. Sélectionnez un autre  port d'arrêt Tomcat.
Pressez [Entrée] pour continuer

Configuration du port Tomcat
Saisissez vos paramètres de configuration Tomcat.
Domaine du serveur Web : [127.0.0.1]: 
Port de serveur Tomcat : [8080]: 
Port d'arrêt Tomcat : [8005]: 
Port SSL Tomcat : [8443]: 
Port AJP Tomcat : [8009]: 

Port du serveur LibreOffice
Saisissez le port que le serveur LibreOffice écoutera.
Port du serveur LibreOffice : [8100]: 

Port FTP Alfresco
Choisissez un numéro de port pour le serveur FTP Alfresco intégré.
Port : [21]: 

Mot de passe admin
Spécifiez un mot de passe administrateur Alfresco.
Mot de passe admin : :
Répéter le mot de passe : :

Installer en tant que service
Si vous enregistrez Alfresco Community en tant que service, le démarrage de  Alfresco Community s'exécutera automatiquement à chaque démarrage de la machine.
Installer Alfresco Community en tant que service ? [Y/n]: Y

Avertissement
Cet environnement n'est pas configuré pour fonctionner de manière optimale avec  Alfresco. 
Lisez attentivement cette liste avant de continuer.
Bien que ces problèmes n'empêcheront pas le fonctionnement d'Alfresco, 
certaines  fonctionnalités du produit risquent de ne pas être disponibles ou le système.
Not enough system RAM available
(4.0GB+): 3.87GB
SMTP TCP port in use : 25

Pressez [Entrée] pour continuer

L'assistant d'installation est maintenant prêt à démarrer l'installation de  Alfresco Community sur votre ordinateur.
Voulez-vous continuer ? [Y/n]: Y

Merci de patienter durant l'installation de Alfresco Community sur votre  ordinateur.

Installation en cours
0% ______________ 50% ______________ 100%

L'assistant vient de finir l'installation de Alfresco Community sur votre  ordinateur.

Donc, Alfresco est installé, mais non configuré et non lancé(!), voici les actions à faire avant tout.

Copie du connecteur JAVA/Mysql

cp mysql-connector-java-5.1.38-bin.jar /opt/alfresco-community/tomcat/lib

Vérifier que les droits d'accès sont identiques aux autres.

Adapter le fichier de configuration selon vos paramètres

Le fichier à modifier/vérifier est situé ici : /opt/alfresco-community/tomcat/shared/classes, choisir alfresco-global.properties

[Note]Note
Pour son exploitation la BD acceptera 500 connexions, à vous de voir. Ne pas oublier le fichier my.cnf avec au moins cette valeur.

dir.root=/opt/alfresco-community/alf_data

alfresco.context=alfresco 
alfresco.host=192.168.1.250 
alfresco.port=8080 
alfresco.protocol=http

share.context=share 
share.host=192.168.1.250 
share.port=8080 share.protocol=http

### database connection properties ### 
db.driver=org.gjt.mm.mysql.Driver 
db.url=jdbc:mysql://127.0.0.1:3306/alfresco?useUnicode=yes&characterEncoding=UTF-8  
db.username=alfresco db.password=mandrake_2048 
db.name=alfresco
# Note: your database must also be able to accept at least this many connections.  
# Please see your database documentation for instructions on how to configure this.
db.pool.max=500 
db.pool.validate.query=SELECT 1

Et voilà, lancez Alfresco via la commande suivante systemctl start alfresco. Vos CPUs vont chauffer quelques longues secondes.

[Note]Note
Il est possible refaire l'installation d'Alfresco sans problème, à condition de supprimer le fichier /etc/init.d/alfresco, bien que ceci ne soit pas bloquant, juste un message d'alerte qui apparaît.

root@alfresco:/home# /etc/init.d/alfresco start [ ok ]
Starting mysql (via systemctl): mysql.service.
/opt/alfresco-community/libreoffice/scripts/libreoffice_ctl.sh : libreoffice could not be started
Using CATALINA_BASE:   /opt/alfresco-community/tomcat
Using CATALINA_HOME:   /opt/alfresco-community/tomcat
Using CATALINA_TMPDIR: /opt/alfresco-community/tomcat/temp
Using JRE_HOME:        /opt/alfresco-community/java
Using CLASSPATH:       /opt/alfresco-community/tomcat/bin/bootstrap.jar:/opt/alfresco-community/tomcat/bin/tomcat-juli.jar
Using CATALINA_PID:    /opt/alfresco-community/tomcat/temp/catalina.pid
Tomcat started.
/opt/alfresco-community/tomcat/scripts/ctl.sh : tomcat started 

Le message libreoffice could not be started est dû à un restart d'alfresco, le process .soffice.bin doit tourner quoi qu'il arrive.

Chapter 3. Post lancement

Accès aux interfaces

Voici divers liens qui vous permettent de savoir si Alfresco fonctionne

La page Alfresco qui donne accès à plusieurs liens, avec ou sans HTTPS

https://192.168.1.250:8443/alfresco/

http://192.168.1.250:8443/alfresco/

Et la page principale :

https://192.168.1.250:8443/share/

ou en HTTP

http://192.168.1.250:8443/share/

En théorie vous avez accès à toutes les pages, la possibilité de travailler en clair(HTTP) ou en chiffré(HTTPS) sera traité plus tard.

[Note]Note
Alfresco offre le service WebDAV, similaire aux hélas serveurs de fichiers que je vois régulièrement au travail. Ce n’est pas forcément ce que j'appelle une évolution. Sous Windows ce service peut être intégré via un import réseau puis en saisissant (exemple) \\192.168.1.250:8443\alfresco\webdav

Alfresco et LibreOffice

Une modification que beaucoup font sans pour cela expliquer pourquoi, néanmoins je fais comme tout le monde. Il faut donc renommer le fichier /opt/alfresco-community/libreoffice/scripts/ctl.sh qui est appelé via ce fichier Dans /opt/alfresco-community/alfresco.sh.

[Note]Note
Avec la version de mai 2016, ceci est corrigé !

Le fichier alfresco.sh

Il faut vérifier les 2 lignes suivantes :

# MYSQL_SCRIPT=$INSTALLDIR/mysql/scripts/ctl.sh MYSQL_SCRIPT=/etc/init.d/mysql

et LIBREOFFICE_SCRIPT=$INSTALLDIR/libreoffice/scripts/libreoffice_ctl.sh.

Ne pas hésiter à lancer la commande suivante, relativement longue pour déceler d'éventuels problèmes de dépendances :

/opt/alfresco-community/libreoffice/program/.soffice.bin --nofirststartwizard --nologo --headless \
"--accept=socket,host=localhost,port=$SOFFICE_PORT\;urp\;StarOffice.ServiceManager""

Et effectivement il manquait 2 librairies :

aptitude install libglu1 libdbus-glib-1-2

Le fichier libreoffice_ctl.sh

Ce fichier se trouve ici /opt/alfresco-community/libreoffice/scripts/ctl.sh, il faut renommer le en libreoffice_ctl.sh, pour être cohérent.

SOFFICE_PATH="/opt/alfresco-community/libreoffice/program"
SOFFICE_PORT="8100"
SOFFICEBIN=/opt/alfresco-community/libreoffice/program/.soffice.bin
SOFFICEWRAPPER=/opt/alfresco-community/libreoffice/program/soffice.bin
SOFFICE="$SOFFICEWRAPPER --nofirststartwizard --nologo --headless "--accept=socket,host=localhost,\
port=$SOFFICE_PORT\;urp\;StarOffice.ServiceManager"" SOFFICE_STATUS=""

Il faut ajouter 2 parenthèses, l'une accolée avant --accept" puis juste après la dernière en fin de ligne. Avec la version de mai 2016, cette modification n'apporte rien de plus, donc non pris en compte désormais !

Le process Soffice.bin

Pas forcément à chaque fois, mais il arrive assez fréquemment que le process .soffice.bin occupe 1 CPU à 100%, sans le lâcher. La solution à ce problème est de modifier le fichier /etc/rc.local et d'ajouter les lignes suivantes (une valeur de 60 secondes fonctionne très bien) :

sleep 60 
sh /opt/alfresco-community/libreoffice/scripts/libreoffice_ctl.sh stop
sh /opt/alfresco-community/libreoffice/scripts/libreoffice_ctl.sh start 
[Note]Note
Plus de surcharge inutile, mais par contre 60 secondes d'attente au démarrage. Cette valeur de 60 secondes correspond (environ) au temps que Alfresco soit lancé complètement, car à un moment précis il vérifie la présence du port 8100... Lors d'un rafraîchissement d'Alfresco. A tout moment il est possible de lancer la commande suivante si cela devait arriver : source /etc/rc.local

Les fichiers d'historiques

C'est comme une vieille habitude, je n'aime pas rechercher les fichiers d'historiques un peu partout. Et avec Alfresco c'est un peu le cas, sans oublier la taille de tous ces fichiers qui pour moi encombrent l'espace dédié à Alfresco. Donc les logs sont désormais dans /var/log/alfresco, comme bien d'autres.

Voilà les lignes à modifier :

tomcat/conf/logging.properties:29:1catalina.org.apache.juli.FileHandler.directory =/var/log/alfresco
tomcat/conf/logging.properties:34:2localhost.org.apache.juli.FileHandler.directory =/var/log/alfresco
tomcat/conf/logging.properties:39:3manager.org.apache.juli.FileHandler.directory =/var/log/alfresco
tomcat/conf/logging.properties:44:4host-manager.org.apache.juli.FileHandler.directory =/var/log/alfresco
tomcat/webapps/share/WEB-INF/classes/log4j.properties:16:log4j.appender.File.File=/var/log/alfresco/share.log
tomcat/webapps/alfresco/WEB-INF/classes/log4j.properties:16:log4j.appender.File.File=/var/log/alfresco/alfresco.log
solr4/log4j-solr.properties:14:log4j.appender.File.File=/var/log/alfresco/share.log 

Ne pas oublier de changer :

tomcat/bin/catalina.sh.orig:185:  CATALINA_OUT="$CATALINA_BASE"/logs/catalina.out
tomcat/bin/catalina.sh:185:  CATALINA_OUT="$CATALINA_BASE"/logs/catalina.out

Et pour finir ne pas oublier de changer dans le fichier tomcat/conf/server.xml, ligne 140.:

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="/var/log/alfresco"

Optimisation de la JVM

Avec ma machine actuelle j'ai 3G, Alfresco (java) occupe 1.2G, il reste environ 120Mo de libre.

mysql    12147  0.4  4.6  1869124 140756     ?      Sl   05:51   0:17   /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir 
root     12230  7.0 44.1  6837844 1351340  pts/0    Sl   05:51   4:15   /opt/alfresco-community/java/bin/java -Djava.util.logging.config.file
root     12497  0.0  1.8   757244 56004    pts/0    Sl   05:53   0:00   /opt/alfresco-community/libreoffice/program/.soffice.bin 
root     12500  0.0  0.0        0     0    pts/0    Z    05:53   0:00   [.soffice.bin]

Voici ce que préconise Alfresco pour la répartition :

De 50 connexions à 500 Max: 1,5 GB JVM RAM
2x CPUs (ou 1xDual-core)
De 100 connexions à 1000 Max: 1,5 GB JVM RAM
4x CPUs (ou 2xDual-core)
De 200 connexions à 2000 Max: 2,5 GB JVM RAM
8x CPUs (ou 4xDual-core)

Voici les paramètres par défaut, qui se retrouvent dans le fichier /opt/alfresco-community/tomcat/bin/setenv.sh :

# Load Tomcat Native Library
LD_LIBRARY_PATH=/opt/alfresco-community/common/lib:$LD_LIBRARY_PATH

JAVA_HOME=/opt/alfresco-community/java
JRE_HOME=$JAVA_HOME
JAVA_OPTS="-XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -Djava.awt.headless=true \
 -Dalfresco.home=/opt/alfresco-community -XX:ReservedCodeCacheSize=128m $JAVA_OPTS "
JAVA_OPTS="-Xms512M -Xmx2379M $JAVA_OPTS " # java-memory-settings export JAVA_HOME export \
 JRE_HOME export JAVA_OPTS export LD_LIBRARY_PATH 
[Note]Note
A noter lors d'une installation, les paramètres sont adaptés à la configuration de votre serveur. Donc en théorie, sauf changement ou plutôt augmentation de RAM, il n'y a rien à changer.

Voici ce que l'on m'a donné pour optimiser ma machine, le tout est à placer dans le fichier : /opt/alfresco-community/tomcat/bin/setenv.sh.

JAVA_OPTS="-XX:MaxPermSize=256m -Xms1g -Xmx2g -XX:+DisableExplicitGC -Djava.awt.headless=true \
  -Dalfresco.home=/opt/alfresco-community -Dcom.sun.management.jmxremote -Dsun.security.ssl.allowUnsafeRenegotiation=true \
  -XX:ReservedCodeCacheSize=128m" 

Au final, et comme j'ai confiance à l'équipe d'Alfresco j'ai laisser les paramètres par défauts. Les paramètres cités supra sont là si besoin, pour affiner ou pas.

Sur cette page http://docs.alfresco.com/4.1/concepts/jvm-settings.html voici les paramètres conseillés :

-XX:MaxPermSize=256M -Xss1024K -Xms1G -Xmx2G -Dcom.sun.management.jmxremote

Voici un autre exemple :

export JAVA_OPTS='-server -Xmx8g -Xms8g -Xss256k -XX:MaxPermSize=512m -XX:NewSize=4g -Dfile.encoding=UTF-8'

Disponible ici https://forums.alfresco.com/forum/installation-upgrades-configuration-integration/configuration/want-change-java-mem-size-how

Chapter 4. La sauvegarde intégrale (classique)

Le répertoire Alfresco et la base de données (Mysql)

Une archive Alfresco presque à vide fait un peu moins de 950 Mo. Pour cette raison les sauvegardes seront placées dans /var/sauvegardes.

Voici un script qu'il ne reste plus qu'à installer ensuite dans la crontab. Ce fichier se nomme svd_alfresco.pl, il est stocké dans le répertoire /opt.

[Warning]Attention
Le caractère @ ne passe au niveau du mot de passe !

#! /usr/bin/perl -w use strict;
use Socket;            # Théoriquement inclus avec Perl-5.x

# --------------------------------------------------------------------
my ($heure, $minute, $yday) = (localtime)[2,1,7];

if ( $heure  < 10 ) { $heure  = '0' .$heure;  }
if ( $minute < 10 ) { $minute = '0' .$minute; }

# /////////////// PARTIE CONFIGURABLE \\\\\\\\\\\\\\\\\\\\\\\
my $rep_dest = "/var/sauvegardes/";
my $rep_dest_full = "/var/sauvegardes/*.*";
my $rep_web  = "/opt/alfresco-community/"; 
# ////////////// FIN \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
my $quand =  $yday ."-" .$heure ."H" .$minute ."-";
my $file_sql = $rep_dest .$quand ."alfresco.sql" ;
my $file_web  = $rep_dest .$quand ."alfresco.tgz " ;

# c'est parti pour Mysql : 
my $cmd_sql = `mysqldump -uroot -pmandrake_2048 alfresco > $file_sql` ; 
my $cmd_web = `tar -cJf $file_web $rep_web` ;
# on efface les fichiers plus vieux de 20 jours (ctime jours à modifier év) 
my $cmd_del = `find $rep_dest_full -ctime 20 -exec rm -f {} \;` ;
# my $cmd_del2 = `find $rep_dest_full -ctime 20 -exec ls -l {} \;` ;

exec $cmd_web;

#

# et voilà les sauvegardes sont prêtes ...

Pour mémoire, voici comment automatiser le tout : crontab -e, ce qui va créer ou modifier le fichier situé ici : /var/spool/cron/crontabs/root. Et voici un exemple pour une exécution tous les jours à 07h00 :

0 7 * * * root /opt/svd-sql-web.pl

Sauvegarde des données

C'est la sauvegarde la plus simple à faire, il suffit de connaître ou se trouve les fichiers stockés. Ils sont tous classés par année, mois et jour puis heure/minutes(?) sous un format spécifique et unique (.bin). Voici le répertoire en question : /opt/alfresco-community/alf_data/contentstore

Et pour information voilà à quoi ressemble ce stockage, plus de problème d'accent ou d'encodage lié au système de fichier.

2016

./2016:
7  8

./2016/7:
29  30  31

./2016/7/29:
12  13

./2016/7/29/12:
53

./2016/7/29/12/53:
00c5f9c4-f9cc-452b-b10e-43bbe950fb41.bin
5800e1a7-383a-4f2d-8724-79b58c5e2f9e.bin
af9ab018-7d2c-4ea2-929a-d8869e1d0fab.bin
00f5d451-140d-46de-b976-7f816f5d970c.bin
5a03cf60-cdf4-4b64-8fee-a55805ea6f55.bin
b0528b41-25a2-40a4-b2c6-bd79e5bb2484.bin
021eff46-f163-4ee8-8420-e96cb1dfd911.bin
5a5977e8-46a4-4489-9455-6d11baee74b2.bin
b136bc16-3472-4549-8515-9babc8285e2c.bin
034cb29d-c943-4090-8d63-4a7d8229249e.bin
5a5de541-fbd4-4b62-a169-2ccb4567ecf6.bin
b19c1920-8490-492d-8419-96d3993b7e63.bin
044b93af-9819-4320-bc44-33d8ea7ed542.bin
5b533bab-212f-476e-be28-e903eeb3873e.bin
b2ebbbc6-d51d-4db5-abba-3821206d631d.bin
0e8ae567-fd43-4617-81e4-90cb2e87a896.bin
687afc60-8761-44b6-81fb-fe98dcf223da.bin
c0c9fa47-70d9-468b-975a-fa54e74d5f1f.bin
57272d12-1f2c-4df9-b849-aa4f14cb7e1c.bin
aebc37d5-9418-4540-be1b-ee63ccb6b9c2.bin

./2016/7/29/13:
23  41  59

./2016/7/29/13/23:
007110d7-ae13-49d1-b9d9-9d00ac0f106d.bin
59f58836-2030-48b1-a35a-f5c7aa2e3f80.bin

./2016/7/29/13/41:
c7d2ec27-e46a-4449-b3ef-ab02f993e389.bin

./2016/7/29/13/59:
3e9679e8-547b-49a4-b185-7bd58438f36d.bin

./2016/7/30:
10  11  7  8

./2016/7/30/10:
38

Sauvegarde niveau utilisateurs

L'interface propose de télécharger une archive au format ZIP d'un répertoire avec toutes ses données. C'est très simple à réaliser, rapide et fiable.

Chapter 5. Alfresco et les suites bureautiques

Pour Ms Office 2010/2013

Je ne peux pas comparer le produit Microsoft™ SharePoint. C'est un produit payant, pour proposer au final une solution lente et mal encodé, bien qu'il se soit amélioré au fil des ans. Ce que je sais avec Alfresco, l'édition en ligne d'un document Office verrouille le fichier.

Cette indication nous indique également par qui, ce qui est parfois pratique.

Autre aspect plus ou moins intéressant, l'édition en ligne active le versionning du document ouvert. Il est donc impossible de perdre des données sur un document. Sinon la restauration et même la comparaison sur une ancienne version sont possibles. L'historique inclut également qui à fait les différentes versions. Son défaut étant qu'il ne faut pas enregistrer toutes les 20 secondes, sinon le versionning peut même devenir pénible à gérer.

Du côté d'Alfresco :

Alfresco utilise de son côté les fonctions d'Alfresco Office Services (AOS). Ce service s'installe sans rien faire à condition d'avoir validé cette ligne à l'installation Alfresco Office Services [Y/n] :Y

Du côté de Microsoft™ Office 2010/2013

Il faut la suite Office 2010, laquelle va installer 2 compléments sur vos navigateurs présents. Pour utiliser au mieux Alfresco il est préférable d'activer en permancence ces 2 modules.

Modification du registre utilisateur Windows. J'insiste sur le fait qu'un utilisateur peut faire cette action sans problème. Il suffit de préparer un fichier avec l'extension .reg puis de placer ces données en exemple :

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\Common\Internet]
"UseRWHlinkNavigation"="https://192.168.1.250/share"
"UseRWOSHlinkNavigation"=dword:00000001 "UseOnlineContent"=dword:00000002
"BasicAuthLevel"=dword:00000002
"LcfemCleanShutdown"=dword:00000001

[HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\Common\Internet\NetworkStatusCache]
"LastClearAllTime"=hex:b0,56,db,e2,9a,0f,d0,01

[HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\Common\Internet\Server Cache]
"Version"=dword:00000001
"Count"=dword:00000002

[HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\Common\Internet\Server Cache\http://192.168.1.250:7070/alfresco/]
"Type"=dword:00000005 "Protocol"=dword:00000003 "Version"=dword:0000000e "Flags"=dword:00000007 "CobaltMajorVersion"=dword:00000000
"CobaltMinorVersion"=dword:00000000
"MsDavExt"=dword:00000000 "Expiration"=hex(b):70,3b,fb,3f,4f,48,d0,01
"EnableBHO"=dword:00000001

[HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\Common\Internet\Server Cache\https//192.168.1.250:8443/share/proxy/alfresco/api/node/content/workspace/]
"Type"=dword:00000000 "Protocol"=dword:00000000 "Version"=dword:00000000 "Flags"=dword:00000000 "CobaltMajorVersion"=dword:00000000
"CobaltMinorVersion"=dword:00000000
"MsDavExt"=dword:00000000 "Expiration"=hex(b):70,8f,26,cc,15,30,d0,01
"EnableBHO"=dword:00000000

[HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\Common\Internet\Server Cache\https://192.168.1.250:7070/alfresco/]
"EnableBHO"=dword:00000000

[HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\Common\Internet\Server Cache\https://192.168.1.250:7070/alfresco/]
"EnableBHO"=dword:00000000

Cet exemple a été gentiment offert, merci au donateur qui se reconnaîtra.

Pour IE

La procédure est très simple, il suffit de faire tout ceci...pour au final ne pas avoir une vue sur les documents partagés ou pas (?). Donc je ne peux que déconseiller pour Alfresco, et même pour tout le reste d'utiliser IE 9. Apparemment IE 11 serait meilleure, néanmoins il n'est pas à la hauteur, comparé d'autres produits.

Dans IE choisir options Internet puis l'onglet Sécurité ensuite sites de confiance, cliquez sur le bouton Sites. Entrez l'adresse (URL) de votre serveur (exemple https://192.168.1.250:8443 ou https://alfresco.archi.com) Au niveau des options globales, il faut que l'option Authentification Utilisateur soit sur Connexion automatique avec le nom d'utilisateur et le mot de passe

Fermez et redémarrez Internet Explorer.

Pour Firefox

Rien à faire, comme quoi c'est faisable, à l'exception de vérifier la présence des 2 modules Office; puis à tester une édition en ligne.

Pour LibreOffice (ou OpenOffice)

L'action de pouvoir éditer en ligne existe, elle est payante, hélas https://addons.alfresco.com/addons/libreoffice-online-edit-module. Ce complément utilise CMIS (content management interoperability services) pour y parvenir. Il existe d'autres solutions via CMIS, comme CMISLync, mais aussi payante.

Chapter 6. Divers

Mise à jour des certificats HTTPS/TLS

Ce n'est pas avec une certaine méfiance que j'attaque ce sujet, pourtant important et nécessaire. À savoir que la dernière fois que j'ai voulu faire cette étape, j'ai pratiquement tout cassé/planté. Donc une bonne sauvegarde avant, et c'est parti !

Pour commencer il faut éditer ou vérifier que les données dans certains fichiers soient correctes, ou même adaptées à votre système. Le fichier /opt/alfresco-community/alf_data/keystore, est le script qui va déclencher la création des certificats automatiquement". Un chmod +x n'est pas superflu, comme supprimer le même script en .bat.

root@alfresco:/opt/alfresco-community/alf_data/keystore# cat generate_keystores.sh  #! /bin/sh
# Please edit the variables below to suit your installation
# Note: for an installation created by the Alfresco installer, you only need to edit ALFRESCO_HOME

# Alfresco installation directory
ALFRESCO_HOME=/opt/alfresco-community
# The directory containing the alfresco keystores, as referenced by keystoreFile and truststoreFile attributes in tomcat/conf/server.xml
ALFRESCO_KEYSTORE_HOME=$ALFRESCO_HOME/alf_data/keystore
# SOLR installation directory
SOLR_HOME=$ALFRESCO_HOME/alf_data/solr
# Java installation directory
JAVA_HOME=$ALFRESCO_HOME/java
# Location in which new keystore files will be generated
CERTIFICATE_HOME=$HOME
# The repository server certificate subject name, as specified in tomcat/conf/tomcat-users.xml with roles="repository" \
 REPO_CERT_DNAME="CN=Alfresco Repository, OU=Unknown, O=Alfresco RH Ltd., L=Tours, ST=FR, C=FR"
# The SOLR client certificate subject name, as specified in tomcat/conf/tomcat-users.xml with roles="repoclient" \
  SOLR_CLIENT_CERT_DNAME="CN=Alfresco RH Client, OU=Unknown, O=Alfresco RH Ltd., L=Tours, ST=FR, C=FR"
# The number of days before the certificate expires ( ce qui donne 100 ans !)
CERTIFICATE_VALIDITY=36525

# Stop alfresco "$ALFRESCO_HOME/alfresco.sh" stop
# Ensure certificate output dir exists mkdir -p "$CERTIFICATE_HOME"
# Remove old output files (note they are backed up elsewhere) if [ -f "$CERTIFICATE_HOME/ssl.keystore" ]; \
then rm "$CERTIFICATE_HOME/ssl.keystore"; \
 fi if [ -f "$CERTIFICATE_HOME/ssl.truststore" ]; then rm "$CERTIFICATE_HOME/ssl.truststore"; \
 fi if [ -f "$CERTIFICATE_HOME/browser.p12" ]; \
 then rm "$CERTIFICATE_HOME/browser.p12"; fi if [ -f "$CERTIFICATE_HOME/ssl.repo.client.keystore" ]; \
 then rm "$CERTIFICATE_HOME/ssl.repo.client.keystore"; \
 fi if [ -f "$CERTIFICATE_HOME/ssl.repo.client.truststore" ]; then rm "$CERTIFICATE_HOME/ssl.repo.client.truststore"; fi
# Generate new self-signed certificates for the repository and solr "$JAVA_HOME/bin/keytool" -genkeypair \
-keyalg RSA -dname "$REPO_CERT_DNAME" \
-validity $CERTIFICATE_VALIDITY -alias ssl.repo -keypass kT9X6oe68t -keystore "$CERTIFICATE_HOME/ssl.keystore" \
-storetype JCEKS -storepass kT9X6oe68t "$JAVA_HOME/bin/keytool" -exportcert -alias ssl.repo \
-file "$CERTIFICATE_HOME/ssl.repo.crt" -keystore "$CERTIFICATE_HOME/ssl.keystore" -storetype JCEKS \
-storepass kT9X6oe68t "$JAVA_HOME/bin/keytool" -genkeypair -keyalg RSA -dname "$SOLR_CLIENT_CERT_DNAME" \
-validity $CERTIFICATE_VALIDITY -alias ssl.repo.client -keypass kT9X6oe68t -keystore \
"$CERTIFICATE_HOME/ssl.repo.client.keystore" -storetype JCEKS -storepass kT9X6oe68t "$JAVA_HOME/bin/keytool" \
-exportcert -alias ssl.repo.client -file "$CERTIFICATE_HOME/ssl.repo.client.crt" -keystore \
"$CERTIFICATE_HOME/ssl.repo.client.keystore" -storetype JCEKS -storepass kT9X6oe68t

# Create trust relationship between repository and solr "$JAVA_HOME/bin/keytool" -importcert -noprompt -alias ssl.repo.client \
-file "$CERTIFICATE_HOME/ssl.repo.client.crt" -keystore "$CERTIFICATE_HOME/ssl.truststore" -storetype JCEKS -storepass kT9X6oe68t
# Create trust relationship between repository and itself - used for searches "$JAVA_HOME/bin/keytool" -importcert -noprompt \
-alias ssl.repo -file "$CERTIFICATE_HOME/ssl.repo.crt" -keystore "$CERTIFICATE_HOME/ssl.truststore" -storetype JCEKS -storepass kT9X6oe68t
# Create trust relationship between solr and repository "$JAVA_HOME/bin/keytool" -importcert -noprompt -alias ssl.repo \
-file "$CERTIFICATE_HOME/ssl.repo.crt" -keystore "$CERTIFICATE_HOME/ssl.repo.client.truststore" -storetype JCEKS -storepass kT9X6oe68t
# Export repository keystore to pkcs12 format for browser compatibility "$JAVA_HOME/bin/keytool" -importkeystore \
-srckeystore "$CERTIFICATE_HOME/ssl.keystore" -srcstorepass kT9X6oe68t -srcstoretype JCEKS -srcalias ssl.repo \
-srckeypass kT9X6oe68t -destkeystore "$CERTIFICATE_HOME/browser.p12" -deststoretype pkcs12 \
-deststorepass alfresco -destalias ssl.repo -destkeypass alfresco

# Ensure keystore dir actually exists mkdir -p "$ALFRESCO_KEYSTORE_HOME"
# Back up old files echo "Copies des vieux fichiers en .old..."
cp "$ALFRESCO_KEYSTORE_HOME/ssl.keystore" "$ALFRESCO_KEYSTORE_HOME/ssl.keystore.old" 
cp "$ALFRESCO_KEYSTORE_HOME/ssl.truststore" \
"$ALFRESCO_KEYSTORE_HOME/ssl.truststore.old" 
cp "$ALFRESCO_KEYSTORE_HOME/browser.p12" "$ALFRESCO_KEYSTORE_HOME/browser.p12.old" 
cp "$SOLR_HOME/workspace-SpacesStore/conf/ssl.repo.client.keystore" "$SOLR_HOME/workspace-SpacesStore/conf/ssl.repo.client.keystore.old" 
cp "$SOLR_HOME/workspace-SpacesStore/conf/ssl.repo.client.truststore" "$SOLR_HOME/workspace-SpacesStore/conf/ssl.repo.client.truststore.old" 
cp "$SOLR_HOME/archive-SpacesStore/conf/ssl.repo.client.keystore" "$SOLR_HOME/archive-SpacesStore/conf/ssl.repo.client.keystore.old" 
cp "$SOLR_HOME/archive-SpacesStore/conf/ssl.repo.client.truststore" "$SOLR_HOME/archive-SpacesStore/conf/ssl.repo.client.truststore.old" 
cp "$SOLR_HOME/templates/test/conf/ssl.repo.client.keystore" "$SOLR_HOME/templates/test/conf/ssl.repo.client.keystore.old" 
cp "$SOLR_HOME/templates/test/conf/ssl.repo.client.truststore" "$SOLR_HOME/templates/test/conf/ssl.repo.client.truststore.old" 
cp "$SOLR_HOME/templates/store/conf/ssl.repo.client.keystore" "$SOLR_HOME/templates/store/conf/ssl.repo.client.keystore.old" 
cp "$SOLR_HOME/templates/store/conf/ssl.repo.client.truststore" "$SOLR_HOME/templates/store/conf/ssl.repo.client.truststore.old"

# Install the new files echo "Copies des nouveaux fichiers..."
cp "$CERTIFICATE_HOME/ssl.keystore" "$ALFRESCO_KEYSTORE_HOME/ssl.keystore"
cp "$CERTIFICATE_HOME/ssl.truststore" "$ALFRESCO_KEYSTORE_HOME/ssl.truststore" 
cp "$CERTIFICATE_HOME/browser.p12" "$ALFRESCO_KEYSTORE_HOME/browser.p12" 
cp "$CERTIFICATE_HOME/ssl.repo.client.keystore" "$SOLR_HOME/workspace-SpacesStore/conf/ssl.repo.client.keystore" 
cp "$CERTIFICATE_HOME/ssl.repo.client.truststore" "$SOLR_HOME/workspace-SpacesStore/conf/ssl.repo.client.truststore" 
cp "$CERTIFICATE_HOME/ssl.repo.client.keystore" "$SOLR_HOME/archive-SpacesStore/conf/ssl.repo.client.keystore" 
cp "$CERTIFICATE_HOME/ssl.repo.client.truststore" "$SOLR_HOME/archive-SpacesStore/conf/ssl.repo.client.truststore" 
cp "$CERTIFICATE_HOME/ssl.repo.client.keystore" "$SOLR_HOME/templates/test/conf/ssl.repo.client.keystore" 
cp "$CERTIFICATE_HOME/ssl.repo.client.truststore" "$SOLR_HOME/templates/test/conf/ssl.repo.client.truststore" 
cp "$CERTIFICATE_HOME/ssl.repo.client.keystore" "$SOLR_HOME/templates/store/conf/ssl.repo.client.keystore" 
cp "$CERTIFICATE_HOME/ssl.repo.client.truststore" "$SOLR_HOME/templates/store/conf/ssl.repo.client.truststore"

echo " ### Les certificats sont mis à jour ###" 
echo "Vérifier la présence de ceci : dir.keystore=$ALFRESCO_KEYSTORE_HOME dans le fichier 'alfresco-global.properties'" 
echo "Le fichier 'browser.p12' est disponible sur le port 80" 
cp /opt/alfresco-community/alf_data/keystore/browser.p12 /var/www/html/ 
echo "##### FIN ##### 

Ce fichier a été légèrement modifié par mes soins, libre à vous de garder la valeur 36525 qui vous donnera un certifcat valide pour 100 ans.

Ce script devrait générer les erreurs suivantes, néanmoins elles ne sont pas bloquantes :

cp: impossible d'évaluer '/opt/alfresco-community/alf_data/solr/workspace-SpacesStore/conf/ssl.repo.client.keystore': Aucun fichier ou dossier de ce type 
cp: impossible d'évaluer '/opt/alfresco-community/alf_data/solr/workspace-SpacesStore/conf/ssl.repo.client.truststore': Aucun fichier ou dossier de ce type 
cp: impossible d'évaluer '/opt/alfresco-community/alf_data/solr/archive-SpacesStore/conf/ssl.repo.client.keystore': Aucun fichier ou dossier de ce type 
cp: impossible d'évaluer '/opt/alfresco-community/alf_data/solr/archive-SpacesStore/conf/ssl.repo.client.truststore': Aucun fichier ou dossier de ce type 
cp: impossible d'évaluer '/opt/alfresco-community/alf_data/solr/templates/test/conf/ssl.repo.client.keystore': Aucun fichier ou dossier de ce type 
cp: impossible d'évaluer '/opt/alfresco-community/alf_data/solr/templates/test/conf/ssl.repo.client.truststore': Aucun fichier ou dossier de ce type 
cp: impossible d'évaluer '/opt/alfresco-community/alf_data/solr/templates/store/conf/ssl.repo.client.keystore': Aucun fichier ou dossier de ce type 
cp: impossible d'évaluer '/opt/alfresco-community/alf_data/solr/templates/store/conf/ssl.repo.client.truststore': Aucun fichier ou dossier de ce type 
cp: impossible de créer le fichier standard '/opt/alfresco-community/alf_data/solr/workspace-SpacesStore/conf/ssl.repo.client.keystore': Aucun fichier ou dossier de ce type 
cp: impossible de créer le fichier standard '/opt/alfresco-community/alf_data/solr/workspace-SpacesStore/conf/ssl.repo.client.truststore': Aucun fichier ou dossier de ce type 
cp: impossible de créer le fichier standard '/opt/alfresco-community/alf_data/solr/archive-SpacesStore/conf/ssl.repo.client.keystore': Aucun fichier ou dossier de ce type 
cp: impossible de créer le fichier standard '/opt/alfresco-community/alf_data/solr/archive-SpacesStore/conf/ssl.repo.client.truststore': Aucun fichier ou dossier de ce type 
cp: impossible de créer le fichier standard '/opt/alfresco-community/alf_data/solr/templates/test/conf/ssl.repo.client.keystore': Aucun fichier ou dossier de ce type 
cp: impossible de créer le fichier standard '/opt/alfresco-community/alf_data/solr/templates/test/conf/ssl.repo.client.truststore': Aucun fichier ou dossier de ce type 
cp: impossible de créer le fichier standard '/opt/alfresco-community/alf_data/solr/templates/store/conf/ssl.repo.client.keystore': Aucun fichier ou dossier de ce type 
cp: impossible de créer le fichier standard '/opt/alfresco-community/alf_data/solr/templates/store/conf/ssl.repo.client.truststore': Aucun fichier ou dossier de ce type 

Voici ou seront stockées les certifcats pour information:

  • Le fichier 'ssl keystore' contient la paire de clés RSA public/privé RSA.

  • Le fichier 'ssl truststore' contient le certificat d'autorité (il est utilisé pour signé le dépot global et pour SOLR4). Ces certificats peuvent être stockés librement, à condition que le fichier alfresco-global.properties soit modifié en conséquence.

SSL coté privé

  • Keystore location: encryption.ssl.keystore.location

  • Keystore provider: encryption.ssl.keystore.provider

  • Keystore type: encryption.ssl.keystore.type

  • Keystore metadata file location: encryption.ssl.keystore.keyMetaData.location

SSL coté public

  • Keystore location: encryption.ssl.truststore.location

  • Keystore provider: encryption.ssl.truststore.provider

  • Keystore type: encryption.ssl.truststore.type

  • Keystore metadata file location: encryption.ssl.truststore.keyMetaData.location

  • browser.p12, disponible sur le serveur WEB classique (port 80)

A signaler que l'erreur est signalée par Alfresco, et il existe un correctif. On peut laisser tel quel, ceci n'est pas bloquant.

Caused by: sun.security.validator.ValidatorException: 
  PKIX path validation failed: java.security.cert.CertPathValidatorException: Path does not chain with any of the trust anchors

Il existe plusieurs paramètres qui ne concernent que le fichier browser.p12. Il peuvent être modifiés sans problème dans les fichiers suivants :

ssl-keystore-passwords.properties et ssl-truststore-passwords.properties

Sans trop affirmer, ces 2 fichiers interviennent pour le certificat de signature, le fameux CA.

Dans l'étape suivante, il sera demandé un mot de passe, il s'agit par défaut de alfresco, le CA aura comme nom ssl-repo. Voici le détail fichier par fichier :

root@alfresco:/opt/alfresco-community/alf_data/keystore# 
cat ssl-keystore-passwords.properties
aliases=ssl.alfresco.ca,ssl.repo
# The ssl keystore password keystore.password=kT9X6oe68t
# The password protecting the ssl repository key ssl.repo.password=kT9X6oe68t
# The password protecting the ssl Alfresco CA key ssl.alfresco.ca.password=kT9X6oe68t
root@alfresco:/opt/alfresco-community/alf_data/keystore#
cat ssl-truststore-passwords.properties
aliases=alfresco.ca
# The ssl truststore password keystore.password=kT9X6oe68t
# The password protecting the ssl Alfresco CA strust certificate alfresco.ca.password=kT9X6oe68t

Je pense qu'il est possible de modifier (exemple) le mot alfresco, mais sans toucher à ssl., que je considère comme un repère. Idem pour le mot repo.

Insertion du certificat d'autorité

Ce fichier est disponible via (exemple) http://192.168.1.250/browser.p12, le but du jeu est de le poser dans le PC de l'utilisateur, via ou pas la méthode WEB.

Pour Windows

Installer ce certificat sur une plateforme Windows est simple, tout en vous demandant de bien confirmer sans arrêt. Une fois dans le répertoire (ex) Téléchargements, il suffit de cliquer dessus, puis de suivre les instructions comme le montrent les images ci-dessous.

Pour GNU/Linux

Même un enfant devrait y arriver, comme précédemment, on clique sur le fichier dans le répertoire Téléchargements, et reste à suivre via les images ci-dessous.

Durée d'une session :

La durée d'une session pour un utilisateur est de 60 minutes pour la partie share. C'est très bien, vous pouvez changer cette valeur dans les fichiers listés ci-dessous :

tomcat/conf/web.xml:516: <session-timeout>30</session-timeout> 
tomcat/webapps/alfresco/WEB-INF/web.xml:518: <session-timeout>60</session-timeout> 
tomcat/webapps/share/WEB-INF/web.xml:189: <session-timeout>60</session-timeout>

Activation de la messagerie pour les notifications

En supposant que le serveur (Postfix) est bien configuré pour sa nouvelle mission, il reste alors à connecter Alfresco à lui. Pour cela il faut éditer le fichier alfresco-global.properties. Il faut activer la notification

### E-mail site invitation setting ###
notification.email.siteinvite=true 

puis d'ajouter ces lignes :

### Service MAIL ### 
mail.host=localhost mail.port=25
# on peut se servir de ce paramètre pour identifier l'émetteur 
mail.username=anonymous
mail.password=
# Encodage en UTF-8 mail.encoding=UTF-8
# Mettre cette valeur en '7bit' ou '8bit' à tester avec Outlook...qui..:(:(:(  
mail.header=7bit
mail.smtp.auth=false
# 30 sec par défaut...c'est trop long passage à 15 sec 
mail.smtp.timeout=15000
# on peut ou pas placer le "@....." ou pas, dépend de la configuration du serveur
mail.from.default=postmaster
mail.from.enabled=true 

Voici divers messages que le système peut envoyer selon votre configuration. C'est propre net et clair, je n'ai rien à ajouter ni à expliquer.

Suppression des index SOLR

Il peut arriver que SOLR soit un peu perdu, même si c'est rare. La solution très souvent est de supprimer ses index, ensuite il va reconstruire tout lui-même, et souvent le problème est résolu. C'est ce qui doit être fait lors d'une restauration ! Il faut arrêter Alfresco (!) puis effacer les répertoires index situés dans ces répertoires :

/opt/alfresco-community/alf_data/solr4/index/archive/SpacesStore/ 
/opt/alfresco-community/alf_data/solr4/index/workspace/SpacesStore

Ensuite reste à lancer Alfresco, et regarder si tout fonctionne correctement.

Chapter 7. Les thèmes

Création d'un nouveau thème

[Note]Note
Si vous pensez pouvoir modifier tout l'interface, dès maintenant je vous dis bon courage !. Les feuilles CSS sont présentes en grand nombre, et le tout est retravaillé par AIKAU et ensuite par LESS. D'ou une usine à gaz, bravo tout de même à l'équipe de développement.

Il existe 2 répertoires importants pour les thèmes :

/opt/alfresco-community/tomcat/webapps/share/WEB-INF/classes/alfresco/site-data/thèmes

Ce répertoire contient uniquement un fichier XML pour la définition du thème. Il suffit de copier l'un des fichiers présents puis de le renommer comme votre thème ( ex vertTheme ce qui donne vertTheme.xml). Voici son contenu, dont une partie a été commentée volontairement, car elle risquait de rentrer en conflit. Je reparle de ceci par la suite.

root@:/home/adminsi # cat /opt/alfresco-community/tomcat/webapps/share/WEB-INF/classes/alfresco/site-data/themes/vertTheme.xml 
  <?xml version='1.0' encoding='UTF-8'?> 
  <thème>    
  <title>Archi Vert Theme
  </title>
  <title-id>theme.vertTheme
  </title-id>
  <css-tokens>
  <less-variables>
@header-background-color: #0e4b0f;

<!-- Bar menu haute - bg : Vert fonce -->
@header-font-color: yellow;

<!-- Bar menu haute - Couleur sous menu -->
@header-hover-background-color: #246d25;
<!-- Mouse OVER Menu : Vert un peu claire -->
@header-hover-font-color: gold;

<!-- Menu haut font color under menu -->
@header-focus-background-color: #136414;
<!-- Menu haut : bg menu select -->
@header-focus-font-color: black;

@header-menubar-font-color: white;

@header-dropdown-menu-font-color: black;
<!-- Menu haut font color menu over -->
@dashlet-background: #aaa;

<!-- white -->
@dashlet-border: 1px solid #bababa;

@dashlet-border-radius: 3;

<!-- @dashlet-title-background: #92c15f linear-gradient(to bottom, #a3d07a, #92c15f);
@dashlet-title-background: #246d25 linear-gradient(to bottom, #a3d07a, #92c15f);
@dashlet-title-border-bottom: 0;
@dashlet-title-border-radius: 5;
@dashlet-title-color: #fff;

@dashlet-toolbar-background: #A020F0;
@dashlet-toolbar-background: gold;
@dashlet-toolbar-border-bottom: 1px solid #d3d3d3;

@dashlet-body-background: #f9fcfd;
@dashlet-body-border-radius: 0;

-->
</less-variables>
</css-tokens>
</theme> 

Puis le deuxième répertoire qui est :

/opt/alfresco-community/tomcat/webapps/share/themes/

C'est ici que le gros de votre thème se trouve.

drwxr-xr-x 3 root root 4096 août   2 18:08 default
  drwxr-xr-x 4 root root 4096 août   1 18:29 gdocs 
  drwxr-xr-x 4 root root 4096 août   1 18:29 greenTheme 
  drwxr-xr-x 4 root root 4096 août   1 18:29 greyTheme 
  drwxr-xr-x 4 root root 4096 août   1 18:29 hcBlack 
  drwxr-xr-x 4 root root 4096 août   1 18:29 lightTheme 
  drwxr-xr-x 4 root root 4096 août   1 18:29 yellowTheme 

# cp -Rav gdocs/ vertTheme

Il faut renommer tous les yui-skin-gdocs ou gdocs qui désigne un thème précis, et comme celui ci a été copié, il n'est pas adapté. Il faut donc renommer tous les gdocsavec le nom de mon thème qui est greenTheme.

[Note]Note
Il faut relancer Alfresco pour la prise en compte d'un thème. Dommage ! tout de suite on avance moins vite.

Il est possible de changer énormément de valeurs en modifiant le fichier presentation.css, y compris la 1ere page de l'authentification. Et c'est pour cette raison que j'ai commenté une partie du fichier précédent, car les valeurs sont présentes également aussi. Ce fichier est du pur CSS, contrairement au fichier précédent qui lui utilise des variables LESS. Si vous souhaitez utiliser ou connaître ces variables (LESS), elles sont expliquées ici https://github.com/Alfresco/Aikau/blob/master/aikau/src/main/resources/alfresco/css/less/defaults.less

Ajout d'un thème

Il existe beaucoup de thèmes différents pour Alfresco, la plupart sont payants. Néanmoins pour se faire la main, je choisis RED Themes

Ce thème est disponible ici : https://github.com/share-extras/red-theme/releases/download/v0.1/red-theme-0.1.amp, il faut prendre si possible un fichier avec une extension en .amp. Ensuite il suffit de lancer cette commande :

root@alfresco:~# /opt/alfresco-community/java/bin/java -jar /opt/alfresco-community/bin/alfresco-mmt.jar install red-theme-0.1.amp /opt/alfresco-community/tomcat/webapps/share.war
      06020001 An error was encountered during deployment of the AMP into the WAR: 
      06020000 The module (Alfresco Share Red Theme) cannot be installed on a war version greater than 3.2.1. This war is version: 5.2.0.

Laquelle me jette, mais bon je vais devoir me débrouiller (ou faire sans, c'est plus rapide). Je laisse volontairement cette commande pour garder la procédure, qui un jour passera...

Chapter 8. Les flux IP

Les différents flux

Alfresco n'est pas avare avec les ouvertures de flux, le tout amplifié par Tomcat et ses ports autres que 80 et 443. Même si la logique est là, pour accéder actuellement à Alfresco, faire ce type de lien https://alfresco.domain.fr:8443/share, n'est pas forcément compris par tous.

C'est pourquoi ce chapitre va expliquer comment changer tout çà, pour obtenir des liens classiques.

Les flux

Connexions Internet actives (serveurs et établies)
Proto Recv-Q Send-Q Adresse locale          Adresse distante        Etat       
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:8100          0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:3306          127.0.0.1:54686         ESTABLISHED 
tcp        0      0 127.0.0.1:3306          127.0.0.1:54687         ESTABLISHED 
tcp        0      0 127.0.0.1:3306          127.0.0.1:54693         ESTABLISHED
tcp        0    172 192.168.1.250:22        192.168.1.6:49522       ESTABLISHED
tcp        0      0 127.0.0.1:3306          127.0.0.1:54690         ESTABLISHED
tcp        0      0 127.0.0.1:3306          127.0.0.1:54691         ESTABLISHED
tcp        0      0 127.0.0.1:3306          127.0.0.1:54680         ESTABLISHED
tcp        0      0 127.0.0.1:3306          127.0.0.1:54692         ESTABLISHED
tcp        0      0 127.0.0.1:3306          127.0.0.1:54688         ESTABLISHED
tcp        0      0 127.0.0.1:8100          127.0.0.1:47253         ESTABLISHED
tcp        0      0 127.0.0.1:3306          127.0.0.1:54689         ESTABLISHED
tcp        0      0 127.0.0.1:3306          127.0.0.1:54679         ESTABLISHED
tcp6       0      0 ::1:25                  LISTEN     
tcp6       0      0 :::8443                 LISTEN     
tcp6       0      0 :::445                  LISTEN     
tcp6       0      0 127.0.0.1:8005          LISTEN     
tcp6       0      0 :::8009                 LISTEN     
tcp6       0      0 :::139                  LISTEN     
tcp6       0      0 :::50287                LISTEN     
tcp6       0      0 :::111                  LISTEN     
tcp6       0      0 :::8080                 LISTEN     
tcp6       0      0 :::80                   LISTEN     
tcp6       0      0 :::22                   LISTEN     
tcp6       0      0 127.0.0.1:42328         127.0.0.1:8443          TIME_WAIT
tcp6      70      0 127.0.0.1:43750         127.0.0.1:8443          CLOSE_WAIT
tcp6      70      0 127.0.0.1:38715         127.0.0.1:8443          CLOSE_WAIT  
tcp6       0      0 127.0.0.1:38239         127.0.0.1:8443          TIME_WAIT   
tcp6       0      0 127.0.0.1:54690         127.0.0.1:3306          ESTABLISHED 
tcp6       1      0 127.0.0.1:54731         127.0.0.1:8080          CLOSE_WAIT  
(...coupé volontairement...)
tcp6       1      0 127.0.0.1:54832         127.0.0.1:8080          CLOSE_WAIT  
tcp6       0      0 127.0.0.1:54689         127.0.0.1:3306          ESTABLISHED 
tcp6       0      0 127.0.0.1:49220         127.0.0.1:8443          TIME_WAIT   
tcp6       1      0 127.0.0.1:54734         127.0.0.1:8080          CLOSE_WAIT  
tcp6       0      0 127.0.0.1:54688         127.0.0.1:3306          ESTABLISHED 
tcp6       0      0 127.0.0.1:41510         127.0.0.1:8443          TIME_WAIT   
tcp6       1      0 127.0.0.1:54706         127.0.0.1:8080          CLOSE_WAIT  
tcp6       1      0 127.0.0.1:54733         127.0.0.1:8080          CLOSE_WAIT  
tcp6       1      0 127.0.0.1:54718         127.0.0.1:8080          CLOSE_WAIT  
tcp6       0      0 127.0.0.1:60731         127.0.0.1:8443          TIME_WAIT   
tcp6      70      0 127.0.0.1:49565         127.0.0.1:8443          CLOSE_WAIT  
tcp6       0      0 127.0.0.1:33871         127.0.0.1:8443          TIME_WAIT

A noter et sachant que mon Alfresco est dans un statut en déploiement, il est à considerer comme au repos, et il y a déjà sans rien faire 21 connexions à Mysql en interne; 24 connexions sur le 8443, idem toutes en interne.

A noter que les ports 139 et 445 sont utilisés pour le WebDAV (Microsoft CIFS), ils seront traités ultérieurement en vue du retrait. Le port 8100 est utilisé par LibreOffice, le port 8009 est utilisé par AJP (interface Apache / Tomcat).

Retrait des services inutiles

Les services suivants ont été désactivés, car ils ne servent à rien, ou représente une faille potentielle :

systemctl disable rpcbind 
systemctl disable nfs-common 
systemctl disable rpcbind 
systemctl disable snews 
systemctl disable interbase
systemctl disable nimreg 

Voilà qui est mieux, les ports ouverts sont désormais moins nombreux !

Activation d'Iptables

Les ports suivants sont encore accessibles de l'extérieur et pour moi ils ne servent à rien, les voici : 139, 445, 8009 et 8443. Iptables va donc les interdire, il suffit ce créer un fichier similaire à celui-ci :/etc/init.d/firewall.

Ce fichier doit contenir les lignes suivantes :

#!/bin/sh

# Vide les tables actuelles 
iptables -t filter -F
# Vide les règles personnelles 
iptables -t filter -X
# Interdire toute connexion entrante et sortante 
iptables -t filter -P INPUT DROP 
iptables -t filter -P FORWARD DROP iptables -t filter -P OUTPUT DROP
# ---
# Ne pas casser les connexions etablies 
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# ---
# Autoriser loopback iptables -t filter -À INPUT -i lo -j ACCEPT 
iptables -t filter -À OUTPUT -o lo -j ACCEPT
# ---
# ICMP (Ping) iptables -t filter -À INPUT -p icmp -j ACCEPT 
iptables -t filter -À OUTPUT -p icmp -j ACCEPT
# ---
# SSH IN/OUT
iptables -t filter -À INPUT -p tcp --dport 22 -j ACCEPT 
iptables -t filter -À OUTPUT -p tcp --dport 22 -j ACCEPT
# ---
# DNS IN/OUT
iptables -t filter -À OUTPUT -p tcp --dport 53 -j ACCEPT 
iptables -t filter -À OUTPUT -p udp --dport 53 -j ACCEPT 
iptables -t filter -À INPUT -p tcp --dport 53 -j ACCEPT 
iptables -t filter -À INPUT -p udp --dport 53 -j ACCEPT
# ---
# NTP OUT
iptables -t filter -À OUTPUT -p udp --dport 123 -j ACCEPT
# ---
# HTTP (redirigé ensuite) + HTTPS OUT 
iptables -t filter -À OUTPUT -p tcp --dport 80 -j ACCEPT 
iptables -t filter -À OUTPUT -p tcp --dport 443 -j ACCEPT
# ---
# HTTP + HTTPS In 
iptables -t filter -À INPUT -p tcp --dport 80 -j ACCEPT 
iptables -t filter -À INPUT -p tcp --dport 443 -j ACCEPT
# ---
# Le port 8080 est utilisé par AOS !!!
iptables -t filter -À INPUT -p tcp --dport 8080 -j ACCEPT 
iptables -t filter -À INPUT -p tcp --dport 8443 -j DROP
# ---
# FTP Out iptables -t filter -À OUTPUT -p tcp --dport 20:21 -j DROP
# ---
# FTP In modprobe ip_conntrack_FTP # ligne facultative
# iptables -t filter -À INPUT -p tcp --dport 20:21 -j DROP
# iptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# ---
# Mail SMTP:25 iptables -t filter -À INPUT -p tcp --dport 25 -j ACCEPT 
iptables -t filter -À OUTPUT -p tcp --dport 25 -j ACCEPT
# ---
# Mail POP3:110 #iptables -t filter -À INPUT -p tcp --dport 110 -j ACCEPT 
# iptables -t filter -À OUTPUT -p tcp --dport 110 -j ACCEPT
# ---
# interdire a netbios de sortir 139 + 435 
iptables -t filter -À INPUT -p tcp --dport 139 -j DROP 
iptables -t filter -À OUTPUT -p tcp --dport 139 -j DROP
# ---
iptables -t filter -À INPUT -p tcp --dport 435 -j DROP 
iptables -t filter -À OUTPUT -p tcp --dport 435 -j DROP
[Note]Note
A noter que le port 8080 reste ouvert, AOS se sert de ce port pour l'édition en ligne, dommage.

Les modules Apache nécessaires

La configuration REDIRECTION HTTP ves HTTPS

De nos jours, et pour éviter les piratages de sites, pour la protection des informations de plus en plus de sites préconisent ou migrent à 100% en HTTPS (port 443). Nous allons faire de même, tout en gardant des accès vers le 8443. Ce port est celui utilisé par Tomcat à l'identique d'un port 443 classique. Cette redirection par Apache est très simple à mettre en oeuvre. Voici le listing du fichier vim /etc/apache2/sites-enabled/000-default.conf

Le module proxy d'Apache est utilisé, donc il faut activer le tout via :

a2enmode proxy

<VirtualHost *:80>

ServerAdmin webmaster@localhost
ServerName alfresco.archi.test
DocumentRoot /var/www/html

ProxyVia on
ProxyRequests Off         
<Proxy *>
Order deny,allow
Allow from all
</Proxy>

RewriteEngine on
RewriteCond %{HTTPS} off
# RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^/(.*) https://%{SERVER_NAME}/$1 [L,R]

# activation de HTTP 2 plus l'ancien HTTP 1.1
Protocols h2 http/1.1

#LogLevel info ssl:warn

ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

Les redirections sont prises en compte par le module mod_rewrite d'Apache. Ce module s'active via la commande a2enmod rewrite. Donc désormais le port 80 est ouvert, mais ne sert plus au transfert, tout est sécurisé...même si les certificats sont faits maison, les données ne transitent plus en claire.

Le module mod_jk

Ce module est une interface entre Apache et Tomcat, ce dernier étant utilisé par Alfresco, on ne peut pas s'en passer. Voici comment l'installer :

 aptitude install libapache2-mod-jk

Les chapitres suivants vont montrer comment modifier divers fichiers, pour un bon dialogue entre Apache et Tomcat.

Ce module utilise plusieurs fichiers, il faut absolument vérifier que APJ 1.3 est bien configuré au niveau d'Alfresco. Voici les paramètres que j'utilise, ils sont présents dans le fichier /opt/alfresco-community/tomcat/conf/server.xml:

  Define an AJP 1.3 Connector on port 8009 -->
  <Connector port="8009" URIEncoding="UTF-8" protocol="AJP/1.3" redirectPort="8443" />

En réalité, c'est la définition par défaut, mais il faut vérifier tout de même.

Continuons avec le fichier /etc/apache2/mods-enabled/jk.load, rien à faire à ce niveau, par contre le fichier jk.conf, doit être configuré comme ici :

root@alfresco:/etc/apache2/mods-enabled# cat jk.conf 
# Configuration Example for mod_jk
# used in combination with Apache 2.2.x

<IfModule jk_module>

# Ce fichier va contenir 
JkWorkersFile /etc/libapache2-mod-jk/workers.properties

# Our JK error log
# You can (and should) use rotatelogs here
JkLogFile /var/log/apache2/mod_jk.log

# Our JK log level (trace,debug,info,warn,error)
JkLogLevel info

# Our JK shared memory file
JkShmFile /var/log/apache2/jk-runtime-status

# Define a new log format you can use in any CustomLog in order
# to add mod_jk specific information to your access log.
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{Cookie}i\" \"%{Set-Cookie}o\" %{pid}P %{tid}P %{JK_LB_FIRST_NAME}n \
%{JK_LB_LAST_NAME}n ACC %{JK_LB_LAST_ACCESSED}n ERR %{JK_LB_LAST_ERRORS}n BSY %{JK_LB_LAST_BUSY}n %{JK_LB_LAST_STATE}n %D" extended_jk

# This option will reject all requests, which contain an encoded percent sign (%25) or backslash (%5C) in the URL
# If you are sure, that your webapp doesn't use such URLs, enable the option to prevent double encoding attacks.
JkOptions +RejectUnsafeURI

# This option will collapse multiple adjacent slashes in request URLs before looking for mount or unmount matches.
JkOptions +CollapseSlashesAll

# After setting JkStripSession to "On", mod_jk will strip all ";jsessionid=..." from request URLs it does *not* forward to a backend.
# This is useful, if all links in a webapp use URLencoded session IDs and parts of the static content should be delivered directly by Apache.
# JkStripSession On

# Start a separate thread for internal tasks like idle connection probing, connection pool resizing and load value decay.
# Run these tasks every JkWatchdogInterval seconds.
JkWatchdogInterval 60

# Configure access to jk-status and jk-manager. If you want to make this available in a virtual host,
# either move this block into the virtual host or copy it logically there by including "JkMountCopy On" in the virtual host.
# Add an appropriate authentication method here!
<Location /jk-status>
# Inside Location we can omit the URL in JkMount
JkMount jk-status
Order deny,allow
Deny from all
Allow from 192.168.1.0     </Location>     <Location /jk-manager>
# Inside Location we can omit the URL in JkMount         JkMount jk-manager
Order deny,allow
Deny from all
Allow from 192.168.1.0     </Location>

# If you want to put all mounts into an external file that gets reloaded automatically after changes
# (with a default latency of 1 minute), you can define the name of the file here.
# JkMountFile conf/extra/uriworkermap.properties
# Example for Mounting a context to the worker "balancer". The URL syntax "a|b" instantiates two mounts at once,
# the first one is "a", the second one is "ab".

# on ne monte rien ici, mais dans workers.properties
#JkMount /share|/* ajp13     
#JkMount /alfresco|/* ajp13

# JkUnMount /myapp/static/* *

# Example for UnMounting requests for a named worker
# JkUnMount /myapp/images/* balancer

# Example for UnMounting requests using regexps
# SetEnvIf REQUEST_URI "\.(htm|html|css|gif|jpg|js)$" no-jk
# Example for setting a reply timeout depending on the request URL
# SetEnvIf Request_URI "/transactions/" JK_REPLY_TIMEOUT=600000
# Example for disabling reply timeouts for certain request URLs
# SetEnvIf Request_URI "/reports/" JK_REPLY_TIMEOUT=0
# IMPORTANT: Mounts and virtual hosts
# If you are using VirtualHost elements, you
# - can put mounts only used in some virtual host into its VirtualHost element 
# - can copy all global mounts to it using "JkMountCopy On" inside the VirtualHost
# - can copy all global mounts to all virtual hosts by putting
#   "JkMountCopy All" into the global server
# Since: 1.2.26

</IfModule> 

Comme mentionné dans ce fichier, rien n'est monté dans ce fichier, continuons avec le fichier :/etc/libapache2-mod-jk/workers.properties. Ce fichier est mentionné dans les toutes premières lignes du fichier précédent pour information. Voici un exemple :

# workers.properties -
#
# This file is a simplified version of the workers.properties supplied with the upstream sources. The jni inprocess worker (not build in the
# debian package) section and the ajp12 (deprecated) section are removed.
#
# As a general note, the characters $( and ) are used internally to define macros. Do not use them in your own configuration!!!
#
# Whenever you see a set of lines such as:
# x=value
# y=$(x)\something
#
# the final value for y will be value\something
#
# Normaly all you will need to do is un-comment and modify the first three properties, i.e. workers.tomcat_home, workers.java_home and ps.
# Most of the configuration is derived from these.
#
# When you are done updating workers.tomcat_home, workers.java_home and ps you should have 3 workers configured:
#
# - An ajp13 worker that connects to localhost:8009
# - A load balancer worker

# OPTIONS ( very important for jni mode )
#
# workers.tomcat_home should point to the location where you
# installed tomcat. This is where you have your conf, webapps and lib
# directories.
#
workers.tomcat_home=/opt/alfresco-community/tomcat

#
# workers.java_home should point to your Java installation. Normally
# you should have a bin and lib directories beneath it.
#
workers.java_home=/opt/alfresco-community/java

#
# You should configure your environment slash.../ on UNIX ps=/
#
# The workers that your plugins should create and work with
#
worker.list=ajp13
#
ajp13_worker WORKER DEFINITION ------------------------------

# Defining a worker named ajp13_worker and of type ajp13
# Note that the name and the type do not have to match.
#
worker.ajp13.port=8009 worker.ajp13.host=localhost worker.ajp13.type=ajp13
#
# Specifies the load balance factor when used with
# a load balancing worker.
# Note:
#  ----> lbfactor must be > 0
#  ----> Low lbfactor means less work done by the worker.
worker.ajp13.lbfactor=50

#
# Specify the size of the open connection cache.
#worker.ajp13_worker.cachesize

DEFAULT LOAD BALANCER WORKER DEFINITION ----------------------
# The loadbalancer (type lb) workers perform wighted round-robin
# load balancing with sticky sessions.
# Note:
#  ----> If a worker dies, the load balancer will check its state
#        once in a while. Until then all work is redirected to peer
#        workers.
#worker.loadbalancer.type=lb 
#worker.loadbalancer.balance_workers=ajp13

Pas grand-chose à faire dans ce fichier, sauf à bien définir ou sont les binaires pour Tomcat (Alfresco) et JAVA (Alfresco).

Comme désormais les flux sont tous en HTTPS, le fichier etc/apache2/sites-enabled/default-ssl.conf est très important, néanmoins c'est l'ensemble de tout qui fait que tout fonctionne comme il faut. C'est donc ici que les paramètres JkMount sont inscrits. Il est possible d'inscrire aussi des liens interdits via JkUnMount.

<IfModule mod_ssl.c>  <VirtualHost _default_:443>

ServerAdmin webmaster@localhost
ServerName alfresco.archi.test
DocumentRoot /var/www/html

# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the loglevel for particular
# modules, e.g.   #LogLevel info ssl:warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
#Include conf-available/serve-cgi-bin.conf
#   SSL Engine Switch:
#   Enable/Disable SSL for this virtual host.

SSLEngine on
SSLProxyEngine on
SSLCertificateFile /etc/ssl/certs/server.crt
SSLCertificateKeyFile /etc/ssl/private/server.key
#SSLVerifyClient optional
#SSLVerifyDepth 1
#SSLOptions +StdEnvVars +StrictRequire
#SSLInsecureRenegotiation on

#ProxyRequests On
#ProxyPreserveHost On

JkMount /share ajp13
JkMount /share/* ajp13
JkMount /alfresco|/* ajp13
#JkMount /alfresco/* ajp13

#SSLCertificateFile
/etc/ssl/certs/ssl-cert-snakeoil.pem
#SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
#SSLCertificateChainFile /etc/apache2/ssl.crt/server-ca.crt
#SSLCACertificatePath /etc./ssl/certs/
#SSLCACertificateFile /etc/apache2/ssl.crt/ca-bundle.crt
#SSLCARevocationPath /etc/apache2/ssl.crl/
#SSLCARevocationFile /etc/apache2/ssl.crl/ca-bundle.crl
#SSLVerifyClient require
#SSLVerifyDepth  10
#SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>

SSLOptions +StdEnvVars   </Directory>

</VirtualHost> </IfModule>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

Une fois de plus rien de bien spécial, néanmoins il faut générer de nouveaux certificats, C'est la phase suivante.

Voici comment activer ce module :

root@alfresco:/opt/alfresco-community# a2enmod jk
Enabling module jk
To activate the new configuration, you need to run:   service apache2 restart

Voici en image les différents flux simplifiés :

Les certificats pour Apache

Donc avec toutes ces modifications, si on ne touche à rien, l'utilisateur va découvrir que l'accès est possible, mais aussi que les certificats ont changés. Il est donc obligatoire de changer les certificats SSL qui sont installés par défaut avec Apache, par une version dédiée à Alfresco.

En prenant en compte une mise à jour d'Openssl éventuelle, ou d'un écrasement du fichier de référence /etc/ssl/opensssl.cnf, il est préférable de travailler sur un fichier dédié à cette mission. Les certificats seront tous stockés dans /etc/apache2/ssl, comme répertoire de base.

Voici une copie de mon fichier alfresco_config.cnf qui est bien sur adapté à ma situation :

cat alfresco_config.cnf 
#
# OpenSSL example configuration file.
# This is mostly being used for generation of certificate requests.
# This definition stops the following lines choking if HOME isn't
# defined.
HOME			= .
RANDFILE		= $ENV::HOME/.rnd

# Extra OBJECT IDENTIFIER info:
#oid_file		= $ENV::HOME/.oid
oid_section		= new_oids

[ new_oids ]

# Policies used by the TSA examples.
tsa_policy1 = 1.2.3.4.1
tsa_policy2 = 1.2.3.4.5.6
tsa_policy3 = 1.2.3.4.5.7

####################################################################
[ ca ]
default_ca	= CA_default		# The default ca section

####################################################################
[ CA_default ]

dir		= /etc/apache2/ssl		# Where everything is kept
certs		= $dir/certs		# Where the issued certs are kept
crl_dir		= $dir/crl		# Where the issued crl are kept
database	= $dir/index.txt	# database index file.
#unique_subject	= no			# Set to 'no' to allow creation of
					# several ctificates with same subject.
new_certs_dir	= $dir/newcerts		# default place for new certs.

certificate	= $dir/cacert.pem 	 # The CA certificate
serial		= $dir/serial 		 # The current serial number
crlnumber	= $dir/crlnumber	 # the current crl number
					 # must be commented out to leave a V1 CRL
crl		= $dir/crl.pem 		 # The current CRL
private_key	= $dir/private/cakey.pem # The private key
RANDFILE	= $dir/private/.rand	 # private random number file

x509_extensions	= usr_cert		# The extentions to add to the cert

# Comment out the following two lines for the "traditional"
# (and highly broken) format.
name_opt 	= ca_default		# Subject Name options
cert_opt 	= ca_default		# Certificate field options

# Extension copying option: use with caution.
# copy_extensions = copy

# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs
# so this is commented out by default to leave a V1 CRL.
# crlnumber must also be commented out to leave a V1 CRL.
# crl_extensions	= crl_ext

default_days	= 3650			# how long to certify for
default_crl_days= 30			# how long before next CRL
default_md	= default		# use public key default MD
preserve	= no			# keep passed DN ordering

# A few difference way of specifying how similar the request should look
# For type CA, the listed attributes must be the same, and the optional
# and supplied fields are just that :-)
policy		= policy_match

# For the CA policy
[ policy_match ]
countryName		= match
stateOrProvinceName	= match
organizationName	= match
organizationalUnitName	= optional
commonName		= supplied
emailAddress		= optional

# For the 'anything' policy
# At this point in time, you must list all acceptable 'object'
# types.
[ policy_anything ]
countryName		= optional
stateOrProvinceName	= optional
localityName		= optional
organizationName	= optional
organizationalUnitName	= optional
commonName		= supplied
emailAddress		= optional

####################################################################
[ req ]
default_bits		= 2048
default_keyfile 	= privkey.pem
distinguished_name	= req_distinguished_name
attributes		= req_attributes
x509_extensions	= v3_ca	# The extentions to add to the self signed cert

# Passwords for private keys if not present they will be prompted for
# input_password = secret
# output_password = secret

string_mask = utf8only

# req_extensions = v3_req # The extensions to add to a certificate request

[ req_distinguished_name ]
countryName			= Country Name (2 letter code)
countryName_default		= FR
countryName_min			= 2
countryName_max			= 2

stateOrProvinceName		= State or Province Name (full name)
stateOrProvinceName_default	= France

localityName			= Locality Name (eg, city)
localityName_default		= Alfresco Serveur 1

0.organizationName		= Organization Name (eg, company)
0.organizationName_default	= Alfresco RH

# we can do this but it is not needed normally :-)
#1.organizationName		= Second Organization Name (eg, company)
#1.organizationName_default	= World Wide Web Pty Ltd

organizationalUnitName		= Organizational Unit Name (eg, section)
organizationalUnitName_default	= RH-Tours

commonName			= Common Name (server FQDN or YOUR name)
# commonName_default		= alfresco.archi.test
commonName_max			= 64

emailAddress			= Email Address
emailAddress_default		= archi.laurent@gmail.com
emailAddress_max		= 64

# SET-ex3			= SET extension number 3

[ req_attributes ]
challengePassword		= A challenge password
challengePassword_min		= 4
challengePassword_max		= 20

unstructuredName		= An optional company name

[ usr_cert ]

# These extensions are added when 'ca' signs a request.
# This goes against PKIX guidelines but some CAs do it and some software
# requires this to avoid interpreting an end user certificate as a CA.

basicConstraints=CA:FALSE

# This will be displayed in Netscape's comment listbox.
nsComment			= "OpenSSL Generated Certificate"

# PKIX recommendations harmless if included in all certificates.
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer

[ v3_req ]
# Extensions to add to a certificate request

basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment

[ v3_ca ]
# Extensions for a typical CA
# PKIX recommendation.

subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer:always

# This is what PKIX recommends but some broken software chokes on critical
# extensions.
#basicConstraints = critical,CA:true
# So we do this instead.
basicConstraints = CA:true

[ crl_ext ]

# CRL extensions.
# Only issuerAltName and authorityKeyIdentifier make any sense in a CRL.

# issuerAltName=issuer:copy
authorityKeyIdentifier=keyid:always

[ proxy_cert_ext ]

basicConstraints=CA:FALSE

# Here are some examples of the usage of nsCertType. If it is omitted
# the certificate can be used for anything *except* object signing.

# This is OK for an SSL server.
# nsCertType			= server

# For an object signing certificate this would be used.
# nsCertType = objsign

# For normal client use this is typical
# nsCertType = client, email

# and for everything including object signing:
# nsCertType = client, email, objsign

# This is typical in keyUsage for a client certificate.
# keyUsage = nonRepudiation, digitalSignature, keyEncipherment

# This will be displayed in Netscape's comment listbox.
nsComment			= "OpenSSL Generated Certificate"

# PKIX recommendations harmless if included in all certificates.
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer

# Copy subject details
# issuerAltName=issuer:copy

# This really needs to be in place for it to be a proxy certificate.
proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo

####################################################################
[ tsa ]

default_tsa = tsa_config1	# the default TSA section

[ tsa_config1 ]

# These are used by the TSA reply generation only.
dir		= ./demoCA		# TSA root directory
serial		= $dir/tsaserial	# The current serial number (mandatory)
crypto_device	= builtin		# OpenSSL engine to use for signing
signer_cert	= $dir/tsacert.pem 	# The TSA signing certificate
					# (optional)
certs		= $dir/cacert.pem	# Certificate chain to include in reply
					# (optional)
signer_key	= $dir/private/tsakey.pem # The TSA private key (optional)

default_policy	= tsa_policy1		# Policy if request did not specify it
					# (optional)
other_policies	= tsa_policy2, tsa_policy3	# acceptable policies (optional)
digests		= md5, sha1		# Acceptable message digests (mandatory)
accuracy	= secs:1, millisecs:500, microsecs:100	# (optional)
clock_precision_digits  = 0	# number of digits after dot. (optional)
ordering		= yes	# Is ordering defined for timestamps?
				# (optional, default: no)
tsa_name		= yes	# Must the TSA name be included in the reply?
				# (optional, default: no)
ess_cert_id_chain	= no	# Must the ESS cert id chain be included?
				# (optional, default: no)

A noter un encodage avec 4096 bits, c'est tout de même pas mal. Là ou certain peuvent critiquer à juste titre c'est sur la durée, qui est de 10 ans.

Voici la liste des fichiers générés :

-rw-r--r-- 1 root root  11K juil. 28 21:19 alfresco_config.cnf
-rw-r--r-- 1 root root 2,5K juil. 28 21:20 ca.crt
-rw------- 1 root root 3,3K juil. 28 21:19 ca.key
-rwxr-xr-x 1 root root 1,7K juil. 28 20:44 create_ssl.sh
-rw-r--r-- 1 root root    0 juil. 28 21:19 index.txt
-rw------- 1 root root 3,2K juil. 28 21:21 insecure.alfresco.key
-rw-r--r-- 1 root root 2,1K juil. 28 21:20 secure.alfresco.crt
-rw-r--r-- 1 root root 1,8K juil. 28 21:20 secure.alfresco.csr
-rw-r--r-- 1 root root 3,3K juil. 28 21:20 secure.alfresco.key
-rw-r--r-- 1 root root    0 juil. 28 21:19 serial

Il faut désormais faire prendre en compte tout ceci par Apache, il faut éditer le fichier /etc/apache2/sites-enabled/default-ssl.conf, et modifier les lignes suivantes :

SSLCertificateFile /etc/apache2/ssl/secure.alfresco.crt   
SSLCertificateKeyFile /etc/apache2/ssl/insecure.alfresco.key
SSLCACertificatePath /etc/apache2/ssl/
SSLCACertificateFile /etc/apache2/ssl/ca.crt

# et cette ligne qui aurait pu être activé bien avant, il est vrai que IE et moi, à part télécharger Firefox...
BrowserMatch "MSIE [2-6]" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0 

Et voilà on relance Apache, ensuite il faut exporter le fichier ca.crt pour les utilisateurs afin qu'ils puissent l'intégrer en certificat de confiance. Nous voilà tranquilles pendant 10 ans...

Le script de création des certificats SSLmaison

Après plusieurs essais de création, voici un script qui fonctionne à la perfection :

#! /bin/sh
#
# create_ssl.sh
# date : juillet 2016
# By Archi
# A placer dans le répertoire ou les certificats seront stockés (/etc/apache2/ssl/)
# cd /etc/apache/ssl pris en compte via -config alfresco_config.cnf (a parametrer)
 
touch index.txt
$ echo 01 > serial
 
# a faire manuellement ou en auto
# cp /etc/ssl/openssl.cnf alfresco_config.cnf
 
echo "1. Create a CA certificate"
#Create a private key for your CA:
openssl genrsa -des3 -out ca.key 4096 -config alfresco_config.cnf
 
chmod 600 ca.key
 
#Create the certificate, this will be shown as the top level certificate
# when you have signed other certificates so choose expiration day
# and the certificate contents carefully. All signed certificates will expirate
# if the top level certificate expires so you may want to choose a few years here
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt -config alfresco_config.cnf
 
echo "2. Create a certificate request"
#Create a private key:
openssl genrsa -des3 -out secure.alfresco.key 4096 -config alfresco_config.cnf
 
echo "Create the certificate request"
openssl req -new -key secure.alfresco.key -out secure.alfresco.csr -config alfresco_config.cnf
 
#Make sure you put your domain name in the “Common Name” field
echo "3. Sign the certificate with your CA certificate"
echo "### Attention CN = FQDN du serveur"

#You will need to provide the certificate request here and the CA key
openssl x509 -req -days 365 -in secure.alfresco.csr -CA \
ca.crt -CAkey ca.key -set_serial 01 -out \
secure.alfresco.crt
 
echo "4. Remove password from key (optional)"
openssl rsa -in secure.alfresco.key -out insecure.alfresco.key
#mv secure.alfresco.key secure.alfresco.key.secure
#mv secure.alfresco.key.insecure insecure.alfresco.key
 
echo "Set permissions on the keys-chmod 700"
chmod 644 secure.alfresco.*
chmod 600 insecure.alfresco.key

SOLR 4 en HTTP

Ce chapitre a été créé hors du déroulement logique de lecture de ce document, néanmoins c'est sa place. Et donc après tous ces changements de certificats, tout fonctionnait bien. J'ai donc (plus loin dans ce document) créer un site, puis des utilisateurs locaux (pas d'annuaire). Et là c'est le début de mes problèmes ou même de blocage. Malgré un post dans le forum(fr) d'Alfresco...rien au bout de 5 jours, la rubrique en anglais est dans le même style,pas de bonne réponse.

Donc depuis le début des changements de certificats l'erreur ci-dessous est apparue, mais comme tout fonctionnait en HTTPS normalement à mes yeux; je n'ai prêté aucune attention particulière à ces évènements. Les logs sont faits à la façon JAVA, dont ultra explicite sur 300 lignes, le tout toutes les 3 secondes...

2016-07-21 06:12:46,989 ERROR [org.alfresco.solr.tracker.AbstractTracker] Model tracking failed
  javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException:
  PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: 
  unable to find valid certification path to requested target 
  at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
  at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1949)
  at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:302)
  at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:296)
  at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1509)
  at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:216)
  at sun.security.ssl.Handshaker.processLoop(Handshaker.java:979)
  at sun.security.ssl.Handshaker.process_record(Handshaker.java:914)
  at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1062)
  at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375)
  at sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:747)
  at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:123)
  at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
  at java.io.BufferedOutputStream.write(BufferedOutputStream.java:121)
  at java.io.FilterOutputStream.write(FilterOutputStream.java:97)
  at org.apache.commons.httpclient.methods.ByteArrayRequestEntity.writeRequest(ByteArrayRequestEntity.java:90)
  at org.apache.commons.httpclient.methods.EntityEnclosingMethod.writeRequestBody(EntityEnclosingMethod.java:499)
  at org.apache.commons.httpclient.HttpMethodBase.writeRequest(HttpMethodBase.java:2114)
  at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:1096)
  at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:398)
  at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171)
  at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)
  at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:323)
  at org.alfresco.httpclient.AbstractHttpClient.executeMethod(AbstractHttpClient.java:135)
  at org.alfresco.httpclient.AbstractHttpClient.sendRemoteRequest(AbstractHttpClient.java:111)
  at org.alfresco.httpclient.HttpClientFactory$HttpsClient.sendRequest(HttpClientFactory.java:408)
  at org.alfresco.solr.client.SOLRAPIClient.getModelsDiff(SOLRAPIClient.java:1154)
  at org.alfresco.solr.tracker.ModelTracker.trackModelsImpl(ModelTracker.java:249)
  at org.alfresco.solr.tracker.ModelTracker.trackModels(ModelTracker.java:207)
  at org.alfresco.solr.tracker.ModelTracker.ensureFirstModelSync(ModelTracker.java:229)
  at org.alfresco.solr.tracker.CoreWatcherJob.registerForCore(CoreWatcherJob.java:131)
  at org.alfresco.solr.tracker.CoreWatcherJob.execute(CoreWatcherJob.java:74)
  at org.quartz.core.JobRunShell.run(JobRunShell.java:216)
  at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:563) 

C'est en grattant un peu plus, et aussi en me disant mais à quoi sert ce chiffrement SSL en interne dans ce serveur, à part prendre du CPU inutilement. Voila le début de la solution, je vais passer la connexion de SOLR4 en claire (HTTP), ce qui n'est pas un problème. Pour y parvenir je me suis servi de cette page https://wiki.alfresco.com/wiki/Alfresco_And_SOLR#FAQ (chapitre Running Without SSL). Il faut d'abord arrêter Alfresco puis faire les modifications qui suivent. Ensuite, il faut modifier le fichier ou plutôt ajouter dans ce fichier /opt/alfresco-community/tomcat/shared/classes/alfresco-global.properties, les lignes suivantes solr.secureComms=none, et solr.port=8080.

Ensuite, c'est là ou j'apprécie une fois de plus JAVA pour sa simplicité (pour le moment c'est mon top !) Il faut modifier ou ajouter dans chaque fichier solrcore.properties la ligne suivante :alfresco.secureComms=none. Et donc il faut chercher ses fichiers et les éditer un par un, et voici le résultat :

/opt/alfresco-community/solr4/archive-SpacesStore/conf/solrcore.properties
/opt/alfresco-community/solr4/workspace-SpacesStore/conf/solrcore.properties
/opt/alfresco-community/solr4/templates/rerank/conf/solrcore.properties 
/opt/alfresco-community/solr4/templates/test/conf/solrcore.properties
/opt/alfresco-community/solr4/templates/vanilla/conf/solrcore.properties 
/opt/alfresco-community/solr4/templates/without_suggest/conf/solrcore.properties 

Et là je me suis dit, mais c'est pas vrai, c'est quoi ce truc ! Néanmoins, j'ai contrôlé, ajouté ou modifié chaque fichier. C'est sympa ça occupe.

Dans le même style, il faut supprimer/commenter dans les fichiers web.xml le paragraphe XML suivant :

<security-constraint>
    <web-resource-collection>
    <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
    <role-name>repository</role-name>
    </auth-constraint>
    <user-data-constraint>
    <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
    </security-constraint>
    <login-config>
    <auth-method>CLIENT-CERT</auth-method>
    <realm-name>Solr</realm-name>
    </login-config>
    <security-role>
    <role-name>repository</role-name>
    </security-role>

Voici la liste de ce type de fichier

/opt/alfresco-community/tomcat/conf/web.xml
/opt/alfresco-community/tomcat/webapps/ROOT/WEB-INF/web.xml
/opt/alfresco-community/tomcat/webapps/_vti_bin/WEB-INF/web.xml
/opt/alfresco-community/tomcat/webapps/alfresco/WEB-INF/jboss-web.xml
/opt/alfresco-community/tomcat/webapps/alfresco/WEB-INF/web.xml 
/opt/alfresco-community/tomcat/webapps/host-manager/WEB-INF/web.xml  
### Présent ici ! ### 
/opt/alfresco-community/tomcat/webapps/manager/WEB-INF/web.xml 
/opt/alfresco-community/tomcat/webapps/share/WEB-INF/web.xml 
/opt/alfresco-community/tomcat/webapps/solr4/WEB-INF/web.xml 

Et là une fois...c'est quoi ce brin, il ne serait pas possible de faire un fichier unique qui contente tout le monde (?).

[Note]Note
Si cela peut vous aider, pour vérifier on peut utiliser la commande (exemple)grep -rn solr.secureComms

Pour finir, tout fonctionne très bien, mes utilisateurs sont tous visibles, les sites aussi...l'aventure continue !

Chapter 9. BeCpg (projet)

Installation du module beCPG

Une fonction supplémentaire qui peut servir là ou je travaille, est une gestion de projet. Et ceci existe gratuitement via ce lien : https://addons.alfresco.com/addons/becpg-model-designer-alfresco. Ce lien donne accès à toutes les versions : https://sourceforge.net/projects/becpg-community/files/ Ce projet contient trois composants, dont une partie Designer pour ajouter des modèles, une gestion de projets et une gestion de durée de vie de produits (PLM). Uniquement les composants pour les projets seront installés, voici la procédure :

Avant tout : on stoppe Alresco (!), suivi d'une sauvegarde (!).

#!/bin/bash
#1 - Install manually
#--------------------------
# Stop Alfresco
# Copy all AMPs under alfresco/amps folder 
# Copy apply_becpg_amps.bat under alfresco/bin 
# run "apply_becpg_amps.bat" 
# Start Alfresco

echo "Arrêt d'Alfresco CE"
/etc/init.d/alfresco stop

echo "Install core AMPS"

/opt/alfresco-community/java/bin/java -jar  /opt/alfresco-community/bin/alfresco-mmt.jar install /opt/alfresco-community/amps/becpg-core-2.1.0.amp /opt/alfresco-community/tomcat/webapps/alfresco.war -force
/opt/alfresco-community/java/bin/java -jar  /opt/alfresco-community/bin/alfresco-mmt.jar install /opt/alfresco-community/amps/becpg-project-core-2.1.0.amp /opt/alfresco-community/tomcat/webapps/alfresco.war -force

echo "Install share AMPS"

/opt/alfresco-community/java/bin/java -jar /opt/alfresco-community/bin/alfresco-mmt.jar install /opt/alfresco-community/amps/becpg-share-2.1.0.amp /opt/alfresco-community/tomcat/webapps/share.war -force
/opt/alfresco-community/java/bin/java -jar /opt/alfresco-community/bin/alfresco-mmt.jar install /opt/alfresco-community/amps/becpg-project-share-2.1.0.amp /opt/alfresco-community/tomcat/webapps/share.war -force

rm -Rf /opt/alfresco-community/webapps/alfresco
rm -Rf /opt/alfresco-community/webapps/share

sh /opt/alfresco-community/bin/clean_tomcat.sh

echo "Arrêt d'Alfresco CE"
/etc/init.d/alfresco start ; tail -f /var/log/alfresco/catalina.out

Voici l'ensemble des commandes que j'ai réalisées, avec un tas de warning j'ai eu un peu peur, néanmoins après le lancement d'Alfresco, un nouveau menu est présent beCPG. Ces warnings ne sont pas inquiétants dans la mesure ou l'option nobackup a été demandé...(?).

L'exploitation de ce module fait l'objet d'un chapitre particulier, actuellement c'est l'installation !

[Note]Note
Cette dernière copie d'écran est un peu brute volontairement, c'est pour éviter que vous soyez surpris comme moi, par ce tas de warning". Certes des warning, mais quand c'est la 1ere installation ,des doutes peuvent arriver.
[Note]Note
Le précédent script a été testé avec succès sur une version Alfresco CE 5.2, néanmoins aucun accès à BECPG Projet comme avant...

Petit guide

Une entité est une groupe de personnes, avec la version gratuite, seules les droits lecture et Ecriture/Lecture sont disponibles. Donc pour moi, pour un site il faut qu'une seule entité, sauf cas particulier, et encore...

Chapter 10. Modifications diverses pour l'interface

Suppression du bouton Like (aimer)

Il existe la solution d'intervenir directement dans le code javascript pour retirer cette fonction. Néanmoins je vous souhaite bon courage pour cette action.

Autre solution plus rapide, c'est de profiter des fonctionnalités de CSS pour rendre non visible ce bloc. Le style à recherche est like-action, en liaison avec une balise span si possible. C'est une chance seule un fichier comporte cette balise, de plus les modifications sont visibles après un rafraîchissement de la page.

tomcat/webapps/share/css/base.css:1131:.item-social a.like-action tomcat/webapps/share/css/base.css:1136:.item-social a.like-action.enabled 

Voilà les lignes à commenter, et la ligne display: none; à ajouter.

.item-social a.like-action {
#background-image: url(../components/images/like-16.png);
#background-position: 0 0;
display:none;
}
.item-social a.like-action.enabled {
#background-image: url(../components/images/liked-16.png);
#padding-left: 16px;
display: none;
}
.item-social span.likes-count {
#background-color: #eee;
#font-size: 93%;
#margin-left: 0.5em;
#padding:1px 2px 0;
display: none;
}

Dans le même style, et en plus dans le même fichier que précédemment, si les icônes/liens Twitter, Google+... sont de trop, voici les lignes à modifier :

.linkshare-action-facebook {
# background-image: url(../components/images/social-facebook-16.png);
display:none;
}
.linkshare-action-twitter {
#background-image: url(../components/images/social-twitter-16.png);
display:none;
}
.linkshare-action-google-plus {
#background-image: url(../components/images/social-google-16.png);
display: none;
}

Chapter 11. Création via l'interface WEB

Gestion des rôles

Dans Alfresco les rôles permettent de donner des droits à un groupe ou à un utilisateur. Ces droits sont globaux. Lors de la création d'un site ou espace, ces 5 groupes se retrouvent adaptés au site, comme le montre l'image suivante.

Il existe 5 catégories différentes que voici, sans oublier la catégorie Administrateur, qui ne sera pas détaillée :

  • Contributeur

    Il dispose des droits d'accès au contenu dont il est propriétaire ; il ne peut pas modifier ni supprimer le contenu créé par d'autres membres.

  • Collaborateur

    Il dispose des droits d'accès au contenu dont il est propriétaire ; il peut modifier, mais pas supprimer le contenu créé par d'autres membres.

    C'est le niveau classique d'une personne qui doit travailler en équipe, sans aucune gestion des droits/utilisateurs...

  • Coordinateur (ou Gestionnaire)

    Il dispose des droits d'accès à l'ensemble du contenu.

  • Editeur

    Il peut modifier les propriétés des fichiers et réserver / libérer des fichiers ; il ne peut pas créer son propre contenu.

  • Lecteur

    Il dispose de droits d'accès en lecture uniquement ; il ne peut pas créer son propre contenu.

Table 11.1. Plus en détail

PermissionsLecteurContributeurCollaborateurGestionnaire
Lancer des invitations   
Modifier la présentation du site   
Modifier le site (fonctions)   
Editer le site   
Configurer les flux RSS   
Créer une librairie (fichiers) 
Créer un site de liens 
Configurer le WIKI  
Voir les détails et changer les valeurs dates des évènements/tâches    


Table 11.2. Les permissions sur les dossiers :

PersmissionsLecteurContributeurCollaborateurGestionnaire
Voir les dossiers/détails
Peut utiliser le bouton J'aime (supprimer/site)
Peut utiliser le bouton Favoris
Renommer son dossier si propriétaire(!) 
Renommer un dossier  
Editer ses détails si propriétaire(!) 
Editer les détails  
Editer ses propriétés si propriétaire(!) 
Editer les propriétés  
Copier 
Déplacer son dossier si propriétaire(!) 
Déplacer un dossier   
Effacer un contenu si propriétaire(!) 
Effacer un contenu   
Changer les permissions pour lui même 
Changer les permissions   
Changer ses aspects si propriétaire(!) 
Changer les aspects  
Changer le type de fichier si propriétaire(!) 
Changer le type de fichier  
Placer un commentaire 
Editer ses commentaires si propriétaire(!) 
Editer les commentaires   
Effacer ses commentaires 
Effacer les commentaires   


Table 11.3. Les permissions sur les répertoires :

PersmissionsLecteurContributeurCollaborateurGestionnaire
Créer un dossier 
Localiser un dossier
Modifier ses régles/dossiers si propriétaire(!)  
Modifier les régles/dossiers   


Table 11.4. Les permissions sur les utilisateurs :

PermissionsLecteurContributeurCollaborateurGestionnaire
Changer un rôle   
Retirer un utilisateur d'un site   
Supprimer une invitation   


Comme vous pouvez le constater, les droits sont assez fins pour permettre à tout le monde de travailler ensemble et librement, sans pour autant mettre en péril les données. Personnellement les sites à 100% de gestionnaire doivent être rares, ou réservés à des personnes qui savent ce qu'elles font. Il n'est pas rare de croiser des utilisateurs qui suppriment un peu n'importe quoi, le tout avec une étonnante surprise, et aussi malgré un message d'alerte.

Voici un petit récapitulatif des privilèges disponibles :

Table 11.5. Les privilèges :

 LecteurEditeurContributeurCollaborateurGestionnaire
Voir les espaces et contenu
Mettre à jour / Editer  
Ajouter du contenu  
Editer les propriétés d'un contenu  
Passer des invitations    
Passer propriétaire d'un contenu    


Voici les pages sur le site d'Alfresco qui explique le tout finement si besoin est :

http://docs.alfresco.com/community/references/permissions_share_other.html

http://docs.alfresco.com/community/references/permissions_share_components.html

http://docs.alfresco.com/community/references/permissions-cloud-members.html

Création d'un utilisateur

Pour commencer, seul l'administrateur est en mesure de créer un ou plusieurs utilisateurs. C'est le menu Outils admin qui donne accès à la création d'utilisateurs. Commencer par la création d'un utilisateur alors que rien n'est fait ailleurs est une solution. Par contre, il ne pourra être affecté dans un groupe tout de suite. La meilleure solution étant de créer d'abord les groupes en liaison avec le site puis de faire la création du ou des utilisateurs. J'y reviendrais après au niveau des groupes, donc j'insiste un peu sur si vous utilisez des groupes !

Les premières lignes concernent des informations sur l'utilisateur, la 2e partie l'authentification. Pour finir avec l'affectation d'un ou plusieurs groupes, de l'activation ou non de quotas et même du compte. À noter que chaque utilisateur peut être assujeti à un quotas à ne pas dépasser, si cette valeur vide, elle est équivalente à sans limite.

Pour en finir, rien de bien compliqué à ce niveau, reste à mon avis à écrire uniformément les données, dans le style les noms en majuscules, les logins en minuscule...etc.

Une fois, l'utilisateur validé, celui-ci se voit attribué un site personnel. À ce sujet et après tests, il n'est pas possible de supprimer un site personnel si l'utilisateur existe.

A noter, l'utilisateur créé reçoit un mél. similaire à celui-ci. Il faut prendre en compte qu'il s'agit d'une création d'un compte en local(!), et non depuis un annuaire (plus de gestion des mots de passe).

À noter : mon Alfresco n'est pas encore configuré entièrement, d'où les liens incohérents. Les images manquantes proviennent d'un export de ce mél. sans les images. Sinon c'est propre et clair.

Suivre un utilisateur fait que Alfresco trace cette personne sur ces mondres mouvements.

Création d'un groupe

Utiliser les groupes pour mieux gérer les droits est une possibilité que Alfresco propose sans problème. Néanmoins je pense qu'elle n'est pas forcément à utiliser à chaque fois. Pour un site qui ne contient pas trop d'utilisateurs, la création d'un groupe ne peut que compliquer une tâche simple. Le système est ouvert à toute forme de gestion. Il existe des sites qui utilisent les groupes internes et externes afin de différencier les utilisateurs. C'est loin d'être idiot.

Reste à attribuer un rôle a votre groupe.

[Note]Note
Alfresco présente les groupes dans un site sans problème, néanmoins la gestion en interne représente tous les utilisateurs importés ou pas depuis un groupe.

Création d'un site

Il existe trois type de sites possibles qui sont Public, Modéré et Privé. Comme expliqué sur l'image ci-dessous, les effets ne sont pas du tout les mêmes. Une fois votre choix fait et validé, votre site peut évoluer en passant par le menu Outils admin.

[Note]Note
Par défault, la fonction de gestion des documents est activée. C'est aussi la mission première d'Alfresco, la gestion de documents

Création d'un site PRIVE :

L'interface vierge :

Chaque site peut avoir des contenus personnalisés et un aspect(thème) qui peuvent être différents. Comme le montre l'exemple suivant, le site créé récemment, contient un espace documentaire(fichiers), mais aussi un calendrier. Il est possible d'y ajouter une fonction Wiki, Blog...etc.

Suppression création de site/utilisateurs

Par défaut, un utilisateur authentifié est en mesure de créer un site. C'est pas mal, mais ceci peut transformer la plateforme Alfresco en véritable nid à sites en tout genres. J'ai donc modifié le fichier /opt/alfresco-community/tomcat/shared/classes/alfresco/extension/custom-model-context.xml, avec les paramètres données dans cette page : http://docs.alfresco.com/5.0/tasks/site-creation-permission.html. Le menu est tojours présent, mais c'est un échec sauf pour l'administrateur. C'est exactement ce que je voulais.

Après un échec en tant qu'administrateur pour éffacer un site ou plusieurs, voici les bonnes valeurs à placer :

[Note]Note
org.alfresco.service.cmr.site.SiteService.createSite=ACL_METHOD.ROLE_ADMINISTRATOR org.alfresco.service.cmr.site.SiteService.deleteSite=ACL_METHOD.ROLE_ADMINISTRATOR

Chapter 12. Le classement des documents/informations

Les catégories et les tags :

Travailler avec un ECM comme Alfresco avec des utilisateurs qui arrivent d'un milieu très pauvre comme juste un serveur de fichiers CIFS, mérite peut-être une information pour exploiter au mieux les possibilités du système. Désormais il faut penser non pas au contenu du document, mais à ce qu'il représente. Exemple : une facture à un garagiste, le mot important est facture. Ce document dans la logique des choses va être positionné dans la catégorie facture. Ensuite il est possible de taguer (mot clé) un document. Toujours avec ce même exemple; Le tag garagiste est réalisable. Ce même tag pourra être utilisé pour un devis ou autre, concernant ce garagiste, et le tout sans être mélangé avec les factures. Ceci évite aussi comme je le vois assez souvent, de créer un répertoire "garagiste", puis "facture", éventuellement "devis"...et c'est le bazar pour retrouver les données rapidement.

Voilà en gros l'état d'esprit à avoir et à appliquer avec un ECM, et même avec une GED. Comme il est écrit souvent en parlant d'Alfresco et de son système de classement, celui-ci est intelligent. Il est possible de faire beaucoup plus que ce simple exemple, c'est la partie qui suit.

Les règles applicables aux dossiers

Il faut être administrateur ou gestionnaire pour avoir accès à cette possibilité. Pour activer une règle il faut définir les conditions suivantes :

  • Une ou plusieurs conditions (quand) :

    S'applique au fichier qui peut-être nouveau, mis à jour...

  • Une action ou plusieurs :

    S'applique au document, à une personne

  • Un déclencheur ou plusieurs :

    Déclenche des actions diverses sur le document ou sur Alfresco...

Pour en finir, les règles permettent d'agir automatiquement sur les documents, sur ce qui se passe dans un site de façon automatique, et le tout pour simplifier votre travail. Les domaines d'actions sont vastes, l'exemple suivant est réalisable par une règle : si une personne supprime un fichier, copier(2) ce fichier ailleurs, puis envoyer un mél.(2) au gestionnaire du site. Autre exemple : Il est possible de donner une date de fin de validité à un document. Grâce à une règle, il est possible de supprimer ce document une fois la date d'expiration dépassée.

Exemple : durée de vie d'une image(s)

Voici un exemple simple à réaliser. Si une image est importée, automatiquement sa date d'expiration sera de 168 heures (7 jours).

Les aspects

Les aspects apportent des fonctionnalités sur les contenus depuis un dossier, voici la liste par défaut des différentes méta-données possibles. Il faut bien évidemment avoir les droits pour modifier ces paramètres, ils sont applicables sur un dossier J'ai essayé d'expliquer chaque fonction, mais ceci est loin d'être facile.

  • Catégorisable (cm:generalclassifiable) : Le document peut faire parti d'une catégorie, sans cet aspect pas moyen de lier un document avec une catégorie (!)
  • Possibilité de mise en conformité (cm:complianceable) : Concerne la suppression, ajoute une date supprimer après.
  • Dublin Core (cm:dublincore) : Apporte les informations suivantes à un document : Editeur, Contributeur, Type, Identifiant, Origine, Couverture, Droit d’accès et Sujet.
  • Validité (cm:effectivity) : Apporte un support de validité sur le document au travers des dates début et fin.
  • Peut être résumé (cm:summarizable) : Apporte un résumé possible du document.
  • Versionnable (cm:versionable) : Apporte le support des versions.
  • Peut être transformé en modèle (cm:templatable) : Le document peut-être transformer en modèle.
  • Envoyé par e-mail (cm:emailed) : À utiliser uniquement pour une utilisation avec des méls.
  • Alias email (emailserver:aliasable) : À utiliser uniquement pour une utilisation avec des méls.
  • Peut être taggé (cm:taggable) : Apporte la prise en compte des mots clés, c'est un aspect très important !!!
  • Supporte l'édition en ligne (app:inlineeditable) : Peut-être éditer en ligne (pour M$ Office ou Libre Office), autant dire que c'est important pour certains documents.
  • Positionnement géographique (cm:geographic) : Lié à la géolocalisation.
  • EXIF (exif:exif) : Apporte des informations sur les photos, EXIF (Exchangeable image file format).
  • Audio (audio:audio) : Apporte des informations au niveau des fichiers audio.
  • Contrôle d'indexation (cm:indexControl) : Ajoute un contrôle d'index sur le document.
  • Limité (dp:restrictable)
  • Dossier intelligent personnalisé (smf:customConfigSmartFolder)
  • Dossier intelligent système (smf:systemConfigSmartFolder)
  • Modèle de permissions (bcpg:permissionsTpl)
  • Modèle(s) de rapport (rep:reportTplsAspect) : Lié aux rapports.
  • Langues des rapports (rep:reportLocalesAspect) : Lié aux rapports.
  • Paramètres des rapports (rep:reportParametersAspect) : Lié aux rapports.
  • Catalogue (bp:cataloguable) : Lié à la gestion de projet.
  • Modèle d'entité (bcpg:entityTplAspect) : Lié à la gestion de projet.
  • Lien document entités (bcpg:docLinkedEntitiesAspect) : Lié à la gestion de projet.
  • Budget (pjt:budgetAspect)

Chapter 13. Les extensions d'Alfresco

Les extensions permettent dans un site de posséder des fonctions suuplémentaires, comme un calendrier, une gestion des documents, un Wiki, un blog...sur INTERNET ils sont nombreux. Je ne parle pas de l'extension gestion de documents, qui a déjà été présenté lors de l'intégration avec les solutions bureautiques.

[Note]Note
A noter, que la plupart des extensions profitent d'un éditeur de texte avec de très larges possibilités (TinyMCE).

La liste de données

Commencons par celle que j'apprécie particulièrement, ou un jour j'expliquerais comment créer sa propre liste...à suivre. Cette liste vous permet de gérer ou d'organiser diverses informations selon des modèles prédéfinis. Voici la liste par défaut, comme vous pouvez le voir vous avez le choix dans beaucoup de styles :

Voici en images les divers thèmes offerts par défaut. Cette liste est extensible et personnalisable, à condition de passer soit par du téléchargement, ou par du développement. Le système une fois de plus est souple, même si la technologie n'est pas forcément simple.

Pour en finir, voici un exemple possible, cette image est suffisamment claire à mes yeux. Il est à noter toutefois, que le module n'est pas accouplé au calendrier ni aux taches. C'est peut-être regrettable, mais parfois en informatique il est préférable d'avoir une chose relativement simple, et non pas une usine à gaz ingérable...

[Note]Note
Tous les modèles possèdent tous une colonne Action. Celle-ci permet d'éditer, de dupliquer ou d'effacer une ligne entière.

Les Discussions

Rien de bien spécial à ce niveau, c'est un espace de dialogues comme il en existe beaucoup.

Les liens

C'est un espace qui rassemble vos liens, avec une option lien de type interne ou autre.

Le Blog

Rien de bien particulier une fois de plus, un Blog comme beaucoup d'autres.

Le Wiki

C'est vraiment à mes yeux une option, mais bon çà existe. Donc avec ce Wiki il est possible de créer des pages WEB.

Le calendrier

A mes yeux c'est une fonction intéressante, dont l'affichage peut varier en fonction des mots clés. L'interface est claire et pratique.

Les Membres du site

C'est une fonction imposée et obligatoire, néanmoins elle est accessible avec les autres produits précités. Il faut suffisamment de droits pour avoir accès aux modifications, une image suffit pour tout comprendre.

[Note]Note
C'est une fois de plus agréable pour tous(!) d'être en mesure de contrôler qui est inscrit dans un site, qui peut faire quoi. C'est autre chose qu'un simple serveur de fichiers en WEBDAV ou similaire.

Chapter 14. Les modèles

C'est suite à un problème bloquant avec un modèle que ce chapitre à été fait. Il peut servir à tous y compris moi pour l'avenir...comme déjà dit ce document est aussi une source d'informations pour moi.

Dans ce chapitre je ne parlerais que de l'ajout d'un modèle au niveau des listes de données. Alfresco propose bien d'autres modèles, mais je pense que ces créations sont plus faciles à faire, au moins en prenant un modèle basique, Alfresco à des limites extraordinaires.

Ajout d'un modèle dans la Liste de données

Pour réaliser ce qui suit, c'est à priori pas difficile. Et être en mesure d'apporter des modèles adaptées à votre entreprise est une composante d'Alfresco. C'est une possibilité puissante à tout les niveaux, sans un modèle je pense qu'il faut des années de pratique avec Alfresco pour comprendre et placer les bons fichiers aux bons endroits, et sans faute de contexte. Néanmoins je peux vous assurer après avoir fait de nombreux essais, rencontré beaucoup d'échecs, qu'il est préferable d'être sure de sois avant de commencer:

Voilà le but à obtenir en images, il est possible d'aller encore plus loin, mais cela me satisfait pleinement. Avec ma petite expérience d'Alfresco le plus difficile est d'avoir le squelette et savoir quoi écrire et où.

Sans critiquer la documentation nombreuse et riche d'Alfresco dans tous les domaines, voici un mode d'emploi sur les modèles : http://docs.alfresco.com/5.1/references/dev-extension-points-content-model-define-and-deploy.html. Et sinon en se basant sur le modèle ci-dessous, ceci devrait vous produire un 1er essais concluant.

Bon avant de commencer, bien prendre en compte ceci :

  • Une bonne sauvegarde de tout, et si possible un serveur non en production.

  • Une bonne connaisance d'Alfresco

  • Ne pas déployer un modèle puis le modifier fortement, Alfresco n'apprécie pas, franchement pas même. La suppression ou des changements de type sont sources à erreurs.

  • Lors de grosses modifications de votre modèle, éviter qu'il soit activé avec ou sans donnée...Alfresco n'aime pas !

  • Bien concevoir son modèle du 1er coup.

Donc voilà de bonnes bases, personnellement j'ai donné à toutes, à l'exception des sauvegardes tout de même, et çà aide !

Mon modèle "mutation"

Ce modèle est dédié à la gestion de personnels qui bougent(mutation) ou change de fonction dans votre entreprise. Ce modèle est composé de 3 fichiers bien différents. La fonction de chaque fichier est suffisamment explicite à la lecture du code pour comprendre leurs fonctions.

mutation_2-model-context.xml

Ce fichier est à placer ici : /opt/alfresco-community/tomcat/shared/classes/alfresco/extension, et la fin du fichier doit contenir(!) : -model-context.xml Ce fichier est celui qui peut poser le moins de problème, il là pour appeller le fichier de définitions.

<xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'>

<beans>
    <bean id="extension.mu.dictionaryBootstrap" parent="dictionaryModelBootstrap" depends-on="dictionaryBootstrap">
        <property name="models">
            <list>
                <value>alfresco/extension/mutation_2-model.xml</value>
            </list>
        </property>
    </bean>
</beans>

mutation_2-model.xml

Ce fichier est à placer ici : /opt/alfresco-community/tomcat/shared/classes/alfresco/extension, et la fin du fichier doit contenir : -model.xml

<?xml version="1.0" encoding="UTF-8"?>

<!-- Fichier de définition pour PIM PAM -->
<model name="mu:muDatalistV2" xmlns="http://www.alfresco.org/model/dictionary/1.0">
    
    <!-- Optional meta-data about the model -->   
    <description>Custom datalist</description>
    <author>Archi</author>
    <version>1.0</version>
    
    <!-- Imports are required to allow references to definitions in other models -->   
    <imports>
        <!-- Import Alfresco Dictionary Definitions -->
        <import uri="http://www.alfresco.org/model/dictionary/1.0" prefix="d"/>
        <!-- Import Alfresco Content Domain Model Definitions -->
        <import uri="http://www.alfresco.org/model/content/1.0" prefix="cm"/>
        <!-- Import Alfresco Data List Model Definitions -->
        <import uri="http://www.alfresco.org/model/datalist/1.0" prefix="dl"/>
    </imports>
    
    <!-- Introduction of new namespaces defined by this model -->   
    <namespaces>
        <namespace uri="mu.customlists.com" prefix="mu"/>
    </namespaces>
    
    <!-- declaration de contrainte -->

<!--		T Y P E   D E F I N I T I O N S		-->   
    <types>
        
        <!--	Data list defintions For this model go here -->
        <type name="mu:muPimPamV2">
            <title>PIM-PAM</title>
            <description>Gestion des PIM PAM</description>
            <parent>dl:dataListItem</parent>
            
            <properties>
                <property name="mu:PimPamQui1">
                    <title>Dép Grade/Nom/Prénom</title>
                    <type>d:text</type>
                    <mandatory>true</mandatory>
                </property>
                
                <property name="mu:PimPamQui2">
                    <title>Remplace Grade/Nom/Prénom</title>
                    <type>d:text</type>
                    <mandatory>false</mandatory>
                    
                </property>
                
                <property name="mu:PimPamTypeMut">
                    <title>Type Mut</title>
                    <type>d:text</type>
                    <mandatory>true</mandatory>
                    <constraints>
                        <constraint name="mu:ListTypeMut" type="LIST">
                            <parameter name="allowedValues">
                                <list>
                                    <value>EXTERNE</value>
                                    <value>INTERNE</value>
                                    <value>Définitif</value>
                                    <value>Malade</value>
                                    <value>Autre</value>
                                </list>
                            </parameter>
                        </constraint>
                    </constraints>
                </property>
                
                <property name="mu:PimPamDate1">
                    <title>RECU LE</title>
                    <type>d:date</type>
                    <mandatory>true</mandatory>
                </property>
                
                <property name="mu:PimPamDate2">
                    <title>POUR LE</title>
                    <type>d:date</type>
                    <mandatory>false</mandatory>
                </property>
                
                <property name="mu:PimPamAnnuaire">
                    <title>@nnuaire</title>
                    <type>d:date</type>
                    <mandatory>false</mandatory>
                </property>
                
                <property name="mu:PimPamAD">
                    <title>AD</title>
                    <type>d:date</type>
                    <mandatory>false</mandatory>
                </property>
                
                <property name="mu:PimPamDroitsAD">
                    <title>Droits AD</title>
                    <type>d:text</type>
                    <mandatory>false</mandatory>
                </property>
                
                <property name="mu:PimPamBrassageETH">
                    <title>ETH</title>
                    <type>d:text</type>
                    <mandatory>false</mandatory>
                </property>
                
                <property name="mu:PimPamBrassageTPH">
                    <title>TPH</title>
                    <type>d:text</type>
                    <mandatory>false</mandatory>
                </property>
                <property name="mu:PimPamMateriel">
                    <title>Mats</title>
                    <type>d:text</type>
                    <mandatory>false</mandatory>
                </property>
                
                <property name="mu:PimPamObs">
                    <title>Obs</title>
                    <type>d:text</type>
                    <mandatory>false</mandatory>
                </property>
                
            </properties>
            
            <!--    Association / Attachements -->
            <associations>
                <association name="mu:muAttachments">
                    <title>Attachements</title>
                    <source>
                        <mandatory>false</mandatory>
                        <many>true</many>
                    </source>
                    <target>
                        <class>cm:content</class>
                        <mandatory>false</mandatory>
                        <many>true</many>
                    </target>
                </association>
            </associations>
            
        </type>
    </types>
</model>

share-config-custom.xml

Ce fichier est déjà présent, donc il suffit de le sauvegarder puis d'ajouter le texte qui va bien à la fin et avant la balise </alfresco-config>, ce fichier est présent ici : /opt/alfresco-community/tomcat/shared/classes/alfresco/web-extension

<!-- CUSTOM DATALIST : CALL -->
<config evaluator="model-type" condition="mu:muPimPamV2">
    <forms>
        <!-- Create item form -->
        
        <form>
            <field-visibility>
                <!-- for the form creation we are showing everything except approved date -->
                
                <show id="mu:PimPamQui1" />
                <show id="mu:PimPamQui2" />
                <show id="mu:PimPamDate1" />
                <show id="mu:PimPamDate2" />
                <show id="mu:PimPamTypeMut" />
                <show id="mu:PimPamAnnuaire" />
                <show id="mu:PimPamAD" />
                <show id="mu:PimPamDroitsAD" />
                <show id="mu:PimPamBrassageETH" />
                <show id="mu:PimPamBrassageTPH" />
                <show id="mu:PimPamMateriel" />
                <show id="mu:PimPamObs" />
                <show id="mu:muAttachments" />
            </field-visibility>
            
            <create-form template="/org/alfresco/components/data-lists/forms/dataitem.ftl" />
            
            <appearance>
                <field id="mu:PimPamObs">
                    <control template="/org/alfresco/components/form/controls/textarea.ftl" /> 
                </field>
                
                <field id="mu:muAttachments">
                    <control>
                        <control-param name="startLocation">{doclib}</control-param>
                    </control>
                </field>
            </appearance>
        </form>
        
        <!-- Data Grid view -->
        
        <form id="datagrid">
            <field-visibility>
                <show id="mu:PimPamQui1" />
                <show id="mu:PimPamQui2" />
                <show id="mu:PimPamDate1" />
                <show id="mu:PimPamDate2" />
                <show id="mu:PimPamTypeMut" />
                <show id="mu:PimPamAnnuaire" />
                <show id="mu:PimPamAD" />
                <show id="mu:PimPamDroitsAD" />
                <show id="mu:PimPamBrassageETH" />
                <show id="mu:PimPamBrassageTPH" />
                <show id="mu:PimPamMateriel" />
                <show id="mu:PimPamObs" />
                <show id="mu:muAttachments" />
            </field-visibility>
        </form>
    </forms>
</config>

<!-- Edit view -->

<config evaluator="node-type" condition="mu:muPimPamV2">
    <forms>
        <!-- Edit marketing item form -->
        
        <form>
            <field-visibility>
                <show id="mu:PimPamQui1" />
                <show id="mu:PimPamQui2" />
                <show id="mu:PimPamDate1" />
                <show id="mu:PimPamDate2" />
                <show id="mu:PimPamTypeMut" />
                <show id="mu:PimPamAnnuaire" />
                <show id="mu:PimPamAD" />
                <show id="mu:PimPamDroitsAD" />
                <show id="mu:PimPamBrassageETH" />
                <show id="mu:PimPamBrassageTPH" />
                <show id="mu:PimPamMateriel" />
                <show id="mu:PimPamObs" />
                <show id="mu:muAttachments" />
            </field-visibility>
            
            
            <create-form template="/org/alfresco/components/data-lists/forms/dataitem.ftl" />
            
            <appearance>
                <field id="mu:PimPamObs">
                    <control template="/org/alfresco/components/form/controls/textarea.ftl" /> 
                </field>
                
                <field id="mu:muAttachments">
                    <control>
                        <control-param name="startLocation">{doclib}</control-param>
                    </control>
                </field>
            </appearance>
            
        </form>
    </forms>
</config>


Une fois que tout ceci est en place, reste à lancer Alfresco puis de scruter les logs.

Lister les modèles

Voici une page d'accès à différentes commandes pour les modèles :

https://alfresco.archi.test/alfresco/s/admin/admin-repoconsole

puis show file-list alfresco/extension/*

C'est cette même console qui permet d'activer ou pas un modèle, il existe même des exemples de commandes. Pour information si vos fichiers modèles sont bien insérés dans Alfresco, le modèle s'active automatiquement.

ERROR de nom d'espace

Voici un extrait de mon erreur persistante :

A namespace prefix is not registered for uri sl.slcustomlists.com

C'est avec mes essais de tous les côtés qu'une erreur est restée assez longtemps, y compris après avoir visiter des forums. Mon erreur à été de ne pas penser qu'Alfresco prenne un de mes modèles, puis l'entrepose ailleurs, ou est-ce une erreur de ma part d'avoir entreposé mes fichiers ici(?). Et donc la pluspart des modèles sont entreposés ici :

/opt/alfresco-community/alf_data/solr4/model

Ce répertoire est une mine d'informations sur les modèles, car les plus importants sont là. Vous avez aussi tous les modèles de dictionnaires utilisables comme cm:content...etc.

La solution a été de reinjecter les 2 fichiers modèles de les faire prendre en compte puis de les supprimer à nouveau, comme les index. A noter qu'il apparait tout de même encore aux niveaux des noeuds, même je n'ose pas faire supprimer...tout fonctionne sans problème.

Chapter 15. Personnalisation des méls Alfresco

Modifier le texte des méls envoyés par Alfresco

Mon problème avec les méls. d'Alfresco est qu'il comporte uniquement un lien qui ne correspond pas à mon architecture. En effet le port 8080 n'est plus utilisé sur mon serveur, il faut donc adapter tous les liens avec une écriture directe du bon lien.

C'est une étape facile car les méls sont tous stockés au même endrois, mais seul l'administrateur peut le faire directement. Il faut aller dans : Entrepôt-< Dictionnaire de données-< Modèles d'e-mail, et de là par catégorie vous avez accès à tout les méls.

En prenant en exemple un mél qui invite un utilisateur à se raccorder au site, il suffit de sélectionner ce fichier dans la rubrique Inviter : invite-email_fr.html.ftl. L'édition se fait directement depuis Alfresco, le mot clé à remplacer est ${shareUrl}.Ceci est un exemple, une fois que vous avez compris la structure, les mots clés, tout est modifiable, puis à tester.

Chapter 16. Installation d'un antivirus (Clamav)

C’est juste avant de présenter à mes DSI la solution Alfresco, que le besoin d’une analyse virale sur le serveur, c’est avérée. C’est donc plus une contrainte pour moi, mais bon…ma pauvre Debian va recevoir un antivirus pour les autres (:.

Après recherches, Alfresco ne propose rien en natif pour cette mission, il existe tout de même au moins un addon pour faire cette action. En effet celui-ci intercepte et analyse le document puis le transmet à Alfresco. C’est une solution idéale, mais par contre la pérennité de ce plugin, remet tout en cause. Donc pas trop le choix, il faut analyser les fichiers et oublier Alfresco. Si l’anti-virus trouve un fichier(s) suspect, il ne doit faire que de la notification, et surtout ne rien mettre en quarantaine, sinon c’est la galère pour effacer tout en passant via les nœuds d’Alfresco.

A noter que cette installation est nécessaire pour une situation où vous avez des fichiers à transmettre vers des systèmes Microsoft et que vous êtes concernés par leur sécurité.

Installation

Les paquets suivants sont à installer :

apt-get update && aptitude install clamav clamav-base clamav-daemon clamav-freshclam

Le paquet clamav-daemon a été par la suite désactivé (systemctl disable clamav-daemon && systemctl disable clamav-freshclam ). Ceci me permet de procéder manuellement à la mise à jour et aux scans aussi. Ce qui libère légerement le système aussi.

Sur internet il n'est pas rare de rencontrer des personnes surprises par sa présence dans les dépôts, car ce logiciel appartient à Cisco™...donc profitons en, sinon il reste pas grand chose pour le moment.

Configuration

La configuration de clamav et de freshclam dépendent de vos fichiers sur votre serveur. Il est nécessaire de régler au mieux les différentes tailles de fichiers que Clamav doit inspecter ou pas. En ce qui concerne freshclam, j'ai modifié la source d'une base anti-virale, et demandé une seule mise à jour; pour mémoire, tout est manuel.

Au final, il est possible de lister tous les paramètres via le logiciel clamconf, c'est plutôt pratique.

Exploitation

L'exploitation de Clamav est très simple, comme ses mises à jour virales. Auparavant, j'ai décidé de faire ses actions de façon manuelle, et donc 2 scripts sont présents pour cela. Leurs utilisation est très simple, voici les options communes : -m, permet d'envoyer un rapport par mail et -v passe le script en mode verbeux.

Ces 2 scripts sont à inserer dans la crontab, une fois les tests éffectués.

Ces 2 scripts utilisent en commun les mêmes librairies que voici, et à ma grande surprise pleins d'autres ont été installés.

apt-get update && aptitude install libemail-sender-perl libemail-simple-perl libgetopt-mixed-perl

Voilà le code qui peut-être pris en exemple pour synchroniser les bases virales de Clamav.

#!/usr/bin/perl
#######################################################################
# Ce script en Perl lance freshclam puis envois ou pas un rapport par mél 
# lancement : /opt/update-clamav.pl [-m|-v]
# ou "-m" = envois par mail et "-v" = affichage-mode verbeux 
# Necessite la lib suivante : "getopt::mixed Email::sender Email::simple" 
# A utiliser dans la crontab : style 2 mises à jour par jour
# "5 23* * * *	root	/opt/update-clamav.pl -m"
######################################################################
use strict ;
use Getopt::Mixed "nextOption" ;
    Getopt::Mixed::init('m v') ;			# 2 options possibles
use Email::Sender::Simple qw(sendmail);
use Email::Simple;
use Email::Simple::Creator;
# --------------------------------------------------------------------
use vars qw ($cmd $retour_cmd $option $rapport $verbose ); 
my $version =" $0 version 1.0 (NOV 2016) sous licence (GPL version 3) $\n";
# --------------------------------------------------------------------
# partie conf MAIL :
my $serveur_mail="localhost";
my $DE='adminsi@alfresco.archi.test';
my $TO='adminsi@alfresco.archi.test';
my $titre = "Rapport update CLAMAV";
# --------------------------------------------------------------------
# Pour le traitement des options en ligne de commande
# traitement des options (2 uniquements !)

while(( $option ) = Getopt::Mixed::nextOption() ) {
   OPTION: {
     $option eq 'm' and do { $rapport = 1 ; next OPTION; };
     $option eq 'v' and do { $verbose = 1 ; next OPTION; }; 
   }
 }

# nettoyage des options
Getopt::Mixed::cleanup();
# --------------------------------------------------------------------
# on lance la commande qui va bien, on compte les "is uptodate"
$cmd = `freshclam --enable-stats | grep 'is up to date' | wc -l`;

# si tout ok $cmd = 3 sinon contient le MSG erreur
if ($cmd == 3) { 
	$retour_cmd = "OK: Les 3 fichiers sont à jour\n"; 
} else {
	$retour_cmd = "PROBLEME: Les 3 fichiers ne sont plus à jour\n".$cmd; 
}

print $retour_cmd if defined $verbose ;
# print "DEBUG:CMD=".$cmd ;

# ---------------------- MESSAGERIE ----------------------------------
# Très simple d'emploi :
#
if ($rapport) { 	# si $rapport est définie (1)

	# et voilà, on envoi par mail le rapport
  my $mel = Email::Simple->create(
    header => [
		To      => $TO,
		From    => $DE,
		Subject => $titre,
    ],
    body => $retour_cmd .$version,
  );
 	 sendmail($mel);	# ca part !

	# Traitement des problemes eventuels ...
	if (not ref ($mel)) { print "\n--!-- IMPOSSIBLE DE TRANSMETTRE LE FICHIER code ($mel) --!--\n\n"  ; }
}
# Et voilà c'est la fin !

Voici le script qui peut également être pris en exemple, il permet de lancer clamscan, sur un répertoire par défaut ou pour la totalité du système (option -f).

#!/usr/bin/perl
#######################################################################
# Ce script en Perl lance un scan d'une systeme ou d'un répertoire précis 
# puis envois ou pas un rapport par mél 
# lancement : /opt/scan_clamav.pl [-f|-m|-v]
# ou "-f" = full ou "-m" = envois par mcanil et "-v" = affichage-mode verbeux 
# utilise les librairies suivantes : "getopt::mixed Email::sender Email::simple"
# A utiliser dans la crontab : style 2 mises à jour par jour
# "5 3* * * *	root	/opt/scan-clamav.pl -m"
######################################################################
use strict ;
use Getopt::Mixed "nextOption" ;
    Getopt::Mixed::init('f m v') ;	# 3 options possibles
use Email::Sender::Simple qw(sendmail);
use Email::Simple;
use Email::Simple::Creator;
# --------------------------------------------------------------------
use vars qw ($cmd $retour_cmd $option $rapport $verbose ); 
my $version =" $0 version 1.0 (NOV 2016) sous licence (GPL version 3) $\n";
# --------------------------------------------------------------------
# partie conf MAIL :
my $serveur_mail="localhost";
my $DE='adminsi@alfresco.archi.test';
my $TO='adminsi@alfresco.archi.test';
my $titre = "Rapport SCAN CLAMAV";

# on lance la commande qui va bien, c'est la version par défaut !!! en dessous la full !!!
# aucune exception pour Alfresco/alf_data, voir si après sinon
# -r = récursif / -i n'affiche que les fichiers suspects
my $cmd = `nice -19 clamscan -r -i /opt/alfresco-community/alf_data`;

# --------------------------------------------------------------------
# Pour le traitement des options en ligne de commande

# traitement des options (2 uniquements !)
while(( $option ) = Getopt::Mixed::nextOption() ) {
   OPTION: {
     $option eq 'f' and do { 
	$cmd = `nice -19 clamscan -r -i --exclude-dir=/proc --exclude-dir=/sys --exclude-dir=/media /` ; next OPTION; };
     $option eq 'm' and do { $rapport = 1 ; next OPTION; };
     $option eq 'v' and do { $verbose = 1 ; next OPTION; }; 
   }
 }

# nettoyage des options
Getopt::Mixed::cleanup();
# --------------------------------------------------------------------

# si tout ok $cmd = ne contient pas FOUND sinon contient le MSG erreur
if ($cmd =~ m/(FOUND)/) { 
	$retour_cmd = "PROBLEME URGENT: CLAMAV A DETECTE QUELQUE CHOSE(S)\n".$cmd; 
	$titre = "[**URGENT CLAMAV**]Rapport SCAN CLAMAV";
} else {
	$retour_cmd = "OK: CLAMAV n'a rien détecté :) \n".$cmd; 
}

print $retour_cmd if defined $verbose ;
# print "DEBUG:CMD=".$cmd ;

# ---------------------- MESSAGERIE ----------------------------------
# Très simple d'emploi :
#
if ($rapport) { 	# si $rapport est définie (1)

	# et voilà, on envoi par mail le rapport
  my $mel = Email::Simple->create(
    header => [
      To      => $TO,
      From    => $DE,
      Subject => $titre,
    ],
    body => $retour_cmd .$version,
  );

 	 sendmail($mel);	# ca part !

	# Traitement des problemes eventuels ...
	if (not ref ($mel)) { print "\n--!-- IMPOSSIBLE DE TRANSMETTRE LE MAIL code ($mel) --!--\n\n"  ; }
}
# Et voilà c'est la fin !

Et voilà avec les 2 scripts précités, plus besoin de se connecter pour connaître l'état de clamav. J'ai perdu du temps, mais je vais en gagner par la suite...

Chapter 17. La supervision possible

Table des matières

Juste pour poser l'information comme quoi une supervision de la mémoire d'Alfresco est faisable. En complément d'autres données; il y a moyen de faire quelque chose de bien.

La mémoire utilisée

wget http://127.0.0.1/alfresco/service/admin/admin-communitysummary --no-check-certificate --user=admin --password=xxxxxxx -O /tmp/extract.html

   <span class="label">Mémoire libre (Go):</span>
      <span class="value">0,43</span>
      
   <div class="control field">
      <span class="label">Mémoire maximum (Go):</span>
      <span class="value">1,95</span>
      
      <span class="label">Mémoire totale (Go):</span>
      <span class="value">0,88</span>
      
      <span class="label">CPUs:</span>
      <span class="value">6</span>

Chapter 18. La sauvegarde dédupliquée (Borg)

Précedemment dans un autre chapitre (Chapter 4, La sauvegarde intégrale (classique)) , nous avons vu comment sauvegarder Alfresco et sa base de données, via une méthode plus que classique, néanmoins fiable. Sans oublier que nous sommes tout de même en 2016, et qu'il existe des moyens de faire tout ceci en économisant des ressources.

Voilà le triste constat, nous avons plusieurs sauvegardes fiables, mais la taille ne fait que augmenter, comme les temps de transfert et à l'inverse l'espace de stockage.

-rw-r--r-- 1 root root 1,1M août  27 08:55 239-08H54-alfresco.sql
-rw-r--r-- 1 root root 936M août  27 09:11 239-08H54-alfresco.tgz
-rw-r--r-- 1 root root 1,2M sept.  4 12:51 247-12H51-alfresco.sql
-rw-r--r-- 1 root root 915M sept.  4 13:04 247-12H51-alfresco.tgz
-rw-r--r-- 1 root root 1,2M sept.  8 08:10 251-08H10-alfresco.sql
-rw-r--r-- 1 root root 915M sept.  8 08:23 251-08H10-alfresco.tgz
-rw-r--r-- 1 root root 1,2M sept. 10 07:40 253-07H40-alfresco.sql
-rw-r--r-- 1 root root 938M sept. 10 07:55 253-07H40-alfresco.tgz
-rw-r--r-- 1 root root 1,2M sept. 11 09:09 254-09H09-alfresco.sql
-rw-r--r-- 1 root root 934M sept. 11 09:25 254-09H09-alfresco.tgz

Borg Backup et la déduplication

Borg Backup est un fork d'Attic depuis 2015, ceci fait suite à des problèmes de develloppement de celui-ci. Les divers develloppeurs ont préféré quitter Attic, pour faire évoluer plus rapidement Borg, et bien évidemment corriger des bogues par la même occasion. Autant dire que Attic a du plomb dans l'aile désormais.

Voici ce que écrit Wikipedia à propos de la déduplication : En informatique, la déduplication (également appelée factorisation ou stockage d'instance unique) est une technique de stockage de données, consistant à factoriser des séquences de données identiques afin d'économiser l'espace utilisé. Chaque fichier est découpé en une multitude de tronçons. À chacun de ces tronçons est associé un identifiant unique, ces identifiants étant stockés dans un index. L'objectif de la déduplication est de ne stocker qu'une seule fois un même tronçon. Aussi, une nouvelle occurrence d'un tronçon déjà présent n'est pas à nouveau sauvegardée, mais remplacée par un pointeur vers l'identifiant correspondant.

[Note]Note
Ce système de sauvegarde ne servira que Alfresco dans sa totalité et non le serveur au complet, lequel peut-être cloné puis restauré. Le répertoire de sauvegarde sera lui aussi sauvegardé via une architecture spécfique externe, que je ne citerais pas, mais permettra si besoin est, de restaurer sans trop de casse (?).
[Note]Note
Borg apporte en plus de la déduplication un chiffrement des archives via une passphrase. Ce chiffrement peut être désactivé, pour moi c'est une excellente initiative; surtout de nos jours ou toutes informations est bonne à prendre sur le NET.

Installation

Rien de bien compliqué, le paquet est installable sur tout bon système d'exploitation ou distribution Gnu/Linux (licence BSD 3). Il suffit de lancer

aptitude install borgbackup

Et c'est tout !

Initialisation :

Avant de commencer il faut initialiser le système. Je vais me baser sur la structure actuelle (/var/sauvegardes) pour créer un dépôt spécial Borg/Alfresco. La commande est facile à condition de bien retenir cette passphrase pour après :)

# borg init /var/sauvegardes/borg
Enter new passphrase: 
Enter same passphrase again: 
Do you want your passphrase to be displayed for verification? [yN]:N

Le répertoire borg a été créé puis un autre sous répertoire data. Voici ce que contient chaque répertoire :

./borg
./borg/data
./borg/data/0
./borg/data/0/0
./borg/hints.0
./borg/config
./borg/README
./borg/index.0

Création de la 1ere sauvegarde

Cette première sauvegarde va être la plus longue car c'est une sauvegarde complète/intégrale. Cette sauvegarde sera chiffrée et compressée par LZMA au niveau 9. Voici la commande à faire

borg create --info --stats --compression=lzma,9 /var/sauvegardes/borg::alfresco-{now:%d-%m-%Y} /opt/alfresco-community

On peut ajouter pour le coté fun --progress qui affiche ce que fait Borg en temps réel. Néanmoins je trouve qu'elle n'apporte pas grand chose. La ou je suis très étonné c'est la ressource CPUs utilisé. Avec 6 CPUs je n'ai pas dépassé la valeur de 1. C'est plutôt très bien, le tout avec une compression Lzma de 9 !

Voilà le résultat :

Enter passphrase for key /var/sauvegardes/borg: 
------------------------------------------------------------------------------                                                                                     
Archive name: dimanche
Archive fingerprint: a8437aeecc672a4b0b60cb69ba98de15d0b327e56886a4839fde600c8ca962d0
Time (start): Tue, 2016-11-01 19:21:02
Time (end):   Tue, 2016-11-01 19:39:59
Duration: 18 minutes 56.86 seconds
Number of files: 24878
------------------------------------------------------------------------------
                       Original size      Compressed size    Deduplicated size
This archive:                3.35 GB              1.19 GB              1.09 GB
All archives:                3.35 GB              1.19 GB              1.09 GB

                       Unique chunks         Total chunks
Chunk index:                   20681                25884
------------------------------------------------------------------------------

Donc 19 minutes pour faire une sauvegarde 3,2 Go et le tout tout dans une archive de 1,09 Go. C'est pas mal, néanmoins le même style en tar.gz ne prend que 936 Mo. Donc je suppose que l'indexation/déduplication prend de la place, la suite devrait et doit être plus percutante; mais j'ai confiance.

La sauvegarde suite

Notre réference au niveau sauvegarde est désormais faite, il est temps de réaliser une sauvegarde comme si de rien n'était, la 3eme au total. C'est parti !

borg create --info --stats --compression=lzma,9 /var/sauvegardes/borg::alfresco-{now:%d-%m-%Y} /opt/alfresco-community
Enter passphrase for key /var/sauvegardes/borg: 
------------------------------------------------------------------------------
Archive name: mercredi
Archive fingerprint: dd2ed971c6c43b0bb76d892fa2eae73559eeaf78e0ee4d8efee9e2e1d8e25757
Time (start): Wed, 2016-11-02 06:39:45
Time (end):   Wed, 2016-11-02 06:39:54
Duration: 9.02 seconds
Number of files: 24841
------------------------------------------------------------------------------
                       Original size      Compressed size    Deduplicated size
This archive:                3.36 GB              1.21 GB              4.14 MB
All archives:               10.06 GB              3.59 GB              1.09 GB

                       Unique chunks         Total chunks
Chunk index:                   20818                77614
------------------------------------------------------------------------------

Ben là chapeau!, certes Borg a réussit à trouver la différence (4,14 Mb) en 9 secondes. C'est très fort même si mes accès disques (SSD) font que çà pousse...quand même.

La commande précédente utilise la compression maximale, du LZMA au niveau 9

Dans ma situation récupérer la structure complète d'Alfresco est important, il peut arriver de vouloir exclure un fichier ou un répertoire. Borg Backup c'est faire ceci de plusieurs manières :

Exclusion en utilisant des regex : --exclude 're:^/home/[^/]+/\.thumbnails/', exclusion du répertoire /home/.thumbnails. Ce même répertoire peut aussi être exclu en utilisant une règle type shell --exclude 'sh:/home/*/.thumbnails

Comme vous pouvez le lire les possibilités ne manquent pas, comme leurs souplesses.

Dans le même style, il est utile de garder plusieurs archives, il est donc possible de rajouter une réference horaire sur chaque archive. Pour cela il suffit d'ajouter ceci (exemple) : /path/to/repo::alfresco_{now:%d-%m-%Y}.

Borg extract

Borg supporte très bien la restauration classique, mais il peut aussi faire plus.

La restauration : borg extract -v --list /path/to/repo::my-files /mnt/restaur, qui affiche en même temps ce qu'il fait, les fichiers seront restaurer dans le répertoire /mnt/restaur.

Il est possible de restaurer uniquement un répertoire et d'exclure des fichiers, en exemple : borg extract /path/to/repo::my-files home/USERNAME/src /mnt/restaur --exclude='*.so'

Borg mount

Borg peut monter une archive un peu comme une image ISO (borg mount). C'est plutôt très bien, pour éventuellement tester ou récupérer des données particulières sans tout restaurer.

Le montage : borg mount /path/to/repo::root-2016-02-15 /tmp/mymountpoint

Automatiser la sauvegarde

Voici en exemple un script possible, il sera remanier dès que possible pour intégrer l'envoi d'un compte-rendu par mél. Néanmoins l'idée est là. A savoir que Borg peut nettoyer et ne garder que les sauvegardes que vous voulez. L'exemple ci-dessous n'a pas encore été testé complètement, comme précédemment l'idée est là, reste à surveiller dans la durée pour confirmation.

[Note]Note
Il ne faut pas oublier de sauvegarder la base de données dans Alfresco, avec Borg ou séparement, à vous de voir.

#!/bin/sh
# Export du depôt Borg
export BORG_REPO=""/var/sauvegardes/borg::alfresco"
export BORG_PASSPHRASE="mysecret"
# Backup most important stuff:
borg create --info --stats --compression=lzma,9 /var/sauvegardes/borg::alfresco-{now:%d-%m-%Y} /opt/alfresco-community/
# Une fois la sauvegarde faite, passons au nettoyage
# Le {hostname} est important pour cibler votre serveur, ensuite on ne garde que :
# 30 jours + 5 Week-end + 2 mois aussi
borg prune -v --prefix alfresco --keep-daily=30 --keep-weekly=5 --keep-monthly=2 /var/sauvegardes/borg 

Le script plus évolué

Le même style de script mais en version évolué, Perl oblige. Une fois Borg Backup prêt, ce script est utilisable dans la crontab, l'option -m, vous permet de recevoir les comptes-rendu par méls tout simplement.

#!/usr/bin/perl
#######################################################################
# Ce script en Perl lance une sauvegarde du répertoire complet Alfresco (déduplication)
# puis envois ou pas un rapport par mél
# lancement : /opt/svd-borg [-m|-v]
# ou "-m" = envois par mcanil et "-v" = affichage-mode verbeux 
# utilise les librairies suivantes : "getopt::mixed Email::sender Email::simple"
# A utiliser dans la crontab : (eg)
# "5 3* * * *	root	/opt/svd-borg.pl -v -m"
######################################################################
use strict ;
use Getopt::Mixed "nextOption" ;
    Getopt::Mixed::init('f m v') ;	# 3 options possibles
use Email::Sender::Simple qw(sendmail);
use Email::Simple;
use Email::Simple::Creator;
# --------------------------------------------------------------------
use vars qw ( $retour_cmd $option $rapport $verbose $titre);
my $version =" $0 version 1.0 (NOV 2016) sous licence (GPL version 3) $\n";

# variable pour Borg - Pour envois vers les vars/env
# il faut export cette variable en session sinon Borg le demande à la main...
# Donc on envois ensuite on videra...
$ENV{'BORG_PASSPHRASE'}='my phrase bizarre' ;
# --------------------------------------------------------------------
# partie conf MAIL :
my $serveur_mail="localhost";
my $DE='borg_backup@alfresco.archi.test';
my $TO='adminsi@alfresco.archi.test';

# on lance la commande qui va bien
# ### voir pour la pass phrase ###
# sans horodatage :
# my $cmd = `borg create --info --stats --show-rc --compression=lzma,9 /var/sauvegardes/borg::alfresco-5.1 /opt/alfresco-community/ `;
# avec horodatage :
my $cmd = `borg create --info --stats --show-rc --compression=lzma,9 /var/sauvegardes/borg::alfresco-{now:%d-%m-%Y} /opt/alfresco-community/ `;

# --------------------------------------------------------------------
# Pour le traitement des options en ligne de commande

# traitement des options (2 uniquements !)
while(( $option ) = Getopt::Mixed::nextOption() ) {
   OPTION: {
     $option eq 'm' and do { $rapport = 1 ; next OPTION; };
     $option eq 'v' and do { $verbose = 1 ; next OPTION; };
   }
 }

# nettoyage des options
Getopt::Mixed::cleanup();
# --------------------------------------------------------------------
# l'option --show-rc renvois 0,1 ou 2 et le PID si kill-9 est utilisé
# Donc pour nous c'est 0/1 ou 2, par contre le retour de commande renvois d'autres valeurs
# qui semblent plus fines comme 512 / 256 et 0, mais hélas pas documenté...sniff

# if ($cmd =~ m/512/ ) { 
if ($? ==512  ) { 
	$retour_cmd = "BORG: La sauvegarde est déjà présente, donc rien de fait (code:".$? .")\n"; 
	$titre = "[BORG-WARNING]Rapport sauvegarde";
}

if ($? ==256  ) { 
	$retour_cmd = "BORG: Echec problème avec le répertoire source, donc rien de fait (code:".$? .")\n"; 
	$titre = "[BORG-ERROR]Rapport sauvegarde";
}

if ($? ==0  ) { 
	$retour_cmd = "BORG: La sauvegarde est faite.\n"; 
	$titre = "[BORG-Ok]Rapport sauvegarde";
}

print $retour_cmd if defined $verbose ;
# print "DEBUG-1:RET=".$? ."\n";
# print "DEBUG-2:CMD=".$cmd ."\n";

# on fait le nettoyage si besoin est : 30 jrs 5 WE + 1 mois(? à suivre/confirmer interet)
my $cmd2 =`borg prune -v --prefix alfresco --keep-daily=30 --keep-weekly=5 --keep-monthly=2 /var/sauvegardes/borg`;
# print "DEBUG-2:CMD=".$cmd2 ;

# ---------------------- MESSAGERIE ----------------------------------
# Très simple d'emploi l'envoi des méls:
if ($rapport) { 	# si $rapport est définie (1)

	# et voilà, on envoi par mail le rapport
  my $mel = Email::Simple->create(
    header => [
      To      => $TO,
      From    => $DE,
      Subject => $titre,
    ],
    body => $retour_cmd .$cmd2 .$version,
  );

 	 sendmail($mel);	# ca part !

	# Traitement des problemes eventuels ...
	if (not ref ($mel)) { print "\n--!-- IMPOSSIBLE DE TRANSMETTRE LE MAIL code ($mel) --!--\n\n"  ; }
}

# important de vider çà pour éviter le mot de passe en ENV
$ENV{'BORG_PASSPHRASE'}='' ;

# Et voilà c'est la fin !

C'est en listant via la commande ci-dessous que je me suis apercu que la commande borg prune ne servait à pas grand chose. Et tout simplement parce après le mot ::alfresco, je rajoute un horodatage. C'est pas franchement ce que je veux avec ma commande prune. Donc il faut rester sur nommage classique pour la prise en commande prune, ou placer un horodatage pour une gestion que je dirais de manuelle ou différente. De toute façon, Borg ajoute l'horodatage lors d'une demande de listage. Au final à mes yeux, l'option horodatage ne sert au niveau du nommage des archives, à pas grand chose...à vous de voir tout de même.

Lister les sauvegardes

Il est important à un moment donné de lister toutes les sauvegardes, même si tous les matins je reçois un mél. qui me dit que tout est correct. La confiance n'exclut le contrôle. La commande est vraiment très simple :

borg list /var/sauvegardes/borg
Enter passphrase for key /var/sauvegardes/borg: 
alfresco-04-11-2016                  Fri, 2016-11-04 14:13:30
alfresco-06-11-2016                  Sun, 2016-11-06 17:50:56
alfresco-07-11-2016                  Mon, 2016-11-07 06:08:29
alfresco-11-11-2016                  Fri, 2016-11-11 11:24:51
alfresco-12-11-2016                  Sat, 2016-11-12 06:29:34

Changement du mot passphrase

Il suffit de lancer cette commande tout simplement : borg change-passphrase -v /path/to/repo. Par contre si jamais vous copiez ailleurs les archives, celles ci ne sont pas prises en compte. Je n'ai pas testé cette solution, il doit bien exister une solution tout de même.

Au final

Borg possède une documentation d'une excellente qualité, celle ci est disponible ici : borgbackup.readthedocs.io Il ne faut pas hésiter, ma documentation ne montre pas toutes ses possibilités.

Chapter 19. La mise à jour (de 5.1 à 5.2)

Procédure :

La procédure est relativement rapide, néanmoins il faut connaître tous les fichiers de conf, les modèles, les modules...etc que j'ai modifié ou apporté. Donc on va commencer par çà; le tout sous forme d'un script pour aller plus vite.

[Warning]Attention
Avec la version 5.2, il ne faut pas remplacer le fichier : /opt/alfresco-community/libreoffice/scripts/libreoffice_ctl.sh, sinon celui ci provoque une erreur qui fait qu'Alfresco se met en erreur fatal.
echo "Début des copies"

cp /opt/alfresco-community-5.1/tomcat/shared/classes/alfresco-global.properties /opt/alfresco-community/tomcat/shared/classes
cp /opt/alfresco-community-5.1/alfresco.sh /opt/alfresco-community/
cp /opt/alfresco-community-5.1/tomcat/scripts/ctl.sh /opt/alfresco-community/tomcat/scripts/
# avec la v 5.2 ne pas remplacer le script libreoffice/scripts ! A modifier tout de même mais après !!! 

cp /opt/alfresco-community-5.1/tomcat/conf/logging.properties /opt/alfresco-community/tomcat/conf/
cp /opt/alfresco-community-5.1/tomcat/conf/tomcat-users.xml /opt/alfresco-community/tomcat/conf/
cp /opt/alfresco-community-5.1/tomcat/conf/web.xml /opt/alfresco-community/tomcat/conf/
cp -Rav /opt/alfresco-community-5.1/tomcat/bin/* /opt/alfresco-community/tomcat/bin/

# Déjà fait sinon rien ne tourne : /opt/alfresco-community-5.1/tomcat/lib/mysql-connector-java-5.1.38-bin.jar

cp /opt/alfresco-community-5.1/tomcat/webapps/share/WEB-INF/classes/log4j.properties /opt/alfresco-community/tomcat/webapps/share/WEB-INF/classes/
cp /opt/alfresco-community-5.1/tomcat/webapps/alfresco/WEB-INF/classes/log4j.properties /opt/alfresco-community/tomcat/webapps/alfresco/WEB-INF/classes/
cp /opt/alfresco-community-5.1/solr4/log4j-solr.properties /opt/alfresco-community/solr4/

cp /opt/alfresco-community-5.1/tomcat/webapps/share/WEB-INF/classes/alfresco/site-data/themes/vertTheme.xml /opt/alfresco-community/tomcat/webapps/share/WEB-INF/classes/alfresco/site-data/
cp -Rav /opt/alfresco-community-5.1/tomcat/webapps/share/themes/vertTheme/ /opt/alfresco-community/tomcat/webapps/share/themes/vertTheme/

cp /opt/alfresco-community-5.1/solr4/archive-SpacesStore/conf/solrcore.properties /opt/alfresco-community/solr4/archive-SpacesStore/conf/
cp /opt/alfresco-community-5.1/solr4/workspace-SpacesStore/conf/solrcore.properties /opt/alfresco-community/solr4/workspace-SpacesStore/conf/

#Non touché car "identiques":
#/opt/alfresco-community/solr4/templates/rerank/conf/solrcore.properties 
#/opt/alfresco-community/solr4/templates/test/conf/solrcore.properties
#/opt/alfresco-community/solr4/templates/vanilla/conf/solrcore.properties 
#/opt/alfresco-community/solr4/templates/without_suggest/conf/solrcore.properties

echo "Import des modèles"
cp /opt/alfresco-community-5.1/tomcat/shared/classes/alfresco/extension/mutation_2-model-context.xml /opt/alfresco-community/tomcat/shared/classes/alfresco/extension/
cp /opt/alfresco-community-5.1/tomcat/shared/classes/alfresco/extension/mutation_2-model.xml /opt/alfresco-community/tomcat/shared/classes/alfresco/extension/
cp /opt/alfresco-community-5.1/tomcat/shared/classes/alfresco/extension/custom-model-context.xml /opt/alfresco-community/tomcat/shared/classes/alfresco/extension/

echo "Et voilà, reste à vérifier ???"

Ce script n'est pas a utiliser tout de suite, mais après...

Sauvegarde de alf_data

Il est temps de stopper la version d'Alfresco en production.

Il faut sauvegarder la totalité du répertoire suivant /opt/alfresco-community/alf_data, à savoir qu'il contient tous les dépots, et les index divers. Cette sauvegarde pour moi, se traduit par une non supppression des anciennes données au complet. La restauration s'effectuera depuis cette version directement.

Sauvegarde de la base de données.

En se servant ou pas du Chapter 4, La sauvegarde intégrale (classique), il faut absolument sauvegarder la base de données pour pouvoir la restaurer par la suite.

[Note]Note
Alfresco arrête parfois Mysql en même temps que lui.
root@:/opt # /etc/init.d/mysql start
[ ok ] Starting mysql (via systemctl): mysql.service.
root@:/opt # mysql -u root -p 
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.6.30-1 (Debian)

mysql> DROP DATABASE alfresco;
Query OK, 99 rows affected (0,49 sec)

mysql> CREATE DATABASE alfresco DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Query OK, 1 row affected (0,00 sec)

mysql> GRANT ALL PRIVILEGES ON alfresco.* TO alfresco@localhost IDENTIFIED BY 'le_mot_de_passe_a_placer_ici';
Query OK, 0 rows affected (0,00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0,00 sec)

Légère complication :

Me concernant, je dois renommer le répertoire de base d'Alfresco en production en par exemple : /opt/alfresco-community-5.1. Ceci est du à la configuration du serveur Apache que je n'ai pas envie de reprendre, celui ci est basé sur : /opt/alfresco-community

Installation de la nouvelle version (5.2) :

Je ne suis pas inquiet pour la suite, j'ai un clone, une sauvegarde complète d'Alfresco et de sa base de données, et encore l'ancien dossier prêt à restaurer si besoin est.

[Note]Note
Ne pas oublier de vider ou de déplacer les fichiers d'historiques ! A savoir que la version 5.2 comporte par défaut des fichiers d'historiques dans ses sources.
[Warning]Attention
Il faut absolument supprimer l'ancienne base de données, puis la créer sans donnée, voir ici si besoin : the section called “Préparation de la base de données”.

Il faut procéder conformément à la précédente installation ,laquelle est expliquée ici Chapter 2, Installation de Alfresco Community.

[Note]Note
Avant de lancer l'installation, ou alors juste après, il faut créer la base de donnée "vide" alfresco.

Installation suites :

Une fois l'installation de la 5.2 vierge et en fonctionnement, il faut regarder/tester pour voir comment elle se comporte.

Le script /opt/alfresco-community/libreoffice/scripts/libreoffice_ctl.sh doit être modifié, la procédure est déjà expliqué au niveau du chapitre Installation. C'est un peu dommage, que ce problème soit répété dans cette nouvelle version...

Une fois ses vérifications faites, on arrête à nouveau Alfresco.

  • Restauration de la base de données alfresco. mysql -u root -pmandrake_2048 alfresco < 358-10H53-alfresco.sql

  • Restauration des fichiers dans alf_data/contentstore, et rien d'autre.

  • Restauration des fichiers modifiés, en appliquant le script décris plus haut.

Reste à relancer Alfresco et re-vérifier le bon fonctionnement.

[Warning]Attention
La migration au finale c'est plutôt bien passée, seul le module BECPG Projet s'installe correctement, mais rien en visuel, totalement transparent. Comme il s'agissait d'un complément non indispensable, il a été retiré tout simplement.

Tout c'est trop bien déroulé, sauf que certains modules ne sont plus compatibles. Ceci ne me surprend pas, c'est le risque avec les modules, j'ai donc plusieurs Attention, que voici :

 2017-01-31 06:55:22,809  WARN  [repo.module.ModuleServiceImpl] [localhost-startStop-1] A previously-installed module 'becpg-core' (version 2.1.0) is not present in your distribution.
 2017-01-31 06:55:22,816  WARN  [repo.module.ModuleServiceImpl] [localhost-startStop-1] A previously-installed module 'becpg-project-core' (version 2.1.0) is not present in your distribution.
 2017-01-31 06:55:22,825  WARN  [repo.module.ModuleServiceImpl] [localhost-startStop-1] A previously-installed module 'support-tools' (version 1.10.1603141233) is not present in your distribution.
 2017-01-31 06:55:22,831  WARN  [repo.module.ModuleServiceImpl] [localhost-startStop-1] A previously-installed module 'simple-ocr-repo' (version 1.1.0.1607271657) is not present in your distribution.

Donc c'est 4 modules à supprimer, je vais traiter celui qui occupe le plus de place inutilement. Il s'agit du module BECPG projet, pour le supprimer il faut se connecter à la console d'administration d'Alfresco puis de rechercher ce qui va bien. Le tout est donné en image, il reste ensuite à cliquer sur supprimer.

Et le tout est joué, les Attention concernant ce module ont disparu tout simplement.

Chapter 20. Activer une fonction OCR (simple-OCR)

A noter : OCR pour Optical Character Recognition, et en français ROC pour Reconnaissance Optique de Caractères.

Ce projet est déposé ici : https://github.com/keensoft/alfresco-simple-ocr/

Téléchargement du fichier

Il suffit de télécharger ce fichier : https://github.com/keensoft/alfresco-simple-ocr/releases/download/1.1.1/simple-ocr-repo.amp, puis de le placer dans le répertoire amps d'Alfresco.

Après une bonne sauvegarde par prudence, il est temps de stopper Alfresco

Ce module s'installe tout simplement avec cette commande : java/bin/java -jar bin/alfresco-mmt.jar install amps/simple-ocr-repo-1.1.0.amp tomcat/webapps/alfresco.war -preview -force. J'ai contacté directement le develloppeur du module concerné à propos de l'option -force. En réalité le module s'installait très bien, mais au niveau des aspects, je ne voyais rien, et aucune d'erreur. Par contre en utlisant cette option, immédiatement l'aspect "OCR" est apparu, tout en bas.

Il faut ajouter ce bloc dans tomcat/shared/classes/alfresco-global.properties :

# local	OCR program
ocr.command=/usr/bin/pdfsandwich
ocr.output.verbose=true
ocr.output.file.prefix.command=-o
# on peut placer des options ici, exemple eng+fra :
ocr.extra.commands=-lang fra 
ocr.server.os=linux

Pour ajouter la langue anglaise ou autre il suffit d'ajouter ceci (exemple) : ocr.extra.commands=-lang eng+fra+spa

Voici les fichiers qui sont ajoutés ou modifiés :

Installing AMP 'amps/simple-ocr-repo.amp' into WAR 'tomcat/webapps/alfresco.war'
     INFO: Checking the war version using /WEB-INF/classes/alfresco/version.properties
     WARNING: This version of this module is already installed in the WAR..upgrading.
     Clearing out files relating to version '1.1.1.1609250928' of module 'simple-ocr-repo'
     - file '/WEB-INF/lib/simple-ocr-repo.jar' from war
     - file '/WEB-INF/classes/alfresco/module/simple-ocr-repo/context/bootstrap-context.xml' from war
     - file '/WEB-INF/classes/alfresco/module/simple-ocr-repo/context/model-context.xml' from war
     - file '/WEB-INF/classes/alfresco/module/simple-ocr-repo/context/service-context.xml' from war
     - file '/WEB-INF/classes/alfresco/module/simple-ocr-repo/messages/simple-ocr-repo.properties' from war
     - file '/WEB-INF/classes/alfresco/module/simple-ocr-repo/messages/simple-ocr-repo_de.properties' from war
     - file '/WEB-INF/classes/alfresco/module/simple-ocr-repo/messages/simple-ocr-repo_es.properties' from war
     - file '/WEB-INF/classes/alfresco/module/simple-ocr-repo/messages/simple-ocr-repo_it.properties' from war
     - file '/WEB-INF/classes/alfresco/module/simple-ocr-repo/messages/simple-ocr-repo_pt.properties' from war
     - file '/WEB-INF/classes/alfresco/module/simple-ocr-repo/model/ocr-model.xml' from war
     - file '/WEB-INF/classes/alfresco/module/simple-ocr-repo/alfresco-global.properties' from war
     - file '/WEB-INF/classes/alfresco/module/simple-ocr-repo/log4j.properties' from war
     - file '/WEB-INF/classes/alfresco/module/simple-ocr-repo/module-context.xml' from war
     - file '/WEB-INF/classes/alfresco/module/simple-ocr-repo/context' from war
     - file '/WEB-INF/classes/alfresco/module/simple-ocr-repo/messages' from war
     - file '/WEB-INF/classes/alfresco/module/simple-ocr-repo/model' from war
     - file '/WEB-INF/classes/alfresco/module/simple-ocr-repo/modifications.install' from war
     - file '/WEB-INF/classes/alfresco/module/simple-ocr-repo/module.properties' from war
     Adding files relating to version '1.1.1.1609250928' of module 'simple-ocr-repo'

Pour mémoire, voici la commande pour lister les modules : java/bin/java -jar bin/alfresco-mmt.jar list tomcat/webapps/alfresco.war.

Il faut et c'est une excellente initiative de la part de ce module de procéder au mode DEBUG, à ce sujet il suffit d'ajouter dans : solr4/log4j-solr.properties

# Pour Simple-OCR :
log4j.logger.es.keensoft.alfresco.ocr=DEBUG

Il est possible de relancer Alfresco à ce niveau sans mettre en oeuvre ce module, car il manque encore pas mal de composants.

Installation des dépendances :

Il faut installer tous ceci avant de commencer : aptitude install tesseract-ocr tesseract-ocr-fra unpaper exactimage poppler-utils. A noter qu'il existe une multitude de langage pour Tesseract, exemple pour la langue anglaise, il faut installer ce paquet tesseract-ocr-ang.

Pour information, car dès le début je me suis posé la question, mais que font tous ces logiciels ?

Et donc, le logiciel Unpaper intervient pour nettoyer la page après OCR, https://www.flameeyes.eu/projects/unpaper

Excellent article les fonctions OCR que propose Tesseract, de plus ce projet est très actif : https://geekeries.org/2015/12/reconnaissance-de-caracteres-avec-tesseract-ocr/

poppler-utils. C'est une suite de logiciels pour le format PDF, les effets sont multiples, la page suivante doit pouvoir vous en dire plus : https://en.wikipedia.org/wiki/Poppler_(software).

PDFSandwich est un logiciel capable d'apporter une couche texte à un document (PDF), d'ou son nom. Pour avoir une version récente, j'ai téléchargé le paquet directement sur le site : https://sourceforge.net/projects/pdfsandwich/files/pdfsandwich%200.1.6/pdfsandwich_0.1.6_amd64.deb/download -O download pdfsandwich_0.1.6_i386.deb Les explications de ce logiciel sont données ici pour de plus amples renseignements : http://www.tobias-elze.de/pdfsandwich/

Et voilà, reste à tester le tout, mais juste avant il faut faire une régle et l'activer :

Et en théorie vous devriez avoir des historiques similaires à ceci après, avec sous Alfresco une recherche de texte efficace aussi. Sans le faire volontairement, même un fichier avec une page à l'envers est passé, c'est plutôt pas mal.

 2017-01-22 07:10:19,597  INFO  [alfresco.ocr.OCRTransformWorker] [defaultAsyncAction1] EXIT VALUE: 0
 2017-01-22 07:10:19,598  INFO  [alfresco.ocr.OCRTransformWorker] [defaultAsyncAction1] STDOUT: pdfsandwich version 0.1.6
Input file: "/opt/alfresco-community/tomcat/temp/Alfresco/OCRTransformWorker_source_6138827412197805839.pdf"
Output file: "/opt/alfresco-community/tomcat/temp/Alfresco/OCRTransformWorker_source_6138827412197805839_ocr.pdf"
Number of pages in inputfile: 1
More threads than pages. Using 1 threads instead.
Processing page 1.
identify -format "%w\n%h\n"  "/tmp/pdfsandwich_inputfilef468c6.pdf[0]" 
OCR done. Writing "/opt/alfresco-community/tomcat/temp/Alfresco/OCRTransformWorker_source_6138827412197805839_ocr.pdf"

/opt/alfresco-community/tomcat/temp/Alfresco/OCRTransformWorker_source_6138827412197805839_ocr.pdf generated.

Done.
[Note]Note
J'ai rencontré un léger problème de librairie (libjpeg, libz...), ce problème est facilement résolvable. Il suffit de supprimer la librairie en question depuis : /opt/alfresco-community/common/lib/libjpeg.so.62, puis de faire un lien vers la même mais depuis votre distribution. (/opt/alfresco-community/common/lib/libjpeg.so.62), et le tour est joué. ln -sf /lib/x86_64-linux-gnu/libz.so.1.2.8 libz.so.1.2.8 )

Appendix A. Les liens utiles.

  • Créations d'utilisateurs en masse :

    Via ce lien https://localhost/alfresco/service/api/people/upload, il est possible via plusieurs méthodes d'insérer plusieurs utilisateurs. C'est pratique et rapide, fonctionne bien avec le port 8080, mais pas en HTTPS sur mon site.

  • Origine Wikipédia FR : Tesseract est un logiciel de reconnaissance optique de caractères sous licence Apache. Conçu par les ingénieurs de Hewlett Packard de 1985 à 1995, son développement est abandonné pendant les dix années suivantes ; en 2005, les sources du logiciel sont libérées sous licence Apache et le logiciel est actuellement développé par Google. Initialement limité aux caractères ASCII, il supporte parfaitement les caractères UTF-8 et reconnait maintenant 40 langues.

Glossary

Aikau

Aikau est un framework créé par Alfresco. Vous pouvez trouver ici plus de détails : https://wiki.alfresco.com/wiki/Aikau_framework Aikau est disponible sur internet via ce lien : https://github.com/Alfresco/Aikau

AOS

AOS pour Alfresco Office Service. Simule le service Share Point pour offrir une édition en ligne avec la suite Office de Microsoft™.

CIFS

Un serveur de fichiers permet de partager des données à travers un réseau. Le terme désigne souvent l'ordinateur (serveur) hébergeant le service applicatif. Il possède généralement une grande quantité d'espace disque où sont déposés des fichiers. Les utilisateurs peuvent ensuite les récupérer au moyen d'un protocole de partage de fichier. L'un des problèmes d'interopérabilité qui peut généralement se poser porte sur l'encodage des noms de fichier

Créé en 1985 par IBM, ce protocole s'est d'abord appelé LAN Manager sous OS/2, puis il a été popularisé par Microsoft Windows qui l'intégrait comme système par défaut de partage de fichiers sous Windows. En 1998, Microsoft renomme SMB en CIFS (Common Internet File System) et ajoute plusieurs fonctions comme le support des raccourcis et de fichiers de plus grande taille. En 2006, avec l'arrivée de Windows Vista puis de Windows 7, Microsoft a mis au point une version 2 du protocole plus rapide. Le protocole est de nouveau nommé SMB (SMB 2). En 2012, avec Windows 8 et Windows 2012, Microsoft propose la version 34 de SMB. Elle apporte des améliorations significatives, comme le SMB Direct Protocol (SMB sur RDMA) et le SMB Multichannel5 (plusieurs connexions par session SMB), ainsi qu'un gain de performances par rapport à la version 2, notamment avec les centres de traitement de données virtuels.

CMIS

(extrait de Wikipédia FR) : CMIS fournit un modèle de données commun couvrant les types de fichiers et répertoires avec des propriétés génériques pouvant être lues ou écrites. CMIS décrit aussi un système de gestion des droits d'accès, de contrôle de version et offre la possibilité de définir des relations génériques. Il dispose d'un ensemble de services pour modifier ou interroger le modèle de données et peut être utilisé par plusieurs protocoles comme SOAP et REST à l'aide de la convention Atom1. Le modèle est basé sur des architectures communes de systèmes de gestion de documents. Voir sinon le lien suivant pour de plus amples renseignements : https://fr.wikipedia.org/wiki/CMIS

ECM

(Extrait de Wikipédia FR) - La gestion de contenu d'entreprise (en anglais Enterprise Content Management : ECM) vise à gérer l'ensemble des contenus d'une organisation. Il s'agit de prendre en compte sous forme électronique les informations qui ne sont pas structurées, comme les documents électroniques, par opposition à celles déjà structurées dans les bases de données. Elle comprend les phases de création/capture, stockage, indexation, gestion, nettoyage, distribution, publication, recherche et archivage, en faisant le lien du contenu avec les processus métier. À titre d'exemple, une application de gestion de contenu servira à gérer l'ensemble des informations d'un dossier client : courriers papier, courriels, télécopie, contrats, etc., dans une même infrastructure. La définition officielle du terme a été créée par l'organisation internationale AIIM (Association for Information and Image Management) en 2000.

GED

(Extrait de Wikipédia FR). La GED met principalement en oeuvre des systèmes d'acquisition (exemple d'utilisation : la numérisation de masse de documents papiers), d'indexation, de classement, de stockage d'information, d'accès (navigation et recherche) et de diffusion des documents. La GED participe ainsi aux processus de collaboration, de capitalisation et d'échange d'informations. Elle prend en compte le besoin de gestion des documents selon leur cycle de vie, de la création à l'archivage en passant par la gestion des différentes versions. Les solutions et projets de GED peuvent permettre des gains en qualité et en coût rapide pour les organisations, qu'il s'agisse d'entreprises privées ou d'administrations. À titre d'exemple, le retour sur investissement d'un projet « standard » de dématérialisation de factures est inférieur à un an. Une GED dispose de fonctions de classement / navigation et également d'un moteur de recherche qui permettent de retrouver les contenus gérés, au moyen de vues, de recherches structurées ou plein texte (« full text »). Selon une étude de serdaLAB, le laboratoire d'études du groupe Serda, le marché de la GED et de la gestion de contenu atteint 1,1 milliard d'euros en 2008, en progression de 8 %. Il existe 4 étapes majeures dans la gestion électronique des documents : acquisition, traitement, stockage et diffusion.

Less

LESS est un langage dynamique de génération de feuilles de style conçu par Alexis Sellier. Il est influencé par Sass et a influencé "SCSS" (la syntaxe plus récente de Sass) : la syntaxe de LESS est plus proche de CSS2 et un code CSS est aussi un code LESS valide qui a la même sémantique. LESS ajoute à CSS les mécanismes suivants : variables, imbrication, mixins, opérateurs et fonctions. LESS est implémenté en open source. Sa première version a été écrite en Ruby. Dans les versions ultérieures, Ruby a été remplacé par Javascript. Une particularité de LESS par rapport aux autres préprocesseurs CSS est qu'il peut être compilé à la volée, soit lors du rendu par le navigateur, soit côté serveur. Il peut également être compilé à l'avance en un simple fichier CSS.

LVM2

La gestion par volumes logiques (en anglais, logical volume management ou LVM) : https://fr.wikipedia.org/wiki/Gestion_par_volumes_logiques

PLM

Product Lifecycle Management : non utilisé dans notre situation, permet de gérer la durée de vie d'un logiciel ou d'un produit.

RSS

RSS (sigle venant de l'anglais «Rich Site Summary») est une famille de formats de données utilisés pour la syndication de contenu Web. Un produit RSS est une ressource du World Wide Web dont le contenu est produit automatiquement (sauf cas exceptionnels) en fonction des mises à jour d’un site Web. Les flux RSS sont des fichiers XML qui sont souvent utilisés par les sites d'actualité et les blogs pour présenter les titres des dernières informations consultables. On emploie parfois à tort le terme RSS pour désigner le format concurrent Atom. Trois formats de données peuvent être désignés par ces initiales : Rich Site Summary (RSS 0.91) sorti en 1999 ; RDF Site Summary (RSS 0.90 et 1.0) sorti en 2000 ; Really Simple Syndication (RSS 2.0) sorti en 2002.

SOLR 4

Source Wikipédia : Solr (prononcé "solar") est une plateforme logicielle de moteur de recherche s'appuyant sur la bibliothèque de recherche Lucene, créée par la Fondation Apache et distribuée et conçue sous licence libre. Solr utilise le langage Java et est exécuté par un conteneur de servlets, comme Tomcat. Il communique avec le client à l'aide d'une interface de programmation en XML et JSON, généralement via le protocole HTTP.

TinyMCE

Source Wikipédia : TinyMCE, aussi connu sous le nom de Tiny Moxiecode Content Editor (tout petit éditeur de contenu de Moxiecode) est un éditeur de HTML de type WYSIWYG, écrit en JavaScript, indépendant de la plateforme, basé sur le Web et publié comme logiciel open source sous la licence LGPL par Moxiecode Systems AB. Il est capable de convertir les champs HTML TEXTAREA ou d'autres éléments HTML en instances de l'éditeur. TinyMCE est conçu pour s'intégrer facilement aux systèmes de gestion de contenu (SGC). C'est l'éditeur de contenu par défaut de WordPress2 et de Joomla!3, les deux SGC les plus utilisés4, et du SGC Plone à partir de la version 45. https://www.tinymce.com/

WebDav

(source wikipedia) : WebDAV (Web-based Distributed Authoring and Versioning) est un protocole (plus précisément, une extension du protocole HTTP) défini par le groupe de travail IETF du même nom. Décrit dans la RFC 4918, WebDAV permet de simplifier la gestion de fichiers avec des serveurs distants. Il permet de récupérer, déposer, synchroniser et publier des fichiers (et dossiers) rapidement et facilement. L'objectif principal de WebDAV est de rendre possible l'écriture à travers le web et pas seulement la lecture de données. WebDAV permet à plusieurs utilisateurs d'éditer le contenu d'un dossier web simultanément. Il saura gérer les droits d'accès aux fichiers (ou dossiers), en verrouillant momentanément les fichiers et dossiers édités.https://fr.wikipedia.org/wiki/WebDAV